Summary
The progressive-cooldown / rapid-retry auto-deny machinery (_DISCUSS_COOLDOWN, min(30 * deny_count, 120) escalation) in the Claude control channel works around Claude Code retrying an ExitPlanMode control_request immediately after a denial — the v2.1.72–2.1.74 ExitPlanMode loop (lineage #126, #117, #93, #87).
Surfaced by the v0.35.3 Claude Code workaround-retirement audit (umbrella tracking issue).
Hypothesis (UNVERIFIED)
A local note suggests the upstream fix for the ExitPlanMode immediate-retry loop landed in a Claude Code release after v2.1.74. This is not confirmed and must be verified before any code is removed — do not assume the fix is present.
Investigation / scope
- Reproduce (or fail to reproduce) the immediate-retry-after-denial behaviour on the Claude Code CLI version Untether currently targets (and the fleet runs). A clean test: deny an
ExitPlanMode control_request and observe whether Claude immediately re-issues it.
- If the loop is gone upstream: remove the progressive-cooldown machinery (
_DISCUSS_COOLDOWN, escalation, rapid-retry auto-deny), keeping the legitimate Pause-&-Outline / post-outline approval flow intact.
- If the loop persists: keep the workaround; record the CLI version + repro here so the next check is cheap.
Affected code
src/untether/telegram/commands/claude_control.py — cooldown handling, rapid-retry auto-deny
src/untether/runners/claude.py — _DISCUSS_COOLDOWN registry, escalation
tests/test_cooldown_bypass.py, tests/test_claude_control.py
- Reference:
.claude/rules/control-channel.md "Progressive cooldown" section
Done when
- The current targeted CLI's ExitPlanMode retry-after-denial behaviour is documented (fixed / not fixed, with version).
- Cooldown machinery removed (if fixed) with the Pause-&-Outline flow regression-tested, or a keep decision recorded.
Lineage: #126, #117, #93, #87. Part of the v0.35.3 Claude Code workaround-retirement audit (umbrella tracking issue).
Summary
The progressive-cooldown / rapid-retry auto-deny machinery (
_DISCUSS_COOLDOWN,min(30 * deny_count, 120)escalation) in the Claude control channel works around Claude Code retrying anExitPlanModecontrol_requestimmediately after a denial — the v2.1.72–2.1.74 ExitPlanMode loop (lineage #126, #117, #93, #87).Surfaced by the v0.35.3 Claude Code workaround-retirement audit (umbrella tracking issue).
Hypothesis (UNVERIFIED)
A local note suggests the upstream fix for the ExitPlanMode immediate-retry loop landed in a Claude Code release after v2.1.74. This is not confirmed and must be verified before any code is removed — do not assume the fix is present.
Investigation / scope
ExitPlanModecontrol_request and observe whether Claude immediately re-issues it._DISCUSS_COOLDOWN, escalation, rapid-retry auto-deny), keeping the legitimate Pause-&-Outline / post-outline approval flow intact.Affected code
src/untether/telegram/commands/claude_control.py— cooldown handling, rapid-retry auto-denysrc/untether/runners/claude.py—_DISCUSS_COOLDOWNregistry, escalationtests/test_cooldown_bypass.py,tests/test_claude_control.py.claude/rules/control-channel.md"Progressive cooldown" sectionDone when
Lineage: #126, #117, #93, #87. Part of the v0.35.3 Claude Code workaround-retirement audit (umbrella tracking issue).