This file is the contract that the per-version AUDIT_LEDGER_v{X}.md files cite. It defines what "CLOSED" means, what hard-stop conditions block a release, and what the operator (a human or an AI agent like Claude Code) must do before claiming an audit row is closed.
If the ledger and this file disagree, this file wins. The ledger refers to this file; it does not redefine it.
A row in any AUDIT_LEDGER_v{X}.md may move to status CLOSED if and only if all four of the following are true:
- Code or doc change exists. A concrete, committable diff — a new file, an edit to an existing file, or a configuration change — addresses the finding. Adding the item to
ROADMAP_OPEN.mdis not a change for this purpose; it closes the meta-tracking task only. - Verification command provided. The ledger row's Verification command column contains a single shell or
nodecommand that an independent operator can run, in the repo root, to reproduce the verification. The command must exit non-zero on regression. - File read end-to-end after edit. After the diff is written, the author re-reads the touched file(s) from line 1 to EOF — not by
grep, not by pattern-match. This is the human-eye check that the change is internally consistent, that no leftover scaffolding remains, and that the surrounding context still parses. - Clean-window re-grep performed. From a fresh read, search every touched file for: outdated version strings, contradictory test counts / metric values, references to evidence packets or fixtures that do not exist on disk, and forbidden marketing language ("industry-first", "best-in-class", "revolutionary", "world-class", "game-changing", "unprecedented", "cutting-edge", "state-of-the-art"). Any finding downgrades the row to DEFERRED until resolved.
A row that satisfies 3 of 4 is not CLOSED. There is no partial credit.
- CLOSED — Four DoD criteria satisfied.
- DEFERRED — Could be done with the available tools and context; not done this session. The row must state an effort estimate and confirm no structural blocker.
- ACCEPTED-LIMITATION — Structural reason this cannot be done unaided. Allowed reasons: client consent, credentials, third-party action, missing physical access. The row must name the structural reason.
- BLOCKED — Requires a specific user action named in the row (e.g., "Dana to identify reviewer").
- OBSOLETE — Item no longer relevant. Row must include the reason. Row is never deleted.
The four are mutually exclusive. Every row is in exactly one state.
A release may not proceed (no version bump, no release notes, no tag) if any of the following is true:
- Any ACCEPTED-LIMITATION row lacks a structural reason from the allowed list.
- Any CLOSED row's Verification command failed or was not run.
- Any file touched in the release contains a Step-3 re-grep finding (stale version, contradiction, missing artifact reference, or marketing language).
- Any CLOSED row has empty Evidence or Verification command cells.
- Any row's Status column conflicts with its Verification result column (e.g., status = CLOSED but result describes a failure).
Hard stop #4 applies only to CLOSED rows. DEFERRED / ACCEPTED-LIMITATION / BLOCKED rows are expected to have empty Evidence / Verification cells until the underlying work happens.
- No row may move to CLOSED without satisfying §1.
- No row may be deleted. If it becomes irrelevant, mark OBSOLETE with a reason in the Verification result column.
- The
/ship-auditcommand writes the final Status and Verification result columns. Do not pre-fill those during work — they get filled at verification time, not edit time. - If a DEFERRED item is completed during the session: update Evidence + Verification command columns in place, leave Status as DEFERRED, and re-run
/ship-auditto validate the closure. - Adding an item to
ROADMAP_OPEN.mdis not closure. It closes the meta-tracking task; the underlying item stays DEFERRED until §1 is satisfied. - If a verification command's output exceeds 100 lines, summarize to head + tail + total line count and link to the full output in
VERIFICATION_LOG_v{X}.md.
The closing summary must use the honest tally from /ship-audit Step 4. It may not use any of:
- "All items addressed"
- "Audit closed"
- "Substantially complete"
- "Effectively done"
- "Tracked for follow-up" (as a substitute for DEFERRED)
These phrases are forbidden because they have historically been used to claim closure without the underlying DoD work being done. The honest tally — "X CLOSED, Y DEFERRED, Z ACCEPTED-LIMITATION, W BLOCKED" — is always available and always acceptable.
Every /ship-audit run produces exactly three artifacts:
- Updated
AUDIT_LEDGER_v{X}.mdwith verified statuses, tally section filled, per-row Verification result column annotated with the audit-date note. - New or updated
VERIFICATION_LOG_v{X}.mdcontaining the Step 2 command outputs and Step 3 re-grep findings. - A one-paragraph summary delivered to the operator stating the honest tally and naming the top deferred items by number and effort estimate.
The operator writes release notes after reviewing those artifacts. /ship-audit does not write release notes.
Every release ships these test gates (run by npm run test:all):
npm test—cpm-engine.test.jsunit suite.npm run crossval—cpm-engine.crossval.jsJS/Python parity matrix.npm run test:cites—tests/no-fabricated-citations.test.js(citation provenance).npm run test:truncation—tests/no-truncation.test.js(no user-facing data truncation).npm run test:version-refs—tests/no-stale-version-refs.test.js(no version-drift in docs).
New release-blocking gates added in v2.9.34:
tests/sop-validator.test.js— machine-readable SOP checklist schema is honored by skill_manifest bindings.tests/crypto-signoff.test.js— analyst-signoff stub round-trips sign → verify cleanly and rejects tampered manifests.
The scripts/attestation.js entrypoint must invoke every gate above; a release tag is forbidden if any gate fails.
This contract is referenced by AUDIT_LEDGER_v{X}.md files in the repo root. If a future audit run cannot locate CLAUDE.md in the repo root, that is itself a Step-3 finding (HS3) and the release is blocked.
- Created: 2026-05-24 (v2.9.34 audit cycle).
- Closes Hard Stop #3 of
AUDIT_LEDGER_v2.9.34.md(missing contract document). - Update on every release that changes any rule above.