Files
ycode/docs/验收问题收集-2026-10-17-对话侧栏.md

409 lines
29 KiB
Markdown
Raw Permalink 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.
# 对话区与侧栏验收问题收集(2026-10-17)
## 范围与结论
本报告只审查 TODO 01~07,不实现修复,不修改业务代码,不启动新的 Electron 或 WorkBuddy 实例。审查依据为当前工作树源码、现有测试和主 agent 在 `2026-10-17 16:50:14` 串行执行的真实隔离 Electron 报告。
当前结论不是“01~07 已全部 1:1 完成”。本轮 6 个专项脚本全部通过,但源码审查确认仍有 4 个高优先级行为缺口:
1. 从独立任务窗口发起的流式对话收不到后续 `chat:event`,窗口会停在流式态。
2. 表格引用只在当前回合进入提示词,备用内核后续回合重建历史时丢失引用内容。
3. 编辑带产物变更的消息时,没有原版的“是否回退产物历史版本”选择,而是直接回退。
4. 回退产物时没有原版“不回退”动作,也没有逐产物缺失版本/保留当前版本的分支。
另有归档入口不可回访、引用来源标题功能尚缺且原版宿主标题待取证、原生分支不可用时错误在提交后才暴露等中优先级问题。04、06、07 未发现新的核心代码缺陷,但仍分别存在用户约定差异、像素证据缺口和占位依赖。
本轮没有新调用 WorkBuddy。主 agent 通过 REA 请求已知 `9223` 端口得到 `provider_unavailable/endpoint_unreachable`,这只能证明该已知端口当前不可达,不能扩大为“REA 整体不可用”。已有 REA Evidence ID 只作为历史原版证据引用。
### 七项逐项状态
| TODO | 当前状态 | 结论摘要 |
| --- | --- | --- |
| 01 任务操作菜单 | 发现问题 | 独立窗口流式事件断开;归档后无可回访入口;另有像素/键盘证据缺口。 |
| 02 表格引用 | 发现问题 | 备用内核下一回合丢失引用快照;来源标题是待取证的功能缺口;草稿保留测试无效。 |
| 03 编辑消息 | 发现问题 | 缺少编辑前产物回退选择;原生分支缺失在提交后才报错;错误码映射不完整。 |
| 04 悬停时间 | 当前用户约定范围通过 | 三档时间规则正确;“昨天”是已确认的用户约定差异,不是 Bug;动画帧仍缺证据。 |
| 05 回退消息与产物 | 发现问题 | 缺少“不回退”动作;缺失版本 fallback、失败 toast 和弹窗像素未实现。 |
| 06 滚动条 | 当前范围通过 | 浅色像素及跟随行为通过;深色/hover/周边 affordance 仍缺运行时证据。 |
| 07 侧栏最下一行 | 核心布局当前范围通过 | 普通浅色几何通过;深色、窄态、真实头像和 mock 功能仍有依赖/证据缺口。 |
## 分类口径
| 分类 | 含义 |
| --- | --- |
| 实际缺陷 | 当前 YCode 行为会在用户可触发的条件下失败、丢信息或明显偏离已确认交互。 |
| 占位/依赖 | 入口或视觉已存在,但真实数据、服务或运行链路由其他待办项提供,当前范围只保留占位。 |
| 证据缺口 | 当前实现和测试没有失败,但缺少与原版同状态、同输入、同环境的像素、时序或运行时证据。 |
| 用户约定差异 | 与原版不同是用户已经明确要求或接受的范围差异,不应由本报告重新判成 Bug。 |
| 测试盲区 | 测试 PASS,但断言没有覆盖验收声明的关键条件,或断言本身没有构造前置条件。 |
编辑前的产物回退选择与回退弹窗“不回退”动作有已回收的原版源码或词典证据,本轮没有新跑对应原版画面。行为分支缺失仍属于实际缺陷;缺少逐帧动画或截图只记为证据缺口,不单独算业务 Bug。
## 本轮执行证据
主 agent 的批次目录为 `.tmp/audit19-20261017-165014/`,其中 `results.json` 记录以下脚本退出码为 0。子 agent 没有自行启动 Electron。
| 专项 | 本轮结果 | 实际报告 |
| --- | --- | --- |
| `verify-task-menu` | PASS,42/42 | `.tmp/task-menu-cI3qQG/report.json` |
| `verify-task-running-menu` | PASS,21/21 | `.tmp/task-running-AzKLph/report.json` |
| `verify-quote-table` | PASS,48/48 | `.tmp/quote-table-M1X5lY/report.json` |
| `verify-user-message-edit` | PASS,67/67 | `.tmp/edit-Sf68uQ/report.json` |
| `verify-conversation-scrollbar` | PASS,24/24,本轮没有 skip | `.tmp/scrollbar-6P7oPm/report.json` |
| `verify-sidebar-footer` | PASS,29/29 | `.tmp/sidebar-footer-Edo50t/report.json` |
| `npm run test:conversation-ipc` | PASS,输出 `all checks passed` | 日志 `.tmp/audit19-20261017-165014/conversation-ipc.log` |
主 agent 本轮还确认 `npm run build` 通过。构建通过和上述脚本通过只证明已覆盖路径,不证明以下未覆盖状态。
---
## 01. 任务操作菜单
**结论:发现问题。**
### 01-01 独立任务窗口可以打开任务,但不能正常接收流式回复
- 类别:实际缺陷。
- 优先级:高。
- 复现条件:在主窗口对一个会话选择“在独立窗口中打开”,在任务窗口发送一条会流式输出的消息。
- 当前行为:任务窗口的 `chat.send()` 能取得 `runId` 并建立本地 `running` 状态,但主进程后续只向 `getWindow()` 返回的主窗口发送 `chat:event`。任务窗口收不到增量、工具或终态事件;主窗口即使收到,也因为本窗口没有对应的 `runs[runId]` 而在 `applyEvent` 中丢弃。用户看到任务窗口一直处于流式/停止状态。
- 代码证据:
- `src/main/index.ts:168` 注册 IPC 时固定传入 `() => mainWindow`。
- `src/main/ipc.ts:628` 在 `chat:send` 中取得 `win = getWindow()`。
- `src/main/ipc.ts:737`~`src/main/ipc.ts:741` 只向该窗口发送后续事件。
- `src/renderer/src/stores/chat.ts:406`~`src/renderer/src/stores/chat.ts:412` 对未知 `runId` 的事件只尝试进入待定队列,否则直接返回。
- 测试盲区:`scripts/verify-task-menu.cjs:143`~`scripts/verify-task-menu.cjs:150` 只检查独立窗口数量及 URL 中的 `taskId`,随后销毁窗口,没有在任务窗口发送或接收任何消息。
- 建议验收:真实打开任务窗口,在两个窗口分别发起和观察同一回合;要求增量正文、工具事件、取消和终态都到达发起窗口,主窗口侧栏状态也能同步,不出现“主窗口无运行、任务窗口永不停”。
### 01-02 归档恢复入口(已解决)
- 类别:实际缺陷,并与 TODO 17 的用户范围叠加。
- 优先级:中高。
- 当前结论:YCode 的产品入口缺口已解决;原版归档弹窗的同状态像素与动画证据仍缺。
- 复现条件:对空闲任务选择“归档”并确认。
- 修复前行为:任务从默认侧栏消失,`session:list-archived` IPC 和预加载接口存在,但渲染器没有任何 `listArchived` 调用或归档列表入口。确认框却明确提示用户前往“系统设置-数据管理”查看,而数据管理已按用户要求移除。普通用户没有路径查看或取消归档。
- 代码证据:
- `src/renderer/src/components/task-confirm-dialog.tsx:21`~`src/renderer/src/components/task-confirm-dialog.tsx:27` 保留“系统设置-数据管理”文案。
- `src/renderer/src/components/SettingsDialog.tsx:23`~`src/renderer/src/components/SettingsDialog.tsx:32` 明确移除 `dataManagement`。
- `src/preload/index.ts:170` 当前只暴露归档列表 API;产品渲染源码没有消费该接口。
- 修复:侧栏任务分组标题新增“已归档”入口;`ArchivedTasksDialog` 显式过滤 `archivedAt !== undefined`,支持“恢复”和“查看”,其中“查看”会先恢复再打开原任务;空间任务恢复后回到原空间分组;确认文案改为“确认将该任务归档吗?归档后可在侧栏「已归档」中查看并恢复。”,不再指向已移除的数据管理。
- 验证:`node scripts/verify-archived-tasks.cjs` 25/25 PASS,覆盖加载态、只列归档任务、独立/空间标识、恢复与查看、快速重复点击、空间分组回归、消息保留、空态、载入失败、重试恢复、Escape 关闭和无渲染器错误;报告 `.tmp/archived-tasks-8VDzsw/report.json`。`npm run typecheck`、`npm run build`、`verify-task-menu`、`verify-sidebar-footer`、`verify-conversation-scrollbar` 均通过。
- 剩余范围:本轮解决 YCode 的可发现与可恢复性,没有通过 REA 采集原版“已归档”列表的同状态画面,因此不能把该弹窗宣称为原版逐像素 1:1。
### 01-03 已确认的原版证据缺口
- 类别:证据缺口。
- 未覆盖:运行中禁用菜单、归档/删除确认弹窗、鼠标悬停态的原版实时像素;置顶行独立图标。
- 当前依据:固定 REA Evidence `ev_f5e9d71a676c453daab40928acfb33aeabae68ba57ffda342380cead7f1a1fe2` 的 DOM/CSS/几何,以及运行源码中“任务进行中禁用归档”的规则。
- 测试盲区:菜单没有 ArrowUp/ArrowDown/Home/End 键盘导航及初始焦点断言;现有脚本只覆盖 Escape/点击关闭等已经实现的部分。
### 01-04 用户约定差异
- 云端的“分享任务”“保存到工作空间”“批量操作”当前不渲染。用户已要求云端服务暂不处理,因此这不是本阶段阻塞项;但它导致菜单高度、条目数量和整卡像素不可能与原版 9 项菜单相同,不能宣称该状态逐像素 1:1。
---
## 02. 表格“添加到对话”及引用结果
**结论:发现问题。**
### 02-01 引用表格只进入当前回合,备用内核下一回合重建历史时丢失
- 类别:实际缺陷。
- 优先级:高。
- 复现条件:当 OMP 不可用、走备用 Gateway/Chat Completions 路径时,第一回合引用一张表并发送;第二回合继续追问表中的数据。
- 当前行为:第一回合的 `promptText` 包含引用 markdown,消息对象也持久化了 `quotes`。但第二回合构建历史时,用户消息只重建正文、附件、资源和能力上下文,没有追加该消息的 `quotes.markdown`。上游收到历史时看不到第一回合引用过的表格。
- 代码证据:
- `src/main/ipc.ts:771`~`src/main/ipc.ts:781` 当前回合把 `quoteText` 拼入 prompt。
- `src/main/ipc.ts:816`~`src/main/ipc.ts:820` 重建历史时遗漏 `message.quotes`。
- 测试盲区:`verify-quote-table` 替换了 `chat:send`,只检查 IPC 载荷;`scripts/conversation-ipc-regression.ts` 没有引用载荷及两回合上游历史断言。因此 48 项 PASS 不覆盖“后续会话仍能看到引用内容”。
- 建议验收:使用备用内核连续两回合,第一回合引用表,第二回合要求模型基于该表回答;在受控上游记录中确认两回合的历史包含引用快照。
### 02-02 输入区卡片没有来源标题,原版宿主标题仍待取证
- 类别:功能缺口 + 证据缺口。
- 优先级:中。
- 当前行为:原版组件预留“作者 + 分隔符 + 摘要”,YCode 组件也支持 `quote.title`,但创建表格引用时从未设置 `title`。当前卡片只显示被压缩的 markdown 摘要。
- 代码证据:
- `src/renderer/src/workbuddy/conversation/TableMessageQuoteAction.tsx:24`~`src/renderer/src/workbuddy/conversation/TableMessageQuoteAction.tsx:33` 只写 `markdown`、`preview`,不生成 `title`。
- `src/renderer/src/workbuddy/conversation/MessageQuoteCard.tsx:29` 只在 `quote.title` 存在时渲染作者标题。
- 证据缺口:TODO 已记录原版标题由宿主 `message.quote.add` 处理端生成,尚未采集实际标题格式。
- 建议验收:通过 REA 取得至少一个真实表格引用的宿主结果和几何,再实现标题;不能猜固定文案。
### 02-03 “不覆盖已有草稿”没有真正被测试
- 类别:测试盲区。
- 代码实现本身未发现丢草稿问题:`ChatPane.quoteTable` 使用当前草稿展开新对象,只追加 `quotes`。
- 测试问题:`scripts/verify-quote-table.cjs:155` 的断言名是“不覆盖已有草稿”,但预期值是空字符串 `''`,且在此前没有向输入框写入任何草稿。该断言只证明“空草稿仍为空”,不能证明已有正文被保留。
- 建议验收:先输入一段正文,再点击“添加到对话”,检查正文不变、引用追加;随后移除引用,正文仍应保留。
### 02-04 原版运行时证据缺口
- 类别:证据缺口。
- 未覆盖:原版点击后输入区卡片与发送后消息标签的实际截图/几何;品牌 token 的运行时定义;来源标题。
- 当前依赖:REA Evidence `ev_38cca1ac66606ab07fb495035e3509f5c4d8ec3e5e2b74d0fdcfcfadb120da3b` 和样式表 `src-CyXHA0IC.css`,不是两态运行截图。
- 本轮 PASS 只覆盖 YCode 自身几何/交互和 IPC 载荷,不替代原版逐像素验收。
---
## 03. 编辑已发送消息
**结论:发现问题。**
### 03-01 编辑带产物的消息时没有询问是否回退历史版本
- 类别:实际缺陷。
- 优先级:高。
- 复现条件:选择一条用户消息,其后续回复通过 `write_file`/`edit_file` 改动过文件;点击编辑并提交。
- 当前行为:编辑器直接调用 `send(..., action: 'edit')`,主进程在分支前固定执行 `rollbackEditedArtifacts`。用户没有机会选择“基于旧版本编辑”或“从最新版本开始编辑”。
- 代码证据:
- `src/renderer/src/components/ChatPane.tsx:251`~`src/renderer/src/components/ChatPane.tsx:254` 直接提交编辑。
- `src/main/ipc.ts:663`~`src/main/ipc.ts:664` 固定回退产物。
- `src/renderer/src/workbuddy/conversation/rewind-labels.ts:19`~`src/renderer/src/workbuddy/conversation/rewind-labels.ts:22` 已回收原版询问文案,但产品代码没有使用。
- 证据:REA 文案 Evidence `ev_e91787b1d4dea651582c6cf12827775b9068b0ee8b80c68ba08d4c1d87d94e90`;行为接线见 TODO 已记录的 `rewind.edit.*`。
- 测试盲区:`verify-user-message-edit` 覆盖直接回退成功和分支失败撤销,却没有验证提交前询问及“不回退”分支。
- 建议验收:有历史产物时,提交编辑先出现原版询问;选择回退与不回退分别得到正确文件内容和对话前缀。
### 03-02 UI 对任何用户消息显示编辑入口,但后端可能没有原生分支
- 类别:实际缺陷。
- 优先级:中。
- 复现条件:打开旧 YCode 会话或导入会话,在 OMP 可用但目标用户消息没有 `nativeEntryId` 时点击编辑并提交。
- 当前行为:编辑器先完整打开并允许输入;提交后主进程才报“当前 OMP 会话的分支记录”错误。对于非最后一条消息,代码没有重建分支的回退路径。
- 代码证据:
- `src/renderer/src/components/MessageBubble.tsx:79`~`src/renderer/src/components/MessageBubble.tsx:81` 只要会话空闲就显示编辑能力。
- `src/main/ipc.ts:667`~`src/main/ipc.ts:676` 对缺少原生分支的消息拒绝提交,只有最后一条 cancelled/error 消息可能现场恢复。
- 测试盲区:真实窗口测试使用带 `nativeEntryId` 的种子消息;IPC 回归也以原生分支可用为前提,没有覆盖“编辑器打开后后端明确不可编辑”的 UI。
- 建议验收:在打开编辑器前判定可编辑性,或在支持历史重建后再显示入口;不能等用户输入完毕才报分支缺失。
### 03-03 提交错误仍被压缩为两类文案
- 类别:实际缺陷。
- 优先级:中低。
- 当前实现:只按“正在运行/尚未结束/in progress”正则区分 `retryLater` 和 `sendFailed`。
- 原版证据:`resend-settle-timeout`、`cancel-barrier`、`send-in-progress` 等错误码有映射表,但 YCode 没有逐错误码处理。
- 代码证据:`src/renderer/src/workbuddy/conversation/UserMessageEditor.tsx:82`~`src/renderer/src/workbuddy/conversation/UserMessageEditor.tsx:93`。
- 测试盲区:本窗口测试的 `chat:send` 总是延迟后成功,没有触发任一错误码。
- 建议验收:至少模拟 `send-in-progress`、`resend-settle-timeout`、`cancel-barrier` 和未知错误,逐项校验文案与编辑器保持状态。
### 03-04 编辑器交互和时序仍有盲区
- 类别:证据缺口/测试盲区。
- 编辑器使用原生 `contentEditable` 并由 `innerText` 取值,而原版为 Slate 编辑器。现有测试通过程序写入 `innerText` 和合成 Enter,不覆盖富文本粘贴、IME composition、Shift+Enter 多行、Undo/Redo 和换行 DOM 归一化。
- 工具条淡入 0.2s、默认 0.15s 延迟到 hover 后 0 秒的逐帧表现未采集。`verify-user-message-edit` 只验证静止计算值。
- 原版 `userMessage.edit.resume` 的“恢复到此版本”状态未实现,英文/中文文案在 `source-labels.ts` 中已有,但产品没有该状态。
---
## 04. 用户消息悬停时间
**结论:当前用户约定范围通过,仍有证据缺口。**
### 04-01 时间三档规则已按用户确认落地
- 当天:`HH:mm`
- 本年非当天:`M月D日 HH:mm`
- 非本年:`YYYY年M月D日 HH:mm`
- 代码:`src/renderer/src/components/AssistantMessageDetails.tsx:4`~`src/renderer/src/components/AssistantMessageDetails.tsx:15`。
- 本轮 `verify-user-message-edit` 67/67 通过,覆盖四种日期情形、会话切换与历史重载;`test:assistant-footer` 也覆盖无效时间。
### 04-02 “昨天 HH:mm”是有意保留的用户约定差异
- 类别:用户约定差异。
- 原版 `formatMessageTime` 有 `昨天 HH:mm` 分支;用户已经确认当前三档时间规则,因此当前实现不构成需修复 Bug。
- 原版证据:REA 回收 `ToolbarRenderer`、`src-CyXHA0IC.css`;运行时 Evidence `ev_245ea1740cde21869500348e47cf9663a1ea72943ccfe79c163a6838a153bfd3`。
### 04-03 工具条入场时序仍是证据缺口
- 当前测试只校验 `opacity/pointer-events` 的 hover 前后值和 `transition` 声明,没有验证 0.15s 延迟退出、hover 立即进入及 tooltip 同步出现。
- 原版未覆盖:默认状态向 hover 态过渡的逐帧画面、tooltip 出现延迟和隐藏延迟。
---
## 05. 用户消息回退操作与图标
**结论:发现问题。**
### 05-01 产物回退弹窗缺少“不回退”动作
- 类别:实际缺陷。
- 优先级:高。
- 复现条件:回退点之后有可回退文件,点击回退按钮。
- 当前行为:弹窗只有“取消”和“回退”,没有原版的“不回退”。用户不能保留当前文件、只回退对话。
- 代码证据:
- `src/renderer/src/components/ChatPane.tsx:451`~`src/renderer/src/components/ChatPane.tsx:455` 只渲染两个动作。
- `src/main/ipc.ts:608`~`src/main/ipc.ts:622` 有变更时总是先恢复文件,没有 skip 参数。
- `src/renderer/src/workbuddy/conversation/rewind-labels.ts:32` 已回收 `rewind.action.skipRewind = 不回退`,但未接线。
- 原版证据:`ev_e91787b1d4dea651582c6cf12827775b9068b0ee8b80c68ba08d4c1d87d94e90`。
- 测试盲区:`verify-user-message-edit` 只测取消和确认;IPC 回归测成功、冲突和失败,没有“skip artifacts”模式。
### 05-02 缺失/被删除的历史版本没有原版 fallback 行为
- 类别:实际缺陷/部分占位。
- 优先级:中高。
- 复现条件:消息之后创建或修改文件,随后在 YCode 外删除该文件;再从对应消息回退。
- 当前行为:预览基于工具记录显示“回退至历史版本”或“将被删除”;确认时 `fs.realpath`/读取当前文件失败,整次回退报错。没有原版的“历史版本已被删除,将保持当前版本”“该产物无历史版本,回退后文件仍会保留”等逐产物状态。
- 代码证据:
- `src/renderer/src/components/ChatPane.tsx:444`~`src/renderer/src/components/ChatPane.tsx:448` 只映射“将被删除/回退至历史版本”。
- `src/main/workspace-revert.ts:15`~`src/main/workspace-revert.ts:26` 要求每个当前文件存在且内容精确等于 `after`。
- 原版文案已在 `rewind-labels.ts:23`~`rewind-labels.ts:29` 回收,说明这些是可区分的产品状态。
- 测试盲区:IPC 回归覆盖外部修改冲突,但只验证“失败且不破坏文件”,没有验证用户可见 fallback 或继续回退其他可处理产物。
### 05-03 失败仍以内联原始错误显示,而非原版 toast
- 类别:实际缺陷。
- 优先级:中。
- 当前行为:`chat:revert` 的原始异常直接显示在回退弹窗中。
- 代码:`src/renderer/src/components/ChatPane.tsx:450`、`src/renderer/src/components/ChatPane.tsx:454`。
- 原版应显示 `rewind.error.rollbackFailed` 的 toast;当前已有文案 `rewind-labels.ts:35`,未接线。
- 测试盲区:真实窗口脚本没有制造回退失败;IPC 回归只看 Promise rejection 和文件状态。
### 05-04 弹窗不是源码级视觉实现
- 类别:证据缺口。
- 当前 `ChatPane` 复用通用 `.overlay/.dialog/.btn`,没有接入原版 Modal/产物清单的逐项规则。
- 未覆盖:弹窗几何、遮罩动画、标题/正文排版、产物行密度、按钮布局和深浅色。
- `hasMoreRequests` 分页首条消息显示规则无法按原版直接验证;YCode 当前全量加载,因此按“非首条用户消息”近似。
---
## 06. 对话区域滚动条
**结论:当前范围通过,完整 1:1 验收仍有缺口。**
### 06-01 已通过的本轮证据
- `verify-conversation-scrollbar` 24/24,PASS,本轮没有 skip,报告 `.tmp/scrollbar-6P7oPm/report.json`。
- 浅色真实像素:6px 滑块位于 `x=1328..1333`,颜色合成 `rgb(204,204,204)`,透明轨道和槽位位置与原版截图一致。
- 行为:初始贴底、流式跟随、用户上滚停止跟随、回到底部恢复跟随、短会话稳定槽位、两个窗口尺寸,均通过。
- 未启用 `hideScrollbarWhenIdle`,与原版运行源码一致。
### 06-02 深色和 hover 仍不是运行时像素验收
- 类别:证据缺口。
- `scripts/verify-conversation-scrollbar.cjs:208`~`scripts/verify-conversation-scrollbar.cjs:209` 只检查 CSSOM 中 hover token 规则。
- `scripts/verify-conversation-scrollbar.cjs:214`~`scripts/verify-conversation-scrollbar.cjs:217` 临时切换 `data-cr-theme=dark` 后只读取 `scrollbar-color`,没有截深色滑块,也没有 hover 渲染像素。
- 原版同样未采集 hover/深色运行时像素,因此当前视觉依据是固定 CSS 与 token,而不是同状态帧。
### 06-03 未纳入的滚动条周边能力
- 类别:证据缺口。
- 原版滚动条附近的“回到底部”等 affordance 尚未确认,因此本项不能证明所有滚动行为 1:1。
- 本轮覆盖 1336、1100、1600 三种宽度;未覆盖 480 最小宽度、系统缩放/高 DPI、macOS/Linux 原生滚动条行为。
---
## 07. 侧栏最下一行
**结论:核心布局当前范围通过;深浅色、窄态和真实账号仍有依赖/证据缺口。**
### 07-01 已通过的本轮证据
- `verify-sidebar-footer` 29/29,PASS,报告 `.tmp/sidebar-footer-Edo50t/report.json`。
- 1336 宽窗口下 footer 为 57 高,padding `8 12 8 8`,1px 顶边,账号/通知/小程序三项顺序正确,底部无收起入口。
- 账号触发器、头像框、姓名、通知角标、hover token,以及顶栏收起/折叠轨道展开入口均通过。
### 07-02 深色和窄态没有运行时验收
- 类别:证据缺口。
- `verify-sidebar-footer` 没有深色截图、计算值或切换断言;脚本只运行在 1336×902 浅色主窗口。
- 窄窗口走左侧 drawer 的产品路径没有在本脚本中执行。TODO 写的是“普通/窄侧栏、浅色/深色”,本轮 29 项 PASS 只覆盖普通浅色与折叠轨道。
- 原版深色 footer 也没有运行时像素证据,当前只有回收 token。
### 07-03 真实头像与内描边仍由账号能力阻塞
- 类别:占位/依赖。
- 当前使用 `#0056d4` 字面首字母头像,不渲染原版真实图片及 `--wb-avatar-fallback-*` 的 1px 内描边。
- 这与 TODO 09 的账号数据尚未接入相关;在本项可视为依赖,但“头像 1:1”尚未完成。
### 07-04 通知与小程序仍是占位
- 类别:占位/依赖,属于 TODO 09 和后续待拆解项。
- 通知角标是 mock 数据;小程序按钮点击显示未实现提示。它们不影响本轮 footer 几何,但不能宣称功能 1:1。
### 07-05 其余轻微差异
- 侧栏整数宽 284px,原版运行时为 284.28px,存在 0.28px 理论残差;本轮几何断言四舍五入后一致。
- 原版 footer 的独立深浅色像素、边缘翻转/窄宽挤压及图标资源仍缺同状态证据。
---
## 23 条原始遗留逐项归档
此前对“19 项”的汇总按 TODO 条目分组;01~07 全文实际包含下列 23 个遗留子项。本表用于确认没有只读每段前四条。
| ID | 原始遗留 | 本次判断 |
| --- | --- | --- |
| 01-A | 菜单/确认弹窗/hover/运行中无原版实时像素 | 证据缺口 |
| 01-B | 置顶行图标缺独立原版证据 | 证据缺口 |
| 02-A | 输入区卡片和发送后标签缺原版截图/几何 | 证据缺口 |
| 02-B | 品牌 token 只有兜底值 | 证据缺口 |
| 02-C | 引用来源标题未采集且当前未实现 | 功能缺口 + 原版具体标题待取证 |
| 03-A | 工具条淡入和 tooltip 时序未逐帧采集 | 证据缺口 |
| 03-B | 原版提交错误码集合未完整映射 | 实际缺陷 |
| 03-C | `userMessage.edit.resume` 未实现 | 实际缺陷/未接状态 |
| 03-D | 原版“昨天”时间分支 | 用户约定差异 |
| 04-A | “昨天”分支 | 用户约定差异 |
| 04-B | 工具条延迟切换未逐帧采集 | 证据缺口 |
| 05-A | 回退弹窗几何与动画未对齐 | 证据缺口 |
| 05-B | 回退失败 toast 未接 | 实际缺陷 |
| 05-C | 逐产物历史缺失/保留状态未实现 | 实际缺陷 |
| 05-D | 编辑前产物回退选择未实现 | 实际缺陷 |
| 05-E | `hasMoreRequests` 首条回退规则无法直接复刻 | 当前全量加载下的近似/证据缺口 |
| 06-A | hover 和深色无运行时像素 | 证据缺口 |
| 06-B | 槽位宽度只能由像素推断 | 证据缺口;本轮 YCode 像素一致 |
| 06-C | 回到底部等周边 affordance 未覆盖 | 证据缺口 |
| 07-A | 0.28px 宽度残差 | 证据缺口,实际可见差异为 0 |
| 07-B | 真实头像和 1px 内描边未接 | 占位/依赖 |
| 07-C | 深色 footer 无运行时像素 | 证据缺口 |
| 07-D | 通知角标和小程序为 mock | 占位/依赖 |
此外,本次源码审查新增了 TODO 原文未拆出的四项高优先级问题:跨窗口事件、引用历史丢失、原生分支不可用的后置报错、归档入口不可回访。它们应进入下一轮修复或补充 TODO,不应用“专项脚本 PASS”覆盖。
## 建议修复与验收顺序
1. 先修 `chat:event` 的窗口路由。事件应到达发起窗口,并按需要同步其他窗口;至少不得使用全局 `mainWindow` 作为所有对话事件的唯一目标。
2. 在备用内核重建历史时追加每条用户消息的引用快照,并增加两回合上游请求断言。
3. 将编辑提交前产物询问和回退弹窗“不回退”接线;同时补齐逐产物缺失版本/保持当前版本状态。
4. 将原生分支能力作为编辑/回退入口的前置条件,或在编辑器打开前明确不可用。
5. 修复归档的可回访产品路径与已移除“数据管理”的冲突。
6. 先通过 REA 取得原版宿主生成的引用来源标题,再按证据补齐;同时完成逐错误码编辑文案、失败 toast 和真实窗口错误态回归。
7. 最后做原版同状态像素与动画验收:菜单 hover/运行中、引用两态、编辑失败、回退弹窗、滚动条 hover/深色、footer 深色/窄态。
## 建议命令
以下命令由主上下文串行运行,避免多个 Electron 并行抢焦点:
```powershell
npm run build
node scripts/verify-task-menu.cjs
node scripts/verify-task-running-menu.cjs
node scripts/verify-quote-table.cjs
node scripts/verify-user-message-edit.cjs
node scripts/verify-conversation-scrollbar.cjs
node scripts/verify-sidebar-footer.cjs
npm run test:conversation-ipc
npm run test:chat
npm run test:conversation
```
建议新增纯测试或受控集成测试:
```text
独立任务窗口发起消息并流式完成
备用内核第二回合仍携带前一轮 quote markdown
已有正文时添加/移除表格引用不丢正文
编辑有产物和无产物消息时出现正确回退选择
回退时选择 skip artifacts、文件已删除、外部修改和部分产物可回退
深色滚动条及 hover 的真实截图
深色 footer、窄 drawer footer、真实头像 fallback
```
## 报告限制
- 本报告没有修改或构建业务代码。
- 本报告没有启动 Electron;六个专项结果是主 agent 在本轮串行批次的运行结果。
- 本轮没有直接操作 WorkBuddy,也没有读取安装包、导出 Evidence JSON 或其他绕过 REA 的渠道。
- 已有 REA 结论均来自项目文档中记录的固定 Evidence;不能替代缺失的运行时状态。
- 已知 `9223` 端口不可达不影响“通过其他 REA target/静态分析继续取证”的总体能力,但本报告没有把该失败视为 WorkBuddy 功能结论。