Skip to content
Back to skills

Audit

ASecurity

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.

  • 2 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 19, 2026
developmentgonoderailsawsgitsecurity

Works with

  • terminal
  • cli
  • mcp

Security analysis

A100/100

Scanned September 29, 2026

npx -y skills add davidlee/doctrine --skill audit --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Audit?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Audit
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/davidlee-audit/badge)](https://www.skillsdirectory.com/skills/davidlee-audit)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: audit
description: 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.
---

# 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`). The
shared ledger mechanics (open + prime, raise, dispose + resolve, the severity and
disposition vocab, synthesis, the close-gate, where reviews run) live in
`lib:reference/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. An unresolved **blocker**
refuses the audit→reconcile and reconcile→done crossings (the close-gate teeth);
carrying every other finding to a terminal state is this skill's discipline, not
the binary's. 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/*` and `phase/*` are immutable
> evidence refs (R2); audit/repair runs against the **candidate interaction
> branch** published by `doctrine dispatch candidate create` (see `doctrine
> dispatch candidate status`). Record which surface you reviewed in the ledger
> `## Brief`, and link the admitting RV via `doctrine 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

Prefer the MCP review tools over the CLI when your harness has them
(`lib:reference/review-ledger.md` § Passing prose); `review unlock` and
`review paths` stay CLI-only.

## 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
(`lib:reference/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, contests, reopens,
withdraws and concludes; the responder disposes and amends. Roles belong to
acts, not agents; `--as` is cooperative role assertion, not a security boundary
(`lib:reference/review-ledger.md`, "Acts and roles").

**Disposition convention (audit-specific).** See the closed disposition vocab,
`lib:reference/review-ledger.md` §4. Audit must **never** use `follow-up` for
spec/governance items — those belong to the reconcile write surface, not the
backlog. Every finding ends `verified` (the observation is confirmed; a
delegated one once its brief entry exists); the *remediation* is reconcile's job
and is recorded separately — do not mutate a finding to `fixed`/`remediated`.

## Process

1. **Open the ledger for the slice** (replaces authoring `audit.md`): open a
   `reconciliation`-facet RV targeting the slice, then fill the ledger's `## Brief`
   with the lines of attack (what this audit probes and the invariants it holds the
   slice to). Verbs and flags: `lib:reference/review-ledger.md` §1–§2. Loose
   notes are
   insufficient for closure-grade work — findings belong in the ledger.

   Then prime it (`lib:reference/review-ledger.md` §2): `review prime` derives
   the path-set
   from the slice's selectors, and the ledger's staleness signal hashes it. What
   is **gone** is the old hand-curated `domain_map` (a dead authoring tax), not
   the `prime` verb. The mechanical drift signal from `slice conformance` (step
   2), computed from recorded source-deltas, complements prime rather than
   replacing it.
2. **Gather evidence** (the audit's divergent work):
   - prepare subject: do NOT switch the primary checkout's branch. An audit
     runs where the code is — the primary tree, a dispatch coordination tree, a
     linked worktree, or an adopted capsule tree; audit and close there, then
     land. Only a dispatch worker process is refused review writes; one writer
     per RV at a time (`lib:reference/review-ledger.md` §6, "Where reviews
     run").
   - **Run `doctrine slice conformance <id>` and read the algebra** — the
     mechanical path-conformance delta between what `design.md` declared
     (`design-target` selectors) and what git actually touched (recorded
     source-deltas). It reports three cells:
     - **undeclared** (highest signal) — paths edited but not in any
       `design-target` selector. Each is a finding candidate: scope creep, a
       missed design update, or an undocumented touch.
     - **undelivered** — `design-target` selectors 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) or `incomplete`
     (a completed phase carries no row), that gap is itself a
     finding: the registry was not recorded as phases landed; bootstrap with
     `doctrine slice record-delta <id> PHASE-NN --start <oid> --end <oid>` or note
     the partial coverage — never read a partial registry as clean.
   - run the tests/checks the design and plan require, **plus `doctrine check gate`**;
   - inspect observed behaviour against `design.md` and the phase `VT-` criteria;
   - note where behaviour and design diverge — each divergence is a finding.
3. **Raise + dispose every finding** on the ledger per
   `lib:reference/review-ledger.md` §3–§4.
   Hold the audit line on the **anti-escape pressure**: do not pick **follow-up**
   for spec/governance findings — dispose them `design-wrong` with the
   reconciliation-brief link, and the raiser verifies once the brief entry exists; 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 reading `design.md` and governance, stop and `/consult`.
4. **Synthesize.** Write the audit's reasoning as the review's `## Synthesis`
   (append it to `review-NNN.md`) — the closure story, the standing risks, the
   tradeoffs consciously accepted (the prose the old `audit.md` carried).
5. **Write the reconciliation brief.** Append a dedicated `## Reconciliation Brief`
   section to `review-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:

   ```markdown
   ## 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-NNN: branch-point staleness description is wrong → REV modify
   - REQ-NNN: cordage scale target verified at 50k nodes → REV status active
   ```

   Build 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.** `/reconcile` writes 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.toml` `EN-/EX-/VT-` (and `PHASE-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 edits `plan.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 what `slice
     conformance` reads (`slice-NNN.toml`). `design.md §6` is only the human
     mirror — a prose-only brief item leaves conformance red. Name the `slice
     selector` verb as the load-bearing change; cite the §6 edit as its mirror.

   **Human-facing synthesis.** When the audit has consequential material, give
   the human a short route through the participating systems, one important
   behaviour and its implementation, the tests that bear on it, and a remaining
   risk. For consequential Doctrine sources cited in a decision, name why each
   matters and give its exact `doctrine <kind> show <ID>` command. If deeper
   inspection would help, offer `/walkthrough` or `/pair` without requiring it.
   A focused question about which risk concerns the human may improve the
   synthesis; use the answer if asked, and do not turn it into a comprehension
   check. When a real finding supports it, an optional short mock peer challenge
   can help rehearse a decision or test its rationale. Keep the source and
   whether the objection is historical or simulated clear. A new substantive
   defect belongs on the RV ledger; the human's ability to answer is neither a
   finding nor an acceptance condition. Respect the project's engagement
   default and the human's verbal changes.
6. **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) per
   `lib:reference/harvest.md`.
7. **Hand off to reconcile.** Once the reconciliation brief is written and every
   finding is terminal, conclude the pass as raiser —
   `doctrine review conclude RV-NNN --basis …` (or `review_conclude`), stating
   what the audit examined — so `review status` reads `done · await=none`. A
   later raise or reopen clears the conclusion; conclude again after it. Then
   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.

## Outcomes

- Audit evidence is a structured RV ledger (`review-NNN.toml` + the review's
  `## Synthesis` + `## Reconciliation Brief`), not a hand-made `audit.md`.
- Every finding ends terminal with an explicit disposition (or is withdrawn), and
  the pass is concluded with a `--basis`.
- No unresolved `blocker` remains — the close-gate would refuse it.
- The reconciliation brief maps every spec/governance finding to its target and
  write surface.
- `/reconcile` receives a complete, actionable brief — not raw findings.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.