Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0193vBv6w5MV2cifdTUu9H5P
68 lines
6.8 KiB
Markdown
68 lines
6.8 KiB
Markdown
# 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` L360–392、`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.19(BUG-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` L306–336;agent 路由 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)"
|
||
```
|
||
|
||
## 验收(Claude,2026-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`)。
|