Part of #277
The JS drain uses collectorDrainExpression(forceAnchor) so a
freshly injected collector's async anchor is not lost. Python's drain never forces
an anchor, so a navigation destination's DOM can be missed entirely. Scope shrinks
once A6 lands, because the preload removes most of the race; keep this as the
narrow backstop the JS side kept.
Acceptance criteria
The post-navigation and teardown drains force a full-DOM
anchor. A short-lived destination page still anchors. Regression test over the
pure drain payload handling.
Size: M. Depends on A6.
Part of #277
The JS drain uses
collectorDrainExpression(forceAnchor)so afreshly injected collector's async anchor is not lost. Python's drain never forces
an anchor, so a navigation destination's DOM can be missed entirely. Scope shrinks
once A6 lands, because the preload removes most of the race; keep this as the
narrow backstop the JS side kept.
Acceptance criteria
The post-navigation and teardown drains force a full-DOM
anchor. A short-lived destination page still anchors. Regression test over the
pure drain payload handling.
Size: M. Depends on A6.