Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

02 — User Personas (Attendance Module)

Five personas that drive the attendance surface. Every claim derives from src/modules/** — roles/permissions from role.schema.ts:8-65 and permissions.constants.ts:29-30,39-43; marking model from attendance.schema.ts and attendance.service.ts; alerting/reporting from attendance.worker.ts and reports.service.ts.


1. Teacher — "the marker"

"I need the whole class done before the bell stops ringing."

AttributeValue
Roleteacher['student.read','attendance.mark','attendance.edit'] (role.schema.ts:31)
Frequency2–8 times/day, per class period, peak at class start
ContextStanding, tablet/phone in hand, 40 students, < 60 s per class
PainDouble-entry, slow grids, losing work to a bad connection
SuccessBulk mark in one tap; late students caught without re-marking everyone
Sourcesmark-attendance.dto.ts:11-49; attendance.service.ts:48-54 (bulk = one request)

Needs: default-present grid (fast path), tap-cycle to change a row, batch ops, undo for mistaps, offline queue that flushes when signal returns, PATCH for corrections later.

2. Organization Admin — "the overseer"

"Is attendance actually being taken, and what does the month look like?"

AttributeValue
Roleorg_adminALL_PERMISSIONS incl. attendance.mark/edit, report.generate/read, biometric.* (role.schema.ts:23; permissions.constants.ts:29-30,39-43)
FrequencyDaily glance; weekly/monthly deep-dives; end-of-term
PainNo visibility into unmarked classes; slow aggregations
SuccessSummary counts per status (attendance.service.ts:103-113), monthly report job (reports.service.ts:110-137), device health
SourcesGET /attendance/summary; POST /reports/generate; dashboard.service.ts:54-65

Needs: today's completion % (marked vs roster), month heatmap by class, per-student drill down, device ingest status (what's coming in from biometric).

3. Parent — "the watcher"

"Tell me the moment my child is marked absent — and show me the month."

AttributeValue
Roleparent['student.read'] (role.schema.ts:55) — no attendance permission today (OQ-7)
FrequencyDaily at dismissal; on alert; weekly review
PainFinding out about absences days later; no context for a lone "absent"
SuccessAbsent alert the same day; month strip showing pattern (absences/lates cluster?)
SourcesAlert path: attendance.worker.ts:69-80 (log-only today, OQ-1); history read: attendance.service.ts:63-73
Semantics"3 absences → alert recommended" counts all absences, not consecutive days (attendance.worker.ts:70-74)

Needs: child selector, month calendar heatmap, alert inbox item that deep-links to the day, "3 absences this month" honesty (never promise "consecutive" semantics — OQ-1).

4. Student — "the self-checker"

"What's my attendance %? I need to know before the report card."

AttributeValue
Rolestudent[] permissions (role.schema.ts:63) — read-only via student.read surface today (OQ-7)
FrequencyWeekly; before exams (attendance % often gates exams)
PainNo per-status breakdown; "present" vs "late" impact on % unclear
SuccessOwn history: GET /attendance/student/:studentId (END_TO_END_USER_FLOWS.md:324-325,348) + summary derived client-side
Sourcesattendance.service.ts:63-73; report-job report card includes attendance indirectly (reports.service.ts:85-108)

Needs: % present, month heatmap, status legend, absence reasons they can raise with the teacher.

5. Biometric Operator — "the integrator"

"Are punches landing, and are they turning into attendance?"

AttributeValue
RoleAdmin-adjacent staff with biometric.log.create/read, biometric.device.manage (permissions.constants.ts:41-43)
FrequencySetup; daily health check; incident response
PainDevices silently failing; punches stored but never becoming attendance
SuccessDevice status (active/inactive/offline, biometric-device.schema.ts:7-11), ingest count today, clear "logs only" vs "derived" pipeline status
SourcesPOST /biometric/ingest (biometric.controller.ts:14-18); biometric_logs schema (biometric-log.schema.ts:7-27); biometric-sync cron */15 (scheduler.service.ts:71-76)
GapNo worker consumes biometric-sync today — derivation (planned) (OQ-3); UI must show "captured but not yet applied"

Needs: device list w/ last-punch time, ingest trend, explicit badge "not yet applied to attendance" while OQ-3 is unresolved.


Persona matrix → screens (map to 05_Screen_Inventory.md)

PersonaPrimary screensPermissions needed
TeacherS1 Today's roster, S2 Marking grid, S3 Batch edit, S4 History/calendarattendance.mark, attendance.edit, student.read
Org AdminS4 History, S5 Monthly report, S6 Report detail, S8 Device statusattendance.*, report.*, biometric.*
ParentS7 Student profile (child), alert deep-linkstudent.read (OQ-7)
StudentS7 Student profile (self)student.read (OQ-7)
OperatorS8 Device statusbiometric.device.manage, biometric.log.read