feat(ios): name an unrecognised dialog when alert finds none
Summary
alert get answered ALERT_NOT_FOUND while a visible dialog was on screen: no alert rule matched its tree. Safari renders its "Open this page in ...?" prompt as SFDialogView, whose placement and copy iOS 27 changed.
When alert get answers its own absence, the runner reads the tree once and names any dialog-like container no rule answers, as error.details.nearMisses (type, identifier, label, buttons), capped at four. The rule is conservative: placed in its host box, not chrome, not near host size, no keyboard or system bar below it, 2-4 actionable descendants that each name themselves, and copy no button of its already says, read only outside actionable subtrees and never a scroll-indicator label. The read starts only while the deadline still has a read's budget left, so a slow refusal stays ALERT_NOT_FOUND rather than a main-thread timeout. Only alert get pays for the read.
Validation
pnpm check:affected --run --head a2b59dbac7 passed. 33 host Swift tests pass, and each guard test fails when its rule is removed — two cells with subtitles give no near miss, and the scroll-indicator label is refused in every shape it arrives in. Corpus: 6 fixtures in the new one-node-per-line format, 0 near misses with rules on; dropping Safari's rule names SFDialogView alone. Runner unit tests pass on iPhone Duo/27.0, including the read-budget guard.
Live: rules off, alert get names SFDialogView; rules on, it answers the prompt. A promo sheet is named; a suggestions panel and a loaded page report no nearMisses.