Files
ycode/docs/协作/B01-验收-01.md
T

109 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# B01 验收 01:YC-001 第一阶段
日期:2026-10-21(Asia/Shanghai)。验收端独立复测;**结论:YC-001 待修复,B01 未关闭**。本轮没有修改业务源码、测试脚本、依赖或构建配置;仅提交验收文档与证据。
## 1. 受测版本与范围
- 交付记录:[B01-交付-01](B01-交付-01.md);接收时 `gitea/master` 为 `b5eb6d8875d4f7367bde59dd367a8c02e28cce2e`。
- **固定受测代码 SHA:`51531dcae8d8ade85db9e203bc8c0f712805b2ae`**。独立 managed worktree 检出该提交,起止 `git status --short` 均为空,没有使用开发机 node_modules。
- 验证 `51531dc` 到接收时 `gitea/master` 的 `src/`、`scripts/`、package.json、package-lock.json 没有差异;随后文档与 merge 提交没有包含另一版待测产品代码。
- 本轮仅验 YC-001,即 A01、A03、A04。YC-002/003/004 没有交付,不将其缺失列为本轮新增回归,也不将它们记为已通过。
- 环境:Windows 11 IoT 企业版 LTSC 64 位,10.0.26100;Node 24.21.0、npm 11.19.0、React 19.3.0、jsdom 30.1.3,Electron 37.10.3。
- 独立执行 `npm ci --legacy-peer-deps --no-audit --no-fund`。当前 npm 提示 Electron postinstall 未自动执行,随后显式运行 `node node_modules/electron/install.js`,未修改锁文件。
- DOM 依赖单独安装到 `.tmp/b01-dom`;构建、回归、数据与探针均在隔离检出,未请求真实供应商模型或 SDK query。原用户 dev 保持原样,未用其窗口代替指定 SHA 验收。
## 2. 逐项验收
| 标准 | 结论 | 证据与边界 |
| --- | --- | --- |
| AC1.1 原生名称/别名与不可变性 | 通过 | `test:alignment` 中身份、普通工具与历史回归;真实 Windows 使用原生 `AskUserQuestion`,专用卡出现,无原始答案泄漏 |
| AC1.2 回答链与去重 | 通过(组件/历史与本地窗口) | 原生名称待答→已答→完成→展开→重开 DOM 回归通过;Windows 持久化消息中仅一份问答;无真实模型请求,不外推真实 SDK 执行 |
| AC1.3 局部状态保持 | **失败,见 F01** | 问答、普通工具、思考与局部摘要的现有嵌套回归通过;独立真实 MessageBubble 探针仍复现原生 plan/task 在终态校正后重开 |
| AC1.4 标题/灰卡/字号 | 通过(已确认结构与几何);原版像素未验证 | Windows 标题在壳外,14px/400/24.5px;内容 16px 圆角、12px 16px padding、300px 上限;浅深/窄窗与长内容实测。未取得新的同状态原版对照,不能宣称全像素 1:1 |
| AC1.5 顺序/默认与隐藏语义 | 指定回归通过,完整辅助技术未验证 | 既有顺序/正文锚点、键盘、inert/aria-hidden 与无复制树回归通过;真实窗口问答外层收起重开保持。F01 涉及的原生 part 稳定性必须补测;未运行真实屏幕阅读器 |
因此 A01 的已测分发问题、A04 的已测内容壳差异获得独立 Windows 证据;**A03 未关闭**,不能将 YC-001 或 B01 总体记为已完成。历史报告无需重写成“全部仍失败”,本记录保留已通过部分与具体失败。
## 3. F01 / P2:原生 Plan、Task 在 done 正文校正后丢失收起选择
对应 A03/AC1.3。**这是本轮未覆盖的既有问题,不是新增回归**:受测 `51531dc` 与基线 `37ddb2c` 均复现。
实际路径是 `applyAssistantEvent` 生成的真实消息,再由真实 `MessageBubble` 渲染;不是手写两个独立 disclosure,也没有启动 SDK/服务:
```text
流式事件生成 parts:
text("Draft one") → reasoning(id=r) → text("Draft two")
→ plan(plan.id=p) → task(task.id=x)
两张卡默认展开:true / true
用户分别收起:false / false
接收 done(content="Corrected final prose", tools=[], turnDurationMs=1000)
reducer 校正为:text → reasoning → plan → task
实际两张卡:true / true
预期保留用户选择:false / false
```
源码定位(均针对 `51531dc`):
- `src/renderer/src/workbuddy/conversation/CompletedFold.tsx:149`:`partDisclosureId` 只识别顶层 `part.id`、`toolId`,原生 plan/task 使用数组下标,没有使用 `part.plan.id`/`part.task.id`。
- `src/shared/message-parts.ts:74`:正常 `done` 全文校正会合并多个 text part,改变后续富内容的数组位置。
- `src/renderer/src/components/MessageBubble.tsx:182`、`:186`:原生 plan/task 是实际支持的渲染入口;缓存 scope 从 plan/3、task/4 变为 plan/2、task/3,保存的选择失配。
- `scripts/completed-fold-nested-regression.tsx:17`、`:21`:交付新增测试把 Plan/Task 构造成有 `toolId` 的 tool part,未覆盖真实 typed part。
开发端下一轮要求:为所有有稳定业务 ID 的原生 part 使用稳定身份,在终态校正、插入/重排和外层切换后保持用户选择;保留消息隔离和无 ID 旧历史 fallback。补真实 reducer→MessageBubble 的 plan/task 回归,不能只改测试 fixture 为工具节点或移除断言。
### 可复核反例
源码与结果:[typed-part-repro.mjs](evidence/B01-review-01/typed-part-repro.mjs)、[受测 JSON](evidence/B01-review-01/typed-part-repro-51531dc.json)、[基线 JSON](evidence/B01-review-01/typed-part-repro-baseline.json)。
在固定 `51531dc` 检出完成依赖安装,将本次 Git 证据中的 `typed-part-repro.mjs` 复制到该检出的 `.tmp/b01-readonly-review/`,再执行:
```powershell
npm install --prefix .tmp/b01-dom --ignore-scripts --no-audit --no-fund jsdom@30.1.3
node .tmp/b01-readonly-review/typed-part-repro.mjs --assert
node .tmp/b01-readonly-review/typed-part-repro.mjs --baseline --assert
```
两条都退出 `1`,因为 `retainsUserChoices=false`,不是探针启动失败。基线模式用 `git show 37ddb2c` 替换该渲染路径全部 7 个改动过的 React 模块,并验证全部实际加载;不是在新产品模块上假标基线。主线程已亲自重跑两条,结果与独立子 agent 一致。
## 4. 构建与回归结果
| 命令 | 实际退出码 | 说明 |
| --- | --- | --- |
| `npm run build` | 0 | 独立 Windows 安装,包含两个 tsconfig 类型检查与 main/preload/renderer 构建 |
| 设置 `YCODE_TEST_DOM_MODULE` 后 `npm run test:alignment` | 0 | 包含新增 30 项 question-identity、真实嵌套回归,以及原有 28 任务/24 问答/14 授权 DOM;宿主/SDK 部分仍为 mock |
| `npm run test:conversation` | 0 | SSR、composer、footer、completed-fold |
| `npm run test:workbuddy-import` | 0 | 历史导入回归 |
| `npm run test:artifacts` | 0 | artifact/特殊块回归 |
| 独立 Windows native probe | 0 | 实际 main/preload/renderer、隔离持久消息、无模型,4 个窗口场景,0 renderer errors |
| F01 独立反例 `--assert` | **1** | 发现未修复问题;原基线模式同为 1 |
| `npm run check:tokens` | **1** | 与修复前 f2b7c07 完全相同的 6 项失败集合,无本批新增门禁项;没有刷新 baseline |
| `npm run test:fold-summary` | **1** | 干净 Windows 检出的既存 CRLF 摘要可复现性问题;本次没有改生成物或 manifest,见下文 |
证据:[构建日志](evidence/B01-review-01/build.txt)、[alignment 日志](evidence/B01-review-01/alignment.txt)、[其他回归结果](evidence/B01-review-01/regression-results.json)、[token 前后对比](evidence/B01-review-01/token-comparison.json)。
fold-summary:生成模块有 717 个 CRLF,raw SHA 为 `a2239b45360fcaf5c986fbe2180217856029563f034db11328860dc5e01491ae`,归一 LF 后为 `645ea0848880aa7e89319af8e11440bdddd8c10783944736fd4f29b70e923a10`,与 manifest 一致;对应产品文件从 `37ddb2c` 到 `51531dc` 无改动。[哈希记录](evidence/B01-review-01/fold-hash.json)。这是既存 Windows 检出问题,未算作本轮新增回归,仍不能写成该命令通过;后续按 B01 共通要求处理,不删除摘要断言。
## 5. Windows 真实窗口证据
以固定 SHA 的 `out/main/index.mjs` 启动实际 Electron main/preload/renderer,使用全新临时 userData、home、workspace 和本地持久化消息。仅注入测试消息;没有模型、SDK query、真实工具执行或原版访问。
- 浅色与深色 1336×902;窄窗 820×902。
- 通过应用的 `ycode:theme`/storage 同步通路切换主题,等待 React 与样式状态生效,未仅修改根节点造成混合主题后下结论。
- 原生 `AskUserQuestion`:只有 1 张问答卡,RAW sentinel 不出现;外层收起重开后,内层问答 `aria-expanded=true` 保持。
- 浅色壳背景 `rgb(242, 242, 242)`;问题/答案实际 14px、400、24.5px;标题透明且不在灰壳内。
- 长问答内容 `scrollHeight=5688`、`clientHeight=300`,内部滚动;窄窗无页面横向溢出。
- 已人工查看下列四张截图;它们证明 YCode 修复后的同状态展示,不是原版逐像素通过。
证据:[native-probe.cjs](evidence/B01-review-01/native-probe.cjs)、[计算样式与结果](evidence/B01-review-01/native-report.json)、[浅色](evidence/B01-review-01/question-light.png)、[深色](evidence/B01-review-01/question-dark.png)、[窄窗](evidence/B01-review-01/question-narrow.png)、[长内容](evidence/B01-review-01/question-long.png)。
重跑 native probe 时,在固定 SHA 检出先独立构建,将证据脚本复制进 `.tmp/b01-acceptance/`,执行 `node .tmp/b01-acceptance/native-probe.cjs`。脚本自己创建隔离数据目录并输出结果位置,不启动用户正式数据或复用已有 dev。
## 6. 回传给开发端
1. **YC-001 退回修复 F01**,下一轮创建 `B01-交付-02.md`,记录新完整代码 SHA、原生 plan/task 回归及已通过问答/折叠路径的回归结果。
2. A01 分发、A04 内容壳与已有正常嵌套路径不要求推倒重做;只补未覆盖稳定身份及必要回归。原版像素/辅助技术边界继续明确。
3. YC-002、YC-003、YC-004 保持原状态。本次只交付 YC-001 第一阶段,验收端不擅自要求本轮补交其他任务;后续是否接续由开发端与用户安排。
4. 不将开发端注明撤回的骨架补丁自动恢复;B01 中后续加载需求的具体实施须尊重该决定,再明确范围。
**本验收记录推送成功后,推送窗口交回开发端。** 验收端保留文档/证据职责,不在这里代修产品代码。验收文档提交 SHA 与上述受测代码 SHA 分开报告。