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]ackstill exists in bothlogin.stxandAuthGate.stx;tests/unit/mobile-e2e-copy.test.tspasses. - Not the browser. At 375×812 in a desktop browser against the QA stack, clicking that same header link navigates to
/loginand the title becomesLog 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.