ai-builder-club/verifier-setup
> Set a repo up to prove engineering-task work actually works before it ships. Investigates the repo, ensures a one-command dev stack (`dev-local`) exists, asks whether verification runs locally or in a sandbox (crabbox), confirms/installs the committed `/verify` skill (per-task verification SOP — spawn a verifier sub-agent → drive the app → screenshot/video proof → open a PR with the proof embedded), the `/dev-local` skill + script, and the installed driver skill. Use when someone says "set up verification", "make this repo verifiable", "scaffold a verify skill", "set up the verifier".
npx skills add https://github.com/AI-Builder-Club/skills --skill verifier-setup
/verify skillGoal: leave the repo able to *prove an engineering task works before it ships* —
run once, and it wires up everything the per-task /verify loop needs.
You are setting up — not verifying anything yourself right now. The /verify
template lives at assets/verify.template.md (next to this skill). Parallels
dev-local-setup (which generates a script + its skill doc): a setup skill that
leaves behind reusable, repo-specific artifacts.
Running verifier-setup end-to-end leaves the repo with:
/verify skill — .claude/skills/verify/SKILL.md, the repo-tailoredper-task verification SOP (spawn a verifier sub-agent → drive the app →
screenshot/video proof → open a PR with the proof embedded). Generated in Step 5.
/dev-local skill + its script — scripts/dev-local.sh and.claude/skills/dev-local/SKILL.md, via dev-local-setup (Step 2) if not
already present. The one-command stack /verify depends on.
playwright-cli skill for web apps (Step 2);for non-web, the concrete exercise tool confirmed present.
Before creating anything, take stock — the repo may already have some of this,
under whatever name or layout its team chose. Look for the capability, not a
specific filename; the paths below are only examples. For each, decide **reuse
as-is / adapt-extend / create fresh** — never blindly overwrite working setup:
Makefile/Procfiletarget, docker-compose, package scripts (e.g. scripts/dev-local.sh, but any
form counts).
team's own convention.
(e.g. the playwright-cli skill), or the relevant API/CLI client.
link gets published (a release, bucket, CI artifacts, etc.).
Every later step is conditional on this inventory: if a capability exists and works,
reuse and adapt it (fill gaps, don't regenerate); only create what's missing.
Discover the real facts the generated skill will hardcode:
server on a port), an API/service (HTTP endpoints, no UI), a CLI, or a
desktop/mobile app? This picks the driver.
Step 0)? Note the up-command and the app URL/port. If none, Step 2 handles it.
verifier can mint a session with (see e2e-setup)? Record it, or "n/a".
unit, existing e2e commands) from package.json/Makefile/turbo.json/etc.
pr-evidenceGitHub prerelease via gh release upload is the default; a bucket/CI artifact
works too).
For each, act on what Step 0 found — reuse if present, adapt if partial, create only
if missing. Each check is idempotent; a no-op on what's already there:
script, Make/Procfile target, compose, package scripts), reuse it — read it for
the up-command/port/services and move on (extend only if a needed service is
missing). If there's none, scaffold one via dev-local-setup (don't hand-roll a
launcher here). The generated /verify just needs a reliable one-command up.
playwright-cli skill (it documents + wrapsthe browser driver). Ensure its binary is callable too (`npx --yes @playwright/cli
--version; install it + the chrome` channel if missing). This closes the usual
local gap where the browser driver was assumed but never installed.
API, the built binary for a CLI). No browser skill needed.
evidence/ is gitignored (proof output lands there).Present the choice (default and recommend local — it's simpler to stand up):
scripts/dev-local.sh up). Best for asingle task at a time. Recommend this unless they need parallelism.
or a fixed-port/single-instance stack. If chosen and not yet set up, scaffold via
crabbox-setup; the generated skill drives the app in-box via cbx.sh pw.
Record the pick as the generated skill's default RUN_MODE (the other stays a
documented fallback).
State the detected driver and confirm with the user (default playwright-cli
for web apps). For non-web, name the concrete tool (e.g. curl/an HTTP script,
the built CLI). This becomes DRIVER in the generated skill.
.claude/skills/verify/SKILL.mdIf a prior verification skill/SOP already exists (Step 0), update it in place —
refresh the repo-specifics/placeholders, preserve any hand-edits the team added;
don't clobber. Otherwise copy assets/verify.template.md → the repo's skills dir
(.claude/skills/verify/ or the repo's convention) and fill every {{...}}
placeholder from Steps 1–4:
STACK_UP, APP_URL, RUN_MODE(+RUN_MODE_NOTE), DRIVER(+DRIVER_INSTRUCTION),
AUTH_HELPER(+AUTH_INSTRUCTION), EXERCISE, REGRESSION_CMDS, EVIDENCE_UPLOAD,
DATE. Delete branches that don't apply (e.g. drop the browser/video language for
a non-web repo). Keep it to one screen — it's an SOP the agent follows, not an essay.
Commit the generated skill (+ any .gitignore/dev-local changes). Tell the user:
/verify before opening a PR (or when asked to verify), on abranch with changes committed";
gh authfor evidence upload).
the driver skill, e2e, evidence gitignore, the verify skill itself — is inventoried
first (Step 0) and reused/extended when it already exists. Only create what's
genuinely missing; preserve working setup and team hand-edits.
repo — the generated skill hardcodes real facts, not conventions.
evidence/ existbefore the /verify skill ships, so it never fails on a missing tool.
a stdout-assertion SOP. Match the template to the repo; cut what doesn't apply.
/verify runs.Take ai-builder-club/verifier-setup from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference npx.
Without those the skill loads but fails at the first command.