ssh:////), worktree sources unserved, nested fallback empty
jab get ssh://localhost/src/beagle died SUBFETCH cannot fetch sub dog/abc (abc) from ssh:////localhost/src/beagle?/abc — child unreachable. Three compounding defects in the be/ JS GET sub-mount path: (A) submount.sameSourceUri hand-concatenated "//" + u.authority where the URI binding's u.authority already carries the // (the known URI-013 latent bug), so every authority-bearing same-source URI was ssh:////host/… and never reached the peer; (B) a git source WITH a worktree (path not ending .git) serves each sub's own checkout at <path>/<subpath>, but no such same-source form existed — only the beagle ?/<proj> swap; (C) a NESTED sub (dog/abc) is declared in dog/.gitmodules as abc, yet mount read only the ROOT .gitmodules with the full subpath, so the official-url fallback (and the Title) came up empty and the whole mount threw. Spec: same source first, official .gitmodules url only as fallback (Submodules §1, Title retrieval preference).
jab get ssh://localhost/src/beagle (a git repo WITH a worktree; subs dog → libdog, nested dog/abc → libabc all checked out at the source) — parent fetched, sub mount threw SUBFETCH; error showed the ssh://// URI and NO or <url> fallback part (the nested url lookup returned "").io.unlink on a dir is EISDIR, swallowed); deletes left empty dirs behind (del-sweep was a no-op — and the DELSWEEP fold row dispatches BEFORE the fan-out's delete leaves, so a queue-time sweep sees nothing).jab get ssh://localhost/src/beagle works smoothly and updates the beagle wt to HEAD (removal of js/, dog/ becoming a submodule, nested dog/abc cloned).?/<title> project swap; git worktree source → <path>/<subpath>; bare .git → no same-source; official .gitmodules url only as fallback.URI.make ONLY — no string concatenation (house rule)..gitmodules.shared/submount.js, verbs/get/get.js); no native edits, no other tests edited.rm -rf it; only a REAL mount (.be anchor present) is swept on gitlink→absent.sameSourceUri(source, title) → sameSourceUris(source, title, subpath) returning an ordered candidate list, built with URI.make; consumed by BOTH the local-reuse branch and the wire branch of mount.declaredUrl(wt, subpath) walks the subpath segments to the nearest enclosing .gitmodules; feeds both the fallback fetch and titleFromUrl (nested dog/abc titles libabc, not abc).oldDirTree; the leaf sweeps the old dir's TRACKED files synchronously (sweepOldTree) BEFORE mounting — queued delete leaves would fire after the mount.s unmounts via io.rmdir(full, true) (io.rmdir exists since GET-039; the "JS has no rmdir" notes were stale) — gated on the .be anchor existing.markDelDir); finalizeGet (after the queue drains) rmdirs them deepest-first and walks each chain up; plain rmdir so untracked content keeps a dir alive.
-v repro unit test be/test/submount.js (table-driven: source×sub candidates, ://// guard, declaredUrl walk), registered as be-js-unit-submount. -v fix sameSourceUris + declaredUrl + mount call sites. -v fix the three update-path defects in verbs/get/get.js. -v end-to-end: fresh clone (3 ssh fetches, 0 curl), old→HEAD update byte-identical to git archive (parent + both sub pins), idempotent re-get (2 re-mount rows only). -v heal the live ~/src/journal/beagle wt (stranded tip from the crashed run): re-pin ?#e5071f32, then get → HEAD; byte-verified, 0 conflicts. -x be-js-bro-view golden flake (dir hunk in raw readdir order, view/bro.js buildDirHunk) — pre-existing, unrelated to this ticket; spin its own ticket if wanted.
shared/submount.js, verbs/get/get.js, test/submount.js (new), test/CMakeLists.txt.-E bro-view, the pre-existing flake); be-js-unit-submount added.50e90012 ("a multitude of fixes for GitHub remotes", be trunk 07Jul — the SUBS-047 changeset rode it: sameSourceUris/declaredUrl + the get.js update-path fixes + test/submount.js all first appear there); wt verified clean at 082b172c. CLOSED (audit 2026-07-07).