Development record
Punctuation enforcement stays mechanical-only
Context
The writing-style guide staged its punctuation rules for a mask-aware
docs-lint (itd-141): casing after colons and semicolons, and the em-dash
list-item rule. The em-dash core shipped on 2026-08-28 as the
punctuation/em-dash-in-list-item banned token (iss-2608280706531199),
armed after the corpus was swept clean per the guide's warn-then-promote
rule.
An adversarial design review then measured what remained against the corpus
(docs/ + README.md, fence- and inline-code-masked):
- Colon-casing: 0 true positives, 3 false positives even in its narrowest scope (list-item pivots) — and all three are the project's own lowercase-by-design name opening a definition.
- Semicolon-casing: 0 true positives, 15 false positives — citation reference lists and acronyms, where a capital after a semicolon is correct English and mechanically indistinguishable from a violation without a dictionary.
- The em-dash residual (a wrapped continuation line of a list item): 0 instances.
The compounding fact: under the guide's promotion rule a check enters as a
warn and is promoted to blocker only on a clean corpus. A check whose
false-positive class cannot be closed is never corpus-clean at blocker
severity, is therefore never promoted, and therefore never flips its row's
label to machine-enforced — which was itd-141's entire goal. The goal is
unreachable under the repository's own rules, not merely hard.
Decision
- Punctuation enforcement is mechanical-only. What ships is the
line-based banned token plus the
<!-- docs-lint: allow -->escape. No dictionary-backed prose lint enters the native linter. - The colon and semicolon casing rules are
reviewby nature, permanently. The guide records the reason on the rows themselves. - The continuation-line em-dash residual is accepted as
review. Zero corpus yield does not warrant machinery (less-but-better; guards-prove-themselves). A first observed regression reopens it as a fresh intent (recurrence-is-signal). - itd-141 is superseded by this decision and retires to the supersession record.
- Full-guide enforcement, if ever wanted, is an adoption, not a reimplementation: a Vale-class prose linter filed as its own intent, exactly as itd-141's SOTA section already ruled.
Alternatives Considered
- Ship the casing lints with a lowercase-proper-noun allowlist. Rejected: an open-ended dictionary is the classic prose-lint failure mode, and no allowlist closes the semicolon class (any proper noun may follow one).
- Ship the casing rules as permanent advisory warns. Rejected: warns
gate nothing and never flip labels, so they add standing noise without
moving the intent's goal (the
spelling/*family is different — its warns catch real drift with a bounded escape set). - Build the continuation-line rule now. Rejected on yield: the corpus has zero instances, and the building blocks (fence mask, inline-span strip, list-state tracking) remain available the day a regression makes it worth a record.
Consequences
The guide's punctuation rows state final labels with their reasons; the
"staged lints" forward-claim is removed; no row cites itd-141 as a staging
promise. The supersession is recorded on both sides (this ADR's
supersedes, the intent's superseded_by). The decomposition-calibration
note carries the graded hand-run that led here.
Frontmatter
| id | adr-54 |
|---|---|
| type | adr |
| status | accepted |
| date | 2026-08-28 |
.abcd/development/decisions/adrs/0054-punctuation-enforcement-stays-mechanical.md
open on GitHub ↗ · commit history ↗
References2
- adr-53Audience is expressed by placement, never by a prose registerrelated
- itd-141docs-lint enforces the writing style guide's machine-checkable rules: an em dash inside a list item, a lower-case letter opening a list lead-in after its colon, and a capital letter after a semicolon are flagged as findings, with code spans and fenced blocks masked, so the canonical style guide's machine-enforceable subset is a shipped gate rather than a review habit — and the guide marks a rule machine-enforced only once its lint shipssupersedes
mentions7
- dcn-26082800000000012026-08-28 — Punctuation enforcement stays mechanical-only (adr-54): the
- iss-2608280706531199docs/ violates the writing-style em-dash rule in list items across explanation, how-to and reference pages; the rule is review-only, so nothing gates it
- iss-2608280801427648whether an adopted open-licensed style guide (Google, Microsoft, GitLab, errata-ai/Vale packages) replaces parts of the house writing guide, and how a managed repo names its chosen guide in .abcd/rules.json: routed out of itd-141 at its closure (adr-54); files as its own intent if it goes live
- iss-2608280813441672the rules-loader DOCUMENTATION domain text in .abcd/rules.json still claims the punctuation lint is staged as itd-141, which adr-54 falsified at the planning interview
- iss-2609200618138053Bundle a WRITING rule domain so the review-only writing-style rules reach agents in every managed repo. docs/reference/writing-style.md holds the canonical rules, but none of the eight bundled domains (COMMITTING, DOCUMENTATION, ROADMAP, ISSUES, INTENTS, LIFEBOAT, PII, OPINIONS) carries them, so an agent in a managed repo never sees them unless the repo declares a custom domain. The four review-only rules (capital after a colon, lower case after a semicolon, serial comma, no em dash inside a list item) are exactly the ones no lint catches (adr-54), so injection is the only enforcement they can have; the observed effect in TeachingPrep is repeated lowercase-after-colon in agent-written handover files and ledger text from two different agent sessions. TeachingPrep has added a repo-override WRITING domain in .abcd/rules.json as the interim; a bundled default with the same rules and a broad recall list (write, draft, prose, note, handover, readme, markdown, document, report, message, edit, style) would replace it, and the repo override should then be removed. Relation to iss-2609012039220931: a bundled domain with common-word recall is exactly the case where recall breadth is a design choice rather than an abuse, so decide the two together.
- itd-201Every question abcd's agents put to a human is asked one at a time, in plain language, with options that widen
- spc-2610030944505997asking-and-layout