.. escapes the rootbe.wtdir (core/discover.js:232) confines a nav authority to SRC_ROOT with a LEXICAL prefix compare (repo.wt.indexOf(top+"/")===0), but the URI parser does not normalize ..: a host of .. passes authorityRepo's dotless-typo gate (it contains a dot) and u.path may carry ../. io.stat then resolves the dots PHYSICALLY while the confinement compare stays lexical, so //../name and //name/../../.. adopt any anchored tree OUTSIDE SRC_ROOT. shared/util/path.js safeRel (JS-065's "ONE worktree-confinement guard") is never applied to host/path — the JS twin of native DOG-009. From the 2026-07-07 be/ review (BE/REVIEW), CONFIRMED with a probe. Method Issues.
be.wtdir("//name/../../outside") and be.wtdir("//../outside") both returned a path physically resolving to .../play/outside, OUTSIDE SRC_ROOT=.../play/root.const top = root + "/" + host; const dir = top + (u.path||""); ... if (repo.wt !== top && repo.wt.indexOf(top+"/") !== 0) return null; — find()'s walk-up uses lexical dirname, so root/name/.. keeps its prefix and passes the guard while io.stat escapes.dog/HOME.c escape... in host or path never escapes.shared/util/path.js.shared/util/path.js: split/merge + resolveInTree(base,rel) (normalises ./.., THROWS NAVESCAPE on a climb above the tree root) + wtJoin(wtRoot,rel). Confinement is a PROPERTY of the compose step, not a post-hoc prefix compare.core/discover.js: resolve(base,ref)→abs (the context_uri+path→filesystem_path resolver, throws NAVESCAPE on escape); wtdir delegates to it and its lexical indexOf(top+"/") check is GONE. srcRoot() memoised on be.srcRootDir.wtJoin routing pass (P2/P3) across views/verbs/shared.//../x and //name/../../x refuse — test/uri011/nav-escape/run.sh.test/uri011/nav-escape/run.sh: //root/../../outside + //../outside physically escaped SRC_ROOT; now REFUSED with NAVESCAPE, //root still resolves.shared/util/path.js (split/merge/resolveInTree/wtJoin); core/discover.js (resolve, wtdir delegate, srcRoot cache). Follow-on escapes BE-026/BE-027/BE-028 + P2/P3 wtJoin routing (cat/why/diff/spot, put/delete/get/post/patch, checkout/submount/stage leaf guards).bro/view/color are a pre-existing FS-readdir-order golden flake, pager-independent). Working tree left DIRTY — no VC ops.