Navigation moves around Beagle's resources by editing ONE axis of the current address while the other axes carry over. Every invocation — a CLI argv, a Bro pager :-spell, or a click on a hunk — is module(args): the head word names a JS module (a Verbs verb or a Projector view), the tail is its args, i.e. a URI. A pager view carries a live (verb · scheme · authority · path · ref · frag) state; a spell mutates one slot and inherits the rest. One tokenizer and one "does the name resolve" test serve both the CLI entry and the pager; an address resolves once, at entry, never re-derived downstream.
The head token resolves to a module and the tail becomes its args; there is no verb-vs-scheme classifier, only "does the name name a module."
verbs/<w>/<w>.js or views/<w>/<w>.js); the tail tokens are its args.ls, a file opens cat/Bro.module(args): a spell or click calls the resolved module fn directly — no argv re-stringify, no --tlv capture round-trip.A projector is an operation, not a transport, so it lives in the head (verb) slot; the scheme slot narrows to addressing alone.
ssh:/https:/git:/be:/file: plus content-addressing sha1:; a verb never appears as a scheme.diff/ls/cat/grep/log/status/…) are verbs — diff foo?a..b, cat x?main — never diff:/cat:.diff https://host/x?a..b, a lens over a remote, now parses.A spell SETS the slots it names and INHERITS the unnamed from the current view; typed input is PARSED by the URI lexer (never re-classified by hand) and each present component overrides its slot.
./test — path axis: descend into a subdir, keep verb + ref + authority.diff / status — verb axis: re-lens the same object, keep the URI.? / ?feat — ref axis: bare ? is the trunk, ?feat a branch, keep path + verb.//NAME switches the WORKTREE/authority and KEEPS the rest (verb·path·ref) — a worktree is the same project, so its branches/paths still resolve; // = the main tree.?feat) KEEPS the #L<n> position (same file, jump preserved); a PATH change DROPS it (a line anchor is meaningless in another file).diff file.c); a ?ref//path///auth edit keeps the current verb.post ssh://… screen is never the inherit base.
The authority slot names WHICH working copy or remote; a bare // reads locally, a scheme opts into the wire.
//host reads the CACHE (//github.com/gritzko/beagle); ssh:///https:///git:// open the wire — the scheme flips cached vs network URI.[A-Z]+-[0-9]+ (//DIS-060) is a WORKTREE at ${be.todo_root}/<name> — a pure SHAPE test, no filesystem probe.TODO_ROOT (default $HOME/todo) is read once and folded onto the ambient be.todo_root; CLI and pager share the one global.:status //DIS-060 reads that worktree's live working dir (dirty + staged), verb + path + ref inherited; // (or //.) returns to the main tree.
A hunk's U-tag carries a verb args spell, store-prefixed, so click-through re-dispatches in the store the hunk came from.
{ts,verb,uri} hunks; a click-target is a spell (verb args), not a bare URI Bro.