# 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` 回到 `

`。口述停止按钮保留。 ### 既有断言改动 | 文件 | 原值 | 新值 | 原因 | | --- | --- | --- | --- | | `rectification-exhaustion-exit` 源扫描 | 口述停止按钮和范围小字共用 `CHOICE_STOP_LABEL` / `onStop` | 仅口述态 `.rectification-collect-stop` 使用该文案;范围行是 status 句,没有 `onStop` / `