Immutable. This exact content is served forever at /api/v1/blob/2ee638776c47c52e.
--- name: preflight description: Use when a product is about to go public and needs its final pre-launch pass — the user says "final pass", "preflight", "launch check", "is this ready to go live", or is sweeping several repos before a launch day. Run from the product's repo, one run per repo. user-invocable: true argument-hint: "[optional focus: env | design | verify]" --- # Preflight — the last pass before a repo goes public One run per repo. The pass is **read-only on infra**: it reports platform problems; fixing them (set env var, Stripe config, DNS, deploy) is a CLAUDE.md Hard Stop. Collect every needed infra fix into ONE batched go-ahead list at the end — never apply them mid-pass, never ask one at a time. Two rules that override everything below: - **Env vars are checked by NAME only.** Never pull, print, or diff env VALUES — not in chat, not in a file. Never run `vercel env pull` (it has blanked `.env.local` on this machine twice). - **Invoke the skills; don't reimplement them.** impeccable, polish, and frontend-verify each carry their own protocol. ## 0. Aim at the right project - `git status` first. Note uncommitted work. - offlocal is project-scoped and keeps a "selected" project between sessions. Always: `list_projects` → `select_project` for THIS repo → `get_project_context`. Skipping this audits whatever repo was selected last. - No matching offlocal project? Say so in the report and run local-only checks. - If a launch plan (`launch_*`) exists for this project, also run `preflight_launch` and `verify_launch` and fold their results into the report. ## 1. Wiring audit (read-only) - Required var names come from `.env.example`. If it is missing or stale, grep `process.env.` / `import.meta.env.` and report the drift — that is itself a finding. - Check presence of each name on the deploy platform via offlocal (`get_project_context`, provider env getters). Names only. - Stripe, when the product charges: mode must be **live** for launch (`get_project_context` shows it); `list_stripe_products` + prices match the pricing page; `list_stripe_webhooks` has an enabled endpoint on the production domain. Grep the repo for hardcoded `price_`/`prod_` IDs that point at test mode. ## 2. Design pass (bounded) - Invoke `impeccable:impeccable` audit on the main surfaces. Fix criticals and quick cosmetic wins in this pass; structural redesigns get FLAGGED for Wes, not built — launch eve is not redesign time. - Then invoke `polish` for the final micro-detail pass. ## 3. Verify - Invoke `frontend-verify` over `/`, the pricing page, and every route the design pass touched. - Build gates from `package.json`: install, lint, typecheck, test, build — read the output. - Live check: fetch the production URL. HTTPS, real title, OG meta, favicon. ## 4. Report (exact shape, then stop) ``` PREFLIGHT: <repo> — <date> [PASS|FAIL] env missing on platform: NONE | NAME_A, NAME_B [PASS|FAIL] stripe mode=<live|test|n/a>, webhook=<prod domain|MISSING>, products=<n> [PASS|FAIL] design impeccable: <n> fixed, <n> flagged; polish done [PASS|FAIL] verify frontend-verify: <n>/<n> routes pass [PASS|FAIL] build lint/typecheck/test/build output read VERDICT: LAUNCH READY | BLOCKED: <one line per blocker> NEEDS GO-AHEAD (batched): <infra fixes with exact action + rollback | none> ``` Code fixes from the pass are committed via `/ship` after the report. Announcing is a separate skill: offer `/launch` only once the verdict is LAUNCH READY. ## Red flags — stop and correct - An env VALUE anywhere in your output → redact, switch to names. - About to set an env var, touch Stripe/DNS, or deploy mid-pass → Hard Stop; it goes in the batched list. - impeccable proposing a rebuild → flag it, don't build it. - Writing VERDICT without having read the frontend-verify table and build output → not a verdict, run them.