The $fields entries a start GROQ requirement reads that fields does
not bind — the BINDABILITY rule every pre-flight surface applies before
trusting a verdict over possibly-incomplete inputs. GROQ equality against
a missing operand collapses to a definitive-looking answer (null == x is
false, not null), so a verdict that read an unbound entry is PROVISIONAL in
both directions: supplying the entry could overturn a refusal AND an
approval. Non-empty ⇒ report "can't decide yet" instead of the collapsed
verdict (the evaluateStart verb does; the Studio start control does).
The GATE never consults this: at startInstance the supplied inputs are
final, so evaluating over genuine absence — including rules that WANT it,
like !defined($fields.rush) — is the correct semantics there.
fields is a produced $fields map (startFieldsParam, or a surface's
seed map) — producers bind only own keys with real values, so key presence
IS the supplied-ness rule.
The
$fieldsentries a start GROQ requirement reads thatfieldsdoes not bind — the BINDABILITY rule every pre-flight surface applies before trusting a verdict over possibly-incomplete inputs. GROQ equality against a missing operand collapses to a definitive-looking answer (null == xis false, not null), so a verdict that read an unbound entry is PROVISIONAL in both directions: supplying the entry could overturn a refusal AND an approval. Non-empty ⇒ report "can't decide yet" instead of the collapsed verdict (theevaluateStartverb does; the Studio start control does).The GATE never consults this: at
startInstancethe supplied inputs are final, so evaluating over genuine absence — including rules that WANT it, like!defined($fields.rush)— is the correct semantics there.fieldsis a produced$fieldsmap (startFieldsParam, or a surface's seed map) — producers bind only own keys with real values, so key presence IS the supplied-ness rule.