Use to audit the gauntlet records, "are the ROUNDS.md records honest", "verify the proof corpus", "check each run record against its evidence", "audit the gauntlet corpus", "is the gauntlet proof trustworthy", or a scheduled run. NOT for re-running probes or rounds (`/kit:gauntlet` itself), NOT for the corpus-level stats projection (`lib/gauntlet/stats.sh`), NOT for non-gauntlet records.
Install
npx skillscat add dwarvesf/dwarves-kit/gauntlet-proof-audit Install via the SkillsCat registry.
Gauntlet proof-audit
Overview
Audit every committed gauntlet run record against its own persisted evidence and report the
result. This is the gauntlet-proof-audit instance of docs/patterns/audit-loop.md: a skeptic
pass over docs/verification/gauntlet/*/ROUNDS.md (and AB-ROUNDS.md), the eval corpus/kit:gauntlet produces and lib/gauntlet/stats.sh projects into numbers. Neither of those
checks that a record's CLAIMS match its own EVIDENCE: a "clean=true" that never reconciles withchecker-output.txt, a findings count with no matching finding, a scrubbed key that leaked
anyway, a run-dir that drifted from the contract's naming. This skill never re-runs a probe and
never rewrites a historical record; it reports discrepancies for the operator.
The four slots (per the audit-loop pattern)
| Slot | This instance |
|---|---|
| Item set | git ls-files 'docs/verification/gauntlet/*/ROUNDS.md' 'docs/verification/gauntlet/*/*-ROUNDS.md' 'docs/verification/gauntlet/*/AB-ROUNDS.md' (committed records only; a room copy's own ROUNDS is untracked and never enters the set) |
| Contract | every CLAIM in the record is backed by its committed EVIDENCE: markers well-formed; recorded verdict == committed checker-output.txt; findings count reconciles with the rows; scrub clean (no resolved credential VALUE in committed evidence; a bare op:// pointer is allowed, not a leak); run-dir grammar conforms; a quoted finding string is present in the cited transcript |
| Evidence class | Tier 1: the committed record files themselves via grep/wc/diff. Tier 2: kit:audit-scanner reads a quoted finding against the transcript. Evidence gitignored as a room artifact (transcript pruned) = UNTESTABLE → UNSURE |
| Apply mechanics | REPORT-first: a genuine discrepancy is FLAGGED with a dated correction note appended to the record (never a silent rewrite of the historical claim); UNSURE/DANGER listed in the PR body; REMOVE is disallowed (a record is evidence, not deleted) |
Process
Branch first. All edits ride an isolated branch. Auditing on master is the failure this
skill exists to prevent.Enumerate. Run the item-set command above. Write the list down before judging anything.
The list is the queue; a resumed or scheduled run picks up where the last one stopped.Tier 1, mechanical pass, zero model cost, every record. For each record, extract and
check the mechanical claims:- marker well-formedness is DELEGATED, never restated here: run
bash lib/gauntlet/stats.sh
first (like doc-drift runstest-meta.shfirst). Its Pass-1 sweep is the single enforcer of
the[[QL-VERDICT ...]]/[[AB-VERDICT ...]]grammar across the whole corpus; a non-zero
exit naming a file is a pre-confirmed marker finding. Do not re-implement the regex here, so
the grammar cannot desync from its enforcer, - for a record whose rounds carry a per-round
checker-output.txt(round-N/submission/orround-N/, or a campaign row's own dir), the recorded verdict (the round table's
GREEN/RED cell, or the row's Checker column) matches that file's ownSUBMISSION: GREEN|REDtail line, AND the marker's ownclean=true|falseagrees with that verdict
(clean=true only when every scored round is GREEN); a marker that disagrees with the
checker output is a finding even when the table cell happens to agree, - the marker's
findings=Kreconciles with the round's named findings (an inlineF1..FK
list, orround-N/findings.md's own heading count); K=0 means no F-item is named, - scrub: no resolved credential VALUE in the record dir's COMMITTED files, an
ANTHROPIC_API_KEY=<hex/base64 value>or any recognizable token shape (sk-ant-,sk-,ghp_, an assigned<TOKEN>=<20+ opaque chars>); a real value is DANGER, it is
an actual leak. A bareop://...reference is NOT a leak: it is a pointer, allowed by
estate secret-handling policy exactly as a path containing an ID is; do not flag it. Note
it only if the operator asked for a pointer inventory, never as a finding on its own, - run-dir grammar: the directory name carries a
<YYYY-MM-DD>-<preset>-<slug>shape for any
record dated 2026-09 or later (pre-2026-09 dirs are grandfathered percommands/gauntlet.md,
never flagged for the old shape alone).
A Tier 1 failure is a finding with both sides quoted (the claim, the evidence). A record with
no committedchecker-output.txtfor a round it claims a verdict on is UNTESTABLE on that
axis, not OK and not a fabrication either: downgrade that axis to UNSURE, evidence quoted as
"no checker-output.txt committed for round-N".
- marker well-formedness is DELEGATED, never restated here: run
Tier 2, judgment pass, model-read, only where it earns its cost. Dispatch
kit:audit-scanner
(its tools roster physically cannot write) for two cases only: a record Tier 1 flagged (judge
how deep the drift goes), or a quoted finding whose exact wording needs matching against the
transcript it cites (transcript.jsonl/transcript.md). Skip Tier 2 for every record Tier 1
cleared with no quote-matching need; most records never need it.Verdict each record with the audit-loop grammar: OK / FLAG / UNSURE / DANGER. REMOVE is
never used: a run record is evidence of what happened, not a doc that can go stale and get
deleted. A verdict with no checkable evidence downgrades to UNSURE (a pruned/gitignored
transcript, a room artifact never committed). DANGER is reserved for a record that actively
misrepresents its own evidence (a claimed GREEN whose checker-output.txt says RED) where an
operator reading ROUNDS.md at face value would be misled about the artifact's real state; a
plain reference leak or an untestable axis is FLAG or UNSURE, not DANGER.Apply. Report-first: every FLAG and UNSURE is listed in the PR body with its quoted
evidence, for the operator to read. Only a DANGER verdict gets a correction note, appended to
the record (never a rewrite of the original claim): a dated## Audit correction (YYYY-MM-DD)
block naming the discrepancy and citing the contradicting evidence file. The original round
table, verdict line, and markers are left untouched; the correction sits beside them.Verify. Re-run the item-set command; it must still enumerate the same records (an audit
pass reads, it never adds or removes a record). If any correction note was appended, confirm
it parses as prose (no marker collision withQL-VERDICT/AB-VERDICT,lib/gauntlet/stats.sh
must still run clean). Runbash tests/test-meta.sh: green, or the run is not done.Ship. Commit, push, open a PR whose body lists every FLAG/DANGER with its evidence and
every UNSURE for the operator. If every record verdicts OK, create no branch and report CLEAN
with the enumeration list.
Cadence
On-demand first: run after a gauntlet campaign lands, before citing corpus numbers in a report,
or when a record's honesty is in question. For a recurring pass, wire /loop or a schedule the
same way doc-drift does; there is no default cron, cadence is the operator's to wire.
Cadence
This instance has a declared cadence in the ## Cadence table of docs/patterns/audit-loop.md.
Record a finished pass with bin/audit ran gauntlet-proof-audit "<one line>", including a CLEAN one, sobin/audit due stops naming it. The kit ships no scheduler: due is what a human or a job reads.