---
url: https://docs.nemo12.com/product/prd-001/req/family.md
description: >-
  Bảng REQ của PRD-001 cho nhóm PAR, MEN, DOR, ANC, POR: mỗi REQ một dòng với ưu
  tiên, nguồn, SDD, QG và trạng thái.
---

# PRD-001 · REQ: Gia đình và mentor: Marlins, Dolphins, Dory, Anchor, Portrait

Một mảnh của [danh mục REQ PRD-001](../../prd-001-nemo12-platform.md), gồm REQ-PAR, REQ-MEN, REQ-DOR, REQ-ANC, REQ-POR. 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-coverage.md).

### REQ-PAR — Marlins (app: marlins)

| ID | Yêu cầu | Ưu tiên | Nguồn | SDD | QG | Status |
| --- | --- | --- | --- | --- | --- | --- |
| REQ-PAR-01 | "Giúp tôi hiểu con": giải thích trạng thái + nguyên nhân bằng evidence | M | SRC-006 Job1 | SDD-002 §13 | QG-005 | ✔ |
| REQ-PAR-02 | Actionable recommendation cho parent (tối nay/tuần này/tháng này) | M | SRC-006 Job2 | SDD-002 §13 | QG-005 | ✔ |
| REQ-PAR-03 | On-track view: Goal → Current → Gap → Trajectory → Expected | M | SRC-006 Job3 | SDD-008 §5 | QG-005 | ✔ |
| REQ-PAR-04 | Chống intervention error: recommendation nêu rõ cả "không nên làm gì" + trade-off | M | SRC-006 Job4, SRC-011 §8 | SDD-002 §13 | QG-005 | ✔ |
| REQ-PAR-05 | Parent Model (evidence + inferred tendency, không label phán xét) + parent observation/upload; **niềm tin định kỳ theo môn** do bố mẹ khai (mức lo lắng, điểm hình dung khi con đi thi thật, cảm nhận "đang hổng" hay "học tự tin", có tin đủ điểm đỗ không) lưu **tách khỏi** Evidence Registry và hiển thị cạnh ước tính của hệ để đối chiếu — màn `marlins #/child/{id}/beliefs` | M | SRC-003 §4, FEAT-030/031, SRC-051 | SDD-002 §4 | QG-005 | ✔ |
| REQ-PAR-06 | Depth trade-off explanation (target depth, current, cost để nâng) | M | SRC-011 §8 | SDD-002 §12 | QG-005 | ✔ |
| REQ-PAR-10 | Parent observations (ghi quan sát) → evidence + Parent recommendation "tuần này nên làm gì" kèm anti-intervention-error ("chưa cần thêm lớp") | M | SRC-006 Job4/5 | WF-12, SDD-002 §13 | QG-005 | ✔ |
| REQ-PAR-07 | Shared understanding layer: parent–learner–mentor nhìn cùng evidence | M | SRC-006 Job5 | SDD-005 §7 | QG-005 | ✔ |
| REQ-PAR-09 | Marlin xem **báo cáo học tập của con** tại `marlins #/child/{id}/report`: readiness, tiến độ theo school, toàn cảnh môn→area→node, thời gian học. Đây là **mặt Marlins của REQ-VIS-07/08** — dùng lại cùng view + cùng API, cấm dựng bản báo cáo thứ hai cho phụ huynh | M | SRC-019 | SDD-008 §2-6 | QG-005/008 | ✔ |
| REQ-PAR-08 | Member-intelligence-style: evidence gaps → adaptive questions cho parent | S | FEAT-033, Q-040 | — | — | ⏳ |
| REQ-PAR-11 | Weekly plan cho Marlin: khuyến nghị → 2-3 nhiệm vụ có hạn trong tuần, đánh dấu hoàn thành | M | parent-jtbd JTBD-P3 | WF-12 | QG-005 | 🔵 |
| REQ-PAR-13 | Marlin duyệt các school + Whale (view mode) từ cổng phụ huynh | M | SRC-027, SRC-125, SRC-126 | SDD-011 | QG-007 | ✔ |
| REQ-PAR-12 | Parent digest định kỳ (tuần) qua notification/email: thay đổi đáng chú ý + 1 việc nên làm | S | parent-jtbd JTBD-P1/P3 | SDD-005 §5 | QG-009 | ⏳ |
| REQ-PAR-14 | Marlin **khai tự nhiên** (lịch thi, mục tiêu, "con bị ốm", "con sợ hình") → Context Event (source=parent .60) / Goal entry; định tuyến observation {skill evidence | context event | cả hai}; ngừng dual-write node-rỗng | M | SRC-032 | SDD-002 §5b, §13, WF-15 | QG-005/010 | ✔ |
| REQ-PAR-15 | **Bố mẹ xem đúng Learning Plan của con** (không có bản riêng) và **khai thêm thông tin** cho Planning Engine; mọi lời khai ghi rõ ai khai (con hay bố mẹ) | M | SRC-107 | SDD-007 §6b | QG-008 | ✔ |
| REQ-PAR-16 | **Sự kiện cộng đồng** ở `marlins #/events`: danh sách buổi **sắp diễn ra** (buổi đã diễn ra không nằm trong danh sách mặc định), mỗi buổi một URL riêng `#/events/{id}` mở ra mục tiêu · dành cho ai · lịch trình · địa điểm · chi phí · người đã đăng ký; **giữ chỗ và bỏ chỗ**, và backend từ chối đăng ký khi buổi đã huỷ, đã tới giờ bắt đầu, hoặc đủ số chỗ. Danh sách người đăng ký chỉ hiện tên, không hiện email hay điện thoại. Đây là mảng đầu tiên của Marlins **không nói về một đứa con cụ thể**, nên quyền là quyền trên **chỗ ngồi của chính mình**, không đi qua `resolveLearnerAccess` | M | SRC-122, SRC-139, SRC-709 | SDD-018 | QG-003/004/007/008 | ✔ |
| REQ-PAR-17 | **Bố mẹ luôn biết việc cần làm tiếp**: sau khi khai xong hồ sơ con, `marlins #/` hiện **đúng một việc kế tiếp** cho mỗi con (nhãn + vì sao đáng làm + nút đi thẳng tới màn đó) kèm tiến độ x/y; trang `#/next-steps` giữ **toàn bộ** danh sách để bố mẹ bận rồi quay lại vẫn biết còn thiếu gì. Trạng thái **suy từ dữ liệu thật** (hồ sơ, lời mời, Portrait, mục tiêu, cảm nhận, evidence đầu tiên), KHÔNG có bảng tiến độ riêng — làm xong ở màn nào thì việc tự tắt. Chưa có con nào thì trả đúng một việc: mở wizard `#/bat-dau` | M | SRC-205, SRC-209 | WF-19 §4b | QG-005/008 | ✔ |
| REQ-PAR-19 | **Chứng chỉ của con trên marlins** (SRC-1331): trang của con có cụm "Chứng chỉ của con" (đếm đã có / sắp có), trang `/child/{id}/certificates` liệt kê chứng chỉ đã có và sắp có kèm phần còn lại, `/child/{id}/certificates/{courseId}` mở chứng chỉ in được. Chỉ đọc; quyền đi qua `resolveLearnerAccess`, nên bố mẹ chỉ thấy con trong gia đình mình. Cùng một luật suy ra như REQ-LRN-49 | M | SRC-1331 | [SDD-004](../../../architecture/sdd-004-curriculum-storage.md) §20 | QG-005/008 | ✅ đã dựng 10.10.2026 |

### REQ-MEN — Dolphins (app: mentors)

| ID | Yêu cầu | Ưu tiên | Nguồn | SDD | QG | Status |
| --- | --- | --- | --- | --- | --- | --- |
| REQ-MEN-01 | Dolphin portal **dolphin.nemo12.com**: mọi Dolphin (role mentor, nội bộ — Q-009) xem được **mọi family, mọi Nemo** — gate theo role ở backend + audit log; không còn giới hạn assignment (mentor_assignments giữ làm phân công theo dõi chính). Đường vào nghề của một Dolphin (cấp quyền → đăng nhập → phiên đầu tiên) đặc tả tại [WF-18](../../../workflows/mentor-onboarding.md) | M | SRC-002 §13, SRC-021, SRC-037 | WF-06m, WF-18, SDD-001 §6 | QG-008 | ✔ |
| REQ-MEN-02 | Mentor notes với visibility (internal_staff / mentor_team / learner-visible) | M | SRC-007 | SDD-005 §4 | QG-008 | ✔ |
| REQ-MEN-03 | Mentor interaction ghi thành evidence (MentorInteractionRecorded) | M | SRC-002 §2.3 | SDD-002 §5 | QG-005 | ✔ |
| REQ-MEN-06 | Dolphin portal: dashboard theo sát learners được giao (readiness, hoạt động gần đây, gap) + drill vào cockpit/overview/progress từng learner | M | SRC-021 | WF-06m, SDD-008 | QG-008 | ✔ |
| REQ-MEN-07 | **Hồ sơ Mentor & Advisor** quản lý trong Dolphin: tên, ảnh chân dung, một dòng giới thiệu, nơi học/làm hiện tại, môn phụ trách, tiểu sử **ba bản** (gốc · dành cho bố mẹ · dành cho học sinh), vòng đời `draft → published → archived`. Advisor **không bắt buộc có tài khoản** (`user_id` NULL) vì cố vấn thường không dùng cổng làm việc | M | SRC-201 | [SDD-019](../../../architecture/sdd-019-mentor-albums.md) §3 | QG-004/007/008 | ✔ |
| REQ-MEN-08 | **Bằng chứng cựu học sinh trường chuyên** là dữ liệu có cấu trúc — trường · lớp chuyên · năm tốt nghiệp · cờ xác minh (ai xác minh, lúc nào, dựa vào gì) — **không phải câu văn tự do**; hồ sơ thiếu bất kỳ mảnh nào hoặc chưa xác minh thì **không publish được** (API chặn, không chỉ nhắc trên UI); con số công khai ("N mentor · N cựu học sinh chuyên · N trường") **đếm từ dữ liệu** chứ không viết cứng trong giao diện; ghi chú xác minh là **nội bộ**, không lọt ra API công khai | M | SRC-201 | [SDD-019](../../../architecture/sdd-019-mentor-albums.md) §4 | QG-004/008 | ✔ |
| REQ-MEN-09 | **Photo albums** quản lý trong Dolphin: album (slug, ảnh bìa, thứ tự, vòng đời, gắn mentor/advisor có mặt trong album) + ảnh trong album (alt text **bắt buộc**, chú thích, thứ tự); tải ảnh lên trực tiếp từ cổng | M | SRC-201 | [SDD-019](../../../architecture/sdd-019-mentor-albums.md) §5 | QG-004/007/008 | ✔ |
| REQ-MEN-11 | **Family Workspace trong Dolphin**: mentor xem được danh sách **từng gia đình** (bố mẹ + các con) và mở ra hồ sơ một nhà; mentor **tự tạo được gia đình** kể cả khi **thiếu thông tin** (một liên hệ chỉ cần một trong ba: họ tên, điện thoại, email). Con do mentor tạo là `learners` thật ở `status='invited'` (Q-149). Quyền xem là **mọi mentor xem mọi nhà** như REQ-MEN-01, và **mỗi lượt mở một nhà ghi một dòng `audit_log`** (Q-141) | M | SRC-584 | [SDD-023](../../../architecture/sdd-023-family-workspace/index.md) §2-3, §8 | QG-004/008 | ✔ |
| REQ-MEN-12 | **Người chưa có tài khoản vẫn có hồ sơ**: bảng liên hệ riêng với `user_id` cho phép NULL, **không sinh hàng `users` nào** (Q-142); lưu điện thoại/Zalo, nghề nghiệp, nơi làm việc, địa chỉ, quận huyện (Q-148). Khi tài khoản thật đăng nhập, hệ **gợi ý** nối theo trùng email hoặc theo việc người đó đã ở trong nhà này, **mentor bấm duyệt** — máy không tự gộp (Q-143). Sau khi nối, mentor **không đè** được tên và ảnh do chính chủ đặt; hai lớp dữ liệu hiện cạnh nhau (Q-144) | M | SRC-584 | [SDD-023](../../../architecture/sdd-023-family-workspace/index.md) §3-4 | QG-004/008 | ✔ |
| REQ-MEN-13 | **Ghi chú theo gia đình**: dùng lại `interactions` với `target_type='family'` và đúng thang `visibility` của ghi chú learner, mặc định `internal_staff`, nâng lên được khi ghi (Q-145). Không dựng bảng note thứ hai | M | SRC-584 | [SDD-023](../../../architecture/sdd-023-family-workspace/index.md) §5 | QG-008 | ✔ |
| REQ-MEN-14 | **Ảnh của gia đình**: mỗi ảnh có **caption · description · thời gian chụp · vị trí** là bốn cột riêng; `taken_at` do người nhập khai (không đọc EXIF), `location` là **ô chữ tự do** chứ không phải toạ độ (Q-147). Ảnh luôn ở `media.visibility='internal'`, **không có tham số nào trong luồng này đặt được `public`** (Q-146); `GET /v1/media/{id}` với ảnh internal đòi phiên đăng nhập + vai nội bộ và trả `Cache-Control: private, no-store`. Lưu trữ thay cho xoá (Q-150) | M | SRC-584 | [SDD-023](../../../architecture/sdd-023-family-workspace/index.md) §6-7 | QG-004/008 | ✔ |
| REQ-MEN-15 | **Danh sách chính của Dolphin xếp theo GIA ĐÌNH**, không phải theo learner rời: mỗi thẻ có **tên bố mẹ ở dòng trên, tên các con ở dòng ngay dưới**; không có tiêu đề trang và không có nhãn "Quan sát" trên thẻ. Mỗi gia đình có **một hoặc nhiều Dolphin chăm sóc**; **mỗi Dolphin tự đánh dấu "tôi chăm nhà này" và tự bỏ** (khác `mentor_assignments` vốn ở tầng learner và do admin giao). Bộ lọc gồm **hai ô**: "nhà tôi chăm" và "nhà chưa ai chăm", mặc định **bật cả hai**, bỏ chọn cả hai thì hiện tất cả | M | SRC-585 | [SDD-023](../../../architecture/sdd-023-family-workspace/index.md) §11 | QG-004/007/008 | ✔ |
| REQ-MEN-16 | **Toàn bộ giao diện dolphin bằng tiếng Anh**, không còn chuỗi tiếng Việt nào hiển thị cho người dùng — kể cả **đường dẫn** (`/families`, `/team`, `/albums`, `/testimonials`, `/schools`), **thông báo lỗi của các endpoint chỉ dolphin dùng**, và danh sách lý do chưa publish. Đường dẫn tiếng Việt cũ vẫn mở được, đổi lặng sang đường mới. Ngoại lệ có chủ đích: **tên riêng tiếng Việt** trong ví dụ gợi ý (tên trường, tên tỉnh) giữ nguyên vì đó là dữ liệu thật. Thẻ mentor ở danh sách Team **chỉ còn một link** sang `/team/{id}`; mọi thao tác chuyển sang trang riêng đó | M | SRC-586 | [SDD-023](../../../architecture/sdd-023-family-workspace/index.md) §12 | QG-007 | ✔ |
| REQ-MEN-17 | **Buổi học cùng Dolphin theo khung giờ**: Teacher mở các khung **lặp hàng tuần** (mặc định CN 10:00-12:00, CN 15:00-17:00, tối T2 và T4 20:00-22:00) kèm sức chứa và **link Google Meet lưu trên hệ thống**; learner khai **nguyện vọng nhất và nhì** trong đúng các khung đã mở (khai nguyện vọng KHÁC với đăng ký buổi); ghi tên một buổi cụ thể phải **trước 48 giờ** tính tới giờ bắt đầu, để Teacher kịp chuẩn bị; link phòng chỉ tới tay learner **đã ghi tên** buổi đó. Điểm danh vẫn thuộc REQ-MEN-04, chưa làm | M | SRC-733 | [SDD-034](../../../architecture/sdd-034-mentor-slots.md) §1-§5 | QG-003/008 | ✔ |
| REQ-MEN-18 | **Buổi học trực tiếp (Live Session)**: mentor mở một **phòng** có mã **bốn chữ số** 1000-9999 (SRC-906; một mã chỉ trỏ tới một phòng chưa kết thúc); learner vào bằng mã, và **có mặt** đo bằng `last_seen_at` chứ không bằng một cờ online. Màn mentor hiện **nguyên văn** check-in đầu buổi (mood + bốn thang 1-5: sức lực, hào hứng, mục tiêu còn đúng, tốc độ có ổn + hai ô chữ trong đó có **điều đang chặn learner**) và **tiến độ hành trình IELTS** của từng người (đã xong bước nào, còn bước nào), đọc từ `readPathway` qua một endpoint **riêng** vì nó là N+1. Cuối buổi learner viết **4F Reflection**; nộp được cả sau khi buổi đóng. **Ván đấu mười câu** do mentor giữ nhịp: đáp án và câu giải thích **chỉ rời server khi câu đã đóng**, mỗi người trả lời mỗi câu **đúng một lần** (ràng buộc ở schema), điểm = 600 đúng + tối đa 400 tốc độ nên trả lời đúng chậm luôn hơn trả lời sai nhanh. Đồng bộ bằng **hỏi-lại** (2,5-3 giây), không WebSocket | M | SRC-893 | [SDD-040](../../../architecture/sdd-040-live-sessions.md) §3-§6 | QG-003/008 | ✔ |
| REQ-MEN-19 | **Khu cấu hình mở khoá IELTS trong Dolphin**: (a) mặc định toàn hệ ở `/ielts-unlock` - thứ tự bốn kỹ năng, số ngày chờ, điều kiện tiên quyết; (b) trong hồ sơ từng learner - trạng thái bốn kỹ năng, lý do đang khoá, nút mở sớm **bắt buộc kèm một dòng lý do**. Mọi lần mở/khoá ghi `audit_log`; giao diện tiếng Anh theo REQ-MEN-16 | M | SRC-859 | [SDD-038 §58f](../../../architecture/sdd-038/membership-unlock.md) | QG-008 | ⏳ pending-confirm (Q-157) |
| REQ-MEN-20 | **Hồ sơ mentor đầy đủ trong dolphin** (SRC-1215): xem chi tiết từng mentor; ảnh chân dung mặc định chọn từ kho ảnh; mọi ảnh khác của mentor lấy theo người trong ảnh; mentor tự tải và sửa của mình, staff/admin phân phối và kiểm chứng | M | SRC-1215 | [SDD-053](../../../architecture/sdd-053-photo-library-placements.md) §4, §7 | QG-004/008 | ⏳ thiết kế đã chốt, chưa dựng |
| REQ-MEN-21 | **Chứng chỉ, thành tích thi, báo chí của mentor** (SRC-1215): mục có cấu trúc (loại, tên, năm, đơn vị cấp hoặc tên báo, link nguồn, ảnh, đã kiểm chứng); chỉ hiện công khai khi đã kiểm chứng và có link nguồn | M | SRC-1215 | [SDD-053](../../../architecture/sdd-053-photo-library-placements.md) §4, §6 | QG-004/008 | ⏳ thiết kế đã chốt, chưa dựng |
| REQ-MEN-22 | **Duyệt và sửa nội dung AI Teen trong Dolphin** (SRC-1284): cây course > unit > lesson > Activity/Bước/cổng đọc; mọi trang chỉ đọc mặc định, "Sửa" đổi thành "Lưu"/"Huỷ" tại chỗ; D1 là nguồn sự thật (bản nháp, version chỉ chèn, phát hành theo course, rollback bằng con trỏ), learn đọc bản phát hành lúc chạy và giữ bản chụp sinh ra trong repo; một module luật kiểm hợp lệ dùng chung cho API và CI; sửa cần phạm vi editor, phát hành cần staff, rollback cần admin; mọi lượt ghi vào `audit_log` | M | SRC-1284 | [SDD-056](../../../architecture/sdd-056-ai-teen-content-editor.md) §2-§11 | QG-004/005/008 | ⏳ thiết kế đã chốt, chưa dựng |
| REQ-MEN-04 | Class operations: lớp, lịch, link buổi học, điểm danh | S | FEAT-011..013, Q-045, Q-119 | — | — | ⏳ |
| REQ-MEN-05 | Mentor review & feature bài làm xuất sắc | S | FEAT-020, Q-047 | — | — | ⏳ |
| REQ-MEN-10 | **Dolphin có khu rà soát chất lượng từng Experience và từng step**: mentor bấm một hai nhãn rồi xác nhận, experience bị đánh dấu nghiêm trọng thì tự rút khỏi luồng learner cho tới khi sửa | S | SRC-415 | SDD-013 | QG-006 | ✔ |

### REQ-DOR — Dory: Family Relationship Management (SRC-587)

Philosophy *never forget the family*. Đặc tả đầy đủ: [PRD-003](../../prd-003-dory-anchor.md), [SDD-024](../../../architecture/sdd-024-dory.md).

| ID | Yêu cầu | Ưu tiên | Nguồn | SDD | QG | Status |
| --- | --- | --- | --- | --- | --- | --- |
| REQ-DOR-01 | **Family 360**: một màn duy nhất gom mọi thứ đã biết về một nhà, thứ tự khối cố định theo thứ tự câu hỏi mentor thật sự hỏi (ai · đang lo gì · đang nợ gì · gần đây có gì · muốn gì) | M | SRC-587 | [SDD-024](../../../architecture/sdd-024-dory.md) §3 | QG-007/008 | 🔵 |
| REQ-DOR-02 | **Family Timeline**: MỘT dòng thời gian gộp mọi loại sự kiện (interaction · milestone · note · case đóng), lọc theo loại; không tách thành nhiều tab | M | SRC-587 | [SDD-024](../../../architecture/sdd-024-dory.md) §2 | QG-007 | ⏳ |
| REQ-DOR-03 | **Interaction Capture**: ghi một lần chạm với gia đình trong **dưới 60 giây**, đúng ba ô bắt buộc (loại · thời điểm · tóm tắt một dòng); `key_points` mỗi dòng một ý để trích lại được | M | SRC-587 | [SDD-024](../../../architecture/sdd-024-dory.md) §4 | QG-007 | 🔵 |
| REQ-DOR-04 | **Family Context = note + tag, MỘT bảng** (SRC-588, **chưa dựng**): dự định đúng một bảng `family_notes`; mỗi note gắn **0, 1 hoặc nhiều tag** từ danh sách **đóng mười tag** (`parent` `child` · `pain` `jtbd` `event` `goal` · `fact` `opinion` `hypothesis` · `key`); **không có nhóm loại trừ**, không cho gõ tag mới ở đợt đầu. Reply **đúng một tầng** (`reply_to_id` chỉ trỏ note gốc). Note **zero tag chính là hộp vào**. Đầu trang có **bộ lọc mặc định** chọn sẵn vài tag, và một nút **gợi ý thêm/bớt tag bằng AI** — chỉ đề xuất, kèm lý do từng tag, người bấm duyệt, ghi lại tỉ lệ chấp nhận | M | SRC-587, SRC-588 | [SDD-024](../../../architecture/sdd-024-dory.md) §2, [family-notes-review](../../family-notes-review/decisions.md) §10d-10f | QG-005/008 | 🔵 |
| REQ-DOR-05 | **Family Signals**: 5 luật phát hiện chạy trong cron (lo lắng lặp lại · tin nhắn chưa trả lời · tương tác giảm · lâu không liên lạc · nhà chưa ai chăm). Cột `reason` **NOT NULL** — cảnh báo không nói được vì sao thì người nhận chỉ còn hai lựa chọn: tin mù hoặc tắt đi. Dismiss được và lần dismiss được ghi lại | M | SRC-587 | [SDD-024](../../../architecture/sdd-024-dory.md) §5 | QG-005 | ⏳ |
| REQ-DOR-06 | **Relationship Summary** đọc trong hai phút, sinh **từ Family Model theo khung cố định**, mỗi câu truy được về một bản ghi. Chưa dùng AI viết tự do ở đợt này | M | SRC-587 | [SDD-024](../../../architecture/sdd-024-dory.md) §6 | QG-005/010 | ⏳ |

| REQ-DOR-07 | **Family Journey — bảy bước, theo TỪNG NGƯỜI**: `unknown → met → exploring → tried → engaged → trusting → advocating`, gán cho **mỗi liên hệ và mỗi learner** chứ không cho cả gia đình (các thành viên cùng nhà ở những chỗ rất khác nhau). Không phải phễu bán hàng, không sinh điểm số | M | SRC-589 | [SDD-026](../../../architecture/sdd-026-family-journey.md) §1-2 | QG-005/008 | 🔵 |
| REQ-DOR-08 | **Hệ suy ra tối đa tới bước 5**, luôn kèm **câu giải thích vì sao**; bước 6 và 7 (`trusting`, `advocating`) **chỉ lên khi có người bấm xác nhận** — máy nhìn được hành vi, không nhìn được niềm tin. Mỗi bước có **đúng một điều kiện quan sát được** để lên bước kế tiếp, và bước gợi ý **luôn là bước liền sau**, không nhảy cóc | M | SRC-589 | [SDD-026](../../../architecture/sdd-026-family-journey.md) §3-4 | QG-005 | 🔵 |
| REQ-DOR-09 | **Chỉ lưu bước đã được người xác nhận** (`family_journey`, 6 cột); bước hệ suy ra tính tại chỗ, không lưu. **Lịch sử không có bảng riêng**: mỗi lần xác nhận ghi một note gắn `event` vào `family_notes`. **Lùi bước là bình thường**, ghi lại không kèm phán xét, và **không bao giờ hiện cho gia đình** | M | SRC-589 | [SDD-026](../../../architecture/sdd-026-family-journey.md) §5-7 | QG-004/008 | 🔵 |

### REQ-ANC — Anchor: Case & Commitment Management (SRC-587)

Philosophy *never lose the commitment*. Đặc tả đầy đủ: [PRD-003](../../prd-003-dory-anchor.md), [SDD-025](../../../architecture/sdd-025-anchor.md).

| ID | Yêu cầu | Ưu tiên | Nguồn | SDD | QG | Status |
| --- | --- | --- | --- | --- | --- | --- |
| REQ-ANC-01 | **Case** có vòng đời `open → in_progress → waiting_family ⇄ in_progress → resolved → closed`, mở lại được và đếm số lần mở lại. `waiting_family` là trạng thái RIÊNG vì đồng hồ SLA dừng ở đó | M | SRC-587 | [SDD-025](../../../architecture/sdd-025-anchor.md) §2-3 | QG-004/008 | ⏳ |
| REQ-ANC-02 | **Commitment**: mọi lời hứa có `owner_user_id` và `due_at` **NOT NULL**, lưu **nguyên văn** điều đã hứa chứ không phải bản tóm tắt; sống độc lập với case (nhiều lời hứa không thuộc vấn đề nào). `missed` là trạng thái hợp lệ | M | SRC-587 | [SDD-025](../../../architecture/sdd-025-anchor.md) §4 | QG-004 | ⏳ |
| REQ-ANC-03 | **Action**: chia case thành việc cụ thể, mỗi việc có người nhận và trạng thái riêng | M | SRC-587 | [SDD-025](../../../architecture/sdd-025-anchor.md) §2 | QG-004 | ⏳ |
| REQ-ANC-04 | **SLA**: hạn tính theo `category × priority` từ config (không rải trong mã); cảnh báo ở mốc **80% thời gian**, tức trước khi trễ; đồng hồ dừng khi `waiting_family`; sửa `due_at` phải để lại vết | M | SRC-587 | [SDD-025](../../../architecture/sdd-025-anchor.md) §5 | QG-005 | ⏳ |
| REQ-ANC-05 | **Follow-up**: mỗi resolution tự đặt một lần kiểm lại (+14 ngày, billing +7); ba kết cục `confirmed_ok`/`reopened`/gia hạn một lần, **không có nút bỏ qua** | M | SRC-587 | [SDD-025](../../../architecture/sdd-025-anchor.md) §7 | QG-005 | ⏳ |
| REQ-ANC-06 | **Escalation** tự động theo luật (quá hạn 24h/72h, commitment lỡ hẹn, case urgent chưa ai nhận sau 4h), mỗi lần ghi vết. Dữ liệu này **không** dùng để xếp hạng Dolphin | M | SRC-587 | [SDD-025](../../../architecture/sdd-025-anchor.md) §8 | QG-005/008 | ⏳ |
| REQ-ANC-07 | **Resolution Evidence**: không chuyển sang `resolved` được nếu thiếu `resolution_note` và ít nhất một bằng chứng (action done · commitment kept · interaction gắn case). Có đường đóng ngoại lệ `[no-evidence]`, và các case đó **hiện thành một mục riêng** chứ không lẫn vào phần đã đóng | M | SRC-587 | [SDD-025](../../../architecture/sdd-025-anchor.md) §6 | QG-004/008 | ⏳ |
| REQ-ANC-08 | **Audit Trail**: `case_events` (vết nghiệp vụ, đọc được trên màn hình) tách khỏi `audit_log` (vết truy cập, AS-07.4); cả hai chỉ nối thêm, không có đường sửa/xoá trong ứng dụng | M | SRC-587 | [SDD-025](../../../architecture/sdd-025-anchor.md) §9 | QG-008 | ⏳ |

### REQ-POR — Student Portrait & Family Future Planning (SRC-040)

Shared future model: Marlin + Nemo cùng tạo/thảo luận chân dung tương lai. Portrait = aspiration input, không phải mệnh lệnh cho Recommendation.

| ID | Yêu cầu | Ưu tiên | Nguồn | SDD | QG | Status |
| --- | --- | --- | --- | --- | --- | --- |
| REQ-POR-01 | **Portrait** entity: tối đa 3 active/parent/learner (3 scenario compare–discuss–refine); sections (academic/capabilities/interests/languages/sports/creative/personal dev/lifestyle/experiences/career); version history; archive không hard-delete | M | SRC-040 | SDD-015 §2 | QG-005/008 | ✔ |
| REQ-POR-02 | **Milestones** độc lập, link Portrait: kinds exam/academic/capability/language/habit/portfolio/experience/personal; target + date + expected + actual + status + confidence | M | SRC-040 | SDD-015 §3 | QG-005 | ✔ |
| REQ-POR-03 | **External activities** (guitar, tiếng Trung, chess…): learner_interest và parent_support **lưu riêng theo người khai, cấm auto-merge**; là một phần learner context | M | SRC-040 | SDD-015 §4 | QG-005/008 | ✔ |
| REQ-POR-04 | **Family collaboration**: view/vote/react/comment/reply per portrait/goal/milestone/activity qua Interaction System; edit + version history | M | SRC-040 | SDD-015 §5 | QG-007/008 | ✔ |
| REQ-POR-05 | **Alignment** parent ↔ learner ↔ reality (High/Medium/Low, bảng per-dimension) — chỉ ra chủ đề cần trao đổi, không phán xét, không auto-resolve conflict | M | SRC-040 | SDD-015 §6 | QG-005 | ✔ |
| REQ-POR-07 | Portrait là **aspiration input** cho Goal Model/Planning/Recommendation — không override; Planning Engine đề xuất milestone, phát hiện phi thực tế, reschedule, tính khoảng cách tới Portrait | M | SRC-040 | SDD-015 §8 | QG-005 | ✔ |
| REQ-POR-08 | **Nemo luôn xem được** Portrait về mình và phản hồi agree/unsure/disagree từng phần | M | SRC-040 | SDD-015 §1,§5 | QG-008 | ✔ |
| REQ-POR-09 | **Hai cột trong mỗi mục lớn**: cột bố mẹ viết và **cột con tự viết** (bản của riêng con), tên mục dùng chung. Chỉ chính Nemo được ghi cột của mình (bố mẹ đọc được, không viết hộ); phản hồi agree/unsure/disagree rút thành **icon đặt ngay dưới từng mục** | M | SRC-106 | SDD-015 §2,§5 | QG-008 | ✔ |
| REQ-POR-06 | **Form Student Portrait hỏi TỪNG trường một kiểu TypeForm**, không đổ hết ra cùng lúc; mỗi trường có ví dụ mẫu để trẻ biết viết gì | S | SRC-254 | SDD-015 | QG-007 | ✔ |
| REQ-POR-10 | **Portrait có TRACK dài hạn xuyên nhiều năm** (kiểu epic), milestone gắn vào track chứ không trôi nổi rời rạc. Chứng chỉ quan trọng như IELTS/SAT có nhịp thi riêng, không nhét chung vào lịch học kỳ | S | SRC-052 | SDD-015 | QG-005 | ✔ |
| REQ-POR-11 | **Trang Hồ sơ mặc định chỉ đọc, có nút Edit mới sửa được**; dữ liệu validate ngay tại client, chặn năm sinh và tên trường vô nghĩa trước khi gửi đi | S | SRC-326, SRC-327 | SDD-015 | QG-007 | ✔ |
