Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0193vBv6w5MV2cifdTUu9H5P
5.9 KiB
5.9 KiB
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(openRectificationCaseL360–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. 根因
- 打开 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 全部命中。 - 这个错误码没有映射。
KNOWN_RPC_ERROR_CODES里有skill_identity_missing / legacy_unverifiable / already_verified / invalid / name_mismatch,唯独没有skill_identity_mismatch,落到兜底500 校正服务暂时不可用;客户端openRectificationCase再兜底成"暂时无法打开生时校正"。 - 错误只画在首页起始卡下方。
rectificationErrorMessage只由starter-home.tsx渲染;用户从历史列表点击时视线在侧栏,selectSession又故意不切换会话(BUG-599 之后等 Case 打开成功才切),于是表现为"点了没反应"。 - 设计本意不是这样:08-14 的不可变注册表让 Case 钉住自己那一版,
versions/目录保留每一版快照,agent 轮次按 Case 绑定版本resolveExactSkillPackage(bound)运行(agent-run.tsL306–336;agent 路由 L241 也从 Case 视图取版本)。只有 open 这一处错误地要求"等于当前版本"。
3. 决策记录
- 按会话打开时,用 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仍用当前注册版本。 - 映射错误码。
agentic_rectification_skill_identity_mismatch→409 skill_identity_mismatch,文案"该校正绑定了另一版校正规则,正在按那一版打开"不需要——修完决策 1 后它不应再出现;映射只为不再露 500,文案"该校正绑定的规则版本与当前不一致,请刷新后重试"。 - 错误就地显示。 从历史列表打开失败时,错误显示在被点击的会话行下方(一行,同
composer-notice样式),并且首页起始卡不再重复显示同一条;成功打开则清除。 - 已结束 / 已采用的旧 Case 仍按现有
disposition === "readonly"与isTerminalRectificationStatus只读打开;不改采用门、确认门。
4. 任务分解
- 4.1 决策 1:
case-service.ts两步打开 + 注册表核验;测试——mock 会话绑定 10.0.17(快照存在)→ v2 收到 10.0.17 的身份,打开成功;绑定版本在注册表不存在 →skill_identity_missing;homepageintent 仍传当前版本。三栏:原值"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.mdBUG-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. 开工前置命令
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)"