Development record
the-conformance-check-calls-itself-lint-abcd-audit-becomes-a
Summary
Delivers adr-40's second named rename, with the name the maintainer ruled in
planning: abcd audit → abcd lint, /abcd:audit → /abcd:lint, and the
reserved /abcd:audit seat returned to itd-16. Clean break, no aliases.
Ships only after spc-27's extended surface_coverage is armed. Package
ruling: the conformance core moves to internal/core/repolint (adversarial
review outcome; the engine merge is iss-251, out of scope).
Scope — the live sweep (verified inventory, 2026-08-16)
Code and surface:
internal/core/audit/→internal/core/repolint/(packagerepolint); exported API unchanged in shape (Rule,Evaluate,DefaultRules,Context, tri-state exit mapping). Therule_docs.gowrap ofcore/lintstays as-is.internal/surface/cli/audit.go(+audit_surface_test.go,audit_render_test.go) →lint.goetc.; theauditverb incli.go→lint, help text, JSON envelope key names carryingaudit.internal/surface/cli/identity.goandcommands/identity.md— the identity-positioning rule references (runs on every auditprose).commands/audit.md→commands/lint.md;commands/prepare-this-repo.md(the audit step it orchestrates).- Tests referencing the verb string:
internal/termsafe/termsafe_test.go,internal/core/ahoy/gitignore_test.go,internal/core/lint/deliverystate_test.go,internal/core/launch/commandladder_test.go,internal/core/positioning/containment_test.go,internal/core/intent/create_test.go. docs/reference/cli/commands.md— regenerate.
Record (current-state surfaces only):
- Brief:
01-product/03-mental-model.md,02-constraints/04-naming.md(the metaphor-exemption and reserved rows re-point;/abcd:auditstays listed as reserved-for-itd-16 in BOTH its listings; task-class enum rows re-checked — conformance carrieslint),04-surfaces/README.mdrow,04-surfaces/16-audit.md→16-lint.md(ordinal kept),05-intent.md,08-abcd.md,15-prepare-this-repo.md,19-identity.md,05-internals/01-agents.md,04-universal-patterns.md,08-skills.md,06-delivery/03-out-of-scope.md. - The sub-verb table rows (spc-27 format) move in the same change.
CHANGELOG.md— breaking entry that names the managed-repo step: re-download the binary and re-run scaffolding/prepare-this-repowhere a managed repo's instructions referencedabcd audit.
Not swept: historical/dated records (ADRs, dated notes and plans,
resolved issues, shipped/superseded intents, DECISIONS.md), the word
"audit" in its family-2 sense (intent audit, itd-16's reserved surface,
oracle/lifeboat prose owned by itd-125), and third-party senses (zizmor's
workflow audit, history_audit). Scoped patterns: abcd audit,
/abcd:audit, core/audit, and the itd-85 surface identifiers.
Approach
- Precondition: spc-27's sub-verb check armed, else STOP (plan ordering).
- Move the package (
git mv internal/core/audit internal/core/repolint, package clause + importer updates), watching renamed tests fail under the old wiring first. - Rename the CLI verb and surface files;
abcd auditmust fail as unknown (surface test pins it); the tri-state exit contract ofabcd lintis asserted unchanged by the existing render/surface tests moved over. - Sweep the brief and command surfaces; flip registry + sub-verb rows;
16-audit.mdrenames with its ordinal kept (16-lint.md) so the registry file-link column stays dense. - Regenerate
surface.jsonand the CLI reference;record-lint,docs-lint, surface drift test, andmake preflightexit 0 — the proof of completeness. PR classifies the residualauditgrep into the not-swept classes.
Acceptance-criteria mapping
- Identical behaviour under
lint,auditunknown — step 3's moved tests- the unknown-command pin.
- Surface file moves; reservation intact — step 4;
docs-lintlink check- a grep asserting both
04-naming.mdlistings still name/abcd:auditreserved for itd-16.
- a grep asserting both
- Sweep boundary honoured — step 5's classified residual.
- Managed-repo emissions —
prepare-this-repo+ scaffold sweep; CHANGELOG names the re-scaffold step. - Armed-gate ordering — step 1.
- Token re-check — the
04-naming.mdenum rows; the binary's task-class cross-check test updated in the same commit. - Breaking CHANGELOG — Scope.
Every behaviour change lands with a test watched fail before the change.
Frontmatter
| id | spc-29 |
|---|---|
| type | spec |
| lifecycle | closed |
.abcd/development/specs/closed/spc-29-the-conformance-check-calls-itself-lint.md
open on GitHub ↗ · commit history ↗
References1
- itd-124The Conformance Check Calls Itself Lintimplements
mentions14
- 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).
- iss-246`surface_coverage` is blind inside a row, so `shipped` means "the top-level verb exists" and every unbuilt sub-verb hides behind it.
- 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-2609020833531987docs/reference/writing-style.md gained a Structure-table row for harness_leak at v0.7.1 but its Escapes section (lines 81 to 90) still lists the docs-lint allow families as present_tense, punctuation, spelling, harness and names, and says the other machine-enforced rules have no line escape; harness_leak is in neither list, and it does take a line escape under a different token: checkHarnessLeak skips a line carrying abcd-lint:allow (or the pre-spc-29 abcd-audit:allow) and does not honour the docs-lint allow comment, and a fenced block is never flagged. A reader applies the wrong escape token or believes none exists. One sentence after line 88 closes it. Found by the v0.7.1 docs-currency pass on the release content commit; deferred from the receipt to this record.
- iss-2609260234039115The brief's press release carries the Forward-looking discipline bullet twice under What's In Scope, and the two copies contradict each other: the first (re-added by c4fc433e) says /abcd:intent grill is a sibling sub-verb of refine and that /abcd:intent consistency shipped in spc-29, while the second (from 7c3fe74c) says grill, consistency and shape are designed and not yet built. Neither refine nor grill is a registered sub-verb, and spc-29 is a predecessor-store id. Which bullet stands is the product thinker's call, since the page is the headline product in the product thinker's words; the stale copy should then be removed.
- iss-2609261536147903Planned intents and disciplines still cite specs of the retired predecessor store unqualified, and such an id at or below spc-70 resolves to a live spec on another subject (spc-12, for one, is live as the disembark grounding spec): itd-48, itd-50 and itd-53 name spc-12, spc-28, spc-29, spc-31, spc-33, spc-43 and spc-52 for the fidelity reviewer, lifecycle hook and cleanup work (which of these are predecessor ids is itself the reading this record owes); itd-24 names spc-66 as the phase-audit receipt; itd-1 and itd-37 name spc-12 as the manual reviewer. The specs charter (Two spc-N Namespaces) rules that every predecessor citation carries the '(predecessor store)' qualifier; iss-239 applied it to the draft corpus only. Each site needs a reading to tell a predecessor citation from a live one, which is why the sweep was not folded into iss-239.
- iss-2609290448510918The predecessor-store qualifier sweep reaches past the six intents iss-2609261536147903 named: outside drafts/ and those six, 192 citation sites across about forty intents name a spc-N at or below spc-70 that is not the citing intent's own spec, with no '(predecessor store)' on the line. Some are live cross-references (the cold-reading family's intents cite each other's live specs), and some are the predecessor store's (itd-4, itd-6, itd-29, itd-47 and itd-49 describe pre-rebuild work in its terms), so each site needs the same reading against the live spec it collides with; the specs charter's Two spc-N Namespaces section is the rule. Found while sweeping the pattern of iss-2609261536147903 in lane drainDrift3; a census script over intents/{planned,shipped,disciplines} reproduces the count.
- itd-16`/abcd:audit` Is the Umbrella; Conversation/Edit Chain Is Its Default Application
- itd-29Domain Experts Run A Spec Autonomously And Recover From Anything Without Touching Git
- itd-48`intent-fidelity-reviewer` Gains Its Cross-Doc And Kind-Classification Roles
- itd-85A Read-Only Repo-Conformance Audit
- itd-125The Lifeboat Verdict Says What It Is
- spc-27the-registry-cannot-wave-its-hands-every-surface-file-carrie