The model (Nav, Worktree): the context URI is the versioned cwd //worktree/path, and relative args resolve against it in the verb via resolve(context, base, rel). The code never threads the cwd sub-path: core/loop.js:337-342 sets be.repo/be.authority but composes no navCwd(io.cwd()) context PATH; every verb resolves relative args via wtpath(repo.wt, rel) (cat.js:163, status.js:109, ls.js:140, put.js:146, delete.js:171, get restorePath), and wtpath → navCwd(wt) always yields sub="" (discover.js:329) — root-anchored by construction. Only the pager's _composeCall (views/bro/pager.js:705) sees the sub-path, so CLI and pager disagree on the same command.
- cd MAIN/src && be cat main.c resolves //MAIN/src/main.c, not //MAIN/main.c — repro first, then fix.
- One context composition (navCwd(io.cwd()) incl. sub-path) threaded at CLI entry; pager and CLI converge on it.
- Confinement invariants stay: resolve()/wtpath NAVESCAPE guards byte-identical for the root case.
- Wt-root-relative semantics that are CORRECT (e.g. be put . at root, whole-tree get) must not shift.
cd be/core && jab cat loop.js exits 0 with EMPTY output (silently resolves be/loop.js); jab cat core/loop.js works. Silent-empty (no FILENONE) is an extra wart.~/src/journal/wiki → //wiki) is being pinned formally in BE-042; this ticket keeps the CLI thread-through + call-site sweep, sequenced after that model.navCwd(io.cwd()) (with sub) into the minted context at loop.js _cli; verbs resolve against it.