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:
@@ -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.
|
||||
Reference in New Issue
Block a user