chore: remove the recovery.limboTimeoutMs lever, which never did anything - #805
Merged
Conversation
…hing `limboTimeoutMs` / `PADDOCK_RECOVERY_LIMBO_MS` was parsed, defaulted, sanitised, resolved per-project and carried into the web types — and read by nothing. Zero consumers in packages/server/src. It has been inert since #301 introduced it. The docs were honest ("Backstop timer ships in a follow-up"). The Settings UI was not: instance-config listed it as `editable: true` beside levers that work, with nothing to say it was a no-op. Anyone who set it — including this project's own dev box, which exports PADDOCK_RECOVERY_LIMBO_MS=60000 — got silence. Its purpose was a backstop for a chat wedged "running" with no way out. #528 removed that need: Stop now works during the background phase, so a wedged session is escapable from the UI instead of needing a timer to notice it. Rather than implement a timer nothing is waiting for, the lever goes. Removed end to end: config key + env var, the Settings field, the RecoveryConfig / RecoveryOverride member, web types and fixtures, and the docs rows. Existing installs are unaffected: sanitizeRecoveryOverride is an allowlist, so a `limboTimeoutMs:` left on disk is ignored exactly as it effectively is today, and the env var simply stops being read. No schemaVersion bump — the rule is "remove a LOAD-BEARING key", and this one carried no load, which is the point. Test coverage that happened to use it as a vector is preserved rather than deleted: the non-integer-is-dropped case moves to its own assertion on debounceMs, and the accepts-zero case moves to maxRetries. Server 2126 passed, web 1774 passed, typecheck clean. Co-Authored-By: Claude <noreply@anthropic.com>
Deploying paddock with
|
| Latest commit: |
55dc18c
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://ad32a828.paddock-7u2.pages.dev |
| Branch Preview URL: | https://chore-remove-dead-limbo-time.paddock-7u2.pages.dev |
Merged
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.
What
recovery.limboTimeoutMs/PADDOCK_RECOVERY_LIMBO_MSwas parsed (config.ts:1188), defaulted (recovery-config.ts:94), sanitised, resolved per-project, and carried into the web types — and read by nothing. Zero consumers inpackages/server/src. It has been inert since #301 introduced it.The docs were honest about this — "Backstop timer ships in a follow-up". The Settings UI was not:
instance-config.ts:332listed it as aneditable: truenumber field beside levers that work, with nothing to indicate it was a no-op. Anyone who set it got silence and no way to find out. This project's own dev box exportsPADDOCK_RECOVERY_LIMBO_MS=60000and has been getting nothing.Why remove rather than implement
Its purpose was a backstop for a chat wedged "running" with no way out — notice the silence, surface it as stuck. #528 removed that need: Stop now works during a chat's background phase, so a wedged session is escapable directly from the UI rather than needing a timer to spot it. Implementing a timer nothing is waiting for would be adding a second, weaker answer to a question already answered.
Compatibility — nothing breaks
sanitizeRecoveryOverrideis an allowlist (recovery-config.ts:123), so alimboTimeoutMs:left in aproject.yamlorpaddock.config.yamlis silently ignored. That is precisely the effect it has today.PADDOCK_*vars.schemaVersionbump. The documented rule (schema-version.ts:32-43) is "Remove a load-bearing key → Yes". This key carried no load — that is the entire premise of the PR. An old reader of a new file defaults it to0(off), which is what it always did; a new reader of an old file drops it.If you provision Paddock with config management,
PADDOCK_RECOVERY_LIMBO_MSin your environment is now dead weight and can be dropped.Removed
config.ts(type + parse),instance-config.ts(the Settings field),recovery-config.ts(type member, default, sanitise, resolve),packages/web/src/lib/types.ts+ fixtures, and the docs rows inconfiguration/chat-recovery.md,configuration/environment.md,architecture/overview.md.The remaining recovery levers —
surfaceKilledTask,autoReDrive,debounceMs,maxRetries— are untouched and still work.On the tests
Several tests used
limboTimeoutMsas an incidental vector rather than testing it. Their intent is preserved, not deleted:recovery-config.test.tsproved non-integers are dropped vialimboTimeoutMs: 2.5. That coverage moves to its own assertion ({ debounceMs: 2.5, maxRetries: 1 }→ drops the 2.5).{ debounceMs: 0, limboTimeoutMs: 0 }to{ debounceMs: 0, maxRetries: 0 }.instance-config.test.ts(PUT /api/instance-config: a null on a nonNegInt field writes 0 instead of clearing the override #723, "PUT with null clears a recovery key") keeps two of its three keys — and had to drop this one anyway, since a non-PATCHABLE_KEYSkey is now rejected.Server 2126 passed, web 1774 passed, typecheck clean.
Follow-up to #528. The other outstanding piece of that issue — unlocking the composer during healthy background work — is filed separately.
🤖 Generated with Claude Code