Development record
epic-to-spec-terminology
Summary
spc-8 delivers itd-43's implementable remainder: the GL002 forbidden-synonym
lint gate, built detector-first against the glossary, and the live-prose
sweep it drove — 19 flagged uses of epic as the concept-noun cleared to
spec across four record files, with the detector (not human judgment)
deciding what counted. The criterion that held the spec open, a
reviews-subsystem spec-review token, is dropped from itd-43 as moot (product
thinker, 2026-09-23): itd-28 was re-scoped to pin plus staleness on
2026-09-21, and nothing classifies reviews by kind. The spec closes on the four
criteria that remain.
Approach
Fix-the-detector, literally: the rule was armed before any prose changed, its 19 live-corpus findings were captured verbatim as the watched-fail evidence, the sweep then drained exactly what it flagged, and a regression test pins the live corpus at zero GL002 findings from here on.
- The rule (
internal/core/lint):checkForbiddenSynonymsreads the glossary term files (.abcd/development/brief/glossary/) as the source of truth, flags an enforced synonym used as a standalone word in live prose, and errors if an enforced word is not actually declared in some term'sforbidden_synonyms(the gate cannot drift from the glossary). Matching is case-insensitive with explicit Unicode word boundaries (utf8.DecodeRune+ a word-rune class), deliberately not Go's ASCII-only regexp\b; a test provesepics,epicenter, and unicode-adjacent text do not match while bare and parenthetical uses do. - Enforcement is a deliberate subset —
epiconly, for now. Most of the glossary's forbidden synonyms (sprint,milestone,project,feature) are common English words whose false-positive rate would sink the gate; each is opt-in via the rule config as the corpus is readied for it. - Exemption scope (config in
.abcd/record-lint.json, not silent skips): YAML frontmatter, code spans and fenced blocks,allow_contextphrases (epic-to-spec,epic->spec,epic→spec— the rename's own name), and historical paths (research/,decisions/, datedplans/,intents/shipped/+superseded/, the glossary term files themselves). Live surfaces — brief body, roadmap, drafts/planned intents, open specs, docs, commands — are in scope. - Wiring: registered in
.abcd/record-lint.json, so it runs undercmd/record-lintinsidemake preflightand CI — the gate is a gate, not a claim.
Milestones as delivered
- GL002 rule + seven hermetic unit tests, watched-fail first (
23c0e86, hardened bya1e1467). - The armed-detector sweep: 19 hits → 0 across
itd-34-three-intent-kinds.md(11 lines),itd-6-rp-mcp-only-integration.md(6),itd-48-intent-fidelity-reviewer-roles-2-3.md(1 line, 2 tokens),roadmap/phases/phase-0-substrate.md(1) (2a6e9cd). - CHANGELOG entry for the new gate (
6c1a88a).
Acceptance-criteria satisfaction
AC as ordered in itd-43 when this spec was minted → status and evidence:
- No live
epic-as-noun reference remains — gap-filled, detector-driven: GL002 armed pre-sweep flagged 19 lines (captured verbatim); post-sweep the corpus is at 0, pinned byTestForbiddenSynonymsRealGlossary(loads the real config + glossary over the real corpus). Historical records exempt per the AC's own carve-out. - The glossary resolves to
specwithepicforbidden — met already:brief/glossary/core/spec.mdcarriesterm: specandepicinforbidden_synonyms; no staleepic.mdterm file exists anywhere (verified by filesystem sweep). The intent's open question (rename vs stub) was answered historically — the rename happened with no stub. - Reviews subsystem classifies against
spec-review— dropped from itd-43 as moot (product thinker, 2026-09-23). The Go tree has no reviews subsystem that classifies reviews by kind, and itd-28 was re-scoped on 2026-09-21 to pin plus staleness, so noepic-reviewtoken exists to rename and nospec-reviewemitter exists to build. The intent's criteria renumber: its fourth and fifth are this list's 4 and 5. issue.schema.jsonusesrelated_specs— satisfied-by-adjudication: noissue.schema.jsonexists in the Go tree (old-system reference); the native validator (internal/core/capture/validate.go) and capture engine already userelated_specsexclusively, with norelated_epicsanywhere. Nothing dead was built.internal/core/lintraises no GL002 violation forepic— gap-filled: the rule now exists (it did not before), is wired into the preflight/CI record-lint, and the live corpus passes at zero (same regression pin as AC1).
Judgment call on record
Two of the 19 hits sat inside internal self-quotes (a working-log line and
spc-12's overview, quoted in itd-48). Both are abcd's own records, not
external citations, so they were swept for the single-word consistency this
intent exists to enforce — recorded here rather than silently.
Out-of-scope confirmations: the spc- ID prefix is untouched (the intent
renames the concept word, not the ID scheme); epic_id→spec_id was the
prior atomic change; no schema files were altered.
Frontmatter
| id | spc-8 |
|---|---|
| type | spec |
| lifecycle | closed |
.abcd/development/specs/closed/spc-8-epic-to-spec-terminology.md
open on GitHub ↗ · commit history ↗
References1
- itd-43abcd Speaks One Word for a Specced Block of Work, and That Word Is "Spec"implements
mentions10
- dcn-26071700000000042026-07-17 — Burst 5 (M5, itd-43/spc-8): GL002 enforces a deliberate subset
- 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.
- iss-142prompt-quality brief self-contradiction: 05-prompt-quality.md states PQ001-PQ006 are shipped by spc-8, while 06-lint.md declares the PQ family a design target with no PromptLinter in internal/core/lint — the code sides with 06-lint. An instance of the iss-37 phantom-enforcement class, surfaced by the itd-100 docs-currency review when the crosswalk nearly repeated the phantom claim. Detector: enforcement-claims-are-facts sweep over the brief's Shipped-by annotations; acceptance corpus: the two contradicting lines.
- iss-2610262038415265itd-1 cites lint code IL002 and points to 06-lint.md for it; 06-lint says the engine has no numbered codes
- itd-1Every Intent Has Acceptance Criteria; Every Audit Verifies Them
- itd-6RepoPrompt over MCP is one opt-in reviewer route, beside the host's own agents
- itd-28Spec-Tied Reviews Live Next To The Spec They Reviewed
- itd-34Intents Promote In Three Flavours — Standalone, Bundle-Member, Discipline
- itd-48`intent-fidelity-reviewer` Gains Its Cross-Doc And Kind-Classification Roles
- spc-12disembark-grounds-a-lifeboat-s-open-questions-on-a-repo-s-to