The JS reference impl (be/, run by jab) recursed submodules for the READ views only (status/diff/log/spot, JAB-004); the WRITE verbs did not. jab get recorded a gitlink then skipped it ("mount recursion is a follow-up", get.js), and jab post had no sub recursion at all. So a nested-submodule clone/edit/ commit cycle diverged from native be. This ticket ports the get mount-recursion and the post recurse+gitlink-bump so jab matches be byte-for-byte across the full cycle, in plain AND --color. Driven by the new cycle gate.
A full get→put/delete→post→get cycle over a 3-level nested submodule repo (aa→bb→cc, path==project) was run with both executors and compared.
jab get be://…?/aa cloned only the top shard; subs unmounted (get.js:331
if (kind === "s") return), so bb/bb/cc were missing from the worktree.
jab post committed the top repo only — no post post:bb/cc recursion, no
mod bb/cc / mod bb gitlink bump; commit shas diverged from native.
jab matches native be byte-for-byte on the get/put/delete/post/get cycle.
secondary-wt anchor, check the pin tree out, recurse; emit get <sub>?<pin>.
banners, [seg] message tags), bump the parent gitlink (mod <sub>).
be/. Reuse existing kernels(wire/ingest/checkout/store, core/recurse.js, fold-decide gitlink bump).
be:// (full-store clone, own object store), not a file: wt.mountSub (fetch shard → ingest.clone sibling
shard → write .be anchor → checkout.apply → recurse); sub rows are banner:true so --color full-line-bands them like the seed banner.
handle→postTree (recurse mounted subs in .gitmodules order,
post-order)→postOne (the old single-repo body). An advanced sub's new tip is injected as a gitlink-bump add decision (injectBumps) so the existing fold-decide/commit path records mod <sub>. fold-commit skips the blob feed for a mode-160000 add (the sha is a commit in the sub shard).
banner row tag → bannerColumnar in color (also fixes the
delete: header band); out.color lets post lay 2 blank separators in plain but 1 in color (native's relay quirk).
_sub preorder)post <sub>notice — caught+skipped now; the per-level (not single-top) post layout
file: parent sub-mount (GET-032 class) — remote path only here(else native itself prints HOMENOPROJ fallback noise); the test fixes this.
be post does NOT push; the cycle's two gets are independent clones (are-get of an ahead wt is SNIFFNOFF), and parity is be-run vs jab-run.
be-js-bro-universal is a stale WILL_FAIL xfail that nowpasses (unrelated to this ticket — bro is untouched).
LOST — NEVER COMMITTED (confirmed 2026-06-29). The work sat in an uncommitted scratch tree at the commit gate (be/verbs/get/get.js, be/verbs/post/post.js, be/verbs/post/fold-commit.js, be/core/emit.js, be/verbs/delete/delete.js, new be/test/sub/{lib/subcase.sh,cycle/run.sh}, registered be-js-sub-cycle; suite 80/81) but was never landed and that tree was deleted: mountSub now exists in NO tree on disk, no $HOME/todo/SUBS-037 worktree remains, and nothing is in the beagle-ext store. The get+post sub-recursion must be REDONE — owned as net-new work by DIS-058 (D1-D9). REOPEN.
CLOSED — SUPERSEDED (audit 2026-07-07): the redo LANDED under DIS-058 D1-D9 (da0c12c3 + da7fa5a7, be trunk 29Jun): get mounts+recurses subs (shared/submount.js + get.js recurseSubMounts), post recurses post-order + auto gitlink-bump (post.js postTree/postSubs/postOne). The full-cycle gate lives at be/test/sub/cycle (be-js-sub-cycle), green jab-only per d80bdb5c (TEST-003 "js tests pass, no native use"). Remaining sub gaps have their own tickets (SUBS-039/041/045 etc.); nothing left under this code.