fix(ios): report the alert's own title and surface an unanswered launch confirmation

TH
2h ago
+1171-474

Summary

On iOS 17.5, open --launch-url left SpringBoard's first-deep-link confirmation unanswered and exited 0 with no launchConfirmation.

  1. Runner title read: preferredAlertTitle walked 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.
  2. Silent exits are reported: one rule (applyAttemptReport) maps the final answer attempt to what the settle reports. A seen confirmation returns launchConfirmation: "unanswered" with typed launchConfirmationReason plus 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 earlier accepted), the response carries a typed launchConfirmationProbeFailure step plus a check-with-alert get warning — deliberately no launchConfirmation: the state is unknown, not observed. Proven-failed accepts still fail with launch_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 c7e29d8 passed, 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 get read the localized title. A real accept whose dispatch stayed unconfirmed failed live with launch_confirmation_unanswered. Pre-rebase heads also passed their gates (exactCommit: true) except one stopped only by main's then-broken linux.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