Mobile E2E has been red since Chris's 25 Sep rebuild. 01-navigation fails on both platforms at the step that proves a signed-out visitor can get in — the thing a39fa9a6 ("give signed-out users a way to sign in, and test that") was written to guarantee.
[Failed] Native shell navigation (Assertion is false: "Welcome [Bb]ack" is visible)
It is not a slow runner, and not the flow's copy
From the failing run's own step timings (36420991541):
| step |
result |
| launchApp |
24.3 s |
| feed visible |
9.1 s |
| assertNotVisible Menu / Record |
1.4 s each |
| tapOn "^Log in$" |
COMPLETED, 2.9 s |
| wait for "Welcome [Bb]ack" |
FAILED after 31.7 s |
The tap succeeded. The screenshot captured 30 seconds later shows the feed unchanged, with Log in still in the header. The device log shows no crash — the app and the WebView are alive throughout. The view hierarchy at that moment has exactly one element named Log in, the header link at [333,77][374,98], so there is no ambiguity about what was tapped.
What it is not
- Not the assertion.
Welcome [Bb]ack still exists in both login.stx and AuthGate.stx; tests/unit/mobile-e2e-copy.test.ts passes.
- Not the browser. At 375×812 in a desktop browser against the QA stack, clicking that same header link navigates to
/login and the title becomes Log In — Wildloop. No console errors.
- Not the backend commits. It passed on
ac173724. Everything of mine since (012a5f10, 872dcbd8) is the elevation backfill, the scheduler and cloud config — nothing that reaches the frontend bundle.
Between the last green run and now, the frontend changed only in ede87f99, ee9bd40a, 95325716 and 11711421 — feed.stx alone is +546/-165, and the feed is the page the tap happens on.
Lead, unconfirmed
scripts/run-mobile-e2e.ts → validateNativeTabLinks() already asserts that the header's /feed, /notifications and /settings links must do document navigation, because "an SPA fragment swap may leave that page's client module unexecuted". The header's /login link is the one link in that header the validator does not check. mobile-header.stx:40 carries no router opt-out.
I could not confirm this from outside the shell: stx's shouldIntercept() intercepts an internal route only when getContainer() finds a router container, and whether the bundled WebView has one needs a device to answer. So this is a lead, not a diagnosis — worth starting from, not worth shipping on.
Next step
Reproduce with bun run preview:ios and watch what the tap does in the shell. If it is the router, the fix is an opt-out on that link plus /login added to validateNativeTabLinks() so the gap cannot reopen.
Mobile E2E has been red since Chris's 25 Sep rebuild.
01-navigationfails on both platforms at the step that proves a signed-out visitor can get in — the thinga39fa9a6("give signed-out users a way to sign in, and test that") was written to guarantee.It is not a slow runner, and not the flow's copy
From the failing run's own step timings (36420991541):
The tap succeeded. The screenshot captured 30 seconds later shows the feed unchanged, with
Log instill in the header. The device log shows no crash — the app and the WebView are alive throughout. The view hierarchy at that moment has exactly one element namedLog in, the header link at[333,77][374,98], so there is no ambiguity about what was tapped.What it is not
Welcome [Bb]ackstill exists in bothlogin.stxandAuthGate.stx;tests/unit/mobile-e2e-copy.test.tspasses./loginand the title becomesLog In — Wildloop. No console errors.ac173724. Everything of mine since (012a5f10,872dcbd8) is the elevation backfill, the scheduler and cloud config — nothing that reaches the frontend bundle.Between the last green run and now, the frontend changed only in
ede87f99,ee9bd40a,95325716and11711421—feed.stxalone is +546/-165, and the feed is the page the tap happens on.Lead, unconfirmed
scripts/run-mobile-e2e.ts→validateNativeTabLinks()already asserts that the header's/feed,/notificationsand/settingslinks must do document navigation, because "an SPA fragment swap may leave that page's client module unexecuted". The header's/loginlink is the one link in that header the validator does not check.mobile-header.stx:40carries no router opt-out.I could not confirm this from outside the shell: stx's
shouldIntercept()intercepts an internal route only whengetContainer()finds a router container, and whether the bundled WebView has one needs a device to answer. So this is a lead, not a diagnosis — worth starting from, not worth shipping on.Next step
Reproduce with
bun run preview:iosand watch what the tap does in the shell. If it is the router, the fix is an opt-out on that link plus/loginadded tovalidateNativeTabLinks()so the gap cannot reopen.