109 lines
10 KiB
Markdown
109 lines
10 KiB
Markdown
# 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 分开报告。
|