Files
rootnode-academy/docs/PHASE10_LAUNCH_READINESS.md
T
ced4568 74033b4cb8 docs(audit): reconcile Phase 10 findings on Phase 9.5, Infisical, and website pricing
Phase 9.5: reconfirmed no canonical commit exists (broader content search across full history —
still zero hits outside this session's own commits); Chase confirmed the real document lives on
PC #2, unpushed. Not duplicated here per Chase's explicit instruction — he owns bringing it to
canonical Gitea.

Infisical: Phase 10's 'project does not exist' finding was incomplete, not wrong about what it
checked — a proper org-scoped API enumeration (8 projects) still shows no RootNode Academy
project visible to the claude-code-migration machine identity, even though Chase confirms it
exists. Root cause narrowed to a missing per-project access grant (Infisical scopes identity
visibility per-project, separate from org membership) rather than the project not existing.
Corrected docs/SECRETS_AND_INFISICAL.md and docs/PHASE10_CANONICAL_STATE_AUDIT.md accordingly,
with the exact one-step fix (grant the identity access via Project Settings -> Access) and the
identity id needed to do it. No duplicate project was created.

Website pricing: a read-only fetch of rootnodeacademy.com found stale founding-price RANGES that
don't match the exact fixed V1 prices Chase gave directly this phase; Chase confirmed the fixed
prices in this repo's docs are correct and current. Noted as a real discrepancy for his own
awareness, not something this repo's scope covers fixing.

Updated the Phase 10 launch matrix with a Category column (TECHNICAL READY / OWNER DECISION
REQUIRED / EXTERNAL BLOCKER / HARDWARE BLOCKER) distinguishing who needs to act on each
remaining gate. No application code changed — audit/documentation reconciliation only.
2026-08-28 13:09:05 -05:00

12 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

docs/WEBSITE_REGISTRATION_AND_CHECKOUT.md and docs/WEBSITE_ENROLLMENT_INTEGRATION.md remain the full, accurate, already-tested contract: public offerings API, registration submission, agreement acceptance, checkout creation, and the status-lookup endpoint. Nothing new was built — the contract was fully proven end to end (including against real Stripe) in Phase 9/9.1. The website itself (rootnodeacademy.com) is confirmed live and real (Gate 6, docs/ PHASE10_PRODUCTION_DEPLOYMENT.md) but remains a separate, not-RootNode-owned repository — this phase did not access or modify it, per the standing boundary.

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).

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 — Contract tested end to end, including real Stripe 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.