Development record
Every Audit In Abcd Knows What It Audits, By What, And Against What
⚠️ Superseded by itd-31. This intent's premise — a unified
/abcd:auditsurface bundling all review/audit roles — was dissolved when the round-2 command-structure review split the three intent-fidelity-reviewer roles into three distinct verbs under/abcd:intent(review, consistency, shape). The single canonical audit-taxonomy file atbrief/05-internals/07-audits.mdis no longer needed because each role's inputs/outputs/triggers are documented inline in05-internals/01-agents.mdagainst the relevant agent. Preserved as historical record per the supersession lifecycle in04-surfaces/05-intent.md § 1.
Press Release
abcd ships a canonical audit-role taxonomy at
brief/05-internals/07-audits.md— a single map enumerating every audit role in the system, what each audits, by whom (which agent), against what reference, on what trigger, and where its findings land. Roles, not agents, are the unit of registration: a single agent (e.g.,intent-fidelity-auditor) may own multiple roles. Adding a new audit role to abcd now requires registering it in this taxonomy; the documentation-auditor refuses to pass disembark if any existing audit invocation lacks a registered role. The map starts with the full audit cast:intent-fidelity-auditorin two roles — single-document (reality ↔ shipped intent acceptance) and cross-document (intent ↔ intent + intent ↔ brief, per itd-31); pluslifeboat-oracle(lifeboat content ↔ source repo state),press-release-composer(press release ↔ product-thinker scrutiny),documentation-auditor(lifeboat docs ↔ structural completeness),oracle-prompt-audit(agent prompts ↔ research files, per05-prompt-quality.md), and/abcd:audit chain(repo state ↔ hash-chain integrity, per itd-16). Agent count stays at 15; the taxonomy makes role count visible. Future audits land in the taxonomy first, code second."Every time someone added a new auditor we'd lose track of what it was actually checking — and worse, two auditors would silently do the same job from different angles," said Kira, methodology lead. "The audit taxonomy made the cast visible. Now when someone proposes a new audit role, the first question is 'where does this fit in the taxonomy?' — and if the answer is 'I'm not sure', that's the first sign the role is duplicating an existing one."
Why This Matters
The 2026-05-07 brief audit found seven distinct audit roles in abcd, owned by six agents: intent-fidelity-auditor (single-document role; a second cross-document role is added per itd-31), lifeboat-oracle, press-release-composer, documentation-auditor, oracle-prompt-audit, plus /abcd:audit chain (itd-16). Each is documented in a different place. None reference each other. Three problems result:
- Coverage gaps. The 2026-05-07 audit found a class of inconsistency (intent ↔ intent + intent ↔ brief) that no existing audit role covered — the gap was discovered manually, not by any tool. itd-31 fills it. But the gap existed for months because no map of audit roles existed to reveal the missing cell.
- Role overlap.
intent-fidelity-auditor(per itd-1) andlifeboat-oracle(per disembark phase acceptance) both check "did the artefact match the source?" but at different layers. Without a taxonomy, future contributors will conflate them. - Paper-only sprawl.
intent-fidelity-auditorwas paper-only at first brief-write time; four intents have since extended its responsibilities (itd-1 verdict format, itd-25 cluster cross-reference, itd-27 term-drift, itd-31 sibling role). When implementation finally lands, the implementer inherits a constellation of obligations across 5+ intents and 5+ brief locations. A canonical taxonomy table makes the obligations visible in one place.
This intent is the press-release-shaped commitment behind the structural pattern observation from the 2026-05-07 audit ("there is no canonical map of what gets audited by whom against what"). It is intentionally lightweight — a brief section + an invariant — not a new tool.
What's In Scope
The taxonomy table
A new brief section 05-internals/07-audits.md containing one canonical table. Roles, not agents, are the unit of registration — intent-fidelity-auditor appears as two adjacent rows because it owns two roles.
| Owning agent | Role | What's audited | Reference / against what | Trigger | Findings location | Severity model | Documented in |
|---|---|---|---|---|---|---|---|
intent-fidelity-auditor |
single-document fidelity | Delivered reality | Shipped intent's press release + acceptance criteria | Planned→shipped transition; manual /abcd:intent audit <itd-N> |
Intent's ## Audit Notes section |
Per-criterion MET/MET_WITH_CONCERNS/NOT_MET/INCONCLUSIVE |
itd-1; 04-surfaces/05-intent.md § 6 |
intent-fidelity-auditor |
cross-document fidelity | Brief + all intents | Each other + the brief | Disembark Phase 0; /abcd:intent plan; manual /abcd:audit consistency |
.abcd/logbook/audit/consistency-<ts>/report.{json,md} |
R1–R7 categorisation; per-finding blocker/warn/info | itd-31; 06-lint.md (XD codes) |
intent-fidelity-auditor |
shape classification | Intent corpus | Cross-reference patterns, scope overlap, supersession candidates | Continuous (pre-commit + on /abcd:intent no-args invocation) |
.abcd/logbook/audit/shape-<ts>/report.{json,md} + /abcd:intent status output |
Suggestion-shaped (not blocker); declined suggestions cached so the auditor doesn't re-surface | itd-34; 04-surfaces/05-intent.md § 6 Role 3 |
lifeboat-oracle |
lifeboat-content fidelity | Lifeboat content | Source repo state at disembark time | Disembark Phase A/B/C acceptance gates | .abcd/lifeboat/audit/oracle-<ts>.{json,md} |
"Sufficient" verdict + specific findings | 04-surfaces/02-disembark.md § 6 |
press-release-composer |
press-release product audit | Press release | Product-thinker scrutiny ("would a customer come away with a true mental model?") | Disembark Pass C; manual on intent draft | .abcd/lifeboat/audit/press-release-oracle-<ts>.{json,md} |
Carmack-style review verdicts (SHIP/NEEDS_WORK/MAJOR_RETHINK) |
01-agents.md; 04-surfaces/02-disembark.md |
documentation-auditor |
lifeboat-docs structural audit | Lifeboat docs structure | Structural completeness (every dir has README, every link resolves, etc.) | Disembark/embark/launch sub-agent invocation | .abcd/lifeboat/audit/documentation-audit-<ts>.{json,md} |
Pass / fail + specific gaps | 01-agents.md (15th agent) |
oracle-prompt-audit |
agent-prompt SOTA audit | Agent .md prompts |
Per-agent research file in .abcd/development/research/prompting/agents/<name>.md |
Once per minor release (research-gated) | .abcd/logbook/sota-audits/<date>.md |
RFC-style findings, not auto-applied | 05-prompt-quality.md |
| (subverb only — no dedicated agent) | /abcd:audit chain |
Repo state | Hash-chain / Merkle integrity (compliance-grade) | Manual; per itd-16 | TBD per itd-16's epic | TBD per itd-16's epic | itd-16 |
Invariants
Three invariants registered in 02-constraints/03-invariants.md:
- Every audit role registers in the taxonomy. Adding a new audit role to abcd requires adding a row to
07-audits.md. Thedocumentation-auditorchecks this at every disembark — if any agent / skill / command invokes an audit not in the taxonomy, disembark fails. - Every existing audit invocation cites its taxonomy row. Wherever an audit is invoked (in skill
.md, agent.md, brief section), the invocation links to the taxonomy row. This makes orphaned audits visible. - The taxonomy is read-mostly. Adding rows is light; modifying a row's "what's audited" or "reference" columns triggers an ADR-level decision (because it changes the audit's contract).
Cross-references back-fill
When this intent ships, the existing audit roles (intent-fidelity-auditor's single-document role, lifeboat-oracle, press-release-composer, documentation-auditor, oracle-prompt-audit, plus itd-16's /abcd:audit chain) gain a one-line "registered at 07-audits.md row N" link in their canonical documentation. When itd-31 ships, intent-fidelity-auditor's second row (the cross-document role) is added in place; the agent's catalog entry in 01-agents.md is extended to declare both roles in the same row (or two adjacent sub-rows under the agent's name). Agent count stays at 15.
What's Out of Scope
- Implementing any of the audit roles: this intent is taxonomy + invariants only.
intent-fidelity-auditoris paper-only after this intent ships, just as it is now. - A "meta-auditor" that audits the taxonomy itself: the documentation-auditor's check (invariant 1) is sufficient. A separate meta-meta-audit role is over-engineering.
- Cross-tool taxonomy (e.g., flow-next's review verdicts): out of scope. abcd's taxonomy covers abcd-internal audits only.
- Auto-running audits in some unified pipeline: each audit role keeps its existing trigger mechanism; the taxonomy is observational, not orchestrational.
- Numbered audit-role IDs (e.g.,
aud-1,aud-2): YAGNI. Audit roles are named, not numbered.
Acceptance Criteria
- Given the brief is updated, when a contributor reads
05-internals/07-audits.md, then they find a complete table of every audit role in abcd with the seven columns specified above. - Given an agent or skill invokes an audit role not registered in the taxonomy, when the documentation-auditor runs at disembark Phase 0, then the audit fails with a finding identifying the unregistered audit and the invocation site.
- Given an audit role's row is modified (column other than "Documented in"), when the change is committed, then the commit message references an ADR justifying the contract change OR the documentation-auditor flags the change as needing review.
- Given any new audit role lands in a future intent, when that intent's epic ships, then a new row is added to
07-audits.mdBEFORE the audit role is invoked anywhere in code. - Given the initial audit cast (intent-fidelity-auditor single-document role, lifeboat-oracle, press-release-composer, documentation-auditor, oracle-prompt-audit) is registered, when itd-16 (
/abcd:audit chain) and itd-31 (intent-fidelity-auditor's cross-document role) ship, then their rows are added without disrupting existing rows AND the agent count in01-agents.mdremains at 15 (itd-31 extends an existing agent rather than adding a new one). - Given the audit taxonomy is consulted during the next brief audit (post-2026-05-07 sweep), when an inconsistency surfaces that no audit role covers, then the gap is filled by adding either a new audit role (with new taxonomy row) or extending an existing one (with documented contract change).
Open Questions
- Where does the taxonomy live:
05-internals/07-audits.md(recommended — sibling of agents, adapters, configuration) vs04-surfaces/07-audit.md(treats audits as a surface, less accurate). Recommend internals. - Severity-model standardisation: the audit cast has three different severity models (per-criterion verdicts, R1–R7 categorisation, "sufficient" verdict, RFC findings, pass/fail). Should the taxonomy push toward a single model, or accept that different audits warrant different shapes? Recommend: accept different shapes; document each in its row.
oracle-prompt-auditis the odd one out: it's research-gated, RFC-style, not blocking. Does it deserve a different category in the taxonomy (e.g., a "review" type vs an "audit" type)? Probably yes; flag for follow-up.
Audit Notes
Empty. Populated by intent-fidelity-auditor when intent moves to shipped/.
References
- 2026-05-07 manual brief audit (this session): produced the meta-finding that motivated this intent.
- Coordinates with:
itd-1(acceptance gates),itd-16(hash-chain audit),itd-31(cross-document fidelity auditor — the most direct sibling). - The taxonomy registers all audit roles documented in:
04-surfaces/05-intent.md § 6(intent-fidelity-auditor),04-surfaces/02-disembark.md § 6(lifeboat-oracle, press-release-composer),05-internals/01-agents.md(documentation-auditor),05-internals/05-prompt-quality.md(oracle-prompt-audit).
Frontmatter
| id | itd-32 |
|---|---|
| type | intent |
| lifecycle | superseded |
| kind | bundle-member |
.abcd/development/intents/superseded/itd-32-audit-role-taxonomy.md
open on GitHub ↗ · commit history ↗
Referenced by1
- itd-31The Brief and Every Intent Stay Consistent — Or Abcd Tells You Why They Don'tsuperseded by
mentions7
- dcn-26080200000000042026-08-02 — iss-39: record-lint gains `record_schema`, the first rule that reasons ACROSS the record's stores (ADRs, intents, specs, the issue ledger) rather than inside one, and the `superseded/` exemption narrows for the intent tree: both rules that read it (`intent_lifecycle`, `intent_impact_valid`) now run there too, while the spec-store rules (`spec_lifecycle`, `spec_id_unique`) still honour it as before and the cross-store `record_schema` never consulted it at all. Four invariants, one scan: a cross-reference field names a record the corpus has; a supersession is declared from BOTH sides; a filename and the id inside it agree; and every lifecycle directory is enumerated, so an undeclared bucket is a finding rather than a state no rule reads. Scope is deliberate on two axes. (1) Cross-references are checked in the machine-readable frontmatter fields (`supersedes`, `related_adrs`, `related_intents`, `builds_on`, `blocked_by`), not in bare prose: a frontmatter handle is a claim that the record exists and is a live input, whereas prose legitimately narrates ids that do not resolve ("itd-38's id was released, not reserved"; a test fixture's `itd-9999`; adr-29's account of what ADR-6 settled) — arming prose would have cost ten false positives against one true one, the same false-positive budget that scopes GL002. (2) A handle resolves either to a file or to a `supersedes:` declaration elsewhere, because the ADR lifecycle PRUNES a superseded record and keeps the trace in its successor — that is what distinguishes adr-4/adr-8/adr-14..18 (pruned, accounted for) from adr-6 (cited, never accounted for). The exemption narrowing is the root cause of the corpus defect it exposes: `intent_lifecycle` is a schema rule, but the `superseded/` bucket exempted its own records from the one rule that checks a supersession is recorded, so itd-47 and itd-49 sat there for months with a prose blockquote and no `superseded_by` field. Being historical excuses a record from how it is WRITTEN, never from being well-formed. `superseded_by` also widens from `^itd-\d+` to `^(itd|adr)-\d+`: an ADR that redecides the question an intent rested on retires that intent as surely as a successor intent does, and refusing to spell that forced those two records to say nothing at all. Corpus repairs in the same change: adr-6 is dropped from the two `related_adrs` lists and the two brief pages that cited it re-point at adr-29 (which records the two-stage redaction model and states in its own body that adr-6's decision stands — adr-29 does not supersede it, so claiming it does would have written a falsehood to clear a finding); adr-12 and adr-32 gain the bidirectional pair the ledger-location redecision always implied, adr-12's status moving to `superseded` and the index row with it; itd-47/itd-49 gain `superseded_by: adr-22`/`adr-26` with `kind_at_supersession`, and those ADRs name them back; and the pre-existing one-way links itd-32→itd-31 and itd-31→itd-48 gain their reverse halves. CHANGELOG impact `additive`, matching iss-38's disposition on the same axis: the rule ships in the lint engine `abcd docs lint` runs, and any abcd-managed repo gains it by declaring its own `record_stores`.
- itd-1Every Intent Has Acceptance Criteria; Every Audit Verifies Them
- itd-16`/abcd:audit` Is the Umbrella; Conversation/Edit Chain Is Its Default Application
- itd-25Patterns Surface Themselves
- itd-27Domain Experts Get Their Intents Grilled Before Anyone Codes Them
- itd-34Intents Promote In Three Flavours — Standalone, Bundle-Member, Discipline
- itd-35Lifeboats Carry Their Own Integrity Proof