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

10 KiB
Raw Blame History

B01 验收 01:YC-001 第一阶段

日期:2026-10-21(Asia/Shanghai)。验收端独立复测;结论:YC-001 待修复,B01 未关闭。本轮没有修改业务源码、测试脚本、依赖或构建配置;仅提交验收文档与证据。

1. 受测版本与范围

  • 交付记录:B01-交付-01;接收时 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/服务:

流式事件生成 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、受测 JSON、基线 JSON。

在固定 51531dc 检出完成依赖安装,将本次 Git 证据中的 typed-part-repro.mjs 复制到该检出的 .tmp/b01-readonly-review/,再执行:

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,见下文

证据:构建日志、alignment 日志、其他回归结果、token 前后对比。

fold-summary:生成模块有 717 个 CRLF,raw SHA 为 a2239b45360fcaf5c986fbe2180217856029563f034db11328860dc5e01491ae,归一 LF 后为 645ea0848880aa7e89319af8e11440bdddd8c10783944736fd4f29b70e923a10,与 manifest 一致;对应产品文件从 37ddb2c 到 51531dc 无改动。哈希记录。这是既存 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、计算样式与结果、浅色、深色、窄窗、长内容。

重跑 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 分开报告。