---
url: https://docs.nemo12.com/intake/src-0100-0124.md
description: >-
  Sổ tiếp nhận nguồn yêu cầu SRC-0100 tới SRC-0124: mỗi dòng một nguồn, ngày
  nhận, tài liệu canonical đã ghi và trạng thái.
---

# Sổ nguồn SRC-0100 tới SRC-0124

Một mảnh của [sổ tiếp nhận](../intake.md). Chỉ CHÈN dòng bằng `node scripts/src-new.mjs`, không ghi đè cả file.

| ID | Ngày nhận | Nguồn | Canonical hóa vào | Trạng thái |
| --- | --- | --- | --- | --- |
| SRC-100 | 2026-08-14 | Feedback màn khởi động + lý do chọn: bỏ badge "10 câu", bỏ dòng hướng dẫn kéo thanh trượt, bỏ link "Bài khác", bỏ dòng "làm hết 10 câu mới xem đáp án"; 4 mức tự đánh giá thành **4 dòng, bỏ icon**; canvas khám phá **hạ còn ~70% chiều cao**; các lý do "Vì sao con chọn…" mỗi cái **một dòng, xáo thứ tự**, mỗi dòng có **dấu ? mở popover giải nghĩa + ví dụ** vì học sinh không hiểu "suy luận từ điều đã hiểu" nghĩa là gì | `Learning.tsx` (explore phase gọn, lý do dạng dòng + popover), `explore/engine.tsx` (`FIG` chặn chiều cao SVG), `justifications.ts` (hint + example cho cả 20 ô = 5 profile x 4 mã, `shuffleJustifications` seed theo id câu hỏi để thứ tự cố định trong một câu) | ✅ |
| SRC-101 | 2026-08-14 | Chỉ đạo Student Portrait (learn): **mỗi card một trang riêng có URL riêng**, 3 portrait **cùng một dòng**, card chỉ còn tên (2-3 chữ), bỏ link "Về trang chính"; **tách Lộ trình ra trang riêng**, full-width, thêm **khung nhìn quý / năm / 5 năm**, bỏ chữ trùng; trang chi tiết: icon like/dislike "thô thiển" -> bỏ emoji, và **tách cụm Thảo luận ra khỏi cụm trên** | `App.tsx` route `/student-portrait/{id}` + `/lo-trinh`; `PortraitView.tsx` (list 3 cột, card chỉ tên, nút phản hồi dạng pill có chấm màu trạng thái, thảo luận thành card riêng); `RoadmapPage.tsx` mới; `Roadmap.tsx` (full-width, 3 khung thời gian + nút lùi/tiến theo khung, cắt thanh track theo mép khung) | ✅ |
| SRC-102 | 2026-08-14 | Chỉ đạo Phòng Lab học theo **Duolingo**: đầu mỗi Unit là **một dãy Experience**, mỗi ô **chỉ một hình đại diện**, không mô tả dài; **3 Assessment Experience** ở đầu/giữa/cuối, cái đầu tên là **"Học vượt"** — **1 trái tim**, sai một câu là trượt và phải làm lại từ đầu, coi như không được vượt unit; ngoài ra **6 Learning Experience**, thiếu thì tạo nốt; **3 màu trạng thái**: chưa làm - đã xong - cần làm ngay. Kèm luật chống loạn UI: mỗi lúc tối đa **1 Learning Package**, trong đó **1 module**, trong đó **1 unit** được mở | REQ-LRN-16; [SDD-010 §9](../architecture/sdd-010-lab-platform/unit-path.md); migration `0028_learner_experience_state.sql`; `/labs` trả thêm `experiences`, `practice/start` nhận `kind=skip` + `node_ids` (đo cả unit, 10 câu) + `round` (vòng 2 trở đi đảo thứ tự câu), `POST /experience/complete`; `Learning.tsx`: `unitPath()` (9 ô: Học vượt -> 3 ô học -> Đo giữa -> 3 ô học -> Đo cuối), `UnitPath`/`ExpTile` 3 màu, Practice có chế độ `skip` 1 bong bóng + màn "Lần này chưa vượt được", accordion 1-mở-1 | ✅ |
| SRC-103 | 2026-08-14 | Chỉ đạo: trong **mọi Learning Experience và Assessment Experience**, câu trả lời sai đều bị bắt **trả lời lại tới khi đúng**; hết "lượt được sai" thì phải **làm lại cả Experience** đó | REQ-LRN-17; [SDD-010 §9](../architecture/sdd-010-lab-platform/unit-path.md); `Learning.tsx`: chế độ sửa câu (`retryFb` giữ feedback lần đầu, chọn lại chấm tại chỗ, mỗi lần sai mất một bong bóng), banner "Chọn lại nhé", màn hết bong bóng có nút "Làm lại từ đầu"; **các lần sửa không gửi `/answer`** nên evidence vẫn là lần trả lời đầu tiên | ✅ |
| SRC-104 | 2026-08-14 | Chỉ đạo: **Retention Model phải được update và tính toán định kỳ** — không chỉ chạy khi có evidence | Cron Trigger hằng ngày 21:00 UTC → WF-17 Retention Refresh ([SDD-017](../architecture/sdd-017-retention.md) §15); Retention Engine sinh snapshot version như các model khác (REQ-INT-30); `refreshRetentionProjections()` chỉ ghi trường phái sinh, cấm đụng anchor — test bất biến `retention/periodic.test.ts` | ✅ |
| SRC-105 | 2026-08-14 | Chỉ đạo: docs.nemo12.com cần **khu mô tả rất kỹ** từng Model (Learner, Parent, Goal, Learner Context…), từng Engine (logic + thuật toán, đầu vào, đầu ra), từng Workflow (chi tiết step), Queue, Cronjob, Webhook — kèm "còn cần mô tả gì nữa, hãy đề xuất rồi bổ sung"; nhấn mạnh thêm **Retention Model phải được mô tả kỹ cả cơ chế cập nhật lẫn cách dùng** | [reference/](../reference/index.md) — 16 trang; REQ-DOC-04; `scripts/gen-reference.mjs` sinh data-dictionary/api/events từ source; đề xuất bổ sung được duyệt: state machines, permissions, error catalog, AI registry, glossary | ✅ |
| SRC-106 | 2026-08-14 | Chỉ đạo Student Portrait: mỗi mục lớn cần **2 cột** — một cột là **phiên bản của riêng con, con chủ động viết**, cột kia là phiên bản bố/mẹ viết; **tên các mục lớn dùng chung**. Đổi "đồng ý / băn khoăn / chưa đồng ý" thành **icon** và đặt **bên dưới từng mục** | REQ-POR-09; [SDD-015 §2b](../architecture/sdd-015-student-portrait.md); migration `0029_portrait_learner_sections.sql`; `PUT /v1/portraits/{id}/learner-sections` (chỉ role learner được ghi), bundle trả thêm `learner_sections`; `PortraitView.tsx`: mỗi mục 2 cột (sand "Bố mẹ viết" · seafoam "Con viết" — textarea mỗi dòng một ý, tự lưu khi rời ô), ô "Thêm mục con muốn nói" cho mục bố mẹ bỏ trống, `ReactRow` thành 3 icon SVG đặt dưới mục | ✅ |
| SRC-107 | 2026-08-14 | Chỉ đạo: **learner xem được Learning Plan mới nhất** (theo Learning Plan Model) + **xem lại các phiên bản trước**, mỗi bản kèm "đã điều chỉnh gì so với bản trước, vì sao, cái gì làm plan đổi"; kèm định nghĩa đầy đủ Learning Plan Model (input: Learner/Retention/Goal/Context/Constraints/Readiness; nội dung: priorities, phases, time allocation, sequence, maintenance, review, milestones, replanning triggers). Bổ sung trong phiên: **cả learner lẫn bố mẹ đều khai thêm được thông tin** để Planning Engine tính lại | REQ-INT-20 (⏳→✔), REQ-LRN-18, REQ-PAR-15; [SDD-007 §6b](../architecture/sdd-007-learner-orchestration.md); `models/planning.ts` (Planning Engine plan-v1 + diff "vì sao đổi", 8 test), step cuối của WF-04; migration `0030_context_events.sql` (Context Event Registry — bật §5b); `GET/POST /v1/learners/{id}/learning-plan[/versions/{v}][/replan]`, `GET/POST .../context-events`; trang `/ke-hoach` (learn) và `#/child/{id}/plan` (marlins) | ✅ |
| SRC-108 | 2026-08-15 | Chỉ đạo: tạo **tiêu chuẩn audit toàn bộ hệ thống** — 10 bộ tiêu chuẩn phủ nhiều khía cạnh, mỗi bộ 5 tiêu chí, mỗi tiêu chí 5 indicator, mỗi indicator **chỉ có pass hoặc không pass** | REQ-DOC-05; [audit-standard/index.md](../quality/audit-standard/index.md) — AS-01..AS-10 × 5 tiêu chí × 5 chỉ báo = 250 chỉ báo nhị phân; luật chấm L1..L6 (cấm N/A, không bằng chứng = không pass, 🔴 chặn release), thang trưởng thành 5 mức, ánh xạ AS ↔ QG, quy trình audit + mẫu báo cáo | ✅ |
| SRC-109 | 2026-08-14 | Chỉ đạo: màn Blueprint mở ra là **label**, bấm **Edit** rồi **click từng element mới sửa inline**; xem được **danh sách Experience đã sinh từ blueprint**, click ra chi tiết, có nút **generate**; mỗi blueprint sinh **3 experience** để soát chất lượng blueprint lẫn chất lượng LX/AX | Editor 3 bước (label → editMode → click field); migration 0019 `learning_experiences` (provenance QG-010); `GET /v1/coral/blueprints/{id}/experiences`, `GET /v1/coral/experiences/{id}`, `POST /v1/coral/blueprints/{id}/generate` sinh 3 bản qua AI Gateway + ghi `generation_runs`; chi tiết hiện self-check "bám spec ở đâu / blueprint còn mơ hồ ở đâu" | ✅ |
| SRC-110 | 2026-08-14 | Chỉ đạo: learner chọn xong đáp án thì **bấm nút mới sang câu tiếp**, cứ thế hết bài; **gửi xong không được xem kết quả hay đáp án ngay**, làm xong xuôi mới được xem lại | Learning.tsx: nộp câu là sang thẳng câu kế (không hiện đúng/sai, lựa chọn chỉ đánh dấu "con chọn"); kết quả từng câu giữ trong state tới khi hết bài; màn cuối có "Xem lại bài làm" hiện từng câu kèm đáp án đúng, lựa chọn của con, misconception và mức vững | ✅ |
| SRC-111 | 2026-08-15 | Chỉ đạo: **sửa toàn bộ hệ để đạt ≥90% (225/250) chỉ báo Audit Standard** trước khi mở thử cho 10 phụ huynh thật; mỗi chỉ báo KHÔNG PASS phải có hành động đóng được, không giấu độ chín thấp bằng miễn trừ | REQ-DOC-06; [PRD-001 §5 REQ-DOC](../product/prd-001-nemo12-platform.md), [audit #001 §4](../quality/audits/2026-08-15.md), [quality-gates](../quality/quality-gates.md) QG-001/002 | 🔵 |
| SRC-112 | 2026-08-15 | Chỉ đạo: chuyển **lab legacy** (mỗi lab ứng một môn/lớp/unit) sang Phòng Lab thành **một dạng Learning Experience riêng, tương tác cao**; hàng nghìn lab nên phải tính **cách lưu trữ + tải động từng phần** để client không quá tải. **Ưu tiên Toán trước**, rồi **audit "unit nào còn thiếu lab"**. Bổ sung trong phiên: kiểm chất lượng thấy ổn thì **chuyển nốt tất cả**; **Coral cần chỗ quản lý lab** (dashboard, unit nào thiếu) | [SDD-010 §10](../architecture/sdd-010-lab-platform/lab-storage.md); migration `0037_labs.sql` (`labs` + `lab_content` tách metadata/nội dung); `scripts/extract-labs.mjs` (esbuild + stub ESM, đọc ITEMS/INQUIRY/CHECKS), `check-labs.mjs` (chặn lỗi trước khi nạp), `seed-labs.mjs`, `audit-labs.mjs` → [lab-coverage](../quality/reports/lab-coverage.md); API `GET /v1/labs/{id}` + `labs` metadata trong `/labs`, `GET /v1/coral/labs`; `LabPlayer.tsx` (picker + predict/observe/check, tải nội dung khi mở) và ô 🔬 Lab trên đường đi Unit; Coral thêm tab **Lab**. Đã nạp **225 lab / 451 câu kiểm tra** cho 6 môn | ✅ |
| SRC-113 | 2026-08-15 | Chỉ đạo: **gộp Student Portrait + Learning Plan + Lộ trình dài hạn thành một mảng mới tên "Hải đăng"** (tiếng Anh: Lighthouse); vào trong đó học sinh và phụ huynh **được giới thiệu để trải nghiệm từng phần** | REQ-LRN-19; [SDD-015 §2c](../architecture/sdd-015-student-portrait.md); `Lighthouse.tsx` ở cả learn (`/hai-dang`) và marlins (`#/child/{id}/hai-dang`) — hero + 3 card giới thiệu "là gì · vào đó làm gì"; trang gốc learn gộp 2 card thành 1 card Hải đăng; ba trang con giữ URL riêng, breadcrumb đổi thành "Hải đăng · …", nút quay lại trỏ về hub | ✅ |
| SRC-114 | 2026-08-15 | Chỉ đạo: **bài hình học ưu tiên có nhiều hình ảnh**, hình **vẽ bằng thuật toán để tương tác được**, **không được tạo file ảnh bitmap (JPEG/PNG)** | REQ-LRN-20; [SDD-010 §11](../architecture/sdd-010-lab-platform/figures.md); migration `0038_item_figures.sql`; `figures/engine.tsx` (10 archetype có thanh kéo) + 27 test kiểm tính đúng của hình; `scripts/attach-figures.mjs` (node → dạng hình, đề bài → variant/số đo) đã gắn **280/280 câu hình học Toán**; `/practice/start` trả kèm `figure` | ✅ |
| SRC-115 | 2026-08-15 | Chỉ đạo (sửa SRC-103): **đừng bắt learner học lại ngay**; câu sai **chèn xuống cuối** danh sách, tổng số câu tăng dần (10 → 11 → 12) | REQ-LRN-17 viết lại; [SDD-010 §9](../architecture/sdd-010-lab-platform/unit-path.md); `Learning.tsx`: hàng đợi `queue` nối thêm câu sai, thanh tiến độ + tổng kết tách "đúng ngay lần đầu" và "lượt làm thêm"; lượt gặp lại chấm ở client nên evidence vẫn chỉ tính lần đầu | ✅ |
| SRC-116 | 2026-08-15 | Chỉ đạo: mọi hình tròn trong Unit phải **cùng màu, cùng style 3D Pixar**, hình **to hơn** cho dễ nhìn; **Học vượt = chim mòng biển mỏ rất to**, **Luyện tập = con cua**, **Khám phá = cá ngựa**, **Luyện thêm dùng chung icon với Luyện tập**; **bỏ "0/9"** | [SDD-010 §9](../architecture/sdd-010-lab-platform/unit-path.md); `N12Art.tsx` thêm `IconSeagull` + `IconSeahorse` (radial gradient 3 stop, rim light, bóng đổ) và nâng `IconCrab` lên khối 3D; ô tròn 80px / art 56px, bỏ lớp làm mờ art, bỏ bộ đếm; kiểm bằng render thật ra SVG (có gradient, không bitmap, không NaN) | ✅ |
| SRC-117 | 2026-08-15 | Chỉ đạo: **khi Skip thì đừng chấm điểm nữa, đi thẳng tới câu tiếp theo** | [SDD-010 §9](../architecture/sdd-010-lab-platform/unit-path.md); `Learning.tsx` tách `skipItem()` khỏi luồng chấm: không reveal, không trừ bong bóng, không chèn lại xuống cuối; vẫn ghi ngầm một tín hiệu "chưa biết" cho Evidence Registry | ✅ |
| SRC-118 | 2026-08-15 | Chỉ đạo: làm **Interactive Onboarding Tour with Spotlight** trên learn.nemo12.com và marlins.nemo12.com. Ngoài ra ngay trên **www.nemo12.com và marlins.nemo12.com** cần một **đề nghị nhỏ "hãy xem phim Finding Nemo"** để hiểu rõ thêm về "Nemo12 World" | REQ-ONB-09, REQ-BRD-06; [DS-001 §5c](../design-system/index.md); `packages/design-system/ui/Tour.tsx` (canonical, copy per-app như N12Art) — đèn rọi bằng box-shadow spread nên phần sáng luôn khít element, thẻ tự lật trên/dưới theo chỗ trống, tự cuộn tới element, **bỏ bước không tìm thấy element**, Esc / bấm nền / "Bỏ qua" đều thoát, `localStorage` nhớ đã xem, mở lại từ menu avatar; 4 tour: learn `learn-home` (5 bước) + `learn-cockpit` (3), marlins `marlins-family` (5) + `marlins-child` (2). `ui/FindingNemo.tsx` trên `web` (trang chủ, dưới lưới school) và `marlins` (trang Gia đình, tắt được vĩnh viễn) — ánh xạ Nemo · Marlin · Crush · Bruce · cá voi · Dory sang vai trong hệ; **cố ý không gắn link tới dịch vụ phát trực tuyến nào** | ✅ |
| SRC-119 | 2026-08-15 | Chỉ đạo Phòng Lab: **bỏ cụm chú giải "Chưa làm / Đã xong / Làm ngay"**; **Learning Package đưa lên trên cùng thành tag** như chip lớp; chọn package → hiện Module → Unit → các hình tròn; **hầu hết Experience bị khoá**, chỉ khi làm xong **"Đo cuối"** của unit ngay trên thì unit kế mới mở | [SDD-010 §9](../architecture/sdd-010-lab-platform/unit-path.md); `Learning.tsx`: bỏ legend, `pkg` thành chip (mặc định package đầu còn bài sau khi lọc lớp), dựng danh sách unit theo thứ tự module→unit rồi tính `unlocked` (unit đầu mở; unit sau mở khi unit trên có `final` hoặc `skip` = completed); ô khoá hiện art xám + ổ khoá + dòng giải thích, không bấm được | ✅ |
| SRC-120 | 2026-08-15 | Chỉ đạo trang gốc learn: **Whale và Orca lên trên, nối tiếp ngay sau Squid School**; **bỏ các nhãn** "Các school", "Chọn một school để vào xem", "Cơ hội và sân chơi", "Đường dài của con"; đổi **"Hải đăng" thành "Lighthouse"** và **đưa nút Lighthouse lên navbar**; **learner phải khai đủ thông tin trong Lighthouse thì school mới mở dần** | REQ-LRN-21; [SDD-015 §2c](../architecture/sdd-015-student-portrait.md); `GET /v1/learners/{id}/lighthouse` (5 bước đọc từ dữ liệu thật, `unlocked = 1 + done`); `App.tsx` gộp một lưới + `LockedCard` (mascot xám, ổ khoá, câu chỉ đường) + nút Lighthouse trên navbar + banner tiến độ; `Lighthouse.tsx` thêm checklist bấm sang đúng chỗ để khai | ✅ |
| SRC-121 | 2026-08-15 | Chỉ đạo: **mặc định mới vào thì KHOÁ HẾT school**; khai thông tin cá nhân trong Lighthouse thì **Turtle** mới mở. Kèm: bỏ nút "Về Nemo12" ở trang school trên web | REQ-LRN-21 amend; [SDD-015 §2c](../architecture/sdd-015-student-portrait.md); `unlocked = done` (bỏ +1), thứ tự thẻ cố định theo `SCHOOLS`, khai đủ 5/5 mở hết; form hồ sơ nhúng thẳng vào trang Lighthouse (`ProfileEdit` + `onSaved` để tính lại tiến độ ngay); `apps/web` bỏ nút "← Về Nemo12" ở trang school | ✅ |
| SRC-122 | 2026-08-15 | Chỉ đạo: tạo **tính năng events trong marlins.nemo12.com** — bố mẹ có thông tin các event, **xem được chi tiết từng event**, và **đăng ký tham gia được, chỉ với event sắp diễn ra**. Kèm ảnh chụp trang Events cũ ở `marlins.chuyenchon.com/dashboard/events/cafe-2026-08-16` để tham khảo | REQ-PAR-16, US-82; [SDD-018](../architecture/sdd-018-community-events.md); migration `0039_community_events.sql` (`community_events` + `community_event_registrations`, khoá theo `user_id` chứ không phải email — RISK-001); module `workers/api/src/modules/events` với `GET /v1/events?scope=upcoming · all`, `GET /v1/events/{id}`, `POST .../register · /unregister` — một hàm `registrationState` chốt "còn đăng ký được không" cho cả ba API nên thẻ và trang chi tiết không nói khác nhau, kèm bù trừ khi hai người tranh chỗ cuối (17 test hành vi); `apps/marlins/src/Events.tsx` + tab **Sự kiện** (`#/events`, `#/events/{id}`); `scripts/seed-events.sql` chép buổi cafe đang chạy ở legacy. Cố ý để lại ngoài đợt này ([SDD-018 §6](../architecture/sdd-018-community-events.md)): bình chọn câu hỏi, wizard khai hồ sơ trước khi giữ chỗ, bảng admin | ✅ |
| SRC-123 | 2026-08-15 | Chỉ đạo trang school: gom ba cụm giới thiệu — **"Dành cho ai"**, **"Học ở … thế nào"**, **"Ra khỏi …, con có"** — vào **một accordion** cho gọn | `SchoolHome.tsx`: một khối "Về {school}" đóng sẵn (phụ đề "dành cho ai · học thế nào · ra khỏi trường có gì"), ba cụm nằm trong; phần học (môn, mục tiêu của con) giữ nguyên ở trên để không bị đẩy xuống dưới màn hình | ✅ |
| SRC-124 | 2026-08-15 | Chỉ đạo: **bổ sung các cuộc thi Toán vào Orca**, tra thông tin trên mạng, đặc biệt **IMAS, APMOPS, IMSO** | `scripts/seed-orca-math.mjs`: 4 cuộc thi (IMAS · APMOPS · IMSO · SASMO) + 4 kỳ thi sắp tới, kèm `format`, `qualification_note`, `awards_note` và `source_ref` ghi rõ nguồn + ngày tra; lịch là ước tính theo chu kỳ các năm trước nên để `verified=0` để Orca hiện nhãn chưa xác minh. Cuộc thi Toán trong Orca: 4 → **8** | ✅ |
