Conversation
🦋 Changeset detectedLatest commit: 5253fee 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 |
The skill builds the fixture as a Debug dev client, leases a lane simulator or emulator, serves packages/expo through a watch build and Metro, and runs golden specs for the native AuthView, the native profile, the custom useSignIn and useSignUp flows, the token cache, and native-to-JS sign-out. src/core, src/platform, and specs/fixtures.ts are shared byte for byte with clerk-ios and clerk-android. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
It keeps ReactNativeJS lines in app.log, where the Expo host logs its verify state. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rom clerk-ios 69c1d6a2 The new core starts the host runtime on up and run, launches dev clients through am start on Android, and ORs the React Native log subsystem into the iOS app.log filter. The Android lane layer comes from clerk-android 43a319c4. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
mikepitre
force-pushed
the
mike/expo-verify-skill
branch
from
October 3, 2026 08:27
65e54c1 to
fe47a59
Compare
… the iOS strong-password sheet in sign-up specs The Android lane layer now comes from clerk-android 1811e589. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…v menu out of the way An Android build no longer stops another lane's Metro while the watch build keeps packages/expo/dist current. The Android runtime marks the dev menu onboarding finished, which a -read-only emulator forgets on every boot. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…Expo logs land Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
It binds the agent-device session after an Android dev-client start and reports platform-scoped specs as skipped on the other platform. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… Metro before the first launch The runtime hook now fetches the dev client's bundle URL before every launch. It waits until Metro reports a revision that includes the dist files changed since the last launch, and rewrites them when Metro's file watcher missed the write. up bundles once so the first launch after an install never waits on a cold Metro. The watch catch-up check counts only the files tsdown builds, a stale @clerk/expo-biometrics dist is rebuilt, and the native-input key covers the sibling package.json files and the fixture's pnpm-workspace.yaml. iOS app.log now keeps the fixture process's own lines. The Android lane layer comes from clerk-android 34a52426. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d when up fails The freshness gate now fingerprints the content of every bundled dist file of @clerk/expo and its workspace dependencies, and waits for a new Metro revision only when content the bundle includes changed. An identical rewrite no longer wedges a run, and a write that lands during the fetch is caught by fingerprinting before and after it. A missed watcher event is nudged with utimes instead of a rewrite. Stale workspace dependencies are rebuilt with this worktree's Metro and watch build stopped. The runtime hook stops what it started when it fails, retries transient manifest and bundle errors with backoff, fails at once on a bundling error, and runs Metro with EXPO_OFFLINE so the Expo CLI does not call expo.dev through the system proxy. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
mikepitre
marked this pull request as draft
October 3, 2026 10:58
The skill now sits at the repo root as verify-clerk-expo, where pstack's create-verification-skill and maintain-verification-skill expect it, and AGENTS.md points every agent at it. host.ts resolves the repo root from the new depth, the @clerk/expo vitest config no longer needs an exclude, and core comes from clerk-ios 84099924. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…skill for Claude Code .claude/skills/verify-clerk-expo is a committed symlink to the one real copy in .cursor/skills/verify-clerk-expo, so Claude Code and Cursor read the same files. The docs call the CLI by its path from the repo root. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tAdapter.cli
Core now prints control-clerk-expo's path in usage, fix, and next text.
host.ts writes the {cli} token in its own messages.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Its fix text now names this skill's CLI. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The skill's files now live in .claude/skills/verify-clerk-expo. The CLI path and every doc follow. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…sor reads it Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…inst the content it was first seen with up and run now refuse with NOT_READY when a workspace dependency outside @clerk/expo and its Expo-module siblings has source newer than its dist, instead of rebuilding it. The freshness gate records the content each Metro revision was first seen with, so it never confirms a revision that lags a newer edit, restarts a Metro whose first bundle cannot be dated, waits out a 500 while dist is being rewritten, and re-lists the outputs on every poll. Metro and watch logs append instead of truncating. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…fter one build step The refusal names the build that covers every dependency of @clerk/expo, and the docs say the gate then waits until Metro serves the rebuilt code. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ing error settle before failing A dependency counts as stale only when its source content differs from the content its dist was last seen built from, so a touch that changes nothing no longer refuses or rebuilds. Builds the CLI asks for use --force, so they rewrite dist even on a turbo cache hit. A Metro 500 now has to persist for 3 seconds over unchanged outputs before the gate fails. The gate fingerprints dist before it restarts Metro. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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
Adds
verify-clerk-expo, a verification skill for@clerk/expoat.claude/skills/verify-clerk-expo/. An agent changingpackages/expocan use it to prove the change on a real iOS simulator or Android emulator against a real Clerk dev instance, and attach the video to the PR. It builds on theexpo-nativehost from #10052, and has the same layout and verbs as the clerk-ios and clerk-android verification skills.Any agent finds it from the new
Verifying changessection inAGENTS.md..cursor/skills/verify-clerk-expois a committed relative symlink to the same directory for Cursor; there is one copy of the files. The CLI is.claude/skills/verify-clerk-expo/bin/control-clerk-expo, and it runs from any directory. The skill is namedverify-clerk-expo, notverify, so it leaves Claude Code's built-in/verifyalone.What an agent gets:
control-clerk-expo up --platform ios|androidbuilds the fixture as a Debug dev client, leases a lane device, and installs the app. It also startstsdown --watchinpackages/expoand anexpo starton the lane's own Metro port. iOS lanes use 8082 to 8085 and Android lanes use 8086 and 8087, so lanes never share a port.packages/expo/iosorandroid,app.plugin.js,src/specs/,expo-module.config.json,package.json, the native code andpackage.jsonofexpo-google-signinandexpo-biometrics, and the fixture's app config,pnpm-workspace.yaml, and local module. A change underpackages/expo/srcreuses the dev client and reaches the app on the next launch through the watch build and Metro. A native change rebuilds it.@clerk/expoand its Expo-module siblings (expo-biometrics,expo-google-signin,expo-passkeys) by itself. Changes to its other workspace dependencies (@clerk/clerk-js,@clerk/shared,@clerk/react) are verified after one build step the developer runs: when any of them, or a workspace package it bundles, has source newer than itsdist,upandrunrefuse withNOT_READYbefore anything launches and printpnpm turbo build --filter=@clerk/expo^....runchecks that the app will load current JS. Stale Expo-module siblings are rebuilt with Metro stopped. The@clerk/expowatch build must have caught up and settled. Thenrunfingerprints the content of every bundleddistfile of@clerk/expoand its workspace dependencies, fetches the dev client's bundle from Metro, and fingerprints again. Each Metro revision is remembered with the content it was first seen with, so a revision that lags a newer edit is never confirmed, and a Metro whose first bundle cannot be dated against the currentdistis restarted. Two matching reads are required. A rewrite with identical content waits for nothing. A 500 whiledistis being rewritten is retried; a bundling error fails once the outputs have settled. When Metro's watcher misses a write,runtouches the files after 5 seconds. If Metro never catches up,runfails withNOT_READYand names the Metro log, instead of running specs against old code.upbundles once before it reports ready, and a runtime step that fails stops the Metro and watch build that call started. Metro runs withEXPO_OFFLINE=1, because the Expo CLI's calls to expo.dev went through this Mac's HTTPS proxy and timed out.control-clerk-expo run <feature>runs the golden specs for that feature with video, screenshots, and everyverify.statethe host reported. The features arenative-auth-view,user-button-and-profile,custom-flow-sign-in,custom-flow-sign-up,token-cache-persistence, andnative-js-sync.+clerk_testusers. Therequest-codespecs stop at the code screen. Thecompletespecs type the published test code and are taggedform-entry, so a runtime that must not type codes can pass--skip form-entry.control-clerk-expo downreleases the devices, stops Metro and the watch build, and deletes the users the run created. It keeps the evidence.known-bugproves a defect that is not fixed yet and is skipped unless--include known-bugis passed. The inline AuthView dismiss test carries it today: on iOS, the close button of an inline dismissibleAuthViewdoes not fireonDismiss.The
completespecs were authored here but not run by this PR's author, whose agent runtime does not type sign-in codes into an app that talks to a hosted Clerk instance. Every auth flow was proven up to its code screen with--skip form-entry, and thecompletespecs are left for CI or a runtime that allows form entry.src/core/,src/platform/ios/, andspecs/fixtures.tsare byte-identical copies from clerk/clerk-ios#624.src/platform/android/is byte-identical to the clerk-android skill in clerk/clerk-android#1042.src/host.ts,specs/native.ts, the golden specs, andfeatures/are specific to Expo. The skill's own.gitignorecovers its.verify/state and evidence and itsspecs/explored/, so the root.gitignoreis unchanged..prettierignoreskips the skill's.tsfiles, because the shared copies keep the clerk-ios formatting. Markdown and JSON in the skill still go through Prettier. The skill sits outside every workspace package, so root lint, root format, and@clerk/expo's tests never see it..claude/skills/README.mdsays this skill is agent-neutral and that Cursor reads it through the symlink.Android specs find native views by text, because the clerk-android release that
@clerk/expopins has no test tags yet. iOS specs use theclerk.*accessibility identifiers. On Android the runtime also marks the expo-dev-menu onboarding finished, because a-read-onlyemulator forgets it on every boot. On iOS,app.logkeeps the fixture process's own native log lines; JS console lines from a Debug dev client go to Metro, and the skill points there.test/freshness.test.tscovers the gate's decisions and drives its loop with a fake Metro: a lagging revision after a second edit, a transient 500 whiledistrefills, a settled 500, a Metro restart, the touch for a missed watcher event, and the scope split. No live run has needed the touch yet. Metro and watch logs append across restarts; copying each run's slice of the Metro log into its run directory would need a hook in the shared core, so iOS JS log lines are read from.verify/runtime/byrunId.down --platform <p>releases only that platform's lane but stops the worktree's whole runtime, because core's process ledger entries don't record a platform. The skill documents this. Recording the platform on those entries is a follow-up for the shared core in clerk/clerk-ios#624, which every repo copies.Checklist
pnpm testruns as expected.pnpm buildruns as expected.Type of change
🤖 Generated with Claude Code