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

318 lines
23 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.
# 验收问题收集:记忆、智能体、导航、关于、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 数据损坏判断。
独立复核结果:
```json
{"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` 即使返回:
```json
{"usage":{"prompt_tokens":128,"completion_tokens":2,"total_tokens":130}}
```
也不会产生 `GatewayDelta { type: "usage" }`,用量环保持“无法获取”。
独立纯测试实际输出:
```json
[{"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` 超时:
```text
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 修改全部保留;本轮只新增本文档。