Development record
your-repo-says-the-same-thing-about-itself-everywhere-becaus
Summary
spc-19 delivers itd-102's repo-identity system: one canonical, parseable markdown identity block (title, tagline, pitch), an onboarding interview that writes it, and a deterministic positioning check that holds every registered surface to it — highlighting the exact drifted line, warn-tier by default, and never rewriting anything autonomously. The design decisions below were settled by the 2026-07-27 grill; this spec records them together with the mechanism — it does not reopen them.
Settled constraints (from the grill)
- The identity home is a parseable markdown block, not a structured file. Markdown stays the single source of truth; the repo's committed abcd configuration records only where the block lives.
- The check is warn-tier by default — highlight, never gate — and per-repo upgradeable to blocker. Autonomous rewriting is permanently out: re-rendering from the block is always a proposed diff a human adopts.
Mechanism
Identity block
The block is three fixed bullets under a recognisable heading, exactly the
shape the abcd-cli brief already carries (.abcd/development/brief/01-product/README.md, "Identity (canonical)"):
- **Title:** …(required)- **Tagline:** …(required)- **Pitch:** …(optional at onboarding; title and tagline are required)
The parser accepts a multi-line pitch bullet. The block's location — file path plus heading — is recorded in the repo's committed abcd configuration alongside the other check configuration; abcd-cli's own configuration points at the existing brief section unchanged (AC 4).
Onboarding interview
The prepare flow asks once: title, tagline, pitch (pitch may be skipped). The host conducts the interview (the prepare skill carries the wording); the binary scaffolds the block into the recorded location and the pointer into the configuration. A repo that already has a block is never re-interviewed — onboarding detects and registers it instead.
Positioning check
A deterministic check, run by the audit verb, compares each registered surface against the block:
- Default registered surfaces (three): the README strapline, the plugin/package manifest description field, and the conventions file's (AGENTS.md) opening line. Further surfaces are registrable per-repo in the same configuration; none are registered silently.
- A diverging surface yields a warn-tier finding naming the file and the exact drifted line, and quoting the canonical line it should carry. Per-repo configuration may upgrade the family to blocker.
- Acceptance corpus: iss-143's three-variant tagline drift — the recorded real instance this check exists to catch. The check's fixtures reproduce that drift shape and must all be caught.
Re-render as a proposal
abcd identity render (verb name final at implementation; the behaviour is
the contract) prints the proposed corrected surface content as a diff for
the human to adopt. It writes nothing. A deliberate identity change is an
edit to the block itself, after which the same proposal flow chases the
surfaces.
Wiring
Both planes at delivery: the audit verb's check and the identity verbs reach the CLI and the plugin markdown surface; the prepare skill gains the interview step. abcd-cli's own audit runs the check against its brief block and passes clean (or its findings are real drift, fixed by re-render or recorded change — never by weakening the check).
Acceptance-criteria mapping
- AC 1 (interview lands a parseable fixed-shape block; config records the location; markdown is the source of truth) → Identity block + Onboarding interview.
- AC 2 (divergence yields a warn finding naming the exact line; per-repo upgrade to blocker) → Positioning check.
- AC 3 (never rewrites autonomously; re-render is a proposed diff) → Re-render as a proposal.
- AC 4 (abcd-cli points at the existing brief Identity section unchanged; iss-143 is the acceptance corpus) → Identity block + Positioning check.
Out of scope
- Registering surfaces beyond the canonical three by default (per-repo addition exists; defaults stay at three).
- Any autonomous write to a rendered surface, under any flag.
- Interview wording beyond the prepare skill's text (host-side, adjustable without a binary change).
Frontmatter
| id | spc-19 |
|---|---|
| type | spec |
| lifecycle | closed |
.abcd/development/specs/closed/spc-19-your-repo-says-the-same-thing-about.md
open on GitHub ↗ · commit history ↗
References1
- itd-102**Your repo says the same thing about itself everywhere — because abcd asked you once and holds every surface to it.** A project's positioning fragments silently: the README strapline, the package or plugin manifest description, and the agent conventions file are each edited at different moments, and soon three surfaces tell three stories about what the project is. When abcd prepares a repo it interviews the user for the project's identity — title, tagline, and a short elevator pitch — and records the answers in one canonical home in the development record. Every surface rendering derives from that home, and a deterministic positioning check compares the surfaces against it on every audit: a mismatch is highlighted with the exact drifted line, and the fix is either re-render from the record or a deliberate, recorded identity change — never a silent extra variant, and never a silent rewrite by abcd. "I changed my tagline once, in one place, and abcd chased it everywhere else," said Alice, a solo founder. "When a stray edit crept into the README, the next audit pointed at the exact line instead of letting the drift settle in."implements
mentions5
- dcn-26072800000000052026-07-28: itd-102 spec minted as spc-16 (fourth live iss-80 instance this run); renumbered to spc-19 by hand.
- dcn-26072800000000062026-07-28 — itd-102 implementation: repo positioning lives in a NEW `internal/core/positioning` package, not `internal/core/identity` — that package is the git commit-author gate (`.abcd/config/identity.json` pin, pre-commit hook) and shares nothing with repo self-description but the English word; folding them would put two unrelated concerns behind one name. The user-facing verb stays `abcd identity` (spc-19). For the same collision the registry is `.abcd/positioning.json` at the `.abcd/` top level (beside docs-lint.json / record-lint.json / rules.json), NOT `.abcd/config/identity.json`. Rejected: extending the commit-identity package; naming the verb `abcd positioning` (spc-19 fixes the verb).
- iss-143tagline three-variant drift: the repo runs three different self-descriptions — README strapline (an opinionated, intent-driven development framework for product thinkers), plugin.json description (host-agnostic configuration layer for development ... usable as a plugin in compatible agent harnesses), and AGENTS.md (a host-agnostic configuration layer for development). The drift is itself the finding: one-canonical-primitive wants a single recorded tagline (a DECISIONS.md line, or the brief's product chapter as the home) with per-surface renderings derived from it. Adopting any new wording without that consolidation just mints a fourth variant. Surfaced by the 2026-07-27 tagline assessment. Detector: a positioning-currency check that the three surfaces render from one recorded home.
- itd-29Domain Experts Run A Spec Autonomously And Recover From Anything Without Touching Git
- itd-133abcd has a face: one pixel-grid identity — duckling mascot, signal-flag logo, lifeboat mark — generated, drift-gated, ready for every surface