TL;DR - Claude Code reset context mỗi session. MEMORY.md cho nó bộ nhớ vĩnh viễn về trạng thái đang thay đổi của project trong file index 200 dòng. Setup mất 5 phút. Một prompt cuối mỗi session giữ nó cập nhật. Nhảy đến setup 5 phút →

📊 Bài này xây dựng:

  • MEMORY.md hoạt động với 10 pointer entries, copy-paste sẵn
  • Workflow cập nhật cuối session (một prompt, không cần hooks)
  • Bảng so sánh entry tốt vs entry dở
  • Checklist dọn dẹp hàng tháng để giữ dưới 200 dòng
# Session 1: "Project này dùng Clerk cho auth, không phải NextAuth."
# Session 2: "Như đã nói, chúng tôi dùng Clerk..."
# Session 3: "Đã migrate sang Clerk từ tháng 3. Đừng gợi ý NextAuth nữa."
# Session 4: "ĐỌC CLAUDE.MD ĐI. DÙNG CLERK."
# Session 5: "..."
# Session 6: *mở CLAUDE.md, thêm dòng in đậm, viết hoa hết*

Quen thuộc không? Developer mất 10-15 phút mỗi session để rebuild context mà hôm qua đã rõ ràng (CleanAim, 2026). Tính ra một tháng làm việc hàng ngày, đó là 5-10 tiếng lặp lại chính mình.

Cách sửa chỉ cần một file. MEMORY.md là index nhẹ mà Claude Code đọc khi bắt đầu session. Không phải log hội thoại. Không phải code dump. Mà là mục lục cho trạng thái hiện tại của project.

CLAUDE.md chứa các quy tắc cố định (conventions, build commands, constraints). MEMORY.md chứa trạng thái đang thay đổi (migration gần đây, quyết định đang hoạt động, tuần trước thay đổi gì). Cả hai đều thuộc Layer 1 trong framework harness engineering, và đa số developer chỉ có nửa đầu.


Tại sao Claude Code quên hết mọi thứ giữa các session?

Claude Code bắt đầu mỗi session với context window trống. Nó đọc CLAUDE.md và MEMORY.md khi khởi động, nhưng không gì khác từ các cuộc hội thoại trước được giữ lại. Flag --continue tiếp tục một cuộc hội thoại cụ thể, nhưng các quyết định rải rác qua nhiều session sẽ mất trừ khi bạn ghi lại (Claude Code docs).

Đây là khoảng trống mà đa số developer gặp phải:

CLAUDE.mdMEMORY.md—continue
Tồn tại qua sessionChỉ session cuối
Loại nội dungQuy tắc cố địnhTrạng thái thay đổiToàn bộ hội thoại
Ai cập nhậtBạn (thủ công)Bạn + ClaudeTự động
Giới hạn kích thướcKhông giới hạn cứng200 dòng / 25KBContext window
Phù hợp choConventions, constraintsQuyết định, migration, WIPTiếp tục công việc dở

CLAUDE.md không thay đổi giữa các session. Nó nói “dùng Vitest cho tests” và ngày mai vẫn đúng. Nhưng “tuần trước migrate từ Prisma sang Drizzle” là trạng thái đang thay đổi. Nó quan trọng trong một tháng, rồi thành tin cũ. Loại context đó thuộc về MEMORY.md.

Claude Code có auto memory từ v2.0.64. Tính năng AutoDream tổng hợp kiến thức sau 24+ giờ và 5+ session mới (Claude Code docs). Nhưng auto memory bắt pattern chung, không phải quyết định cụ thể của bạn chọn TanStack Query thay SWR vào ngày 5 tháng 4. MEMORY.md là phần bổ sung thủ công nơi bạn kiểm soát chính xác những gì được giữ lại.

Key insight: Claude Code bắt đầu mỗi session với context window trống. CLAUDE.md cung cấp quy tắc cố định, auto memory (AutoDream) bắt pattern chung, nhưng không cái nào theo dõi trạng thái cụ thể của project như migration gần đây, quyết định đang hoạt động, hay công việc đang làm. MEMORY.md lấp khoảng trống này như index xuyên session do bạn quản lý (Claude Code docs).


Làm sao setup MEMORY.md trong 5 phút?

Tạo file MEMORY.md ở root project với 5-10 pointer entries, mỗi entry dưới 150 ký tự. Mỗi entry trỏ đến nơi thông tin nằm trong project, không phải chứa thông tin đó. Claude Code load file này tự động khi bắt đầu session (Claude Code docs).

Ba bước:

Bước 1: Tạo file cạnh CLAUDE.md.

Bước 2: Viết 5-10 pointer entries về trạng thái hiện tại của project.

Bước 3: Xong. Claude Code tự nhận file ở session tiếp theo.

Template thực tế:

MEMORY.md
## Project State (updated 2026-04-17)
- [Auth](src/lib/auth/) - Clerk từ tháng 3/2026. Migrate từ NextAuth.
- [DB](prisma/schema.prisma) - PostgreSQL trên Supabase. Drizzle ORM.
- [Deploy](docs/deploy.md) - Vercel preview cho PR, production trên main.
- [Testing](vitest.config.ts) - Vitest unit + Playwright E2E. Min 80%.
- [API](src/app/api/) - Server Actions cho mutations. API routes cho webhooks.
- [Payments](src/lib/stripe/) - Stripe checkout. Webhooks tại /api/webhooks/stripe.
- [WIP] Redesign dashboard đang làm. Branch: feature/dashboard-v2.
- [Bug] Rate limiter false positives trên /api/search. Issue #234.
- [Decision] Chọn TanStack Query thay SWR, 5/4. Xem docs/decisions/004.md.
- [Deprecated] Routes /api/v1/ cũ. Xóa sau deadline 1/5.

Mỗi entry là một pointer. “Clerk từ tháng 3/2026” cho Claude biết hệ thống auth và khi nào thay đổi. Nếu Claude cần chi tiết, nó đọc src/lib/auth/. Entry không dump implementation vào MEMORY.md.

Ràng buộc quan trọng: MEMORY.md giới hạn 200 dòng hoặc 25KB, cái nào nhỏ hơn. Các entry quá dòng 200 bị bỏ âm thầm, không có cảnh báo (Claude Code docs). Giữ nó gọn.

Key insight: MEMORY.md giới hạn 200 dòng hoặc 25KB khi bắt đầu session. Các entry quá dòng 200 bị bỏ âm thầm không cảnh báo. Mỗi entry nên là pointer dưới 150 ký tự cho Claude biết tìm ở đâu, không phải content dump cố giải thích mọi thứ inline (Claude Code docs).


Entry tốt vs entry dở khác nhau thế nào?

Entry tốt là pointer dưới 150 ký tự cho Claude biết tìm ở đâu. Entry dở dump nội dung thuộc về source files. Nghiên cứu AGENTbench của ETH Zurich phát hiện context files dài hơn thực sự giảm tỷ lệ thành công ~3% đồng thời tăng chi phí lên 19% (Gloaguen et al., 2026). Ít hơn là tốt hơn.

Entry dở (dump nội dung)Entry tốt (pointer)
Auth dùng Clerk với middleware tại src/middleware.ts kiểm tra session cookies và redirect user chưa đăng nhập về /sign-in với custom error page[Auth](src/lib/auth/) - Clerk từ tháng 3/2026. Xem middleware.ts.
Database là PostgreSQL 16 trên Supabase có connection pooling qua pgBouncer, schema quản lý bằng Drizzle ORM dùng push strategy cho migrations[DB](prisma/schema.prisma) - PostgreSQL/Supabase, Drizzle ORM.
Các API routes cũ tại /api/v1/users, /api/v1/products, và /api/v1/orders đã deprecated và sẽ xóa trong sprint tiếp theo sau ngày 1/5[Deprecated] Routes /api/v1/. Xóa sau 1/5.

Entry dở trung bình 25-30 từ. Entry tốt trung bình 8-12 từ. Cả hai cho Claude cùng thông tin hành động được: hệ thống gì, tìm ở đâu, điều gì relevant bây giờ.

Tại sao pointer ngắn hiệu quả hơn? 80% tokens trong các phiên agent thường bị lãng phí cho việc “tìm kiếm” thay vì làm việc (Nesler, 2025). Pointer loại bỏ việc tìm kiếm. Claude đọc “Clerk từ tháng 3/2026” và đi thẳng vào code auth thay vì mất 3 turn tìm hiểu auth stack.

Còn vấn đề attention của model. Khi context fill quá 50%, hiệu suất model giảm cho nội dung ở giữa window. Token gần đây được ưu tiên hơn token đầu (Chroma Research, 2025). Entry ngắn giữ context quan trọng gần đầu, nơi Claude chú ý nhất.

Loại entry thuộc về MEMORY.md:

  • Quyết định đã đưa ra (kèm ngày)
  • Migration hoặc refactor đang hoạt động
  • Công việc đang làm (tên branch, số issue)
  • Bug đã biết (kèm link tracking)
  • Deadline deprecation
  • Thay đổi kiến trúc gần đây

Không thuộc về MEMORY.md:

  • Quy tắc cố định → CLAUDE.md
  • Code snippets → source files
  • Tài liệu kiến trúc → thư mục docs/
  • Ngăn chặn hành động nguy hiểm → Hooks

Key insight: Nghiên cứu AGENTbench của ETH Zurich phát hiện context files dài giảm tỷ lệ thành công ~3% đồng thời tăng chi phí lên 19% (Gloaguen et al., 2026). Entry MEMORY.md nên là pointer dưới 150 ký tự, không phải content dump. Agent đọc pointer, rồi đọc source file để lấy chi tiết.


Nhận tips Claude Code hàng tuần - Config thực tế, không lý thuyết. Một email mỗi tuần. Đăng ký AI Developer Weekly →


Làm sao giữ MEMORY.md cập nhật mà không cần hooks phức tạp?

Cuối mỗi session, hỏi Claude một prompt. Claude đọc MEMORY.md hiện tại, thêm hoặc cập nhật entry liên quan, xóa entry cũ, và giữ dưới giới hạn 200 dòng. Không hooks, không automation, không tool bên thứ ba. Một prompt, mười giây.

Đây là prompt (copy-paste sẵn):

Update MEMORY.md with what you learned this session: new decisions,
changed architecture, resolved bugs, anything future sessions should
know. Keep entries under 150 chars. Remove anything no longer relevant.

Đó là toàn bộ workflow. Claude biết điều gì đã thay đổi vì nó vừa làm công việc đó. Nó viết entry theo format pointer đã thấy trong file. Bạn review diff, approve hoặc chỉnh sửa, và session tiếp theo bắt đầu với context đã cập nhật.

Làm điều này cuối các session có thay đổi ý nghĩa. Bỏ qua cho các lần tra cứu nhanh hoặc fix nhỏ không có quyết định mới.

Tại sao thủ công tốt hơn auto-update hooks? Hooks thêm phức tạp, có thể tạo entry nhiễu, và chưa được chứng minh về chất lượng memory. Prompt thủ công cho phép bạn review những gì được thêm vào. Bạn giữ quyền kiểm soát những gì agent nhớ.

Auto memory (AutoDream) bổ sung cho điều này. Nó chạy ngầm và bắt pattern chung. Nhưng nó không bắt được “chọn TanStack Query thay SWR vì dashboard cần optimistic updates.” Entry thủ công của bạn xử lý các quyết định cụ thể mà auto memory bỏ sót.

Key insight: Workflow memory đơn giản nhất là một prompt cuối mỗi session: “Update MEMORY.md with what you learned today.” Claude viết entry vì nó vừa làm công việc đó. Không hooks, không tool bên thứ ba, không phức tạp automation. Bạn review diff và approve. Thủ công tốt hơn tự động cho chất lượng memory vì bạn kiểm soát những gì được giữ lại.


Khi nào nên dọn dẹp MEMORY.md?

Dọn hàng tháng, cùng nhịp với dọn CLAUDE.md. Xóa entry cũ hơn 30 ngày không còn liên quan. Thăng cấp entry ổn định lên CLAUDE.md. Giới hạn 200 dòng là cứng, entry vượt quá biến mất âm thầm (Claude Code docs).

Bốn câu hỏi cho mỗi entry:

Với mỗi entry trong MEMORY.md, hỏi:
1. Còn đúng không? → KHÔNG → Xóa
2. Ổn định hơn 30 ngày? → CÓ → Thăng cấp lên CLAUDE.md
3. Trùng với CLAUDE.md? → CÓ → Xóa khỏi MEMORY.md
4. Teammate mới cần biết? → KHÔNG → Xóa

Pattern thăng cấp rất quan trọng. “Migrate từ Prisma sang Drizzle, 2/4” là entry MEMORY.md cho tháng đầu. Sau 30 ngày, migration thành tin cũ. Thăng cấp nó lên CLAUDE.md thành quy tắc cố định: “ORM: Drizzle (không phải Prisma).” Rồi xóa khỏi MEMORY.md.

Nếu MEMORY.md vượt quá 150 dòng, bạn cần dọn dẹp. HumanLayer giữ CLAUDE.md dưới 60 dòng vì cùng lý do: ít dòng hơn nghĩa là tín hiệu cao hơn trên mỗi dòng. Nguyên tắc tương tự áp dụng cho MEMORY.md.

Thử ngay:

  1. Tạo MEMORY.md ở root project (cạnh CLAUDE.md)
  2. Viết 5 pointer entries về: auth, database, deploy, testing, và một quyết định đang hoạt động
  3. Giữ mỗi entry dưới 150 ký tự
  4. Bắt đầu session Claude Code mới và xác nhận nó tham chiếu entries từ MEMORY.md
  5. Cuối session, chạy: “Update MEMORY.md with what you learned this session”

Xây harness từng layer. MEMORY.md là một nửa Layer 1. Hệ thống đầy đủ gồm tools, permissions, hooks, và observability. Đăng ký AI Developer Weekly →


FAQ

MEMORY.md trong Claude Code là gì?

MEMORY.md là file index cấp project mà Claude Code đọc khi bắt đầu mỗi session. Nó cung cấp bộ nhớ vĩnh viễn về trạng thái đang thay đổi của project: quyết định gần đây, công việc đang làm, migration, và bug đã biết. Mỗi entry nên là pointer dưới 150 ký tự. File giới hạn 200 dòng hoặc 25KB (Claude Code docs).

CLAUDE.md và MEMORY.md khác nhau thế nào?

CLAUDE.md chứa quy tắc cố định ít thay đổi: tech stack, naming conventions, build commands, constraints. MEMORY.md chứa trạng thái đang thay đổi giữa các session: migration gần đây, quyết định đang hoạt động, công việc đang làm, bug đã biết. Hãy nghĩ CLAUDE.md là hiến pháp và MEMORY.md là nhật ký thay đổi. Cả hai load khi bắt đầu session, nhưng phục vụ mục đích khác nhau. Đọc thêm về CLAUDE.md tại Tại Sao CLAUDE.md Là File Quan Trọng Nhất.

Claude Code có auto memory không?

Có. Từ v2.0.64, Claude Code có auto memory (AutoDream) tổng hợp kiến thức sau 24+ giờ và 5+ session. Nó bắt pattern chung tự động. Nhưng nó không theo dõi quyết định cụ thể như “chọn TanStack Query thay SWR ngày 5/4.” Dùng MEMORY.md cho trạng thái project quan trọng và để auto memory xử lý pattern chung (Claude Code docs).

MEMORY.md có thể bao nhiêu dòng?

200 dòng hoặc 25KB, cái nào nhỏ hơn. Entry quá dòng 200 bị bỏ âm thầm không cảnh báo. Giữ file dưới 150 dòng và dọn hàng tháng. Mỗi entry nên là pointer dưới 150 ký tự. Nếu MEMORY.md thường xuyên vượt 150 dòng, thăng cấp entry ổn định lên CLAUDE.md và xóa mục đã giải quyết.


Đọc Tiếp