- CLAUDE.md chỉ reliable 80% vì model có thể quên hoặc bị override.
- Hooks là shell script chạy ở harness layer, reliable 100%, không qua LLM.
- Claude Code hỗ trợ 27 hook events từ SessionStart đến PreCompact.
- Song song đó, quy trình Design→Plan→Build→Manual Acceptance ngăn AI viết code mà không có bản thiết kế.
TL;DR
Bài 3 giải quyết 2 vấn đề hay bị bỏ qua: Hooks để tự động hóa các hành vi cần đảm bảo 100% thay vì dựa vào prompt, và quy trình Design→Plan→Build để ngăn AI "vibe code" theo cảm tính.
Tại sao CLAUDE.md không đủ cho automation
Bạn đã từng viết vào CLAUDE.md: "mỗi lần dùng lệnh git push phải hỏi xác nhận"? Rồi Claude Code bỏ qua vào lần thứ 5?
CLAUDE.md là quy tắc - Claude Code đọc và cố tuân thủ. Nhưng model có thể quên, có thể bị override bởi context quá dài, có thể "interpret" theo cách khác. Độ reliable thực tế khoảng 80%. Với những thứ như "không bao giờ force-push" hay "luôn chạy linter sau khi edit" - 80% là không đủ.
Hooks giải quyết vấn đề này bằng cách chạy ở harness layer, hoàn toàn ngoài vòng quyết định của LLM. Shell script hook không hallucinate, không quên, không bị context override. Reliability: 100%.
27 hook events của Claude Code
Claude Code hiện hỗ trợ 27 hook events. Nguyên tắc là match "khi nào cần làm gì" với đúng event tương ứng:
- SessionStart - khi session mới bắt đầu: load context, đọc NOW.md, chào user
- SessionEnd - khi session kết thúc: cập nhật NOW.md, tóm tắt công việc hôm nay
- UserPromptSubmit - ngay khi user nhấn Enter, trước khi model thấy: inject thêm context, validate input
- PreToolUse - trước khi tool được gọi: intercept lệnh nguy hiểm, log audit trail
- PostToolUse - sau khi tool chạy xong: cập nhật index, trigger follow-up actions
- Stop - khi model hoàn thành 1 vòng trả lời: voice notification, save conversation log, chạy git status
- SubagentStop - khi subagent kết thúc: aggregate results, cleanup
- PreCompact - trước khi context bị compress: trích xuất và lưu preferences, lessons trước khi mất
Hook thực tế đang dùng
Một vài hook có giá trị cao trong thực tế:
Stop → Voice notification: Claude Code phát âm thanh "vòng này xong rồi" khi model hoàn thành. Bạn không cần nhìn màn hình liên tục - làm việc khác, nghe âm thanh là biết cần kiểm tra.
PreToolUse(Bash) → Dangerous command intercept: Hook scan command trước khi chạy. Phát hiện rm -rf /, git push --force, git reset --hard → bật popup xác nhận. Model không thể bypass hook này.
PostToolUse(Write/Edit) → Auto update docs index: Mỗi khi file mới được tạo hoặc edit, hook tự đăng ký vào docs/INDEX.md. Subagent của session sau có thể tìm tài liệu mà không cần bạn nhắc.
PreCompact → Extract preferences: Trước khi context bị compress và mất chi tiết, hook chạy script trích xuất: user lần này học được gì, bị sửa gì, phát hiện preference mới nào. Lưu vào memory repo trước khi quá muộn.
Rule of thumb: "Tự động hành vi dùng hook, phán đoán linh hoạt dùng prompt." Mọi thứ dạng "mỗi lần X thì Y" - viết hook, không viết vào CLAUDE.md.
Design → Plan → Build → Manual Acceptance
Vòng lặp thất bại phổ biến nhất với Claude Code:
Gõ 1 câu → xem AI code → thấy sai → sửa → sai tiếp → nản → đóng terminal.
Vấn đề không phải AI kém - mà là bạn đang để AI vừa định nghĩa vấn đề vừa giải quyết nó. AI giỏi execute, không giỏi define. Tách hai việc này ra:
Design: High-level, chỉ quyết định kiến trúc và nguyên tắc. Không viết implementation steps. Ai cần xây feature gì, module boundary ra sao, data flow thế nào, mục tiêu cuối là gì. Bạn định nghĩa bản đồ - AI chưa cầm bút.
Plan: Từ design, Claude tạo execution plan chi tiết: file nào sẽ thay đổi, thứ tự thay đổi, risk point, rollback path, cách verify từng bước. Dùng plan mode (Shift+Tab) để Claude đề xuất plan trước khi execute.
Build: Thực thi plan đúng như đã viết - không improvise, không tự "optimize" ngoài scope. Sau mỗi bước có automated review gate: subagent review code trước khi bạn nhìn.
Manual Acceptance: Bạn là boss, không phải QA. Mở app, kiểm tra requirement đã fulfilled chưa, check database và log có gì bất thường không. Không tự sửa code - nếu có lỗi, paste full error message + scene description + chỉ thị "tự debug, tự fix, chạy được mới dừng".
Nếu cần rollback: nhấn double-Esc hoặc /rewind để quay về checkpoint trước lỗi - cả conversation lẫn codebase đều được restore. Rule thực chiến: sau 2 lần sửa cùng lỗi không được, /clear và prompt lại tốt hơn với hiểu biết mới.
Kết
Hooks đảm bảo hành vi tự động không bao giờ bị bỏ qua. Quy trình Design→Plan→Build ngăn AI code lung tung không có bản đồ. Kết hợp 2 thứ này, bạn đang chạy một quy trình engineering nghiêm túc - không phải "chat với AI rồi hy vọng".
Bài cuối trong series sẽ đi vào Subagents - cách dùng context window thông minh và chạy nhiều việc song song.
