---
url: https://docs.nemo12.com/engineering/content-loading-notes.md
description: >-
  Ghi chép nạp nội dung B21 mẻ 18.08.2026: số đo thật trên code và D1, cây
  curriculum SRC-246 có sẵn, để mẻ sau khỏi dò lại.
---

# Khảo sát trước khi dựng cây B21 + sinh Experience (chuẩn bị cho mẻ chạy 05:15, 18.08.2026)

Ghi lại những gì đã đo được trên code và D1 thật, để mẻ chạy sau không phải dò lại và không
phải đoán. Mọi con số dưới đây lấy bằng lệnh, không phải từ trí nhớ.

## 1. Cây curriculum đã có sẵn, không cần nghĩ lại

SRC-246 đã viết xong cây cho cả hai môn trong `apps/pearl/content/curriculum/`. Các bảng unit ở
đó là **máy đọc được** (4 cột: Unit · Mastery level · Lớp VN · Key concept), nên đã viết
`scripts/curriculum-parse.mjs` để đọc thẳng ra thay vì gõ lại lần thứ hai.

```
node scripts/curriculum-parse.mjs
```

| Môn | Package | Module | Unit | Unit chạm lớp 4-7 |
| --- | --- | --- | --- | --- |
| toan | 5 | 21 | 82 | 49 |
| van  | 5 | 18 | 57 | 39 |

Đủ rộng để lấy 30 Experience mỗi môn mà vẫn chia đều bốn lớp (lớp 4: 33 unit toán / 23 unit văn;
lớp 5: 33/27; lớp 6: 35/27; lớp 7: 32/27).

**Một chỗ vênh cần báo chủ dự án, KHÔNG tự sửa:** số tự khai trên `toan/index.md` lệch với chính
bảng của nó — package 2 ghi "18 unit" nhưng bảng có 20, package 3 ghi 16 nhưng bảng có 17. Lấy
BẢNG làm chuẩn (bảng là nội dung, con số tóm tắt là thứ dễ quên cập nhật). Ngoài ra module 2.5
đang nằm giữa 2.2 và 2.3 trong file, thứ tự trình bày sai.

## 2. "Learning Experience" trong learn thực chất là gì

Đây là chỗ dễ làm sai nhất, nên đo kỹ:

* Bảng `learning_experiences` **chỉ có 6 dòng, tất cả `kind='assessment'`, 0 dòng `kind='lx'`**, và
  chỉ Coral (`workers/api/src/modules/coral/routes.ts`) đọc/ghi nó ở trạng thái `draft`.
  **App learn KHÔNG đọc bảng này.** Nạp 60 dòng vào đây thì learner không thấy gì hết.
* Cái learner thật sự chạy (`apps/learn/src/Learning.tsx`) ghép từ ba nguồn:
  1. `skill_nodes` — một unit = một node (`subject_id`, `id`, `strand`, `grade`, `module`, `unit`…)
  2. `items` — bộ câu hỏi của node đó (MCQ: `prompt`, `options_json`, `correct_index`, `misconception`)
  3. `apps/learn/src/explore/configs.tsx` — widget khám phá, **nằm trong CODE**, khoá theo node id
     (`hasExplore`/`exploreKey`). Muốn có phần "khám phá" thì phải sửa code, không nạp DB được.
* Assessment mà learner đang dùng là **đề thi**: `exams` + `exam_questions`
  (`apps/learn/src/ExamPractice.tsx`). Hiện có 21 đề/lớp cho math và vietnamese, **chỉ lớp 6-9**.
  Lớp 4-5 chưa có đề nào — đây chính là khoảng trống cần lấp.

### Kết luận cho mẻ chạy

* **30 Learning Experience/môn** = 30 unit node (lớp 4-7) có đủ `items`, cộng explore config cho
  những unit hợp với thao tác trực quan.
* **30 Assessment Experience/môn** = 30 bản ghi `exams` + `exam_questions`, ưu tiên **lấp lớp 4-5**
  rồi mới tới 6-7.
* Không đụng `learning_experiences` trừ khi có ý định wire renderer — mà việc đó phải hỏi trước.

## 3. Ràng buộc khi ghi

* D1 chặn 100 tham số/câu lệnh → chia lô ≤20 dòng. Mẫu script: `scripts/mathify-items.mjs`.
* Token wrangler hết hạn thì chạy `npx wrangler d1 execute nemo12-platform --remote --command "select 1"` một lần.
* `items.role` chỉ nhận `canonical|variant|boundary|discriminator`; `exams.exam_type` chỉ nhận
  `semester|selective`; `term` chỉ nhận `giua_ki_1|cuoi_ki_1|giua_ki_2|cuoi_ki_2`.
* Công thức toán viết `$…$` (KaTeX). Đơn vị đo để nguyên Unicode, không bọc math.
