be patch <peer> then be post replays cur's stack ONTO the peer and silently drops cur's own committed bytes from the tree (first parent = peer, not cur — violates Invariant 2)
After DIS-038 fixed POST-015's silent-collapse, a DISTINCT divergent-case defect remains: when cur carries its own commit C forked off a shared base, absorbing a divergent peer T (be patch file://A?/A OR ?A!) then be post '#m' produces a commit whose single first parent is the peer T, with committer rebase <rebase@dogs> ts 0 — i.e. POST routes the absorb through GRAFRebase, replaying cur's stack onto T. The committed tree carries the peer's bytes but DROPS cur's own committed bytes (C's edit) even though they are still present on disk, so the worktree diverges from the committed tree and C's work is silently lost from history. This contradicts Invariants Invariant 2 ("the new commit's first parent is always cur's prior tip") and POST §"Commit assembly". Reproduced live (debug build, $HOME/tmp, hermetic). The non-divergent (FF) and same-base cases are correct; only a genuinely-divergent cur triggers it. See POST, PATCH, Invariants, Graf, CLAUDE.
The absorb-then-post commit-assembly takes the rebase-onto-peer path instead of a merge/commit on cur's tip.
T, not cur's prior tip C — keeper get .#<post-sha> shows a single parent <T> and committer rebase <rebase@dogs> 0 +0000, the GRAFRebase signature.C commit's edit) are absent from the tree while still present on disk — wt ≠ committed tree, a silent history loss.be patch file://A?/A (NEXT, no bang) and be patch file://A?/A! (WHOLE) — both land the absorb via patch ?<T> / ?<T>! rows, and POST replays the same way.None for diagnosis; the fix is a POST commit-assembly decision (which is out of POST-015's silent-drop scope, hence this ticket).
sniff/POST.c POSTCommit's rebase-emit pipeline (post_rebase_emit_cb, ~POST.c:1265-1313) — the non-ff "replay cur onto the live tip" branch is firing for a foster/parent absorb where the correct shape is a merge (two parents: cur C first, peer T second) or a plain commit on cur's tip carrying the merged wt bytes.parent/foster per the post fragment's forget modifier), never the first.be patch be:peer?/A! can NOT reproduce hermetically — a same-name ?A absorb resolves theirs to cur's OWN local tip C (REFSResolve pass-0 local row shadows the peer-form fetched row), so PATCH no-ops ("nothing absorbed") and POST is never reached. post/53 absorbs T by named sha (the unambiguous cherry form) to drive the POST path; the branch-resolution shadowing is a SEPARATE PATCH/RESOLVE defect — file its own ticket if a branch-form divergent absorb is needed.Repro-first, then make absorb-then-post keep cur as first parent.
be: stores sharing base v0; peer A advances to T; clone B makes its OWN divergent commit C; absorb T then be post '#m'. EXPECT: post commit's first parent == C, the committed tree carries BOTH C's and T's bytes (a real merge), matching the worktree. VERIFIED FIXED on the current tree (see Outcome): first parent == C, no rebase@dogs, tree carries both.test/post — test/post/53-divergent-absorb-keeps-cur-parent (asserts first-parent == cur, no rebase@dogs, fresh re-checkout carries cur's own committed bytes). Companion test/post/40-absorb-no-silent-collapse locks the NON-divergent silent-collapse half; its stale "still-open DIS-042" note updated to point at post/53.sniff/POST.c commit assembly (LANDED before this session): the absorb is NOT routed through the same-branch non-ff rebase-onto-peer path; parent <cur> is written first (POST.c ~2826), the absorbed peer rides as a 2nd parent/foster/picked from the patch-row loop (~2861/2898/2914). needs_rebase stays NO for a divergent-cur absorb (cur's REFS tip == wt parent ⇒ ff_ok).$HOME/tmp)
DAG: base v0 ─ C(cur, BOF edit BLOCAL) and v0 ─ T(peer, EOF edit PEER). After be patch file://A?/A! the wt holds BOTH edits; be post '#absorbed' commits.
keeper get .#<post-sha> → tree <X> / parent <T> / committer rebase <rebase@dogs> 0 +0000 (single parent = peer, rebase signature) — NOT parent <C>.be get file://B/.be?/A/ into a third wt) → f.c has PEER but NOT BLOCAL; cur's C edit dropped from the committed tree though still on disk in B.be patch file://A?/A): post commit first parent == peer, tree drops BLOCAL.
LANDED (audited 2026-07-07): the regression lock + comment cleanup committed as 607c3048 "DIS-042: divergent branches and be patch" (beagle, 26Jun). Closed.
be/keeper, debug build): divergent absorb-then-post → first parent == cur C, no rebase <rebase@dogs> 0 committer, committed tree (fresh re-checkout) carries BOTH BLOCAL (cur) and PEER (peer). The named-cherry absorb records picked <T>; a branch-form absorb would record parent/foster but is blocked upstream (see Blockers).test/post/53-divergent-absorb-keeps-cur-parent (new regression, passes under ASAN ctest); test/post/40 stale "still-open DIS-042" comment updated; test/post/INDEX.md 53 entry. Full ctest: 376/376 green. Stopped at the commit boundary — human gates the commit.