Repository navigation
test(expo): send uncommitted changes to a borrowed device and start it from a kept native build - #10230
Closed
mikepitre wants to merge 7 commits into
Closed
test(expo): send uncommitted changes to a borrowed device and start it from a kept native build#10230mikepitre wants to merge 7 commits into
mikepitre wants to merge 7 commits into
Conversation
…-ios Copy the shared files from clerk/clerk-ios main (1ac144cb8): a remote run sends the uncommitted changes to the build inputs as a patch, the session applies it over a clean checkout and builds, and attach refuses a run on such a build. The same copy brings three fixes from a cloud agent's cold run: the fallback screenshot of a borrowed device stays out of the checkout, attach fills an empty pair of evidence markers, and doctor checks that gh can use the GraphQL API. The Expo session device names the paths a patch may change (the standalone build inputs, which the CLI sends), and the session workflow passes the default branch, on which the agent refuses every patch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…changes a native input A remote session builds with a key for the native project. The key hashed the native inputs at HEAD, so after the session applied uncommitted changes to a native input it kept the old project and skipped expo prebuild. The key now hashes the files as they are on disk, tracked or not, the same way the native fingerprint reads them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the commit A session built the test app natively on every up, about 21 minutes on iOS. Before its agent starts, the session now names the native build by the fingerprint, takes the newest artifact a run of the same branch kept under that name, and points VERIFY_NATIVE_CACHE at it. The build then exports the JS and embeds it in that app, and runs no expo prebuild, xcodebuild or Gradle. With no kept build it builds natively as before. Uncommitted JS changes sent to the session take the same path; a change to a native input changes the fingerprint and builds natively. The fetch moves into bin/fetch-native-build.sh so the device suite and the session take a kept build by one rule. A session stores no native build: the artifacts of this repository are public, and the shared contract test allows a session one upload, the evidence. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…pt native builds Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
🦋 Changeset detectedLatest commit: 1f33517 The changes in this PR will be included in the next version bump. This PR includes changesets to release 0 packagesWhen changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Contributor
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: true
Comment |
mikepitre
added this pull request to stack #10100
October 14, 2026 15:38
…l, not after it The previous commit installed the workspace and the fixture before the session agent started, to learn the fingerprint. On a macos-26 runner that install took 631 seconds in the device suite, and the tunnel step that runs after it must come up within the 20 minutes up waits. The build cannot fetch for itself, because the agent removes GITHUB_TOKEN before it runs build commands that a patch may change. The session now downloads the native builds of its platform that the newest device suite runs of the same branch kept, at most three, each under the fingerprint in its name, and starts the agent at once. The build uses one only when its own fingerprint matches. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t it saves Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@clerk/astro
@clerk/backend
@clerk/chrome-extension
@clerk/clerk-js
@clerk/electron
@clerk/electron-passkeys
@clerk/eslint-plugin
@clerk/expo
@clerk/expo-biometrics
@clerk/expo-google-signin
@clerk/expo-native-components
@clerk/expo-passkeys
@clerk/express
@clerk/fastify
@clerk/hono
@clerk/localizations
@clerk/mosaic
@clerk/nextjs
@clerk/nuxt
@clerk/react
@clerk/react-router
@clerk/shared
@clerk/tanstack-react-start
@clerk/testing
@clerk/ui
@clerk/upgrade
@clerk/vue
commit: |
The test committed with the machine's git identity, which a Linux CI runner does not have, so the commit failed there. It now passes the author on the command line, as the other tests in this package do. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 14, 2026
Draft
Draft
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
This PR sits on #10228 and must merge after it. It brings the Expo borrowed device level with four clerk-ios changes: clerk/clerk-ios#695, #698, #700 and #701.
An agent with no Mac or no emulator borrows a device on a GitHub Actions runner. Before this PR, every change cost a commit, a push and a session build, and every session built the test app natively, about 21 minutes on iOS. After it:
upandrunsend uncommitted changes to the app sources as one patch. The session applies it over a clean checkout of the commit and builds. A run on such a build is not tied to a commit, soattachrefuses it.Verify end-to-end testsruns of the same branch kept, each named by its native fingerprint. When one matches the tree,uponly exports the JS and puts it in that app. A JS-only patch does the same. A patch to a native input changes the fingerprint, and the session builds natively.attachfills an empty pair of evidence markers, anddoctorchecks thatghcan use the GraphQL API.The commits are separate, so the stack can be regrouped. The first copies the shared files byte for byte from clerk-ios
mainand adds the Expo glue. The session device names the paths a patch may change, and the workflow passes the default branch, on which the session refuses every patch. The second fixes a stale build that the patch would expose. The session's native project was keyed on the native inputs at HEAD, so a patch to a native input kept the old project. The third and fifth are the kept native build. The fifth replaces the third's install before the agent, which took too long on a Mac runner, with a download by name. The fourth and sixth are the skill text, and the last gives a test a git identity.What is different from clerk-ios, and why:
main. Expo already stores native builds as artifacts from its device suite, so the session reuses that store and its rule, which takes a build only from a run of the same branch of this repository. The fetch moved intobin/fetch-native-build.shso both workflows apply the same rule.expo prebuild --cleanremoves the iOS build directory anyway. A patch to a native input therefore builds natively from nothing.Measured on three sessions of this branch, one run each. An iOS
upthat took the kept native build was ready in 1069 s; the native build it skipped took 676 s in the same session. Its limiter is nowpnpm installandturbo buildon a cold Mac, 580 s. An Androidupwas ready in 178 s with the kept build and in 672 s without one. A JS-only uncommitted change reached a spec in 64 s on iOS and 28 s on Android. An uncommitted change to a native Swift file built natively in 716 s on iOS.attachrefused the patched run withEVIDENCE_UNSAFE. The device suite passed on both platforms at the head.Not proven: a patch that does not apply, on a real runner (unit tests only); an Android session after a native patch. A kept build is found only while no Expo package with native code has been published since the device suite run, because the fixture resolves
expoby a range with no lockfile.The changeset is empty, as in the other PRs of the stack.
Checklist
pnpm testruns as expected.pnpm buildruns as expected.Type of change
🤖 Generated with Claude Code