# 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 `