---
name: curriculum
trigger: "thiết kế lộ trình | xây lộ trình học | học lĩnh vực mới | tạo curriculum | roadmap học | muốn học từ đầu | bắt đầu học lĩnh vực mới | decompose lĩnh vực | đóng gói quest | tạo quest cho"
requires: "custom-research-pipeline"
mutates: true
default_read_limit: "routing-rules + 1 curriculum MOC mẫu (curriculum-ai-pilot) + moc lĩnh vực nếu đã có"
desc: "Kiến trúc sư lộ trình học (Phase 0): hỏi mục tiêu → HỎI + LẤY nguồn chuẩn (rút TOC thật bằng tool) → decompose ánh xạ từ TOC → dựng curriculum MOC (DAG) + scaffold nhẹ → bàn giao cho research + study. Gate cứng: chưa có TOC thật thì KHÔNG decompose."
llm_managed: true
slash: curriculum
slash_expand: "thiết kế lộ trình học {lĩnh vực}"
---

# Skill: CURRICULUM — kiến trúc sư lộ trình học (Phase 0)

> ✅ **Năng lực:** web tool ĐÃ chạy — tìm nguồn qua `$$WEB_SEARCH$$`, đọc trang qua `$$WEB_FETCH$$` (fetch tự fallback 3 tầng), ghi vault qua `$$WRITE$$`, NotebookLM qua `$$NLM_TOOL$$`. Khâu tìm + verify nguồn web nên `$$LOAD_SKILL: web-research$$` để theo playbook (vault-first → chấm nguồn → trích dẫn).
>
> ⚠️ **TRƯỚC khi gọi NotebookLM, BẮT BUỘC `$$LOAD_SKILL: notebooklm$$`** để lấy đúng cú pháp wrapper + danh sách tool THẬT. Cú pháp đúng: `$$NLM_TOOL: <tool_name>$$<args_json>$$END_NLM_TOOL$$`. TUYỆT ĐỐI không tự bịa tên hàm — **không có `notebook_find`**. Chain rút TOC: `notebook_list` (lấy `notebook_id`) → `notebook_describe` (lấy `source_id` của tài liệu chuẩn) → `source_get_content` (TOC gốc verbatim) **hoặc** `notebook_query` (answer tổng hợp — KHÔNG phải TOC verbatim).

## Mục tiêu

Khi user muốn học **một lĩnh vực** (mới từ 0, **hoặc đã có note nhưng phân mảnh → rebuild theo TOC**), skill này dựng **bộ khung học**: mục tiêu → nguồn chuẩn → dimensions (cluster) → lộ trình DAG → scaffold nhẹ. Nó là **đầu vào** của pipeline học, KHÔNG tự dạy.

## Định vị trong pipeline học

```
curriculum (skill này)        → Phase 0: thiết kế lộ trình + decompose + bộ nguồn + scaffold
  └─ custom-research-pipeline  → Phase 1: nghiên cứu từng cluster → đổ note thật (NLM + web)
       └─ study                → Phase 2: học có tracking (rubric 17, 2 tầng)
            └─ learning-mode    → lõi dạy
```

`curriculum` **điều phối**, không xây trùng: research đi qua `custom-research-pipeline`, dạy qua `study`/`learning-mode`.

## Khi nào dùng

- "muốn học [lĩnh vực mới] từ đầu" (3D, video editing, BA, copywriting…) mà vault chưa có cụm note.
- "thiết kế lộ trình học cho X", "decompose lĩnh vực X ra để học".

## Khi nào KHÔNG dùng

- Lĩnh vực đã có curriculum + note → dùng thẳng `study`.
- Chỉ hỏi/nghiên cứu 1 topic lẻ → `query` / `custom-research-pipeline`.

## Máy trạng thái

Adaptive — đường chính để giữ kỷ luật, được phép branch theo thực tế domain. Bản đồ điều hướng, không phải đường ray.

```md
BẮT_ĐẦU
  -> CHỐT_MỤC_TIÊU + SCOPE  (hỏi mỗi lần: goal-first vs comprehensive)
  -> HỎI_NGUỒN  (BẮT BUỘC, trước decompose: "Sếp đã có tài liệu CHUẨN cho lĩnh vực này chưa, đang để ở đâu?" — notebook NLM nào / file trong máy / link / hay chưa có cần Bob đi tìm?)
  -> LẤY_NGUỒN + RÚT_TOC  (bằng TOOL — KHÔNG bịa từ trí nhớ)
       -> đã có (NLM/file/link) → ($$LOAD_SKILL: notebooklm$$ trước) notebook_list → notebook_query/source_get_content, hoặc $$WEB_FETCH$$ → rút TOC/cấu trúc THẬT từ chính nguồn đó
       -> chưa có            → $$WEB_SEARCH$$ + $$WEB_FETCH$$ tìm sách/khoá chuẩn → lấy TOC thật; HOẶC đề xuất tài liệu từ trí nhớ (gắn ⚠️ "chưa kiểm chứng") + đưa LINK để sếp tải/nạp NLM
       -> trình danh sách nguồn → user CHỌN; nguồn user tự tải/tự thêm NLM → đưa link; hỏi "đã upload NLM chưa → xin link notebook/file"
  -> [GATE CỨNG] CÓ TOC THẬT TRONG TAY?  ── KHÔNG ──> quay lại LẤY_NGUỒN. TUYỆT ĐỐI không decompose bằng trí nhớ.
  -> KIỂM_DOMAIN  (DISCOVERY chủ động: $$LIST$$ folder CHUYÊN MÔN + $$SEARCH$$ domain + đọc MOC/sample note → domain đã có folder-home/slug/MOC chưa? note cũ KHÔNG thay TOC)
  -> DECOMPOSE  (ánh xạ TỪ TOC → dimensions = cluster; mỗi dimension truy về ≥1 mục TOC; KHÔNG bám MOC cũ; user duyệt bảng)
  -> FOLDER + GOM + INDEX  (NGAY SAU decompose; XIN DUYỆT)
       -> folder-home: REUSE nếu domain đã có (vd 3.8 Business Analys/, slug 'ba') — KHÔNG đẻ <domain>/ trùng. Dimension subfolder = <số>.<Tên có dấu>/ (convention vault) + _unsorted/
       -> vault đã có note → BẢNG GOM (note → dimension) → duyệt → $$MOVE$$ từng note (wikilink auto-update); handwritten: move-only, không sửa body; không chắc → _unsorted/
       -> supersede MOC cũ (rewrite trỏ dimension mới / archive 7.ARCHIVES — user duyệt); 1 note _index.md mỗi folder dimension (type:moc, KHÔNG learn_*)
       -> BẢO TOÀN learn_* sẵn có (KHÔNG đụng). KHÔNG mass-stamp learn_curriculum lên note parked — membership stamp ở Bước 5 (activation), nếu không 75 note tràn dashboard
  -> DỰNG_DAG + ACTIVATE + STUB_PILOT  (XIN DUYỆT lộ trình trước khi ghi)
       -> DAG beginner→advanced + prerequisite; ACTIVATE topic vào DAG = stamp learn_curriculum + learn_order (ĐIỂM membership DUY NHẤT); stub ~5–8 topic ĐẦU (scope goal-first: chỉ cluster ưu tiên)
       -> hỏi user duyệt lộ trình → ghi 8.TRACK/Learning/curriculum-<domain>.md → $$REGEN_PROGRESS$$
  -> SCAFFOLD_PHỤ  (so-hoc-<domain> [section topic ACTIVE] + so-do-<domain> + dashboard infra nếu chưa có)
  -> ĐÀO_SÂU  → custom-research-pipeline đổ note nguồn đã chọn vào folder dimension (Phase 1, làm dần; đăng ký khi active)
  -> BÀN_GIAO  → study (học) · custom-research-pipeline/notebooklm (đào sâu cluster)
  -> KẾT_THÚC
```

### State bắt buộc tối thiểu
- **CHỐT_MỤC_TIÊU + SCOPE** (hỏi mỗi lần) — scope CÓ tác dụng: goal-first thu hẹp cluster sâu.
- **HỎI_NGUỒN** — hỏi sếp đã có tài liệu chuẩn chưa, để ở đâu — trước khi lấy nguồn.
- **LẤY_NGUỒN + RÚT_TOC bằng tool** (chain NLM tới `source_get_content`) — không decompose bằng trí nhớ; TOC phải đủ mịn để map dimension.
- **GATE CỨNG**: chưa có TOC thật → KHÔNG được sang DECOMPOSE.
- **DECOMPOSE ánh xạ từ TOC** — không tự bịa dimension, KHÔNG bám MOC cũ.
- **DISCOVERY domain trước GOM** — `$$LIST$$`/`$$SEARCH$$` tìm folder-home/MOC/slug sẵn có; reuse, KHÔNG đẻ trùng.
- **FOLDER + GOM ngay sau decompose** — xin duyệt BẢNG GOM trước khi `$$MOVE$$`.
- **STAMP ở ACTIVATION (Bước 5), KHÔNG lúc move** — curriculum set `learn_curriculum`+`learn_order` cho topic vào DAG; Bước 4 chỉ BẢO TOÀN learn_* cũ, KHÔNG mass-stamp. KHÔNG đụng `learn_reviewed`/`learn_next`/`learn_understood` (study quản).
- **DAG xin duyệt lộ trình** trước khi ghi `8.TRACK`; stub pilot theo thứ tự DAG; emit `$$REGEN_PROGRESS$$`.
- **Đăng ký = ACTIVATION**: topic active có đủ `learn_curriculum` + DAG entry + so-hoc (đặt CÙNG lúc Bước 5). Note parked: đã filed + trong `_index`, **chưa `learn_curriculum`** → chưa hiện dashboard (đúng ý đồ).

### Luật branch
- **Có note sẵn ≠ có cấu trúc chuẩn → REBUILD từ TOC.** Domain đã có note/MOC (vd BA: `3.8 Business Analys/` + `moc-business-analys.md` + đã stamp `learn_curriculum: ba`) → **tái dùng folder-home + slug** (identity), nhưng **dựng lại** dimension + MOC theo TOC (KHÔNG bám taxonomy MOC cũ); MOC cũ bị **supersede** (rewrite/archive — user duyệt), KHÔNG để mồ côi. MAP note cũ vào dimension mới; KHÔNG đẻ folder trùng, KHÔNG bỏ qua decompose.
- **Web + NLM tool ĐÃ chạy** (xem dòng đầu skill): lấy nguồn + rút TOC bằng `$$WEB_SEARCH$$`/`$$WEB_FETCH$$`/`$$NLM_TOOL$$`. Nguồn nào chỉ từ trí nhớ model → gắn ⚠️ "chưa kiểm chứng" + đưa link để sếp verify/nạp NLM.

---

## Quy trình

### Bước 1 — chốt mục tiêu + scope (HỎI MỖI LẦN)
- Hỏi: *"Sếp muốn LÀM được gì cụ thể sau khi học?"* + mức hiện tại + (nếu có) deadline/cường độ.
- **Hỏi scope mỗi lần** (không cố định):
  - **Goal-first** — học đủ để làm được mục tiêu (hẹp, thực dụng).
  - **Comprehensive** — hiểu cả lĩnh vực (nhiều dimension, dài hơn).
- Tên lĩnh vực → đặt `<domain>` slug **tạm** (kebab, vd `video-editing`). **Slug CHỐT ở Bước 4a** sau discovery (domain đã có → reuse slug `learn_curriculum` sẵn có, vd `ba`).

### Bước 2 — HỎI nguồn → LẤY nguồn → RÚT TOC thật (BẮT BUỘC trước decompose)

**2a. HỎI trước (luôn):** *"Sếp đã có tài liệu CHUẨN cho lĩnh vực này chưa, đang để ở đâu?"* — notebook NLM nào / file trong máy / link / hay chưa có cần Bob đi tìm? KHÔNG tự đoán, KHÔNG nhảy sang decompose khi chưa rõ nguồn.

**2b. Lấy nguồn bằng TOOL theo câu trả lời** (NLM → BẮT BUỘC `$$LOAD_SKILL: notebooklm$$` trước; cú pháp `$$NLM_TOOL: <tool>$$<json>$$END_NLM_TOOL$$`):
- **Nguồn nằm trong NLM** → chạy ĐÚNG THỨ TỰ, mỗi lệnh chờ kết quả rồi mới lệnh sau:
  1. `$$NLM_TOOL: notebook_list$${}$$END_NLM_TOOL$$` → đọc kết quả, chọn `notebook_id` của notebook đúng.
  2. `$$NLM_TOOL: notebook_describe$${"notebook_id":"<id>"}$$END_NLM_TOOL$$` → đọc danh sách source, chọn `source_id` của tài liệu chuẩn (vd BABOK).
  3. `$$NLM_TOOL: source_get_content$${"notebook_id":"<id>","source_id":"<sid>"}$$END_NLM_TOOL$$` → **TOC gốc verbatim** (ưu tiên). Tài liệu quá dài → `notebook_query` hỏi mục lục/các chương (answer tổng hợp — kém verbatim hơn).
  - KHÔNG bịa hàm (`notebook_find` không tồn tại); KHÔNG in lệnh dạng `tên_hàm{...}` — phải dùng đúng wrapper `$$...$$END_NLM_TOOL$$`.
- **Nguồn là file/link ngoài NLM** → `$$WEB_FETCH$$` đọc thẳng, rút TOC.
- **Chưa có** → `$$WEB_SEARCH$$` + `$$WEB_FETCH$$` tìm tài liệu **gốc/kinh điển** (sách chuẩn, khoá uy tín, docs chính chủ), lấy TOC thật; **hoặc** đề xuất shortlist từ trí nhớ model (gắn **"⚠️ chưa kiểm chứng — sếp xác nhận"**) + **đưa link để sếp tải / nạp NLM**.

**2c. Trình kết quả + KIỂM TOC:** shortlist 3–6 nguồn (vì sao uy tín) + **TOC thật đã rút**. ⚖️ **Ngưỡng TOC đạt:** liệt kê được **chương/mục/bài/knowledge-area cụ thể** đủ mịn để map ≥1 dimension.
- **Nguồn CÓ mục lục in** (sách/docs) → ưu tiên `source_get_content` verbatim; paraphrase mơ hồ = **chưa đạt**, query lại.
- **Nguồn KHÔNG có mục lục in** (video/khoá/playlist/transcript — đã nạp NLM) → cấu trúc = **danh sách bài/phần** lấy qua `notebook_query` ("liệt kê các phần/bài của khoá"); **miễn bám source thật** (không phải trí nhớ) là **ĐẠT** (đây là TOC tự nhiên của nguồn video).

TOC đạt là vật liệu DUY NHẤT cho decompose ở Bước 3.

**2d. Chọn nguồn + chuẩn bị tài liệu chuẩn** (nhánh "chưa có": 2d chạy **GIỮA 2a và 2b** — vòng lặp, không tuyến tính; làm TRƯỚC khi rút TOC rồi quay lại 2b):
- Trình danh sách nguồn (2c) → user **chọn cái nào** làm nguồn chuẩn.
- Nguồn user cần **tự tải / tự thêm vào NLM** (vd video YouTube, sách PDF) → đưa **link rõ** để user tự làm.
- Hỏi: *"Sếp đã thêm tài liệu lên NotebookLM chưa, hay tải về máy?"* — user xác nhận **rồi** → **xin link notebook NLM / đường dẫn file** → quay lại **2b** rút TOC thật từ chính nguồn đó.

### Bước 3 — decompose thành dimensions (ÁNH XẠ TỪ TOC)

> **🚧 GATE CỨNG:** chưa có **TOC thật** (rút ở Bước 2) trong tay → **KHÔNG được decompose**. Quay lại Bước 2. TUYỆT ĐỐI không tự nghĩ dimension từ trí nhớ.

- Lấy **TOC/syllabus đã rút** làm **bộ xương dimensions** — mỗi dimension phải **truy được về ≥1 mục trong TOC** (ghi rõ ánh xạ).
- Mỗi **dimension = 1 cluster (folder)** của domain.
- Vault đã có note domain (kể cả nhiều) **KHÔNG thay TOC**: note cũ là vật liệu để **AUDIT + map** ở Bước 4 — **KHÔNG mặc định đáng tin**, phải kiểm chất lượng / trùng lặp / đúng-sai trước khi xếp chỗ.
- **Domain đã có MOC cũ** (vd `moc-business-analys.md`): **KHÔNG bám taxonomy MOC cũ** — decompose từ TOC; MOC cũ sẽ bị supersede ở Bước 4.
- Trình bảng dimension (kèm cột "ứng với mục nào trong TOC") cho user **duyệt/sửa** trước khi tạo gì.

### Bước 4 — tạo folder/dimension + gom note + index (NGAY SAU DECOMPOSE — xin duyệt)
Sau khi bảng dimension được duyệt, dựng khung vật lý + xếp note cũ vào:

**4a. DISCOVERY note + cấu trúc sẵn có** (BẮT BUỘC trước khi tạo/move):
- `$$LIST: 2.INPUT/3.CHUYÊN MÔN — Kiến thức Chuyên ngành$$` (+ subfolder) và `$$SEARCH: <domain>$$` → tìm **folder-home đã tồn tại**, **MOC cũ**, danh sách note domain.
- Đọc 1 note mẫu lấy **slug `learn_curriculum`** sẵn có (vd `ba`) + MOC cũ. Phân biệt note `llm_managed` (kebab không dấu) vs user viết tay (có dấu).
- **CHỐT `<domain>` slug TẠI ĐÂY** (mọi `<domain>`/`<slug>` trong skill = slug này): domain đã có → **reuse** `learn_curriculum` sẵn có (vd `ba`); domain mới → dùng slug tạm Bước 1. Từ giờ MỌI file `curriculum-<domain>` / `so-hoc-<domain>` / `so-do-<domain>` + giá trị `learn_curriculum` đều theo slug đã chốt — TUYỆT ĐỐI không để lệch.

**4b. Folder-home + dimension subfolder:**
- **Folder-home**: domain đã có → **REUSE** (vd `2.INPUT/3.CHUYÊN MÔN — Kiến thức Chuyên ngành/3.8 Business Analys/`), KHÔNG đẻ `<domain>/` trùng. Chưa có → tạo theo `_agent/routing-rules.md` (chuyên ngành → CHUYÊN MÔN; tư duy/nhận thức → `1.FOUNDATION`/`2.COGNITIVE`; nhập nhằng → hỏi). **Domain mới dưới CHUYÊN MÔN**: `$$LIST$$` lấy số `3.X` lớn nhất hiện có → đặt `3.<X+1> <Tên>` (nhập nhằng → hỏi).
- **Dimension subfolder**: dưới folder-home tạo **1 subfolder mỗi dimension** theo convention vault `<số>.<Tên có dấu>/` (vd `1.Nền tảng BA/`, `2.Elicitation & Stakeholder/`…) + `_unsorted/`. Folder **sinh ngầm** khi `$$WRITE$$` note `_index` hoặc `$$MOVE$$` note đầu vào path (không có lệnh tạo folder rỗng).

**4c. AUDIT → GOM note cũ** (nếu domain đã có note) — **KHÔNG blind-move**:
> ⚠️ **AUDIT TRƯỚC MOVE — bắt buộc khi rebuild HOẶC khi user nghi ngờ độ tin cậy note cũ.** Đọc **NỘI DUNG** (không chỉ title) từng note → ra **1 trong 6 hành động** (KHÔNG mặc định "note cũ đáng tin để xếp chỗ"):
> - **Keep** — khớp topic + chất lượng ổn → giữ
> - **Refill** — đúng chỗ nhưng nội dung yếu / sai / chưa kiểm chứng → viết lại từ nguồn uy tín (ghim `sources` + `confidence` + `last_reviewed`)
> - **Merge** — trùng / chồng lặp với note khác → gộp
> - **Rename** — tên lệch topic / gây hiểu nhầm / sau merge → đổi (CHỌN LỌC, không hàng loạt, không đổi chỉ vì style, không nhồi số topic vào tên file; note viết tay không đổi)
> - **Move-out** — không thuộc dimension nào của domain → để tầng/domain khác xử lý
> - **Archive** — lỗi thời / không nên ở vault → `7.ARCHIVES/`
1. **Audit + phân loại**: đọc nội dung mỗi note → gán hành động + dimension đích (căn cứ TOC). Không chắc → `_unsorted/`.
2. **GAP analysis**: so **topic trong TOC** vs **note hiện có** → topic nào **THIẾU note** → ghi vào **danh sách note-mới-cần-tạo** (tạo từ nguồn ở Bước 6; pilot stub ở Bước 5).
3. **Lập BẢNG AUDIT+GOM** `note → hành động → dimension đích (+ tên mới nếu rename)` kèm **danh sách note mới**. **Trình user duyệt TRƯỚC khi move/đổi/gộp** (bán-phá-huỷ: đổi path/tên — wikilink auto-update nên không gãy link).
4. Duyệt xong → `$$MOVE$$` / `$$RENAME$$` **từng note** (1 file/lệnh). Note **viết tay**: move-only, **KHÔNG sửa body, KHÔNG đổi tên**.

**4d. Supersede MOC cũ + index dimension:**
- **MOC cũ** (vd `moc-<domain>.md`, `llm_managed`) → **rewrite** trỏ dimension mới, **hoặc** archive `7.ARCHIVES/` — Bob đề xuất, **user duyệt**. KHÔNG để 2 MOC đối chọi.
- **1 note `_index.md` trong MỖI folder dimension**: `type: moc`, `llm_managed: true`, **KHÔNG có `learn_*`** (không phải topic học) — liệt kê topic của dimension (từ TOC) + link note đã gom. (Path folder đã phân biệt nên không cần slug trong tên.)

**4e. BẢO TOÀN frontmatter (NON-DESTRUCTIVE) — KHÔNG mass-stamp:**
- Note đã có `learn_*` (vd 17 note BA đã stamp) → **giữ NGUYÊN**, không đụng.
- **KHÔNG thêm `learn_curriculum`** cho note parked mới gom ở bước này — mass-stamp = 75 note tràn vào dashboard. Membership (`learn_curriculum` + `learn_order`) **chỉ set khi topic vào DAG ở Bước 5** (activation).
- Note viết tay → chỉ move, **KHÔNG sửa thân note, KHÔNG stamp**.

Bước này = **AUDIT + folder + move/rename/merge + index + GAP-list** (+ bảo toàn learn_* cũ). KHÔNG stamp membership mới, KHÔNG stub topic (cả hai ở Bước 5). **REBUILD = audit từng note (6 hành động) + gap analysis, KHÔNG chỉ move** — nhất là khi user nghi ngờ độ tin cậy note cũ. Refill nội dung thật từ nguồn ở Bước 6 (`custom-research-pipeline`).

### Bước 5 — dựng roadmap DAG + ACTIVATE + stub pilot (xin duyệt lộ trình TRƯỚC khi ghi 8.TRACK)
- Sắp topic theo dimension, **beginner→advanced**, ghi prerequisite → DAG.
- **ACTIVATE topic vào DAG = ĐIỂM đặt membership**: mỗi topic ĐƯA VÀO lộ trình → stamp `learn_curriculum: <domain>` (nếu absent) + `learn_order` theo vị trí DAG. **Đây là nơi DUY NHẤT curriculum stamp `learn_curriculum`/`learn_order`** (Bước 4 chỉ bảo toàn cũ). Note **parked** không vào DAG → KHÔNG stamp → chưa hiện dashboard (đúng ý đồ, không flood).
- **⚠️ QUY ƯỚC FIELD — 1 nguồn duy nhất (chống fork):** `learn_curriculum` + `learn_order` là **KHÓA HỆ THỐNG** mà `dashboard-hoc-tap.base`/`learning-progress`/`study` lọc. `curriculum` + `topic` (trong template lesson) chỉ là **nhãn người-đọc** — KHÔNG thay thế `learn_*`. Mô hình 2 lớp (lesson cửa-vào + substrate concept/method): **note `type: lesson` là note MANG `learn_*`** (đơn vị học/đo mastery); substrate concept/method KHÔNG stamp (tránh flood). Activate mà chỉ ghi `curriculum`/`topic` → dashboard TRỐNG. Mọi lesson Bob tạo BẮT BUỘC `llm_managed: true`.
- **Scope quyết phạm vi**: goal-first → DAG + activate + stub pilot + research **chỉ cluster ưu tiên** đủ mục tiêu; dimension khác để folder+index+**park** (chưa activate). comprehensive → toàn bộ.
- **STUB PILOT** (~5–8 topic ĐẦU theo DAG): chỗ TOC chưa có note → tạo stub nhẹ (frontmatter `learn_curriculum`+`learn_order` + heading) trong folder dimension. Topic sâu để `study`/research đổ dần — KHÔNG stub toàn bộ.
- **Hỏi user duyệt lộ trình**: *"Lộ trình này ok chưa, cần đổi gì? Ok thì em ghi vào 8.TRACK."* — duyệt xong mới ghi.
- **Ghi `8.TRACK/Learning/curriculum-<domain>.md` theo TEMPLATE mục 1 (KHÔNG copy file ví dụ):**
  - **`$$READ$$` `_agent/skills/learning/templates.md` MỤC 1 TRƯỚC khi ghi** — đó là CONTRACT: frontmatter chuẩn (`domain`+`status` enum) + **10 heading LÕI + 3 heading BỐI CẢNH** + GATE tự-rà. `curriculum-ai-pilot.md` chỉ là **ví dụ tham khảo cách điền**, KHÔNG phải khuôn để copy (copy ví dụ = 3 curriculum lệch nhau như đã xảy ra).
  - **🎯 KHUNG CỨNG, THỊT MỀM:** **10 heading LÕI = khung xương BẮT BUỘC** (đủ, đúng tên, đúng thứ tự, LUÔN điền nội dung thật — mọi domain nhất quán, chống lười). **3 heading BỐI CẢNH** (concept tổng quan · khung xuyên suốt · case throughline) = chỉ thêm khi domain THỰC SỰ có; không có thì **bỏ hẳn** (đừng ghi "(không áp dụng)"). **NỘI DUNG mỗi heading = điền TỰ NHIÊN theo domain**, TUYỆT ĐỐI không bịa cho đủ khuôn. Khác biệt giữa các curriculum CHỈ ở phần thịt.
  - Chạy **GATE tự-rà** (cuối template mục 1): 10 lõi đủ + điền thật chưa? 3 câu hỏi bối cảnh đã tự trả lời rõ (có → thêm, không → bỏ) chưa? — trước khi coi là ghi xong. Đã có file → **update** theo cùng contract, không tạo trùng.
- Sau ghi → emit `$$REGEN_PROGRESS$$` **đúng 1 lần** (plugin regen `learning-progress.md` từ frontmatter `learn_*`).

### Bước 6 — scaffold phụ + đào sâu nguồn (Phase 1)
> **Khung file phụ**: `$$READ$$` `_agent/skills/learning/templates.md` **mục 2–6** (so-hoc / so-do / buổi / dashboard / learning-progress), thay `{{placeholder}}`. (Mục 1 = curriculum-MOC đã ghi ở Bước 5.) Giữ format đồng nhất mọi domain.
- **HẠ TẦNG TOÀN CỤC (chỉ NẾU CHƯA CÓ — lần đầu vault dùng hệ học):** `8.TRACK/Learning/dashboard-hoc-tap.base` (template mục 5) + `8.TRACK/Learning/learning-progress.md` rỗng (template mục 6). Đã có → bỏ qua.
- **sổ học + sơ đồ RỖNG**: `8.TRACK/Learning/<domain>/so-hoc-<domain>.md` **và** `so-do-<domain>.md`. Trong `so-hoc` chỉ cần section cho topic **ACTIVE** (đã vào DAG/pilot) — note parked (đã gom, chưa vào DAG) chưa cần section; `study` thêm dần khi chạm tới.
- **đào sâu nguồn đã chọn** → gọi `custom-research-pipeline` nghiên cứu + lưu note vào đúng folder dimension (+ NLM nếu hợp). Làm **DẦN theo cluster** (goal-first: cluster ưu tiên trước), không ép 1 phát. Note research khi **active** phải **đăng ký** (learn_curriculum + entry DAG + section so-hoc) mới thành "topic học được".

KHÔNG đẻ toàn bộ note stub cho mọi topic. **Ranh giới**: `study` ghi `buoi/` rich + so-hoc (bản ghi buổi học), **KHÔNG enrich thân knowledge note** trong dimension folder; thân note do `custom-research-pipeline` fill (Phase 1). Nội dung buổi → `study` đổ vào dần.

### Bước 7 — bàn giao
Chỉ user: *"Khung xong. Đào sâu cluster X → `custom-research-pipeline`. Học → gõ 'học tiếp <domain>'."* Trỏ dashboard.

## §ĐÓNG-GÓI-QUEST — on-demand (nối sang EngramQuest)

**Trigger:** "đóng gói quest <domain>" / "tạo quest cho <domain>" / sau khi đã học xong một cụm. **KHÁC Phase 0**: đây là bước **on-demand**, chạy SAU khi đã có bài học thật — không phải lúc scaffold.

**Mục đích:** biến các bài **ĐÃ HỌC** của 1 domain thành **quest EngramQuest chơi được** (mission + boss), gamify việc ôn — đúng chỗ EngramQuest mạnh.

**GATE TRUNG THỰC (bất khả xâm phạm — cùng tinh thần "không decompose từ trí nhớ"):**
1. **CHỈ đóng gói từ topic đã học** — mastery ≥🟢 **và có bằng chứng** trong `so-hoc-<domain>.md`. Topic ⚪ chưa học (stub) → **BỎ**, không bịa quiz.
2. **(2026-07-17, nới theo yêu cầu Nguyên)** Domain có **≥1 topic** ≥🟢 → ĐỦ tạo **quest mini** (mission node của (các) topic đã học, **CHƯA có boss**). Domain **chưa có topic nào** ≥🟢 → báo *"học xong ít nhất 1 bài đã rồi đóng gói"*, không đẻ quest rỗng. **Boss chỉ xuất hiện khi ≥2 topic** ≥🟢 (cần cascade gộp ≥2 topic mới có gì để phối hợp) — re-run đóng gói khi bài thứ 2 xong sẽ TỰ THÊM node boss vào quest đã có, không tạo file mới.
3. Mọi câu hỏi/đáp án **rút từ essence/cơ chế/ứng dụng/phân biệt anh đã nêu** (đọc `so-hoc` + frontmatter `learn_understood`) — KHÔNG thêm kiến thức ngoài cái đã học.

**Quy trình:**
- **Đọc:** `so-hoc-<domain>.md` (📘 kiến thức đã đạt + ✍️ bằng chứng) + frontmatter mastery các topic của domain.
- **Sinh 1 note** `8.TRACK/Learning/<domain>/quest-<domain>-<nhóm>.md` (frontmatter `type: quest`, `llm_managed: true`, `learn_curriculum: <domain>`, `source_topics: [...]`) chứa block ```quest-map:
  - `version: 1` · `style: galaxy` · `difficulty` theo mức.
  - **Mỗi topic đã học = 1 mission node**: `title` = tên bài, `points:` (2 điểm từ essence + cơ chế), `challenge: type: quiz` + `questions_json` **2–4 câu** test essence/mechanism/application/discrimination anh đã chứng minh. Distractor = **sai lầm thật dễ mắc** (lấy từ mục "discrimination"/"gap" trong so-hoc), mỗi câu có `explanation` ngắn.
  - **Node cuối = boss** (`boss: true`) — **CHỈ thêm khi domain đã có ≥2 topic** ≥🟢 (xem GATE 2): 1 tình huống **cascade gộp ≥2 topic** (áp dụng thật, buộc phối hợp) — đúng luật boss đã chôm (gộp khái niệm, plausible distractor). Quest mini (1 topic) → BỎ hẳn node boss, không tạo placeholder rỗng.
  - **Loại challenge theo domain-pattern** (đã chôm từ EngramQuest): SRE→bug-hunt/incident · marketing→A/B-test/funnel · tư duy/AI→scenario quiz · math→scenario-calc… chọn dạng hợp domain.
- **Emoji node:** EngramQuest **bắt buộc icon** cho đảo — dùng **tối thiểu, thuần tuý điều hướng** (map/brain/target/satellite). *(Muốn 0-emoji hẳn → patch renderer fork EngramQuest, để pha sau.)*
- **Chọn DẠNG thử thách theo token** (KHÔNG mặc định `quiz` cho mọi node): `order`/`chain`/`timeline` đo `mechanism` · `match`/`truefalse` đo `discrimination` · `cloze` đo `essence` · `text` đo `teach-back` · `auction` đo `metacognition` (dạng DUY NHẤT đo được token này). Bảng đầy đủ + schema chính xác + cạm bẫy parser: `$$READ$$` `_agent/skills/learning/quest-challenge-types.md`. Mục tiêu: cả quest **≤60% câu là `quiz`**.
- **`token` cho MỖI câu quiz (BẮT BUỘC):** mỗi item trong `questions_json` phải có `"token"` = token rubric 17 mà câu đó kiểm tra (cùng luật §TOKEN-THẺ trong `study.md`: tên nguyên văn rubric, đúng 1 token/câu, khớp cái câu THỰC SỰ hỏi). Plugin lưu kết quả từng câu theo token vào `engram-quest/state/<quest>.json` (`nodes.<id>.tokens`); vì `node.id` = slug topic note nên thống kê quy thẳng về mastery topic. Thiếu token → chơi xong chỉ biết % tổng, KHÔNG biết sai ở kiểu hiểu nào.
- **Mở rộng:** học thêm topic → **re-run** đóng gói lại (thêm node); quest lớn dần theo tiến độ. Ghi log `_agent/log.md`.

**Ranh giới:** đóng-gói-quest ĐỌC bài đã học, KHÔNG dạy (dạy = `study`/`learning-mode`), KHÔNG sinh flashcard (đó là `study` ⑤). Nó là lớp **gamify ôn tập** trên nội dung đã có. Verify: mở note → quest-map dựng đảo + click node → quiz chạy đúng nội dung đã học.

---

## Chốt chặn

- **Hỏi scope mỗi lần** (goal vs comprehensive) — không mặc định cứng; scope **CÓ tác dụng**: goal-first thu hẹp cluster sâu (stub/research chỉ cluster ưu tiên).
- **HỎI nguồn trước** (đã có tài liệu chuẩn chưa, để ở đâu) — không tự đoán, không nhảy sang decompose.
- **LẤY nguồn + rút TOC bằng tool TRƯỚC decompose**; nguồn từ trí nhớ phải gắn "⚠️ chưa kiểm chứng" + đưa link để sếp nạp.
- **GATE CỨNG: chưa có TOC thật → KHÔNG decompose.** Decompose ánh xạ về TOC, mỗi dimension truy về mục nguồn thật. **TOC đạt** = liệt kê chương/mục đủ mịn để map dimension (chain NLM tới `source_get_content`; `notebook_query` paraphrase chưa đủ).
- **DISCOVERY trước GOM**: `$$LIST$$`/`$$SEARCH$$` tìm folder-home/MOC/slug sẵn có; reuse, không đẻ trùng.
- **Có note sẵn ≠ có cấu trúc chuẩn → REBUILD từ TOC** — domain đã có folder/MOC/slug → **reuse identity** (folder-home + slug), **dựng lại** dimension+MOC theo TOC, **supersede** MOC cũ (rewrite/archive, user duyệt); KHÔNG đẻ folder trùng, KHÔNG lấy note cũ thay TOC.
- **AUDIT trước GOM, KHÔNG blind-move**: đọc NỘI DUNG từng note → 6 hành động (Keep/Refill/Merge/Rename/Move-out/Archive) + **GAP analysis** (topic TOC thiếu note → tạo mới). Trình **BẢNG AUDIT+GOM** (note → hành động → đích + tên mới) cho user duyệt TRƯỚC khi `$$MOVE$$`/`$$RENAME$$`; note không chắc → `_unsorted/`. **Bắt buộc audit khi user nghi ngờ độ tin cậy note cũ** — move-only là sai. KHÔNG sửa thân note viết tay.
- **STAMP membership ở ACTIVATION (Bước 5), không lúc move (Bước 4)**: curriculum set `learn_curriculum` + `learn_order` cho topic vào DAG; **KHÔNG** ghi/đè `learn_reviewed`/`learn_next`/`learn_understood` đã có (study quản). Sau ghi DAG → `$$REGEN_PROGRESS$$`.
- **Folder + gom ngay sau decompose; activate + stub pilot ở DAG** — mỗi dimension 1 note index; KHÔNG đẻ hàng loạt note rỗng (topic sâu để research/study đổ dần).
- **BƯỚC 6 (scaffold phụ) KHÔNG được bỏ qua** — so-hoc + so-do (RỖNG) + hạ tầng dashboard/learning-progress phải tạo cùng lúc với DAG. Build mà chỉ có curriculum-MOC, thiếu sổ học/dashboard = chưa xong. Field tracking phải là `learn_*` (xem Bước 5), không phải `curriculum`/`topic` đơn lẻ — nếu không dashboard trống.
- **CURRICULUM-MOC theo TEMPLATE mục 1, KHÔNG copy ví dụ** — `$$READ$$` template mục 1 TRƯỚC khi ghi (Bước 5): 10 heading LÕI bắt buộc (khung cứng, luôn điền thật) + 3 heading BỐI CẢNH (concept/khung/case — chỉ thêm khi domain có, không thì bỏ hẳn) + nội dung điền tự nhiên (thịt mềm, không bịa). Chạy GATE tự-rà trước khi coi ghi xong. `curriculum-ai-pilot.md` = ví dụ, KHÔNG phải khuôn copy.
- **ĐĂNG KÝ HỆ HỌC (invariant — khớp cơ chế regen)**: `learn_curriculum` là field DUY NHẤT khiến note hiện ở `learning-progress`/dashboard (REGEN_PROGRESS quét nó). Vì vậy **chỉ stamp `learn_curriculum` lúc ACTIVATE** (cùng DAG entry + so-hoc section, Bước 5). Note **parked** (đã gom + trong `_index`, KHÔNG `learn_curriculum`) → KHÔNG hiện dashboard tới khi activate — đúng ý đồ, không flood 75 note.
- **Route đúng vault theo `routing-rules`**: knowledge note theo domain (Chuyên môn / Foundation / Cognitive tuỳ domain — KHÔNG mặc định cứng Chuyên môn); curriculum MOC → `8.TRACK/Learning/`. KHÔNG vào `1.CAPTURE`/`5.RESOURCE`/`99.KALIX SYSTEM`.
- Mọi mutation (folder/MOC/stub) **xin duyệt trước** + append `_agent/log.md`.
- KHÔNG tự xây engine nghiên cứu — research luôn qua `custom-research-pipeline`.
- **§ĐÓNG-GÓI-QUEST: CHỈ từ topic đã học (≥🟢 + bằng chứng so-hoc), ≥2 topic; KHÔNG bịa quiz từ stub.** Câu hỏi rút từ bằng chứng thật; boss gộp ≥2 topic; note vào `8.TRACK/Learning/<domain>/`.

## Phối hợp skill

- `custom-research-pipeline` — đào sâu cluster → đổ note (Phase 1).
- `notebooklm` — thêm/đọc source qua NotebookLM (`$$NLM_TOOL$$` — đã chạy được).
- `ingest` / `mocfix` — tạo/chuẩn hoá note + MOC.
- `study` — học sau khi cluster đã có note.

## Test prompt nên thử

- "thiết kế lộ trình học video editing cho vlog cá nhân"
- "anh muốn học 3D design từ đầu, dựng roadmap giúp"
- "decompose lĩnh vực copywriting ra để anh học có hệ thống"
