Files
ycode/docs/验收问题收集-2026-10-17-发送与设置.md

24 KiB
Raw Permalink Blame History

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 始终禁用。
  • 功能未接:编辑器实际是 <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 未覆盖 只测字符串拼装

建议处理顺序

  1. 修复 08 创建后失败状态机,并增加成功建会话后拒绝 chat:send 的回归。
  2. 修复 10 的 partial 展示和 openFolder 错误返回。
  3. 明确 12 的 Esc 优先级,并把 14 个 supported 声明逐个做成行为断言。
  4. 先用原版证据确认 13 默认人设与个性化提示词层级,再处理 UI 一致性和真实请求回归;同时修跨窗口欢迎语同步。
  5. 补 09 账户 header 实高与图标 REA 证据。
  6. 最后补 11 首帧、重载、独立窗口及弹层/内容块主题矩阵。

跨模块依赖(不计入本文问题数)

  • 独立任务窗口的 chat:event 路由问题已由主上下文确认。它会扩大 08 中“切换任务后运行状态仍正确”的适用面,但本文不重复计项。
  • 备用网关 history 遗漏 quotes 已由主上下文确认,属于对话投影/网关链路,本文不重复计项。
  • memory 默认偏好误写已由主上下文确认,属于 14 记忆模块,本文只提示其可能影响跨设置持久化验收,不重复计项。

完成这些后仍需用 WorkBuddy 对应版本的 REA Evidence 做同视口、同状态、同输入对比;本轮专项 PASS 只能证明列出的断言范围,不等于 08~13 已全部 1:1。