Two replicas rewriting one region produced a character-level interleave that neither of them wrote
proposal 18, opened by backlog
State done — finished
No mark closes this yet, and nothing in the forge sets that field. The review lane is what will. A mark in Ore is a point in the log, so naming one here will name a state anybody can go and render rather than a sentence somebody wrote.
Round 3 of the two-replica self-hosting trial had both replicas rewrite the body of the same four-line function, differently. They converged byte-for-byte and two `Overlap` flags fired, so convergence and always-tell both worked. The merged text did not. Minimal-splice diffs interleaved at character level, mid-expression, and neither author's version survived whole. The verdict was blunt: "No -- scrambled, worse than predicted ... at present the merged text is what both agents' next build consumes."
That is the defect this proposal records: the working file after a collision was a text nobody wrote and no compiler accepts, and it was the file the next capture diffed against.
Five options were weighed in `overlap_render.md`. The status quo interleave (A) leaves a text nobody wrote. Conflict delimiters (C) fail at `Rendered::span` and break the build besides. A forge-side paned view (D) alone changes nothing on disk. B2 -- arbitrate the concurrent group, the member highest in op order prevails, the others yield whole, one additive flag -- was recommended, with a spill of the losing version beside the working copy (E) as the cheap half of a review surface. The recommendation rested on a precedent: the design had already chosen whole-move arbitration over the claim register's tearing, and whole-cycle arbitration for the cross-file cycle, with the same tie-break and the same additive-flag posture.
The planted sweep then contradicted the note's own prediction. The note expected the same-contenders merge to bury more bytes than keeping components separate. Over 4,000 trials at k=2 the merge buried six bytes *fewer*, because the causal exemption restores the winner's other hunks, and it removed all 121 block interleaves that separation left. It also surfaced three things nobody had anticipated: the causal exemption falsifies the claim that a region reads as the winner wrote it, because a third replica synced with one side joins the component as maximum and the region composes two authors' whole hunks; the yield flag must name the group and its maximum rather than a pair, because chains make a yield to a never-overlapped operation routine; and arbitration is non-monotone -- pure-deletion cases can render larger than the status quo, and the merge can revive an operation that separation buried.
Shipped 2026-07-31 as `Flag::Yielded` at wire code 12, additive, with no `ORESNP` bump, folded into the cross-file cycle's fixed point rather than sitting beside it. The sweep's cases were transcribed as engine tests and passed on the first run. The implementation found one thing the notes had not: `Flag::Stranded` had to learn about yielding, because a yielded splice renders nothing so it cannot be stranded and its removals do not bury, and without that it would have raised a false flag on every collision.
Transcribed from the project record on 2026-08-14. The words quoted in the discussion below are their named authors' own; the `backlog` voice carried them here and wrote none of them.
4 replies
-
backlog
Ore session (self-hosting trial, 2026-07-29): Round 3 converged and flagged, but the text is a character-level interleave, not adjacent blocks. Does an Overlap site read as reviewable? No -- scrambled, worse than predicted. The reviewable artefacts exist, one back away, but the merged text is not one of them. -
backlog
Ore session (options note, 2026-07-30): Adopt B2 with both completions, and D over it. It is the only option that makes the file reviewable without breaking something structural, and the design has already argued for it twice -- whole-move arbitration over the claim register's tearing, and whole-cycle arbitration for the cross-file cycle. The strongest counter-argument stands: a yielded edit did not happen, and under contention roughly half of each collision's work has to be made again by hand. It is a judgement, not a measurement, and it is the owner's to take. -
backlog
Ore session (planted sweep, 2026-07-31): Adopt B2 with the merge. At k=2 the merge removes 121 of 121 block interleaves that separation leaves, and buries six bytes fewer over 4,000 trials -- the prediction that it would bury more was wrong, because the causal exemption restores the winner's other hunks. Honest loss: five trials against 336 improvements. Transitive yield earned its place, 807 orphan fragments to zero. 208,000 renders, all converged, conserved and told. Three things the options note did not anticipate, including that the region does not always read as the winner wrote it. -
backlog
Ore session (engine, 2026-07-31): Shipped as Flag::Yielded, wire code 12, additive, no snapshot bump. Four things the notes left open were settled by building it, and one was found: Stranded had to learn about yielding, or every collision would have carried a false flag. A component's file is read off the birth layout -- that is a choice, not a measurement, and nothing has swept a multi-file collision.