# 08~13 验收问题收集(2026-10-17) 本文只验收 `复刻待办清单-2026-10-17.md` 的 08~13: 1. 新建任务发送后的立即切页与占位 2. 账户菜单与页面 3. 通用设置 4. 外观与浅色/深色主题 5. 快捷键页面与真实功能 6. 个性化页面与真实功能 本轮不修改业务代码、测试或 TODO,不启动 Electron/build。WorkBuddy 原版结论只沿用项目内既有 REA Evidence;本文没有新采集、驱动或修改 WorkBuddy。 ## 本轮专项结果 主上下文最新构建后的专项脚本结果如下: | 条目 | 脚本 | 结果 | checks | | --- | --- | --- | ---: | | 08 | `verify-new-task-switch` | PASS | 30/30 | | 09 | `verify-account-menu` | PASS | 64/64 | | 10 | `verify-general-settings` | PASS | 43/43 | | 11 | `verify-appearance-settings` | PASS | 21/21 | | 11 | `verify-desktop-appearance` | PASS | 19/19 | | 12 | `verify-shortcuts-settings` | PASS | 32/32 | | 13 | `verify-personalization-settings` | PASS | 29/29 | | 13 | `npm run test:personalization` 离线纯测试 | PASS | 全部断言 | 主上下文报告最新构建通过,并已单独通过 `npm run test:conversation-ipc`。这些结果只覆盖对应构建与断言,不替代本文列出的原版证据和全状态验收。 报告: - `.tmp/new-task-switch-CskK4m/report.json` - `.tmp/account-menu-1pttNZ/report.json` - `.tmp/general-settings-it8Zlb/report.json` - `.tmp/appearance-settings-3Jyy3m/report.json` - `.tmp/desktop-appearance-hM7qdy/report.json` - `.tmp/shortcuts-settings-Q8JoQ3/report.json` - `.tmp/personalization-settings-0eAA5x/report.json` - `.tmp/audit19-20261017-165014/conversation-ipc.log` 19 个串行脚本中 17 个通过、2 个失败。`verify-settings-nav` 仍把已接入的“记忆”断言为禁用;`verify-composer-context-info` 仍使用旧 `.segmented` 主题控件,外观页改为主题卡后等待超时。两处均为陈旧测试预期,不推断为业务失败,本报告不把它们计作 08~13 的缺陷。 ## 优先复核的实际问题 ### P2:会话已创建、回合未启动时失败,会留下“空会话 + 新任务界面”的双重状态 - 复现:新任务发送后,让 `session:create` 成功,随后让 `chat:send` 在运行环境启动、附件提交、资源校验或 `startTurn` 任一阶段失败。例如发送过程中删除暂存附件,或让 OMP 启动失败。 - 实际:`newSession()` 已把 `currentSessionId` 设为新会话;后续 `chat:send` 失败时,渲染层只删除乐观消息,没有删除会话或恢复 `currentSessionId=null`。`ChatPane` 因 `messages.length===0` 显示新任务首页,但空间选择仍因 `currentId!==null` 被禁用。 - 期望:首回合启动失败后,要么删除刚创建但从未启动的会话并回到真正的新任务状态,要么保留失败会话和完整错误上下文,不能出现“看起来是新任务、实际已绑定旧会话”的状态。 - 影响:侧栏产生无消息任务;重试会继续使用这个会话;用户无法再切换该“新任务”的工作空间,后续上下文归属容易出错。 - 代码:`src/renderer/src/stores/chat.ts:250-259` 设置新 `currentSessionId`;`src/renderer/src/stores/chat.ts:313-360` 失败路径只清消息;`src/renderer/src/components/ChatPane.tsx:171` 把空消息当首页;`src/renderer/src/components/ChatPane.tsx:371` 用非空 `currentId` 禁用空间切换。 - 当前证据:本轮 30 项脚本没有覆盖它。`scripts/verify-new-task-switch.cjs:175-203` 的失败场景先清空模型注册表,使 `session:create` 在 `src/main/ipc.ts:535-538` 的模型解析阶段就失败,所以此时根本没有创建会话。测试名“发送失败后回到首页”通过,但对应的是“创建会话前失败”。 - 下一步:新增“`session:create` 成功、`chat:send` 拒绝”的回归;断言会话列表、`currentSessionId`、空间选择可用性和草稿恢复同时一致。原版准备失败是否保留空会话仍缺 REA 运行时证据。 ### P2:通用设置的磁盘统计被超时截断时,仍按完整值展示 - 复现:让 `app.getPath('userData')` 包含超过 200,000 个文件,或目录扫描超过 1.5 秒。 - 实际:扫描返回 `partial:true`,但进程只把这个值放到 `dataUsagePartial`;设置页完全不读取它,仍把已扫描字节当成完整“已用”值,并据此绘制进度条。 - 期望:显示“统计未完成/继续扫描”,或异步完成后刷新;不能把下界当作精确总量。 - 影响:存储占用和磁盘进度会偏低;用户会误以为目录已清理或容量不足。 - 代码:`src/main/general-settings.ts:80-101` 在 200,000 条目或 1500ms 时截断;`src/main/ipc.ts:418-419` 返回 `dataUsagePartial`;`src/renderer/src/components/GeneralSettingsPanel.tsx:173-178`、`:235-257` 只消费 `dataBytes`,没有读取 partial。 - 当前证据:`verify-general-settings` 使用很小的隔离数据目录,43 项全部通过;没有构造条目上限或耗时预算耗尽。 - 下一步:增加大目录/低预算纯函数测试,并在界面提供部分统计状态或继续扫描。 ### P2:右侧工作台全屏且任务生成中,按 `Esc` 会同时取消生成和退出全屏 - 复现:打开右侧工作台并全屏,启动一个生成中的回复,把焦点留在工作台内后按 `Esc`。 - 实际:App 的全局监听取消当前运行;`SourceWorkbench` 的独立监听也退出全屏。两个监听都挂在 `window` 上,工作台监听没有检查 `event.defaultPrevented`,也没有阻止同一事件继续传递。 - 期望:明确一个优先级。快捷键表只声明“生成中 Esc 停止生成”,因此至少不应同时触发未声明的第二个动作;若原版在全屏时另有优先级,应以 REA 运行时证据为准。 - 影响:一次按键产生两个业务状态变化,容易打断用户查看工作台。 - 代码:`src/renderer/src/App.tsx:295-316` 的生成中 Esc;`src/renderer/src/workbuddy/workbench/SourceWorkbench.tsx:59-65` 的全屏 Esc。 - 当前证据:`verify-shortcuts-settings` 只测试录制态 Esc,不测试生成中 Esc,也不测试全屏组合状态。 - 下一步:增加“生成中 + 全屏 + 工作台焦点”的冲突回归,再按原版优先级收敛。 ### P2:默认人设的页面说明与实际默认注入状态不一致 - 复现:保持“人设设定”为页面初始值,不编辑,直接发送消息。 - 实际:页面展示完整工作人设并说明“对所有回复生效”,但 `buildPersonalizationPrompt()` 发现它等于默认人设后主动跳过,所以该字段本身不会从个性化模块进入本回合上下文。这是既定实现选择,不等于行为必然错误;YCode 内置提示词是否承担了等价语义尚未证明。 - 期望:页面应准确说明默认人设由哪一层生效;如果内置提示词与展示的人设不等价,则应注入展示内容或调整说明。行为是否与原版等价需要 REA 证据判断。 - 影响:用户看到的人设说明与模型实际收到的个性化字段不一致,容易误判当前人设是否已经生效。 - 代码:`src/shared/personalization.ts:108-116`,尤其 `:113` 明确排除等于 `DEFAULT_PERSONA` 的值;该值在 `PersonalizationSettingsPanel.tsx:278-285` 作为默认人设展示。 - 当前证据:`scripts/personalization-prompt-regression.ts` 反而断言默认人设不得进入提示词,证明这是既定实现选择;尚无证据证明 YCode 内置提示词与展示内容行为等价。 - 下一步:用 REA 补原版默认人设的生效层级和内容证据,再决定注入展示内容、证明内置替代,或修正 UI 文案。 ### P2:欢迎语跨原生设置窗口更新时,主窗口的现有流式状态栏没有可靠刷新信号 - 复现:在主窗口保持一个尚未产生正文的慢请求;打开原生设置窗口切换“欢迎语”;观察主窗口当前加载提示。 - 实际:设置窗口写共享 `localStorage` 后只派发当前 renderer 的自定义 `ycode:personalization-change` 事件。主窗口是另一个 BrowserWindow,只会收到浏览器 `storage` 事件;`personalization-prefs.ts` 没监听它。当前组件除非因其他状态再次渲染,否则不会收到变更。 - 期望:配置修改后,所有窗口中的当前流式状态栏即时同步。 - 影响:开关似乎已保存,但当前会话仍显示或隐藏欢迎语;新请求通常会在挂载时读到新值,导致“有时生效、有时要等下一次”的不稳定现象。 - 代码:`src/renderer/src/personalization-prefs.ts:8` 定义自定义事件;`:25` 只在设置窗口派发;`:32` 只订阅自定义事件;`src/renderer/src/workbuddy/conversation/StreamingFooter.tsx:110` 用这个订阅驱动 `useSyncExternalStore`。 - 当前证据:`scripts/verify-personalization-settings.cjs:210-217` 只在设置窗口读取 `localStorage`,没有检查主窗口正在挂载的 `StreamingFooter`。 - 下一步:监听 `window.storage` 或通过主进程广播配置变更;增加双窗口、活跃流式请求的同步用例。 ### P2:账户菜单头部实际高度仍比原版多约 4.19px,现有测试只比较了 `min-height` - 复现:打开账户菜单,测量 `.user-menu-header` 的 `getBoundingClientRect().height`。 - 实际:头部由两行(名称和新增的 mock 说明)撑高,已知结果约 60.19px;原版头部为 56px。测试只断言 CSS `min-height:56px`,不会发现内容把容器撑高。 - 期望:保留用户要求的头像与名称内容,同时由明确布局把头部控制到原版 56px;若副标题必须保留,应把它移到不改变原版几何的位置。 - 影响:计费卡和后续条目整体下移,不能宣称账户菜单逐像素完成。 - 代码:`src/renderer/src/workbuddy/user-menu/AccountMenu.tsx:90-98` 增加副标题;`account-menu-source.css:119-126` 使用 `min-height:56px`;副标题样式在 `:178-185`。 - 当前证据:`scripts/verify-account-menu.cjs:178` 只检查 `minHeight='56px'`。 - 下一步:补实际高度与各 section 的 y 坐标断言,再对照固定 REA 几何修正。 ### P2:账户菜单 5 个条目图标仍是 Lucide 占位,不是原版路径 - 复现:对照原版菜单和当前菜单的设置、外观、记忆、更新、退出图标。 - 实际:源码明确写明原始 SVG 尚未回收,当前用 Lucide 同族图标占位。 - 期望:使用 REA 回收的原版 SVG path、viewBox 和线宽。 - 影响:容器尺寸一致,但字形不一致,不能完成像素级验收。 - 代码:`src/renderer/src/workbuddy/user-menu/account-menu-icons.tsx:4-7` 和后续图标定义。 - 当前证据:本轮只验证 16×16 盒子,不验证 path。 - 下一步:用 REA 针对 5 个条目补 `svg_nodes`,再替换和做像素比对。 ### P2:深色主题下 native 窗口底色仍固定为白色,重载/空白首帧白闪仅为未观察风险 - 复现:深色主题下重载主窗口、打开独立任务窗口或原生设置窗口,并捕获页面绘制前帧。 - 实际:三个 BrowserWindow 都写死 `backgroundColor:'#ffffff'`;主题在 renderer React effect 中才写到 `documentElement`,窗口底色不会随主题更新。本轮没有捕获到白闪,也没有在重载帧中观察到白闪,因此不能写成已发生。 - 期望:窗口 native background 与持久化主题一致,首帧和重载帧不出现白色闪屏。 - 影响:稳定态截图可全通过,但启动、刷新、窗口树重建时仍会出现浅深混色。 - 代码:`src/main/index.ts:33`、`:103`、`:178`;`src/renderer/src/useSharedTheme.ts:9-13` 在 effect 中设置主题。 - 当前证据:`verify-appearance-settings` 和 `verify-desktop-appearance` 都等待稳定态后才采样,没有首帧/重载帧证据。 - 下一步:补充首帧捕获;主进程根据持久化主题设置窗口 `backgroundColor`,或使用首屏内联主题引导。 ### P2:本地将个性化上下文作为 `userText` 拼接;原版注入层级尚未取证 - 复现:设置回复风格、用户指令或长期记忆后发送一轮,并检查实际内核输入。 - 实际:个性化段落被拼接到用户 `text`,最终作为 `userText` 交给内核;它没有作为独立消息角色发送。这证明了本地实现路径,但尚不能据此断言原版一定使用或一定不使用某个特定角色。 - 期望:先用原版 REA 证据确定个性化字段的角色层级、优先级和合并顺序,再证明本地 `userText` 拼接是否等价。 - 影响:用户级拼接可能影响偏好的优先级;在取得原版证据前,这一行为与原版是否等价仍属未知。 - 代码:`src/main/ipc.ts:774-781` 把 `personalizationPrompt` 拼进 `promptText`,随后作为 `userText` 交给内核;`src/shared/personalization.ts:108-116` 排除默认人设。 - 当前证据:纯函数测试只验证字符串拼装,没有通过真实 `chat:send`/上游捕获 system 与 user 两个 roles。 - 下一步:用 REA 取原版请求构造层级,再补真实 IPC/受控上游的角色断言。 ## 08. 新建任务发送后的立即切页与占位 结论:**立即切页、乐观消息、单一启动占位和取消主链已实现,30/30 本轮断言通过;完整准备阶段、创建后失败回滚和准备阶段取消仍未闭环。** - 已验证:约 500ms 内切页/显示用户消息/启动占位;真实占位替换无重复;运行中切换任务;停止后 `cancelled` 落库。 - 实际缺陷:见 P1“空会话 + 新任务界面”双状态。 - 功能未接:只输出 `acquiring_runtime`。`src/renderer/src/workbuddy/conversation/prepare-phases.ts:6-24` 明确说明主进程是单阻塞阶段;其余 9 个已经恢复的文案没有真实阶段发送方。 - 功能未接/待原版确认:发送窗口内没有停止入口。当前 Composer 在 `sending || running` 期间显示发送禁用态,只有真实 run 建立后才出现停止按钮。 - 证据缺口:WorkBuddy 发送后的逐帧时序未获得;原版准备失败是否保留空会话、是否允许准备阶段取消均未获得 REA 运行时证据。 - 测试盲区:未覆盖创建成功后 `chat:send` 失败、进程在启动窗口退出、准备阶段长时间停留、所有准备阶段依次推进。 ## 09. 账户菜单与页面 结论:**当前用户指定内容、打开/关闭、设置导航、浅深色和错误/未接提示已实现,64/64 本轮断言通过;仍不能称为逐像素完成。** - 已验证:头像、名称、套餐、余额、升级套餐、购买积分、设置、外观、记忆与进化、检查更新、退出登录;原生设置窗口复用;浅深色 token。 - 实际视觉差异:头部高度约 60.19px 对原版 56px。 - 实际视觉差异:5 个图标为 Lucide 占位。 - 用户范围边界:账户、套餐、余额、计费、更新和退出登录服务未接,云端服务本轮不列为缺陷;用户指定的内容范围差异也不列为缺陷。 - 证据缺口:原版深色运行时像素未采集;滚动、窗口失焦等关闭路径未采集。 - 测试盲区:只测 `min-height`,没有测真实 header height;“退出登录”只验证存在/禁用语义,没有点击并断言提示;没有 SVG path 对照。 ## 10. 通用 结论:**布局、5 个真实设置和 11 个明确占位已实现,43/43 本轮断言通过;存储统计的 partial 状态和打开目录错误处理存在实际缺陷。** - 已验证:防止休眠偏好、开机启动偏好持久化、真实数据目录、磁盘容量、工作区根目录持久化、通知设置入口、浅深色、未接控件保持禁用。 - 实际缺陷:部分目录统计仍按完整值展示。 - 实际缺陷:`src/main/ipc.ts:444-447` 忽略 `shell.openPath()` 返回的错误字符串。工作区目录被删除、权限异常或系统文件管理器启动失败时,设置页不会显示错误。现有测试只检查 API 函数存在,没有实际点击“打开目录”。 - 功能未接:语言、链接打开方式、字体大小、锁屏运行、网络代理、自动安装可信技能、技能自动更新、套件自动更新、通知提示音、定时任务产物通知、体验优化计划。代码在 `GeneralSettingsPanel.tsx:185-215` 和 `:280-305` 显式禁用,未伪装成功。 - 证据缺口:“系统缓存目录”实际统计整个 `userData`,包含配置、会话和缓存;原版目录语义及是否同样包含这些数据尚需 REA/运行环境证据。 - 测试盲区:`verify-general-settings.cjs:29` 设置 `YCODE_DISABLE_SYSTEM_INTEGRATION=1`,没有验证真实登录项、Windows 通知设置页和系统文件管理器;`:267-277` 直接调用 `changeWorkspaceRoot(path)`,没有点击“更改”并操作系统目录选择器;没有让真实任务运行时验证 `powerSaveBlocker` 是否实际启停,也没有覆盖并发任务计数。 ## 11. 外观与浅色/深色主题 结论:**用户限定的浅色/深色、跨窗口同步和重启持久化已实现;两套本轮外观脚本均通过。稳定态通过不等于全状态和首帧通过。** - 已验证:外观面板几何、两张主题卡、即时切换、主窗口/设置窗口同步、稳定态浅深色可读性、重启持久化、首页机器人 ROI 零差异。 - 源码风险:三个 BrowserWindow native 底色固定白色,重载或首帧“可能”出现白闪;本轮未观察到该现象。 - 用户范围边界:原版另外 7 张主题卡不接入,不列为当前缺陷。 - 证据缺口:原版主题切换过渡动画因 `target_changed` 未连续采集;YCode 只验证了稳定深浅两态。 - 测试盲区:稳定态采样只有设置壳和主窗口 5 个表面;未覆盖独立任务窗口、账户/模型/加号弹层、代码块、表格、工具结果、对话框、滚动条、首帧、重载帧和动画中间帧。`verify-desktop-appearance` 的像素比较范围只有首页机器人 120×78 ROI,不能外推到整个界面。 - 变量缺口:原版 tokens 中不存在、但旧 YCode 样式仍引用的变量保留 fallback,尚未做原版运行时逐项核对。 ## 12. 快捷键页面与真实功能 结论:**24 行展示、搜索、录制/取消、4 个全局快捷键和浅深色已通过;14 个“已绑定”声明中存在明显测试假阳性,并发现 Esc 双动作冲突。** - 已验证:Ctrl+B、Ctrl+K、Ctrl+Shift+B、Ctrl+N;24 行文案/键位;搜索和空态;录制态 Esc 取消;深色布局。 - 实际缺陷:生成中 + 工作台全屏时,Esc 同时停止生成和退出全屏。 - 测试假阳性:`scripts/verify-shortcuts-settings.cjs:204-207` 所谓“supported rows match the shortcuts YCode really binds”只是拿界面 `data-shortcut-supported` 与静态目录比较,没有执行动作。真正执行主窗口键位的断言在 `:151-172`,只覆盖 Ctrl+B、Ctrl+K、Ctrl+Shift+B、Ctrl+N。 - 未执行的真实绑定:Ctrl+,、Enter 发送、Shift+Enter 换行、生成中 Esc 停止、Ctrl+=/Ctrl+Shift+= 放大字号、Ctrl+- 缩小、Ctrl+0 重置、Ctrl+T 新标签、Ctrl+W 关标签。 - 静态源码显示这些处理器存在:`App.tsx:271-319`、Composer 输入键盘处理和 `SourceWorkbench.tsx:59-65`,但没有专项运行断言;尤其全屏 Esc 已暴露冲突。 - 功能未接:自定义键位保存、单条删除、整表恢复默认;语音录制、对话内搜索、上/下一个任务、定位任务、F11 全屏、唤起/隐藏主窗口、@ 选择器、/ 命令、Ctrl 强制外部打开只展示未执行。 - 证据缺口:空搜索文案为本地文案;深色 toolbar 控件为本地适配;原版自定义键位持久化格式和命令注册表实现仍未完整对齐。 - 下一步:逐个发送真实键位并断言 DOM/持久化/内核状态;先把 Esc 冲突定为单动作,再补 Ctrl+T/W、字号和发送键盘回归。 ## 13. 个性化页面与真实功能 结论:**页面主体、回复风格、身份编辑、长文本保存、欢迎语持久化和浅深色已通过;默认人设、提示词层级、富文本编辑器、文件修改过程和跨窗口即时同步尚未闭环。** - 已验证:五张卡、8 种回复风格、身份 inline 编辑、失焦丢弃、长文本弹窗、配置持久化、重开恢复、深色布局。 - P2 一致性问题:默认人设展示但既定个性化逻辑不会把该默认值注入请求;内置提示词是否提供等价行为仍待证明。 - 实际风险:欢迎语通过 localStorage 的进程内自定义事件同步,主窗口没有可靠接收另一 BrowserWindow 的变更。 - 功能未接:“显示文件修改过程”在 `PersonalizationSettingsPanel.tsx:287` 始终禁用。 - 功能未接:编辑器实际是 `