From claude-auto-retry
Reference for the claude-auto-retry plugin. Use this skill when the user asks "how does auto-retry work", "why didn't my retry fire", "disable rate-limit retry", "claude-auto-retry config", "auto-retry status meaning", or any question about how this plugin classifies errors, where its state lives, or how to tune it.
How this skill is triggered — by the user, by Claude, or both
Slash command
/claude-auto-retry:claude-auto-retry-aboutThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
The plugin auto-retries Claude Code sessions on transient API errors by
The plugin auto-retries Claude Code sessions on transient API errors by
listening on the engine's StopFailure hook and injecting Up Enter into the
session's tmux pane after a class-appropriate backoff. No daemon, no wrapper,
no --resume.
| Error class | Default action |
|---|---|
rate_limit (transient: "Server is temporarily limiting") | retry after 60s |
rate_limit (hard quota: "You've hit your limit · resets X") | parse reset time, schedule retry for then (fallback 30min if parse fails) |
server_error (500) | retry after 30s |
unknown (generic Overloaded / Internal server error with no status) | retry after 30s |
invalid_request, authentication_failed, billing_error, max_output_tokens | skipped — not auto-recoverable |
The hook only fires inside a tmux pane (it uses tmux send-keys to inject
the retry keystrokes). Outside tmux it logs no_tmux and exits.
Three layers, last-wins, shallow merge per section:
hooks/auto_retry.py)~/.config/claude-auto-retry/config.toml<cwd>/.claude/claude-auto-retry.tomlTo create a project config, run inside the project:
python3 $(claude plugin path claude-auto-retry)/hooks/auto_retry.py --init-config
Full schema in examples/config.toml (every field documented).
Set enabled = false in either config layer. The hook short-circuits and logs
a disabled event so --status still shows it.
[per_error_enable]
rate_limit = false # don't auto-retry rate limits at all
| What | Where | Lifetime |
|---|---|---|
| Persistent retry log | ~/.local/state/claude-auto-retry/log.jsonl | survives reboot, rotates at 5 MB |
| Live timer tracking | /tmp/claude-auto-retry/pending/<pid>.json | until timer completes or reboot |
| Dedup sentinel | /tmp/claude-retry-<pane> | dedup_window seconds (default 30) |
/claude-auto-retry:status outputTwo sections:
Outcomes:
scheduled — timer was spawned (you'll see a matching fired later)fired — retry actually injectedskipped — see source column for why (disabled, no_tmux, not_retryable, per_error_disabled, dedup_bounced, quota_too_far)error — something went wrong; reason column has the detailisSidechain: true) don't currently trigger StopFailure for the main session, so the plugin can't recover them. Planned for v0.2.tmux send-keys as its injection channel./claude-auto-retry:status. Check the most recent entry; the source field explains why it was skipped.source. quota_fallback means the reset-time parser couldn't read the message; consider opening an issue with the verbatim text.O_EXCL sentinel. If it happens, file a bug with the log entries.npx claudepluginhub vcth4nh/vct-claude-marketplace-public --plugin claude-auto-retryBuilds a throwaway prototype to answer a design question about UI appearance or state/logic behavior. Guides you through two branches: interactive terminal app for logic validation, or multiple UI variations for visual exploration.