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. Đâ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 (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: 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)
- 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). - 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 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.
- Trace docs hụt chiều ngược: 114/356 REQ active không nằm trong
satisfiescủ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 filedocs/knowledge/*.mdmồ côi.check:docsxanh vì nó chỉ kiểm chiều xuôi — cần nâng cổng. 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.- 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).
- 6 seed script ghi production bằng
--remote --yeskhông chốt xác nhận (04.4.1) — cùng họ với lỗ hổngscripts/d1.mjsmà #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 |
| 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 | |
| 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 | |
| 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 + content-standards | báo cáo này + index + việc B1..B16 |