Production Checklist
Use this checklist before deploying to production or after major infrastructure changes.
Environment Variables
-
NEXT_PUBLIC_SUPABASE_URLset to production Supabase URL -
NEXT_PUBLIC_SUPABASE_ANON_KEYset to production anon key -
SUPABASE_SERVICE_ROLE_KEYset to production service role key -
PLATFORM_ADMIN_EMAILSconfigured with at least 2 admin emails -
UPSTASH_REDIS_REST_URLandUPSTASH_REDIS_REST_TOKENconfigured -
TEMPORAL_ADDRESSpointing to Temporal Cloud (not localhost) -
TEMPORAL_NAMESPACEset to production namespace -
TEMPORAL_API_KEYset for Temporal Cloud authentication -
AWS_REGION,AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEYconfigured -
BRAKET_S3_BUCKETandBRAKET_S3_PREFIXset -
RESEND_API_KEYconfigured with production API key -
RESEND_FROM_EMAILset to verified production domain (notresend.dev) -
NEXT_PUBLIC_APP_URLset to production URL (e.g.,https://app.marqov.ai) -
WORKER_URLpointing to production worker endpoint -
PLAYGROUND_API_KEYset
Database
- All migrations applied through migration 059
- RLS policies verified on all tables
- Backends table seeded with production backends and pricing
-
handle_new_user()trigger active onauth.users -
update_updated_at_column()triggers active on all tables withupdated_at - Cost tracking RPC functions deployed (
get_team_spend_by_provider,get_team_spend_by_backend,get_team_daily_spend,get_team_total_spend) -
upsert_team_secretfunction deployed for encrypted secret storage -
validate_invitation_codefunction deployed
Worker
- Docker image built with
--platform linux/amd64 - Image pushed to ECR:
123456789012.dkr.ecr.us-east-1.amazonaws.com/marqov/platform-worker - ECS service
marqov-workerin clustermarqov-productionupdated - Health check passing on
GET /health(port 8080) - Worker successfully polling Supabase for pending jobs
- Worker connected to Temporal Cloud
Temporal
- Temporal Cloud namespace created and accessible
- Worker registered on
marqov-workflowstask queue - Workflow execution verified (submit a test job with
execution_mode: "temporal") - Temporal UI accessible for debugging
Security
- CORS headers configured for production domain only
- CSP headers active (see
buildCsp()insrc/proxy.ts) -
unsafe-evalscoped to/runroute only (for Emscripten WASM) -
wasm-evalenabled for all routes - COOP/COEP headers set for SharedArrayBuffer support
- Rate limiting operational on all write endpoints
- Team suspension guard active on write endpoints
- Script upload validation (AST parsing) functional
- Requirements validation blocking dangerous packages
- Invitation code system functional
- Secret values encrypted at rest in database
Monitoring
- Sentry configured for platform (Next.js) errors
- Sentry configured for worker (Python) errors
- Source maps uploaded to Sentry
- Structured logging active (request IDs, user IDs, team IDs)
- Budget exceeded events logged
- Rate limit events logged
Cost Controls
- Per-job cost limit: $100
- Per-suite cost limit: $500
- Default daily team budget: $100
- Default monthly team budget: $1,000
- Team daily quota: 100 jobs/day
- Budget check active before job creation
- Cost calculation using database pricing (
calculateJobCost)
Browser Simulator
-
quantum-circuitadapter loading correctly -
qulacs-wasmadapter loading correctly (non-Safari) - Safari fallback to
quantum-circuitworking - COEP
credentiallessheader not breaking Sentry - Simulation telemetry recording to
simulation_eventstable - Qubit limits enforced (soft warning 17-20, hard block 21+)
Verification
- Submit a job via API and verify it completes
- Submit a playground run and verify results
- Create a team invitation and verify email delivery
- Create and seal a capsule
- Verify budget check blocks over-budget jobs (402 response)
- Verify rate limiting returns 429 with Retry-After header
- Verify suspended team cannot create jobs (403 response)
Last updated on