Install any skill in seconds. Free to start, no credit card required.
Get Started Free →When asked to design end-to-end test scenarios for a product, feature set, or release, shape them as realistic multi-step user journeys that carry state forward across screens and feature boundaries toward a goal — selected by usage × risk over critical paths and cross-feature flows — instead of a flat list of isolated single-screen checks. Use when deciding WHICH end-to-end journeys to test and how each should be built. Do NOT use to write Playwright/Cypress/Selenium test code, to pick input values for one function, or to write the overall multi-level test plan.
.claude/skills/e2e-scenario-design/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | — | — |
| case-08 | ✗→✓ | ▲ Improved | — | — |
| case-13 | ✗→✓ | ▲ Improved | — | — |
| case-12 | ✗→✓ | ▲ Improved | — | — |
| case-03 | ✗→✓ | ▲ Improved | — | — |
Someone asks you to design the end-to-end tests for a product or feature — "what E2E scenarios should we run for the checkout flow," "design the end-to-end tests for our new dashboard." Left to itself, the model produces a flat inventory of isolated checks: "verify the login page loads, verify the search bar returns results, verify the settings toggle saves, verify the profile page shows the name…" Each item exercises one screen or one action in isolation. That is not end-to-end testing — it is a feature list with the word "verify" in front of each line. It re-tests what unit and integration tests already cover, spreads effort evenly across everything, and never exercises the thing E2E exists to catch: whether a real user can complete a real goal across the seams where features hand state to each other.
The discipline: an E2E scenario is one realistic user journey toward a goal, built from an ordered sequence of steps where each step depends on state the previous steps created, and it passes only when an observable end-state proves the goal was reached. You choose the few journeys worth this by usage × risk, and you spend the coverage on critical paths and cross-feature flows — not on re-clicking every screen.
A journey has all four of these. A single-screen check has none of them.
data," not "test the signup page." The scenario is named by the outcome, not the screen.
the account the next step logs into; creating a project produces the project the invite step shares. If any step could be reordered or run alone without breaking, it is not part of a journey — it is an isolated check wearing a step's clothes.
feature or service to another — signup → billing, upload → processing → notification, order → fulfillment → email. These handoff seams are exactly what unit and integration tests each miss, because each side is tested against a stub of the other.
confirms the goal: the teammate sees the shared project, the confirmation email arrives, the dashboard reflects the new data. "No errors were thrown" is not an end-state.
You cannot E2E everything — these tests are slow and brittle, so a handful of deep journeys beats dozens of shallow ones. Choose deliberately:
onboard, complete a purchase, recover a lost password, export a report, invite a collaborator).
everyone hits are the ones a break hurts most broadly.
data loss, lockout, security). Payment and auth journeys sit high even at lower usage.
then the cross-feature handoff journeys (where features exchange state — the seams), then a small number of high-value alternate/recovery journeys (the path when something goes wrong: a declined card, a conflict on sync). A realistic set is a handful of deep journeys, not an exhaustive matrix — say which you are deliberately not covering at this level.
The rule of thumb: usage tells you what to cover, risk tells you how deep, and the cross-feature seams are where you look first because no lower-level test sees both sides at once.
E2E is the wrong level for exhaustive input coverage. Field-by-field validation, every error branch for one input, and isolated component behavior belong at the unit / integration level, where they run in milliseconds and pin the failure precisely. An E2E scenario should include an alternate path only when the journey itself changes (a declined payment routes the user somewhere new) — not to enumerate the fifteen ways one form field can be invalid. If a bug can be caught one level down, catch it there and keep the journey focused on the integrated flow.
For every journey you select, write it as:
cart).
carries (a real product added, a real address entered) rather than placeholder values.
Request: "Design the end-to-end scenarios for our store's new guest-checkout feature."
A single-screen inventory would list: "test the cart page, test the address form, test the card form, test the confirmation page." Instead, journeys selected by usage × risk:
Preconditions: catalog seeded, no account. Steps: browse → add a specific in-stock item to cart → enter a valid shipping address → pay with a valid test card → land on confirmation. Boundaries: cart → payment gateway → order service → email. End-state: order appears in the order store and a confirmation email is captured. This is the journey almost every user takes and the one where a break costs money.
is declined; the user sees a clear error, corrects to a valid card, and completes. End-state: order succeeds on the second attempt, no duplicate charge. Included because the journey branches, not to enumerate card errors.
and the created account shows the just-placed order. Boundary: guest order → account creation → order-history. End-state: the new account's history lists the order.
error — pushed down to integration/unit tests on the address and payment validators; catalog browsing/filtering — its own journey, not this feature.
Three or four deep journeys that each cross real seams beat twenty screen-by-screen checks.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.5-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 13 cases were attempted. The headline lift of +46 percentage points is the difference between those two pass rates over the 13 comparable cases.
Other measured skills in the registry, with their headline benchmark lift.