jab get (JS) writes NO project shard on a FAILING wire fetch — native writes the flat shard BEFORE fetching (beagle/test/get/25 pre-fetch arm)
Native be get be://<host>?/proj/ref writes the project shard .be/<proj>/ (flat refs carrying the peer URI) in BEEnsureProjectRepo BEFORE the keeper fetch runs, so even a FAILED fetch (unreachable host) leaves the on-disk layout in place (beagle/test/get/25 asserts exactly this). The JS jab get (verbs/get/get.js::seedRemote) does wire.fetch FIRST and only ingests on success — a wire-fail throws and writes NOTHING (no .be, no shard). Surfaced splitting JS-096: the 25 port (test/get/remote-shard) lands the SUCCEEDING-clone flat-layout arm; the pre-fetch-shard arm is this divergence. Method Issues.
jab): jab get be://nonexistent.invalid?/myproj/main
from a fresh dir → ssh: Could not resolve hostname, JS exception: wire.fetch: peer advertised no usable ref, exit 1, and NO .be / no myproj shard written. Native writes .be/myproj/{refs,...} first.
verbs/get/get.js::seedRemote (~line 145): wire.fetch(...) runs
ahead of ingest.clone, so a fetch throw aborts before any shard write. Native BEEnsureProjectRepo (beagle/GET.c) mints the shard up front.
flat project shard (+ peer-URI refs row) before the fetch, so a wire-fail leaves the registered-but-empty shard; or (b) ratify the JS fetch-first/atomic-on-success behavior as the spec and DOCUMENT that the native pre-fetch-shard arm is intentionally NOT ported.
remotes/
dir, peer URI in the single flat refs) — already covered by test/get/remote-shard + test/get/remote-shard-refs (JS-096).
host) and matches jab's atomic-write model; if so, just record the decision and the native-divergence note here, no code change.
pre-fetch-shard arm to test/get/remote-shard.
workflow; a normal reachable clone is unaffected.