Sổ nguồn SRC-0125 tới SRC-0149
Một mảnh của sổ tiếp nhận. 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-125 | 2026-08-15 | Chỉ đạo trang Khám phá của marlins: chuyển Whale và Orca lên trên, giống trang HOME của learn.nemo12.com | REQ-PAR-13; Explore.tsx gộp hai <section> thành một lưới sm:grid-cols-2 lg:grid-cols-3 (DS-001 §5b luật 11), Whale + Orca nối tiếp ngay sau Squid School; bỏ nhãn nhóm "Các school" / "Cơ hội và sân chơi" và hai câu dẫn. Trước đây hai cụm nằm hai lưới khác cỡ nên Whale và Orca bị đẩy khỏi màn hình đầu. Cùng luật đã áp cho trang gốc learn ở SRC-120 | ✅ |
| SRC-126 | 2026-08-15 | Chỉ đạo trang Khám phá của marlins: gom ba cụm "Dành cho con nào", "Học ở X thế nào", "Ra khỏi X, con có" vào một accordion cho gọn; làm tương tự cho mọi school, cả Orca và Whale | REQ-PAR-13; Explore.tsx thêm AboutAccordion + SchoolAbout dùng chung: mỗi school một khối "Về {school}" đóng sẵn, Whale dùng lại đúng ba cụm đã có trong schoolsInfo, Orca gói câu "vì sao nên chọn lọc" vào khối "Về Orca". Cùng luật đã áp cho SchoolHome của learn ở SRC-123. Hai lỗi lộ ra khi kiểm và đã vá: (1) #/explore/whale rơi vào nhánh SchoolDetail vì whale cũng nằm trong SCHOOL_BY_CODE, nên WhaleHub chưa từng hiện ra — đưa nhánh whale lên trước; (2) accordion giữ state open khi đổi school (mở ở Shark thì Turtle cũng mở sẵn) — thêm key={current}; (3) WhaleHub gọi setFamily(r.family) không có fallback nên payload thiếu trường là màn hình trắng | ✅ |
| SRC-127 | 2026-08-15 | Chỉ đạo: đưa phân tích AoPS vào Pearl — AoPS không phải "Toán khó hơn" mà là cùng một Knowledge Node, một Learning Experience khác hẳn (problem-first: bài toán → vật lộn → quy luật → phỏng đoán → tổng quát hoá, công thức formalize SAU). 4 ví dụ một-node-hai-cách (đặt nhân tử chung, phương trình bậc nhất, tổng góc tam giác, tỷ lệ); đề bài ghi sẵn phương pháp là đã tiết lộ chiến lược (learner phải giải 2 bài: nên làm gì trước làm có đúng không); KHÔNG kết luận AoPS tốt / luyện đề VN tệ — hai bên tối ưu mục tiêu khác nhau. Nguyên tắc kiến trúc rút ra: Knowledge Node không chứa cách dạy — trên mỗi node có nhiều Learning Package (A thành thục · B khám phá · C vá nền · D thi đấu), Learner Model chọn gói theo understanding vs fluency; Knowledge is relatively stable, teaching is adaptive — Coral quản lý CÁI GÌ, Learning Engine quyết THẾ NÀO | Pearl: /ideas/aops (trường phái + 4 ví dụ + bảng đối chiếu 10 dòng + điểm mạnh hai bên) và /decisions/cach-day (4 Learning Package + bảng chọn gói + nguyên tắc); bảng trường phái ở /ideas/ thêm dòng AoPS; nối link từ learning-experience, ideas/ib, decisions/index. Nguyên tắc này chưa hiện thực trong code — Learning Package mới ở mức khái niệm, cần SDD trước khi build | 🔵 docs xong, code chưa |
| SRC-128 | 2026-08-15 | Chỉ đạo: trang Gia đình của marlins cần cụm thông tin giới thiệu Marlins là ai; đưa phần này vào cả nemo12.com và pearl.nemo12.com. Kèm nội dung: một câu định vị, "vì sao tên là Marlins" (gốc từ người bố trong Đi tìm Nemo), "ban đầu Marlin…" đối chiếu "Marlin học cách…", và câu kết "một Marlin không phải phụ huynh hoàn hảo" | REQ-BRD-07, US-83; nguồn canonical packages/design-system/ui/AboutMarlins.tsx (marlins/ và web/ giữ bản sao y hệt, như FindingNemo/N12Art), pearl dùng markdown content/marlins.md vì là VitePress; bố cục hai cột đối nhau thay vì một danh sách phẩm chất suông, để bố mẹ tự nhận ra mình đang ở cột nào; trên marlins tắt được vĩnh viễn (localStorage) vì là màn vào mỗi ngày, trên trang công khai thì không. Kiểm: contrast-check AS-09.3.1 PASS 145/145, pearl build sạch, không có em dash | ✅ |
| SRC-129 | 2026-08-15 | Chỉ đạo điều hướng learn: breadcrumb ngay cạnh logo (bấm tên school về HOME của school); bỏ tab — Luyện đề, Phòng Lab và mỗi môn học đều thành trang riêng không còn tab; HOME của school không có tab mà là các card dẫn sang từng trang | App.tsx: route {view:learn, code, subject?, page} với 5 URL — /{school}/hoc/{môn} · /lab/{môn} · /luyen-de/{môn} · /toan-canh/{môn} · /tien-do; header thành breadcrumb Nemo12 / School / Môn / Trang, bỏ TABS và state tab; SchoolHome.tsx thêm lưới 4 card; URL cũ /{school}/hoc vẫn vào được (link đã chia sẻ không gãy) | ✅ |
| SRC-130 | 2026-08-15 | Chỉ đạo: bỏ số thứ tự câu trong phần luyện đề thi, rồi bỏ nốt ở bảng tổng kết sau khi luyện tập (nối tiếp SRC-078 đã bỏ "Câu 4/10" ở luyện tập) | ExamPractice.tsx bỏ nhãn "Câu n."; Learning.tsx bảng xem lại bài chỉ còn trạng thái đúng/sai (đề bài nằm ngay dưới nên không cần số); LabPlayer.tsx bỏ "Câu kiểm tra n/N". Chủ dự án chốt bỏ luôn thanh "n/N đã trả lời" và thanh tiến độ ở đầu đề thi (đầu trang chỉ còn tên đề), rồi bỏ nốt thanh tiến độ trong màn hình đang luyện tập | ✅ |
| SRC-131 | 2026-08-15 | Chỉ đạo: luôn phải tồn tại TẤT CẢ model cho mọi learner, nội dung rỗng cũng được; Learner Model phải update liên tục ngay sau mỗi Learning/Assessment Experience — kể cả khi learner KHÔNG hoàn thành | SDD-002 §20; Constraint Engine mới (modules/models/constraint.ts) → không còn model nào thiếu engine; ensureAllModels() chạy lúc tạo learner + WF-17 quét mọi learner status<>'archived'; móc cập nhật Learner Model vào từng câu trả lời, warmup và experience complete/failed qua waitUntil | ✅ |
| SRC-132 | 2026-08-15 | Chỉ đạo: sau khi AI báo token wrangler/OAuth không có scope Access nên không tạo được Access app bằng API — "Bạn hãy tự tạo đi, từ vào website, tự cấu hình" (tự vào dashboard Cloudflare mà cấu hình) | Tạo tay qua Zero Trust → Access controls → Applications, dùng Chrome đã đăng nhập sẵn của chủ dự án: Nemo12 Dolphin (dolphin.nemo12.com) và Nemo12 Coral (coral.nemo12.com), cùng gắn policy có sẵn Nemo12 Admin - Owner (Allow · Emails · dac2205@gmail.com, id 8ac75e55-00c9-43f9-b6fa-933bf983fb03) thay vì tạo policy mới, để đổi email một chỗ là áp cả ba cổng; session 24h. Kiểm chứng bằng request thật: dolphin · coral · admin đều 302 sang dac2205.cloudflareaccess.com, còn learn · marlins · nemo12.com vẫn 200 (công khai). Đóng SRC-099 và bảng "việc làm tay" trong open-questions | ✅ |
| SRC-133 | 2026-08-15 | Chỉ đạo: Parent Model và Student Portrait cũng phải được mô tả kỹ như Retention — đầy đủ cơ chế cập nhật và cách dùng | reference/parent-model.md + reference/student-portrait.md; models.md §7/§8 trỏ sang trang riêng | ✅ |
| SRC-134 | 2026-08-15 | Chỉ đạo: Việt hoá WhaleHub. Đây là đảo lại phần "cụm filter dùng tiếng Anh, kể cả nút Lưu" của SRC-074 | WhaleHub.tsx ở cả learn lẫn marlins (SRC-074 phủ cả hai nên không thể sửa một bên): "Nơi con mơ tới" / "Nơi bạn muốn con tới", "Chọn tối đa 2 quốc gia và những ngành quan tâm.", chip quốc gia đổi name_en → name_vi, nút Lưu / Đã lưu ✓, "Bố mẹ đã chọn:" / "Con đã chọn:", khẩu hiệu hero → "Đi thật xa. Tìm đúng vùng biển của mình.". MAJORS bỏ hẳn trường label tiếng Anh, rút còn mảng chuỗi — chuỗi đó VỪA là nhãn VỪA là khoá backend đối chiếu nên không được sửa chữ, chỉ bỏ nhãn Anh. Giữ name_en làm phụ đề dưới tên quốc gia (cặp danh từ riêng, không phải chữ giao diện). Nhân tiện vá cho learn cùng lỗi setFamily(r.family) thiếu fallback đã vá ở marlins tại SRC-126. Còn lệch: cụm filter của Orca vẫn tiếng Anh theo SRC-080 | ✅ |
| SRC-135 | 2026-08-15 | Chỉ đạo: Goal Model và Readiness Model cũng mô tả kỹ như Retention | reference/goal-model.md + reference/readiness-model.md; models.md §4/§5 trỏ sang trang riêng | ✅ |
| SRC-136 | 2026-08-15 | Chỉ đạo: Learner Model và Learner Context Model cũng mô tả kỹ như Retention | reference/learner-model.md + reference/learner-context-model.md; models.md §2/§3 trỏ sang trang riêng; sửa bảng model tổng (Constraint + Learning Plan đã chạy thật, không còn "Phase 2") | ✅ |
| SRC-137 | 2026-08-15 | Chỉ đạo: không cần bố mẹ phải "đồng ý" — bỏ toàn bộ tính năng bắt phụ huynh bấm đồng thuận mới dùng được | Gỡ 3 cổng chặn: enforceConsent ở practice/start (chỗ đang chặn learner), vòng kiểm account+learning_data ở invitations/accept, và ô tick bắt buộc ở form mời con của Marlins. Xoá hẳn hàm enforceConsent; bảng consents giữ lại nhưng chỉ còn là dấu vết (ai bật/tắt cái gì, lúc nào), không route nào được từ chối learner vì thiếu đồng thuận. AS-07.3.2 sửa lại cho khớp thực tế và ghi rõ đây là quyết định sản phẩm, rủi ro pháp lý dữ liệu trẻ em đã được nêu | ✅ |
| SRC-138 | 2026-08-15 | Chỉ đạo sau khi bàn về "quá nhiều Experience": (1) bỏ padding đủ 6 ô học, chỉ hiện nội dung thật, "Luyện thêm" mọc dần sau khi làm xong; (2) ô đang làm to hẳn, ô khoá thu nhỏ mờ; (3) lớp lấy mặc định từ hồ sơ, bỏ "Tất cả", giấu sau nút "Xem lớp khác"; (4) mở khoá tính theo lớp chứ không theo chip đang bấm | Learning.tsx: unitPath nhận done() và bỏ vòng bù MIN_LEARN (tối đa 4 lượt Luyện thêm, chỉ mọc khi lượt trước xong); bỏ "Đo giữa" khi đường đi dưới 4 ô học; TILE_SIZE ba cỡ (đang làm 96px · mở 80px · khoá 48px mờ); grade luôn có một giá trị (lớp của con, không có thì lớp thấp nhất) + gradePicker. Unit trong ảnh: 15 ô → 4 ô | ✅ |
| SRC-139 | 2026-08-15 | Chỉ đạo trang Sự kiện: chỉnh giao diện cho có thẩm mỹ, gợi ý icon to lên gấp ~5 lần | Events.tsx: icon bỏ dạng svg 24px trần, vào khung tròn của DS (n12-icon 56px ở cột phải hẹp, n12-icon-lg 112px ở cột chính) — art N12Art vẽ chi tiết nên ở 24px chỉ còn là vệt màu; hero đổi sang n12-hero-ocean + <Seafloor/> (DS-001 v0.3: tia sáng, bong bóng, đáy biển) với tiêu đề 4xl/5xl; Lịch trình thành timeline có đường nối + chấm mốc thay cho danh sách gạch ngang; thẻ danh sách đổi khối ngày thành tờ lịch (tháng nền đậm ở đầu, ngày 3xl); khối Đăng ký là thứ DUY NHẤT có viền nhấn để mắt tìm ra ngay. Kiểm: contrast AS-09.3.1 PASS 145/145, mobile 375px không tràn ngang | ✅ |
| SRC-140 | 2026-08-15 | Chỉ đạo: cụm "Con thấy phần này thế nào?" không hiện ngay; learner nghịch phần khám phá, bấm "Tiếp tục" rồi mới hỏi | Learning.tsx phase explore: thêm askedSelf — mặc định chỉ có widget khám phá + nút "Tiếp tục →"; bấm xong mới hiện 4 mức tự đánh giá và nút "Bắt đầu làm bài". Hỏi lúc chưa nghịch gì thì thu về cảm giác cũ chứ không phải cảm giác sau khi vừa thấy bản chất, làm hỏng chính dữ liệu calibration (SDD-002 §5) | ✅ |
| SRC-141 | 2026-08-15 | Câu hỏi chủ dự án: khi nào nên chạy engine, chạy liên tục có tốn kém không — hay chỉ chạy khi learner kết thúc experience / bỏ dở rồi thoát | Bỏ hook dựng model sau MỖI câu trả lời (đọc lại toàn bộ lịch sử mỗi lần, giá một câu tăng theo tổng số câu đã làm). Chính sách mới SDD-002 §21: dựng ở ranh giới Experience · khi learner quay lại (learnerModelIsStale() so evidence mới nhất với model mới nhất) · WF-04 khi có bằng chứng mạnh · job đêm chốt chặn | ✅ |
| SRC-142 | 2026-08-15 | Chỉ đạo (Pearl, demo IB): mỗi môn học cần đóng khung một ý quan trọng nhất, xuyên suốt toàn bộ môn đó; kèm vài ý khác bổ sung hoặc cũng quan trọng nhưng không phải "quan trọng nhất" — phải phân biệt rõ hai hạng, không đặt ngang hàng | 8 trang demo IB (/ideas/inquiry-ib/*) mở đầu bằng khối .pearl-bigidea (viền accent 2px, chữ lớn — đúng 1 câu) + .pearl-also (nền sand, 3 gạch đầu dòng, nhẹ hơn hẳn về thị giác). Ý lớn nhất từng môn: Toán = mọi công thức là kết luận của một lập luận, đi lại được · Lý = cái thấy hằng ngày là quy luật CỘNG các tác động chồng lên · Hoá = bắc cầu giữa tầng quan sát và tầng hạt · Sinh = môn về cơ chế, không có "để mà" · Văn = văn bản không có sẵn nghĩa, nó tạo hiệu ứng bằng lựa chọn · Anh = mỗi cấu trúc diễn đạt một quan hệ mà cấu trúc khác không diễn đạt được · Sử-Địa = "làm sao ta biết" thay vì "chuyện gì đã xảy ra" · Nghệ thuật-Thiết kế = không đến từ cảm hứng mà từ lựa chọn cụ thể. Sửa đoạn dẫn Sinh và Sử-Địa cho khỏi trùng nguyên văn với khung; index demo IB thêm mục giải thích vì sao phải phân hạng | ✅ |
| SRC-143 | 2026-08-15 | Chỉ đạo: làm hết theo đề xuất sau khi rà soát (đo lường bị nhiễm, Học vượt thi lại ra đề cũ, kho câu mỏng, không ai kiểm được UI) và ghi hết vào docs | SDD-010 §12 luật chọn câu (selection.ts hàm thuần + 17 test): để dành ~35% kho cho bài đo, cỡ lượt luyện theo kho thật, luyện thêm ưu tiên câu chưa gặp, bài đo/Học vượt xáo theo session_id, Học vượt trượt phải chờ 3 tiếng; API trả pool_warning khi kho dưới 6 câu. SDD-010 §13 smoke test Playwright 5 luồng (chặn API bằng fixture, chạy trong CI trước deploy). item-coverage sinh tự động: 274 bài · 21 bài trống · 50 bài kho mỏng · cần soạn thêm 1.964 câu | ✅ |
| SRC-144 | 2026-08-15 | Chỉ đạo: soạn thêm câu hỏi cho 21 bài đang trống | 168 câu (8 câu/bài) cho 21 bài của AP · GenAI · IELTS · SAT, lưu ở scripts/items-empty-*.json, nạp bằng seed-items-empty.mjs. Mỗi bài có đủ role discriminator/boundary để luật chọn câu tách được pool luyện/đo; mỗi câu có misconception giải thích bẫy. Script chặn nạp nếu thiếu 4 phương án, correct_index sai, phương án trùng, thiếu misconception hoặc bài không có câu phân loại. source='ai-claude' → learner thấy nhãn máy soạn (AS-10.4.4). Bài trống: 21 → 0 | ✅ |
| SRC-145 | 2026-08-15 | Chỉ đạo: Việt hoá cụm filter của Orca cho đồng bộ. Đây là đảo lại SRC-080, và lý do gốc của SRC-080 ("đồng bộ với Whale") đã không còn sau khi SRC-134 Việt hoá WhaleHub | OrcaHub.tsx: bỏ hẳn bảng DOMAIN_EN (SRC-080 chỉ đổi chỗ hiển thị, DOMAIN_LABEL tiếng Việt vẫn nằm nguyên trong file nên đảo lại là dùng lại nó); chip "All" → "Tất cả". Nhân tiện bỏ emoji dẫn đầu trong DOMAIN_LABEL ("🧮 Toán" → "Toán") vì DOMAIN_ICON đã vẽ icon riêng bên cạnh, để cả hai thì chip hiện hai icon chồng nhau — và emoji thô trong chuỗi còn phạm SRC-068. Giữ "Robotics" và "AI" vì đó là cách gọi thật trong tiếng Việt. Kiểm: bundle build ra có "Lập trình"/"Tranh biện", không còn "Mathematics"/"Debate" | ✅ |
| SRC-146 | 2026-08-16 | Feedback: switch đổi ngôn ngữ phải chuyển đi chuyển lại được giữa hai lựa chọn, giống switch trên iPhone; và dùng chung giữa rất nhiều trang, tại bất kỳ chỗ nào có chức năng đổi ngôn ngữ | Component dùng chung LangSwitch ở packages/design-system/ui/ (canonical) + bản sao y hệt trong learn; LangToggle cũ chỉ còn là lớp bọc mỏng. Hai ô VI · EN hiện cùng lúc, con trượt chạy bằng translateX theo data-index, prefers-reduced-motion tắt chuyển động. A11y: radiogroup + 2 radio (không phải role="switch" — đây là chọn một trong hai giá trị ngang hàng), ←/→/Home/End, Space/Enter. Gắn thêm vào 7 trang trước đây không có chỗ đổi ngôn ngữ: Lighthouse · Kế hoạch học · Student Portrait · Lộ trình · Orca · Whale · HOME của school. Smoke test khoá cả hai luật | ✅ |
| SRC-147 | 2026-08-16 | Feedback: đưa "đoán mò", "chắc chắn" và các text khác vào thẳng bên trong các tag, cùng với các con số; và bỏ label "Con vẫn đổi được lựa chọn trước khi bấm Tiếp." | Learning.tsx: thang tự tin từ 5 nút tròn chỉ có số + chú thích rời "1 đoán mò · 5 chắc chắn" → 5 tag có chữ nằm ngay cạnh số trong cùng một nút (CONFIDENCE_LEVELS: 1 đoán mò · 2 hơi mơ hồ · 3 tàm tạm · 4 khá chắc · 5 chắc chắn). Chú thích rời chỉ nói hai đầu thang, learner phải tự đoán mức 2-3-4 nghĩa là gì — mà đây là số liệu đầu vào của Learner Model (hiệu chuẩn tự tin), đoán sai mức thì dữ liệu sai theo. Bỏ câu nhắc "vẫn đổi được lựa chọn" theo luật tối giản — nút "Tiếp →" đã nói điều đó. Smoke test khoá cả hai | ✅ |
| SRC-148 | 2026-08-16 | Feedback: thông báo "Đúng rồi" nhạt nhẽo, hơi chán — cần đề xuất tốt hơn, có hơi hướng biển cả / Finding Nemo. Chốt phương án B + D trong 4 đề xuất | B — khen theo ngữ cảnh (pickPraise trong Learning.tsx): lời khen đọc dữ liệu của chính câu vừa làm, ưu tiên từ chuyện hiếm nhất — gặp lại câu từng sai mà đúng ("gặp lại mà nhớ, đó mới là nhớ thật") → tự nhận đoán mò (tự tin ≤2) mà trúng → câu khó (difficulty ≥ 0.7, API /practice/start nay trả kèm difficulty của câu) → còn lại là câu ngắn giọng biển xoay theo số thứ tự câu. Không random khi có chuyện thật để nói — khen ngẫu nhiên chỉ là nhạt bằng nhiều từ hơn. D — thưởng bằng chuyển động: lớp .n12-bubbles (6 bong bóng nổi lên rồi tan, cùng bảng màu BUBBLE_ART với 5 bong bóng "mạng" ở đầu bài), chạy một lượt, prefers-reduced-motion tắt hẳn. Chuỗi 3 câu đúng vẫn dùng banner CHEERS sẵn có, không nói trùng. Bỏ câu "Đúng dù chưa tự tin lắm" cũ vì đã nằm trong lời khen | ✅ |
| SRC-149 | 2026-08-16 | Chỉ đạo: làm luôn phương án C (mascot lên tiếng) sau khi B + D đã chạy | Lời khen sau câu đúng do con vật dẫn nói trong bóng thoại (.n12-mascot + .n12-say). Con vật khớp đúng hình tròn learner vừa bấm ở Phòng Lab: mòng biển = Học vượt · cua = Luyện tập/Luyện thêm · cá ngựa = Khám phá — cùng nhân vật đi suốt bài thì mới ra chất "có ai đó đang xem con làm". Mỗi con một giọng riêng thật sự, không chỉ đổi tên: mòng biển nhanh nhảu ("Một nhát trúng đích"), cua chắc nịch ("Chắc như càng cua"), cá ngựa nhẹ nhàng ("Nhẹ nhàng mà chính xác"); giọng chỉ dùng khi không có chuyện đáng nói hơn (thứ tự ưu tiên của pickPraise giữ nguyên từ SRC-148). Câu SAI không có con vật — để nhân vật đứng nhìn lúc learner vừa sai rất dễ thành trêu, chỗ đó cần giọng bình thản. Không thêm chữ nào so với trước, chỉ đổi cách trình bày. Smoke test khoá cả hai luật (đúng → có con cua; sai → không con vật, không bong bóng) | ✅ |