---
url: https://docs.nemo12.com/product/prd-001/req/content.md
description: >-
  Bảng REQ của PRD-001 cho nhóm SCH, ORC, KNW, INX, EXAM, PED, CNT, MED, LAB,
  ART: mỗi REQ một dòng với ưu tiên, nguồn, SDD, QG và trạng thái.
---

# PRD-001 · REQ: Trường, nội dung, đề, lab, Coral

Một mảnh của [danh mục REQ PRD-001](../../prd-001-nemo12-platform.md), gồm REQ-SCH, REQ-ORC, REQ-KNW, REQ-INX, REQ-EXAM, REQ-PED, REQ-CNT, REQ-MED, REQ-LAB, REQ-ART. 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-SCH — Schools as Domain Context

| ID | Yêu cầu | Ưu tiên | Nguồn | SDD | QG | Status |
| --- | --- | --- | --- | --- | --- | --- |
| REQ-SCH-01 | School là domain context, không phải app/database riêng (learn.nemo12.com/turtle…) | M | SRC-002 §4.1 | SDD-001 §4 | QG-001 | ✔ |
| REQ-SCH-02 | Canonical skill — school chỉ thêm context (expected difficulty, exam application), không nhân bản skill | M | SRC-010 §5 | SDD-007 §5 | QG-004 | ✔ |
| REQ-SCH-10 | Nội dung/mục tiêu học **scope theo từng school**; mỗi school có **môn riêng**: Turtle/Shark = Toán/Anh/Văn, Squid = IELTS + SAT + AP, Octopus = GenAI (skill graph + item bank riêng cho từng môn) | M | SRC-028, SRC-060, SRC-041 | SDD-011 | QG-007 | ✔ |
| REQ-SCH-03 | Depth target theo goal/school (Turtle L3 vs Shark L4-L5 trên cùng skill) | M | SRC-011 §3-4, FEAT-038 | SDD-002 §12 | QG-005 | ✔ |
| REQ-SCH-04 | Shark: **score simulator** — từ readiness + kết quả luyện đề, ước tính dải điểm cho từng trường mục tiêu kèm khoảng tin cậy. Ba phần còn lại của cụm "exam & school intelligence" cũ đã có REQ riêng, **không lặp lại ở đây**: kho đề → REQ-EXAM-05..10, registry trường → REQ-EXAM-11, lịch thi → REQ-INT-16 (ngày thi là deadline trên goal, nguồn duy nhất) | S | FEAT-034..037, Q-041, Q-120 | — | — | ⏳ |
| REQ-SCH-06 | **Turtle — chẩn đoán mức cơ bản**: chọn câu role `canonical`/`variant`, độ khó thấp–trung; target depth L2–L3; phạm vi neo theo lớp hiện tại lấy từ Context Model (không hỏi lại learner) | M | SRC-016 | SDD-011 §1 | QG-005 | ✔ |
| REQ-SCH-07 | ~~Turtle: ngân hàng đề thi học kỳ~~ — **gộp vào REQ-EXAM-04** (2026-08-15, AS-02.1.5): hai REQ mô tả cùng một hành vi "đề học kỳ generic theo lớp/môn". Nội dung giữ nguyên tại REQ-EXAM-04 | M | SRC-016 | SDD-011 §1,§3 | QG-006 | 🗄️ superseded |
| REQ-SCH-08 | **Shark — chẩn đoán và experience mức cao**: câu role `boundary`/`discriminator`, độ khó cao; target depth L4–L5; blueprint `specialized-chuyen`. Phần ngân hàng đề theo từng trường nằm ở REQ-EXAM-03, không lặp ở đây | M | SRC-016 | SDD-011 §2 | QG-005/006 | ✔ |
| REQ-SCH-09 | Whale = hub cơ hội học tập toàn cầu + Việt Nam (học bổng/cuộc thi/du học/trại hè…) để truyền cảm hứng cho learner & parent; public read | M | SRC-027 | SDD-011 | QG-006 | ✔ |
| REQ-SCH-05 | Octopus: 4F Reflection + product submission (proof-of-work) + curriculum 5 Academies | S | FEAT-045..048, Q-039, Q-121 | — | — | ⏳ |
| REQ-SCH-11 | **Squid**: học + luyện tập + luyện thi **IELTS, SAT và AP** (SRC-081 gộp Ray vào Squid) — target band + ngày thi (exam target `kind='ielts'`); 4 kỹ năng L/R/W/S; Writing/Speaking chấm rubric AI; practice test **generated** theo format (không nhập đề thật Cambridge — bản quyền) | M | SRC-033 | SDD-011 §7 | QG-006/010 | ✔ |
| REQ-SCH-12 | ~~**Ray**: SAT/AP thành school riêng~~ — **gộp vào REQ-SCH-11 (SRC-081, 2026-08-14)**: bỏ school Ray, SAT và AP nằm trong Squid; nội dung yêu cầu (target score/môn AP + đợt thi, SAT Math từ math graph, R\&W từ english graph, practice generated, không đề thật College Board) giữ nguyên tại REQ-SCH-11 | M | SRC-033, SRC-081 | SDD-011 §7-8 | QG-006 | 🗄️ superseded |
| REQ-SCH-14 | **Destination preferences**: Nemo và Marlin khai quốc gia/ngành du học yêu thích **riêng** (không merge) → Whale cá nhân hóa: thông tin quốc gia (giáo dục/học bổng/chi phí), học bổng & trường theo destination | M | SRC-043 | SDD-011 §9 | QG-006/008 | ✔ |
| REQ-SCH-13 | **Whale**: hub 4 khu vực, mỗi khu vực có trang riêng có URL riêng — `/whale/countries`, `/whale/scholarships`, `/whale/stories`, `/whale/opportunities`. Nemo thấy 3–5 **recommendation** mỗi cái kèm một câu lý do (rule-based theo lớp/school/điểm mạnh); **success case lọc đúng quốc gia đang xem** (không fallback theo châu lục); trang quốc gia đặt **học bổng ở khối đầu tiên**, rồi trường, kèm **bảng xếp hạng đại học** — mỗi học bổng/trường mở ra trang chi tiết riêng; Marlin xem cùng nội dung ở `marlins #/explore/whale` | M | SRC-034, SRC-075, SRC-084, SRC-074 | SDD-011 §9 | QG-006/008 | ✔ |
| REQ-SCH-15 | **Quản lý registry trường chuyên/lớp chọn trong Dolphin**: thêm trường mới, sửa mọi thông tin (tên, tên ngắn, slug, tỉnh, loại `chuyen/chon/thuong`, cơ quan chủ quản, website, năm thành lập, giới thiệu, ảnh) và quản lý **các lớp chuyên** của trường. Thi hành trên `target_schools` + `specialized_programs` đã thiết kế tại SDD-014 §2 — **không tạo bảng trường thứ hai**, vì `exams.target_school_id` đã trỏ vào bảng cũ | M | SRC-203, SRC-035 | [SDD-020](../../../architecture/sdd-020-school-registry.md) §2-3 | QG-004/008 | ✔ |
| REQ-SCH-16 | **Cựu học sinh tiêu biểu của từng trường**: thêm/sửa người được nêu tên công khai (tên, lớp chuyên, khoá/năm tốt nghiệp, thành tích, nơi học/làm hiện tại, ảnh), nối được với hồ sơ mentor (REQ-MEN-07) khi cùng một người. **Chỉ người được nêu tên công khai**, không phải danh sách học sinh đang theo học (Q-136); mỗi người có cờ `consent` — chưa có đồng ý thì không publish được | M | SRC-203 | [SDD-020](../../../architecture/sdd-020-school-registry.md) §4 | QG-004/008 | ✔ |
| REQ-SCH-17 | **Thành tích & số liệu theo năm học**: mỗi trường có các mốc thành tích gắn năm học (`2024-2025`) theo nhóm (HSG quốc gia/tỉnh · olympic quốc tế · đại học · khác) và các số liệu tuyển sinh so sánh được (chỉ tiêu, số dự thi, tỉ lệ chọi, điểm chuẩn theo lớp chuyên) — **mỗi con số bắt buộc có năm học và nguồn**; số thiếu để **trống**, cấm điền 0 | M | SRC-203 | [SDD-020](../../../architecture/sdd-020-school-registry.md) §5 | QG-004/006 | ✔ |
| REQ-SCH-18 | **Trang danh sách School tách nơi HỌC khỏi nơi TRA CỨU**: Whale và Orca thành cụm riêng vì chúng không phải nơi học; bấm từng school mới vào trang chi tiết | S | SRC-073 | SDD-011 | QG-007 | ✔ |
| REQ-SCH-19 | **Blueprint khám phá khác nhau theo môn và theo cấp học** (`levels`: cap1/cap2/cap3), không dùng chung một bộ cho mọi môn | S | SRC-095, SRC-093 | SDD-003 | QG-006 | ✔ |
| REQ-SCH-20 | **Trang chủ mỗi School có phần giới thiệu ba mục**: dành cho ai · học ở đây thế nào · ra khỏi đây thì con có gì. Không có ba mục này thì phụ huynh không chọn được school nào hợp với con | S | SRC-054 | SDD-011 | QG-007 | ✔ |
| REQ-SCH-21 | **Môn chưa ra mắt vẫn hiện nhưng khoá theo ngày mở**: mọi tài khoản trừ tài khoản vận hành chỉ vào được môn đã mở; môn khác hiện kèm ngày sẵn sàng. Giấu hẳn thì learner không biết sắp có gì, mở toang thì vào một môn rỗng | S | SRC-309 | SDD-011 | QG-007 | ✔ |

### REQ-ORC — Orca: Competition & Challenge Hub (SRC-044)

Cửa sổ cạnh tranh bên ngoài: đúng sân chơi, đúng thời điểm. North Star: meaningful participations/learner.

| ID | Yêu cầu | Ưu tiên | Nguồn | SDD | QG | Status |
| --- | --- | --- | --- | --- | --- | --- |
| REQ-ORC-01 | **Competition directory + editions**: registry cuộc thi (organizer, domain, grade, geography, level, format, fee, prestige…) + edition theo năm (deadline/ngày thi/kết quả); phân loại domain × level × **intensity 1–5**; cờ verified | M | SRC-044, SRC-124 | SDD-016 §1 | QG-006 | ✔ |
| REQ-ORC-02 | **Orca Home + Explore**: Recommended · Upcoming · Closing Soon · Popular in Grade + search/filter | M | SRC-044 | SDD-016 §2 | QG-007 | ✔ |
| REQ-ORC-03 | **Detail page**: what/who/why, difficulty, timeline, requirements + **Nemo12 Assessment** | M | SRC-044 | SDD-016 §2 | QG-007 | ✔ |
| REQ-ORC-04 | **Fit Score 0–100 có explanation** (eligibility/skill/interest/difficulty/schedule/strategic) + parent verdict 4 mức kèm reasoning; không recommend chỉ theo tuổi | M | SRC-044 | SDD-016 §3 | QG-005 | ✔ |
| REQ-ORC-05 | **Journey states** Save→…→Awarded/Skip (learner-owned) theo lifecycle Discover→Reflection | M | SRC-044 | SDD-016 §4 | QG-005 | ✔ |
| REQ-ORC-06 | **Results & achievements** (score/ranking/medal/award/reflection, upload sau) → Evidence Registry | M | SRC-044 | SDD-016 §4 | QG-005 | ✔ |
| REQ-ORC-07 | **Calendar + Context**: deadline/ngày thi/kết quả vào calendar + Context Event Registry | M | SRC-044 | SDD-016 §5 | QG-005 | ✔ |
| REQ-ORC-08 | **Admin qua Coral**: verify/source/merge/archive/reputation; Orca = user experience, Coral = data ops | M | SRC-044 | SDD-016 §6 | QG-006/008 | ✔ |
| REQ-ORC-09 | **Orca có trang chủ riêng giới thiệu Orca là gì** trước khi vào phần tra cứu; logo không để dạng khối vuông đen | S | SRC-053 | SDD-016 | QG-007 | ✔ |

### REQ-KNW — Knowledge, Content & Quality (SRC-004, 005)

| ID | Yêu cầu | Ưu tiên | Nguồn | SDD | QG | Status |
| --- | --- | --- | --- | --- | --- | --- |
| REQ-KNW-01 | Knowledge Registry: Domain→Area→Knowledge Node/Skill, đầy đủ metadata + lifecycle | M | SRC-004 §2 | SDD-003 §2 | QG-006 | ✔ |
| REQ-KNW-02 | Shared Knowledge/Skill Graph (prerequisite + 7 quan hệ), dùng chung mọi school | M | SRC-004 §3 | SDD-003 §3 | QG-006 | ✔ |
| REQ-KNW-03 | Learning Package đóng gói mục tiêu dạy được (nhiều package/skill theo age, level, exam) | M | SRC-004 §4, SRC-127 | SDD-003 §4 | QG-006 | ✔ |
| REQ-KNW-04 | Learning Experience Registry: abstract entity + experience_type (Micro/Practice/Assessment/Lab/Project/Simulation) | M | SRC-005 §5-8 | SDD-004 §5-8 | QG-006 | ✔ |
| REQ-KNW-05 | Item Bank riêng, không duplicate question giữa practice/assessment/micro | M | SRC-005 §9 | SDD-004 §9 | QG-006 | ✔ |
| REQ-KNW-06 | Storage 3 lớp: D1 metadata, R2 heavy content, KV/cache manifests; "load structure first, content on demand" | M | SRC-005 §4, §10 | SDD-004 §4, §10 | QG-004 | ✔ |
| REQ-KNW-07 | Quality Profile + rubric per entity; scores có reason/evidence/evaluator/rubric_version | M | SRC-004 §6 | SDD-003 §6 | QG-006 | ✔ |
| REQ-KNW-08 | Quality Engine 3 lớp: deterministic checks, graph/rule reasoning, LLM evaluation theo rubric | M | SRC-004 §7, SRC-406 | SDD-003 §7 | QG-006 | ✔ |
| REQ-KNW-09 | Multi-evaluator + variance flag + human review cho high-stakes | M | SRC-004 §8 | SDD-003 §8 | QG-006 | ✔ |
| REQ-KNW-10 | Improvement Engine + candidate version lifecycle (không sửa production trực tiếp); Priority Engine | M | SRC-004 §10-12 | SDD-003 §10-12 | QG-006 | ✔ |
| REQ-KNW-11 | Quality Registry + dashboard (coverage, node thiếu assessment, content quá hạn review) | M | SRC-004 §9 | SDD-003 §9 | QG-006 | ✔ |
| REQ-KNW-12 | Versioning immutable per asset; learner session ghi experience_version | M | SRC-005 §11 | SDD-004 §11 | QG-004 | ✔ |
| REQ-KNW-13 | Quality cuối cùng đối chiếu learner evidence thật (không chỉ LLM score) | M | SRC-004 §11 | SDD-003 §11 | QG-006 | ✔ |
| REQ-KNW-20 | **Mỗi Module ≥ 3 Unit**: bản đồ môn (Package → Module → Unit) không được có module một-hai unit — module lẻ loi khiến learner tưởng đã học xong cả mảng khi mới xong một bài, và làm lưới module trên Toàn cảnh trông như dữ liệu hỏng. Unit bổ sung phải đúng phạm vi module + nối tiếp sư phạm, kèm node và đủ 10 câu (REQ-KNW-17) | M | SRC-205, SRC-094, SRC-381, SRC-383, SRC-397, SRC-398, SRC-401, SRC-402, SRC-403, SRC-409, SRC-414, SRC-432, SRC-437, SRC-438, SRC-443 | SDD-004 §2 | QG-006 | 🔵 |
| REQ-KNW-14 | **Ba môn khoa học tự nhiên (Lý · Hoá · Sinh) có cây riêng theo GDPT 2018**, gồm mạch, module, unit và quan hệ tiên quyết, không mượn cây của môn khác | M | SRC-089 | SDD-004 | QG-006 | ✔ |
| REQ-KNW-16 | **Cây curriculum của một môn chỉ có MỘT cách sắp xếp đang hiện.** Cây cũ trùng vai với cây mới thì tạm ẩn chứ không xoá (mọi bằng chứng đã ghi đều trỏ vào node của nó); bật lại chỉ cần bỏ mã khỏi danh sách ẩn | M | SRC-299, SRC-408 | SDD-004 | QG-006 | ✔ |
| REQ-KNW-17 | **Mỗi Package có 6-9 Module, mỗi Module xử lý một vấn đề riêng.** Đo trước khi sửa: 42/42 package chỉ có đúng 1 module, tức "module" khi đó chỉ là một cái tên gộp, không phân loại được gì | M | SRC-181, SRC-192, SRC-194, SRC-196 | SDD-004 | QG-006 | 🔵 |
| REQ-KNW-15 | **Thứ tự hiển thị Package/Module/Unit luôn bắt đầu bằng phần nền tảng.** Bảng `strands` từng không có cột thứ tự nào, nên API trả về theo thứ tự SQLite quét bảng, tức thứ tự GHI VÀO — một thứ tự tình cờ | M | SRC-191 | SDD-004 | QG-006 | ✔ |
| REQ-KNW-18 | **Sàn số lượng nội dung, kiểm được bằng máy**: mỗi Package ≥5 Module · mỗi Module ≥5 Unit · mỗi Unit ≥6 Experience (≥3 Learning + ≥3 Assessment) và ≥10 câu hỏi. Dưới sàn thì bài đo bị khoá, tức learner mở ra là gặp ngõ cụt | M | SRC-047, SRC-295, SRC-319, SRC-347 | SDD-010 §9 | QG-006 | 🔵 |
| REQ-KNW-19 | **Số bài nêu ở tiêu đề phải khớp số bài đếm được bên dưới.** Danh sách từng ghi 9-10 bài trong khi tiêu đề Phần ghi 4 bài; hai con số nói khác nhau thì learner tin con số nào cũng sai | S | SRC-313 | SDD-021 | QG-006 | ✔ |

### REQ-INX — Interaction & Conversation (SRC-007)

| ID | Yêu cầu | Ưu tiên | Nguồn | SDD | QG | Status |
| --- | --- | --- | --- | --- | --- | --- |
| REQ-INX-01 | Comment/Reply/Reaction/Mention/Annotation trên mọi object qua target_type+target_id | M | SRC-007 | SDD-005 §2-3 | QG-008 | ✔ |
| REQ-INX-02 | Threading (UI giới hạn 1–2 cấp) | M | SRC-007 | SDD-005 §3 | QG-007 | ✔ |
| REQ-INX-03 | Visibility levels: private / learner_parent / mentor_team / school / community / internal_staff — authorize ở backend | M | SRC-007 | SDD-005 §4 | QG-008 | ✔ |
| REQ-INX-04 | Mentions → events → Queue → Notification (in-app, email, push-ready) | M | SRC-007 | SDD-005 §5 | QG-009 | ✔ |
| REQ-INX-05 | Moderation K12: profanity/abuse/spam detection, report/hide/block, moderation queue, audit log, AI classify + human review | M | SRC-007 | SDD-005 §6 | QG-008 | ✔ |
| REQ-INX-06 | Activity Stream → Learner Activity Timeline (feed cho Learner/Parent Model) | M | SRC-007 | SDD-005 §7 | QG-005 | ✔ |
| REQ-INX-07 | Vote (up/down) trên **submission** (sản phẩm proof-of-work của Octopus). Vote trong forum đã chạy ở REQ-COM-03; "mentor feature bài xuất sắc" ở REQ-MEN-05 — ba thứ không lặp nhau | S | FEAT-020, Q-047 | — | — | ⏳ |

### REQ-EXAM — Exam Banks (SRC-016, SRC-029)

| ID | Yêu cầu | Ưu tiên | Nguồn | SDD | QG | Status |
| --- | --- | --- | --- | --- | --- | --- |
| REQ-EXAM-01 | Exam bank entity (exams/sections/questions) tách khỏi Item Bank thường, liên kết node graph; loại semester|selective | M | SRC-016 | SDD-011 §3 | QG-006 | ✔ |
| REQ-EXAM-02 | Learner luyện mock exam theo timing → evidence per node → cập nhật mastery + readiness kỳ thi (chỉ đề generated — đề thật không mock exam, Q-061) | M | SRC-016 | SDD-011 §4 | QG-005 | ✔ |
| REQ-EXAM-03 | Shark: đề thi theo từng trường mục tiêu (target_schools, per-school); kế thừa exam-intelligence + registry trường | M | SRC-016, FEAT-034/035 | SDD-011 §2-3 | QG-006 | ✔ |
| REQ-EXAM-04 | Turtle: đề thi học kỳ cơ bản/phổ thông (generic theo lớp/môn), luyện trước ngày thi | M | SRC-016 | SDD-011 §1,§3 | QG-006 | ✔ |
| REQ-EXAM-05 | **Đề thi thật**: registry đề đã diễn ra (`source='authentic'`) — trường/hệ thi, vòng điều kiện|chuyên, môn, năm học, provenance + asset gốc; immutable sau publish | M | SRC-029, FEAT-034 | SDD-012 §2 | QG-011 | ⏳ |
| REQ-EXAM-06 | Mỗi đề thật **tách thành từng bài** (`exam_problems`): statement riêng, **lời giải gợi ý** riêng (human review bắt buộc), metadata phân loại (dạng bài, độ khó, điểm, node links) | M | SRC-029, FEAT-034 | SDD-012 §3 | QG-011 | ⏳ |
| REQ-EXAM-07 | Mỗi bài link một **Assessment Experience** thuộc Assessment Blueprint (SDD-004) đo đủ 3 lớp **answer + confidence + justification** → evidence per node | M | SRC-029, SRC-056 | SDD-012 §4 | QG-005/010 | ⏳ |
| REQ-EXAM-08 | Learner **lọc** bài theo môn/dạng bài/trường/năm/vòng/độ khó/số lần làm và **đánh dấu trạng thái cá nhân** (chưa làm, bế tắc, chưa tự tin…) rồi lọc lại theo dấu; 2 lối vào: theo đề & theo bài | M | SRC-029 | SDD-012 §5, §8 | QG-011 | ⏳ |
| REQ-EXAM-12 | **Acquisition targets & coverage**: khai mục tiêu thu thập (trường nào, năm nào→nào, chuyên nào); coverage matrix trường × năm × vòng × môn (có đề? có đáp án? đã tách bài?); khu vực riêng trong Coral | M | SRC-035 | SDD-014 §3 | QG-011 | ✔ |
| REQ-EXAM-13 | **Crawl pipeline AI-first**: Workflows + Queues crawl nguồn công khai (tôn trọng robots/ToS) → OCR/extract → tách bài → metadata/node links → lời giải AI → AI multi-evaluator → publish; provenance đầy đủ; gom về một chỗ | M | SRC-035 | SDD-014 §4-5 | QG-010/011 | ✔ |
| REQ-EXAM-14 | **Source registry + scoring**: lưu & xem lại mọi nguồn đề (`exam_sources`); sau mỗi crawl run, workflow chấm nguồn theo rubric 6 chiều (đúng-đủ đề · có đáp án chính thức · tỷ lệ ký tự phải sửa tay sau OCR · độ tươi · độ ổn định link · phạm vi phủ trường/năm) → `score` 0–1; resolver xếp nguồn theo **`score` giảm dần** khi tìm đề mới, nguồn vi phạm robots/bản quyền chuyển `blocked` | M | SRC-039, FEAT-034 | SDD-014 §6 | QG-011 | ✔ |
| REQ-EXAM-09 | **Luyện đề chia bốn cụm theo mốc trong năm học**: giữa kỳ 1 (A) · cuối kỳ 1 (B) · giữa kỳ 2 (C) · cuối kỳ 2 (D). Một đề "học kỳ" duy nhất cho cả năm thì làm một lần là hết, và trộn cả năm vào một chỗ nên không ôn được cho một kỳ cụ thể | M | SRC-183 | SDD-012 | QG-011 | ✔ |
| REQ-EXAM-10 | **Trang Luyện đề: learner chọn một trong bốn cụm, hệ chọn sẵn cụm hợp thời điểm trong năm học.** Mỗi đề một dòng, có tín hiệu đã làm bao nhiêu lần; vào đề thì được XEM trước rồi mới bấm bắt đầu, không rơi thẳng vào bài | S | SRC-226, SRC-231, SRC-232, SRC-234 | SDD-012 | QG-007 | ✔ |
| REQ-EXAM-11 | **Mốc học kỳ mặc định theo năm học Việt Nam**: học kỳ 1 từ 1/9, học kỳ 2 từ khoảng 15/1. Từ hai mốc này suy ra thời gian mặc định của các kỳ thi, để phụ huynh không phải khai tay từng ngày | S | SRC-230 | SDD-012 | QG-005 | ✔ |
| REQ-EXAM-15 | **Lịch thi học kỳ kẻ thành bảng**, cột cuối là mục tiêu điểm, cạnh mỗi ngày có số tuần hoặc số ngày còn lại; bỏ thẻ "Chưa có mục tiêu nào" | S | SRC-334, SRC-338 | SDD-012 | QG-007 | ✔ |

### REQ-PED — Pedagogy per school (SRC-016)

| ID | Yêu cầu | Ưu tiên | Nguồn | SDD | QG | Status |
| --- | --- | --- | --- | --- | --- | --- |
| REQ-PED-01 | Turtle: Learning Experience theo IB inquiry (Predict→Explore→Explain→Practice→Transfer→Assess) + labs; diagnosis mức cơ bản | M | SRC-016 | SDD-011 §1, SDD-010 | QG-006 | ✔ |
| REQ-PED-02 | Shark: pedagogy AoPS/Beast Academy — mỗi unit có ≥1 bài **nhiều bước** dùng để phân loại (role `discriminator`), sau khi trả lời hiện phần "vì sao lời giải đi hướng này"; ánh xạ experience type `Problem`/`Challenge`; chẩn đoán theo REQ-SCH-08 | M | SRC-016 | SDD-011 §2 | QG-006 | ✔ |
| REQ-PED-03 | **Mỗi môn đóng khung đúng MỘT ý quan trọng nhất**, xuyên suốt cả môn, tách bạch về mặt thị giác với nhóm ý bổ sung — để learner không phải tự đoán ý nào là ý lớn | S | SRC-142 | SDD-004 | QG-006 | ✔ |
| REQ-PED-04 | **Popover "vì sao đáng học" nói bằng lời của learner**: cái đau nếu không học · làm được gì ngay tí nữa · làm được gì mai ngày kia · một ví dụ trẻ hiểu được. Viết tay, không sinh máy — đây là lời nói VỚI learner, sinh máy thì đứa trẻ nào đọc cũng biết là máy nói | M | SRC-345 | SDD-021 §5 | QG-006 | ✔ |
| REQ-PED-05 | **Popover mở đầu bằng câu "I will be able to…" của đúng Unit đó**, lấy thẳng từ Pearl; con số đo đạc lùi xuống dưới. Thứ learner cần biết khi bấm vào là học xong thì làm được gì, không phải đã đo được bao nhiêu | M | SRC-352, SRC-413, SRC-370 | SDD-021 §5 | QG-006 | ✔ |
| REQ-PED-06 | **Năm dạng câu hỏi ngoài trắc nghiệm 4 đáp án**: nhập đáp số · ước lượng trong khoảng · sắp lại các bước lời giải · tìm chỗ sai trong bài giải mẫu · thao tác trên hình. Mỗi dạng là một Assessment/LX Blueprint trong registry `content_blueprints`; item khai `answer_kind`, máy chấm được ở server, không chờ người chấm | M | SRC-531 | SDD-022 §2-4 | QG-005 | ✔ |
| REQ-PED-07 | **Bằng chứng từ dạng learner tự sản xuất (nhập đáp số, ước lượng, sắp bước) mang reliability cao hơn MCQ** — không có sàn đoán mò 25% thì một câu đúng đáng tin hơn; dạng vẫn chọn-trong-tập (tìm chỗ sai) giữ mức MCQ | M | SRC-531 | SDD-022 §5 | QG-005 | ✔ |
| REQ-PED-08 | **Trang nhiều nội dung không cho xem lướt**: nội dung chia mẩu, mỗi mẩu đổi lấy một động tác (True/False · chọn 1 trong 3 từ · quiz cực ngắn · điền từ) thì mẩu sau mới hiện; sai thì chỉ lại chỗ trong bài rồi cho trả lời lại, không chặn cứng; mỗi trang đọc xong ghi một dòng `learning_events` action `read` (phút thật, số cổng, số cổng đúng ngay lần đầu). Người chưa đăng nhập và máy tìm kiếm vẫn đọc trọn trang | M | SRC-836 | SDD-039 | QG-005 | ✔ |

### REQ-CNT — Content Plane **Coral** (coral.nemo12.com) — SRC-023, SRC-031

Content plane mang tên **Coral** (SRC-031, 2026-08-14), deploy tại coral.nemo12.com — **thay thế data.nemo12.com** (ngừng sử dụng, Q-091). Bảo vệ: Cloudflare Access chỉ `dac2205@gmail.com` (Q-092) + API session `staff`/`admin`.

| ID | Yêu cầu | Ưu tiên | Nguồn | SDD | QG | Status |
| --- | --- | --- | --- | --- | --- | --- |
| REQ-CNT-01 | Browse Knowledge Registry (subject → area → node) + Item Bank + Exams trong Coral. Vào Coral phải **chọn School rồi Subject ở trang chủ**; mọi tab sau đó bám đúng cặp đó và không hỏi lại, muốn đổi thì quay về trang chủ Coral (chip "school · môn ✕" ở header) | M | SRC-023, SRC-058 | SDD-003 §2, SDD-004 §9, SDD-013 §2 | QG-006 | ✔ |
| REQ-CNT-02 | Coverage/Quality dashboard: node thiếu item/assessment/lab (gaps), thống kê theo môn/area | M | SRC-023, CC-MORI-03 | SDD-003 §9, SDD-013 §4 | QG-006 | ✔ |
| REQ-CNT-03 | Xem chi tiết item (prompt/options/đáp án/misconception) và learning experiences gắn node | S | SRC-023 | SDD-004 §5-9, SDD-013 §2 | QG-006 | ✔ |
| REQ-CNT-04 | **Coral portal** tại coral.nemo12.com thay data.nemo12.com; Cloudflare Access chỉ dac2205@gmail.com (policy hạ tầng, không hardcode code) + session RBAC staff/admin | M | SRC-031 | SDD-013 §1,§7 | QG-008 | ✔ |
| REQ-CNT-05 | Quản lý registry artifact: **Knowledge Package, Learning Experience, Assessment Experience, LX Blueprint, Assessment Blueprint** — CRUD, lifecycle Draft→Review→Published, versioning + provenance | M | SRC-031, SRC-055, SRC-064 | SDD-013 §2-3 | QG-006 | ✔ |
| REQ-CNT-06 | Quản lý **ngân hàng đề thi** trong Coral: đề generated + đề thật (UI WF-13: nhập, tách bài, biên tập lời giải, publish với checklist QG-011) | M | SRC-031 | SDD-013 §5, SDD-012 §7 | QG-011 | ✔ |
| REQ-CNT-07 | **Dashboard tổng quan**: số lượng + chất lượng theo loại artifact/môn/area; tiến độ tạo mới & nâng cấp theo thời gian; trạng thái runs/queues/review backlog | M | SRC-031 | SDD-013 §4 | QG-006 | ✔ |
| REQ-CNT-08 | Quản lý **Quality Gates & Rubrics**: rubric registry duy nhất (gốc CC-QAF-1.0), mapping rubric↔artifact type, quality profile + findings, human review queue | M | SRC-031, CC-MORI-03 | SDD-013 §6 | QG-006 | ✔ |
| REQ-CNT-09 | **Blueprint → generation runs**: tạo/sửa blueprint, chạy generation qua AI Gateway, theo dõi status, review candidate → approve | M | SRC-031, CC-MORI-02 | SDD-013 §3 | QG-006/010 | ✔ |
| REQ-CNT-10 | Pipeline content chạy bằng **Cloudflare Workflows + Queues** (content-quality, exam-ingest, content-generation; queue nemo12-content + DLQ) — cấm cron-poll (RISK-018); trạng thái run quan sát được trong Coral | M | SRC-031 | SDD-013 §8 | QG-009 | ✔ |
| REQ-CNT-12 | Coral **xem từng đề**: danh sách mọi đề → chi tiết từng câu kèm đáp án, node song ngữ; **metadata đầy đủ** (link gốc, trường, ngày thi thật, năm học, hệ thi, vòng, verified…); **filter lớp/môn/dạng đề** (giữa|cuối HK1-2, thi vào trường, điều kiện, chuyên) | M | SRC-042, SRC-045 | SDD-013 §5 | QG-006 | ✔ |
| REQ-CNT-13 | Coral **song ngữ vi/en**: toggle UI + taxonomy hiển thị song ngữ | M | SRC-042 | SDD-013 §1 | QG-007 | ✔ |
| REQ-CNT-11 | Source provenance + content intelligence: mọi artifact lưu {nguồn, blueprint, model, prompt_version}; audit view | S | SRC-031, CC-MORI-04 | SDD-013 §3 | QG-010 | ✔ |
| REQ-CNT-14 | **Không Unit nào là ngõ cụt**: mọi Unit đang hiện cho learner phải có câu hỏi để luyện, mỗi câu kèm `misconception` mô tả hiểu lầm dẫn tới đáp án sai. Unit trống làm learner bấm vào và gặp màn báo lỗi | M | SRC-144, SRC-412, SRC-322, SRC-346, SRC-371, SRC-411 | SDD-010 §12 | QG-006 | ✔ |
| REQ-CNT-15 | **Curriculum từng môn có khu riêng, và có trang so sánh ba hệ** (Building 21 · Việt Nam · IB) đặt cạnh nhau theo cùng một cấp | S | SRC-238, SRC-245 | SDD-004 | QG-006 | ✔ |
| REQ-CNT-16 | **Data Quality trong Coral**: hàng đợi rà soát unit/lesson theo môn **xếp ưu tiên kèm lý do**; người rà **học thử không ghi model**; đánh dấu 1-2 cú bấm (Đạt/Sửa nhỏ/Sửa lớn/Ẩn + tag chip) ghi append-only, nhiều lần/nhiều người; **blocker ẩn experience khỏi learner** tới khi rà lại Đạt; verdict xấu + tags = đầu vào vòng sinh lại | M | SRC-446 | SDD-013 §9 | QG-006/008 | ✔ |

### REQ-MED — Media & Image Management (yêu cầu bổ sung 2026-08-13)

| ID | Yêu cầu | Ưu tiên | Nguồn | SDD | QG | Status |
| --- | --- | --- | --- | --- | --- | --- |
| REQ-MED-01 | Media Registry dùng chung toàn platform: metadata D1, bytes R2, gắn mọi object qua target_type+target_id | M | User 2026-08-13, SRC-014 | SDD-009 §2 | QG-004 | ✔ |
| REQ-MED-02 | Upload flow direct-to-storage (presigned), validate type/size/quota; cấm base64 lưu vĩnh viễn trong D1 | M | RISK-028 | SDD-009 §3 | QG-004 | ✔ |
| REQ-MED-03 | Delivery qua CDN + Cloudflare Images variants (thumb/card/full), signed URL theo visibility + authz backend | M | SRC-014 | SDD-009 §4 | QG-008 | ✔ |
| REQ-MED-04 | Moderation K12 bắt buộc: AI classify + moderation queue + audit; EXIF strip; chưa approve không serve public | M | SRC-007, SRC-014 | SDD-009 §5 | QG-008 | ✔ |
| REQ-MED-05 | Media versioning + retention + xóa theo child-privacy | M | REQ-SEC-04 | SDD-009 §6 | QG-008 | ✔ |
| REQ-MED-07 | **Lát cắt đầu tiên được thi hành của Media System** (SRC-201): bảng `media` + bytes trong R2 `nemo12-content` + `GET /v1/media/{id}` phục vụ ảnh **công khai, bất biến, cache vĩnh viễn**; tải lên chỉ dành cho vai nội bộ, chặn theo mime + dung lượng, khử tên tệp. Cố ý **chưa làm**: variants Cloudflare Images, signed URL, moderation queue, versioning (Q-132) — ảnh ở đây do người nội bộ sau Cloudflare Access đưa lên, không phải ảnh learner tải lên | M | SRC-201 | SDD-009 §2-4, [SDD-019](../../../architecture/sdd-019-mentor-albums.md) §2 | QG-004/008 | ✔ |
| REQ-MED-06 | AI illustration pipeline ghi cùng registry với provenance | C | FEAT-041, Q-051 | SDD-009 §7 | QG-010 | ⏳ |
| REQ-MED-08 | **Kho ảnh chung có tag năm cụm** (SRC-1215): ảnh mentor, ảnh album, ảnh chứng chỉ và ảnh báo chí nằm chung bảng `media`; năm cụm tag đóng `shape` (máy đo) · `tone` (máy đoán, người sửa) · `context` · `people` · `quality`; album dùng cùng cơ chế vì tag và người trong ảnh nằm ở mức ảnh | M | SRC-1215 | [SDD-053](../../../architecture/sdd-053-photo-library-placements.md) §3-4 | QG-004/008 | ⏳ thiết kế đã chốt, chưa dựng |
| REQ-MED-09 | **Phân phối ảnh theo chỗ hiển thị** (SRC-1215): mỗi chỗ hiển thị trên nemo12.com khai trong code kèm ràng buộc (hình dạng, bối cảnh, mức chuẩn, độ rộng tối thiểu, số ảnh); khu Phân phối trong dolphin chỉ gợi ý ảnh hợp; phân phối cố định và có thứ tự | M | SRC-1215 | [SDD-053](../../../architecture/sdd-053-photo-library-placements.md) §5, §7 | QG-004/008 | ⏳ thiết kế đã chốt, chưa dựng |
| REQ-MED-10 | **Cổng đồng ý cho ảnh có học viên** (SRC-1215): ảnh có học viên chỉ lên trang công khai khi có đồng ý của phụ huynh ghi ở từng ảnh, chỉ staff/admin đánh dấu; API công khai lọc lại lúc trả về để đồng ý bị rút là ảnh biến mất ngay | M | SRC-1215 | [SDD-053](../../../architecture/sdd-053-photo-library-placements.md) §6 | QG-004/008 | ⏳ thiết kế đã chốt, chưa dựng |
| REQ-MED-11 | **Skill audit ảnh** (SRC-1215): tự điền phần máy đo được (kích thước, hình dạng, nền, alt text còn là tên tệp), gợi ý phần cần phán đoán, không bao giờ tự đánh dấu đồng ý hay kiểm chứng | S | SRC-1215 | [SDD-053](../../../architecture/sdd-053-photo-library-placements.md) §8 | QG-004 | ✔ |

### REQ-LAB — Interactive Labs (bổ sung 2026-08-13, sau audit SRC-015)

| ID | Yêu cầu | Ưu tiên | Nguồn | SDD | QG | Status |
| --- | --- | --- | --- | --- | --- | --- |
| REQ-LAB-01 | Lab Platform theo 6 archetypes: 4 engines data-driven (picker/parametric/stepper + inquiry) + sim components + scene3d cô lập | M | SRC-015 | SDD-010 §2 | QG-007 | ✔ |
| REQ-LAB-02 | Lab là LearningExperience: metadata D1 + content JSON R2 + version immutable; bỏ mô hình MPA 9-touchpoint | M | SRC-015 | SDD-010 §3 | QG-004 | ✔ |
| REQ-LAB-03 | Migrate content corpus 288 labs (620 prompts, 1.807 options, 288 inquiry triples) bằng reverse-parser; 186 picker labs = 100% tự động | M | SRC-015 | SDD-010 §4 | QG-006 | ✔ |
| REQ-LAB-04 | Evidence contract đầy đủ: lab_open/inquiry_open/inquiry_answer/lab_complete — bespoke labs phải có correctness signal | M | SRC-015 | SDD-010 §5 | QG-005 | ✔ |
| REQ-LAB-05 | Một LabShell trong Design System, sửa a11y một lần cho cả 288 (dialog, focus trap, aria-live, reduced-motion) | M | SRC-015 | SDD-010 §6 | QG-007 | ✔ |
| REQ-LAB-06 | Công nghệ dài hạn: React 19 + SVG procedural (zero-asset), config schema versioned (zod), engine/content version độc lập | M | User 2026-08-13 | SDD-010 §7 | QG-005 | ✔ |
| REQ-LAB-07 | Labs qua Quality Engine + coverage map theo taxonomy kế thừa; mode suy từ implementation (legacy sai nhãn 24%) | M | SRC-015 | SDD-010 §8 | QG-006 | ✔ |
| REQ-LAB-08 | **Mỗi Unit đi kèm TỐI ĐA MỘT lab**: lab gắn vào Unit (`labs.unit`), ràng buộc bằng unique index từng phần trên (subject_id, unit) khi status='live'; lab dôi ra chuyển 'draft' chứ không xoá. Lab của Unit hiện ngay trong thẻ Unit ở Toàn cảnh, bấm là mở thẳng | M | SRC-208 | SDD-010 §3 | QG-004 | ✔ |
| REQ-LAB-09 | **Lab yêu thích**: learner đánh dấu lab trong Thư viện Lab (bảng `lab_favorites` theo learner) và lọc lại danh sách theo dấu đó; bộ lọc chỉ xuất hiện khi đã có ít nhất một lab được thích, và tự tắt khi lab cuối cùng bị bỏ thích | S | SRC-212 | SDD-010 §3c | QG-007 | ✔ |
| REQ-LAB-10 | **Mỗi Unit có lối vào Lab ngay trên thẻ Unit**; lab khớp theo node HOẶC theo tên unit, vì phần lớn lab gắn theo unit chứ không theo một node cụ thể | S | SRC-373 | SDD-010 | QG-006 | ✔ |
| REQ-LAB-11 | **Phòng Lab lọc theo lớp và nói rõ "có cần học không"**, thay cho nhãn đếm số thuần tuý | S | SRC-062 | SDD-010 | QG-007 | ✔ |
| REQ-LAB-12 | **Mỗi lab có URL riêng**, mở được thẳng và chia sẻ được | S | SRC-170 | SDD-010 | QG-007 | ✔ |
| REQ-LAB-13 | **Lab phải tương tác được thật, không có lab rỗng.** Bố cục thoáng, ít chữ, mỗi bước một khối riêng trên một dòng; lab của mọi môn theo cùng một khuôn | M | SRC-169, SRC-172, SRC-173, SRC-174, SRC-380 | SDD-010 | QG-006 | ✔ |
| REQ-LAB-14 | **Mỗi môn có một mục xem được mọi lab ngay lập tức**, không phải đi qua đường học mới tới; vào lab thì ẩn cột trái và chân trang để lab chiếm trọn màn hình | S | SRC-167, SRC-302 | SDD-010 | QG-007 | ✔ |
| REQ-LAB-15 | **Màn kết thúc lab nói ngắn**: một câu kết quả, một nút đi tiếp. Chữ dài ở màn kết thúc thì learner đã làm xong rồi, đọc cũng không đổi được gì | S | SRC-387 | SDD-010 | QG-007 | ✔ |

### REQ-ART — tài liệu đọc trong bài học (SRC-692)

| ID | Yêu cầu | P | Nguồn | SDD | QG | TT |
| --- | --- | --- | --- | --- | --- | --- |
| REQ-ART-01 | **Mỗi lesson chứa được một hoặc nhiều tài liệu đọc tự soạn**, lưu trong bảng riêng `curriculum_lesson_articles` chứ không nhét vào `curriculum_lesson_materials` (bảng đó trỏ ra ngoài, mọi `kind` đều đòi `url` hoặc `ref_id`). Có bản nháp, có lịch sử phiên bản, có slug ổn định dùng cả cho URL lẫn khoá tiến độ | M | SRC-692 | [SDD-033](../../../architecture/sdd-033-lesson-articles.md) §1, §2 | QG-008 | ✔ |
| REQ-ART-02 | **HTML learner đọc do server dựng từ TipTap JSON bằng một bộ lọc danh sách-cho-phép duy nhất**; không đường nào nhận HTML từ client. Link chỉ `http`/`https`/`mailto`/đường dẫn nội bộ, video chỉ YouTube và Vimeo với địa chỉ `iframe` do hệ dựng từ id, ảnh chỉ từ kho ảnh của hệ và mang URL tuyệt đối | M | SRC-692 | [SDD-033](../../../architecture/sdd-033-lesson-articles.md) §3 | QG-008 | ✔ |
| REQ-ART-03 | **Bản nháp không tới tay learner, và trả 404 chứ không 403** — với learner một bản nháp không tồn tại. Payload course mang tóm tắt (không thân bài); tên bài đọc của lesson bị khoá cũng bị cắt cùng phần nội dung khác | M | SRC-692 | [SDD-033](../../../architecture/sdd-033-lesson-articles.md) §4 | QG-008 | ✔ |
| REQ-ART-04 | **Route đọc thân bài đi qua đủ ba cổng** của mọi route lesson: phiên đăng nhập, quyền trên learner, quyền mở bài. Route soạn nằm ở router riêng gác bằng vai admin/staff, không chạm dữ liệu learner | M | SRC-692 | [SDD-033](../../../architecture/sdd-033-lesson-articles.md) §4 | QG-008 | ✔ |
| REQ-ART-05 | **Soạn trong `admin` bằng TipTap**, nhúng được ảnh (kéo thả, dán, tải lên qua kho ảnh có sẵn) và video, có khung nhấn mạnh, bảng, nếp gấp giấu đáp án, công thức toán. Cổng nội dung chắn lúc đăng chứ không lúc lưu; chiều rút xuống nháp không có cổng nào | M | SRC-692 | [SDD-033](../../../architecture/sdd-033-lesson-articles.md) §5 | QG-008 | ✔ |
| REQ-ART-06 | **Bài đọc là cụm trong chặng Kết nối**, đứng sau câu chuyện và trước học liệu; mỗi bài một mục menu mang chính tên nó và một URL riêng; tiến độ dùng lại `curriculum_part_completions` với khoá `connect:article-<slug>` | M | SRC-692 | [SDD-033](../../../architecture/sdd-033-lesson-articles.md) §6 | QG-008 | ✔ |
