---
url: https://docs.nemo12.com/product/prd-001/req/learner.md
description: >-
  Bảng REQ của PRD-001 cho nhóm LRN, VIS, UX: mỗi REQ một dòng với ưu tiên,
  nguồn, SDD, QG và trạng thái.
---

# PRD-001 · REQ: Learner: trải nghiệm, overview, UI/UX

Một mảnh của [danh mục REQ PRD-001](../../prd-001-nemo12-platform.md), gồm REQ-LRN, REQ-VIS, REQ-UX. Sổ chung chỉ
CHÈN: thêm REQ bằng Edit vào đúng bảng của nhóm, không ghi cả file. Luật viết REQ, nghĩa của cột
Priority và Status nằm ở trang mục lục; §6, §7 ở [độ phủ](../req-coverage.md).

### REQ-LRN — Learner Experience (app: learn)

| ID | Yêu cầu | Ưu tiên | Nguồn | SDD | QG | Status |
| --- | --- | --- | --- | --- | --- | --- |
| REQ-LRN-01 | Learner biết chính xác mình đang ở đâu (mastery + confidence, không nhầm "chưa học" với "chưa đủ evidence") | M | SRC-006 JTBD1 | SDD-002 §2 | QG-005 | ✔ |
| REQ-LRN-02 | Next best action hằng ngày (cockpit), kèm lý do | M | SRC-006 JTBD2, FEAT-007 | SDD-002 §10 | QG-005 | ✔ |
| REQ-LRN-03 | Học đúng độ khó (difficulty controller) | M | SRC-006 JTBD3 | SDD-002 §11 | QG-005 | ✔ |
| REQ-LRN-04 | Giải cứu khi mắc kẹt: tìm nguyên nhân, scaffold, quay lại prerequisite | M | SRC-006 JTBD4 | SDD-002 §11 | QG-005 | ✔ |
| REQ-LRN-05 | Thấy tiến độ tới goal (readiness %, critical gaps + uncertainty) | M | SRC-006 JTBD5, SRC-032 | SDD-002 §17, SDD-008 §5 | QG-005 | ✔ |
| REQ-LRN-06 | Một hành trình liên tục xuyên school (không học lại từ đầu) | M | SRC-006 JTBD6 | SDD-007 §5 | QG-005 | ✔ |
| REQ-LRN-07 | Chứng minh năng lực bằng evidence; dừng đúng lúc (stopping criteria) | M | SRC-006 JTBD7, SRC-011 | SDD-002 §12 | QG-005 | ✔ |
| REQ-LRN-08 | Onboarding khảo sát mục tiêu — không ép mọi learner khai mục tiêu thi chuyên | M | FEAT-005, RISK-009 | SDD-002 §4 | QG-002 | ✔ |
| REQ-LRN-09 | Learner xem danh sách school, enroll thêm và **chuyển đổi** giữa nhiều school (active school trong Context) | M | SRC-024 | WF-01 §1, SDD-002 §3 | QG-005 | ✔ |
| REQ-LRN-12 | Nemo **tự sửa thông tin của mình** (họ tên, ngày sinh, lớp, trường, tỉnh) từ menu avatar → Profile | M | SRC-027, CC-APP-01 | WF-01 | QG-008 | ✔ |
| REQ-LRN-11 | Điều hướng: trang gốc hiển thị mọi school; **"Vào xem"** trước → School Home (mục tiêu chung + mục tiêu con) → "Bắt đầu học"/"Vào học"; logo → về gốc; avatar góc phải → Settings/Profile/Logout | M | SRC-024, SRC-027, SRC-086, SRC-088 | WF-01 | QG-007 | ✔ |
| REQ-LRN-10 | Turtle: nhiều cách học; learner **chọn thẳng một bài để học** (browse node/lab theo area → luyện với feedback tức thì per câu) | M | SRC-024 | SDD-010, SDD-004 §5 | QG-005 | ✔ |
| REQ-LRN-13 | Nemo **khai tự nhiên** ("con sắp thi học kỳ", "em sợ hình") → AI interpret (gateway, confirm trước khi ghi) → Context Event / Goal entry; TÙY CHỌN, cấm form 20 fields, degradation → form tối giản | M | SRC-032 | SDD-002 §5b, WF-15 | QG-005/010 | ✔ |
| REQ-LRN-15 | **Khởi động 1 câu** trước luyện tập: "Con thấy phần này thế nào?" — 4 mức bằng tiếng người (chưa học / học rồi mà quên / nhớ khá rõ / chắc lắm rồi), TÙY CHỌN, thành evidence self-report (.50) vào Evidence Registry; sau bài so **calibration** tự-đánh-giá vs thực tế bằng lời. Không hỏi "đoán đúng mấy trên N câu" và "chỗ khó nhất" — SRC-066 | M | SRC-046, SRC-066, SRC-140 | SDD-002 §5, §18 | QG-005 | ✔ |
| REQ-LRN-14 | **URL theo page** (shareable deep links): mỗi màn chính của **mọi portal** có URL riêng — learn (/{school}/hoc…), coral (/{school}/{subject}/{tab}\[/{id}]), marlins (/child/:id/…), dolphin (/learner/:id, /doi-ngu…). Copy URL gửi được cho người khác, back/forward + F5 hoạt động. **Bắt buộc History API, không dùng hash** (hash không tới server nên không phân quyền/đo lường theo trang được, và một số công cụ chat cắt mất phần sau `#`); đổi slug thì giữ redirect mềm cho link đã chia sẻ | M | SRC-036, SRC-161, SRC-451 | SDD-001 §4 | QG-007 | ✔ |
| REQ-LRN-16 | **Đường đi của Unit** ở Phòng Lab (kiểu Duolingo): mỗi Unit là một dãy Experience, mỗi ô **chỉ một hình đại diện + 2-3 chữ**; **3 Assessment Experience** ở đầu/giữa/cuối, ô đầu là **"Học vượt"** chỉ có **1 bong bóng** (sai một câu là trượt, làm lại từ đầu, không được vượt unit), và **tối thiểu 6 Learning Experience** (thiếu thì bù bằng vòng luyện tập trên chính bài của unit). **3 màu trạng thái**: chưa làm (xám) - đã xong (xanh) - cần làm ngay (coral). Điều hướng chỉ mở **1 Learning Package / 1 module / 1 unit** tại một thời điểm | M | SRC-102 | SDD-010 §9 | QG-005 | ✔ |
| REQ-LRN-18 | **Con xem được Learning Plan mới nhất** ở trang riêng `/plan`, xem lại **các phiên bản trước**, mỗi bản kèm "đổi gì so với bản trước · vì sao · do đâu"; con **khai thêm thông tin** (ốm, bận, quỹ thời gian…) để kế hoạch tính lại ngay | M | SRC-107 | SDD-007 §6b | QG-005 | ✔ |
| REQ-LRN-19 | **Hải đăng (Lighthouse)** — một mảng gom ba thứ nói về đường dài: Student Portrait (ĐÍCH) · Lộ trình dài hạn (ĐƯỜNG) · Kế hoạch học (BƯỚC ĐI). Trang hub `/lighthouse` **giới thiệu từng phần** (là gì · vào đó làm gì) trước khi vào; ba trang con giữ URL riêng. Có ở cả learn (Nemo) và Marlins (bố mẹ) | M | SRC-113, SRC-223 | SDD-015 §2c | QG-005 | ✔ |
| REQ-LRN-20 | **Hình học phải nhiều hình, và hình vẽ bằng thuật toán**: mọi hình minh hoạ là SVG sinh từ tham số, **kéo được** (đổi số đo → hình đổi theo); **cấm file ảnh bitmap (JPEG/PNG)** trong nội dung học. Tham số lưu ở `item_figures`, engine dựng hình ở client | M | SRC-114 | SDD-010 §11 | QG-006 | ✔ |
| REQ-LRN-21 | **Mở dần theo mức khai báo**: trang gốc gom mọi nơi vào một lưới (school + Whale + Orca, không nhãn nhóm); school mở dần theo số bước learner đã khai trong **Lighthouse** (hồ sơ · phản hồi Portrait · bản của riêng con · quỹ thời gian · mục tiêu), school đầu luôn mở và school đã enroll không bị khoá lại. Nút Lighthouse nằm trên navbar | M | SRC-120 | SDD-015 §2c | QG-005 | ✔ |
| REQ-LRN-17 | **Sai thì làm lại — nhưng ở CUỐI hàng, không phải ngay tại chỗ**: câu trả lời sai được chèn xuống cuối danh sách câu phải làm (10 câu → sai 1 thành 11 → sai nữa thành 12); learner xem đáp án + giải thích rồi đi tiếp, lát nữa gặp lại. Mỗi lần sai vẫn mất một bong bóng, hết bong bóng thì làm lại cả Experience. Chỉ **lần trả lời đầu của mỗi câu** được ghi làm evidence (lượt gặp lại chấm ở client) để bài đo không bị đẩy hết về 100% | M | SRC-103, SRC-115 | SDD-010 §9, SDD-002 §5 | QG-005 | ✔ |
| REQ-LRN-22 | **Một cửa vào duy nhất**: bỏ Compass khỏi menu; Dashboard gánh cả hai việc, hàng chờ đề xuất nằm **trên đầu** trang (đúng 1 việc lớn có nút + 2 việc nhỏ có nhãn lý do), bản đồ để learner tự chọn nằm ngay dưới. **Không có nút "để sau"** trong hàng chờ | M | SRC-384 | SDD-021 §1-2 | QG-002 | ✔ |
| REQ-LRN-23 | **Ba bậc hiện ra**: mỗi thẻ Unit hiện ba bậc `can_do` (Đang hình thành · Đạt · Vững) bằng **ba chấm nhỏ, không chữ**; chữ giải thích chỉ nằm trong popover dấu hỏi. Vào Module nào cũng được nhưng vào ở bậc "Đạt"; bậc "Vững" chỉ mở khi đã có bằng chứng ở bậc "Đạt" | M | SRC-384 | SDD-021 §6 | QG-007 | ✔ |
| REQ-LRN-24 | **Diagnosis Report** ở URL riêng `/{school}/report/{subject}`, mở lại được bất cứ lúc nào: **không có điểm số**, tối đa **5** mục "con đã vững" và **đúng 1** mục "bắt đầu từ đây" bấm được vào học | M | SRC-384 | SDD-021 §4 | QG-002 | ✔ |
| REQ-LRN-25 | **Hé cửa, không khoá**: learner chọn Unit sâu hơn bằng chứng hiện có thì vẫn vào được; **sai 3 câu** thì hệ gọi tên một bài tiên quyết cụ thể và mở được ngay, luôn kèm nút "con cứ học tiếp ở đây". Mỗi Module hiện một dòng "phần này thường học ở lớp N, con đang có bằng chứng ở mức lớp M" | M | SRC-384 | SDD-021 §5 | QG-005 | ✔ |
| REQ-LRN-26 | **Học đến đâu là xong: đo bằng SỐ UNIT, không bằng phút.** Một phiên thật trên production ghi 82 câu trong 1.241 phút (tab bỏ quên) so với 77 câu trong 19 phút, nên phút không đo được gì. Cường độ khai trong hồ sơ: nhẹ 1-3 · vừa 4-7 · cao 8-20 unit/ngày; tuần tính 5 ngày có học trong 7 | M | SRC-419 | SDD-021 | QG-005 | ✔ |
| REQ-LRN-27 | **"Còn cách đích bao xa" chỉ hiện ở trang Kế hoạch**, cố ý không đưa lên màn hình hằng ngày, để đích dài hạn không đè lên việc hôm nay | S | SRC-419 | SDD-021 | QG-007 | ✔ |
| REQ-LRN-28 | **Dashboard tách hai kênh, cấm trộn vào một số**: mức vững (mastery) đo trên phần ĐÃ đo, độ phủ đo trên toàn bộ bài. Gộp lại thành một trung bình khiến learner học 4/36 bài rất chắc vẫn hiện ra như đang kém | M | SRC-175, SRC-233, SRC-235, SRC-269, SRC-298 | SDD-021 | QG-005 | ✔ |
| REQ-LRN-29 | **Trang Học là một lộ trình Package → Module → Unit mở dần theo thứ tự**, không phải một cái phòng chứa đồ; cây mở sẵn cả, không gấp lại theo Module. Tên trang từng là "Đường học" (SRC-188) và **SRC-284 đổi lại thành "Học"** — luật còn hiệu lực là tên phải nói đúng thứ bên trong, xem REQ-UX-30 | S | SRC-188, SRC-263, SRC-284, SRC-061 | SDD-021 | QG-007 | ✔ |
| REQ-LRN-30 | **Học vượt chạy với số câu SẴN CÓ**, không chờ kho đủ. Luật "sai tối đa một câu" vốn là TỈ LỆ chứ không phải con số cố định, nên màn hình nói đúng số câu thật của lượt này thay vì cứng "9/10" | M | SRC-377 | SDD-010 §12 | QG-005 | ✔ |
| REQ-LRN-31 | **Dashboard chỉ trả lời MỘT câu: phần đã học thì vững tới đâu.** Chấm trên thang 10 lấy một số lẻ; bỏ hẳn "phần trăm đã đo" khỏi màn hình chính vì trộn hai câu hỏi vào một con số làm cả hai mất nghĩa | M | SRC-178, SRC-391, SRC-392, SRC-393 | SDD-021 | QG-007 | ✔ |
| REQ-LRN-32 | **Đúng MỘT cách hiển thị Experience trên toàn hệ, theo lối Duolingo**: ô nhỏ, đường đi uốn nhẹ, tên Unit làm dải phân cách, ô chưa mở và ô đang làm vẽ khác nhau rõ. Bấm ô thì mở popover trước, bấm nút trong popover mới vào bài | M | SRC-256, SRC-257, SRC-267, SRC-268, SRC-271, SRC-274, SRC-282, SRC-292, SRC-294, SRC-296, SRC-324, SRC-328, SRC-358, SRC-344 | SDD-021 | QG-007 | ✔ |
| REQ-LRN-33 | **Mỗi Unit có tối thiểu 6 Experience** | M | SRC-259 | SDD-010 §9 | QG-006 | ✔ |
| REQ-LRN-34 | **Thang tự tin còn ba mức, không đánh số**; lý do chọn đáp án còn ba lựa chọn xếp trên một dòng, bỏ ô nhập tự do. Ít lựa chọn hơn thì learner trả lời thật hơn, và dữ liệu gom được cũng dùng được | S | SRC-262, SRC-264, SRC-265 | SDD-002 | QG-005 | ✔ |
| REQ-LRN-35 | **Unit chia thành PHẦN theo mức vững, không theo Package.** Ngăn cách các Unit bằng đường kẻ thay vì dòng chữ "Unit này chưa mở"; Unit quá nhiều ô thì bớt; có màn danh sách các Phần để nhảy nhanh | M | SRC-272, SRC-278, SRC-280, SRC-283 | SDD-021 | QG-007 | ✔ |
| REQ-LRN-36 | **Học vượt CHỈ tồn tại ở cấp Unit**, không có ở cấp Package hay Module; báo "Học vượt chưa qua" rút còn một câu | S | SRC-276, SRC-280 | SDD-010 §12 | QG-005 | ✔ |
| REQ-LRN-37 | **Phần nào cũng phải có bài, và số lượng tương đồng nhau.** Một Phần rỗng hoặc lệch hẳn về số bài làm learner hiểu nhầm là mình đã bỏ sót gì đó | M | SRC-289 | SDD-010 §9 | QG-006 | ✔ |
| REQ-LRN-38 | **Hạn mức câu hỏi siêu nhận thức**: mỗi Experience hỏi tối đa 2 lần "con tự tin tới mức nào" và tối đa 2 lần "vì sao con chọn đáp án đó". Hỏi mãi thì learner bấm cho xong, và dữ liệu thu được thành vô nghĩa | M | SRC-333 | SDD-002 | QG-005 | ✔ |
| REQ-LRN-39 | **Learner đi được tới MỌI Phần, không Phần nào bị khoá**; việc khoá chỉ tồn tại ở cấp Unit. Khoá cả một Phần thì learner không nhìn thấy đường mình sẽ đi | M | SRC-375 | SDD-021 | QG-005 | ✔ |
| REQ-LRN-40 | **Unit nào cũng cho học vượt.** Unit thiếu bài học vượt hoặc thiếu câu thì bổ sung nội dung, không phải tắt tính năng ở unit đó | M | SRC-376 | SDD-010 §12 | QG-006 | ✔ |
| REQ-LRN-41 | **Lab phải ghi bằng chứng năng lực.** Learner nghịch xong một lab mà hồ sơ im lặng thì lab nằm ngoài hệ đo. Bằng chứng từ lab mang độ tin cậy THẤP hơn bài đo (0,45) và tính một lần mỗi lab mỗi ngày: lab là chỗ thử, không phải chỗ chấm. Lab không gắn được vào Unit nào thì đó là tín hiệu THIẾU NỘI DUNG trong cây năng lực, không phải lý do để bỏ qua | M | SRC-478, SRC-479 | SDD-010 §5 | QG-006 | ✔ |
| REQ-LRN-42 | **Lối tắt cho learner đã biết phải tự giải thích được khi nào dùng, và không được đứng ở vị trí bước 1.** Tên gọi phải nói ĐIỀU KIỆN dùng ("Con biết rồi?") chứ không mô tả kết quả ("Học vượt"); nó nằm ngoài chuỗi đường đi, kèm một câu nói rõ khi nào nên thử. Cơ chế giữ nguyên: chỉ mở ở Unit chưa học, một lượt, phải đúng tất cả | S | SRC-485 | SDD-010 §12 | QG-006 | ✔ |
| REQ-LRN-43 | **Màn kết quả có đúng MỘT nút chính, và nút đó không đổi theo kết quả.** "Tiếp tục" luôn là việc chính, kể cả khi còn câu sai; rà soát bài làm và làm lại là lựa chọn, nằm ở link nhỏ. Không hiện chi tiết cơ chế (số lượt bị xếp lại) cạnh điểm số, vì đứng đó nó đọc thành lời chê kèm điểm | M | SRC-357, SRC-488 | SDD-021 §6 | QG-007 | ✔ |
| REQ-LRN-44 | **Dấu lược giữa từ không phải dấu mở ngoặc.** Luật tách đề đọc hiểu chỉ được cắt khi dấu mở và dấu đóng cùng một cặp và đều không nằm giữa từ, nếu không mọi câu tiếng Anh có `'s`, `n't`, `'re` đều bị cắt vỡ ("Don't" thành lead "Don" và đoạn trích "t judge a book…") | M | SRC-156, SRC-487 | SDD-021 §6 | QG-007 | ✔ |
| REQ-LRN-45 | **Cổng readiness trước khi vào Unit, có ngân sách và không khoá cửa.** Điểm vào cửa tính từ tiên quyết trực tiếp; chưa đủ bằng chứng thì mời ĐO chứ không mời học lại. Thang sửa dừng ở bốn phanh chạy cùng lúc — sàn lớp `min(G−2, trung vị bằng chứng −1)`, tối đa 2 hop, 3 Unit, ~30 phút — và mỗi lần cắt phải nói ra còn bao nhiêu. Nghỉ 7 ngày mỗi (learner, Unit); thử 2 lần tới sàn không qua thì gắn cờ cho người, không dẫn đi vòng nữa. `can_enter_anyway` LUÔN true (REQ-LRN-25 không đổi) | M | SRC-618 | SDD-021 §14 | QG-002/005 | ✔ |
| REQ-LRN-46 | **Con tự kể về mình + ảnh thật**: năm ô văn xuôi (sở thích · quá khứ học tập · tự thấy mạnh ở đâu · tự thấy yếu ở đâu · điều muốn thầy cô biết), ô nào cũng được bỏ trống, ghi **gộp từng phần** (ô không gửi thì giữ nguyên, gửi chuỗi rỗng thì xoá); learner tải **ảnh thật của chính mình** (JPG/PNG/WebP, ≤ 5 MB) vào đúng cột `learners.photo_media_id` đang dùng cho ảnh gia đình, ảnh luôn là media **nội bộ** (Q-146) và phục vụ qua lối gác bằng **quan hệ** để chính em ấy và bố mẹ xem được — `/v1/media/{id}` chỉ mở cho vai nội bộ nên không dùng được ở đây; mentor đọc tất cả ở tab **About**, không cắt chữ | M | SRC-739 | [SDD-036](../../../architecture/sdd-036-learner-self-profile.md) §1-§5 | QG-004/008 | ✔ |
| REQ-LRN-47 | **Chương trình AI Teen ở `/ai-teen`**: sau đăng nhập; ghi danh/rút từng course (AI Teen 1..3), server chỉ nhận id course có trong chương trình và kiểm quyền với learner; mỗi course 6-8 unit, mỗi unit 3-5 key concept, lessons và MỘT Performance Task; task khai skill CCS + level TRƯỚC rubric; khu Skills của course SUY RA từ các task, lấy level cao nhất | M | SRC-1005 | [SDD-043](../../../architecture/sdd-043-ai-teen-program/index.md) §1-§4 | QG-008 | ✔ |
| REQ-LRN-48 | **Tick từng bước của lesson AI Teen** (SRC-1283): lesson > Activity > Bước; learner tự tick bước không có máy kiểm, bước có cổng đọc chỉ xong khi qua cổng và bước câu kiểm chỉ xong khi đúng (server từ chối tick hai loại ấy); lưu server theo learner, khoá theo slot lesson + id Activity + id Bước; chỉ chính learner đã ghi danh được ghi, phụ huynh và mentor đọc; card Activity và NavBar hiện số + tick; không vào Evidence Registry | M | SRC-1283, SRC-1286 | [SDD-043](../../../architecture/sdd-043-ai-teen-program/index.md) §14, §15 | QG-005/008 | ✅ đã dựng 07.10.2026 (SDD-043 §15.8) |
| REQ-LRN-49 | **Chứng chỉ khoá học của learner ở `/certificates`** (SRC-1331): mục "Chứng chỉ" trong menu tài khoản; chia "Đã có" và "Sắp có" (xong n/m bài, còn bài nào, tiêu chí); chứng chỉ đã có mở ở `/certificates/{courseId}`, in được, có tên learner, tên khoá, ngày cấp DD.MM.YYYY, mã xác thực. Chứng chỉ SUY RA từ dữ liệu hoàn thành có thật, không bảng riêng: khoá curriculum = xong chặng Tổng hợp của mọi bài; AI Teen = tick xong mọi bước tự làm của mọi lesson. Chương trình chưa có tiêu chí hoàn thành (IELTS, SPEAK, lớp theo lịch) không cấp. Chỉ chính learner, gia đình và vai nội bộ có audit đọc được | M | SRC-1331 | [SDD-004](../../../architecture/sdd-004-curriculum-storage.md) §20 | QG-005/008 | ✅ đã dựng 10.10.2026 |
| REQ-LRN-50 | **Tra cứu chứng chỉ công khai theo mã** (SRC-1333): `learn.nemo12.com/verify` (ô nhập) và `/verify/{mã}`, không cần đăng nhập, tiếng Việt; hiện hợp lệ hay không, và khi hợp lệ chỉ hiện tên gọi + chữ đầu của họ (ví dụ "Đắc N."), tên khoá, ngày cấp DD.MM.YYYY. Không lộ id, email, họ tên đầy đủ, trường. Mã lạ hay hết hiệu lực trả cùng một câu trả lời; có trần lượt tra theo IP. Chứng chỉ in được ghi kèm đường tra cứu | M | SRC-1333 | [SDD-004](../../../architecture/sdd-004-curriculum-storage.md) §20f | QG-005/008 | ✅ đã dựng 10.10.2026 |

### REQ-VIS — Overview & Views (SRC-012)

| ID | Yêu cầu | Ưu tiên | Nguồn | SDD | QG | Status |
| --- | --- | --- | --- | --- | --- | --- |
| REQ-VIS-01 | Multi-dimensional view: by school/subject/area/goal/skill/readiness/workload… | M | SRC-012 §2 | SDD-008 §2 | QG-005 | ✔ |
| REQ-VIS-02 | Drill-down Nemo12 → School → Subject → Area → Unit → Skill → Evidence, và zoom-out | M | SRC-012 §3 | SDD-008 §3 | QG-005 | ✔ |
| REQ-VIS-03 | Goal View: readiness ước tính + critical/important/nice-to-have gaps | M | SRC-012 §5 | SDD-008 §5 | QG-005 | ✔ |
| REQ-VIS-04 | Node states đầy đủ (Not Assessed / Unknown / Learning / Needs Review / Mastered / Advanced / Blocked / At Risk) | M | SRC-012 §4 | SDD-008 §4 | QG-005 | ✔ |
| REQ-VIS-05 | Trajectory view (Past → Current → Expected) + Workload view + cảnh báo overload | M | SRC-012 §6–7 | SDD-008 §6 | QG-005 | ✔ |
| REQ-VIS-06 | Trace ngược "vì sao hôm nay học cái này": Task → Gap → Area → Goal | M | SRC-012 §8 | SDD-008 §7 | QG-005 | ✔ |
| REQ-VIS-07 | Màn hình **tiến độ theo từng school** (thời gian học ước tính, số kỹ năng đã học/đã vững, hoạt động gần đây) — cho cả Nemo và Marlin | M | SRC-019 | SDD-008 §6, §2 | QG-005/007 | ✔ |
| REQ-VIS-08 | Màn hình **toàn cảnh**: môn → area (Số học/Đại số/Hình học…) → node; đi từ môn tới node trong **≤3 lần bấm**; mỗi cấp hiện mastery + trạng thái theo bộ trạng thái REQ-VIS-04, mã hóa bằng **màu kèm chữ** (không dùng màu làm tín hiệu duy nhất — WCAG) | M | SRC-019, SRC-012 §2-3 | SDD-008 §2-4 | QG-005/007 | ✔ |
| REQ-VIS-16 | **Learner ở đâu**: đếm theo quốc gia, rồi theo tỉnh/thành/bang trong từng quốc gia. Quốc gia lấy từ mã Cloudflare gắn sẵn vào mọi request lúc đăng nhập, nên không hỏi learner thêm câu nào; learner tự khai thì lời khai **thắng vĩnh viễn** phép đoán. Tỉnh/thành đổi từ chữ tự gõ sang **mã có bí danh**, kèm cả tên tỉnh CŨ trước lượt sáp nhập 2025. Nhóm **chưa rõ là một dòng có số**, không phải một chỗ trống: đó là con số nói cho người đọc biết bảng này đáng tin tới đâu | M | SRC-989 | [SDD-042](../../../architecture/sdd-042-learner-geography.md) | QG-008 | ✔ |
| REQ-VIS-09 | **Màu tô trong hình minh hoạ phải giữ đủ tương phản với nền.** Một đợt chuyển sang tông đơn sắc từng đẩy 19 màu tô lên gần trắng (~#F2F2F2): hình vẫn vẽ đủ nét nhưng vô hình trên nền trắng, và báo cáo về là "ảnh không hiển thị" | M | SRC-182, SRC-323 | DS-001 | QG-007 | ✔ |
| REQ-VIS-10 | **Hình minh hoạ phải tự nó giải thích được ý**, không cần đọc chú thích mới hiểu. Phản hồi "xem hình này không hiểu gì cả" là tiêu chí loại bỏ, không phải góp ý về thẩm mỹ. Icon vẽ phẳng, bỏ nét nối thừa giữa các ô | M | SRC-228, SRC-275 | DS-001 | QG-007 | ✔ |
| REQ-VIS-11 | **Ba tầng thẻ đều phải nói được "học xong thì con làm được gì", và nói rõ đang nói về tầng nào.** Package thêm **Ý xuyên suốt** (hạt nhân sư phạm, khác vai với lời hứa i-will). Nguồn chữ là Pearl, không soạn lại trong app. Cấm để ô rỗng: thiếu chữ thì bổ sung nội dung ở Pearl chứ không giấu ô đi | M | SRC-463, SRC-473, SRC-483, SRC-484 | SDD-008 §8 | QG-007 | ✔ |
| REQ-VIS-12 | **Ô mức vững chỉ được tô ĐẶC khi đã chứng minh**: tối thiểu hai lượt đo và độ chắc từ 0,65. Chưa đủ thì vẽ viền rỗng ở MỌI tầng (Unit, Module, Package, thanh tổng), vì tô đặc sau một lượt đúng là hệ tự khen thay learner và learner sẽ dừng lại đúng lúc chưa nên dừng | M | SRC-459, SRC-489 | SDD-008 §9 | QG-007 | ✔ |
| REQ-VIS-13 | **Nhật ký học theo ngày**: mỗi ngày liệt kê chính xác từng Unit, đếm theo **Unit** chứ không theo lượt làm bài, tách rõ Unit mới khỏi Unit ôn lại, cửa sổ xem 7 · 30 · 60 ngày. "Mới" tính trên toàn bộ lịch sử, không tính trong cửa sổ đang xem, nếu không thu cửa sổ lại là hệ khen sai | M | SRC-221, SRC-481, SRC-486 | SDD-008 §10 | QG-007 | ✔ |
| REQ-VIS-14 | **Bàn mô phỏng lộ trình**: chỉnh tham số ngay trên trang (lớp, ngày/tuần, phút/ngày, số lượt để một Unit thành vững, số tháng nhìn trước) và tính tại chỗ ra độ phủ theo Module, tỉ lệ hổng, kế hoạch từng ngày. Phạm vi **lớp** là tham số bắt buộc: cây trải lớp 1 tới 12 nên "phủ bao nhiêu phần" vô nghĩa nếu chưa chốt phạm vi. Unit đã vững vẫn ăn giờ ôn theo chu kỳ của engine retention, để con số hổng sinh ra từ một đánh đổi có thật chứ không từ một phép chia | S | SRC-482 | SDD-008 §11 | QG-007 | ✔ |
| REQ-VIS-15 | **Phòng khám chỗ hổng**: mỗi chỗ hổng phải kèm ĐƠN THUỐC đọc được, gồm các Learning Experience cụ thể, tối thiểu một lab, một bài đo lại và khoảng cách ngày lấy từ engine retention. Trang này soi xem hệ đang khuyên gì, nên lời khuyên vô lý là dấu hiệu dữ liệu hoặc luật sai | S | SRC-476 | SDD-008 §12 | QG-005 | ✔ |

### REQ-UX — Learner-first UI/UX (SRC-042)

Phân tích, audit hiện trạng và **trọng số** của từng yêu cầu: [PRD-002](../../prd-002-learner-ux.md). Thứ tự áp dụng: learn → marlins → dolphin.

| ID | Yêu cầu | Ưu tiên | Nguồn | SDD | QG | Status |
| --- | --- | --- | --- | --- | --- | --- |
| REQ-UX-01 | Mỗi màn đúng **một primary action** (coral) kèm lý do; màn "Hôm nay" trả lời "làm gì tiếp" trong ≤5 giây | M | SRC-042, PRD-002 W10 | DS-001 §5-6 | QG-007 | ✔ |
| REQ-UX-02 | Tiến bộ nhìn thấy được: mastery/readiness dùng progress component chung (dày, nhãn ngữ cảnh, animation tăng tiến) | M | SRC-042, PRD-002 W9 | DS-001 §5 | QG-007 | ✔ |
| REQ-UX-03 | Không phán xét: đỏ chỉ cho lỗi hệ thống; trạng thái học tập thấp dùng amber/neutral + lời khích lệ; empty state luôn có bước tiếp theo | M | SRC-042, PRD-002 W9, SRC-311, SRC-318 | DS-001 §2,§6 | QG-007 | ✔ |
| REQ-UX-04 | Ngưỡng đọc đo được: cỡ chữ nhỏ nhất **14px**, body 16px, line-height ≥1.5, contrast ≥ WCAG AA (4.5:1 chữ thường, 3:1 chữ lớn), type scale 5 bậc | M | SRC-042, SRC-013 | DS-001 §3 | QG-007 | ✔ |
| REQ-UX-05 | 3 portal chỉ dùng token + lớp `n12-*` của `@nemo12/design-system`; cấm style ad-hoc/copy component giữa app | M | SRC-042, RISK-012, SRC-158, SRC-351 | DS-001 §1,§7 | QG-007 | ✔ |
| REQ-UX-06 | Trạng thái hệ thống hiển thị: skeleton khi tải, busy state trên nút, error có retry; motion 150–200ms + reduced-motion | M | SRC-042, PRD-002 W7, SRC-325 | DS-001 §4-5 | QG-007 | ✔ |
| REQ-UX-07 | Mobile-first: touch target ≥44px cho hành động chính, layout 1 cột co giãn | M | SRC-042, Q-029 | DS-001 §4 | QG-007 | ✔ |
| REQ-UX-08 | Mỗi school một "thế giới": hero gradient từ accent, icon lớn, accent xuyên suốt — nhưng theme vẫn là lớp mỏng, không fork component | M | SRC-042, PRD-002 W6 | DS-001 §6 | QG-007 | ✔ |
| REQ-UX-09 | Giảm tải nhận thức: mỗi màn ≤3 khối thông tin chính, chi tiết mở dần | S | SRC-042, PRD-002 W6 | DS-001 §6 | QG-007 | ✔ |
| REQ-UX-10 | Portal người lớn (marlins/dolphin/coral): cùng ngôn ngữ hình ảnh, mật độ thông tin cao hơn, số liệu kèm giải thích | M | SRC-042, PRD-002 W5 | DS-001 §6 | QG-007 | ✔ |
| REQ-UX-11 | **Full-width + HOME = hub**: mọi trang trải hết chiều ngang; trang home (Root, tab "Hôm nay") chỉ chứa 1 hành động chính + cards điều hướng — không dữ liệu chi tiết; School Home read-only theo cụm, KHÔNG form nhập liệu | M | SRC-048 | DS-001 §5b | QG-007 | ✔ |
| REQ-UX-13 | **Chưa có dữ liệu ≠ điểm 0**: ô/vòng tròn của phần chưa đo mang dấu **"?"** và **mờ hẳn** (opacity ~0.4) — rỗng hoàn toàn thì đọc ra "hỏng", còn hiện 0 thì nói sai (0 là một khẳng định đã đo và kém). Mờ để phần đã học vẫn là thứ bắt mắt trước | M | SRC-205 | DS-001 §5b | QG-007 | ✔ |
| REQ-UX-12 | **Text budget & hình > chữ**: card = icon + tên + ≤1 dòng phụ; cấm đoạn văn trên card/list; metadata ≤3 mẩu/dòng; ưu tiên icon/cờ/progress thay câu mô tả; cả card bấm được thay vì link "Chi tiết" riêng | M | SRC-048 | DS-001 §5b | QG-007 | ✔ |
| REQ-UX-14 | **Toàn cảnh môn học mở dần ba tầng**: Package (một hàng thẻ) → Module (một hàng vòng tròn nối bằng mũi tên chỉ thứ tự học) → Unit (mỗi Unit một thẻ chứa các chấm Experience). Mỗi lúc chỉ một Package và một Module mở; điểm cả môn thu về một dòng mảnh, không còn dải băng chiếm đầu trang | M | SRC-207 | DS-001 §5b | QG-007 | ✔ |
| REQ-UX-15 | **Thời gian hiển thị theo giờ Việt Nam (GMT+7), có ghi rõ múi giờ**: cấm in UTC trần và cấm cắt chuỗi ISO bằng `.slice(0,10)` — cắt chuỗi UTC làm mọi việc sau 17:00 giờ Việt Nam nhảy sang ngày hôm sau | M | SRC-242 | SDD-001 §4 | QG-007 | ✔ |
| REQ-UX-16 | **Mốc thời gian tương đối đi kèm mốc tuyệt đối**: mỗi dòng trong sổ chạy ghi "x phút trước / x giờ y phút trước / x ngày trước"; mốc dưới 24 giờ tô đỏ để chuyện vừa xảy ra nổi lên khỏi danh sách | S | SRC-336 | SDD-001 §4 | QG-007 | ✔ |
| REQ-UX-17 | **Trang Mục tiêu không có nhãn "tạm tính" và không có nút Xác nhận**: learner sửa ngày bằng cách bấm thẳng vào ngày, nên một nút xác nhận riêng chỉ thêm việc mà không đổi được gì. Ngày dạng DD.MM.YYYY kèm "còn x tuần"; dưới 7 ngày thì "còn x ngày y giờ" | S | SRC-224 | SDD-021 | QG-007 | ✔ |
| REQ-UX-18 | **Nhãn tiếng Việt cho mọi cổng learner-facing**, gồm cụm lọc của Orca. Đảo lại quyết định cũ SRC-080 ("đồng bộ với Whale") vì lý do gốc của nó không còn sau khi WhaleHub Việt hoá ở SRC-134 | S | SRC-145, SRC-424 | SDD-016 §6 | QG-007 | ✔ |
| REQ-UX-19 | **Màn luyện tập bỏ mọi con số đếm không giúp learner quyết định gì**: nhãn "Câu 4/10", dòng "bài này hiện có N câu". Chữ mô tả mức tự tin nằm THẲNG trong tag cùng con số, không tách thành chú giải riêng | S | SRC-082, SRC-147, SRC-156, SRC-152 | SDD-021 | QG-007 | ✔ |
| REQ-UX-20 | **Thứ tự phương án phải xáo thật theo từng lượt**, kể cả ở câu hỏi phụ "vì sao con chọn đáp án này"; hai lựa chọn xếp một dòng cho đỡ dài | S | SRC-151, SRC-162, SRC-440 | SDD-010 §12 | QG-006 | ✔ |
| REQ-UX-21 | **Trang chủ school là hub, không phải trang nội dung**: bỏ các cụm gom nhóm thừa và các thẻ lối tắt trùng vai, giữ đúng những lối vào learner thật sự dùng | S | SRC-179, SRC-186, SRC-187 | SDD-021 | QG-007 | ✔ |
| REQ-UX-22 | **Công tắc VI/EN đổi được qua lại và dùng chung ở mọi nơi có chức năng đổi ngôn ngữ**, gồm cả tên mục trong menu avatar | S | SRC-146, SRC-229, SRC-078 | SDD-001 §4 | QG-007 | ✔ |
| REQ-UX-23 | **Màn kết quả không nhắc "đúng ngay lần đầu"**, và ngọc trai hiện đúng MỘT viên kèm con số thay vì rải nhiều viên | S | SRC-260, SRC-266 | SDD-021 | QG-007 | ✔ |
| REQ-UX-24 | **Thẻ trong Dashboard dùng chung một kiểu viền**: viền xám mảnh, thẻ đang chọn đổi sang viền đen nhưng KHÔNG dày hơn — đổi độ dày làm bố cục nhảy khi chọn qua lại. Module cũng nằm trong card như Package và Unit | S | SRC-239, SRC-240, SRC-303 | DS-001 | QG-007 | ✔ |
| REQ-UX-25 | **Dashboard có công tắc mở dần**: mặc định chỉ hiện Package kèm điểm, bấm mới mở chi tiết Module. Vòng Coverage có màu, số ở giữa kèm ký tự %, và mỗi lúc chỉ bật được một trong hai kênh | S | SRC-184, SRC-241, SRC-243, SRC-304 | SDD-021 | QG-007 | ✔ |
| REQ-UX-26 | **School Home có lưới chọn môn kiểu Duolingo** | S | SRC-261 | SDD-011 | QG-007 | ✔ |
| REQ-UX-27 | **Công thức toán hiển thị bằng thư viện dựng công thức**, không phải chuỗi ký tự thô: `3/(x - 2)` viết dạng chữ thì learner đọc ra một phép chia phẳng, không phải một phân thức | M | SRC-244 | DS-001 | QG-007 | ✔ |
| REQ-UX-28 | **Mỗi màn hình đáng quay lại có URL riêng**: từng Phần, Lịch thi học kỳ, Toàn cảnh, và từng Experience. Mở Experience thì URL đổi, thoát ra thì về đúng trang Học — để F5 không mất chỗ đứng và gửi link cho nhau được | M | SRC-281, SRC-285, SRC-286, SRC-287 | SDD-021 | QG-007 | ✔ |
| REQ-UX-29 | **Đang làm bài thì trên màn hình chỉ còn nội dung Experience**: bỏ header, bỏ cột phụ, chạy full-width. Mọi trang khác trong cùng một môn thì dùng chung cột trái | M | SRC-277, SRC-279, SRC-284, SRC-288, SRC-291 | SDD-021 | QG-007 | ✔ |
| REQ-UX-30 | **Tên trang nói đúng thứ bên trong**: "Đường học" → "Học", "Điểm thi học kỳ" → "Lịch thi học kỳ", bỏ tiêu đề lặp lại tên môn và các dòng đếm số lab. Bỏ hẳn tính năng "Tiến độ" vì nó trùng vai với Toàn cảnh | S | SRC-176, SRC-177, SRC-225, SRC-227, SRC-284, SRC-286 | SDD-021 | QG-007 | ✔ |
| REQ-UX-31 | **Dấu hỏi trên thẻ Unit mở đủ ba lớp thông tin**: Unit này là gì · nằm trong Module nào · câu hỏi cốt lõi kiểu IB của nó | S | SRC-290 | SDD-021 §5 | QG-007 | ✔ |
| REQ-UX-32 | **Nhận diện mỗi school có đúng MỘT nguồn**: mascot, tagline, màu, cụm giới thiệu, favicon định nghĩa một lần rồi mọi app dùng chung, lấy learn làm chuẩn. Mascot Marlins là cá hề vì Marlin là bố của Nemo | M | SRC-091, SRC-096 | DS-001 | QG-007 | ✔ |
| REQ-UX-33 | **Hai kênh vẽ theo đúng bản chất đại lượng của chúng**: Mastery là dải liên tục (thanh dày, ngắn bằng một nửa bề ngang cũ), Coverage là vòng có dấu mốc mục tiêu để learner thấy luôn còn cách bao xa | S | SRC-236, SRC-237 | DS-001 | QG-007 | ✔ |
| REQ-UX-34 | **Màn làm bài ẩn header và chân trang toàn cục từ MỘT nguồn sự thật** (đặt trên `body`), nút thoát ở góc trên trái cùng hàng với thanh tiến độ — không để mỗi trang tự ẩn theo cách riêng rồi lệch nhau | M | SRC-258, SRC-279 | SDD-021 | QG-007 | ✔ |
| REQ-UX-35 | **Vỏ điều hướng ba cột dùng chung cho mọi trang trong một môn**: cột trái mang logo school (không phải logo Nemo12) cùng các mục Học · Hồ sơ · Toàn cảnh · Labs; cột giữa là nội dung; "Tất cả các phần" mở ngay trong cột giữa chứ không phủ toàn màn hình | M | SRC-300, SRC-305, SRC-306, SRC-307, SRC-308 | SDD-021 | QG-007 | ✔ |
| REQ-UX-36 | **Hệ luôn biết learner đang đứng ở Phần nào**, nên không cần link "tới phần đang đứng"; khi làm bài thì bỏ tên tiếng Anh cạnh tên Unit, thông tin Package → Module → Unit lùi vào dấu "i" ở góc dưới phải | S | SRC-312, SRC-331, SRC-332 | SDD-021 | QG-007 | ✔ |
| REQ-UX-37 | **Phản hồi khi trả lời đúng phải nhanh và tinh tế**: bong bóng vỡ kèm âm thanh nhỏ, bong bóng nổi từ đáy lên mặt nước; chọn đáp án xong thì nút đổi thành "KIỂM TRA"; bấm dấu nhân giữa bài thì hỏi lại trước khi thoát | S | SRC-357, SRC-366, SRC-367, SRC-368, SRC-369 | DS-001 | QG-007 | ✔ |
| REQ-UX-38 | **Màu và tương phản lấy từ Design System, không chỉnh lẻ từng màn**: ô tô sáng không được che chữ, hình không nằm trên tấm nền trắng trơ, popover không đè lên nhau. Mỗi Unit một nền khác nhau theo lối "càng xuống sâu càng đậm" | M | SRC-349, SRC-350, SRC-353, SRC-355, SRC-360, SRC-378 | DS-001 | QG-007 | ✔ |
| REQ-UX-39 | **Cuối mỗi câu hỏi có lối báo lỗi nội dung**: bấm "Báo cáo" mở danh sách lý do có sẵn, để learner nói được "câu này sai" ngay tại chỗ thay vì bỏ qua | S | SRC-365 | SDD-013 | QG-006 | ✔ |
