Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
shiplightai avatar

Resilience Review

  • 1 installs
  • 2 repo stars
  • Updated April 19, 2026
  • shiplightai/claude-code-plugin

Test how an app behaves under network failures, API errors, slow connections, and edge cases using browser-based fault injection.

About

Systematically tests an application's unhappy paths - network failures, API errors, missing data, and edge cases - using browser-based fault injection. A developer uses it before launching a user-facing feature or after production incidents caused by unhandled errors.

  • Browser-based fault injection and edge-case testing
  • Grounded in Google SRE and chaos engineering with YAML regression tests

Resilience Review by the numbers

  • 1 all-time installs (skills.sh)
  • Ranked #1,750 of 2,153 Testing & QA skills by installs in the Skillselion catalog
  • Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/shiplightai/claude-code-plugin --skill resilience-review

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs1
repo stars2
Last updatedApril 19, 2026
Repositoryshiplightai/claude-code-plugin

What it does

Test how an app behaves under network failures, API errors, slow connections, and edge cases using browser-based fault injection.

Files

SKILL.mdMarkdownGitHub ↗

Resilience Review

Evaluate how your application behaves when things go wrong — network failures, API errors, slow connections, missing data, and edge cases. Most apps are built for the happy path; this review systematically tests the unhappy paths that real users encounter.

When to use

Use /shiplight:resilience-review when:

  • Before launching a user-facing feature
  • After adding new API integrations or data sources
  • When reliability is critical (healthcare, finance, e-commerce checkout)
  • After production incidents caused by unhandled errors
  • When moving from prototype to production quality

Standards Referenced

  • Google SRE Principles — Error budgets, graceful degradation
  • Netflix Chaos Engineering Principles — Verify steady state, inject real-world failures
  • OWASP Error Handling — Secure and user-friendly error responses
  • Nielsen Norman Group — Error message usability heuristics

Phase Overview

Phase 1: EDUCATE   → Why resilience matters and what we test
Phase 2: SCOPE     → Map failure points, dependencies, critical flows
Phase 3: ANALYZE   → Browser-based fault injection and edge case testing
Phase 4: REPORT    → Findings with evidence and user impact assessment
Phase 5: REMEDIATE → Fix guidance + YAML regression tests

---

Phase 1: Educate

Why this matters: Users don't experience your app in ideal conditions. 53% of mobile visits are abandoned if a page takes >3 seconds. Error pages with no guidance increase support tickets 5x. A blank screen is the worst possible failure mode — it tells the user nothing and offers no recovery path. Resilient apps maintain trust even when backend systems fail.

This review simulates real-world failure conditions in the browser and evaluates how your UI responds.

---

Phase 2: Scope

Gather context

1. Auto-detect from codebase:

  • API calls and their endpoints
  • Error boundary components (React ErrorBoundary, Vue errorHandler)
  • Loading state implementations (spinners, skeletons, suspense)
  • Empty state components
  • Retry logic / error recovery patterns
  • Offline support (service workers, cache strategies)
  • Third-party service dependencies

2. Ask the user (one at a time):

  • Target URL: Where is the app running?
  • Critical user flows: Which flows must never show a blank screen? (auto-detect from routes)
  • Key API dependencies: Which APIs does the frontend depend on? (auto-detected)
  • Known fragile areas: Any pages/features that break frequently? (optional)

3. Map failure points:

  • API endpoints the frontend calls (and what happens if each fails)
  • Third-party dependencies (CDN, auth provider, analytics, maps, payment)
  • Data-dependent UI (what shows when data is empty, missing, or malformed)
  • User input edge cases (long text, special characters, empty submissions)

---

Phase 3: Analyze

Open a browser session with new_session using record_evidence: true. Run all applicable check categories.

Category A: Error Handling (ERR)

Check IDCheckStandardMethod
ERR-01API errors show user-friendly message (not blank screen)UX best practiceMock API to return 500, check UI response
ERR-02Network timeout shows appropriate stateUX best practiceMock network delay (30s), check UI
ERR-03404 page exists and is helpfulUX best practiceNavigate to non-existent route
ERR-04JavaScript errors don't crash the pageError boundariesInject JS error, check if page recovers
ERR-05Error messages are actionableNN/g heuristicsCheck error messages for: what happened, why, what to do
ERR-06Errors don't expose technical detailsOWASPCheck error messages for stack traces, SQL, internal paths
ERR-07Form validation errors are clear and positionedUX best practiceSubmit invalid forms, check error placement and text
ERR-08Error states allow retry without page refreshUX best practiceAfter error, check for retry button or recovery action
ERR-09Concurrent error handling (multiple simultaneous failures)ResilienceMock multiple API failures, check UI doesn't cascade
ERR-10Error logging doesn't expose PIIOWASP / PrivacyCheck get_browser_console_logs during errors

Browser validation: Use CODE blocks to intercept network requests via page.route() to simulate failures. Check UI state after each failure. Use get_browser_console_logs for JavaScript errors.

// Example: Mock API 500 error
await page.route('**/api/**', route => {
  route.fulfill({ status: 500, body: JSON.stringify({ error: 'Internal Server Error' }) });
});

Category B: Graceful Degradation (DEG)

Check IDCheckStandardMethod
DEG-01Page works with JavaScript disabled (basic content)Progressive enhancementDisable JS, check if content is accessible
DEG-02Page works on slow connection (3G simulation)PerformanceThrottle to Slow 3G, check load behavior
DEG-03Non-critical features degrade without breaking critical onesGraceful degradationDisable third-party scripts, check core functionality
DEG-04Offline state is handled (if applicable)PWA best practiceGo offline, check UI state and messaging
DEG-05Third-party service failure doesn't block page loadResilienceBlock third-party domains, check page loads
DEG-06Image loading failure shows fallbackUX best practiceBlock image URLs, check for alt text/placeholder
DEG-07Font loading failure doesn't hide textFOUT handlingBlock font URLs, check text remains visible
DEG-08Feature detection over browser sniffingProgressive enhancementCheck code for navigator.userAgent vs feature detection

Browser validation: Use page.route() to block specific resources. Use CDP to simulate network conditions. Disable JavaScript via browser settings. Verify each degradation scenario.

Category C: Empty & Edge States (EDGE)

Check IDCheckStandardMethod
EDGE-01Empty data state shows helpful messageUX best practiceNavigate to pages with no data, check display
EDGE-02Pagination handles zero resultsUX best practiceSearch for nonexistent term, check pagination
EDGE-03Long text doesn't break layoutDefensive CSSEnter very long strings (500+ chars), check overflow
EDGE-04Special characters in input don't break UIInput handlingEnter <script>, "'&<>, emoji, Unicode
EDGE-05Large data sets don't freeze UIPerformanceLoad pages with maximum data, check responsiveness
EDGE-06Rapid user actions don't cause duplicate submissionsState managementDouble-click submit buttons, rapid nav
EDGE-07Back/forward navigation maintains stateHistory managementFill form, navigate away, come back
EDGE-08Refresh preserves expected stateState persistenceRefresh during multi-step flow, check state
EDGE-09Concurrent tab/session behaviorSession managementOpen same page in two tabs, perform actions
EDGE-10Maximum file upload size handledInput validationUpload oversized file, check error message

Browser validation: Navigate to pages and test each edge case. Use act to interact with forms, submit empty/extreme data. Use JavaScript to check for UI overflow, frozen states.

Category D: API Contract & Data Handling (API)

Check IDCheckStandardMethod
API-01UI handles all HTTP error codes gracefullyAPI contractMock 400, 401, 403, 404, 422, 429, 500, 503
API-02UI handles null/undefined fields without crashingDefensive codingMock API response with null fields
API-03UI handles empty arrays/objectsDefensive codingMock API response with empty collections
API-04UI handles unexpected data typesDefensive codingMock API response with wrong types
API-05Loading states shown during API callsUX best practiceAdd 2s delay to API, verify loading indicator
API-06Race conditions handled (stale responses)State managementTrigger rapid sequential requests, verify latest wins
API-07Rate limiting (429) handled with user feedbackAPI contractMock 429 response, check UI feedback
API-08Authentication expiry handled mid-sessionSession managementMock 401 during session, check redirect to login

Browser validation: Use page.route() to mock each response scenario. Verify UI state after each mock.

Category E: Recovery & User Communication (REC)

Check IDCheckStandardMethod
REC-01Retry mechanisms exist for transient failuresResilienceMock intermittent failure, check auto-retry
REC-02User can manually retry after failureUX best practiceAfter error, verify retry action available
REC-03Progress is not lost on errorsUX best practiceFill long form, trigger error, check data persists
REC-04User is informed of degraded functionalityCommunicationWhen features fail, check for degradation notice
REC-05Recovery actions are clear and accessibleNN/g heuristicsAfter each error type, evaluate recovery UX
REC-06Status indicators for background operationsUX best practiceStart async operation, verify progress feedback

Browser validation: Use fault injection then verify recovery paths.

---

Phase 4: Report

Generate a structured report saved to shiplight/reports/resilience-review-{date}.md:

# Resilience Review Report
**Date:** {date}
**URL:** {url}
**Critical flows tested:** {list}
**API dependencies tested:** {count}
**Failure scenarios simulated:** {count}

## Overall Score: {X}/10 | Confidence: {X}%

## Score Breakdown
| Category | Score | Findings |
|----------|-------|----------|
| Error Handling (ERR) | 5/10 | 2 critical, 1 high |
| Graceful Degradation (DEG) | 6/10 | 1 high, 2 medium |
| Empty & Edge States (EDGE) | 4/10 | 1 critical, 3 high |
| API Contract (API) | 7/10 | 1 high, 1 medium |
| Recovery (REC) | 3/10 | 2 high, 1 medium |

## Failure Matrix
| Failure Scenario | Expected Behavior | Actual Behavior | Status |
|-----------------|-------------------|-----------------|--------|
| API returns 500 | Error message + retry | Blank screen | FAIL |
| Network timeout | Loading → timeout message | Infinite spinner | FAIL |
| Empty data set | "No results" message | Blank page | FAIL |
| ... | | | |

## Findings
(structured findings with evidence, screenshots of failure states)

Confidence Scoring

  • 90-100%: Fault injected and failure behavior verified in browser
  • 70-89%: Code analysis shows missing error handling, not validated at runtime
  • 50-69%: Pattern-based assessment (e.g., no error boundary detected)
  • Below 50%: Don't report

---

Phase 5: Remediate

1. Fix guidance (example)

#### ERR-01: API error shows blank screen instead of error message
**Impact:** Users see empty page, think app is broken, leave
**File:** src/pages/Dashboard.tsx:45
**Current:** `const data = await fetch('/api/data').then(r => r.json())`
**Problem:** No error handling — fetch throws on network error, .json() throws on non-JSON response
**Fix:**
- Wrap in try/catch
- Add error state: `const [error, setError] = useState(null)`
- Render error UI with retry button
- Add React Error Boundary as fallback

2. YAML regression test

- name: err-01-api-error-shows-message
  description: Verify API failure shows user-friendly error message instead of blank screen
  severity: critical
  standard: UX-Error-Handling
  steps:
    - CODE: |
        await page.route('**/api/data**', route => {
          route.fulfill({
            status: 500,
            contentType: 'application/json',
            body: JSON.stringify({ error: 'Internal Server Error' })
          });
        });
    - URL: /dashboard
    - WAIT_UNTIL: Page has finished attempting to load data
      timeout_seconds: 15
    - VERIFY: An error message is visible explaining that data could not be loaded
    - VERIFY: A retry button or recovery action is available to the user
    - VERIFY: The page is NOT blank — navigation and header are still visible

Save all YAML tests to shiplight/tests/resilience-review.test.yaml.

---

Tips

  • Use page.route() in CODE blocks — it's the primary tool for fault injection
  • Test the most critical user flows first (checkout, signup, core feature)
  • A blank screen is always a CRITICAL finding — it's the worst failure mode
  • Check get_browser_console_logs for uncaught promise rejections — they indicate missing error handling
  • Edge case testing (EDGE category) often reveals the most bugs per minute spent
  • Close session with close_session and use generate_html_report for evidence

Related skills

Testing & QAmonitoring

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.