pr-verify/SKILL.md
Use when the user wants to verify a PR's feature works at runtime by booting the dev server, exercising the affected UI via Chrome DevTools MCP, and posting a screenshot summary back to the PR. Idempotent — skips if `verified` or `verify-failed` is already on the PR. Trigger phrases - "/pr-verify", "verify this PR", "runtime check the pr".
npx skillsauth add paulund/skills pr-verifyInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Boot the dev server, drive the affected UI via Chrome DevTools MCP, and post a runtime-verification comment + screenshot to the PR. Idempotent: skips if a verified or verify-failed label is already set.
When invoked with arguments, the first line of the prompt may carry a context envelope as JSON:
{ "pr": 123, "branch": "agent/issue-582-foo" }
This skill assumes the Chrome DevTools MCP server is connected. If not, post a verify-failed comment explaining the missing MCP and stop.
gh pr view <pr> --json labels --jq '.labels[].name'
If verified or verify-failed is already on the PR, skip and exit with a one-line report. The chain or poller can re-trigger by removing the label.
gh pr view <pr> --json number,title,body,closingIssuesReferences
gh pr diff <pr> --name-only
For each closingIssuesReferences entry, read the issue body — its acceptance criteria are what pr-verify proves.
From the file list, identify the entry points the change touches:
app/, pages/, or framework equivalentsIf the change is purely backend / infra (no UI surface), post a verified (backend-only) comment and add verified label without booting the browser.
Detect the dev script from package.json and start in background:
# Pick the first that exists in package.json scripts
pnpm dev # or: npm run dev / yarn dev / bun dev
Wait for the readiness banner (typical localhost:3000). Cap at 60 seconds; on timeout, post verify-failed with the boot log.
Using the connected Chrome DevTools MCP, for each acceptance criterion:
page.evaluate(() => window.console.errors) or equivalent).If a step throws or the console has uncaught errors, mark the run as verify-failed and capture the error + screenshot.
Kill the dev-server process (SIGTERM, then SIGKILL after 5s if still alive). Don't leave it running.
gh pr comment <pr> --body "$(cat <<EOF
## Runtime verification
**Status:** ${pass ? "✅ Passed" : "❌ Failed"}
### Acceptance criteria
- [ ] criterion 1 — pass / fail (screenshot link)
- [ ] criterion 2 — pass / fail
### Console errors
- [error message + stack | none]
### Screenshots
- [list of screenshot URLs / paths committed under .verify-screenshots/<pr>/<step>.png]
EOF
)"
If passed: gh pr edit <pr> --add-label verified
If failed: gh pr edit <pr> --add-label verify-failed
{ "pr": <N>, "verdict": "pass" | "fail" | "skip-backend-only", "criteria": <count>, "consoleErrors": <count> }
try/finally mental model).verified or verify-failed is already on the PR.development
Use when implementing any logic, fixing any bug, or changing any behaviour. Use when you need to prove code works, when a bug report arrives, or when modifying existing functionality. Do NOT use for config changes, data migrations, or dependency updates.
development
Use when starting a new feature, when requirements are unclear, when asked to write code without a clear spec, or before any non-trivial implementation. Do NOT use for trivial bug fixes or one-line changes.
development
Use when you want authoritative, source-cited code free from outdated patterns. Use when building with any framework or library where correctness matters. Detects the stack from dependency files, fetches official documentation, implements following documented patterns, and cites sources for every framework-specific decision.
development
Use when preparing to ship a feature, release, or deployment. Use before merging to main, creating a release, or deploying to production. Do NOT use for CI-only changes or internal refactors that don't reach production.