---
url: https://docs.nemo12.com/quality/course-audit.md
description: >-
  Rubric chấm một Course theo thang 100 bằng audit-course.mjs, ngưỡng đạt từ 90
  điểm trước khi commit thêm nội dung.
---

# Rubric audit một Course (SRC-616)

Chấm bằng máy: `node scripts/audit-course.mjs <course_id>` (chạy sau `npm run migrate:dryrun`).
**Ngưỡng đạt ≥90/100** — dưới ngưỡng thì course chưa được commit tiếp nội dung mới; nâng cấp rồi
chấm lại. Rubric là điều kiện CẦN (máy đo số lượng, hiện diện, mối nối); chất lượng câu chữ do
vòng review theo [CD-4/CD-8/CD-9/CD-10](../reference/course-design-standard/foundations.md) — sửa ngưỡng thì
sửa file này trước, script theo sau.

| Nhóm | Mục | Điểm |
|---|---|---:|
| **A · Cấu trúc (30)** | A1 Unit 3-5 | 5 |
| | A2 Lesson mỗi unit 3-5 | 5 |
| | A3 Big Idea + Essential Question mỗi unit | 6 |
| | A4 Key concepts 3-5 | 4 |
| | A5 Ngữ liệu ≥2 mỗi unit | 4 |
| | A6 Khung tư duy 2-3 | 3 |
| | A7 Guiding Question + concepts mỗi lesson | 3 |
| **B · Outcomes & assessment (40)** | B1 Unit Outcomes 2-4 | 6 |
| | B2 Performance Task đủ đề + sản phẩm nộp | 6 |
| | B3 Tiêu chí chấm 3-5 | 4 |
| | B4 ≥60% tiêu chí nối về outcome | 4 |
| | B5 Lesson Outcomes 1-2 | 4 |
| | B6 Formative checks 2-4 mỗi lesson | 6 |
| | B7 ≥60% checks nối về outcome | 4 |
| | B8 Học liệu 1-3, ≥1 kèm reflection | 6 |
| **C · Spec (30)** | C1 Course spec đủ purpose · progression · assessment strategy · completion criteria | 4 |
| | C2 Course outcomes 2-4 + prerequisites ≥1 | 4 |
| | C3 Unit spec đủ purpose · progression · mastery criteria | 4 |
| | C4 Unit prerequisites ≥2 dòng | 3 |
| | C5 Misconception Map unit 3-5 | 4 |
| | C6 Lesson misconceptions 3-5 | 4 |
| | C7 Lesson errors 2-4 | 3 |
| | C8 Interventions ≥3 mỗi lesson | 4 |

## Cổng chặn trước khi chấm — dữ liệu trùng

Script dừng với mã lỗi **trước khi tính điểm** nếu phát hiện nhãn bị ghi nhiều lần trong cùng một
chỗ (`curriculum_unit_elements`, `curriculum_unit_outcomes`, `curriculum_lesson_checks`).

Vì sao cần cổng riêng thay vì một mục điểm: **mọi mục của rubric chấm theo KHOẢNG** ("3-5 key
concept", "≥2 ngữ liệu"), nên một course bị đổ hai lần bằng hai đường ống đánh `seq` khác nhau vẫn
lọt lưới và vẫn ăn đủ điểm. Ca thật 2026-08-27: migration `0091` để lại 18 dòng khung tư duy thay
vì 12 — A6 trượt vì trần là 3, nhưng **A4 và A5 vẫn xanh dù cũng nhân đôi**. Điểm cao trên dữ liệu
hỏng nguy hơn điểm thấp, nên đây là điều kiện chặn chứ không phải điểm trừ.

Mục theo tỷ lệ: đơn vị nào đạt thì ăn phần điểm của đơn vị đó (3/4 unit đạt A4 = 3đ). Quy trình
chuỗi soạn (goal SRC-616): xoay vòng Toán → Ngữ văn → Tin (lập trình thi đấu) → Tiếng Anh, mỗi
vòng một course; nội dung viết ở `scripts/course-content/<course_id>.json`, đổ bằng
`scripts/course-content-to-sql.mjs` thành migration, audit đạt ≥90 rồi mới commit và sang course kế.
Học liệu chỉ dùng nguồn thật: lab id có trong D1, hoặc URL pearl.nemo12.com có file tương ứng
trong `apps/pearl/content` — cấm bịa link (CD-7.2).

## Rubric cấp Lesson-draft của Content Foundry (SRC-632, thang v2 theo SRC-633)

Thang chấm **bản thảo lesson máy sinh** trong workflow LessonForge
([SDD-027](../architecture/sdd-027-content-foundry/pipeline.md) §4) — thi hành ở
`workers/foundry/src/rubric.ts`. **File này là chuẩn: sửa tiêu chí / điểm / ngưỡng thì sửa đây
TRƯỚC, tăng `RUBRIC_VERSION` trong `rubric.ts` theo sau.** Điểm chỉ so được giữa các trial cùng
`rubric_version` (stamp vào R2 + `content_run_trials`, migration 0165).

Cùng triết lý thang A/B/C ở trên: **điều kiện CẦN** — máy chỉ đo số lượng, hiện diện, mối nối và
dấu hiệu văn phong bắt được bằng máy; chất lượng câu chữ là việc của vòng review model khác và
của người duyệt.

| Mục | Tiêu chí | Điểm | Ghi chú |
|---|---|---:|---|
| L1 | Guiding question là câu hỏi thật (kết thúc `?`) | 8 | |
| L2 | Outcomes 1-2 mục | 2 | schema đã ép — dây an toàn |
| L3 | Outcome không dùng giọng sách giáo khoa | 8 | regex TEACHER_VOICE |
| L4 | Story đủ bốn phần SCQA, câu hỏi là câu hỏi | 10 | |
| L5 | Story không chép nguyên văn guiding question | 6 | |
| L6 | Misconception 3-5 mục | 3 | schema đã ép |
| L7 | Misconception không trùng nhau | 6 | |
| L8 | Lỗi hay mắc 2-4 mục | 2 | schema đã ép |
| L9 | Interventions ≥3, đủ bằng chứng + hành động | 4 | schema đã ép |
| L10 | Học liệu 1-3, ≥1 kèm reflection | 8 | phần reflection schema KHÔNG ép |
| L11 | Checks 2-4 mục | 2 | schema đã ép |
| L12 | ≥60% checks nối về outcome **có thật** | 8 | mối nối ma không tính (= B7 thang course) |
| L13 | Đủ chỗ đặt nhiễu: ≥1 mcq và số misconception ≤ mcq×3 | 12 | bất biến 5g — cùng hằng số với cổng chặn của `audit-course.mjs` |
| L14 | Không có dấu gạch dài (em dash) | 6 | |
| L15 | Misconception không trùng nguyên văn với error | 6 | CD-8: hai loại, hai đơn thuốc |
| L16 | Mối nối với Unit hợp lệ: concepts ⊆ key concepts, `unit_code` có trong Misconception Map | 9 | chỉ chấm khi brief mang ngữ cảnh unit; thiếu thì tính đủ điểm, max giữ 100 |

**Ngưỡng đạt ≥90/100** (`PASS_SCORE`). Điểm chết (tiêu chí schema bảo đảm sẵn) là 13/100 — thang
v1 là 44/100 nên "90" khi ấy thực chất là "được rớt đúng một tiêu chí". **Vòng sửa chạy khi CÒN
BẤT KỲ chỗ chưa đạt nào**, không chỉ khi dưới ngưỡng: bài 92 điểm mang guiding question không
phải câu hỏi vẫn phải được vá. So với thang course ở trên: L12 = B7, L6 = C6, L8 = C7, L9 = C8,
L10 = B8 — hai thang cùng đo một chuẩn CD-8 ở hai thời điểm (trước khi chạm D1 / sau khi nạp D1).
