This skill should be used when the user asks about "fault tolerance", "resilience", a "circuit breaker", "graceful degradation", "retry storm" or "thundering herd on recovery", "exponential backoff with jitter", "timeout", "bulkhead", a "single point of failure" (SPOF), "failover", or "rate limiting" (token bucket / leaky bucket / sliding window). Use it whenever a design must keep working through node crashes, slow dependencies, traffic spikes, or partial outages — i.e. any time the answer to "what happens when this breaks?" is missing, even if the user doesn't say "resilience".
npx skills add https://github.com/proyecto26/system-design-skills --skill resilience-failure
Design the system so that when a part breaks — and it will — the failure is
contained and the user still gets a useful (if degraded) answer instead of an
error page or a cascading outage. Getting this wrong is the difference between a
slow dependency and a total meltdown: the most common amplifier of an outage is
the system's own reaction to it (retry storms, health-check stampedes).
Any design with a remote dependency, a shared resource, or an SLA. Reach here to
find single points of failure, decide what each call does when its dependency is
slow or down, protect a service from being overwhelmed (rate limiting), and plan
how a recovered service comes back without being crushed by the backlog.
Don't wrap a single in-process function or a best-effort batch job in circuit
breakers and bulkheads — that's machinery for cross-process/cross-network calls
(YAGNI). Don't add retries to a non-idempotent write without an idempotency key
first (→ api-design) — you'll duplicate side effects. The cheapest design that
meets the availability target wins; chasing an extra nine you don't need costs
real complexity (→ back-of-the-envelope for what a nine actually buys).
back-of-the-envelope.)api-design.)back-of-the-envelope.)Layered defenses; most real designs combine several.
the root of most cascades.
randomized delays. Use for idempotent calls against blips; never naked retries.
probe to recover. Use when a downstream is down or slow and retries would pile on.
dependency. Use so one slow dependency can't exhaust capacity shared by others.
default, or hidden feature. Use when a usable-but-worse answer beats an error.
Use to protect a service from overload, abuse, or a stampeding caller.
failure. Use to remove SPOFs. (Health checks/LB failover live in load-balancing.)
Rate-limiting algorithms (token bucket, leaky bucket, fixed/sliding window) and
the circuit-breaker state machine are detailed in references/deep-dive.md.
| Option | What it solves | What it worsens | Change it when |
|---|---|---|---|
| Timeout | Bounds blocked threads; stops one slow call hanging the caller | Too tight → false failures; too loose → cascades | Tune to the dependency's p99, not a guess |
| Retry + backoff + jitter | Rides out transient blips | Multiplies load; duplicates non-idempotent writes | Add jitter + cap attempts + budget; require idempotency |
| Circuit breaker | Fails fast, gives a sick dependency room to recover | Adds state/tuning; can trip on a blip and over-shed | Flapping → tune thresholds / half-open probe rate |
| Bulkhead | Contains one failure to its own pool | Lower peak utilization; more pools to size | One noisy dependency starves others |
| Graceful degradation | Keeps the user served when a dependency dies | Serves stale/partial; more code paths to test | Correctness must be exact → fail closed instead |
| Rate limiting | Protects the service; bounds cost/abuse | Rejects legitimate bursts; needs shared state at scale | Limits too strict (valid drops) or too loose (overload) |
| Redundancy / failover | Removes SPOFs; survives node/region loss | Cost, replication lag, failover consistency risk | Failover drops un-replicated writes → consistency-coordination |
This block exists to stop the system from amplifying its own outage.
retries of callers upstream, and load multiplies geometrically. *Mitigate:*
exponential backoff with jitter, a per-request retry budget (cap total
attempts), and a circuit breaker so a dead dependency isn't retried at all.
and expired cache entry hits it at once, knocking it over again. *Mitigate:*
half-open circuit breakers that admit a trickle, jittered client reconnect,
request coalescing, and slow-start ramp. (Cache-expiry stampede is caching.)
load-balancer probes hammer a recovering instance. *Mitigate:* gentle probe
intervals, fail-fast readiness, and draining. (Probe mechanics → load-balancing.)
exhausted, and the caller now looks "down" to *its* callers. *Mitigate:*
timeouts + bulkheads everywhere.
down. *Mitigate:* fail-open (allow on limiter error) for availability, or
fail-closed for protection — decide deliberately.
Monitor: error rate and p99 per dependency, retry counts, circuit-breaker
state transitions, pool saturation/queue depth, rate-limit rejection rate, and
"time to first success" after a recovery.
dependency, idempotency, latency budget, and the rate-limit dimension/policy
(the "Clarify first" list). No defense is chosen before these are answers.
Every remote call gets a *timeout*; add retry+jitter only where idempotent; add
a *circuit breaker* where a sick downstream would pile on; *bulkhead* shared
pools; choose *degrade* vs *fail closed* by whether a stale answer is acceptable.
(often 2–3) plus a per-request budget and jitter; breaker open/half-open
thresholds; bulkhead pool sizes; limiter rate/burst and fail-open-vs-closed.
(retry storm, recovery herd, health-check stampede, timeout-less cascade,
limiter-as-SPOF) and confirm a mitigation is in place for each.
(series multiplies, parallel adds nines) and confirm the target is met without
over-provisioning. (→ back-of-the-envelope.)
if the user named a cloud (see "Choosing a provider").
Change it when…` table with one row per choice you made here (e.g. the
option, its store, its failure policy); the last column is a concrete trigger
(a number or observable signal). Then name what breaks first.
Do
stale: true) instead of a silent lie.Don't
api-design).Tie timeouts to the dependency's measured p99, not a round guess. Cap retries
(often 2–3) and apply a budget so total attempts can't explode. Each extra
"nine" of availability costs disproportionately more redundancy — know what a
nine actually buys before targeting it. Composed availability matters: components
in series multiply (two 99.9% deps in a request path ≈ 99.8%), redundant
components in parallel add nines. For all of these — latency tables, the nines
table, series/parallel availability math — see back-of-the-envelope.
Two contracts are load-bearing here.
the fallback plus a signal, e.g. `{ "data": [...], "stale": true, "source":
"cache", "as_of": "2026-05-29T10:00Z" }` so callers and clients can react.
429 Too Many Requests and standardheaders — X-RateLimit-Limit, X-RateLimit-Remaining, and Retry-After
(seconds) so a well-behaved client backs off instead of retrying into the wall.
Default to the generic recipe above (resilience libraries, a token-bucket/leaky-
bucket limiter, health checks, N+1 redundancy). If the user names a cloud, read
references/providers/<provider>.md for the managed-service mapping, quotas/limits,
and provider-specific trade-offs. If no file exists for that provider, the generic
recipe is the answer.
To visualize a fallback path (gateway → timeout on primary → dashed arrow to
cache/default) or a circuit-breaker state machine, use the in-plugin
architecture-diagram skill; draw the degraded path as a dashed arrow and the
failed dependency in the error color.
messaging-streaming — *pairs with* this: a queue absorbs a write spike and a dead-letter queue contains poison messages; *owned-concept lives in* it for delivery guarantees and DLQ mechanics.load-balancing — *depends on* it for health checks and LB-level failover routing; pair its probes with the redundancy here to remove SPOFs.consistency-coordination — *owned-concept lives in* it: the consistency consequences of failover (un-replicated writes lost, quorum under partition) are decided there.api-design — *depends on* its idempotency-key contract before any retry of a write is safe.caching — *pairs with* graceful degradation as a fallback source; *owned-concept lives in* it for the cache-expiry stampede (vs. the recovery herd here).system-design — *feeds into* the orchestrator; this block is its step-5 failure-mode check.references/deep-dive.md — circuit-breaker state machine, backoff/jitter formulas, retry budgets, the five rate-limiting algorithms (token bucket, leaky bucket, fixed/sliding window) with distributed-counter and race-condition handling, bulkhead sizing, SPOF analysis and failover modes. Read when designing the resilience layer in detail.references/providers/{generic,aws,azure,gcp,temporal}.md — service mappings, limits, and pitfalls per environment; temporal.md covers durable retries/timeouts and saga compensation as workflow primitives.Use when you have a written implementation plan to execute in a separate session with review checkpoints
Integration with protocols.io API for managing scientific protocols. This skill should be used when working with protocols.io to search, create, update, or publish protocols; manage protocol steps and materials; handle discussions and comments; organize workspaces; upload and manage files; or integrate protocols.io functionality into workflows. Applicable for protocol discovery, collaborative protocol development, experiment tracking, lab protocol management, and scientific documentation.
Analyzes job descriptions and generates tailored resumes that highlight relevant experience, skills, and achievements to maximize interview chances
Generate Excalidraw diagrams from natural language descriptions. Use when asked to "create a diagram", "make a flowchart", "visualize a process", "draw a system architecture", "create a mind map", or "generate an Excalidraw file". Supports flowcharts, relationship diagrams, mind maps, and system architecture diagrams. Outputs .excalidraw JSON files that can be opened directly in Excalidraw.
Build and distribute Expo development clients locally or via TestFlight
Data structure for annotated matrices in single-cell analysis. Use when working with .h5ad files or integrating with the scverse ecosystem. This is the data format skill—for analysis workflows use scanpy; for probabilistic models use scvi-tools; for population-scale queries use cellxgene-census.
Benchling R&D platform integration. Access registry (DNA, proteins), inventory, ELN entries, workflows via API, build Benchling Apps, query Data Warehouse, for lab data management automation.
Comprehensive molecular biology toolkit. Use for sequence manipulation, file parsing (FASTA/GenBank/PDB), phylogenetics, and programmatic NCBI/PubMed access (Bio.Entrez). Best for batch processing, custom bioinformatics pipelines, BLAST automation. For quick lookups use gget; for multi-service integration use bioservices.
Take proyecto26/resilience-failure from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.