Development record
A cited source always resolves and an adopted inspiration is always acknowledged: the reference-closure and acknowledgements-mirror gate
Typed links: supersedes itd-145 (the acknowledgement convention
arming itself; maintainer-ruled 2026-08-28). itd-145 was the seed
ambition — any record citing an external source without its entry fails;
this intent delivers its mechanically checkable core (closure and
mirroring over the declared sets) and deliberately does not attempt the
seed's harder residue, detecting a prose-named source that never enters
the citation apparatus. That residue survives only as the open question
below about the registry's kind: tool entry class.
Press Release
abcd's credit surfaces close deterministically: a lint family proves, offline and on every push, that each citation the durable record uses resolves to an entry in the CSL references, that the CSL references and the acknowledgements References section mirror each other exactly, and that every influence declared in a committed influence registry carries its Inspirations entry. The acknowledgements convention — an entry lands in the same change that adopts a pattern, cites a source, or integrates a tool — is a promise the file's own header makes, and until now it was kept by discipline alone. Discipline held for one era and lapsed for another; the gate turns the promise into a refusal. The rules extend the existing citation lint family rather than standing beside it, and like the rest of that family they read only committed files: the gate never dials out.
"I trust the gates in this repository precisely because they refuse instead of advising," said Bob, a staff engineer who reviews the record before they rely on it. "The acknowledgements file told me it grows with the work. What I found was that the most formative influences were credited everywhere except there. A mirror that is checked is a mirror I can cite; a mirror kept by hand is a hope."
Why This Matters
The 2026-08-28 attribution review found no licence violation anywhere in the tree, and one failure mode everywhere it found anything: a design-shaping influence credited fully in the record tier (intents, related-work, the brief) that never propagated to ACKNOWLEDGEMENTS.md, the surface the project points the public at. The references section and references.csl.json match 1:1 today only because a hand kept them so. The repository's own doctrine says what to do with a convention that fails silently: arm a detector, and make it refuse rather than warn.
Closure is also what makes the credit surface legible to an outsider. A reader who finds a source in the record and looks for it in the acknowledgements must find it or find nothing missing; a reader who finds an Inspirations entry must be able to trace it back to the registry entry that declares where it is used. The gate makes both directions checkable facts.
What's In Scope
- A reference-closure rule: every citation key or reference-style source link the durable record uses resolves to an entry in
references.csl.json. - An acknowledgements-mirror rule: the CSL file and the acknowledgements References section list the same entries, both directions; a committed influence registry and the acknowledgements Inspirations section likewise mirror, both directions.
- The influence registry itself as committed data: one entry per external influence with title, author, source, licence field, and the record id (intent, ADR, or issue) where the adoption lives.
- Extension of the existing citation lint family (the spc-17 rules): same config surface, same zero-network design bet, same exit-code convention.
- Day-one green: the gate arms in the same change that lands the acknowledgements backfill (iss-2608280824478819), so the first armed run passes on a tree that has just been made honest.
What's Out of Scope
- Licence vetting. Whether a registry or CSL entry's licence field is populated and current is itd-164's gate; this intent only carries the field.
- Network access of any kind. The rules read committed files; anything live belongs to the refresh verb (itd-164).
- Mechanical detection of unregistered influences. The gate proves the declared set is mirrored; it cannot prove an undeclared influence exists. Admission to the registry stays a human act, per the review-then-record protocol.
- Rewriting history. The gate judges the tree, not past commits.
Acceptance Criteria
Given-When-Then per the itd-1 discipline.
- Given a durable-record page citing a key absent from
references.csl.json, when the gate runs, then it refuses, naming the key and the file. - Given a CSL entry with no matching acknowledgements References line, or a References line with no CSL entry, when the gate runs, then it refuses, naming the unmirrored entry and the direction.
- Given an influence registry entry with no Inspirations entry, or an Inspirations entry absent from the registry, when the gate runs, then it refuses symmetrically.
- Given the backfilled tree, when the gate is first armed, then it reports zero violations, and the arming change and the backfill are the same change.
- Given any evaluation of these rules, when they run, then no network access occurs; the rules read only committed files.
SOTA
Surveyed on 2026-10-23; sources, evidence tiers and the local fit risks are in the sources-provenance SOTA note.
- REUSE 3.3 is the published gate of this shape. Every covered file declares an SPDX identifier,
LICENSES/"MUST include a License File for every license" in use and "MUST NOT include License Files for licenses under which none of the files ... are licensed": a bidirectional mirror that is checked, not generated (REUSE specification 3.3). - A standard record for an influence exists. The Citation File Format's
referencesentries carry a requiredtype(software,software-code,website,blog,standardamong the values),license,license-url,repository-code,commit,urlanddate-accessed(CFF schema guide). - CSL-JSON already has
softwareas an item type andcustomfor anything else (CSL-JSON input schema), so the registry can be entries in the one committed bibliography, with the Inspirations-versus-References split carried as acustom.abcd.kindfield; the 2026-08-16 baseline's "tool repositories are Inspirations" is a rendering rule, not a storage one. - Both ends of generated-versus-checked are mature. Pandoc's
nocitewildcard lists every store entry;reuse lintchecks declarations against the store. Checking first and generating later is the ratchet. - The deployed licence detector declines prose. Licensee reads root licence files and
LICENSES/by default and treats README mentions as opt-in, which supports leaving an unregistered prose-named influence to review rather than to a detector. - Path 2: a native lint family shaped to REUSE's two-way closure, the registry as CSL-JSON
softwareentries withcustom.abcd.kindandcustom.abcd.adopted_in, closure scoped in the development tier to reference-style links and@keytokens that target the CSL file, the acknowledgements sections checked against the store now and generated from it as the next rung. One reader for all of it. No Go dependency. The independent fit-challenge runs at plan time.
Open Questions
- Registry format: one JSON file beside
references.csl.json, or one frontmattered markdown file per influence? The JSON form is easier to mirror-check; the per-file form matches how the rest of the record is kept. - (SOTA 2026-10-23) If registry entries share the CSL file with the academic baseline, does the baseline's admission rule (primary, verified, resolver link) bind a
softwareentry whose only resolver is a repository URL and a commit? - Does the Inspirations section become generated from the registry (single source, like the changelog) or merely checked against it? Generation removes drift permanently but changes how contributors edit credit.
- Closure scope: the spc-17 rules deliberately scope citations to footnote definitions in docs; the closure rule needs a stated scope for the development tier (intents, ADRs, principles), where citations are reference-style links rather than footnotes.
- The "integrates a tool" clause of the acknowledgements header has no mechanical trigger; does the registry grow a
kind: toolentry class so integrations are at least declarable, with detection left to review?
Audit Notes
Empty. Populated by intent-auditor when intent moves to shipped/.
Frontmatter
| id | itd-163 |
|---|---|
| type | intent |
| lifecycle | drafts |
| severity | minor |
.abcd/development/intents/drafts/itd-163-a-cited-source-always-resolves-and-an.md
open on GitHub ↗ · commit history ↗
References1
- itd-145An adopted idea cannot ship uncredited: abcd enforces its own acknowledgement convention mechanically, so a record that cites an external source, standard, or tool without a matching ACKNOWLEDGEMENTS entry fails the record gate and names what is missing. 'Credit in the same change that lands it' stops depending on the author remembering. Seeded by a real miss in this repo: the maritime signal-flag standard the livery logo encodes and the NO_COLOR convention the colour ladder implements both shipped before their credit landed, and nothing caught it.supersedes
Referenced by1
- itd-164A source is licence-vetted before the record may lean on it: cite refresh records the verdict, the gate reads the committed baselinebuilt on by
mentions4
- iss-2608280824478819The canonical credit surface is incomplete: design-shaping inspirations fully credited in the committed record never propagated to ACKNOWLEDGEMENTS.md. Backfill set from the 2026-08-28 attribution review: add Inspirations entries for CARL and PAUL (both Kahler, MIT; mechanisms adopted per itd-3 and itd-1), SpecStory (adr-29 seam, specstory-import ships in CLI help), the Karpathy LLM-wiki gist (memory-substrate pattern), gitleaks and TruffleHog (integrated scanners, one self-declared adapted regex), and Dieter Rams; complete the Diataxis entry with the author and CC-BY-SA 4.0; widen the mattpocock entry (ADR three-clause test, PRD shape); add Dell'Acqua et al. 2023 to the CSL references; add source URLs to the Horn and Weng credits and the arXiv id to the Iacob citation; record the skills' authorship in the socratic/first-principles research note; fix the dead to-prd deep link in itd-27.
- iss-2610301822150004abcd has no comprehensive, deterministic system for acknowledging prior art. ACKNOWLEDGEMENTS.md is one hand-edited file that many agent sessions append to at once, so it conflicts on merge (the one-writer-per-file principle names a multi-writer single file as a merge hotspot), and nothing decides what qualifies for an entry: on 2026-10-30 three intents' cited papers and tools were found never credited. The product thinker proposed one file per acknowledged source in a folder under .abcd/development/, a root file regenerated only when a release is cut, and clear deterministic rules for what qualifies. The state-of-the-art check of 2026-10-30 (.abcd/development/research/notes/2026-10-30-acknowledgements-sota.md) supports all three, with one change: the root file should be a real generated file, not the proposed symlink, since Go module zips omit symlinks, core.symlinks=false checks them out as text, and GitHub and GitLab show the link path instead of the content. Related: itd-163 (citation closure and the acknowledgements mirror gate), itd-126 (one shared bibliography).
- itd-1Every Intent Has Acceptance Criteria; Every Audit Verifies Them
- spc-17every-citation-abcd-publishes-is-provably-alive-and-honestly