Every pull request in this repository adds its entry by prepending a ### … section at line 1 of CHANGELOG.md. Git cannot auto-merge two insertions at the same anchor, so any two open PRs that both carry an entry conflict pairwise, and every merge to main re-conflicts every remaining open PR that has one. No individual change is at fault; the collision is created by the file's shape.
Measured on 2026-09-06
commits to main in 24h 28
of which touched CHANGELOG.md 20 (71%)
non-draft open PRs (first page alone) 75
On one PR (#1923, whose actual delta is a single test file plus its entry) this produced eight conflict rounds in nineteen hours:
01:18 06:27 07:34 12:21 14:29 16:51 20:33 ← merge commits
20:37 ← round 8 trigger
The last interval is the point of the report: round 7 was resolved and pushed at 20:33:09, and the commit that invalidated it landed at 20:37:30 — 4 minutes 21 seconds later. One resolution cycle on this repository costs about three minutes of gate time alone (2932 tests), before detection, merge, and push. When the interval between collisions falls below the cost of resolving one, a PR carrying a changelog entry cannot converge by resolving conflicts — it is not slow, it is non-convergent, and it stays open until the merge rate drops.
Every one of those eight resolutions was mechanically identical: keep main's sections, re-prepend this branch's section. No round required a judgement call, which is the signature of work that should not be done by hand.
Cost this is currently paid in
Directions, in increasing cost
- A merge driver for
CHANGELOG.md — .gitattributes plus a small union-style resolver that keeps both sides in order. Smallest change; leaves the file format alone; every clone needs the driver configured, and an unconfigured clone silently falls back to a normal conflict.
- Per-PR fragments — each PR adds
changelog.d/<pr>.md and the file is assembled at release. Two PRs never touch the same line, so the conflict class disappears entirely rather than being auto-resolved. Costs a convention change and a release-time assembly step, and several contract tests assert exact CHANGELOG.md prose today.
- Status quo — accept that any long-lived PR carrying an entry is re-conflicted on roughly every merge.
Which of these is right is a repository-convention decision rather than a repair, so I have not implemented one; this issue records the measurement so the trade-off can be made against real numbers instead of an impression.
Every pull request in this repository adds its entry by prepending a
### …section at line 1 ofCHANGELOG.md. Git cannot auto-merge two insertions at the same anchor, so any two open PRs that both carry an entry conflict pairwise, and every merge tomainre-conflicts every remaining open PR that has one. No individual change is at fault; the collision is created by the file's shape.Measured on 2026-09-06
On one PR (#1923, whose actual delta is a single test file plus its entry) this produced eight conflict rounds in nineteen hours:
The last interval is the point of the report: round 7 was resolved and pushed at 20:33:09, and the commit that invalidated it landed at 20:37:30 — 4 minutes 21 seconds later. One resolution cycle on this repository costs about three minutes of gate time alone (2932 tests), before detection, merge, and push. When the interval between collisions falls below the cost of resolving one, a PR carrying a changelog entry cannot converge by resolving conflicts — it is not slow, it is non-convergent, and it stays open until the merge rate drops.
Every one of those eight resolutions was mechanically identical: keep main's sections, re-prepend this branch's section. No round required a judgement call, which is the signature of work that should not be done by hand.
Cost this is currently paid in
CHANGELOG.mdstructure.Directions, in increasing cost
CHANGELOG.md—.gitattributesplus a small union-style resolver that keeps both sides in order. Smallest change; leaves the file format alone; every clone needs the driver configured, and an unconfigured clone silently falls back to a normal conflict.changelog.d/<pr>.mdand the file is assembled at release. Two PRs never touch the same line, so the conflict class disappears entirely rather than being auto-resolved. Costs a convention change and a release-time assembly step, and several contract tests assert exactCHANGELOG.mdprose today.Which of these is right is a repository-convention decision rather than a repair, so I have not implemented one; this issue records the measurement so the trade-off can be made against real numbers instead of an impression.