docs(phase10): canonical state audit, secrets inventory, production/security/launch readiness

Gate 1 — canonical state audit: this workstation's HEAD/origin/main and every claimed milestone
SHA (Phase 2A through 9.1) verified consistent; no stranded branches/tags on Gitea; full-history
secret scan clean (no rotation required); Phase 9.5 confirmed absent from canonical history
(pricing was given directly by Chase and used without it); second-PC reconciliation commands
provided since this session cannot see that machine.

Gate 3 — secrets: real inventory derived from process.env greps across every service (not
guessed); Infisical auth fixed (wrong domain was the actual root cause of Phase 9.1's failures —
the identity belongs to infisical.cedshomelab.com, not app.infisical.com) but no RootNode
Academy project exists there yet, contradicting this phase's own authorization — flagged for
Chase to create.

Gates 4-9/15-16 — production: verified, not assumed, that no dedicated server/Proxmox VM has
been provisioned (empty terraform.tfvars, no state file, placeholder group_vars/production.yml)
— IaC validated (tofu validate, ansible --syntax-check both clean) and left unexecuted per this
phase's own 'do not fake production deployment' instruction. rootnodeacademy.com confirmed live
(Cloudflare, real HTTPS) — the separate, not-RootNode-owned website; no Platform API subdomain
exists yet.

Gate 18 — security audit: full review against every regression suite rerun this phase; no
launch-critical defect found.

Gates 19/20 — full regression (131 checks: e2e-phase5b/5c/6f/7/8/9, content validation,
migrations, frontend build) and the Winter Break commerce rehearsal, both rerun clean against
current main.

Gates 10-14/21 — website integration, Winter Break pricing (99/49, real, Stripe-validated),
agreements/legal, tax, and refund policy all reviewed; legal text/tax/refund policy/dates/venue/
capacity correctly left as open owner decisions, not invented.

No application code changed this phase — audit/launch-prep only.
This commit is contained in:
2026-08-28 12:07:25 -05:00
parent a4c0058f8c
commit 0b2303a3e2
6 changed files with 634 additions and 80 deletions
+152
View File
@@ -0,0 +1,152 @@
# 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).
## 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
| Gate | Status | Evidence | Owner action | Blocks registration? |
|---|---|---|---|---|
| 1. Canonical repo reconciled | ✅ COMPLETE | `docs/PHASE10_CANONICAL_STATE_AUDIT.md` | None | No |
| 2. Second-PC state reconciled | ⚠️ DECISION REQUIRED | Gitea shows no stranded work; PC #2 itself unverified from here | Run §1.3's commands on PC #2 | No (informational) |
| 3. Secrets centralized (Infisical) | 🔧 MANUAL OWNER ACTION | `docs/SECRETS_AND_INFISICAL.md` | Create the RootNode Academy Infisical project | No (dev secrets already safe locally) |
| 4. Production server | ⛔ BLOCKED | `docs/PHASE10_PRODUCTION_DEPLOYMENT.md` | Purchase/provision hardware | **Yes** |
| 5. Proxmox / VMs | ⛔ BLOCKED | Same — no host to provision on | Same | **Yes** |
| 6. Firewall/isolation | ✅ COMPLETE (code), ⏸ unverified live | `docs/PHASE10_SECURITY_AUDIT.md` | None until real host exists | No (code ready) |
| 7. Production database | ⛔ BLOCKED | Same hardware blocker | Same | **Yes** |
| 8. DNS | ✅ PARTIAL | `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 | Website real HTTPS; Platform API HTTPS pending a real host | Same as above | **Yes**, for the API portion |
| 10. Monitoring | ✅ COMPLETE (code) | `/healthz`/`/metrics` live in every test run | None until deployed | No |
| 11. Backups | ✅ COMPLETE (code), ⛔ unexecuted | Ansible `backup` role exists, never run | Run once a real host exists | **Yes** (restore-test) |
| 12. Restore test | ⛔ BLOCKED | 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 | Not configured, not attempted | Chase completes Stripe business/identity verification, provides LIVE credentials | **Yes** |
| 15. Live webhook configuration | ⛔ BLOCKED | Depends on #14 and a real HTTPS endpoint (#9) | Same | **Yes** |
| 16. Google Workspace | ✅ COMPLETE (validated in Phase 5C) | `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 | None | No |
| 19. Winter Break dates | ⚠️ DECISION REQUIRED | Not decided | Chase decides | **Yes** |
| 20. Venue | ⚠️ DECISION REQUIRED | Not decided | Chase decides | **Yes** |
| 21. Capacity | ⚠️ DECISION REQUIRED | Not decided | Chase decides | **Yes** |
| 22. Agreements (legal text) | ⛔ BLOCKED | Placeholder only | Attorney-approved text required | **Yes** |
| 23. Refund/cancellation policy | ⚠️ DECISION REQUIRED | Mechanism proven, policy undecided | Chase decides | **Yes** |
| 24. Tax decision | ⚠️ DECISION REQUIRED | Not configured | Chase/professional decides | **Yes** |
| 25. Production offering | ⛔ BLOCKED | Cannot legitimately open — depends on #19-24 | Depends on all of the above | **Yes** |
| 26. Instructor assignment | 🔧 MANUAL OWNER ACTION | Mechanism ready (`instructor_offerings`) | Chase assigns once the real offering exists | **Yes** |
| 27. Roster process | ✅ COMPLETE (mechanism) | Rehearsed in Gate 20 | None | No |
| 28. Student activation | ✅ COMPLETE | Proven real, twice (Phase 9.1 + Gate 20) | None | No |
| 29. Lab capacity | ✅ COMPLETE (code), ⛔ real capacity unverified | 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) | 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.