be: = local keeper; file: is worktree-only
Beagle conflates two roles in file:: a local worktree SOURCE and the host-less LOCAL keeper WIRE (clone/fetch/push). be: is the keeper protocol but is ssh-gated (needs a host), so file:// is currently the ONLY local keeper edge — which blocked making file: worktree-only (URI-005 v1/v2 forks). Decision (user 2026-06-22): split the roles. Hostless be: runs the keeper LOCALLY (same protocol, no ssh pipe — ssh is only the remote transport); file: becomes WORKTREE-ONLY (always a shared-store worktree, never an own-store clone), slash-agnostic. Net: be: = keeper transport (local hostless OR ssh remote); file: = local worktree attach. Umbrella/epic. Method: Issues.
file: running keeper is the same protocol as be: minus the ssh pipe (user) —
so a host-less be: is the natural local keeper transport, and file: need not carry the wire role at all.
file://<dir> makes an own-store clone over the local keeper wire; ~20 tests
use it for clone-and-push-back: be-post-32/38, be-patch-33, be-get-30, head/19-25, post/35-48 (verified by the v2 worker). These migrate to hostless be:.
keeper/KEEP.exe.c:1298 treats be/file as the keeper
protocol; keeper_remote_uri, keep_post_is_git_wire, keeper_post special-case host-less file://. The GET-012 slash-count signal + be-get-29 encode file:=clone.
be: (e.g. be:/abs/.be?/proj) runs keeper locally (no ssh): clone /
fetch / push exactly as be://host does over ssh.
file: is worktree-only: be get file: always attaches/updates a shared-store
worktree (no own store), slash-agnostic; the file: clone/push path is removed.
file:// clone-and-push-back tests onto hostless be:.be://host (ssh remote) or ssh://. Core transport — adversarialtests, repro-first per stage.
be: runs local keeper (clone/fetch/push, no ssh): the be:-local
transport that gives file: somewhere to hand its wire role.
file: worktree-only + slash-agnostic; remove the file: clone path;
retire the GET-012 slash-count signal + rewrite be-get-29.
file:// clone/push tests to hostless be:.be: local keeper (no ssh); repro + tests. LANDED 096b425e.49943c98 (21 tests:prior 20 + post/23). No file:// own-store-clone dep left in the migrate set.
file: worktree-only, slash-agnostic; remove file: clone path. Must also
(a) rework get/35,36 setup (still file:// own-store clone — they assert file: scheme recovery, kept by St.3); (b) drop get/57 (now dup of URI-007 get/62). IMPLEMENTED + scoped-green, parked ~/todo/URI-006-St2. True scope was ~30 tests (+2 C-tests), not 4: St.3 had not migrated them all. URI-008 LANDED fa31e6f6 cleared the GET arm → 19/20 migrations green; last red is post/43 (SUBS-020 official-url sub-push) pending a behavior ruling. Then renumber get/63→65, reconcile onto fa31e6f6, land.
6a0ce1b7 onto SUBS-031 60cf0b10; full suitegreen (be-post-relpath ssh aside). file: clone/push path gone.
096b425e — hostless be: runs the keeper locally (no ssh):
BE.cli.c be_be_local_route; KEEP.exe.c hostless_local; WIRECLI.c wcli_spawn local-exec; repro test/get/60.
31050b3f — be:-local parity (cross-name selector + FF guard),one fix in keeper/REFS.c; the gap St.3's first run surfaced.
49943c98 — 21 file:// clone/push tests migrated to be:; full
suite green (pre-existing be-post-relpath aside). St.2 now unblocked.
fa31e6f6 — be:-local recursive clone fetches sub objects +co-resident shard (sniff/SUBS.c symmetric probe + BE.cli.c authority hoist).
60cf0b10 — git-.git→official sub-push gated behind --force(default skip + notice); the St.2 transport change exposed it.
6a0ce1b7 — file: worktree-only + slash-agnostic; file: clone/pushpath removed (BE.cli.c, KEEP.exe.c, WIRECLI.c). ~30 tests migrated file:→be:; get/63/64 became triangle wt-identity tests; post/43→ssh; get/57 dropped, get/30 renamed be-local. EPIC COMPLETE.