feat(loop): make flash→pro escalation threshold configurable#699
Merged
esengine merged 1 commit intoMay 12, 2026
Conversation
The hardcoded threshold of 3 repair signals escalates too eagerly on long subagent runs where transient tool failures are expected and recoverable on flash. Exposing this via `escalation.failureThreshold` in config and `--escalate-after` on the CLI lets users tune escalation to their workload without forking the loop, while preserving the existing default and behaviour for everyone else.
esengine
added a commit
that referenced
this pull request
May 12, 2026
…il, CardStream fix (#705) npm-only release. The Tauri desktop source is in the repo and the CLI subcommand works, but installer bundles for macOS / Windows / Linux don't ship this round (separate release once signing's settled). Highlights: - Tauri desktop client with multi-tab concurrent runtimes (#689) plus a near-full polish pass: wallet balance, version chip, active- plan rail, abortable pause-gates, edit-gate pill, en + zh-CN i18n, shared pause-policy module dedup'd with the CLI TUI (#701) - checkpoint API + git-changes panel in the embedded dashboard (#682) - outside-sandbox file access approval modal (#696) - MCP loading pill + readiness gate on tool dispatch (#687) - escalate-after flag for flash → pro threshold (#699) Fixes: - CardStream Maximum-update-depth crash, quantize window so boundary cards stop oscillating (#700, #702) - `reasonix code` bridges config key to env + lazy subagent client so fresh installs can reach the setup wizard (#703) - pinned-mode scroll shrinks coalesced (#666), generic CSI key decode (#692), shell-confirm preview clamp (#691), frontmatter BOM/folded lines (#690), MCP error classification (#688), and more
ChasLui
pushed a commit
to ChasLui/DeepSeek-Reasonix
that referenced
this pull request
May 23, 2026
…e#699) The hardcoded threshold of 3 repair signals escalates too eagerly on long subagent runs where transient tool failures are expected and recoverable on flash. Exposing this via `escalation.failureThreshold` in config and `--escalate-after` on the CLI lets users tune escalation to their workload without forking the loop, while preserving the existing default and behaviour for everyone else.
ChasLui
pushed a commit
to ChasLui/DeepSeek-Reasonix
that referenced
this pull request
May 23, 2026
…il, CardStream fix (esengine#705) npm-only release. The Tauri desktop source is in the repo and the CLI subcommand works, but installer bundles for macOS / Windows / Linux don't ship this round (separate release once signing's settled). Highlights: - Tauri desktop client with multi-tab concurrent runtimes (esengine#689) plus a near-full polish pass: wallet balance, version chip, active- plan rail, abortable pause-gates, edit-gate pill, en + zh-CN i18n, shared pause-policy module dedup'd with the CLI TUI (esengine#701) - checkpoint API + git-changes panel in the embedded dashboard (esengine#682) - outside-sandbox file access approval modal (esengine#696) - MCP loading pill + readiness gate on tool dispatch (esengine#687) - escalate-after flag for flash → pro threshold (esengine#699) Fixes: - CardStream Maximum-update-depth crash, quantize window so boundary cards stop oscillating (esengine#700, esengine#702) - `reasonix code` bridges config key to env + lazy subagent client so fresh installs can reach the setup wizard (esengine#703) - pinned-mode scroll shrinks coalesced (esengine#666), generic CSI key decode (esengine#692), shell-confirm preview clamp (esengine#691), frontmatter BOM/folded lines (esengine#690), MCP error classification (esengine#688), and more
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
The flash→pro escalation threshold has been hardcoded to 3 repair signals per turn, which trips too early on long subagent runs where transient tool failures are expected and recoverable on flash. This PR makes the threshold configurable through
escalation.failureThresholdin~/.reasonix/config.jsonand a--escalate-after <n>flag onchat/code/run, while preserving the existing default of 3.Changes
src/loop/turn-failure-tracker.ts:TurnFailureTrackernow takes an optional threshold in its constructor (defaulting to the exportedFAILURE_ESCALATION_THRESHOLD = 3) and compares against the instance value innoteAndCrossedThreshold.src/loop.ts: addfailureThreshold?: numbertoCacheFirstLoopOptions, validate (integer in [1,20], else stderr warning + fall back to default), and pass the resolved value into theTurnFailureTrackerconstructor.src/config.ts: add the optionalescalation?: { failureThreshold?: number }shape toReasonixConfig.src/cli/index.ts: add--escalate-after <n>to thechat,code, andrunsubcommands;parseEscalateAfterFlagmirrorsparseBudgetFlag(lenient — bad value warns + returns undefined), andresolveFailureThresholdpicks flag > config > default, honouring--no-config.src/cli/commands/chat.tsx,code.tsx,run.ts,src/cli/ui/App.tsx: threadfailureThresholdfrom CLI options through to the loop constructor; included in theAppInnermemo deps.tests/loop.test.ts: cover threshold=5 (no escalation until the 5th signal), default behaviour (threshold=3 preserved), and invalid values falling back to 3 with a stderr warning.Testing
npm test -- tests/loop.test.ts— passes locally. The new cases exercise the tracker via the existing private-access helper used for the threshold=3 baseline.Notes
escalation.failureThresholdis hand-edited in~/.reasonix/config.json, matching howbudgetis handled today.Closes #628