Files
rootnode-academy/docs/WINTER_BREAK_CAMP_OPERATIONS.md
ced4568 e6a5902ddf docs(website): record that the website-side registration/checkout flow is now built
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.'
2026-08-28 15:22:10 -05:00

93 lines
6.5 KiB
Markdown

# Winter Break Camp Operations
Phase 8 §29 (payment step updated in Phase 9) — how to actually run the Winter Break Linux &
Systems Foundations Camp (`docs/WINTER_BREAK_CAMP_CURRICULUM_OPTIONS.md` Option A) using the
platform built in Phases 7-9, end to end, entirely from `/admin`. As of Phase 9, real
checkout/payment (Stripe test mode today, live mode once real credentials exist) is part of this
flow — see `docs/PHASE9_COMMERCE_AND_LAUNCH.md` and `docs/WINTER_BREAK_LAUNCH_CHECKLIST.md`.
## What already exists vs. what Chase still fills in
**Already representable, real, tested:**
- The curriculum package (ROOT 01-02, referencing the real, unmodified courses).
- The offering itself, in DRAFT, with delivery mode `camp`, and a real price.
- Registration → guardian/adult → agreement → real checkout → verified webhook → confirmation →
enrollment → cohort → activation → classroom → real Lab work, proven end to end in
`infra/scripts/drills/test-phase9-winter-camp-commerce.js` (13/13 passing, test payment
provider, no live money) — plus failed-payment retry, abandoned-checkout seat release, and a
last-seat checkout race, none of which existed in Phase 8's own rehearsal.
**Still genuinely unknown, deliberately left editable, never invented by this phase:**
- Exact dates, venue, real capacity, and price (the price FIELD is real and editable; the actual
dollar amount to charge is still Chase's call).
- The actual agreement text (a plain-language placeholder only — see `docs/
STUDENT_GUARDIAN_DATA_MODEL.md`'s legal-review list).
- Whether registration opens before or after a specific marketing push.
- Real Stripe credentials — until they exist, the platform runs on the deterministic test
provider, functionally complete but not yet validated against Stripe's own live systems. See
`docs/STRIPE_INTEGRATION_RUNBOOK.md`.
## The operational sequence
1. **Create the location** — `/admin` → Offerings → (via the offering create form's location
dropdown) or directly if a location admin surface is added later; today, an admin/owner uses
`POST /api/admin/locations` (documented in `docs/OFFERING_ADMIN_GUIDE.md`) once the real venue
is known.
2. **Create the curriculum package** — `winter-linux-systems-v1`, referencing
`root-01-computing-linux-foundations` and `root-02-linux-administration-networking` in
sequence. This step is a one-time setup — the same package can back every future Winter Break
Camp offering.
3. **Create the cohort** and **the offering** — delivery mode `camp`, referencing the program,
the curriculum package, and (once known) the location and capacity.
4. **Assign the lead instructor** — both at the offering level (`instructor_offerings`, Phase 7)
and the cohort level (`cohort_instructors`, unchanged since Phase 2A) — the offering detail
page's own instructor step, or the two admin routes directly.
5. **Set the price** — `PATCH /api/admin/offerings/:id` with `price_amount`/`price_currency`
(or leave `price_amount` unset for a free offering). Confirm `PAYMENT_PROVIDER` is configured
(`test` for rehearsal, `stripe` with real credentials for a live launch — see `docs/
STRIPE_INTEGRATION_RUNBOOK.md`).
6. **Configure the required agreement(s)** — create the agreement definition (title + plain-
language summary) and link it to the offering. **The actual legal text still needs
professional review before this camp is opened to real families** — see below.
7. **Check launch readiness** — the offering detail page's readiness panel should show every
check green before publishing, including the new `price` and `payment_provider` checks. If
instructor/curriculum/agreements/price are configured but dates/location/capacity aren't
final yet, readiness will honestly show that.
8. **Publish, then open registration** — `draft → published → enrollment_open`. Only once
`enrollment_open` does the offering appear in the public offerings API and accept real
registrations.
9. **Registrations arrive** — via the website integration (contract ready, see
`docs/WEBSITE_REGISTRATION_AND_CHECKOUT.md`) or entered directly by an admin for a phone/
in-person sign-up.
10. **Guardian/adult completes the agreement, then checkout** — the agreement acceptance and
checkout-creation endpoints are both live (Phase 9); checkout is blocked until the agreement
is accepted.
11. **Payment confirmation** — a verified, idempotent webhook (never a browser redirect) is what
actually confirms payment and walks the registration to `confirmed`. A failed payment leaves
the registration retriable without releasing the seat; an abandoned checkout or an expired,
unpaid reservation releases it.
12. **Convert to enrollment** — happens automatically on payment confirmation for a priced
offering (or a manual admin transition for a free one) — creates the real student account
(or matches an existing one), the real academic enrollment, and real cohort membership.
13. **Account activation** — the student's (or, for a minor, the guardian's) real one-time
activation token, delivered the same way every other RootNode activation email already is.
14. **Classroom day** — Prepare Labs for the cohort, start the classroom session, students join
and work through real ROOT 01-02 content and Labs.
15. **Offering completion** — `in_progress → completed` once the camp concludes.
## Known blockers before this can actually open to the public
- Real dates, venue, capacity, and the actual dollar price are not yet decided (this document
does not invent them — the platform fields to hold them are real and ready).
- The agreement text requires professional legal review (see `docs/
STUDENT_GUARDIAN_DATA_MODEL.md`).
- Real Stripe credentials do not exist yet — the commerce pipeline is built and tested against
the deterministic test provider only; see `docs/STRIPE_INTEGRATION_RUNBOOK.md` for going live.
- The website's own registration/checkout UI is now built (rootnodeacademy.com, a separate
repository not owned by this one) against `docs/WEBSITE_REGISTRATION_AND_CHECKOUT.md`'s
contract — but it has nothing to talk to yet, since `ROOTNODE_API_URL`/
`ROOTNODE_INTEGRATION_KEY` point at no real Platform API (none is deployed — see `docs/
PHASE10_PRODUCTION_DEPLOYMENT.md`). Its own real pricing (`docs/
ROOTNODE_PRICING_AND_OFFERS_V1.md`) has already been published on the live site.
- See `docs/WINTER_BREAK_LAUNCH_CHECKLIST.md` for the full go/no-go list.