| name | ship:verify |
| description | Use when a feature build is complete and needs verification against acceptance criteria and adversarial testing |
| effort | high |
| allowed-tools | Read, Agent, Glob, Edit, Bash |
| argument-hint | [feature-name] |
Verify the active feature's implementation.
Find Active Feature
Feature state is injected by hooks at session start and after compaction — check conversation context for "SHIP ACTIVE FEATURES" or "SHIP FEATURE STATE" blocks first.
- If
$ARGUMENTS is provided, use it as the feature name
- Otherwise, use injected feature state to identify the feature with status
built
- If no injected state is available, fall back to scanning
.planning/features/*/CONTEXT.md
- If multiple candidates exist, list them and pick the most recent
- If no candidates exist, report that no verifiable features were found
Run Verification
Use the Agent tool to invoke the ship-verifier agent. It is the single post-build quality gate: it verifies every acceptance criterion against the running code, hunts bugs with adversarial tests, scans for anti-patterns, and writes VERIFY.md.
Verify feature: {name}
Read .planning/features/{name}/CONTEXT.md and PLAN.md, then follow your verification
instructions: verify acceptance criteria with the gate function, write and run
adversarial tests for the relevant risk categories, scan the changed files for
anti-patterns, and write VERIFY.md. Critical or high bugs and any failing criterion
block a PASS.
Display Results
Extract the verify_result JSON block from the agent's output and read .planning/features/{name}/VERIFY.md for the full report. Display:
## VERIFICATION COMPLETE
Feature: {result.feature}
Status: {result.status}
Criteria: {result.criteria_passed} / {result.criteria_total} passed ({result.criteria_inconclusive} inconclusive)
Tests: {result.tests_written} written, {result.tests_passed} passed
Bugs: {by severity from result.bugs}
Anti-patterns: {result.anti_patterns} found
[If result.gaps is non-empty:]
Gaps:
- {each item from result.gaps}
[If result.status is "PASS" or "INCONCLUSIVE":] Next: /ship:finish
[If result.status is "FAIL":] Next: /ship:build (fix tasks added to PLAN.md)
$ARGUMENTS