Oregami
Repositories/oxedyne/ore

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

Reply

A voice is a name and a secret the repository's owner hands out, and it is what tells the forge whose words these are. Replying works with any voice at all. Reading needs nothing.

Decide

Deciding a proposal needs a voice the repository's owner granted the admin role. Raising a role is the owner's decision, and this page cannot ask for one.