Audit
Use after a slice's phases are implemented, when the task is now evidence, conformance, and reconciliation against the design — disposition every finding on a reconciliation review ledger (the RV kind) before closure.From its SKILL.md
npx -y skills add davidlee/doctrine --skill auditAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
- runs commandsInstructs the agent to run 6 commands, including `doctrine slice conformance <id>` and 5 more.
SKILL.md
10.0 KB, ~2.4k tokens by cl100k_base, as published. Nobody here has run it
Audit
You are running the reconciliation loop: does the work match its design and governance, and is every gap consciously dispositioned before reconciliation?
The audit stage runs on a review ledger — the RV kind (RV-NNN, ADR-007). The
shared ledger mechanics (open + prime, raise, dispose + resolve, the severity and
disposition vocab, synthesis, the close-gate, the parent-tree caveat) live in
.doctrine/review-ledger.md — read it; this skill does not repeat the verbs.
What follows is the audit lens: the facet, the modes, the scope, the evidence
the reconciliation loop demands, and the audit-specific harvest and closure tail.
Findings are append-only to the ledger and field-owned, "no undispositioned
findings before close" is enforced by the binary
(the close-gate teeth), and the audit prose becomes the review's ## Synthesis.
Dispatched slice — review the candidate surface, not the raw evidence. When the slice was driven by
/dispatch,review/*andphase/*are immutable evidence refs (R2); audit/repair runs against the candidate interaction branch published bydoctrine dispatch candidate create(seedoctrine dispatch candidate status). Record which surface you reviewed in the ledger## Brief(F-2), and link the admitting RV viadoctrine dispatch candidate admit --review RV-NNN.
Inputs:
- the slice's implemented phases and their verification evidence
design.md(canonical),slice-nnn.md,plan.toml- relevant ADRs and tech specs (see
/canon)
Tool preference
If your harness supports MCP tools and doctrine's MCP server is connected
(you see review_new, review_raise, review_dispose, review_verify,
review_prime, review_list, review_show, review_status in your
tool list), prefer these MCP tools over the CLI — they return machine-parseable
JSON text in the MCP content block and eliminate shell overhead. Every review verb has
an MCP equivalent.
Audit lens
Subject is always the slice — target-ladder rung 1. An audit targets its slice
(the --target) and never degrades to prose; the closure-grade trigger is
satisfied by definition (it gates the slice's audit→reconcile→done). Do not
re-derive the subject — open the RV against the slice.
Facet is reconciliation. That is the lifecycle aspect this stage
interrogates. Posture, if any, rides --raiser, never a new facet (review-ledger.md
§2).
Audit mode — pick one:
- conformance — post-implementation audit tied to a slice (the usual case).
- discovery — backfill or existing-code investigation.
Self-audit (the usual case). When you are both reviewer and author, drive both
roles with --as <role> — the raiser raises/verifies/withdraws, the responder
disposes. This is cooperative role assertion, not a security boundary (ADR-007;
review-ledger.md §4).
Disposition convention (audit-specific). Audit's permitted dispositions are:
aligned (observation correct, no change needed), fix-now (code fix within
audit scope — never a spec or governance edit), tolerated (explicit accepted
drift with rationale), and verified with a reconciliation-brief link for
spec/governance changes delegated to /reconcile. Audit must never use
design-wrong or follow-up for spec/governance items — those belong to the
reconcile write surface. Every finding stays verified (the observation is
confirmed); the remediation is reconcile's job and is recorded separately — do
not mutate a finding to fixed/remediated.
Process
-
Open the ledger for the slice (replaces authoring
audit.md): open areconciliation-facet RV targeting the slice, then fill the ledger's## Briefwith the lines of attack (what this audit probes and the invariants it holds the slice to). Verbs and flags:review-ledger.md§1–§2. Loose notes are insufficient for closure-grade work — findings belong in the ledger.The old
domain_map/primeseeding is gone (RFC-004 / SL-147): the hand-authored area map was a dead authoring tax. The mechanical drift signal now comes fromslice conformance(step 2), computed from recorded source-deltas — no curation. -
Gather evidence (the audit's divergent work):
-
prepare subject: do NOT change the main repository branch; use a worktree instead, if necessary.
-
Run
doctrine slice conformance <id>and read the algebra — the mechanical path-conformance delta between whatdesign.mddeclared (design-targetselectors) and what git actually touched (recorded source-deltas). It reports three cells:- undeclared (highest signal) — paths edited but not in any
design-targetselector. Each is a finding candidate: scope creep, a missed design update, or an undocumented touch. - undelivered —
design-targetselectors that matched no actual edit. Declared-but-not-delivered: dropped work or a stale design. - conformant — count of paths that matched (each with its selector).
Conformance is necessary, not sufficient: it says where to look, never whether it passes. Treat undeclared/undelivered as leads to disposition, not auto-findings. If it reports
unavailable(empty registry) orincomplete(a completed phase carries no row — the F-2 backstop), that gap is itself a finding: the registry was not recorded as phases landed; bootstrap withdoctrine slice record-delta <id> PHASE-NN --start <oid> --end <oid>or note the partial coverage — never read a partial registry as clean. - undeclared (highest signal) — paths edited but not in any
-
run the tests/checks the design and plan require, plus
doctrine check gate; -
inspect observed behaviour against
design.mdand the phaseVT-criteria; -
note where behaviour and design diverge — each divergence is a finding.
-
-
Raise + dispose every finding on the ledger per
review-ledger.md§3–§4. Hold the audit line on the anti-escape pressure: do not pick follow-up for spec/governance findings — those go to the reconciliation brief withverified; for code findings, do not pick follow-up merely because the fix is large; do not normalise tolerated without a real rationale; and do not downgrade a true blocker to dodge the close-gate. If the right route is ambiguous after readingdesign.mdand governance, stop and/consult. -
Synthesize. Write the audit's reasoning as the review's
## Synthesis(append it toreview-NNN.md) — the closure story, the standing risks, the tradeoffs consciously accepted (the prose the oldaudit.mdcarried). -
Write the reconciliation brief. Append a dedicated
## Reconciliation Briefsection toreview-NNN.md— separate from## Synthesis. This is the structured handoff from audit to/reconcile, mapping every spec/governance finding to its target and the intended write surface (D3):## Reconciliation Brief ### Per-slice (direct edit) - design.md §3: the eviction model changed from edge-at-a-time to per-SCC — update prose to match implementation. ### Governance/spec (REV) - ADR-006 §D5: branch-point staleness description is wrong → REV modify - REQ-077: cordage scale target verified at 50k nodes → REV status activeBuild the brief from every non-aligned, non-tolerated finding that touches design or governance. Group by write surface (per-slice direct edit vs. governance/spec REV). Each entry cites the finding id and describes the exact change needed.
Brief-surface guardrails (D3).
/reconcilewrites exactly two surfaces — per-slice artefacts (design.md,slice-NNN.md) by direct edit, and governance/spec by REV. Name a surface the writer skill will actually touch, or the brief stalls at reconcile:- Plan criteria are off-surface.
plan.tomlEN-/EX-/VT-(andPHASE-NN) ids are immutable-append (boot rule) — never a reconcile direct-edit surface. A divergence that would require changing a plan criterion is a design/plan escalation, not a "Per-slice (direct edit)" brief item. Do not write a brief item that editsplan.toml. - Conformance findings name the registry verb, not the prose. A "spurious
undelivered / scope-creep" conformance finding is fixed by the selector
registry (
doctrine slice selector rm/add), which is whatslice conformancereads (slice-NNN.toml).design.md §6is only the human mirror — a prose-only brief item leaves conformance red. Name theslice selectorverb as the load-bearing change; cite the §6 edit as its mirror.
- Plan criteria are off-surface.
-
Harvest (audit tail). Sweep durable risks, decisions, and gotchas from the disposable runtime phase sheets into
notes.md— the audit-specific lens — then drive the rest of the harvest (legs and sinks) perharvest.md. -
Hand off to reconcile. Once the reconciliation brief is written, the ledger is resolved, and every finding is terminal, hand off to
/reconcile. Do NOT hand off directly to/close— reconcile is the sole writer of reconciled truth; close only confirms the outcome. Record the lifecycle move:doctrine slice status <id> reconcile(bare number) — the binary refuses it while a blocker is unresolved (D-C9b).
Outcomes
- Audit evidence is a structured RV ledger (
review-NNN.toml+ the review's## Synthesis+## Reconciliation Brief), not a hand-madeaudit.md. - Every finding ends terminal with an explicit disposition (or is withdrawn).
- No unresolved
blockerremains — the close-gate would refuse it. - The reconciliation brief maps every spec/governance finding to its target and write surface.
/reconcilereceives a complete, actionable brief — not raw findings.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.