- PHASE5B_SELF_PACED_ENROLLMENT.md: the full design doc. - RUNBOOK_SELF_PACED_ENROLLMENT.md: operational runbook for /admin -> Programs. - WEBSITE_ENROLLMENT_INTEGRATION.md: the complete contract for the separate website team — endpoint, auth, request/response schema, idempotency/retry rules, student matching, minor/ no-email behavior, error responses, what not to send, local testing, production-secret handling. Written to be usable without reading the Platform API source. - REMOTE_AND_SELF_PACED_ARCHITECTURE.md: closes the self-registration/curriculum-assignment/ delivery-mode/enrollment-model gaps this doc previously flagged as Phase 5+ scope. - ENGINEERING_SOP.md: new §15. LAB_ARCHITECTURE.md, PRODUCTION_VALIDATION_CHECKLIST.md, README.md, platform/README.md: cross-references and a Phase 5B production-validation section.
3.6 KiB
Runbook: Self-Paced Programs & Enrollment
Covers managing programs and enrollments from /admin → Programs. See
docs/PHASE5B_SELF_PACED_ENROLLMENT.md for the underlying design and
docs/WEBSITE_ENROLLMENT_INTEGRATION.md for the separate website-driven path.
Create a program (Programs → Create program, admin/owner only):
Program ID is a slug (e.g. root-linux-fundamentals) and can't be changed later. Pick a
family (init_/compile_/root_) and delivery mode. New programs default to
curriculum_path: rootnode-path — the only curriculum content that exists today. A program for
init_/compile_ can be created now as a placeholder and wired to real content later without a
schema change; it just won't have real lessons behind it yet.
Activate/deactivate a program (Programs → [program] → Activate/Deactivate):
An inactive program can't accept new enrollments (admin-manual or via the website integration endpoint) but existing enrollments in it are untouched — students already enrolled keep their access exactly as it was.
Manually enroll a student (Programs → [program] → Enroll a student):
Enter the student's ID (find it on the Students tab). Choose pending (the default — the
student sees the enrollment but can't start until you Activate it) or active (skip that step).
Optional start/end dates enforce access windows server-side — a future start date hides Lab
access until then; an end date cuts off new Lab launches after it while leaving prior progress
visible.
Activate a pending enrollment (Programs → [program] → Enrollments table → Activate):
Only needed if you enrolled as pending. This is the moment a student actually gains entry.
Cancel an enrollment (Programs → [program] → Enrollments table → Cancel, or Enrollments list on a student's own page):
Immediately blocks new Lab launches. Does not touch the student's progress/achievements/attempt history — those are permanent regardless of enrollment status. Cancelling is final for that enrollment; if the student should have access again later, enroll them again (a new enrollment row) rather than trying to "reactivate" a cancelled one.
Check a student's enrollment history (Students → [student] → "Enrolled programs" card):
Shows every program the student has ever been enrolled in — pending, active, completed, cancelled, expired — with progress and last activity. A plain instructor sees this scoped to enrollments they created or that belong to a student sharing one of their cohorts; owner/admin see everything.
A student says "Continue Learning" isn't working / shows the wrong thing:
- Check their enrollment status on the Programs or Student page.
pending→ activate it.expired/cancelled→ that's working as intended; enroll them again if they should continue. - If
activeand still stuck, check/api/admin/students/:id/environmentfor a stuck Lab — same troubleshooting as any other Lab issue (docs/RUNBOOK_STUCK_LAB_CLEANUP.md). Destroying the Lab never loses their program progress; a fresh launch resumes from the same place.
A student's completion didn't register:
Completion is detected the next time their program status is read (their dashboard, or an
admin viewing their enrollment) after they finish the capstone — not pushed instantly. Refresh
the page or reopen their student detail in /admin; if it still doesn't show completed after
that, check GET /api/achievements for that student for a capstone_completed record matching
the program's configured capstone — if that's missing, the capstone itself wasn't actually
finished, not an enrollment bug.