Structural friction, measured over one loop session rather than guessed at. Not urgent, but it compounds with parallelism and it has a cheap fix.
What happens
artifacts/roadmap-3.0.yaml is a single 1600-line file, and a new feature is added by appending a block to the end. So every feature branch edits the same final lines.
The result, from this session:
That is O(n²) conflict resolutions for n parallel branches, none of which represent a real disagreement about anything.
It compounds with the id race
Artifact ids come from the same shared namespace with no reservation mechanism. In this session a subagent branching from main picked FEAT-076 because it was genuinely free on main — while another open PR had already claimed it. That cost a rename (FEAT-076 → FEAT-077) and made the subsequent rebase harder, because the rebase replays the pre-rename commit and lands the rename on the conflict boundary.
So one file gives two independent failure modes for parallel work:
|
mechanism |
caught by |
| append collision |
same end-of-file position |
git, at merge — noisy but safe |
| id collision |
no id reservation |
nothing, until both land — rivet validate only sees it after the second merge |
The second is the dangerous one: it is silent until it isn't.
Cheap fixes, roughly in order of effort
- Split by release.
artifacts/roadmap-v3.2.yaml, -v3.3.yaml, -v3.4.yaml. rivet already loads artifacts/*.yaml, so this is a pure file move. Branches targeting different releases stop touching the same file at all — which is most of them.
- One file per feature for new work (
artifacts/features/FEAT-081.yaml). Eliminates append collisions entirely, at the cost of more files.
- An id-reservation check — a CI step that fails if any artifact id in the PR already exists on
main. Cheap, and it converts the silent failure into a loud one. Worth doing regardless of 1 or 2.
(3) is the one I would do first even if the file is never split, because it addresses the failure mode git cannot see.
Not a rivet bug
rivet handles multi-file artifact sets fine; this is entirely a repo layout choice that was reasonable when work was serial and stops being reasonable under parallel branches. Filing here rather than upstream.
Structural friction, measured over one loop session rather than guessed at. Not urgent, but it compounds with parallelism and it has a cheap fix.
What happens
artifacts/roadmap-3.0.yamlis a single 1600-line file, and a new feature is added by appending a block to the end. So every feature branch edits the same final lines.The result, from this session:
CONFLICTING.That is O(n²) conflict resolutions for n parallel branches, none of which represent a real disagreement about anything.
It compounds with the id race
Artifact ids come from the same shared namespace with no reservation mechanism. In this session a subagent branching from
mainpickedFEAT-076because it was genuinely free on main — while another open PR had already claimed it. That cost a rename (FEAT-076→FEAT-077) and made the subsequent rebase harder, because the rebase replays the pre-rename commit and lands the rename on the conflict boundary.So one file gives two independent failure modes for parallel work:
rivet validateonly sees it after the second mergeThe second is the dangerous one: it is silent until it isn't.
Cheap fixes, roughly in order of effort
artifacts/roadmap-v3.2.yaml,-v3.3.yaml,-v3.4.yaml. rivet already loadsartifacts/*.yaml, so this is a pure file move. Branches targeting different releases stop touching the same file at all — which is most of them.artifacts/features/FEAT-081.yaml). Eliminates append collisions entirely, at the cost of more files.main. Cheap, and it converts the silent failure into a loud one. Worth doing regardless of 1 or 2.(3) is the one I would do first even if the file is never split, because it addresses the failure mode git cannot see.
Not a rivet bug
rivet handles multi-file artifact sets fine; this is entirely a repo layout choice that was reasonable when work was serial and stops being reasonable under parallel branches. Filing here rather than upstream.