diff --git a/docs/tasks/README.md b/docs/tasks/README.md index de54f755..b6c6621d 100644 --- a/docs/tasks/README.md +++ b/docs/tasks/README.md @@ -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-604~606,Skill 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-612~613);走查 `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-614~615) | +| `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) | ### 聊天主链路与首页 diff --git a/docs/tasks/TASK-rectification-history-open-20260909.md b/docs/tasks/TASK-rectification-history-open-20260909.md new file mode 100644 index 00000000..a1fa1579 --- /dev/null +++ b/docs/tasks/TASK-rectification-history-open-20260909.md @@ -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` 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)" +```