UC-11 Admin manages a live event
| Primary actor | SHS Staff (Admin) |
| Supporting actors | Event Attendant |
| Priority | Should |
| Satisfies | FR-D4, FR-D5, FR-D6, FR-D8 |
| Precondition | A published challenge with the event's task exists. |
| Trigger | The admin opens Live Ops for the task, or the attendant opens the display link. |
Live shows one of two variants, by the week's check-in method (ADR 0006): the rotating code for a staffed table, or the printed poster for a location nobody staffs. The count card, the number-only feed and the override panel are the same on both.
Main success scenario (rotating code)
- Live Ops shows the event QR, re-minted every 30 seconds so a photographed code stops validating, with the 7-character backup code beside it.
- The admin, or an attendant with no account, opens the display link on a projector: a full-screen QR with no staff session on the shared screen.
- Live Ops polls the check-in count and a feed that identifies students only by number.
- Where a scan failed, the admin records, corrects or removes a completion in the override panel, giving a reason; the change and its audit row commit together.
Alternative success scenario (printed poster)
- Live Ops shows a miniature of the sheet, a window status chip (Opens Tue 11:00 AM / Open until 2:00 PM / Ended 2:00 PM), and the caption Printout N · the code on the poster works only during the event window. No rotating QR, no Rotate code, no display links.
- Print poster opens the poster page: one US Letter sheet, black on white, the challenge and week, where and when in campus time, a 3.5-inch QR encoding
/checkin#t=<token>, one instruction line, Printout N. Opening the page mints the poster (poster_issued). Printing it again voids nothing. - Copy check-in link and Download QR mint the same credential (the same URL, window and generation) for an email, an announcement or a flyer.
- Reprint and void old copies, behind a confirm that names the consequence, advances the week's printout generation (
poster_reissued): every earlier sheet is refused as replaced from the next scan on, and the poster page opens with the new printout. - The count and the number-only feed are how an admin at their desk sees the poster working; the override panel is the catch-up path after the window closes.
Extensions
- 1a. The projected code is stale. Live Ops warns before students scan it.
- 2a. Display link rate limit. The public display endpoint is throttled per client.
- 4a. Override on a rehearsal student. Allowed, and excluded from reports like every rehearsal row.
- Method switch (UC-5). Switching a week off the poster also advances its generation, so switching back later does not revive old sheets; switching onto the poster ends any live display link. Both are
checkin_method_changedin the ledger. - A display link for a poster week is refused (409); a poster for a rotating week is refused the same way.
- Audit. Every override names the student and the acting admin in
CheckInAudit; the reason is required.
Acceptance criteria (Gherkin)
| Feature file | Test module |
|---|---|
live_event_dashboard.feature |
test_live_event_dashboard_bdd.py |
live_qr_staleness.feature and frontend/live_qr_staleness.feature |
test_live_qr_staleness_bdd.py |
display_link.feature |
test_display_link_bdd.py |
manual_override.feature |
test_manual_override_bdd.py |
checkin_audit_names_the_student.feature and frontend/checkin_audit_names_the_student.feature |
test_checkin_audit_names_the_student_bdd.py |
check_in_override_panel_dismissal.feature and frontend/check_in_override_panel_dismissal.feature |
test_check_in_override_panel_dismissal_bdd.py |
Plain pytest: test_manual_override.py, test_display_link.py, test_display_link_rate_limit.py, test_checkin_audit_student_subject.py; for the poster, test_event_poster.py (mint, 409s, reissue and its ledger rows) and test_task_checkin_method.py (the switch, the display-link refusal and revoke). Frontend: LiveOps.test.tsx, LiveOps.staleness.test.tsx, Display.test.tsx, LiveOps.poster.test.tsx, PosterPage.test.tsx.
Views
- Process: UC-11 Live event
- Logical:
CheckInAuditin the domain model
Code: backend/app/routers/display_links.py, backend/app/services/display_links.py, backend/app/services/checkins.py, backend/app/routers/posters.py, backend/app/services/posters.py, frontend/src/components/admin/LiveOps/, frontend/src/components/admin/PosterPage/, frontend/src/components/Display/. ADR 0005 records the display-credential decision and ADR 0006 the poster.