From acc
Generates PHP 8.4 retry pattern infrastructure with exponential backoff, jitter, configurable strategies for transient failures in APIs, databases, and queues. Includes unit tests.
How this skill is triggered — by the user, by Claude, or both
Slash command
/acc:create-retry-patternThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Creates Retry pattern infrastructure for handling transient failures.
Creates Retry pattern infrastructure for handling transient failures.
| Scenario | Example |
|---|---|
| Transient failures | Network timeouts, temporary unavailability |
| External API calls | HTTP requests to third-party services |
| Database operations | Deadlock recovery, connection issues |
| Message processing | Queue message handling with retries |
Path: src/Infrastructure/Resilience/Retry/
BackoffStrategy.php — Enum for delay strategiesRetryPolicy.php — Configuration with shouldRetry/calculateDelayRetryContext.php — Attempt context value objectRetryException.php — Exception with attempt historyPath: src/Infrastructure/Resilience/Retry/
RetryExecutor.php — Main retry logic with callbacksSleepInterface.php — For testabilityRetryPolicyTest.php — Policy behavior testsRetryExecutorTest.php — Executor tests| Component | Path |
|---|---|
| All Classes | src/Infrastructure/Resilience/Retry/ |
| Unit Tests | tests/Unit/Infrastructure/Resilience/Retry/ |
| Component | Pattern | Example |
|---|---|---|
| Policy | RetryPolicy | RetryPolicy |
| Strategy Enum | BackoffStrategy | BackoffStrategy |
| Executor | RetryExecutor | RetryExecutor |
| Context | RetryContext | RetryContext |
| Exception | RetryException | RetryException |
| Test | {ClassName}Test | RetryExecutorTest |
final readonly class RetryPolicy
{
public function __construct(
public int $maxAttempts = 3,
public int $baseDelayMs = 100,
public int $maxDelayMs = 10000,
public float $multiplier = 2.0,
public bool $useJitter = true,
public BackoffStrategy $strategy = BackoffStrategy::Exponential,
public array $retryableExceptions = [],
public array $nonRetryableExceptions = []
) {}
public static function exponential(int $maxAttempts = 5, int $baseDelayMs = 100): self;
public static function linear(int $maxAttempts = 5, int $baseDelayMs = 500): self;
public function shouldRetry(\Throwable $e, int $attempt): bool;
public function calculateDelay(int $attempt): int;
}
final readonly class RetryExecutor
{
public function execute(
callable $operation,
RetryPolicy $policy,
?callable $onRetry = null
): mixed;
}
$policy = new RetryPolicy(
maxAttempts: 3,
baseDelayMs: 200,
retryableExceptions: [
ConnectionException::class,
TimeoutException::class,
],
nonRetryableExceptions: [
ClientException::class,
]
);
try {
$result = $retryExecutor->execute(
operation: fn() => $httpClient->get($url),
policy: $policy,
onRetry: fn($e, $ctx) => $logger->warning('Retrying...', ['attempt' => $ctx->attempt])
);
} catch (RetryException $e) {
// All retries exhausted
$deadLetter->send($message, $e);
}
| Anti-pattern | Problem | Solution |
|---|---|---|
| No Max Attempts | Infinite retries | Always set maxAttempts |
| No Backoff | Hammering service | Use exponential backoff |
| Retrying All Exceptions | Retrying unrecoverable errors | Specify retryable exceptions |
| No Jitter | Thundering herd | Enable jitter |
| Ignoring Context | Can't track attempts | Use RetryContext |
| Blocking Forever | Thread exhaustion | Set maxDelayMs cap |
For complete PHP templates and examples, see:
references/templates.md — RetryPolicy, BackoffStrategy, RetryExecutor, RetryContext templatesreferences/examples.md — HTTP client, database, message consumer examples and testsnpx claudepluginhub dykyi-roman/awesome-claude-code --plugin accImplements retry logic with exponential backoff and jitter for handling transient failures in network requests, database connections, and rate-limited APIs. Provides a reusable `withRetry` utility with configurable max attempts, shouldRetry predicate, and onRetry callback.
Generates PHP 8.4 Circuit Breaker pattern for resilience, with state management, fallbacks, metrics, factory, registry, and unit tests. Prevents cascading failures in services.
Implements Python resilience patterns: retries, exponential backoff with jitter, timeouts, and fault-tolerant decorators using tenacity. Use for transient failure handling and building robust services.