No implicit step limit + cheap background waits - #129
Merged
Conversation
Startup awaited a provider model-listing probe that can hang indefinitely. The agent now always starts immediately with conservative limits; the optional live metadata refresh is skipped entirely, since applying it later would require safely reconfiguring the already-built agent. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…p background waits Driven by real transcripts (sol-view sessions): one turn babysitting two large downloads burned 200 model rounds / 14M input tokens (383M in an earlier session) — nearly all of it instant polls of still-running processes, plus 85 plan-continue nudges overriding the model's honest "work remains in progress" status answers. Step limit: - Remove the implicit intent-based per-turn caps (80/120/200). Turns are uncapped unless --max-steps / `/config steps` sets one; runaway loops are ended by the repeat/no-progress/stall budgets instead. A misclassified intent can no longer kill a productive turn early. - Remove the dead max_steps_explicit flag; internal subagent budgets (explore 10, background tasks 10/20) become real caps as written. `/config steps auto` is now an alias for `off`. - A capped turn gets ONE tool-free wrap-up round to report where the work stands before stopping (still Incomplete · StepLimit). Background waiting: - bash_output gains wait_secs (max 600): blocks server-side until new output or process exit — one waiting call replaces a poll loop, and a kill wakes it immediately. - Waiting detection keys on the process lifecycle, not output novelty: a download progress bar no longer reads as progress. After three consecutive waiting rounds the model is steered to wait once with wait_secs or wrap up; continued polling forces a tool-free status answer. Subsumes the byte-identical idle-poll special case. - A status answer ends a waiting turn even with an incomplete plan — the plan-continue nudge no longer ping-pongs against polls. - Superseded bash_output results fold to a one-line digest, so a long watch stops re-sending stale progress dumps with every request. - Tool descriptions and nudges steer toward wait_secs and chaining follow-ups in-shell (fetch && convert) instead of babysitting. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
--max-steps//config stepssets one, and a capped turn now gets one tool-free wrap-up round to report where the work stands.bash_outputgainswait_secs(blocks server-side until new output/exit, max 600s), waiting detection keys on process lifecycle instead of output novelty, a status answer ends a waiting turn even with an incomplete plan, and superseded poll results fold to one-line digests.Driven by real sol-view transcripts: one turn burned 200 model rounds / 14M input tokens babysitting two downloads (85 plan-continue nudges vs. 12 attempted status answers); an earlier session hit 2,250 rounds / 383M input tokens.
Testing
poll_wait(wake on output / timeout / kill), end-to-endwait_secsdispatch, lifecycle-based waiting classifier, plan-nudge suppression during waits (regression shaped on the sol-view transcript), transcript poll folding, step-cap wrap-up rounds.🤖 Generated with Claude Code