.//../) must resolve against the wt root via cwdA URI with a RELATIVE path — path-rooted (no scheme/authority: .?, dir/file?) or opening .//../ — MUST resolve its path against the current cwd, then re-express it relative to the WORKTREE ROOT. Example: from the be/test submodule dir, jab post .? resolves . → be/test, so the effective URI is be/test? and the be/test submodule posts onto its trunk. Today be/ does the opposite: the ./-strip pattern (verbs/put/put.js:46, verbs/delete/delete.js:55, and DIS-054's new makeNarrow verbs/post/fold-decide.js:90) drops the ./ and matches wt-ROOT-relative leaves with NO cwd rebasing — cwd is read only by core/discover.js:find() to locate the .be anchor — so .?/./foo from a subdir silently hit the wrong path. First consumer: be/ post/put/delete narrowing (DIS-054); the pure URI parser stays cwd-agnostic. Method Issues.
jab post .? in be/test MUST mean "post the be/test submodule onto its trunk" — resolved URI be/test?; the ? is the bare-trunk (present-empty) query, the . is the cwd path. Not "post . at the wt root".io.cwd() in the post→narrow flow; makeNarrow (fold-decide.js:90) n.slice(2) then underNarrow matches root-relative leaves; cwd serves only core/discover.js:find() (walk UP to the .be shard anchor).verbs/put/put.js:46, verbs/delete/delete.js:55, views/log/log.js all ./-strip without rebasing on cwd.git commit -- ./foo is cwd-relative; Beagle's be post ./foo is silently wt-root-relative. POST.mkd's Path slot ("narrow to that path/submodule") never pins cwd semantics — this ticket pins it.cd <wt>/blog && jab put escher.mkd → be put: no eligible paths + PUTNONE (the bare arg matched wt-root-relative escher.mkd, absent); cd <wt> && jab put blog/escher.mkd staged fine.//journal/be status view, put shared/wire.js composes to //journal/shared/wire.js — spell.js mergeUri (URI-011b) rebases a BARE path to the WT ROOT, dropping the view-context /be; only ./-led joins the context. Composer probe confirms; the view-context resolution must follow this ticket's cwd rule.SRC_ROOT=/home/gritzko/src, NOT $HOME — URI-011's "(=$HOME)" is stale. The valid context for ~/src/journal/be is //journal/be (SRC_ROOT-relative tree name + path), not //be (wt basename); a //be-assumed context mis-diagnosed the pager PUTNONE as a GIT-014 wire-form misroute until gritzko corrected the root. Resolver work here must pin names against SRC_ROOT..→cwd, ./foo→cwd/foo, ../x→parent/x.jab post .? from be/test → be/test? (submodule onto trunk); jab post ./foo? from be/test → be/test/foo?./abs) and scheme/authority URIs (ssh://…, be://…, file:/…) are NOT cwd-rebased — left as-is.../ that climbs ABOVE the wt root is an error, not a silent clamp.core/discover.js:find()); the pure parser (abc/URI.h) stays cwd-agnostic — context can't live in the grammar (CLAUDE).shared/util/path.js/PATH helpers (CLAUDE no manual parsing).be CLI should honor the same rule — cross-check, split a beagle/ ticket if it diverges.discover.argRel(repo, raw) over _ctxSub(repo)/be.ctxDir (BE-032), NOT resolveWtPath(uriPath, cwdRelRoot) in path.js. be.ctxDir (core/loop.js:405) is io.cwd() for a CLI run and the nav'd dir on pager reentry, so CLI and TUI share ONE context — this ticket's goal, reached by another road../-stripping ad hoc" is right for the RESOLVE step and WRONG for the decode step — a downstream ./-shed (fold-decide.js makeNarrow, and the same pattern in put.js:78/delete.js:66 normRel) decodes argRel's dir-form output and must stay.resolveWtPath(uriPath, cwdRelRoot) in shared/util/path.js, applied once per command before verbs read u.path; verbs stop ./-stripping ad hoc. [the original 2026-06-28 decision, kept for the record].//../. Absolute /… and scheme/authority URIs bypass.. path from an absent one, this ticket then anchors it to cwd.test/put/subdir-cwd (golden authored PRE-fix, ran RED: "no eligible paths"+PUTNONE) — cd blog && jab put escher.mkd stages blog/escher.mkd.test/post/subdir-narrow — cd sub && jab post . '#msg' narrows to sub (pre-fix . was swallowed as a message word, BOTH files committed). NOTE: uses post . '#msg', not .? — Path-slot + bare-? trunk needs URI-009 presence detection in isBareTrunkQuery (left as-is).resolveWtPath + cwdRel — DEAD 2026-07-14: BE-011 shipped resolveInTree/wtJoin (NAVESCAPE) and BE-032 shipped argRel/ctxSub instead. Main's argRel(repo, raw) = resolveInTree(_ctxSub(repo), raw) IS this ticket's routing, dir-form and all. Do not merge the old helpers.put.js:676/678, delete.js:332, log.js:494 all call discover.argRel; test/put/subdir-multi is this ticket's put repro, landed and green. The cd blog && jab put escher.mkd symptom is FIXED in main — re-verified 2026-07-14.//URI-016-cwd under URI-016 (2026-07-14): isPathSlot takes bare ./.., slots.narrow = discover.argRel(info, …) once after parseSlots. Repro test/post/subdir-narrow lifted from the old tree. ORCHESTRATOR-VERIFIED: same test file RED on main (commits root.txt AND sub/s.txt, 2 ok) / GREEN on the wt; post bucket main 11/12 vs wt 12/12, no regressions.fold-decide.js ./-strip retired" — WRONG, do NOT do this. argRel PRESERVES dir-form and emits ./ for the wt root, and makeNarrow's strip is what decodes that to "no narrow". Retiring it makes cd <root> && jab post . '#msg' match nothing → POSTNONE: no changes since base. It is not a cwd-blind strip; argRel rebases upstream. Guarded by test/post/rootdot-narrow.get-be, get-http, get-oddname, sub-wtsrc, wire-http×3), no bro drift.be CLI; split a beagle/ ticket if it diverges.//URI-010 (pending human gate).makeNarrow must adopt this resolver before it is sound.082b172c touching the SAME files (put.js putRun argv map, post.js parseSlots, get/head/wire) — the wt diff must rebase over the fromGit intake calls before merge.work/URI-010 (no such hive cell — that name in this ticket is stale); it survives as the OLD FLAT tree /home/gritzko/src/URI-010/ (be -> . self-symlink). Still unmerged: no URI-010 commit in the be log.cwdRel/resolveWtPath with the segment calculator split/merge/resolveInTree(base, rel)/wtJoin (NAVESCAPE, not URICLIMB) — the better engine, and it already does this ticket's dot-normalisation + climb-out refusal. So the HELPER half of the patch is dead; do NOT merge it.cwdRel (only a local duplicate survives at views/status/status.js:505, cf. CODE-020), and EVERY resolveInTree call in main passes base "" or a view path, NEVER the cwd (shared/project.js:59) — i.e. BE-032's symptom, live. Being ported onto main's API under URI-016 in wt //URI-016-cwd, lifting this tree's repros (test/put/subdir-cwd, test/post/subdir-narrow) per gritzko's 2026-07-14 authorisation.resolveWtPath PRESERVED the trailing-slash dir-form; main's resolveInTree drops it via merge(segs). Any consumer depending on dir-form is a port hazard.be CLI cross-check still open.resolveWtPath present in /home/gritzko/src/URI-010/be/shared/util/path.js (+put/delete/post/log call sites) but ABSENT from ~/src/journal/be; no URI-010 commit in the be log. Still open.mkdir .be; jab put f; jab post 'm' → JS exception Not a directory in writePack→book→_mmap — ticket-worthy 3-command repro; (2) after a narrowed post, an out-of-scope STAGED file reads back mod (its put row seems consumed) — intended fold semantics or a bug, needs a ruling.jab post .? (be/test submodule onto trunk) rule. Pins POST.mkd's underspecified Path-slot cwd semantics to git-like cwd resolution, re-anchored at the wt root.