.be/ directory crashes jab getCloning into a directory that already holds an empty .be/ dir — the standard hermetic-shield shape the native harness creates (mkdir wt wt/.be) — crashes jab get with an uncaught error and an empty worktree, where native treats the empty .be/ as a fresh shield anchor and clones cleanly. One conceptual defect (empty .be/ mis-detected as an existing store instead of a fresh shield) with three transport-specific faces. It masks/blocks most submodule + clone repros, so it gates several JGET-001 children. Method Issues.
beagle/test/get/{29, 62} and ALL submodule cases (each does mkdir wt/.be).core/discover.js::find() treats empty .be/ as shieldLike
→ returns a non-null stale repo (bePath=<wt>/.be/wtlog absent, project="");
core/loop.js::cli (~267-305) only runs the repo-less GET seed when find()
THROWS, so the stale repo takes the wrong branch → downstream throw.
- file: local: get.js:128-134 seedLocal→ulog.append→io.rename → Error: Is
a directory (renames a temp over the .be DIR).
- be: local (case 62): seedRemote fresh=!exists(.be) is false for an empty
dir → first clone routed to the incremental else → ingest.add
(ingest.js:117) writeBytes into a non-existent shard → ENOENT.~/todo/JS096-probe1/predot, ~/todo/JSGET-cases/nosub-emptybe,
/tmp/jab-f62.*.jab get into a dir whose only .be is an EMPTY dir (or the empty-.be FILE
shield) clones cleanly across file:/be:/ssh:, identical to native; a real
populated .be store is still detected as existing..be/ as "no local store yet,
fresh clone") rather than three band-aids, if feasible. Repro-first.discover.js::find() (and the fresh test in seedLocal/seedRemote) treat
an EMPTY .be/ dir (and the empty-.be shield FILE) as no-store-yet → the
repo-less fresh-clone path; only a populated .be (a wtlog row / shard) counts.mkdir d/.be; cd d; jab get <file:|be:|ssh: remote> → clean clone.seedLocal (get.js:187-192) fresh=!exists(<wt>/.be) → false for the empty DIR → appendWtlog(<wt>/.be) → ulog.write io.rename(tmp, <wt>/.be) over a directory (ulog.js:192) → EISDIR crash.be.find(wt)-routed): discover.js:132 still anchors an empty .be/ dir as shieldLike → the UPDATE arm; store.shardDir(wt,"") falls back to the empty .be itself, so ingest.add MAY now land there instead of ENOENT-crashing — RE-PROBE this face before fixing (unverified, audit 2026-07-07)..be/ dir (and the empty-.be shield FILE) as no-store-yet in discover.find + the seed fresh-checks; then fold into the existing be/test/get cases (the shield shape is the harness norm).wt/.be); 008/009 retired meanwhile.be/test harness firewall is an empty .be FILE at the scratch ROOT (getrepro.sh : > "$TMP/$$/.be"), not an empty dir at the clone wt — so the suite never hits this shape today.