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 sameoidc_subon both sides. edu-ID issues a pairwise subject per client:subcan 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:
subis 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
freeor 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:readgranted, used byfetchOrgLlmSecret?) — needs the App settings page (product owner).