DIS-058: be/ JS submodule handling vs Submodules.mkd — recursion is READ-ONLY (status/diff/ls/lsr only); get/post/put/delete never descend, never clone/mount/commit a sub, no synthetic branches; the Edited dirty axis is inert (audit/umbrella)

The be/ JS port treats submodules as a READ-time concern only: the recursing READ views (status, diff, ls/lsr) walk mounted subs in-process (core/recurse.js, views/status/status.js, views/diff/diff.js, views/ls/ls.js) and classify gitlink-vs-tip dirtiness with a full 3-axis SUBSDirty model (shared/subs.js), but the STATE verbs do NOT implement Submodules' "seamless recursive experience where clone, checkout, and commit descend into subs by default". get records a 160000 leaf and never fetches/mounts/checks-out the child (get.js:607 "gitlink: recorded, not written"; checkout.js:138-140); post/put/delete skip gitlink subtrees and never run a child commit (fold-decide.js:154-201, stage.js:149/261, delete.js:78); there is NO synthetic/dot-branch creation or tracking anywhere; the Title-from-.gitmodules-URL-basename rule and the .gitmodules-URI fallback fetch are absent; and per shared/subs.js the dirty Edited axis (sub-local file edits ≠ R4.base) is INERT, so a parent is NOT marked dirty for an uncommitted edit inside a sub — contradicting Submodules' "dirty if contains anything dirty". This is an AUDIT/umbrella ticket: it inventories the gaps D1..D14 and confirms two REVERSE cases where the JS exceeds the spec (the 3-axis classifier; the behind/diverged stale axes) so Submodules is the laggard there. Individual fixes should spawn their own SUBS/DIS sub-tickets. Scope is be/ only (not beagle/); sibling get/post audits are DIS-055/DIS-054; the dirty-classifier sibling is DIS-057; method per CLAUDE. See Submodules, Dirty, Store, Title, SUBS-027b, SUBS-037.

Input

Context

Done so far (in the ~/todo/DIS-058 changeset, awaiting the commit gate)

Goals

Constraints

WIP

Design decisions

TODOs

Blockers and bummers

Outcome