docs(tasks): history rectification open fix brief — bound skill identity on session open (BUG-621)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0193vBv6w5MV2cifdTUu9H5P
This commit is contained in:
Jesse_Chen
2026-09-09 11:03:58 +00:00
co-authored by Claude Fable 5.1
parent af70ae77a5
commit e8d46f12b1
2 changed files with 49 additions and 0 deletions
+1
View File
@@ -88,6 +88,7 @@
| `TASK-rectification-conversation-economy-20260909.md` | `PROGRESS-rectification-conversation-economy-20260909.md` | 对照竞品后产品拍板三条:开场三句讲做法 + 一次收多件(推翻 opening brief「不要一次说完/不举例」与 SKILL L52);采集题「没有 / 记不清」按钮(不做示例骨架条);每轮只留一句(方法句进活动记录、点选旁白去领先落后、证据轮正文一句复述 + 服务端裁剪);Skill 10.0.19 | 已验收通过(2 条 P3 备注) | `aa7ccb30` + `1453fb16`BUG-604606Skill 10.0.19 |
| `TASK-consultation-daily-empty-answer-20260909.md` | `PROGRESS-consultation-daily-empty-answer-20260909.md` | 首页「深入看今日」计算完成却 `empty_answer`:入口定的 `timing` 被模型改成 `general``canonicalDomainPlan` 以模型为准),分段写作标题与今日格式错位,分段 `maxSteps=1` 且工具仍可调 → 模型在分段里再调工具、零正文;思考流按 chunk 过滤漏出缺词英文 | 待验收 | `codex/consultation-daily-empty-answer-20260909`BUG-612613);走查 `docs/testing/consultation-daily-empty-answer-20260909.md` |
| `TASK-rectification-compare-card-polish-20260909.md` | `PROGRESS-rectification-compare-card-polish-20260909.md` | 三列卡两列经历对照 0、三列无未来窗:引擎按引擎前三算 by_time,卡片按推断前三查表,键不匹配(BUG-614);交付旁白被 BUG-606 裁成一句(BUG-615);设计减法:相同性格句只写一次、经历对照说人话、删小标题、右栏本命宫位改北印星盘、换升时刻默认折叠 | 待验收 | `codex/rectification-compare-card-polish-20260909`BUG-614615 |
| `TASK-rectification-history-open-20260909.md` | `PROGRESS-rectification-history-open-20260909.md` | 历史生时校正打不开:`open_agentic_rectification_case_v2` 把 Case 绑定 Skill 身份与当前注册版本做相等比较,两天内 10.0.15→10.0.19 五次 bump 让所有旧 Case 被拒;错误码未映射成 500;错误只画在首页卡下 → 表现为点了没反应。决策:session 打开用绑定身份(v1 取 Case → 读身份 → 注册表核验 → v2),不改迁移 | 待执行 | `codex/rectification-history-open-20260909`BUG-621 |
### 聊天主链路与首页
@@ -0,0 +1,48 @@
# 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)"
```