From 4a45c23b7d741c89bb52b7f014c9dfd6ab25adc2 Mon Sep 17 00:00:00 2001 From: bk-agent-01 Date: Fri, 23 Oct 2026 06:36:26 +0000 Subject: [PATCH 1/3] ci: remove queued native mobile static analysis job --- .github/workflows/ci.yml | 55 +++--------------------- docs/operations/android-notifications.md | 4 +- 2 files changed, 10 insertions(+), 49 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d0cb88c2e9798..2b31de38d203a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,8 +15,8 @@ concurrency: jobs: # Skips jobs a pull request cannot affect: a web change does not run the - # server shards, a server change does not run the mobile tests, and the macOS - # lint (~6.7x a Linux minute) runs only for native mobile sources. + # server shards, and a server change does not run the mobile tests. + # T3-CUSTOM(expbkt3): Native mobile lint is manual; CI needs no macOS runner. # .github/scripts/ci-changes.cjs maps changed files to workspace packages and # their dependents. Pushes to main still run every Linux job. Detection fails # open: if the diff cannot be resolved, everything runs. @@ -33,7 +33,6 @@ jobs: test_server: ${{ steps.detect.outputs.test_server }} rust: ${{ steps.detect.outputs.rust }} release_smoke: ${{ steps.detect.outputs.release_smoke }} - mobile_native: ${{ steps.detect.outputs.mobile_native }} steps: # Only the package manifests the script reads to build the dependency graph. # Depth 2 brings the base commit the change is diffed against. @@ -464,36 +463,6 @@ jobs: cargo test --locked --manifest-path "native/$crate/Cargo.toml" done - mobile_native_static_analysis: - name: Mobile Native Static Analysis - needs: changes - if: ${{ !cancelled() && needs.changes.outputs.mobile_native != 'false' }} - runs-on: blacksmith-6vcpu-macos-26 - timeout-minutes: 25 - steps: - - name: Checkout - uses: actions/checkout@v6 - with: - sparse-checkout: | - /* - !/.repos/ - sparse-checkout-cone-mode: false - - - name: Setup Vite+ - uses: voidzero-dev/setup-vp@v1 - with: - node-version-file: package.json - cache: true - run-install: | - args: - - --filter=@t3tools/scripts... - - - name: Install mobile native static analysis tools - run: brew bundle install --file apps/mobile/Brewfile - - - name: Lint mobile native sources - run: vp run lint:mobile - release_smoke: name: Release Smoke needs: changes @@ -524,18 +493,8 @@ jobs: check: name: Check if: ${{ always() }} - needs: - [ - changes, - lint, - build, - test, - test_web, - test_server, - rust, - mobile_native_static_analysis, - release_smoke, - ] + # T3-CUSTOM(expbkt3): Native mobile lint is not a dependency of Check. + needs: [changes, lint, build, test, test_web, test_server, rust, release_smoke] runs-on: ubuntu-24.04 timeout-minutes: 5 steps: @@ -545,10 +504,10 @@ jobs: run: | echo "$RESULTS" | jq -r 'to_entries[] | "\(.key): \(.value.result)"' # A job may skip only when `changes` said every gate it represents was - # not needed. Gates are keyed by job name, except merged Build and the - # macOS lint. + # not needed. Gates are keyed by job name, except merged Build. + # T3-CUSTOM(expbkt3): The native mobile lint job is removed in this fork. echo "$RESULTS" | jq -e '.changes.outputs as $gates - | {build: ["build", "typecheck"], mobile_native_static_analysis: ["mobile_native"]} as $renamed + | {build: ["build", "typecheck"]} as $renamed | all(to_entries[]; .value.result == "success" or (.value.result == "skipped" diff --git a/docs/operations/android-notifications.md b/docs/operations/android-notifications.md index aa29ef3e1a7b4..097294772b5b7 100644 --- a/docs/operations/android-notifications.md +++ b/docs/operations/android-notifications.md @@ -16,7 +16,9 @@ The native notification tests cover API 24, 26, 33 and 36 (plus API 25 for legac ./gradlew :t3-agent-notifications:testDebugUnitTest :t3-agent-notifications:lintRelease -Pandroid.lint.useK2Uast=false ``` -Robolectric's API 36 runtime requires JDK 21; module compilation still uses Expo's Java 17 toolchain. The existing Mobile Native Static Analysis job separately runs ktlint and detekt. The native fingerprint check marks this change as requiring a new binary; the production workflow cannot deliver it to an older binary by OTA. Settings disable Android notifications if the installed native module is missing required methods. + + +Robolectric's API 36 runtime requires JDK 21; module compilation still uses Expo's Java 17 toolchain. Run `vp run lint:mobile` manually to run ktlint and detekt; CI does not run native mobile static analysis in this fork. The native fingerprint check marks this change as requiring a new binary; the production workflow cannot deliver it to an older binary by OTA. Settings disable Android notifications if the installed native module is missing required methods. The lint command uses the K1 frontend because AGP's K2 frontend crashes while analyzing Worklets 0.10's Gradle Kotlin scripts. This does not disable lint checks. Live Update eligibility must be verified on a device: Robolectric's API 36 image implements older promotion rules that require colorization, while shipped Live Updates require uncolorized notifications. From 60e71816a9562017eff58f38660fefa9b30fb995 Mon Sep 17 00:00:00 2001 From: bk-agent-01 Date: Fri, 23 Oct 2026 07:55:37 +0000 Subject: [PATCH 2/3] fix(ci): preserve patched Expo versions during release smoke --- pnpm-lock.yaml | 2 ++ pnpm-workspace.yaml | 3 +++ 2 files changed, 5 insertions(+) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 195c65694b3cf..cf3563be9060d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -260,6 +260,8 @@ catalogs: overrides: expo-modules-core: 58.0.22 + '@expo/fingerprint': 0.21.5 + expo-network: 58.0.3 '@exodus/bytes>@noble/hashes': 1.8.0 '@react-navigation/core': 7.24.0 dbus-next>usocket: '-' diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 24afc13b72281..6917fb8010529 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -226,6 +226,9 @@ overrides: # Keep on the patched version. A fresh resolution would take a newer release and # fail on the unused patch. Move this with patches/expo-modules-core@*.patch. expo-modules-core: 58.0.22 + # T3-CUSTOM(expbkt3): Keep fresh release installs on the existing patched versions. + "@expo/fingerprint": 0.21.5 + expo-network: 58.0.3 # Keep jsdom's optional peer consistent so Vite+ has one test-runner instance. "@exodus/bytes>@noble/hashes": "1.8.0" # Earlier React Navigation declarations create a circular type alias in TypeScript 7. From 33a38741fc9c5df3f9f0a4ddfef7173ae16fa31f Mon Sep 17 00:00:00 2001 From: bk-agent-01 Date: Fri, 23 Oct 2026 07:58:14 +0000 Subject: [PATCH 3/3] fix(ci): align Expo network lockfile specifier with override --- pnpm-lock.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cf3563be9060d..dd8725d8fb9ba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -681,7 +681,7 @@ importers: specifier: ~58.0.13 version: 58.0.13(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1)(typescript@7.0.2) expo-network: - specifier: ~58.0.3 + specifier: 58.0.3 version: 58.0.3(patch_hash=cd09b6d1744dde4efa081b5619ebcff38877d98f7502a51cab121629dece8237)(expo@58.0.14)(react@19.3.0) expo-notifications: specifier: ~58.1.5