be get/patch FF-weave bails with graf err and leaves the file UNMERGED when the commits aren't indexed — the correct fallback is to INDEX the commits and RETRY
When a store-backed worktree that is BEHIND trunk is fast-forwarded (be get '?'), files that diverged on both sides need a 3-way weave. If the relevant commit DAG is not indexed, the weave drops to build_tip_weave_tunable's no-history fallback (graf/GET.c:537-548), which stamps each side's blob with its own tip hashlet so the two sides share NO baseline birth-ids → WEAVEApply matches nothing → GRAFFAIL (sniff/GET.c:748), and sniff prints merge failed … (graf err) — leaving wt content untouched, i.e. the file is left UNMERGED. The only correct fallback is to index the commits and RETRY the weave — never bail, never silently return ours. See PATCH, POST, Graf.
"is no longer on disk / cannot be driven through be"): FF the BE-004 store-backed worktree ~/todo/BE-004-new (cloned behind trunk) onto current trunk → be get '?' → merge failed for bro/BRO.c (graf err) and graf/BLAME.c (graf err) — leaving wt content untouched. Reproducible on demand from any behind-worktree FF where both sides touched a file.
(void)-ignored GRAFIndexFromTips guard (sniff/PATCH.c:1857,comment: "Without this the merge silently returns ours's bytes") is the smoking gun — the index step exists but its failure is swallowed.
RETRIES, so a behind-worktree FF on a real divergence actually MERGES.
propagate a hard error — never "leave wt untouched", never return ours.
be get '?' operation merges the divergent files(demonstrated on a live behind-worktree), not "tests green".
DISPROVEN (below). The fix is in the verb/index layer.
graf err is averb-layer base/target SELECTION failure" is withdrawn — it was asserted without a live repro. Diagnose from the repro now available, not theory.
byte-identical to git merge-file (the frozen SUBS-019 trio, 135584 B, clean via GRAFMerge3Bytes/GRAFMergeWtFile/GRAFMergeWtFileTunable). So the engine is correct; the bug is the verb dropping to the un-indexed fallback instead of indexing + retrying.
graf err (regression test, e.g. extend graf/test/MERGEWT01.c).
(build_tip_weave_tunable / GRAFIndexFromTips); propagate index failure (drop the (void)), never leave-untouched / return-ours.
be get '?' on a real behind-worktree MERGES the divergent files.until the FF-weave self-heals (index+retry) — NO hand-pick reconcile.