Incident 2026-07-29 21:31, gritzko in //PATCH-025 (the wt runs its OWN modified get.js — PATCH-025 rewired the weave leaf, so trunk may be innocent): be get absorbed trunk's ULOG-004 commit (da3cf823 → 543269d6, touches only shared/wtlog.js + test/wtlog_con.js + CMakeLists) and OVERWROTE five dirty+staged test files with trunk bytes although theirs==base for every one of them — keep-ours was the only legal outcome. Staged demotion ...V → ...v also observed (put rows precede the new get tip row; rows NOT deleted). Regold content lost from the tree (put rows carry no blob sha; staging is row-only).
//PATCH-025/test after the incident: get /test seed, 14 put rows (20:17 and 21:20 batches), then the new get /test row — no rows lost.//PATCH-025 until the repro is extracted.stat on the base tree.shared/checkout.js apply() GET-040 dirty guard was gated on
leaf.kind === "f", so a dirty EXEC ("x") leaf fell through to clean-overwrite.submount.mount calls checkout.apply (submount.js:365,421), so the
clobber is SUBMODULE-ONLY — a flat wt weaves through get.js's own leaf, which is correct.//PATCH-025/test (a sub) and spared the three
staged parent .js files: 644, and carried by carrySweep (band mrg, ceil-1ms).kind === "f" gate in get.js's weave leaf
(test/get/dirty-exec-binary) but missed the checkout.js twin — this is that miss.theirs==base ⇒ keep ours arm is present and correct in BOTH; it is
never reached for a sub file, which is the whole bug.///be/#5c0d5c21 + //be/test#4e59c1ac (2026-07-30):
the same gate fixed to the full merge matrix, equivalent test test/sub/dirty-exec-keep landed.//GET-057's staged one-liner + test/get/sub-dirty-exec/run.sh SUPERSEDED, never landed;
the worktree holds nothing unique (evidence copies in //GET-057/evidence/) — reapable.leaf.kind === "f" → (leaf.kind === "f" || leaf.kind === "x").
Symlinks keep clean-resetting (a dirty symlink is a re-point, out of scope).be-js-get-sub-dirty-exec: parent+sub, sub gains an exec run.sh +
a 644 note.txt, both dirtied AND put-staged in the mounted sub, sub
advances on an UNRELATED file, update get. Asserts ours kept for both, the
exec bit kept, and that theirs still fast-forwards. RED on the old gate
("dirty+staged EXEC run.sh was CLOBBERED"), GREEN after.///be/#da3cf823,
stage+dirty the same 14 test files, bare jab get. Trunk code → the exact
five clobbered, nine kept. Evidence (PATCH-025) code → identical. Fixed
code → lost=0, and theirs' test/wtlog_con.js still lands.ctest -j16 = 318/318 PASS (get+patch+status+post = 132/132).
Pre-existing suite was 317; the new case is the 318th.//GET-057/evidence/;
repro scripts in //GET-057/scratch/ (untracked, not staged)....V →
...v staged demotion reproduces in a FLAT wt too and is GET-053's ruling, not a clobber.