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

5.9 KiB
Raw Blame History

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.tsopenRectificationCase L360392、KNOWN_RPC_ERROR_CODES)、frontend/src/hooks/use-rectification-surface.ts(错误呈现)、frontend/src/hooks/use-session-management.ts::selectSessionfrontend/src/components/session-list*.tsx 或侧栏组件(错误就地显示)、frontend/tests/rectification-*open*.test.ts / skill-registry*.test.ts
  • BUG 编号起点:BUG-621docs/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;该 RPC20260814010000_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,不动迁移):openRectificationCaseintent === "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_mismatch409 skill_identity_mismatch,文案"该校正绑定了另一版校正规则,正在按那一版打开"不需要——修完决策 1 后它不应再出现;映射只为不再露 500,文案"该校正绑定的规则版本与当前不一致,请刷新后重试"。
  3. 错误就地显示。 从历史列表打开失败时,错误显示在被点击的会话行下方(一行,同 composer-notice 样式),并且首页起始卡不再重复显示同一条;成功打开则清除。
  4. 已结束 / 已采用的旧 Case 仍按现有 disposition === "readonly"isTerminalRectificationStatus 只读打开;不改采用门、确认门。

4. 任务分解

  • 4.1 决策 1case-service.ts 两步打开 + 注册表核验;测试——mock 会话绑定 10.0.17(快照存在)→ v2 收到 10.0.17 的身份,打开成功;绑定版本在注册表不存在 → skill_identity_missinghomepage 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.mdPROGRESS-…docs/testing/ 加"升 Skill 版本后,历史校正必须仍能从历史对话打开,且以其绑定版本运行"。Docker DB 套件本机跑不了,记环境缺口;不新增迁移所以不触发 test:db 硬要求。

5. 让步顺序

4.1、4.2 当天必做并部署;4.3 必做;4.4 不可省。

6. 开工前置命令

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)"