---
name: verify
description: "Trigger: before marking done or /ship. Build + test + lint must all pass."
---

# Verify — Pre-Completion Check

## Iron Law

NO COMPLETION CLAIMS WITHOUT FRESH VERIFICATION EVIDENCE. "I tested it" without output is an unverified claim.

## When to Trigger
- Before a `/go` subagent reports "done"
- Before `/ship` creates a PR
- Before telling the user "it's ready"
- After any significant code change

## Process

### 1. Build
```bash
# Detect and run the project's build command
npm run build  # or: go build ./... | cargo build | make
```
Must exit 0. If it fails, fix before proceeding.

### 2. Test
```bash
# Run the project's test suite
npm test  # or: go test ./... | pytest | cargo test
```
Must exit 0. If tests fail, invoke `debug` skill.

### 3. Lint
```bash
# Run linter if configured
npm run lint  # or: golangci-lint run | ruff check | cargo clippy
```
Warnings are OK. Errors must be fixed.

### 4. Type Check (if applicable)
```bash
npx tsc --noEmit  # TypeScript
mypy .            # Python
```

### 5. Final Sanity
- [ ] No `console.log` / `print` debug statements left
- [ ] No `TODO` or `FIXME` introduced without explanation
- [ ] No hardcoded test values or credentials
- [ ] All new files are tracked by git

## Anti-Rationalization

| Excuse | Rebuttal | What to do instead |
|--------|----------|-------------------|
| "Tests pass locally" | Did you actually run them? Trust the output, not your memory. | Run `npm test` right now. Show the output. |
| "I only changed one file" | One file can break the entire build. Imports propagate. | Full build + test. Every time. No exceptions. |
| "Lint warnings aren't errors" | Warnings become errors. Fix them before they multiply. | Zero warnings policy. Fix now or suppress with justification. |
| "CI will catch it" | CI feedback is 5-10 min delayed. Catch it locally in seconds. | Run verify locally before pushing. CI is the safety net, not the test. |

## Evidence Required

Before reporting "ready", show ALL of these:

- [ ] Build output: exit code 0 (show the command + result)
- [ ] Test output: all passing (show summary line)
- [ ] Lint output: zero errors (show summary or "clean")
- [ ] Type check output: no errors (show `tsc --noEmit` or equivalent)
- [ ] Final sanity: no console.log, no unexplained TODO, no hardcoded values

**Each check needs actual command output. "I ran it" without output = not verified.**

## Red Flags
- Reporting success without showing actual command output
- Skipping type check "because JavaScript is dynamic"
- Committing with TODO/FIXME and no explanation
