61 lines
7.0 KiB
Markdown
61 lines
7.0 KiB
Markdown
# B01 交付 01:问答分发、嵌套折叠与回答内容壳
|
||
|
||
日期:2026-10-21。开发端接单;**已实现、离线自测通过,待指定提交的独立验收,不关闭 A01/A03/A04**。
|
||
|
||
## 范围、授权与版本
|
||
|
||
- 用户确认:开发端先接 A01、A03、A04 问答与折叠修复;保留撤回骨架修复的决定。用户答复“对”。
|
||
- 基线完整 SHA:`21ca0e0fc379e7a71639b5160c1b7cd168b9d6fa`,开始时 master 源码工作区干净。
|
||
- 需求入口:[Windows 复测与后续开发](../对话输入对齐复测与后续开发-2026-10-21.md) A01、A03、A04;[完整方案](../WorkBuddy对话与输入交互统一对齐方案-2026-10-21.md) 第三节;协作流程见同目录文档。
|
||
- **完整代码 SHA:`51531dcae8d8ade85db9e203bc8c0f712805b2ae`。** 开发主对话与独立代码审查已完成;本记录另行文档提交,代码提交不包含本记录。
|
||
- 唯一交接源 `gitea/master`;推送状态以交接通知及远端 SHA 核验为准。验收应等待开发端明确通知代码 SHA。
|
||
- 不做:A02、A05~A09;不恢复撤回的 `6956e47` 骨架补丁;不改内核、依赖锁文件或历史数据;不启动外部模型、SDK query/CLI 或真实授权服务。
|
||
|
||
## 改动与实现边界
|
||
|
||
- A01:共享 `isQuestionToolName` 做只读身份匹配,原生 `AskUserQuestion` 和既有小写别名进入问答卡;MessageBubble 分类与 renderer 使用同一身份层。普通工具仍走原匹配/原始输出通道,存储名称、参数、metadata 不被改写。既有投影、历史导入和未知位置算法未修改。
|
||
- A03:CompletedFold 持有仅属于该消息的 disclosure store;按稳定 part/tool ID 与控件槽位保存状态,无 ID 的旧 part 保留位置 fallback。问答、普通工具、思考、局部摘要、MCP 明细、Task 与 Plan 展开状态在外层结构重排后恢复;不同消息不共享。仍采用既有时间顺序/正文锚点模型,不复制隐藏组件树、不恢复全局展开布尔值。Task 审批状态未迁移或放宽。
|
||
- A04:标题使用既有 SourceToolHeader/chevron,位于独立问答内容壳外;去掉旧 `?`、`+/-`、外层灰底与分隔边框。内容复用已恢复 ToolExpandable CSS:16px 圆角、12px 16px padding、主题背景、300px 上限和纵向滚动。保留问题/答案 14px、400、1.75;键盘 Enter/Space、aria-controls、aria-hidden、inert 均有回归。
|
||
- 原版依据仅引用已有证据:WorkBuddy 5.8.3 目标截图及历史 5.8.2 REA 提取范围;`tool-result-source.css` 中 JavaScript Evidence `ev_717fa5e846e64d67ac19c8925d121bff632c0d3aefb3603b10858559cabb2dcb`,CSS Evidence `ev_377c8790468b3c67dad8577aabb327f98d3140659f0fffdbabfcff5a40cc9e94`。未新增原版采集,也未直接读取原版安装包或调试端口。
|
||
|
||
## 验收矩阵与复现
|
||
|
||
| 项目 | 可重跑场景/证据 | 本轮状态 |
|
||
| --- | --- | --- |
|
||
| A01 原生名称完整链 | `question-identity-regression.tsx`:真实 MessageBubble,原生名称待答→已答→完成→展开→收起重开,无 RAW SDK ANSWER | jsdom 已通过;真实 Windows 待验 |
|
||
| A01 兼容与不可变性 | 原生/小写别名、导入答案、关联去重、无 parts 未知位置标签与单份展示;普通工具原始输出和输入快照不变 | SSR+jsdom+导入回归通过 |
|
||
| A03 嵌套状态 | `completed-fold-nested-regression.tsx`:真实 CompletedFold+问答/普通工具/ThinkingBlock/ToolGroup/Task/Plan,外层切换、后续事件、独立局部组、流式→完成、消息 ID 隔离 | jsdom 已通过;真实 Windows 待验 |
|
||
| A03 可访问性 | 外层 Enter/Space 切换,收起内容 inert/aria-hidden;不复制问答节点 | jsdom 已通过 |
|
||
| A04 内容壳 | `question-answer-shell-regression.tsx`:标题不在内容壳内、复用 CSS 参数及主题变量、无旧符号/边框;链接与键盘行为 | SSR/CSS 来源断言+jsdom 通过;非布局像素结果 |
|
||
| 整体构建 | `npm run build` 含两个 tsconfig 类型检查 | Linux 通过,不代表 Windows 安装/Electron 通过 |
|
||
| Windows/原版对照 | 固定代码 SHA、浅/深主题、窄窗、相同窗口/缩放/字体、回答长内容滚动 | **未验证,待验收端** |
|
||
|
||
## 环境与命令
|
||
|
||
Linux x86_64,Node `v24.19.0`,npm `11.9.0`。主项目使用已安装依赖(此前 ignore-scripts 安装,Electron 无 GUI);没有更改 package.json/package-lock.json。DOM 依赖 jsdom `30.1.3` 独立安装在 `/tmp/ycode-b01-dom`,`--ignore-scripts`,不混入交付依赖。DOM 依赖从官方 npm 安装;测试运行不调用外部模型。
|
||
|
||
```sh
|
||
# 仅验收者缺少 DOM 依赖时,按其安装授权独立安装;不改项目依赖
|
||
npm install --prefix /tmp/ycode-b01-dom --ignore-scripts --no-audit --no-fund jsdom@30.1.3
|
||
YCODE_TEST_DOM_MODULE=/tmp/ycode-b01-dom/node_modules/jsdom npm run test:alignment
|
||
npm run test:conversation
|
||
npm run test:workbuddy-import
|
||
npm run test:artifacts
|
||
npm run build
|
||
git -c core.whitespace=cr-at-eol diff --check
|
||
```
|
||
|
||
以上最终命令退出 0。对齐 runner 的宿主/SDK 接口部分是 mock,明确不启动真实 SDK/CLI;运行这些测试不构成 A09 授权验收。新 DOM 脚本等待断言、unmount 与 DOM close 后显式退出,避免既有 renderer imports 的长驻句柄使成功测试超时。两份原有 CRLF 源文件保持行尾;diff 检查用单次 `cr-at-eol` 选项,未改 Git 全局配置或批量归一化。
|
||
|
||
可复核证据:[本轮命令及输出摘要](evidence/B01-01/verification.txt),测试源码均纳入交付,不依赖开发机 `.tmp` 作为唯一证据。初次开发中的类型错误、测试选择器错误和测试退出句柄问题已修正并重跑;最终结果以该摘要与指定代码 SHA 为准。
|
||
|
||
## 独立 Windows 验收步骤与阻塞
|
||
|
||
1. 收到完整代码 SHA 后,在干净的固定 SHA 检出独立 `npm ci --legacy-peer-deps`、`npm run build`,记录系统/Node/npm/目录/实际启动端口。
|
||
2. 真正启动前检查 `src/main/index.ts` 数据初始化逻辑;在同一 PowerShell 中设置全新绝对 `YCODE_USER_DATA_DIR`(如 `C:\ycode-qa\B01-run01`),只用脱敏夹具和专用 workspace,确认进程继承变量。
|
||
3. 重跑上述离线测试;以原生名称构建待答/已答消息,完成后打开外层,分别操作问答、工具、思考、两个局部摘要,再收起重开并追加事件;确认选择独立保留、正文顺序未变。
|
||
4. 用真实 Windows Electron 计算样式与截图复核 A04:标题在灰卡外、问题/答案 typography、16px/12px 16px、长内容滚动,浅深色及窄窗;对照既定原版版本/同状态截图。
|
||
5. 原 Windows `window-report.json`、`answered-expanded.png` 等只在历史 `.tmp` 中,本环境没有这些附件。请验收端提供/定位原附件并记录 REA/截图索引;未拿到相应证据不得宣称完整 1:1 或像素通过。
|
||
|
||
状态:**已本地提交、待推送通知与独立验收**。本批实现无 mock 问答替代逻辑;测试夹具是模拟消息,不是真实模型请求。Windows、安装包、真实 SDK 与当前原版像素对照均未执行。
|