skills/plan-test/SKILL.md
Verify if goals have been implemented by checking acceptance criteria against codebase. Searches repo for code/test evidence, generates structured test reports with verdicts. Use after plan-work to validate implementation. Auto-triages quick vs deep mode.
npx skillsauth add cuozg/oh-my-skills plan-testInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Third gate in the goals pipeline.
plan-goal → plan-work → plan-test → plan-improve
write execute verify refine
plan-goal defines what "done" means. plan-work builds it. plan-test
answers the single question: did we actually meet the acceptance
criteria we wrote down? plan-improve then closes the remaining gaps.
The skill is deliberately read-only against the target repo (it writes
only the test report). It never edits source, never marks criteria
complete, never updates Master.md. Those actions belong to other skills.
Every acceptance criterion gets one verdict —
✅ Met,⚠️ Partial, or❌ Unmet— backed by file-path evidence or an explicit "no evidence found" note. No verdict is handwaved.
If you cannot produce evidence for a criterion, it is ❌ Unmet. Period.
A criterion marked - [x] in the goal file is trusted as ✅ Met (the
author attested to it) but the evidence columns still populate from the
repo scan.
Every plan-test run MUST:
Docs/Goals/<feature>/<task>.md.status, priority, created, updated,
depends_on) and the ## Acceptance Criteria checklist.Docs/Goals/{feature-name}/{kebab-case-test}.md (path
derived from the goal's location under Docs/Goals/).{total, met, partial, unmet} on stdout.Every plan-test run MUST NOT:
plan-goal for that).- [x] (use plan-goal or plan-improve).Docs/Goals/Master.md (derived by plan-goal).Input: path to a goal file under Docs/Goals/.
python skills/plan-test/scripts/parse_goal.py Docs/Goals/search/add-full-text-search.md
Produces a structured dict:
{
"path": "Docs/Goals/search/add-full-text-search.md",
"title": "[Search] Add Full-Text Search",
"frontmatter": {"status": "in-progress", "priority": "high", ...},
"sections": {"Objective": "...", "Context": "...", "Constraints": "...", "Notes": "..."},
"acceptance_criteria": [
{"text": "GET /api/search?q=<term> returns ...", "checked": false, "line_no": 23},
...
],
"warnings": []
}
Surface warnings to the user if any appear (missing frontmatter keys,
invalid status, zero checkboxes).
For each criterion, the verifier:
`foo`), quoted
literals, symbols (CamelCase or snake_case identifiers), and
fallback keywords.rg (falls back to grep -rn).tests/, test/, __tests__/ for files mentioning any symbol.| Verdict | When |
|---------|------|
| ✅ Met | Criterion is - [x] OR (code hit(s) AND test file(s)) |
| ⚠️ Partial | Code/path evidence exists but tests are missing or paths are partially absent |
| ❌ Unmet | No referenced path exists, or no code/test evidence at all |
python skills/plan-test/scripts/run_tests.py \
Docs/Goals/search/add-full-text-search.md \
--root . \
--mode quick
Writes Docs/Goals/search/add-full-text-search-test.md with:
kind: test-report, pass_rate, test_coverage, …)See references/test-template.md for a filled example.
--mode quick (default for ≤5 criteria): concise evidence, first 2
code hits per criterion.--mode deep (default for ≥10 criteria): full evidence, up to 5 code
hits per criterion, richer recommendations.If omitted, mode is inferred from criteria count.
Goal file (Docs/Goals/auth/add-jwt-auth.md):
---
status: in-progress
priority: high
created: 2026-04-15
updated: 2026-04-19
depends_on: []
---
# [Auth] Add JWT Authentication
## Objective
Protect API routes with stateless JWT auth.
## Acceptance Criteria
- [x] `POST /api/auth/login` returns `{token}` on valid credentials
- [x] Middleware `requireAuth` rejects requests without a valid token with `401`
- [ ] Tokens expire after 24h
- [ ] Documented in `docs/auth.md`
Run:
python skills/plan-test/scripts/run_tests.py Docs/Goals/auth/add-jwt-auth.md
Output (excerpt):
✓ report: Docs/Goals/auth/add-jwt-auth-test.md
2 met · 1 partial · 1 unmet · 4 total
The generated report includes:
## Criteria Matrix
| # | Criterion | Status | Evidence |
|---|-----------|--------|----------|
| 1 | `POST /api/auth/login` returns `{token}` on valid credentials | ✅ Met | `src/routes/auth.ts:14`, test: `tests/auth.test.ts` |
| 2 | Middleware `requireAuth` rejects requests without a valid token with `401` | ✅ Met | `src/middleware/requireAuth.ts:9`, test: `tests/middleware.test.ts` |
| 3 | Tokens expire after 24h | ⚠️ Partial | `src/routes/auth.ts:22` (no matching tests) |
| 4 | Documented in `docs/auth.md` | ❌ Unmet | referenced path(s) missing: `['docs/auth.md']` |
| Upstream skill | What it produces | plan-test reads |
|----------------|------------------|-----------------|
| plan-goal | Docs/Goals/<feature>/<task>.md with frontmatter + criteria | goal file |
| plan-work | Commits that implement those criteria | the repo state |
| Downstream skill | What it produces | plan-test provides |
|------------------|------------------|--------------------|
| plan-improve | Targeted fix commits for gaps | the ❌/⚠️ list |
Typical flow:
plan-goal creates Docs/Goals/search/add-full-text-search.md.plan-work lands commits on a feature branch.plan-test writes Docs/Goals/search/add-full-text-search-test.md.❌/⚠️, run plan-improve.plan-improve closes gaps → re-run plan-test → repeat until all ✅.# Full pipeline
python skills/plan-test/scripts/run_tests.py <goal.md> [--root .] [--mode quick|deep] [--out path] [--print]
# Inspect the parser output
python skills/plan-test/scripts/parse_goal.py <goal.md>
# Inspect verification results only
python skills/plan-test/scripts/verify_implementation.py <goal.md> [--root .]
# Render a report from pre-computed JSON
python skills/plan-test/scripts/generate_report.py <goal.json> <results.json> <out.md> [--mode quick|deep]
run_tests.py)| Code | Meaning |
|------|---------|
| 0 | Report written, all criteria ✅ Met |
| 1 | Report written, at least one ⚠️ Partial or ❌ Unmet |
| 2 | Usage or input error (missing goal file, invalid args) |
| 3 | Unexpected internal failure |
Docs/Goals/{feature-name}/{task}.md →
Docs/Goals/{feature-name}/{task}-test.md. Never write anywhere else
unless --out is explicit.plan-test does not mark it - [x]. Author attestation
is the goal owner's job.--root. All path checks and searches happen under
--root (default: current directory). A goal file outside the repo
is still parsed, but searches stay inside the repo.status or priority values, or zero checkboxes surface as
warnings in the parser output.plan-test twice on an unchanged
repo yields byte-identical reports, modulo the generated timestamp.pytest, npm test, go test, dotnet test). plan-test only
locates test files; it does not execute them.flutter-test, unity-test-unit, or the
equivalent for your stack.Master.md or checkboxes. Handled by plan-goal and
plan-improve.unity-review, flutter-review, or the matching
review skill.skills/plan-test/
├── SKILL.md ← this file
├── scripts/
│ ├── run_tests.py ← orchestrator (entry point)
│ ├── parse_goal.py ← goal file parser
│ ├── verify_implementation.py ← evidence scanner
│ └── generate_report.py ← Markdown renderer
└── references/
├── test-template.md ← filled example report
└── acceptance-criteria-guide.md ← how to write testable criteria
All four scripts are executable (chmod +x) and runnable standalone.
tools
Generate Unity raster image assets through Unity MCP: game sprites, item art, backgrounds, UI icons, portraits, concept images, transparent cutouts, image edits, upscales, background removal, and Unity scene or Game View screenshots. Use when a Unity project needs image files imported under Assets or screenshots captured from the editor. Do not use for meshes, audio, animation, materials, gameplay code, UI Toolkit layout, or generic non-Unity image generation.
tools
Create Unity technical solution documents from user requirements, feature ideas, bug goals, specs, or codebase problems. Use when the user asks for a technical approach, architecture, implementation strategy, solution options, feasibility analysis, system design, or "how should we build/fix this" for Unity runtime, Editor, tools, assets, data, UI, WebGL, SDKs, or production pipelines.
tools
Orchestrate Unity Editor via MCP (Model Context Protocol) tools and resources. Use when working with Unity projects through MCP for Unity - creating/modifying GameObjects, editing scripts, managing scenes, running tests, or any Unity Editor automation. Provides best practices, tool schemas, and workflow patterns for effective Unity-MCP integration.
development
Convert a spec document into an implementation TODO list in the same spec folder. U se when the user says goal-todo, todo from spec, generate tasks from spec, turn this spec into todos, create implementation checklist, extract tasks, or asks to read a Docs/Specs design doc and produce what must be implemented. Includes UI/UX review and codebase investigation before writing the checklist. Do not use for implementing the tasks, creating new goal files, writing test cases, or verifying completed work.