Operator checklist
Go-live checklist.
Progress
— / 96
Loading saved checkmarks… · Saved in this browser only
Showing 96 tasks · 0 done in this view · Click column headers to sort
| Done | ||||
|---|---|---|---|---|
| Infrastructure | critical | Open | ||
| Infrastructure | critical | Open | ||
| Infrastructure | critical | Open | ||
| Infrastructure | critical | Open | ||
| Infrastructure | high | Open | ||
| Infrastructure | high | Open | ||
| Infrastructure | high | Open | ||
| Infrastructure | high | Open | ||
| Infrastructure | medium | Open | ||
| Security | critical | Open | ||
| Security | critical | Open | ||
| Security | critical | Open | ||
| Security | critical | Open | ||
| Security | critical | Open | ||
| Security | high | Open | ||
| Security | high | Open | ||
| Security | high | Open | ||
| Security | high | Open | ||
| Security | high | Open | ||
| Security | medium | Open | ||
| Data & persistence | critical | Open | ||
| Data & persistence | critical | Open | ||
| Data & persistence | high | Open | ||
| Data & persistence | high | Open | ||
| Data & persistence | medium | Open | ||
| Payments | critical | Open | ||
| Payments | critical | Open | ||
| Payments | critical | Open | ||
| Payments | critical | Open | ||
| Payments | high | Open | ||
| Payments | high | Open | ||
| Payments | high | Open | ||
| Payments | medium | Open | ||
| Payments | medium | Open | ||
| AI & build pipeline | critical | Open | ||
| AI & build pipeline | critical | Open | ||
| AI & build pipeline | high | Open | ||
| AI & build pipeline | high | Open | ||
| AI & build pipeline | high | Open | ||
| AI & build pipeline | high | Open | ||
| AI & build pipeline | high | Open | ||
| AI & build pipeline | high | Open | ||
| AI & build pipeline | medium | Open | ||
| AI & build pipeline | medium | Open | ||
| Guided product flow | critical | Open | ||
| Guided product flow | critical | Open | ||
| Guided product flow | critical | Open | ||
| Guided product flow | high | Open | ||
| Guided product flow | high | Open | ||
| Guided product flow | high | Open | ||
| Guided product flow | high | Open | ||
| Guided product flow | high | Open | ||
| Guided product flow | high | Open | ||
| Guided product flow | high | Open | ||
| Guided product flow | medium | Open | ||
| Support & ops | high | Open | ||
| Support & ops | high | Open | ||
| Support & ops | high | Open | ||
| Support & ops | high | Open | ||
| Support & ops | high | Open | ||
| Support & ops | medium | Open | ||
| Support & ops | medium | Open | ||
| Support & ops | low | Open | ||
| Legal & marketing | critical | Open | ||
| Legal & marketing | critical | Open | ||
| Legal & marketing | critical | Open | ||
| Legal & marketing | high | Open | ||
| Legal & marketing | high | Open | ||
| Legal & marketing | high | Open | ||
| Legal & marketing | medium | Open | ||
| Legal & marketing | medium | Open | ||
| Quality & CI | high | Open | ||
| Quality & CI | high | Open | ||
| Quality & CI | high | Open | ||
| Quality & CI | high | Open | ||
| Quality & CI | medium | Open | ||
| Quality & CI | medium | Open | ||
| Quality & CI | medium | Open | ||
| Quality & CI | medium | Open | ||
| Quality & CI | medium | Open | ||
| Go-live | critical | Open | ||
| Go-live | critical | Open | ||
| Go-live | critical | Open | ||
| Go-live | high | Open | ||
| Go-live | high | Open | ||
| Go-live | high | Open | ||
| Go-live | medium | Open | ||
| Go-live | medium | Open | ||
| Post-launch | high | Open | ||
| Post-launch | high | Open | ||
| Post-launch | medium | Open | ||
| Post-launch | medium | Open | ||
| Post-launch | medium | Open | ||
| Post-launch | medium | Open | ||
| Post-launch | low | Open | ||
| Post-launch | low | Open |
- criticalInfrastructure
Chromium installed in API build (Playwright)
Build command includes `PLAYWRIGHT_BROWSERS_PATH=0 npx playwright install chromium`. Service env has `PLAYWRIGHT_BROWSERS_PATH=0`.
Verify: Guided live URL capture completes (not stuck on Playwright executable missing).
- criticalInfrastructure
API service deployed on Render (`rewrite-backend-api`)
Production API runs `node dist/cli.js serve` from repo root with Node 20. Auto-deploys from `main`.
Verify: Open your API URL — JSON at `/` shows `name: rewrite-api`.
- criticalInfrastructure
Marketing + guided UI deployed (`rewrite-web`)
Next.js app in `web/` serves meetrewrite.com and talks to the API.
Verify: Homepage loads; guided flow can reach the API (no CORS errors in browser console).
- criticalInfrastructure
`REWRITE_WEB_APP_URL` points at the public site
Stripe Checkout and OAuth return users to `/guided/:id`, not raw API JSON.
Verify: After test checkout, browser lands on meetrewrite.com guided step — not an API error page.
- highInfrastructure
GitHub CI green on `main` before trusting production
`ci.yml` runs tests, Next build, and Playwright guided smoke.
Verify: Latest `main` commit shows green checks in GitHub.
- highInfrastructure
Custom domain on API (e.g. api.meetrewrite.com)
After attaching, set `NEXT_PUBLIC_REWRITE_API_URL` on web to the custom API URL (not the ephemeral `*.onrender.com` slug).
Verify: `GET /health` works on the custom API hostname.
- highInfrastructure
Custom domain on web service (meetrewrite.com)
Attach domain in Render; DNS points to Render; HTTPS cert active.
Verify: Browser shows valid HTTPS at your public marketing URL.
- highInfrastructure
`REWRITE_PUBLIC_BASE_URL` set to public API URL
Used for Stripe fallbacks, GitHub OAuth callback, and native bundle API base hints.
Verify: OAuth redirect and webhook URLs use the intended host.
- mediumInfrastructure
Render service names match `render.yaml`
Name drift can spawn duplicate API services and miswire `NEXT_PUBLIC_REWRITE_API_URL`.
Verify: Dashboard shows `rewrite-backend-api` + `rewrite-web` — not an extra mystery API.
- criticalSecurity
`REWRITE_API_KEYS` set (long random secrets)
Without this, anyone on the internet can hit heavy API routes.
Verify: `GET /health` → `auth.apiKeysRequired: true`. Unauthenticated session create fails in prod.
- criticalSecurity
`REWRITE_ENFORCE_PROD_API_KEYS=true`
Server refuses to boot without API keys in production.
Verify: Set in Render env (also default in `render.yaml`).
- criticalSecurity
`REWRITE_JWT_SECRET` (≥ 32 random chars)
Signs browser sign-in tokens for account-owned sessions.
Verify: `GET /health` → `auth.acceptsUserJwt: true`. Sign-in flow persists across refresh.
- criticalSecurity
No live secrets committed to git
Keys live in Render dashboard / private `.env` only.
Verify: Repo scan + `.gitignore` covers `.env`.
- criticalSecurity
`REWRITE_ALLOW_PAYMENT_STUB=false` in production
Dev shortcut that marks sessions paid without charging must stay off.
Verify: Render env + `render.yaml` both say false.
- highSecurity
Admin access restricted
GitHub JWT + allowlist and/or `REWRITE_ADMIN_PASSWORD` for `/admin` routes.
Verify: Non-admin account gets forbidden on `/admin`.
- highSecurity
`REWRITE_ENCRYPTION_KEY` for stored GitHub tokens
64 hex chars (32 bytes) — recommended when private repo clone is enabled.
Verify: Private repo flows work without passing `gitToken` every request.
- highSecurity
GitHub OAuth app configured
`GITHUB_CLIENT_ID` + `GITHUB_CLIENT_SECRET`; callback URL matches API.
Verify: Sign in with GitHub completes; user row appears in `/admin`.
- highSecurity
Local path scan disabled in production
`REWRITE_ALLOW_LOCAL_PATH_SCAN` must stay unset in prod.
Verify: Arbitrary folder scan routes return disabled in production.
- highSecurity
`REWRITE_SERVER_API_KEY` on web service
One value from API `REWRITE_API_KEYS` — used for investor deck PDF and server-side calls.
Verify: Investor deck PDF download works from `/investor-package`.
- mediumSecurity
Rate limits see real client IP behind Render
`REWRITE_TRUST_PROXY=1` or `RENDER=true` (auto).
Verify: Heavy-route rate limits behave under load balancer.
- criticalData & persistence
Persistent disk on API (`REWRITE_DATA_DIR`)
URL capture PNGs, sim previews, support tickets, and file sessions live on disk — ephemeral temp dirs lose them on restart.
Verify: Disk mounted; env points at mount path. Capture assets still load after redeploy.
- criticalData & persistence
PostgreSQL connected (`REWRITE_DATABASE_URL`)
Sessions, users, and payments survive API restarts.
Verify: `GET /health` → `auth.database: true`. Create session, redeploy, session still there.
- highData & persistence
Postgres backup / restore plan documented
Render offers automatic backups on paid tiers — know how to restore.
Verify: You can answer: where is the DB backup and who can restore it?
- highData & persistence
Support tickets persist across deploys
Ticket JSON under `$REWRITE_DATA_DIR/support-tickets/`.
Verify: Create ticket via `/contact`, redeploy API, ticket still in `/admin` inbox.
- mediumData & persistence
Optional: S3 for sim-preview (multi-instance)
If you scale API horizontally or skip persistent disk for previews.
Verify: `REWRITE_SIM_PREVIEW_S3_BUCKET` set; asset URLs work after instance swap.
- criticalPayments
Stripe live webhook before real charges
Separate live-mode endpoint + `STRIPE_WEBHOOK_SECRET_LIVE` (or single secret if live-only).
Verify: Live Dashboard webhook shows successful deliveries after a real test charge.
- criticalPayments
Flip `REWRITE_STRIPE_MODE=live` only when intentional
Live charges real money. Confirm `/health` mode + no `modeMismatchWarning`.
Verify: `GET /health` → `stripe.mode: live`, `activeKeyIsLive: true`.
- criticalPayments
Stripe test mode end-to-end verified
Deposit checkout → webhook → session unlocks next guided steps.
Verify: Test card completes; payment events appear on `/status` session diagnostics.
- criticalPayments
Stripe test webhook configured
Dashboard → Webhooks → `POST …/api/v1/webhooks/stripe` with signing secret in env.
Verify: `GET /health` → `stripe.webhookSecretsConfigured: true` in test mode.
- highPayments
Deposit + balance flow matches pricing page
25% deposit ($50 floor); balance after approvals. Marketing `/pricing` in sync with `src/estimate.ts`.
Verify: Walk one session: deposit → approve → balance checkout amounts match quote.
- highPayments
Both test + live Stripe keys on host (optional but recommended)
`STRIPE_SECRET_KEY_TEST` + `STRIPE_SECRET_KEY_LIVE` + `REWRITE_STRIPE_MODE`.
Verify: Switch mode without redeploying different key sets.
- highPayments
Refund playbook tested (admin internal refund)
Support inbox can issue partial refunds; Stripe receipt trail intact.
Verify: Dry-run refund on test session; customer email + session state update.
- mediumPayments
Care plan Stripe products (if selling support tiers)
We Care / We REALLY Care / VIP monthly prices wired in `support-packages.ts`.
Verify: Optional add-on at checkout creates subscription in Stripe Dashboard.
- mediumPayments
100% promo codes for comps (investors / friends)
Live mode rejects test cards — use Stripe coupons + promotion codes for free passes.
Verify: Checkout shows promo field; `INVESTOR*` code completes at $0.
- criticalAI & build pipeline
OpenAI API key current (polish + build load-bearing)
All polish tiers default to GPT-5.4. Expired key = hard 401 (no fallback if key present but invalid).
Verify: Free preview polish completes; check API logs for 401s.
- criticalAI & build pipeline
Live URL capture runs real Chromium (not stub)
`REWRITE_URL_CAPTURE` unset or `real` in production — stub is for CI/dev only.
Verify: Capture produces real PNGs from customer live site.
- highAI & build pipeline
Android Compose translation enabled (unless intentionally off)
`REWRITE_COMPOSE_POLISH_ENABLED` — both platforms should match approved SwiftUI.
Verify: Android handoff zip contains polished Compose, not only deterministic fallback.
- highAI & build pipeline
Fallback provider keys (Anthropic / Gemini)
Safety net when primary provider fails — only helps when primary key is missing, not expired.
Verify: At least one backup key set if OpenAI is sole provider.
- highAI & build pipeline
Native integration coverage enforced in prod
`REWRITE_NATIVE_INTEGRATION_COVERAGE_ENFORCED=true` blocks hollow integration Swift.
Verify: Full bundle for session with Stripe/Firebase/etc. includes wired generators.
- highAI & build pipeline
`REWRITE_NATIVE_DIRECT_PREVIEW=true` on API (native Swift/Kotlin pilot)
After repo scan, generates real SwiftUI + Compose via AppSpec (`src/native-direct/`). Guided UI shows Native-direct preview card; CLI: `rewrite local sync --native-direct`. Default off until you flip this flag.
Verify: Repo guided session: scan completes → card shows generating → ready; `GET …/native-direct/project.zip?platform=ios` returns a zip when ready.
- highAI & build pipeline
`REWRITE_LLM_POLISH_ENABLED` intentionally set
Disabling skips AI preview polish — know the tradeoff before launch.
Verify: Preview step produces expected quality for your tier promise.
- highAI & build pipeline
Preflight compile workflow wired (optional hard gate)
GitHub `preflight-build.yml` + PAT + env vars; Step 12 advisory or blocking.
Verify: Preflight card on Step 12 dispatches workflow; status returns to API.
- mediumAI & build pipeline
LLM daily budget cap configured
`REWRITE_LLM_DAILY_BUDGET_USD` prevents runaway spend.
Verify: Budget file path documented; alert if cap hit during busy day.
- mediumAI & build pipeline
Visual fidelity gate policy chosen
`REWRITE_NATIVE_VISUAL_GATE` defaults to **block** at pass floor 80 (Jun 2026). Use `warn` only if Mac fidelity loop is not run for every session.
Verify: Ship-readiness blocks when approved screens lack Simulator proof; `tests/fidelity-gate.test.mjs` green.
- criticalGuided product flow
Handoff zip opens and builds locally
iOS Xcode project + Android Gradle project; README + store guides included.
Verify: Download zip from paid session; `xcodebuild` / `./gradlew assembleDebug` succeed.
- criticalGuided product flow
Per-screen preview approval before full build
Customer must approve looks; compare decisions if guardrail enabled.
Verify: Generate full bundle blocked until approvals + payment gates pass.
- criticalGuided product flow
Full guided smoke path on production API
Scan → capture → inspection → preview → pay (test) → handoff download.
Verify: Run `npm run test:e2e:prod:headed` or manual walkthrough with test Stripe.
- highGuided product flow
Account sign-in owns sessions
Anonymous sessions OK for demo; real customers should sign in so work persists.
Verify: Signed-in user sees session list on `/account`; session survives logout/login.
- highGuided product flow
Both iOS + Android zips deliver after full payment
`?platform=android` handoff; pricing always includes both.
Verify: Same session yields two zips; Android smoke Gradle build passes.
- highGuided product flow
Inspection checklist blocks contract when required
Unresolved rows gate sign & pay; bulk approve path tested.
Verify: Try to sign contract with open checklist — blocked with clear message.
- highGuided product flow
Local truth CLI — Simulator / emulator proof
`rewrite local sync/run` — handoff zip path, or **`--native-direct`** when native-direct preview is enabled (downloads generated Swift/Compose project, no deposit handoff).
Verify: Copy-paste command from guided UI works on Mac with Xcode (iOS) or Android Studio (emulator).
- highGuided product flow
Native-direct pilot smoke (repo path)
Connect repo → scan → free preview step shows Native-direct card → `rewrite local doctor && rewrite local sync --session … --api … --native-direct` → `rewrite local run`. Browser phone preview still runs in parallel until P0 primary swap.
Verify: One real repo session reaches `nativeDirectPreview.status=ready` and compiles locally (Mac for iOS).
- highGuided product flow
Private GitHub repo path tested
OAuth + encrypted token clone — or clear copy that zip-only is required.
Verify: Private repo scan succeeds for allowlisted test repo.
- highGuided product flow
Ship-readiness endpoint matches UI blockers
`GET …/ship-readiness` — single source for what's blocking delivery.
Verify: UI Refresh blockers matches API JSON for a stuck session.
- mediumGuided product flow
Delivery-ready email notifications
`REWRITE_DELIVERY_EMAIL_NOTIFICATIONS_ENABLED` + Resend from address.
Verify: Full payment triggers customer email with handoff link.
- highSupport & ops
Admin can find user sessions
Search users, list sessions, design trace panel for debugging.
Verify: Lookup test customer by GitHub login; open their session.
- highSupport & ops
Escalation email + admin inbox workflow
`REWRITE_SUPPORT_ESCALATION_TO` — you get pinged when bot escalates.
Verify: Force escalation on test ticket; email arrives; case visible in admin.
- highSupport & ops
Resend email configured
`REWRITE_RESEND_API_KEY` + verified `REWRITE_DELIVERY_EMAIL_FROM` domain.
Verify: Send test email from `/admin`; arrives in inbox (not spam).
- highSupport & ops
Support chat loads product docs
API reads `docs/support-knowledge-base.md` + bundled vision/journey/checklists.
Verify: Ask `/contact` chat a pricing question — accurate answer, not generic fallback.
- highSupport & ops
Support docs deployed with API
After product changes, redeploy API so chat picks up new facts.
Verify: Recent FAQ change reflected in chat answer without code deploy lag.
- mediumSupport & ops
Support agent handbook reviewed by operators
Scripts, escalation matrix, env troubleshooting.
Verify: Team knows where handbook lives and when to use internal refund.
- mediumSupport & ops
`/status` diagnostics usable for support
Health, session ship-readiness, payment events — paste session ID.
Verify: Support can diagnose stuck payment from status page alone.
- lowSupport & ops
Optional Slack webhook for escalations
Free Incoming Webhook — additive to email.
Verify: Escalation posts to `#rewrite-support` when URL set.
- criticalLegal & marketing
Pricing page matches engine quotes
Tier anchors, deposit %, both platforms included — sync with `estimate.ts`.
Verify: Spot-check three repo sizes: UI quote matches API estimate band.
- criticalLegal & marketing
Privacy policy live (`/privacy`)
Covers data collected in guided flow, payments, support chat.
Verify: Link in footer; content matches actual data practices.
- criticalLegal & marketing
Terms of service live (`/terms`)
Deposit, scope, refund boundaries, delivery expectations.
Verify: Contract step references terms; footer link works.
- highLegal & marketing
Contact / support path obvious
`help@meetrewrite.com` or `/contact` — reachable from guided errors.
Verify: Error states link to human help.
- highLegal & marketing
Main path copy is plain language
Prospects grasp look + behavior before pay; jargon in collapsibles only.
Verify: Read `/start` and step 1 as a non-dev — no scary internal terms upfront.
- highLegal & marketing
What we ship page sets honest expectations
Fully functional native promise, Apple/Google work customer owns.
Verify: No one-button full rewrite claims; launch guide linked.
- mediumLegal & marketing
Site analytics disclosed (if enabled)
Privacy policy mentions analytics; cookie/consent if required in your jurisdictions.
Verify: Privacy policy section exists if `SiteAnalytics` is on.
- mediumLegal & marketing
Changelog updated for launch release
Customers see what changed since last public milestone.
Verify: Recent ship features listed on `/changelog`.
- highQuality & CI
Native-direct verify workflow in CI
`.github/workflows/native-direct-verify.yml` — generates from fixture, compiles **generated** iOS (macOS) + Android (Linux) output. Runs on `src/native-direct/**` changes.
Verify: Latest push to `main` with native-direct paths shows green `generate-and-test`, `android-build`, `ios-build` jobs.
- highQuality & CI
Playwright guided smoke in CI
Linux Chromium against `/guided` with test API.
Verify: `ci.yml` Playwright job green on main.
- highQuality & CI
`npm test` green locally and in CI
Build + broad API/unit coverage before every merge to main.
Verify: Latest CI run passed all test jobs.
- highQuality & CI
Next.js production build succeeds
`npm run web:build` — no type errors or missing env at build time.
Verify: CI Next build job green.
- mediumQuality & CI
Android Gradle smoke in CI
Generated kitchen-sink project compiles when Android template changes.
Verify: `android-smoke.yml` green when relevant paths change.
- mediumQuality & CI
Design fidelity spot-check on real customer shape
Run fidelity scoring on representative site before promising 99%.
Verify: At least one dogfood session scores pass on hero screens.
- mediumQuality & CI
iOS template smoke (macOS CI when template changes)
Optional `ios-smoke.yml` on `template/ios/` changes.
Verify: Last template change built on macOS runner.
- mediumQuality & CI
Marketing site mobile UX pass
Header, footer, guided entry, pricing readable on phone.
Verify: Manual iPhone Safari pass on top 5 routes.
- mediumQuality & CI
Outcome e2e run before major launch (manual)
Full handoff zips + Simulator/Maestro — burns macOS minutes.
Verify: `npm run test:e2e:outcome` or manual workflow dispatch succeeded recently.
- criticalGo-live
Production `/health` all green
Stripe mode, webhooks, database, auth flags as expected.
Verify: Open API `/health` JSON — no warnings you don't understand.
- criticalGo-live
One real customer-shaped dry run (you as customer)
Your repo or URL, real payment, full handoff — end to end.
Verify: You received zip, opened in Xcode, app runs on device.
- criticalGo-live
Switch Stripe to live mode
Only after test path verified. Update `REWRITE_STRIPE_MODE` + live webhook.
Verify: Small real charge ($1 or internal) completes and unlocks session.
- highGo-live
Watch API logs first hour after announce
Render logs + Stripe Dashboard + admin inbox.
Verify: Operator on call; escalation email audible.
- highGo-live
Human on call for first 48 hours
Support inbox + email + optional Slack monitored.
Verify: Calendar block; phone notifications on for escalation email.
- highGo-live
Rollback plan documented
Redeploy previous Render commit; flip Stripe back to test if needed.
Verify: You know which Render deploy to roll back to within 5 minutes.
- mediumGo-live
Launch announcement ready
Email list, social, Product Hunt, etc. — links to `/start`.
Verify: UTM links work; `/start` loads fast on cold Render wake.
- mediumGo-live
Rate limits enabled on expensive routes
`REWRITE_RATE_LIMIT_ENABLED` default on — protects LLM/capture/bundle.
Verify: Burst test doesn't take down API for other users.
- highPost-launch
Stripe payouts + session state reconcile
Every successful charge matches unlocked session in admin.
Verify: Weekly Stripe export vs session payment events — no orphans.
- highPost-launch
Daily support ticket triage
Admin inbox zero escalations older than 24h.
Verify: Morning routine documented.
- mediumPost-launch
LLM + Render capacity plan
Upgrade instance tier if cold starts or polish queue hurt conversion.
Verify: Decision criteria written (p95 latency, daily spend cap hits).
- mediumPost-launch
Point customers to store launch guide after handoff
TestFlight / Play internal testing — `/launch-guide` + zip guides.
Verify: Handoff step links launch guide; customers know Apple/Google is on them.
- mediumPost-launch
Update FAQ + handbook from launch learnings
New objections and failure modes go into support-knowledge-base.
Verify: At least one FAQ add within first week.
- mediumPost-launch
Track funnel metrics week 1
Start → scan → deposit → handoff conversion; drop-off steps.
Verify: Spreadsheet or analytics dashboard with daily numbers.
- lowPost-launch
Groom `next-build.md` from launch feedback
Prioritize P1 functional gaps vs P2 fidelity vs P3 UX.
Verify: Top 3 post-launch engineering items captured.
- lowPost-launch
Ship post-launch fixes to changelog
Transparency builds trust after hotfixes.
Verify: Hotfix deploy noted on `/changelog`.