# Runbook: Running a Remote Classroom Covers scheduling, running, and recovering a live class through `/admin` → Classroom. See `docs/PHASE5A_STUDENT_IDENTITY_REMOTE_CLASSROOM.md` for the underlying design. RootNode does **not** provide video/voice — the meeting URL field just links out to Meet/Zoom/Teams/whatever you already use for that. **Before class: schedule it** `/admin` → Classroom → pick the cohort → Schedule a class. Title is required; scheduled start, description, and a meeting URL are optional. Only one class can be `live` per cohort at a time — scheduling a second one is fine, starting it while another is live is rejected. **Right before class: Prepare Labs** Open the classroom → Prepare Labs. This provisions/warms every enrolled student's Lab ahead of time (same underlying flow as the cohort-level Prepare Labs button) so nobody is waiting on a cold start once class begins. If a Lab host is at capacity, that student shows as `capacity_waiting` in the results rather than failing silently — check back or ease off other concurrent load. **Start class** Open the classroom → Start class. Status moves to `live`; students now see a "LIVE NOW" banner on their Classroom tab and can join. **During class** - **Participants table**: presence (`online`/`recently_active`/`offline`, derived from each student's last heartbeat — not a hard real-time signal, allow ~30s of lag), Lab status, and a one-line current-work snapshot (stage, scenario, validation failures, hints used). - **Set current activity**: enter a scenario ID and Set. This only shows students a link — it never redirects their browser or marks anything complete. Use it to say "everyone open this next," not to force navigation. - **Post an announcement**: short messages, shown newest-first on the student side. - **Help queue**: students flag `lab_problem` / `dont_understand` / `validation_failing` / `other` with an optional note. Acknowledge when you've seen it, Resolve when it's handled. There is no chat here — if it needs back-and-forth, use your actual video call. **End of class** Open the classroom → End class. Status moves to `ended`; this does not touch Labs or student progress — destroy Labs separately from the cohort view if you're done with them for the day. **If you need to cancel a scheduled (not yet started) class:** Cancel, from the classroom detail view. A `live` class can only be ended, not cancelled. **If the Platform API restarts mid-class** (deploy, crash, host reboot): nothing to do. Sessions, the live classroom row, and participant presence all live in Postgres, not in the API process's memory — students' browsers keep their existing session and heartbeat right through it, and the dashboard shows the same state a few seconds after the API comes back. This is exercised for real in `infra/scripts/drills/test-phase5a-rehearsal.js`, which restarts the API mid-rehearsal and asserts on exactly this.