be put/be post leak a sub's empty-put PUTNONE cascade
A be put/be post whose parent SUCCEEDS still leaks a spurious error cascade from its recursion into an UNCHANGED submodule: the sub's internal put step fails with sniff: put: no changes (or no eligible paths), an empty put put: banner, then Error: PUTNONE and Error: NONE — all printed even though the command succeeded and exits 0. An unchanged submodule must be a silent no-op on recursion, not an error spray. Evidence: garbage.txt (landing JS-036 742c06ff in a store-backed worktree with abc unchanged). Method: Issues.
be put (bare) staged js/cont.cpp/js/pack.hpp in the parent, then recursed put put:abc → sniff: put: no changes + Error: PUTNONE + Error: NONE, all on a successful put. See garbage.txt.be post 'JS-036…' recursed post abc → sniff: put: no eligible paths + empty put put: + Error: PUTNONE + Error: NONE, THEN the real post ?742c06ff. The garbage interleaves before the success row.Error: lines → one uniform line), POST-022/BE-007 (sub-push wrecked output, landed). This is the unchanged-sub no-op case, none of the above.put/post recursion emits NOTHING — no PUTNONE/NONE, no empty put put: banner; the parent output stays clean.be put with nothing to stage still reports PUTNONE (user asked to put nothing) — only the internal sub-recursion path is silenced.PUTNONE as a benign skip (silent no-op), not a propagated error — mirrors POST-019's "suppress the standalone put banner for the internal path".be put -q <sub> with stdout captured (BE.cli.c::bepost_bump_sub :3028-3098) and -q opens an EMPTY-state HUNK table (sniff/PUT.c:1174-1193) — no banner, no PUTNONE; becli folds *NONE→OK under -q (BE.cli.c:5255-5262). Landed untagged (SUBS-029 3fd64016/c2e1b0d9 + 25/26Jun batch), verified at tip b0fb0ce4.be put sub recursion (BEActSubsRelay, BE.cli.c:4254) deliberately passes NO -q (comment :4266) and BERelaySub/be_recurse_capture capture stdout ONLY — the clean sub child still prints sniff: put: no changes (sniff/PUT.c:729) + sniff MAIN Error: PUTNONE + be MAIN Error: NONE (abc/PRO.h:384) on inherited stderr.be_recurse_capture (SUBS.c:314-341) for the recursion path, or pass -q and detect no-op by empty captured stdout as bepost_bump_sub already does (BE.cli.c:3085).put:<sub> relay hunk for a wholly no-op sub (the PUT-003 residual): the non-quiet child still flushes its put: banner with zero rows; needs the defer-banner/HUNKTableAbort change or the -q route.test/put/): parent dirty + unchanged mounted sub, bare be put → assert stderr has no no changes/Error: PUTNONE/Error: NONE and stdout no empty put:<sub> hunk; top-level truly-empty put keeps PUTNONE (guard: test/put/09-sub-only-dirty-exit tail case).ctest verb-output tests stay green.be post arm landed (quiet captured gitlink bump + -q sub shards — no cascade); bare be put sub-recursion arm still emits the sniff: put: no changes + Error: PUTNONE + Error: NONE stderr spray for an unchanged sub. Kin POST-019 closed; the put arm stays this ticket.