Files
rootnode-academy/docs/PHASE6A_ROOT_COURSE_FOUNDATION.md
T
ced4568andClaude Sonnet 5 fd38d06055 docs(phase6a): document RootNode course foundation
COURSE_AUTHORING_STANDARD.md — the standard every future lesson/module
must follow (target learner, prerequisites, measurable objectives,
concept-before-lab, instructor notes, terminology, versioning, review
requirements), grounded in the gold-standard module as the reference
implementation.

PHASE6A_ROOT_COURSE_FOUNDATION.md — the phase summary: youth-ladder
context, the Google Workspace status already recorded in Phase 5C's own
docs, architecture/build summary, honest content states, test results,
explicit non-goals, and known limitations/Phase 6B recommendations.

Updated ENGINEERING_SOP.md (new Phase 6A section + a curriculum-content
cross-reference), REMOTE_AND_SELF_PACED_ARCHITECTURE.md (a 7th
closed gap: self-paced enrollment now resolves to a real course tree,
not just a scenario list), LAB_ARCHITECTURE.md (Phase 6A reuses the
disposable Lab unmodified, verified by a real rehearsal), and
platform/README.md (course model in the api/ summary, new e2e suite
descriptions for 5A/5B/5C/6A which were missing entirely, and the
real-Lab rehearsal script).

Co-Authored-By: Claude Sonnet 5 <[email protected]>
2026-08-25 23:30:11 -05:00

139 lines
8.5 KiB
Markdown

# Phase 6A — ROOT_ Course Architecture + Content Delivery Foundation
**Status: PHASE 6A COMPLETE. COURSE/MODULE/ACTIVITY CONTENT MODEL LIVE. GOLD-STANDARD MODULE
READY, VALIDATED AGAINST A REAL LAB.**
Phases 1-5 built the RootNode Academy platform: identity, cohorts, curriculum, the assessment
engine, remote classrooms, self-paced enrollment, and enrollment communications. All of it sat
on top of `scenarios/rootnode-path.json` — a flat list of scenario ids per stage, with no notion
of a lesson, a demonstration, or "learn this before you're asked to solve it." Phase 6A builds
that layer, for the `root_` track only, without touching any of the systems underneath it.
## 1. The canonical youth ladder (context, not built here)
RootNode Academy's product spans three tracks by age/stage:
- **`init_`** (~5-10) — robotics / computational thinking / block coding. Not built.
- **`compile_`** (~11-14) — electronics / microcontrollers / ESP32 / programming. Not built.
- **`root_`** (~15-18+, college, adult) — Linux → systems → containers → Kubernetes → DevOps/
platform engineering. **This phase.**
`programs.family` (Phase 5B) already models this three-way split; only `root` has real content.
Phase 6A does not invent `init_`/`compile_` curriculum — see §15 of the authorization and
`docs/ROOT_CURRICULUM_INVENTORY.md` §7 for the evidence that no such content exists yet.
## 2. Core product principle
KubeKosh/the RootNode Lab is the LABORATORY, not the whole course. A RootNode course can contain
lessons, demonstrations, examples, knowledge checks, guided exercises, labs (existing
scenarios), assessments, reflections, and capstone work — a student learns a concept BEFORE
being asked to solve the corresponding scenario. See `docs/COURSE_AUTHORING_STANDARD.md`.
## 3. Google Workspace status (recorded per this phase's instruction, not new work)
The external blocker at the end of Phase 5C — no real Google Workspace mailbox to test against —
was resolved by the owner during this session before Phase 6A began: `[email protected]`
now exists and live delivery was validated end to end (isolated send test + a full real
activation/reset lifecycle). This is already recorded in `docs/PHASE5C_ENROLLMENT_COMMUNICATIONS.md`
(status header, §14) and `docs/RUNBOOK_GOOGLE_WORKSPACE_EMAIL.md` (§11's propagation-delay note),
committed at `4c0a950` and tagged `v0.5.3-enrollment-comms` — this phase did not need to redo
that work, only confirm it was recorded, which it was.
## 4. Architecture summary
```
program (existing) ── courses ── course_modules ── module_activities
├─ lab → scenario_id (existing)
└─ assessment/capstone → assessment_definition_id (existing)
```
Full design: `docs/COURSE_CONTENT_MODEL.md`. Full course/module map:
`docs/ROOT_PROGRAM_ARCHITECTURE.md`. Full existing-content inventory this was built from:
`docs/ROOT_CURRICULUM_INVENTORY.md`.
Delivery modes: the same content model serves both instructor-led (Phase 5A classrooms) and
self-paced (Phase 5B enrollment) students — one `buildCourseTree()` function
(`platform/api/src/course-progress.js`), one `content.js` Markdown loader, consumed by both
`course-routes.js` (student) and `admin-course-routes.js` (instructor), the latter additionally
exposing instructor notes via the same file's `## Instructor Notes` convention. No forked
curriculum.
## 5. What was built
**Migration** — `platform/api/migrations/022_course_content.sql`: `courses`, `course_modules`,
`module_activities`, `activity_completions`, plus seed data for 13 courses, 8 modules, and 51
activities (44 mechanically mapped from existing `rootnode-path.json` stages, 6 gold-module
activities, 1 capstone activity) — see that file's own extensive header comments.
**Content** — `content/root/root-10-kubernetes-troubleshooting-observability/m01-health-probes/`:
6 Markdown files (lesson, demonstration, knowledge check, guided exercise, lab intro,
reflection), each following the shared/instructor-notes split convention.
**Backend** — `content.js` (Markdown loader), `course-progress.js` (completion derivation +
prerequisite locking, shared by both surfaces), `course-routes.js` (student API),
`admin-course-routes.js` (instructor API), wired into `server.js`. `platform/api/Dockerfile`
now also copies `content/`.
**Frontend** — `CourseView.jsx` (student: My Programs → ROOT_ → Course → Module → Activity →
Launch Lab → back → continue), wired into `ProgramsTab.jsx`'s existing "Continue Learning" flow
via a new "View Courses" button (the original direct-to-Lab button is unchanged).
`CurriculumView.jsx` (instructor: program structure, per-module teaching detail, instructor
notes, per-student progress lookup), wired into `AdminPortal.jsx` as a new "Curriculum" tab.
**Tests** — `platform/test/e2e-phase6a.js` (21 assertions: hierarchy, ordering, all three
completion behaviors, locking, resume, cross-student isolation, RBAC, draft-hiding, version
stability) and `infra/scripts/drills/test-phase6a-course-rehearsal.js` +
`run-phase6a-course-rehearsal.sh` (a real-k3s dress rehearsal of the gold module end to end,
including the Lab's own `setup_commands` and a real `kubectl patch` against the live cluster).
## 6. The gold-standard module
`root-10-m01-health-probes-and-troubleshooting`, under ROOT 10 (Kubernetes Troubleshooting &
Observability): lesson (probe concepts) → demonstration (reading `kubectl describe pod` Events
for a probe failure) → knowledge check → guided exercise (write a readiness probe on paper) →
Launch Lab (`rootnode-probe-port-mismatch`, RootNode-authored) → reflection (root cause + Real
Ops prevention takeaway). Instructor notes on 5 of its 6 activities (demo plan, misconceptions,
timing, discussion questions, extensions). This is the template `docs/COURSE_AUTHORING_STANDARD.md`
documents for all future module authoring.
## 7. Honest content states
No course is `ready`. 5 courses (01-04, 11) are `planned` with zero modules — genuinely no
content exists for them. 7 courses (05-10, 12, capstone) are `partial` — real, working labs
mapped in, one fully `ready` module (the gold standard), everything else awaiting lesson
authoring in Phase 6B. Nothing was fabricated to make the UI look more complete than it is.
## 8. Test results
- `e2e-phase6a.js`: **21 passed, 0 failed.**
- `test-phase6a-course-rehearsal.js` (real k3s Lab): **12 passed, 0 failed**, including a real
`kubectl patch` against a live cluster inside the student's actual disposable Lab container.
- Full regression (Phase 2A/2B/3A/3B/5A/5B/5C) — see the final report for the run-by-run result;
no Phase 6A change touched any file those suites exercise other than additive route
registration in `server.js`.
## 9. What Phase 6A deliberately did not build
Per the authorization's explicit scope line: `init_`/`compile_` curriculum, a Parent Portal,
Stripe/payments, public registration, an AI tutor, chat/video/voice, proctoring, a mobile app,
certificates, a multi-host scheduler, production deployment changes, a CMS, or dozens of
placeholder lessons. Lesson authoring for courses 06-10/12/capstone beyond the gold standard is
explicitly Phase 6B+ scope.
## 10. Known limitations / recommended Phase 6B scope
- ROOT 08/09's real, existing scenario content (storage/scheduling, and a 22-scenario CKS
security bank) is inventoried but not yet wired into modules — the natural next content slice.
- Course-level lesson authoring for ROOT 05-07/10 (m02)/12/capstone: labs exist, teaching
content doesn't yet — apply `docs/COURSE_AUTHORING_STANDARD.md` per module.
- `POST /api/assessments/:definitionId/start` does not itself re-check the capstone's
`unlock_rule` server-side (a pre-existing Phase 3B gap, not introduced by this phase — the
student-facing `/api/capstone` view does compute and display lock state correctly, and the
UI never exposes a "start" action while locked, but the raw route would technically accept a
premature start if called directly). Not fixed here — it's outside the course/content-model
scope this phase was authorized for; worth a small, isolated fix in a future phase.
- Course-to-course prerequisite locking is currently sequential/manually declared, not derived
from the assessment engine's own `unlock_rule` JSON — the two happen to agree today by
construction (see `docs/ROOT_PROGRAM_ARCHITECTURE.md`'s "Real Ops and Capstone placement");
a future phase could unify them if course content grows complex enough to warrant it.