- Nguyên tắc kiểm chứng việc chạy không giám sát: kiểm tỉ lệ thuận với lượng dây đã thả. Session ngắn ngồi nhìn thì liếc là đủ; unattended run hoặc job bắn trong CI không ai trong vòng lặp thì phải kiểm thật, vì không ai thấy chuyện gì đã xảy ra nên phải dựng lại sau khi việc đã rồi. Run không người trực thì giữ auto mode chứ đừng bypass permissions — classifier vẫn soi từng action, nhưng nó CHỈ gắn cờ hành động nguy hiểm, KHÔNG bao giờ phán code có đúng hay không, nên mức kiểm của bạn đứng nguyên chỗ cũ.
- Bắt đầu từ diff, không bắt đầu từ bản tóm tắt: chạy /code-review để rà thay đổi, rồi tự mắt đọc git diff. Cái bẫy là một bản tóm tắt gọn gàng trong khi diff thật đụng vào file bạn không ngờ tới — tóm tắt không nói, diff mới nói. Đọc file trong kế hoạch trước rồi soi thứ nằm ngoài kế hoạch. Một bản viết sạch KHÔNG phải bằng chứng của code sạch.
- Biến test thành CỬA chứ không phải lời hứa: Stop hook chạy test và từ chối kết thúc turn khi fail; PostToolUse hook lint + type check sau mỗi edit. Mấu chốt là exit 2 — nó đẩy thẳng thất bại ngược về Claude để Claude tự sửa mà không cần nhắc, và check bắn ở mọi lần chạy. Cuối cùng, xin ý kiến thứ hai LẠNH: mở session/sub-agent mới không mang ký ức về cách code được dựng, vì nó không có phần trong cách làm nên bắt được thứ lần chạy gốc đã tự nói cho qua.
- Plugin = một đơn vị cài đặt duy nhất, đóng gói cả setup .claude rồi chuyển sang máy người khác thay vì copy-paste rồi hy vọng còn đồng bộ. Nó gói skill, subagent, hook, MCP server config, cộng LSP server, background monitor, theme và một lát settings.json — một version, một lần cài. Cài theo tên bằng /plugin install org-name@plugin-name rồi chạy /reload-plugins; với team thì thêm private marketplace một lần bằng /plugin marketplace add your-org/claude-plugins để có discovery tập trung, version tracking và cập nhật ở một chỗ.
- ⭐ Đọc trước khi cài: plugin chạy code trên máy bạn với quyền của bạn, hook của nó bắn ở mọi tool call khớp matcher — cài vì cái skill thì nhận luôn PreToolUse và Stop hook của nó dù bạn có đọc hay không. Một community plugin có thể ship Stop hook gọi ra network endpoint mỗi lần mà không gì trong cấu hình cảnh báo bạn. Claude Code cho xem details (cài gì, ước lượng chi phí context) kèm cảnh báo Anthropic không kiểm soát nội dung plugin bên thứ ba. Form submit trong app đăng lên community marketplace sau automated review; official marketplace curate trên track riêng — nhưng "đã review" KHÔNG đồng nghĩa "đáng tin".
- Component của plugin chạy song song chứ không đè cấu hình của bạn: hook CỘNG DỒN (PreToolUse của plugin và của bạn cùng bắn), còn skill/agent/command được namespace theo tên plugin nên không đụng tên. Plugin ship được settings.json nhưng Claude Code chỉ honor 2 khoá: agent và subagentStatusLine — đặt khoá agent là đẩy một subagent của plugin lên main thread kèm system prompt, giới hạn tool và model của nó, tức bật plugin lên là hành vi mặc định đã đổi.
- Tự đóng gói plugin không phải cấu trúc lại gì: vẫn đúng hình dạng .claude — một folder cho mỗi skill, một file markdown cho mỗi subagent dưới agents, hooks/hooks.json và .mcp.json ở plugin root; Claude Code khám phá component theo quy ước. Manifest .claude-plugin/plugin.json (name, version, description, author) là OPTIONAL; name là field duy nhất bắt buộc và nó namespace skill thành company-name:skill-name, còn version là thứ làm update/version tracking chạy được trên cả team.
TL;DR — Hai mặt của việc để Claude chạy xa tầm mắt. Kiểm chứng: bắt đầu từ diff chứ không từ bản tóm tắt của chính nó, biến test thành cửa (Stop hook từ chối kết thúc khi test đỏ), và lấy "ý kiến thứ hai lạnh". Plugin: một đơn vị cài đặt gói cả setup
.claude— nhưng nó chạy code trên máy bạn với quyền của bạn, nên đọc trước khi cài.
Phần 7/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.
Kiểm chứng việc Claude làm lúc bạn không ngồi xem
Bạn giao một task rồi để nó chạy, không theo dõi từng bước. Giờ nó báo xong. Trước khi ship, bạn cần một cách kiểm thứ mà chính mình chưa hề giám sát. Cái bước kiểm đó mới là thứ làm cho Claude Code chạy hands-off trở nên đáng dựa vào.
Ý chính gọn một câu: kiểm tỉ lệ thuận với lượng dây bạn đã thả.
| Lần chạy | Mức kiểm |
|---|---|
| Session ngắn, bạn ngồi nhìn message chạy qua | liếc một cái là đủ |
| Unattended run, hoặc job bắn trong CI không có ai trong vòng lặp | kiểm thật — không ai thấy chuyện gì đã xảy ra, nên phải dựng lại sau khi việc đã rồi |
Hình dung cho dễ nhớ: càng ít nhìn, càng phải kiểm nhiều.
Run không người trực thì giữ ở auto, đừng nhảy sang bypass
Khi một lần chạy ở chỗ làm diễn ra không người trực, giữ nó ở auto mode thay vì bypass permissions. Ở auto, classifier vẫn review từng action xem có nguy hiểm không — đó là tấm lưới an toàn đáng giữ.
Nhưng phải rõ tấm lưới đó đỡ gì và KHÔNG đỡ gì: ⭐ classifier không bao giờ phán code có ĐÚNG hay không — nó chỉ gắn cờ hành động nguy hiểm. Nên mức kiểm của bạn đứng nguyên chỗ cũ, không được hạ xuống một milimet chỉ vì đã bật auto. Đặt mức đó theo độ không-giám-sát của lần chạy.
(Đây đúng là chỗ nối với phần permission mode ở trên: auto gác INTENT trước mỗi action, còn CORRECTNESS phải có người hoặc hook gác sau.)
Bắt đầu từ diff, đừng bắt đầu từ bản tóm tắt
Đừng mở màn bằng bản Claude tự thuật lại việc nó đã làm. Mở màn bằng chính cái diff.
- Chạy
/code-reviewđể nó rà các thay đổi và nêu vấn đề. - Rồi tự mắt mình đọc
git diff.
Cái bẫy: một bản tóm tắt gọn gàng, đọc trôi tuồn tuột — trong khi diff thật lại đụng vào một file mà thành thật là bạn không ngờ nó đụng tới. Bản tóm tắt sẽ không nói cho bạn biết chuyện đó. Diff thì có.
Nên: đọc cái đã thay đổi. Đọc những file nằm trong kế hoạch trước, rồi soi tiếp thứ nằm ngoài kế hoạch. ⭐ Một bản viết sạch không phải bằng chứng của code sạch.
Biến test thành CỬA, không phải lời hứa
Cửa thật của một lần chạy không giám sát là: test có pass không, và Claude có thật sự chạy test hay chỉ nói là đã chạy. Đừng để chuyện đó cho lòng tin. Wire nó thành hook để Claude không skip được.
Hai hook làm đúng việc này:
Stophook — chạy test của bạn, fail thì từ chối cho kết thúc turn.PostToolUsehook — lint và type check sau mỗi lần edit.
Chi tiết mấu chốt vẫn là exit code: hook exit 2 đẩy thẳng thất bại ngược về Claude. Claude đọc cái fail đó rồi tự sửa mà bạn không phải nhắc. Và hay nhất: check bắn ở MỌI lần chạy, bất kể bạn có nhớ yêu cầu hay không.
Xin một ý kiến thứ hai "lạnh"
Cái sub-agent code review bạn vẫn chạy trước khi mở pull request dùng được luôn ở đây — chĩa nó vào một lần chạy không giám sát.
Mở session hoặc sub-agent mới tinh, cho nó review code đã đổi mà không mang theo ký ức nào về việc code đó được dựng ra sao. Vì nó không có phần trong cách làm, nó bắt được những thứ mà lần chạy gốc đã tự nói cho qua. ⭐ Người review thứ hai với con mắt sạch tìm ra đúng cái mà tác giả đã tự biện hộ.
Ghép lại
Kiểm nghiêm đúng bằng mức mà lần chạy đó đã không được giám sát:
- Tự đọc diff.
- Biến test thành hook gác turn.
- Headless run thì kiểm bằng JSON result và exit code.
- Việc quan trọng thì xin một ý kiến thứ hai lạnh.
Làm được vậy thì "Claude làm lúc tôi không nhìn" không còn là chuyện phải đặt niềm tin nữa.
Áp dụng thực tế: repo này đã có sẵn một mắt xích của bài — hook
Stopởscripts/hooks/stop-validate-learn.mjschạyvalidate:learnvàexit 2khi nội dung/learnchưa hợp lệ, tức biến câu luật trongCLAUDE.md("validate phải pass trước khi push") từ lời hứa thành cửa. Ba thứ tôi rút ra cho việc thật: (1) "tóm tắt sạch ≠ code sạch" — đúng lỗi hay gặp khi nghiệm thu việc làm ngoài: report đẹp, mở diff mới thấy đụng chỗ không ai xin phép; thói quen đọc diff trước, đọc tóm tắt sau áp được cho cả người lẫn máy. (2) Mức kiểm neo vào độ không-giám-sát, không neo vào cảm giác tin tưởng — cùng một người, việc tôi ngồi cạnh và việc giao qua đêm phải kiểm khác nhau; "tin nhau rồi" không phải một mức kiểm. (3) Ý kiến thứ hai phải LẠNH — reviewer đã biết trước vì sao làm thế sẽ gật theo lý lẽ cũ, nên trong Claude Code tôi mở session mới thay vì hỏi tiếp trong session đang chạy.
Plugin — đóng gói cả setup rồi chuyển sang máy người khác
Một setup bạn tin dùng đáng giá hơn nhiều khi cả team cùng chạy nó. Vấn đề nằm ở chỗ chuyển nó đi. Bạn dựng được một thư mục .claude ngon lành — skill, subagent, hook — rồi sao nữa? Mọi người copy-paste file qua lại giữa các máy rồi hy vọng chúng còn đồng bộ. Plugin sửa đúng chỗ đó: plugin là cách Claude Code đóng gói một setup và chuyển nó từ người này sang người kia.
Bài có hai mặt: dùng plugin người khác publish, và tự đóng gói cái của mình khi đã dựng được thứ đáng chia sẻ.
Plugin là gì
Một đơn vị cài đặt duy nhất. Nó gói mọi thứ bạn vốn phải chia sẻ bằng tay — skill, subagent, hook, MCP server config — cộng thêm cái đuôi dài hơn: LSP server, background monitor, theme, và một lát settings.json. Một version, một lần cài.
Cài — theo tên, hoặc qua marketplace
Chỗ plugin nằm quyết định cách bạn cài. Ngay trong session, cài thẳng theo tên:
/plugin install org-name@plugin-name
Claude Code cài xong sẽ bảo bạn chạy /reload-plugins để áp dụng thay đổi.
Với team, nước đi tốt hơn là thêm một private marketplace, một lần duy nhất. Marketplace = nguồn dùng chung mà mọi plugin resolve qua đó:
/plugin marketplace add your-org/claude-plugins
Đặt tên gì cũng được. Thêm xong thì mọi lần cài sau đều đi qua nó → discovery tập trung, theo dõi version, và cập nhật ở một chỗ thay vì rải rác trên laptop từng người. Muốn xem có sẵn những gì thì mở tab Discover — nó liệt kê plugin trên các marketplace của bạn để tìm và chọn.
⭐ Đọc trước khi cài — phần quan trọng nhất bài
Plugin chạy code trên máy bạn, với quyền của bạn. Và hook của nó bắn ở mọi tool call khớp matcher. Nghĩa là: cài một plugin vì cái skill của nó thì bạn nhận luôn PreToolUse và Stop hook của nó — bất kể bạn có đọc hay không.
Nghĩ kỹ xem điều đó có nghĩa gì. Một community plugin hoàn toàn có thể ship một Stop hook gọi ra một network endpoint ở mỗi lần chạy, và không có gì trong cấu hình của bạn cảnh báo bạn cả. Đó không phải lý do để tránh plugin — đó là lý do để nhìn trước.
Trước khi cài, xem details của plugin: Claude Code cho bạn thấy nó sẽ cài những gì, ước lượng chi phí context, kèm một cảnh báo thẳng thắn rằng Anthropic không kiểm soát nội dung bên trong plugin của bên thứ ba.
Hai điều đáng biết về nguồn plugin:
- Form submit trong app đăng lên community marketplace sau automated review của Anthropic.
- Official marketplace được curate trên một track riêng.
⚠️ Nhưng "đã review" không đồng nghĩa "đáng tin". Automated review bắt được một số thứ, không phải mọi thứ. Nên luật vẫn đứng nguyên: chỉ cài plugin và thêm marketplace từ nguồn bạn thật sự tin, và kiểm xem plugin thật sự làm gì trước khi bật nó lên.
Component chạy SONG SONG với của bạn, không đè lên
Plugin không ghi đè cấu hình của bạn — component của nó chạy cạnh component của bạn. Phần lớn là chuyện tốt, nhưng có hệ quả phải hiểu:
- Hook cộng dồn.
PreToolUsecủa plugin vàPreToolUsecủa bạn cùng bắn ở mọi tool call. Không cái nào thay cái nào. Đây chính xác là lý do phải đọc details trước. - Skill, agent, command được namespace theo tên plugin → không bao giờ đụng tên với của bạn.
- Plugin ship được
settings.json, nhưng chỉ một lát rất hẹp: Claude Code chỉ honor đúng 2 khoá — khoáagentvà khoá status line cho subagent. (Docs gọi tên:agentvàsubagentStatusLine— tra 25/07/2026.)
⭐ Khoá agent đáng dừng lại một nhịp. Đặt nó tức là đẩy một subagent của plugin lên main thread, kèm theo system prompt, giới hạn tool và model của subagent đó. Nói cách khác: chỉ cần bật plugin lên là hành vi mặc định của Claude Code đã đổi. Đó là một trong những lý do chính để nhìn trước cả khi bật.
Cài xong rồi thì plugin panel cho bạn xem mọi thứ nó đã thêm, quản lý nó, và gỡ nó.
Tự đóng gói plugin của mình
Mặt còn lại. Khi đã dựng được một thư mục .claude chạy tốt, đừng bắt team copy-paste giữa các máy — đóng gói nó lại.
Tin tốt: không phải cấu trúc lại gì cả. Plugin dùng đúng hình dạng .claude bạn vốn đang dùng:
- Một folder cho mỗi skill.
- Một file markdown cho mỗi subagent, nằm dưới
agents. hooks/hooks.jsonvà.mcp.json, đặt ở plugin root.
Cấu trúc thư mục làm gần hết việc — Claude Code khám phá component theo quy ước.
Manifest — .claude-plugin/plugin.json
Trên nữa là một manifest không bắt buộc, nằm ở .claude-plugin/plugin.json, giữ name, version, description, author:
{
"name": "svg-splitter-review",
"version": "0.1.0",
"description": "Reviews the SVG Splitter repo",
"author": {
"name": "Lewis Menelaws"
}
}
Manifest là optional — bỏ nó đi thì Claude Code vẫn khám phá component theo quy ước thư mục. Nhưng hai chi tiết đáng biết:
- ⭐
namelà field DUY NHẤT bắt buộc. Nó namespace skill của bạn thànhcompany-name:skill-name, giữ cho chúng không đụng tên với của bất kỳ ai khác. - Đánh version như mọi dependency khác. Đó chính là thứ làm update và version tracking chạy được trên cả team.
Chốt lại
Hai luật gọn phủ gần hết bài:
- Khi DÙNG plugin: đọc trước khi cài. Plugin chạy code với quyền của bạn, nên nhìn hook, agent và MCP server của nó trước đã.
- Khi LÀM plugin: đóng gói
.claudengay khi nó chạy được. Một manifest, một lần cài.
Đó là toàn bộ ý nghĩa của plugin: một đơn vị cài đặt duy nhất, và cái setup bạn tin dùng chạm được tới cả team.
Áp dụng thực tế: repo này đang vướng đúng bài toán mở đầu — hook
Stopnằm ởscripts/hooks/stop-validate-learn.mjs(commit được), nhưng phần khai báo nó lại ở.claude/settings.json, mà.claude/thì đang gitignore. Tức là cái guardrail chỉ sống trên một máy; ai clone repo về sẽ không có cửa nào gác cả. Plugin chính là đường chuẩn để gỡ nút đó nếu sau này có người thứ hai đụng vào/learn. Hai chốt tôi nhấn với khách Nhật: (1) cài plugin = chạy code của người lạ với quyền của mình, cùng loại rủi ro vớipostinstallcủa một package npm — nên câu hỏi thẩm định không phải "plugin này tiện không" mà "nó ship hook gì, gọi ra đâu"; (2) "đã qua automated review" không phải một mức bảo đảm — nó lọc bớt, không chứng nhận; với dự án khách hàng tôi vẫn coi marketplace bên ngoài như một nguồn dependency phải duyệt, không phải app store để bấm cài cho nhanh.
🆕 Tính năng khoá chưa nhắc (đối chiếu docs 08/2026)
Khoá quay trước mấy đợt release gần đây. Những thứ dưới đây không có trong khoá nhưng đã có trong bản thật — đi thi cứ trả lời theo khoá, còn đi làm thì biết mà dùng. Bản mới nhất khi rà: v2.1.233 (14/08/2026).
| Tính năng | Là gì | Ra tuần / bản |
|---|---|---|
| Claude Sonnet 5 | Model mặc định mới cho seat Pro, Team Standard và Enterprise. Coding + tool use hạng cao ở giá Sonnet, context window 1M token native, adaptive thinking bật sẵn. | W27 |
| Claude Opus 5 | claude-opus-5 thành model Opus mặc định (thay chỗ Opus 4.8 ở các seat/API dùng Opus) — context 1M token, fast mode giá $10/$50 mỗi Mtok. Kèm theo: /fast giờ áp cho Opus 5 + Opus 4.8, Opus 4.7 bị gỡ khỏi fast mode. |
W30 / v2.1.219 |
/doctor |
Checkup toàn diện phần setup: chẩn đoán lỗi và sửa được luôn. Có alias /checkup. |
W28 |
/fork |
Sao chép hội thoại hiện tại sang một background session mới — bạn vẫn làm tiếp ở session cũ trong khi nhánh kia chạy riêng. Từ W32 nhánh mới sửa code trong worktree riêng, không dùng chung checkout với session gốc. | W29 / W32 |
⭐ auto thành mode mặc định |
Từ 14/08/2026, session mới trên Pro / Max / Team khởi động ở auto mode thay vì Manual (chi tiết + ngoại lệ ở mục Permission mode phía trên). Classifier call không còn tính vào usage limit. | W32 / v2.1.228+ |
| ⭐ Cross-session messaging | Các session Claude Code nhắn được cho nhau: Claude tìm session khác bằng tool ListAgents rồi gửi bằng SendMessage — tự làm hoặc khi bạn yêu cầu. Chỉ text Claude tự viết, KHÔNG gửi transcript hay file. Xem danh sách bằng /list-agents; gõ @ trong prompt để mention session theo tên; nhận/hoãn/chặn tin vào bằng /hold, /refuse và row "Messages from your other sessions" trong /config. macOS + Linux. |
W32 / v2.1.224 · v2.1.232 |
| Self-hosted environments | Chạy cloud session của Claude Code trên hạ tầng của chính tổ chức (public beta, gói Team & Enterprise): claude self-hosted-runner setup biến máy/container của bạn thành runner, session vào được service nội bộ. Admin phải bật Allow self-hosted environments trước. |
W32 / v2.1.224 |
| Subagent forking bật sẵn | subagent_type: "fork" kế thừa nguyên hội thoại + prompt cache của session cha; và spawn subagent (không phải teammate) trong session tương tác chạy nền theo mặc định. Kèm theo: trần 200 subagent/session đã bỏ (giới hạn concurrency & độ sâu vẫn còn). |
W32 / v2.1.232 |
| MCP discovery cache | Server HTTP/SSE đã dùng trước đó hiện trạng thái cached … · connects on first use · N tools trong /mcp: tool list nạp từ session trước, server chỉ kết nối khi Claude gọi tool đầu tiên → khởi động nhanh hơn. Tắt bằng MCP_DISCOVERY_CACHE=0. |
v2.1.221 |
| Claude Security plugin | Quét lỗ hổng codebase bằng multi-agent, findings bạn chọn thì nó soạn patch để bạn tự áp. | W30 |
/review + /code-review |
/review thành alias của /code-review; gọi /code-review mà không ghi effort level thì dùng lại mức bạn gõ lần trước; và mọi mức effort giờ chạy trong background agent. |
W30 / W32 / v2.1.232 |
Plugin: nguồn archive & command |
Marketplace phát hành plugin dạng zip tải qua HTTPS (có thể ghim SHA-256) → cài không cần git/npm; thêm nguồn command (một lệnh local in ra thư mục plugin, re-resolve mỗi session, khỏi restart). Plugin cài từ /plugin kích hoạt luôn trong session hiện tại khi an toàn. |
W32 / v2.1.229 |
| GitLab | Merge request URL dùng được với cờ --worktree và trong claude agents (MR hiện dạng !N); marketplace clone được repo gitlab.com (kể cả nested subgroup); thêm redaction cho họ token GitLab. |
v2.1.232 · v2.1.233 |
| ⚠️ Todo tool bị gỡ ở model mới | TaskCreate/Get/Update/List và TodoWrite KHÔNG còn khả dụng trên Opus 4.8, Sonnet 5, Fable 5, Mythos 5 và model mới hơn — tức phần built-in tools của khoá (có TodoRead/TodoWrite) là bản cũ. Muốn bật lại: CLAUDE_CODE_ENABLE_TODO_TOOLS=1. |
v2.1.233 |
| ⚠️ Ultraplan đã bị gỡ | Research preview Ultraplan (lệnh /ultraplan + keyword ultraplan) bỏ hẳn — dùng plan mode hoặc Claude Code on the web thay thế. |
W32 |
/radio |
Bật Claude FM — radio lo-fi. Không phục vụ thi cử, nhưng có thật. | W27 |
Hoàn thành lộ trình 7 phần — quay lại trang tổng quan khoá để luyện đề thi thử 219 câu.
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á.