e2e-verify
Skill8 starsChanged 12 days agoMITView on GitHub
Use after implementing a user-facing feature or fix and before calling it done, when asked to "verify", "test E2E", "kiểm tra lại trên browser", or when closing a ticket or story that needs E2E evidence.
We split this skill into the rules it gives an agent
12 rules. 0 are common, 6 are distinctive, and 6 are very specific to this project.
0
Common
Most of the 4 edited versions we read keep these.
6
Distinctive
This author's own choices. Worth a look.
6
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 23
Use a real browser, in this order: Playwright MCP.
- Distinctive: line 35
(c) Network and console scanned even on PASS: No responses with status >= 400, no console errors.
- Distinctive: line 38
(e) At least one failure branch exercised: when the AC has a known failure state (payment failed, expired, rejected, no permission): the …
- Distinctive: line 39
If the failure branch cannot be driven from the browser (needs an external webhook or time travel), the AC is NOT verified: record the gap …
- Distinctive: line 45
No such place: record the side effect as unverified in the evidence file instead of claiming it.
- Very specific: line 50
Never read the bodies into context.
- Distinctive: line 53
Write the other tenant's IDs and markers one per line to a file.
- Very specific: line 54
Run grep -r -o -n -F -f <ids file> <dump folder> > <hits file>.
- Very specific: line 67
Write e2e/reports/<id>-<ISO>.json (or the project's equivalent), tracked in git:
- Very specific: line 76
After a fix, re-run only the failed ACs plus the ACs with any file on their path the fix touched (route, component, handler, service, …
- Very specific: line 77
After 3 FAIL cycles on the same AC, stop patching and switch to the root-cause skill.
- Distinctive: line 78
Never report "works" for a flow that was not actually exercised.
“Common” is measured: kept by at least 6 in 10 of the 4 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
e2e-verify
Typecheck, build, and unit tests prove the code compiles, not that the screen works. "Wired to the API" is not the same as "a user can complete the flow".
0. Prerequisites (missing = blocked, not a reason to skip)
- Seed data and test personas exist for every role the AC involves (e.g. admin vs. regular user; they often hit different code paths and FKs).
- Login is bypassed with a saved session state per persona (Playwright storage state, injected cookies/localStorage), so no tokens are spent on the login flow every run.
- A missing prerequisite that is small and local to the AC is in scope: build it first (a persona and saved session for the roles this AC needs, a seed for this AC's own data).
- A larger setup (a new seed framework, shared fixtures, auth bypass infrastructure) is a question for the user per
ask-or-decidesection 4; mark the AC blocked until it is answered and keep verifying the ACs that do not need it. - Either way, never record PASS for an AC without its prerequisites.
1. Drive the UI like a user
- Use a real browser, in this order: Playwright MCP; when it is not available,
chrome-devtools-axi, invoked on every call asnpx -y --prefer-offline chrome-devtools-axi <command>; the project's own tool only when the project'sAGENTS.mdnames one. This skill owns that order; other skills point here. - Interact through the accessibility tree (role + label:
button "Save",textbox "Email"), never hard-coded CSS selectors. - One AC = one action sequence that follows its Given/When/Then.
- Prioritize ACs marked stale or changed since last verification.
2. An AC counts as verified only when ALL hold
- (a) Submitted, not just loaded. Any form, dialog, or drawer is submitted and the result read: success plus data visible, or the backend error shown on the right field. Opening a screen and taking a screenshot does not count.
- (b) Every select/combobox the AC touches has at least one ENABLED option with a non-empty value. Placeholders ("Select...", "No items found", disabled options) do not count.
- (c) Network and console scanned even on PASS. No responses with status >= 400, no console errors. Scanning only on FAIL never sees a 403 silently swallowed into an empty list.
- (d) Data created through the UI in this session, not hand-seeded into the one convenient shape and read back.
- (e) At least one failure branch exercised when the AC has a known failure state (payment failed, expired, rejected, no permission): the system enters that state AND the user still has a way out. If the failure branch cannot be driven from the browser (needs an external webhook or time travel), the AC is NOT verified: record the gap and cover it with a sequence test at the integration level.
Real example: an API returned 200 with every row, but the account picker in a "create bill" dialog was completely empty because the FE filtered out rows that only seeded data could make valid. Checks (b) and (d) catch this; typecheck, lint, and tests do not.
- Side effects outside the browser (email, SMS, webhooks to third parties) are verified where they land: the local test inbox (Mailpit or the Supabase local Inbucket) or the provider's sandbox log named in the project's agent setup block. No such place: record the side effect as unverified in the evidence file instead of claiming it.
3. Multi-tenant leak scan (multi-tenant apps only)
Once at the end of each flow, check that no API response body from the session contains an ID or marker string belonging to another tenant.
Never read the bodies into context; save them to files and count hits with grep:
- Save the bodies under one dump folder: Playwright MCP
browser_network_requests(filter: "/api/",filename) for the index list, thenbrowser_network_requestwithpart: "response-body"and afilenameper request; or a HAR from the project's tool. - Write the other tenant's IDs and markers one per line to a file.
- Run
grep -r -o -n -F -f <ids file> <dump folder> > <hits file>; wc -l < <hits file>; head -5 <hits file>and read only that output.
Any hit is an immediate FAIL, whether or not the AC mentions isolation.
4. On FAIL, trace the backend
Get the trace_id/request id from the failing response (or the timestamp) and look up the structured backend logs: on a deployed environment with betterstack-logs section 4, locally in docker compose logs or the dev server stdout.
Report the UI symptom together with the backend error and stack.
Output: PASS and FAIL both leave evidence
An asymmetric report is the root problem: FAIL leaves a file, PASS leaves only the agent's word, yet PASS is what people need to trust.
Write e2e/reports/<id>-<ISO>.json (or the project's equivalent), tracked in git:
{"id": "US-xx or TICKET-123", "verdict": "PASS|FAIL", "startedAt": "", "finishedAt": "", "commit": "<full SHA of the head that was tested>", "personas": [], "routes": [], "failures": []}- PASS: the evidence file is what allows closing the story/ticket. No file, no close.
- Repo opted in to
feature-status: record each AC the run covered with itsaccommand,--tier e2e --result pass --evidence <this file>on PASS and--result failon FAIL; the file'sidmust be the status file's ID. - FAIL: add a screenshot and failure details, go back to fixing; do not close.
- After a fix, re-run only the failed ACs plus the ACs with any file on their path the fix touched (route, component, handler, service, query, migration;
git diff --name-only <evidence commit>..HEAD), not the whole suite; when unsure whether a file is on an AC's path, re-run it. - After 3 FAIL cycles on the same AC, stop patching and switch to the
root-causeskill. - Never report "works" for a flow that was not actually exercised; say exactly what was skipped and why.
Other versions5 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 5
- bifrost-proxy/bifrost★ 167same name
- juanitourquiza/shipframe★ 4same name
- miinhho/skills★ 2same name
- dennisrongo/claude-skills★ 1same name
- Robbyfree24/ai-dev-pipeline-★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository27 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- releaseSkill
- ask-or-decideSkill
- axiSkill
- betterstack-logsSkill
- bug-triageSkill
- chrome-devtools-axiSkill
- environmentsSkill
- feature-buildSkill
- feature-statusSkill
- fe-guardrailsSkill
- flow-traceSkill
- fresh-reviewSkill
- gnhfSkill
- harness-mapSkill
- jira-bug-hunterSkill
- knowledge-placementSkill
- logging-standardSkill
- project-initSkill
- root-causeSkill
- security-passSkill
- server-touchSkill
- stowSkill
- verify-loopSkill
- visionSkill
- worktree-flowSkill
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
Reviews can't be read right now.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

