Build the candidate pool for a scope MQL fragment. Two paths:
Fast path — the fragment is a recognized seed name (here,
peers, reachable, inventory, online, world, me),
a path glob, a stuff id, or a comma-union of such tokens.
Each token expands directly to its candidate pool.
Slow path — anything else (a keyword, an arbitrary chain,
a bracket filter, etc.). The fragment is parsed and resolved
as a full MQL query against an inner reachable context, and
each resulting (Stuff, via) anchor's neighborhood becomes
part of the candidate pool. This is what makes a focus chain
like "here:bookcase:book" evaluate cleanly as a scope —
the pool is the book detail's neighborhood (its children, if
any).
Falls back to reachable when the fragment is empty, the slow
path produces no anchors, or the slow-path parse/resolve throws —
the graceful-fallback rule from the unified-scope delta. Typical
trigger: the player walked into a different room and the old focus
chain doesn't resolve in the new context.
Build the candidate pool for a scope MQL fragment. Two paths:
Fast path — the fragment is a recognized seed name (
here,peers,reachable,inventory,online,world,me), a path glob, a stuff id, or a comma-union of such tokens. Each token expands directly to its candidate pool.Slow path — anything else (a keyword, an arbitrary chain, a bracket filter, etc.). The fragment is parsed and resolved as a full MQL query against an inner
reachablecontext, and each resulting(Stuff, via)anchor's neighborhood becomes part of the candidate pool. This is what makes a focus chain like"here:bookcase:book"evaluate cleanly as a scope — the pool is the book detail's neighborhood (its children, if any).Falls back to
reachablewhen the fragment is empty, the slow path produces no anchors, or the slow-path parse/resolve throws — the graceful-fallback rule from the unified-scope delta. Typical trigger: the player walked into a different room and the old focus chain doesn't resolve in the new context.