Chapter 10
Từ Intent Đến Delivery — ADD trong thực chiến
"ADD không làm bạn code chậm hơn. Nó làm bạn rework ít hơn."
Chương 9 đã giải phẫu Agent từ bên trong. Chương này đặt Agent vào guồng làm việc thực tế: ADD (Agent-Driven Development) — một phương pháp luận đặt Agent làm người thực thi chính trong vòng lặp phát triển, với con người đóng vai trò Director (định hướng và phê duyệt), không phải Executor (gõ code).
ADD pipeline phản ánh triết lý cốt lõi: con người định nghĩa context và intent một lần, agent thực thi nhiều lần với human approval tại các điểm rủi ro cao.
"Thiết lập tốt ở Pha 1 = ít can thiệp ở Pha 3" — đây là ROI của upfront investment.
Đây là pha quan trọng nhất nhưng thường bị xem nhẹ nhất. Nhiều developer skip pha này và đi thẳng vào prompt. Kết quả: agent code "đúng logic" nhưng dùng sai framework, vi phạm conventions, tạo files sai cấu trúc, hay đặt tên sai style. Mọi thứ phải sửa lại.
CLAUDE.md cung cấp "DNA" của dự án: lịch sử, kiến trúc, các quyết định quan trọng, và những "lesson learned" mà team đã học được qua đau thương. Giúp agent hiểu TẠI SAO dự án được structure như vậy — không chỉ biết nó trông như thế nào.
"Thiết lập tốt ở Pha 1 = ít can thiệp ở Pha 3." Mỗi phút setup context tiết kiệm 10 phút debug sau.
Pha này là nơi nhiều developer "overthink" hoặc "underthink". Overthinking: viết prompt chi tiết cách implement — rốt cuộc bạn đang viết pseudo-code thay vì spec. Underthinking: "làm tính năng login đi" — agent không có đủ context để làm đúng.
Mô tả WHAT bạn muốn đạt được và WHY, để agent tự quyết định HOW trong khuôn khổ constraints đã có. Điều này không mâu thuẫn với SDD — nếu có SPEC.md, intent chỉ là "implement spec này".
"Tao struct OrderValidator với method Validate(order Order) error" → bạn đang implement, không phải agent → mất đi autonomous reasoning của agent.
"Implement User registration. Done khi: (1) password hashed, (2) tests pass, (3) no linting errors" — rõ ràng, có thể verify, agent tự chọn HOW.
Trong Pha 3, agent chạy Plan → Execute → Test loop tự động. Vai trò của bạn là gatekeeper tại hai điểm: (1) approve execution plan trước khi agent bắt đầu code, và (2) review file changes trước khi commit. Không can thiệp vào giữa quá trình trừ khi thấy red flags.
Interrupt = update document, không phải chat correction. Chat correction không persist. Document correction persist.
Điểm khác biệt quan trọng nhất của ADD so với "just using AI": review xảy ra HAI lần. Lần đầu: review execution plan TRƯỚC khi agent viết dòng code đầu tiên. Lần hai: review code output.
Prompt cho chatbot và prompt cho agent là hai kỹ năng khác nhau. Chatbot prompt tối ưu cho conversation — ngắn gọn, tự nhiên. Agent prompt tối ưu cho execution — đủ context, rõ ràng về scope, có Definition of Done, và không để lại ambiguity quan trọng.
Nguyên tắc này tưởng đơn giản nhưng khó thực hành vì instinct của developer thường là "nói với AI cách làm". Trong agentic context, nó cướp đi quyền tự chủ của agent và gắn implementation vào approach cụ thể.
| Prompt Type | Ví dụ | Vấn đề | Version tốt hơn |
|---|---|---|---|
| HOW-focused (xấu) | "Tao struct OrderValidator với method Validate(order Order) error" | Bạn đang implement, không phải agent | "Implement order validation theo SPEC §3 Functional requirements" |
| WHAT-focused (tốt) | "Add input validation cho Order creation endpoint" | Tốt nhưng thiếu constraints | "Add input validation cho Order creation endpoint. Xem SPEC.md §3, Constitution §SEC-03" |
| HOW-focused (xấu) | "Dùng bcrypt với cost 14 để hash password" | Over-specify implementation | "Implement secure password storage cho User registration" |
| WHAT + DoD (tốt nhất) | "Implement User registration. Done khi: (1) password hashed, (2) tests pass, (3) no linting errors" | ✅ WHAT + DoD rõ ràng | ← Đây là pattern nên dùng |
DoD là khái niệm quen thuộc trong Agile nhưng ít được áp dụng vào AI prompts. Với agent, DoD đặc biệt quan trọng vì agent không có intuition về "xong là như thế nào" — nếu không được nói rõ, nó có thể dừng khi code compiled, hay khi tests pass một phần.
| Chiều | Bad Prompt | Good Prompt |
|---|---|---|
| Scope clarity | "Cải thiện order service" | "Add pagination cho GET /orders endpoint theo SPEC §3.2" |
| HOW vs WHAT | "Dùng cursor-based pagination với id field" | "Implement pagination. Chọn approach phù hợp với current DB schema" |
| Missing DoD | "Thêm authentication" | "Thêm JWT auth. Done khi: tests pass, constitution compliance, OpenAPI updated" |
| Missing context | "Fix the bug" | "Fix: GET /orders trả 500 khi user_id là NULL. Xem issue #234, log line 45" |
| Ambiguous constraints | "Làm nhanh lên" | "Optimize response time cho GET /orders từ 800ms → < 200ms p95" |
"Một agent prompt tốt là bản spec thu nhỏ: đủ context để bắt đầu, đủ DoD để biết khi nào dừng, và đủ constraints để không làm sai."
Agent hoạt động tốt nhất khi task có scope rõ ràng và context window sạch. Task-Based Execution Model đảm bảo cả hai: mỗi task chạy trong session riêng với context fresh, được tracked trong plan.md.
"Đây không chỉ là organizational preference — đây là engineering necessity."
Context Pollution xảy ra khi conversation history chứa quá nhiều "noise" — failed attempts, outdated plans, contradicted instructions, abandoned approaches. Agent không phân biệt được "cũ" và "mới" trong context — nó xử lý tất cả như thông tin hiện tại.
Plan-Act-Check là pattern cho phép agent tự theo dõi tiến độ và maintain coherence trong một task. Thay vì agent "làm đến đâu nhớ đến đó", nó liên tục update plan.md sau mỗi bước — tạo ra một external memory vững ngoài context window.
Nguyên tắc đơn giản: mỗi TASKS.md atomic task = một session mới. Thêm 30 giây để start session mới rẻ hơn nhiều so với debug context-polluted output.
| Scenario | Approach | Lý do |
|---|---|---|
| Task mới hoàn toàn | Fresh session với full context | Clean slate, không contamination |
| Tiếp tục task dở | Fresh session + paste plan.md current state | Reinject state mà không có noise |
| Debug lỗi nhỏ trong task | Cùng session OK | Issue nhỏ, không accumulate much noise |
| Đã loop > 3 lần | Fresh session + revised approach | Context pollution rõ ràng, cần restart |
| Session > 1 giờ hoặc > 50K tokens | Summarize + fresh session | Prevent cliff effect |
Constraint documents là "hàng rào" của agent. Thiếu constraint = agent "tự chế" mọi thứ: chọn thư viện không được approve, đặt tên theo convention nó học từ training data, tạo cấu trúc file không khớp với project, hay implement security theo cách nó thấy phổ biến chứ không phải cách bạn cần.
"Điều thú vị: thiếu constraint không chỉ tạo ra code xấu mà còn tạo ra code nguy hiểm. Agent không cố ý xấu khi dùng thư viện có vulnerability — nó chỉ không biết thư viện đó không được approved."
Constraints được tổ chức theo ba tầng: Global (toàn project), Business (nghiệp vụ), và Safety (an toàn). Mỗi tầng có mức độ enforcement khác nhau và được document trong file riêng.
Đây là bài lab đối chứng được thiết kế để cho bạn thấy sự khác biệt giữa "dùng AI theo bản năng" và "dùng AI theo ADD workflow" qua một feature thực tế: User Authentication. Cùng một feature, cùng một AI tool — kết quả khác nhau rõ rệt.
Trong Round 1, bạn sẽ cố tình làm sai: đưa một intent mơ hồ cho agent và để nó tự quyết định mọi thứ. Không có AGENTS.md, không có CLAUDE.md, không có constraints, không có spec. Chỉ có một câu prompt.
| Quan sát | Agent chọn (Round 1) | Ghi chú của bạn |
|---|---|---|
| HTTP framework | (quan sát và ghi lại) | Thường: gorilla/mux hoặc gin |
| Password hashing library | (quan sát và ghi lại) | Thường: bcrypt (không phải argon2id) |
| JWT library | (quan sát và ghi lại) | Có thể: dgrijalva/jwt-go (deprecated!) |
| File/folder structure | (quan sát và ghi lại) | Thường không match Clean Architecture |
| Error handling style | (quan sát và ghi lại) | Có thể không dùng fmt.Errorf wrap |
| Testing included? | Yes / No | Thường: có nhưng basic |
| OpenAPI docs? | Yes / No | Thường: không có |
| Rate limiting? | Yes / No | Thường: không có |
| Validation library | (quan sát và ghi lại) | Thường: ad-hoc, không consistent |
| Database ORM/driver | (quan sát và ghi lại) | Thường: gorm (banned trong project) |
Trong Round 2, bạn áp dụng đầy đủ ADD workflow: Context Setup, defined Intent với DoD, Plan Review, và structured execution. Cùng một feature — authentication — nhưng với proper setup.
| Tiêu chí | Round 1 (No ADD) | Round 2 (With ADD) | Winner |
|---|---|---|---|
| Library choices | Agent chọn tự do | Theo approved stack | R2 (predictable) |
| Password algorithm | Thường bcrypt | argon2id (per spec) | R2 (spec compliance) |
| JWT library | Có thể deprecated | golang-jwt (approved) | R2 (security) |
| File structure | Ad-hoc | Clean Architecture | R2 (maintainable) |
| Tests present | Maybe | Yes (per DoD) | R2 (verifiable) |
| go vet pass | Maybe | Yes (per DoD) | R2 (quality) |
| Rate limiting | Likely missing | Per business.md | R2 (complete) |
| User enumeration | Likely vulnerable | Protected (per spec) | R2 (secure) |
| Time to first line of code | Faster | Slower (15 min setup) | R1 (speed) |
| Rework needed | High | Low | R2 (efficiency) |
Trong Round 1, agent chọn những gì bạn đã dự đoán không? Nếu không, tại sao? Điều đó nói lên gì về khoảng cách giữa "obvious choice" của agent và "obvious choice" của team bạn?
Nếu bạn phải deploy Round 1 code lên production: có bao nhiêu thứ cần sửa trước? List ra. Đây là "hidden rework cost" của prompt-only approach.
Với Round 2: phần nào trong setup mất nhiều thời gian nhất? AGENTS.md, SPEC.md, hay constraints? Có phần nào bạn nghĩ có thể skip mà không ảnh hưởng nhiều đến output?
Cho dự án cụ thể của bạn hiện tại: ADD would pay off từ feature/sprint size nào? Tính ROI cụ thể theo công thức: setup_time + review_time vs expected_rework_time_without_ADD.
Hai kỹ thuật trong section này giải quyết hai vấn đề thực tế quan trọng: (1) tốn tiền API vì agent hiểu sai intent và chạy nhiều vòng thừa, và (2) context window bị chiếm bởi files không liên quan làm giảm chất lượng reasoning. Đơn giản nhưng có impact lớn.
Shadowing là kỹ thuật yêu cầu agent "nói to lên kế hoạch" trước khi bắt đầu làm. Tên "shadowing" đến từ shadow boxing — "đánh vào không khí" trước, cho bạn thấy nó sẽ làm gì trước khi nó thực sự hit production code.
Shadowing và Clarification-First (7.2) nghe tương tự nhưng phục vụ mục đích khác nhau:
| Clarification-First (7.2) | Shadowing (10.6) | |
|---|---|---|
| Khi dùng | Khi spec còn ambiguous | Khi spec đã clear, task đã defined |
| Mục đích | Tìm điểm mờ trong spec | Verify agent hiểu đúng task |
| Output | Questions + assumptions | Execution plan + file list |
| Timing | Trước khi viết/lock spec | Trước mỗi execution session |
| Cost saving | Saves spec rewrite cost | Saves execution token cost |
"Shadowing là 'insurance policy' trước mỗi execution — chi phí thấp (vài tokens), return cao (tránh wrong execution hoàn toàn)."
Context window là tài nguyên hữu hạn và tốn tiền. Khi context đầy bởi những thứ không relevant (node_modules, git history, build artifacts), agent có ít "space" hơn để xử lý những gì thực sự quan trọng.
Chương này đã xây dựng Agent-Driven Development như một workflow hoàn chỉnh: từ Context Setup (định nghĩa Agent là ai) qua Intent Communication (WHAT không HOW) đến Agentic Execution (Plan-Act-Check loop) và Human Review (duyệt plan trước code). Cùng với đó là ba công cụ thực hành: Task-Based Execution, Constraint Documents, và kỹ thuật Shadowing để tiết kiệm token.
| Section | Key Technique | Điểm cốt lõi |
|---|---|---|
| 10.1 — ADD Pipeline | 4-phase workflow | Pha 1 (Context) quan trọng nhất; Pha 4 review Plan trước Code |
| 10.2 — Prompt Engineering | WHAT + DoD template | Mô tả outcome, không describe implementation |
| 10.3 — Task Execution | Plan-Act-Check + Fresh Session | Context pollution là kỹ thuật vấn đề, không phải subjective |
| 10.4 — Constraints | 3-layer hierarchy | Thiếu constraint = agent chọn "training data default" |
| 10.5 — Lab | Round 1 vs Round 2 | Trải nghiệm trực tiếp mạnh hơn mọi lời giải thích |
| 10.6 — Advanced | Shadowing + Token mgmt | Shadow plan tiết kiệm execution cost khi intent mơ hồ |
Mỗi phút thiết lập AGENTS.md và CLAUDE.md tiết kiệm 10 phút debug sau. "Thiết lập tốt ở Pha 1 = ít can thiệp ở Pha 3."
Mô tả outcome và DoD, để agent tự chọn HOW trong khuôn khổ constraints. Chatbot prompt ≠ Agent prompt.
Context pollution là engineering problem, không phải subjective preference. Fresh context = fresh thinking = better output.
Agent không lazy. Thiếu constraint → agent dùng "training data best practice" — reasonable nhưng không phải của team bạn.
Round 1 nhanh hơn bắt đầu nhưng rework cao. Round 2 setup 15 phút → code đúng ngay từ đầu. ROI dương từ feature > 5 requirements.
Chương 11 mở rộng ADD sang hệ thống nhiều agents phối hợp:
• Orchestrator patterns, agent specialization, conflict resolution.
• Khi nào cần nhiều agents? Khi nào một agent đủ?
• Safety trong multi-agent environment — amplification of errors.
PLAYBOOK SDD ADD & CODEX — © 2026
Chương 10 — Hoàn thành
LinhNDM
Nguyễn Đình Mạnh Linh
PLAYBOOK SDD ADD & CODEX | 2026