[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6HBVZ86GN3TGGFSJ4XM9C5Q":3,"skill-same:01M6HBVZ86GN3TGGFSJ4XM9C5Q":75},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":48,"commitSha":49,"skillDirectory":50,"forksCount":51,"repositoryHtmlUrl":52,"repositoryHomepageUrl":6,"ownerHtmlUrl":53,"ownerBlogUrl":6,"ownerDescription":54,"updatedAt":55,"install":56,"resources":68},"01M6HBVZ86GN3TGGFSJ4XM9C5Q","verify",null,"Check a built unit goal-backward: classify every brief acceptance criterion COVERED \u002F PARTIAL \u002F MISSING with concrete evidence, so you know what is truly done. Use when: verify N, check whether unit N is done, confirm the goals for roadmap unit N are met.","SyloRei\u002Fclaude-godmode","SyloRei","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F5840195?v=4","01M6HBT6QSK7QM4DTVPNGARNP4","Andrey Prokofev","01M6HBT6WED1MEN8W7JYP412WE",3,"MIT","https:\u002F\u002Fgithub.com\u002FSyloRei\u002Fclaude-godmode\u002Fblob\u002Fmain\u002Fskills\u002Fverify\u002FSKILL.md",[],[5,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"goal","you","ShellCheck","unit","scripts","classify","done","show","godmode","log","run","roadmap","coverage","read","model","Bash","brief","acceptance","git","2026-11-10 10:12:30",false,"---\nname: verify\ndescription: \"Check a built unit goal-backward: classify every brief acceptance criterion COVERED \u002F PARTIAL \u002F MISSING with concrete evidence, so you know what is truly done. Use when: verify N, check whether unit N is done, confirm the goals for roadmap unit N are met.\"\nuser-invocable: true\nargument-hint: [N]\narguments: [N]\nallowed-tools: Read, Grep, Glob, Bash(gm=*), Bash(*godmode-model*), Bash(git diff*), Bash(git log*), Bash(git show*), Bash(*godmode-state*), Bash(*godmode-findings*), Bash(npm test*), Bash(npm run test*), Bash(pnpm test*), Bash(yarn test*), Bash(bats*), Bash(go test*), Bash(cargo test*), Bash(pytest*), Bash(.\u002Fscripts\u002F*test*), Bash(shellcheck*), Bash(.\u002Fscripts\u002Flint*), Bash(*\u002Fskills\u002Fverify\u002Fscripts\u002Fcoverage-diff.sh*), Bash(skills\u002Fverify\u002Fscripts\u002Fcoverage-diff.sh*)\n---\n\n# Verify\n\nDecide what is **truly done** for roadmap unit **$N** by working **goal-backward**: start from the brief's acceptance criteria, not from the diff. For **each** criterion, return a verdict — **COVERED \u002F PARTIAL \u002F MISSING** — backed by concrete evidence (a `file:line`, a passing test name, or command output). A diff can look big and still miss a goal; only the goals decide the verdict.\n\nRun after `\u002Fbuild N` has produced commits. Verify is the gate before shipping: if every criterion is COVERED, the unit is ready for `\u002Fship`. This is the fifth step of the spine: `\u002Fmission` → `\u002Fbrief N` → `\u002Fplan N` → `\u002Fbuild N` → **`\u002Fverify N`** → `\u002Fship`.\n\nThis is a **read-only** operation. You inspect files, search the codebase, read the unit's diff, run the project's test command, and dispatch review lenses that themselves only read. You do **not** write or edit source — your only writes are workflow-state updates via `bin\u002Fgodmode-state` and findings persistence via `bin\u002Fgodmode-findings`. `\u002Fverify` only ever calls `godmode-findings init`, `reconcile`, and `list` — it **never** calls `transition` or `waive` and **never** auto-closes a finding. The `open→fixed` transition is `\u002Fbuild`'s job; a finding that no lens re-reports this run stays `open` and is reported as stale.\n\n---\n\n## Auto Mode\n\nWhen `## Auto Mode Active` is present in context: do not ask clarifying questions. Locate the brief and plan for unit `$N`, run the project's test command yourself to gather evidence, classify every criterion, and report. Treat user course-corrections as normal input.\n\nWhen Auto Mode is absent, still avoid an interview — verification is mechanical. Ask only if you genuinely cannot find the brief or determine the project's test command.\n\n---\n\n## Strictness — the core rule\n\n**Never report PARTIAL as COVERED. \"Claimed\" is not \"verified\".**\n\n- **COVERED** — you have **concrete evidence** the criterion is met: a `file:line` that implements it, a named test that exercises it and passes, or command output that demonstrates the observable result the brief asked for. No evidence → not COVERED.\n- **PARTIAL** — the criterion is partly met: some of the behavior exists, or it exists but a sub-condition or edge case from the criterion is unmet or unproven. Say exactly what is missing.\n- **MISSING** — no evidence the criterion is met, or evidence that it is not.\n\nWhen in doubt between COVERED and PARTIAL, choose **PARTIAL**. A code comment, a TODO, a stub, or a step that merely *claims* to do the work is **not** evidence. A test that exists but does not run (or is skipped) is **not** evidence — nor is one that trivially passes without exercising the criterion (e.g. asserts `true`, or never calls the code under test).\n\n---\n\n## Process\n\n**Resolving the godmode helpers.** The `godmode-*` helpers live in the plugin install dir — **not** the consumer repo you're working in — so a bare `bin\u002Fgodmode-*` path fails from another project's working directory. Every `bash` block below resolves their location into `$gm` first (plugin mode → `$CLAUDE_PLUGIN_ROOT\u002Fbin`, manual install → `~\u002F.claude\u002Fbin`, in-repo → `.\u002Fbin`) and calls `\"$gm\u002Fgodmode-\u003Cname>\"`. Keep the resolver line; never call a helper by a bare relative path.\n\n### 1. Read the goals\n\nFind the brief directory for unit **$N** and read its acceptance criteria. `NN` is `$N` zero-padded to two digits (unit `3` → `03`), matching the directory `\u002Fbrief N` created.\n\n```bash\nNN=$(printf '%02d' \"$N\")\ngm=$(for c in \"${CLAUDE_PLUGIN_ROOT:-}\" \"$HOME\u002F.claude\" .; do [ -x \"$c\u002Fbin\u002Fgodmode-state\" ] && { echo \"$c\u002Fbin\"; break; }; done)\nmission_id=$(\"$gm\u002Fgodmode-state\" get mission_id)\nbrief_dir=$(ls -d .planning\u002Fmissions\u002F${mission_id}\u002Fbriefs\u002F${NN}-* 2>\u002Fdev\u002Fnull | head -1)\n```\n\nIf no brief directory for `$N` exists, stop and tell the user to run `\u002Fbrief $N` first — there are no goals to verify against.\n\nRead, in order:\n\n- `${brief_dir}\u002FBRIEF.md` — the **Spec — acceptance criteria**. These are the goals you verify against, each by its ID.\n- `${brief_dir}\u002FPLAN.md` if present — its **Verification plan** tells you, per criterion, how it was meant to be checked (the command to run, output to observe, or file to inspect). Use it as a guide, but it does not replace gathering your own evidence.\n- `.planning\u002FPROJECT.md` — constraints the unit had to respect.\n\n### 2. Gather evidence per criterion\n\nFor **each** acceptance criterion, go and find the proof — goal-backward:\n\n- **Read \u002F Grep \u002F Glob** the codebase for the `file:line` that implements the criterion.\n- **Run the project's test command** when a criterion is behavioral, and capture the passing (or failing) output. Use the command the PLAN.md verification entry names, or the project's detected runner (`bats`, `npm test`, `pytest`, `go test`, …).\n- Inspect command output for the exact observable result the brief asked for (the status code, the file written, the placeholder rendered, the zero-warning lint run).\n\nA criterion is only COVERED if the evidence you gathered demonstrates the brief's observable result — not merely that related code exists.\n\nWhen `.planning\u002FSTANDARDS.md` is present, judge the change against it as authoritative project context over the generic defaults where it has spoken (see \"Project Standards Precedence\" in `rules\u002Fgodmode-coding.md`).\n\n**Model profile.** Before spawning any review\u002Fverifier agent, resolve the active model profile from `${CLAUDE_PLUGIN_OPTION_MODEL_PROFILE:-balanced}`, then call the resolver `\"$gm\u002Fgodmode-model\" \u003Cagent>` (resolve `$gm` as the **Resolving the godmode helpers** note above shows) to obtain the model for that agent under the active profile. Pass that model to the Agent tool's `model` override at spawn time. The resolver also reports the agent's effort, but **`effort` is frontmatter-only and is NOT set at spawn** (platform limitation — effort cannot be overridden when spawning an agent), so override **only** `model`; effort stays whatever the agent's frontmatter declares.\n\n### 3. Fan out the review lenses\n\nVerifying \"done\" has two halves. **`@verifier` owns AC-coverage** — does the unit meet the brief's goals? **Five code-quality lenses own the findings** — is the code that meets those goals sound? Run both halves **in parallel**: in a single message, dispatch **all six** agents concurrently (one Agent call per lens plus `@verifier`), each resolving its model via `\"$gm\u002Fgodmode-model\" \u003Cagent>` as the **Model profile** note above requires.\n\nScope every lens to **unit $N's changes only** — the diff the unit produced, e.g. `git diff` for the unit's commits — not the whole codebase. The six agents:\n\n- `@verifier` — goal-backward AC-coverage (drives §4 below; owns COVERED \u002F PARTIAL \u002F MISSING).\n- `code-reviewer` — correctness, structure, error handling, readability.\n- `security-auditor` — injection, secrets, unsafe input, path\u002Fcommand traversal.\n- `perf-reviewer` — hot paths, needless work, allocations, N+1 \u002F blocking calls.\n- `convention-reviewer` — adherence to the repo's detected patterns and naming.\n- `test-reviewer` — test coverage, meaningful assertions, missing edge\u002Ferror cases.\n\n**Coverage-delta check.** When the project produces a coverage value (the consumer's coverage tooling yields a baseline and a current figure), feed both to the bundled `coverage-diff.sh` to report the signed delta and flag a regression — deterministic evidence for the `test-reviewer` lens rather than an eyeballed guess. The script prints the signed delta (`+5` \u002F `0` \u002F `-5`) on stdout and exits non-zero when current coverage regressed beyond the tolerance. Resolve it across install modes:\n\n```bash\ndiff_sh=\"\"\nfor cand in \\\n  \"${CLAUDE_PLUGIN_ROOT:-}\u002Fskills\u002Fverify\u002Fscripts\u002Fcoverage-diff.sh\" \\\n  \"$HOME\u002F.claude\u002Fskills\u002Fverify\u002Fscripts\u002Fcoverage-diff.sh\" \\\n  \"skills\u002Fverify\u002Fscripts\u002Fcoverage-diff.sh\"; do\n  [ -n \"$cand\" ] && [ -x \"$cand\" ] && { diff_sh=\"$cand\"; break; }\ndone\nif [ -n \"$diff_sh\" ]; then\n  \"$diff_sh\" \"$baseline\" \"$current\"\nelse\n  # Make the skip visible — a missing script must not silently no-op the check.\n  >&2 echo \"warning: coverage-diff.sh not found — skipping coverage-delta check\"\nfi\n```\n\nA non-zero exit means coverage regressed — a finding for `test-reviewer`, not a hard stop here (`\u002Fverify` is read-only).\n\n**Shared finding schema.** Each lens reports every finding as a structured record so findings merge cleanly:\n\n```\n{ lens, severity, confidence, location, note }\n```\n\n- `lens` — which reviewer produced it (`code-reviewer`, `security-auditor`, …).\n- `severity` — one of **CRITICAL | WARNING | NIT**.\n- `confidence` — one of **HIGH | MEDIUM | LOW** (the lens's certainty the finding is real and actionable).\n- `location` — a `file:line` anchor in the unit's diff.\n- `note` — one concrete sentence: what is wrong and why.\n\n### 4. Merge the findings\n\nAfter all lenses return, merge their findings into one set:\n\n- **Dedup** — collapse findings that multiple lenses raise about the same `file:line` \u002F issue into a single record; keep the highest severity and note the contributing lenses.\n- **Drop LOW-confidence NITs** — discard any finding that is both `NIT` and `LOW` confidence; it is noise.\n- **Group by lens**, and within the report **order severity CRITICAL → WARNING → NIT** so the most important findings surface first.\n\nThe `@verifier` lens does not feed this findings set — its output drives the AC-coverage verdict in §5 (Classify) instead.\n\n### 4b. Confirm the blocking findings\n\nBefore persisting, subject the blocking-eligible findings to adversarial confirmation. A finding is **blocking-eligible** when its `severity` is `CRITICAL` OR its `confidence` is `HIGH` — exactly the predicate `godmode-findings --blocking` uses. All other findings (neither CRITICAL nor HIGH-confidence) are non-blocking and pass straight through to the persist step unchanged.\n\n**Step 1 — Mechanical pre-filter (UNCONDITIONAL — runs in every profile including budget).**\n\nFor each blocking-eligible finding, check whether its `location`'s **file** appears anywhere in this unit's diff (the same `git diff` for the unit's commits already gathered in §3). If the finding's **file** does NOT appear in the diff at all:\n\n- DROP the finding with reason `out-of-diff`.\n- Do NOT spawn a skeptic for it.\n\nA finding whose file IS in the diff (regardless of whether the exact line number matches) MUST pass through to the skeptic. The pre-filter removes hallucinated or wrong-file anchors — NOT drifted line numbers within a changed file. Line-level questions (e.g. an adjacent or shifted line in a file that IS in the diff) are adjudicated by the skeptic, not the pre-filter.\n\nThis pre-filter is cheap and unconditional. It removes stale wrong-file artifacts from the confirmation batch regardless of the active model profile.\n\n**Step 2 — Per-profile skeptic spawn.**\n\nResolve `${CLAUDE_PLUGIN_OPTION_MODEL_PROFILE:-balanced}` (the same way §2 does) and apply the profile policy:\n\n- **quality** — confirm ALL blocking-eligible findings that survived the pre-filter.\n- **balanced** — confirm only findings with `severity = CRITICAL` (skip HIGH-confidence WARNINGs).\n- **budget** — SKIP the skeptic spawn entirely. The pre-filter survivors pass through to the persist step **unchanged** (treated as UPHELD; no verdict step runs).\n\nFor each finding selected by the profile policy, spawn **exactly one** `@finding-skeptic` via the Agent tool (the same way §3 dispatches lenses), with its model resolved via:\n\n```bash\ngm=$(for c in \"${CLAUDE_PLUGIN_ROOT:-}\" \"$HOME\u002F.claude\" .; do [ -x \"$c\u002Fbin\u002Fgodmode-model\" ] && { echo \"$c\u002Fbin\"; break; }; done)\nskeptic_model=$(\"$gm\u002Fgodmode-model\" finding-skeptic)\n```\n\nPass `skeptic_model` as the Agent tool's `model` parameter when spawning `@finding-skeptic` (mirroring how §3 passes per-lens models). Pass the agent: (a) the single finding record (`lens`, `severity`, `confidence`, `location`, `note`), and (b) the unit diff. The skeptic is read-only. It returns exactly one verdict and one reason sentence.\n\nFindings NOT selected by the profile policy (e.g. HIGH-conf WARNINGs in balanced, or all survivors in budget) pass through to Step 3 unchanged.\n\n**Step 3 — Verdict → action.**\n\nApply the following state machine to each skeptic verdict:\n\n| Verdict | Action |\n|---|---|\n| **UPHELD** | Finding passes through UNCHANGED (original `sev`\u002F`conf`) into the reconcile batch. |\n| **REFUTED — not real** | DROP the finding — it is NOT added to the reconcile batch at all. |\n| **REFUTED — over-rated** | DOWNGRADE (soft-kill): the finding is persisted but exits `--blocking`. For a **non-CRITICAL** finding, set `conf → MEDIUM`. For a **CRITICAL** finding, set `sev → WARNING` AND `conf → MEDIUM`. The downgraded finding IS added to the reconcile batch with its new `sev`\u002F`conf` — it stays visible in `FINDINGS.md` and the report. |\n\n**Default-UPHOLD:** Demote a finding ONLY on an affirmative, evidence-backed refutation. If the skeptic is uncertain, if evidence is ambiguous, or if the skeptic cannot locate the cited code, the verdict MUST be UPHELD. (The `@finding-skeptic` agent enforces this rule internally; the state machine here honors it: ambiguity → UPHELD → pass through unchanged.)\n\n**Result:** the batch fed to `reconcile` below carries the POST-confirmation `sev`\u002F`conf` for every finding. Because `reconcile` refreshes severity and confidence on a recurring match, no separate `godmode-findings` command is needed — the updated values flow through automatically.\n\n**Persist findings.** After merging and deduplicating the five code-quality lens findings (the post-dedup filtered set — `@verifier`'s AC-coverage output is NOT included here), persist them via `godmode-findings`:\n\n```bash\ngm=$(for c in \"${CLAUDE_PLUGIN_ROOT:-}\" \"$HOME\u002F.claude\" .; do [ -x \"$c\u002Fbin\u002Fgodmode-state\" ] && { echo \"$c\u002Fbin\"; break; }; done)\n\n# Step 1: init unconditionally — idempotent; reconcile errors if FINDINGS.md is absent.\n\"$gm\u002Fgodmode-findings\" init \"$brief_dir\"\n\n# Step 2: build the reconcile batch from the post-dedup merged quality-lens findings.\n# SANITIZE each finding's lens, location, and note before feeding stdin:\n# replace every tab and newline with a single space, then collapse runs of\n# whitespace to one space. The helper's reconcile stdin parser is raw\n# tab-delimited — an unsanitized tab or newline in a note would shift fields\n# or split a line. The helper percent-encodes on write; sanitize is the\n# source-side guard. This whitespace-collapse matches the helper's own\n# match-key normalization, so it does NOT perturb cross-run identity.\nbatch_file=$(mktemp \"${TMPDIR:-\u002Ftmp}\u002Fverify-findings.XXXXXX\")\nwhile IFS= read -r finding; do  # merged_findings = in-memory post-dedup finding set (placeholder)\n  lens=$(     printf '%s' \"$finding\" | ... | tr '\\t\\n' '  ' | tr -s ' ')\n  sev=$(      printf '%s' \"$finding\" | ...)\n  conf=$(     printf '%s' \"$finding\" | ...)\n  location=$( printf '%s' \"$finding\" | ... | tr '\\t\\n' '  ' | tr -s ' ')\n  note=$(     printf '%s' \"$finding\" | ... | tr '\\t\\n' '  ' | tr -s ' ')\n  printf '%s\\t%s\\t%s\\t%s\\t%s\\n' \"$lens\" \"$sev\" \"$conf\" \"$location\" \"$note\"\ndone \u003C \"$merged_findings\" >> \"$batch_file\"\n\n# Step 3: feed the batch to reconcile; capture outcome lines (new\u002Frecurring\u002Freopened\u002Fwaived-kept).\n# A non-zero reconcile exit MUST surface as an error — do NOT silently fall back\n# to the in-memory merge.\nreconcile_output=$(\"$gm\u002Fgodmode-findings\" reconcile \"$brief_dir\" \u003C \"$batch_file\") || {\n  echo \"ERROR: godmode-findings reconcile failed — findings not persisted.\" >&2\n  rm -f \"$batch_file\"\n  exit 1\n}\nrm -f \"$batch_file\"\n```\n\n**Empty merged set:** still run `init` (idempotent); feed an empty batch to `reconcile` or skip it — but **never** clear or rewrite `FINDINGS.md` from scratch. A clean run must not wipe prior findings.\n\n**Compute stale.** `reconcile` emits one outcome word per finding on stdout — exactly the four words `new`, `recurring`, `reopened`, or `waived-kept`. The word `stale` is NOT emitted by the helper; it is computed skill-side. After `reconcile` returns, compute stale by diffing the IDs reconcile re-reported this run against the IDs currently open in the store:\n\n```bash\n# Parse the IDs reconcile touched this run (one per \"Fn \u003Coutcome>\" line).\nrerun_ids=$(printf '%s\\n' \"$reconcile_output\" | awk '{print $1}')\n\n# IDs of all findings still open AFTER this reconcile run.\n# (reconcile never auto-closes; open findings not in this batch stay open = stale.)\nopen_ids=$(\"$gm\u002Fgodmode-findings\" list \"$brief_dir\" --open | awk -F'|' '{gsub(\u002F^[[:space:]]+|[[:space:]]+$\u002F,\"\",$2); print $2}')\n\n# stale = open IDs that reconcile did NOT touch this run.\nstale_count=0\nwhile IFS= read -r oid; do\n  [ -n \"$oid\" ] || continue\n  matched=0\n  while IFS= read -r rid; do\n    [ -n \"$rid\" ] || continue\n    if [ \"$oid\" = \"$rid\" ]; then\n      matched=1\n      break\n    fi\n  done \u003C\u003CRERUN_EOF\n$rerun_ids\nRERUN_EOF\n  if [ \"$matched\" -eq 0 ]; then\n    stale_count=$((stale_count + 1))\n  fi\ndone \u003C\u003COPEN_EOF\n$open_ids\nOPEN_EOF\n```\n\n**Count reconcile outcomes** from `$reconcile_output` for the delta summary in §output:\n\n```bash\nnew_count=$(      printf '%s\\n' \"$reconcile_output\" | grep -c ' new$'          || true)\nrecurring_count=$(printf '%s\\n' \"$reconcile_output\" | grep -c ' recurring$'    || true)\nreopened_count=$( printf '%s\\n' \"$reconcile_output\" | grep -c ' reopened$'     || true)\nwaivedkept_count=$(printf '%s\\n' \"$reconcile_output\" | grep -c ' waived-kept$' || true)\n```\n\n### 5. Classify\n\nAssign COVERED \u002F PARTIAL \u002F MISSING to each criterion under the strictness rule above, using `@verifier`'s goal-backward analysis. Attach the evidence inline: `file:line`, the test name, or a short slice of command output. For PARTIAL and MISSING, state precisely what is unmet.\n\n### 6. Record workflow state\n\n\"Done\" has **two independent axes**: AC-coverage (do the goals hold?) and the findings gate (are there open blocking findings?). `next_command=\u002Fship` is correct **only when both are clear**. So this step first records the live open-blocking count, then branches the handoff three ways.\n\n**Record `open_blocking` on every run.** After `reconcile` (above), read the live open-blocking count from the store — the same `--blocking` predicate `\u002Fship`'s gate trusts — and record it on **every** run, regardless of which branch below is taken (reuse the `brief_dir` already resolved in §1). This recorded value is **advisory**: it lets `\u002Fgodmode` surface the right next command. `\u002Fship`'s gate never trusts it — it always reads its own live count.\n\n```bash\ngm=$(for c in \"${CLAUDE_PLUGIN_ROOT:-}\" \"$HOME\u002F.claude\" .; do [ -x \"$c\u002Fbin\u002Fgodmode-findings\" ] && { echo \"$c\u002Fbin\"; break; }; done)\nopen_blocking=$(\"$gm\u002Fgodmode-findings\" count \"$brief_dir\" --blocking)\n\"$gm\u002Fgodmode-state\" set open_blocking \"$open_blocking\"\n```\n\nThis `count` call is **read-only** and within `\u002Fverify`'s ownership invariant: verify only ever calls `godmode-findings` `init` \u002F `reconcile` \u002F `list` \u002F `count` — **never** `transition` or `waive`, and it never auto-closes a finding.\n\nThen branch the handoff three ways:\n\n**(a) Every criterion COVERED *and* `open_blocking == 0`** — both axes clear; point the workflow at shipping:\n\n```bash\ngm=$(for c in \"${CLAUDE_PLUGIN_ROOT:-}\" \"$HOME\u002F.claude\" .; do [ -x \"$c\u002Fbin\u002Fgodmode-state\" ] && { echo \"$c\u002Fbin\"; break; }; done)\n\"$gm\u002Fgodmode-state\" set active_unit \"$N\"\n\"$gm\u002Fgodmode-state\" set status \"verified\"\n\"$gm\u002Fgodmode-state\" set next_command \"\u002Fship\"\n```\n\n**(b) Every criterion COVERED *but* `open_blocking > 0`** — the unit's goals are met, but open blocking findings remain. The loop isn't done: point the user at the fix loop, **not** `\u002Fship`:\n\n```bash\ngm=$(for c in \"${CLAUDE_PLUGIN_ROOT:-}\" \"$HOME\u002F.claude\" .; do [ -x \"$c\u002Fbin\u002Fgodmode-state\" ] && { echo \"$c\u002Fbin\"; break; }; done)\n\"$gm\u002Fgodmode-state\" set active_unit \"$N\"\n\"$gm\u002Fgodmode-state\" set status \"verified | blocking findings open\"\n\"$gm\u002Fgodmode-state\" set next_command \"\u002Fbuild $N --fix\"\n```\n\n**(c) Any criterion PARTIAL or MISSING** — the goals are not met; leave the next command pointed back at building:\n\n```bash\ngm=$(for c in \"${CLAUDE_PLUGIN_ROOT:-}\" \"$HOME\u002F.claude\" .; do [ -x \"$c\u002Fbin\u002Fgodmode-state\" ] && { echo \"$c\u002Fbin\"; break; }; done)\n\"$gm\u002Fgodmode-state\" set active_unit \"$N\"\n\"$gm\u002Fgodmode-state\" set status \"verify found gaps\"\n\"$gm\u002Fgodmode-state\" set next_command \"\u002Fbuild $N\"\n```\n\n---\n\n## Output\n\n\u003C!-- Output follows the in-skill output convention: godmode:output-convention — see rules\u002Fgodmode-output.md -->\n\nThe report has **two sections**: (a) the goal-backward AC-coverage verdict, then (b) the merged review findings. It leads with the verdict (the terminal state), summarizes what was found, and ends on the single next-step `\u002Fcommand` below.\n\n### (a) AC-coverage verdict\n\nA per-criterion verdict table, then a verdict line.\n\n```markdown\n## Verification — unit N\n\n| Criterion | Verdict | Evidence |\n|-----------|---------|----------|\n| [AC-1] [short restatement] | COVERED | path\u002Fto\u002Ffile.sh:42 — implements X; `bats tests\u002Ffoo.bats` passes (3 ok) |\n| [AC-2] [short restatement] | PARTIAL | handler exists at api.ts:88 but the 404 branch is unhandled — no test |\n| [AC-3] [short restatement] | MISSING | no implementation found; grep for `placeholder` returns nothing |\n\n**Verdict:** N COVERED \u002F N PARTIAL \u002F N MISSING.\n```\n\n### (b) Review findings\n\nThe rendered findings derive from `\"$gm\u002Fgodmode-findings\" list \"$brief_dir\" --open --decode` — the persisted, decoded truth, including findings carried over from prior runs and waive reasons. This is NOT the ephemeral in-memory merge; it is the authoritative store after `reconcile` has run.\n\nOpen the output of that command and format it grouped by lens, ordered CRITICAL → WARNING → NIT.\n\nAdd a one-line delta summary immediately above the findings table:\n\n```\nFindings delta: N new · N recurring · N reopened · N waived-kept · N stale\n```\n\nWhere the first four counts (`new`, `recurring`, `reopened`, `waived-kept`) come from `reconcile`'s stdout outcome lines, and `stale` is the skill-computed count from the `list --open` diff (the open findings whose identity was not in this run's batch).\n\n```markdown\n## Review findings — unit N\n\nFindings delta: 1 new · 2 recurring · 0 reopened · 0 waived-kept · 1 stale\n\n**code-reviewer**\n- CRITICAL (HIGH) — api.ts:88 — 404 branch returns 200, masking the error.\n\n**security-auditor**\n- WARNING (MEDIUM) — db.ts:14 — query built by string concat; use a parameterized query.\n\n**test-reviewer**\n- NIT (HIGH) — foo.test.ts:30 — happy path only; add the empty-input case.\n```\n\nIf `list --open --decode` returns no rows, say: \"No open review findings.\"\n\nThen the next step:\n\n- **All COVERED** → \"Unit N verified — every criterion is COVERED with evidence. Run `\u002Fship`.\"\n- **Any PARTIAL \u002F MISSING** → \"Unit N is not done: [list the PARTIAL\u002FMISSING criteria and exactly what's unmet]. Run `\u002Fbuild N` to close the gaps.\"\n\nBe strict and specific. A vague \"looks good\" is not a verification.\n\n---\n\n## Related\n\n- **\u002Fbrief N** — defines the acceptance criteria this skill verifies against.\n- **\u002Fplan N** — its verification plan tells you how each criterion was meant to be checked.\n- **\u002Fbuild N** — produced the commits under verification; the step to re-run when gaps remain.\n- **\u002Fship** — next step once every criterion is COVERED.\n- **\u002Fgodmode** — reads the workflow state this skill records and tells the user the next command.\n\n**Spine:** `\u002Fmission` → `\u002Fbrief N` → `\u002Fplan N` → `\u002Fbuild N` → `\u002Fverify N` → `\u002Fship`. Verify is the goal-backward gate: every brief criterion classified COVERED \u002F PARTIAL \u002F MISSING with evidence, so \"done\" means done.\n","# Verify\n\nDecide what is **truly done** for roadmap unit **$N** by working **goal-backward**: start from the brief's acceptance criteria, not from the diff. For **each** criterion, return a verdict — **COVERED \u002F PARTIAL \u002F MISSING** — backed by concrete evidence (a `file:line`, a passing test name, or command output). A diff can look big and still miss a goal; only the goals decide the verdict.\n\nRun after `\u002Fbuild N` has produced commits. Verify is the gate before shipping: if every criterion is COVERED, the unit is ready for `\u002Fship`. This is the fifth step of the spine: `\u002Fmission` → `\u002Fbrief N` → `\u002Fplan N` → `\u002Fbuild N` → **`\u002Fverify N`** → `\u002Fship`.\n\nThis is a **read-only** operation. You inspect files, search the codebase, read the unit's diff, run the project's test command, and dispatch review lenses that themselves only read. You do **not** write or edit source — your only writes are workflow-state updates via `bin\u002Fgodmode-state` and findings persistence via `bin\u002Fgodmode-findings`. `\u002Fverify` only ever calls `godmode-findings init`, `reconcile`, and `list` — it **never** calls `transition` or `waive` and **never** auto-closes a finding. The `open→fixed` transition is `\u002Fbuild`'s job; a finding that no lens re-reports this run stays `open` and is reported as stale.\n\n---\n\n## Auto Mode\n\nWhen `## Auto Mode Active` is present in context: do not ask clarifying questions. Locate the brief and plan for unit `$N`, run the project's test command yourself to gather evidence, classify every criterion, and report. Treat user course-corrections as normal input.\n\nWhen Auto Mode is absent, still avoid an interview — verification is mechanical. Ask only if you genuinely cannot find the brief or determine the project's test command.\n\n---\n\n## Strictness — the core rule\n\n**Never report PARTIAL as COVERED. \"Claimed\" is not \"verified\".**\n\n- **COVERED** — you have **concrete evidence** the criterion is met: a `file:line` that implements it, a named test that exercises it and passes, or command output that demonstrates the observable result the brief asked for. No evidence → not COVERED.\n- **PARTIAL** — the criterion is partly met: some of the behavior exists, or it exists but a sub-condition or edge case from the criterion is unmet or unproven. Say exactly what is missing.\n- **MISSING** — no evidence the criterion is met, or evidence that it is not.\n\nWhen in doubt between COVERED and PARTIAL, choose **PARTIAL**. A code comment, a TODO, a stub, or a step that merely *claims* to do the work is **not** evidence. A test that exists but does not run (or is skipped) is **not** evidence — nor is one that trivially passes without exercising the criterion (e.g. asserts `true`, or never calls the code under test).\n\n---\n\n## Process\n\n**Resolving the godmode helpers.** The `godmode-*` helpers live in the plugin install dir — **not** the consumer repo you're working in — so a bare `bin\u002Fgodmode-*` path fails from another project's working directory. Every `bash` block below resolves their location into `$gm` first (plugin mode → `$CLAUDE_PLUGIN_ROOT\u002Fbin`, manual install → `~\u002F.claude\u002Fbin`, in-repo → `.\u002Fbin`) and calls `\"$gm\u002Fgodmode-\u003Cname>\"`. Keep the resolver line; never call a helper by a bare relative path.\n\n### 1. Read the goals\n\nFind the brief directory for unit **$N** and read its acceptance criteria. `NN` is `$N` zero-padded to two digits (unit `3` → `03`), matching the directory `\u002Fbrief N` created.\n\n```bash\nNN=$(printf '%02d' \"$N\")\ngm=$(for c in \"${CLAUDE_PLUGIN_ROOT:-}\" \"$HOME\u002F.claude\" .; do [ -x \"$c\u002Fbin\u002Fgodmode-state\" ] && { echo \"$c\u002Fbin\"; break; }; done)\nmission_id=$(\"$gm\u002Fgodmode-state\" get mission_id)\nbrief_dir=$(ls -d .planning\u002Fmissions\u002F${mission_id}\u002Fbriefs\u002F${NN}-* 2>\u002Fdev\u002Fnull | head -1)\n```\n\nIf no brief directory for `$N` exists, stop and tell the user to run `\u002Fbrief $N` first — there are no goals to verify against.\n\nRead, in order:\n\n- `${brief_dir}\u002FBRIEF.md` — the **Spec — acceptance criteria**. These are the goals you verify against, each by its ID.\n- `${brief_dir}\u002FPLAN.md` if present — its **Verification plan** tells you, per criterion, how it was meant to be checked (the command to run, output to observe, or file to inspect). Use it as a guide, but it does not replace gathering your own evidence.\n- `.planning\u002FPROJECT.md` — constraints the unit had to respect.\n\n### 2. Gather evidence per criterion\n\nFor **each** acceptance criterion, go and find the proof — goal-backward:\n\n- **Read \u002F Grep \u002F Glob** the codebase for the `file:line` that implements the criterion.\n- **Run the project's test command** when a criterion is behavioral, and capture the passing (or failing) output. Use the command the PLAN.md verification entry names, or the project's detected runner (`bats`, `npm test`, `pytest`, `go test`, …).\n- Inspect command output for the exact observable result the brief asked for (the status code, the file written, the placeholder rendered, the zero-warning lint run).\n\nA criterion is only COVERED if the evidence you gathered demonstrates the brief's observable result — not merely that related code exists.\n\nWhen `.planning\u002FSTANDARDS.md` is present, judge the change against it as authoritative project context over the generic defaults where it has spoken (see \"Project Standards Precedence\" in `rules\u002Fgodmode-coding.md`).\n\n**Model profile.** Before spawning any review\u002Fverifier agent, resolve the active model profile from `${CLAUDE_PLUGIN_OPTION_MODEL_PROFILE:-balanced}`, then call the resolver `\"$gm\u002Fgodmode-model\" \u003Cagent>` (resolve `$gm` as the **Resolving the godmode helpers** note above shows) to obtain the model for that agent under the active profile. Pass that model to the Agent tool's `model` override at spawn time. The resolver also reports the agent's effort, but **`effort` is frontmatter-only and is NOT set at spawn** (platform limitation — effort cannot be overridden when spawning an agent), so override **only** `model`; effort stays whatever the agent's frontmatter declares.\n\n### 3. Fan out the review lenses\n\nVerifying \"done\" has two halves. **`@verifier` owns AC-coverage** — does the unit meet the brief's goals? **Five code-quality lenses own the findings** — is the code that meets those goals sound? Run both halves **in parallel**: in a single message, dispatch **all six** agents concurrently (one Agent call per lens plus `@verifier`), each resolving its model via `\"$gm\u002Fgodmode-model\" \u003Cagent>` as the **Model profile** note above requires.\n\nScope every lens to **unit $N's changes only** — the diff the unit produced, e.g. `git diff` for the unit's commits — not the whole codebase. The six agents:\n\n- `@verifier` — goal-backward AC-coverage (drives §4 below; owns COVERED \u002F PARTIAL \u002F MISSING).\n- `code-reviewer` — correctness, structure, error handling, readability.\n- `security-auditor` — injection, secrets, unsafe input, path\u002Fcommand traversal.\n- `perf-reviewer` — hot paths, needless work, allocations, N+1 \u002F blocking calls.\n- `convention-reviewer` — adherence to the repo's detected patterns and naming.\n- `test-reviewer` — test coverage, meaningful assertions, missing edge\u002Ferror cases.\n\n**Coverage-delta check.** When the project produces a coverage value (the consumer's coverage tooling yields a baseline and a current figure), feed both to the bundled `coverage-diff.sh` to report the signed delta and flag a regression — deterministic evidence for the `test-reviewer` lens rather than an eyeballed guess. The script prints the signed delta (`+5` \u002F `0` \u002F `-5`) on stdout and exits non-zero when current coverage regressed beyond the tolerance. Resolve it across install modes:\n\n```bash\ndiff_sh=\"\"\nfor cand in \\\n  \"${CLAUDE_PLUGIN_ROOT:-}\u002Fskills\u002Fverify\u002Fscripts\u002Fcoverage-diff.sh\" \\\n  \"$HOME\u002F.claude\u002Fskills\u002Fverify\u002Fscripts\u002Fcoverage-diff.sh\" \\\n  \"skills\u002Fverify\u002Fscripts\u002Fcoverage-diff.sh\"; do\n  [ -n \"$cand\" ] && [ -x \"$cand\" ] && { diff_sh=\"$cand\"; break; }\ndone\nif [ -n \"$diff_sh\" ]; then\n  \"$diff_sh\" \"$baseline\" \"$current\"\nelse\n  # Make the skip visible — a missing script must not silently no-op the check.\n  >&2 echo \"warning: coverage-diff.sh not found — skipping coverage-delta check\"\nfi\n```\n\nA non-zero exit means coverage regressed — a finding for `test-reviewer`, not a hard stop here (`\u002Fverify` is read-only).\n\n**Shared finding schema.** Each lens reports every finding as a structured record so findings merge cleanly:\n\n```\n{ lens, severity, confidence, location, note }\n```\n\n- `lens` — which reviewer produced it (`code-reviewer`, `security-auditor`, …).\n- `severity` — one of **CRITICAL | WARNING | NIT**.\n- `confidence` — one of **HIGH | MEDIUM | LOW** (the lens's certainty the finding is real and actionable).\n- `location` — a `file:line` anchor in the unit's diff.\n- `note` — one concrete sentence: what is wrong and why.\n\n### 4. Merge the findings\n\nAfter all lenses return, merge their findings into one set:\n\n- **Dedup** — collapse findings that multiple lenses raise about the same `file:line` \u002F issue into a single record; keep the highest severity and note the contributing lenses.\n- **Drop LOW-confidence NITs** — discard any finding that is both `NIT` and `LOW` confidence; it is noise.\n- **Group by lens**, and within the report **order severity CRITICAL → WARNING → NIT** so the most important findings surface first.\n\nThe `@verifier` lens does not feed this findings set — its output drives the AC-coverage verdict in §5 (Classify) instead.\n\n### 4b. Confirm the blocking findings\n\nBefore persisting, subject the blocking-eligible findings to adversarial confirmation. A finding is **blocking-eligible** when its `severity` is `CRITICAL` OR its `confidence` is `HIGH` — exactly the predicate `godmode-findings --blocking` uses. All other findings (neither CRITICAL nor HIGH-confidence) are non-blocking and pass straight through to the persist step unchanged.\n\n**Step 1 — Mechanical pre-filter (UNCONDITIONAL — runs in every profile including budget).**\n\nFor each blocking-eligible finding, check whether its `location`'s **file** appears anywhere in this unit's diff (the same `git diff` for the unit's commits already gathered in §3). If the finding's **file** does NOT appear in the diff at all:\n\n- DROP the finding with reason `out-of-diff`.\n- Do NOT spawn a skeptic for it.\n\nA finding whose file IS in the diff (regardless of whether the exact line number matches) MUST pass through to the skeptic. The pre-filter removes hallucinated or wrong-file anchors — NOT drifted line numbers within a changed file. Line-level questions (e.g. an adjacent or shifted line in a file that IS in the diff) are adjudicated by the skeptic, not the pre-filter.\n\nThis pre-filter is cheap and unconditional. It removes stale wrong-file artifacts from the confirmation batch regardless of the active model profile.\n\n**Step 2 — Per-profile skeptic spawn.**\n\nResolve `${CLAUDE_PLUGIN_OPTION_MODEL_PROFILE:-balanced}` (the same way §2 does) and apply the profile policy:\n\n- **quality** — confirm ALL blocking-eligible findings that survived the pre-filter.\n- **balanced** — confirm only findings with `severity = CRITICAL` (skip HIGH-confidence WARNINGs).\n- **budget** — SKIP the skeptic spawn entirely. The pre-filter survivors pass through to the persist step **unchanged** (treated as UPHELD; no verdict step runs).\n\nFor each finding selected by the profile policy, spawn **exactly one** `@finding-skeptic` via the Agent tool (the same way §3 dispatches lenses), with its model resolved via:\n\n```bash\ngm=$(for c in \"${CLAUDE_PLUGIN_ROOT:-}\" \"$HOME\u002F.claude\" .; do [ -x \"$c\u002Fbin\u002Fgodmode-model\" ] && { echo \"$c\u002Fbin\"; break; }; done)\nskeptic_model=$(\"$gm\u002Fgodmode-model\" finding-skeptic)\n```\n\nPass `skeptic_model` as the Agent tool's `model` parameter when spawning `@finding-skeptic` (mirroring how §3 passes per-lens models). Pass the agent: (a) the single finding record (`lens`, `severity`, `confidence`, `location`, `note`), and (b) the unit diff. The skeptic is read-only. It returns exactly one verdict and one reason sentence.\n\nFindings NOT selected by the profile policy (e.g. HIGH-conf WARNINGs in balanced, or all survivors in budget) pass through to Step 3 unchanged.\n\n**Step 3 — Verdict → action.**\n\nApply the following state machine to each skeptic verdict:\n\n| Verdict | Action |\n|---|---|\n| **UPHELD** | Finding passes through UNCHANGED (original `sev`\u002F`conf`) into the reconcile batch. |\n| **REFUTED — not real** | DROP the finding — it is NOT added to the reconcile batch at all. |\n| **REFUTED — over-rated** | DOWNGRADE (soft-kill): the finding is persisted but exits `--blocking`. For a **non-CRITICAL** finding, set `conf → MEDIUM`. For a **CRITICAL** finding, set `sev → WARNING` AND `conf → MEDIUM`. The downgraded finding IS added to the reconcile batch with its new `sev`\u002F`conf` — it stays visible in `FINDINGS.md` and the report. |\n\n**Default-UPHOLD:** Demote a finding ONLY on an affirmative, evidence-backed refutation. If the skeptic is uncertain, if evidence is ambiguous, or if the skeptic cannot locate the cited code, the verdict MUST be UPHELD. (The `@finding-skeptic` agent enforces this rule internally; the state machine here honors it: ambiguity → UPHELD → pass through unchanged.)\n\n**Result:** the batch fed to `reconcile` below carries the POST-confirmation `sev`\u002F`conf` for every finding. Because `reconcile` refreshes severity and confidence on a recurring match, no separate `godmode-findings` command is needed — the updated values flow through automatically.\n\n**Persist findings.** After merging and deduplicating the five code-quality lens findings (the post-dedup filtered set — `@verifier`'s AC-coverage output is NOT included here), persist them via `godmode-findings`:\n\n```bash\ngm=$(for c in \"${CLAUDE_PLUGIN_ROOT:-}\" \"$HOME\u002F.claude\" .; do [ -x \"$c\u002Fbin\u002Fgodmode-state\" ] && { echo \"$c\u002Fbin\"; break; }; done)\n\n# Step 1: init unconditionally — idempotent; reconcile errors if FINDINGS.md is absent.\n\"$gm\u002Fgodmode-findings\" init \"$brief_dir\"\n\n# Step 2: build the reconcile batch from the post-dedup merged quality-lens findings.\n# SANITIZE each finding's lens, location, and note before feeding stdin:\n# replace every tab and newline with a single space, then collapse runs of\n# whitespace to one space. The helper's reconcile stdin parser is raw\n# tab-delimited — an unsanitized tab or newline in a note would shift fields\n# or split a line. The helper percent-encodes on write; sanitize is the\n# source-side guard. This whitespace-collapse matches the helper's own\n# match-key normalization, so it does NOT perturb cross-run identity.\nbatch_file=$(mktemp \"${TMPDIR:-\u002Ftmp}\u002Fverify-findings.XXXXXX\")\nwhile IFS= read -r finding; do  # merged_findings = in-memory post-dedup finding set (placeholder)\n  lens=$(     printf '%s' \"$finding\" | ... | tr '\\t\\n' '  ' | tr -s ' ')\n  sev=$(      printf '%s' \"$finding\" | ...)\n  conf=$(     printf '%s' \"$finding\" | ...)\n  location=$( printf '%s' \"$finding\" | ... | tr '\\t\\n' '  ' | tr -s ' ')\n  note=$(     printf '%s' \"$finding\" | ... | tr '\\t\\n' '  ' | tr -s ' ')\n  printf '%s\\t%s\\t%s\\t%s\\t%s\\n' \"$lens\" \"$sev\" \"$conf\" \"$location\" \"$note\"\ndone \u003C \"$merged_findings\" >> \"$batch_file\"\n\n# Step 3: feed the batch to reconcile; capture outcome lines (new\u002Frecurring\u002Freopened\u002Fwaived-kept).\n# A non-zero reconcile exit MUST surface as an error — do NOT silently fall back\n# to the in-memory merge.\nreconcile_output=$(\"$gm\u002Fgodmode-findings\" reconcile \"$brief_dir\" \u003C \"$batch_file\") || {\n  echo \"ERROR: godmode-findings reconcile failed — findings not persisted.\" >&2\n  rm -f \"$batch_file\"\n  exit 1\n}\nrm -f \"$batch_file\"\n```\n\n**Empty merged set:** still run `init` (idempotent); feed an empty batch to `reconcile` or skip it — but **never** clear or rewrite `FINDINGS.md` from scratch. A clean run must not wipe prior findings.\n\n**Compute stale.** `reconcile` emits one outcome word per finding on stdout — exactly the four words `new`, `recurring`, `reopened`, or `waived-kept`. The word `stale` is NOT emitted by the helper; it is computed skill-side. After `reconcile` returns, compute stale by diffing the IDs reconcile re-reported this run against the IDs currently open in the store:\n\n```bash\n# Parse the IDs reconcile touched this run (one per \"Fn \u003Coutcome>\" line).\nrerun_ids=$(printf '%s\\n' \"$reconcile_output\" | awk '{print $1}')\n\n# IDs of all findings still open AFTER this reconcile run.\n# (reconcile never auto-closes; open findings not in this batch stay open = stale.)\nopen_ids=$(\"$gm\u002Fgodmode-findings\" list \"$brief_dir\" --open | awk -F'|' '{gsub(\u002F^[[:space:]]+|[[:space:]]+$\u002F,\"\",$2); print $2}')\n\n# stale = open IDs that reconcile did NOT touch this run.\nstale_count=0\nwhile IFS= read -r oid; do\n  [ -n \"$oid\" ] || continue\n  matched=0\n  while IFS= read -r rid; do\n    [ -n \"$rid\" ] || continue\n    if [ \"$oid\" = \"$rid\" ]; then\n      matched=1\n      break\n    fi\n  done \u003C\u003CRERUN_EOF\n$rerun_ids\nRERUN_EOF\n  if [ \"$matched\" -eq 0 ]; then\n    stale_count=$((stale_count + 1))\n  fi\ndone \u003C\u003COPEN_EOF\n$open_ids\nOPEN_EOF\n```\n\n**Count reconcile outcomes** from `$reconcile_output` for the delta summary in §output:\n\n```bash\nnew_count=$(      printf '%s\\n' \"$reconcile_output\" | grep -c ' new$'          || true)\nrecurring_count=$(printf '%s\\n' \"$reconcile_output\" | grep -c ' recurring$'    || true)\nreopened_count=$( printf '%s\\n' \"$reconcile_output\" | grep -c ' reopened$'     || true)\nwaivedkept_count=$(printf '%s\\n' \"$reconcile_output\" | grep -c ' waived-kept$' || true)\n```\n\n### 5. Classify\n\nAssign COVERED \u002F PARTIAL \u002F MISSING to each criterion under the strictness rule above, using `@verifier`'s goal-backward analysis. Attach the evidence inline: `file:line`, the test name, or a short slice of command output. For PARTIAL and MISSING, state precisely what is unmet.\n\n### 6. Record workflow state\n\n\"Done\" has **two independent axes**: AC-coverage (do the goals hold?) and the findings gate (are there open blocking findings?). `next_command=\u002Fship` is correct **only when both are clear**. So this step first records the live open-blocking count, then branches the handoff three ways.\n\n**Record `open_blocking` on every run.** After `reconcile` (above), read the live open-blocking count from the store — the same `--blocking` predicate `\u002Fship`'s gate trusts — and record it on **every** run, regardless of which branch below is taken (reuse the `brief_dir` already resolved in §1). This recorded value is **advisory**: it lets `\u002Fgodmode` surface the right next command. `\u002Fship`'s gate never trusts it — it always reads its own live count.\n\n```bash\ngm=$(for c in \"${CLAUDE_PLUGIN_ROOT:-}\" \"$HOME\u002F.claude\" .; do [ -x \"$c\u002Fbin\u002Fgodmode-findings\" ] && { echo \"$c\u002Fbin\"; break; }; done)\nopen_blocking=$(\"$gm\u002Fgodmode-findings\" count \"$brief_dir\" --blocking)\n\"$gm\u002Fgodmode-state\" set open_blocking \"$open_blocking\"\n```\n\nThis `count` call is **read-only** and within `\u002Fverify`'s ownership invariant: verify only ever calls `godmode-findings` `init` \u002F `reconcile` \u002F `list` \u002F `count` — **never** `transition` or `waive`, and it never auto-closes a finding.\n\nThen branch the handoff three ways:\n\n**(a) Every criterion COVERED *and* `open_blocking == 0`** — both axes clear; point the workflow at shipping:\n\n```bash\ngm=$(for c in \"${CLAUDE_PLUGIN_ROOT:-}\" \"$HOME\u002F.claude\" .; do [ -x \"$c\u002Fbin\u002Fgodmode-state\" ] && { echo \"$c\u002Fbin\"; break; }; done)\n\"$gm\u002Fgodmode-state\" set active_unit \"$N\"\n\"$gm\u002Fgodmode-state\" set status \"verified\"\n\"$gm\u002Fgodmode-state\" set next_command \"\u002Fship\"\n```\n\n**(b) Every criterion COVERED *but* `open_blocking > 0`** — the unit's goals are met, but open blocking findings remain. The loop isn't done: point the user at the fix loop, **not** `\u002Fship`:\n\n```bash\ngm=$(for c in \"${CLAUDE_PLUGIN_ROOT:-}\" \"$HOME\u002F.claude\" .; do [ -x \"$c\u002Fbin\u002Fgodmode-state\" ] && { echo \"$c\u002Fbin\"; break; }; done)\n\"$gm\u002Fgodmode-state\" set active_unit \"$N\"\n\"$gm\u002Fgodmode-state\" set status \"verified | blocking findings open\"\n\"$gm\u002Fgodmode-state\" set next_command \"\u002Fbuild $N --fix\"\n```\n\n**(c) Any criterion PARTIAL or MISSING** — the goals are not met; leave the next command pointed back at building:\n\n```bash\ngm=$(for c in \"${CLAUDE_PLUGIN_ROOT:-}\" \"$HOME\u002F.claude\" .; do [ -x \"$c\u002Fbin\u002Fgodmode-state\" ] && { echo \"$c\u002Fbin\"; break; }; done)\n\"$gm\u002Fgodmode-state\" set active_unit \"$N\"\n\"$gm\u002Fgodmode-state\" set status \"verify found gaps\"\n\"$gm\u002Fgodmode-state\" set next_command \"\u002Fbuild $N\"\n```\n\n---\n\n## Output\n\n\u003C!-- Output follows the in-skill output convention: godmode:output-convention — see rules\u002Fgodmode-output.md -->\n\nThe report has **two sections**: (a) the goal-backward AC-coverage verdict, then (b) the merged review findings. It leads with the verdict (the terminal state), summarizes what was found, and ends on the single next-step `\u002Fcommand` below.\n\n### (a) AC-coverage verdict\n\nA per-criterion verdict table, then a verdict line.\n\n```markdown\n## Verification — unit N\n\n| Criterion | Verdict | Evidence |\n|-----------|---------|----------|\n| [AC-1] [short restatement] | COVERED | path\u002Fto\u002Ffile.sh:42 — implements X; `bats tests\u002Ffoo.bats` passes (3 ok) |\n| [AC-2] [short restatement] | PARTIAL | handler exists at api.ts:88 but the 404 branch is unhandled — no test |\n| [AC-3] [short restatement] | MISSING | no implementation found; grep for `placeholder` returns nothing |\n\n**Verdict:** N COVERED \u002F N PARTIAL \u002F N MISSING.\n```\n\n### (b) Review findings\n\nThe rendered findings derive from `\"$gm\u002Fgodmode-findings\" list \"$brief_dir\" --open --decode` — the persisted, decoded truth, including findings carried over from prior runs and waive reasons. This is NOT the ephemeral in-memory merge; it is the authoritative store after `reconcile` has run.\n\nOpen the output of that command and format it grouped by lens, ordered CRITICAL → WARNING → NIT.\n\nAdd a one-line delta summary immediately above the findings table:\n\n```\nFindings delta: N new · N recurring · N reopened · N waived-kept · N stale\n```\n\nWhere the first four counts (`new`, `recurring`, `reopened`, `waived-kept`) come from `reconcile`'s stdout outcome lines, and `stale` is the skill-computed count from the `list --open` diff (the open findings whose identity was not in this run's batch).\n\n```markdown\n## Review findings — unit N\n\nFindings delta: 1 new · 2 recurring · 0 reopened · 0 waived-kept · 1 stale\n\n**code-reviewer**\n- CRITICAL (HIGH) — api.ts:88 — 404 branch returns 200, masking the error.\n\n**security-auditor**\n- WARNING (MEDIUM) — db.ts:14 — query built by string concat; use a parameterized query.\n\n**test-reviewer**\n- NIT (HIGH) — foo.test.ts:30 — happy path only; add the empty-input case.\n```\n\nIf `list --open --decode` returns no rows, say: \"No open review findings.\"\n\nThen the next step:\n\n- **All COVERED** → \"Unit N verified — every criterion is COVERED with evidence. Run `\u002Fship`.\"\n- **Any PARTIAL \u002F MISSING** → \"Unit N is not done: [list the PARTIAL\u002FMISSING criteria and exactly what's unmet]. Run `\u002Fbuild N` to close the gaps.\"\n\nBe strict and specific. A vague \"looks good\" is not a verification.\n\n---\n\n## Related\n\n- **\u002Fbrief N** — defines the acceptance criteria this skill verifies against.\n- **\u002Fplan N** — its verification plan tells you how each criterion was meant to be checked.\n- **\u002Fbuild N** — produced the commits under verification; the step to re-run when gaps remain.\n- **\u002Fship** — next step once every criterion is COVERED.\n- **\u002Fgodmode** — reads the workflow state this skill records and tells the user the next command.\n\n**Spine:** `\u002Fmission` → `\u002Fbrief N` → `\u002Fplan N` → `\u002Fbuild N` → `\u002Fverify N` → `\u002Fship`. Verify is the goal-backward gate: every brief criterion classified COVERED \u002F PARTIAL \u002F MISSING with evidence, so \"done\" means done.\n",{"name":5,"arguments":43,"description":7,"allowed-tools":45,"argument-hint":46,"user-invocable":47},[44],"N","Read, Grep, Glob, Bash(gm=*), Bash(*godmode-model*), Bash(git diff*), Bash(git log*), Bash(git show*), Bash(*godmode-state*), Bash(*godmode-findings*), Bash(npm test*), Bash(npm run test*), Bash(pnpm test*), Bash(yarn test*), Bash(bats*), Bash(go test*), Bash(cargo test*), Bash(pytest*), Bash(.\u002Fscripts\u002F*test*), Bash(shellcheck*), Bash(.\u002Fscripts\u002Flint*), Bash(*\u002Fskills\u002Fverify\u002Fscripts\u002Fcoverage-diff.sh*), Bash(skills\u002Fverify\u002Fscripts\u002Fcoverage-diff.sh*)",[44],true,"main","717a1f3af996804502df0047840b6c74a1d464c5","skills\u002Fverify",0,"https:\u002F\u002Fgithub.com\u002FSyloRei\u002Fclaude-godmode","https:\u002F\u002Fgithub.com\u002FSyloRei","Nya? Kawai? Desu?","2026-06-08 16:03:07",{"source":8,"skillName":5,"commands":57,"prompt":67,"zipAvailable":47},[58,61,64],{"tool":59,"command":60},"npx","npx skills add SyloRei\u002Fclaude-godmode --skill verify",{"tool":62,"command":63},"bunx","bunx skills add SyloRei\u002Fclaude-godmode --skill verify",{"tool":65,"command":66},"pnpm","pnpm dlx skills add SyloRei\u002Fclaude-godmode --skill verify","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FSyloRei\u002Fclaude-godmode\u002Fblob\u002Fmain\u002Fskills\u002Fverify\u002FSKILL.md",[69],{"path":70,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":73,"sourceHtmlUrl":74},"scripts\u002Fcoverage-diff.sh","SCRIPT","脚本",4579,"https:\u002F\u002Fgithub.com\u002FSyloRei\u002Fclaude-godmode\u002Fblob\u002Fmain\u002Fskills\u002Fverify\u002Fscripts\u002Fcoverage-diff.sh",[76,85,107,136,155,180],{"skillNo":77,"name":78,"nameZh":6,"description":79,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":80,"categories":81,"keywords":82,"publishedAt":38},"01M6HBW3WEVBXANCRWF5YK5BYC","{{name=null}=null}","{{description=null}=null}","https:\u002F\u002Fgithub.com\u002FSyloRei\u002Fclaude-godmode\u002Fblob\u002Fmain\u002Ftemplates\u002Fskill\u002FSKILL.md",[],[78,83,84],"name","true",{"skillNo":86,"name":87,"nameZh":6,"description":88,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":91,"publishedAt":38},"01M6HBVTDPNPD88ZWXT4T5M8EA","triage","Respond to a production incident, outage, or regression in the wild: establish the timeline, assess blast radius, and reconstruct what happened with cited evidence. Use this when something is failing in production and you need to understand it before fixing it.","https:\u002F\u002Fgithub.com\u002FSyloRei\u002Fclaude-godmode\u002Fblob\u002Fmain\u002Fskills\u002Ftriage\u002FSKILL.md",[],[87,92,93,84,20,94,95,96,97,98,99,100,101,102,103,104,105,106],"assess","wild","with","understand","it","respond","production incident","incident","evidence","use","regression","radius","timeline","Production","blast radius",{"skillNo":108,"name":109,"nameZh":6,"description":110,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":111,"categories":112,"keywords":121,"publishedAt":38},"01M6HBVNQ1ASFTJTYT47F8M559","tdd","Build new behavior test-first using strict Red-Green-Refactor cycles. Use this when you want to drive a new feature or behavior from failing tests before writing the implementation.","https:\u002F\u002Fgithub.com\u002FSyloRei\u002Fclaude-godmode\u002Fblob\u002Fmain\u002Fskills\u002Ftdd\u002FSKILL.md",[113,118],{"categoryNo":114,"categoryName":115,"taxonomyType":116,"taxonomyTypeDesc":117},"01JBSEEDCAT000000000000007","代码审查","SCENARIO","使用场景",{"categoryNo":119,"categoryName":120,"taxonomyType":116,"taxonomyTypeDesc":117},"01JBSEEDCAT000000000000023","Skill与智能体开发",[109,122,20,123,124,125,126,127,128,129,130,101,84,131,132,133,134,135],"new feature","red","feature","tests","green","build","implementation","drive","red-green-refactor","behavior","first","refactor","test","writing",{"skillNo":137,"name":138,"nameZh":6,"description":139,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":140,"categories":141,"keywords":142,"publishedAt":38},"01M6HBVH8GX9JCMS5432JZVTMN","ship","Run every canonical quality gate, push the branch, and open a pull request — release in one command. Use when: ship it, ready to ship, create the PR, push and open a PR.","https:\u002F\u002Fgithub.com\u002FSyloRei\u002Fclaude-godmode\u002Fblob\u002Fmain\u002Fskills\u002Fship\u002FSKILL.md",[],[138,143,23,144,27,145,146,32,147,148,33,34,149,150,151,37,29,152,153,154],"canonical","ship it","ready","release","command","branch","open","push","pull","create","quality gate","pr",{"skillNo":156,"name":157,"nameZh":6,"description":158,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":159,"categories":160,"keywords":166,"publishedAt":38},"01M6HBVB6SVSMQPXBMWEWQ4J5M","refine","Mid-mission gap analysis: read the active mission's roadmap and briefs, surface what's missing or underspecified, converge on one gap, and append a NEW numbered work unit plus its full brief — strictly additive. Use when: refine, what are we missing, find gaps in the current mission, add the next unit. Never edits an existing brief or roadmap unit in place — that is \u002Fbrief N's job.","https:\u002F\u002Fgithub.com\u002FSyloRei\u002Fclaude-godmode\u002Fblob\u002Fmain\u002Fskills\u002Frefine\u002FSKILL.md",[161],{"categoryNo":162,"categoryName":163,"taxonomyType":164,"taxonomyTypeDesc":165},"01JBSEEDCAT000000000000031","产品经理","PROFESSION","适用职业",[157,167,168,169,27,30,170,171,172,173,32,174,34,175,35,176,177,178,22,179],"work","active","next","never","append","edit","write","full","analysis","mission","converge","briefs","add",{"skillNo":181,"name":133,"nameZh":6,"description":182,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":183,"categories":184,"keywords":190,"publishedAt":38},"01M6HBV7SGBH14T5K2336RYZWW","Improve code structure without changing behavior, verifying with tests at every step. Use this when you want to restructure, extract, rename, or simplify existing code that already works.","https:\u002F\u002Fgithub.com\u002FSyloRei\u002Fclaude-godmode\u002Fblob\u002Fmain\u002Fskills\u002Frefactor\u002FSKILL.md",[185,186,187],{"categoryNo":114,"categoryName":115,"taxonomyType":116,"taxonomyTypeDesc":117},{"categoryNo":119,"categoryName":120,"taxonomyType":116,"taxonomyTypeDesc":117},{"categoryNo":188,"categoryName":189,"taxonomyType":164,"taxonomyTypeDesc":165},"01JBSEEDCAT000000000000030","开发工程师",[133,131,191,192,193,101,194,195,84,20,94,125,196,197,198],"code","simplify","improve","Existing","at","structure","extract","rename"]