Bỏ qua để vào nội dung chính
Cách dựng Claude Code nhớ context: memory 2 tầng + todo DB

Cách dựng Claude Code nhớ context: memory 2 tầng + todo DB

Bởi Grace Sullivan
21 thg 8, 20267 phút đọc

Hai setup thật cho thấy cách giữ trạng thái Claude Code qua nhiều máy: todo database thay TODO.md, bộ nhớ hai tầng, routine go/fin và cách đo token.

Bạn mở Claude Code trên laptop, nó không biết tối qua bạn đã sửa gì trên con server ở nhà. Mất mười phút dán lại context, rồi rate limit cắt ngang giữa phiên debug và hai giờ context bay sạch.

Hai setup vừa được public cho thấy phần thiếu không phải prompt hay plugin, mà là hạ tầng quanh assistant: nguồn sự thật cho task, bộ nhớ phân tầng, một routine mở/đóng phiên, và một đồng hồ đo token. Bài này bóc từng phần, kèm việc bạn dựng được trong một buổi.

Vì sao file TODO.md chết ngay khi bạn có máy thứ hai

Tác giả setup đầu tiên chạy Claude Code năm tháng trên một "fleet" máy — Proxmox host, server Linux, vài laptop, một desktop, và cả một điện thoại Android chạy Claude Code trong terminal. Ở quy mô đó, cách phổ biến nhất sụp trước tiên: "Most AI task setups are a markdown file the model edits. Fine for one person on one machine; it falls apart the moment two sessions run at once, or you jot a task on your phone that the laptop needs to see."

Thay thế của họ là một SQLite database trên server, sau một API có auth, kèm append-only event log — mọi lần add, close, edit, note đều ghi lại ai làm, khi nào, vì sao. Điểm quan trọng nhất là hướng dữ liệu: "The TODO.md files still exist, but as generated read-only mirrors. Claude can't hand-edit them. The database is the truth; the markdown is a view of it."

Đảo chiều đó chặn đúng thứ làm bạn đau: hai phiên song song không ghi đè lên nhau, và task ghi trên điện thoại có mặt ở laptop. Các máy nằm cùng một tailnet Tailscale, nên CLI ở đâu cũng gọi được database.

Bộ nhớ hai tầng: index luôn nạp, chi tiết nạp theo nhu cầu

Đây là phần áp dụng được ngay cả khi bạn chỉ có một máy. Vấn đề gốc: "Claude Code loads instruction files into every session, and context is a budget. The obvious approach — one ever-growing 'remember this' file — quietly fails: it bloats until parts of it stop loading."

Cấu trúc họ dùng có hai tầng rõ ràng:

  • Tầng luôn nạp — global instructions cộng một memory index, "one line per memory, a title and a one-sentence hook. A hundred-odd lines, pruned hard, because every line is paid for on every session."
  • Tầng nạp theo nhu cầu — một folder các file memory riêng: preferences, project state, runbook, và các correction học bằng máu. Ví dụ trong bài: "never rsync --delete to a server" — ghi lại đúng cái ngày một cờ --delete lạc xoá mười chín file. File chỉ được đọc khi chủ đề của nó xuất hiện.

Cái bẫy nằm ở khâu tỉa: "a vague line never gets fetched, too many lines blows the budget, and past a hard ceiling the index drops its own tail with no warning. It just quietly forgets." Nghĩa là một index phình to không báo lỗi — nó chỉ âm thầm quên phần cuối. Nếu bạn đang nhồi mọi thứ vào một file instructions duy nhất, đây là dấu hiệu để tách ngay.

Phân tích riêng: giá trị của tầng hai nằm ở lịch sử lỗi, không phải ở "best practices". Một dòng "đừng rsync --delete lên server" là thứ không tải về được từ đâu.

Routine hai lệnh: mở phiên và đóng phiên

Phiên làm việc có hình dạng cố định, nên setup này biến hình dạng đó thành script. Lệnh mở: "Typing go pulls the dotfiles, re-runs the bootstrap and syncs every project repo — flushing the offline todo queue, regenerating the mirrors, and checking the servers for uncommitted drift on the way."

Lệnh đóng không phải nghịch đảo của lệnh mở. Theo bài: "go restores a known-good state, fin captures what changed" — nó cập nhật mọi doc có chủ đề vừa thay đổi (changelog, project state, spec liên quan), reconcile cờ todo, ghi một resume point, đóng todo đã xong với commit hash làm lý do, rồi commit, push và sync ra.

Hai chi tiết đáng chép lại:

  1. Resume point là comment được neo trong doc dự án và có script index lại — "any session on any machine can list the newest open ones and pick up half-finished work. Close the linked todo and the resume point retires itself."
  2. Đo thời gian routine: một timer bọc quanh mọi lần gofin, đẩy duration về một store trung tâm, để khi một bước bắt đầu chậm thì số liệu chỉ ra bước nào.

Đi kèm routine là guard rail: một pre-commit hook từ chối commit đến khi changelog được stage, và một deploy không chạm site live cho tới khi bản dev được xem trên browser thật. Tác giả kể hook đó đã chặn chính họ hai lần khi dựng repo ví dụ cho bài.

Đừng để rate limit cắt giữa phiên

Setup thứ hai bắt đầu từ đúng nỗi đau ở đầu bài: "Six weeks ago I got cut off mid-debugging session by Claude's rate limit with no warning. Two hours of context gone." Kết quả là một Chrome extension MV3 chèn thanh token ngay trên input box của Claude, ChatGPT, Gemini, DeepSeek và Grok, đọc từ session browser sẵn có, không cần API key.

Chi tiết kỹ thuật đáng chú ý cho ai định tự dựng: theo tác giả, "Claude is the only platform that exposes real rate limit data through its internal API" — endpoint usage trả về utilization và reset timestamp dạng five_hour/seven_day, tức số thật chứ không phải suy đoán. Các nền tảng còn lại phải ước lượng token từ DOM hội thoại, và tác giả cho biết sai số khoảng "±8% — sufficient for knowing whether you're at 20% or 80% of your context window."

Ngưỡng cảnh báo mặc định là 75%, 90% và 100%, mỗi ngưỡng chỉ bắn một lần khi vượt qua và reset khi usage tụt xuống. Rủi ro bảo trì cũng được nói thẳng: DOM của Claude, ChatGPT và Gemini đổi không báo trước, selector hôm nay chạy tuần sau vỡ, nên cần nhiều selector fallback và truy cập phòng thủ bằng ?..

Dựng gì trong buổi tối nay

Thứ tự dưới đây là đề xuất phân tích, không phải khuyến nghị của tác giả gốc — chọn theo số máy bạn đang dùng:

  • Một máy: tách file instructions đang phình thành index một dòng mỗi memory cộng folder chi tiết. Đây là thay đổi rẻ nhất và chặn đúng lỗi "âm thầm quên".
  • Hai máy trở lên: đưa config, memory và script vào một repo với một bootstrap script duy nhất. Setup gốc đưa máy trắng vào trạng thái làm việc trong khoảng mười phút.
  • Nhiều phiên song song: bỏ markdown làm nguồn sự thật, dựng store query được và audit được.
  • Hay bị cắt giữa phiên: gắn chỉ báo usage trước khi tối ưu prompt.

Thứ đáng theo dõi tiếp: index tầng một là chỗ dễ hỏng nhất trong kiến trúc này, vì nó vượt ngưỡng mà không phát ra lỗi nào. Hãy đặt một kiểm tra định kỳ đếm số dòng index trước khi nó tự cắt đuôi.

Không spam, hủy đăng ký bất kỳ lúc nào.

Bài viết liên quan