Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0193vBv6w5MV2cifdTUu9H5P
5.7 KiB
5.7 KiB
TASK · 生时校正修复单:交付轮验证报告引用推断前的引擎事实(宽度 29 分钟、双轨偏向已淘汰分钟、D10 星座算错)(2026-09-08)
- 基线:
origin/staging@f3a1a583(代码头7ca6ade2;本轮转录跑在这版,职业答完已自动出卡,BUG-590 真实环境通过) - 分支:
codex/rectification-delivery-report-facts-20260908,基于origin/staging;与codex/rectification-same-year-probe-dedupe-20260908(BUG-592)无文件重叠 - 执行方:coding agent;验收:Claude
- 涉及文件:
frontend/src/mastra/rectification-v9-tools.ts(L455–505 结果投影、buildSkillVerificationReport入参)、frontend/src/lib/rectification-agentic/v9/skill-verification-report.ts(或该函数所在文件)、skills/jyotish-birth-time-rectification/SKILL.md§9 L119 +references/candidate-comparison.md - BUG 编号起点:BUG-593
- 优先级:P2(出口已通,但交付轮正文三处事实与卡片矛盾,用户会怀疑结果)
1. 事故实证(2026-09-08 staging 7ca6ade2,只写结构)
交付卡:范围 04:51–04:53、排盘用 04:53、对照 8 件经历、分歧面板只剩月宿边界一行。同一轮模型正文的验证报告里:
| # | 正文写的 | 事实 |
|---|---|---|
| 1 | "当前是一段不可分区间(宽度 29 分钟)" | 卡片范围宽 3 分钟;29 来自引擎门 exact_confirmation.indistinguishable_width_minutes,是推断层之前的引擎候选跨度 |
| 2 | "主限更偏向 05:06、分盘大运更偏向 04:59,二者冲突" | 两个分钟都已被答题淘汰;dasha_agreement 由引擎在全部候选上算,不看推断层 |
| 3 | "若采用 04:53,D10 升狮子座" | window_scan 里 D10 在 05:00 才从巨蟹座换到狮子座,04:53 的 D10 上升是巨蟹座;模型自己从换升表推算,算错 |
2. 根因
rectification-v9-tools.ts L455–505 的结果投影把 candidates 换成推断层投影,但 indistinguishable_width_minutes: width、dasha_agreement: refinement.dasha_agreement 仍是引擎原值,且原样喂进 buildSkillVerificationReport({ widthMinutes: width, dashaAgreement })——服务端自己生成的报告模板就把 29 和 05:06/04:59 写给了模型。分盘上升没有按候选分钟给出现成的星座,Skill L119 要求"方法 2–3 D9/D10 类型对照",模型只能拿 window_scan.transitions 自己算,于是算错。
3. 决策记录
- 报告只用推断层事实。 有
inference_state时:widthMinutes=credible_range宽度(分钟数,含两端);dasha_agreement在 active 候选内重算 top(没有 active 候选或 top 相同则status="agree"/"n/a"),并保留引擎原值为dasha_agreement_pre_inference供审计,不进报告。indistinguishable_width_minutes投影字段保留但改名engine_indistinguishable_width_minutes,报告不用。 - 报告给出每个候选分钟的 D9 / D10 上升星座(
sign_by_candidate: {time: {d9, d10}}),由window_scan.transitions服务端算,与divergence-panel.ts复用同一分钟→星座函数。Skill L119 与references/candidate-comparison.md增一句:"分盘上升只抄skill_verification_report.sign_by_candidate,不得自行按换升时刻推算"。Skill bump 10.0.16(versions/ 快照、registry 同步)。 - 边界句"不是已确认的唯一出生分钟"保留;确认门不动。
4. 任务分解
- 4.1 决策 1:形状用例——推断层范围 04:51–04:53、引擎
indistinguishable_width_minutes=29、引擎双轨 top 均为已淘汰分钟 → 报告width_minutes === 3,dasha_agreement只含 active 候选,正文模板不出现 29 / 已淘汰分钟。 - 4.2 决策 2:D10 在 05:00 换升、候选 04:51/04:53 →
sign_by_candidate["04:53"].d10 === "巨蟹座";agent-voice-copy-contract/skill 合同锁新句;skill-registry.test.ts过 10.0.16。 - 4.3 记录:
docs/BUG_HISTORY.mdBUG-593(关联 BUG-545 单分钟念两遍、BUG-568 区间读盘);CHANGELOG.md(Skill 10.0.16);PROGRESS-…;docs/testing/rectification-scenarios-20260907.md加"交付轮正文的宽度、双轨、分盘星座必须与卡片一致"。
5. 让步顺序
4.1 必做;4.2 若 Skill bump 牵扯太广,可先做 sign_by_candidate 投影、Skill 句子后置为 P3,但要写进度记录;4.3 不可省。
6. 开工前置命令
git fetch origin --prune
git worktree add -b codex/rectification-delivery-report-facts-20260908 .worktrees/rectification-delivery-report-facts-20260908 origin/staging
cd .worktrees/rectification-delivery-report-facts-20260908
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/agent-voice-copy-contract.test.ts tests/skill-registry.test.ts | grep -v database | xargs npx tsx --test 2>&1 | grep -E "^# (tests|pass|fail)"
验收(Claude,2026-09-08,origin/staging @ 6a687085,staging 已部署同 SHA)
| 门 | 结果 |
|---|---|
| tsc | 0 错 |
| lint | 0 error / 103 warning |
| 前端 rectification + consultation + voice + skill-registry(非 DB) | 1270 / 0 |
| Python v5_services + event_probes + growth contract | 全绿 |
| 项 | 结论 |
|---|---|
| 4.1 决策 1 | 通过。真实 Case 报告"28 分钟不可分区间(04:47–05:14)"与卡片一致;双轨改为 active 过滤,未点名已淘汰分钟 |
| 4.2 决策 2 | 通过。sign_by_candidate 表进报告,真实 Case 04:53 D10 写巨蟹座;Skill 10.0.16 与 versions/ 字节一致 |
| 4.3 记录 | 通过 |
结论:通过。但同一 Case 暴露范围回弹(13→28 分钟),另立 TASK-rectification-new-minute-inherit-20260908.md(BUG-594)。