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.remotes/ dir, peer URI in the single flat refs) — already covered by test/get/remote-shard + test/get/remote-shard-refs (JS-096).jab's atomic-write model; if so, just record the decision and the native-divergence note here, no code change.test/get/remote-shard.