---
url: https://docs.nemo12.com/open-questions/batches-12-13.md
description: >-
  Open Questions đợt 12 (hồ sơ mentor, album, trường chuyên, Q-131..137) và đợt
  13 (Family Workspace trong Dolphin, Q-141..150).
---

# Open Questions · Đợt 12 và 13: hồ sơ mentor, Family Workspace

Một phần của [Open Questions](./index.md). Open Questions đợt 12 (hồ sơ mentor, album, trường chuyên, Q-131..137) và đợt 13 (Family Workspace trong Dolphin, Q-141..150).

## Đợt 12 — Hồ sơ mentor, album ảnh, registry trường chuyên (SRC-201 & SRC-203, 2026-08-17, Q-131..Q-137)

Bảy quyết định ✍️ tự quyết trong lúc xây [SDD-019](../architecture/sdd-019-mentor-albums.md) và [SDD-020](../architecture/sdd-020-school-registry.md). Chủ dự án sửa được bất cứ lúc nào; mỗi mục ghi kèm điều kiện đảo ngược.

| Q | Câu hỏi | Quyết định ✍️ |
| --- | --- | --- |
| Q-131 | Chỉ đạo nói "nếu user nhập đủ 2 cái caption, 2 cái description thì hiển thị riêng". Vậy điền **một nửa** thì sao? | ✍️ 2026-08-17: **fallback theo từng trường**, không phải "đủ đôi mới tách" — `pick(base, parent, student, audience)` lấy bản riêng nếu có, không thì bản gốc. Lý do: cách "đủ đôi mới tách" khiến người soạn điền xong bản cho bố mẹ, lưu lại, và **không thấy gì thay đổi** vì bản kia còn trống — im lặng nuốt mất công vừa làm là cách nhanh nhất khiến người ta nghĩ tính năng hỏng. Bù lại, cổng quản lý **nói thẳng trạng thái nửa vời** ("Học sinh: đang dùng bản gốc") nên không ai vô tình để lệch. Chuỗi rỗng `''` tính là chưa điền (`NULLIF`). **Đảo ngược nếu:** chủ dự án muốn hai vùng chỉ được khác nhau khi có người duyệt cả cặp. |
| Q-132 | Hệ media đầy đủ ([SDD-009](../architecture/sdd-009-media.md)) chưa có dòng code nào. Làm cả hệ trước, hay chỉ làm phần album cần? | ✍️ 2026-08-17: làm **đúng lát cắt cần**, giữ nguyên tên cột của SDD-009 để phần sau là mở rộng chứ không phải viết lại. Có: bảng `media`, bytes trên R2, `GET /v1/media/{id}` bất biến, chặn mime + dung lượng, bỏ tên tệp do client gửi. Chưa: variants Cloudflare Images (là quyết định chi phí), signed URL, moderation queue, versioning, EXIF strip. Lý do: ảnh đợt này do người nội bộ **sau Cloudflare Access** đưa lên, không phải ảnh learner — moderation queue dựng cho một luồng chưa tồn tại thì chỉ là code không ai chạy. **Đảo ngược ngay khi** có đường upload đầu tiên của learner/phụ huynh: `moderation_status` mặc định phải thành `pending` và cổng serve phải kiểm (chỗ kiểm đã dựng sẵn). |
| Q-133 | Gắn mentor vào **album** hay vào **từng ảnh**? | ✍️ 2026-08-17: **tầng album**. Gắn theo từng ảnh chính xác hơn nhưng bắt người soạn khoanh mặt trong từng tấm — việc đó không bao giờ được làm đến nơi, mà nửa vời (ảnh này có tag, ảnh kia không) thì tệ hơn không có. Nâng lên tầng ảnh về sau **không phải đổi bảng nào**, chỉ thêm một bảng link thứ hai. |
| Q-134 | Advisor có bắt buộc phải có tài khoản Nemo12 không? | ✍️ 2026-08-17: **không** — `mentor_profiles.user_id` cho phép NULL. Cố vấn thường không ngồi trong cổng làm việc; bắt có tài khoản trước khi được nhắc tên là bắt tạo tài khoản ma, mà tài khoản ma thì hoặc lơ lửng mãi hoặc một ngày có người đăng nhập được vào nó. Hồ sơ **không cấp quyền gì** — quyền vẫn hoàn toàn do `role_assignments` quyết. |
| Q-135 | Trường chuyên: dựng bảng `schools` mới cho phần giới thiệu, hay mở rộng `target_schools` đang có? | ✍️ 2026-08-17: **mở rộng tại chỗ**. `exams.target_school_id` đã trỏ vào `target_schools` từ migration 0004; thêm bảng thứ hai cùng nghĩa là tạo ra hai danh sách trường, rồi tới ngày một đề thi gắn vào trường ở danh sách A trong khi trang giới thiệu đọc danh sách B — và không ai biết bên nào đúng. Cột thêm vào đúng tên [SDD-014](../architecture/sdd-014-exam-acquisition.md) §2 đã khai. Đổi lại, mọi dòng cũ do pipeline đề sinh ra mặc định `status='draft'` để không lên sóng khi chưa ai rà. |
| Q-136 | "Thêm/sửa thông tin của các student của từng trường" — là học sinh đang theo học, hay người được nêu tên công khai? | ✍️ 2026-08-17: **người được nêu tên công khai** (`school_students`, mặc định `kind='alumni'`), vì chính chỉ đạo nói phần công khai là "danh sách các cựu học sinh tiêu biểu". Đưa danh sách hơn nghìn học sinh đang học của một trường chuyên vào D1 rồi lên trang công khai là hồ sơ trẻ vị thành niên (REQ-SEC-04), không phải một tính năng marketing. `kind='current'` vẫn có cho em đang học được nêu tên vì đoạt giải, và em đó qua **cùng một cổng `consent`**. **Đảo ngược nếu** chủ dự án thực sự muốn quản lý danh sách lớp — nhưng khi đó nó phải là dữ liệu nội bộ có kiểm soát truy cập, không phải phần mở rộng của trang công khai. |
| Q-137 | Trang so sánh trường có nên có điểm tổng / thứ hạng không? | ✍️ 2026-08-17: **không**. Đặt các số cạnh nhau, mỗi ô kèm năm học và nguồn, ô thiếu để trống; người đọc tự kết luận. Hai chỉ số "số thành tích" và "số cựu học sinh tiêu biểu" là **số bản ghi Nemo12 đang có**, không phải thành tích thật của trường — trang nói rõ điều đó ngay dưới bảng, vì một trường ít bản ghi có thể chỉ là trường chưa ai nhập, và để người đọc hiểu nhầm con số đó thành chất lượng trường là tự tạo ra một bảng xếp hạng giả. |

### Đợt tiếp — Remediation Loop (SRC-506, 2026-08-22)

| Q | Câu hỏi | Quyết định ✍️ |
| --- | --- | --- |
| Q-138 | Cạnh tiên quyết XUYÊN CẤP LỚP (lớp 9 phụ thuộc lớp 6: bậc hai ← phân tích nhân tử ← quy tắc dấu; xác suất ← phân số) có đủ dày trong 1.109 cạnh hiện có không? Remediation Loop (SDD-002 §22) chỉ chẩn đoán xuống được tới đâu cạnh dày tới đó | ✍️ 2026-08-22 — **đã audit môn Toán** ([Audit #008](../quality/audits/2026-08-22.md)): cây B1–B5 ĐẠT (73/223 cạnh xuyên ≥3 lớp; 2 chuỗi chuẩn PASS đầy đủ tới lớp 1), nhưng (a) 17 unit đuôi lớp 10–12 chưa dính cạnh nào — chuỗi xác suất đứt ở `Đếm và tổ hợp`/`Quy tắc xác suất`, cần vá ~30–40 cạnh; (b) cây chủ đề SH·DS·HH (75 unit lớp 6–9, vùng luyện thi, đang ẩn) **0 cạnh** → Q-140. Toán là môn dày nhất (223/1.109); các môn khác chưa kiểm |
| Q-140 | Cây chủ đề SH·DS·HH (75 unit Toán lớp 6–9 từ D1, đang ẩn khỏi learner) không có cạnh tiên quyết nào. Soạn ~150–200 cạnh nội bộ + cạnh bắc cầu sang cây B, hay coi SH·DS·HH là VIEW ánh xạ vào unit cây B (nhiều unit trùng nội dung: `SH\|Phân số` ≈ `B1\|Phân số của một cái bánh`) và chỉ soạn bảng ánh xạ? | ✍️ 2026-08-22: **soạn cạnh thật** (phương án a), theo tiền lệ Tin học ([Audit #009](../quality/audits/2026-08-22-002.md) — 5 strand chủ đề ẩn của Tin đã có cạnh từ SRC-435 và chạy được; ánh xạ sẽ tạo hai cơ chế song song). **Đã thi hành TOÀN HỆ 2026-08-22** ([Audit #010](../quality/audits/2026-08-22-003.md)): Ngữ văn TV·DH·LV (124 cạnh), Toán SH·DS·HH (121 cạnh), Lý (296), Hoá (260), Anh (119), Sinh/IELTS/SAT (107) — toàn hệ 1.109 → 2.219 cạnh, mọi unit trống còn lại là gốc mở môn cố ý hoặc bản song sinh đa-module. Cạnh mới đều `status='auto'`, Coral rà dần. **Đảo ngược nếu** chủ dự án muốn hợp nhất hai cây thành một; khi đó cạnh đã soạn vẫn dùng lại được vì unit trùng nội dung sẽ kế thừa cạnh khi gộp |
| Q-139 | Evidence mức bước-làm-bài / loại lỗi (error taxonomy: sai khái niệm, sai kỹ thuật, sai số học, quên) — cần schema mới trong Evidence Registry hay dùng metadata hiện có? | Chưa quyết — v1 của Remediation Loop dùng probe per-node của Assessment Engine nên không bị chặn; taxonomy làm chẩn đoán sắc hơn, xếp sau pilot |

## Đợt 13 — Family Workspace trong Dolphin (SRC-584, 2026-08-25, Q-141..Q-150)

Mười câu **chủ dự án trả lời trực tiếp** trước khi viết [SDD-023](../architecture/sdd-023-family-workspace/index.md), nên đây là quyết định ✅ chứ không phải ✍️ tự quyết. Ghi lại cả phương án bị loại và lý do, để lần sau không ai mở lại cuộc thảo luận đã xong.

| Q | Câu hỏi | Trả lời ✅ 2026-08-25 |
| --- | --- | --- |
| Q-141 | Mentor xem được family nào? | **Tất cả**, giữ nguyên luật [SRC-037](../intake.md) đang áp cho learner: gate theo role ở backend, mỗi lượt chạm ghi `audit_log`. Loại phương án "chỉ family được giao" vì đội mentor nội bộ ~10 người và mentor trực thay ca phải mở được hồ sơ ngay, không chờ ai giao lại. Đổi lại, quyền xem rộng bắt buộc đi kèm audit — xem [SDD-023](../architecture/sdd-023-family-workspace/index.md) §8. |
| Q-142 | Bố/mẹ chưa có tài khoản thì lưu ở đâu? | **Bảng liên hệ riêng `family_contacts`, `user_id` cho phép NULL** — không sinh hàng `users` nào. Cùng lý do đã chốt ở Q-134 cho advisor: tài khoản ma thì hoặc lơ lửng mãi, hoặc một ngày có người đăng nhập được vào nó. Thêm một lý do cứng nữa: `users.email` đang là `UNIQUE NOT NULL`, mà phần lớn bố mẹ mentor gặp ngoài đời **chưa cho email** — muốn tạo `users` thì phải bịa email, tức là bịa khoá chính. |
| Q-143 | Ai bấm nút nối khi tài khoản thật đăng nhập? | **Hệ gợi ý, mentor duyệt.** Hệ dò trùng email hoặc số điện thoại rồi đề xuất "có thể là người này"; máy **không bao giờ tự gộp**. Loại phương án tự động theo email vì một lần gõ nhầm email là gắn hồ sơ nhà này vào nhà khác, và đây là hồ sơ trẻ em. |
| Q-144 | Mentor sửa được gì trên hồ sơ người **đã có tài khoản**? | **Không đè.** Tên và ảnh do chính chủ đặt thì giữ nguyên; mentor ghi vào **lớp dữ liệu của mentor** (số điện thoại, địa chỉ, nghề nghiệp, ghi chú). Hai lớp hiện cạnh nhau trên màn hình, không bên nào xoá bên nào. Đây là cùng một nguyên tắc đã dùng khi bố mẹ và con khai khác nhau ([WF-19](../workflows/two-door-onboarding.md) §6): giữ cả hai kèm tác giả, không chọn hộ. |
| Q-145 | Ghi chú về family: ai đọc được? | **Mặc định `internal_staff`, khi ghi chọn nâng lên được** (`mentor_team` hoặc cho gia đình thấy). Dùng lại đúng bảng `interactions` và đúng thang `visibility` của ghi chú learner đang chạy — thêm một khái niệm "ô nhắn riêng" nữa là thêm một chỗ nữa để quên mất mình đang viết cho ai. |
| Q-146 | Ảnh gia đình để mức riêng tư nào? | **`internal`, không bao giờ tự lên trang công khai.** Đây là ảnh trẻ em. Muốn đưa lên nemo12.com thì phải chủ động chuyển sang album công khai của [SDD-019](../architecture/sdd-019-mentor-albums.md), là một hành động riêng có chỗ ghi đồng ý. Loại phương án "chọn từng ảnh khi tải lên" vì một lần bấm nhầm trong lúc tải hàng loạt là ảnh trẻ ra trang công khai, mà việc đó không thu lại được. |
| Q-147 | Vị trí chụp ảnh lưu kiểu gì? | **Một ô chữ tự do** ("Nhà văn hoá Thanh Xuân", "buổi offline Ams"). Đủ để nhớ ra, không cần thư viện bản đồ. Loại phương án đọc GPS từ EXIF: toạ độ gắn với một đứa trẻ là dữ liệu nhạy cảm hơn hẳn một dòng chữ, và [SDD-009](../architecture/sdd-009-media.md) §5 vốn đã yêu cầu xoá EXIF chứ không phải đọc nó ra. |
| Q-148 | Lưu những thông tin cá nhân nào? | **Cả bốn nhóm**: số điện thoại/Zalo · nghề nghiệp, nơi làm việc của bố mẹ · địa chỉ nhà, quận huyện · trường đang học và lớp của con. Ba nhóm đầu chưa có chỗ chứa nào trong hệ; nhóm thứ tư đã có `learners.current_school` và `grade` nhưng mentor chưa sửa được, nên là mở quyền chứ không phải thêm cột. |
| Q-149 | Con do mentor tạo là gì trong hệ? | **Learner thật, `status='invited'`** — dùng đúng bảng `learners` đang có. Hồ sơ sống độc lập với việc con đã vào hệ hay chưa (đúng [WF-19](../workflows/two-door-onboarding.md) §4), và khi con đăng nhập thì mọi thứ mentor khai đã sẵn ở đó, không phải chuyển đổi thủ công. |
| Q-150 | Mentor có được xoá hẳn không? | **Lưu trữ, không xoá hẳn.** Chuyển sang `archived`, biết ai làm lúc nào. Xoá vĩnh viễn là việc của luồng quyền riêng tư trẻ em đã có (REQ-SEC-04), không phải một nút trong cổng mentor — một nút xoá thật trong màn hình dùng hằng ngày sớm muộn cũng bị bấm nhầm. |
| Q-151 | Big Idea · Essential Question · lesson của Unit trên nemo12.com lấy từ đâu? | ✅ **Đã trả lời 2026-09-03 (SRC-671, SRC-672).** Chủ dự án tự soạn 15 khoá cho bố mẹ kèm Big Idea và Essential Question, và **gỡ luôn cổng QG-014** vốn cấm soạn nội dung trong phiên. Nội dung soạn tay nay hợp lệ, chỉ cần ghi rõ nguồn gốc: dữ liệu mang `provenance: "owner"` thay cho một `content_runs.id`, nên đọc là biết ngay nó không ra từ xưởng. Dựng workflow tầng Unit vẫn đáng làm để nội dung sau này sinh được hàng loạt, nhưng không còn là điều kiện chặn. |

### ✍️ Q-151 — Nối một người vào tài khoản đã thuộc gia đình khác thì KHÔNG gộp hai nhà (2026-08-25)

**Câu hỏi:** [Q-143](./index.md) chốt "hệ gợi ý, mentor duyệt". Nhưng trường hợp hay gặp nhất lại chưa được trả lời: phụ huynh **tự đăng ký trên marlins trước** thì luồng onboarding đã sinh ra một `families` của riêng họ. Mentor nối liên hệ trong nhà mentor dựng vào đúng tài khoản đó → hệ thống có hai gia đình cho một hộ. Gộp hay để yên?

**Quyết định (✍️ AI tự quyết):** **vẫn nối, và cảnh báo rõ, nhưng KHÔNG gộp.** Liên hệ được gắn `user_id`, giao diện hiện một dòng "người này đang thuộc một gia đình khác trong hệ, hai nhà chưa được gộp". Lý do:

1. Gộp hai `families` không phải đổi một khoá — nó là chuyển `learners`, `guardians`, `family_members`, evidence học tập, mục tiêu thi và lịch sử mastery sang khoá mới. Làm nửa vời thì mất tiến độ học của một đứa trẻ mà màn hình trông như chỉ đổi tên, đúng loại lỗi đã xảy ra ở [SRC-189](../intake.md) với `INSERT OR REPLACE`.
2. Từ chối nối hẳn cũng sai: khi đó mentor mất luôn khả năng biết "người tôi đang ghi chú chính là tài khoản này", tức là mất đúng thứ tính năng sinh ra để làm.
3. Nói thẳng ra màn hình thì trạng thái nửa vời **có người biết**, và gộp về sau vẫn làm được vì không có dữ liệu nào bị mất.

**Điều kiện đảo ngược:** khi số nhà trùng vượt quá mức đếm tay được, làm một đợt riêng cho thao tác gộp — có bản xem trước cái gì sẽ chuyển, và có đường lùi.

**Trace:** [SDD-023](../architecture/sdd-023-family-workspace/index.md) §4, §10 · Q-143.

### Q-152 — Tên khái niệm tiếng Anh trên bề mặt learner: dạy trước, hay bỏ? (2026-09-18, SRC-829)

**Xung đột giữa hai chỉ đạo, cả hai đều còn hiệu lực:**

* **2026-09-16** (ghi trong `apps/web/src/site/subjectCopy.ts` và `GoalPages.tsx`): mỗi bước mang HAI
  tên — tiếng Việt để hiểu ngay, và tên tiếng Anh là **tên gọi của bước trong hệ khái niệm Nemo12**
  (Diagnosis · Competency Gap · Learning Plan · Readiness). Lý do đã ghi: *"người học sẽ gặp lại đúng
  những chữ ấy trong app, nên gọi đúng tên ngay từ đây là dạy trước một từ vựng họ sắp cần."*
* **2026-09-18** (SRC-829, [Cần nói gì với learner](../product/ielts-learner-messaging.md) §0): *"Không
  nói với học viên bằng ngôn ngữ của product"* — Learner Model, Evidence Registry, Competency Map,
  Readiness Model là từ vựng nội bộ.

**Hiện trạng đo được** (`apps/web/src` + `apps/learn/src`, 2026-09-18): Evidence 20 · Readiness 19 ·
Diagnosis 17 · Learning Plan 12 · Learner Model 11 · Competency Gap 11. Phần lớn nằm ở trang công khai
IELTS (`IeltsLanding` · `IeltsTuition` · `ieltsJourneySteps` · `packages.ts` · `CorePages`), tức là
đúng những bề mặt SRC-829 nói tới.

**Ba phương án, và giá của mỗi cái:**

1. **Giữ nguyên song ngữ** — SRC-829 chỉ áp cho chữ MỚI và cho các câu quảng bá, không áp cho nhãn
   khái niệm có kèm tiếng Việt. Rẻ nhất, nhưng để lại mâu thuẫn trong tài liệu: người viết sau sẽ
   không biết dựa vào trang nào.
2. **Gỡ hết tên tiếng Anh khỏi bề mặt learner** — đúng tinh thần SRC-829, nhưng mất lợi ích "dạy
   trước từ vựng", và phải sửa khoảng 90 chỗ ở 6+ file, kéo theo chữ trong HTML tĩnh dùng cho SEO.
3. **Vạch ranh giới theo VAI TRÒ của chữ** (nghiêng về cái này): tên tiếng Anh được phép khi nó là
   **nhãn của một bước có tiếng Việt đứng trước** (`Lộ trình / Learning Plan`) — vì đúng là learner sẽ
   gặp lại nó trong app; **cấm** khi nó nằm trong **câu văn bán hàng** (*"Từ đó Nemo12 xây dựng Learner
   Model và một bản đồ ban đầu…"* — `packages.ts:67`), vì ở đó nó không dạy gì, chỉ làm câu khó đọc.

**✅ Chốt 2026-09-18 (chủ dự án): phương án 3, và sửa `packages.ts` ngay.**

Luật thành hình: **tên tiếng Anh được phép khi nó là NHÃN có tiếng Việt đứng trước**
(`Hồ sơ năng lực (Learner Profile)`, `Lộ trình / Learning Plan`) — vì learner sẽ gặp lại đúng chữ ấy
trong app, nên nói trước là dạy trước. **Cấm khi nó nằm trong CÂU VĂN** — ở đó nó không dạy gì, chỉ
làm câu khó đọc. Hai chỉ đạo 2026-09-16 và SRC-829 vì thế không mâu thuẫn nữa: cái trước nói về nhãn,
cái sau nói về câu.

Đã áp vào `apps/web/src/packages.ts` (22 chuỗi; file này về sau chuyển từ hai bản thành
`packages/catalog` — SRC-867): mọi câu văn chuyển sang tiếng Việt; bốn chỗ còn tên
tiếng Anh đều là nhãn có tiếng Việt đứng trước. Danh sách nội dung khoá Marlin Mind (`Learning Science`,
`Spaced Practice`, `Zone of Proximal Development`…) **giữ nguyên**: đó là tên các lĩnh vực khoa học mà
khoá dạy, không phải từ vựng sản phẩm của Nemo12 — nằm ngoài phạm vi câu hỏi này.

Đợt hai (cùng ngày) rà nốt các trang IELTS công khai — `IeltsLanding` (5) · `IeltsTuition` (3) ·
`routes.ts` (6, bản HTML tĩnh cho SEO, phải khớp từng câu với bản React) · `CorePages` (5) ·
`ieltsJourneySteps` (1). Hai điều đáng ghi:

* Trường `en:` của `ieltsJourneySteps` (Diagnosis · Competency Gap · Learning Plan · Readiness)
  **giữ nguyên** — đó chính là loại nhãn mà chỉ đạo 2026-09-16 bảo vệ, có `title` tiếng Việt đứng cạnh.
* Sáu thẻ "Nemo12 vận hành thế nào" (`CorePages`) đổi **cả bộ** sang tiếng Việt trước, tiếng Anh trong
  ngoặc, chứ không sửa mỗi thẻ *Learner Model*: sửa một thẻ trong một bộ sáu thẻ song song thì cái lẻ
  loi ấy đọc như lỗi chính tả.

Đợt ba (cùng ngày) rà SAT và AP. **Kết quả đáng chú ý: các trang SAT và AP tự thân đã sạch** —
`SatLearner` · `SatTuition` · `ApLearner` · `students.ts` không có chỗ nào phạm luật; thứ duy nhất
khớp lưới tìm là đường dẫn `/sat/learner/...`, mà slug thì giữ nguyên (luật slug công khai ở
[coding-conventions](../engineering/coding-conventions.md)). Lý do chúng sạch: hai trang này viết sau,
theo giọng "việc bạn đang cần làm" chứ không theo giọng mô tả hệ thống.

Vi phạm còn lại nằm ở hai bề mặt DÙNG CHUNG, không thuộc riêng kỳ thi nào:

| Chỗ | Sửa | Ghi chú |
| --- | --- | --- |
| `education.ts` | 6 | "một learner tiến lên khi có bằng chứng…" → "một **học sinh** tiến lên…" |
| `EducationPages.tsx` | 2 | vòng lặp năm ô: "Bằng chứng về learner" → "Bằng chứng về **người học**"; "Learning Experience" → "Trải nghiệm học (Learning Experience)" |
| `jsonld.ts` | 1 | mô tả JSON-LD toàn site — máy tìm kiếm đọc đúng câu này |

Đợt bốn (2026-09-19) rà marlins — bề mặt của bố mẹ:

| Chỗ | Sửa | Ghi chú |
| --- | --- | --- |
| `apps/marlins/src/packages.ts` (trước đây; nay là `packages/catalog`) | 25 | **Bản thứ HAI của cùng nội dung gói học.** Đợt một chỉ sửa `apps/web`, nên bố mẹ trên marlins.nemo12.com vẫn đọc y nguyên chữ cũ suốt từ đó |
| `CompetencyViews.tsx` | 1 | vế tiếng Việt của một nhãn song ngữ: "Competency khác, được ảnh hưởng ké" → "**Năng lực** khác, được ảnh hưởng ké" |

**Hai file `packages.ts` là một rủi ro có thật, không phải chuyện lặt vặt.** Cả hai mở đầu bằng đúng
dòng *"nguồn duy nhất cho trang công khai (SRC-551)"* — trong khi có hai bản. Bản marlins còn thêm
hai trường (`units`, `retired`) nên không phải bản chép chết; chúng đã rẽ nhánh thật. Sửa một bên là
lặng lẽ để bên kia nói chuyện cũ, và lần này đã xảy ra đúng như vậy.

**Sạch sẵn, không phải sửa:** `MasteryMap` · `Metrics` · `CompetencyViews` đều là cặp `en ? EN : VI`
và vế tiếng Việt viết đúng. Sách trong Thư viện Marlins và `parentCoursesData.ts` nằm ngoài phạm vi:
cái sau là **dữ liệu sinh từ D1**, có dòng "ĐỪNG SỬA TAY" ngay đầu file — sửa phải đi qua Coral.

**Hai việc phát sinh, đã có quyết định của chủ dự án (2026-09-19):**

1. **`MarlinPains.tsx` là NGOẠI LỆ CÓ PHẠM VI — giữ nguyên, đừng ai sửa.** Chỉ đạo 2026-09-12 ghi
   ngay trong file: *"câu tiếng Việt, thuật ngữ giữ nguyên tiếng Anh (Autonomy, JTBD, Transferable
   Skills)"*, và chữ trên trang là **bản chủ dự án tự viết** cho một buổi trò chuyện với phụ huynh.
   Chủ dự án chốt giữ nguyên. Phạm vi ngoại lệ: **một trang** (`/marlin-pains` và
   `/marlin-pains/{slug}`), cho **một sự kiện**, gồm năm câu hỏi của buổi trò chuyện và danh sách
   bảy phần của chữ *autonomy*. Ngoài trang đó, luật §0 vẫn áp bình thường.

   Lý do ghi phạm vi rõ đến vậy: một ngoại lệ không có biên là một ngoại lệ sẽ lan. Và lý do ghi ở
   đây thay vì chỉ trong file: phiên sau rà theo Q-152 sẽ thấy `developmental needs`,
   `Student / Learner Portrait`, `Autonomous Learner`, `behavior`, `capability` nằm giữa câu tiếng
   Việt và tưởng đó là sót — nó không sót, nó là chữ của chủ dự án.

2. **54 tên unit khoá bố mẹ sẽ được dịch** (`parentCoursesData.ts`): cả 54 unit có `vi` trùng `en`,
   nên bố mẹ đọc bản tiếng Việt vẫn thấy *"From Student to Learner"*, *"What Is a Competency?"*.
   Trên tổng **897 cặp song ngữ** thì chỉ đúng tầng unit hở — một tầng bị bỏ quên khi dịch, không
   phải quyết định giữ tên riêng (trường `name` của Course mới là thứ có ghi *"Tên riêng, không
   dịch"*). Chủ dự án chốt dịch. Đường đi: bản dịch được duyệt → nạp D1 qua Coral/seed theo
   luật deploy (GitHub Actions, không wrangler thẳng) → `node scripts/curriculum/pull-parent-courses.mjs` → commit. **Không
   sửa tay `parentCoursesData.ts`** — đầu file có dòng "ĐỪNG SỬA TAY".

Đợt năm (2026-09-19) rà mentors (cổng Dolphin) — **gần như không có gì để sửa, và lý do đáng ghi**:
cổng này đã chuyển sang **tiếng Anh toàn phần** theo SRC-586, nên Q-152 không áp cho phần lớn bề mặt
của nó. Luật nói về *từ vựng sản phẩm nằm trong câu tiếng Việt*; một màn hình tiếng Anh từ đầu đến
cuối thì không có câu tiếng Việt nào để lọt.

Chỗ Q-152 thật sự áp là **vế tiếng Việt trong `apps/mentors/src/lang.tsx`** (catalog song ngữ cho
Family Workspace và báo cáo IELTS). Quét toàn bộ **390 cặp dịch**, chỉ ba chỗ còn tiếng Anh trong vế
tiếng Việt:

| Khoá | Trước | Sau |
| --- | --- | --- |
| `Dashboards` | "Dashboard" | "Bảng theo dõi" (cách gọi đã dùng ở web và marlins) |
| `Average mastery` | "Mastery trung bình" | "Mức thành thạo trung bình" |
| `Mastery` | "Mastery" | "Mức thành thạo" |

Ba chỗ này nằm cạnh những dòng đã dịch chuẩn ("Đang chững lại", "Chưa ai chăm"), nên chúng là sót
chứ không phải chọn. `"← Danh sách learner"` trong `App.tsx` là **chú thích mã**, không phải chữ
người dùng đọc — không đụng.

Đợt sáu (2026-09-19) rà coral và admin — **không sửa dòng nào, và đó là kết luận chứ không phải bỏ dở.**

Hai app này là **bàn điều khiển của người vận hành**, không phải bề mặt của learner hay phụ huynh.
Q-152 sinh ra để chặn *từ vựng sản phẩm rò vào câu tiếng Việt nói với người học*; ở đây không có
người học nào đọc. Đúng hơn: bảng "nội bộ ↔ đối ngoại" ở
[§11 trang messaging](../product/ielts-learner-messaging.md) nói cột TRÁI là thứ dùng nội bộ — coral và
admin chính là cột trái.

Và cả hai đã có luật ngôn ngữ riêng, ghi từ trước, cố ý ngược với luật đối ngoại:

* **admin** — SRC-143, ghi ngay đầu `apps/admin/src/modelGuide.ts`: *"nhãn giao diện giữ tiếng Anh,
  còn phần GIẢI THÍCH viết tiếng Việt … Tên model/keyword kỹ thuật (Learner Model, mastery,
  evidence, blueprint…) giữ nguyên tiếng Anh cho khớp với phần còn lại."*
* **coral** — SRC-042: song ngữ có nút VI/EN, và vế tiếng Việt cố ý giữ nhãn kỹ thuật
  (`Prerequisite graph`, `Blueprint`, `Data Quality`, `Coverage theo môn`).

Dịch chúng sẽ **làm hỏng đúng công dụng của chúng**: người vận hành đọc màn hình rồi đối chiếu ngay
với `docs/reference/api.md`, với tên bảng D1 và với tên model trong `modules/models/*.ts`. Một màn
hình gọi "mức thành thạo" trong khi API trả `mastery` là bắt người đọc dịch ngược mỗi lần tra.

Đã kiểm thêm một khả năng dễ bỏ sót: **hai app này có giữ chữ nào sẽ đến tay learner hay phụ huynh
không** — không. `admin/src/pages/Emails.tsx` chỉ là bảng theo dõi và danh sách chặn; thân thư nằm ở
`workers/api/src/modules/email/`. Coral soạn *dữ liệu* nội dung, và dữ liệu ấy đi qua chuẩn nội dung
riêng, không qua luật này.

**Giữ nguyên có chủ ý** ở `education.ts`: tên các khung và trường phái đã công bố (Building 21
Student/Teacher/Leadership Competency Framework, Competency-Based Education, Formative Assessment,
Mastery Learning, Deliberate Practice…), và sáu tầng khung năng lực (Domain · Competency · Skill ·
Mastery Level · Indicator · Rubric). Đó là **tên riêng của tài liệu gốc**, có dòng "Nguyên văn, không
sửa" ngay trong file — dịch chúng là làm sai trích dẫn, không phải làm trong sáng tiếng Việt. Cùng lý
do với danh sách nội dung khoá Marlin Mind ở đợt một.

### Q-153 — Bao nhiêu cổng đúng ngay lần đầu thì coi là "đã hiểu trang này"? (2026-09-18, SRC-836)

SDD-039 chốt cách một trang nhiều nội dung bắt learner trả bằng chứng: mỗi mẩu một cổng nhỏ, sai thì
chỉ lại chỗ trong bài rồi cho trả lời lại. Sổ ghi hai con số cho mỗi trang — số cổng, và số cổng
**đúng ngay lần đầu**.

Con số thứ hai là thứ Learner Model đọc, nên nó cần một ngưỡng: từ mấy phần trở lên thì hệ được phép
coi learner đã hiểu trang ấy, thay vì chỉ đã đi hết trang ấy.

* **5/7 (khoảng 70%)** — cùng ngưỡng với các bằng chứng luyện tập đang dùng, nên một con số nghĩa
  giống nhau ở mọi chỗ.
* **Tất cả trừ một** — nghiêm hơn, hợp với việc cổng hỏi về mẩu VỪA đọc (đọc kỹ thì gần như phải đúng).
* **Không đặt ngưỡng nào** — chỉ lưu hai con số, để tầng model tự quyết sau khi có dữ liệu thật.

Phương án thứ ba là phương án an toàn nhất lúc chưa có một trang nào chạy thật: đặt ngưỡng trước khi
nhìn thấy learner làm là đoán. Chờ chủ dự án chốt.

### Q-154..Q-157 - Mở khoá tuần tự kỹ năng IELTS (19.09.2026, SRC-859)

Bốn câu phải chốt trước khi viết mã cho [SDD-038 §58](../architecture/sdd-038/membership-unlock.md). Cả bốn
đều là quyết định sản phẩm, không phải kỹ thuật, nên phiên không tự trả lời.

**Q-154 - Hết 30 ngày dùng thử thì learner thấy gì?** Ba phương án: (a) mất hẳn quyền vào sân luyện,
chỉ còn mục lục và báo cáo đã có; (b) Reading ở lại mở vĩnh viễn, ba kỹ năng kia đóng; (c) giữ nguyên
mọi thứ đã mở, chỉ ngừng mở thêm. Phương án (b) hợp với câu "Learner được phép dùng tính năng READING
đầu tiên" - Reading là cửa vào chứ không phải một phần của gói trả tiền - nhưng đây là ranh giới thu
tiền, chỉ chủ dự án đặt được.

**Q-155 - "Làm đủ và trọn vẹn" Reading là bao nhiêu?** Cần ba con số: bậc tối thiểu mỗi năng lực nhỏ
trên thang năm bậc (§5i), số năng lực nhỏ phải đạt (tất cả, hay đa số), và số buổi khác ngày tối
thiểu. Đặt ngưỡng trước khi nhìn learner thật là đoán, nhưng để trống thì không có cổng nào, nên
cần một con số tạm mà chủ dự án đồng ý sửa lại sau đợt đầu.

**Q-156 - Dolphin có được khoá lại thứ đã mở không?** Mở sớm thì rõ là có. Chiều ngược lại có ích khi
learner đi quá nhanh và học rỗng, nhưng đó là nút lấy lại thứ đã cho một đứa trẻ, và nó cần một câu
trả lời trước khi có nút, không phải sau.

**Q-157 - Thứ tự ba kỹ năng sau Reading, và khoảng cách bao nhiêu ngày?** Reading mở trước đã chốt.
Còn lại là Listening → Writing → Speaking (từ nhận vào trước, sản sinh sau), hay xen kẽ nhận/sản sinh
để learner không chờ ba tháng mới được viết câu nào. Khoảng cách mặc định "mỗi tháng một kỹ năng"
lấy từ chính chỉ đạo, nhưng nó là giá trị khởi đầu của một bảng dữ liệu, không phải luật.
