resilience
Apply resilience patterns (retry, backoff, circuit breaking) when writing or reviewing code that makes outbound HTTP/REST calls, database operations, or any I/O that can experience transient failures. Use this skill when: (1) writing new code that calls external services or APIs, (2) reviewing code that uses fetch, HTTP clients, or service-to-service calls, (3) adding queue consumers or workers that interact with remote systems, (4) debugging intermittent failures in production.
- License 许可
- MIT
- 所属仓库
- microsoft/scope
- 最近更新
- 2026-11-14
- Stars
- ★ 86
- Forks
- 32
01 前言 Front Matter
- name
- resilience
- metadata
- { "version": "1.0.0" }
- description
- Apply resilience patterns (retry, backoff, circuit breaking) when writing or reviewing code that makes outbound HTTP/REST calls, database operations, or any I/O that can experience transient failures. Use this skill when: (1) writing new code that calls external services or APIs, (2) reviewing code that uses fetch, HTTP clients, or service-to-service calls, (3) adding queue consumers or workers that interact with remote systems, (4) debugging intermittent failures in production.
03 SKILL.md 正文
Resilience Patterns
When writing or reviewing code that makes outbound calls (REST APIs, database operations, queue interactions), always consider transient failure handling.
Core Principle
Every outbound HTTP call should have a retry strategy unless there's a specific reason not to. Network blips, temporary 503s, and connection resets are normal in distributed systems. Code without retry is fragile by default.
Available Tools
This repo provides retry utilities in packages/shared/src/utils/retry.ts:
@Retry decorator (preferred for methods)
import { Retry } from "shared";
class MyWorker {
@Retry({ maxRetries: 3, baseDelayMs: 1000, isRetryable: () => true })
async callExternalService(): Promise<void> {
const res = await fetch("http://api/endpoint", { method: "POST" });
if (!res.ok) throw new Error(`HTTP ${res.status}`);
}
}
withRetry function (for inline/conditional logic)
import { withRetry } from "shared";
const result = await withRetry(
() => fetch("http://api/data").then(r => r.json()),
{ maxRetries: 3, baseDelayMs: 500, isRetryable: (err) => isTransient(err) }
);
Decision Checklist
When you encounter an outbound call, ask:
- Is this call idempotent? If yes (GET, PUT, DELETE with idempotency key) -> retry aggressively.
- Is this call non-idempotent? If yes (POST creating resources) -> retry cautiously, only on network errors (never got a response), not on 5xx (server may have processed it).
- Is this best-effort? (e.g., triggering reports, sending notifications) -> retry with try/catch at call site so failures don't propagate.
- Is this critical path? (e.g., saving user data) -> retry and propagate failure if exhausted.
What to Retry
| Condition | Retry? | Reason |
|---|---|---|
| Network error (ECONNREFUSED, ETIMEDOUT) | Yes | Transient connectivity issue |
| HTTP 429 (Too Many Requests) | Yes | Rate limiting, respect Retry-After header |
| HTTP 500, 502, 503, 504 | Yes | Server-side transient failures |
| HTTP 400, 401, 403, 404, 409 | No | Client errors indicate a permanent problem |
| DNS resolution failure | Yes (limited) | May be temporary DNS propagation |
Configuration Defaults
For service-to-service calls within the cluster:
maxRetries: 3baseDelayMs: 1000(1 second)maxDelayMs: 5000(5 seconds)
For external API calls:
maxRetries: 5baseDelayMs: 500maxDelayMs: 30000(respect rate limits)
Anti-patterns
- No retry at all on service-to-service calls -- fragile
- Retry on 4xx -- wastes resources, will never succeed
- Retry without backoff -- can overwhelm a recovering service
- Retry without a cap -- can hang indefinitely
- Retry non-idempotent POST without checking -- can create duplicates
- Stacking retry layers -- never combine an HTTP client's built-in retry with
withRetry/@Retryaround the same call, or attempts multiply (maxRetries × client.limit). See below.
Single retry layer
Retry belongs to exactly one layer per call. The ky HTTP clients used by the
CLI (apps/cli/src/utils/api-client.ts) and Portal
(apps/portal/src/lib/api-client.ts) set retry: 0
precisely so they never stack with the shared cockatiel retry.
If a call needs transient-failure retries, pick one layer:
- Enable the HTTP client's own
retry(with its own backoff), OR - Wrap the call in
withRetry/@Retryfrompackages/shared/src/utils/retry.ts.
Never both — combining them compounds attempts to maxRetries × client.limit.
Reference
Full API documentation: docs/architecture/retry.md
04 同仓库更多 Skills
github-actions
Use when creating, editing, reviewing, or troubleshooting GitHub Actions workflows in Scope.
ax-practitioner
This skill should be used when the user asks about AX (agent experience) or the AX Practitioner Playbook, for example "how do I evaluate my technology's agent experience", "write AX eval criteria", "design an eval scenario", "propensity vs efficacy", "lift and drag", "which agent profiles should I test", "how many eval runs", "how do I read an agent trajectory", "why does the agent ignore my MCP server or skill", "agent uses an outdated SDK version", "too many extensions", "how to read an AX readout", "how to get the owning team to fix the docs", "review my eval against the checklist", or the SPFx worked example. It answers interactively and strictly from the playbook, citing chapters. When the playbook has no answer, it says so and clearly labels any general-knowledge or web content.
typescript
TypeScript best practices for this monorepo. Use this skill when: (1) writing new TypeScript code, (2) reviewing TypeScript code, (3) working with API responses, fetch calls, or JSON parsing, (4) adding or modifying types and interfaces.
storybook
Maintain the Storybook component catalog for the portal app. Use this skill when: (1) adding new stories for components, (2) updating existing stories after component changes, (3) running a full Storybook refresh/sync with AI assistance.
scope-cli
Interact with the Scope benchmarking platform using the Scope CLI — submit runs, list results, manage criteria, generate reports, and administer agents, skills, and MCP servers.
scope-api
Query and control the Scope platform API for analyzing benchmark data, managing runs/requests, skills, agents, reports, and insights. Use when the user asks about SCOPE data, wants to trigger runs, check status, generate reports, or interact with the SCOPE platform programmatically.