ced4568/RootNode-academy-website (separate GitHub repo, Chase-authorized access) now implements docs/WEBSITE_REGISTRATION_AND_CHECKOUT.md's full contract on its own side: public offering lookup, registration (adult + guardian/minor), agreement acceptance, checkout creation, and a status-polling success page. Its own stale pricing was also corrected to match docs/ ROOTNODE_PRICING_AND_OFFERS_V1.md. It has nothing to talk to yet -- no real Platform API exists (Gate 4's hardware blocker, unchanged) -- so every RootNode-facing route there returns a clean 503 until ROOTNODE_API_URL/ROOTNODE_INTEGRATION_KEY point at a real deployment. Updates PHASE10_LAUNCH_READINESS.md Gate 10 and its matrix row, and WINTER_BREAK_LAUNCH_CHECKLIST.md and WINTER_BREAK_CAMP_OPERATIONS.md's own website-status notes, all of which previously said 'nobody has built the website-side form yet.'
168 lines
13 KiB
Markdown
168 lines
13 KiB
Markdown
# Phase 10 — Launch Readiness
|
|
|
|
Gates 2, 10-14, 19-20, and the final launch matrix. See `docs/PHASE10_CANONICAL_STATE_AUDIT.md`
|
|
(Gate 1), `docs/SECRETS_AND_INFISICAL.md` (Gate 3), `docs/PHASE10_PRODUCTION_DEPLOYMENT.md`
|
|
(Gates 4-9/15-16), and `docs/PHASE10_SECURITY_AUDIT.md` (Gate 18) for the rest.
|
|
|
|
## Gate 2 — Full application audit
|
|
|
|
Reviewed for architectural coherence across every phase; nothing was found inconsistent or in
|
|
need of a fix. Identity/auth, learning, Lab platform, business (offerings/registrations/
|
|
guardians/agreements), and commerce (pricing/payments/webhooks) all remain exactly as documented
|
|
in their own phase docs — re-verified by actually rerunning every suite (Gate 19 below), not by
|
|
re-reading code and assuming it still works.
|
|
|
|
## Gate 10 — Website integration
|
|
|
|
**Update (post-Phase 10.1)**: the website side is now actually built, not just documented.
|
|
`ced4568/RootNode-academy-website` (a separate GitHub repository — Chase provided access and
|
|
explicitly authorized this phase to build against it) now has a real registration/agreement/
|
|
checkout/status flow implementing `docs/WEBSITE_REGISTRATION_AND_CHECKOUT.md`'s full contract:
|
|
public offering lookup, registration submission (adult and guardian+minor), agreement
|
|
acceptance, checkout creation, and a status-polling success page that never trusts the redirect
|
|
URL alone, exactly as that document specifies. Verified there: a clean production build, `tsc`,
|
|
eslint, and 9/9 tests all pass. The site's own stale pricing was also corrected to match
|
|
`docs/ROOTNODE_PRICING_AND_OFFERS_V1.md`.
|
|
|
|
It has nothing to talk to yet — `ROOTNODE_API_URL`/`ROOTNODE_INTEGRATION_KEY` are unset on the
|
|
website side (no real Platform API exists to point them at), so every RootNode-facing route on
|
|
the website returns a clean `503`, never a `500`, until Gate 4's hardware blocker resolves and a
|
|
real Platform API origin exists. `docs/WEBSITE_REGISTRATION_AND_CHECKOUT.md` and `docs/
|
|
WEBSITE_ENROLLMENT_INTEGRATION.md` remain the accurate contract both sides now implement.
|
|
|
|
## Gate 11 — Winter Break offering
|
|
|
|
Pricing is locked and real: **$399.00 launch ("Founding Cohort") / $449.00 standard reference,
|
|
39900/44900 cents, paid in full, no deposit, no payment plan** — given directly by Chase,
|
|
validated against real Stripe TEST mode at the exact $399 amount in Phase 9.1. **Dates, venue,
|
|
and capacity remain undecided** — not invented by this phase, exactly as every prior phase's own
|
|
documentation already states. The offering therefore cannot be transitioned to
|
|
`enrollment_open` for real, public registration yet — the platform mechanism is ready
|
|
(`PATCH /api/admin/offerings/:id` accepts all four fields the moment they're decided).
|
|
|
|
## Gate 12 — Agreements / legal
|
|
|
|
`agreement_definitions`/`agreement_acceptances` architecture is real, tested, and versioned
|
|
(Phase 7-9). **No attorney-approved legal text exists for any required Winter Break agreement**
|
|
— `agreement_definitions.body_summary` remains a plain-language placeholder, exactly as every
|
|
prior phase's docs have stated since Phase 7. This phase did not write legal language and did
|
|
not treat any placeholder as attorney-approved, per Phase 10's own explicit instruction.
|
|
|
|
**LAUNCH BLOCKED — APPROVED AGREEMENT TEXT REQUIRED.** Likely required categories (not
|
|
authored, just the taxonomy Phase 10 asked to identify): program participation terms, guardian
|
|
consent (minor registrants), a participation/liability waiver, acceptable-use / lab/technology
|
|
rules, a cancellation/refund acknowledgment tied to whatever policy Gate 14 resolves, and a
|
|
privacy/data-handling notice if RootNode's counsel determines one is needed beyond what's already
|
|
in `docs/STUDENT_GUARDIAN_DATA_MODEL.md`. A media release is optional — RootNode's own choice,
|
|
not decided here.
|
|
|
|
## Gate 13 — Tax
|
|
|
|
**TAX DECISION REQUIRED.** No deliberate Mississippi (or any jurisdiction's) tax treatment has
|
|
been configured anywhere in this codebase — `payment_transactions.amount` is charged exactly as
|
|
the offering's own price, with no tax line item, no tax calculation, and no tax remittance logic
|
|
anywhere (Phase 9's own explicit "no complex tax automation" scope boundary, unchanged). This is
|
|
not this phase's decision to make, and the current absence of tax handling should not be read as
|
|
an implicit "no tax owed" determination — that requires Chase (or a professional) to actually
|
|
decide, then tell the platform what to do (charge tax as a line item, treat the $399 as
|
|
tax-inclusive, or confirm no sales tax applies to this specific service in this jurisdiction).
|
|
|
|
## Gate 14 — Refund / cancellation policy
|
|
|
|
**LAUNCH BLOCKED — REFUND/CANCELLATION POLICY REQUIRED.** The platform's MECHANICAL behavior is
|
|
real, tested, and proven against actual Stripe money-movement in Phase 9.1: a refund is recorded
|
|
as its own tracked state and **never automatically** cancels the registration or revokes academic
|
|
enrollment — confirmed directly against the database after a real Stripe TEST refund. What is
|
|
still missing is the actual customer-facing POLICY text (how many days before the camp is a
|
|
refund allowed, is it full or partial, etc.) — a founder decision this phase does not invent.
|
|
|
|
## Gate 19 — Complete regression
|
|
|
|
Fresh stack, this phase, after confirming canonical baseline (Gate 1):
|
|
|
|
| Suite | Result |
|
|
|---|---|
|
|
| `e2e-phase5b.js` | 32/32 |
|
|
| `e2e-phase5c.js` | 29/29 |
|
|
| `e2e-phase6f.js` | 17/17 |
|
|
| `e2e-phase7.js` | 17/17 |
|
|
| `e2e-phase8.js` | 16/16 |
|
|
| `e2e-phase9.js` | 20/20 |
|
|
| Course-content validator | PASS, 0 errors |
|
|
| Migration idempotency | Confirmed both ways — a full `down -v`/`up` cycle applies all 37 migrations cleanly from empty, and a same-database container restart re-applies with zero errors |
|
|
| Frontend production build | Clean (only the pre-existing chunk-size advisory) |
|
|
| `tofu validate` (Terraform/OpenTofu) | Clean |
|
|
| `ansible-playbook --syntax-check` | Clean |
|
|
|
|
**131 automated checks, 0 failures.** No code changed this phase (Phase 10 is audit/launch-prep,
|
|
not feature work), so this is confirmation, not new coverage.
|
|
|
|
`platform/test/stripe-integration-test.js` (the Phase 9.1 opt-in real-Stripe check) was **not**
|
|
rerun this phase — it requires real Stripe TEST credentials, which currently have no durable home
|
|
(Gate 3's Infisical project doesn't exist yet) and were correctly unset from the local `.env`
|
|
after Phase 9.1 ended. Phase 9.1's own evidence (`docs/PHASE9_1_STRIPE_TEST_VALIDATION.md`)
|
|
stands as the real-Stripe proof; nothing in this phase's own code changes touches that path.
|
|
|
|
## Gate 20 — Pre-launch dress rehearsal
|
|
|
|
`infra/scripts/drills/test-phase9-winter-camp-commerce.js` rerun fresh this phase against
|
|
current `main`: **13/13** — website registration → guardian → agreement → checkout → webhook →
|
|
enrollment → activation → classroom → a real disposable Lab task → instructor visibility, plus
|
|
failed-payment/duplicate-webhook/abandoned-checkout/last-seat-race, all using the deterministic
|
|
test provider (no real money, as instructed). This is the closest possible complete rehearsal
|
|
without real production infrastructure or real dates/venue/capacity — it cannot be run against
|
|
the ACTUAL Winter Break offering because that offering cannot legitimately open registration yet
|
|
(Gate 11). No fake evidence was created for the steps genuinely blocked by unresolved business
|
|
decisions.
|
|
|
|
## Final launch matrix
|
|
|
|
Phase 10.1 adds a **Category** column distinguishing four kinds of non-complete gate, since
|
|
they need entirely different people to resolve them: **TECHNICAL READY** (code/infra is done,
|
|
nothing left to build), **OWNER DECISION REQUIRED** (Chase has to decide something, no code
|
|
involved), **EXTERNAL BLOCKER** (a third party — Stripe, an attorney, a landlord — has to act or
|
|
verify something), **HARDWARE BLOCKER** (specifically the missing production server, since it
|
|
gates so many other rows).
|
|
|
|
| Gate | Status | Category | Evidence | Owner action | Blocks registration? |
|
|
|---|---|---|---|---|---|
|
|
| 1. Canonical repo reconciled | ✅ COMPLETE | — | `docs/PHASE10_CANONICAL_STATE_AUDIT.md` | None | No |
|
|
| 2. Second-PC state reconciled | ⚠️ Pending verification | OWNER DECISION REQUIRED | Gitea shows no stranded work; PC #2 itself unverified from here; the real Phase 9.5 pricing doc is confirmed to live there, unpushed | Run §1.3's commands on PC #2, then push the real Phase 9.5 document | No (informational) |
|
|
| 3. Secrets centralized (Infisical) | 🔧 One access grant away | OWNER DECISION REQUIRED | `docs/SECRETS_AND_INFISICAL.md` — project exists per Chase, this identity lacks access to it | Grant `claude-code-migration` access to the existing RootNode Academy project | No (dev secrets already safe locally) |
|
|
| 4. Production server | ⛔ BLOCKED | HARDWARE BLOCKER | `docs/PHASE10_PRODUCTION_DEPLOYMENT.md` | Purchase/provision hardware | **Yes** |
|
|
| 5. Proxmox / VMs | ⛔ BLOCKED | HARDWARE BLOCKER | Same — no host to provision on | Same | **Yes** |
|
|
| 6. Firewall/isolation | ✅ COMPLETE (code) | TECHNICAL READY | `docs/PHASE10_SECURITY_AUDIT.md` | None until real host exists | No (code ready) |
|
|
| 7. Production database | ⛔ BLOCKED | HARDWARE BLOCKER | Same hardware blocker | Same | **Yes** |
|
|
| 8. DNS | ✅ PARTIAL | HARDWARE BLOCKER (API portion) | `rootnodeacademy.com` live; no Platform API subdomain yet | Decide/create the API subdomain once a server exists | **Yes**, for the API portion |
|
|
| 9. HTTPS | ✅ PARTIAL | HARDWARE BLOCKER (API portion) | Website real HTTPS; Platform API HTTPS pending a real host | Same as above | **Yes**, for the API portion |
|
|
| 10. Monitoring | ✅ COMPLETE (code) | TECHNICAL READY | `/healthz`/`/metrics` live in every test run | None until deployed | No |
|
|
| 11. Backups | ✅ COMPLETE (code), ⛔ unexecuted | HARDWARE BLOCKER (execution) | Ansible `backup` role exists, never run | Run once a real host exists | **Yes** (restore-test) |
|
|
| 12. Restore test | ⛔ BLOCKED | HARDWARE BLOCKER | Never executed — no target | Same | **Yes** |
|
|
| 13. Stripe TEST validation | ✅ COMPLETE | — | `docs/PHASE9_1_STRIPE_TEST_VALIDATION.md` | None | No |
|
|
| 14. Stripe LIVE configuration | ⛔ BLOCKED | EXTERNAL BLOCKER | Not configured, not attempted | Chase completes Stripe business/identity verification, provides LIVE credentials | **Yes** |
|
|
| 15. Live webhook configuration | ⛔ BLOCKED | EXTERNAL + HARDWARE BLOCKER | Depends on #14 and a real HTTPS endpoint (#9) | Same | **Yes** |
|
|
| 16. Google Workspace | ✅ COMPLETE (validated in Phase 5C) | TECHNICAL READY | `docs/RUNBOOK_GOOGLE_WORKSPACE_EMAIL.md` | Deploy alongside the real server | No (already proven) |
|
|
| 17. Website integration | ✅ COMPLETE, both sides | — | Contract tested end to end; website-side registration/checkout flow now built and verified (see Gate 10 above) | None | No |
|
|
| 18. Winter Break price | ✅ COMPLETE | — | $399/$449, real, Stripe-validated, confirmed current with Chase (the live website's own pricing is stale — see `docs/PHASE10_CANONICAL_STATE_AUDIT.md`) | None (website update is separate, not-RootNode-owned repo work) | No |
|
|
| 19. Winter Break dates | ⚠️ DECISION REQUIRED | OWNER DECISION REQUIRED | Not decided | Chase decides | **Yes** |
|
|
| 20. Venue | ⚠️ DECISION REQUIRED | OWNER DECISION REQUIRED | Not decided | Chase decides | **Yes** |
|
|
| 21. Capacity | ⚠️ DECISION REQUIRED | OWNER DECISION REQUIRED | Not decided | Chase decides | **Yes** |
|
|
| 22. Agreements (legal text) | ⛔ BLOCKED | EXTERNAL BLOCKER | Placeholder only | Attorney-approved text required | **Yes** |
|
|
| 23. Refund/cancellation policy | ⚠️ DECISION REQUIRED | OWNER DECISION REQUIRED | Mechanism proven, policy undecided | Chase decides | **Yes** |
|
|
| 24. Tax decision | ⚠️ DECISION REQUIRED | OWNER DECISION REQUIRED / EXTERNAL | Not configured | Chase/professional decides | **Yes** |
|
|
| 25. Production offering | ⛔ BLOCKED | OWNER DECISION REQUIRED (compound) | Cannot legitimately open — depends on #19-24 | Depends on all of the above | **Yes** |
|
|
| 26. Instructor assignment | 🔧 MANUAL OWNER ACTION | OWNER DECISION REQUIRED | Mechanism ready (`instructor_offerings`) | Chase assigns once the real offering exists | **Yes** |
|
|
| 27. Roster process | ✅ COMPLETE (mechanism) | TECHNICAL READY | Rehearsed in Gate 20 | None | No |
|
|
| 28. Student activation | ✅ COMPLETE | TECHNICAL READY | Proven real, twice (Phase 9.1 + Gate 20) | None | No |
|
|
| 29. Lab capacity | ✅ COMPLETE (code) | HARDWARE BLOCKER (real sizing) | Capacity/race logic proven; real server capacity planning needs #4 | Plan once real hardware specs are known | No (mechanism), **yes** (real capacity) |
|
|
| 30. Complete dress rehearsal | ✅ COMPLETE (deterministic) | TECHNICAL READY | Gate 20, 13/13 | Repeat against the real offering once it can legitimately open | No |
|
|
|
|
## Bottom line
|
|
|
|
## PHASE 10 PARTIAL / WINTER BREAK LAUNCH BLOCKED
|
|
|
|
Every gate that is genuinely software/audit work is complete and verified. Every gate that is a
|
|
real business, legal, tax, or hardware decision remains exactly that — a decision, not
|
|
something this phase invented on Chase's behalf. See `docs/WINTER_BREAK_LAUNCH_CHECKLIST.md` for
|
|
the single consolidated, categorized checklist Chase can work down.
|