be self-gitlink — DIS-058 mount-recursion sub-mounts the self-locator (no .gitmodules entry) → SUBFETCH/ENOTDIR + partial checkout
jab get of beagle-ext aborts mid-checkout because DIS-058's get mount-recursion treats the be SELF-locator gitlink as a submodule. The beagle-ext tree carries be as a 160000 gitlink that pins the project's OWN commit (the self-locator, see GET-036) with NO .gitmodules entry (only test is declared). verbs/get/get.js:621 routes every 160000 leaf to mountGitlink → shared/submount.js mount, which for be finds no url, derives title basename("be")="be", and tries to fetch a non-existent ?/be child — then aborts, leaving a PARTIAL checkout (.be, .gitmodules, CMakeLists.txt, nothing else). Two error shapes, one root: a canonical-store source throws the friendly be get: SUBFETCH cannot fetch sub be (be) … child unreachable; a WORKTREE source (file:/home/gritzko/journal?/beagle-ext, where <src>/.be is a wtlog FILE not a store dir) throws a RAW uncaught Error: Not a directory (ENOTDIR). GET-036 fixes this exact self-gitlink in the C get (materialise be -> .); the DIS-058 JS mount path has no such case — so DIS-058 crashes on a real be get of beagle-ext (its cycle test used a synthetic sub WITH a .gitmodules url, missing this). Scope: be/ JS. See GET-036, DIS-058; method Issues.
jab get file:/home/gritzko/journal?/beagle-ext → get ?#f0269b27, new .gitmodules, new CMakeLists.txt, then JS exception: Error: Not a directory; only those files land.jab get file:/home/gritzko/.be/?/beagle-ext → same partial checkout, friendlier SUBFETCH … sub be (be) … child unreachable.be is a 160000 SELF-gitlink (pins beagle-ext's own commit), NOT in .gitmodules. mountGitlink (get.js:621,670) → submount.mount (shared/submount.js): gitmodulesUrl returns "" → titleFromUrl("")||basename("be") = "be" → it sub-mounts instead of refusing → fetch ?/be fails.<src>/.be is the wtlog FILE, and the sub-source resolution readdirs it as a store dir. The partial checkout is a data hazard either way (no cleanup, no atomicity — cf. GET-018).be -> . locator and DO NOT sub-mount it. The JS mount path must match.jab get — deterministic SUBFETCH … sub be (be) … child unreachable, ~60 mis, no key files — and both had to fall back to be get --nosub; it blocks EVERY jab get clone of beagle-ext. SUBS-043 confirmed be is committed 160000 (a self-gitlink), on disk a 120000 be -> . symlink, and fixed the TWIN status bug by gating sub-classification on the .gitmodules DECLARATION — the get mount should gate the same way (GET-039 is the deeper "symlinks are 120000 blobs, never a sub" fix).jab get of beagle-ext (or any project carrying a be self-locator gitlink) materialises be -> . and COMPLETES the checkout — no SUBFETCH, no ENOTDIR, no partial wt.get.be/ JS only; ABC/JS house style; keep the friendly string throws.be -> .) and DIS-058 (the mount-recursion this lives in). Do not regress the DIS-058 be-js-sub-cycle (a real sub WITH a .gitmodules url must still mount).mountGitlink/submount.mount: a 160000 leaf with NO .gitmodules entry AND/OR named be pinning the project's own commit → write the relative be -> . symlink (the GET-036 behaviour) and SKIP sub-mount + recursion.file:<wt>?/proj): follow <wt>/.be's row-0 repo redirect to the real store instead of readdir-ing the wtlog file (ENOTDIR), or refuse cleanly — secondary to the self-gitlink fix.dbb828e6 "GET-037: symlink checkout" + 064c15f5 "GET-037: double-check gitlinks agains .gitmodules" — an UNDECLARED 160000 gitlink never mounts (get.js:825-871 .gitmodules gate, the SUBS-043 rule); the 120000 route is GET-039's.submount.mount drops the sub anchor on any part-way failure and wraps raw io errors in a friendly string (GET-037 ATOMICITY block, shared/submount.js:223)..be-redirect instead of ENOTDIR — done via GET-038's resolveLocalStore (shared/submount.js:167-192) + sibling shards opened against the STORE dir (get.js:374-379).test/sub/{cycle,selfloop,symlink,wtsrc} exist, but no case commits the LEGACY 160000 be self-gitlink (the planned sub/selflink is absent) — the migration path for old trees is untested.jab get of beagle-ext STILL leaves a partial checkout per GET-041 evidence 2026-07-07 (mid-clone require-loop through the materialised be -> .; jab run-pin missing) — remaining work tracked there.jab get file:/home/gritzko/journal?/beagle-ext crash. Primary: the be self-gitlink must materialise be -> . in the JS mount path, not sub-mount; secondary: no partial checkout / raw ENOTDIR on any sub-mount failure.dbb828e6 (symlink checkout) + 064c15f5 (.gitmodules-declaration gate) — the SUBFETCH/ENOTDIR crash class is fixed; sub-mount failures are atomic + friendly. Open: a legacy-160000 self-gitlink test and the end-to-end beagle-ext clone (GET-041, evidence 2026-07-07).