24 KiB
08~13 验收问题收集(2026-10-17)
本文只验收 复刻待办清单-2026-10-17.md 的 08~13:
- 新建任务发送后的立即切页与占位
- 账户菜单与页面
- 通用设置
- 外观与浅色/深色主题
- 快捷键页面与真实功能
- 个性化页面与真实功能
本轮不修改业务代码、测试或 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始终禁用。 - 功能未接:编辑器实际是
<textarea>,见PersonalizationSettingsPanel.tsx:306;原版.sc-editor-content的富文本格式、粘贴、快捷键和内容模型未复刻。 - 架构差异:个性化段落被拼入用户消息而不是 system/developer 指令,见
src/main/ipc.ts:774-781。 - 证据缺口:原版默认人设与宿主提示的关系、个性化字段真正的角色层级仍未知。
- 测试盲区:
verify-personalization-settings.cjs:210-217只在设置窗口验证 localStorage 和配置,不验证主窗口当前加载提示;纯测试只验证字符串函数,不验证真实chat:send后的角色和内核输入;没有测试富文本粘贴、超长内容的 UI 反馈或真实上游收到的个性化内容。 - 外部副作用:既有 REA 操作曾把 WorkBuddy“对你的称呼”保存为
CodexTmp,原版空值确认无法直接恢复。该问题属于 WorkBuddy 共享运行态清理,不在 YCode 业务代码中;本轮未操作。
跨条目测试覆盖矩阵
| 场景 | 已有覆盖 | 结论 |
|---|---|---|
| 创建前失败,如模型不存在 | verify-new-task-switch 覆盖 |
通过 |
| 创建成功后、回合启动前失败 | 未覆盖 | 会留下空会话,需补回归 |
| 原版完整准备阶段推进 | 未覆盖 | 当前只接一条占位 |
| 账户菜单 header 实际高度 | 仅 min-height |
仍多约 4.19px |
| 账户菜单 SVG path | 未覆盖 | Lucide 占位 |
| 通用目录超大/扫描超时 | 未覆盖 | partial 被当成完整值 |
| 打开目录失败 | 未覆盖 | 错误被吞掉 |
| 真实系统登录项/通知 | 隔离掉 | 仅验证偏好与 IPC 可调用 |
| 深色首帧/重载 | 未覆盖 | native 背景为白色;白闪风险未观察确认 |
| 深色全表面 | 仅局部稳定态 | 独立窗口、弹层、内容块未覆盖 |
| 快捷键 supported 声明 | 静态目录对照 | 14 行中仅 4 个唯一动作真实执行 |
| Esc + 生成 + 全屏 | 未覆盖 | 源码存在双动作 |
| 欢迎语跨两个 BrowserWindow | 未覆盖 | 当前流式状态栏可能不即时更新 |
| 默认人设真实注入 | 未覆盖,且离线测试明确禁止个性化模块注入默认值 | 页面说明与实际字段不一致,行为等价待证 |
| 个性化真实请求 roles | 未覆盖 | 只测字符串拼装 |
建议处理顺序
- 修复 08 创建后失败状态机,并增加成功建会话后拒绝
chat:send的回归。 - 修复 10 的 partial 展示和
openFolder错误返回。 - 明确 12 的 Esc 优先级,并把 14 个 supported 声明逐个做成行为断言。
- 先用原版证据确认 13 默认人设与个性化提示词层级,再处理 UI 一致性和真实请求回归;同时修跨窗口欢迎语同步。
- 补 09 账户 header 实高与图标 REA 证据。
- 最后补 11 首帧、重载、独立窗口及弹层/内容块主题矩阵。
跨模块依赖(不计入本文问题数)
- 独立任务窗口的
chat:event路由问题已由主上下文确认。它会扩大 08 中“切换任务后运行状态仍正确”的适用面,但本文不重复计项。 - 备用网关 history 遗漏
quotes已由主上下文确认,属于对话投影/网关链路,本文不重复计项。 - memory 默认偏好误写已由主上下文确认,属于 14 记忆模块,本文只提示其可能影响跨设置持久化验收,不重复计项。
完成这些后仍需用 WorkBuddy 对应版本的 REA Evidence 做同视口、同状态、同输入对比;本轮专项 PASS 只能证明列出的断言范围,不等于 08~13 已全部 1:1。