§1A branch is a frozen set of assumptions
Version control makes a promise that feels total: merge cleanly and the result is correct. That promise covers text. It does not cover truth. A branch also carries every fact that was current on the day it was cut—contact details, naming, positioning, the boundaries of what the project says about itself.
When a direction changes while a branch is open, those facts do not conflict. They are not competing edits to the same line; they are settled statements sitting in files nobody touched on the other side. Git has no reason to flag them, so a clean merge silently reinstates them.
§2Agents make this common, not rare
Long-lived branches used to be a human problem, and a rare one. Running several agents in parallel makes them ordinary: each session opens its own branch, works for hours, and lands later—sometimes after a decision has moved the ground underneath it.
The dangerous branch is not the one with conflicts. It is the tidy one, cut before the change, that touches unrelated files and merges without complaint. Parallel agents need collision rules; this is the collision that no tool reports.
A merge conflict is a question. Restored stale content is an answer nobody asked for—applied silently, in files the reviewer has no reason to open.
§3Sweep before the merge, not after
The fix is a pre-merge sweep for retired facts. Not a diff review—the diff is exactly where these hide, because the branch did not change them. Instead, search the branch as a whole for the specific strings that a decision removed.
BEFORE MERGING A BRANCH OLDER THAN A DECISION
RETIRED IDENTIFIERS
Old contact routes, handles, endpoints, and channels.
RETIRED VOCABULARY
Words the current direction no longer permits.
RETIRED ENTITIES
Names, labels, and descriptions that were replaced.
RETIRED SURFACES
Links to pages, files, or routes that no longer exist.
REGENERATED ARTEFACTS
Anything derived from a source that has since changed.
§4Every decision should leave a search list
The sweep only works if the removed facts are written down somewhere searchable. So the moment a direction changes, record the retired strings alongside the decision—not the reasoning, the literal text.
That list is the difference between a sweep you can run in a minute and an archaeology exercise that depends on someone remembering the old rules. It also survives the person: an agent picking up the work six weeks later can run the same search without knowing why any of it matters. A decision ledger is the natural home for it.
§5Sort branches by age against the decision
Not every branch needs this. The test is one comparison: was this branch cut before or after the decision that changed the rules? Anything cut before is suspect regardless of how small or clean it looks.
| Branch age | Conflicts | Action |
|---|---|---|
| After the decision | Any | Normal review. |
| Before the decision | Yes | Sweep, then resolve—conflicts are the visible part only. |
| Before the decision | None | Sweep hardest. This is the case that merges silently. |
§6Then stop doing it by hand
A sweep that depends on discipline degrades the moment someone is in a hurry. Once the retired strings are written down, they can be asserted automatically, and the merge that reintroduces them fails on its own. Encode the decision as a test and the hazard stops being a habit you have to maintain.
The compact rule
- A branch preserves the assumptions it was cut with, not just its edits.
- Clean merges are the risky ones; conflicts at least ask a question.
- Search the whole branch for retired strings, not the diff.
- Record the literal retired text when the decision is made.
- Compare branch age against decision date to decide what needs sweeping.