# Năm thứ cần hiểu khi dùng AI coding agent

[Ysology](https://homus.dev/speakers/ysology) · [Ysology](https://homus.dev/orgs/ysology)

> CLAUDE.md, skills, hooks, memory và prompt trên một app: mỗi thứ giải vấn đề gì, agent thấy lúc nào, ai bảo đảm nó xảy ra.

Topics: Coding Agents, Context Engineering, Skills

Canonical: https://homus.dev/talks/stop-using-ai-coding-agents-without-understanding-these-5-things

## 1. Vì sao một prompt tốt hơn là chưa đủ

Video (đăng ngày 21/10/2026) mở đầu bằng một nhận xét: phần lớn developer nghĩ dùng coding agent là chuyện đơn giản. Bạn gõ một prompt, AI viết code. Nhưng chuyện gì xảy ra khi bạn muốn nhiều hơn thế? Bạn muốn agent hiểu cả project của mình, nhớ bạn thích làm việc theo kiểu nào, đi theo cùng một workflow mỗi lần, và tự kiểm tra thay đổi của chính nó trước khi bạn kịp nhìn thấy.

Theo Ysology (video đăng ngày 21/10/2026), một prompt tốt hơn không đưa bạn tới đó được, vì một prompt chỉ sống trong đúng một task. Đó là chỗ năm thành phần xuất hiện: CLAUDE.md, skills, hooks, memory files và prompts. Thoạt nhìn, cả năm trông như cùng một loại thứ bạn đưa cho AI để nó cư xử tốt hơn. Nhưng mỗi cái giải một vấn đề khác nhau.

Và khác biệt giữa chúng, theo video (đăng ngày 21/10/2026), quy về hai câu hỏi: **agent nhìn thấy thứ này vào lúc nào?** Và **ai bảo đảm rằng nó thật sự xảy ra?** Video đi qua từng thành phần một, với đúng một ví dụ xuyên suốt: một AI coding agent làm việc trên một ứng dụng thật (một app ví dụ dựng cho video).

Năm thành phần mà video (đăng ngày 21/10/2026) đưa ra, cùng hai câu hỏi được dùng để phân biệt chúng xuyên suốt video.

## 2. Khi agent không biết project của bạn

Hãy hình dung bạn bảo agent thêm authentication vào app: "Add login to the application." Agent bắt tay vào làm. Trong ví dụ của video (đăng ngày 21/10/2026), nó chọn một framework khác với framework bạn đang dùng, kéo vào một dependency mới mà bạn không hề yêu cầu, và viết database query thẳng trong controller, trong khi team bạn có quy định mọi truy cập database phải đi qua các service class.

Theo Ysology (video đăng ngày 21/10/2026), không có điều nào trong số đó là do model viết code kém. Nó chỉ không biết. Không ai nói cho nó biết project của bạn vận hành ra sao.

![File auth.controller.ts với ba dòng bị gạch đỏ: import express, import passport và một db.query trong route login](https://homus.dev/photos/Y0lAVKCnldU-0103.jpg)

File `auth.controller.ts` trong ví dụ của video (đăng ngày 21/10/2026): `import express` được đánh dấu "wrong framework", `import passport` là "new dependency", còn câu `SELECT * FROM users` nằm ngay trong route `/login` là "query in the controller".

## 3. CLAUDE.md, tài liệu onboarding cho agent

Đó là vấn đề CLAUDE.md giải quyết. Theo video (đăng ngày 21/10/2026), trong Claude Code, đây là một file markdown nằm trong project, được agent đọc ở đầu mỗi phiên làm việc. Hãy coi nó như tài liệu onboarding bạn đưa cho một developer mới vào ngày đầu tiên: đây là stack, đây là cách các thư mục được sắp xếp, đây là cách bọn mình đặt tên, đây là lệnh chạy test.

Vậy bạn có thể viết những dòng như sau:

```
Our backend uses NestJS, Prisma, and PostgreSQL.
All database access goes through the existing service classes.
```

![Khung CLAUDE.md đang hiện dòng Our backend uses NestJS, Prisma, and PostgreSQL](https://homus.dev/photos/Y0lAVKCnldU-0143.jpg)

Khung CLAUDE.md trong video (đăng ngày 21/10/2026) đang được gõ dần: dòng đầu nói backend dùng NestJS, Prisma và PostgreSQL, dòng sau nói mọi truy cập database đi qua các service class có sẵn.

Từ giờ, theo Ysology (video đăng ngày 21/10/2026), mọi task đều bắt đầu với context đó đã được nạp sẵn. Bạn không phải lặp lại nó trong từng prompt.

## 4. Context, không phải một bảo đảm

Nhưng đây là điểm phân biệt quan trọng. Theo Ysology (video đăng ngày 21/10/2026), CLAUDE.md là context. Model đọc nó, cân nhắc nó, và thường thì làm theo. Chỉ là "thường thì". Nó hướng dẫn agent, nó không bảo đảm điều gì. Video dặn người xem giữ ý này lại, vì nó sẽ quay lại ở phần sau.

Thêm một lưu ý trong video: CLAUDE.md là tên file của Claude Code. Theo video (đăng ngày 21/10/2026), các agent khác dùng file chỉ dẫn và quy ước riêng của chúng. Ý tưởng thì vẫn vậy: những quy tắc thường trực, được nạp vào mỗi lần.

Docs của Claude Code nói cùng điều này (đọc ngày 29/10/2026): CLAUDE.md và auto memory đều được nạp ở đầu mỗi cuộc hội thoại, và Claude coi chúng là context chứ không phải cấu hình bắt buộc; muốn chặn một hành động bất kể Claude quyết định gì thì dùng một hook `PreToolUse`.

Theo video (đăng ngày 21/10/2026), CLAUDE.md thuộc về phía "guides": nó là context cho model, không phải một điều chắc chắn sẽ xảy ra.

## 5. Skills, playbook dùng lại cho một loại việc

Giờ hãy tạm quên project đi và nghĩ tới một việc bạn làm đi làm lại. Giả sử bạn hay nhờ agent review pull request, và lần nào bạn cũng giải thích lại cùng một quy trình: đọc diff, tìm vấn đề bảo mật, tìm bug, kiểm tra edge case, và đề xuất cải tiến mà không viết lại mọi thứ.

Bạn có thể nhét tất cả vào CLAUDE.md. Nhưng theo Ysology (video đăng ngày 21/10/2026), khi đó nó nằm trong context của agent ở mọi task, kể cả 90% số task chẳng liên quan gì tới review code. Vì vậy, bạn đóng gói nó thành một skill.

![Năm cột context cho các task review PR, fix bug, add endpoint, rename, migrate; chỉ cột review PR dùng tới phần review steps](https://homus.dev/photos/Y0lAVKCnldU-0243.jpg)

Hình minh hoạ trong video (đăng ngày 21/10/2026): nếu các bước review nằm trong CLAUDE.md, chúng chiếm chỗ trong context của cả năm loại task (review PR, fix bug, add endpoint, rename, migrate), nhưng chỉ task review PR dùng tới; bốn cột còn lại ghi "unused".

Theo video (đăng ngày 21/10/2026), một skill mô tả cách làm một loại task cụ thể. Tuỳ agent, skill có thể chứa instructions, script, tài liệu tham khảo và template.

## 6. Một skill code review và cách skill được nạp

Ví dụ, bạn có thể viết một skill code review với nội dung: ưu tiên tính đúng trước, rồi tới bảo mật, rồi hiệu năng, rồi những test còn thiếu. Theo video (đăng ngày 21/10/2026), lần tới khi cần review, agent sẽ tìm tới skill đó.

Theo Ysology (video đăng ngày 21/10/2026), trong Claude Code, bạn có thể gọi skill theo tên như một slash command, hoặc agent tự lấy nó ra khi task trông có liên quan. Cho tới lúc đó, agent chỉ mang theo một mô tả ngắn của mỗi skill, và chỉ nạp toàn bộ playbook khi thật sự cần.

![Hai cách nạp skill: gõ /code-review trong terminal, hoặc một câu can you look over PR #44 được agent khớp với mô tả skill code-review](https://homus.dev/photos/Y0lAVKCnldU-0323.jpg)

Hai đường nạp skill trong video (đăng ngày 21/10/2026): gọi theo tên bằng `/code-review`, hoặc một câu hỏi thường như "can you look over PR #44?" được khớp với mô tả "code-review: reviews PRs". Trong context, các skill khác (deploy, testing) chỉ chiếm một dòng mô tả, nằm trên CLAUDE.md.

Docs về skills của Claude Code (đọc ngày 29/10/2026) cũng ghi: Claude dùng skill khi liên quan, hoặc bạn gọi trực tiếp bằng `/skill-name`; khác với nội dung CLAUDE.md, phần thân của skill chỉ được nạp khi được dùng.

Vậy khác biệt nằm ở đây, theo video (đăng ngày 21/10/2026): CLAUDE.md là những quy tắc thường trực của project, còn một skill là một cách làm lặp lại được cho một task. Một cái cho agent biết team bạn làm việc thế nào, cái kia đưa cho nó một playbook.

## 7. Vì sao chỉ dặn dò là chưa đủ: hooks và lifecycle events

Giờ nhớ lại câu lúc trước trong video (đăng ngày 21/10/2026): CLAUDE.md hướng dẫn, không bảo đảm, và skill cũng vậy. Thế còn những việc bắt buộc phải xảy ra mọi lần thì sao? Mỗi lần agent sửa một file, bạn muốn formatter chạy. Mỗi lần nó sắp chạy một lệnh shell, bạn muốn có thứ gì đó kiểm tra trước.

Bạn có thể viết vào CLAUDE.md: "Always run the formatter after editing a file. Never run destructive commands." Nhưng theo Ysology (video đăng ngày 21/10/2026), đó là một lời đề nghị, và trong một task dài, tới bước thứ 40, một lời đề nghị sẽ bị bỏ sót.

Đó là việc của hooks. Theo video (đăng ngày 21/10/2026), một hook là một đoạn cấu hình tự kích hoạt khi một sự kiện cụ thể xảy ra trong vòng đời (lifecycle) của agent. Trong Claude Code, các sự kiện đó gồm: ngay trước khi một tool chạy, ngay sau khi một tool chạy, khi bạn gửi prompt, khi một phiên bắt đầu, hoặc khi agent làm xong.

![Trục thời gian các lifecycle event: SessionStart, UserPromptSubmit, PreToolUse, PostToolUse, Stop](https://homus.dev/photos/Y0lAVKCnldU-0423.jpg)

Trục lifecycle trong video (đăng ngày 21/10/2026): session starts (`SessionStart`), prompt submitted (`UserPromptSubmit`), before a tool (`PreToolUse`), after a tool (`PostToolUse`) và agent finishes (`Stop`). Biểu tượng tia sét đang trỏ vào `PostToolUse`.

Vậy bạn cấu hình một hook cho sự kiện lưu file. Agent lưu một file, và formatter của bạn chạy. Theo Ysology (video đăng ngày 21/10/2026), agent không quyết định chạy nó, cũng không phải nhớ. Nó chạy vì sự kiện đã xảy ra, không phải vì AI nhớ ra.

## 8. Chặn lệnh nguy hiểm, và giới hạn của hook

Theo video (đăng ngày 21/10/2026), một hook chạy trước khi dùng tool còn làm được nhiều hơn là quan sát. Nó có thể xem xét lệnh mà agent sắp chạy và chặn lệnh đó. Trong ví dụ của video, một lệnh xoá nhắm vào project bị từ chối.

Nhưng video dặn cẩn thận với một giả định: không phải hook nào cũng là một quy tắc cứng. Theo Ysology (video đăng ngày 21/10/2026), một command hook chạy script của bạn, và script đó có thể hoàn toàn tất định (deterministic). Nhưng một số loại hook giao quyết định cho một model, và khi đó nó lại là một phán đoán, không phải một quy tắc.

![So sánh command hook với script check.sh chặn rm -rf và model-based hook](https://homus.dev/photos/Y0lAVKCnldU-0503.jpg)

Tiêu đề "not every hook is a fixed rule" trong video (đăng ngày 21/10/2026): bên trái là command hook với script `check.sh` thoát với mã 2 khi lệnh bắt đầu bằng `rm -rf`, ba lần đều "deny", ghi chú "same input, same answer"; bên phải là model-based hook.

Đoạn script trên màn hình:

```
if [[ $cmd == "rm -rf"* ]]
then exit 2
```

Docs hooks của Claude Code (đọc ngày 29/10/2026) có một mục riêng cho exit code 2 và hai loại hook dựa trên model là prompt-based hooks và agent-based hooks.

Và theo Ysology (video đăng ngày 21/10/2026), một hook chỉ đáng tin bằng đúng thứ bạn viết. Một block list bỏ sót một cách viết của một lệnh nguy hiểm sẽ để lệnh đó lọt qua. Vậy cách chia là thế này: dùng instructions để hướng dẫn hành vi, dùng hooks khi bạn cần nó được thực thi bắt buộc.

## 9. Memory giữa các phiên làm việc

Đây là một vấn đề khác. Trước đó trong ngày, bạn đã giải thích cho agent rằng project của bạn gọi API theo một cách riêng. Nó làm đúng. Ngày mai bạn mở một phiên mới, và bạn lại giải thích lần nữa. Theo video (đăng ngày 21/10/2026), lý do là phiên làm việc kết thúc, và những gì agent tìm ra trong phiên đó không còn nữa. Persistent memory là nỗ lực để sửa chuyện này.

Một cách phổ biến là một file thường được đặt tên `memory.md`. Theo Ysology (video đăng ngày 21/10/2026), cái tên đó là quy ước chứ không phải chuẩn. Ví dụ Claude Code giữ một thư mục memory cho mỗi project, với một file index được đọc ở đầu phiên. Các agent khác làm theo cách riêng của chúng.

Docs memory của Claude Code (đọc ngày 29/10/2026) mô tả thư mục `~/.claude/projects/<project>/memory/` có một file index `MEMORY.md`, mỗi dòng một memory, được nạp vào mọi phiên (200 dòng đầu hoặc 25KB), cùng các file chủ đề cho từng memory.

Thứ nằm trong đó, theo video (đăng ngày 21/10/2026), là những gì agent học được trong lúc làm việc: một lỗi nó cứ lặp đi lặp lại, một sở thích bạn đã sửa cho nó, một điều nó phát hiện về kiến trúc, một quyết định mà nếu không ghi lại thì sẽ biến mất khi phiên đóng.

![Khung MEMORY.md với ba dòng ứng với a mistake, a preference, the architecture](https://homus.dev/photos/Y0lAVKCnldU-0603.jpg)

Khung `MEMORY.md` trong video (đăng ngày 21/10/2026), mỗi dòng ứng với một loại: a mistake ("kept forgetting to run migrations"), a preference ("prefers small, focused PRs") và the architecture ("orders is called by the mobile app").

Vậy agent có thể ghi lại: project này dùng `fetch`, không dùng `axios`; order service phải giữ tương thích ngược. Và theo Ysology (video đăng ngày 21/10/2026), phiên sau bắt đầu từ đó, thay vì tự khám phá lại.

## 10. Memory khác CLAUDE.md ở đâu, và memory đã cũ

Khoan đã, đó chẳng phải lại là CLAUDE.md sao? Video (đăng ngày 21/10/2026) đặt hai thứ cạnh nhau trong một ví dụ. CLAUDE.md của bạn ghi: "Follow the existing API conventions." Memory của bạn ghi: lần thay đổi gần nhất ở endpoint này đã làm hỏng vì một phiên bản cũ của app mobile vẫn còn gọi nó.

Theo Ysology (video đăng ngày 21/10/2026), cái thứ nhất là một quy tắc có người cố ý viết ra. Cái thứ hai là một bài học đến từ trải nghiệm. Một cái nói cho agent cách cư xử, cái kia nhớ lại chuyện đã xảy ra.

![CLAUDE.md và MEMORY.md đặt cạnh nhau: a rule, how to behave và a lesson, what happened](https://homus.dev/photos/Y0lAVKCnldU-0643.jpg)

So sánh trong video (đăng ngày 21/10/2026): bên trái CLAUDE.md, "a rule", "how to behave"; bên phải MEMORY.md với câu về endpoint hỏng vì app mobile cũ vẫn gọi nó, "a lesson", "what happened".

Và theo video (đăng ngày 21/10/2026), memory có một điểm vướng mà các thành phần khác không có: file đó chỉ giúp được khi agent lưu đúng thứ, tìm lại được chúng và thật sự dùng tới. Memory cũng không tự động tốt hơn. Một ghi chú đúng cách đây ba tháng giờ thành một chỉ dẫn đầy tự tin để làm sai. Theo Ysology (video đăng ngày 21/10/2026), mọi memory đều phải được tỉa bớt như code cũ.

![MEMORY.md với dòng use the v1 orders API bị gạch, ghi chú 3 months ago, v1 was removed, prune it](https://homus.dev/photos/Y0lAVKCnldU-0703.jpg)

Ví dụ memory đã cũ trong video (đăng ngày 21/10/2026): dòng "use the v1 orders API" được ghi từ "3 months ago", nhưng "v1 was removed", nên nó bị gạch đi với nhãn "prune it"; các dòng khác (fetch thay Axios, tests trong `__tests__/`, staging DB read-only) vẫn giữ.

## 11. Prompt: mơ hồ và cụ thể

Điều đó đưa video tới thành phần ai cũng đang dùng: prompt. Mọi thứ nãy giờ đều có mặt trước khi bạn gõ một chữ: các quy tắc, các playbook, phần tự động hoá, các ghi chú. Theo Ysology (video đăng ngày 21/10/2026), prompt là thứ duy nhất nói bạn muốn gì ngay lúc này.

Hãy so sánh hai prompt. Prompt thứ nhất: "Add authentication." Theo video (đăng ngày 21/10/2026), nó để ngỏ gần như mọi quyết định. Provider nào? Chuyện gì xảy ra khi đăng nhập thất bại? Có test hay không? Agent có được đụng vào database schema không?

Còn đây là prompt thứ hai:

```
Add Google sign-in to the existing app.
Reuse the current authentication service,
handle failed logins, add tests,
and explain any database changes.
```

![Khung prompt Add Google sign-in to the existing app, câu đầu gắn nhãn outcome, câu hai gắn nhãn constraints](https://homus.dev/photos/Y0lAVKCnldU-0743.jpg)

Prompt cụ thể trong video (đăng ngày 21/10/2026): câu "Add Google sign-in to the existing app." được gắn nhãn outcome, phần "Reuse the current authentication service" gắn nhãn constraints.

Theo video (đăng ngày 21/10/2026), prompt này nói rõ bạn muốn kết quả gì, ràng buộc nào quan trọng, và thế nào là xong. Và để ý những gì nó không làm: nó không áp đặt từng dòng code, không nói nên mở file nào trước. Theo Ysology (video đăng ngày 21/10/2026), một prompt tốt cho agent phương hướng mà không lấy đi khả năng tự tìm hiểu codebase của nó.

## 12. Cả năm thành phần trên cùng một task

Giờ video đặt cả năm lên cùng một task. Bạn bảo agent thêm Google sign-in. Theo ví dụ của video (đăng ngày 21/10/2026), mọi thứ diễn ra như sau:

- **Prompt** nói cần build gì và thế nào là xong (ví dụ trong video đăng ngày 21/10/2026).

- **CLAUDE.md** đã có sẵn trong context: NestJS, Prisma, PostgreSQL, truy cập database đi qua các service class (ví dụ trong video đăng ngày 21/10/2026).

- **Một skill testing** được nạp vì prompt yêu cầu có test, nên agent viết test theo đúng cách team bạn viết (ví dụ trong video đăng ngày 21/10/2026).

- **Memory** đưa lên ghi chú về app mobile cũ, nên agent để yên endpoint login hiện có (ví dụ trong video đăng ngày 21/10/2026).

- **Hook**: mỗi lần agent lưu file, một hook chạy formatter; khi agent định reset database để test migration, một hook chặn lại (ví dụ trong video đăng ngày 21/10/2026).

![Sơ đồ agent ở giữa nối với CLAUDE.md, Prompt, Skills, Memory và Hooks](https://homus.dev/photos/Y0lAVKCnldU-0843.jpg)

Agent ở giữa, nối với CLAUDE.md, Prompt, Skills, Memory và Hooks, tất cả nằm trong một khung chung là môi trường làm việc dựng cho project.

Theo Ysology (video đăng ngày 21/10/2026), đây vẫn là cùng một model như ở đầu video, chính model đã chọn sai framework, nhưng giờ nó làm việc bên trong một môi trường được dựng cho project này.

Và theo video (đăng ngày 21/10/2026), không thứ nào trong số này bảo đảm code đúng. Bạn vẫn cần một kiến trúc vững, permission hợp lý, test thật sự kiểm tra một điều gì đó, và con người đọc những phần quan trọng.

## 13. Một quy tắc mới nên nằm ở đâu

Video quay lại hai câu hỏi từ đầu: agent thấy nó lúc nào, và ai làm cho nó xảy ra? Theo Ysology (video đăng ngày 21/10/2026):

- CLAUDE.md lúc nào cũng có mặt, và model chọn có làm theo hay không (theo video đăng ngày 21/10/2026).

- Một skill xuất hiện khi task cần tới nó (theo video đăng ngày 21/10/2026).

- Memory là những gì agent chọn ghi lại (theo video đăng ngày 21/10/2026).

- Prompt là bây giờ, ngay lúc bạn gõ (theo video đăng ngày 21/10/2026).

- Và hook là thành phần duy nhất mà agent không có tiếng nói (theo video đăng ngày 21/10/2026).

Bảng hai câu hỏi ở cuối video (đăng ngày 21/10/2026), với nhãn hàng "the model chooses to" và "the harness enforces it" lấy từ màn hình; vị trí từng thành phần theo lời video.

Vậy lần tới khi bạn muốn agent làm một việc gì đó, video (đăng ngày 21/10/2026) gợi ý hỏi theo chiều ngược lại:

- Việc này áp dụng cho mọi task, hay một loại task?

- Nó là một quy tắc, hay một bài học?

- Nó chỉ dành cho hôm nay?

- Và chuyện gì xảy ra nếu agent quên?

Nếu quên chỉ là một bất tiện, hãy viết nó ra. Nếu quên là một thảm hoạ, đừng nhờ, hãy cấu hình nó. Theo Ysology (video đăng ngày 21/10/2026), lợi thế thật sự không nằm ở việc bắt AI viết code, mà ở việc dựng một môi trường nơi nó làm việc ổn định, với context tốt hơn và ít lỗi lặp lại hơn. Video khép lại ở đó.

## Nguồn và liên kết

- Tên gốc: Stop Using AI Coding Agents Without Understanding These 5 Things
- Sự kiện: [YouTube](https://homus.dev/events/youtube)
- Video gốc: [https://www.youtube.com/watch?v=Y0lAVKCnldU](https://www.youtube.com/watch?v=Y0lAVKCnldU)

- Kênh YouTube Ysology (Ysology): [youtube.com/channel/UCpuxg2VmKqGjfCVFXRIgg_w](https://www.youtube.com/channel/UCpuxg2VmKqGjfCVFXRIgg_w)

- Docs Claude Code về CLAUDE.md và auto memory (bảng so sánh hai loại, thư mục memory với index `MEMORY.md`; đọc ngày 29/10/2026): [code.claude.com/docs/en/memory](https://code.claude.com/docs/en/memory)

- Docs Claude Code về skills (gọi bằng `/skill-name`, phần thân skill chỉ nạp khi dùng; đọc ngày 29/10/2026): [code.claude.com/docs/en/skills](https://code.claude.com/docs/en/skills)

- Docs Claude Code về hooks (các lifecycle event, exit code 2, prompt-based và agent-based hooks; đọc ngày 29/10/2026): [code.claude.com/docs/en/hooks](https://code.claude.com/docs/en/hooks)

Nguồn: https://homus.dev/talks/stop-using-ai-coding-agents-without-understanding-these-5-things · cập nhật 2026-10-29
