Files
ycode/docs/验收问题收集-2026-10-17-记忆与上下文.md

23 KiB
Raw Permalink Blame History

验收问题收集:记忆、智能体、导航、关于、Git 与上下文

日期:2026-10-17
范围:复刻待办清单 14、15、16、17、19、21
约束:不改业务代码、测试或 TODO;WorkBuddy 结论只引用现有 REA Evidence,不把已知 9223 endpoint_unreachable 推断成 REA 全部不可用。

本轮结论

条目 当前结论 需要关注的内容
14 记忆与进化 P2 实际问题 首次只切换“对话记忆”会错误把“本地记忆与技能”偏好写成开启;本地执行器未接,不把偏好错误写成记忆内容丢失。
15 智能体团队管理 当前范围主体通过 持久化、重开恢复、深浅主题、布局均通过;子代理调度和云端服务按用户要求不计 Bug。另有首帧默认值闪烁和键盘交互测试缺口。
16 移除助理与设备连接 当前范围通过 四个移除入口均不在导航、搜索和渲染页面中;旧深链接回退有效。settings-nav 的失败是脚本仍把 memory 当未接入。
17 移除数据管理与应用管理 当前范围通过 与 16 同一实现和回归;没有发现业务缺陷。
19 关于与获取帮助 当前范围通过,有证据缺口 布局、版本、深浅主题和“无外跳链接”通过;独立更新窗口未实现,但外跳/更新服务按本轮约束不计 Bug。获取帮助深色态和按钮点击无动作缺直接断言。
21 Git 分支与会话上下文 不能验收为 1:1 完成 有 P2 功能缺口、准确性风险、实现限制、布局风险和证据缺口:Chat Completions usage 未接、切模型样本来源未绑定、detached HEAD 保守不渲染、五类占比和窗口控件未实现、紧凑分支未启用、浮层碰撞未验收、刷新与状态未验收。

分类口径

  • 实际问题:源码行为可确定地产生错误、错误状态或与验收条件冲突。
  • 功能未接:界面已存在但能力没有实现;若是用户本轮明确排除的云端、子代理调度或外跳链接,不列为 Bug。
  • 证据缺口:原版行为或视觉尚未取得 REA 证据,当前不能宣称 1:1。
  • 验收脚本维护缺陷:产品行为符合当前基线,但专项脚本仍检查旧 DOM、旧支持列表或旧默认状态。
  • 测试盲区:已有断言通过,但没有覆盖验收条件中的关键状态或副作用。

14. 记忆与进化

14-1 [P2 实际问题] 首次切换“对话记忆”会顺带把“本地记忆与技能”偏好写成开启

触发条件:

  1. 新用户配置或 config.json 中尚无 memoryPreferences。
  2. 打开“设置 → 记忆与进化”,页面正确显示“对话记忆”开启、“本地记忆与技能”关闭。
  3. 只切换“对话记忆”。

源码原因:

  • src/shared/memory.ts:30 把两个默认值定义为 conversationMemory: true、localMemorySkills: false。
  • src/shared/memory.ts:38 却用 value?.localMemorySkills !== false 归一化;传入 undefined 时返回 true,与声明的默认值不一致。
  • src/main/memory-settings.ts:34 在更新前直接调用 normalizeMemoryPreferences(await getStoredMemoryPreferences()),没有先合并 DEFAULT_MEMORY_PREFERENCES。
  • 因此第一次只更新任一项偏好时,localMemorySkills 会被归一化成 true,随后写入 config.json。
  • src/renderer/src/components/MemorySettingsPanel.tsx:26 的初始视图也使用同一个函数;在真实数据返回前,“本地记忆与技能”会短暂显示开启。

影响:

  • 用户没有操作“本地记忆与技能”,其本地偏好却被持久化修改。
  • 现有 .tmp/memory-settings-poBX32/report.json 虽然 PASS,但没有在“只切换对话记忆”后断言第二项仍为关闭。

边界:

  • 当前“本地记忆与技能”自动记录执行器尚未接入,因此没有证据表明本次偏好误写已经造成记忆正文、工作记录或技能数据丢失。
  • 本项定级为 P2 偏好写入副作用,不做 P1 数据损坏判断。

独立复核结果:

{"empty":{"conversationMemory":true,"localMemorySkills":true},"after":{"conversationMemory":false,"localMemorySkills":true}}

建议回归:

  • 空配置加载后断言两项分别为 true、false。
  • 只切换 conversationMemory,读取 IPC 返回值和 config.json,断言 localMemorySkills 仍为 false。
  • 反方向只切换 localMemorySkills,断言 conversationMemory 不变。
  • 在延迟 IPC 下断言首帧不会显示错误的本地记忆开关状态。

14-2 [P2 验收缺口] 编辑保存没有忙碌态、重复提交保护和成功反馈

MemorySettingsPanel.tsx:368 的 saveEdit 没有独立 busy 状态,保存按钮不改变文案也不禁用;双击可产生并发写入。TODO 也已记录原版“更新中/成功 toast”没有源码级等价。该问题不影响现有专项 24 项 PASS,但未覆盖真实慢写入和失败后重复点击。

14-3 [证据缺口] 原版重置弹窗、自动记忆和服务流转仍未验证

  • 重置弹窗目前按原版共享 Modal 源码复原,未取得原版运行态逐像素证据。
  • 账户侧自动生成、每夜整理、更新时间和服务端编辑流转未接入。按用户“云端服务先不管”的边界,这些不列为本轮 Bug,但当前页面仍展示“每晚自动整理更新”等表述,不能对外宣称该能力已实装。
  • 打开/关闭动画、窄窗口、刷新失败和所有错误 toast 还没有逐帧验收。

15. 智能体页面:团队管理

15-1 [P3 实际问题] 已存禁用值在首帧仍按“开启”渲染

AgentsSettingsPanel.tsx:151 使用 view?.teamManagement ?? true。当持久化值为“禁用”且 IPC 返回较慢时,页面会先显示“开启”,返回后再切成“禁用”;测试在固定等待后读取,未观察首帧。该问题不会覆盖持久化结果,但属于可见状态闪烁,也不利于逐像素验收。

建议回归:

  • 人为延迟 agents:get,断言加载前不显示错误的“开启”值,或使用已确认的原版加载骨架。
  • 加载完成前禁用下拉,避免用户基于默认值误操作。

15-2 [测试盲区] 当前专项覆盖面有限

  • .tmp/agents-settings-YLCzhi/report.json PASS,当前实际验证了布局、三枚图标、下拉持久化、重开恢复、禁用标注和深浅主题。
  • 没有验证下拉的 Escape、外部点击关闭、键盘选择、加载态、重复快速更新和 IPC 失败后的最终值。
  • teamManagement 只在设置页持久化,代码库中没有消费者;这符合“子代理调度先不管”的明确排除条件,不列 Bug。
  • 经济模式只还原开关外观,浏览器扩展按钮只是禁用的本地入口。前者属于功能未接;后者涉及外跳/安装服务,按当前约束不列 Bug,但都不能计入完整 1:1 功能验收。

16. 移除助理与设备连接

16-1 [当前范围通过]

  • SettingsDialog.tsx:29 的移除列表包含 claw、deviceConnections、dataManagement、buddyApps。
  • SettingsDialog.tsx:32 依据该列表生成 12 项可见导航。
  • SettingsDialog.tsx:35 对旧深链接统一回退到模型页。
  • SourceSettingsNavigation.tsx:17 的搜索结果先按 visibleTabs 过滤,因此移除项不会通过搜索重新出现。

本轮 settings-nav 实际产品状态符合要求:助理、设备连接、数据管理、应用管理均不在 DOM、标签或搜索结果中;旧深链接 claw、dataManagement 正确回退。布局差异仅是移除条数后导航不再溢出,条目宽度从原版溢出态的 190px 变为当前内容宽 200px;现有 CSS 没有人为补滚动条槽位,符合已有证据。

16-2 [P2 验收脚本维护缺陷] verify-settings-nav 仍把 memory 当“暂未接入”

当前 .tmp/settings-nav-grP9jC/report.json 为 19 项检查、3 项失败。失败项全部来自旧期望:

  • scripts/verify-settings-nav.cjs:128 构造 expectedDisabled 时仍包含 memory。
  • 脚本期望启用项时仍排除 memory;实际产品已启用并渲染 MemorySettingsPanel。
  • 实际导航为 9 个启用项:settings、appearance、keyboardShortcuts、personalization、memory、extensions、models、helpFeedback、getHelp;未接入项只剩 account、subscriptionUsage、securityCenter。

结论:这是脚本断言陈旧,不是 16/17 产品或 14 记忆页回归。更新专项时应把 memory 从 disabled 期望移到 enabled 期望。

17. 移除数据管理与应用管理

17-1 [当前范围通过]

16 与 17 共用同一份移除列表、深链接归一化、搜索过滤和真实窗口回归。没有发现数据管理或应用管理残留入口;没有删除本地会话、安装内容或其他用户数据。

17-2 [证据缺口]

verify-settings-nav 对旧深链接实际执行了 claw 和新窗口 dataManagement,对 deviceConnections、buddyApps 只通过同一个 REMOVED_SETTINGS_TABS.includes() 分支静态覆盖。实现本身没有分叉,风险低;若要把四个入口逐项纳入验收,可补两个启动参数场景。

19. 关于与获取帮助

19-1 [当前范围通过]

.tmp/about-help-settings-WFvFHM/report.json PASS。当前实现满足:

  • 两页 638×620 内容区、顶部卡片、按钮、二维码占位和页脚主几何通过。
  • 版本来自真实 window.ycode.app.info().version。
  • 页面没有 <a href>,所有会跳向 WorkBuddy 的入口均被禁用并说明未配置。
  • 深浅主题 token 已在关于页直接验证。

19-2 [非本轮 Bug,功能未接] “检查更新”只保留禁用外观

AboutHelpSettingsPanel.tsx:69 没有接更新通道,原版独立软件更新窗口也未复刻。用户本轮要求不复刻外跳链接,并明确排除外部服务;因此不列生产 Bug。若未来需要完整功能 1:1,需要单独接入 YCode 的更新源、版本检查、下载/重启状态和错误恢复。

19-3 [测试盲区]

  • 当前专项仅直接测了“关于”深色;“获取帮助”深色由其共享样式推导,未单独断言。
  • 专项读取了 aria-disabled 和标题,但没有真实点击并断言窗口 URL、窗口数量、设置页状态均不变。
  • “检查更新”原版独立窗口只有“已是最新版”的 REA 观察,没有完整更新流程证据。

21. 对话框 Git 分支与会话上下文信息

21-1 [P2 文档验收缺陷] checklist 已勾选“完成”,但同一段明确写明关键状态未采集

docs/复刻待办清单-2026-10-17.md:616 勾选了“核对 detached HEAD、无首次提交、非仓库、检测失败”,同文件 :632 和 :657 又明确说原版这些状态未覆盖。:619 勾选了“浅色/深色及窄窗口布局”,:655-656 又说明五类占比、窗口控件和紧凑分支未实现。当前完成标记高于实际证据,不能作为 1:1 验收依据。

21-2 [实现限制/原版证据待补] detached HEAD 短 SHA 在数据层已算出,UI 层采用保守隐藏

  • src/main/git.ts:51 在 detached HEAD 时执行 rev-parse --short HEAD,并在 :52 返回 head。
  • scripts/verify-git-branch.cjs:78 只验证了这个后端返回值。
  • ComposerContextInfo.tsx:62 只保留 info.branch。
  • ComposerContextInfo.tsx:63 在 branch 为空时直接返回 null,完全没有使用 info.head。

结果:真实 Git 检测通过,但界面在 detached HEAD 下不展示短 SHA。源码注释和 TODO 已明确这是原版状态未采集时的保守策略,因此不能认定为生产业务 Bug。可以确定的问题是:head 回退目前未被 UI 使用,属于实现限制;要实现原版等价,仍需 REA 补 detached HEAD 的运行时表现。

21-3 [P2 功能缺口] 非 OMP 的 Chat Completions 回退未解析上游 usage

src/main/gateway/index.ts:120 到 :159 只解析文本、reasoning、工具调用和 finish reason,从未读取 SSE payload 中的 usage。因此 OpenAI 兼容 /chat/completions 即使返回:

{"usage":{"prompt_tokens":128,"completion_tokens":2,"total_tokens":130}}

也不会产生 GatewayDelta { type: "usage" },用量环保持“无法获取”。

独立纯测试实际输出:

[{"type":"text","text":"ok"},{"type":"finish","reason":"stop"}]

现有 .tmp/composer-context-Jbp2ol/failure.json 在失败前 41/41 检查通过,但它走的是真实 OMP;OMP 自己从助手消息读取 usage,不能证明备用网关已解析。TODO :658 虽记录了 Chat Completions 缺口,但 checklist :619 仍被勾选,且当前专项没有网关回退用例。

21-4 [P2 准确性风险] 切换模型后未绑定 token 样本来源,可能沿用旧样本并换用新模型分母

  • src/renderer/src/stores/chat.ts:41 的 sessionUsage 只按 sessionId 存储。
  • chat.ts:421 收到 usage 后只写 sessionUsage[sessionId]。
  • chat.ts:164 到 :169 切换现有会话模型时没有清除或标记旧用量。
  • ChatPane.tsx:208 立即用新模型的 maxInputTokens 作为分母。

静态触发路径:模型 A(64K 窗口)跑一轮得到 12,800 tokens,切换到模型 B(128K 窗口),不发送新消息。按当前状态关联可推导界面会把 A 的 12,800 除以 B 的 128K,显示 10%,而不是保留 A 的 20%,也不是显示“新模型尚无真实用量”。

边界:本轮没有真实 UI 复现该切换时序,也不能仅凭现有 REA 证据断言原版在相同情况下采用何种状态。当前只能确定为 P2“用量样本未绑定模型/窗口”的准确性风险,需补真实 UI 用例和原版对照后才能判断是否存在行为差异。

21-5 [P2 功能/验收缺口] 重启后已有会话没有真实 usage 可恢复

sessionUsage 仅是 renderer 内存状态,初始值在 chat.ts:126 为空对象,代码库没有将它写入 sessions.json 或在打开会话时恢复。应用重启后,历史消息仍在,但下一次 usage 事件前无法展示上一轮真实用量。

现有验收没有重启应用或重新载入会话。若原版也要求新回合才能显示,此处属于证据缺口;若“已有会话”验收要求保留真实 context 信息,则这是实际功能缺口。

21-6 [P2 功能未接] 五类上下文占比固定为“—”

ComposerContextInfo.tsx:172 到 :177 渲染五个分类,但每项 value 都是固定字符串 —。TODO :655 明确承认分类统计无法获得。圆环总用量可以是真实的,但浮层的系统提示词、工具及子智能体、对话消息、MCP、技能拆分并没有实现,不能将整个浮层计为 1:1 数据完成。

21-7 [P2 功能未接] __window-control 只有 CSS,没有 JSX

src/renderer/src/workbuddy/composer/context-info/source.css:330 保留了 .cr-context-usage-popover__window-control 样式,但 ComposerContextInfo.tsx:149 的浮层内容没有该节点。原版内容也未采集,因此目前缺少一整块可能的上下文窗口控制/说明界面。

21-8 [P2 功能未接] 紧凑分支标签没有触发条件

source.css:48 定义了 ._branchLabelCompact_jdvlk_274 的 32px 紧凑形态,ComposerContextInfo.tsx:65 始终只输出正式类名,没有根据宽度、容器空间或窗口状态添加 compact 类。窄窗口下不会进入原版紧凑形态;原版触发阈值仍是证据缺口。

21-9 [P2 布局风险/待验收] 浮层使用固定上方右对齐,未见 collision flip/shift

source.css:144 到 :157 把 280px 浮层固定为 bottom: calc(100% + 8px); right: 0。TODO :654 说明原版由 floating-ui 定位,YCode 没有逐像素核对。

风险:矮窗口、窄窗口、窗口边缘或输入区上方空间不足时,固定浮层存在越出窗口的可能。当前只通过静态 CSS 确认没有 flip/shift 处理,尚未真实复现裁切,因此不算已确认越界。当前专项只在 1336×902 的正常位置测量,没有覆盖边界翻转和横向平移。

21-10 [P2 测试盲区] 分支刷新时机和关键 Git 状态没有 UI 验收

ComposerContextInfo.tsx:27、:47、:48 使用 20 秒轮询和 window focus 刷新,原版刷新时机未采集。测试只验证初始分支,没有:

  • 在外部/同一窗口终端执行 checkout 后,观察标签是否在预期时间内刷新;
  • 切换两个不同 cwd 的会话,确认没有旧请求串线;
  • 覆盖 detached HEAD、无提交仓库、非 Git 目录、git 缺失或超时的 UI 行为;
  • 新建任务从无 sessionId 到首条消息创建会话后的标签出现时机。

后端 .tmp/audit19-20261017-165014/verify-git-branch.log 当前 6/6 PASS;它验证的是 readGitBranch,不能替代上面的 UI 验收。

21-11 [P2 验收脚本维护缺陷] verify-composer-context-info 等待已不存在的 .segmented

当前专题在 .tmp/composer-context-Jbp2ol/failure.json 中保存了失败前 41 项检查,41 项全部 PASS,随后在 phase: dark-theme-via-native-settings 超时:

Timeout: appearance panel
scripts/verify-composer-context-info.cjs:330

原因:

  • 脚本 :330 等待 .segmented。
  • 脚本 :331、:346 仍点击 .segmented__item。
  • 当前 AppearanceSettingsPanel.tsx:47-53 使用 .appearance-card-grid 和带 aria-label="深色"/"浅色" 的 .appearance-card。
  • 其他新脚本 verify-appearance-settings.cjs 与 verify-desktop-appearance.cjs 已使用当前主题卡选择器。

结论:这是验收脚本维护缺陷,不是 21 的产品回归。失败前已真实覆盖分支标签、复制、32×32 用量环、真实 OMP usage、tooltip、浮层、五类占位和浅色状态;未完成当前构建的深色段。历史 .tmp/composer-context-lEIWRF/report.json 曾完成 47 项并 PASS,但不能代替本轮构建完成深色复跑。

21-12 [测试盲区] 当前专项未覆盖模型切换、重启和回退网关

现有通过路径是“单个 Git 仓库 + 单个会话 + 真实 OMP + Chat Completions 形态的受控上游”。它没有覆盖:

  • OMP 不可用后的自建网关;
  • Responses 协议回退;
  • 切模型后 usage 与分母的配对;
  • 应用重启后的历史 usage;
  • 五类真实占比;
  • 窗口控件;
  • 紧凑分支;
  • 矮/窄窗口浮层定位;
  • 外部 branch change;
  • detached/unborn/non-Git UI。

因此“真实 OMP 主路径 PASS”不能推导出 21 已全量 1:1。

本轮专项验收结果

逐项 checks 与 report 路径汇总:.tmp/audit19-20261017-165014/summary.json
运行顺序与退出码汇总:.tmp/audit19-20261017-165014/results.json

脚本 结果 说明
verify-memory-settings PASS .tmp/memory-settings-poBX32;没有覆盖 14-1 的默认值副作用。
verify-agents-settings PASS .tmp/agents-settings-YLCzhi;当前范围主链路通过。
verify-settings-nav FAIL:3 个旧断言 .tmp/settings-nav-grP9jC/report.json;实际移除入口与回退均通过,memory 旧期望错误。
verify-about-help-settings PASS .tmp/about-help-settings-WFvFHM。
verify-git-branch PASS 6/6;只测后端 Git 检测。
verify-composer-context-info 未完成当前构建深色段 前 41/41 checks PASS;旧 .segmented 选择器超时,不是业务回归。

全量运行结果为 19 个脚本中 17 通过、2 失败;两个失败均已定位为验收脚本维护缺陷,没有因此误报生产功能坏。

本轮可直接确认的检查数:

  • verify-memory-settings:24/24 PASS,但没有覆盖“只切换对话记忆时不得修改本地记忆偏好”的事务副作用。
  • verify-agents-settings:17/17 PASS。
  • verify-about-help-settings:15/15 PASS。
  • verify-git-branch:6/6 PASS,仅覆盖主进程 Git 检测。
  • verify-settings-nav:16/19 PASS;其余 3 项是 memory 支持状态更新后的旧预期,16/17 的移除、搜索和深链接回退检查均通过。
  • verify-composer-context-info:当前构建在失败前 41/41 PASS;深色主题段因旧选择器未执行,不能写成当前构建 47/47 完成。

分类汇总:

  • 已确认且本轮发生:14-1 偏好误写;Chat Completions 回退不解析 usage。
  • 静态可证、尚需真实 UI 复现:切模型后的 token/分母来源未绑定。
  • 保守实现或原版证据待补:detached HEAD、无提交、非 Git、检测失败的展示。
  • 已知功能未接:五类占比、窗口控件、紧凑分支。
  • 仅静态布局风险:浮层 collision flip/shift。
  • 验收脚本维护缺陷:memory 旧期望和 .segmented 旧选择器。

建议的后续验收用例

  1. 记忆默认值事务:空配置、只更新 conversationMemory、只更新 localMemorySkills、慢 IPC 首帧。
  2. 智能体加载态:已存 teamManagement=false 时延迟 get,首帧不得显示“开启”;下拉补 Escape、外部点击、键盘和失败恢复。
  3. 导航脚本更新:把 memory 加入 enabled 期望,从 disabled 与“暂未接入”计数中移除。
  4. 关于/帮助:补获取帮助深色页;真实点击所有禁用动作,断言无新窗口、URL 不变、无 IPC 调用。
  5. Chat Completions usage:强制 OMP 不可用,由备用网关返回带 usage 的 SSE,断言渲染环更新。
  6. Model switch:模型 A 产生真实 usage 后切到不同窗口大小的模型 B,断言旧样本失效或明确绑定原始模型。
  7. Existing session restart:保存真实 usage 后重启,断言原版要求的显示状态;若不能恢复,必须显示“暂无本模型用量”。
  8. Git UI states:detached、unborn、non-Git、git unavailable 分别截图并断言文案/显示。
  9. Git refresh:运行中外部 checkout,记录标签更新延迟和旧会话隔离。
  10. Responsive context UI:至少 1336×902、900×680、窄窗口和矮窗口,覆盖 compact 分支、浮层 flip/shift、tooltip 边界。
  11. 上下文浮层:补 window-control 与五类真实占比的原版证据和实现,不能继续用固定 — 计完成。
  12. 更新专项选择器:将 .segmented / .segmented__item 改为 .appearance-card[aria-label="深色"] / .appearance-card[aria-label="浅色"],再复跑当前构建 47 项。

验证与限制

  • 本轮未启动 Electron;全部 UI 专项由主 agent 串行执行。
  • 已独立运行 node scripts/verify-git-branch.cjs,6/6 PASS。
  • 已独立构建并执行 src/shared/memory.ts 的纯函数审计,复现 14-1。
  • 已独立构建 src/main/gateway/index.ts 并用带 usage 的 Chat Completions SSE 调用,确认 usage 未进入输出事件。
  • 未重新观察 WorkBuddy。当前端口 9223 endpoint_unreachable 只代表该已知入口不可达,不代表 REA 全部不可用;需要的新证据已在第 21 段逐项列出。
  • 工作树原有 dirty 修改全部保留;本轮只新增本文档。