Onset Production Readiness Checklist¶
Use this checklist before each production release.
1) Security & Secrets¶
- [ ]
supabase/.envis not committed (onlysupabase/.env.exampletracked). - [x] Supabase Edge secrets are set in project (verified 2026-04-28):
ADMIN_DASHBOARD_SECRETANTHROPIC_API_KEYONSET_API_URLONSET_API_ANON_KEYSUPABASE_SERVICE_ROLE_KEY(auto-injected;ONSET_SERVICE_ROLE_JWTaccepted as override)- Apple Sign In (consumed by
apple-linkanddelete-account):APPLE_TEAM_ID—A5TF9D2CT7APPLE_KEY_ID—RV26UG9967APPLE_SERVICES_ID—com.last1enterprises.onset.signinAPPLE_PRIVATE_KEY— contents ofAuthKey_RV26UG9967.p8- Smoke-tested against
https://appleid.apple.com/auth/token→ returnedinvalid_grant, confirming Team / Key / Services ID + JWT signature all validate. Apple-side configuration verified on the matching App ID, Key, and Services ID in the Developer portal.
- [ ] iOS build settings use production keys (no placeholders in Release config).
- [ ] Certificate pinning value is validated for current backend certificate chain.
2) CI / Release Gate¶
- [ ]
Release Gateworkflow passes onmain. - [ ]
python3 scripts/production_checks.pypasses locally. - [ ]
xcodebuild -scheme Onset -destination 'generic/platform=iOS Simulator' buildpasses. - [ ]
python3 scripts/supabase-smoke.py --project-ref <ref>passes.
3) Database / Functions¶
- [x]
supabase db pushapplied with no pending migrations (last verified 2026-04-28; latest applied migration20260429014227_advisor_initplan_jwt_wrap). - [x] Migration ledger drift reconciled — 4 phantom remote entries from cross-repo dashboard SQL pushes (
20260427231526,20260427232244,20260427232855,20260427233230) markedrevertedso the Onset repo is source of truth. - [x] Deployed functions (verified ACTIVE 2026-04-28):
generate-protocoldaily-insightclient-eventadmin-dashboardparse-lab(v11 — abuse controls + per-user rate limits)lab-intelligence(v1)apple-link(v2 — Apple OAuth code exchange for SIWA refresh tokens)delete-account(v2 — App Store 5.1.1(v) in-app deletion with Apple revoke-on-deletion)- [x]
supabase/config.tomlkeeps: [functions.daily-insight] verify_jwt = false[functions.client-event] verify_jwt = false[functions.admin-dashboard] verify_jwt = false[functions.parse-lab] verify_jwt = false(auth validated inside the function)[functions.delete-account] verify_jwt = false(auth validated inside the function)- [ ]
get_admin_dashboard_metricsreturns product event fields: product_events_24hproduct_events_by_name_24h- [x] Database advisor pass run (last 2026-04-28): 0 errors, 13 warnings remaining. All warnings introduced by the 2026-04-28 clinic + Apple migration round have been resolved (
20260429014013_clinic_apple_advisor_fixes+20260429014227_advisor_initplan_jwt_wrap). Remaining warnings are pre-existing (auth_rls_initplanonprotocol_generations/ai_insights/product_events/scan_logs,multiple_permissive_policiesby design, intentional SECURITY DEFINER onvalidate_clinic_code).
4) Product / Billing QA¶
- [ ] Free and Pro flows verified on real device + simulator.
- [ ] RevenueCat entitlement
prois active after purchase and restore. - [ ] Paywall shown from all entry points (
Today,Insights, onboarding, mode lock). - [ ] Failure fallback UX verified:
- daily insight unavailable
- session refresh path
- Supabase temporarily unavailable
5) Compliance & Trust¶
- [ ] App Store privacy labels and public privacy policy match actual behavior (cloud AI + event telemetry).
- [ ] In-app disclaimers remain evidence-first and non-diagnostic.
- [ ] Female cycle-aware copy does not overclaim prediction precision.
6) Go / No-Go¶
- [ ] Run
./scripts/release-readiness.sh(or equivalent CI checks) and archive output. - [ ] If any blocker exists, do not release; follow
docs/ROLLBACK_RUNBOOK.mdfor remediation.