Development record
abcd Speaks One Word for a Specced Block of Work, and That Word Is "Spec"
Press Release
abcd speaks one word for a specced block of work —
spec— everywhere a product thinker or contributor reads: noepicleft behind in a heading, a review type, a schema field, or the glossary. The native spec store isspecthroughout, and abcd'sspec_idintent-frontmatter field already carries the concept. Where abcd's surfaces still say"epic"— the reviews subsystem (epic-reviewtype,## Epic:headings,epic_idreview-directory identifiers), and prose across the brief, docs, and command help — this intent makes the vocabulary single. Every one of those surfaces is abcd-owned; there is no vendored external epic/spec boundary to preserve, so the rename runs clean through the reviews subsystem, the schemas, and the glossary."I'd renamed the field and thought I was done — then a contributor opened the glossary's
epicterm file and asked which word was real," said Kira, framework author. "abcd's whole pitch is that each concept has one canonical term. Havingspecin the schema andepicin the glossary was exactly the drift the glossary exists to prevent. One sweep, one word, and the term file is the source of truth again."
Status
This intent is the remaining terminology sweep. The atomic
epic_id→spec_id intent-frontmatter field rename is a separate concern (it
has to be atomic: schema + data + code together, or intent-lint fails); the
broader, non-atomic surface/prose/glossary sweep enumerated under What's In
Scope below is what this intent carries.
Why This Matters
abcd's terminology discipline exists to kill exactly one failure: the same concept named two ways, drifting until two readers mean different things. abcd names its own core noun one way: the schema and the intent corpus say spec_id, brief/glossary/core/spec.md carries term: spec with epic in forbidden_synonyms (spc-8), and GL002 keeps the live prose on the one word. A framework that enforces ubiquitous language cannot itself be bilingual about its central term.
The epic_id→spec_id field rename is a separate, earlier change, on purpose — it had to be atomic (schema + data + code, or intent-lint validation fails). The sweep this intent carries does not guard against breakage: the drift it removes is inconsistency, not breakage, which is why it is its own intent rather than an emergency fix. Left alone, that drift erodes the glossary's authority and confuses every new contributor.
The reviews subsystem, the schemas, and the spec store are all abcd-owned — there is no vendored external plugin whose epic/spec aliases must be preserved, so the rename is a coherent internal sweep rather than a negotiation across a boundary. The single-source-of-truth rule decides the order: brief/glossary/core/spec.md is canonical for the concept, so it was renamed first and everything else conforms to it.
What's In Scope
- Rename the canonical term file — delivered with spc-8: the term file lives at
brief/glossary/core/spec.mdwithterm: specandepicinforbidden_synonyms, and theGL002lint catches regressions. - Reviews subsystem rename — the review-index, review-postprocess, and review-verify surfaces:
epic_idparameters →spec_id, the--epicCLI flag, the## Epic:rendered heading, theepic_idJSON field, and theepic-review/epicreview-type tokens. All of it is abcd-owned, so the review-type token becomesspec-reviewthroughout with no external token to accommodate. Moot (product thinker, 2026-09-23): the Go tree has no reviews subsystem that classifies reviews by kind, so none of these surfaces exists to rename. issue.schema.json— moot in the Go rebuild (spc-8): no*.schema.jsonexists in the tree, and the native validator already usesrelated_specsexclusively.grill-report.schema.json— moot in the Go rebuild (spc-8): the file does not exist.- Prose sweep —
intents/README.md, the brief (04-surfaces/,02-constraints/, etc.),docs/reference/{commands,facilitator,review-schema}.md,commands/intent.md, the grillSKILL.mdboundary message, project READMEs:epicas a noun →spec. - The native spec store's README — moot in the Go rebuild (spc-8):
.abcd/development/specs/carries no README.
What's Out of Scope
- The
epic_id→spec_idintent-field rename — already completed in a prior, separate change (it had to be atomic; this intent is the non-atomic remainder). - Renaming the
spc-ID prefix —spc-N-slugis the spec identifier format; this intent renames the concept word, not the ID scheme.
Scope Conditions
None stated.
Acceptance Criteria
BDD format, per the itd-1 discipline.
- Given the rename is complete, when a contributor greps abcd-owned files for
"epic"as a standalone noun, then no live reference remains — only historical git-tracked records. - Given the glossary, when a contributor looks up the concept, then it resolves to
brief/glossary/core/spec.mdwithterm: spec, andepicappears there only as aforbidden_synonymsentry. - Given the issue ledger, when an issue links to a spec, then it uses
related_specs— met by the Go rebuild's validator (spc-8); no*.schema.jsonremains to update. - Given the prose sweep is complete, when
internal/core/lintruns, then no forbidden-synonym (GL002) violation forepicis raised by any abcd-owned intent or doc.
A criterion that the reviews subsystem classifies against a spec-review type is dropped as moot (product thinker, 2026-09-23): itd-28 was re-scoped to pin plus staleness on 2026-09-21, nothing classifies reviews by kind, and so there is no epic-review token to rename and no spec-review emitter to build.
Open Questions
- Sequencing against the
intents/README.mdv1/v2/v3 → phase migration (logged separately in a working-log entry): both rewriteintents/README.md. Run the README migration first and this sweep second, or merge them into one README pass? - ~~Should the term file be renamed or kept as a stub?~~ Answered by the tree (spc-8): the rename happened with no stub, and the definition body carries
term: spec.
Audit Notes
Fidelity review — receipt rcp-3a24ef30ac16 (verifier intent-auditor claude-fable-5-1).
Provenance: intent-auditor@claude-fable-5-1 · rubric_hash sha256:effa65b3e9e88ff29433b443ec2be159522a8b0b71cf1434526514aa61edb13e · prompt_hash sha256:85e2f149ad89a02ed2e0e1d99761a26a2e331045a21a310856d3fdf6b95657b4 Input attestations: diff:da7b7cf4..2a759d32 (PR #668 shipped the record; the sweep itself is the tree read at cede78b8)@-;
Acceptance rollup: MET 3 · MET_WITH_CONCERNS 1 · NOT_MET 0 · INCONCLUSIVE 0
Per-criterion verdicts:
- ac-1 — MET_WITH_CONCERNS: a word-bounded grep of the tree at cede78b8 outside the record folders finds the noun only in the glossary's own declarations, historical plans and reviews, a mined test corpus, and an external tool's model in the acknowledgements; the one live residue is a parenthetical inside a fenced surface diagram on the brief's intent page, which grep finds and which GL002 skips by design as fenced text evidence: .abcd/development/brief/04-surfaces/05-intent.md:244 — "Auto-running the reviewer off that queue is still deferred (no epic currently owns" evidence: .abcd/development/brief/glossary/core/spec.md:6 — "forbidden_synonyms: ["sprint", "milestone", "project", "feature", "epic"]" evidence: internal/core/lint/lint.go:2320 — "(fenced and inline single-backtick), YAML frontmatter, exempt path prefixes, the"
- ac-2 — MET: the term file is brief/glossary/core/spec.md with term: spec and epic listed among its forbidden_synonyms, and no core/epic term file exists evidence: .abcd/development/brief/glossary/core/spec.md:2 — "term: spec" evidence: .abcd/development/brief/glossary/core/spec.md:6 — "forbidden_synonyms: ["sprint", "milestone", "project", "feature", "epic"]"
- ac-3 — MET: the issue validator declares related_specs as the spc-N list field and the tree carries no *.schema.json file
evidence: internal/core/capture/validate.go:144 — "{"related_specs", reSpcID, "spc-N"},"
evidence: internal/core/capture/capture.go:106 — "RelatedSpecs []string
json:"related_specs,omitempty"" - ac-4 — MET: GL002 is enabled as a blocker enforcing epic over the .abcd/development root, and a test lints the live corpus with the real glossary and pins the GL002 count at zero evidence: .abcd/record-lint.json:405 — ""enforce": [" evidence: internal/core/lint/forbidden_synonyms_test.go:201 — "func TestForbiddenSynonymsRealGlossary" evidence: internal/core/lint/forbidden_synonyms_test.go:224 — "if n := countRule(fs, "GL002"); n != 0 {"
Gap audit:
- honoured:
- the glossary term file is the source of truth and the lint reads it rather than a copy evidence: internal/core/lint/lint.go:2310 — "the glossary term files under cfg.GlossaryDir (the single source of truth for"
- the issue ledger links to specs through related_specs evidence: internal/core/capture/validate.go:144 — "{"related_specs", reSpcID, "spc-N"},"
- the reviews-subsystem criterion is dropped as moot by the product thinker's ruling, and the record says so evidence: dcn-2609230000000001 — "itd-43's third criterion is moot and dropped, so spc-8 closes."
- diverged:
- no epic left behind in a heading or the brief: one noun use survives inside a fenced diagram on the brief's intent surface page, outside the detector's scope evidence: .abcd/development/brief/04-surfaces/05-intent.md:244 — "(no epic currently owns"
- missing: (none)
References
- Follows: the
epic_id→spec_idintent-field rename (intent.schema.json, prd.schema.json, all 41 intent files, internal/core/lint, commands/intent.md) — the atomic part, done first; this intent is the non-atomic remainder. - Sequenced with: the
intents/README.mdv1/v2/v3 → phase migration (logged in a dated working-log entry, 2026-05-16 session) — both rewrite the same README; order or merge them. - Triggered by: the native spec store adopting
specas its term (adr-26), which leaves abcd's olderepicsurfaces inconsistent.
Frontmatter
| id | itd-43 |
|---|---|
| type | intent |
| lifecycle | shipped |
| kind | standalone |
| severity | minor |
.abcd/development/intents/shipped/itd-43-epic-to-spec-terminology.md
open on GitHub ↗ · commit history ↗
References1
- adr-26A native minimal spec layer with the companion harness `ccpm` as the primary deeper backendrelated
Referenced by9
- adr-11One canonical word for a specced block of work — specrelated
- adr-34Intent lifecycle and phase scheduling are orthogonal axesrelated
- iss-2610262035181369itd-43 rules its reviews rename moot because no reviews subsystem classifies reviews by kind; the status-board chapter describes a reviews reader whose rows carry a kind and a specrelated
- iss-2610262040189116The lint contract says rules are named, never numbered; itd-43 says a `GL002` lint catches regressionsrelated
- iss-2610262043469929itd-142 says abcd ships zero skills; itd-43 still treats the grill SKILL.md as a live surface to rewriterelated
- iss-2610262045336833itd-34 has bundle members share an epic_id field; itd-43 says the intent field is spec_id and epic is gonerelated
- iss-2610262045343669itd-4's issue schema carries related_epics; itd-43 says the validator uses related_specs exclusivelyrelated
- itd-50The Audit Loop Drives An Intent To Acceptance — Or Calls For A Replanbuilt on by
- spc-8epic-to-spec-terminologyimplemented by
mentions14
- dcn-26071700000000042026-07-17 — Burst 5 (M5, itd-43/spc-8): GL002 enforces a deliberate subset
- dcn-26082600000000072026-08-26 — Bug-hunt round 9 (bughunt-b): baseline green on the unshallowed
- dcn-26092300000000012026-09-23 — The product thinker ruled on the owed items of the autonomous run of 2026-09-23 in one interview, one question at a time (07:51Z to 09:32Z, while the run was paused): two release blockers, two intents, the 35 major captures routed to the product thinker, and two older owed rulings. The release waits for two things: version-stamped plugin payloads (iss-2609230733497536, built by a run lane, with no criterion amended and no deferral) and a release press release composed at the cut from the shipped intents' press releases, which is a new capability and gets an intent and its planning interview before any lane builds it. The run may approve the release environment itself once every gate is green; that agenda line is written in the release commit, not here. itd-4's AC3 is built as written, the `--issue-drift` check and the rename of the back-links to `related_issues` / `related_intents` together, and spc-6 closes only when both land (the 2026-07-17 ruling stands). itd-43's third criterion is moot and dropped, so spc-8 closes. The guard contract is extended to read a host-supplied per-call working directory (iss-2609212142557657, option A), after a probe of what the host does when none is supplied. Four majors are ruled to a build (iss-2608231120121681 write-path smoke, iss-2608290810036869 preflight before the push connects, iss-2609090828371674 per-agent staging locks, iss-2609120505141653 the provenance comment) and do not hold the tag. The rulings that set a rule each have their own entry below; every other routed major is deferred past v0.9.0 with its ruling as the `deferral_reason`, and the 168 routed minor and nitpick captures take the run's default deferral. The product thinker also asked that the interview be kept as autonomous-run experiment data, towards making a run transparent to the person it serves; the observations feed the run's end-of-run research note. Rejected, as the frame: the run taking any of these rulings itself.
- dcn-26092300000000142026-09-23 — Four corrections to the entries of 2026-09-23 above that record the product thinker's run A interview, appended because the ledger is append-only and its gate refuses an in-place edit even of an entry that has not reached the default branch. (1) The interview entry leaves out a clause of ruling B4: itd-43 ships in the next release, so the next cut announces it. That stands against AGENTS.md's rule that a record closed for work an earlier release already carried is stamped `shipped_in:` with that release, since v0.2.0's changelog already named the GL002 gate (itd-43); the product thinker's ruling resolves the tension, so itd-43 carries no `shipped_in:` stamp and the next release's changelog names it. (2) In the ceiling entry, the sentence "A fork of an agent is an agent, so a lane does not fork itself to get under it" is the run's own rule for its lanes, not part of the product thinker's ruling. (3) In the proxy-gate entry, a gate that measures a proxy, or exempts the cases that matter, withdraws vigilance more thoroughly than a phantom gate does, as enforcement-claims-are-facts and iss-2608230847432286 say, not "just as" a phantom gate does. (4) In the cold-reading fork entry, the closing sentence "The code that ships here is unaffected by the move" is not part of the ruling and is withdrawn.
- iss-3phase membership and lifecycle directories disagree: planned intents (itd-20, itd-24, itd-29, itd-46) appear in no phase Scope, while draft itd-43 is scoped into Phase 0/1 yet listed later-phase. ADR-bound.
- iss-803-out-of-scope.md omits current drafts itd-74 and itd-75 while including scoped itd-43; regenerate from the actual draft corpus.
- iss-392bughunt round-3 confirmed nitpick batch — zero-padded record-id filenames evade the id-uniqueness lint in all three families; the go-version lockstep test skips .yaml workflows; scripts/*.sh lack the eol=lf pin the repo's own policy states; agents/CHANGELOG announces lifeboat-reviewer 0.1.1 while the prompt carries 0.1.0; five live records still route to the pre-flattening commands/abcd/ and retired docs/reference pages
- iss-2608261437044340itd-43 specifies work against the retired terminology tree its own spec records as delivered
- iss-2609231206207995itd-43 criterion 1 promises no live reference to epic as a standalone noun in abcd-owned files. One survives on the brief's intent surface page, .abcd/development/brief/04-surfaces/05-intent.md:244 ('no epic currently owns it'), inside the fenced surface diagram opened at line 176, which GL002 skips by design as fenced text and a grep finds. Reword it to spec, or record that fenced diagrams are out of the sweep's scope. Found by the fidelity audit; not fixed here.
- iss-2610262041559803The glossary enforces 'epic' as a forbidden synonym; itd-4's issue schema names a related_epics field holding spec ids.
- itd-1Every Intent Has Acceptance Criteria; Every Audit Verifies Them
- itd-28Spec-Tied Reviews Live Next To The Spec They Reviewed
- itd-29Domain Experts Run A Spec Autonomously And Recover From Anything Without Touching Git
- itd-46`/abcd:intent "<text>"` And `/abcd:capture "<text>"` Become Symmetric Create Paths