Verb/menu split of every statement in source order, tracking the persistent
menu context via the shipped Q4 resolver (resolveStatements).
This walker was pulled from the Q6 PR (#193) because it fabricated on the
Q14 C3b cascade: after an upstream defect destroyed the document context, a
following relative statement headed by a known CRUD verb still resolved
confidently against the stale value. It returns unchanged in shape, because
the fix belonged in the resolver, not here — resolveStatements now degrades
exactly the context-DEPENDENT statements to unresolved when the context is
lost, while leaving a context-NEUTRAL dynamic head ($x) alone. So the
single rule below — a statement the resolver refused stays unknown here —
fails closed on the cascade without a local taint that would over-fire on
benign statements. The distinction is only visible to the resolver; this
module sees flattened statements.
What the walker does add is DocumentVerbSplit.contextCertain and
DocumentVerbSplit.span: the resolver's per-statement certainty and
location, carried through instead of dropped. The certainty was the last of
#192's three bullets — the cascade FIX shipped in #197, but the signal it
produced stopped here.
The returned array is the RESOLVER's statement list, which is longer than the
top-level segmentation: a do={…} body's statements are flattened in after
their parent (matching what IL does to them), so a body statement's span is
CONTAINED by its parent's rather than following it. Read the spans; do not
pair this array with segmentStatements by index.
Verb/menu split of every statement in source order, tracking the persistent menu context via the shipped Q4 resolver (
resolveStatements).This walker was pulled from the Q6 PR (#193) because it fabricated on the Q14 C3b cascade: after an upstream defect destroyed the document context, a following relative statement headed by a known CRUD verb still resolved confidently against the stale value. It returns unchanged in shape, because the fix belonged in the resolver, not here —
resolveStatementsnow degrades exactly the context-DEPENDENT statements tounresolvedwhen the context is lost, while leaving a context-NEUTRAL dynamic head ($x) alone. So the single rule below — a statement the resolver refused staysunknownhere — fails closed on the cascade without a local taint that would over-fire on benign statements. The distinction is only visible to the resolver; this module sees flattened statements.What the walker does add is DocumentVerbSplit.contextCertain and DocumentVerbSplit.span: the resolver's per-statement certainty and location, carried through instead of dropped. The certainty was the last of #192's three bullets — the cascade FIX shipped in #197, but the signal it produced stopped here.
The returned array is the RESOLVER's statement list, which is longer than the top-level segmentation: a
do={…}body's statements are flattened in after their parent (matching what IL does to them), so a body statement's span is CONTAINED by its parent's rather than following it. Read the spans; do not pair this array withsegmentStatementsby index.