Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0193vBv6w5MV2cifdTUu9H5P
7.2 KiB
TASK · 校正能力补齐修复单:答后旁白比错范围、时段支持度按时段长度偏置(2026-09-07)
- 基线:
origin/staging@814c924e(含 BUG-565~568 与三份能力任务书的实现) - 分支:
codex/rectification-capability-fix-20260907 - 执行方:coding agent;验收:Claude
- 涉及文件:
frontend/src/lib/rectification-agentic/v9/answer-choice.ts、probe-explain.ts、frontend/tests/rectification-answer-choice.test.ts、scripts/rectification/api_service.py::block_scan、tests/test_rectification_v5_services.py、BLOCKED.md/docs/BLOCKED.md - BUG 编号起点:BUG-569(开工时
grep -o "^## BUG-5[0-9][0-9]" docs/BUG_HISTORY.md | tail -1复核) - 父任务书:
TASK-rectification-explain-layer-20260906.md、TASK-rectification-unknown-time-20260906.md(验收记录在各自末尾)
1. 事故实证
1.1 P1 · 答后旁白永远说「范围没变」(BUG-569)
answer-choice.ts L595–596 把 [previous.range_start, previous.range_end] 与 [applied.state.range_start, applied.state.range_end] 传给 composeChoiceNarration。InferenceState.range_start/range_end 是候选搜索窗口(build-state.ts L149 直接抄入参,答题从不改变);答题真正改变的是 credible_range(build-state.ts L159,unionStillValidRange)。结果:无论候选如何淘汰,用户每答一题都看到「范围没变」,而顶部只读范围已经在收窄。rectification-answer-choice.test.ts L1210–1231 直接给 composeChoiceNarration 喂了两个不同范围,所以没拦住。
1.2 P1 · 时段支持度按时段长度偏置(BUG-570)
api_service.py::block_scan 对五个时段分别 sum(score)。10 分钟步长下段内候选数:清晨 24、上午 24、下午 36、傍晚 30、夜里 30。引擎原始分底座 11~15、事件差只有 4~5(BUG-560),所以在没有任何证据差异时下午段已占 25.0%、清晨只有 16.7%;第一张时段卡实际在比时段长度。
1.3 P2 · 文案
probe-explain.ts 的 TRACK_LABEL 把两条大运写成「毗湿奴多利、那罗延」。产品其他位置(rectification-varga-sentence.ts「本轮对照了 Vimshottari、Narayana…」、Skill 报告)一律用 Vimshottari / Narayana。
1.4 P3 · BLOCKED 位置
BLK-001 写进了新建的 docs/BLOCKED.md;AGENTS.md §4 约定被环境挡住的事项写根目录 BLOCKED.md(已有 85 行)。两处并存会漂。
2. 决策记录
- 旁白比的是
credible_range(前:previous.credible_range;后:applied.state.credible_range),二者任一为空时不说范围句。 - 时段支持度 = 段内候选均值减去全日最低分后归一(
max(mean_block − min_day, 0)),全部为零时均分。这是对 BUG-560「不得换尺度」的例外:BUG-560 说的是分钟级 prior,时段级比较本来就是任务书 C 授权的新口径,且不进采用门。 TRACK_LABEL改 Vimshottari / Narayana,与rectification-varga-sentence.ts同源(直接复用其映射表,不再维护第二份)。docs/BLOCKED.md的 BLK-001 搬回根目录BLOCKED.md末尾,删除docs/BLOCKED.md。
3. 硬红线
- 不改
minute_step=1路径的任何字节(test_rectification_v5_services.py指纹用例继续通过)。 - 不动采用门、确认门、
MIN_SEPARATION_LEAD、_relative_support(分钟级 prior 仍是 proportional,BUG-560 保持 blocked)。 - 既有断言改动写三栏;测试总数 ≥ 1518(本次验收实测口径:
rectification-*+consultation-*+report-*+personal-report-*+ voice 契约,排除 database)。
4. 任务分解
4.1 BUG-569
applyRectificationChoice改传credible_range;composeChoiceNarration入参改名credibleBefore/credibleAfter防止再传错。- 验收:
rectification-answer-choice.test.ts新增端到端用例——构造previousstate(range_start/range_end固定,credible_range宽)与答 A 后credible_range收窄,断言旁白含「范围从 X 收到 Y」;再一例credible_range不变 → 「范围没变」;三栏说明改掉 L1210–1231 的直喂用例或保留为纯函数用例。
4.2 BUG-570
block_scan:raw_support = max(mean(score in block) − min(all scores), 0);candidate_count已在返回里,保留。- 验收:
test_rectification_v5_services.py新增——用row_provider或直接构造等分candidate_scores(144 行同分)→ 五段relative_support各 20.0;只把清晨段抬高 → 清晨最高且下午不再因长度领先。
4.3 P2 / P3
TRACK_LABEL复用rectification-varga-sentence.ts的标签表;agent-voice-copy-contract增加「不得出现 毗湿奴多利 / 那罗延」守卫。- BLK-001 搬回根目录
BLOCKED.md,删docs/BLOCKED.md;docs/tasks/PROGRESS-rectification-convergence-exit-fix-20260906.md的引用改路径。
4.4 记录
docs/BUG_HISTORY.mdBUG-569、BUG-570;CHANGELOG.md;docs/tasks/PROGRESS-rectification-capability-fix-20260907.md;docs/testing/rectification-explain-layer-20260906.md第 2 条改为「答完一题旁白里的范围与顶部范围一致」。
5. 让步顺序
4.1 + 4.2 不可拆;4.3 可后置到同分支第二次提交;4.4 不可省。
6. 开工前置命令
git fetch origin --prune
git worktree add -b codex/rectification-capability-fix-20260907 .worktrees/rectification-capability-fix-20260907 origin/staging
cd .worktrees/rectification-capability-fix-20260907
ln -s /workspace/Jyotisha/frontend/node_modules frontend/node_modules
ln -s /workspace/Jyotisha/.venv .venv
.venv/bin/python -m pytest tests/test_rectification_v5_services.py -q
cd frontend && ls tests/rectification-*.test.ts tests/consultation-*.test.ts tests/report-*.test.ts tests/personal-report-*.test.ts tests/agent-voice-copy-contract.test.ts | grep -v database | xargs npx tsx --test 2>&1 | grep -E "^# (tests|pass|fail)"
验收(Claude,2026-09-07,origin/staging @ 0a1076d6,实现 517df002)
| 门 | 结果 |
|---|---|
| tsc / lint | 0 错 / 0 error |
| 前端 rectification + consultation + report + personal-report + voice(非 DB) | 1521 / 0 |
| Python v5_services / event_probes / engine_convergence / growth contract / flexible engine | 全绿 |
block_scan 虚构 7 件事全日 10 分钟步长 |
5.9 s;五段支持 12.3 / 22.6 / 18.5 / 28.3 / 18.3,36 候选的下午段不再因长度领先 |
| 项 | 结论 |
|---|---|
| 4.1 BUG-569 | 通过。旁白比 previous.credible_range / applied.state.credible_range,端到端用例走 applyRectificationChoice,源扫描锁定不再传 range_start |
| 4.2 BUG-570 | 通过。段内均值减全日最低分;等分网格 20×5 用例 + 清晨抬高用例 |
| 4.3 P2/P3 | 通过。大运标签复用 publicRectificationMethodLabel;BLK-001 回根目录 BLOCKED.md,docs/BLOCKED.md 已删 |
| 4.4 记录 | 通过 |
| 新 P2 | test_block_scan_seven_events_finishes_within_fifteen_seconds 是壁钟断言,执行方自己记录整文件连跑时 16~35 s;进 Gitea 门禁的 Python 段可能间歇红。建议改为只断言候选数与结构、耗时改成打印,或用环境变量放宽 |