Learn > Claude > Claude Code: Planning Mode, /compact & rewind

Claude Code: Planning Mode, /compact & rewind

Điều khiển phiên Claude Code: dán screenshot chỉ vùng UI, Planning Mode vs Effort level, Escape/rewind/compact/clear, và chạy tự chủ bằng /goal, /loop, worktree.

  • Thực thi thay đổi hiệu quả: dán screenshot bằng Ctrl+V (kể cả macOS, KHÔNG phải Cmd+V) để chỉ đúng vùng UI; bật Planning Mode (/plan hoặc Shift+Tab 2 lần) để Claude khảo sát codebase → lập plan chi tiết → chờ duyệt trước khi sửa (Ctrl+G mở plan ra sửa tay, Claude dùng bản cuối).
  • Effort level điều khiển độ sâu suy luận: /effort xem & chỉnh (low nhanh/rẻ ↔ max nghĩ lâu nhất), ultrathink để nghĩ thêm cho 1 prompt lẻ, Ctrl+O xem reasoning. Mental model: Planning = bề RỘNG (nhiều file/bước), Effort = chiều SÂU (logic/debug/thuật toán khó); cả hai đều tốn thêm token.
  • Điều hướng hội thoại để giữ Claude tập trung: Escape ngắt giữa chừng để bẻ lái; Escape 2 lần hoặc /rewind để tua về điểm trước; /compact nén lịch sử mà giữ thông tin cốt (task liên quan); /clear mở hội thoại mới sạch context (task khác hẳn) — vẫn /resume lại được hội thoại cũ.
  • Lái session dài: /compact có CHỈ THỊ (gõ "/compact Focus on X" để định hình summary giữ lại gì, tránh trôi hướng khi chi tiết quan trọng bị bỏ sót); rewind menu (Escape 2 lần, mỗi user prompt = 1 checkpoint) tách được Restore code / conversation / cả hai, kèm Summarize from here (nén phần SAU) và Summarize up to here (nén phần TRƯỚC checkpoint).
  • Chạy tự chủ: /goal đặt điều kiện "done" và chạy tới khi evaluator xác nhận — evaluator CHỈ đọc transcript nên tiêu chí phải kiểm được từ output (VD test pass), /goal clear để huỷ; /loop chạy prompt theo nhịp để poll CI/deploy (Escape để dừng); worktrees cho mỗi agent một file tree riêng (hết conflict khi chạy song song), .worktreeinclude copy file git-ignored (env/config) vào mỗi cây.

TL;DR — Ba nhóm đòn bẩy để lái một phiên dài: đưa đúng đầu vào (screenshot Ctrl+V, Planning Mode, /effort), cắt sai sớm (Escape ngắt giữa chừng, rewind, /compact có chỉ thị vs /clear), và thả tự chủ có kiểm soát (/goal chạy tới khi evaluator xác nhận "done", /loop, worktree cho việc song song).

Phần 2/7 của ghi chú khoá Claude Code in Action — đề thi thử 219 câu (chấm điểm + giải thích) nằm ở tab "Đề thi thử" trên trang tổng quan.

Thực thi thay đổi — screenshot, Planning Mode & Effort

Làm trên project có sẵn thì liên tục phải sửa đổi. Bài này gom mấy kỹ thuật để "ra lệnh" chính xác hơn: giao tiếp bằng hình ảnh (screenshot)điều khiển cách Claude suy nghĩ (Planning Mode + Effort).

Screenshot — chỉ tận mắt thay vì tả bằng lời

Cách nhanh nhất để nói "chỗ này này" với Claude là dán screenshot. Muốn sửa một mảng UI cụ thể, chụp màn hình rồi dán vào — Claude thấy đúng chỗ đang chỉ, khỏi tả lòng vòng.

  • Dán bằng Ctrl+Vkể cả trên macOS cũng là Ctrl+V, KHÔNG phải Cmd+V (đây là phím riêng để dán ảnh vào khung chat).
  • Dán xong, bảo Claude sửa đúng vùng đó.

Planning Mode — khảo sát & lập kế hoạch TRƯỚC khi ra tay

Với task phức tạp cần hiểu rộng nhiều chỗ trong codebase, bật Planning Mode để Claude thăm dò kỹ trước khi sửa.

Bật bằng: gõ /plan, hoặc bấm Shift+Tab để luân phiên qua các permission mode tới khi dòng chỉ báo dưới màn hình hiện "plan mode on". Thứ tự cycle: manual (default) → accept edits (acceptEdits) → plan → auto — nên từ manual bấm 1 lần ra acceptEdits, 2 lần ra plan. (Bộ mode đầy đủ + auto mode: xem mục "Permission mode" phía dưới.)

⚠️ Đừng lẫn: plan khác autongược hẳn bypassPermissions. plan = read-only, chỉ khảo sát + lập kế hoạch, không sửa gì; bypassPermissions = bỏ qua mọi câu hỏi permission (nguy hiểm). Plan là mode an toàn nhất, không phải bypass.

Ở plan mode Claude sẽ:

  1. Đọc nhiều file hơn trong project.
  2. Lập một plan chi tiết.
  3. Trình bày đúng ý định nó định làm.
  4. Chờ duyệt rồi mới làm.

→ Đây là cơ hội để review và bẻ lái nếu Claude bỏ sót gì hoặc chưa tính tới một tình huống.

💡 Tip: khi xem plan, bấm Ctrl+G để mở plan trong text editor, sửa tay cho chính xác rồi submit — Claude dùng đúng bản cuối được gửi.

Effort level — chỉnh Claude "nghĩ" sâu tới đâu

Mặc định Claude reason (suy luận) trước khi trả lời — thấy gợi ý kiểu "still thinking". Muốn xem thực sự nó nghĩ gì, bấm Ctrl+O để mở transcript viewer — xem chi tiết các bước reasoningtool execution (lưu ý: trên desktop/GUI phím có thể khác terminal; docs nói "shortcuts may vary by platform").

Độ sâu suy luận điều khiển được bằng effort level. Gõ /effort để xem mức hiện tại và chỉnh:

  • low — nhanh & rẻ hơn (ít token).
  • max — nghĩ lâu nhất, dành cho bài khó.
  • Mức mặc định tùy model + gói; /effort hiện đúng mức đang dùng.

Nếu chỉ muốn Claude nghĩ thêm cho ĐÚNG một prompt, thả từ khoá ultrathink vào câu đó. Nó báo Claude reason nhiều hơn turn này thôi, không đổi effort level của cả session.

⚠️ Freshness: video còn dùng các keyword "think / think harder" cũ để ép nghĩ nhiều — những keyword đó nay không còn tác dụng. Cách đúng hiện tại: chỉnh /effort, và dùng ultrathink cho từng prompt lẻ.

Planning vs Effort — hai loại "khó" khác nhau

Chỗ dễ lẫn nhất, nên tách bạch rõ — hai tính năng giải quyết hai loại độ phức tạp khác nhau:

Planning Mode = bề RỘNG Tăng Effort = chiều SÂU
Giải quyết Cần hiểu rộng codebase Cần nghĩ sâu một bài hóc
Hợp với Task nhiều bước; đổi nhiều file/component Logic phức tạp, debug bug khó, bài thuật toán

Kết hợp cả hai khi task vừa cần rộng vừa cần sâu. Nhưng nhớ: cả hai đều ngốn thêm token → cân nhắc chi phí.

Áp dụng thực tế: mental model tôi ghim: Planning = Claude nhìn RỘNG tới đâu; Effort = Claude nghĩ SÂU tới đâu — hai trục độc lập. Plan mode thực chất ép quy trình "chốt phương án trước khi code", giống việc tôi bắt review spec/design trước khi build; với khách Nhật thì cực hợp văn hoá "xác nhận rồi mới làm", tránh Claude (hay dev) lao vào sửa 10 file rồi mới lộ sai hướng. Effort là nút vặn ngân sách suy nghĩ: đừng để max chạy suốt (đốt token vô ích cho việc vặt) — chỉ vặn cao khi gặp bug logic thật sự hóc. Và Ctrl+O đọc reasoning là công cụ audit: khi Claude ra kết quả lạ, mở reasoning xem nó hiểu sai từ bước nào rồi sửa trúng chỗ đó, thay vì prompt lại từ đầu.

Điều hướng hội thoại — Escape, rewind, /compact, /clear

Nếu context management ở trên lo phần trước khi hỏi (nạp đúng file), thì phần này lo phần trong lúc hội thoại chạy: cách lái để Claude khỏi lan man và giữ context sạch. Bốn kỹ thuật.

Ngắt Claude bằng Escape

Claude đi sai hướng hoặc ôm quá nhiều việc một lúc → bấm Escape để dừng giữa response và bẻ lái. Rất hữu ích khi muốn Claude tập trung đúng một task. VD: nhờ viết test cho nhiều hàm mà Claude bắt đầu vẽ nguyên một kế hoạch đồ sộ cho tất cả → ngắt, yêu cầu nó làm từng hàm một.

Escape + Memories — dập lỗi lặp lại

Ứng dụng mạnh nhất của Escape: sửa lỗi Claude tái phạm qua nhiều conversation. Quy trình:

  1. Escape để dừng response hiện tại.
  2. Chạy /memory (hoặc sửa CLAUDE.md trực tiếp) — ghi lại cách làm đúng.
  3. Tiếp tục hội thoại với thông tin đã sửa.

→ Nhờ vậy các conversation sau trên project không lặp lại cùng lỗi đó. (Freshness: video dùng shortcut # cũ để thêm memory — đã gỡ, giờ dùng /memory.)

Rewind — tua về checkpoint

Hội thoại dài thường tích context nhiễu (VD một màn debug lằng nhằng không còn cần cho task kế). Mỗi prompt của user tạo một checkpoint (điểm khôi phục) — nên khi Claude đi lạc, khỏi cần prompt để gỡ ra, cứ tua thẳng về checkpoint gần nhất. Bấm Escape hai lần trên ô prompt trống (hoặc gõ /rewind) để mở menu, với năm lựa chọn:

  • Restore code and conversation — tua lại cả hai (file + chat).
  • Restore conversation — chỉ tua lại chat, giữ nguyên file.
  • Restore code — chỉ tua lại file, giữ nguyên chat.
  • Summarize from herenén phần SAU checkpoint. Hợp khi vừa có một màn lạc đề (side-conversation) và chỉ muốn giải phóng chỗ.
  • Summarize up to herenén phần TRƯỚC checkpoint. Hợp khi có một pha setup dài muốn ép gọn, nhưng vẫn giữ nguyên phần implement phía sau.

Tách được code với conversation là điểm mạnh: rollback file mà vẫn giữ hiểu biết trong chat (Claude đã hiểu codebase), hoặc ngược lại — bỏ phần lịch sử gây nhiễu mà không đụng tới file.

/compact — nén hội thoại, giữ cái cốt

Lệnh /compact tóm tắt toàn bộ lịch sử hội thoại nhưng giữ lại thông tin then chốt Claude đã học. Lý tưởng khi:

  • Claude đã nắm nhiều kiến thức về project.
  • Muốn tiếp tục các task liên quan.
  • Hội thoại đã dài nhưng chứa context quan trọng.

⭐ Lái cái summary bằng /compact có chỉ thị (directed compact): đừng gõ /compact trơn. Rủi ro của compact là một chi tiết quan trọng bị bỏ khỏi bản tóm tắt → Claude trôi khỏi hướng. Thêm chỉ thị ngay sau lệnh để bảo Claude giữ lại đúng thứ cần — VD debug xong từ lâu, giờ chỉ còn quan tâm mấy thay đổi API thì nói thẳng:

/compact Focus on the --version flag implementation

Mọi thứ viết sau /compact định hình cái summary giữ lại gì — đó là "vô-lăng" của bạn cho context.

/clear — bắt đầu tinh khôi

Lệnh /clear mở một conversation mới với context sạch hoàn toàn. Hợp nhất khi:

  • Chuyển sang một task khác hẳn, không liên quan.
  • Context hiện tại có thể làm Claude rối cho task mới.

Vẫn quay lại hội thoại cũ được bằng /resume/clear không xoá nó khỏi session history.

/compact /clear
Làm gì Tóm tắt + giữ thông tin cốt Xoá sạch, khởi tạo context mới
Khi nào Task liên quan, cần giữ hiểu biết Task khác hẳn, không cần context cũ

Khi nào dùng cả cụm này: hội thoại dài context bị nhiễu, lúc chuyển task, khi Claude lặp lỗi, và trong project phức tạp cần giữ tập trung vào từng component. Đây không chỉ là tiện ích — chúng là công cụ thiết yếu để duy trì một session AI-assisted hiệu quả.

Áp dụng thực tế: cả bài này lẫn bài context management ở trên đều xoay quanh cùng một tài nguyên hữu hạn: context window. Cách tôi phân vai: /compact = "chốt biên bản cuộc họp rồi đi tiếp" (giữ kết luận, bỏ tranh luận thừa) — dùng khi làm chuỗi task liên quan; /clear = "đổi sang phòng họp mới" — khi nhảy sang việc chẳng dính dáng. Còn vòng Escape → /memory → tiếp tục chính là một vòng cải tiến liên tục: mỗi lần Claude sai một kiểu, tôi không sửa tay lần đó rồi thôi, mà ghi luật vào CLAUDE.md để lỗi không tái diễn — y hệt tinh thần retro/CAPA trong quản lý delivery: chặn lỗi tại nguồn, không chữa cháy lặp lại.

Chạy tự chủ hơn — /goal, /loop, và worktrees

Bốn kỹ thuật trên giả định bạn kè kè bên cạnh — theo dõi và bẻ lái tay. Khi muốn Claude tự chạy dài hơi hơn mà không phải ngồi canh từng bước, có ba công cụ.

/goal — đặt điều kiện "xong"

/goal cho bạn mô tả "done" trông như thế nào; Claude cứ chạy xuyên nhiều turn cho tới khi một evaluator (bộ chấm) nhanh xác nhận các điều kiện đã thoả. Nó không dừng ngay lần đầu tưởng là xong — phải qua evaluator mới thôi.

/goal all tests in src/billing pass, and the type checker reports zero errors

Huỷ bằng /goal clear. ⚠️ Ràng buộc cốt tử: evaluator chỉ đọc transcript (những gì Claude thực sự in ra). Nên điều kiện phải kiểm được từ output — VD kết quả một lần chạy test — chứ không phải thứ chỉ nằm trong đầu bạn hay ngoài màn hình.

/loop — chạy lặp theo nhịp

/loop chạy một prompt theo chu kỳ giữa các turn (cố định hoặc tự-định-nhịp). Dùng để kéo trạng thái từ bên ngoài — như một lần chạy CI hay một lần deploy — rồi hành động khi trạng thái đổi. Dừng bằng Escape. Khác /goal (chạy tới khi một điều kiện "done" được xác nhận), /loop chỉ lặp theo nhịp và phản ứng với thay đổi bên ngoài.

Worktrees — chạy song song không giẫm chân nhau

Ẩn dụ "lái xe" ở trên giả định một vô-lăng trong một xe. Nhưng khi chạy nhiều agent trên cùng codebase, hai session tranh nhau cùng bộ file → conflict. Đó là chỗ worktree vào cuộc: mỗi session được một cây file (file tree) độc lập của riêng nó, nên không thể ghi đè thay đổi của nhau. Session thoát → worktree sạch tự bị dọn.

Có một file đáng biết: .worktreeinclude đặt ở gốc repo, liệt kê các file bị git-ignore cần copy vào mỗi worktree — như file biến môi trường (.env) hay config local mà mọi worktree đều cần nhưng không muốn commit.

Áp dụng thực tế: tôi xếp mấy công cụ này theo trục "mình còn cầm lái bao nhiêu". Directed /compact và rewind menu là cầm lái tay — mình còn ngồi trong xe, chỉ tinh chỉnh. /goalgiao khoán có nghiệm thu: mình mô tả tiêu chí kiểm được (test pass, type-check sạch) rồi để nó tự chạy — đúng tinh thần Definition of Done trong delivery, "done" phải đo được chứ không phải "Claude nghĩ là xong". /looppolling một hệ ngoài (CI/deploy). Còn worktree là bài học tôi thấy rõ nhất khi điều phối nhiều luồng: không cho hai người sửa chung một file — tách nhánh vật lý để khỏi conflict, y như mỗi dev một branch. Riêng ràng buộc /goal "chỉ đọc transcript" là một nhắc nhở rất thực tế: muốn tự động nghiệm thu thì phải in bằng chứng ra output, vì evaluator không đọc được thứ nằm ngoài màn hình.


Phần tiếp theo: Claude Code: permission mode & hooks

Nguồn: Claude Code in Action (Anthropic Academy) — Copyright Anthropic. Phần đề thi thử cho khoá này nằm ở tab "Đề thi thử" trên trang tổng quan khoá.

Câu hỏi thường gặp

Làm sao chỉ cho Claude đúng vùng UI cần sửa?
Dán một screenshot vào khung chat — Claude nhìn thấy đúng chỗ bạn muốn đổi, khỏi tả bằng lời. Lưu ý phím dán là Ctrl+V, kể cả trên macOS cũng là Ctrl+V chứ không phải Cmd+V (đây là phím riêng để dán ảnh vào chat). Dán xong thì bảo Claude sửa đúng vùng đó.
Planning Mode khác Effort level thế nào, khi nào dùng cái nào?
Hai tính năng giải quyết hai loại độ phức tạp khác nhau. Planning Mode lo bề RỘNG: bật bằng /plan hoặc Shift+Tab hai lần, Claude sẽ đọc nhiều file, lập một plan chi tiết, cho bạn xem ý định rồi chờ duyệt — hợp với task nhiều bước, thay đổi nhiều file/component. Effort level lo chiều SÂU: chạy /effort để chỉnh (low nhanh & rẻ, max reason lâu nhất) — hợp với logic phức tạp, debug bug khó, bài thuật toán. Task vừa rộng vừa sâu thì kết hợp cả hai; nhưng cả hai đều tốn thêm token nên cân nhắc chi phí.
Làm sao để Claude suy nghĩ kỹ hơn và xem nó đang nghĩ gì?
Mặc định Claude đã reason trước khi trả lời (thấy dòng "still thinking"). Bấm Ctrl+O để mở transcript viewer, xem chi tiết reasoning + tool execution. Muốn nó nghĩ sâu hơn thì chỉnh effort level bằng /effort (mức mặc định tùy model + gói), hoặc thả từ khoá ultrathink vào một prompt để nghĩ thêm chỉ cho lượt đó mà không đổi effort của cả session. Lưu ý các keyword "think / think harder" kiểu cũ trong video nay đã không còn tác dụng — dùng /effort và ultrathink thay thế.
/compact khác /clear thế nào, khi nào dùng cái nào?
/compact tóm tắt toàn bộ lịch sử hội thoại nhưng giữ lại thông tin cốt lõi Claude đã học — dùng khi chuyển sang task LIÊN QUAN và muốn giữ hiểu biết về project (hội thoại đã dài nhưng chứa context quan trọng). /clear mở một hội thoại mới với context sạch hoàn toàn — dùng khi chuyển sang task KHÁC HẲN, không liên quan, mà context cũ có thể làm Claude rối. /clear không xoá hội thoại cũ khỏi session; vẫn quay lại được bằng /resume.
Làm sao dừng Claude giữa chừng và dập lỗi nó lặp đi lặp lại?
Bấm Escape để ngắt Claude giữa response và bẻ lái — hữu ích khi nó ôm quá nhiều việc một lúc, giúp ép nó tập trung một task. Với lỗi Claude tái phạm qua nhiều hội thoại: Escape để dừng, chạy /memory (hoặc sửa CLAUDE.md trực tiếp) ghi lại cách làm đúng, rồi tiếp tục — nhờ vậy các hội thoại sau trên project không lặp lại lỗi đó. Muốn dọn lịch sử nhiễu (như màn debug lằng nhằng) mà vẫn giữ context giá trị thì Escape hai lần hoặc /rewind để tua về điểm trước.
Directed compact là gì, khác /compact thường ra sao?
/compact thường tóm tắt cả hội thoại nhưng có rủi ro bỏ sót một chi tiết quan trọng khiến Claude trôi khỏi hướng. Directed compact là thêm chỉ thị NGAY SAU lệnh để lái cái summary giữ lại gì, ví dụ "/compact Focus on the --version flag implementation". Mọi thứ viết sau /compact định hình nội dung bản tóm tắt — đây là cách bạn kiểm soát context thay vì phó mặc Claude tự chọn.
Rewind menu có những lựa chọn nào?
Mỗi prompt của user tạo một checkpoint. Bấm Escape hai lần trên ô prompt trống (hoặc /rewind) mở menu với năm lựa chọn: Restore code and conversation (tua cả file lẫn chat), Restore conversation (chỉ chat), Restore code (chỉ file), Summarize from here (nén phần SAU checkpoint — dẹp một màn lạc đề), và Summarize up to here (nén phần TRƯỚC checkpoint — ép gọn pha setup dài mà giữ nguyên phần implement phía sau).
/goal dùng để làm gì, và ràng buộc quan trọng nhất là gì?
/goal đặt một điều kiện "done": bạn mô tả trạng thái hoàn thành, Claude chạy xuyên nhiều turn tới khi một evaluator xác nhận đã thoả — nó không dừng ngay lần đầu tưởng xong. Huỷ bằng /goal clear. Ràng buộc cốt tử: evaluator CHỈ đọc transcript, nên điều kiện phải kiểm được từ output Claude thực sự in ra (ví dụ kết quả một lần chạy test), không phải thứ nằm ngoài màn hình.
/loop khác /goal thế nào?
/loop chạy một prompt theo chu kỳ giữa các turn (cố định hoặc tự định nhịp), để kéo trạng thái từ hệ ngoài như CI hay deploy rồi hành động khi trạng thái đổi; dừng bằng Escape. Khác với /goal (chạy tới khi một điều kiện "done" được evaluator xác nhận), /loop chỉ lặp theo nhịp và phản ứng với thay đổi bên ngoài — không có khái niệm điều kiện kết thúc tự động.
Worktree giải quyết vấn đề gì, và file .worktreeinclude để làm gì?
Khi chạy nhiều agent song song trên cùng codebase, hai session tranh nhau cùng bộ file sẽ gây conflict. Worktree cho mỗi session một file tree độc lập nên chúng không ghi đè thay đổi của nhau; session thoát thì worktree sạch tự bị dọn. File .worktreeinclude đặt ở gốc repo liệt kê các file bị git-ignore cần copy vào mỗi worktree — như file biến môi trường hoặc config local mà mọi worktree đều cần nhưng không muốn commit.