Files
Jyotisha/docs/tasks/TASK-rectification-history-open-20260909.md
T

68 lines
6.8 KiB
Markdown
Raw 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.
# TASK · 历史生时校正打不开:打开 RPC 把 Case 绑定的 Skill 版本与当前注册版本做相等比较,每次 bump 后所有旧 Case 都被拒(2026-09-09
- 基线:`origin/staging` @ `af70ae77`
- 分支:`codex/rectification-history-open-20260909`,基于 `origin/staging`
- 执行方:coding agent;验收:Claude
- 涉及文件:`frontend/src/lib/rectification-agentic/v9/case-service.ts``openRectificationCase` L360392、`KNOWN_RPC_ERROR_CODES`)、`frontend/src/hooks/use-rectification-surface.ts`(错误呈现)、`frontend/src/hooks/use-session-management.ts::selectSession``frontend/src/components/session-list*.tsx` 或侧栏组件(错误就地显示)、`frontend/tests/rectification-*open*.test.ts` / `skill-registry*.test.ts`
- BUG 编号起点:**BUG-621**`docs/BUG_HISTORY.md` 当前最大 BUG-620
- 优先级:**P1**(历史对话里所有旧校正都点不开,且没有可见错误)
## 1. 事故实证(2026-09-09 用户截图;只写结构)
历史对话列出三条生时校正(9 月 9 日两条、9 月 3 日一条),点任何一条都打不开。
## 2. 根因
1. **打开 RPC 的身份相等检查。** `case-service.ts::openRectificationCase` 对所有 intent(含 `session`)都把**当前注册版本** `resolveActiveSkillPackage()`(现在是 10.0.19)作为 `p_skill_*` 传给 `open_agentic_rectification_case_v2`;该 RPC`20260814010000_immutable_skill_registry.sql`)在取到 Case 后做 `v_case.skill_name / skill_version / skill_sha256 / skill_source_commit is distinct from p_skill_*` 的相等比较,任何一项不同就 `raise 'agentic_rectification_skill_identity_mismatch'`。生时校正 Skill 两天内从 10.0.15 升到 10.0.19BUG-583/593/595/597/604 各 bump 一次),所以 9 月 3 日(10.0.1x)和 9 月 9 日白天(10.0.17 / 10.0.18)建的 Case 全部命中。
2. **这个错误码没有映射。** `KNOWN_RPC_ERROR_CODES` 里有 `skill_identity_missing / legacy_unverifiable / already_verified / invalid / name_mismatch`,唯独没有 `skill_identity_mismatch`,落到兜底 `500 校正服务暂时不可用`;客户端 `openRectificationCase` 再兜底成"暂时无法打开生时校正"。
3. **错误只画在首页起始卡下方。** `rectificationErrorMessage` 只由 `starter-home.tsx` 渲染;用户从历史列表点击时视线在侧栏,`selectSession` 又故意不切换会话(BUG-599 之后等 Case 打开成功才切),于是表现为"点了没反应"。
4. 设计本意不是这样:08-14 的不可变注册表让 Case **钉住自己那一版**`versions/` 目录保留每一版快照,agent 轮次按 Case 绑定版本 `resolveExactSkillPackage(bound)` 运行(`agent-run.ts` L306336agent 路由 L241 也从 Case 视图取版本)。只有 open 这一处错误地要求"等于当前版本"。
## 3. 决策记录
1. **按会话打开时,用 Case 自己绑定的身份调 RPC,不再要求等于当前版本。** 不改数据库(本轮无 Docker,不动迁移):`openRectificationCase``intent === "session"` 时先调 `open_agentic_rectification_case`(v1,只按会话解析 Case、不做身份比较)拿 `case_id`,再调 `get_agentic_rectification_skill_identity` 读绑定身份,用 `resolveExactSkillPackage(name, version, sha256)` 在注册表核验(版本快照存在且 sha 一致),核验通过就把**绑定身份**作为 `p_skill_*` 调 v2;核验失败走既有 `skill_identity_missing` / legacy 采用流程(`adopt-skill` 路由不动)。`homepage` / `new` 仍用当前注册版本。
2. **映射错误码。** `agentic_rectification_skill_identity_mismatch``409 skill_identity_mismatch`,文案"该校正绑定了另一版校正规则,正在按那一版打开"不需要——修完决策 1 后它不应再出现;映射只为不再露 500,文案"该校正绑定的规则版本与当前不一致,请刷新后重试"。
3. **错误就地显示。** 从历史列表打开失败时,错误显示在被点击的会话行下方(一行,同 `composer-notice` 样式),并且首页起始卡不再重复显示同一条;成功打开则清除。
4. 已结束 / 已采用的旧 Case 仍按现有 `disposition === "readonly"``isTerminalRectificationStatus` 只读打开;不改采用门、确认门。
## 4. 任务分解
- 4.1 决策 1`case-service.ts` 两步打开 + 注册表核验;测试——mock 会话绑定 10.0.17(快照存在)→ v2 收到 10.0.17 的身份,打开成功;绑定版本在注册表不存在 → `skill_identity_missing``homepage` intent 仍传当前版本。三栏:原值"session 用当前版本"→ 新值"session 用绑定版本"→ 决策 1。
- 4.2 决策 2:错误表加一行;`rectification-case-service*.test.ts` 锁映射。
- 4.3 决策 3:侧栏行内错误;`session-list` 合同测试;`rectification-surface-contract.test.ts` 三栏。
- 4.4 记录:`docs/BUG_HISTORY.md` BUG-621(关联 08-14 注册表记录与 BUG-599:599 让点击不再先切换会话,把这个失败变成了"没反应");`CHANGELOG.md``PROGRESS-…``docs/testing/` 加"升 Skill 版本后,历史校正必须仍能从历史对话打开,且以其绑定版本运行"。**Docker DB 套件本机跑不了,记环境缺口**;不新增迁移所以不触发 `test:db` 硬要求。
## 5. 让步顺序
4.1、4.2 当天必做并部署;4.3 必做;4.4 不可省。
## 6. 开工前置命令
```bash
git fetch origin --prune
git worktree add -b codex/rectification-history-open-20260909 .worktrees/rectification-history-open-20260909 origin/staging
cd .worktrees/rectification-history-open-20260909
ln -s /workspace/Jyotisha/frontend/node_modules frontend/node_modules
cd frontend && ./node_modules/.bin/tsc --noEmit; npm run lint 2>&1 | tail -1
ls tests/rectification-*.test.ts tests/skill-registry*.test.ts tests/home-bootstrap*.test.ts | grep -v database | xargs npx tsx --test 2>&1 | grep -E "^# (tests|pass|fail)"
```
## 验收(Claude2026-09-09`origin/staging` @ `fef54b6e`staging 已部署同 SHA
| 门 | 结果 |
| --- | --- |
| tsc | 0 错 |
| lint | 0 error / 108 warning |
| 前端 rectification + consultation + session + home-bootstrap + public-thinking + voice + skill-registry(非 DB | 1400 / 0 |
| Python v5_services + event_probes + growth contract | 76 passed |
| 项 | 结论 |
| --- | --- |
| 决策 1 | 通过。session 打开 = v1 取 Case → 读绑定身份 → `resolveExactSkillPackage` 核验 → 用绑定身份调 v2;不在注册表 → `skill_identity_missing` |
| 决策 2 | 通过。`agentic_rectification_skill_identity_mismatch` → 409 |
| 决策 3 | 通过。错误绑在被点会话行下(`.session-open-error`),起始卡不重复 |
| 进度记录里"全仓 lint 4 error" | 当时是别处的既有错误,现头 `npm run lint` 0 error,已消 |
| 真实环境 | 欠:登录后从历史打开 9 月 3 日的 Case |
结论:通过(实现 `a31a5e24`)。