/verify-done (Codex variant)
The end gate of the loop: cleanup → extract-links → blueprint → goal-prep → /goal → **/verify-done**.
Answers "does it actually work, including what the plan didn't think of?" — not "are the boxes ticked?".
This is the Codex CLI variant. Behaviourally identical to the Claude variant — but Codex has no Workflow tool, so the three tiers run sequentially in-session (fan-out via codex exec - subprocesses where useful) instead of a parallel Workflow. Shared roles/quality-review.md is carried with the Codex skill (copied from the Claude tree by ci/build-codex.sh for native packaging; symlinked by install-codex.sh otherwise).
Letter = spirit. The goal is an honest verdict — never a false DONE, never a FAIL for something that just couldn't be verified. Gate, not fixer. No
Edit/Write: verify and report; fixing goes back to/goalor/simplify.
Usage
/verify-done [<plan-or-spec path>] [--deep] [--block-on-quality]
- No path → locate the most recent
/blueprinttasks file (<spec-stem>/tasks.md, or a single<spec>.md) orgoal.md; or use a plain plan-mode / inline plan / "the diff + what it was meant to do" from the conversation. Ask via a numbered TUI prompt only if intent is genuinely unclear. --deep→ Tier 2 across all requirements + adversarial inputs (default light).--block-on-quality→ high-severity Tier 3 findings flip to NOT-DONE (default: Tier 3 advisory).
Weaknesses / when NOT to use
- Needs a runnable env — unrunnable proofs/scenarios come back UNKNOWN → NOT-DONE "could not verify" (honest, not a defect of the change).
- Only as good as the original intent handed to Tier 2.
- Unstructured plan = softer verdict — with no
Done when:proofs (a plan-mode/inline plan) verification is scenario-driven, not proof-driven. Fine for small tasks; for critical work write proofs via/blueprint. - Not a bug hunter (use
/code-review), not a single-change check (use/verify), not maintainability auto-fix (use/simplify).
What it does
- Resolve inputs (plan-source-agnostic): EITHER a
/blueprintplan —<spec-stem>/tasks.md(+<spec-stem>/reference.md), or a single<spec>.md— (orgoal.md) → parseDone when:lines into proofs, intent = thereference.md(or the single file itself); OR an unstructured plan (plan-mode/inline/just-the-diff) → there are noDone when:lines, so derive a few concrete shell proofs from what the plan promises and use the plan prose itself as the intent (pass it into anycodex exec -subprocess explicitly — subprocesses don't see your session). Always grabbuild/test/regressionfrom the repo. Plus: a sandbox (throwawaygit worktreeif possible, else temp dir, elsenone); knobs--deep/--block-on-quality; readroles/quality-review.md. - Run the three tiers sequentially:
- Tier 1 — Conformance: run each
Done when:proof (explicit or derived) + build/test/regression in the sandbox →PASS|FAIL|UNKNOWNper check. With an unstructured plan and nothing derivable, Tier 1 falls back to build/test only; if those are absent too it's empty → verdict leans on Tier 2 (report it). - Tier 2 — Independent scenarios: from the ORIGINAL intent, generate risk-ranked user-case/edge/adversarial scenarios (light by default;
--deepwidens). Each scenario must be grounded in a quote from the intent (drop+count ungrounded). Run the runnable ones in the sandbox; the rest are honest UNKNOWN. Usecodex exec -subprocesses to parallelize generation/runs if helpful. - Tier 3 — Quality (advisory): runs LAST and only if behaviour works; feed the prompt body of
roles/quality-review.md(only the text BETWEEN itsBEGIN_PROMPT/END_PROMPTsentinels — skip the provenance header) tocodex exec -(or inline) → structured maintainability findings. Advisory unless--block-on-quality.
- Tier 1 — Conformance: run each
- Report the short verdict + three honest buckets. Hand findings back to
/goalor/simplify; fix nothing.
Honesty rails (non-negotiable)
- UNKNOWN ≠ pass/fail — can't run it → UNKNOWN with a reason; no runnable env → all UNKNOWN → NOT-DONE "could not verify"; never a false DONE/FAIL.
- Don't invent requirements — Tier-2 scenarios carry
groundedIn; "doesn't do X" where X was never asked → UNKNOWN + confirm-with-human, not auto-FAIL; ungrounded discarded + counted. - No silent truncation — always list what wasn't run/covered.
Output
VERDICT: DONE | NOT-DONE — <reason>
Tier 1: N/M PASS, K UNKNOWN
Tier 2: generated G (D discarded), ran R; confirmed gaps: …
Tier 3: F findings (advisory|blocking) — listed
NOT covered (check manually): …
DONE ⟺ Tier 1 fully PASS and Tier 2 no confirmed (high-confidence, grounded) gap and quality not blocking (unless --block-on-quality); else NOT-DONE + buckets (confirmed failures / UNKNOWN-to-check / suspected-out-of-scope).
Connections
- Input: a
/blueprintplan (a<spec-stem>/directory withtasks.md+reference.md, or a single<spec>.md) or agoal-prepcharter (which writes "hand finished work to/verify-done"). - Per-stage vs end: lightweight per-stage
Done when:lives in execution (seeded by goal-prep);/verify-doneis the holistic END gate — don't run it per stage. - NOT
/verify//code-review//blueprintPhase 7.6 (which reviews the plan;/verify-donereviews the result).
Self-check before reporting
- Every
Done when:proof actually ran, or honestly UNKNOWN (not silently PASS)? - All Tier-2 scenarios grounded in the original intent (none invented)?
- Verdict NOT-DONE whenever behaviour is unverified?
- Stayed a gate — zero edits?