Development record
Merge contention is structural in the shared registers, not the prose: append logs (.abcd/work/DECISIONS.md, 154 changes; the decomposition-calibration corpus, conflicted 2026-08-22) and the lint-gated indexes that index_drift forces every branch to co-edit (brief/06-delivery/03-out-of-scope.md drafts index, conflicted the same day; 04-surfaces/README.md; decisions/adrs/README.md; intents/README.md; release/surface.json). The fix shape for the indexes is already written down: the enumeration command in out-of-scope.md derives the list from the filesystem, so the committed copy could become generated-at-build and the lint compare against the derivation instead of a hand-edited region. Append logs tolerate union merges; the indexes do not
Merge contention is structural in the shared registers, not the prose: append logs (.abcd/work/DECISIONS.md, 154 changes; the decomposition-calibration corpus, conflicted 2026-08-22) and the lint-gated indexes that index_drift forces every branch to co-edit (brief/06-delivery/03-out-of-scope.md drafts index, conflicted the same day; 04-surfaces/README.md; decisions/adrs/README.md; intents/README.md; release/surface.json). The fix shape for the indexes is already written down: the enumeration command in out-of-scope.md derives the list from the filesystem, so the committed copy could become generated-at-build and the lint compare against the derivation instead of a hand-edited region. Append logs tolerate union merges; the indexes do not
Corroboration (2026-09-18, Gropius managed-repo session gropiusllm-56, relayed
to abcd-17). The ADR index half was met from the other side: abcd decide "<title>" at v0.9.0 minted the record as documented (a decision record in
that repository's own store), and the session then found the two steps the verb leaves by
hand, status: accepted and the index row in the store README, and asked for a
--accept flag or an index write on decide. The status half is by design
(decide.go: the binary knows an id and a date and cannot know a decision is in
force); the index half is this record's fix shape, a derived index in place of
a hand-edited enumeration, now wanted in a managed repository as well as here.
The ledger already carries two resolved instances of the row being forgotten
(iss-2608211144555085, iss-2608220750029986).
Remedy grounds (2026-09-29)
- Why: the record's own fix shape, and the base already holds its precedent: generated chapter appendices held by TestSurfaceAppendicesMatchCommandTree in internal/surface/cli. It also answers the managed-repository corroboration, where decide left the index row by hand.
- Rejected: a union merge for the indexes, which keeps both sides' lines but not the ordering and deduplication an index needs.
Grounds
- pursued: two branches that each add a record now conflict only inside a generated region, and rerunning the generator over the merged tree yields the same bytes whichever side was kept (TestRegeneratedIndexIsOrderIndependent); falsified if a merged tree regenerated from either side differs, or if a register still needs a hand edit to pass index_drift (TestGeneratedIndexesMatchTree)
Frontmatter
| id | iss-2608220150157511 |
|---|---|
| type | issue |
| lifecycle | resolved |
| severity | minor |
.abcd/work/issues/resolved/iss-2608220150157511-lint-gated-indexes-and-append-logs-are.md
open on GitHub ↗ · commit history ↗
mentions4
- iss-2608211144555085The ADR index (.abcd/development/decisions/adrs/README.md) ends at the adr-44 row while adr-45 is accepted (2026-08-20) and cited as settled law by six live records (the invariants brief, itd-114, spc-33, .abcd/work/issues/README.md, two open issues, DECISIONS.md). 37 ADR files vs 36 index rows — exactly one missing. The index is the declared hand-maintained roll-call (adrs/README.md) and is not among index_drift's four registered indexes, so it is structurally ungated. Third recurrence of this class in the same table (after resolved iss-296 and iss-374), which iss-38's decision (hand-kept indexes must be deleted or gated) predicts.
- iss-2608220750029986adrs/README.md index omits the accepted adr-47 and adr-48 rows (site-build session) — fourth recurrence of the unindexed-ADR class after adr-45 (iss-38 wants these indexes gated); rows added in the same change that records this
- 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.
- iss-2610151050395768After the release-gate manifest's derived values stop being stored (the chore/merge-hotspots branch, under review on 2026-10-15), the brief's 04-surfaces/README.md register is the main remaining line every surface-adding branch edits: its chapter table ends on the newest number and two of its rows are single-line inline lists of verbs, so two such branches conflict there. Measured on the ten surface-adding pull requests of 2026-09-24 to 2026-10-15: the table end in 8, the agents-and-hosts row in 5, the one-file-per-verb list in 5.