be post commits staged MODIFICATIONS but silently DROPS staged ADDITIONS (new rows) — the added files stay staged, never land in the commit
be post writes a commit containing only the staged mod rows (modified tracked files) and SILENTLY OMITS the staged new rows (added files). The additions remain staged after the post — the commit is incomplete and no error is raised. (Terminology: in be status, new = a STAGED add, unk = unstaged/untracked, mod = staged modification.) Any commit that introduces new files — a merge that brings them in, or a plain be put <newfile> + be post — loses them from the recorded tree. Live-hit landing the PATCH-003..009 merge. Method Issues.
gritzko@spot ~/journal/beagle): a be patch ?62b7c62a!
merge staged 5 mod rows (put beagle/BE.cli.c, beagle/SUBS.c, beagle/SUBS.h, sniff/PATCH.c, test/CMakeLists.txt) AND 12 new rows (added files under test/patch/36-cherry-pick-hashlet … 42-diverged-sub-merge).
be post! --nosub 'PATCH-003..009: numerous fixes to be patch' → commit a16aa332
whose body lists ONLY the 5 mod rows. No new/add row was committed.
be status AFTER the post: ?a16aa332… 1335 ok, 12 new — the 12 additions are STILL
staged, not in the commit. So be post dropped every staged add while committing every staged mod. No warning, exit 0.
a16aa332 committed test/CMakeLists.txt (which references the new testdirs) WITHOUT the test files themselves — an internally-inconsistent commit.
! (force) only overrode the benign POST-006 marker scan; the drop is unrelated
to force — verify it reproduces with plain be post too.
be post commits ALL staged rows — both mod (modified tracked) and new (stagedadds). A staged addition lands in the recorded tree; it is NEVER silently left staged.
be status shows them committed (0 stray new).BEActPost
/bepost_* in beagle/BE.cli.c or the sniff post commit that enumerates staged rows). Repro-first (CLAUDE.md §17): a hermetic test that stages BOTH a new file and a mod, posts, and asserts BOTH are in the commit (and be status is clean after). Don't regress mod-only posts or empty-put no-ops (BE-008). Beagle-only, C.
new/add rows are excluded while mod/put rows are kept (a row-kind filter, a wtlog range/tail bound, or the tree-writer skipping add entries). Repro plain vs !/--nosub.
be post,
assert BOTH commit (test/post/56-selective-post-keeps-absorbed-adds) 100cd237
(sniff/POST.c:584 && !has_thr exempts absorbed adds) 100cd237+8460c578
~/journal/beagle; the fix code
landed (a16aa332) but its repro tests (36-42) were left staged-but-uncommitted by this bug, leaving a CMakeLists.txt-references-missing-tests commit.
100cd237 (2026-06-27). Root cause: post_classify_step's
"Untracked + selective = ignore" guard (!src_base && c->any_pd → return OK, sniff/POST.c:584) fired BEFORE the POST-005 has_thr (absorbed-tree) rescue, so a patch-added new file (on disk, stamped, no put row) was dropped in SELECTIVE mode (any explicit put present). Implicit/mod-only posts were fine (any_pd NO). Fix: && !has_thr exempts absorbed adds; the in-scope stamp check below still validates them. Repro test/post/56-selective-post-keeps -absorbed-adds (RED→GREEN); full ctest 351/351, ASAN-clean.
be put <newfile> add was NEVER dropped (the
has_put branch handles it); only patch/absorb-introduced adds in selective mode. New ticket KEEP-003 filed: a keeper post self- deadlock on the libabc .lock (parent holds, its receive-pack child re-acquires) blocked the clone — abc/ sourced from the pinned tree.
8460c578 ("staged-adds dropped fix", same day) rides
this ticket; fix verified in-tree (sniff/POST.c:584/646 has_thr guards, test/post/56 present). Filed 2026-06-27 from the PATCH-003..009 land, CLOSED.