Pre-computed context
Current branch: !git branch --show-current 2>/dev/null || echo "unknown"
Working tree status: !git status --porcelain 2>/dev/null | head -20 || echo "clean"
Purpose
Autonomous live verification of a running application: start it, navigate, interact, screenshot, assert. UI changes follow the mandatory evidence contract in context/e2e.md; non-UI runtime surfaces route to the smoke-test playbook. The e2e-orchestrator configuration (start command, prerequisite tooling, degraded fallback) comes from the consuming project's conventions — its orchestrator (Aspire, docker-compose, tilt, a dev-server script) and any documented evidence requirements govern.
Arguments
$ARGUMENTS — optional scenario description. non-ui routes directly to the non-UI playbook.
Step 0: Route
| Signal | Context file |
|---|---|
| UI flows, browser evidence, API + UI orchestration | context/e2e.md |
| Non-UI runtime surface (library, MCP server, hooks, scripts, infrastructure) | context/non-ui.md |
UI changes (Blazor / Razor / HTML / CSS / JS shipped to browser) MUST use the e2e route — the UI evidence contract is mandatory there.
Step 1: Prerequisites (MANDATORY — hard-fail if missing)
Check tool availability per the prerequisite matrix in context/e2e.md. When the consuming project names a prerequisite orchestrator tool/MCP, its absence hard-fails — STOP and report what's missing and how to fix it; do not attempt workarounds.
On a hard-fail, STOP and write a structured verification-environment gap report to the run's evidence output before stopping. The report lists what is missing — each key, CLI, MCP, or environment the run needs — and what the operator must provide to make the run possible. The STOP still holds; the gap report is its actionable half, so the operator receives a precise list of what to supply rather than a bare failure.
Step 2: Resolve run config
Two keys govern this run: recording (video | gif | off) and browser_mode (headed | headless). They live in the consumer-tracked surface .claude/testing/e2e.md; context/e2e-config.md owns their definitions, defaults, and precedence. Resolve them before driving:
- Anchor at the repo root, then read every layer of the surface that exists — user-global, team, and local overlay — and merge
recordingandbrowser_modeper key. Report which layer supplied each effective value. The generic layer mechanics (anchoring, reading every layer, provenance, soft-degrade) are the layering contract's — see the config-cascade contract; this step only names the surface path, the keys, and the per-key merge. - An explicit instruction in the session prompt overrides the file layers for that run — the keys are defaults only. The precedence ladder is in context/e2e-config.md.
Step 3: Drive the run (subagent-isolated)
Delegate the drive loop to a subagent: it starts the app, navigates, interacts, and captures evidence, returning only the evidence paths. The orchestrator consumes those paths — it never carries the browser session in its own context.
Pass the resolved config through to the executor:
browser_mode→ the/playwright:playwrightsession invocation. The executor owns the headed/headless flag spelling;run-e2esupplies the resolved value.recording→ the capture path:videorecords via the playwright CLI,gifviagif_creator,offkeeps the evidence-contract screenshots as the floor.
The workflow steps themselves live in context/e2e.md.
Handoff
- Surface verification available → when the bundled
/verifycommand is present (Claude Code ≥2.1.145), delegate surface verification to it first and consume its findings; when absent, the orchestrator path in this skill runs unchanged as the fallback - All scenarios pass →
/verification:confirm outcomewhen theverificationplugin is installed (composes intent + evidence; chains back here when needed); otherwise report the captured evidence for outcome sign-off directly - Visual bugs or API errors found →
/testing:diagnose - Scenario planning needed first →
/testing:plan
What this skill does NOT do
- Does not own browser-automation mechanics —
/playwright:playwright(when the playwright plugin is installed) covers sessions, snapshots, tracing, Windows quirks; this skill owns the broader orchestrator + API + UI story - Does not replace
/verification:confirm— that skill orchestrates the mechanical prerequisite (build+test+lint) + outcome verification
Gotchas
- Semantic locators ONLY — accessibility-based element refs from snapshots, never CSS selectors or XPath that break on cosmetic changes
- Orchestrator version coupling + health-check waits — wait for the orchestrator's health signal before driving flows; don't poll blindly
- Playwright CLI vs MCP token budget (~27K vs ~114K per workflow) — CLI by default; detail in context/e2e.md