Skip to content

Every feature branch appends to the end of roadmap-3.0.yaml, so each merge conflicts all the others #143

Description

@avrabe

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-076FEAT-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 landrivet 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

  1. 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.
  2. One file per feature for new work (artifacts/features/FEAT-081.yaml). Eliminates append collisions entirely, at the cost of more files.
  3. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions