What to build
The query-sweep and private-AX snapshot backends each reimplement the option filters (compact, interactiveOnly, scope, viewport visibility) with drift: on the same production login screen the private backend's interactive filter admitted 6 nodes where the query sweep admitted 16, and historically the query tier silently flipped interactiveOnly:false while the daemon scope-filtered a second time.
Extract the option predicates into one shared module applied to both flat-shaped backends (a natural stage of the snapshot capture plan). Explicitly out of scope: the recursive tree walk's visibility logic (scroll-hidden hints, occlusion, hidden-content anchors) is traversal-coupled and stays where it is — moving it would be a rewrite, not a deepening.
Acceptance criteria
Blocked by
Landing of refactor/ios-snapshot-capture-plan (stacked on #758).
What to build
The query-sweep and private-AX snapshot backends each reimplement the option filters (compact, interactiveOnly, scope, viewport visibility) with drift: on the same production login screen the private backend's interactive filter admitted 6 nodes where the query sweep admitted 16, and historically the query tier silently flipped
interactiveOnly:falsewhile the daemon scope-filtered a second time.Extract the option predicates into one shared module applied to both flat-shaped backends (a natural stage of the snapshot capture plan). Explicitly out of scope: the recursive tree walk's visibility logic (scroll-hidden hints, occlusion, hidden-content anchors) is traversal-coupled and stays where it is — moving it would be a rewrite, not a deepening.
Acceptance criteria
flatSnapshotNodeandappendPrivateAXNodeboth consume it.Blocked by
Landing of
refactor/ios-snapshot-capture-plan(stacked on #758).