1 · Clean deployment
Build in GitHub Actions
Use a clean checkout, pinned Bun version, and frozen lockfile. Local laptop deploys become an explicit emergency path rather than the normal release mechanism.
2 · One candidate
Coordinate affected components
Player, dashboard, landing, and Convex changes deploy from the same monorepo SHA, in a defined order, so frontend/backend versions cannot drift silently.
3 · Controlled promotion
Production accepts only staged SHA X
A manual “Promote to production” action receives the successful staging candidate—not an arbitrary local checkout or whatever staging happens to show later.
4 · Observable
Expose release identity
Record the SHA for every deployed component. A small version endpoint or deployment summary makes mismatches visible without Cloudflare and Git archaeology.
5 · Serialized
Prevent deploy races
Only one staging or production deployment runs at a time. New merges create new candidates instead of overwriting the meaning of an existing approval.
6 · Tested
Add a small smoke-test set
Verify frontend builds, app availability, authentication handshake, one known tangle flow, component version alignment, and key landing behavior on Chromium and WebKit.