# EnCoach Platform -- Granular User Stories (English Only)

**Document Version:** 2.0
**Date:** April 2026
**Status:** Active -- Ready for Development
**Scope:** English Language Only (General English + IELTS). Math/IT deferred to future phase.
**Audience:** Odoo Developer (full-stack, using Cursor IDE)

---

## Companion Documents

| Document | Version | Purpose |
|----------|---------|---------|
| `ENCOACH_WORKFLOWS_FRONTEND_SRS.md` | v1.1 | Frontend technical specification |
| `ENCOACH_WORKFLOWS_BACKEND_SRS.md` | v1.1 | Backend technical specification |
| `ENCOACH_USER_STORIES_OVERVIEW.md` | v1.0 | High-level overview (superseded by this document for development) |

---

## How to Read This Document

Each user story follows this format:

> **US-[ACTOR]-[NUMBER]: [Title]**
> **As a** [single role], **I want to** [one specific action], **so that** [one clear benefit].

**One story = one function = one testable unit.**

### Actor Prefixes

| Prefix | Actor | Section |
|--------|-------|---------|
| SL | Self-Learning Student | Section 1 |
| ES | Entity/University Student | Section 2 |
| AD | Admin / Teacher | Section 3 |
| PV | Public Verifier | Section 3 (end) |

### Priority Legend

| Priority | Meaning |
|----------|---------|
| **Must Have** | Core functionality. Cannot launch without this. |
| **Should Have** | Important. Can be deferred briefly if needed. |
| **Could Have** | Desirable enhancement. Implement if time permits. |

---

# SECTION 1 -- SELF-LEARNING STUDENT JOURNEY

The complete end-to-end journey of an individual student who registers independently, pays for access, and learns on their own.

---

## 1A. Registration

### US-SL-01: Register a New Account

**As a** self-learning student, **I want to** create an account by providing my name, email, password, and selecting "Self-Learner" as my role, **so that** I can access the platform independently.

**Acceptance Criteria:**
- [ ] Registration page is accessible at `/register` without authentication
- [ ] Form fields: Full Name, Email, Password, Confirm Password, Role (select "Self-Learner"), CAPTCHA
- [ ] Password strength indicator updates in real time (Weak/Medium/Strong)
- [ ] Email uniqueness checked on blur; inline error if taken
- [ ] CAPTCHA must be completed before submission
- [ ] On success, redirect to `/verify-email?email={email}`
- [ ] On validation error, show field-level error messages

**Flow:**
1. Student opens `/register`
2. Fills in all fields, selects "Self-Learner" role
3. Completes CAPTCHA
4. Clicks "Create Account"
5. System creates account, sends 6-digit OTP to email
6. Redirect to email verification page

**Error / Edge Cases:**
- Duplicate email: inline error on blur
- CAPTCHA failure: "Please complete the CAPTCHA"
- Network error: toast "Something went wrong. Please try again."

**SRS Reference:** Frontend 4, Backend 12
**Priority:** Must Have

---

### US-SL-02: Verify Email Address

**As a** self-learning student who just registered, **I want to** enter a 6-digit verification code sent to my email, **so that** the platform confirms I own this email address.

**Acceptance Criteria:**
- [ ] Page shows "We've sent a 6-digit verification code to {email}"
- [ ] 6-digit OTP input auto-focuses first digit, advances focus automatically
- [ ] "Verify" button enabled only when all 6 digits entered
- [ ] On valid OTP: redirect to `/onboarding`
- [ ] On invalid OTP: clear input, show "Invalid verification code. Please try again."
- [ ] On expired OTP: show "This code has expired. Please request a new one."
- [ ] "Resend code" disabled for 60 seconds after each send (countdown shown)
- [ ] Maximum 3 resend attempts; after 3: "Maximum resend attempts reached. Please contact support."
- [ ] Code expires after 15 minutes (countdown timer shown)

**Flow:**
1. Student lands on `/verify-email?email={email}`
2. Checks email for OTP
3. Enters 6 digits
4. Clicks "Verify"
5. On success, proceeds to onboarding wizard

**Error / Edge Cases:**
- Wrong code: input clears, retry allowed
- Code expired: must request new one
- All 3 resends exhausted: contact support
- Browser closed: returns to verification on next login (account still unverified)

**SRS Reference:** Frontend 5, Backend 13
**Priority:** Must Have

---

## 1B. Onboarding

### US-SL-03: Select Learning Goal

**As a** self-learning student, **I want to** select my learning goal (General English, IELTS Academic, or IELTS General Training) in Step 1 of the onboarding wizard, **so that** the platform tailors my experience to my objective.

**Acceptance Criteria:**
- [ ] Step 1 of 4 in the onboarding wizard at `/onboarding`
- [ ] Progress bar shows "Step 1 of 4"
- [ ] Radio card group displays available goals loaded from `GET /api/onboarding/goals`
- [ ] English-related options: General English, IELTS Academic, IELTS General Training
- [ ] Each card has: icon, title, description
- [ ] User must select one goal before clicking "Next"
- [ ] "Back" button is hidden on Step 1

**Flow:**
1. Student lands on onboarding wizard
2. Views available learning goals
3. Selects one goal (e.g., "IELTS Academic")
4. Clicks "Next" to proceed to Step 2

**SRS Reference:** Frontend 6, Backend 14
**Priority:** Must Have

---

### US-SL-04: Set Target Level and Timeline

**As a** self-learning student, **I want to** set my target band/CEFR level and optionally an exam date in Step 2, **so that** the platform knows what I'm aiming for and by when.

**Acceptance Criteria:**
- [ ] Step 2 of 4 in the onboarding wizard
- [ ] For IELTS goals: band score slider 4.0-9.0 in 0.5 steps
- [ ] For General English goals: CEFR level select (A1-C2)
- [ ] Optional exam date picker: "I have an upcoming exam on..."
- [ ] Checkbox: "I don't have a specific exam date" hides the date picker
- [ ] "Back" returns to Step 1 without losing data
- [ ] "Next" proceeds to Step 3

**Flow:**
1. Student sets target band/CEFR level
2. Optionally selects exam date or checks "no specific date"
3. Clicks "Next"

**SRS Reference:** Frontend 6, Backend 14
**Priority:** Must Have

---

### US-SL-05: Set Study Preferences

**As a** self-learning student, **I want to** configure my study hours per week, study mode, and learning style in Step 3, **so that** the platform personalises content delivery to my preferences.

**Acceptance Criteria:**
- [ ] Step 3 of 4 in the onboarding wizard
- [ ] Hours per week: slider, 1-40, default 10. Shows estimated completion time
- [ ] Study mode: radio group -- "Self-study" or "With a teacher"
- [ ] Learning style: checkbox group (multi-select, at least one) -- Visual, Audio, Reading, Mixed
- [ ] "Back" returns to Step 2 without losing data
- [ ] "Next" proceeds to Step 4

**Flow:**
1. Student adjusts study hours slider
2. Selects study mode
3. Selects one or more learning styles
4. Clicks "Next"

**SRS Reference:** Frontend 6, Backend 14
**Priority:** Must Have

---

### US-SL-06: Choose Placement Test Decision

**As a** self-learning student, **I want to** decide whether to take the placement test now or skip it in Step 4, **so that** I can either get an accurate level assessment or start at a default level.

**Acceptance Criteria:**
- [ ] Step 4 of 4 in the onboarding wizard
- [ ] Heading: "Ready to find your level?"
- [ ] Description explains the test (~20-30 minutes)
- [ ] "Take Placement Test Now" button: submits wizard data, navigates to `/student/placement`
- [ ] "Skip for Now" button: shows warning "Without a placement test, we'll start you at B1 (intermediate) level. You can take the test anytime from your dashboard." Submits wizard data, navigates to `/student/dashboard`
- [ ] On submission, account status changes to `activated`
- [ ] All 4 steps of wizard data submitted via `POST /api/onboarding/complete`

**Flow:**
1. Student reads the placement test description
2. Chooses "Take Placement Test Now" or "Skip for Now"
3. Wizard data is submitted
4. Account is activated
5. Redirect to placement test or dashboard

**Error / Edge Cases:**
- Browser closed mid-wizard: data lost, user restarts wizard on next login (account still `unactivated`)
- Skip chosen: default level B1, dashboard banner prompts test later

**SRS Reference:** Frontend 6, Backend 14
**Priority:** Must Have

---

## 1C. Placement Test

### US-SL-07: View Placement Test Briefing

**As a** self-learning student, **I want to** see an overview of the placement test before starting, **so that** I know what to expect (sections, duration, adaptive nature).

**Acceptance Criteria:**
- [ ] Briefing page at `/student/placement`
- [ ] Shows: subject (English), estimated duration (20-30 min), section count (4), adaptive note
- [ ] Dimension breakdown table: Grammar (~30 MCQ, ~8 min), Vocabulary (~20 items, ~5 min), Reading (~10 Q / 2 passages, ~10 min), Speaking (3 prompts, ~5 min)
- [ ] "Begin Test" button starts the test
- [ ] If an active incomplete session exists, "Begin Test" resumes from where the student left off

**Flow:**
1. Student navigates to `/student/placement`
2. Reviews test overview
3. Clicks "Begin Test"
4. System creates CAT session and navigates to test interface

**SRS Reference:** Frontend 7, Backend 15
**Priority:** Must Have

---

### US-SL-08: Take Placement Test -- Grammar Section

**As a** self-learning student, **I want to** answer adaptive grammar questions one at a time, **so that** the system accurately assesses my grammar proficiency.

**Acceptance Criteria:**
- [ ] Full-screen distraction-free interface (no sidebar)
- [ ] Top bar: elapsed timer, section name "Grammar", progress "Question X of ~30"
- [ ] Each question fetched one at a time from backend (no pre-loading)
- [ ] After each answer, next question adapts in difficulty (IRT algorithm)
- [ ] Question types: MCQ (single answer), MCQ (multiple answers)
- [ ] "Previous" button disabled (no going back in CAT)
- [ ] Auto-save every 10 seconds; "Saved" indicator shown
- [ ] When backend returns `section_complete: true`, show transition: "Grammar section complete. Next: Vocabulary" with countdown or "Continue" button

**Flow:**
1. First grammar question appears
2. Student selects answer, clicks "Next"
3. Backend returns next (adapted) question
4. Repeat until section complete
5. Transition screen to Vocabulary section

**Error / Edge Cases:**
- Network loss: auto-save ensures no data loss; resume on reconnection
- Browser close: resume from last save on next login

**SRS Reference:** Frontend 8, Backend 15-16
**Priority:** Must Have

---

### US-SL-09: Take Placement Test -- Vocabulary Section

**As a** self-learning student, **I want to** answer adaptive vocabulary questions, **so that** the system assesses my vocabulary range.

**Acceptance Criteria:**
- [ ] Section name shows "Vocabulary", progress updates
- [ ] Question types: MCQ, gap fill, definition match
- [ ] Same CAT adaptive behaviour as Grammar section
- [ ] Auto-save every 10 seconds
- [ ] On section complete, transition to Reading section

**Flow:**
1. First vocabulary question appears after Grammar transition
2. Student answers adaptive questions
3. Section completes, transition to Reading

**SRS Reference:** Frontend 8, Backend 15-16
**Priority:** Must Have

---

### US-SL-10: Take Placement Test -- Reading Section

**As a** self-learning student, **I want to** read passages and answer comprehension questions, **so that** the system assesses my reading proficiency.

**Acceptance Criteria:**
- [ ] Section name shows "Reading", progress updates
- [ ] Split view: passage on left, questions on right (desktop). Scrollable passage above questions (mobile).
- [ ] Question types: MCQ, True/False/Not Given
- [ ] Passages progress from easy to difficult (CAT adaptation)
- [ ] Auto-save every 10 seconds
- [ ] On section complete, transition to Speaking section

**Flow:**
1. First reading passage and questions appear
2. Student reads passage, answers questions
3. Repeat for second passage
4. Section completes, transition to Speaking

**SRS Reference:** Frontend 8, Backend 15-16
**Priority:** Must Have

---

### US-SL-11: Take Placement Test -- Speaking Section

**As a** self-learning student, **I want to** record spoken responses to 3 prompts, **so that** the system can evaluate my speaking ability via AI.

**Acceptance Criteria:**
- [ ] Microphone permission prompt appears at the start of the section
- [ ] If permission denied: section skipped with note "Speaking section skipped. Your placement will be based on the other three sections."
- [ ] 3 speaking prompts, each showing: prompt text, "Start Recording" button, 60-second countdown
- [ ] During recording: waveform visualiser, "Stop" button
- [ ] After recording: playback controls, "Re-record" (max 1 re-record per prompt), "Submit Recording"
- [ ] Audio uploaded as blob via `POST /api/placement/speaking-upload`
- [ ] On final prompt submission, "Finish Test" button navigates to results page

**Flow:**
1. Microphone permission requested
2. First speaking prompt displayed
3. Student clicks "Start Recording", speaks for up to 60 seconds
4. Clicks "Stop", reviews via playback
5. Optionally re-records once
6. Clicks "Submit Recording"
7. Repeats for prompts 2 and 3
8. Clicks "Finish Test"

**SRS Reference:** Frontend 8, Backend 18
**Priority:** Must Have

---

### US-SL-12: View Placement Results

**As a** self-learning student, **I want to** see my overall CEFR level and per-dimension scores after completing the placement test, **so that** I understand my current proficiency.

**Acceptance Criteria:**
- [ ] Results page at `/student/placement/results?session={id}`
- [ ] Overall CEFR level displayed prominently (e.g., "B2" with coloured badge)
- [ ] Per-dimension scores in a radar chart: Grammar, Vocabulary, Reading, Speaking
- [ ] Score table: Dimension, Score %, CEFR Level, Gap to Target
- [ ] If Speaking evaluation is pending: row shows "Pending" badge, polls `GET /api/placement/speaking-status` every 30 seconds until complete
- [ ] "Continue" button at the bottom navigates to learning path preview

**Flow:**
1. Student lands on results page after test completion
2. Views overall CEFR level
3. Reviews per-dimension breakdown
4. Waits for Speaking evaluation if pending
5. Clicks "Continue"

**Error / Edge Cases:**
- Speaking pending: "Pending" badge with polling
- Network error loading results: retry button

**SRS Reference:** Frontend 9, Backend 15, 17
**Priority:** Must Have

---

### US-SL-13: View Personalised Learning Path Preview

**As a** self-learning student, **I want to** see a personalised learning path based on my placement results BEFORE any payment prompt, **so that** I understand what I will study and can make an informed decision about subscribing.

**Acceptance Criteria:**
- [ ] Learning path preview section on the results page (below scores)
- [ ] Course outline card: estimated duration, module count, study hours per week
- [ ] Skill gap modules listed by priority (largest gap first) with: module name, estimated hours, resource type icons (PDF, Video, Audio, Exercise), difficulty level
- [ ] "View Full Course Plan" button expands the detailed module breakdown
- [ ] This is shown BEFORE any payment prompt (key design principle)

**Flow:**
1. Student views placement results
2. Scrolls down to learning path preview
3. Reviews proposed modules and estimated effort
4. Clicks "Continue" to proceed to payment options

**SRS Reference:** Frontend 9, Backend 15
**Priority:** Must Have

---

### US-SL-14: Choose Payment or Access Option

**As a** self-learning student, **I want to** choose between full subscription, free trial, or skip, **so that** I can start learning immediately or decide later.

**Acceptance Criteria:**
- [ ] Three pricing cards at `/student/placement/access`:
  - "Unlock Full Course" -> navigates to `/student/subscription`
  - "Try Free for 7 Days" -> activates trial, navigates to dashboard
  - "Continue to Dashboard" -> navigates to dashboard with persistent banner
- [ ] Free trial: limited access to first 3 modules only
- [ ] Skip: persistent banner on dashboard "Unlock your personalised course -- Subscribe now"

**Flow:**
1. Student views three pricing options
2. Selects one
3. Proceeds to subscription, dashboard (trial), or dashboard (skip)

**SRS Reference:** Frontend 10
**Priority:** Should Have

---

## 1D. Exam Taking

### US-SL-15: Start an Assigned Exam Session

**As a** self-learning student, **I want to** open an exam that has been assigned to me and enter the distraction-free exam interface, **so that** I can take the exam under controlled conditions.

**Acceptance Criteria:**
- [ ] Full-screen interface at `/student/exam/:examId/session` (no sidebar, minimal header)
- [ ] Top bar: exam title, current section name, section countdown timer, overall progress bar
- [ ] All sections and questions pre-loaded (unlike CAT)
- [ ] First section starts immediately with its countdown timer
- [ ] Auto-save every 10 seconds; "Saved" indicator shown

**Flow:**
1. Student navigates to the exam session
2. Exam loads with all sections
3. First section countdown begins
4. Student starts answering questions

**Error / Edge Cases:**
- Exam not assigned: redirect with error "This exam is not available to you"
- Access window expired: "This exam's access window has closed"

**SRS Reference:** Frontend 17, Backend 25
**Priority:** Must Have

---

### US-SL-16: Answer Listening Questions

**As a** self-learning student taking an IELTS exam, **I want to** listen to audio recordings and answer questions for each Listening part, **so that** my listening comprehension is assessed.

**Acceptance Criteria:**
- [ ] Audio player with play/pause, progress bar, volume control
- [ ] Audio plays once (IELTS standard). No replay unless configured for practice mode.
- [ ] Question types: MCQ (single), MCQ (multiple), gap fill
- [ ] Section timer counts down; warning at 5 min and 1 min remaining
- [ ] "Next" navigates to next question; "Previous" navigates back within the section
- [ ] "Flag for Review" marks the question with a flag icon
- [ ] On timer expiry: answers auto-submit, student moves to next section

**Flow:**
1. Listening section begins, audio plays
2. Student answers questions while listening
3. Navigates between questions
4. Flags uncertain questions
5. Section ends (timer or manual submit)

**SRS Reference:** Frontend 17, Backend 25
**Priority:** Must Have

---

### US-SL-17: Answer Reading Questions

**As a** self-learning student taking an IELTS exam, **I want to** read passages and answer comprehension questions for each Reading part, **so that** my reading comprehension is assessed.

**Acceptance Criteria:**
- [ ] Split view: passage on left, questions on right (desktop)
- [ ] Question types: MCQ, True/False/Not Given, gap fill, matching
- [ ] Section timer with warnings at 5 min and 1 min
- [ ] Previous/Next navigation within section
- [ ] "Flag for Review" available
- [ ] Auto-save every 10 seconds

**Flow:**
1. Reading section begins
2. Student reads passage, answers questions
3. Navigates between questions and passages
4. Section ends (timer or manual submit)

**SRS Reference:** Frontend 17, Backend 25
**Priority:** Must Have

---

### US-SL-18: Complete Writing Tasks

**As a** self-learning student taking an IELTS exam, **I want to** write responses to Writing Task 1 and Task 2 using a rich text editor, **so that** my writing ability is assessed.

**Acceptance Criteria:**
- [ ] Rich text editor with word count displayed
- [ ] Task 1: minimum 150 words (indicator turns red below minimum)
- [ ] Task 2: minimum 250 words (indicator turns red below minimum)
- [ ] Submission is NOT blocked by low word count (student may choose to submit anyway)
- [ ] Section timer with warnings
- [ ] Auto-save every 10 seconds

**Flow:**
1. Writing section begins
2. Student reads Task 1 prompt, writes response
3. Monitors word count
4. Moves to Task 2, writes response
5. Section ends (timer or manual submit)

**SRS Reference:** Frontend 17, Backend 25
**Priority:** Must Have

---

### US-SL-19: Record Speaking Responses in Exam

**As a** self-learning student taking an IELTS exam, **I want to** record spoken responses for each Speaking part, **so that** my speaking ability is assessed.

**Acceptance Criteria:**
- [ ] Same audio recording interface as placement test (US-SL-11)
- [ ] Part 1: Familiar topic questions
- [ ] Part 2: Cue card long turn (1 min prep + 2 min speaking)
- [ ] Part 3: Abstract discussion linked to Part 2 topic
- [ ] Microphone permission prompt
- [ ] Playback and re-record (max 1) per prompt
- [ ] Audio uploaded on submission

**Flow:**
1. Speaking section begins
2. Student records responses for Parts 1, 2, and 3
3. Reviews each recording
4. Submits recordings

**SRS Reference:** Frontend 17, Backend 25
**Priority:** Must Have

---

### US-SL-20: Review and Submit Exam

**As a** self-learning student, **I want to** review a summary of my answers before final submission, **so that** I can ensure I haven't missed any questions.

**Acceptance Criteria:**
- [ ] Review summary page shows per section: answered count, unanswered count, flagged count
- [ ] Flagged questions listed with "Go to Question" links
- [ ] "Submit Exam" button with confirmation dialog: "Are you sure? You cannot change your answers after submission."
- [ ] After submission, navigate to submission confirmation page

**Flow:**
1. Student completes all sections
2. Review summary appears
3. Student reviews flagged/unanswered items
4. Optionally returns to fix answers
5. Clicks "Submit Exam"
6. Confirmation dialog -> final submit

**SRS Reference:** Frontend 17, Backend 25
**Priority:** Must Have

---

### US-SL-21: View Exam Results (Auto-Release)

**As a** self-learning student whose exam has auto-release enabled, **I want to** see my results immediately after submission, **so that** I know my score right away.

**Acceptance Criteria:**
- [ ] Results page at `/student/exam/:examId/results`
- [ ] Overall band score displayed prominently (e.g., "6.5")
- [ ] CEFR equivalent shown
- [ ] Per-skill radar chart and table: Skill, Band, CEFR, Gap to Target
- [ ] Listening and Reading: auto-scored, shown immediately
- [ ] Writing and Speaking: if pending teacher grading, show "Pending Review" with estimated wait time
- [ ] Feedback section: per-question feedback (expandable accordions per section)
- [ ] "Areas to improve" summary: top 3 weakness areas
- [ ] "Download PDF Report" button
- [ ] "View Recommended Course" button

**Flow:**
1. Student is redirected to results page after submission
2. Sees auto-scored L/R results immediately
3. W/S show "Pending Review" until teacher grades them
4. Once all skills graded, full results display

**SRS Reference:** Frontend 19, Backend 27
**Priority:** Must Have

---

### US-SL-22: Receive Post-Exam Routing (Pass)

**As a** self-learning student who met or exceeded my target band, **I want to** see a congratulatory message with options to register for the official IELTS exam or continue studying, **so that** I know I've reached my goal.

**Acceptance Criteria:**
- [ ] Action card: "Congratulations! You've reached your target."
- [ ] "Register for Official IELTS Exam" button -> navigates to `/student/exam-registration`
- [ ] "Continue Studying" button -> navigates to `/student/dashboard`

**Flow:**
1. Student views results showing target met
2. Action card appears at bottom
3. Student chooses next step

**SRS Reference:** Frontend 20
**Priority:** Should Have

---

### US-SL-23: Receive Post-Exam Routing (Below Target)

**As a** self-learning student who scored below my target band, **I want to** see my skill gaps and an option to start adaptive training, **so that** I can work on my weaknesses.

**Acceptance Criteria:**
- [ ] Action card: "Let's build a plan to reach your target."
- [ ] Skill gap summary shown inline
- [ ] "Start Adaptive Training" button -> navigates to `/student/course/generate?from=exam&examId={id}`

**Flow:**
1. Student views results showing target not met
2. Action card with gap summary appears
3. Student clicks "Start Adaptive Training"

**SRS Reference:** Frontend 20
**Priority:** Should Have

---

## 1E. Course Learning

### US-SL-24: View Gap Analysis

**As a** self-learning student, **I want to** see a detailed skill gap analysis from my exam or placement results, **so that** I understand which areas need the most work.

**Acceptance Criteria:**
- [ ] Gap analysis page at `/student/course/generate`
- [ ] Bar chart: skills ranked by gap size (largest first), current vs target
- [ ] Table: Skill, Current Level, Target Level, Gap, Priority (High/Medium/Low), Est. Hours
- [ ] Question-type weaknesses expandable per skill
- [ ] Topic weaknesses grouped by category
- [ ] "Generate Course" button to auto-generate a course

**Flow:**
1. Student navigates to gap analysis
2. Reviews skill gaps and weakness breakdowns
3. Clicks "Generate Course"

**SRS Reference:** Frontend 21, Backend 29
**Priority:** Must Have

---

### US-SL-25: Start Auto-Generated Course

**As a** self-learning student, **I want to** view an auto-generated course structure based on my gap analysis and start learning immediately, **so that** I don't have to wait for a teacher to build a course.

**Acceptance Criteria:**
- [ ] Read-only course preview: title, duration estimate, module list with skill assignments, hours, resource icons
- [ ] "Start Course" button begins the course
- [ ] "Customize" button (optional) allows minor adjustments (reorder modules, skip low-priority skills)
- [ ] Course is created via `POST /api/course/auto-generate`

**Flow:**
1. System generates course structure from gap analysis
2. Student reviews the proposed course
3. Clicks "Start Course"
4. Course page opens with modules available

**SRS Reference:** Frontend 22, Backend 30
**Priority:** Must Have

---

### US-SL-26: Start AI-Generated General English Course

**As a** self-learning student studying General English, **I want to** launch an AI-generated course tailored to my CEFR level and learning style, **so that** I receive personalised content without waiting for a teacher.

**Acceptance Criteria:**
- [ ] Confirmation screen shows: Current CEFR Level, Target CEFR Level (editable), Learning Style (editable), Estimated Duration
- [ ] "Start AI Course" triggers content generation via `POST /api/ai-course/english/create`
- [ ] Progress indicator during generation: "Generating your personalised course... Step 2/5: Creating grammar exercises." (1-2 min)
- [ ] Three parallel module tracks: Grammar Track, Skills Track, Vocabulary Track
- [ ] Each module: title, completion status, estimated time, "Start" / "Continue" button
- [ ] Level-up celebration modal when a level is achieved

**Flow:**
1. Student reviews profile settings
2. Clicks "Start AI Course"
3. Waits for generation (1-2 min)
4. Course appears with three parallel tracks
5. Student progresses through modules

**SRS Reference:** Frontend 28, Backend 36
**Priority:** Must Have

---

### US-SL-27: Start AI-Generated IELTS Course

**As a** self-learning student preparing for IELTS, **I want to** launch an AI-generated IELTS course that targets my weakest skills, **so that** I get focused practice aligned with real IELTS standards.

**Acceptance Criteria:**
- [ ] Profile summary: Exam Type, Current Bands per skill, Target Band (editable), Skills ranked by gap, Weak question types
- [ ] "Start AI IELTS Course" triggers per-skill content generation
- [ ] Generation progress per skill: "Listening: Generating... Creating audio scripts for Parts 1-4"
- [ ] Four parallel skill paths: Writing, Reading, Speaking, Listening
- [ ] Readiness check modal when engine determines target band likely reached
- [ ] Practice exam option for band confirmation

**Flow:**
1. Student reviews IELTS gap profile
2. Clicks "Start AI IELTS Course"
3. Waits for per-skill generation
4. Progresses through four skill paths
5. Takes practice exam when prompted

**SRS Reference:** Frontend 29, Backend 37
**Priority:** Must Have

---

### US-SL-28: Progress Through Course Modules

**As a** self-learning student, **I want to** progress through my course modules, viewing my completion status and unlocking new modules, **so that** I learn systematically.

**Acceptance Criteria:**
- [ ] Course page at `/student/course/:courseId`
- [ ] Header: title, overall progress %, estimated time remaining
- [ ] Module list with collapsible sections per skill
- [ ] Each module: status (locked/available/in-progress/completed), progress bar, resource list with type icons and completion checkmarks
- [ ] "Start" / "Continue" button per module
- [ ] Adaptive indicators (if adaptive progression): "Recommended Next" badge, "Unlocked!" animation, "Skipped" badge for mastered modules

**Flow:**
1. Student opens course page
2. Sees module list with statuses
3. Opens the next available module
4. Progresses through resources

**SRS Reference:** Frontend 24, Backend 31
**Priority:** Must Have

---

### US-SL-29: View In-Platform Resources

**As a** self-learning student, **I want to** view course resources (PDF, video, audio, exercises) directly on the platform without downloading, **so that** I can learn seamlessly.

**Acceptance Criteria:**
- [ ] PDF: embedded viewer (browser native or react-pdf)
- [ ] Video: HTML5 `<video>` player with controls and progress tracking
- [ ] Audio: HTML5 `<audio>` player with waveform
- [ ] Exercise: interactive question renderer (same components as exam)
- [ ] AI-generated content: rendered text/HTML inline
- [ ] Resource completion tracked via `POST /api/course/:courseId/progress`

**Flow:**
1. Student clicks a resource within a module
2. Resource opens in-platform
3. Student completes/views the resource
4. Completion is tracked automatically

**SRS Reference:** Frontend 24, Backend 31
**Priority:** Must Have

---

### US-SL-30: Complete Checkpoint Exercises

**As a** self-learning student, **I want to** complete checkpoint exercises within a module and see my score, **so that** I know if I've mastered the material before moving on.

**Acceptance Criteria:**
- [ ] Checkpoint exercises use the same interactive question renderer as exams
- [ ] Score shown immediately after submission
- [ ] If score below threshold: engine may insert remedial resources
- [ ] Completion criteria applied (e.g., "Score 70%+ on exercises")
- [ ] Checkpoint scored via `POST /api/course/:courseId/checkpoint`

**Flow:**
1. Student reaches a checkpoint exercise in a module
2. Answers all questions
3. Submits and sees score
4. If passed: module marked as progressed. If failed: remedial content may appear.

**SRS Reference:** Frontend 24, Backend 31
**Priority:** Must Have

---

### US-SL-31: Take Post-Course Assessment

**As a** self-learning student who completed all course modules, **I want to** take a post-course assessment and compare my results to my pre-course scores, **so that** I can see how much I've improved.

**Acceptance Criteria:**
- [ ] Completion celebration screen when all modules done
- [ ] "Take Post-Course Assessment" button assigns a practice exam (same type as diagnostic)
- [ ] After the assessment: side-by-side comparison of pre-test vs post-test scores
- [ ] Improvement visualisation (before vs after chart)

**Flow:**
1. Student completes all modules
2. Celebration screen appears
3. Clicks "Take Post-Course Assessment"
4. Takes the practice exam
5. Views improvement comparison

**SRS Reference:** Frontend 24, Backend 31
**Priority:** Should Have

---

## 1F. Score and Reporting

### US-SL-32: Download PDF Report with QR Code

**As a** self-learning student, **I want to** download a PDF report of my exam results that includes a QR code for verification, **so that** I can share my results officially.

**Acceptance Criteria:**
- [ ] "Download PDF Report" button on results page
- [ ] Loading state: "Generating your report..." spinner
- [ ] PDF includes: EnCoach logo, student info, exam info, per-skill scores, overall band, performance summary, QR code at bottom-right
- [ ] QR code encodes: student_id, exam_id, score, issue_date, verification_hash
- [ ] PDF downloads to the student's device

**Flow:**
1. Student views exam results
2. Clicks "Download PDF Report"
3. Waits for generation
4. PDF downloads

**SRS Reference:** Frontend 38, Backend 28
**Priority:** Must Have

---

# SECTION 2 -- UNIVERSITY / ENTITY STUDENT JOURNEY

The journey of a student whose account is created by their institution. Key differences from self-learner: no self-registration, no onboarding wizard, no payment step, mandatory placement test, results may require admin approval, entity branding applied.

---

## 2A. First Access

### US-ES-01: Receive Credentials and First Login

**As a** university student, **I want to** log in using the credentials provided by my institution (email + national ID as default password), **so that** I can access the platform for the first time.

**Acceptance Criteria:**
- [ ] Student receives email with: platform URL, username (institutional email), default password (national ID)
- [ ] Student logs in at `/login` with entity branding applied (logo, colours) if configured
- [ ] System detects `first_login = true`
- [ ] Student is immediately redirected to `/reset-password`
- [ ] No other page is accessible until password is reset

**Flow:**
1. Student receives credentials email from institution
2. Opens the platform URL
3. Logs in with email and default password
4. System redirects to password reset page

**SRS Reference:** Frontend 27, Backend 33
**Priority:** Must Have

---

### US-ES-02: Set New Password on First Login

**As a** university student logging in for the first time, **I want to** set a new secure password, **so that** my account is properly secured.

**Acceptance Criteria:**
- [ ] Page at `/reset-password` shows: "Welcome to [Entity Name]'s Learning Platform" with entity branding
- [ ] Fields: New Password (with strength indicator), Confirm Password
- [ ] "Set Password & Continue" button
- [ ] After reset: `first_login` set to `false`, student redirected to `/student/placement` (mandatory placement test)
- [ ] No onboarding wizard is shown to entity students

**Flow:**
1. Student enters new password
2. Confirms password
3. Clicks "Set Password & Continue"
4. Redirected to mandatory placement test

**SRS Reference:** Frontend 27, Backend 33
**Priority:** Must Have

---

## 2B. Placement Test

### US-ES-03: Take Mandatory Placement Test

**As a** university student, **I want to** take the mandatory placement test after my first login, **so that** my institution can assess my English proficiency level.

**Acceptance Criteria:**
- [ ] Placement test flow is identical to the self-learner (US-SL-07 through US-SL-11)
- [ ] Key differences:
  - The test is mandatory (cannot be skipped)
  - A note appears: "This test is mandatory. Your results will be shared with your institution."
  - No payment/access options page after results (entity controls access)
- [ ] Entity branding applied throughout the test interface

**Flow:**
1. Student is redirected to placement briefing after password reset
2. Takes the full placement test (Grammar, Vocabulary, Reading, Speaking)
3. Submits test
4. Proceeds to results

**SRS Reference:** Frontend 7-8, Backend 15-18
**Priority:** Must Have

---

### US-ES-04: View Placement Results (Entity -- Pending Approval)

**As a** university student whose institution requires manual approval, **I want to** see that my results are under review, **so that** I know my results will be released after the institution approves them.

**Acceptance Criteria:**
- [ ] If `results_release_mode = manual_approval`: simplified results page showing "Your results are being reviewed by your institution. You will be notified when they are released."
- [ ] Actual scores are hidden until admin approves
- [ ] Once approved: full results display identical to US-SL-12 but with entity's internal level name shown alongside CEFR level (if level mapping configured)

**Flow:**
1. Student completes placement test
2. Results page shows "Results Pending" message
3. Student waits for admin approval notification
4. After approval, full results become visible

**SRS Reference:** Frontend 9, Backend 17, 27
**Priority:** Must Have

---

## 2C. Exam Taking

### US-ES-05: Take an Exam Assigned by Institution

**As a** university student, **I want to** take an exam that my teacher assigned to me, **so that** my skills are formally assessed.

**Acceptance Criteria:**
- [ ] Exam session flow identical to self-learner (US-SL-15 through US-SL-20)
- [ ] Key differences:
  - Entity branding applied
  - Access window enforced (start date, end date set by teacher)
  - If access window expired: "This exam's access window has closed. Please contact your teacher."
- [ ] Exam may be from international template or custom template

**Flow:**
1. Student receives exam assignment notification
2. Opens the exam within the access window
3. Takes the exam (same flow as self-learner)
4. Submits

**SRS Reference:** Frontend 17, Backend 25
**Priority:** Must Have

---

### US-ES-06: View Exam Results (Entity -- After Approval)

**As a** university student, **I want to** view my exam results after my institution has approved them, **so that** I can see my performance and next steps.

**Acceptance Criteria:**
- [ ] If `results_release_mode = manual_approval`: results hidden until admin approves (same pattern as US-ES-04)
- [ ] If `results_release_mode = auto`: results shown immediately (same as US-SL-21)
- [ ] Results show entity's internal level name alongside CEFR (if level mapping configured)
- [ ] "Download PDF Report" button generates entity-branded PDF (entity logo in header)

**Flow:**
1. Admin approves results (or auto-release)
2. Student is notified
3. Student views full results with entity branding
4. Downloads entity-branded PDF if needed

**SRS Reference:** Frontend 19, Backend 27-28
**Priority:** Must Have

---

## 2D. Course Learning

### US-ES-07: Take a Teacher-Configured Course

**As a** university student, **I want to** take a course that my teacher configured and assigned to me, **so that** I follow a structured learning path designed by my institution.

**Acceptance Criteria:**
- [ ] Course learning flow identical to self-learner (US-SL-28 through US-SL-30)
- [ ] Key differences:
  - Course is configured by teacher (not auto-generated by student)
  - Student cannot customise the course structure
  - Progress is visible to the teacher
  - Entity branding applied
- [ ] Same in-platform resource viewers, checkpoint exercises, and progress tracking

**Flow:**
1. Teacher assigns a course to the student
2. Student opens the course page
3. Progresses through teacher-configured modules
4. Completes checkpoint exercises
5. Teacher monitors progress

**SRS Reference:** Frontend 24, Backend 31
**Priority:** Must Have

---

## 2E. Score and Reporting

### US-ES-08: Download Entity-Branded PDF Report

**As a** university student, **I want to** download a PDF report with my institution's branding, **so that** the report looks official and is recognised by my institution.

**Acceptance Criteria:**
- [ ] Same as US-SL-32 but PDF header shows entity logo instead of (or alongside) EnCoach logo
- [ ] Entity name included in student info section
- [ ] QR verification page shows entity branding

**Flow:**
1. Student views approved exam results
2. Clicks "Download PDF Report"
3. Entity-branded PDF downloads

**SRS Reference:** Frontend 38, Backend 28
**Priority:** Must Have

---

# SECTION 3 -- ADMIN / TEACHER JOURNEY

All administrative and teacher functions, each as a standalone story.

---

## 3A. Entity Student Management

### US-AD-01: Upload Student CSV File

**As an** entity admin, **I want to** upload a CSV file containing student data, **so that** I can begin the bulk account creation process.

**Acceptance Criteria:**
- [ ] Upload page at `/admin/entity/students/upload`
- [ ] Drag-and-drop or click-to-browse file zone (accepts `.csv` only)
- [ ] "Download Template" link provides sample CSV with headers: student_name, institutional_email, national_id, student_id, enrolled_programme
- [ ] "Upload & Validate" button submits the CSV for validation
- [ ] File uploaded via `POST /api/entity/students/validate-csv` (multipart/form-data)

**Flow:**
1. Admin navigates to upload page
2. Downloads template CSV
3. Fills in student data
4. Uploads the CSV file
5. System validates and shows report

**SRS Reference:** Frontend 25, Backend 32
**Priority:** Must Have

---

### US-AD-02: Review CSV Validation Report

**As an** entity admin, **I want to** review the validation report after uploading a CSV, **so that** I can identify and fix errors before creating accounts.

**Acceptance Criteria:**
- [ ] Validation table: Row #, Student Name, Email, Status (Valid/Error/Warning), Issue description
- [ ] Summary bar: "247 valid, 3 errors, 1 warning"
- [ ] "Fix & Re-upload" button allows downloading error rows for correction
- [ ] "Confirm & Create Accounts" button enabled only when zero errors (warnings allowed)

**Flow:**
1. After upload, validation report appears
2. Admin reviews each row's status
3. If errors: downloads error rows, fixes, re-uploads
4. When all valid: clicks "Confirm & Create Accounts"

**Error / Edge Cases:**
- Duplicate emails: shown as errors
- Missing required fields: shown as errors per row
- Large CSV (1000+ rows): progress indicator during validation

**SRS Reference:** Frontend 25, Backend 32
**Priority:** Must Have

---

### US-AD-03: Create Bulk Student Accounts

**As an** entity admin, **I want to** confirm and create all validated student accounts in bulk, **so that** students can access the platform.

**Acceptance Criteria:**
- [ ] On "Confirm & Create Accounts" click: `POST /api/entity/students/bulk-create`
- [ ] Accounts created: username = institutional email, default password = national ID
- [ ] All accounts tagged with the admin's `entity_id`
- [ ] CAPTCHA is NOT required for bulk accounts
- [ ] Confirmation page: "248 student accounts created successfully"
- [ ] Table of created accounts: name, email, default password indicator, status ("Pending First Login")
- [ ] Optional "Bypass Placement" flag for students with known levels

**Flow:**
1. Admin clicks "Confirm & Create Accounts"
2. System creates accounts
3. Confirmation page shows results
4. Admin proceeds to send credentials

**SRS Reference:** Frontend 25, Backend 33
**Priority:** Must Have

---

### US-AD-04: Send Credential Emails to Students

**As an** entity admin, **I want to** send login credential emails to newly created students, **so that** they can access the platform.

**Acceptance Criteria:**
- [ ] "Send Credential Emails" button on the confirmation page
- [ ] Triggers `POST /api/entity/students/send-credentials`
- [ ] Sends email to each student with: platform URL, username, default password, instructions

**Flow:**
1. After account creation, admin clicks "Send Credential Emails"
2. System sends emails to all new students
3. Admin proceeds to credential monitoring dashboard

**SRS Reference:** Frontend 25, Backend 34
**Priority:** Must Have

---

### US-AD-05: Monitor Credential Delivery Status

**As an** entity admin, **I want to** track which students have received their credentials, logged in, and started placement, **so that** I can follow up with those who haven't.

**Acceptance Criteria:**
- [ ] Dashboard at `/admin/entity/students/credentials`
- [ ] Table: Student Name, Email, Account Status (Pending First Login/Active/Password Reset Required), Email Sent (Yes/No + timestamp), First Login (Yes/No + timestamp), Placement Status (Not Started/In Progress/Completed/Bypassed)
- [ ] Per-row "Resend Email" button
- [ ] "Resend All Pending" button for bulk resend
- [ ] Bulk select with "Resend Selected" action
- [ ] Filters: Account Status, Email Sent, Placement Status, Date range

**Flow:**
1. Admin opens credential dashboard
2. Reviews delivery status per student
3. Resends to students who haven't received/opened email
4. Monitors first login and placement progress

**SRS Reference:** Frontend 26, Backend 34
**Priority:** Must Have

---

### US-AD-06: Configure Entity Level Mapping

**As an** entity admin, **I want to** map CEFR score ranges to my institution's internal level names, **so that** students and teachers see familiar level labels.

**Acceptance Criteria:**
- [ ] Config page at `/admin/entity/:entityId/level-mapping`
- [ ] Editable table: CEFR Min Score, CEFR Max Score, Internal Level Name, CEFR Equivalent
- [ ] "Add Row" to add new mappings
- [ ] "Save" persists mappings via `PUT /api/entity/:entityId/level-mapping`
- [ ] "Reset to Default" restores standard CEFR mapping
- [ ] Score ranges must not overlap (frontend validates before saving)
- [ ] Student results show both CEFR and entity's internal level name

**Flow:**
1. Admin opens level mapping config
2. Edits or adds mapping rows
3. Saves changes
4. Student results now display both levels

**SRS Reference:** Frontend 32, Backend 35
**Priority:** Should Have

---

### US-AD-07: Configure White-Label Branding

**As an** entity admin, **I want to** customise the platform's appearance with my institution's logo, colours, and subdomain, **so that** students see a branded experience.

**Acceptance Criteria:**
- [ ] Branding form at `/admin/entity/:entityId/branding`
- [ ] Fields: Logo upload (PNG/SVG/JPEG, max 2MB), Primary/Secondary/Background colour pickers, Custom Subdomain, Login Page Title, Login Page Description, Favicon
- [ ] Live preview panel on the right
- [ ] "Save Branding" persists via `PUT /api/entity/:entityId/branding`
- [ ] "Reset to Default" restores EnCoach branding
- [ ] Entity students see branding on: login page, header, dashboard, PDF reports
- [ ] Branding applied via CSS custom properties (`--primary`, `--secondary`, `--background`)
- [ ] White-labelling affects ONLY presentation, not workflow logic

**Flow:**
1. Admin opens branding settings
2. Uploads logo, picks colours, sets subdomain
3. Reviews live preview
4. Saves branding
5. All entity students see branded experience

**SRS Reference:** Frontend 33, Backend 44-45
**Priority:** Should Have

---

## 3B. Exam Configuration -- International Template (IELTS)

### US-AD-08: Select Exam Template Path

**As a** teacher, **I want to** choose between an international template and a custom exam on the template selection page, **so that** I use the right approach for my testing needs.

**Acceptance Criteria:**
- [ ] Template selection page at `/admin/exam/create`
- [ ] Section A: International templates grid (IELTS Academic, IELTS General Training, TOEFL, STEP, IC3) with "Locked" badge and tooltip
- [ ] Section B: "Create Custom Exam" card with plus icon
- [ ] International templates loaded from `GET /api/exam/templates?type=international`
- [ ] Clicking international template -> navigates to international template wizard
- [ ] Clicking "Create Custom Exam" -> navigates to custom exam builder

**Flow:**
1. Teacher opens `/admin/exam/create`
2. Reviews available templates
3. Clicks desired template or "Create Custom Exam"

**SRS Reference:** Frontend 11, Backend 19
**Priority:** Must Have

---

### US-AD-09: Initialise IELTS Exam

**As a** teacher, **I want to** initialise an IELTS exam by setting exam type, target band, difficulty, assembly mode, and score release mode, **so that** the exam is configured according to IELTS standards.

**Acceptance Criteria:**
- [ ] Wizard Phase 1 at `/admin/exam/ielts/create`
- [ ] Fields: Exam Type (Academic/General Training), Target Skills (checkboxes: L/R/W/S, pre-checked all), Exam Title (auto-suggested), Target Band (4.0-9.0 slider), Difficulty (Easy/Medium/Hard), Randomization toggle, Assembly Mode (Auto/Manual/Hybrid), Score Release Mode (Auto/Manual Approval)
- [ ] IELTS structure displayed as read-only: "Listening (4 parts, 40 Q), Reading (3 passages, 40 Q), Writing (2 tasks), Speaking (3 parts)"
- [ ] Structure CANNOT be modified (locked by international template)
- [ ] "Next" saves via `POST /api/exam/ielts/create`, returns `exam_id`

**Flow:**
1. Teacher fills in initialisation form
2. Reviews the locked IELTS structure
3. Clicks "Next"
4. System creates exam record, navigates to skill configuration

**SRS Reference:** Frontend 12, Backend 19-20
**Priority:** Must Have

---

### US-AD-10: Configure Listening Skill Structure

**As a** teacher, **I want to** review the fixed Listening structure (4 parts, 40 questions) and see available content pool counts, **so that** I know how much content is available for Listening.

**Acceptance Criteria:**
- [ ] Listening tab on the per-skill configuration page at `/admin/exam/ielts/:examId/skills`
- [ ] Read-only structure table: Part 1 (10 Q, Conversation, ~6 min), Part 2 (10 Q, Monologue, ~6 min), Part 3 (10 Q, Conversation, ~6 min), Part 4 (10 Q, Monologue, ~8 min)
- [ ] Available content pool count per part (e.g., "Available: 245 questions for Listening Part 1")
- [ ] "Configure Content" button navigates to content pool for Listening

**Flow:**
1. Teacher clicks Listening tab
2. Reviews the fixed structure (read-only)
3. Sees pool availability counts
4. Clicks "Configure Content" to browse/assign questions

**SRS Reference:** Frontend 13, Backend 21
**Priority:** Must Have

---

### US-AD-11: Configure Reading Skill Structure

**As a** teacher, **I want to** review the fixed Reading structure and see available content pool counts, **so that** I know how much content is available for Reading.

**Acceptance Criteria:**
- [ ] Reading tab on the per-skill configuration page
- [ ] Academic: Passage 1 (13-14 Q, Factual), Passage 2 (13-14 Q, Analytical), Passage 3 (13-14 Q, Argumentative)
- [ ] General Training: Section 1 (13-14 Q, Everyday), Section 2 (13-14 Q, Workplace), Section 3 (13-14 Q, General interest)
- [ ] Pool counts per passage/section
- [ ] "Configure Content" button

**Flow:**
1. Teacher clicks Reading tab
2. Reviews fixed structure
3. Clicks "Configure Content"

**SRS Reference:** Frontend 13, Backend 21
**Priority:** Must Have

---

### US-AD-12: Configure Writing Skill Structure

**As a** teacher, **I want to** review the fixed Writing structure (Task 1 and Task 2), **so that** I understand the writing assessment requirements.

**Acceptance Criteria:**
- [ ] Writing tab on the per-skill configuration page
- [ ] Task 1: Academic = describe visual data, General = write a letter (min 150 words)
- [ ] Task 2: Essay for both types (min 250 words)
- [ ] Pool counts for available writing prompts
- [ ] "Configure Content" button

**Flow:**
1. Teacher clicks Writing tab
2. Reviews fixed structure
3. Clicks "Configure Content"

**SRS Reference:** Frontend 13, Backend 21
**Priority:** Must Have

---

### US-AD-13: Configure Speaking Skill Structure

**As a** teacher, **I want to** review the fixed Speaking structure (3 parts), **so that** I understand the speaking assessment requirements.

**Acceptance Criteria:**
- [ ] Speaking tab on the per-skill configuration page
- [ ] Part 1: Familiar topics (4-5 min), Part 2: Cue card (3-4 min), Part 3: Abstract discussion (4-5 min)
- [ ] Pool counts for available speaking prompts/cue cards
- [ ] "Configure Content" button

**Flow:**
1. Teacher clicks Speaking tab
2. Reviews fixed structure
3. Clicks "Configure Content"

**SRS Reference:** Frontend 13, Backend 21
**Priority:** Must Have

---

### US-AD-14: Auto-Assemble Questions

**As a** teacher using Auto assembly mode, **I want to** have the system automatically select questions for all sections based on rules, **so that** the exam is assembled quickly without manual selection.

**Acceptance Criteria:**
- [ ] Content pool page at `/admin/exam/ielts/:examId/content`
- [ ] Left panel (content pool) is greyed out -- system selects automatically
- [ ] Right panel shows system-selected questions with "Swap" option per item
- [ ] Message: "System has selected 40 questions. Review below."
- [ ] Auto-assembly triggered via `POST /api/exam/ielts/:examId/auto-assemble`
- [ ] Teacher can swap individual items if needed

**Flow:**
1. Teacher opens content pool page in Auto mode
2. System auto-selects questions
3. Teacher reviews selections
4. Optionally swaps individual items
5. Clicks "Save & Continue"

**SRS Reference:** Frontend 14, Backend 22
**Priority:** Must Have

---

### US-AD-15: Manually Assemble Questions

**As a** teacher using Manual assembly mode, **I want to** browse the content pool and handpick every question, **so that** I have full control over exam content.

**Acceptance Criteria:**
- [ ] Left panel: full content pool browser with filters (Skill, Part, Difficulty, Topic, Status, Search)
- [ ] Content items as cards: preview text, difficulty badge, topic tags, usage count, quality rating
- [ ] "Add" button on each item
- [ ] Right panel: selected questions with drag-and-drop reordering
- [ ] Running count badge: "12/40 selected"
- [ ] Cannot proceed until all structural slots filled (e.g., 40/40 for Listening)
- [ ] Excluded from pool: items seen by assigned student, flagged items, retired items

**Flow:**
1. Teacher opens content pool in Manual mode
2. Filters and browses available questions
3. Clicks "Add" on each desired question
4. Reorders as needed in the right panel
5. Fills all slots (e.g., 40/40)
6. Clicks "Save & Continue"

**Error / Edge Cases:**
- Insufficient pool items: warning "Only 35 questions available (40 required)"

**SRS Reference:** Frontend 14, Backend 22
**Priority:** Must Have

---

### US-AD-16: Hybrid-Assemble Questions

**As a** teacher using Hybrid assembly mode, **I want to** review system-suggested questions and accept, reject, or swap them, **so that** I get the efficiency of auto-assembly with the control of manual selection.

**Acceptance Criteria:**
- [ ] System pre-populates suggestions (highlighted) via `POST /api/exam/ielts/:examId/suggest`
- [ ] "Accept All" button accepts all suggestions at once
- [ ] Per-item buttons: "Accept", "Reject", "Swap"
- [ ] Teacher can manually add replacements for rejected items
- [ ] "Save & Continue" when all slots filled

**Flow:**
1. Teacher opens content pool in Hybrid mode
2. System suggests questions
3. Teacher reviews each suggestion
4. Accepts, rejects, or swaps items
5. Clicks "Save & Continue"

**SRS Reference:** Frontend 14, Backend 22
**Priority:** Must Have

---

### US-AD-17: Validate Exam

**As a** teacher, **I want to** run validation checks on the assembled exam, **so that** I can identify and fix any issues before publishing.

**Acceptance Criteria:**
- [ ] Validation page at `/admin/exam/ielts/:examId/validate`
- [ ] Validation runs automatically on page load via `GET /api/exam/ielts/:examId/validate`
- [ ] Checklist: Question Count (pass/fail per section), Media URLs (accessible), Answer Keys (populated), No Duplicates, Rubrics (linked for W/S), Time Specification (valid)
- [ ] Red items block publishing; yellow items are warnings (can proceed with acknowledgement)
- [ ] "Preview Exam" opens read-only student-view preview

**Flow:**
1. Teacher opens validation page
2. Validation auto-runs
3. Reviews checklist results
4. Fixes any red items (returns to content pool)
5. Proceeds to publish when all checks pass

**SRS Reference:** Frontend 15, Backend 24
**Priority:** Must Have

---

### US-AD-18: Publish Exam

**As a** teacher, **I want to** publish a validated exam so that it becomes available for student assignment, **so that** students can take the exam.

**Acceptance Criteria:**
- [ ] "Publish" button enabled only when all validation checks pass
- [ ] On publish: `PUT /api/exam/ielts/:examId` with `status: "published"`
- [ ] After publishing, the exam is locked for editing
- [ ] "Duplicate" option allows creating a copy for modification

**Flow:**
1. Teacher clicks "Publish" on validation page
2. Exam status changes to "published"
3. Exam is locked for editing
4. Teacher can now assign it to students

**SRS Reference:** Frontend 15, Backend 24
**Priority:** Must Have

---

### US-AD-19: Assign Exam to Students

**As a** teacher, **I want to** assign a published exam to specific students or batches with optional access windows, **so that** students can take the exam within the specified time frame.

**Acceptance Criteria:**
- [ ] "Assign to Students" button opens a student/batch selector dialog
- [ ] Searchable student list and batch list
- [ ] Multiple students and batches can be selected
- [ ] Optional access window per assignment: start date, end date
- [ ] Assignment via `POST /api/exam/ielts/:examId/assign`

**Flow:**
1. Teacher clicks "Assign to Students"
2. Searches and selects students or batches
3. Optionally sets access window dates
4. Confirms assignment
5. Students receive notification

**SRS Reference:** Frontend 15, Backend 24
**Priority:** Must Have

---

## 3C. Exam Configuration -- Custom Template

### US-AD-20: Create Custom Exam -- Define Properties

**As a** teacher, **I want to** define the properties of a custom exam (title, subject, time, pass threshold, score release mode), **so that** I set up the exam's basic configuration.

**Acceptance Criteria:**
- [ ] Step 1 of custom exam creation at `/admin/exam/custom/create`
- [ ] Fields: Exam Title (required, max 200 chars), Subject (select from taxonomy -- English only for now), Description (optional), Total Time (minutes, min 5), Pass Threshold (% slider, optional), Score Release Mode (Auto/Manual Approval), Randomize Questions toggle
- [ ] No locked structural constraints -- teacher has full control
- [ ] "Next" proceeds to section builder

**Flow:**
1. Teacher fills in exam properties
2. Clicks "Next"

**SRS Reference:** Frontend 16, Backend 23
**Priority:** Must Have

---

### US-AD-21: Create Custom Exam -- Build Sections

**As a** teacher, **I want to** add and configure sections for my custom exam (section title, skill, question count, time limit, scoring method), **so that** I define the exam's structure.

**Acceptance Criteria:**
- [ ] Step 2 of custom exam creation
- [ ] Each section is a collapsible panel with: Section Title (required), Skill/Category (select or custom label), Question Count (min 1), Time Limit (minutes, optional), Scoring Method (Auto/Rubric/Mixed)
- [ ] "Add Section" button adds a new panel
- [ ] Sections reorderable via drag-and-drop
- [ ] Sections deletable with confirmation dialog
- [ ] "Next" proceeds to question assignment

**Flow:**
1. Teacher adds one or more sections
2. Configures each section
3. Reorders as needed
4. Clicks "Next"

**Error / Edge Cases:**
- Zero sections defined: "Next" disabled

**SRS Reference:** Frontend 16, Backend 23
**Priority:** Must Have

---

### US-AD-22: Create Custom Exam -- Assign Questions

**As a** teacher, **I want to** assign questions to each section from the content pool or by creating new questions inline, **so that** each section has the required content.

**Acceptance Criteria:**
- [ ] Step 3 of custom exam creation
- [ ] For each section: "Browse Content Pool" button opens shared pool with filters
- [ ] "Create New Question" button opens inline question form (type, stem, options, correct answer, marks, difficulty)
- [ ] Running count: "8/10 questions added"
- [ ] Teacher can add extras beyond defined count (held as alternates for randomization)
- [ ] Same content pool browser as international template (US-AD-15)

**Flow:**
1. Teacher opens question assignment for each section
2. Browses content pool or creates questions inline
3. Adds questions until count is met
4. Clicks "Next" to review

**SRS Reference:** Frontend 16, Backend 23
**Priority:** Must Have

---

### US-AD-23: Create Custom Exam -- Validate and Publish

**As a** teacher, **I want to** validate and publish my custom exam, **so that** students can take it.

**Acceptance Criteria:**
- [ ] Step 4: same validation and publish flow as international exam (US-AD-17, US-AD-18)
- [ ] Validation rules adapt to custom constraints: question count per section, rubrics for rubric-scored sections, valid time limits, answer keys for auto-scored questions
- [ ] "Publish" locks the exam; "Assign to Students" available after publish
- [ ] Custom exam uses same exam session, grading, and score release as international

**Flow:**
1. Validation auto-runs
2. Teacher fixes any issues
3. Publishes the exam
4. Assigns to students

**SRS Reference:** Frontend 16, Backend 23-24
**Priority:** Must Have

---

### US-AD-24: Save Custom Exam as Reusable Template

**As a** teacher, **I want to** save my custom exam's structure as a reusable template, **so that** I can create similar exams in the future without rebuilding the structure.

**Acceptance Criteria:**
- [ ] "Save as Template" option on the custom exam
- [ ] Creates a record in `encoach.exam.template` with `editable = true`, `type = custom`
- [ ] Template appears in "My Templates" section on the template selection page
- [ ] Template is scoped to the teacher and their entity

**Flow:**
1. Teacher clicks "Save as Template" on a custom exam
2. Enters a template name
3. Template is saved
4. Available for future use on the template selection page

**SRS Reference:** Frontend 16, Backend 23
**Priority:** Should Have

---

### US-AD-25: Create Exam from Saved Custom Template

**As a** teacher, **I want to** create a new exam from a previously saved custom template, **so that** I don't rebuild the same structure from scratch.

**Acceptance Criteria:**
- [ ] "My Templates" section on template selection page shows saved custom templates
- [ ] Clicking a template pre-populates the custom exam creation form with saved structure
- [ ] Teacher can modify any aspect before proceeding
- [ ] Templates scoped to the teacher and their entity

**Flow:**
1. Teacher opens template selection page
2. Clicks a saved custom template
3. Form opens pre-populated
4. Teacher modifies as needed
5. Proceeds through creation steps

**SRS Reference:** Frontend 11, 16; Backend 23
**Priority:** Should Have

---

## 3D. Grading

### US-AD-26: Grade a Writing Submission

**As a** teacher, **I want to** grade a student's writing submission using IELTS rubric criteria with optional AI suggestions, **so that** I can evaluate writing skills fairly and efficiently.

**Acceptance Criteria:**
- [ ] Grading queue at `/admin/exam/:examId/grading` (filtered to Writing)
- [ ] "Grade Now" shows: student's essay text, rubric criteria panel
- [ ] IELTS Writing rubric: Task Achievement, Coherence and Cohesion, Lexical Resource, Grammatical Range and Accuracy (each 0-9)
- [ ] "AI Grade Suggestion" button: populates rubric with AI-suggested scores via `POST /api/grading/ai-suggest`
- [ ] Teacher can accept or override each criterion
- [ ] "Submit Grade" saves and moves to next submission

**Flow:**
1. Teacher opens grading queue, filters to Writing
2. Clicks "Grade Now" on a pending submission
3. Reads the student's essay
4. Optionally clicks "AI Grade Suggestion"
5. Adjusts scores as needed
6. Clicks "Submit Grade"

**Error / Edge Cases:**
- AI suggestion fails: toast error, teacher grades manually

**SRS Reference:** Frontend 18, Backend 26
**Priority:** Must Have

---

### US-AD-27: Grade a Speaking Submission

**As a** teacher, **I want to** grade a student's speaking submission by listening to their audio recording and scoring rubric criteria with optional AI suggestions, **so that** I can evaluate speaking skills fairly and efficiently.

**Acceptance Criteria:**
- [ ] Grading queue filtered to Speaking
- [ ] "Grade Now" shows: audio playback controls, rubric criteria panel
- [ ] IELTS Speaking rubric: Fluency and Coherence, Lexical Resource, Grammatical Range and Accuracy, Pronunciation (each 0-9)
- [ ] "AI Grade Suggestion" button available
- [ ] Teacher can accept or override
- [ ] "Submit Grade" saves and moves to next

**Flow:**
1. Teacher opens grading queue, filters to Speaking
2. Clicks "Grade Now"
3. Listens to audio recording
4. Optionally gets AI suggestion
5. Adjusts scores
6. Submits grade

**Error / Edge Cases:**
- Audio playback issue: download link as fallback

**SRS Reference:** Frontend 18, Backend 26
**Priority:** Must Have

---

## 3E. Course Management

### US-AD-28: View Student Gap Analysis

**As a** teacher, **I want to** view a student's skill gap analysis from their exam or placement results, **so that** I can design an appropriate course for them.

**Acceptance Criteria:**
- [ ] Gap analysis page (entity teacher view) at `/student/course/generate`
- [ ] Same visualisation as US-SL-24: bar chart, table, question-type weaknesses, topic weaknesses
- [ ] View-only for entity students: "Your teacher will configure your course based on these results."
- [ ] Teacher sees all enrolled students' gap analyses

**Flow:**
1. Teacher navigates to gap analysis for a student
2. Reviews skill gaps and weakness breakdowns
3. Proceeds to configure a course

**SRS Reference:** Frontend 21, Backend 29
**Priority:** Must Have

---

### US-AD-29: Configure Course Structure

**As a** teacher, **I want to** configure a course with title, target, duration, skills, skill weightings, and progression model, **so that** the course is appropriately scoped for my students.

**Acceptance Criteria:**
- [ ] Config form at `/admin/course/configure/:courseId`
- [ ] Fields: Course Title, Exam Type (IELTS Academic/General Training/General English), Target Band/Level, Duration (weeks, 1-52), Study Hours/Week (1-40 slider), Skills (checkboxes, pre-selected from gap analysis), Skill Weightings (sliders per skill, must sum to total hours), Progression Model (Linear/Parallel/Adaptive)
- [ ] "Adaptive" requires engine to be active; if not, defaults to "Parallel" with note
- [ ] "Create Course" saves via `POST /api/course/create`, navigates to module builder

**Flow:**
1. Teacher fills in course parameters
2. Adjusts skill weightings
3. Selects progression model
4. Clicks "Create Course"

**SRS Reference:** Frontend 22, Backend 30
**Priority:** Must Have

---

### US-AD-30: Build Course Modules

**As a** teacher, **I want to** create modules within each skill section of a course, **so that** the course has structured learning content.

**Acceptance Criteria:**
- [ ] Module builder at `/admin/course/:courseId/modules`
- [ ] Collapsible panels per skill section
- [ ] Module fields: Title, Estimated Hours, Completion Criteria (complete all / score 70%+ / teacher approval), Prerequisite Module (optional)
- [ ] Modules reorderable via drag-and-drop
- [ ] "Add Module" button per skill section

**Flow:**
1. Teacher opens module builder
2. Adds modules to each skill section
3. Configures each module
4. Reorders as needed

**SRS Reference:** Frontend 23, Backend 30
**Priority:** Must Have

---

### US-AD-31: Attach Resources to Modules

**As a** teacher, **I want to** attach learning resources (PDF, video, audio, exercises) to a course module, **so that** students have content to study.

**Acceptance Criteria:**
- [ ] Resource attachment panel within each module
- [ ] "Browse Resources" button opens search/browse modal: `GET /api/resources?skill={skill}&difficulty={level}&type={type}`
- [ ] Supports: PDF, Video, Audio, Exercise, AI-generated content
- [ ] Resources selected from the shared content database

**Flow:**
1. Teacher clicks "Browse Resources" within a module
2. Searches and filters available resources
3. Selects resources to attach
4. Resources appear in the module's resource list

**SRS Reference:** Frontend 23, Backend 30
**Priority:** Must Have

---

### US-AD-32: Generate AI Content for a Module

**As a** teacher, **I want to** request AI-generated learning content for a specific module, **so that** I can fill content gaps without creating everything manually.

**Acceptance Criteria:**
- [ ] "Generate AI Content" button within each module
- [ ] Brief form: topic, difficulty, content type (reading passage, grammar exercise, vocabulary set, etc.)
- [ ] Calls `POST /api/ai/generate-resource`
- [ ] Generated content appears in the module after quality gate approval

**Flow:**
1. Teacher clicks "Generate AI Content" in a module
2. Fills in topic, difficulty, type
3. System generates content
4. Content goes through quality gate
5. Approved content added to module

**SRS Reference:** Frontend 23, Backend 36
**Priority:** Should Have

---

### US-AD-33: Publish and Assign Course

**As a** teacher, **I want to** publish a course and assign it to students, **so that** students can begin learning.

**Acceptance Criteria:**
- [ ] "Publish Course" button on the module builder page
- [ ] Calls `PUT /api/course/:courseId` with `status: "published"`
- [ ] Course assigned to the target student(s)
- [ ] Students receive notification

**Flow:**
1. Teacher finishes building modules
2. Clicks "Publish Course"
3. Course is published and assigned
4. Students can now access it

**SRS Reference:** Frontend 23, Backend 30
**Priority:** Must Have

---

### US-AD-34: Monitor Student Course Progress

**As a** teacher, **I want to** view a dashboard of enrolled students' progress, time spent, and predicted improvement, **so that** I can identify struggling students and intervene.

**Acceptance Criteria:**
- [ ] Progress dashboard at `/teacher/course/:courseId/progress`
- [ ] Table: Student Name, Overall Progress (%), Current Module, Time Spent (hours), Predicted Band Improvement, Last Activity, Alert ("No progress for 3+ days")
- [ ] Clicking student name opens detailed profile
- [ ] Alert icon for students with no progress 3+ days

**Flow:**
1. Teacher opens course progress dashboard
2. Reviews student progress
3. Identifies students with alerts
4. Clicks student name for detailed analysis

**SRS Reference:** Frontend 24, Backend 31
**Priority:** Should Have

---

## 3F. AI Content Quality

### US-AD-35: Review AI-Generated English Content (Quality Gate)

**As a** teacher or admin, **I want to** review AI-generated General English content through automated quality checks, **so that** I can ensure it meets pedagogical standards.

**Acceptance Criteria:**
- [ ] Quality gate page shows: Readability Score (Flesch-Kincaid vs target range), CEFR Calibration, Grammar Accuracy, Length Compliance
- [ ] Each check: Pass/Fail with specific details
- [ ] "Approve" marks content as approved
- [ ] "Reject & Regenerate" sends back to AI with error notes (max 3 attempts)
- [ ] "Edit" opens inline editor for manual correction

**Flow:**
1. Admin opens quality gate for generated content
2. Reviews automated check results
3. Approves, rejects, or edits

**SRS Reference:** Frontend 28, Backend 38
**Priority:** Must Have

---

### US-AD-36: Review AI IELTS Content -- Automated Standards Check

**As an** admin, **I want to** validate AI-generated IELTS content against automated IELTS format standards, **so that** content meets official IELTS structural requirements.

**Acceptance Criteria:**
- [ ] Layer 1 validation page
- [ ] Checks: Format Compliance (word counts, part structure, question types), CEFR Band Calibration (readability mapped to target band), Answer Key Completeness (correct answers populated, rubrics linked)
- [ ] Each check: Pass/Fail with specific issue details (e.g., "Reading Passage 2: word count 890 -- exceeds IELTS maximum of 850 words")
- [ ] Failed checks must be resolved before proceeding to examiner review

**Flow:**
1. Admin opens IELTS validation page
2. Reviews Layer 1 automated checks
3. Identifies and resolves any failures
4. Content proceeds to Layer 2 (examiner review)

**SRS Reference:** Frontend 29, Backend 39
**Priority:** Should Have

---

### US-AD-37: Review AI IELTS Content -- Examiner Review

**As an** admin, **I want to** assign IELTS examiner reviewers to AI-generated content and manage their approval, **so that** content is verified by qualified humans before students see it.

**Acceptance Criteria:**
- [ ] Layer 2 review queue: table of content items pending review
- [ ] Columns: Skill, Content Type, Target Band, Examiner (assigned or "Unassigned"), Status (Pending/Approved/Rejected)
- [ ] Review interface: full content preview, examiner checklist (accuracy, difficulty, IELTS alignment, cultural sensitivity)
- [ ] "Approve" marks as `ielts_certified = true`
- [ ] "Reject with Notes" returns to AI for regeneration
- [ ] AI-generated content requires mandatory review; entity-uploaded content is "Spot-check only"

**Flow:**
1. Admin assigns examiners to content items
2. Examiner reviews content, fills checklist
3. Approves or rejects
4. Approved content available to students

**SRS Reference:** Frontend 29, Backend 39
**Priority:** Should Have

---

## 3G. Score Release

### US-AD-38: Approve Exam Results

**As an** entity admin, **I want to** approve exam results so they become visible to the student, **so that** my institution controls when scores are released.

**Acceptance Criteria:**
- [ ] Approval queue at `/admin/scores/pending`
- [ ] Only exams with `results_release_mode = manual_approval` appear
- [ ] Table: Student Name, Exam Title, Type (Official/Practice), Submitted At, Overall Score, Status, Action
- [ ] "Approve" calls `POST /api/scores/:attemptId/release`; student is notified
- [ ] Bulk action: "Approve All Selected"
- [ ] Practice exams (auto release) never appear in this queue

**Flow:**
1. Admin opens approval queue
2. Reviews pending results
3. Clicks "Approve" for each (or bulk approve)
4. Students are notified and can see results

**SRS Reference:** Frontend 37, Backend 27
**Priority:** Must Have

---

### US-AD-39: Reject Exam Results with Reason

**As an** entity admin, **I want to** reject exam results with a specific reason, **so that** the student is informed about why their results need further review.

**Acceptance Criteria:**
- [ ] "Reject" button opens a reason dialog
- [ ] Admin enters reason text
- [ ] Calls `POST /api/scores/:attemptId/reject` with reason
- [ ] Student sees: "Your results require further review. Reason: [reason]."

**Flow:**
1. Admin clicks "Reject" on a pending result
2. Enters reason in dialog
3. Submits rejection
4. Student sees rejection message with reason

**SRS Reference:** Frontend 37, Backend 27
**Priority:** Must Have

---

## 3H. Adaptive Engine

### US-AD-40: View Adaptive Engine Dashboard

**As an** admin, **I want to** see an overview of the adaptive learning engine's activity, **so that** I can monitor system-wide performance.

**Acceptance Criteria:**
- [ ] Dashboard at `/admin/adaptive/dashboard`
- [ ] Metrics: Active Students count, Engine Phase (1-4), Decisions Today, Average Improvement, Alerts count
- [ ] Student table: Name, Subject (English/IELTS), Current Level, Target Level, Days Active, Last Decision, Progress Trend (sparkline), Alert

**Flow:**
1. Admin opens adaptive dashboard
2. Reviews system-wide metrics
3. Identifies students needing attention

**SRS Reference:** Frontend 30, Backend 40-43
**Priority:** Should Have

---

### US-AD-41: Configure Adaptive Engine Thresholds

**As a** teacher, **I want to** set thresholds for the adaptive engine, **so that** I control how it adapts content for my students.

**Acceptance Criteria:**
- [ ] Settings at `/teacher/adaptive/settings`
- [ ] Thresholds: Difficulty Step-Up (default 85%), Difficulty Step-Down (default 50%), Micro-Lesson Trigger (default 2), Module Skip (default 95%), No-Progress Alert Days (default 3), Max Retries (default 3)
- [ ] "Save" via `PUT /api/adaptive/settings`
- [ ] No-progress alerts show as visual badges on teacher sidebar

**Flow:**
1. Teacher opens adaptive settings
2. Adjusts thresholds
3. Saves

**SRS Reference:** Frontend 30, Backend 40
**Priority:** Should Have

---

### US-AD-42: View Student Adaptive Signals and Decisions

**As a** teacher, **I want to** view a timeline of all engine signals and decisions for a specific student, **so that** I understand why the engine made specific content decisions.

**Acceptance Criteria:**
- [ ] Detail page at `/admin/adaptive/student/:studentId`
- [ ] Signal timeline: Time, Signal (quiz score, time on task, retry count, module completion), Value, Decision Made
- [ ] For IRT phases (Phase 2+): ability estimate (theta), SEM, ability trajectory chart

**Flow:**
1. Teacher clicks student name from adaptive dashboard
2. Views signal timeline
3. Understands engine decisions
4. Optionally adjusts thresholds

**SRS Reference:** Frontend 31, Backend 40-43
**Priority:** Could Have

---

## 3I. Public Verification

### US-PV-01: Verify a Score via QR Code

**As a** public verifier (employer, university), **I want to** scan a QR code from a student's PDF report and see verified score information, **so that** I can confirm the authenticity of the student's results.

**Acceptance Criteria:**
- [ ] Public page at `/verify/:verificationHash` -- NO authentication required
- [ ] Valid hash: displays student name, exam title, exam date, overall score, per-skill scores, "Verified" badge (green checkmark)
- [ ] Invalid/tampered hash: "This score could not be verified. The verification link may be invalid or expired." (red badge)
- [ ] Page shows EnCoach logo (or entity logo if white-labelled)

**Flow:**
1. Verifier scans QR code on student's PDF
2. Browser opens verification page
3. Sees verified score details (or error if invalid)

**SRS Reference:** Frontend 39, Backend 28
**Priority:** Must Have

---

# APPENDIX A -- Story Map Summary

| ID | Title | Actor | Section | Priority |
|----|-------|-------|---------|----------|
| US-SL-01 | Register a New Account | Self-Learner | 1A | Must Have |
| US-SL-02 | Verify Email Address | Self-Learner | 1A | Must Have |
| US-SL-03 | Select Learning Goal | Self-Learner | 1B | Must Have |
| US-SL-04 | Set Target Level and Timeline | Self-Learner | 1B | Must Have |
| US-SL-05 | Set Study Preferences | Self-Learner | 1B | Must Have |
| US-SL-06 | Choose Placement Test Decision | Self-Learner | 1B | Must Have |
| US-SL-07 | View Placement Test Briefing | Self-Learner | 1C | Must Have |
| US-SL-08 | Placement Test -- Grammar | Self-Learner | 1C | Must Have |
| US-SL-09 | Placement Test -- Vocabulary | Self-Learner | 1C | Must Have |
| US-SL-10 | Placement Test -- Reading | Self-Learner | 1C | Must Have |
| US-SL-11 | Placement Test -- Speaking | Self-Learner | 1C | Must Have |
| US-SL-12 | View Placement Results | Self-Learner | 1C | Must Have |
| US-SL-13 | View Learning Path Preview | Self-Learner | 1C | Must Have |
| US-SL-14 | Choose Payment Option | Self-Learner | 1C | Should Have |
| US-SL-15 | Start Exam Session | Self-Learner | 1D | Must Have |
| US-SL-16 | Answer Listening Questions | Self-Learner | 1D | Must Have |
| US-SL-17 | Answer Reading Questions | Self-Learner | 1D | Must Have |
| US-SL-18 | Complete Writing Tasks | Self-Learner | 1D | Must Have |
| US-SL-19 | Record Speaking Responses | Self-Learner | 1D | Must Have |
| US-SL-20 | Review and Submit Exam | Self-Learner | 1D | Must Have |
| US-SL-21 | View Exam Results (Auto) | Self-Learner | 1D | Must Have |
| US-SL-22 | Post-Exam Routing (Pass) | Self-Learner | 1D | Should Have |
| US-SL-23 | Post-Exam Routing (Below Target) | Self-Learner | 1D | Should Have |
| US-SL-24 | View Gap Analysis | Self-Learner | 1E | Must Have |
| US-SL-25 | Start Auto-Generated Course | Self-Learner | 1E | Must Have |
| US-SL-26 | Start AI English Course | Self-Learner | 1E | Must Have |
| US-SL-27 | Start AI IELTS Course | Self-Learner | 1E | Must Have |
| US-SL-28 | Progress Through Modules | Self-Learner | 1E | Must Have |
| US-SL-29 | View In-Platform Resources | Self-Learner | 1E | Must Have |
| US-SL-30 | Complete Checkpoint Exercises | Self-Learner | 1E | Must Have |
| US-SL-31 | Take Post-Course Assessment | Self-Learner | 1E | Should Have |
| US-SL-32 | Download PDF Report | Self-Learner | 1F | Must Have |
| US-ES-01 | First Login | Entity Student | 2A | Must Have |
| US-ES-02 | Set New Password | Entity Student | 2A | Must Have |
| US-ES-03 | Take Mandatory Placement Test | Entity Student | 2B | Must Have |
| US-ES-04 | View Results (Pending Approval) | Entity Student | 2B | Must Have |
| US-ES-05 | Take Assigned Exam | Entity Student | 2C | Must Have |
| US-ES-06 | View Results (After Approval) | Entity Student | 2C | Must Have |
| US-ES-07 | Take Teacher-Configured Course | Entity Student | 2D | Must Have |
| US-ES-08 | Download Entity-Branded PDF | Entity Student | 2E | Must Have |
| US-AD-01 | Upload Student CSV | Admin | 3A | Must Have |
| US-AD-02 | Review CSV Validation | Admin | 3A | Must Have |
| US-AD-03 | Create Bulk Accounts | Admin | 3A | Must Have |
| US-AD-04 | Send Credential Emails | Admin | 3A | Must Have |
| US-AD-05 | Monitor Credential Delivery | Admin | 3A | Must Have |
| US-AD-06 | Configure Level Mapping | Admin | 3A | Should Have |
| US-AD-07 | Configure White-Label Branding | Admin | 3A | Should Have |
| US-AD-08 | Select Template Path | Teacher | 3B | Must Have |
| US-AD-09 | Initialise IELTS Exam | Teacher | 3B | Must Have |
| US-AD-10 | Configure Listening Structure | Teacher | 3B | Must Have |
| US-AD-11 | Configure Reading Structure | Teacher | 3B | Must Have |
| US-AD-12 | Configure Writing Structure | Teacher | 3B | Must Have |
| US-AD-13 | Configure Speaking Structure | Teacher | 3B | Must Have |
| US-AD-14 | Auto-Assemble Questions | Teacher | 3B | Must Have |
| US-AD-15 | Manually Assemble Questions | Teacher | 3B | Must Have |
| US-AD-16 | Hybrid-Assemble Questions | Teacher | 3B | Must Have |
| US-AD-17 | Validate Exam | Teacher | 3B | Must Have |
| US-AD-18 | Publish Exam | Teacher | 3B | Must Have |
| US-AD-19 | Assign Exam to Students | Teacher | 3B | Must Have |
| US-AD-20 | Custom Exam -- Properties | Teacher | 3C | Must Have |
| US-AD-21 | Custom Exam -- Sections | Teacher | 3C | Must Have |
| US-AD-22 | Custom Exam -- Questions | Teacher | 3C | Must Have |
| US-AD-23 | Custom Exam -- Validate/Publish | Teacher | 3C | Must Have |
| US-AD-24 | Save as Template | Teacher | 3C | Should Have |
| US-AD-25 | Create from Template | Teacher | 3C | Should Have |
| US-AD-26 | Grade Writing Submission | Teacher | 3D | Must Have |
| US-AD-27 | Grade Speaking Submission | Teacher | 3D | Must Have |
| US-AD-28 | View Student Gap Analysis | Teacher | 3E | Must Have |
| US-AD-29 | Configure Course Structure | Teacher | 3E | Must Have |
| US-AD-30 | Build Course Modules | Teacher | 3E | Must Have |
| US-AD-31 | Attach Resources to Modules | Teacher | 3E | Must Have |
| US-AD-32 | Generate AI Content | Teacher | 3E | Should Have |
| US-AD-33 | Publish and Assign Course | Teacher | 3E | Must Have |
| US-AD-34 | Monitor Student Progress | Teacher | 3E | Should Have |
| US-AD-35 | Quality Gate -- English | Admin | 3F | Must Have |
| US-AD-36 | IELTS Standards Check | Admin | 3F | Should Have |
| US-AD-37 | IELTS Examiner Review | Admin | 3F | Should Have |
| US-AD-38 | Approve Exam Results | Admin | 3G | Must Have |
| US-AD-39 | Reject Exam Results | Admin | 3G | Must Have |
| US-AD-40 | Adaptive Dashboard | Admin | 3H | Should Have |
| US-AD-41 | Adaptive Thresholds | Teacher | 3H | Should Have |
| US-AD-42 | Student Signals/Decisions | Teacher | 3H | Could Have |
| US-PV-01 | Verify Score via QR | Public | 3I | Must Have |

---

## Summary

| Metric | Count |
|--------|-------|
| **Total User Stories** | 83 |
| **Section 1 (Self-Learner)** | 32 |
| **Section 2 (Entity Student)** | 8 |
| **Section 3 (Admin/Teacher)** | 42 |
| **Section 3 (Public Verifier)** | 1 |
| **Must Have** | 62 |
| **Should Have** | 18 |
| **Could Have** | 3 |
| **Scope** | English Only (General English + IELTS) |

---

## End of Document

**Document Version:** 2.0
**Total User Stories:** 83
**Scope:** English Only (General English + IELTS). Math/IT deferred to future phase.
**Structure:** 3 actor journeys -- Self-Learner, Entity Student, Admin/Teacher -- each with atomic, per-function stories.
**Companion SRS Versions:** Frontend v1.1, Backend v1.1
