Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Headless end-to-end / web-app testing for the Foreman e2e stage. Derive end-to-end tests from the PRD's User Flows, drive the real application the way a user would (browser flows, screenshots, accessibility checks for web apps), make them pass via the configured e2e command, and emit the FOREMAN-SUMMARY block Foreman parses.
.claude/skills/visionforge-ou-foreman-web-testing/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 10% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 17% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 27% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 11% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 16% | 0% |
(Adapted from Anthropic's web-app-testing skill and the e2e half of foreman-tdd — see NOTICE. Made stack-agnostic: the e2e runner is injected by Foreman from config.yaml (commands.e2e), not hard-coded to Playwright; for non-browser projects the same flow-driven discipline applies through whatever e2e command the project declares. Added Foreman's evidence + FOREMAN-SUMMARY contract.)
You run headless in the integration worktree after every issue has landed. Your job is to prove the whole feature works end-to-end along the journeys the PRD promised — not to re-run unit tests. Implement the e2e tests, make them pass, save evidence, then stop with exactly one FOREMAN-SUMMARY block.
## User Flows section is your test charter.commands.e2e, e.g. npx playwright test orpytest -m e2e). Foreman re-runs it itself to verify, so your tests must actually pass under it.
Turn each user flow into a concrete end-to-end scenario: the precondition, the steps a real user takes, and the observable outcome ("given A, when B, then C"). Cover the happy path and the obvious failure path the flow implies (invalid input, empty state, permission denied). Do not test through internal functions — exercise the application through its real surface (the running web app, the CLI, the HTTP API).
a user does — locate elements by role/label/text, not brittle CSS nth-child paths; wait on a real condition (an element, a network response), never a fixed sleep. Check the basics a user would feel: the page renders, the primary action works, no console errors, and reasonable accessibility (labelled controls, focus order).
requests, CLI invocations), asserting on real observable output.
Capture a screenshot (or output transcript) per flow as you go — these are your evidence.
Run the e2e command and read its output. Iterate until every derived flow passes. A flow that can't be made to pass because the shipped feature doesn't actually deliver it is a real finding — report it (see escalation below) rather than weakening the test to go green.
Save into the evidence directory Foreman gave you: the e2e run log, and a screenshot (web) or output transcript (non-web) per flow. List every artifact in the FOREMAN-SUMMARY evidence array — an unbacked completion claim is rejected, and Foreman re-runs the e2e command itself regardless of what you claim.
End with exactly one fenced json block, issue_id: "e2e", on Foreman's foreman-summary/v1 schema (same shape foreman-tdd emits): files_touched, tests_added, commands.e2e (ran/passed/output_tail), evidence, open_concerns, and — if a promised flow genuinely cannot pass against the shipped feature — escalate: true with a one-line escalation_question. Set escalate: false when the flows pass. Nothing after the block.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 5,258 | 5,111 | -3% | 1 | 1 | 0% | 226 | 1,103 | +388% | 0 | 0 | — |
case-02 | fail→fail | 7,152 | 59,172 | +727% | 1 | 1 | 0% | 310 | 1,088 | +251% | 0 | 0 | — |
case-03 | fail→fail | 5,073 | 4,621 | -9% | 1 | 1 | 0% | 280 | 1,065 | +280% | 0 | 0 | — |
case-04 | pass→fail | 13,760 | 14,420 | +5% | 1 | 1 | 0% | 2,724 | 4,013 | +47% | 0 | 0 | — |
case-05 | pass→pass | 20,030 | 13,267 | -34% | 1 | 1 | 0% | 3,725 | 3,077 | -17% | 0 | 0 | — |
case-06 | pass→fail | 3,450 | 6,079 | +76% | 1 | 1 | 0% | 610 | 2,197 | +260% | 0 | 0 | — |
case-07 | fail→pass | 10,626 | 7,551 | -29% | 1 | 1 | 0% | 1,929 | 2,131 | +10% | 0 | 0 | — |
case-08 | pass→pass | 13,113 | 11,445 | -13% | 1 | 1 | 0% | 1,821 | 3,060 | +68% | 0 | 0 | — |
case-09 | fail→pass | 8,862 | 5,495 | -38% | 1 | 1 | 0% | 1,607 | 1,887 | +17% | 0 | 0 | — |
case-10 | fail→pass | 16,682 | 14,788 | -11% | 1 | 1 | 0% | 3,025 | 3,827 | +27% | 0 | 0 | — |
case-11 | fail→pass | 15,063 | 10,502 | -30% | 1 | 1 | 0% | 2,426 | 2,698 | +11% | 0 | 0 | — |
case-12 | fail→pass | 11,305 | 8,433 | -25% | 1 | 1 | 0% | 2,041 | 2,366 | +16% | 0 | 0 | — |
case-13 | fail→pass | 12,597 | 8,540 | -32% | 1 | 1 | 0% | 2,220 | 2,297 | +3% | 0 | 0 | — |
case-14 | fail→pass | 5,122 | 4,833 | -6% | 1 | 1 | 0% | 1,014 | 1,845 | +82% | 0 | 0 | — |
case-15 | fail→fail | 4,749 | 6,549 | +38% | 1 | 1 | 0% | 168 | 1,266 | +654% | 0 | 0 | — |
case-16 | fail→fail | 15,869 | 13,522 | -15% | 1 | 1 | 0% | 2,327 | 2,877 | +24% | 0 | 0 | — |
case-17 | fail→fail | 14,709 | 7,187 | -51% | 1 | 1 | 0% | 1,974 | 1,802 | -9% | 0 | 0 | — |
case-18 | fail→fail | 10,113 | 6,019 | -40% | 1 | 1 | 0% | 1,621 | 2,077 | +28% | 0 | 0 | — |
case-19 | fail→fail | 11,147 | 3,345 | -70% | 1 | 1 | 0% | 1,598 | 1,438 | -10% | 0 | 0 | — |
case-20 | fail→pass | 12,069 | 4,642 | -62% | 1 | 1 | 0% | 2,018 | 1,601 | -21% | 0 | 0 | — |
case-21 | fail→pass | 4,102 | 3,853 | -6% | 1 | 1 | 0% | 613 | 1,451 | +137% | 0 | 0 | — |
case-22 | fail→fail | 14,721 | 2,856 | -81% | 1 | 1 | 0% | 2,335 | 1,271 | -46% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 18 counted toward the lift figure. The other 4 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +32 percentage points is the difference between those two pass rates over the 18 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.