maestro-verify
Use for close, commit, install, push, publish, release, or archive gates.
Local implementation authority does not imply authority for remote or external
state changes.
Precondition: an open bundle with a drafted VERIFY.md. No bundle means the
change is quickfix or Light: verify the changed surface inline and close with
maestro work done; this skill's table pass is a Full-tier instrument. The
evidence-layer vocabulary below still applies to any claim at any tier.
Evidence layers
Proof follows five links. Claim only as far as the last proven link.
source - source-level tests, lint, type checks, or direct inspection.
artifact - the built or packaged output is present and has been read back.
installed - the installed stamp, version, or files match the intended artifact.
live - the running process, pid, or active runtime matches the installed layer.
journey - the real user path reaches the observable outcome end to end.
"Tests pass" is a source claim. A claim that touches install or runtime must
include a readback at that layer. Every proof and VERIFY result lists untested
links explicitly as NOT TESTED, never by omission:
proof: "suite 135 pass @ a52bd4a7 (source); runtime stamp readback a52bd4a7 (installed); live: NOT TESTED"
Assumptions not verified: None
Residual risks: None
Verify
- Cross-check coverage before running anything: every behavior in scope has a
red test that went green, every red test maps to a VERIFY.md scenario or
repo check, and every scenario traces back to a work item's acceptance or an
anti-goal. An orphan on any side is a gap - record and surface it, never
silently proceed past it.
- Run every VERIFY.md scenario against its work item's acceptance/claims and
fill the Result column; run each anti-goal check (grep, diff, readback).
Stamp the pass with its date and commit. Results hold this run only: a
re-run replaces prior results wholesale, and a failed pass leaves its
one-line
failed: note on the work item, never accumulated rounds in
VERIFY.md. The scenario list is frozen once the pass starts: scenarios gain
results here, never rewrites or removals. A scenario that cannot run as
written goes back to maestro-design for a checkable rewrite - do not
invent a substitute measurement.
- Run the repo's checks for the touched surface (tests, lint, types, build),
then freeze and review the task-owned diff: every changed line traces to
the SPEC's scope or a linked work item; nothing unrelated is staged.
- For risky seams, spot-check assertion strength before filling PASS.
First check the tests assert the decided contract itself: the decided
error class, and the message when one was decided - a bare
toThrow()
passes on any thrown value, and a substring matcher like
toThrow(string) passes on a changed message; a decided contract no
assertion pins is a FAIL. Then derive mutants from the record, not at
random: bend the code toward each alternative the linked decisions
rejected - the suite must go red each time, and a survivor is a weak or
missing test and a FAIL of that scenario, not a side note. Last, probe
each input edge no decision settled (whitespace, case, sign, empty) by
mutating the code (e.g. insert an input.trim()), never by only calling
the function - a call shows current behavior, a surviving mutant shows no
test pins it; a suite that stays green under an edge mutant is an open
fork to record, not a pass. Restore after each mutant.
- Re-read the user's exact delivery authority and target before any gate.
- Select one legal next gate at a time: final verification, independent QA or
witness, scoped commit, local install, external delivery, or stop. Do not
bundle gates whose authority differs.
- Read back the actual result: test output, commit hash, installed version. A
started or interrupted command is not delivery evidence.
For substantial diffs, verify in a fresh context: dispatch a subagent that
reads only the bundle and the diff - the implementer verifying their own work
invites confirmation bias. The subagent never fixes anything: mutants it flips
are reverted before reporting, and on FAIL it records the verdict and stops;
routing back to implementation belongs to the parent turn that holds the
user's ask. A subagent that fails to start or report is a dispatch failure,
not evidence: run the checklist in this session instead of polling for it.
On FAIL, route back to maestro-work and leave the exact one-line failed-pass
trace maestro work note <id> "failed: <one line>". The prefix is the literal
lowercase failed: followed by one space. A scenario still failing after three implement
passes - counted from the work item's notes across sessions, not this
session's memory - is a design problem, not an implementation one: stop and
re-settle the decision via maestro-design.
Read-only review method: references/audit.md. When the
failure location is unclear, follow references/triage.md.
Red flags
| The thought |
The reality |
| "It obviously passes - running it is a formality" |
Scenarios exist because "obviously" has been wrong before. Run every one and record the output. |
| "The scenario can't run as written, but this similar check proves the same thing" |
That is a substitute measurement. Route back to maestro-design for a checkable rewrite. |
| "The mutant survived, but the code is clearly fine" |
A surviving mutant is a weak or missing test, and a FAIL of that scenario. |
| "I wrote this diff - I know it works" |
That is the confirmation bias the fresh-context rule exists for. |
| "I'll just fix this small failure while I'm verifying" |
Verify delivers a verdict, never fixes. A FAIL routes back to maestro-work. |
Learn, then close
Before closing, harvest what outlives the bundle
(references/learning.md): a verified correction or
durable constraint becomes a locked decision or a work note - never only chat.
Close order, on PASS with durable ship or handoff proof:
- Overwrite NOTES.md one last time with a dated close-out line citing the
ship evidence (commit hashes or the handoff target).
- Harvest: any mid-flight choice that is hard to reverse, surprising without
context, and a real trade-off is a locked decision with its rejected
alternative; a new domain term is
maestro term add.
maestro bundle close <id>: snapshots the trio into the store and archives
the directory.
The snapshot is the durable memory; after close the directory is disposable
and maestro search still recalls the text.
When the verdict passes but the ship commit has not landed yet, do not leave
the close implicit: set NOTES.md Next Action to "commit, then close bundle".
The turn that lands the commit performs the close in that same turn; a PASS
bundle never stays active across sessions. Never close on a FAIL, and never
stage or commit bundle contents as part of the ship commit.
Quality review is separate from verify: verify owns "does it meet the
contract", review owns "is the code good". Light gets a simplification pass
after green; Full gets one correctness review after verify passes, chosen by
risk (a security review when the diff touches auth, secrets, or input
handling). A code change after the verdict re-runs the affected VERIFY.md
scenarios before close.
Definition of done
Acceptance met, changed surface verified, available test/lint/type/build
checks pass, claims name their falsifier, risky changes carry rollback notes.
Never claim push, release, or publish from local state; those gates are the
user's.
1---2name: maestro-verify3description: Verify and close - cross-check coverage, run the VERIFY table, deliver the verdict, harvest durable lessons into decisions, close the bundle, and never claim remote state from local evidence.4---5<!-- maestro-skill-version: dev -->67# maestro-verify89Use for close, commit, install, push, publish, release, or archive gates.10Local implementation authority does not imply authority for remote or external11state changes.1213Precondition: an open bundle with a drafted VERIFY.md. No bundle means the14change is quickfix or Light: verify the changed surface inline and close with15`maestro work done`; this skill's table pass is a Full-tier instrument. The16evidence-layer vocabulary below still applies to any claim at any tier.1718## Evidence layers1920Proof follows five links. Claim only as far as the last proven link.2122- `source` - source-level tests, lint, type checks, or direct inspection.23- `artifact` - the built or packaged output is present and has been read back.24- `installed` - the installed stamp, version, or files match the intended artifact.25- `live` - the running process, pid, or active runtime matches the installed layer.26- `journey` - the real user path reaches the observable outcome end to end.2728"Tests pass" is a source claim. A claim that touches install or runtime must29include a readback at that layer. Every proof and VERIFY result lists untested30links explicitly as `NOT TESTED`, never by omission:3132```text33proof: "suite 135 pass @ a52bd4a7 (source); runtime stamp readback a52bd4a7 (installed); live: NOT TESTED"34Assumptions not verified: None35Residual risks: None36```3738## Verify3940- Cross-check coverage before running anything: every behavior in scope has a41 red test that went green, every red test maps to a VERIFY.md scenario or42 repo check, and every scenario traces back to a work item's acceptance or an43 anti-goal. An orphan on any side is a gap - record and surface it, never44 silently proceed past it.45- Run every VERIFY.md scenario against its work item's acceptance/claims and46 fill the Result column; run each anti-goal check (grep, diff, readback).47 Stamp the pass with its date and commit. Results hold this run only: a48 re-run replaces prior results wholesale, and a failed pass leaves its49 one-line `failed:` note on the work item, never accumulated rounds in50 VERIFY.md. The scenario list is frozen once the pass starts: scenarios gain51 results here, never rewrites or removals. A scenario that cannot run as52 written goes back to `maestro-design` for a checkable rewrite - do not53 invent a substitute measurement.54- Run the repo's checks for the touched surface (tests, lint, types, build),55 then freeze and review the task-owned diff: every changed line traces to56 the SPEC's scope or a linked work item; nothing unrelated is staged.57- For risky seams, spot-check assertion strength before filling PASS.58 First check the tests assert the decided contract itself: the decided59 error class, and the message when one was decided - a bare `toThrow()`60 passes on any thrown value, and a substring matcher like61 `toThrow(string)` passes on a changed message; a decided contract no62 assertion pins is a FAIL. Then derive mutants from the record, not at63 random: bend the code toward each alternative the linked decisions64 rejected - the suite must go red each time, and a survivor is a weak or65 missing test and a FAIL of that scenario, not a side note. Last, probe66 each input edge no decision settled (whitespace, case, sign, empty) by67 mutating the code (e.g. insert an `input.trim()`), never by only calling68 the function - a call shows current behavior, a surviving mutant shows no69 test pins it; a suite that stays green under an edge mutant is an open70 fork to record, not a pass. Restore after each mutant.71- Re-read the user's exact delivery authority and target before any gate.72- Select one legal next gate at a time: final verification, independent QA or73 witness, scoped commit, local install, external delivery, or stop. Do not74 bundle gates whose authority differs.75- Read back the actual result: test output, commit hash, installed version. A76 started or interrupted command is not delivery evidence.7778For substantial diffs, verify in a fresh context: dispatch a subagent that79reads only the bundle and the diff - the implementer verifying their own work80invites confirmation bias. The subagent never fixes anything: mutants it flips81are reverted before reporting, and on FAIL it records the verdict and stops;82routing back to implementation belongs to the parent turn that holds the83user's ask. A subagent that fails to start or report is a dispatch failure,84not evidence: run the checklist in this session instead of polling for it.8586On FAIL, route back to `maestro-work` and leave the exact one-line failed-pass87trace `maestro work note <id> "failed: <one line>"`. The prefix is the literal88lowercase `failed:` followed by one space. A scenario still failing after three implement89passes - counted from the work item's notes across sessions, not this90session's memory - is a design problem, not an implementation one: stop and91re-settle the decision via `maestro-design`.9293Read-only review method: [references/audit.md](references/audit.md). When the94failure location is unclear, follow [references/triage.md](references/triage.md).9596## Red flags9798| The thought | The reality |99|---|---|100| "It obviously passes - running it is a formality" | Scenarios exist because "obviously" has been wrong before. Run every one and record the output. |101| "The scenario can't run as written, but this similar check proves the same thing" | That is a substitute measurement. Route back to `maestro-design` for a checkable rewrite. |102| "The mutant survived, but the code is clearly fine" | A surviving mutant is a weak or missing test, and a FAIL of that scenario. |103| "I wrote this diff - I know it works" | That is the confirmation bias the fresh-context rule exists for. |104| "I'll just fix this small failure while I'm verifying" | Verify delivers a verdict, never fixes. A FAIL routes back to `maestro-work`. |105106## Learn, then close107108Before closing, harvest what outlives the bundle109([references/learning.md](references/learning.md)): a verified correction or110durable constraint becomes a locked decision or a work note - never only chat.111112Close order, on PASS with durable ship or handoff proof:1131141. Overwrite NOTES.md one last time with a dated close-out line citing the115 ship evidence (commit hashes or the handoff target).1162. Harvest: any mid-flight choice that is hard to reverse, surprising without117 context, and a real trade-off is a locked decision with its rejected118 alternative; a new domain term is `maestro term add`.1193. `maestro bundle close <id>`: snapshots the trio into the store and archives120 the directory.121122The snapshot is the durable memory; after close the directory is disposable123and `maestro search` still recalls the text.124125When the verdict passes but the ship commit has not landed yet, do not leave126the close implicit: set NOTES.md Next Action to "commit, then close bundle".127The turn that lands the commit performs the close in that same turn; a PASS128bundle never stays active across sessions. Never close on a FAIL, and never129stage or commit bundle contents as part of the ship commit.130131Quality review is separate from verify: verify owns "does it meet the132contract", review owns "is the code good". Light gets a simplification pass133after green; Full gets one correctness review after verify passes, chosen by134risk (a security review when the diff touches auth, secrets, or input135handling). A code change after the verdict re-runs the affected VERIFY.md136scenarios before close.137138## Definition of done139140Acceptance met, changed surface verified, available test/lint/type/build141checks pass, claims name their falsifier, risky changes carry rollback notes.142Never claim push, release, or publish from local state; those gates are the143user's.