Mình đã cùng Claude Code làm việc ~6 tháng, đây là vài thứ thú vị mình thấy được.
Có một sáng, mình mở Claude lên gõ câu đầu của ngày. Claude trả lời, kèm theo gợi ý npm install. Mình gõ lại:
"Đừng dùng npm. Project này chỉ dùng pnpm. Mình đã nói tuần trước."
Claude xin lỗi rất lịch sự, rồi tiếp tục.
Mười lăm phút sau, mình chuyển sang một task khác. Vẫn cùng session đã mở lại từ hôm trước. Vậy mà Claude bắt đầu phản hồi bằng tiếng Anh, đề xuất unit test nhưng không tuân theo quy ước của dự án (cách đặt tên hàm, tên biến), hỏi lại mình đang làm phần frontend hay backend. Mình lại ngồi gõ lại từ đầu: mình là ai, convention team thế nào, ngôn ngữ giao tiếp ưa thích là gì.
Đó không phải lần đầu. Đó là lần thứ n trong tháng. Mỗi sáng mình phải dạy lại Claude y nguyên một thứ: mình là dev VN trong team đa quốc gia, chat tiếng Việt nhưng spec viết tiếng Anh, convention frontend dựa theo tài liệu nào, backend dựa theo tài liệu nào.
Mình nhận ra: AI không nhớ. Mỗi lần nói chuyện là một lần làm quen lại từ đầu. Resume session cũng không cứu được, vẫn có những mảnh context bị rớt giữa chừng.
Đó là lúc mình bắt đầu xây cho Claude một thứ gọi là trí nhớ. Bắt đầu từ thứ đơn giản nhất: dạy nó nhớ từng task.
"Tiếp tục task XXXXX đi" — câu thần chú mình dạy cho Claude
Quay lại câu chuyện mỗi sáng. Mỗi khi nhận một task mới, quy trình của mình là:
1. Copy mô tả yêu cầu
2. Copy comments trao đổi
3. Paste hết vào Claude
4. Giải thích: đây là task gì, ai request, liên quan tới phần code nào
5. Mới bắt đầu phân tích đượcBước 1–4 mất 10–15 phút. Mỗi sprint nhiều task. Trải qua nhiều sprint, cộng dồn lại đáng kể chi phí. Mệt nhất là bước 4: mỗi lần phân tích lại, mình phải kể lại y chang câu chuyện cũ.
Thế là mình viết một thứ tên là analyze-task, giúp Claude nhớ từng task. Nó là một skill mô tả cho Claude biết khi nào nó nên làm gì và bằng cách nào. Claude tự đọc skill đó mỗi khi mình gõ đúng "câu thần chú" trigger.
Skill analyze-task không có gì cao siêu:
- Một file
SKILL.mdmô tả khi nào Claude nên dùng skill này: trigger phrase:"phân tích task XXXXX","tiếp tục với task XXXXX". - Vài shell script chạy ngoài terminal:
fetch-record.sh,fetch-comments.sh: kéo data của task về thư mụctask/XXXXX/request/. - Một quy ước thư mục:
task/XXXXX/request/chứa raw data,task/XXXXX/analysis/chứa kết quả Claude phân tích ra.
Sau khi có skill, workflow của mình gọn lại còn:
# bước 1 — terminal
./scripts/fetch-record.sh 12345
./scripts/fetch-comments.sh 12345
# bước 2 — Claude
"phân tích task 12345"Phần thưởng thực sự đến hai tuần sau, khi mình quay lại task đó. Mình gõ:
"Tiếp tục task 12345 đi."
Claude tự đọc task/12345/analysis/, tự nhớ context, tự biết đã làm tới đâu, không cần mình mô tả lại thông tin task một lần nữa. Claude đã có trí nhớ về task.
Đó là khoảnh khắc mình hiểu: bằng cách quyết định cái gì cần lưu lại và lưu ở đâu, mình đang dạy cách AI nhớ về task, về dự án của mình.
MEMORY.md — sổ tay cho Claude
Skill chỉ giải quyết được context cụ thể của một task. Còn những thứ "luôn đúng", phải nằm ở đâu đó Claude luôn đọc được.
Thật ra mình có hai tầng lưu quy tắc, cả hai đều là file markdown:
CLAUDE.mdtrong repo — commit chung với team. Chứa convention của dự án: dự án sử dụng ngôn ngữ nào, structure code ra sao, testing như thế nào. Cả team đều đọc khi pair với Claude.MEMORY.mdriêng của mình — không vào git, không share với team. Chứa thói quen cá nhân: mình là full stack dev, chat tiếng Việt, spec viết tiếng Anh, dùng pnpm chứ không phải npm, không tự commit (luôn hỏi trước), feedback tích luỹ theo thời gian.
Mỗi quy tắc lớn nằm trong file .md riêng. MEMORY.md chỉ là index trỏ tới. Một mục điển hình (ví dụ trong feedback_coding.md):
## Stay focused on the task
Khi fix bug, chỉ sửa đúng thứ cần sửa. Đừng rename
hay đổi table/column không liên quan dù tên giống nhau.
**Why:** Có lần rename một column ở table không liên quan,
làm vỡ một DAO khác vẫn dùng tên cũ.
**How to apply:** Trước khi đổi gì, verify nó có trực tiếp
liên quan tới task không. Nếu lấn sân, flag và hỏi user trước.Để ý hai dòng cuối: Why và How to apply. Lúc đầu mình không có hai dòng này, chỉ ghi quy tắc cộc lốc. Nhưng rồi Claude bắt đầu máy móc: nó áp dụng quy tắc kể cả khi không nên. Khi mình thêm "Why", Claude bắt đầu suy luận edge case. Nó tự hỏi "lý do của quy tắc này có còn đúng trong tình huống hiện tại không?"
Đó là lúc mình hiểu: đừng ghi memory như viết log. Hãy ghi như viết bài học cho người đến sau.
Một lần review, một dòng memory
Có một hôm, mình đẩy một PR nho nhỏ, tầm 200 dòng diff. Mình nhờ Claude review.
Claude review ngon. Nhưng có một điều kỳ lạ: nó comment cả những đoạn code không có trong diff. Có comment đúng (về kiến trúc), có comment sai (về thứ đã được sửa từ commit khác). Mình đọc xong, thay vì biết PR mình ổn hay không, lại càng rối hơn: cái nào là feedback cho PR, cái nào là feedback cho codebase nói chung?
Mình mất chừng 20 phút để bóc tách. Cuối cùng mình quay sang Claude:
"Khi mình bảo review PR, hãy chỉ review những file/dòng có trong diff. Đừng comment thứ không thay đổi. Nếu có concern về kiến trúc, để vào một section riêng và nói rõ là 'ngoài scope của PR này'."
Claude nói: "Hiểu rồi." Mình biết "hiểu rồi" sẽ bay sau session này. Nên mình báo Claude lưu vào trong feedback_coding.md:
## Review chỉ trong scope của diff
Khi review PR, chỉ comment trên những file/dòng
có trong diff. Concern ngoài scope → section riêng,
ghi rõ "ngoài scope".
**Why:** Comment trên code không thay đổi gây noise,
làm reviewer mất tin tưởng vào feedback. Có lần Claude
comment một bug đã được fix ở commit khác — mình mất
20 phút mới hiểu.
**How to apply:** Trước khi review, xác định rõ phạm vi
diff. Mọi comment phải gắn được với một line trong diff.Từ hôm đó, review của Claude sạch hẳn.
Mà điều mình thực sự học được không phải về review. Mình học được rằng: mỗi lần Claude làm sai, đừng chỉ sửa lại trong session. Hãy biến cái sai đó thành quy tắc cho tương lai. Đó là cách AI ngừng lặp lại lỗi sai.
Vài thứ mình thấm được
Sau ~6 tháng, MEMORY.md của mình có ~30 entry rải qua hơn 10 file. Thư mục skills/ có 7 skill. Mình không cần dạy lại Claude mỗi sáng nữa. Khi mình gõ "tiếp tục task XXX", nó hiểu. Khi mình nói "viết spec", nó biết tiếng Anh. Khi định commit, nó tự dừng lại hỏi.
Nếu phải đúc kết, đây là 4 thứ giúp Claude "có ký ức" thực sự:
- Skill cho context của từng task, memory cho quy tắc luôn đúng.
- Memory có 2 tầng:
CLAUDE.md(team, commit chung) vàMEMORY.md(personal, không commit).MEMORY.mdsắp xếp ngăn nắp, chứa index đến các topic file (feedback_coding.md,unit_testing.md...). - Mỗi quy tắc cần "Why" và "How to apply", tránh AI áp dụng máy móc
- Sai một lần → quy tắc lần sau. Đừng chỉ sửa trong session.
Nếu bạn đang dùng AI mỗi ngày mà vẫn cảm thấy phải lặp đi lặp lại — có lẽ không phải AI tệ. Có lẽ là vì bạn chưa cho nó trí nhớ. Đó không chỉ là cái hộp để nhớ — nó là ký ức, là nội dung thực sự đáng nhớ.
Bài viết dựa trên trải nghiệm thực tế của mình khi dùng Claude Code trên một codebase lớn. Một số chi tiết kỹ thuật đã được anonymize, nhưng workflow, snippet, và câu chuyện đều là thật.

