Preflight
The Rule
No completion claims without fresh verification evidence. "I believe this works" is not evidence. Test output is evidence. Linter output is evidence. A passing build is evidence.
The Process
1. Identify verification commands
What checks exist for this project?
| Check |
Common commands |
| Tests |
npm test, pytest, go test ./..., cargo test |
| Types |
tsc --noEmit, mypy, pyright |
| Lint |
eslint, ruff, golangci-lint |
| Build |
npm run build, go build, cargo build |
| Format |
prettier --check, black --check, gofmt -l |
If you don't know what checks exist, look for: package.json scripts, Makefile targets, CI config (.github/workflows/), or a CLAUDE.md that lists them.
2. Run them
All of them. Not just the one you think matters.
3. Read the output
Actually read it. Don't just check exit codes. A test suite can pass with warnings that matter. A build can succeed while emitting deprecation notices that indicate a problem.
4. Regression check
Did you add or change behavior? Write a test that catches it if it breaks.
- New feature: at least one test that proves it works
- Bug fix: a test that fails without the fix and passes with it
- Config change, formatting, trivial edits: no test needed
Don't generate noise. One focused regression test beats ten shallow ones.
5. Report honestly
- If everything passes: say so, with the evidence ("all 47 tests pass, linter clean, build succeeds")
- If something fails: say what failed, what it means, and what you'll do about it
- If you can't run checks (no test suite, no linter configured): say so explicitly
Rationalization Prevention
| Thought |
Reality |
| "The tests are probably fine" |
Run them. |
| "I only changed one line" |
Run them. One line can break everything. |
| "The linter was already passing" |
Run it again. Your change might have broken it. |
| "This doesn't have tests" |
Then what does verification mean for this change? Answer that question. |
| "I'll just push and let CI catch it" |
CI catching it means you didn't. That's the opposite of preflight. |
| "It compiled, so it works" |
Compilation checks syntax, not correctness. Run the tests. |
1---2name: preflight3description: Use before claiming work is done, before committing, before creating PRs, or before saying "it should work now." Enforces running verification commands and reading their output before making any completion claims. Evidence before assertions.4---56# Preflight78## The Rule910**No completion claims without fresh verification evidence.** "I believe this works" is not evidence. Test output is evidence. Linter output is evidence. A passing build is evidence.1112## The Process1314### 1. Identify verification commands1516What checks exist for this project?1718| Check | Common commands |19|-------|----------------|20| Tests | `npm test`, `pytest`, `go test ./...`, `cargo test` |21| Types | `tsc --noEmit`, `mypy`, `pyright` |22| Lint | `eslint`, `ruff`, `golangci-lint` |23| Build | `npm run build`, `go build`, `cargo build` |24| Format | `prettier --check`, `black --check`, `gofmt -l` |2526If you don't know what checks exist, look for: `package.json` scripts, `Makefile` targets, CI config (`.github/workflows/`), or a `CLAUDE.md` that lists them.2728### 2. Run them2930All of them. Not just the one you think matters.3132### 3. Read the output3334Actually read it. Don't just check exit codes. A test suite can pass with warnings that matter. A build can succeed while emitting deprecation notices that indicate a problem.3536### 4. Regression check3738Did you add or change behavior? Write a test that catches it if it breaks.3940- New feature: at least one test that proves it works41- Bug fix: a test that fails without the fix and passes with it42- Config change, formatting, trivial edits: no test needed4344Don't generate noise. One focused regression test beats ten shallow ones.4546### 5. Report honestly4748- If everything passes: say so, with the evidence ("all 47 tests pass, linter clean, build succeeds")49- If something fails: say what failed, what it means, and what you'll do about it50- If you can't run checks (no test suite, no linter configured): say so explicitly5152## Rationalization Prevention5354| Thought | Reality |55|---------|---------|56| "The tests are probably fine" | Run them. |57| "I only changed one line" | Run them. One line can break everything. |58| "The linter was already passing" | Run it again. Your change might have broken it. |59| "This doesn't have tests" | Then what does verification mean for this change? Answer that question. |60| "I'll just push and let CI catch it" | CI catching it means you didn't. That's the opposite of preflight. |61| "It compiled, so it works" | Compilation checks syntax, not correctness. Run the tests. |