---
url: https://docs.nemo12.com/intake/src-0575-0599.md
description: >-
  Sổ tiếp nhận nguồn yêu cầu SRC-0575 tới SRC-0599: 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-0575 tới SRC-0599

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-575 | 2026-08-25 | Chủ dự án, 2026-08-25: các popover trên bản đồ mức vững của marlins hầu như không đọc được chữ | Popover theo chất liệu của bản đồ nó mọc ra: nền biển sâu thì popover là hộp tối, không phải thẻ trắng | ✅ |
| SRC-576 | 2026-08-25 | Chỉ đạo: **tạo hình 5 mentor thành 5 con cá heo khác hình thù** (ảnh thật upload sau); mỗi mentor cần xem được **website, Substack, Facebook** riêng. Website: Đắc `anhdac.com`, Thông `thongphan.com`, Việt `phanviet.me`, Hồng `danghong.me` | **`<DolphinAvatar variant={0..4}/>`** trong N12Art: cùng một DNA cá heo nhưng mỗi biến thể đổi bốn thứ đủ nhận ra từ xa — dáng thân (nhảy vọt · lướt ngang · cuộn tròn ngoái lại · ngẩng lên · chúi xuống lặn), vây lưng, hướng nhìn, sắc độ; vẫn trong thang mực nên **không phá luật đơn sắc SRC-166**. Thay chữ cái đầu trong vòng tròn xám: hai người cùng chữ đầu thì vòng tròn chữ không phân biệt được (đúng ca "Hồng Hà" và "Đặng Tuyết Hồng" đang có). Ảnh thật khi upload sẽ đè lên. Migration `0077` thêm **3 cột riêng** `website_url` · `substack_url` · `facebook_url` chứ không một `links_json`: mỗi kênh một nhãn riêng, và cổng kiểm **chỉ nhận http/https** chạy trên từng trường ở tầng zod — ô link tự do là đường đưa `javascript:` lên trang công khai. Không cột nào bắt buộc; kênh nào trống thì không hiện, vì một hàng biểu tượng mà nửa số ô dẫn tới trang trống thì tệ hơn không có. Dolphin thêm nhóm ô "Link cá nhân". **Đã nạp 4 website**; Substack và Facebook chủ dự án chưa đưa. **Một chỗ tôi tự suy, cần xác nhận:** "của Hồng là danghong.me" — có hai mentor tên Hồng (Đặng Tuyết Hồng và Hồng Hà), tôi gán cho **Đặng Tuyết Hồng** vì `danghong` khớp họ Đặng; Hồng Hà hiện chưa có website. Kiểm: 786 test xanh (api 573 + learn 207 + web 6), typecheck + lint sạch, build web·mentors, 2 migration đã áp lên D1 remote và xác minh bằng truy vấn, dựng ảnh 5 biến thể để soát bằng mắt | 🔵 xong, chờ ảnh thật + link Substack/Facebook |
| SRC-577 | 2026-08-25 | Chủ dự án, 2026-08-25: báo cáo Toán ở marlins hiện thừa Số học, Đại số, Hình học; cần hiển thị như bản đồ của learn | Bản đồ mức vững tự lọc Package tạm ẩn, không để mỗi cổng tự nhớ | ✅ |
| SRC-578 | 2026-08-25 | Chủ dự án, 2026-08-25: đưa Dashboard lên tab đầu rồi tới Coverage; thêm switch EN/VI ở góc trên phải; thứ tự môn Toán, Ngữ văn, Tiếng Anh, Tin học, Vật lí | Trang báo cáo mở thẳng vào bản đồ mức vững, có công tắc ngôn ngữ, và hàng môn xếp theo mức quan trọng với gia đình chứ không theo thứ tự API | ✅ |
| SRC-579 | 2026-08-25 | Báo lỗi: **click chi tiết từng mentor đều không xem được**; kèm chỉ đạo thẻ mentor **chỉ hiển thị tên và "cựu học sinh trường gì đó"**, không nói cụ thể lớp chuyên nào | **Nguyên nhân trang trắng, lỗi của tôi ở SRC-576:** web đọc `mentor.links.website` mà API production **chưa có** trường `links` → TypeError → React bỏ trắng cả trang (dump DOM 2443 byte, không h1, không cả thông báo lỗi). Vì sao api chưa có: commit `b92e8a9` bị **CI đỏ** nên `deploy-api` không chạy, và các commit sau không đụng `workers/api` nên path filter cũng không kích hoạt lại — **web và api là hai worker deploy riêng, không bao giờ lên cùng lúc**. Vá bằng optional chaining, ghi luật ngay trong code: *mọi trường API mới thêm phải đọc qua `?.` cho tới khi chắc api đã lên*; kích hoạt `deploy-api` thủ công. **Rút gọn thẻ:** bỏ dòng lớp chuyên + thành tích và bỏ luôn dòng "Đồng hành ở môn" (SRC-523) theo chữ "chỉ… thôi"; câu mới dựng từ `alumni.school` là dữ liệu **có cấu trúc** chứ không cắt chuỗi `headline` viết tự do, nhờ vậy năm thẻ đọc giống nhau. Chi tiết vẫn đủ ở trang hồ sơ riêng; hai helper `headlineHaiDong`/`cauMon` giữ nguyên vì trang hồ sơ và test vẫn dùng. Kiểm: 786 test xanh, typecheck + lint sạch, dựng DOM xác nhận trang chi tiết không còn trắng | ✅ |
| SRC-580 | 2026-08-25 | Chủ dự án, 2026-08-25: bỏ link Quay lại; thay vòng tròn điểm + dòng mức vững bằng đầu bản đồ của learn (dãy ô nằm trên câu hỏi); thanh tab xấu; cần breadcrumb để biết đang ở đâu | Đầu bản đồ mức vững ở marlins dựng đúng như màn Lab, thanh tab đọc được trên nền tối, và breadcrumb thay cho link quay lại | ✅ |
| SRC-581 | 2026-08-25 | Chủ dự án, 2026-08-25: mỗi package cần hiện số lượng module; hỏi vì sao số module lệch nhau lớn và có vi phạm cận trên/cận dưới không | Thẻ Package hiện số Module ngay dưới tên, để độ to nhỏ của Package nhìn thấy được ở mức xem nông nhất | ✅ |
| SRC-582 | 2026-08-25 | Chủ dự án, 2026-08-25: cần màn riêng có URL riêng, dashboard chung tất cả các môn, mỗi môn một dòng với cột mastery, coverage, readiness, retention; bấm từng cell ra trang riêng có URL riêng | Bảng chỉ số toàn môn ở cổng phụ huynh, mỗi ô có URL riêng dẫn tới trang giải thích số đó ở đâu ra | ✅ |
| SRC-583 | 2026-08-25 | Chủ dự án, 2026-08-25: tối ưu đi, gọi API ít thôi, hit vào database ít thôi | Bảng chỉ số gộp thành một endpoint có số truy vấn cố định, không tăng theo số môn | ✅ |
| SRC-584 | 2026-08-25 | Chỉ đạo: trong Dolphin cho mentor xem danh sách từng **family** (bố mẹ + các con) và bổ sung thông tin cá nhân của những người đã có tài khoản; mentor **tự tạo được family** (bố · mẹ · các con) kể cả khi **thiếu thông tin**, và khi tài khoản thật đăng nhập thì có tính năng **nối vào nhau**; mỗi family cần **ghi chú (notes)** và **ảnh**, mỗi ảnh có **caption, description, thời gian chụp, vị trí**. Kèm 10 câu hỏi chốt phạm vi (2026-08-25) | [SDD-023](../architecture/sdd-023-family-workspace/index.md), REQ-MEN-11..14, US-97..100, migration `0078`. **Mười câu hỏi chủ dự án trả lời trực tiếp trước khi viết code** ([Q-141..Q-150](../open-questions/batches-12-13.md)) — nên đây là quyết định ✅ chứ không phải ✍️ tự quyết. Ràng buộc đẻ ra cả thiết kế: `family_members` và `guardians` **đều đòi `users.id`**, mà `users.email` là `UNIQUE NOT NULL` — người bố mentor vừa gặp ngoài đời thì chưa có email, nên muốn nhét vào `users` là phải **bịa khoá chính**. Vì thế `family_contacts` là bảng riêng, `user_id` cho phép NULL, và **mọi cột mô tả đều NULL được kể cả `full_name`**; sàn duy nhất là phải có một trong ba {tên, điện thoại, email} thì mới nhận ra được ai. Nối tài khoản: hệ **chỉ gợi ý** (trùng email, hoặc đã ở trong nhà này mà chưa gắn với ai) và **luôn kèm lý do**; **cố ý KHÔNG gợi ý theo tên gần giống** vì tên tiếng Việt trùng nhau quá nhiều và ghép nhầm ở đây là ghép hồ sơ trẻ nhà này sang nhà khác. Người đã có tài khoản thì mentor **không đè** tên/ảnh — API trả **hai lớp tách bạch** (`account` chỉ đọc · `mentor` sửa được), đúng nguyên tắc đã dùng khi bố mẹ và con khai khác nhau ([WF-19](../workflows/two-door-onboarding.md) §6). Ghi chú **không có bảng mới**: dùng lại `interactions` với `target_type='family'` và đúng thang `visibility` của ghi chú learner. Ảnh: `caption · description · taken_at · location` là **bốn cột riêng** (có cột mới sắp theo thời gian và lọc theo buổi được); `taken_at` do người nhập khai chứ **không đọc EXIF** vì ảnh qua Zalo thường đã bị xoá sạch EXIF, `location` là **chữ chứ không phải toạ độ**; `media.visibility='internal'` **cứng, không tham số nào trong luồng này đặt được `public`**, và `GET /v1/media/{id}` mở thêm nhánh internal đòi phiên + vai nội bộ, trả `private, no-store` thay vì `immutable` — `immutable` trên ảnh trẻ em nghĩa là CDN được phép giữ bản sao. Quyền xem là **mọi mentor xem mọi nhà** (giữ luật SRC-037), nên điều kiện đi kèm là **mỗi lượt mở và mỗi lượt sửa ghi một dòng `audit_log`** — khi ai cũng xem được mọi nhà thì thứ duy nhất phân biệt tra cứu để làm việc với tò mò về hàng xóm chính là cái log đó. **Không có route DELETE nào**: lưu trữ là `status='archived'`. **Chưa làm, nói rõ:** gộp hai gia đình trùng khi phụ huynh đã tự đăng ký trước — vẫn nối và **cảnh báo**, không gộp (✍️ [Q-151](../open-questions/batches-12-13.md)), vì gộp là chuyển `learners`, `guardians`, evidence và mục tiêu thi sang khoá mới. 15 test cho luật thuần (sàn nhận dạng, chuẩn hoá số điện thoại, gợi ý nối, tách hai lớp). | ✅ |
| SRC-585 | 2026-08-25 | Feedback màn danh sách Dolphin (ảnh chụp màn hình): **bỏ tiêu đề 'Tất cả learners' và dòng giải thích SRC-037**; **bỏ nhãn 'Quan sát'**; **xếp theo gia đình** — tên bố mẹ ở dòng trên, tên con ở dòng ngay dưới; mỗi gia đình có **một hoặc vài Dolphin chăm sóc**, mỗi Dolphin **tự đánh dấu 'tôi chăm sóc nhà này'** hoặc **tự bỏ**; vào hệ thống có **hai checkbox lọc**: 'chỉ hiển thị family tôi chăm sóc' và 'family chưa ai chăm sóc' | [SDD-023](../architecture/sdd-023-family-workspace/index.md) §11, REQ-MEN-15 | 🔵 |
| SRC-586 | 2026-08-25 | Chỉ đạo (ảnh chụp màn hình dolphin): thẻ mentor ở tab Đội ngũ **bỏ hết nút** (Sửa · Bỏ xác minh · Gỡ khỏi trang công khai · Xoá), **chỉ còn một link** mở **trang chi tiết riêng của từng mentor**; và **toàn bộ giao diện dolphin sang tiếng Anh**, không còn chữ tiếng Việt nào (chủ dự án chốt phạm vi: chỉ dolphin, learn/marlins/web giữ tiếng Việt) | [SDD-023](../architecture/sdd-023-family-workspace/index.md) §12, REQ-MEN-16 | 🔵 |
| SRC-587 | 2026-08-25 | Tài liệu **Dory & Anchor** — hai hệ thống vận hành quan hệ và trách nhiệm cho đội Dolphin. **Dory** (Family Relationship Management, *never forget the family*): Family 360 · Family Timeline · Interaction Capture · Family Context · Family Signals · Relationship Summary. **Anchor** (Case & Commitment Management, *never lose the commitment*): Case Management · Commitment Tracking · Action Management · SLA & Due Date · Follow-up · Escalation · Resolution Evidence · Audit Trail. Yêu cầu: PRD + Model Design + SDD + philosophy, triển khai trong dolphin.nemo12.com; nguyên tắc chung là có các **Model** (kiểu Family Model) liên tục cập nhật thông tin về gia đình | [PRD-003](../product/prd-003-dory-anchor.md), [SDD-024](../architecture/sdd-024-dory.md), [SDD-025](../architecture/sdd-025-anchor.md), [reference/family-model](../reference/family-model.md) | 🔵 |
| SRC-588 | 2026-08-25 | Chủ dự án gửi **4 Family Notes** từ các buổi thăm nhà (Anh Tú · Trí Minh · Minh Khang · Khánh Linh) + **2 bản audit** chấm theo rubric 5 tiêu chí. Yêu cầu: tổng hợp và tư vấn để mentor mở hồ sơ một gia đình là **thấy ngay thông tin quan trọng nhất**; xem chi tiết thì phải **có hệ thống, không dài lê thê khó hiểu**; mentor **bổ sung dễ và đúng chỗ**, hoặc **dồn vào một chỗ rồi phân loại sau**. Lưu ý: **'Sư Tử Con' là brand cũ, sẽ bỏ, dùng Nemo12**. Rà soát xong thì hỏi 30 câu trước khi nâng cấp docs → dựng tính năng trong dolphin → lập trình | [family-notes-review](../product/family-notes-review/index.md), bổ sung [PRD-003](../product/prd-003-dory-anchor.md) | ✅ đã xây, 37 note thật đã nạp |
| SRC-589 | 2026-08-25 | Chỉ đạo: thiết kế một **customer journey 5-9 bước**; hệ thống **đánh giá từng thành viên trong gia đình đang ở bước nào** và **nên đi tới bước nào gần nhất**. Tạo tài liệu trong docs.nemo12.com rồi triển khai | [SDD-026](../architecture/sdd-026-family-journey.md), REQ-DOR-07..09 | 🔵 |
| SRC-590 | 2026-08-25 | Chỉ đạo: rà soát và test lại hệ thống, tạo audit report, rồi fix dần | [Audit #005](../quality/audits/2026-08-26.md) | ✅ |
| SRC-591 | 2026-08-26 | Chủ dự án 2026-08-25: dùng Context7 để đảm bảo toàn bộ code dùng best practices và thư viện mới nhất, chất lượng code tốt nhất, trong tất cả webapp của nemo12.com | Context7 KHÔNG có trong phiên này (đã tra mcp-registry, không thấy connector) nên tôi nói thẳng thay vì giả vờ đã dùng; phần thực chất làm bằng npm outdated, npm audit và tài liệu chính thức của React qua WebFetch. Kết quả: nâng 9 nhóm gói lên bản mới nhất trong dải an toàn. Bốn phát hiện đáng giá hơn việc nâng số: MỘT — npm update --save đổi workspace nội bộ @nemo12/design-system từ \* thành ^0.1.0 ở 10 package.json, mà gói đó là private không có trên registry nên chỉ nổ ở lần cài sạch tức là ở CI, không lộ ở máy đã có node_modules. HAI — một bản PATCH cũng đủ làm vỡ: @hono/zod-openapi 1.5.2 lên 1.5.3 đổi kiểu Handler làm đỏ 9 chỗ typecheck; đã ghim tuyệt đối và ghi lý do. BA — dangerouslySetInnerHTML trong ChildReport của marlins nhận câu có nhúng tên Unit và tên trường mục tiêu do phụ huynh tự gõ: đó là lỗ XSS thật, đã thay bằng tách chuỗi để React tự thoát ký tự. BỐN — marlins có 3 file test nhưng package.json không có script test nên chúng chưa từng chạy lần nào; bật lên là 11 test có thật. Kèm cổng check-deps chặn cả hai lỗi phụ thuộc tái diễn, và lỗ hổng còn lại của vitepress là dev-only không có bản vá, ghi rõ chứ không nâng lên alpha | ✅ |
| SRC-592 | 2026-08-26 | Chủ dự án 2026-08-26: nâng nốt ESLint 10, TypeScript 7, Vitest 4, KaTeX 0.18 | Lần này CÓ Context7 (chủ dự án vừa kết nối) và nó trả đúng thứ cần: danh sách giá trị tsconfig mà TypeScript 7 bỏ, các API Vitest 4 gỡ, breaking của KaTeX 0.17, và dải ESLint mà typescript-eslint hỗ trợ. Nhờ tra trước nên biết ngay codebase không đụng phần lớn breaking: 35 tsconfig đều dùng moduleResolution bundler và target ES2022 chứ không phải node/es5, không chỗ nào truyền option làm tham số thứ ba cho test, không dùng vitest workspace hay coverage.all, không đụng \_\_defineFunction của KaTeX. Hai thứ thật sự phải sửa: TypeScript 7 GỠ HẲN baseUrl mà shadcn CLI vừa thêm hôm qua vào 6 tsconfig — bỏ đi là xong vì TS7 giải paths tương đối với chính tsconfig; và ESLint 10 bật rule no-useless-assignment bắt được 3 chỗ khởi tạo biến không bao giờ được đọc trong scripts, đều là mẫu let x = \[] rồi try gán lại còn catch thì continue. Giữ ghim @hono/zod-openapi 1.5.2 vì 1.5.3 vẫn vỡ; ba lỗ vitepress vẫn là dev-only không có bản vá | ✅ |
| SRC-593 | 2026-08-26 | Rà soát cuối phiên 2026-08-26: cổng tương phản AS-09.3.1 chưa được nối vào CI nên một cặp trượt ngưỡng nằm trên main mà không ai biết; danh sách HIDDEN_STRANDS sống ở ba nơi mà test chỉ canh hai | Cổng tương phản chạy trong CI, và test canh đủ ba bản HIDDEN_STRANDS kể cả bản của server | ✅ |
| SRC-594 | 2026-08-26 | Rà soát cuối phiên 2026-08-26: trả nợ đã ghi trong marlins-ia/index.md — ghi quan sát và cảm nhận theo môn là cùng một việc nhưng nằm hai nơi | Một trang Tôi kể về con gom mọi thứ bố mẹ tự khai, và báo cáo không còn lối vào thứ hai | ✅ |
| SRC-595 | 2026-08-26 | Rà soát cuối phiên 2026-08-26: REQ-KNW-17/18 được khai là kiểm được bằng máy và đánh ✔ trong PRD, nhưng không có checker nào và dữ liệu thật vi phạm nặng | Có script đo cận trên/cận dưới số Module mỗi Package, kết quả ghi thành reference, và trạng thái REQ trong PRD nói đúng sự thật | ✅ |
| SRC-596 | 2026-08-26 | Chủ dự án 2026-08-26: đảm bảo mọi mô tả kỹ thuật đều đã được đưa vào docs.nemo12.com; và dùng Motion React để hình ảnh trên mọi trang di chuyển mượt mà, hiệu ứng thú vị | PHẦN DOCS: đo mới thấy nợ lớn hơn tưởng — 403 trên 550 SRC đã xong không được khai ở sources frontmatter, trong đó 109 cái không xuất hiện ở BẤT KỲ đâu trong docs. Hai loại nợ khác hẳn nhau nên cổng check-src-canonical đo riêng: nợ KHAI BÁO là nội dung có mà máy truy vết không thấy, nợ NỘI DUNG là quyết định kỹ thuật chỉ còn trong commit message. Cổng cũ chỉ canh một chiều (doc mồ côi) mà không canh chiều ngược lại (SRC mồ côi). Trần chỉ đi một chiều, đã dọn 8 SRC của phiên này vào SDD-021 mục 11-13 và DS-001. PHẦN MOTION: tra Context7 trước nên dùng đúng ba thứ — LazyMotion với component m thay motion đầy đủ để không kéo cả engine vào bundle đầu, MotionConfig reducedMotion=user bọc toàn app để Motion tự tắt biến hình khi hệ điều hành xin giảm chuyển động, và whileInView/whileHover cho hiệu ứng. Năm preset dùng chung trong packages/design-system/ui/Motion.tsx với biên độ tối đa 12px và dưới 0,4s vì Nemo12 là chỗ học chứ không phải trang giới thiệu sản phẩm. Việc bọc Floating làm lộ một hồi quy có sẵn từ SRC-568: lớp n12-swim của màn chờ VA CHẠM tên với lớp trang trí đã dùng ở 23 chỗ, width 100% của nó làm mọi mascot rộng 0px khi cha không có bề ngang xác định; đổi tiền tố thành n12-loader-sea. Bài học: đặt tên lớp mới thì grep tên đó trước | ✅ |
| SRC-597 | 2026-08-26 | Chủ dự án, 2026-08-26: icon quá to ở trang Kế hoạch; header trắng xoá chữ lẫn nền; switch EN/VI biến mất ở các trang khác | Chev không nở to khi nằm ngoài flex, header cổng phụ huynh mang màu đáy biển, và công tắc ngôn ngữ nằm ở header dùng chung cho cả cổng | ✅ |
| SRC-598 | 2026-08-26 | Chủ dự án, 2026-08-26: tách mỗi môn ra một card riêng biệt trên bảng chỉ số | Bảng chỉ số là một card mỗi môn, xếp theo thứ tự môn đã chốt chứ không theo thứ tự dữ liệu | ✅ |
| SRC-599 | 2026-08-26 | Chủ dự án, 2026-08-26: đưa cụm Con đang ở đâu lên trên cùng; mastery dùng dãy ô như learn, coverage dùng biểu đồ tròn, readiness và retention tự chọn cách thể hiện | Bốn chỉ số có bốn hình khác nhau để mắt không gộp chúng thành một điểm tổng, và Con đang ở đâu đứng đầu trang con | ✅ |
