PRD-001 · REQ: Tài khoản, web công khai, lịch, học thử
Một mảnh của danh mục REQ PRD-001, gồm REQ-ACC, REQ-BRD, REQ-CAL, REQ-TRI. 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-ACC — Identity, Auth & Family
| ID | Yêu cầu | Ưu tiên | Nguồn | SDD | QG | Status |
|---|---|---|---|---|---|---|
| REQ-ACC-01 | Parent-first: login Google → account + family tự tạo, không có form đăng ký/password | M | Q-006 | SDD-001 §6 | QG-008 | ✔ |
| REQ-ACC-02 | SSO cookie xuyên subdomain .nemo12.com, session opaque + hash, có rotation | M | SRC-014 FEAT-049 | SDD-001 §6 | QG-008 | ✔ |
| REQ-ACC-03 | Parent invite learner; learner chỉ học sau invite; 1 family n learners, 1 learner n guardians | M | Q-006, FEAT-029/032 | SDD-001 §6 | QG-008 | ✔ |
| REQ-ACC-04 | Canonical learner_id (không dùng email làm khóa); mapping identity duy nhất toàn platform | M | RISK-001 | SDD-001 §7 | QG-004 | ✔ |
| REQ-ACC-05 | Roles: learner, parent/guardian, mentor, staff/admin — RBAC ở backend; cấp/thu quyền từ admin #/access, mọi lần cấp quyền ghi audit log. Luồng cấp quyền mentor: WF-18 | M | SRC-008 §9 | SDD-001 §6, WF-18 | QG-008 | ✔ |
| REQ-ACC-06 | Auth flow tương thích mobile app (token-based song song cookie) | S | Q-029 | SDD-001 §6 | QG-008 | ✔ |
REQ-BRD — Public Web (app: web)
| ID | Yêu cầu | Ưu tiên | Nguồn | SDD | QG | Status |
|---|---|---|---|---|---|---|
| REQ-BRD-01 | nemo12.com giới thiệu ecosystem + 5 trang school (/turtle, /shark, /octopus, /squid, /whale); /ray chuyển hướng về /squid (SRC-081) | M | SRC-001, SRC-081 | SDD-001 §4 | QG-007 | ✔ |
| REQ-BRD-02 | SEO + OG cards per-route | S | FEAT-052 | SDD-001 §4 | QG-001 | ✔ |
| REQ-BRD-05 | Pearl (pearl.nemo12.com) — lớp tri thức công khai "How Learning Works" cho phụ huynh: 6 nhóm nội dung (cách học diễn ra · cách Nemo12 hiểu learner · Student Portrait · các trường phái giáo dục, không xếp hạng · cách Nemo12 ra quyết định · mental model cho bố mẹ) + 10 keyword có trang riêng; dùng chung token DS-001, không fork component; nội dung neo về SDD-002/015/017 | M | SRC-097 | SDD-001 §4 | QG-001/007 | ✔ |
| REQ-BRD-06 | Đề nghị xem phim "Finding Nemo" trên nemo12.com (trang chủ, dưới lưới school) và marlins (trang Gia đình, tắt được vĩnh viễn): một card nhỏ nói tên phim + mở ra được bảng ánh xạ nhân vật → vai trong hệ (Nemo = con, Marlin = bố mẹ, Crush = Turtle, Bruce = Shark, cá voi = Whale, Dory = vì sao phải Ôn nhanh). Không gắn link tới dịch vụ phát trực tuyến nào | S | SRC-118 | DS-001 §5c, SDD-001 §4 | QG-007 | ✔ |
| REQ-BRD-07 | Giới thiệu "Marlins là ai": một câu định vị (cộng đồng bố mẹ sẵn sàng học để giúp con tốt hơn), gốc tên lấy từ phim Đi tìm Nemo, và hành trình "ban đầu Marlin thế nào" đối chiếu "Marlin học được gì". Hiện ở ba nơi: nemo12.com (dưới ba thẻ persona), marlins #/about (trang riêng, tab thứ tư — SRC-204 tách khỏi trang Gia đình) và pearl /marlins. Một nguồn nội dung duy nhất trong packages/design-system/ui/AboutMarlins.tsx, các app giữ bản sao y hệt | M | SRC-128 | DS-001 §5c | QG-001/007 | ✔ |
| REQ-BRD-08 | Album ảnh & đội ngũ trên nemo12.com theo hai vùng người đọc: trang chủ có một dải ngắn dùng bản gốc (chưa biết ai đang xem), còn album đầy đủ nằm ở hai trang riêng /for-parents và /for-students, mỗi trang lấy đúng bản chú thích của mình. Quy tắc nội dung: thiếu bản riêng thì rơi về bản gốc, theo từng trường một — mặc định hai vùng giống hệt nhau, chỉ khác khi có người soạn bản riêng (Q-131). Album/hồ sơ draft không bao giờ lộ ra API công khai | M | SRC-201 | SDD-019 §6-7 | QG-007/008 | ✔ |
| REQ-BRD-09 | Trang trường chuyên công khai trên nemo12.com (không cần đăng nhập): /specialist-schools liệt kê mọi trường đã publish, lọc theo tỉnh và loại; /specialist-schools/{slug} hiện giới thiệu, các lớp chuyên, thành tích theo từng năm học, cựu học sinh tiêu biểu (kèm mentor của Nemo12 xuất thân từ trường đó); /specialist-schools/so-sanh đặt 2-4 trường cạnh nhau trên cùng bộ chỉ số, mỗi ô ghi rõ năm học và nguồn, ô không có dữ liệu để trống. Nemo12 không xếp hạng trường và không sinh điểm tổng (Q-137) | M | SRC-203 | SDD-020 §6-7 | QG-007/008 | ✔ |
| REQ-BRD-10 | Trang khung năng lực công khai b21.nemo12.com (không cần đăng nhập): trang gốc liệt kê 12 lĩnh vực và các competency của từng lĩnh vực; /c/{code} hiện các skill của một competency kèm câu hỏi dẫn dắt; /c/{code}/{skill} hiện các bậc thành thạo, mỗi bậc là danh sách chỉ báo đạt hoặc chưa đạt, tự đánh dấu được và dấu đánh chỉ nằm trên máy người xem. Nội dung là nguyên văn khung Building 21 (CC BY-NC-SA 4.0), mọi trang đều ghi nguồn và giấy phép; Nemo12 không chấm và không sinh điểm tổng nào từ khung này | M | SRC-642 | SDD-028 §3-6 | QG-004/007 | ✔ |
| REQ-BRD-11 | Ba thế giới của nemo12.com: trang chủ không bán khoá nào mà phân nhánh thành hai cửa /students và /parents, cộng nhánh thứ ba /education; mỗi trang một URL riêng có <title>/description/canonical/OG đặt lúc build (prerender tĩnh), sitemap sinh bằng script; điều hướng student theo mục tiêu, parent theo vấn đề; tên linh vật (Turtle · Ray · Squid · Octopus · Orca) là category bên trong /students, không lên nav chính, URL cũ giữ làm bí danh 301; các khu vực ảnh thật khai báo trong một manifest, chưa có ảnh thì hiện khung chờ chứ không dùng ảnh stock hay ảnh AI; /start chỉ dẫn sang learn.nemo12.com và marlins.nemo12.com, không có form thu số điện thoại | M | SRC-643 | SDD-029 §2-7 | QG-004/007 | ✔ |
| REQ-BRD-12 | playbooks.nemo12.com — Nemo12 Action Library: site công khai trả lời "trong tình huống này thì LÀM gì", tách hẳn khỏi Pearl ("BIẾT gì"). Cây nội dung 6 tầng chủ đề (Family · Learner · Learning · Exams · Competitions · Life); audience (marlin · nemo · mentor · school) và journey stage (discover → … → reflect) là metadata để lọc, không đẻ thêm thư mục. Mọi trang theo Playbook Blueprint 11 phần (tình huống · mục tiêu · nguyên tắc · chẩn đoán · chiến lược · các bước · công cụ · ví dụ · lỗi thường gặp · checklist · playbook tiếp theo); trong một playbook còn có Guide · Checklist · Template · Tool · Decision Tree, không gọi mọi thứ là Playbook. Cây và sidebar sinh từ apps/playbooks/catalog/playbooks.json, không gõ tay file .md; phần thân là việc của xưởng nội dung (SDD-027). Cùng stack và token với docs/pearl, deploy qua GitHub Actions | M | SRC-647 | SDD-001 §6 | QG-001/007 | ✔ |
| REQ-BRD-03 | CMS cho marketing content | S | FEAT-053, Q-050 | — | — | ⏳ |
| REQ-BRD-04 | Pricing page, ebooks | C | FEAT-028, Q-050 | — | — | ⏳ |
REQ-CAL — Lịch (SRC-678)
Chỉ đạo chủ dự án 2026-09-04: ba vai cùng hỏi một câu "sắp tới tôi có việc gì", chỉ khác chỗ đứng. Vì vậy cụm này là một phép đọc dữ liệu đã có (course_sessions, community_events) chứ không phải một hệ lịch thứ hai — lý do đầy đủ ở SDD-031 §1, §2.
| ID | Yêu cầu | Ưu tiên | Nguồn | SDD | QG | Status |
|---|---|---|---|---|---|---|
| REQ-CAL-01 | Learner xem lịch của chính mình ở learn /calendar: buổi của các khoá đang ghi danh + sự kiện đã giữ chỗ, 7 ngày tới (nới được tới 90), gom theo ngày, mỗi buổi có giờ · hình thức (online/offline) · nơi học; buổi online kèm link vào lớp; buổi đã huỷ vẫn hiện kèm dấu huỷ | M | SRC-678 | SDD-031 §3, §6 | QG-003/008 | ✔ |
| REQ-CAL-02 | Phụ huynh xem lịch của các con ở marlins /calendar, gộp mọi con trong nhà và ghi rõ buổi của đứa nào; thẻ xem trước "Lịch tuần này" trên trang chủ. Tập learner suy từ quan hệ trong dữ liệu, client không gửi learner_id — gửi được tức là đoán được lịch nhà khác | M | SRC-678 | SDD-031 §3 | QG-004/008 | ✔ |
| REQ-CAL-03 | Mentor xem buổi mình phụ trách ở mentors /calendar, lấy theo COALESCE(buổi, khoá) nên giao riêng một buổi cho mentor khác là buổi đó rời khỏi lịch của người kia; mentor không cần ghi danh khoá mình dạy | M | SRC-678 | SDD-031 §2, §3 | QG-008 | ✔ |
| REQ-CAL-04 | Mang lịch sang ứng dụng lịch cá nhân bằng feed ICS một chiều /v1/calendar/feed/{token}.ics: nhắc giờ là việc của điện thoại, không phải của Nemo12. Token 32 byte không chứa user_id, rút lại được, trần 10 feed mỗi người; token sai và token đã rút trả 404 giống hệt nhau; không ai rút được feed của người khác | M | SRC-678 | SDD-031 §5 | QG-008 | ✔ |
| REQ-CAL-05 | Link phòng học online chỉ trả cho người có phần trong buổi (learner ghi danh, người nhà của learner ấy, hoặc mentor phụ trách) — cắt ở tầng service, không phải ở giao diện: một link Meet lọt ra ngoài là một phòng có trẻ em mà người lạ vào được | M | SRC-678 | SDD-031 §3 | QG-008 | ✔ |
| REQ-CAL-06 | Màn quản trị khoá học ở admin tab Courses: đặt hình thức (online/offline) · nơi học · địa chỉ · link phòng online · người dạy, ở cả khoá lẫn từng buổi (ô trống ở buổi = theo khoá). Người dạy chỉ chọn được trong số tài khoản đã mang vai mentor/staff/admin, không nhận id gõ tay; ô để trống xoá giá trị cũ chứ không im lặng bỏ qua; mỗi lượt sửa ghi audit ai đổi trường nào, không ghi chính cái link vào nhật ký. Gate role admin | M | SRC-678 | SDD-031 §8 | QG-003/008 | ✔ |
REQ-TRI — Học thử và quyền học curriculum (SRC-679)
Chỉ đạo chủ dự án 2026-09-05: "Các khóa đều cho phép học thử một lesson đầu tiên." Câu này nghe như nới một cửa, nhưng trước đợt này curriculum không có cửa nào — mọi learner đọc được cả 201 lesson. Việc thật sự làm là dựng cái khoá rồi chừa lesson đầu ra; lý do đầy đủ ở SDD-032 §1.
| ID | Yêu cầu | Ưu tiên | Nguồn | SDD | QG | Status |
|---|---|---|---|---|---|---|
| REQ-TRI-01 | Mỗi khoá curriculum mở đúng một lesson học thử — bài seq nhỏ nhất của unit seq nhỏ nhất. Learner chưa có quyền vẫn học trọn vẹn bài đó: đủ bốn chặng, học liệu, bài kiểm, bài ngẫm | M | SRC-679 | SDD-032 §2 | QG-008 | ✔ |
| REQ-TRI-02 | Nội dung bài ngoài phần học thử bị CẮT Ở SERVER, không phải làm mờ ở giao diện: payload trả về chỉ còn mục lục (id, thứ tự, tên bài, câu hỏi dẫn dắt), không một dòng học liệu, câu chuyện, hiểu lầm hay Performance Task nào. Mục lục giữ lại có chủ ý — nó đã công khai ở /v1/public/ielts/catalog | M | SRC-679 | SDD-032 §3 | QG-008 | ✔ |
| REQ-TRI-03 | Quyền học trọn khoá là một dòng trong curriculum_entitlements, khoá theo (learner_id, course_id): tiền trả cho một đứa con không mở khoá cho đứa khác. Hai nguồn phân biệt được — purchase (qua cổng thanh toán) và grant (admin cấp tay) | M | SRC-679 | SDD-032 §4 | QG-008 | ✔ |
| REQ-TRI-04 | Chặn ghi tiến độ lên bài đang khoá (chặng, cụm, bài ngẫm) bằng LESSON_LOCKED 403 — không phải 401: 401 khiến client báo "phiên đăng nhập hết hạn" và learner đi đăng nhập lại rồi vẫn không mở được bài | M | SRC-679 | SDD-032 §5 | QG-008 | ✔ |
| REQ-TRI-05 | Học sinh tự mở được hồ sơ học thử bằng đăng nhập Google, không cần mã mời của phụ huynh (POST /v1/learners/self, profile_source='self'). Đường mã mời giữ nguyên, hai đường song song cho hai hoàn cảnh | M | SRC-679 | SDD-032 §6 | QG-008 | ✔ |
| REQ-TRI-06 | Dùng thử sân IELTS 30 ngày: hồ sơ mới ngó nghiêng và học thử được trong 30 ngày kể từ ngày mở; hết hạn thì mục lục vẫn xem được còn nội dung bài và quyền ghi tiến độ bị cắt Ở SERVER, lý do trả về là TRIAL_EXPIRED chứ không gộp chung với khoá thứ tự | M | SRC-859 | SDD-038 §58b | QG-008 | ⏳ pending-confirm (Q-154) |
| REQ-TRI-07 | Bốn kỹ năng IELTS mở tuần tự, Reading mở đầu tiên; kỹ năng sau chỉ mở khi kỹ năng trước xong trọn vẹn theo một hàm đọc từ dữ liệu đã có (hết lý thuyết mọi năng lực nhỏ, mọi năng lực nhỏ đạt bậc tối thiểu, bằng chứng rải trên nhiều buổi khác ngày). Đây là tầng TRÊN luật mở khoá bài trong một kỹ năng của REQ-LRN (SRC-923), không thay thế nó | M | SRC-859 | SDD-038 §58a, §58c, §58d | QG-008 | ⏳ pending-confirm (Q-155) |
| REQ-TRI-08 | Lịch mở theo tháng là dữ liệu, không phải hằng số: mỗi kỹ năng có số ngày chờ tính từ ngày hồ sơ IELTS mở, sửa được mà không cần deploy; lịch tự động và tay Dolphin cộng dồn, cái nào tới trước thì mở | S | SRC-859 | SDD-038 §58e | QG-008 | ⏳ pending-confirm (Q-156) |
| REQ-TRI-09 | Khoá không được làm hỏng bằng chứng đã có: learner đã có bằng chứng ở một kỹ năng thì kỹ năng ấy coi như đã mở lúc chạy migration; bài đang làm dở vẫn nộp được khi trial hết hạn; kỹ năng chưa mở báo INSUFFICIENT_RELIABLE_EVIDENCE (REQ-INT-22) chứ không phải mức thành thạo thấp | M | SRC-859 | SDD-038 §58g | QG-005/008 | ⏳ pending-confirm |