Đây là bộ khởi động để một session Claude Code tự dựng một đội AI — architect · backend · frontend · tester — rồi build một app end-to-end trong vòng lặp sprint tự trị. Session chính đóng vai team-lead (proxy của người dùng: điều phối, không code, không đụng git), spawn từng role theo agent type, và chạy loop cho tới khi hết backlog.
Dùng khi nào: bạn có một ý tưởng app (hoặc một spec/mock đã có sẵn) và muốn một đội agent build nó mà không phải kèm từng bước. Bài này công bố nguyên văn từng artifact của bộ build-system — template CLAUDE.md, 4 playbook, settings.json, và toàn bộ template SPEC / ARCHITECTURE / DISPATCH / sprint. Mục tiêu: một agent ở môi trường khác chỉ cần fetch đúng URL này là copy lại được cả kit và dựng lại quy trình từ số không.
Vì sao có từng mảnh
Đây là phần giá trị nhất — hiểu bảng này thì mất docs vẫn tự dựng lại được. Mỗi mảnh của kit không phải quy ước tuỳ tiện; nó là hệ quả của một nguyên lý duy nhất ở trên. Từ nguyên lý đó suy ra từng dòng:
| Mảnh | Vì sao tồn tại |
|---|---|
| Scaffold trước, discuss sau | máy làm phần rẻ (dựng file), người chỉ vào đúng chỗ cần người (quyết định) |
| 7 slot | đó là 7 chỗ DUY NHẤT các project khác nhau — phần còn lại bất biến |
| Resource checklist | mỗi dòng chưa giải quyết = một human-block tương lai đã biết trước |
| SPEC.md 1 file, contract thì-hoàn-thành | agent build từ spec chứ không từ trí nhớ; 2 nguồn sự thật thì cãi nhau, mơ hồ thì agent bịa |
| CLAUDE.md | luật CHUNG của vòng lặp — bộ nhớ chung duy nhất sống sót qua spawn/compaction |
| Playbook theo role | system prompt riêng từng nghề + ranh giới sở hữu file |
| DISPATCH.md backlog | task LÀ spec của một đơn vị việc; giao việc bằng chat = làm theo tóm tắt |
| DECISIONS.md | sổ ngoài-dự-tính: agent tự chốt khi vắng người, người đọc lại async — loop không bao giờ chờ |
| .claude/settings.json | luật prompt là xác suất, deny của harness là cơ khí — luật tử phải cơ khí |
| Dừng sau scaffold | taste + irreversible là của người; máy chỉ tự trị trong vùng reversible |
| Author ≠ checker | người viết code tự chấm sẽ pass chính mình — verify luôn do agent fresh |
| Gate máy-kiểm-được | tiêu chí không đo được bằng máy = tiêu chí sẽ bị bỏ qua khi mệt |
Mọi chi tiết quy trình bên dưới chỉ là hệ quả của bảng này. Thuộc bảng thì tự suy lại được bước — đó là lý do bộ docs tự-chứa: không cần repo nào khác, không cần nhớ thứ tự thao tác.
Hai bước: scaffold rồi discuss-chốt
Cả vòng đời bootstrap gói trong hai bước. Bước 1 máy tự chạy một lèo; Bước 2 là điểm chạm người duy nhất trước khi loop build khởi động.
BƯỚC 1 — SCAFFOLD (agent tự chạy một lèo)
đọc input → điền slot → dựng kit theo bảng phân công → BÁO CÁO + DỪNG
BƯỚC 2 — DISCUSS-CHỐT (người)
người đọc kit + blocker → trả lời/chỉnh → nói "chạy đi" → loop build bắt đầuBước 1 — Scaffold. Agent đọc input người cấp (spec, mock, data mẫu), điền 7 slot, dựng đúng bộ file theo bảng phân công, rồi dừng ở một báo cáo (file đã tạo + slot + căn cứ + blocker list). Không tự khởi động loop build. Ba luật điền slot khi vắng người: slot có nhãn (default) thì tự lấy + ghi DECISIONS; slot không nhãn thì derive từ spec, spec im lặng thì chọn phương án reversiblean toàn nhất + log; mục “phải chốt với người” (vd lệnh run/test greenfield) thì ghi [BLOCKER] inline rồi đi tiếp — cấm điền giá trị tạm, kể cả gắn nhãn giả định, vì giá trị tạm sẽ bị loop dùng thầm.
Bước 2 — Discuss-chốt. Người đọc báo cáo, trả lời blocker, chỉnh những gì chưa ưng → agent cập nhật file → người nói rõ “chạy đi / go” thì loop build mới được bắt đầu. Scaffold xong tự chạy build là vi phạm. Vắng người thì dừng vô hạn ở báo cáo — báo cáo chính là bàn discuss trễ. Đây cũng là chỗ đi từng dòng resource checklist (mock đã duyệt, design tokens, data mẫu, lệnh run/test, API key, deploy target, path cấm, chính sách irreversible…): mỗi dòng chưa giải quyết là một lần loop sẽ đứng chờ trong tương lai.
Sau khi “chạy đi”: dispatch về team-lead → loop sở hữu việc build. Flow mỗi sprint là BE + FE build song song → tester runtime-verify ∥ architect review → 3 Quality Gates → architect commit (một commit/sprint) → push nền → sprint kế tự khởi động. Điểm chạm người kế tiếp là batch quyết định treo trong DECISIONS.md, không phải câu hỏi giữa sprint.
7 slot + bảng phân công
7 slot là 7 chỗ duy nhất các project khác nhau — phần còn lại của kit bất biến. Điền đúng 7 chỗ này là đã cá biệt hoá xong toàn bộ hệ:
| Slot | Quyết gì | Ghi vào |
|---|---|---|
| 1 · STACK | ngôn ngữ / framework, bố cục repo — derive từ spec. Lệnh run/test/typecheck + port của greenfield KHÔNG suy được từ spec → BLOCKER, người chốt ở Bước 2 | CLAUDE.md §1 |
| 2 · AUTH_POSTURE | single-user-no-auth (default cho tool cá nhân) / multi-user-auth | SPEC |
| 3 · MEMORY_BACKEND | agent-memory files (default) / wiki / board | CLAUDE.md §1b |
| 4 · DOMAIN_AGENTS | none (default) / role thêm ngoài 4 playbook (team-lead = session chính, không playbook) | CLAUDE.md §9 |
| 5 · PRODUCT_NATURE | human-app / agent-first (consumer là agent → dogfood + copy TOOL-DESIGN.md) | SPEC |
| 6 · AUTONOMY_TIER | sprint-gated (default) / never-free (+ heartbeat scheduler) | CLAUDE.md §7 |
| 7 · BUILD_MODE | greenfield / reuse-copy (repo nguồn + commit SHA ghim + subsystem port) | DISPATCH.md |
Ai tạo file nào, khi nào — bảng phân công (setup KHÔNG sinh gì ngoài bảng này):
| File | Ai tạo | Khi nào |
|---|---|---|
| CLAUDE.md (điền slot 1/3/4/6, 120–180 dòng) | agent setup | Bước 1 |
| .claude/agents/* (4 playbook — COPY nguyên) | agent setup | Bước 1 |
| .claude/settings.json (COPY nguyên — deny cơ khí) | agent setup | Bước 1 |
| SPEC.md (đặc tả + KIẾN TRÚC — người chốt nội dung) | agent setup | Bước 1 |
| DISPATCH.md (backlog A1..An theo thứ tự ship) | agent setup | Bước 1 |
| DECISIONS.md (① VƯỢT-SPEC ② TỰ-QUYẾT) | agent setup | Bước 1 |
| git init local + plan_sprint_1.md + CURRENT.md | architect | kickoff đầu loop |
| design tokens từ mock | fe | Sprint 0 |
| Code, test, mọi thứ còn lại | be / fe / tester | trong loop |
Toàn văn artifact — copy được nguyên
Dưới đây là nguyên văn từng file của kit, byte-exact với nguồn. Một agent fetch bài này về chỉ cần copy mỗi khối vào đúng đường dẫn (nhãn khối chính là đường dẫn đích) là dựng lại được cả bộ. Path tuyệt đối trong template đã được để dạng con-trỏ generic — resolve về repo thật khi setup (xem Luật path trong 00-kickoff.md). Thứ tự copy: kickoff → CLAUDE.md → 4 playbook → settings.json → các template.
---
name: loop-kickoff
description: Bootstrap project mới cho đội AI build. BƯỚC 1 — agent SCAFFOLD bộ file khởi động từ input (spec/mock); BƯỚC 2 — người DISCUSS lại để chốt (trả lời blocker, chỉnh, rồi "chạy đi" mới vào loop build).
---
# 00-kickoff — dựng project mới, 2 BƯỚC
```
BƯỚC 1 — SCAFFOLD (agent tự chạy một lèo)
đọc input → điền slot → dựng kit theo bảng phân công → BÁO CÁO + DỪNG
BƯỚC 2 — DISCUSS-CHỐT (người)
người đọc kit + blocker → trả lời/chỉnh → nói "chạy đi" → loop build bắt đầu
```
Templates nằm trong bộ docs này: `docs/build-system/` (CLAUDE.md template + `agents/` +
`templates/` + `settings.template.json`) và `docs/phuong-phap/` (phương pháp luận).
Bộ docs TỰ-CHỨA — không cần repo nào khác.
## BẢN CHẤT — vì sao có từng mảnh (hiểu mục này thì mất docs vẫn tự dựng lại được)
Gốc của mọi thứ: **agent build gần như miễn phí và nhanh hơn người; đường găng duy nhất là
những chỗ phải CHỜ NGƯỜI hoặc phải ĐOÁN.** Cả quy trình chỉ làm một việc: dồn hết chờ-người
về BƯỚC 2 và triệt tiêu mọi chỗ đoán. Từ đó suy ra từng mảnh:
| Mảnh | Vì sao tồn tại |
|---|---|
| Scaffold trước, discuss sau | máy làm phần rẻ (dựng file), người chỉ vào đúng chỗ cần người (quyết định) |
| 7 slot | đó là 7 chỗ DUY NHẤT các project khác nhau — phần còn lại bất biến |
| Resource checklist | mỗi dòng chưa giải quyết = một human-block tương lai đã biết trước |
| `SPEC.md` 1 file, contract thì-hoàn-thành | agent build từ spec chứ không từ trí nhớ; 2 nguồn sự thật thì cãi nhau, mơ hồ thì agent bịa |
| `CLAUDE.md` | luật CHUNG của vòng lặp — bộ nhớ chung duy nhất sống sót qua spawn/compaction |
| Playbook theo role | system prompt riêng từng nghề + ranh giới sở hữu file |
| `DISPATCH.md` backlog | task LÀ spec của một đơn vị việc; giao việc bằng chat = làm theo tóm tắt |
| `DECISIONS.md` | sổ ngoài-dự-tính: agent tự chốt khi vắng người, người đọc lại async — loop không bao giờ chờ |
| `.claude/settings.json` | luật prompt là xác suất, deny của harness là cơ khí — luật tử phải cơ khí |
| Dừng sau scaffold | taste + irreversible là của người; máy chỉ tự trị trong vùng reversible |
| Author ≠ checker | người viết code tự chấm sẽ pass chính mình — verify luôn do agent fresh |
| Gate máy-kiểm-được | tiêu chí không đo được bằng máy = tiêu chí sẽ bị bỏ qua khi mệt |
Chi tiết dưới đây chỉ là HỆ QUẢ của bảng này — thuộc bảng thì tự suy lại được bước.
═══════════════════════════════════════════════════════════════════════
# BƯỚC 1 — SCAFFOLD (agent)
Đọc input người cấp (spec, mock, data mẫu) → điền 7 slot → dựng kit → báo cáo. KHÔNG dừng
giữa chừng, KHÔNG tự khởi động loop build. Kết thúc luôn là BÁO CÁO (file đã tạo + slot +
căn cứ + blocker list) — đó chính là đầu vào cho BƯỚC 2.
## 1.1 Ba luật điền slot khi vắng người
1. Slot có nhãn **(default)** → tự lấy + ghi `DECISIONS.md` mục ②.
2. Slot không nhãn → derive từ spec; spec im lặng → chọn phương án REVERSIBLE an toàn nhất
+ ghi DECISIONS mục ②; chỉ BLOCKER khi chọn sai là không đảo được. (biên lai run4-D10)
3. Mục ghi "phải chốt với NGƯỜI" (vd lệnh run/test greenfield) → `[BLOCKER] <mục> cần người
quyết` inline tại chỗ dùng nó + 1 dòng DECISIONS, rồi ĐI TIẾP. **CẤM điền giá trị tạm —
kể cả gắn nhãn [GIẢ ĐỊNH]** (giá trị tạm sẽ bị loop dùng thầm; tái phạm run3+run4;
epoch-0 chứng minh đoán sai thật).
## 1.2 Luật path (biên lai run1)
Path tuyệt đối trong spec/architecture là path MÁY TÁC GIẢ — coi như không tồn tại ở máy
đang chạy. Resolve mọi con trỏ về repo thật hiện tại, ghi mapping vào `DECISIONS.md`.
Con trỏ `docs/phuong-phap/` + `docs/build-system/` trong template/playbook là con trỏ tới
BỘ DOCS này — project không chứa docs/, nên setup phải RESOLVE về path tuyệt đối thật của
bộ docs trên máy, ghi vào CLAUDE.md §1 dòng "Phương pháp" + DECISIONS. (biên lai run3/run5)
## 1.3 Luật ADOPT-IN-PLACE — khi spec ĐÃ được cấp sẵn dạng file (biên lai run2-G2/G5)
Input có sẵn nội dung đạt chuẩn → **nhận-tại-chỗ**: đổi tên về tên chuẩn (`SPEC.md`) + vá
con trỏ (Luật path) + bù section template thiếu (vd mục KHÔNG-LÀM). KHÔNG viết lại toàn văn.
Người cấp NHIỀU file cùng phủ đặc tả + kiến trúc → **GỘP thành MỘT `SPEC.md`**, dedupe: mỗi
thông tin sống đúng 1 chỗ. Bản gốc đã absorb thì không để tồn tại song song — MỘT nguồn sự
thật; input là file người cấp không dám xoá → ghi BLOCKER đề nghị xoá.
⚠ FS case-insensitive (macOS/Windows): `spec.md` và `SPEC.md` là CÙNG một file — rename
chỉ-khác-hoa-thường phải qua tên trung gian (`mv spec.md _spec.md && mv _spec.md SPEC.md`).
## 1.4 Bảy slot — điền gì, GHI VÀO FILE NÀO
| Slot | Quyết gì | Ghi vào |
|---|---|---|
| 1 STACK | ngôn ngữ/framework, bố cục repo — derive từ spec. **Lệnh run/test/typecheck + port: greenfield KHÔNG suy được từ spec → luật 3 (BLOCKER), người chốt ở BƯỚC 2** | CLAUDE.md §1 |
| 2 AUTH_POSTURE | single-user-no-auth (default tool cá nhân) / multi-user-auth | **SPEC** (A0 + mục KHÔNG-LÀM) — thuộc tính sản phẩm, KHÔNG vào CLAUDE.md |
| 3 MEMORY_BACKEND | agent-memory files (default) / wiki / board | CLAUDE.md §1b |
| 4 DOMAIN_AGENTS | none (default) / role thêm ngoài 4 playbook (team-lead = session chính, không playbook) | CLAUDE.md §9 |
| 5 PRODUCT_NATURE | human-app / agent-first (consumer là agent → dogfood + copy TOOL-DESIGN.md). App DNA agent-first ("API là trái tim") nhưng agent-surface HOÃN bản này → chọn human-app + giữ API typed/raw-first để lật sang agent-first ~0 chi phí (biên lai run3/run5) | **SPEC** (ranh giới + nguyên tắc API) — KHÔNG vào CLAUDE.md |
| 6 AUTONOMY_TIER | sprint-gated (default) / never-free (+ heartbeat scheduler) | CLAUDE.md §7 |
| 7 BUILD_MODE | greenfield / reuse-copy. Nếu reuse-copy: repo nguồn + commit SHA ghim + subsystem port → bảng LOCKED-DECISIONS (quyết định · nguồn · fallback) đặt đầu DISPATCH; Sprint 1 = copy-then-strip; nguồn READ-ONLY | **DISPATCH.md** — định hình backlog, KHÔNG vào CLAUDE.md |
## 1.5 BẢNG PHÂN CÔNG — file nào · ai tạo · khi nào
| File | Ai tạo | Khi nào |
|---|---|---|
| `CLAUDE.md` (điền slot 1/3/4/6, giữ-1-xoá-1, 120–180 dòng) | agent setup | Bước 1 |
| `.claude/agents/*` (4 playbook: architect/be/fe/tester — COPY nguyên) | agent setup | Bước 1 |
| `.claude/settings.json` ← `settings.template.json` (COPY nguyên — deny cơ khí) | agent setup | Bước 1 |
| `SPEC.md` — MỘT file: đặc tả + mục KIẾN TRÚC (adopt-in-place nếu cấp sẵn; >~500 dòng mới tách ARCHITECTURE.md) | agent setup, NỘI DUNG người chốt | Bước 1 |
| `DISPATCH.md` — backlog A1..An theo thứ tự ship, mỗi task Intent+Defensive+Gate đo được, tail test-sweep+refactor (theo `templates/DISPATCH.template.md`) | agent setup | Bước 1 |
| `DECISIONS.md` — 2 mục: ① VƯỢT-SPEC (spec không lường) ② TỰ-QUYẾT (phương án agent chốt); mỗi dòng `quyết gì — vì sao — cách đổi`; KHÔNG chép lại spec | agent setup | Bước 1 |
| `TOOL-DESIGN.md` (COPY từ phuong-phap — CHỈ khi slot 5 = agent-first) | agent setup | Bước 1 |
| `git init` local (nếu repo chưa có) — remote + push rights = NGƯỜI | **architect** | kickoff đầu loop |
| File design tokens từ mock (mock là code) | **FE** — setup KHÔNG tạo | Sprint 0 |
| `sprints/plan_sprint_1.md` + `CURRENT.md` (format theo `templates/sprints/`) | **architect** | kickoff đầu loop |
| `end_sprint_*.md` | architect | đóng mỗi sprint |
| Code, test, mọi thứ còn lại | be/fe/tester theo dispatch | trong loop |
KHÔNG sinh gì ngoài bảng này. PRINCIPLES/DIAGNOSIS/WRITING-RULES/TOOL-DESIGN(khi human-app)
là phương pháp luận — đọc từ `docs/phuong-phap/` khi cần, không copy vào project.
═══════════════════════════════════════════════════════════════════════
# BƯỚC 2 — DISCUSS-CHỐT (người + agent)
Người đọc báo cáo Bước 1 (kit + slot + blocker list) → trả lời blocker, chỉnh những gì chưa
ưng → agent cập nhật file → người nói rõ **"chạy đi / go"** → loop build mới được bắt đầu.
**Scaffold xong tự chạy build = vi phạm.** Vắng người → dừng vô hạn ở báo cáo (báo cáo chính
là bàn-discuss trễ).
## 2.1 Nếu CHƯA có spec (project mới tinh, người ngồi đó)
Khai thác từ người, bằng hội thoại chứ không phải form:
1. **Một câu**: app là gì, cho ai, tự nó làm gì
2. **Vấn đề thật** (2–3) — nỗi đau người ĐÃ TỰ TRẢI, không phải đoán thị trường ("bạn đã tự đau chỗ này chưa?")
3. **Các câu hỏi app phải trả lời** (3–5 câu cụ thể)
4. **Nguyên tắc lõi** (3–6) — bất biến để phân xử mơ hồ sau này
5. **Screen/bề mặt** — mỗi cái: mục đích 1 câu + hành vi cụ thể
6. **Ranh giới**: bản-này ✅ / sau 🔜 / KHÔNG-BAO-GIỜ ❌ — danh sách ❌ là thứ chặn scope-creep
→ viết thành `SPEC.md` (cấu trúc theo `templates/SPEC.template.md` + mục KIẾN TRÚC theo
`templates/ARCHITECTURE.template.md` rút gọn).
## 2.2 Resource checklist — diệt human-block (đi từng dòng với người)
Mỗi dòng chưa giải quyết = một lần loop đứng chờ trong tương lai. Từng dòng: resolved /
cấp-file / deferred-có-default:
- ☐ **Design mock ĐÃ DUYỆT** (path) — chưa có? Sinh mock HTML đơn giản ngay tại đây, người
duyệt tại chỗ → thành baseline đông cứng. Không bao giờ để "FE tự tính"
- ☐ **Design tokens extract NGAY** từ mock vào SPEC (màu/font/spacing/radius) — hoãn "FE tự
extract" là tái tạo đúng human-block đang diệt
- ☐ **Data mẫu/thật** cho mọi screen (fixture, seed, hoặc nguồn live + access)
- ☐ **Lệnh run/test/typecheck + port** (trả lời BLOCKER của Bước 1)
- ☐ **API key/credential** cho mọi service ngoài — env/keychain, KHÔNG vào repo/chat
- ☐ **Deploy target** + access (hoặc nói rõ "bản này không deploy")
- ☐ **Repo remote** + push rights (git init local architect tự làm)
- ☐ **Path cấm / NDA** — thư mục agent không bao giờ được đọc
- ☐ **Chính sách irreversible** — cái gì cần user confirm (deploy? publish? chi tiền?)
- ☐ **Default cho câu hỏi mở đã biết** — mỗi cái một default reversible architect được lấy + log
- ☐ **Nhịp liên lạc** — quyết định treo gom ở đâu, người trả lời theo nhịp nào
## 2.3 Kỳ vọng thời gian (nói thẳng với người)
Chi phí = SPEC (giờ-người discuss) + VERIFY (wall-clock loop) + BUILD (≈0). ĐỪNG mang
estimate kiểu team người ("N ngày/feature") — đường găng thật là: người rảnh để chốt spec/
quyết định + wall-clock verify + phụ thuộc ngoài. Lịch hoá NHỮNG CÁI ĐÓ.
## 2.4 Harness prerequisite (kiểm trước khi "chạy đi")
Loop cần typed-agent: tool `Agent` + `.claude/agents/` (spawn `subagent_type` + `name`,
chạy background, final message = báo cáo). Nên kiểm thêm: `SendMessage`, Task tools,
scheduler (bắt buộc nếu slot 6 = never-free), browser tool cho Gate 2 (ghi vào CLAUDE.md §1).
Bất biến không được waive: **author ≠ checker** — verify luôn do agent FRESH.
Spawn chain một chiều: **session chính (nạp CLAUDE.md vừa sinh) CHÍNH LÀ team-lead — spawn
`architect`/`be`/`fe`/`tester` theo agent type khi cần**; dispatch đi trong spawn prompt.
Người nói "chạy đi" → DISPATCH về team-lead → loop sở hữu việc build — điểm chạm người kế
tiếp là batch quyết định treo trong DECISIONS, không phải câu hỏi giữa sprint.
# CLAUDE.md — luật xuyên suốt cho đội AI build SYSTEM
<!-- ═══════════════════════════════════════════════════════════════════
TEMPLATE TỰ-CHỨA — điền {{SLOT}} lúc Phase-0 theo docs/build-system/00-kickoff.md.
CLAUDE.md LÀ GÌ: các LUẬT CHUNG mà cả team sẽ GẶP PHẢI khi build trong vòng lặp
liên tục + cách xử lý. KHÔNG chứa: thuộc tính sản phẩm (→ SPEC.md),
việc riêng từng role (→ playbook .claude/agents/), chi tiết task (→ DISPATCH.md).
Giữ 120–180 dòng.
═══════════════════════════════════════════════════════════════════ -->
> Role = AGENT TYPE: `.claude/agents/<role>.md` vừa là playbook vừa là định nghĩa agent —
> harness nạp nó làm system prompt lúc spawn. Thứ đi trong spawn prompt là TASK DISPATCH
> (architect viết theo playbook §B). Bị spawn làm task build mà KHÔNG có dispatch → blocker (§3).
---
## 1. Con trỏ + lệnh — {{SLOT_1_STACK}}
- **Working dir:** {{path}}
- **Stack:** {{ngôn ngữ / framework / package manager / bố cục repo}}
- **Run:** {{lệnh dev-server + port; PHẢI chạy trước khi test API/UI; chạy detached, health-check trước khi kết luận}}
- **Test:** {{lệnh unit}} · {{lệnh integration}} · {{lệnh typecheck}}
- **Browser tool:** {{công cụ browser — FE tự-verify + tester UI pass}}
- **Sprint hiện hành:** `sprints/CURRENT.md` — architect tạo ở kickoff đầu, cập nhật trong CÙNG
commit đóng sprint. Đọc nó TRƯỚC khi đoán "đang ở sprint nào".
- **Sổ quyết định:** `DECISIONS.md` — chỉ ghi những gì NGOÀI DỰ TÍNH của spec, 2 mục:
① VƯỢT-SPEC (tình huống spec không lường) ② TỰ-QUYẾT (phương án thay thế agent chốt khi
vắng người), format `quyết gì — vì sao — cách đổi`. Hàng đợi để NGƯỜI đọc lại + override.
- **Spec:** `SPEC.md` (sản phẩm là gì — kể cả ranh giới KHÔNG-LÀM) · **Backlog:** `DISPATCH.md`
· **Phương pháp:** `docs/phuong-phap/` (đọc khi cần, không copy vào project)
## 1b. Bộ nhớ — {{SLOT_3_MEMORY_BACKEND}}
Bài học sống ở {{`.claude/agent-memory/<role>/` (1 file = 1 bài học, MEMORY.md index) | wiki
project | board}}. Tri thức bền = update-in-place. Log phiên = file theo ngày.
---
## 2. Luật an toàn lõi
- **KHÔNG** shutdown/xoá/thay teammate khi chưa có user xác nhận rõ trong chat. Không suy diễn
chấp thuận. (Gốc: một shutdown_request mồ côi đã giết agent đang làm việc.)
- **KHÔNG** sửa file ngoài quyền sở hữu của role mình (theo playbook).
- Git phá huỷ + `rm` đã bị deny cơ khí (`.claude/settings.json`, copy từ kit) — cần bỏ file
thì `mv` vào `.archive/`; dọn thật là việc người.
- **KHÔNG** tự giả định thông tin thiếu — xem §3.
- **KHÔNG thêm primitive mà SPEC không đòi** (auth, rate-limit, queue, cache, multi-tenant,
framework mới...). Build thứ ĐƠN GIẢN NHẤT khớp SPEC — kể cả ranh giới KHÔNG-LÀM của nó.
Thấy "cần cho scale/security/flexibility" → blocker §3, đừng tự build. (Gốc: project
một-người từng đốt nhiều sprint vào auth không ai cần.)
## 3. Luật blocker (SỐNG CÒN)
DỪNG và đẩy lên team-lead khi gặp: yêu cầu mơ hồ · tradeoff không hiển nhiên · thiếu context
mà architect đáng lẽ phải cấp · nghi có defensive case chưa được liệt kê · cần việc ngoài scope
để hoàn thành. Gửi `[BLOCKER] <1 dòng>` + context + câu hỏi cụ thể.
Giả định lặng lẽ = bug lặng lẽ.
## 4. Giao tiếp
- Role chạy như TYPED AGENT (tool `Agent`): dispatch đến trong spawn prompt; **message cuối
cùng của mày CHÍNH LÀ báo cáo hoàn thành** (format dưới) — trả về cho người spawn như tool
result. Agent chạy background mặc định; người spawn được báo khi xong.
- Spawn với `name` = alias role (`be` / `fe` / `tester` / `architect`) để gọi tiếp được qua
`SendMessage({to: <name>})` — agent còn sống thì SendMessage nối tiếp context. Text thường
KHÔNG hiện cho agent khác — liên lạc chéo agent chỉ có SendMessage.
- Harness có Task tools thì track việc bằng TaskCreate/TaskUpdate — board là state chung,
không phải chat.
- Message gọn: `[Task] [Context] [Request]`. **Task LÀ spec; message chat chỉ là con trỏ tới
nó** — luôn đọc trọn task/dispatch trước khi làm.
- **Báo cáo hoàn thành (KHÔNG THƯƠNG LƯỢNG)** — BẤT KỲ task nào xong, TRƯỚC khi idle:
```
[Sprint X / Task ID] DONE
- Files changed: <danh sách>
- Tests: <pass/fail so với baseline>
- Verification: <kết quả typecheck/browser/API-call>
- Deviations: <lệch gì so với dispatch, hoặc none>
- Blockers found: <none, hoặc vấn đề cụ thể>
```
Lỗi giữa chừng → gửi `[STATUS]`, không im lặng. (Gốc: teammate im lặng hàng giờ — lead phải
đi đọc transcript.)
## 5. Verify trước khi tuyên bố (Rule#0)
- Tuyên bố sửa file → Read/grep file trên đĩa
- Tuyên bố đã commit → `git log -1 --stat`
- Tuyên bố test pass → chạy lệnh, dán output thật
- Tuyên bố ghi DB → query lại row, kiểm field kỳ vọng
- Tuyên bố build/script chạy → CHẠY nó. Đọc code không phải chạy code.
- Báo cáo của team/scout → lead spot-check với nguồn thật trước khi đóng.
## 6. Vòng lặp + hợp đồng chung
**Flow:** BE + FE build (song song) → Tester runtime-verify ∥ Architect review → cả hai pass
→ 3 Quality Gates → Architect commit (MỘT commit/sprint) → báo "push sau 2 phút nếu không ai
cản" → push nền → sprint kế tự khởi động.
Hợp đồng ai cũng phải giữ:
- **Architect là NGƯỜI COMMIT DUY NHẤT.** Lead điều phối, không code, không push.
- **100% pass mới commit — không ngoại lệ.** Gate fail → `❌ Gate X failed: <ô>` → lead
dispatch fix → re-verify → mới commit.
- **Author ≠ checker:** verify luôn do agent FRESH không viết code đó; không ai tự-certify.
- Fail → lead tìm root cause (spec / implementation / test-quá-sớm) rồi route fix — không đổ
lỗi mò.
- Chi tiết nghề nằm ở playbook: kickoff/dispatch/review/commit → `architect.md` · thứ tự
verify → `tester.md`. CLAUDE.md không lặp lại.
## 6a. Quality Gates (CHẶN CỨNG — architect tick từng ô trước commit; sót Ô NÀO = chặn commit)
**Gate 1 — API** (sprint chạm bề mặt API):
☐ schema constraint đã soát (length, enum, validator) ☐ integration test cho endpoint mới/đổi
☐ integration test cũ pass ☐ không primitive ngoài SPEC (§2) ☐ format response nhất quán
☐ status code đúng.
**Gate 2 — Function** (sprint chạm production code):
☐ unit test cho function mới (assert hành vi quan sát được) ☐ unit test cũ pass ☐ edge case
(rỗng/None/max/malformed) ☐ error path (fail-open vs fail-closed nói rõ) ☐ typecheck sạch
☐ không test tự-xác-nhận ☐ FE tự-verify bằng browser cho task chạm UI (layout, tương tác,
console sạch).
**Gate 3 — Sprint** (mọi sprint):
☐ `end_sprint_X.md` đã viết với số liệu TỰ CHẠY LẠI độc lập ☐ architect đã đọc trọn function,
không chỉ diff ☐ tester 100% + browser cho sprint FE ☐ số test ≥ baseline ☐ phát hiện
ngoài-scope đã ghi lại ☐ commit format `feat(sprint-X)/fix/refactor/docs/chore`.
## 6b. Khi verify giở chứng
- **Kẹt / fail lạ / verdict mâu thuẫn** → tra `docs/phuong-phap/DIAGNOSIS.md` TRƯỚC khi
dispatch bất kỳ fix nào. Thứ tự nghi cho tín hiệu lạ: env/tiêu-chí-gate ≥ tool/hạ-tầng > code.
- **Sổ ngoại lệ:** bất thường dai dẳng nhưng chính đáng được một dòng sổ có ký — mục + lý do
+ ngày + người ký + điều kiện xét lại, liệt kê trong `end_sprint` — thay vì ép fix.
Sổ phình = spec/gate sai, không phải thế giới sai.
- **Cưỡng chế nằm ở harness:** luật KHÔNG-ĐƯỢC-PHÉP-VI-PHẠM đặt vào hooks/permissions, không
phải chữ trong prompt — luật prompt là xác suất, hook là cơ khí. Bản nền: `.claude/settings.json`
(deny AskUserQuestion + git phá huỷ + rm). Thêm luật cứng mới → thêm dòng deny + ghi lý do tại chỗ.
## 7. Tự trị — {{SLOT_6_AUTONOMY_TIER}}
**Lõi (cả 2 bậc):** reversible + hướng-agent → LÀM NGAY, không hỏi. Irreversible / khẩu vị UX /
quyết-định-của-user → gom MỘT chỗ (DECISIONS/PARK), team chuyển việc khác. User vắng ≠ team idle.
User nói "stop/dừng" → DỪNG (lệnh user > mọi hook/cron).
**decide-and-log:** quyết định treo dồn đống → team-lead chọn default reversible, ghi
`DECISIONS.md` mục ②, đi tiếp — user override sau (human-wins).
<!-- Giữ MỘT khối, xoá khối kia. -->
**[sprint-gated]** Loop chạy từng sprint; sau mỗi push, sprint kế tự khởi động sau cửa sổ báo
2 phút. Hết backlog → báo user kèm đề xuất batch kế.
**[never-free]** "Hết backlog" KHÔNG TỒN TẠI. Sau phase build, loop thành LỚP VERIFY THỨ HAI:
scout tổng quan → gap/test thiếu; dogfood sản phẩm ĐÚNG VAI người dùng → ma sát → task;
polish/hardening. Heartbeat quét board ~45 phút qua scheduler của harness. Team idle khi còn
finding = lỗi nặng. **Dry-stop:** {{N, mặc định 3}} vòng liên tiếp KHÔNG finding mới = báo cạn
+ đề xuất phase kế; KHÔNG bịa việc sau khi cạn.
## 8. Ưu tiên + kỷ luật bộ nhớ
Thứ tự (trên thắng dưới): 1. lệnh user lượt này → 2. CLAUDE.md này → 3. playbook của role →
4. spawn prompt + dispatch → 5. context hội thoại. Mâu thuẫn → blocker §3.
Re-Read file nguồn: sau compaction · sau 3+ sprint tự trị · trước khi sửa playbook.
## 9. Đội hình — {{SLOT_4_DOMAIN_AGENTS}}
**`team-lead` KHÔNG có agent file** — harness không setup được role này: team-lead chính là
SESSION CHÍNH đang nạp CLAUDE.md này (proxy của user; điều phối, không code, không đụng git).
Muốn đổi hành vi team-lead → sửa CLAUDE.md.
Playbook 4 role — model cố định: `architect` (opus) · `be` (opus) · `fe` (opus) · `tester`
(sonnet). Mỗi role MỘT người — check roster trước khi spawn. Spawn theo AGENT TYPE
(`subagent_type` = tên role) — playbook tự nạp; không spawn agent generic làm việc của role.
{{Agent domain thêm: none | liệt kê từng con + 1 dòng trách nhiệm}}
## 10. Bảo trì CLAUDE.md
Đích 120–180 dòng. Audit khi vượt hoặc mỗi 5 sprint: luật đã cưỡng chế bằng code → bỏ;
trùng playbook/SPEC → bỏ khỏi đây; ôi → bỏ; 3 sprint không kích hoạt → hạ xuống memory.
Luật MỚI chỉ được thêm khi có biên lai (failure thật) — ghi kèm gốc 1 dòng.
---
## ⚠️ Luật tử — nhắc lại cuối file (luật sống còn lặp ở đuôi, theo WRITING-RULES)
- KHÔNG shutdown/xoá teammate khi user chưa xác nhận rõ
- MỘT người commit: chỉ architect; lead không đụng git
- 100% pass mới commit; gate sót ô = chặn
- Verify trước khi tuyên bố (Rule#0) — chạy nó, query lại, dán output thật
- Báo cáo hoàn thành TRƯỚC khi idle — im lặng không bao giờ chấp nhận được
- SCAFFOLD xong = DỪNG discuss với người — loop build chỉ chạy khi người nói "chạy đi"
- Không thêm primitive SPEC không đòi
---
name: architect
model: opus
description: Sprint engine owner — kickoff (align plan vs reality, edit in-place), per-task dispatch, 4-step code review (full functions, not diffs), quality gates, sole committer, drafts the next sprint plan at close. Spawn for planning, review, and commit phases.
---
# Architect — playbook
You own: sprint planning, kickoff, dispatch, code review, quality gates, commits. You are the ONLY
committer. You do not implement feature code (except architecture-level fixes you dispatch to yourself explicitly).
## A. Kickoff (mandatory before dispatching any sprint)
1. Read `plan_sprint_X.md` (draft baseline). FIRST kickoff of the project: no plan exists yet —
create `sprints/plan_sprint_1.md` (drafted from the DISPATCH "Sprint order") and
`sprints/CURRENT.md` (1-line pointer + empty history table), formats per the
`docs/build-system/templates/sprints/`
2. Read `SPEC.md` — may have evolved
3. Read `CLAUDE.md` — process may have evolved
4. Read the last 2–3 `end_sprint_*.md` — what actually shipped
5. Spot-check current code — naming, helpers, established defenses
6. **Edit `plan_sprint_X.md` IN-PLACE** if drift found (one source of truth: <10% drift = inline
note "Refined at kickoff"; 10–30% = keep a short History appendix; >30% = rewrite, archive original)
7. Write fresh dispatch (§B) — the dispatch is the executable contract, not the original plan
Plans are drafts: 70–80% right, always needing in-flight tuning. Never dispatch from a stale plan.
## B. Dispatch (per task, required sections — non-negotiable)
```
[Sprint X — Task #N]
## Context (1 paragraph)
## Scope (IN / OUT lists)
## Logic/Algorithm (BẮT BUỘC cho task phi-CRUD — xem §B2; CRUD thuần ghi "N/A")
## Defensive cases (MANDATORY failure modes to handle)
## Dependencies (available now / blocks)
## Exports (signatures for tester pre-scaffolding)
## Baseline (số test hiện tại — mỏ neo regression)
## Test ownership split (ai viết test NÀO — tester chỉ scaffold phần implementer không cover)
## Verification (explicit pass criteria + gates)
## Idle behavior (when done / when blocked)
```
## B2. Logic/Algorithm — mày thiết kế CÁCH LÀM, không chỉ CÁI GÌ
Spec tả CÁI GÌ, không cho THUẬT TOÁN. Mọi feature phi-CRUD: MÀY viết derivation vào block
`## Logic/Algorithm` TRƯỚC khi implementer code — inputs → transform từng bước → output shape
→ edge cases → công thức/ngưỡng CHÍNH XÁC. Implementer không bao giờ tự chế logic (data
plausible-nhưng-sai tốn nguyên sprint mới bắt). Spec im lặng về ngưỡng/công thức → mày quyết
+ log DECISIONS (§E), không chặn sprint.
Ordering: gating task first, alone → fan-out parallel tasks after the gate lands → unblock tester
early (pre-scaffold from Exports) → your own review work runs parallel where it doesn't block.
Re-read this section before EVERY dispatch — it drifts from memory faster than expected.
## C. 4-step code review (per sprint — do NOT pass on diff alone)
1. `git diff` — see what changed
2. **Read the FULL changed functions** — open files, trace the execution path entry→exit
3. Verify against the sprint objective — "problem fixed", not "code changed"
4. Hunt adjacent gaps — new bugs, missed edge cases, sibling endpoints with the same flaw
Record in `end_sprint_X.md`: changes, potential errors, risks.
## D. Gates + commit
Tick every box of Gates 1/2/3 (CLAUDE.md §6a) in your pre-commit message. Any unchecked box →
`❌ Gate X failed: <boxes>` and stop. All pass → ONE commit per sprint (code + plan + end docs),
`feat(sprint-X): <scope>` → notify "pushing in 2 min unless no" → `sleep 120 && git push` via
Bash with `run_in_background: true` (does not block the loop; user can cancel in the window).
Sprint close: the closing commit also updates `sprints/CURRENT.md` (pointer to the next active
plan + history row) — same commit, never a separate one. At close you also DRAFT
`plan_sprint_{X+1}.md` from the DISPATCH sprint order + this sprint's out-of-scope findings
(drafting the NEXT plan is not an edit-in-place violation — that rule governs the kickoff of an
already-open sprint).
Two judgment rules for gates:
- **Judge the judges first:** when a criterion fails everything (or a new check fails known-good
code), run it against code you already trust before blaming the sprint — good code failing the
check means the CHECK is wrong; fix it with a dated note, don't quietly loosen tests.
- **Be humble with small samples:** a marginal difference on a handful of runs is noise, not
signal. Don't accept or reject work over tiny deltas on tiny samples; for flaky-sensitive
checks demand 3 consecutive identical runs. Stuck/contradictory verdicts → `DIAGNOSIS.md`.
## E. Where the spec is silent
Decide yourself, log the decision + reason in `DECISIONS.md` (newest-first). Escalate to team-lead
only if irreversible or clearly a user-taste call.
---
⚠️ Recap (per WRITING-RULES — repeated at file end): you are the ONLY committer · never pass
review on the diff alone (read full functions) · any unchecked gate box = commit blocked ·
never dispatch from a stale plan (kickoff first, edit in-place).
---
name: backend
model: opus
description: Implements server/API/data-layer code against the locked dispatch contract. Handles every listed defensive case, verifies before claiming (runs tests, queries writes back), never commits. Spawn with the task dispatch in the prompt.
---
# Backend (`be`) — playbook
You own: server/API/data-layer code. You implement against the locked dispatch contract.
## Work loop
1. Read the FULL dispatch (task IS the spec — a chat message is only a pointer)
2. Read the files you'll touch before editing; match existing naming/idioms/helpers
3. Implement Scope IN only. Scope OUT or undispatched work you discover → report it, don't build it
4. Handle EVERY listed defensive case; suspect an unlisted one matters → `[BLOCKER]`, don't assume
5. Write unit tests for new functions (assert observable behavior, no self-confirming asserts)
6. Run the test suite + typecheck yourself before claiming done
7. Schema BE là NGUỒN SỰ THẬT cho types FE (FE mirror nó) — đổi shape phải báo qua team-lead
trước, không đổi lặng lẽ
8. Trước khi tuyên schema FROZEN: diff FIELD-BY-FIELD với field list nguồn (dispatch/mock) +
gọi endpoint thật dán payload — không diff theo trí-nhớ-những-gì-mình-đổi (field cộng thêm
nằm giữa message dài sẽ lọt)
## Verify before claiming (Rule#0)
- "Tests pass" → run the command, paste real output
- "Wrote to DB" → query the row back, check fields non-null
- "Build/migration/script works" → RUN it; reading code is not running code
- External integration → capture a REAL payload first (Phase 0), never build schemas from spec assumption
## Done
Send the completion report to team-lead (format in CLAUDE.md §4) BEFORE going idle, then mark the
task completed. Blocked or errored mid-task → `[STATUS]` message, never silence. Do not commit —
architect is the only committer. Do not auto-claim the next task unless the dispatch says so.
---
name: frontend
model: opus
description: Implements UI against the locked dispatch contract and the APPROVED design mock — ports, never redesigns. Chrome/browser self-verification is part of done. Never touches server code, never commits. Spawn with the task dispatch in the prompt.
---
# Frontend (`fe`) — playbook
You own: UI code. You implement against the locked dispatch contract and the APPROVED design mock.
## Work loop
1. Read the FULL dispatch (task IS the spec)
2. **Port the design mock — do not redesign.** Tokens (colors/typography/spacing) come from
SPEC §5; deviating from the mock is a blocker question, not a creative decision
3. Build against the API contract in Exports; if the endpoint isn't live yet, mock behind an env
flag (`USE_MOCK`) so integration is a flag flip, not a rewrite
4. Handle defensive cases: loading, empty, error, slow-network states for every view you touch
5. Match existing component patterns/naming before inventing new ones
## Chrome self-verification (required for every UI-touching task)
Run the dev server, open the actual route in the browser, and verify with your own eyes:
layout vs mock · interaction (click/type/keyboard) · animation · dark mode · console clean of
errors. This is part of "done" — additive to tester's independent pass, not a replacement.
## Done
Completion report to team-lead BEFORE idle (format in CLAUDE.md §4): files, tests, what you
Chrome-verified, deviations. Blocked/errored → `[STATUS]`, never silence. Never commit; never
redesign; never touch server code — that's `be`'s surface.
---
name: tester
model: sonnet
description: Independent runtime verifier (author ≠ checker) — test suites 100%, then real API calls, then browser UI. Reports explicit UNVERIFIABLE lists instead of default-green. Spawn to verify implemented tasks; never accepts implementer claims as evidence.
---
# Tester — playbook
You own: independent runtime verification. You are the checker; implementers are the authors —
**author ≠ checker**, never accept an implementer's claim as evidence.
## Verification order (fixed)
1. **Test suites — must be 100%.** Any fail → report, no partial pass
2. **API verification** — hit real endpoints (curl/scripts), real payloads, no mocks. Cover the
public/integration path, not just unit internals (edge-layer 404s have passed CI before)
3. **Chrome UI behavior** — only after API passes: flows from SPEC screen bullets, dark mode,
console errors
## Rules
- **Pre-scaffold early:** from the dispatch Exports section, write test skeletons before
implementation lands — you unblock the sprint's critical path
- **3-run determinism:** anything flaky-sensitive must pass 3 consecutive identical runs; "passed
once" is not a result
- **No self-confirming tests:** no bare `assert is not None` after a mock, no mock-bypass asserts;
every test asserts observable behavior
- **Distinguishing cases:** every verification suite needs at least one case that ONLY a correct
implementation passes and a plausible shortcut fails (e.g. "search returns <n> results"
distinguishes a truncated-envelope from a silent cut). **100% pass on the first run = suspect
the suite is weak**, not celebrate
- **Small-n caution:** a pass-rate over a handful of cases is mostly noise. Small suites are for
catching gross regressions, not for reading as an accuracy number — never report "improved from
<x>% to <y>%" off a tiny suite without stating the n
- **Honest refuse:** something you cannot verify (no env, no fixture, gated) → report an explicit
UNVERIFIABLE list; never default-green. Unverifiable items are where humans spot-check
- Edge cases always: empty / None / max / malformed / error path (fail-open vs fail-closed explicit)
## Done
Completion report to team-lead BEFORE idle: pass/fail counts vs baseline, what was verified at
which layer, UNVERIFIABLE list, deviations. Verify done but end-doc pending → say exactly that.
Mid-task error (Chrome/dev-server) → `[STATUS]` with what DID pass; architect can run Chrome
independently. Never silence — silent tester = lead reading transcripts to guess.
{
"_comment": "KIT: copy file này vào <project>/.claude/settings.json ở Step 4. Cưỡng chế CƠ KHÍ các luật tử của CLAUDE.md — luật prompt là xác suất, deny-rule là chắc chắn. Sổ hook: mỗi dòng deny ghi lý do ở đây.",
"permissions": {
"deny": [
"AskUserQuestion",
"Bash(git push --force:*)",
"Bash(git push -f:*)",
"Bash(git reset --hard:*)",
"Bash(git commit --no-verify:*)",
"Bash(git checkout -- .:*)",
"Bash(rm:*)"
]
}
}
# {{App}} — Đặc tả Tính năng Toàn diện (SPEC)
> **App:** {{tên — 1 dòng bản chất}}
> **Cho ai:** {{single-user chỉ mình tôi / multi-user public}}
> **Chốt:** {{YYYY-MM-DD}}
> **Kiến trúc/stack:** xem `ARCHITECTURE.md` · **Design baseline:** {{đường dẫn mock ĐÃ DUYỆT — port, không thiết kế lại}}
<!-- Nguyên tắc viết spec (từ life-os-SPEC-FULL — instance tốt nhất):
RẤT cụ thể ở feature-behavior; CỐ Ý MỜ ở implementation (AI tự quyết, ghi DECISIONS).
Spec này trả lời CÁI GÌ + TẠI SAO. ARCHITECTURE.md trả lời BẰNG GÌ. DISPATCH.md trả lời AI LÀM GÌ TRƯỚC.
SPEC = CONTRACT VIẾT Ở THÌ HOÀN THÀNH: mô tả hệ NHƯ THỂ ĐÃ TỒN TẠI — interface, envelope,
ví dụ I/O nguyên văn, hành vi lỗi. Đó là cách CHẾ TẠO ground-truth cho builder: build thành
bài toán máy-kiểm-được, agent tự build + tự audit-vs-contract không cần người kèm.
Spec kiểu danh-sách-việc không audit được ("đã làm" ≠ "đã đúng").
Hệ quả TỰ PHÂN RÃ: agent chỉ được tự break spec rộng thành mục tiêu con KHI mục tiêu con
có điều-kiện-hoàn-thành máy-kiểm-được; phần không tự kiểm được (taste, UX) → đánh dấu
cho người quyết, đừng để agent tự break. -->
---
## 0. MỤC ĐÍCH HỆ THỐNG
**Một câu:** {{app làm gì, cho ai, tự vận hành ra sao}}
**App giải quyết N vấn đề thật:**
1. {{vấn đề thật #1 — pain bạn TỰ trải, không phải giả định thị trường}}
2. {{vấn đề thật #2}}
3. {{vấn đề thật #3}}
**Các câu app phải trả lời được:** {{vd: Đang ở đâu? / Mục tiêu gì? / Ai đang dùng? / Bước tiếp theo?}}
**Nguyên tắc cốt lõi:** <!-- 3-6 gạch, đây là phần chống drift mạnh nhất của spec -->
- {{vd: App = nguồn sự thật; AI = bộ não ngoài, thay thế được}}
- {{vd: API là trái tim — mọi screen + AI đọc qua API}}
- {{vd: Raw-data first — app trả data thật, suy luận để AI làm}}
- {{vd: Honest mirror — app dám nói thẳng sự thật}}
---
## 1. KHUNG GIAO DIỆN CHUNG (mọi screen)
| Thành phần | Mục đích | Tính năng |
|---|---|---|
| {{Sidebar}} | {{...}} | {{...}} |
| {{Top bar}} | {{...}} | {{...}} |
---
## 2. CÁC SCREEN & TÍNH NĂNG (S1–Sn)
<!-- Mỗi screen đúng 1 format: Mục đích (1 câu) + Tính năng (bullet CỤ THỂ, kể cả hành vi click).
Đây là phần tester + FE Chrome-verify đối chiếu — càng cụ thể càng ít vòng lặp sửa. -->
### S1 — {{Tên screen}}
**Mục đích:** {{1 câu}}
**Tính năng:**
- {{bullet hành vi cụ thể}}
- {{click X → điều gì xảy ra}}
### S2 — {{...}}
---
## 3. API LAYER
<!-- Các ví dụ mẫu ở §3/§4 nghiêng theo app AGENT-FIRST (slot 5). App human-app thuần:
lược "AI ngoài đọc qua đây / MCP wrap / raw-data-first" — chỉ giữ endpoint phục vụ screen;
app nhỏ FE+embedded-DB có thể xoá hẳn section này (khớp nhánh small-app bên ARCHITECTURE). -->
**Mục đích:** {{mọi screen đọc qua đây; nếu agent-first: + AI ngoài đọc, app đứng độc lập không cần FE}}
**Endpoints chính:** {{nhóm resource: list/detail/action...}}
**Nguyên tắc:** {{human-app: consistent + typed là đủ · agent-first: raw-data first, metric phái sinh compute sẵn, MCP wrap sau hay ngay}}
---
## 4. DATA LAYER
- {{storage cho từng loại data + lý do — vd markdown+git cho metadata (lịch sử miễn phí, AI đọc thẳng), SQLite cho time-series}}
- **Ground truth:** {{data thật sống ở đâu; app ref hay embed}}
- **Format trạng thái chung:** {{shape JSON mọi reader phải trả}}
---
## 5. COLOR + TYPOGRAPHY (port từ mock, KHÔNG thiết kế lại)
| Vai | Giá trị |
|---|---|
| {{nền / accent / semantic}} | {{mã màu cụ thể từ mock}} |
- {{font mono cho gì, sans cho gì; radius; grid}}
---
## 6. RANH GIỚI BẢN NÀY (build) vs SAU
<!-- Chống scope-creep — phần bắt buộc. Cái gì ❌ ở đây thì agent KHÔNG được tự build. -->
| Phần | Bản này | Sau |
|---|---|---|
| {{...}} | ✅ | |
| {{...}} | ❌ | ✅ |
## 6b. KHÔNG LÀM (tuyệt đối)
- ❌ {{vd: mobile native — nếu cần thì PWA}}
- ❌ {{vd: không commit CLAUDE.md/.claude vào public repo}}
- ❌ {{vd: đã chốt bỏ hướng X — lý do, đừng re-litigate}}
---
## 7. TÓM TẮT SCREENS
| Nhóm | Screen |
|---|---|
| {{...}} | {{...}} |
## 8. LIÊN HỆ
- Kiến trúc kỹ thuật: `ARCHITECTURE.md`
- Design mock (đã duyệt): {{path}}
- {{data nền / tài liệu quyết định liên quan}}
# {{App}} — Kiến trúc Kỹ thuật (ARCHITECTURE)
> **App:** {{tên — 1 dòng bản chất}}
> **Stack:** {{FE · BE · data · scheduler/queue — 1 dòng}}
> **Chốt:** {{YYYY-MM-DD}}
> **Triết lý:** {{1-2 câu — vd: App = nguồn sự thật; AI = bộ não ngoài, thay thế được. Mỗi feature là module độc lập, build riêng → nối qua interface chung. Mục tiêu #1: dễ mở rộng.}}
<!-- Nguyên tắc viết architecture (cặp với SPEC.template — SPEC = CÁI GÌ + TẠI SAO; file này = BẰNG GÌ + THỨ TỰ NÀO):
VIẾT Ở THÌ HOÀN THÀNH — mô tả hệ NHƯ THỂ ĐÃ TỒN TẠI: thư mục đã có, interface đã chốt, module
đã cắm vào core. Đó không phải khoe; đó là cách CHẾ TẠO ground-truth cho builder: mỗi mục
("registry auto-discover modules/", "reader trả đúng ProjectStatus") thành bài toán MÁY-KIỂM-ĐƯỢC,
agent tự build + tự đối chiếu-vs-contract không cần người kèm.
Kiến trúc kiểu danh-sách-mong-muốn ("nên tách module", "cố gắng cho gọn") KHÔNG kiểm được → agent
tự break sai. Hệ quả TỰ PHÂN RÃ: agent chỉ được tách một mục architecture rộng thành mục con KHI
mục con có điều-kiện-hoàn-thành máy-kiểm-được (chạy được, curl được, import được). Phần không tự
kiểm được (chọn stack theo taste, đánh đổi lớn) → §2 ghi lý do 1 lần, đừng để agent re-litigate.
Điểm mở rộng (registry/module §4) là phần chống-drift mạnh nhất: "thêm feature = thêm 1 folder,
KHÔNG sửa core" là ràng buộc máy-kiểm-được — architect kiểm bằng cách thêm module rỗng rồi chạy. -->
---
## 1. CẤU TRÚC REPO (path)
```
{{root/}}
├── {{mock-hoặc-design-reference/}} # baseline ĐÃ DUYỆT (GIỮ NGUYÊN, bất biến) — port, không thiết kế lại
└── {{app-thật/}} # ⭐ repo git riêng — thứ team build
```
{{1 câu: app thật đứng độc lập ra sao; nếu self-hosted/dogfood thì nói rõ.}}
---
## 2. STACK & QUYẾT ĐỊNH
<!-- Mỗi dòng = 1 quyết định KÈM LÝ DO. Lý do là thứ chống re-litigate ở sprint sau.
⚠️ CHỌN CỠ TRƯỚC KHI ĐIỀN — template này có 2 nhánh:
[full-app] nhiều module/nguồn data → dùng đủ §4 registry + §5 StatusShape + kho kép.
[small-app] ít feature, 1 loại data, single-user → được phép: BỎ registry (§4 chỉ giữ
"hợp đồng chung" tối giản hoặc mount tay), BỎ §5 (không có nhiều reader thì không cần
shape chung), 1 store duy nhất (bỏ dòng kho kép), thậm chí bỏ hẳn backend nếu
FE + embedded DB đủ. Ghi quyết định cỡ + lý do vào bảng dưới 1 dòng — đừng gồng theo
khuôn app lớn; template phục vụ app, không phải ngược lại. -->
| Lớp | Chọn | Lý do |
|---|---|---|
| Frontend | {{...}} | {{vì sao — 1 câu}} |
| Backend | {{...}} | {{vd: API là trái tim; sau bọc MCP gần như free}} |
| Data — {{metadata}} | {{vd: Markdown + git}} | {{human + AI cùng đọc; git = lịch sử miễn phí}} |
| Data — {{time-series}} | {{vd: SQLite}} | {{cần query theo thời gian; markdown không hợp}} |
| Scheduler / queue | {{...}} | {{...}} |
| AI | {{trong / ngoài}} | {{nhúng lúc này hay nối qua API/MCP sau}} |
---
## 3. THƯ MỤC (đã tồn tại)
<!-- Cây thư mục ĐÍCH — builder tạo đúng cây này. Chú thích vai trò từng nhánh chốt (⭐ = điểm mở rộng). -->
```
{{app/}}
├── backend/
│ ├── core/
│ │ ├── {{base}} # interface/hợp đồng chung (§4)
│ │ ├── {{registry}} # auto-discover {{modules/}} → gắn vào app
│ │ └── {{config}} # settings, paths, pointer nguồn ngoài
│ ├── {{modules/}} # ⭐ mỗi feature = 1 module độc lập
│ │ ├── {{feature-a/}} # {{router · service · schema · reader}}
│ │ └── {{feature-b/}}
│ ├── {{store/}} # {{md store + git · db}}
│ └── {{main}} # app entry, registry.mount_all()
│
├── frontend/
│ ├── {{app-hoặc-routes/}} # routes = các screen (khớp SPEC S1–Sn)
│ ├── components/ # SHELL + dùng chung
│ ├── {{features/}} # ⭐ mỗi feature khớp module BE
│ └── lib/ # {{api client · types khớp schema BE · tokens.css port từ mock}}
│
└── README.md
```
---
## 4. INTERFACE / HỢP ĐỒNG GIỮA CÁC TẦNG (điểm mở rộng) — [full-app; small-app: rút gọn]
<!-- ĐÂY LÀ HẠT NHÂN của "dễ mở rộng". Nói RÕ hợp đồng + cơ chế registry.
Ràng buộc phải máy-kiểm-được: "thêm module = thêm folder, không sửa core".
[small-app]: registry auto-discover là OPTIONAL — dưới ~4 module thì mount tay rõ hơn;
giữ lại duy nhất phần "hợp đồng chung" (shape module) để sau này lớn thì nâng cấp. -->
Mỗi module {{BE}} phải có đúng shape:
```
{{modules/<name>/}}
{{router}} # {{endpoints REST}}
{{schema}} # {{data shape — theo công nghệ đã chốt ở stack}}
{{service}} # {{business logic}}
{{reader}} # (optional) {{đọc nguồn ngoài: git / giá / log}}
```
Hợp đồng chung (`core/{{base}}`):
```
{{BaseModule}}:
name: str # {{"<feature>"}}
router: {{APIRouter}} # endpoints
{{routines() -> list}} # (optional) routine module cấp cho scheduler
```
Cơ chế `core/{{registry}}`:
- Quét `{{modules/}}`, import mỗi module, lấy `router` → gắn vào app với prefix `/{{<name>}}`
- Gom mọi `{{routines()}}` → đăng ký vào scheduler
- → **Thêm module mới = thêm 1 folder. KHÔNG sửa core, KHÔNG sửa `{{main}}`.**
{{FE}}: mỗi `{{features/<name>/}}` tự chứa component + gọi api client. Screen ghép feature + shell.
---
## 5. FORMAT TRẠNG THÁI CHUNG (mọi reader trả về) — [chỉ khi có ≥2 reader khác nguồn; không thì XOÁ section]
<!-- Nhiều reader khác nguồn (git / log / giá) → CÙNG 1 output → core + FE + AI xử lý 1 kiểu.
Đây là contract máy-kiểm-được: test = gọi reader, assert đúng shape này. -->
```
{{StatusShape}} = {
{{id, name, health, ... — các field chốt + kiểu}}
}
```
{{1 câu: reader nào sinh ra shape này; nếu schema gốc có sẵn trong mock thì trỏ tới.}}
---
## 6. DATA LAYER (mapping storage → loại data)
- **{{Markdown + git}}** (`{{path}}`): {{loại data nào; mỗi lần ghi = 1 commit → lịch sử miễn phí}}
- **{{SQLite / DB}}** (`{{path}}`): {{bảng gì — thứ cần query theo thời gian}}
- **Ground truth:** {{data thật sống ở đâu; app TRỎ tới qua pointer hay embed; reader đọc read-only?}}
---
## 7. API SURFACE
<!-- Bảng endpoint theo module. Khớp SPEC §3. -->
| Module | Endpoints |
|---|---|
| {{feature-a}} | {{`GET /...` · `POST /...`}} |
| {{feature-b}} | {{...}} |
Nguyên tắc: {{vd: raw-data first — trả data thật + metadata; metric phái sinh compute sẵn; MCP wrap sau hay ngay}}.
---
## 8. THỨ TỰ IMPLEMENT (mỗi bước SHIP ĐƯỢC độc lập)
<!-- Cột "Ship được" là điều-kiện-hoàn-thành máy-kiểm-được của từng bước.
Mỗi bước phải chạy/test độc lập (curl module, render route) — không bước nào phụ thuộc bước chưa có.
Đây là nguồn để architect cắt sprint: 1 bước ≈ 1 sprint hoặc gom vài bước độc lập song song. -->
| # | Bước | Nội dung | Ship được (kiểm bằng) |
|---|---|---|---|
| **0** | {{Core + Shell}} | {{registry, interface, skeleton BE; FE shell + port tokens}} | {{khung chạy, navigate rỗng}} |
| **1** | {{Feature xuyên suốt đầu tiên}} | {{BE router + reader + FE screen}} | {{app thật đầu tiên, xuyên BE→API→FE — curl + render}} |
| **2** | {{...}} | {{...}} | {{...}} |
| **n** | {{...}} | {{...}} | {{...}} |
| **sau** | {{MCP / AI / phần hoãn}} | {{...}} | {{nối AI ngoài}} |
**Build rời rạc:** mỗi module BE chạy/test bằng curl độc lập; mỗi FE feature render route riêng. Xong → registry tự nhặt BE, thêm route FE vào shell. Build song song được miễn giữ interface (§4).
---
## 9. RANH GIỚI KỸ THUẬT (bản này vs sau)
<!-- Chống scope-creep ở tầng kỹ thuật. Khớp SPEC §6/§6b. Cái ❌ ở đây agent KHÔNG được tự build. -->
- ✅ Bản này: {{module/screen/scheduler/API mức nào}}
- ❌ Không: {{primitive network/scale/AI chưa cần — vd auth, multi-user, MCP, routine AI-generated}}
- 🔜 Sau: {{phần hoãn có chủ đích + điều kiện kích hoạt}}
---
## 10. LIÊN HỆ
- Đặc tả tính năng: `SPEC.md`
- Giao việc: `DISPATCH.md`
- Design baseline (đã duyệt): {{path mock}}
- {{tài liệu quyết định / data nền liên quan — [[link]] nếu có wiki}}
# DISPATCH — {{App}} · gửi team-lead
> Bản giao việc cho team-lead. Team-lead đọc → spawn các role theo AGENT TYPE (harness tự nạp
> playbook `.claude/agents/<role>.md`) → architect kickoff + dispatch từng task → process theo
> CLAUDE.md (3 quality gate, sprint engine, autonomy tier). Chủ thể spawn là TEAM-LEAD;
> architect lo kickoff/dispatch/review.
> {{Spec kỹ thuật chi tiết ở file X — đọc trước khi làm A1.}}
<!-- Từ life-os-DISPATCH-team-lead (instance tốt nhất). Luật quan trọng:
- Giao qua TEAM-LEAD, không giao thẳng member (bạn không biết roster).
- Mỗi task = Intent + Ràng buộc/Defensive + Quyết-định-để-architect + Gate.
- Task IS spec: dispatch này là contract, message chỉ là pointer.
- GATE PHẢI MÁY-KIỂM-ĐƯỢC (đo được, chạy được): gate kiểm được → agent tự phân rã +
tự biết lúc nào xong, loop chạy không cần người. Gate kiểu "làm cho tốt" → agent
break sai; phần không kiểm được (taste/UX) tách riêng, đánh dấu chờ người. -->
## Bối cảnh & mục tiêu
{{2-4 câu: đã có gì, đợt này làm gì. Nguyên tắc: value > volume — thà ít task HOÀN CHỈNH + test,
hơn nhiều cái dở. Mỗi task xong phải qua 3 quality gate trước commit.}}
## Backlog ưu tiên (làm từ trên xuống)
### A1 — {{tên, ưu tiên #1}} {{· đọc file spec nào trước}}
**Intent:** {{1-2 câu: vì sao task này tồn tại, nối với thesis/mục đích nào}}
**Ràng buộc / defensive:**
- {{ràng buộc dữ liệu/hành vi tối thiểu — cái KHÔNG được thiếu}}
- {{failure mode bắt buộc xử lý}}
- **Quyết định cho architect:** {{điểm mờ có chủ đích — architect đọc code thật rồi quyết, ghi lý do vào kickoff}}
**Domain rules:** {{luật nghiệp vụ đặc thù — đơn vị đo, quy tắc gộp/chuẩn hoá, ngưỡng nghề — thứ không suy được từ code; ghi nguồn. Không có → "none"}}
**Gate:** {{tiêu chí pass CỤ THỂ, đo được — vd: "2 device sửa offline → reconnect → hội tụ, 0 mất data"}}
### A2 — {{...}}
**Intent:** {{...}}
**Ràng buộc / defensive:** {{...}}
**Domain rules:** {{luật nghiệp vụ đặc thù task này — đơn vị đo, quy tắc gộp/chuẩn hoá, ngưỡng
nghề — thứ KHÔNG suy được từ code và không máy-kiểm 100%; ghi rõ nguồn (user chốt / chuyên gia).
Không có thì ghi "none".}}
**Gate:** {{...}}
### A(n-1) — Test coverage sweep + harden <!-- giữ mặc định: nguồn việc value-cao khi backlog chính cạn -->
Quét mọi module → thêm test cho path chưa cover: edge case (empty/None/max/malformed), error path,
fail-open vs fail-closed. KHÔNG self-confirming test. Báo coverage trước/sau.
**Gate:** test count ≥ baseline, mọi test assert observable behavior.
### A(n) — Refactor + security (cleanup) <!-- giữ mặc định -->
File >500 LOC → tách module cohesive (không đổi behavior). Security sweep: secret hardcode,
injection, path traversal, least-privilege. **Gate:** test vẫn pass sau refactor; báo cáo lỗ hổng.
## Teammates (gợi ý — team-lead tự quyết spawn theo agent type)
- **architect** — kickoff mỗi sprint, spec chi tiết task mờ, 4-step review, gates, commit+push
- **be** — {{task nào}}
- **fe** — {{task nào}}
- **tester** — verify mọi task (suite 100% → API curl → Chrome)
{{- domain agents nếu SLOT_4 có}}
Spawn đúng cái cần, không thừa (1 teammate/role, check roster trước khi spawn).
## NEVER-IDLE
Hết task trong backlog → KHÔNG ngồi không. Tự bốc theo thứ tự: (1) task A kế tiếp → (2) test sweep
module chưa cover → (3) refactor/security → (4) harden edge case. Backlog phần mềm là vô hạn.
## Sprint order (architect chốt lại ở kickoff)
```
Sprint 1: {{gating tasks}}
Sprint 2: {{parallel khi độc lập}}
Sprint 3: {{...}}
Sprint n: test sweep + cleanup
```
## KHÔNG làm
- ❌ {{ranh giới từ SPEC §6b — nhắc lại các mục dễ vi phạm nhất}}
- ❌ Project mới from scratch ngoài dispatch này
- ❌ {{...}}
## Quy trình giữ nguyên (CLAUDE.md)
3 quality gate (API/Function/Sprint) · sprint docs (plan_/end_) · tester 100% trước commit ·
architect 4-step review (đọc full function, không chỉ diff) · ONE committer · commit 1/sprint ·
2-min auto-push · completion report bắt buộc.
# Sprint {{X}} — Plan
<!-- LUẬT SỐNG CÒN (đọc trước khi sửa file):
Plan này là 1 SOURCE OF TRUTH duy nhất cho sprint. Kickoff KHÔNG viết file mới —
architect EDIT IN-PLACE file này (drift <10% = note inline; 10–30% = edit + History appendix; >30% = rewrite), rồi
APPEND section `## Kickoff — YYYY-MM-DD` ở CUỐI. Never dispatch từ plan stale.
Task = spec: mỗi task phải có verification MÁY-KIỂM-ĐƯỢC (chạy được/đo được), nếu
không agent tự break sai + không biết lúc nào xong.
Task-id do architect đặt, MỘT quy ước nhất quán cả project (vd T<sprint>-<n>) —
dùng đúng id đó xuyên suốt dispatch / plan / end_sprint. -->
**Objective:** {{1-2 câu — sprint này đạt cái gì; nối với bước nào trong ARCHITECTURE §8}}
**Theme:** {{1 cụm — mọi task chung theme, độc lập sprint khác}}
**Baseline test count:** {{<count> — end_sprint phải ≥ số này}}
## Tasks (3-6, làm theo dependency)
### {{<task-id>}} — {{tên ngắn}}
- **Assignee:** {{be / fe / tester / architect}}
- **Mô tả:** {{1-2 câu — làm gì, chạm file/module nào}}
- **Dependency:** {{<task-id khác> / none}}
- **Verification:** {{tiêu chí pass CỤ THỂ, đo được — vd: "curl GET /<resource> trả 200 + N field non-null" / "unit test <path> pass, assert observable behavior"}}
### {{<task-id>}} — {{...}}
- **Assignee:** {{...}}
- **Mô tả:** {{...}}
- **Dependency:** {{...}}
- **Verification:** {{...}}
<!-- ...lặp tới 3-6 task. Gate mỗi task phải chạy được, không "làm cho tốt". -->
---
<!-- ↓ Section dưới do ARCHITECT append lúc kickoff. Trước kickoff để trống khung này. -->
## Kickoff — {{YYYY-MM-DD}}
**Drift since plan:** {{cái gì đã đổi so với lúc viết plan — spec mới, code thực tế khác giả định, task trước để lại findings. "none" nếu khớp.}}
**Plan revisions:** {{đã sửa gì IN-PLACE ở trên — task thêm/bỏ/đổi verification. Trỏ tới task-id cụ thể.}}
**Final task list (chốt dispatch):**
- {{<task-id>}} → {{assignee}} — {{gate 1 dòng}}
- {{<task-id>}} → {{assignee}} — {{gate 1 dòng}}
# Sprint {{X}} — End
<!-- LUẬT SỐNG CÒN (đọc trước khi viết):
Đây là RECEIPT, không phải bản kể công. Mỗi task done phải kèm BẰNG CHỨNG verify
chạy độc lập được — lệnh ĐÃ CHẠY + output count, không phải "đã làm xong". "Đã làm"
≠ "đã đúng". 3 gate tick-box PHẢI tick trước khi commit; ô nào chưa tick = commit bị chặn.
Findings ngoài scope → flag cho sprint sau, KHÔNG tự làm trong sprint này. -->
**Theme:** {{khớp plan}} · **Commit:** {{<hash> — điền sau khi commit}}
## Kết quả từng task
### {{<task-id>}} — {{done / fail}}
- **Bằng chứng:** {{lệnh đã chạy + output count — vd: "`<test-cmd>` → N passed, 0 failed" / "`curl GET /<resource>` → 200, M field non-null"}}
- **Deviation:** {{lệch gì so với dispatch, hoặc none}}
### {{<task-id>}} — {{done / fail}}
- **Bằng chứng:** {{...}}
- **Deviation:** {{...}}
## 3 Quality Gates
<!-- Danh sách ô ĐẦY ĐỦ và chuẩn = CLAUDE.md §6a (load-bearing: bất kỳ ô nào unchecked = commit
blocked). Dưới đây chỉ là chỗ tick receipt tóm tắt — lệch ô nào, lấy §6a làm chuẩn. -->
- [ ] **Gate 1 — API** {{n/a nếu không chạm API}}: schema · integration test endpoint mới · test cũ pass · response format · REST status
- [ ] **Gate 2 — Function**: unit test assert observable behavior · test cũ pass · edge (empty/None/max/malformed) · error path · typecheck clean · FE Chrome self-verify nếu chạm UI
- [ ] **Gate 3 — Sprint**: end_sprint có count re-run độc lập · architect đọc full function (không chỉ diff) · tester 100% · test count ≥ baseline · findings ngoài scope đã ghi
## Test counts
- **Baseline (đầu sprint):** {{<count>}}
- **Sau sprint:** {{<count> — phải ≥ baseline}}
## Findings ngoài scope (flag cho sprint sau)
- {{phát hiện lúc build nhưng KHÔNG thuộc sprint này — mô tả + gợi ý task. "none" nếu không.}}
## Ngoại lệ đã ký (nếu có)
<!-- Chỉ điền khi có anomaly hợp lệ không fix được trong sprint (flaky-by-infra, case mơ hồ thật). -->
- {{item · lý do · <YYYY-MM-DD> · signer · điều kiện re-review}} {{— hoặc "none"}}
Đó là toàn bộ kit. Điểm mấu chốt để dựng lại đúng: đọc BẢN CHẤT (§01) trước— nó cho bạn cái để tự phân xử khi template im lặng. Template là hệ quả; nguyên lý “dồn chờ-người về một điểm, triệt tiêu đoán” mới là thứ sống sót khi hoàn cảnh đổi.
Tải raw — fetch trực tiếp
Nếu bạn là agent và muốn kéo file thô (không qua HTML của bài này), bộ kit được serve tĩnh dưới /kit/. Fetch /kit/manifest.md trước — nó là mục lục + hướng dẫn thứ tự dựng — rồi kéo từng file theo thứ tự 00-kickoff.md → CLAUDE.template.md → agents/* → settings.template.json → templates/*.
/kit/manifest.md # đọc TRƯỚC — mục lục + hướng dẫn
/kit/00-kickoff.md # quy trình 2 bước + BẢN CHẤT + 7 slot
/kit/CLAUDE.template.md # → đặt thành CLAUDE.md của project
/kit/agents/architect.md # → .claude/agents/architect.md
/kit/agents/backend.md # → .claude/agents/backend.md
/kit/agents/frontend.md # → .claude/agents/frontend.md
/kit/agents/tester.md # → .claude/agents/tester.md
/kit/settings.template.json # → .claude/settings.json
/kit/templates/SPEC.template.md
/kit/templates/ARCHITECTURE.template.md
/kit/templates/DISPATCH.template.md
/kit/templates/sprints/plan_sprint.template.md
/kit/templates/sprints/end_sprint.template.md