---
url: https://docs.nemo12.com/quality/audits/2026-08-22-004.md
description: >-
  Audit #011 ngày 22.08.2026, lần chấm toàn hệ thứ 5 (255 chỉ báo): điểm, KHÔNG
  PASS theo mã lý do, 6/30 chỉ báo chặn, Pilot Gate 15/18 NO-GO.
---

# Audit #011 — 2026-08-22 (toàn hệ lần 5)

Chấm trên `main` @ `7187eed` + production thật, theo [Audit Standard v0.2](../audit-standard/index.md).
Đây là lần chấm **toàn hệ** thứ 5 (sau #001..#004); số hiệu #011 vì dãy #005..#010 đã dùng cho audit chuyên đề.
Lần đầu chấm sau khi [hệ tiêu chuẩn chất lượng 3 lớp](../index.md) (SRC-495) được dựng — mục tiêu đặt ra là **quét sạch 66 dòng CM** của #004: mọi chỉ báo lần trước "chưa rà" lần này đều được đo thật. Chấm bằng 7 auditor độc lập song song, mỗi auditor một cụm bộ, cấm copy kết quả cũ.

## 1. Điểm

| | |
| --- | --- |
| Điểm hệ | **175/255 = 68,6%** |
| Mức trưởng thành | **Đang dựng** (cách mức Vững 4 chỉ báo) |
| 🔴 KHÔNG PASS | **6/30** |
| 🚸 Pilot Gate | **15/18 — NO-GO** |
| Đối chiếu #004 (cùng chuẩn) | 145/255 → 175/255 (**+30**), CM 66 → 18 |

| Bộ | Điểm | |
| --- | --- | --- |
| AS-01 — Tài liệu & Đóng vết | 20/25 = 80% | `████████████████░░░░` |
| AS-02 — Yêu cầu & Sản phẩm | 19/25 = 76% | `███████████████░░░░░` |
| AS-03 — Kiến trúc & Hợp đồng API | 17/25 = 68% | `█████████████░░░░░░░` |
| AS-04 — Dữ liệu & Migration | 19/30 = 63% | `████████████░░░░░░░░` |
| AS-05 — Trí tuệ học tập & Thuật toán | 23/25 = 92% | `██████████████████░░` |
| AS-06 — Nội dung & Tri thức | 8/25 = 32% | `██████░░░░░░░░░░░░░░` |
| AS-07 — Bảo mật, Riêng tư & Tuân thủ | 22/25 = 88% | `█████████████████░░░` |
| AS-08 — Tin cậy & Vận hành | 22/25 = 88% | `█████████████████░░░` |
| AS-09 — Trải nghiệm & Design System | 6/25 = 24% | `████░░░░░░░░░░░░░░░░` |
| AS-10 — AI Governance & Chi phí | 19/25 = 76% | `███████████████░░░░░` |

Điều kiện release dài hạn (§3.1 chuẩn): **chưa đạt** — còn 6 🔴 hỏng và 2 bộ dưới 60% (AS-06 32%, AS-09 24%), dù điểm hệ đã gần ngưỡng 70%. Định nghĩa "xong" theo [REQ-DOC-09](../../product/prd-001-nemo12-platform.md): 255/255 — còn **80 chỉ báo**.

## 2. Tách KHÔNG PASS theo mã lý do

| Mã | Nghĩa | Số chỉ báo | % trong 80 KHÔNG PASS |
| --- | --- | --- | --- |
| **HH** | Đã kiểm được và ĐANG HỎNG — có phản ví dụ | **41** | 51% |
| **CM** | Có tồn tại nhưng chưa đủ bằng chứng | **18** | 23% |
| **CX** | Chưa xây | **21** | 26% |

Đọc cho đúng: CM giảm 66 → 18 (mục tiêu của lần chấm đạt được — 18 dòng còn lại phần lớn cần trình duyệt/Lighthouse/token Cloudflare, không đo được từ repo). Đổi lại **HH tăng 27 → 41**: khi rà thật thì lộ hỏng thật, gồm cả 4 dòng #004 từng chấm ✅ nay lật lại (03.1.4 token bị đè, 09.4.1/09.4.2 admin lẫn tiếng Việt, 07.3.3 test không tồn tại). Đó là hệ chuẩn đang làm đúng việc, không phải hệ tệ đi: 21/41 HH tập trung ở đúng hai khối nợ đã biết (hồ sơ chất lượng item + trace docs).

## 3. 🔴 chặn phát hành đang KHÔNG PASS (6/30)

| Chỉ báo | Mã | Sự thật quan sát được | Hành động |
| --- | --- | --- | --- |
| AS-04.6.1 🚸 | HH | Lệch mới "0067 chưa áp remote" chưa được ghi vào migration-reconciliation.md (bản đối soát 2026-08-20 chỉ khai mồ côi 0046) | B1 |
| AS-06.3.1 | HH | 15.575 item vẫn vào thẳng published: 0 candidate, 0 item_versions; trigger 0067 **chưa tồn tại trên production** | B1 |
| AS-06.4.2 | CX | Chưa có đề thật nào (exams: 240 NULL + 150 generated, 0 'real') | B15 |
| AS-06.4.3 | CX | Chưa có đề thật để kiểm lời giải | B15 |
| AS-09.3.1 🚸\* | HH | `npm run contrast` (148 cặp): 1 cặp trượt AA — `text-white`/`bg-ocean-500` = 3,75:1 tại ProgressViews.tsx:740 | B4 |
| AS-10.4.1 🚸 | HH | Cổng chất lượng đã dựng (0067 + backfill.ts + tab Admin Ops) nhưng chấm bù **chưa chạy**: 15.575/15.575 item quality_score NULL, 0 item ≥2 evaluator | B1 |

## 4. 🚸 Pilot Gate — 15/18, NO-GO

Ba dòng đỏ: **AS-04.6.1** (ghi lệch 0067 vào reconciliation — việc 10 phút sau khi deploy áp 0067), **AS-03.5.3** (CM — GitHub 403 không bật được branch protection; nhánh (b) chưa chứng minh được vì trong 7 ngày có dòng mồ côi 0046 do đổi tên file 2026-08-18), **AS-10.4.1** (như §3). 15 dòng còn lại đều PASS có bằng chứng hôm nay, kể cả AS-04.5.5 (diễn tập backup/restore 2026-08-22: 96 bảng · 34.978 dòng · 0/96 lệch · 8/8 vân tay khớp) và AS-07.1.1/07.2.1 (authCoverage.test.ts 8/8 pass, 192 route / 22 public có chủ đích).

## 5. Phát hiện HH đáng giá nhất (mới so với #004)

1. **Cổng chất lượng nội dung xây xong nhưng chưa cắm điện** — 0067 nằm trên đĩa chưa áp remote, nút "Chấm bù" chưa bấm. Một lần chạy `deploy-api.yml` (workflow_dispatch apply migration) + một lần bấm chấm bù là 04.1.5, 04.6.1 tự xanh và 10.4.1 đổi trạng thái. Lưu ý cái bẫy đếm: đĩa 67 file = remote 67 dòng **nhưng không phải cùng 67** (remote thừa mồ côi 0046, thiếu 0067).
2. **Ranh giới module thủng lại sau A7**: ≥12 cạnh import chéo mới chưa khai ngoại lệ, trong đó có **chu trình knowledge↔models** (models/service→knowledge/mastery và knowledge/routes→models/service) — đúng thứ AS-03.1.2 cấm tuyệt đối.
3. **3 cặp "bản sao y hệt" của DS-001 đã lệch nhau**: N12Art (learn có IconFastForward, canonical không), Tour (font-extrabold vs font-bold), schoolsInfo (learn có informatics, marlins/web chưa) — đúng loại tai nạn im lặng mà luật copy-y-hệt sinh ra để chặn.
4. **Trace docs hụt chiều ngược**: 114/356 REQ active không nằm trong `satisfies` của doc thiết kế nào; 50 REQ MUST vắng mặt ở bảng phủ US/WF §6; 43/509 SRC chưa canonical hóa; 10 file `docs/knowledge/*.md` mồ côi. `check:docs` xanh vì nó chỉ kiểm chiều xuôi — cần nâng cổng.
5. **`GET /v1/admin/learners` đọc dữ liệu learner không ghi audit_log** (07.4.1) — admin/staff xem toàn bộ danh sách không để lại vết, trái nguyên tắc đã enforce cho mentor.
6. **Generator data-dictionary là gốc của 3 chỉ báo đỏ**: cắt cụt CHECK đa dòng (04.3.4), không có chỗ cho mô tả nghiệp vụ (400/1.009 cột rỗng — 04.3.2), không sinh §PII (04.5.4, 07.3.1).
7. **6 seed script ghi production bằng `--remote --yes` không chốt xác nhận** (04.4.1) — cùng họ với lỗ hổng `scripts/d1.mjs` mà #004 §11 đã cảnh báo.

## 6. Những gì tiến thật so với #004

* **Unit ngõ cụt 229 → 9** (Văn 7 · Hoá 1 · Anh 1); dưới sàn 10 câu: 234. Song ngữ subjects/strands/nodes: **0 thiếu**.
* **Prerequisite graph 2/11 môn → 11/11 môn**: 2.234 cạnh, DFS **0 chu trình** (Q-138 đóng).
* Đối soát production: reconciliation + schema-diff (92 bảng, 0 lệch) + backup drill mới ≤ hôm nay.
* 8/8 engine có test hành vi; 496/496 test xanh; engine_runs 943, workflow_runs 109, **0 failed**; models.md đủ 8 model.
* AS-05 (92%), AS-07/AS-08 (88%) là ba bộ khoẻ nhất — trí tuệ học tập, bảo mật, vận hành đều có bằng chứng sống.
* Prompt registry hoàn chỉnh (version + history + retired), AI một cửa qua Gateway, provenance `ai_generated` đánh dấu tới từng câu.

## 7. Hành động sinh ra từ audit này

Mỗi dòng đóng được chỉ báo nêu kèm. Thứ tự = thứ tự làm.

| # | Việc | Đóng chỉ báo | Cỡ |
| --- | --- | --- | --- |
| B1 | Áp `0067` qua deploy-api (workflow_dispatch) → bấm "Chấm bù tới hết" ở Admin Ops → thêm evaluator thứ 2 → ghi lệch vào migration-reconciliation.md | 04.1.5, 04.6.1 🔴🚸, 06.2.1-3, 06.3.1 🔴, 06.3.3/3.4, 10.4.1 🔴🚸, 10.4.2 | vừa (phần backfill LỚN) |
| B2 | Chủ dự án quyết DELETE dòng mồ côi `0046` khỏi d1_migrations remote (một câu, cần phê duyệt vì ghi production) | 04.6.2 | nhỏ |
| B3 | Khai/gỡ ≥12 cạnh import chéo mới; **phá chu trình knowledge↔models**; thêm validation.test.ts vào bảng ngoại lệ 03.1.1; miễn trừ tường minh fetch-bytes + 17 file literal nemo12.com | 03.1.1, 03.1.2, 03.1.3, 03.4.2 | vừa |
| B4 | DS: sửa cặp màu 3,75:1; `.n12-deep` dùng token thay vì định nghĩa lại; đồng bộ 3 cặp copy lệch (kèm script diff chặn CI); coral bỏ text-xs cho chữ đọc; admin gỡ 2 chuỗi tiếng Việt ngoài ngoại lệ; thống nhất nhãn mastery với glossary | 09.3.1 🔴, 03.1.4, 09.2.1/2.2/2.5, 09.4.1/4.2/4.3 | vừa |
| B5 | Nâng `gen-reference.mjs`: parse CHECK đa dòng, lớp mô tả nghiệp vụ cho cột (file overlay viết tay, generator merge), sinh §PII; bổ sung retention_policies cho 4 bảng learner còn thiếu; bổ khuyết state-machines | 04.3.2/3.4/3.5, 04.5.1, 04.5.4, 07.3.1 | vừa |
| B6 | 6 seed script `--remote`: bắt buộc in tên DB + đếm dòng + chờ xác nhận (hoặc chuyển hết sang seed-data.yml) | 04.4.1 (+04.4.3 có nghĩa) | nhỏ |
| B7 | Trace docs: điền `satisfies` cho 114 REQ; bổ sung 50 REQ MUST vào §6; canonical hóa 43 SRC treo; link 10 file knowledge/ vào index; luật bump version khi sửa nội dung (đưa vào check-docs) | 01.1.3, 01.3.1/3.4/3.5, 01.5.2 | LỚN |
| B8 | PRD/ledger: sửa 3 REQ mơ hồ (UX-37 "nhanh" → ngưỡng ms…); Octopus vào SDD-011; cột Phân loại tập đóng cho legacy-feature-inventory; điền lý do 16 dòng ✍️ Đợt 1; cột Trạng thái + cột "Đã vào" trong open-questions | 02.1.2, 02.3.4, 02.4.4, 02.5.2/5.4/5.5 | vừa |
| B9 | Thêm `logAccess` cho admin routes đọc learner data; viết portraits/routes.test.ts | 07.4.1, 07.3.3 | nhỏ |
| B10 | Bản đồ worker→availability tier; trả lời 5 câu production-ready cho từng subsystem; mục "hỏng thì thấy gì" cho SDD mới | 08.1.1/1.2/1.3 | vừa |
| B11 | Dựng `docs/reference/ui-minimalism-audit.md` (route × 5 cột); đo axe/tab/touch trên ≥5 màn thật | 09.1.1-5, 09.3.2/3.3/3.5, 09.4.5, 09.5.1/5.2 | LỚN |
| B12 | Test chứng minh diagnostic dừng; dọn 2 dòng NULL cũ trong learner_model_versions | 05.3.4, 05.5.4 | nhỏ |
| B13 | Ước tính chi phí từng loại lời gọi AI vào ai-registry; token scope đọc Gateway cho phiên audit; báo cáo độ phủ spot-check 20% | 10.5.1, 10.5.2/5.3, 10.4.3 | nhỏ |
| B14 | Chốt AS-03.5.3: hoặc nâng plan GitHub bật branch protection, hoặc mở rộng chỉ báo sang "mọi thao tác ghi production qua CI" rồi chứng minh 7 ngày sạch | 03.5.3 🚸 | quyết định chủ dự án |
| B15 | Bắt đầu ngân hàng đề thật (seed 3 trường × 3 năm × 3 môn — CS-07); media pipeline khi tới lượt REQ-MED | 06.4.1-5 (2🔴), 06.5.1/5.2/5.4/5.5 | LỚN |
| B16 | Soạn câu cho 9 Unit ngõ cụt + nâng 234 unit dưới sàn theo CS-05; gắn/retire 139 lab unit=NULL; thêm schema 2xx cho PATCH /v1/content/items; chạy contract:snapshot cho route additive mới | 06.1.4, 03.2.2, 03.2.4 ghi chú | LỚN |

## 8. Chi tiết theo chỉ báo

Ký hiệu: ✅ PASS · ❌ KHÔNG PASS (kèm mã CX/CM/HH). Bằng chứng đầy đủ của từng dòng nằm trong bảng dưới; các lệnh máy chạy hôm nay: check:docs ✓, typecheck ✓, test 496/496 ✓, contract:diff ✓ (207 route), migrate:dryrun ✓ (tới 0067), gen:reference 0 drift, verify:bindings A+B ✓.

### AS-01 (20/25)

| Chỉ báo | | Mã | Bằng chứng |
| --- | --- | --- | --- |
| AS-01.1.1 | ✅ | | find ngoài docs/ chỉ README, CLAUDE.md, skills/worktrees, nội dung app — 0 đặc tả song song |
| AS-01.1.2 | ✅ | | intake.md 509 dòng SRC đủ ngày + tóm tắt + canonical; con trỏ 510 = max+1 |
| AS-01.1.3 | ❌ | HH | 43/509 SRC không có hit nào ngoài intake.md (SRC-063, 085, 270, 491, 508…) |
| AS-01.1.4 | ✅ | | 509 dòng = uniq = max, dãy liên tục 001..509 |
| AS-01.1.5 | ✅ | | mọi file ngoại lệ 1.1.1 không đóng vai đặc tả |
| AS-01.2.1-5 | ✅×5 | | check:docs xanh — frontmatter đủ 8 trường, id duy nhất lowercase, type/status thuộc tập đóng |
| AS-01.3.1 | ❌ | HH | 114/356 REQ active không nằm trong `satisfies` của doc thiết kế nào (REQ-LRN-09/12, REQ-BRD-07…) — check-docs chỉ kiểm chiều xuôi |
| AS-01.3.2 | ✅ | | 0 dòng REQ ✔ thiếu QG (check-docs mục 3 enforce) |
| AS-01.3.3 | ✅ | | mọi `sources:` trỏ SRC tồn tại (dãy liên tục 1..509) |
| AS-01.3.4 | ❌ | HH | 10 file `docs/knowledge/*.md` mồ côi — không doc nào link tới |
| AS-01.3.5 | ❌ | HH | 50 REQ MUST active vắng mặt ở bảng §6 (REQ-LRN-19, INT-34, UX-13, GAM-06…); chiều US→REQ đủ 97/97 |
| AS-01.4.1 🔴🚸 | ✅ | | gen:reference 0 diff (trừ last_reviewed); CI run 32536300168 trên 7187eed success |
| AS-01.4.2-5 | ✅×4 | | data-dictionary 97 bảng khớp; api.md 207 endpoint khớp router; events 22/22 khớp; đủ dòng "sinh tự động" |
| AS-01.5.1 | ✅ | | last_reviewed cũ nhất 2026-08-13 — 9 ngày |
| AS-01.5.2 | ❌ | HH | spot-check: 4 commit sửa nội dung (2800f48 +41 dòng sdd-010; 3893af1; 20069c6; ce22a52) không tăng version |
| AS-01.5.3 | ✅ | | 0 link gãy (check:docs) |
| AS-01.5.4 | ✅ | | mọi hit "tuần trước/gần đây" là UI/trích dẫn/câu cấm |
| AS-01.5.5 | ✅ | | 63 dòng ✍️ tập trung trong open-questions/index.md đúng quy ước |

### AS-02 (19/25)

| Chỉ báo | | Mã | Bằng chứng |
| --- | --- | --- | --- |
| AS-02.1.1 | ✅ | | 28 nhóm REQ đều có heading trong PRD §5 |
| AS-02.1.2 | ❌ | HH | REQ-UX-37 "phải **nhanh** và tinh tế" (prd-001:374); "tối ưu" GAM-06, "tốt hơn" BRD-07 — L4 |
| AS-02.1.3 | ✅ | | 0 hit M?/S?/C? |
| AS-02.1.4 | ✅ | | 0 dòng REQ thiếu cột nguồn |
| AS-02.1.5 | ✅ | | token-overlap ≥80%: 2 cặp ứng viên, đọc tay đều false positive (proxy thô, ghi rõ giới hạn) |
| AS-02.2.1-4 | ✅×4 | | 97/97 US đúng format; persona thuộc tập; cột AC riêng; AC không chứa tên bảng/hàm |
| AS-02.2.5 | ✅ | | spot-check 5 US MUST → route thật (US-82 /events, US-91 truong-chuyen, US-06, US-74…) |
| AS-02.3.1-3 | ✅×3 | | JTBD đủ 4 persona; từng JTBD → REQ; 3 workflow onboarding riêng |
| AS-02.3.4 | ❌ | CX | **Octopus không xuất hiện trong SDD-011** — không mô hình riêng, không khai dùng chung |
| AS-02.3.5 | ✅ | | PRD §8 map đủ 9 app; spot-check khớp App.tsx |
| AS-02.4.1 | ✅ | | check-docs buộc dòng ✔ có SDD; spot-check PLT-15/PAR-16/SCH-16 → artifact thật |
| AS-02.4.2 | ✅ | | phản ví dụ #004 đã đóng: SRC-404 → REQ-PLT-15; rà tính năng mới không thấy thiếu REQ |
| AS-02.4.3 | ✅ | | 0 hàng CC-/FEAT- lẫn bảng REQ chính |
| AS-02.4.4 | ❌ | CX | legacy-feature-inventory không có cột Phân loại tập đóng {đã-port, đã-thay, cố-ý-bỏ, chưa-quyết} |
| AS-02.4.5 | ✅ | | §7 đủ 21 dòng ⏳/🔵 có lý do + ngày + điều kiện mở |
| AS-02.5.1 | ✅ | | 140 Q đều có trả lời hoặc dòng quyết ✍️ |
| AS-02.5.2 | ❌ | HH | 16 dòng ✍️ Đợt 1 lý do <15 ký tự (10 dòng RỖNG; Q-023 = "đơn giản") |
| AS-02.5.3 | ✅ | | artifact rà mâu thuẫn 2026-08-15, khai luật ưu tiên + phạm vi "toàn bộ 127 câu" |
| AS-02.5.4 | ❌ | CX | bảng "Việc còn chờ chủ dự án" không có cột Trạng thái |
| AS-02.5.5 | ❌ | CX | cột "Đã vào" chưa tồn tại (grep = 0) |

### AS-03 (17/25)

| Chỉ báo | | Mã | Bằng chứng |
| --- | --- | --- | --- |
| AS-03.1.1 | ❌ | HH | 2 hit ngoài modules/: index.ts (đã khai) + `shared/validation.test.ts:13` KHÔNG có trong bảng ngoại lệ (bảng khẳng định "hit duy nhất") |
| AS-03.1.2 | ❌ | HH | ≥12 cạnh import chéo MỚI chưa khai (forum→content, exams→knowledge+models+retention, knowledge↔models **chu trình**, progress→retention, onboarding→models, invitations→models…) |
| AS-03.1.3 | ❌ | HH | showcase.ts:18 còn 1 fetch thô (bytes ảnh, có comment nhưng chỉ báo không có miễn trừ) |
| AS-03.1.4 | ❌ | HH | `apps/learn/src/index.css:40-71` (.n12-deep) định nghĩa lại --background/--card/--primary/--n12-ocean-900… — lật ✅ của #004 |
| AS-03.1.5 | ✅ | | 9 thư mục apps ↔ README (data ghi "đã ngừng") |
| AS-03.2.1 | ✅ | | 0 file OpenAPI viết tay ngoài snapshot |
| AS-03.2.2 | ❌ | HH | `PATCH /v1/content/items/{itemId}` không có response 2xx nào; GET /v1/media/{id} 200 không schema (bytes) |
| AS-03.2.3 | ✅ | | 177/177 path /v1 |
| AS-03.2.4 🔴🚸 | ✅ | | contract:diff exit 0, ci.yml:111 mọi push; 1 route additive mới chưa snapshot (không breaking) |
| AS-03.2.5 | ✅ | | probe production trả {error:{code,message}} chuẩn |
| AS-03.3.1-5 | ✅×5 | | 22 entry version+zod; publish↔registry khớp 22/22; tên đúng chuẩn; assertNoFreeText gọi tại events.ts:299; queue config khớp queues.md |
| AS-03.4.1 🔴 | ✅ | | 0 secret hardcode source + git history |
| AS-03.4.2 | ❌ | HH | 17 file ngoài api.ts chứa literal nemo12.com (tăng từ 10), chưa có danh sách miễn trừ |
| AS-03.4.3 | ✅ | | verify:bindings Lớp A xanh |
| AS-03.4.4 | ❌ | CM | Lớp C cần CLOUDFLARE_API_TOKEN — chỉ CI chạy; đúng ghi chú chỉ báo, không coi là PASS đủ |
| AS-03.4.5 | ✅ | | Lớp B xanh — config.md khớp wrangler |
| AS-03.5.1-2 | ✅×2 | | 9 wrangler ↔ 9 workflow path filter đúng; 0 workers.dev trần |
| AS-03.5.3 🚸 | ❌ | CM | gh api → 403 (plan); nhánh (b): quy ước có, nhưng dòng mồ côi 0046 phát sinh 2026-08-18 (trong 7 ngày) → chưa chứng minh được |
| AS-03.5.4 | ✅ | | apply migration trước deploy trong deploy-api.yml |
| AS-03.5.5 | ✅ | | 9/9 URL README trả 200/302, khớp custom_domain |

### AS-04 (19/30)

| Chỉ báo | | Mã | Bằng chứng |
| --- | --- | --- | --- |
| AS-04.1.1 🔴🚸 | ✅ | | 67 file, 0 trùng, liên tục 0001..0067 |
| AS-04.1.2-4 | ✅×3 | | IF NOT EXISTS đủ; UPDATE có WHERE, 0 DELETE; dryrun xanh (0067 áp được từ rỗng) |
| AS-04.1.5 | ❌ | HH | `wrangler d1 migrations list --remote`: **0067 chưa áp production** |
| AS-04.2.1 | ✅ | | 96/96 bảng production có PRIMARY KEY |
| AS-04.2.2 🔴 | ✅ | | 0 REFERENCES users(email) |
| AS-04.2.3 | ❌ | HH | 70 cột \*\_id không REFERENCES, không danh sách miễn trừ trong data-dictionary |
| AS-04.2.4-5 | ✅×2 | | 0 \_at INTEGER/DATETIME; 0 json_extract/LIKE trong workers/api/src |
| AS-04.3.1 | ✅ | | 96 bảng prod ↔ 97 mục dict (thừa duy nhất d1_migrations — bookkeeping) |
| AS-04.3.2 | ❌ | HH | 400/1.009 cột mô tả rỗng/chép ràng buộc ("NOT NULL", "—") |
| AS-04.3.3 | ✅ | | 97 bảng dict đều có trong migrations |
| AS-04.3.4 | ❌ | HH | generator cắt cụt CHECK đa dòng: consents.scope (7 giá trị) hiện "IN (" rỗng, goal kind (9), source_role (3) |
| AS-04.3.5 | ❌ | HH | 3 cột status có CHECK vắng trong state-machines.md + 3 cột status không CHECK không có mục |
| AS-04.4.1 | ❌ | HH | 6 script `--remote --yes` không in tên DB/không chờ xác nhận (seed-labs, seed-orca-math, seed-items-empty, attach-figures, regroup-modules, seed-items-topup) |
| AS-04.4.2 | ✅ | | seed-labs + seed-orca-math chạy 2 lần local: số dòng không đổi |
| AS-04.4.3 | ❌ | CM | PRAGMA rỗng nhưng chỉ có nghĩa khi 04.2.3 PASS (70 cột ngoài tầm pragma) |
| AS-04.4.4 | ✅ | | 6/6 khóa nghiệp vụ có UNIQUE index thật trong sqlite_master |
| AS-04.4.5 | ✅ | | 0 thiếu name_en/title_en (nợ #004 đã đóng qua 0058) |
| AS-04.5.1 | ❌ | HH | retention_policies 10 dòng nhưng thiếu assessment_responses, portrait_learner_sections, learner_skill_state, learner_retention |
| AS-04.5.2-3 | ✅×2 | | privacy routes + data_deletion_requests; chính sách version 365/90 ngày khai bằng số |
| AS-04.5.4 | ❌ | CX | data-dictionary không có §PII theo trường |
| AS-04.5.5 🔴🚸 | ✅ | | drill 2026-08-22: 96 bảng · 34.978 dòng · 0/96 lệch · 8/8 vân tay · 80s |
| AS-04.6.1 🔴🚸 | ❌ | HH | lệch hiện tại (0067 chưa áp; mồ côi 0046 còn nguyên) chưa được ghi vào reconciliation (bản gần nhất 2026-08-20) |
| AS-04.6.2 | ❌ | HH | 1 dòng mồ côi 0046 (đã khai nhưng chỉ báo đòi = 0) |
| AS-04.6.3 🔴🚸 | ✅ | | schema-diff 2026-08-20: 92 bảng, 0 lệch cột — có ghi lại |
| AS-04.6.4 🔴🚸 | ✅ | | 0 DROP/RENAME COLUMN; 0 ADD NOT NULL thiếu DEFAULT từ mốc 2026-08-15 |
| AS-04.6.5 | ✅ | | mồ côi 0046 có dòng giải thích đầy đủ trong reconciliation |

### AS-05 (23/25)

| Chỉ báo | | Mã | Bằng chứng |
| --- | --- | --- | --- |
| AS-05.1.1-5 | ✅×5 | | 8 trang model reference; 424/425 version deterministic; 425 snapshot có generated_at; models.md đủ 8 model (A4); đổi thuật toán = version mới |
| AS-05.2.1-5 | ✅×5 | | evidence có nguồn (knowledge/routes.ts:237); self-report qua evidence; reliability 4 nguồn; sửa lại không tạo trùng (test); engine_runs 943 |
| AS-05.3.1 | ✅ | | 8/8 engine có test (A5: readiness.test.ts + constraint.test.ts) |
| AS-05.3.2-3 | ✅×2 | | 0 source-regex test; ca rỗng đủ |
| AS-05.3.4 | ❌ | CM | adaptive có test chặn 10 câu, nhưng **diagnostic chỉ dừng nhờ LIMIT 15 trong SQL, không có test chứng minh dừng** |
| AS-05.3.5 🚸 | ✅ | | ci.yml:62 npm test, không || true |
| AS-05.4.1 🔴 | ✅ | | periodic.test.ts bất biến anchor không decay |
| AS-05.4.2-5 | ✅×4 | | công thức decay trong reference + test; cron 21:00 UTC; job chỉ ghi phái sinh; tham số khai trong reference |
| AS-05.5.1-3 | ✅×3 | | mỗi đề xuất có why; version ghi đủ; diffPlans + UI /ke-hoach |
| AS-05.5.4 | ❌ | HH | vẫn 1/425 dòng confidence NULL + 1 model_version NULL (bản ghi cũ chưa dọn) |
| AS-05.5.5 | ✅ | | admin #/models drill-down mọi phiên bản |

### AS-06 (8/25)

| Chỉ báo | | Mã | Bằng chứng |
| --- | --- | --- | --- |
| AS-06.1.1-2 | ✅×2 | | 1.799 node: 0 thiếu subject/grade/level/strand/unit |
| AS-06.1.3 | ✅ | | DFS thật trên 2.234 cạnh unit_prereqs, 11/11 môn: **0 chu trình** |
| AS-06.1.4 | ❌ | HH | 9 Unit đang hiện 0 câu (Văn 7 · Hoá 1 · Anh 1); 234 Unit dưới 10 câu (IELTS 64, SAT 64, Tin 63, AP 18…) — giảm mạnh từ 229 nhưng chưa về 0 |
| AS-06.1.5 | ✅ | | 0 thiếu title_en/name_en toàn bộ |
| AS-06.2.1-3 | ❌×3 | HH | 15.575/15.575 item published: quality_json NULL, 0 evidence theo chiều, 0 item ≥2 evaluator |
| AS-06.2.4-5 | ✅×2 | | 0 item thiếu node_id; content_reports (7 dòng) nối hàng đợi thật |
| AS-06.3.1 🔴 | ❌ | HH | 0 candidate, 0 item_versions; trigger 0067 chưa tồn tại trên production |
| AS-06.3.2 | ✅ | | CHECK vòng đời khai ở schema (items + item_versions) |
| AS-06.3.3-4 | ❌×2 | HH | ngưỡng 0.72/0.50/≥2 có trong code nhưng publish thật không qua; published_by NULL 15.575/15.575 |
| AS-06.3.5 | ❌ | CX | endpoint rollback + publishVersion đã có (mới) nhưng item_versions = 0 → chưa item nào rollback được thật |
| AS-06.4.1-5 | ❌×5 | CX | 0 đề thật (exams 240 NULL + 150 generated); chưa crawler — CS-07 seed 3×3×3 chưa bắt đầu (2 dòng 🔴) |
| AS-06.5.1-2, 5.4-5 | ❌×4 | CX | bảng media 0 dòng |
| AS-06.5.3 | ✅ | | zero-asset còn đúng: 0 file ảnh trong learn/marlins, hình SVG từ tham số |

### AS-07 (22/25)

| Chỉ báo | | Mã | Bằng chứng |
| --- | --- | --- | --- |
| AS-07.1.1 🔴🚸 | ✅ | | authCoverage.test.ts 8/8 pass hôm nay — 192 route, 22 public có chủ đích, danh sách có răng |
| AS-07.1.2-3 | ✅×2 | | sessions expires/revoked/rotated; issuer+audience ghim |
| AS-07.1.4 🚸 | ✅ | | admin + dolphin đều 302 → cloudflareaccess login (curl hôm nay) |
| AS-07.1.5 | ✅ | | 0 đường tắt auth |
| AS-07.2.1 🔴🚸 | ✅ | | lớp authz trong authCoverage pass — 12 module {learnerId} |
| AS-07.2.2 🔴 | ✅ | | 1 hit .email === là chuẩn hoá token, không phải quyền |
| AS-07.2.3 🔴🚸 | ✅ | | parent/authz.test.ts 22/22 pass |
| AS-07.2.4 | ✅ | | 3 route mentor đều qua requireLearnerAccess → auditLearnerAccess; mentor/authz.test.ts chứng minh sinh dòng audit (0 traffic thật chưa có — thuộc tính code đạt) |
| AS-07.2.5 | ✅ | | permissions.md khớp từng nhánh learnerAccess() |
| AS-07.3.1 | ❌ | CM | data-dictionary không ghi mục đích thu thập cho trường dữ liệu trẻ em (gốc B5) |
| AS-07.3.2 🔴🚸 | ✅ | | consents 26 dòng + consent.test.ts |
| AS-07.3.3 | ❌ | CM | code chặn đúng (portraits/routes.ts:183) nhưng test không tồn tại — bằng chứng #004 không tái lập được |
| AS-07.3.4-5 | ✅×2 | | 0 fetch ra ngoài chưa khai; ChildReport cho parent thấy dữ liệu + reason |
| AS-07.4.1 | ❌ | HH | GET /v1/admin/learners trả learner data (kèm email phụ huynh) **không logAccess** |
| AS-07.4.2-5 | ✅×4 | | schema đủ; sanitiseDetail redact; không sửa/xoá được; endpoint truy vấn có lọc |
| AS-07.5.1-3, 5.5 | ✅×4 | | 0 secret; 0 debug/seed route; zod mọi route; ratelimit + test |
| AS-07.5.4 | ✅ | | 3 hit dangerouslySetInnerHTML đều là katex/template server, không input người dùng |

### AS-08 (22/25)

| Chỉ báo | | Mã | Bằng chứng |
| --- | --- | --- | --- |
| AS-08.1.1-3 | ❌×3 | CM | không có bản đồ worker→tier; 5 câu SDD-006 §16 chưa có văn bản trả lời; SDD mới không có mục "hỏng thì thấy gì" |
| AS-08.1.4 🚸\* | ✅ | | /v1/health 200 {"database":"ok"} — SELECT 1 thật |
| AS-08.1.5 | ✅ | | 1 TODO duy nhất có mô tả, không chặn |
| AS-08.2.1-5 | ✅×5 | | idempotencyKey 10 điểm; DLQ khai; replay endpoint + DLQ 0 dòng; max_retries 5; cron withLock 6h |
| AS-08.3.1-5 | ✅×5 | | 9/9 observability; request_id xuyên suốt (kể cả cron); taxonomy lỗi; engine_runs 943/workflow_runs 109/0 failed; đọc được không cần log thô |
| AS-08.4.1 🚸 | ✅ | | typecheck→lint→test trước deploy ở cả 2 workflow |
| AS-08.4.2-5 | ✅×4 | | paths filter đủ 9; migration trước code; rollback.yml; chỉ migration-apply là dispatch có lý do |
| AS-08.5.1-5 | ✅×5 | | AI fallback; reliability.test KV/D1 chết vẫn trả; withTimeout 5 điểm; cache KV; lỗi tiếng người |

### AS-09 (6/25)

| Chỉ báo | | Mã | Bằng chứng |
| --- | --- | --- | --- |
| AS-09.1.1-5 | ❌×5 | CX | ui-minimalism-audit.md chưa tồn tại — không artifact để chấm |
| AS-09.2.1 | ❌ | HH | hex trần trên UI: Learning.tsx:1488 `#0A1F3C` trên nút; index.css:85,130,154-156 gradient/nút không token |
| AS-09.2.2 | ❌ | HH | 3 cặp bản-sao-y-hệt đã LỆCH: N12Art (IconFastForward), Tour (font-extrabold≠bold), schoolsInfo (informatics) |
| AS-09.2.3 | ✅ | | chỉ 6 index.css cấp app, 0 CSS theo trang |
| AS-09.2.4 | ✅ | | 9 theme .theme-\* chỉ đè --school-mark |
| AS-09.2.5 | ❌ | HH | coral DataQuality.tsx:105,136 + App.tsx:789 — text-xs (12px) cho chữ đọc thật, dưới sàn 14px |
| AS-09.3.1 🔴 | ❌ | HH | `npm run contrast` 148 cặp: 147 đạt, **1 trượt** — text-white/bg-ocean-500 = 3,75:1 (ProgressViews.tsx:740); chưa chạy axe trên màn thật |
| AS-09.3.2-3, 3.5 | ❌×3 | CM | cần trình duyệt thật (tab/touch/keyboard) — không bịa |
| AS-09.3.4 | ✅ | | 0 img thiếu alt (hit duy nhất là assertion CẤM img — đính chính #004) |
| AS-09.4.1-2 | ❌×2 | HH | admin/ui.tsx:94,99 "chưa có"/"(chưa đặt tên)" — chuỗi Việt ngoài ngoại lệ popover, lật ✅ #004 |
| AS-09.4.3 | ❌ | HH | glossary "Đang lung lay"/"Cần xây lại từ gốc" ≠ UI "Cần ôn lại"/"Nên học lại từ gốc" |
| AS-09.4.4 | ✅ | | errorResponse tiếng người, UI không phơi stack |
| AS-09.4.5 | ❌ | CM | đòi rà mắt từng màn — chưa có artifact |
| AS-09.5.1-2 | ❌×2 | CM | LCP/CLS cần Lighthouse; chưa có ngưỡng khai kèm số đo |
| AS-09.5.3 | ✅ | | spot-check 5 màn đủ loading/empty/error |
| AS-09.5.4 | ✅ | | zero-asset SVG, test cấm cả .png/.jpg |
| AS-09.5.5 | ❌ | HH | Learning.tsx:507-511 — đúng/sai chỉ hiện sau round-trip server, không chấm client-side trước |

### AS-10 (19/25)

| Chỉ báo | | Mã | Bằng chứng |
| --- | --- | --- | --- |
| AS-10.1.1 🔴 | ✅ | | một điểm env.AI.run duy nhất, qua gateway (prompts.ts:303,307) |
| AS-10.1.2 🔴 | ✅ | | một model duy nhất, không probe |
| AS-10.1.3-5 | ✅×3 | | model id tường minh; 0 AI từ frontend; 3 điểm gọi khớp ai-registry (line refs trong registry hơi cũ — nên cập nhật) |
| AS-10.2.1-5 | ✅×5 | | prompt registry đủ: version, PROMPT_HISTORY (v1 retired), purpose/input/ràng buộc, zod output |
| AS-10.3.1 🔴🚸 | ✅ | | context-builder đường duy nhất, có test |
| AS-10.3.2-4 | ✅×3 | | hạn mức dòng theo purpose (test); không tên thật/email; input_ref lưu đủ (generation_runs + runlog) |
| AS-10.3.5 🔴🚸 | ✅ | | test learner A không lọt sang B |
| AS-10.4.1 🔴🚸 | ❌ | HH | 15.575/15.575 quality_score NULL; chấm bù rule-engine@1 **chưa hề chạy trên production** |
| AS-10.4.2 | ❌ | HH | 0 item ≥2 evaluator (pipeline hỗ trợ 3 nhưng chưa gì đi qua) |
| AS-10.4.3 | ❌ | CM | cơ chế 20%-hash có trong code (quality.ts:306) nhưng chưa có báo cáo độ phủ, 0 lượt người chấm |
| AS-10.4.4 | ✅ | | source='ai-generated' + cờ ai_generated trả tới UI + provenance |
| AS-10.4.5 | ✅ | | content_reports → enqueueReview, không hư vô |
| AS-10.5.1 | ❌ | CX | ai-registry không có ước tính chi phí nào |
| AS-10.5.2-3 | ❌×2 | CM | không token scope đọc Gateway (L7) |
| AS-10.5.4-5 | ✅×2 | | cron 1/ngày + withLock + cap; route AI chỉ staff + ratelimit |

## 9. Trace

| Nguồn | Chuẩn | Ghi vào |
| --- | --- | --- |
| SRC-495 (hệ tiêu chuẩn chất lượng 3 lớp; "pass 100% audit mới coi là xong") | [audit-standard v0.2](../audit-standard/index.md) + [content-standards](../content-standards.md) | báo cáo này + [index](index.md) + việc B1..B16 |
