create-verification-skill
Create a verification skill
Every serious project needs a scripted way to drive the real app and prove behavior: launch it, exercise a feature the way a user would, and capture evidence. This skill generates that as a project-local skill (<skills-dir>/verify-<app>/) tailored to the repo. <skills-dir> is the project-skill directory the repo already uses (.claude/skills/, .agents/skills/, .cursor/skills/); use .claude/skills/ only when none exists. You write the generator's output for the next agent, not for a human: it will be read cold, mid-task, by an agent that has never seen the app.
1. Interview the repo, not the user
Answer these from the codebase and only ask the user what you cannot observe:
- Surface: what does a user actually touch? A web UI, a CLI/TUI, a desktop app, an API, a mobile app, a library? A repo can have several; pick the primary one and note the rest.
- Run: how does the app start locally? Prefer the repo's own documented dev command (package scripts, Makefile, README quickstart). Note ports, env vars, seed data, auth.
- Drive: how can an agent interact with it programmatically? List the repo's project skills and smoke scripts first: when one already launches or drives the app, the generated skill hands that surface to it and covers only what it lacks. Then existing harnesses — Playwright/Cypress specs, expect scripts, PTY helpers, curl-able endpoints, a debug port. Only then pick a generic recipe: browser/CDP for web and Electron, a tmux/PTY harness for CLI/TUI, plain HTTP for services.
- Observe: what evidence can be captured? Screenshots, terminal transcripts, response bodies, logs, exit codes, DB state.
- Isolate: can two instances run side by side (ports, data dirs, profiles)? If not, say so in the generated skill: refusing to double-drive a shared instance beats corrupting the user's session. When isolation changes HOME or cwd, a version manager (mise, asdf, nvm) can resolve a different runtime: resolve each runtime to an absolute path from the repo before isolating, put it first on PATH for the children, and have Doctor check the runtime version inside the isolated environment.
If the checkout doesn't build or start as-is, fix that first (or report it precisely) before generating. When the host cannot run the stack (container runtime, kernel modules, VPN), report the failing command and stop rather than proving in a stand-in; on Linux, when container networking or overlay mounts fail with EINVAL or EOPNOTSUPP, check ls /lib/modules/$(uname -r) and findmnt /var/lib first; a skill written against a broken base teaches wrong steps. When an irrelevant missing asset blocks startup (a static dir the API never serves, a sample config), the generated skill may create it, clearly marked as verification scaffolding, and remove it in cleanup.
2. Generate the skill
Write <skills-dir>/verify-<app>/SKILL.md with YAML frontmatter (name: verify-<app> and a description that names the app, the surface, and when to reach for it — without frontmatter the skill never registers) and these sections, each grounded in what the interview actually found (no placeholders left):