517df002b5
Choice copy was comparing the search window, so every answer said the range had not changed. Block-scan summed raw scores, so longer afternoon windows won before any evidence difference. Co-authored-by: Cursor <cursoragent@cursor.com>
3.3 KiB
3.3 KiB
PROGRESS · 生时校正穷尽出口修复(2026-09-06)
工作树:.worktrees/rectification-convergence-exit-fix-20260906
分支:codex/rectification-convergence-exit-fix-20260906(跟踪 origin/staging)
基线:origin/staging @ b938c76a;工作树文档头 43a26a3c
未改 SKILL.md(仍 10.0.14)、未改引擎、未改任何门槛数值。未重新引入 USER_COLLECT_QUESTION.other 兜底。未把 .venv 加入提交。
本单状态:待验收。BUG-565 / 566 / 567 已实现;BUG-560 保持 blocked 并补根因升级。
| 任务 | 状态 | BUG |
|---|---|---|
| 5.1 单一写入方 | 完成 | BUG-565 |
| 5.2 穷尽态视为已交付 | 完成 | BUG-565 |
| 5.3 穷尽分支不吞题 | 完成 | BUG-566 |
| 5.4 范围小字还原 + 记录 | 完成 | BUG-567;BUG-560 根因升级;BLOCKED.md BLK-001 |
实现要点
persistExhaustionCollect门槛分支不再persistV9DeterministicTurn,只返回{ hostNarration, terminalNote: true, persisted: false }。- 共用
isExhaustedGateState({ remainingCollect, methods, canAdopt, accepted })。inspectNonTerminalTurnExit.satisfied认穷尽态。 - idle 穷尽分支额外要求
nextAction ∈ {offer_provisional_range, complete_with_range, ask_fact_collection}。ask_candidate_discriminator/ask_holdout_validation即使!followup也不落入门槛,落到persistNextInterviewAfterChoice。 finalizeSuccessfulTurnExit:terminalNote且本回合尚未写门槛时写一次(幂等requestId),并跳过ensureNonTerminalTurnExit。agent-run opening/evidence 先写并把askedTurnId传给 finalize。completedMessageResponse带上x-rectification-turn-id。- 点选:
persistApplied在EXHAUSTION_DELIVERY_ACTIONS时仍走persistNextInterviewAfterChoice,把门槛句拼进该回合正文。shouldContinueAfterStructuredChoice对 offer/complete 仍为 false(UI 不等下一问)。 RectificationReadonlyRange回到<p role="status">。口述停止按钮保留。
既有断言改动
| 文件 | 原值 | 新值 | 原因 |
|---|---|---|---|
rectification-exhaustion-exit 源扫描 |
口述停止按钮和范围小字共用 CHOICE_STOP_LABEL / onStop |
仅口述态 .rectification-collect-stop 使用该文案;范围行是 status 句,没有 onStop / <button |
BUG-567 |
| BUG-558 三个形状用例 | 未改断言 | 仍通过;关闭天花板夹具去掉 holdout 事件,避免白名单后 idle 去问 holdout | 白名单后 A4 用例 2 才仍是门槛 |
测试
| 命令 | 结果 |
|---|---|
非 DB tests/rectification-*.test.ts + agent-voice-copy-contract.test.ts |
910 pass / 0 fail(解释层叠上后 917) |
npx tsc --noEmit |
0 错 |
npm run lint |
0 error / 81 warning(既有 warning,未清) |
.venv/bin/python -m pytest tests/test_active_rectification_api.py::test_long_real_conversation_reaches_vedastro_after_local_range_is_narrow |
失败:winning_segment 04:16 / 宽 1 vs 期望 05:07–05:08 / 宽 2。基线 e2f4b55c 同样失败。见 BLOCKED.md BLK-001。 |
排除 rectification-*-database.test.ts。ERR-011:验收命令用 .venv/bin/python -m pytest。未改 page.tsx。
随本分支推 origin/staging。后续 explain-layer / range-reading / unknown-time 叠在同一提交。