Development record
DECISIONS.md and ACKNOWLEDGEMENTS.md are multi-writer single files, the merge-hotspot shape that one-writer-per-file rules out. DECISIONS.md was the only textual conflict of the two-programme merge (resolved by hand as a union of both sides). The remedy is a design call per the principle's bounds: per-decision records (full atomicisation, which needs a new id family plus an armed uniqueness detector) or a merge=union gitattribute (smallest fix, legitimate because the ledger's entries are anonymous dated lines that never need identity). ACKNOWLEDGEMENTS.md is the same shape at lower traffic.
DECISIONS.md and ACKNOWLEDGEMENTS.md are multi-writer single files, the merge-hotspot shape that one-writer-per-file rules out. DECISIONS.md was the only textual conflict of the two-programme merge (resolved by hand as a union of both sides). The remedy is a design call per the principle's bounds: per-decision records (full atomicisation, which needs a new id family plus an armed uniqueness detector) or a merge=union gitattribute (smallest fix, legitimate because the ledger's entries are anonymous dated lines that never need identity). ACKNOWLEDGEMENTS.md is the same shape at lower traffic.
Frontmatter
| id | iss-118 |
|---|---|
| type | issue |
| lifecycle | resolved |
| severity | minor |
.abcd/work/issues/resolved/iss-118-decisions-acknowledgements-multi-writer.md
open on GitHub ↗ · commit history ↗
mentions4
- dcn-26080500000000082026-08-05 — iss-118: DECISIONS.md and ACKNOWLEDGEMENTS.md gain `merge=union` in `.gitattributes`, the same remedy already in place for CHANGELOG.md. Both are the identical shape — append-only ledgers of anonymous, dated, order-independent entries that never need identity — so a concurrent-append conflict has nothing to actually disagree on; the union driver keeps both sides instead of stopping the merge. Prompted directly by the bug-hunt loop's `bugfix/iss-184-…` branch hitting exactly this conflict against `.abcd/work/DECISIONS.md` on PR #199, which iss-118 had already diagnosed (filed after an earlier merge hit the same conflict) but left unresolved pending this design call. Full atomicisation (per-decision records, a new id family, an armed uniqueness detector) was the other option iss-118 named; not pursued here as disproportionate to a minor, low-traffic hotspot. Impact recorded as `internal`, no CHANGELOG entry — matching the iss-80 precedent for a process/tooling change with no user-facing behaviour.
- dcn-26081600000000062026-08-16 — academic references baseline adopted: the References & sources section of ACKNOWLEDGEMENTS.md carries a curated set of primary sources (end-user programming, AI-assisted development in practice, security of AI-generated code, human judgement and method, records and specification) as one ACM-style numbered list ordered alphabetically by first author, with canonical metadata in `.abcd/development/research/references.csl.json`. CSL-JSON extends the 2026-07-08 bibliography ruling to the repo level — one canonical format, `.bib` derived on demand (pandoc one-liner in `_references.md`) and gitignored. Admission criteria (primary sources only, verified citations only, curated not exhaustive) and the per-group rationale live in research/notes/2026-08-16-academic-references-baseline.md; store↔markdown sync is the documented protocol in `_references.md` per script-first-mvp, with a `references_sync` lint captured as iss-248, the possible next rung. A root CITATION.cff (CFF 1.2.0) answers the reverse direction — citing abcd itself. Rejected: `.bib` as the source of truth (a second canonical bibliography format beside the recorded CSL-JSON ruling), and generating the markdown section from the store (inverts markdown-as-source-of-truth). Consequence of the numbered list, from the independent adversarial review of the sources plan: ACKNOWLEDGEMENTS.md leaves the iss-118 merge=union set — an alphabetical insertion renumbers subsequent entries, so a union merge of two concurrent additions would silently interleave both renumberings; a loud conflict is correct there.
- iss-2609100507439414A managed repository's shared append-only files conflict on nearly every merge, and abcd propagates neither of the two remedies it has already adopted for itself.
- iss-2609240646538011The `merge=union` driver that .gitattributes gives `.abcd/work/DECISIONS.md` and `CHANGELOG.md` (the remedy iss-118 adopted) holds for a local merge only; the forge does not apply it. A pull request's mergeability and the merge queue's merge are computed on the forge, so two open pull requests that each append a DECISIONS.md entry conflict there as soon as one merges, while a local `git merge` of the same two is clean. In autonomous run A every records pull request went DIRTY whenever another records pull request merged first (#678, #679 and #681 on 2026-09-23), and each was recovered by a local merge in the lane's worktree, a push to the same branch behind a ten-to-twenty-minute pre-push preflight, and a re-armed auto-merge. Nothing tells an author that the union driver stops at the local clone. Wanted: the .gitattributes comment and the conventions that cite the driver say it holds locally only, and the remedy that needs no driver (one file per decision, as iss-2609100507439414 and iss-2608220150157511 propose) is weighed with this cost counted, since it removes the conflict on the forge as well.