A view's emitted click-target may be RELATIVE — scheme present but //authority and/or path omitted (diff:shared/patchscope.js) — and MUST resolve against the CONTEXT URI before it is driven: the address bar's context is the current view URI, the CLI's is cwd-derived, and ONE shared resolver serves both (Nav). Relativity is PER-COMPONENT — diff:foo fixes only the scheme and INHERITS the context authority (+ base path) — and the invariant is resolve(relative, context) == the absolute the view would bake. Today the Bro pager follow/click (_runSpell→_resolveSpell, views/bro/pager.js:447,235) drives the target VERBATIM (never runs the nav-context resolver), so a click in a //JS-072-scoped status view follows a scope-LESS diff:shared/patchscope.js, resolves against the launch/cwd tree, and yields no hunks. shared/nav.js:navAuthorize exists for exactly this (inject the omitted authority) but is wired ONLY into the diff view (views/diff/diff.js:396), not the pager and not status (which bakes bare "diff:"+navPath at status.js:322 though its BANNER is scoped via navUri at status.js:288). Discovered mid-URI-011. Method Issues.
//JS-072 (a worktree), open the status view, left-click shared/patchscope.js → the status bar reads no hunks: diff:shared/patchscope.js status //JS-072. status //JS-072 is NOT part of the spell: it is the status-bar's live scope indicator joined to the message by the double-space at views/bro/pager.js:346 (message + " " + verb + " " + uri). The REAL error is no hunks: diff:shared/patchscope.js.diff:shared/patchscope.js carries NO authority; driven against the launch/cwd tree (not //JS-072) it finds no such diff → empty. The file DOES have a diff in the scoped tree.U-targets BARE (("diff:"|"cat:") + navPath, status.js:322) while its banner IS authority-scoped (navUri("status", prefix), status.js:288) — the two are inconsistent within one view.navAuthorize (inject the current authority into a baked scheme:path) is called ONLY by the diff VIEW (views/diff/diff.js:396); the pager follow/click path (_runSpell) and status never call it.//authority), through the ONE shared resolver (Nav, URI-spec).//WT-scoped view opens its diff/cat in the SAME scope: the //JS-072 status click drives diff://JS-072/shared/patchscope.js, not bare diff:shared/patchscope.js.resolve(relative, context) == the-absolute-the-view-would-bake; EITHER side is acceptable (a view emits absolute when it HOLDS the context, or the resolver fills from context) as long as they AGREE.status-click repro test — RED today, GREEN after.//-scoped target passes through unchanged — navAuthorize already does this).be.authority / cwd-derived), NOT in the pure URI grammar — the parser stays context-agnostic (CLAUDE).shared/nav.js (CLAUDE: never manual-parse in JS/C)._runSpell/_resolveSpell, fixing every projector's bare targets uniformly; (b) BAKE-ABSOLUTE — status (and peers) emit navUri("diff"|"cat", navPath) since they hold the context. Prefer (a) as the general fix, (b) as the local consistency patch; not mutually exclusive (a stays idempotent over b's output).//WT status click on a changed file asserts the DRIVEN target is diff://WT/<path> (RED today: bare diff:<path> → no hunks)._runSpell) + address bar; fill the omitted authority (+ base path) from the context URI; keep idempotent.status bakes navUri — pick per the invariant; guard against double-authorize.U-targets (grep/ls/log/spot/refs) for the same scope drop; fold in or split tickets./), Nav (shared CLI+bar resolver; correct the wt-root line), Projector (a view may emit a relative OR an absolute URI, absolute only if it holds the context).//JS-072 status-click yielding no hunks: diff:shared/patchscope.js. Pins the "views emit relative URIs, resolved against the context URI by one shared CLI+bar resolver" rule and the resolve(relative, context) == absolute invariant.