---
url: https://docs.nemo12.com/quality/request-audit.md
description: >-
  Rà soát trạng thái thật của các yêu cầu chủ dự án (từ 17.08.2026): cái nào
  chưa làm, chưa deploy hoặc chưa có tính năng.
---

# Rà soát yêu cầu — trạng thái THẬT

Chủ dự án yêu cầu 2026-08-17: *"Đưa toàn bộ các yêu cầu tôi đã yêu cầu vào docs, để đảm bảo không bị sót. Rà soát xem còn yêu cầu nào chưa được thực hiện, hoặc đã làm rồi nhưng deploy bị sót, hoặc chưa tồn tại tính năng đó trên hệ thống."*

Sổ yêu cầu vẫn là [intake.md](../intake.md) — mỗi yêu cầu một dòng SRC, không có sổ thứ hai. Trang này **không chép lại sổ**; nó trả lời một câu khác: *"cái đã ghi là xong, trên production có thật không?"*

**Cách đọc trạng thái** — chỉ có ba mức, và mức nào cũng phải kèm bằng chứng kiểm được:

| Mức | Nghĩa |
| --- | --- |
| ✅ **Đang chạy** | Code đã trên `main`, workflow deploy xanh, và (nếu cần schema) migration đã có trong `d1_migrations` |
| 🔵 **Xong một phần** | Phần lõi chạy được, phần còn lại nêu rõ ở cột "còn thiếu" |
| 🟡 **Chưa làm** | Đã ghi nhận yêu cầu, chưa có dòng code nào |

Ba thứ **không** được tính là ✅: code đã commit nhưng workflow deploy đỏ; migration còn trong `migrations/` mà chưa vào `d1_migrations`; tính năng chạy được nhưng dữ liệu để nó có ích thì chưa có.

## 1. Đang chạy trên production (đã kiểm 2026-08-17)

| SRC | Yêu cầu | Bằng chứng |
| --- | --- | --- |
| [SRC-207](../intake.md) | Toàn cảnh mở dần ba tầng: Package → Module (mũi tên thứ tự học) → Unit (thẻ chứa chấm Experience) | `ProgressViews.tsx`; 3 test e2e; deploy-learn xanh |
| [SRC-208](../intake.md) | Mỗi Unit tối đa 1 lab | `0048_one_lab_per_unit.sql` **đã trong `d1_migrations`**; 225 → 182 lab live, 113 unit mỗi unit đúng 1 lab, 43 lab chuyển `draft` |
| [SRC-211](../intake.md) | Sửa câu khó hiểu · lời nhắc nhịp độ xuống cuối thẻ · `/labs` trả tên rút gọn | `Learning.tsx`, `learning/routes.ts`; deploy-api + deploy-learn xanh |
| [SRC-212](../intake.md) | Đánh dấu lab yêu thích + lọc nhanh | `0050_lab_favorites.sql` **đã trong `d1_migrations`**; 3 endpoint; 1 test e2e |
| [SRC-213](../intake.md) | Gộp hai lời động viên thành một | `Learning.tsx` |
| [SRC-214](../intake.md) | Đáp án ngắn xếp 2 cột · Skip/Exit thành icon | `Learning.tsx`; test e2e bám `aria-label` |
| [SRC-215](../intake.md) | Avatar thật ở góc trên phải · công tắc VI/EN nhỏ lại | `/v1/me` nay trả `avatar_url` (trước đó **chưa bao giờ trả**, dù 7/7 user đã có ảnh trong DB); `.n12-switch-sm` |
| [SRC-216](../intake.md) | Slug `/labs` · Exit thành icon góc dưới phải · phân số vẽ bằng hai hình tròn | `App.tsx`, `LabPlayer.tsx`, `explore/engine.tsx`; slug cũ vẫn mở được (có test) |

## 2. Xong một phần — phần còn thiếu nói rõ

| SRC | Đã có | Còn thiếu | Vì sao chưa xong |
| --- | --- | --- | --- |
| [SRC-208](../intake.md) | 113 unit mỗi unit 1 lab | **70 lab chưa gắn được unit nào** (Anh 32 · Văn 33 · Hoá 3 · Lý 1 · Sinh 1) | Chúng dạy Nghe/Nói và Làm văn, mà **chương trình chưa có unit tương ứng**. Khớp theo tên chỉ trúng 3/70. Gắn được thì phải **mở thêm unit** — việc soạn nội dung |
| [SRC-210](../intake.md) | Footer chung ở learn + marlins | **web/ chưa dùng bản chung** | `apps/web/src/App.tsx` đang có phần việc chưa commit của phiên song song; footer inline hiện tại cùng nội dung nên chưa lệch gì |
| [SRC-211](../intake.md) | Bỏ em dash trong 6 chuỗi nudge/khen | **~26 chuỗi em dash** ở các file learn khác | Luật DS-001 §5b điều 8 cấm trong MỌI chuỗi UI; đợt này mới quét cụm phản hồi làm bài |
| [SRC-212](../intake.md) | Đánh dấu lab yêu thích | **Gợi ý 1-2 lab bù khi hổng** | Đo được: chỉ **184/1013 bài (18%)** có đường ra một lab qua unit của chính nó hoặc qua prereq — Toán 82/96 nhưng **Lý 9/216 · Hoá 10/216 · Tin 0/216**. Chờ chủ dự án chốt cách xử lý khi không có gì để gợi ý |
| [SRC-202](../intake.md) | Luồng bố mẹ (wizard 5 bước) | Luồng con chưa phân màn theo cấp học, xưng hô chưa áp vào learn | — |
| [SRC-206](../intake.md) | Đã rà 9 cựu học sinh, ghi `draft` | **Chưa ai lên trang** | Thiếu nguồn cho 5 người, và `consent` của cả 9 người chưa hỏi |

## 3. Chưa làm — yêu cầu đã nhận, chưa có dòng code nào

| SRC | Yêu cầu | Việc cần làm | Chặn bởi |
| --- | --- | --- | --- |
| [SRC-217](../intake.md) | Mỗi Learning Experience có **"Nhắc lại"**: icon `?` nhỏ góc dưới phải, bấm mở popover nói sơ qua một khái niệm + ví dụ nhỏ | Migration thêm `skill_nodes.hint_vi/hint_en`; `/practice/start` trả kèm; popover ở `Learning.tsx`; **soạn nội dung** | Cột `description` sẵn có chỉ chứa rác kiểu *"Kỹ năng: Làm tròn số."* — không dùng lại được. 1.013 bài cần hint, đợt đầu nên làm Toán (96 bài) |
| [SRC-218](../intake.md) | **Ảnh minh hoạ bằng thuật toán** cho một số câu hỏi (cấm bitmap) | Mở rộng `FigureSpec` sang Đại số/Số học (trục số, phân số, đồ thị hệ số góc) rồi chạy `attach-figures.mjs` | Engine + bảng `item_figures` (migration 0038) đã có sẵn, hiện mới phủ Hình học |
| [SRC-219](../intake.md) | **Thư viện công thức toán** — so sánh rồi triển khai | KaTeX, `import()` động, subset font; cho phép `$…$` ngay trong `prompt`/`options` để chuyển dần, không phải sửa 2.160 câu cùng lúc | Đã tư vấn xong, chờ chủ dự án gật |
| [SRC-220](../intake.md) | Màn kết thúc Learning Experience: **việc quan trọng nhất tiếp theo là gì** | Một nút accent duy nhất do hệ thống chọn theo kết quả (xem lại chỗ sai → đo mức vững → đi tiếp ô kế); "Ẩn bài làm" thôi làm nút chính; thêm dòng lịch ôn lại | Đã trả lời kèm lý do, chờ chốt |
| [SRC-221](../intake.md) | **Unit cũng có điểm** và trình bày như Module; nút xem **diff 7 ngày** và **30 ngày** cho từng Package/Module/Unit | Điểm Unit: API `/overview` đã trả sẵn `mastery_of_assessed` cho unit, chỉ là UI chưa vẽ vòng tròn. Diff: dùng `learner_evidence.mastery_before/after` + `occurred_at` (migration 0044) | **Dữ liệu lịch sử mới có 52/262 mẩu evidence** mang `mastery_after` (cột thêm ở 0044), nên mốc "7 ngày trước" của bài học từ trước đó **không dựng lại được** — phải nói thẳng "chưa có dữ liệu" thay vì hiện 0 |
| [SRC-222](../intake.md) | **Gộp Toàn cảnh và Đường học** làm một | Giữ Toàn cảnh làm bản đồ duy nhất; Đường học còn lại đúng màn chơi của một Unit; bỏ lọc theo lớp ở tầng module | Đã phân tích (7 vs 5 module là do hai bộ lọc khác nhau trên cùng dữ liệu), chờ chốt vì việc này xoá một trang khỏi điều hướng |

## 4. Việc lớn còn treo từ các đợt trước

| Việc | Số đo hôm nay | Ghi chú |
| --- | --- | --- |
| **6/6/6 cho mọi môn** ([SRC-190](../intake.md)) | Đủ: Hoá · Tin · Lý (6 package · 36 module · 216 unit). Thiếu: Toán 3 package · Văn 3 · Anh 4 · Sinh 4 · SAT/AP/IELTS/GenAI 5 | Còn ~1.500 unit — đây là chương trình nội dung, không phải một lần chạy script |
| **3 package cuối chưa có câu hỏi** | Tin *Ứng dụng* 36 bài · **0 câu**; Hoá *Hoá học đời sống* 36 bài · **0 câu**; Lý *Quang học* 36 bài · **30 câu** | Đợt soạn câu thứ 6 dừng giữa chừng; mỗi package cần 144 câu |
| **13 cụm đề Anh/Văn dùng chung câu hỏi** | Pool chỉ 18–28 câu cho 5 đề | Script in danh sách này mỗi lần chạy |
| **`docs/reference` lệch với code** | Sinh từ bản đã commit ra 147 endpoint / 81 bảng, docs đang ghi 180 / 90 | Docs được sinh từ **code chưa commit** của phiên song song; đóng được khi phiên đó commit nốt |

## 5. Chỗ dễ sót nhất — hai phiên làm song song

Hai phiên Claude cùng làm trên một cây thư mục trong ngày 2026-08-17. Hệ quả đã xảy ra thật, ghi lại để người sau không mất thời gian tìm:

* **Số SRC đụng nhau ba lần** (193, 195, và 207/208 — hai số cuối được dùng làm nhãn commit cho phần mentor trong khi sổ đã cấp cho phần Toàn cảnh và lab).
* **Dãy migration hở**: `0046`, `0047` đã **áp lên D1** nhưng file vẫn chưa commit, nên cổng AS-04.1.1 (số liên tục) sẽ báo khi CI chạy tới đó.
* **Docs bị sinh từ cây làm việc bẩn** — nguyên nhân của mục cuối bảng §4.

Cách tránh: `git add` đúng file của mình, và trước khi cấp số SRC/migration mới thì đọc lại `intake.md` + `ls migrations` ngay tại thời điểm đó.
