Free-text notes from resolution (discards, applied defaults, expansion-query detail).
Every declared dimension with its resolved value and provenance. Empty for an undeclared scope.
The entitlement decision, or null when this layer did not evaluate one.
null is a real and common state, not a placeholder: SearchEngine does not gate scopes
on SearchScopePermission itself — the caller that selects which scopes to search does
(the agent RAG layer, an application action). So an explanation captured during a search
legitimately has no entitlement to report, while one produced by ExplainScope() always
does, because the dry run resolves it on purpose.
It is nullable rather than defaulted because the two plausible defaults are both wrong: a fabricated "allowed" makes an unevaluated search look authorized in an audit log, and a fabricated "denied" makes a perfectly normal search look blocked. Neither is worth the convenience of a non-null field.
True when this scope would actually contribute results: entitlement did not deny it AND
at least one lane is active AND (for a non-global scope) an enabled provider row names a
configured, available provider that reads a lane kind the scope configures
(BaseSearchProvider.ConsumesLaneKinds) AND no lane is skipped — a skipped lane is a problem a
real search refuses on. A non-global scope with no enabled provider row, or no lane, reaches
nothing. When Entitlement is null, this reflects the configuration alone.
Entitled-but-zero-active-lanes is the case worth surfacing on its own. It looks like a permissions problem to whoever reports it ("I have access but get nothing"), while the actual cause is every lane failing its filter guard — a configuration bug that an entitlement check alone will never reveal.
OptionalResolvedThe effective context after resolution — what the lane templates were rendered against.
True when this is a global scope that configures no lanes at all — UNSCOPED: a global scope runs every provider with no filter.
Always false for a non-global scope. A non-global scope with no lanes is the opposite of
unbounded: every provider receives an empty lane list, which means "nothing for you", so it
reaches nothing (Reachable: false). Before that rule, a lane-less non-global scope was
read as unscoped too, which is why this flag exists.
The complete decision for one scope: whether it was reachable, how each dimension of its bound was decided, and what each lane ended up doing.