Skip to content

M0-02 — Production measurements (2026-09-28)

Read-only queries on both production databases (hgc and quiz, the app VM). Identity keys were compared as md5 digests exported to a scratch directory and deleted afterwards; nothing personal is recorded here.

Identity

Quiz Classroom
users 84 121 (113 students, 7 teachers, 1 admin)
without swiss_edu_id 0 26
anonymised (anon-*) 0 0
oidc_sub shape 32 chars, edu-ID 32 chars, edu-ID (no Keycloak-era sub left)
  • 55 people are in both databases (same swiss_edu_id); none has the same oidc_sub on both sides. edu-ID issues a pairwise subject per client: sub can never be a cross-app key, and a classroom user imported as a new Quiz user needs login adoption (§2.4, rule 4) — otherwise their first Quiz login creates a second account.
  • Of the 66 classroom users not matched by swiss_edu_id, 17 match by a verified address (none ambiguous) and 49 are new to Quiz.
  • No verified address is held by two classroom accounts.

Classroom content

What Count
GitHub organizations 14 (10 with the App installed, 2 degraded)
classrooms 12 (1 archived), 11 orgs, 4 owners
staff seats 2 (1 teacher, 1 assistant), 0 pending
enrollments 158 (136 claimed, 22 pending); status ⇔ user_id holds
assignments 43 — 1 draft, 25 locked, 14 published (1 in group mode)
assignments with work_mode ≠ free 3, all in test classrooms with a roster of 1
student repositories 290 (0 group repositories)
grade runs 359 CI, 85 LLM
journals 2, attached to 2 classrooms, 4 pages, 0 assets
webhook deliveries 4 697, 0 unprocessed
audit rows 13 304
teacher grants 5 (4 with codespace enabled)

Classes present in both apps

Three classroom-classrooms have a live Quiz counterpart with a similar roster, so the import will merge into existing Quiz classrooms, not only create new ones (§2.6):

Classroom (org / name, roster) Quiz (course / classroom, roster)
Info1-MI-2026 / Info1-MI-2026, 22 INFO1 / MI-2026, 22
heigvd-2026-prog-a / Prog-A, 30 PROG / Prog-A, 28
Prog-C-2026-2027 / Prog-C-2026-2027, 21 PROGC-INFO1 / Prog-C-2026-2027, 22

The others (ProgOO-A, ProgD_2026, TraiSignAp-A, VisIndus-A, and test classrooms) have no Quiz counterpart: new courses, or dropped for the test ones (D22).

Consequences for the decisions

  • D08: sub is excluded from matching. Cascade: swiss_edu_id → verified address → new user + login adoption (required, M1-06 carries it with its ADR).
  • D09: the online workspace has never served a real class ⇒ M6 leaves the critical path (runs after the cutover); the 3 test assignments are imported as free or dropped with their test classrooms.
  • D04 (b): no pending staff seat ⇒ nothing to build; the one assistant becomes a course staff seat.
  • Groups: one group-mode assignment, no group repository yet — M3-15/16 stay in scope (the feature is in use) but carry no data risk.
  • Journal: tiny (4 pages, no asset): D14 is not a sizing question.

Not measured

  • The live GitHub App's permissions (is org Secrets:read granted, used by fetchOrgLlmSecret?) — needs the App settings page (product owner).