<meta>/work/Worktree switching is a PITA; worktrees live flat under $SRC_ROOT (default $HOME, in practice ~/src), //NAME maps to $SRC_ROOT/NAME. Ruling 2026-07-09: all worktrees become cells of the hive — <meta>/work/<NAME>/ under the meta-project (~/src/journal), gitignored by the meta; //NAME resolves to work/NAME, fixed convention, no registry (enumeration = ls work/); a scheme-less //authority is ALWAYS a worktree, remotes always carry a transport scheme. Wiki amended same day (URI, Worktree, Nav, Store, Verbs, Invariants + verb pages). Code survey 2026-07-09: srcRoot() in be/core/discover.js is the single linchpin every //NAME→path decision flows through (resolve() :280, wtdir() :308, navCwd() :326).
//NAME resolves to <meta>/work/NAME whether launched in the meta or inside any cell.be get file:... / ticket workflow create new worktrees as hive cells, not in cwd.work/ contents (no unk flood, no accidental staging).be/shared/util/path.js resolveInTree/wtJoin/safeRel) are tree-relative — must stay unchanged.SRC_ROOT env override stays as the back-compat escape hatch for flat legacy worktrees (discover.js:191)..be anchors carry absolute store paths — no data migration for existing cells/stores.srcRoot() (discover.js:186-198) returns join(metaRoot, "work"); meta root = the outermost enclosing worktree, converging from both the meta and a cell (parent-of-work/ heuristic or an explicit meta marker).srcRoot() must be exactly <meta>/work, not <meta> — navCwd() (:318-333) slices the name off it; <meta> would emit //work/NAME mis-authorities.find(<meta>/work) climbs INTO the meta — a cell reads as a SUBMODULE of the meta today; topWt() needs an explicit hive boundary: never climb across a work/ path segment (cell = top).//name address under the hive (//journal ≠ work/journal); context // = launch wt covers the meta case; cross-cell meta addressing is a follow-up ruling.work/: that alone keeps wtScan (shared/classify.js:57-104) out; the nested-repo prune (:68-83) backstops SECONDARY cells only (.be reg file) — a COLOCATED cell (.be/ dir) is NOT pruned, so the gitignore line is load-bearing.core/recurse.js walks .gitmodules entries only, hive cells are never declared there.work/ → hits <meta>/be — cells inherit the meta's verbs by construction (registry.js:64-78, ceiling $HOME).work/ to journal .gitignore (done 2026-07-09).work/), srcRoot cell→dirname(t) / meta→join(t,"work"), navCwd meta = //, todoRoot probes the meta root; suite 159/1 = baseline, resolve_confine PASS, SRC_ROOT env reproduces flat layout exactly.seedDest() in get.js — user-made cell cwd kept; at the hive dir or meta root, mints <hive>/<NAME> (NAME = ?/title slot > local source proj > URL basename); //peer-as-SOURCE stays a follow-up (BE-034).jab get file:~/.be?/beagle-ext-tests minted work/beagle-ext-tests; //beagle-ext-tests/… reads from the meta; //bogus → NAVNONE; meta status sees zero work/ rows.test/bro/ticket/run.sh (:49-66) models the flat layout (keep as SRC_ROOT back-compat demo or move to hive); audit test/CMakeLists.txt, test/resolve.js:15, test/loop.js:21, test/barrier.js:12; refresh stale $SRC_ROOT/$HOME comments (discover.js:174,182-198,265,285-290,350,362; loop.js:154-156,162,333; path.js:58).be/ silently runs the META's verbs — settle the self-hosting/dogfooding story (BE-029 interplay).work/ hides cells from be ls of the meta root (classifyDir honors ignore, classify.js:513); enumeration is FS-level ls work/ by design — needs a ruling only if be ls work/ should list cells.SRC_ROOT=/home/gritzko/src (pinned 2026-07-06) — it legitimately overrides the hive; drop or repoint the export for the hive to take effect in daily use (the GETOVRL guard caught the mis-seed into the dirty meta wt when set).