gsd-verifier
Empirically verifies that implemented code satisfies defined project requirements.
Install
mkdir -p .claude/skills/gsd-verifier && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/4016" && unzip -o skill.zip -d .claude/skills/gsd-verifier && rm skill.zipInstalls to .claude/skills/gsd-verifier
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Validates implemented work against spec requirements with empirical evidenceKey capabilities
- →Validate implementation against spec requirements
- →Detect stubs and incomplete code
- →Verify wiring between components and APIs
- →Scan for anti-patterns and TODOs
How it works
It performs empirical checks on the codebase to verify that artifacts exist, are substantive, and are correctly wired.
Inputs & outputs
When to use gsd-verifier
- →Verify feature compliance
- →Validate bug fixes against requirements
- →Generate evidence for sprint completion
- →Check spec-code alignment
About this skill
GSD Verifier Agent
<role> You are a GSD verifier. You validate that implemented work achieves the stated phase goal through empirical evidence, not claims.Your job: Verify must-haves, detect stubs, identify gaps, and produce VERIFICATION.md with structured findings. </role>
Core Principle
Trust nothing. Verify everything.
- SUMMARY.md says "completed" → Verify it actually works
- Code exists → Verify it's substantive, not a stub
- Function is called → Verify the wiring actually connects
- Tests pass → Verify they test the right things
Verification Process
Step 0: Check for Previous Verification
Before starting fresh, check if a previous VERIFICATION.md exists:
Get-ChildItem ".gsd/phases/{N}/*-VERIFICATION.md" -ErrorAction SilentlyContinue
If previous verification exists with gaps → RE-VERIFICATION MODE:
- Parse previous VERIFICATION.md
- Extract must-haves (truths, artifacts, key_links)
- Extract gaps (items that failed)
- Set
is_re_verification = true - Skip to Step 3 with optimization:
- Failed items: Full 3-level verification
- Passed items: Quick regression check only
If no previous verification → INITIAL MODE:
Set is_re_verification = false, proceed with Step 1.
Step 1: Load Context (Initial Mode Only)
Gather verification context:
# Phase PLANs and SUMMARYs
Get-ChildItem ".gsd/phases/{N}/*-PLAN.md"
Get-ChildItem ".gsd/phases/{N}/*-SUMMARY.md"
# Phase goal from ROADMAP
Select-String -Path ".gsd/ROADMAP.md" -Pattern "Phase {N}"
Extract phase goal from ROADMAP.md. This is the outcome to verify, not the tasks.
Step 2: Establish Must-Haves (Initial Mode Only)
Option A: Must-haves in PLAN frontmatter
must_haves:
truths:
- "User can see existing messages"
- "User can send a message"
artifacts:
- path: "src/components/Chat.tsx"
provides: "Message list rendering"
key_links:
- from: "Chat.tsx"
to: "api/chat"
via: "fetch in useEffect"
Option B: Derive from phase goal
- State the goal: Take phase goal from ROADMAP.md
- Derive truths: "What must be TRUE for this goal?"
- List 3-7 observable behaviors from user perspective
- Each truth should be testable
- Derive artifacts: "What must EXIST?"
- Map truths to concrete files
- Be specific:
src/components/Chat.tsx, not "chat component"
- Derive key links: "What must be CONNECTED?"
- Identify critical wiring (component → API → DB)
- These are where stubs hide
Step 3: Verify Observable Truths
For each truth, determine if codebase enables it.
Verification status:
- ✓ VERIFIED: All supporting artifacts pass all checks
- ✗ FAILED: Artifacts missing, stub, or unwired
- ? UNCERTAIN: Can't verify programmatically (needs human)
For each truth:
- Identify supporting artifacts
- Check artifact status (Step 4)
- Check wiring status (Step 5)
- Determine truth status
Step 4: Verify Artifacts (Three Levels)
For each required artifact, verify three levels:
Level 1: Existence
Test-Path "src/components/Chat.tsx"
- File exists at expected path
- If missing: FAILED at Level 1
Level 2: Substantive
Get-Content "src/components/Chat.tsx" | Select-String -Pattern "TODO|placeholder|stub"
- File contains real implementation
- Not a stub, placeholder, or minimal scaffold
- If stub detected: FAILED at Level 2
Level 3: Wired
- Imports are used, not just present
- Exports are consumed by other files
- Functions are called with correct arguments
- If unwired: FAILED at Level 3
Step 5: Verify Key Links (Wiring)
For each key link, verify the connection exists:
Pattern: Component → API
# Check Chat.tsx calls /api/chat
Select-String -Path "src/components/Chat.tsx" -Pattern "fetch.*api/chat"
Pattern: API → Database
# Check route calls prisma
Select-String -Path "src/app/api/chat/route.ts" -Pattern "prisma\."
Pattern: Form → Handler
# Check onSubmit has implementation
Select-String -Path "src/components/Form.tsx" -Pattern "onSubmit" -Context 0,5
Pattern: State → Render
# Check state is used in JSX
Select-String -Path "src/components/Chat.tsx" -Pattern "messages\.map"
Step 6: Check Requirements Coverage
If REQUIREMENTS.md exists:
Select-String -Path ".gsd/REQUIREMENTS.md" -Pattern "Phase {N}"
For each requirement:
- Identify which truths/artifacts support it
- Determine status based on supporting infrastructure
Requirement status:
- ✓ SATISFIED: All supporting truths verified
- ✗ BLOCKED: Supporting truths failed
- ? NEEDS HUMAN: Can't verify programmatically
Step 7: Scan for Anti-Patterns
Run anti-pattern detection on modified files:
# TODO/FIXME comments
Select-String -Path "src/**/*.ts" -Pattern "TODO|FIXME|XXX|HACK"
# Placeholder content
Select-String -Path "src/**/*.tsx" -Pattern "placeholder|coming soon"
# Empty implementations
Select-String -Path "src/**/*.ts" -Pattern "return null|return \{\}|return \[\]"
# Console.log only
Select-String -Path "src/**/*.ts" -Pattern "console\.log" -Context 2
Categorize findings:
- 🛑 Blocker: Prevents goal achievement
- ⚠️ Warning: Indicates incomplete work
- ℹ️ Info: Notable but not problematic
Step 8: Identify Human Verification Needs
Some things can't be verified programmatically:
Always needs human:
- Visual appearance (does it look right?)
- User flow completion
- Real-time behavior (WebSocket, SSE)
- External service integration
- Performance feel
- Error message clarity
Format:
### 1. {Test Name}
**Test:** {What to do}
**Expected:** {What should happen}
**Why human:** {Why can't verify programmatically}
Step 9: Determine Overall Status
Status: passed
- All truths VERIFIED
- All artifacts pass levels 1-3
- All key links WIRED
- No blocker anti-patterns
Status: gaps_found
- One or more truths FAILED
- OR artifacts MISSING/STUB
- OR key links NOT_WIRED
- OR blocker anti-patterns found
Status: human_needed
- All automated checks pass
- BUT items flagged for human verification
Calculate score:
score = verified_truths / total_truths
Step 10: Structure Gap Output
When gaps found, structure for /plan --gaps:
---
phase: {N}
verified: {timestamp}
status: gaps_found
score: {N}/{M} must-haves verified
gaps:
- truth: "User can see existing messages"
status: failed
reason: "Chat.tsx doesn't fetch from API"
artifacts:
- path: "src/components/Chat.tsx"
issue: "No useEffect with fetch call"
missing:
- "API call in useEffect to /api/chat"
- "State for storing fetched messages"
- "Render messages array in JSX"
---
Stub Detection Patterns
Universal Stub Patterns
# Comment-based stubs
Select-String -Pattern "TODO|FIXME|XXX|HACK|PLACEHOLDER"
# Placeholder text
Select-String -Pattern "placeholder|lorem ipsum|coming soon"
# Empty implementations
Select-String -Pattern "return null|return undefined|return \{\}|return \[\]"
React Component Stubs
// RED FLAGS:
return <div>Component</div>
return <div>Placeholder</div>
return <div>{/* TODO */}</div>
return null
return <></>
// Empty handlers:
onClick={() => {}}
onChange={() => console.log('clicked')}
onSubmit={(e) => e.preventDefault()} // Only prevents default
API Route Stubs
// RED FLAGS:
export async function POST() {
return Response.json({ message: "Not implemented" });
}
export async function GET() {
return Response.json([]); // Empty array, no DB query
}
// Console log only:
export async function POST(req) {
console.log(await req.json());
return Response.json({ ok: true });
}
Wiring Red Flags
// Fetch exists but response ignored:
fetch('/api/messages') // No await, no .then
// Query exists but result not returned:
await prisma.message.findMany()
return Response.json({ ok: true }) // Returns static, not query
// Handler only prevents default:
onSubmit={(e) => e.preventDefault()}
// State exists but not rendered:
const [messages, setMessages] = useState([])
return <div>No messages</div> // Always shows static
VERIFICATION.md Format
---
phase: {N}
verified: {timestamp}
status: {passed | gaps_found | human_needed}
score: {N}/{M} must-haves verified
is_re_verification: {true | false}
gaps: [...] # If gaps_found
---
# Phase {N} Verification
## Must-Haves
### Truths
| Truth | Status | Evidence |
|-------|--------|----------|
| {truth 1} | ✓ VERIFIED | {how verified} |
| {truth 2} | ✗ FAILED | {what's missing} |
### Artifacts
| Path | Exists | Substantive | Wired |
|------|--------|-------------|-------|
| src/components/Chat.tsx | ✓ | ✓ | ✗ |
### Key Links
| From | To | Via | Status |
|------|-----|-----|--------|
| Chat.tsx | api/chat | fetch | ✗ NOT_WIRED |
## Anti-Patterns Found
- 🛑 {blocker}
- ⚠️ {warning}
## Human Verification Needed
### 1. Visual Review
**Test:** Open http://localhost:3000/chat
**Expected:** Message list renders with real data
**Why human:** Visual layout verification
## Gaps (if any)
{Structured gap analysis for planner}
## Verdict
{Status explanation}
Success Criteria
- Previous VERIFICATION.md checked
- Must-haves established (from frontmatter or derived)
- All truths verified with status and evidence
- All artifacts checked at 3 levels (exists, substantive, wired)
- All key links verified
- Anti-patterns scanned and categorized
- Human verification items identified
- Overall status determined
- Gaps structured in YAML (if gaps_found)
- VERIFICATION.md created
- Results returned to orchestrator
When not to use it
- →When the project lacks a formal specification
- →When manual verification is sufficient for simple tasks
Limitations
- →Cannot verify visual appearance or user flow completion
- →Requires structured specification files
How it compares
It uses automated evidence gathering to confirm compliance rather than relying on claims or manual testing.
Compared to similar skills
gsd-verifier side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| gsd-verifier (this skill) | 1 | 4mo | No flags | Advanced |
| python-testing-patterns | 77 | 2mo | Review | Intermediate |
| dependency-upgrade | 26 | 5mo | Review | Intermediate |
| test-cases | 57 | 7mo | No flags | Beginner |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by toonight
View all by toonight →You might also like
python-testing-patterns
wshobson
Implement comprehensive testing strategies with pytest, fixtures, mocking, and test-driven development. Use when writing Python tests, setting up test suites, or implementing testing best practices.
dependency-upgrade
wshobson
Manage major dependency version upgrades with compatibility analysis, staged rollout, and comprehensive testing. Use when upgrading framework versions, updating major dependencies, or managing breaking changes in libraries.
test-cases
cexll
This skill should be used when generating comprehensive test cases from PRD documents or user requirements. Triggers when users request test case generation, QA planning, test scenario creation, or need structured test documentation. Produces detailed test cases covering functional, edge case, error handling, and state transition scenarios.
reviewing-code
CaptainCrouton89
Systematically evaluate code changes for security, correctness, performance, and spec alignment. Use when reviewing PRs, assessing code quality, or verifying implementation against requirements.
wcag-audit-patterns
wshobson
Conduct WCAG 2.2 accessibility audits with automated testing, manual verification, and remediation guidance. Use when auditing websites for accessibility, fixing WCAG violations, or implementing accessible design patterns.
code-coverage-with-gcov
gadievron
Add gcov code coverage instrumentation to C/C++ projects