Verify that implemented features work correctly by driving browser/UI testing with screenshots and programmatic assertions. Uses Playwright MCP when available, falls back to CLI-based verification. Triggers on: "verify this works", "check the output", "test the UI", "verify the feature", "screenshot test", "visual verification", "does it actually work". Do NOT trigger on: unit test writing (use tdd-workflow), code review (use code-review), standard test runs ("run the tests").
From super-devnpx claudepluginhub jenningsloy318/claude-skill-artifacts --plugin super-devThis skill uses the workspace's default tool permissions.
Drive interactive testing to verify that implemented features actually work. Takes screenshots, records evidence, and enforces programmatic assertions at each step.
Announce at start: "Running verification. I will test the feature interactively and capture evidence."
tdd-workflow)code-review or adversarial-review)Before starting verification, detect available tools:
Check for Playwright MCP tools:
mcp__playwright__browser_navigatemcp__playwright__browser_snapshotmcp__playwright__browser_take_screenshotmcp__playwright__browser_clickmcp__playwright__browser_fill_formIf available: Use Playwright MCP for browser-based verification with screenshots.
If no browser tools are available, fall back to:
curlAnnounce which mode is active:
Before testing, create a verification checklist from:
## Verification Checklist
- [ ] Step 1: [Action] -> Expected: [Result]
- [ ] Step 2: [Action] -> Expected: [Result]
- [ ] Step 3: [Action] -> Expected: [Result]
# Start the dev server (detect from project)
# Node.js: npm run dev / yarn dev / pnpm dev
# Rust: cargo run
# Go: go run .
# Python: python -m uvicorn main:app
Wait for the application to be ready before proceeding.
For each checklist item:
Navigate to the relevant page:
mcp__playwright__browser_navigate(url: "http://localhost:3000/path")
Interact with the UI:
mcp__playwright__browser_click(element: "button", ref: "submit-btn")
mcp__playwright__browser_fill_form(element: "input[name='email']", value: "test@example.com")
Assert the expected state:
mcp__playwright__browser_snapshot()
# Verify the snapshot contains expected elements
Screenshot as evidence:
mcp__playwright__browser_take_screenshot()
# Save screenshot for verification report
Record result: Pass or fail with evidence
For each checklist item:
Make HTTP request:
curl -s http://localhost:3000/api/endpoint | jq .
Assert response:
# Check status code
STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:3000/api/endpoint)
[ "$STATUS" = "200" ] && echo "PASS" || echo "FAIL: Expected 200, got $STATUS"
Check state:
# Verify file was created
[ -f expected-output.json ] && echo "PASS" || echo "FAIL: File not created"
Create a structured report with all evidence:
# Verification Report: [Feature Name]
**Date:** [timestamp]
**Mode:** Playwright MCP / CLI
**Verdict:** PASS / PARTIAL / FAIL
## Environment
- Application: [URL or command]
- Browser: [if Playwright]
- OS: [platform]
## Results
### Check 1: [Description]
- **Action:** [what was done]
- **Expected:** [expected result]
- **Actual:** [actual result]
- **Status:** PASS / FAIL
- **Evidence:** [screenshot path or output]
### Check 2: [Description]
...
## Summary
- Total checks: [N]
- Passed: [N]
- Failed: [N]
- Pass rate: [N%]
## Screenshots
[List of screenshot paths with descriptions]
## Issues Found
[Any bugs or unexpected behavior discovered during verification]
Save verification artifacts:
# Store in spec directory
mkdir -p specification/[spec-name]/verification/
# Screenshots saved here
# Report saved as [index]-verification-report.md
# Element exists
browser_snapshot -> check for element presence
# Text content
browser_snapshot -> verify text matches expected
# Element state (visible, disabled, etc.)
browser_snapshot -> check element attributes
# Navigation
browser_snapshot -> verify current URL matches expected
# Status code check
[ "$(curl -s -o /dev/null -w '%{http_code}' $URL)" = "200" ]
# Response body check
curl -s $URL | jq -e '.success == true'
# Header check
curl -sI $URL | grep -q 'Content-Type: application/json'
# Response time check
TIME=$(curl -s -o /dev/null -w '%{time_total}' $URL)
[ "$(echo "$TIME < 2.0" | bc)" = "1" ]
# File exists
[ -f path/to/expected/file ]
# File content matches
diff expected-output.txt actual-output.txt
# Database state (via CLI tools)
psql -c "SELECT COUNT(*) FROM users WHERE status = 'active'" | grep -q "expected_count"
# Process running
pgrep -f "process-name" > /dev/null
When used within the super-dev workflow:
When used standalone:
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.