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.'
13 KiB
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.