Sprint 005: Resilience — retry/backoff/escalation #5
Reference in New Issue
Block a user
Delete Branch "feature/sprint-005"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
backoff + classifier + withRetry + escalation + rails resume/abort. 25 new tests (82 total). F5 해결. xhigh thinking tier 금지.
Sprint 005 전체 구현 — F5 (중간 끊김/타임아웃 무한대기) 해결: Resilience core: - src/resilience/backoff.ts — exponential backoff + jitter (base 1s, cap 30s) + cancellable sleep - src/resilience/classifier.ts — error → {retryable, reason} retryable: timeout, network, rate_limit, transient non-retryable: permission, config, invariant(ZodError) 휴리스틱: ETIMEDOUT/ECONNREFUSED/429 등 메시지 패턴 감지 + assertAllowedThinkingTier('xhigh' 금지) - src/resilience/retry.ts — withRetry 래퍼 non-retryable은 즉시 중단, max retries 초과시 classification 반환 - src/resilience/kill.ts — child process SIGTERM→SIGKILL grace 처리 + 전역 cleanup handler (SIGINT/SIGTERM) - src/resilience/escalate.ts — recordEscalation + EscalationNotifier + listEscalations / resolveEscalation Prisma: - Escalation 모델 추가 (pipelineId, reason, errorCategory, attempts, contextSnapshot) - Pipeline.escalations 역참조 Runner 통합: - transport.invoke 를 withRetry 로 래핑 - 실패시 classification 기반으로 자동 escalation 기록 (non-retryable만) - RunOptions 에 maxRetries / notifier 추가 CLI: - rails resume <pipeline-id> — escalated → idle 전이 - rails abort <pipeline-id> [-r reason] — 강제 종료 Tests (25 신규, 82 total pass): - backoff: 기본값/지수/캡/jitter 범위/abort - classifier: 6 error 클래스 + 3 휴리스틱 + xhigh 금지 - withRetry: 성공/재시도 후 성공/non-retryable 즉시 중단/max 초과/abort 검증: tsc --noEmit ✓ | vitest 82/82 ✓ | build ✓ | CLI ✓ Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.