In the parent worktree in EXPLICIT-STAGE (selective) mode — at least one be put/ be delete since the last get/post — jab post commits a mounted submodule that had NOTHING staged: it recurses a post into the sub, the sub (no staged rows of its own) runs in COMMIT-ALL mode and rewrites its dirty files, and the parent gitlink is bumped to the new sub commit. Selective mode must commit only what is explicitly staged, so a sub with nothing staged must be left untouched (pin unchanged). The parent's selective intent does not propagate into postSubs's recursion. be/ JS (reported by user, 2026-06-30). JS-side twin of the native SUBS-029 phantom-sub-put fix; parent DIS-058; spec Submodules / Dirty; method Issues.
be put <parentfile>), a mounted sub with a dirty-but-UNSTAGED file, then jab post — the sub is committed and the parent gitlink advanced, despite nothing staged in the sub.post.js::postTree (post.js:280) calls postSubs (post.js:282, unless --nosub) BEFORE postOne; postSubs (post.js:290) enumerates mounted gitlinks (subs.enumerate) and recurses postTree(subInfo, ctx, {uri: subWt}) into EVERY mounted sub (post.js:314) — no selective-mode gate, no "does the sub have staged changes?" check.decideM.decide → m.anyPd (fold-decide.js:109). With no in-scope sub put/delete anyPd is false → COMMIT-ALL → a modified sub file is rewritten (fold-decide.js:160 if (anyPd) keep; else rewrite), so an unstaged-dirty sub is committed.put <subpath>#<newtip>), recording the spurious sub commit.be/ JS port lacks the selective gate.be post must NOT commit or advance a submodule that has nothing explicitly staged (no in-scope sub put/delete, no staged parent gitlink bump for it) — the sub's pin stays unchanged.be/ JS only. REUSE decide's anyPd, subs.enumerate, and the existing gitlink-bump primitive; do not re-roll the recursion.--nosub.be post leaves the sub tip AND the parent gitlink UNCHANGED; a commit-all parent still commits the dirty sub.postSubs on the parent's mode: in selective mode recurse into a sub ONLY when it has in-scope staged changes (its own anyPd) OR an explicit parent gitlink-bump targets it; skip clean/unstaged subs. In commit-all mode descend into every dirty sub as now.be/test/sub/selective/run.sh (be-js-sub-selective) — arm 1 selective parent + dirty-unstaged sub → sub tip + gitlink UNCHANGED; arm 2 commit-all still commits.postSubs recursion on selective vs commit-all — landed 1c4a97c8: anyStaged(wtl) parent-mode + the per-sub scope gate (post.js:479-484).s.bucket === "adv" falls through), --nosub (post.js:433).d80bdb5c (TEST-003).be put/be delete inside the sub wt vs a parent staged gitlink bump (be put <sub>#<sha>).1c4a97c8 ("SUBS-042: staging files in submodules", be trunk 30Jun): post.js::postSubs selective gate — in selective mode a sub is recursed ONLY when in parent scope / own anyPd / already adv; commit-all descent unchanged.be/test/sub/selective (both arms); suite green jab-only per d80bdb5c. CLOSED (audit 2026-07-07). (The same commit also landed the SUBS-039 PUT delegation arm — see SUBS-039.)