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.
get <sub>?<pin>.[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 layoutfile: parent sub-mount (GET-032 class) — remote path only herebe post does NOT push; the cycle's two gets are independent clones (a
re-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 now
passes (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.