submount.mount has only two child-acquire paths: the havePin fast-path (reuse
an ALREADY-present sibling shard, checkout only) and, for a fresh mount,
fetchChild → wire.fetch. wire.js::classify routes a file:/scheme-less local
URI to a LOCAL keeper exec ({bin: keeperBin, …}), so a LOCAL submodule mount
spawns keeper — which is absent in the jab-only bin — even though the child's
objects already live on local disk in the source store. Per design a LOCAL clone
must NEVER touch the wire: reuse the store and create a (store-backed) worktree,
exactly like top-level jab get file://… (get.js's localish direct path). Only
be:// should reach keeper / the future jab upload-pack (GIT-020).
sub/{baredel,baredel-nested,bareput,bareput-nested,
cycle,patch,selective,untracked} + spot/submount — the last non-green tests
(94% → these). Full suite otherwise 132/141 jab-only, native-binary-free.submount.mount (fresh mount) → tryFetch (submount.js:127) →
wire.fetch(uri); uri is the parent source with project swapped, a local
file:/scheme-less store. wire.js::classify (~L54-60): localish (file/""/
keeper-local/be-noauth) → {bin: keeperBin, argv:[keeper, verb, servePath]}.
keeper absent → wire.fetch throws → tryFetch catch (submount.js:130) returns
null → SUBFETCH … child unreachable → GET-037 drops the anchor → "sub not
mounted/checked out" (the raw keeper error is swallowed by the catch).jab get file://<store>/.be reads the local store DIRECTLY
(get.js localish, ~L91-98: store.open, NO wire) — verified keeper-free. The
submodule mount lacks that same local fast path.havePin reuse (submount.js:177-179) only triggers when store.open(beDir,
title).getObject(pin) already resolves — a NAMED-shard assumption that misses a
jab project-less/unnamed source shard, so fresh local mounts fall through to the
wire.file:/scheme-less) submodule child is mounted by REUSING the on-disk
source store (its objects/pin already there) and making a store-backed worktree
(anchor .be redirect + checkout of the pin's tree) — NO wire.fetch, NO keeper.be:// sub sources still route to keeper /
GIT-020; git transport (//host) still uses git-upload-pack.be/ JS (shared/submount.js, reuse store.js/ingest.js/get.js's localish
logic). Do NOT change the be:///git dispatch. Repro-first (CLAUDE.md §17).havePin NAMED-shard
lookup miss is part of THIS bug) — resolve the sub shard whatever its title.mount/fetchChild: when the child URI is
file:/scheme-less, resolve the source sub shard on disk and either (a) make a
store-backed worktree pointing at it (redirect .be + checkout), or (b)
local-clone its pack via ingest.clone (no wire) — (a) matches "reuse the store,
create a worktree" and avoids copying objects.havePin to find an unnamed/project-less source shard so an already-local
pin reuses without any fetch attempt.jab get/mount the
parent → assert the sub mounts with NO keeper exec — RED before the fix.submount.mount: local-source reuse path — landed d80bdb5c
(localSourceUri/resolveLocalStore + the LOCAL-SOURCE branch, submount.js:154-280).d80bdb5c "js tests pass, no native use";
the _BE_WILL_FAIL xfail list is now EMPTY (spot-submount dropped per the rule).be.find/recursion
expect downstream (a redirect .be vs a self-contained .be/<title> shard).$HOME/TEST-003, staged, pending land): shared/
submount.js — localSourceUri/resolveLocalStore + a mount() LOCAL-SOURCE
branch (store-backed redirect + checkout, NO wire) + a project-less havePin
probe. Repro RED→GREEN, no keeper spawn; suite 132/141→134/141 (spot/submount,
sub/untracked green; no regression). Verified independently.file://
local jab get yields a STORE-BACKED worktree (shared store, .be is a FILE),
but subcase.sh assumes a self-contained FULL clone — sub/{baredel,bareput,
selective} grep $JS/.be/wtlog (a dir, now a file); sub/{cycle,patch} need
clone isolation (share the source store, so cur pin moves); sub/*-nested
seed a gitlink with jab put (PUTNONE, no CLI spelling). Harness edits, own pass.subcase.sh file://
rewrite landed the fixtures but the child MOUNT still hit keeper — this was the gap.d80bdb5c ("TEST-003,JS-099,SUBS-046: js tests pass, no native use", be
trunk 06Jul): the product fix + the 7 harness-residual cases; sub/* + spot/submount
all green jab-only, xfail list emptied. CLOSED (audit 2026-07-07).