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 (Exams Module)

Six personas derived from the roles and permissions available in src/modules/rbac/ and the flows the exams API supports (examination.controller.ts, result.controller.ts). Permissions quoted are the available ones in permissions.constants.ts:1-97 — note no exam.* permission exists yet (OQ-4, see 01_Product_Overview.md §10); the RBAC column below is the target contract from studylyon-blueprint/04-Modules/Exams.md:64-72 and is (planned) until seeded.


1. Exam Coordinator — "the planner"

WhoSenior academic admin (principal, vice-principal, academic coordinator) at the tenant org
Roles / permissionsAdmin role (all permissions, role.schema.ts:23); target: exam.create, exam.update, exam.delete, exam.publish (planned)
FrequencyWeekly during planning season; daily during results week
DeviceTablet + desktop web; office Wi-Fi
GoalsCreate the term's exam calendar (name, type midterm/final/unit_test/quarterly/otherexamination.schema.ts:15-20); attach subject slots per class (date + 09:00-style time window + maximumMarks/passingMarks); keep statuses honest (draft → active → completed → published); publish results only when every subject is marked
Pain pointsNo server-side conflict detection for subject dates (OQ-2) — they must eyeball overlaps; publish is irreversible in UI terms (examination.service.ts:203-220 sets status published); no bulk tools — each subject slot is one POST (examination.controller.ts:45-50)
BehaviorsReviews the exam list (GET /examinations, paginated) by status; drills into a detail (GET /examinations/:id + GET /examinations/:id/subjects) to check marks coverage (GET /results/exam-subject/:id); uses the publish dialog as a final checklist
Exit criteriaExam visible with correct slots; all marks entered; publish succeeded → snackbar + list shows published badge

2. Class Teacher — "the marker"

WhoClass teacher / subject teacher marking a class's answer sheets
Roles / permissionsTeacher role (role.schema.ts:31); target: exam.mark (planned)
FrequencyDaily during exam week; per subject-slot
DevicePhone + tablet; classroom Wi-Fi may be flaky
GoalsOpen the slot for my class+subject, enter marksObtained per student fast (numeric keyboard, row-swipe cadence), fix typos in place, finish and verify coverage
Pain pointsMarks above the slot maximum are rejected by the server with a 404 NotFoundException('Marks cannot exceed maximum.') (examination.service.ts:145-146) — confusing if not pre-validated; per-subject grade is free text (examination-subject.dto.ts:57-60) so they must type it or leave blank; no bulk marks endpoint today (/marks-import is (planned), IMPLEMENTATION_PLAN.md:219)
BehaviorsEnters marks row by row; re-taps a cell to correct (upsert updates in place — examination.service.ts:147-175); checks the coverage summary bar (marked / total students) before leaving
Exit criteriaEvery roster student has a mark ≤ maximumMarks; coverage 100%

3. Principal — "the approver"

WhoPrincipal or director; owns the publish decision
Roles / permissionsAdmin; target: exam.publish (planned)
Frequency2–6 times per term (per exam)
DevicePhone / tablet; on the move
GoalsVerify marks coverage across subjects, approve publish; afterwards, confirm students/parents can see results (publishedAt stamped on every result — examination-result.repository.ts:42-51)
Pain pointsPublish has no guard against re-publish or post-publish edits (OQ-5) — trust in the UI's "published = locked" treatment; no server-side check that all marks are entered before publish (it publishes whatever exists — examination.service.ts:203-220)
BehaviorsOpens exam detail, glances at per-subject coverage, taps Publish, confirms in the dialog, watches for the published status flip
Exit criteriaExam shows published; report cards reachable (GET /results/report-card/:studentId/:examId)

4. Student — "the candidate"

WhoEnrolled student of the tenant
Roles / permissionsStudent role (role.schema.ts:63); reads via result.read (planned)/student.read today
FrequencyAfter each exam's publish; before each exam to see schedule
DevicePhone; shared data plan
GoalsSee the exam schedule and their marks per subject (GET /results/student/:studentId), open the report card (percentage + overallGrade A+…F — result.service.ts:130-138), see grade/remarks per subject
Pain pointsResults before publish are invisible server-side only if they never appear; a subject with no mark renders as 0 marks on the report card (result.service.ts:70) — must be explained in UI; marks are visible regardless of publish state through the student-results route (no visibility filter — result.repository.ts:26-28)
BehaviorsChecks the results tab after "results published" notification (in-app/results-published job — event-queue-map.ts:27 (planned)); screenshots the report card
Exit criteriaReport card shows totals, percentage, grade; understands why a subject shows 0

5. Parent — "the verifier"

WhoParent/guardian of an enrolled student
Roles / permissionsParent role (role.schema.ts:55); reads via result.read (planned) / student.read today
FrequencyAfter each published exam
DevicePhone; home Wi-Fi
GoalsVerify the child's report card; compare marksObtained vs maximumMarks per subject; check remarks from teachers
Pain pointsSame as student: unpublished results reachable via the route; subject-name resolution is raw subjectId in the report card payload (result.service.ts:75 — OQ-9) — client must resolve names locally
BehaviorsPassive reader; shares the card with family
Exit criteriaFull subject table + totals rendered from GET /results/report-card/:studentId/:examId

6. Support / QA Analyst — "the verifier"

WhoSchool IT support or QA reviewing tenant data
Roles / permissionsOrg admin; audit.read (permissions.constants.ts:54)
FrequencyOn incident
DeviceDesktop
GoalsTrace a "wrong marks" complaint: check exam status, slot max marks, the student's result doc, and the version counter (base.schema.ts:30-31) to confirm how many edits happened; verify publish timestamps (publishedAt)
Pain pointsEvents like MarksEntered are emitted but not persisted to an audit queue (no queue route in event-queue-map.ts — OQ-8); soft-deleted exams are invisible after DELETE (base.repository.ts:68-74)
BehaviorsReplays the flow read-only; compares server state against the client's optimistic UI claims
Exit criteriaRoot cause identified (data vs display)

7. Persona × permission matrix (target contract, (planned))

ActionCoordinatorTeacherPrincipalStudentParent
List/view examsexam.read*exam.read*✅ (read-only)
Create/update/delete examexam.create/update/delete
Add subject slotexam.update
Enter marksexam.mark
Publishexam.publishexam.publish
View own results/report cardresult.readresult.read

* exam.* / result.* permissions are not yet in permissions.constants.ts:1-97 (see 01_Product_Overview.md §10 OQ-4); the matrix is the design target, not the current server contract.