Repository navigation
cmux NEXT: Settings > Retry After Errors sets the automatic retry loop (on/off, seconds between tries, tries per error) - #31709
Conversation
…/off, seconds between tries, tries per error) Lawrence via Leo (ask-082cdbe456): "should have retry button + configurable timer loop retry". The error card's Retry has led capacity failures since 9e836df; acpmux already retries rate limits, capacity and lost connections on its own (#25232, #27924), but only its config.json could change the loop. agents.autoRetry.{enabled,intervalSeconds,attempts} in the settings file now set it, read at each retry; config.json's autoResumeDelaysMs still comes first. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-5224b647da981c2d3c39
|
Found 12 test failures on Blacksmith runners: Failures
...and 2 more test failures. View all on Blacksmith
|
|
Review (subagent claude-opus-5-5 medium): SHIP at 1fc7836 No blocking findings. With no settings file, or a file without these keys, every path (turn retry, restore, restart chain, held messages, subagent retry) keeps today's Follow-ups:
|
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Not verified: macOS jobs did not run: compile and app tests were skipped on CI passes on Written by red: cmux-next checks (god files, concurrency, crash safety, l10n); no finished base run on fbaa7a5 to compare; do not merge until green; see lane-rules Default changesThis pull request changes 12 defaults at
Signed off on this commit by Merge receipt: merged as Regenerate the snapshot with Shipped in:
|
|
Checks for 1fc7836:
|
… (panic ratchet, #31709) #31709 (030cb46, "Settings > Retry After Errors sets acpmux's retry loop") added DEFAULT_DELAYS_MS[n.min(DEFAULT_DELAYS_MS.len() - 1)] in hub/auto_resume/settings.rs, one more clippy::indexing_slicing hit in acpmux. With the #30726 hits fixed, acpmux is still 687 > 686 (hq run 41386195677). get(n), else last(), is the same wait: past the defaults the last one repeats. The array is a non-empty const, so the MIN_DELAY_MS fallback never applies.
|
Base red from this PR (author: Leo, teamleaderleo). |
…ic ratchet 697 > 686, #30726, #31709) (#31773) * base red: acpmux process pages read rows without an index (panic ratchet indexing_slicing 696 > 686, #30726) #30726 (fbaa7a5, "byte-bound background-process history with opt-in pages") added ten clippy::indexing_slicing hits in acpmux hub/processes.rs: the page window self.processes[start..end] in ProcessTable::page_snapshot and nine serde_json indexes row["..."] in the too-large row of process_page_values. With #31695 merged, acpmux is 696 > baseline 686, so the Rust panic ratchet is red on feat-cmux-next. The window is now processes.get(start..end): start is an ID's slot + 1 (at most len) and end = min(start + limit, len), so the range is always in bounds and the fallback never applies. The row fields use row.get(..), which serializes a missing field as null, the same as an index on a missing key. The output does not change. No baseline change and no allow. Fleet panic step: RED at tip 7da73fe (indexing_slicing 697 > 686, hq run 41384159581) and at 4a94625 with the get_mut fix (696 > 686, hq run 41384159646, hits at processes.rs:327 and 384-388). * base red: acpmux retry delays read the default table without an index (panic ratchet, #31709) #31709 (030cb46, "Settings > Retry After Errors sets acpmux's retry loop") added DEFAULT_DELAYS_MS[n.min(DEFAULT_DELAYS_MS.len() - 1)] in hub/auto_resume/settings.rs, one more clippy::indexing_slicing hit in acpmux. With the #30726 hits fixed, acpmux is still 687 > 686 (hq run 41386195677). get(n), else last(), is the same wait: past the defaults the last one repeats. The array is a non-empty const, so the MIN_DELAY_MS fallback never applies. --------- Co-authored-by: cmux-bot[bot] <348531757+cmux-bot[bot]@users.noreply.github.com>
…t-retry.json changes (#31883) #31709 made acpmux read schemas/settings/source/agent-retry.json, but cmux-tui-spec.yml's push and pull_request path filters didn't list it, so tests/test_cargo_test_verdict.py fails on base. Agent-Session: https://cmux.com/deeplink/agent?id=aid-fbe0da5ff5fd5f3e6eba Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
Leo-ask: ask-082cdbe456
Leo, passing on Lawrence's notes (2026-10-28): "leo make sure font size everywhere (like text input area) is customizable", "should have retry button + configurable timer loop retry", "needs more left padding".
This PR builds the one part that was still missing: the configurable timer loop retry. Where the other parts stand:
agentPane.display.font.size).What changes
acpmux already retries a turn that a rate limit, a capacity error or a lost connection ended (#25232, #27924), waiting 10 s, 1 min, 5 min and 20 min. Until now, only acpmux's own
config.json(autoResumeDelaysMs) could change that loop. Three new settings under Settings > General > Retry After Errors now set it:agents.autoRetry.enabledagents.autoRetry.intervalSecondsagents.autoRetry.attemptshub/auto_resume/settings.rs, throughuser_settings, as Sub-sessions does), so a change applies to the next failed turn.autoResumeDelaysMsin config.json, when set, still comes first, so the dev slot's[]keeps working. The defaults give exactly today's waits, and a test pins the section JSON's defaults and ranges to the daemon's constants.effective_delays: the turn retry, a restored wait, a chain of restarts, held agent messages and subagent retries.schemas/settings/source/agent-retry.json, generated into Swift bygen-settings-sources.py. Through the schema, the settings appear in Settings, the palette,cmux settingsand MCP. MCP refuses all three as user-only (SettingsSchema+AgentPolicy), likesessions.resumeAgents.settings-schema.jsonand the settings reference are regenerated by base autofix.cmux-next-ios/verify/parity-mac.md: the loop runs in acpmux, so phone chats get it, but the keys can only be edited on the Mac.Timers: no new timer. The existing per-attempt sleep reads its wait from these settings, and Stop or close still ends it (
auto_resume.rs).risk: normal (a settings row plus where the daemon reads its existing waits).
Changelog
Observed / Not run
gen-settings-sources.py(writes the generated Swift), rustfmt, the pre-push gate. Thesettings.rsunit tests and the acpmux auto_resume tests run through cmux-ci; their result is posted below.cmux settings get|set agents.autoRetry.intervalSecondsand the MCP refusal.Agent session: agent session
🤖 Generated with Claude Code
Need help on this PR? Tag
@codesmith-botwith what you need.Summary by cubic
Makes acpmux's automatic retry loop after rate limits, capacity errors, or lost connections configurable from Settings > Retry After Errors, instead of only via the daemon's
config.json.agents.autoRetry.*keys:enabled(on/off),intervalSeconds(0 keeps today's growing waits), andattempts(1–12 per failed turn), read from the settings file at each retry.autoResumeDelaysMsinconfig.jsonstill takes precedence when set, so the dev slot's[](retry off) keeps working.cmux settings; the phone gets the retry behavior but has no editor for the keys.schemas/settings/source/agent-retry.jsongenerates the Swift descriptors, with settings strings translated into all 21 locales.Migration
Written for commit 1fc7836. Summary will update on new commits.