TestFlight OTA script must assert the publish worktree is at origin/main HEAD #549

Open
opened 2026-08-31 23:44:48 +00:00 by gambit-admin · 0 comments
Owner

Process gap found during #545: the 2026-08-30 late-night production OTA was published from main@38cbbab (10:19am) — hours AFTER PRs #355/#359/#361/#363/#365 had merged (10:53–22:52) — because the standing main-testflight worktree was not pulled forward before eas update. Result: "fix merged + OTA shipped" was believed true while every phone ran pre-fix code for ~27h, and the #536 fix only actually reached the channel with the next OTA (2026-08-31 18:21Z). This burned two debugging sessions on #545.

eas update bundles the working tree, not a git ref, so nothing catches this today.

Fix: in the testflight script (mobile/rork-recon-card-scanner/expo/package.json), before publishing: fetch origin main and refuse to run unless HEAD equals origin/main and the tree is clean (allow an explicit override flag for deliberate pinned publishes). Also print the commit being published into the eas update --message so the channel records what each update was cut from.

Verification afterward: fetch the channel manifest from u.expo.dev/(projectId) with expo-channel-name / expo-runtime-version / expo-platform headers — its createdAt vs merge times shows what actually shipped.


Filed from a Claude Code session

Process gap found during #545: the 2026-08-30 late-night production OTA was published from main@38cbbab (10:19am) — hours AFTER PRs #355/#359/#361/#363/#365 had merged (10:53–22:52) — because the standing main-testflight worktree was not pulled forward before `eas update`. Result: "fix merged + OTA shipped" was believed true while every phone ran pre-fix code for ~27h, and the #536 fix only actually reached the channel with the next OTA (2026-08-31 18:21Z). This burned two debugging sessions on #545. `eas update` bundles the working tree, not a git ref, so nothing catches this today. Fix: in the `testflight` script (mobile/rork-recon-card-scanner/expo/package.json), before publishing: fetch origin main and refuse to run unless HEAD equals origin/main and the tree is clean (allow an explicit override flag for deliberate pinned publishes). Also print the commit being published into the eas update --message so the channel records what each update was cut from. Verification afterward: fetch the channel manifest from u.expo.dev/(projectId) with expo-channel-name / expo-runtime-version / expo-platform headers — its createdAt vs merge times shows what actually shipped. --- Filed from a Claude Code session
gambit-admin added the bug label 2026-08-31 23:44:48 +00:00
gambit-admin added the 13 · cross-cutting label 2026-09-04 13:36:55 +00:00
Sign in to join this conversation.