WEAVEMerge aligns weave streams by diff position rather than by real cross-weave token identity, so a small class of merges has a non-total, timestamp-dependent tie-break: a reconciled token can be emitted at the ours position when its true match is a later theirs token, and an insert can anchor on the wrong side of a blank line. The goal is a total, deterministic merge so content recovery holds for every history. The robust fix is a shared-sequence merge giving tokens stable identity, not diff-alignment plus positional reconciliation. See Graf.
Two faces of one root cause — positional alignment in graf/WEAVE.c WEAVEMerge.
$HOME/Corpus/WEAVE2): 927/928 of the corpus recovers correctly; the lone holdout recovers abac instead of aabc.be-patch-15-ancestor-skip step 2, ~1/2): a re-stamped spine blank collides on (bytes,in) with theirs's code-line EOL, so the LCS anchors the insert on the wrong side of the blank.graf/DAG.c, SHA-keyed) yields either a clean or a duplicate-carrying weave, then WEAVEMerge's full-stream diff mis-ties.A clean fix is constrained.
in-for-ws, line-context, blank/EOL bit, alive/dead bit) and an EDL insert-slider stay flaky or regress MERGE3B01 rm_reconciliation_in_disjoint_tail.graf/DAG.c, which was outside the prior task's edit scope.Replace positional reconciliation with real token identity.
WEAVEMerge to align on alive-only streams while threading dead tokens to the disjoint-tail rescue separately.graf/DAG.c so equal-timestamp commits sort stably.graf/test/WEAVE2.c content-recovery and MERGE3B01 green; fold the minimized holdout into the property test.One sub-bug already fixed.
graf/test/WEAVE2.c dedup_merge_post_fork.