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>
46 lines
3.3 KiB
Markdown
46 lines
3.3 KiB
Markdown
# 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 叠在同一提交。
|