You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
iOS 27.1: back always refuses on the SwiftUI floating toolbar (top-band frame rule rejects the real control; leading fallback taps empty space) #3333
back fails 100% of attempts on the iOS 27.1 Simulator when the app's navigation bar is the iOS 27 SwiftUI floating toolbar (observed on iPhone Duo, com.apple.Preferences General detail page). This makes the iOS Settings replay (test/integration/replays/ios/simulator/01-settings.ad) unable to pass its final step on the 27.1 runtime, and breaks back for any iOS 27 app using the floating bar.
Evidence (live, 2026-10-08, iPhone Duo 4F879835, iOS 27.1)
42/44 local replay attempts (12 cold+warm cycles with --retries 2, plus the first transient-daemon run) failed at step 7 back with in-app back control is not available while the screen provably sat on the General detail page (label=About visible, click General had truly navigated). Direct probe on that page: back failed 12/13 (one succeeded); click "role=button label=BackButton" failed 3/3 with selector_not_found (the control has no label, only identifier=BackButton); click @<ref> on that same button succeeded and navigated.
Mechanism, matching RunnerTests+Navigation.swift tier for tier:
app.navigationBars.buttons is empty — on iOS 27.1 the back control is a _UIButtonBarButton inside the _UIFloatingBarContainerView, not a child of the bar.
topNavigationBackElement finds the identifier match (BackButton hits the back keyword, isHittable=true), but isTopNavigationControlFrame rejects it: window height 678 gives maxY = min(max(678*0.22,96),180) = 149.2, while the control's midY = 194. The 27.1 floating bar sits lower than the classic navigation-bar band.
tapTopLeadingNavigationFallback synthesizes at (width*0.08, height*0.155) = (37.3, 105.1), which is empty window area on this surface — the bar is trailing, not leading.
Visual verification reads unchanged → .unavailable → in-app back control is not available.
CI cannot see this today because the iOS lane runs iPhone 17 Pro / iOS 26.x (isTopNavigationControlFrame passes there: 874-tall window gives maxY=180), and the 27.1 runtime ships only with the iPhone Duo device type, so this is a local-only lane condition (see docs/agents/device-verification.md).
Required behavior
The runner must recognize the iOS 27 floating-bar back control (identifier/label keyword match outside navigationBars) without relying on the classic top-band height limit, or the fallback must aim at a point derived from the matched control rather than a fixed leading slot.
Do not regress the macOS/tvOS branches or the visual-verification refusal path.
Completion
On iPhone Duo / iOS 27.1: back on the Settings General detail page navigates to root (is exists "label=About" false afterwards), and test/integration/replays/ios/simulator/01-settings.ad passes all 7 steps.
A runner XCTest carries the band/fallback decision for the floating-bar frame shape.
Related: #2996 (closed; same container confused occlusion), #2948 (diagnostic run that found this), ADR 0025 (Duo coverage is local-only).
Purpose
backfails 100% of attempts on the iOS 27.1 Simulator when the app's navigation bar is the iOS 27 SwiftUI floating toolbar (observed on iPhone Duo,com.apple.PreferencesGeneral detail page). This makes the iOS Settings replay (test/integration/replays/ios/simulator/01-settings.ad) unable to pass its final step on the 27.1 runtime, and breaksbackfor any iOS 27 app using the floating bar.Evidence (live, 2026-10-08, iPhone Duo 4F879835, iOS 27.1)
42/44 local replay attempts (12 cold+warm cycles with --retries 2, plus the first transient-daemon run) failed at step 7
backwithin-app back control is not availablewhile the screen provably sat on the General detail page (label=Aboutvisible,click Generalhad truly navigated). Direct probe on that page:backfailed 12/13 (one succeeded);click "role=button label=BackButton"failed 3/3 withselector_not_found(the control has no label, onlyidentifier=BackButton);click @<ref>on that same button succeeded and navigated.The page snapshot shows the back control:
{"role":"_UIFloatingBarContainerView","label":"Toolbar","identifier":"Toolbar","rect":{"x":0,"y":0,"width":466,"height":678}}, {"role":"_UIButtonBarButton","identifier":"BackButton","rect":{"x":399,"y":175,"width":38,"height":38},"hittable":true}Runner log for one
backInApp:Mechanism, matching
RunnerTests+Navigation.swifttier for tier:app.navigationBars.buttonsis empty — on iOS 27.1 the back control is a_UIButtonBarButtoninside the_UIFloatingBarContainerView, not a child of the bar.topNavigationBackElementfinds the identifier match (BackButtonhits thebackkeyword,isHittable=true), butisTopNavigationControlFramerejects it: window height 678 givesmaxY = min(max(678*0.22,96),180) = 149.2, while the control'smidY = 194. The 27.1 floating bar sits lower than the classic navigation-bar band.tapTopLeadingNavigationFallbacksynthesizes at(width*0.08, height*0.155) = (37.3, 105.1), which is empty window area on this surface — the bar is trailing, not leading..unavailable→in-app back control is not available.CI cannot see this today because the iOS lane runs iPhone 17 Pro / iOS 26.x (
isTopNavigationControlFramepasses there: 874-tall window givesmaxY=180), and the 27.1 runtime ships only with the iPhone Duo device type, so this is a local-only lane condition (seedocs/agents/device-verification.md).Required behavior
navigationBars) without relying on the classic top-band height limit, or the fallback must aim at a point derived from the matched control rather than a fixed leading slot.InAppBackOutcome, and keep the unknown-vs-unavailable split of fix(ios): use the resolved display for screenshots and visual verification #2728 intact.Completion
backon the Settings General detail page navigates to root (is exists "label=About"false afterwards), andtest/integration/replays/ios/simulator/01-settings.adpasses all 7 steps.Related: #2996 (closed; same container confused occlusion), #2948 (diagnostic run that found this), ADR 0025 (Duo coverage is local-only).