Design ticket, ordered by gritzko 2026-07-19 ("think of improving the calling convention for file-scoped and dir-scoped and ext-scoped alike"). Today only the ext scope works: be spot ".js#'a = null'" searches the .js family, but a FILE scope (spot "shared/branch.js#'…'") dies with SPOTNOEXT and grep-mode's file scope is SILENTLY ignored (verified 2026-07-19: grep:shared/branch.js#null scanned the whole tree, 4684 lines starting at core/discover.js). Extend the SPOT-003 path-slot ruling into one uniform grammar: [mode:][scope]#locator, scope any of file / dir / ext / dir+ext, fragment = locator only.
spot:.c#'…' = ext family, spot:/root/path#'…' = subtree with per-file grammar; the fragment-.ext form is dead.q.ext is set only when the WHOLE path is a bare .ext (:59); the spot gate mode==="spot" && !q.ext → SPOTNOEXT (:256) predates the ruling; a real path never confines the classify walk (grep evidence above); trail .ext args don't rescue a pathed first arg.SPOTNOEXT, uri.parse: malformed on a spaced bare arg).Proposed convention (pending gritzko's ruling): the ONE arg is [mode:][scope]#locator; the scope path resolves via resolve(context,base,rel) like every verb arg, then classifies by what it names:
.ext (bare extension segment) → that lexer family, whole tree;.ext ever required;dir/.ext (dir prefix + .ext final segment) → subtree AND family filter — bare .ext is just this form at the root.dir/.ext composition and the skip-not-fail rule for unknown lexers under spot mode).dir/.ext composes, unknown-lexer skip note, plain-words miss — legs per mode.