fix(mobile): roll version back to 1.5.185 and drop mobile from changesets - #14564
Conversation
…sets Mobile OTA history is keyed on the packages/mobile/package.json version baked into the JS bundle at build time (see src/app/ota-updates.ts), not on the native version. Changesets bumped this to 1.5.186 on 2026-08-03, but the iOS 1.5.186 production build failed, so every iPhone still runs a 1.5.185 bundle and polls histories/ios/production/1.5.185.json — which has had no new release since 2026-07-28. The production OTA publishes on 2026-08-06 landed on 1.5.186 and reached no iOS devices. Roll the version back to 1.5.185 so production OTA publishes target the binary users actually run, and add @audius/mobile to the changesets ignore list so the release tooling stops moving what is effectively an OTA routing key. Mobile's native versions are independent of this field: Android versionName comes from build.gradle and versionCode from Play's max + 1, iOS build number from app_store_build_number + 1. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|
Dependency limit exceeded — report not shown. This pull request scan exceeded the 10,000-dependency limit applied to this scan, so the results are incomplete and may be inaccurate. To avoid reporting false positives, Socket has not posted a report. Upgrade your plan to raise the dependency limit and get complete reports, or view the partial scan in the dashboard. Socket is always free for open source. If this is a non-commercial open source project, contact us to request a free Team account. |
Gives the root tab screens a frosted header that content scrolls behind — matching the desktop client's `Frosted` surface — and lets the top and bottom chrome get out of the way as you scroll. **In scope:** Feed, Trending, Notifications. **Deliberately not:** Explore (keeps its own search header) and Library (its material top-tab bar is opaque and shared with Profile, so the glass had a visible seam — left exactly as it was). ## How it fits together - **`GlassSurface`** — the shared frosted surface. Real `BlurView` on iOS; on Android a near-opaque tint instead, matching the existing `ProfileNavOverlay` precedent, since Android blur on a surface composited every scroll frame is a real perf risk. - **`GlassChromeContext`** — owns a single `scrollY` shared value. The separator fade, the header translate and the tab bar translate all read from it, so they can't drift out of sync. - **Floating headers** — `headerTransparent`, so screens pad their own scroll content by the *measured* stack height. Measured rather than computed because the safe-area inset varies per device and `OtaUpdateBanner` adds a row conditionally. - **Floating tab bar** — now absolutely positioned. In normal flow the navigator reserved its height, so hiding it only uncovered dead background; content now occupies that space and slides behind the glass. ## `PlayBarChin` → `BottomChin` The rename carries a behaviour change worth reviewing. It previously reserved only `PLAY_BAR_HEIGHT`; with the tab bar out of flow it now covers both bars. Without that, the end of every list would sit behind the tab bar permanently — worst on short lists, which never scroll far enough for the auto-hide to uncover them. This is about the **end of the content being reachable**, not about avoiding overlap mid-scroll: content still passes under the glass while scrolling, which is the point. It also touches three Library files and `FanClubsExploreScreen` — import lines only, no behaviour change there. ## Testing - Verified on iOS simulator (iPhone 17 Pro, light mode): all three screens, neutral and scrolled, header + tab bar hide on scroll-down and return on scroll-up. - `tsc --noEmit` clean, `eslint` clean. - **Not yet verified: Android, and dark mode.** The Android tint fallback and the dark `blurType` branch are both unexercised paths. Dark-mode pass is in progress. ## No changeset, on purpose No SDK surface, and a `'@audius/mobile'` bump moves the OTA release-history routing key — that's what broke production OTA in August (see #14564).⚠️ **Note this ships via OTA, which is currently not reaching production.** `production/1.5.185` (what iPhones poll) hasn't had a release since 2026-07-28. Merging this publishes to `rc` only; it needs #14564 merged **and** a manual production dispatch to reach users. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Problem
Mobile OTA history is keyed on the
packages/mobile/package.jsonversion baked into the JS bundle at build time (src/app/ota-updates.ts), not on the native version. The client fetches:CI publishes with
--binary-version= main's package.json version at dispatch time. So an OTA publish only reaches devices whose shipped store build was compiled from that same package.json version.On 2026-08-03,
Version Packages (#14216)bumped mobile 1.5.185 → 1.5.186. On that run (30851065355) the Android production build uploaded fine butiOS Production Build & Uploadfailed, and no iOS production build has run since — later main pushes only trigger OTA jobs, which are gated onversion_changed.Result:
histories/ios/production/1.5.185.json, whose newest release is from 2026-07-28. No OTA banner since.production/1.5.186.json— orphaned on iOS, live only for Android users on the 1.5.186 Play build.The failure is silent by design: the client converts a 404 or empty history into
releaseHistoryNoUpdatePlaceholderso CodePush doesn't throw. No error, no banner, no signal.Change
packages/mobile/package.jsonback to 1.5.185 so production OTA publishes target the binary users actually run.@audius/mobileto the changesetsignorelist, so the release tooling stops moving what is effectively an OTA routing key (12 mobile changesets are queued on in-flight branches and would re-bump it within days).packages/mobileentry inpackage-lock.json.Why this is safe
versionNamecomes frombuild.gradle(1.1.534),versionCodefrom Play's max + 1; iOS build number fromapp_store_build_number+ 1. For mobile,package.jsonversion is purely an OTA routing key with no store meaning.version_changed=trueand fires both production build jobs, but iOSlane :uploadcallspilot(...)(TestFlight, explicitly "Don't actually distribute"), Android'sbuild_and_uploadno-ops unlessbuildFileVersion > releasedVersion, and both sit behind themobile-production-ios/mobile-production-androidenvironment gates.MIN_APP_VERSIONis not tripped.useUpdateRequiredforces an update screen when package.jsonsemver.ltthe remote value. Default is1.0.0, and iPhones run 1.5.185 bundles today with no forced-update screen, so the live value is already ≤ 1.5.185.changeset statusexits 0 with@audius/mobileabsent from the bump list.maincurrently has only 4 changesets, all@audius/sdk, so nothing needs untangling first.The
## 1.5.186entry inpackages/mobile/CHANGELOG.mdis left in place — those changes really did ship to rc and to Android.Follow-ups (not in this PR)
Version Packagesonce mobile is ignored — changesets throws on any changeset listing both ignored and non-ignored packages. These need the'@audius/mobile': patchline dropped before they merge:ota-version-flag-attribute.md,profile-conditional-contests-tab.md,remove-fingerprintjs.md,rename-chronological-feed-to-latest.md.After merge
mobile-ota-release-productionisworkflow_dispatch-only and does not depend onversion_unchanged, so oncecurrent_versionreads 1.5.185 you can dispatch production OTA directly to unblock the ~3 weeks of undelivered JS fixes. A normal main push first gets you anrcpublish as a canary.🤖 Generated with Claude Code