Skip to content

Production state

What is actually live, per surface, right now. Derived from targets[] and builds[] across every release, so it cannot drift from the records it summarises.

This page is not decoration: check:release parses the build numbers below and uses them for two safety rules — the compatibility floor and the kill-switch interlock. Keep the table format intact.

Live now

SurfaceLive versionBuildSinceRelease
Supabase Prod
Web PWA (Cloudflare)
Android (Play)
iOS (App Store)

Nothing has shipped through this system yet. 26.0.1 will be the first release recorded here.

Why build numbers may differ across platforms

They will, and it is not a defect. Both stores require a new build number for every resubmission, so if one platform is rejected and the other approved, the numbers desynchronise permanently even when the code is byte-identical.

Release 26.0.1
  B1  android  26000100  commit a1b2c3d  → approved
  B2  ios      26000100  commit a1b2c3d  → rejected
  B3  ios      26000101  commit a1b2c3d  → approved   ← same commit, no functional delta

Users still see 26.0.1 on every surface; only the internal integer differs. The build ledger in each release's 01-change-log.md records the mapping and the reason, and the gate proves a "no functional delta" claim by comparing commit SHAs rather than trusting it.

The compatibility floor

min_live_app_build = min(build) across live store platforms

Computed from the table above, using the oldest still-supported build — a staged rollout means the previous build is still live. Any contracting change (dropping a column, function or Edge Function; narrowing a type; changing a response shape) must declare requires_min_app_build, and check:release fails if it exceeds the floor.

This is the enforceable form of CLAUDE.md's "multiple app versions are live simultaneously, so expand-contract is structural". It is what stops a later release removing something a store-stranded surface still depends on.

Kill-switch interlock

app_release_policy is per platform, which is exactly what makes divergence survivable — and also what makes one catastrophic mistake possible:

Never raise a platform's minimum above its live build

If iOS is stranded on 26000000 and its min_supported_version_code is set to 26000100, every iOS user is blocked with no update available to them. check:release cross-checks any min_supported_version_code change against this table and refuses it.

Open divergences

A surface not on the current release's version, with an owner and the release that will close it. An open divergence with no target release is how "iOS is a bit behind" quietly becomes permanent.

SurfaceLiveExpectedAgeOwnerCloses in