Development record
The Intent Audit Says Audit
Press Release
The verb that answers the product thinker's question finally says so.
"'Review' told me someone judged the code. What this verb actually answers is
whether I got what I asked for — that's an audit, and now it's named as mine,"
says Iris, product lead. abcd intent audit emits the same per-criterion
verdicts it always did; what changed is that the name now tells you whose
question it answers.
Why This Matters
abcd intent review emits family 2 (MET / MET_WITH_CONCERNS / NOT_MET /
INCONCLUSIVE) — per adr-40 that comparison is an audit, and the brief's own
mental model already calls it "the intent audit". The name crossed with
itd-85's verb, so a maintainer cannot reason from verb to bucket. This is
adr-40's first named rename: clean break, no aliases, no deprecation shims —
abcd is pre-1.0.0, --impact breaking drives version derivation, users
re-download. About 37 files reference the current name. The
intent-fidelity-reviewer agent becomes intent-auditor (the intent-grain
auditor of the three audit grains), and the intent_review task-class token
becomes intent_audit.
Scope Conditions
None stated.
Acceptance Criteria
BDD format, per the itd-1 discipline. Walked and confirmed by the maintainer, 2026-08-16.
- Given the rename, then
abcd intent audit [<itd-N>]andabcd intent audit ingest --verdict-json <file>replace thereviewspellings, and the old sub-verb is gone — no alias, no shim;abcd intent reviewfails as an unknown sub-command. - Given the sweep, then every live reference moves:
commands/intent.md, brief prose, the agent file and its registered name (intent-fidelity-reviewer→intent-auditor), theintent_reviewtask-class token →intent_auditwith its04-naming.mdreserved-vocabulary row updated in the same change, code, tests, and the verb's JSON field names. - Given the sweep boundary, then historical and dated records are not
rewritten — ADRs, dated research notes, resolved issues, shipped intents,
and
DECISIONS.mdkeep the old name as history; the brief (current-state per adr-5), commands, code, anddocs/move. - Given itd-122's extended
surface_coveragearmed, then theintentsub-verb table row flips in the same change andrecord-lintexit 0 proves the migration complete; landing this rename before that check is armed is forbidden. - Given stored artefacts (receipts, previously ingested verdicts), then they are not rewritten, and any parser that reads them continues to accept them.
- Given the release record, then the CHANGELOG entry is breaking and version derivation reads it.
SOTA
Breaking CLI renames without aliases are the pre-1.0.0 norm (semver §4;
established precedent in this repo via iss-171's --impact breaking path);
alias/deprecation machinery was considered and rejected in adr-40 (it
collides with the change-narration ban). Chosen path: bespoke sweep,
proved complete by the armed itd-122 gate. No new dependency.
Open Questions
None gating. The agent name (intent-auditor) was ruled by the maintainer
at the walk, 2026-08-16.
Audit Notes
Fidelity review — receipt rcp-12cab97fb543 (verifier abcd:intent-auditor claude-fable-5-1).
Provenance: abcd:intent-auditor@claude-fable-5-1 · rubric_hash sha256:effa65b3e9e88ff29433b443ec2be159522a8b0b71cf1434526514aa61edb13e · prompt_hash sha256:a3bbc2399efb521c82d8b77e10cc87923383c1f194a98c55fc11343d7bdba8d9 Input attestations: diff:tree at da7b7cf409b41758b3502d3873687dc8b817d8c4 (worktree HEAD; the host supplied no commit range, so the whole tree at that commit is the delivered reality)@-;
Acceptance rollup: MET 4 · MET_WITH_CONCERNS 2 · NOT_MET 0 · INCONCLUSIVE 0
Per-criterion verdicts:
- ac-1 — MET: The intent command registers audit and audit ingest --verdict-json, the retired review spelling is refused through the retired-sub-verb guard with the successor named (never swallowed as a free-text create), and the surface test drives both retired shapes to a refusal. evidence: internal/surface/cli/cli.go:2227 — "Use: "audit [< itd-N>]"," evidence: internal/surface/cli/cli.go:2251 — "Use: "ingest --verdict-json < path>"," evidence: internal/surface/cli/cli.go:3762 — ""intent": {"review": "audit"}, // spc-28 (adr-40)" evidence: internal/surface/cli/intent_surface_test.go:126 — "t.Fatalf("intent review must be an unknown sub-command after the rename, got: %v", err)"
- ac-2 — MET_WITH_CONCERNS: The agent file is registered as intent-auditor, the naming register's task-class enum carries intent_audit, the plugin page and the sub-verb table say audit, and no verdict json field carries the review name; concern: the brief's verification matrix still titles the row for this verb 'Intent fidelity review (Role 1)', a residue of the pre-rename vocabulary in current-state prose.
evidence: agents/intent-auditor.md:2 — "name: intent-auditor"
evidence: .abcd/development/brief/02-constraints/04-naming.md:180 — "|
task_classes(capability_scope tokens) ∈ `{oracle_review, intent_audit, spec_planning," evidence: commands/intent.md:490 — "intent audit < itd-N> --json # re-emit a shipped intent's review request" evidence: .abcd/development/brief/04-surfaces/05-intent.md:59 — "|audit| audit | shipped |" evidence: internal/core/intent/audit.go:120 — "ReceiptID stringjson:"receipt_id"" evidence: .abcd/development/brief/06-delivery/02-verification-matrix.md:56 — "| Intent fidelity review (Role 1) |" - ac-3 — MET: The decision log and the ruling ADR keep the old spelling as history while the live surfaces carry none of it; the only remaining old-name hits outside dated records are closed spec records and one open spec's slug, all records the boundary leaves alone.
evidence: dcn-2608160000000003 — "
intent reviewemits family 2 so it is an audit" evidence: .abcd/development/decisions/adrs/0040-review-audit-lint-are-three-verbs.md:201 — "-abcd intent review→abcd intent audit. It emits family 2; the brief" evidence: agents/CHANGELOG.md:416 — "### intent-auditor 0.1.1 (renamed from intent-fidelity-reviewer)" - ac-4 — MET_WITH_CONCERNS: The intent sub-verb table carries audit and audit ingest as shipped, the registry README states the surface_coverage rule machine-checks the column, and record-lint exits 0 over the tree at this commit (run by the auditor, warnings only); concern: the landing-order clause (armed before this landed) is a history fact the delivered tree cannot show.
evidence: .abcd/development/brief/04-surfaces/05-intent.md:59 — "|
audit| audit | shipped |" evidence: .abcd/development/brief/04-surfaces/05-intent.md:60 — "|audit ingest| audit | shipped |" evidence: .abcd/development/brief/04-surfaces/README.md:46 — "The Status column is machine-checked: thesurface_coveragerecord-lint rule" evidence: Makefile:164 — "record-lint:" - ac-5 — MET: The verdict payload type and the audit-note marker vocabulary are unchanged constants the ingest parses, and shipped intents ingested before this rename still carry the same marker line the regex matches.
evidence: internal/core/intent/audit.go:49 — "const VerdictType = "abcd/intent-fidelity-verdict/v1""
evidence: internal/core/intent/audit.go:95 — "markerRe = regexp.MustCompile(
(?m)^< !-- abcd-review: (OWED|INGESTED|DEAD_LETTER) receipt=(rcp-[0-9a-f]+) -- >\r?$)" evidence: CHANGELOG.md:1114 — "Stored artefacts are format-frozen — theabcd-review:audit-note markers, theabcd/intent-fidelity-verdict/v1payload type, and every previously ingested verdict remain valid" - ac-6 — MET: The shipped record declares impact breaking, which is the field version derivation reads, and the 0.6.0 changelog section carries the entry under the breaking heading.
evidence: .abcd/development/intents/shipped/itd-123-the-intent-audit-says-audit-abcd-intent.md:10 — "impact: breaking"
evidence: CHANGELOG.md:1114 — "- The intent audit says audit.
abcd intent reviewis nowabcd intent audit"
Gap audit:
- honoured:
- the verb emits the same per-criterion verdicts under the audit name, with no alias evidence: internal/surface/cli/cli.go:3762 — ""intent": {"review": "audit"}, // spc-28 (adr-40)"
- the agent becomes intent-auditor and the task-class token becomes intent_audit evidence: agents/intent-auditor.md:11 — "task_classes: [intent_audit]"
- diverged:
- every live brief reference moves to the audit vocabulary evidence: .abcd/development/brief/06-delivery/02-verification-matrix.md:56 — "| Intent fidelity review (Role 1) |"
- missing: (none)
Frontmatter
| id | itd-123 |
|---|---|
| type | intent |
| lifecycle | shipped |
| kind | standalone |
| severity | major |
.abcd/development/intents/shipped/itd-123-the-intent-audit-says-audit-abcd-intent.md
open on GitHub ↗ · commit history ↗
Referenced by3
- iss-2610262045156888The verdict verb is `abcd intent review ingest` in itd-80 and `abcd intent audit` in itd-123related
- itd-2609212130136102abcd's verbs consolidate: modes become flags and five checks become one lintrelated
- spc-28the-intent-audit-says-audit-abcd-intent-review-becomes-abcdimplemented by
mentions21
- adr-5Brief is the current state; no version label, no archive directory
- adr-40Review, audit, lint, and gate are four buckets, separated by what each compares
- dcn-26081600000000032026-08-16 — the assessment vocabulary settled at a maintainer grill and filed as adr-40 (proposed): **four buckets — lint / review / audit / gate — separated by what each compares**, not by determinism, not by trigger. The rule was already half-recorded (05-internals/01-agents.md rules the two verdict families disjoint: "reviews assess a change, criterion verdicts assess a promise vs reality") and three shipped surfaces contradict it — `intent review` emits family 2 so it is an audit, `abcd audit` is deterministic rule-checking so it is a lint (and it consumed the `/abcd:audit` name 02-constraints/04-naming.md reserves for itd-16), and `disembark oracle` emits family 1 while the brief calls its output an audit. Grill rulings: **one surface performs exactly one act** (multi-act surfaces split at design time — cheap, because every multi-act surface abcd has is unbuilt, so they are specified rather than refactored); the buckets are a **closed list extended by PR, not a criterion** (an autonomous run given a criterion interprets it; a table lookup matches or fails); `intent ready` survives as the fourth bucket **gate** because it names a decision rather than a comparison, preserving itd-94's exit-code contract; determinism is orthogonal (itd-16's hash-chain check is a deterministic *audit*; itd-85's conformance check is a *lint* however built); automatic-vs-manual never enters a verb name (the trigger is the facilitator's, per itd-97); the oracle is the model-access seam beneath review and audit, never a bucket. **Clean break, no aliases** — pre-1.0.0, `--impact breaking` drives version derivation (iss-171 precedent), users re-download; an alias would additionally collide with the documentation discipline's ban on change-narration, leaving an undocumented silent forward. The role mapping is the operational reason the split earns its cost: product thinker reads `audit` and essentially nothing else, which makes itd-99's "never hand a product thinker a technical decision" mechanically checkable. Same grill corrected a wrong finding: iss-246 was filed claiming abcd's record documents a surface far larger than the binary with no gate catching it; **false** — the `Status` column in 04-surfaces/README.md is machine-checked by `surface_coverage` (iss-35), the brief carries ~100 inline `design target` markers, and adr-5 makes the brief aspirational by design. The real defect is narrower: `surface_coverage` is blind *inside* a row, so six of twenty rows read `shipped` then qualify themselves in prose, and documents outside the registry cite those sub-verbs as live (all three citing **predecessor-store** spec ids spc-29/spc-30, whose prose survived the migration to the native store). Fix per adr-40 §6: sub-verb tables carrying two facts per verb — bucket and existence — with `surface_coverage` extended to registered cobra sub-commands, one table serving both disciplines. Also established: the twelve-step record walk completes at ten steps; step 2 (`capture promote`) has no verb and step 12 (`capture resolve`) cannot write `resolved_by`, so **walkability is sequenced before coherence** — renaming ~90 files across a process nobody can walk is polish before function. Plan at plans/2026-08-16-process-coherence-and-walkability.md; six intents to plan, none plannable unattended. Rejected: one polymorphic `review <id>` verb (merges the disjoint families, erases the role signal), classifying acts rather than surfaces (makes the bucket a statement of intent rather than a guarantee, and hands product thinkers lint findings), three buckets without `gate` (forces `intent ready` to become `intent lint`), and adding `verify`/`validate` (itd-109's verification suite is a packaging of lints and audits, not a fifth kind).
- dcn-26092300000000232026-09-23 — The payload example in spc-2609231435545473 (closed) is stale on one point: its itd-121 quote opens `"... what I'd do next,"`, a truncation the release-page ingest refuses by design, since a quote is a whole quoted sentence as the press release has it. The example's verb is right: the ingest accepts an attribution after `says` as well as after `said`, because six intents of that release (itd-119, itd-120, itd-121, itd-123, itd-124, itd-125) quote as `says <Name>, <role>.`. The closed spec stays as written; `TestQuoteSaysFormFromARealRecord` carries a working `says` quote, taken from itd-121 as its record has it (lane implementer, on review 2 of the release-page build).
- iss-171The PATH-install detector and installer assume one blessed layout: binTarget defaults to /usr/local/bin/abcd (sudo territory abcd cannot assume) and symlink detection only recognises that exact target, so a working ~/.local/bin/abcd symlink install — the field-standard single-user location used by uv/pipx/rustup-class tools — reports symlink.missing, a false gap; the detector is itself running as abcd from PATH while reporting abcd not installed. Letting ahoy install 'fix' it would write a symlink to <plugin-root>/abcd without validating the target exists — a dangling symlink shadowing the working install. Redesign per fix-the-detector and no-sudo: detection scans PATH for abcd, resolves symlinks (EvalSymlinks, same seam as iss-170), classifies dev-shim/owned/foreign; install defaults to ~/.local/bin (create if needed), adopts an existing owned install in place, does system-wide dirs only behind an explicit --bin-dir flag failing loudly when unwritable, never escalates privileges, refuses to create a symlink whose target does not exist; '~/.local/bin not on PATH' becomes its own loud gap with the printed one-line fix (script-first: print the export line, do not auto-patch shell profiles as the first rung).
- iss-251Two lint engines under one vocabulary: internal/core/repolint (post-itd-6 rename; Rule/Evaluate/tri-state exit) and internal/core/lint (RuleConfig/Finding stream) are separate engines with separate rule models and config schemas, already entangled (repolint's rule_docs.go wraps docs-lint as a conformance rule). Every new rule author must pick an engine. Consolidating the rule models is a deliberate future intent - deliberately kept out of the itd-123-era rename sweep after adversarial review of merge-now vs rename-only.
- iss-284The adr-40 vocabulary renames narrow the public surface for v0.6.0: abcd audit is abcd lint, abcd disembark oracle is abcd disembark review, and abcd intent review / intent review ingest are abcd intent audit / intent audit ingest. Four command paths leave the surface; each successor refuses the old spelling by naming the new one. Deliberate breaks, documented in the CHANGELOG Breaking section (itd-123, itd-124, itd-125)
- iss-2609231101102072The verification matrix keeps pre-rename vocabulary for two renamed verbs: its rows read 'Intent fidelity review (Role 1)' and 'Press-release oracle audit', while the intent audit (itd-123, ac-2: brief prose moves to the audit vocabulary) and the lifeboat review (itd-125, ac-5: the brief's oracle-audit prose moves to review) each promised the brief's current-state prose would move. Found by the fidelity audit of both intents; the page is 06-delivery/02-verification-matrix.md.
- iss-2610262032018111The agent holding the shape-classification third role is `intent-auditor` in the mental model and `intent-fidelity-reviewer` in itd-34.
- iss-2610262032120773itd-48 puts Role 2 in `agents/intent-fidelity-reviewer.md`; the naming register says the cross-document role belongs to the intent auditor, `agents/intent-auditor.md`
- iss-2610262032163067itd-80 names the Role 1 reviewer `intent-fidelity-reviewer`; the brief's press release says Role 1 belongs to `intent-auditor`
- iss-2610262034520240itd-34 calls the three-role fidelity agent intent-fidelity-reviewer; the intent surface page calls the same agent intent-auditor.
- iss-2610262042088869itd-46 lists `ship` and `grill` as existing intent sub-verbs that keep requiring an id; the build sequence says neither exists.
- iss-2610262045246595itd-46 lists `ship` and `review` among the intent sub-verbs; itd-121 says shipping an intent is a spec verb
- iss-2610262045442294itd-80 names the verdict ingest abcd intent review ingest; itd-2609150819445595 names the same review family abcd intent audit
- itd-1Every Intent Has Acceptance Criteria; Every Audit Verifies Them
- itd-85A Read-Only Repo-Conformance Audit
- itd-122The Registry Cannot Wave Its Hands
- itd-124The Conformance Check Calls Itself Lint
- itd-125The Lifeboat Verdict Says What It Is
- itd-2609231013154443Every release arrives with a press release composed from what shipped