Plan mode hay direct execution: các bẫy Claude Code trong đề
Plan mode hay direct execution, scope và secret trong .mcp.json, Grep, Glob hay Edit: những thói quen Claude Code làm mất điểm CCAR-F và đáp án đúng.
Một thí sinh đỗ CCAR-F với điểm quy đổi 780 đã công bố kết quả theo từng domain: 88% ở phần agentic architecture, nhưng chỉ 50% ở Claude Code Configuration & Workflows, domain gần với công việc code hằng ngày nhất. Đó chỉ là một trường hợp, chưa phải xu hướng, nhưng thói quen kiểu "cứ sửa luôn đi" không phải lúc nào cũng là đáp án mà exam guide chờ đợi. Bài này nói về các bẫy quanh plan mode và direct execution trong Claude Code, scope của MCP server trong .mcp.json, và các built-in tool Grep, Glob, Read, Edit, Write.
Nội dung bám theo task statement 3.4 (plan mode hay direct execution), 2.4 (MCP server) và 2.5 (built-in tool). Lưu ý 2.4 và 2.5 thuộc Domain 2 chứ không thuộc Domain 3. Chúng xuất hiện nhiều nhất ở Scenario 2 (Code Generation with Claude Code) và Scenario 4 (Developer Productivity with Claude).
Thói quen hằng ngày và đáp án của đề: bảng tóm tắt các bẫy
Mỗi dòng là một thói quen vẫn ổn khi làm việc thật nhưng chọn vậy trong phòng thi thì sai.
| Thói quen | Vì sao sai khi đi thi | Exam guide chờ đợi gì |
|---|---|---|
| Lúc nào cũng bật plan mode "cho chắc" | Thêm chi phí khi chẳng có gì cần quyết định | Direct execution cho thay đổi rõ ràng, một file |
| Sửa ngay một migration 45 file | Đi sai hướng thì mỗi file sửa thêm càng tốn | Plan mode trước, rồi thực thi kế hoạch đã duyệt |
| Đọc hết mọi file trong phiên chính để "đủ context" | Output dài dòng lấn mất các chỉ dẫn quan trọng | Explore subagent cho phần khám phá, chỉ giữ bản tóm tắt |
Dán thẳng API token vào .mcp.json | Secret nằm luôn trong lịch sử git | Mở rộng biến môi trường ${GITHUB_TOKEN} |
Dùng Glob *discount* để tìm nơi gọi hàm | Nơi gọi hàm nằm trong file có tên khác | Grep theo tên hàm |
| Thử Edit lại khi nó báo trùng khớp nhiều chỗ | Thử bao nhiêu lần cũng lỗi | Anchor dài hơn, hoặc Read + Write |
Plan mode và direct execution: khi nào dùng cái nào?
Dùng plan mode khi task có ảnh hưởng tới kiến trúc, có nhiều cách làm hợp lý, hoặc sửa nhiều file. Dùng direct execution khi thay đổi đã hiểu rõ và phạm vi rõ ràng, ví dụ sửa bug trong một file có sẵn stack trace. Với việc lớn thì kết hợp: lập kế hoạch, duyệt, rồi thực thi.
Ví dụ cho plan mode trong guide: tái cấu trúc microservice, migration thư viện ảnh hưởng 45+ file, và chọn giữa hai cách tích hợp có yêu cầu hạ tầng khác nhau. Ví dụ cho direct execution: sửa lỗi một file với stack trace rõ ràng, và thêm một điều kiện kiểm tra ngày.
Bẫy ở cả hai chiều
"Cứ sửa đi, gặp lỗi thì xử lý" sai với bài migration: migration làm dở dang để lại codebase nửa cũ nửa mới. "Luôn dùng plan mode cho an toàn" sai với bài sửa một dòng: stack trace đã nói hết những gì kế hoạch sẽ nói. Mẹo từ tài liệu Claude Code: nếu mô tả được diff trong một câu thì bỏ qua bước lập kế hoạch.
Để vào plan mode, nhấn Shift+Tab cho đến khi thanh trạng thái hiện plan mode, thêm /plan trước một prompt, hoặc khởi động bằng claude --permission-mode plan. Duyệt kế hoạch xong là thoát plan mode.
Khi phần khám phá ăn hết context
Nếu task bắt đầu bằng "tìm mọi chỗ tạo payment request" trên 80 file, các lần đọc đó lấp đầy context chính và những ràng buộc đưa ra từ đầu bị trôi mất. Explore là subagent có sẵn, chỉ đọc, tìm kiếm trong context window riêng và chỉ trả về bản tóm tắt. Với câu hỏi "giữa chừng một đợt rà soát lớn, Claude quên chỉ dẫn ban đầu", đáp án là Explore chứ không phải dán lại chỉ dẫn. So sánh plan mode với skill và subagent có trong bài skills, commands và subagents.
.mcp.json: scope project và scope user
MCP server dùng chung cho team đặt trong .mcp.json ở thư mục gốc project và commit vào repo. Server cá nhân hoặc đang thử nghiệm đặt ở scope user, lưu trong ~/.claude.json. Không file nào được chứa credential: .mcp.json hỗ trợ mở rộng ${VAR}, nên file chỉ giữ placeholder, còn mỗi developer hoặc CI runner tự cung cấp token thật.
{
"mcpServers": {
"github": {
"type": "http",
"url": "https://api.githubcopilot.com/mcp/",
"headers": { "Authorization": "Bearer ${GITHUB_TOKEN}" }
},
"jira": {
"command": "npx",
"args": ["-y", "@your-org/jira-mcp-server"],
"env": { "JIRA_TOKEN": "${JIRA_TOKEN}" }
}
}
}
Theo tài liệu Claude Code, việc mở rộng biến chạy trong command, args, env, url và headers, còn ${VAR:-default} cho giá trị dự phòng. Biến chưa được set và không có default thì giữ nguyên chuỗi ${VAR}, nên xác thực thường sẽ lỗi.
Mặc định của claude mcp add hay làm người ta vấp
⚠ Claude Code hiện có ba scope, còn exam guide chỉ dùng hai. Mặc định của CLI là scope local: riêng bạn, lưu trong ~/.claude.json, chỉ cho một project. Chạy claude mcp add không kèm flag thì team không nhận được gì. Muốn chia sẻ cần --scope project; server cá nhân dùng cho mọi project thì --scope user:
claude mcp add --transport stdio --scope user scratch-notes -- npx -y @your-org/notes-mcp
Khi đi thi, theo cách chia của guide: .mcp.json ở project cho tooling dùng chung, ~/.claude.json ở user cho server cá nhân hoặc thử nghiệm. Thêm một bẫy của 2.4: nếu description của MCP tool tìm code chỉ ghi "Searches code", agent thường chọn Grep có sẵn. Cách sửa trong guide là mô tả chi tiết khả năng và output của tool; xem cách viết tool description.
Built-in tool của Claude Code: Grep, Glob, Read, Edit, Write
Grep tìm trong nội dung file. Glob khớp đường dẫn file. Read đọc cả file, Write ghi đè cả file, còn Edit sửa một chỗ bằng cách khớp chính xác một đoạn text duy nhất. Hãy hỏi thứ bạn cần tìm nằm ở đâu: bên trong file (Grep) hay trong tên file (Glob).
flowchart TD
Q{Bạn biết gì?} -->|Text trong file:<br/>tên hàm, chuỗi lỗi| G[Grep]
Q -->|Mẫu tên hoặc đuôi file:<br/>**/*.test.tsx| GL[Glob]
Q -->|Chính xác file nào| R[Read]
R --> C{Sửa gì}
C -->|Một chỗ duy nhất| E[Edit]
C -->|File mới hoặc viết lại toàn bộ| W[Write]
E -->|Lỗi: text không duy nhất| R2[Read cả file, rồi Write]
Edit lỗi vì chỗ khớp không duy nhất
Edit yêu cầu old_string xuất hiện đúng một lần, nên return None có mặt trong mười hàm sẽ khiến nó từ chối. Trước tiên thử old_string dài hơn, kèm luôn chữ ký hàm. Khi không có anchor duy nhất, như code sinh tự động với các block giống hệt nhau, cách dự phòng trong guide là Read cả file rồi Write lại. replace_all: true chỉ hợp khi muốn đổi mọi chỗ.
Hiểu codebase từng bước
Grep tìm entry point, Read file đó, rồi lần theo các import, thay vì đọc hết mọi file từ đầu. Khi code gọi thư viện qua một module wrapper, Grep theo lời gọi thư viện chỉ tìm ra chính wrapper. Hãy liệt kê các tên mà wrapper export, rồi Grep từng tên.
⚠ Trên macOS, Linux và WSL, Claude Code hiện không đưa Glob và Grep vào bộ tool mặc định mà tìm bằng find và grep qua Bash. Exam guide vẫn coi Grep và Glob là tool tìm kiếm, nên khi thi hãy trả lời theo đó.
Thử sức
Hai hành động nào đúng với exam guide? (Chọn hai.)
A. Commit một file .mcp.json có server GitHub với "Authorization": "Bearer ${GITHUB_TOKEN}".
B. Chạy migration thư viện logging trên 60 file bằng direct execution, cuối cùng mới xem lại diff.
C. Dùng Glob với **/*parse_invoice* để tìm mọi nơi gọi parse_invoice().
D. Sau khi Edit lỗi vì block cần sửa xuất hiện bốn lần trong một file sinh tự động, Read file rồi Write toàn bộ nội dung đã sửa.
E. Thêm server ghi chú đang thử nghiệm của một developer vào .mcp.json dùng chung cho dễ tìm.
Đáp án: A và D.
- B bỏ qua bước lập kế hoạch cho một migration nhiều file, đúng ví dụ plan mode trong guide.
- C tìm theo tên file. Nơi gọi hàm nằm ở các file khác, nên đây là việc của Grep.
- E đưa server cá nhân, đang thử nghiệm vào scope project. Chỗ của nó là scope user.
Ghi nhớ
- Plan mode cho việc mang tính kiến trúc hoặc nhiều file, direct execution cho bản sửa một file rõ ràng, lập kế hoạch rồi thực thi cho migration.
- Dùng Explore subagent khi output khám phá đe dọa context chính.
.mcp.jsonđược chia sẻ và commit; secret đưa vào bằng${VAR}; server thử nghiệm để ở scope user.- Mặc định của
claude mcp addlà scope local, không phải scope project. - Grep cho nội dung, Glob cho đường dẫn; khi Edit không có anchor duy nhất thì Read rồi Write.
Câu hỏi thường gặp
Khi thay đổi lớn, có quyết định kiến trúc, sửa nhiều file, hoặc có nhiều cách làm hợp lý. Với bản sửa nhỏ, phạm vi rõ, exam guide hướng tới direct execution.
Không đặt trong file. Tham chiếu biến môi trường như ${GITHUB_TOKEN}, và mỗi developer hoặc CI runner tự set giá trị thật trong môi trường của mình.
Grep tìm trong nội dung file, như tên hàm hoặc thông báo lỗi. Glob khớp đường dẫn file, như **/*.test.tsx. Việc sửa file là của Read, Edit và Write.
Đọc thêm: CLAUDE.md hierarchy và rules, skills, commands và subagents và MCP primitives. Sau đó luyện câu hỏi Scenario 2 và Scenario 4 để quen ra quyết định dưới áp lực thời gian.