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.Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub vcth4nh/vct-claude-marketplace-public --plugin claude-auto-retry