fix(ios): report the alert's own title and surface an unanswered launch confirmation
TH
2h ago+1171+1171+0123456789012345678901234567890123456789-474-474-012345678901234567890123456789
Summary
On iOS 17.5, open --launch-url left SpringBoard's first-deep-link confirmation unanswered and exited 0 with no launchConfirmation.
- Runner title read:
preferredAlertTitlewalked every descendant of the resolution root, so root-carried host chrome (the Home Screen page readout, labelled "0 pages" on 17.5) became the reported title and the launch-title rule refused it. It now reads the alert's own static texts first, then its own label; the walk stays as fallback. - Silent exits are reported: one rule (
applyAttemptReport) maps the final answer attempt to what the settle reports. A seen confirmation returnslaunchConfirmation: "unanswered"with typedlaunchConfirmationReasonplus a reason-specific warning; the discriminated arms forbid a probe failure beside a seen outcome. When a probe step failed or could not be verified (alert read, accept, or runner — latest attempt wins over an earlieraccepted), the response carries a typedlaunchConfirmationProbeFailurestep plus a check-with-alert getwarning — deliberately nolaunchConfirmation: the state is unknown, not observed. Proven-failed accepts still fail withlaunch_confirmation_unanswered. The read trims the #2905 full walk on the common path but does not close it. CHANGELOG and commands.md document the widened fields.
Part of #3702 — the 17.5 accepted-prompt proof is still owed; the issue stays open.
Validation
- Head
c7e29d8, rebased onto main after #3740/#3741.pnpm check:affected --run --head c7e29d8passed,exactCommit: true. TS suites 147 pass; both Swift alert unit tests (this PR's + #3715's, i.e. the conflict resolution) compile and pass on an iOS 27.0 simulator. - Live at
c7e29d8, fresh iPhone-Duo iOS 27.1 sims + first installs: English first deep link →"accepted", no warning; French-locale first deep link →unanswered+alert-unrecognized+ warning,alert getread the localized title. A real accept whose dispatch stayed unconfirmed failed live withlaunch_confirmation_unanswered. Pre-rebase heads also passed their gates (exactCommit: true) except one stopped only by main's then-brokenlinux.gap(fixed by #3740). - No iOS 17.x runtime is installable or downloadable on this host, so the exact 17.5 proof is owed.
🤖 Generated with Claude Code