Move-only (TASK-rectification-code-split-20260926 T3/T4). No behavior,
receipt, billing, Skill or scoring change.
- agent-run.ts: 1400 -> 135 lines; runV9AgentTurn 1046 -> 25 lines, no
nested functions. It keeps the public types, the budget constants and the
phase order: agent-run-prepare.ts (reliability, session, year re-ask, Skill
identity, delivered guard, reserve, turn row / replay),
agent-run-retry.ts (attempt loop), agent-run-attempt.ts (the old nested
streamAttempt), agent-run-finish.ts (billing settle, receipts, interview,
finalize), agent-run-support.ts (outcome types, retry classification, turn
receipt writers), agent-run-messages.ts (buildAgentMessages /
buildOpeningBrief, re-exported).
- One token changed with the move: the attempt passes its own
`previousErrorCode` argument to buildAgentMessages instead of reading the
enclosing `lastAttemptError`; the loop passes that same value (clears the
old unused-parameter warning).
- Tests: whole-source contracts read tests/rectification-agent-run-surface.ts;
behavioral runV9AgentTurn tests unchanged. agent-run growth caps added.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
Spoken collect without askedTurnId now hangs on the last assistant message, remaining-candidate copy uses credible_range, and engine representativeTime no longer keeps eliminated minutes in model house tables.
Distinguish followups that cannot stamp a probe now go to persistExhaustionCollect instead of repeating the card stem in the assistant body. Choice focuses without asked_turn_id hang on the last assistant turn, and persisted_question with a live choice_card renders the existing card. Representative-time inconsistency is warn-only (BUG-676 investigating).
Dated-choice exhaustion is not convergence. Refresh probes from remaining
active candidates, then ask a targeted collect, then deliver. Skill 10.0.24.
Co-authored-by: Cursor <cursoragent@cursor.com>
Engine by_time ledgers now include the full candidate set so posterior columns can look up fit and windows. Delivery turns keep up to three sentences after idle persist; the card subtracts repeated traits and folds the board chart.
Co-authored-by: Cursor <cursoragent@cursor.com>
Set-focus must not append a second narration, and a server-owned stem must not also appear as a question in the assistant body.
Co-authored-by: Cursor <cursoragent@cursor.com>
Engine asked_probe_keys no longer include varga split hashes that 400 the scorer, failed compares become visible and retry, user stop can still deliver a range on a stale snapshot, and holdout no longer reasks domains already in the ledger.
Co-authored-by: Cursor <cursoragent@cursor.com>
Focuses now carry asked_turn_id so GET rebuilds stem and options on the
same turn. Agent writes spokenPrompt; the live question slot is gone.
Co-authored-by: Cursor <cursoragent@cursor.com>
The live question slot disappeared on refresh because it was never written to assistant_message. Attach the current collect_spoken prompt to that turn before finalize so chat history keeps it.
Co-authored-by: Cursor <cursoragent@cursor.com>