Skip to content

Using The Dashboard

The dashboard is a single screen at http://localhost:3000. Everything on it comes from the same handful of polled endpoints, so the whole view stays in sync with itself.

Track A Student

Type a student ID into Track a student. The daemon backfills their recent history, materializes their state, and their card shows up within a tick or two. Removing a student stops tracking them and deletes their local data.

Student Cards

There's one card per tracked student, kept in a stable order so a card never jumps around when its own data updates (present students sort first, then alphabetically by ID). Each card shows four things:

Element What It Shows
Strategy state the current HMM state: Iterator, Explorer, or Stuck
Strategy sparkline the per-run HMM state sequence over time
Episode sparkline the segmented code / run / reset timeline
Counts run and event totals for the session

Each card also carries Present and Picked toggles for the interview workflow. Marking a student absent dims their card and drops it to the bottom; marking them picked records that you've interviewed them this session (with a timestamp).

What The Strategy States Mean

State Label How To Read It
0 Iterator steady, incremental edits between runs
1 Explorer bigger structural changes, trying new approaches
2 Stuck wheel-spinning, not much productive change

Who-Needs-Help Column

The column on the right is the live intervention feed. It shows every alert the daemon has fired that hasn't yet resolved or been acknowledged.

Trigger Colour Fires When
Wheel-spinning red the HMM puts the student in the stuck state
Inactive amber no events for 5 minutes or more
Big rewrite purple a single run's change_score hits 0.5 or higher

Each row shows the student ID, the trigger label and its value (something like 3 re-runs for wheel-spin, idle 7m for inactive, change 0.71 for a big rewrite), and how long ago it fired. Click a row to open that student's detail, hit the to dismiss the alert, or use Notes to jot an observation right against the alert.

Re-Alert

Acking a sustained trigger (wheel-spin or inactive) doesn't silence it forever. If the condition keeps holding for another 10 minutes, the daemon closes the acked row and opens a fresh one, so a student who never actually got unstuck comes back to the feed.

You can also turn whole trigger types on or off from the ⚙ Triggers button in the top bar. Switching one off tells the daemon to stop firing it and clear its open alerts.

Pause / Resume Polling

The top bar has a ⏸ Pause polling toggle. Pausing tells the daemon to stop hitting the production server completely. It makes zero requests to prod while paused, keeps showing the last data it pulled, and picks back up within about a second of you clicking ▶ Resume polling. While it's off, the status dot turns amber and a "Daemon Paused" label shows up next to the title.

Tip

Use this between sessions. The daemon polls production the whole time it's running, even during quiet stretches, which is a constant load on prod. Pausing when no class is active gives prod room to recover, which really matters if it's on a CPU-credit (burstable) instance. The toggle is shared, so every open dashboard sees the same state.

The daemon process keeps running while paused. Pausing only stops the polling, not the daemon itself.

Drill-Down

Click any card to open the full detail:

  • The playground prompt, which is their current code described in plain language for an LLM.
  • Full-size episode and strategy timelines.
  • The complete notes and observations log for that student, with a box to add more.

The detail view fetches its own per-student payload on open and keeps it refreshed while the modal is up.

Export

The ⬇ Export button writes a CSV snapshot of the data (raw events, materialized state, triggers, roster, notes) to exports/export_<timestamp>/. It's read-only, so the database is never touched and you can run it any time. A success dialog tells you where it landed.

Reset

The ↺ Reset button clears all the locally-stored events, episodes, strategy state, flags, and notes, and tells the daemon to drop its in-memory workers so the board starts fresh from new activity.

Info

Reset writes a CSV backup (notes included) to exports/reset_<timestamp>/ before it wipes, so nothing is actually lost. It's local only, production is never touched. The raw event cursor stays put, so the board rebuilds only from activity that arrives after the reset, and tracked students stay tracked.