Learn > Claude > Claude Code: plugin & kiểm chứng việc AI làm

Claude Code: plugin & kiểm chứng việc AI làm

Kiểm chứng một lần chạy Claude không giám sát — đọc diff thay vì bản tóm tắt, biến test thành cửa thật — và plugin: đóng gói cả setup .claude chuyển sang máy khác.

  • 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ậtkhô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.

  1. Chạy /code-review để nó rà các thay đổi và nêu vấn đề.
  2. 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:

  • Stop hook — chạy test của bạn, fail thì từ chối cho kết thúc turn.
  • PostToolUse hooklint 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 Stopscripts/hooks/stop-validate-learn.mjs chạy validate:learnexit 2 khi nội dung /learn chưa hợp lệ, tức biến câu luật trong CLAUDE.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.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 PreToolUseStop 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. PreToolUse của plugin và PreToolUse củ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 pluginkhô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á agent và khoá status line cho subagent. (Docs gọi tên: agentsubagentStatusLine — 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.json.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:

  • name là field DUY NHẤT bắt buộc.namespace skill của bạn thành company-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 .claude ngay 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 Stop nằ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ới postinstall củ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""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-reviewkhô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/ListTodoWrite 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á.

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

Kiểm chứng một lần chạy Claude không giám sát tới mức nào là đủ?
Kiểm tỉ lệ thuận với lượng dây bạn đã thả — càng ít nhìn thì càng phải kiểm nhiều. Session ngắn mà bạn ngồi nhìn message chạy qua thì liếc một cái là đủ. Nhưng một unattended run, hoặc một job bắn trong CI không có ai trong vòng lặp, thì cần kiểm thật: không ai thấy chuyện gì đã xảy ra, nên bạn phải dựng lại sau khi việc đã rồi. Đặt mức kiểm theo độ không-giám-sát của lần chạy, chứ đừng đặt theo cảm giác tin tưởng.
Chạy không người trực nên để permission mode nào?
Giữ ở auto mode, đừng nhảy sang bypass permissions: ở auto, classifier vẫn review từng action xem có nguy hiểm không — tấm lưới đó đáng giữ. Nhưng phải rõ nó không đỡ cái 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. Vì vậy bật auto không cho phép bạn hạ mức kiểm xuống chút nào. Auto gác intent trước mỗi action; correctness vẫn phải có người hoặc hook gác sau.
Vì sao phải đọc diff thay vì đọc bản tóm tắt của Claude?
Vì cái bẫy là 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à bạn không hề ngờ nó đụng tới. Bản tóm tắt không nói cho bạn biết điều đó, diff thì có. Quy trình: chạy /code-review để rà các thay đổi và nêu vấn đề, rồi tự mắt mình đọc git diff — đọc những file nằm trong kế hoạch trước, sau đó 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.
Làm sao biến test thành cửa thật thay vì 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: một Stop hook chạy test và từ chối cho kết thúc turn khi fail, và một PostToolUse hook lint + type check sau mỗi lần edit. Chi tiết mấu chốt là exit code: hook exit 2 đẩy thẳng thất bại ngược về Claude, Claude đọc rồi tự sửa mà bạn không phải nhắc — và check bắn ở mọi lần chạy, bất kể bạn có nhớ yêu cầu hay không.
Thế nào là một ý kiến thứ hai "lạnh", và vì sao nó bắt được nhiều lỗi hơn?
Là mở một session hoặc sub-agent MỚI TINH và 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 đúng 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 cái mà tác giả đã tự biện hộ. Gộp lại, bốn việc cần làm là: tự đọc diff, biến test thành hook gác turn, kiểm headless run bằng JSON result và exit code, và xin ý kiến thứ hai lạnh cho bất cứ thứ gì quan trọng.
Plugin trong Claude Code là gì và nó giải bài toán nào?
Plugin là MỘT đơn vị cài đặt duy nhất, gói cả setup của bạn lại: skill, subagent, hook, MCP server config, cộng thêm cái đuôi dài hơn như LSP server, background monitor, theme và một lát settings.json. Một version, một lần cài. Bài toán nó giải là chuyện chuyển setup đi: bạn dựng được một thư mục .claude ngon lành rồi cả team copy-paste file qua lại giữa các máy và hy vọng chúng còn đồng bộ. Plugin là cách Claude Code đóng gói setup đó và chuyển từ người này sang người kia.
Cài plugin và thêm marketplace bằng lệnh gì?
Trong session, cài thẳng theo tên bằng /plugin install org-name@plugin-name; cài xong Claude Code bảo bạn chạy /reload-plugins để áp dụng. Với team thì nước đi tốt hơn là thêm một private marketplace một lần bằng /plugin marketplace add your-org/claude-plugins — marketplace là nguồn dùng chung mà mọi plugin resolve qua đó, nên bạn có 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. Tab Discover liệt kê plugin có trên các marketplace của bạn.
Vì sao phải đọc kỹ một plugin trước khi cài?
Vì 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. 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ể có đọc hay không. Một community plugin hoàn toàn có thể ship một Stop hook gọi ra network endpoint ở mỗi lần chạy mà không có gì trong cấu hình của bạn cảnh báo. Trước khi cài, xem details: Claude Code cho thấy nó sẽ cài những gì, ước lượng chi phí context, kèm cảnh báo rằng 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": automated review bắt được một số thứ, không phải mọi thứ.
Component của plugin có ghi đè cấu hình của tôi không?
Không — chúng chạy song song với của bạn. Hệ quả: hook CỘNG DỒN, PreToolUse của plugin và PreToolUse của bạn cùng bắn ở mọi tool call, không cái nào thay cái nào. Skill, agent và command thì được namespace theo tên plugin nên không bao giờ đụng tên với của bạn. Plugin cũng ship được settings.json nhưng chỉ một lát rất hẹp: Claude Code chỉ honor hai khoá, agent và subagentStatusLine. Khoá agent đáng dừng lại một nhịp — đặt nó 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 chỉ cần bật plugin lên là hành vi mặc định của Claude Code đã đổi.
Đóng gói plugin của riêng mình cần cấu trúc lại thư mục không?
Không, plugin dùng đúng hình dạng .claude bạn đang có: một folder cho mỗi skill, một file markdown cho mỗi subagent nằm dưới agents, còn hooks/hooks.json và .mcp.json đặt ở plugin root. Cấu trúc thư mục làm gần hết việc vì Claude Code khám phá component theo quy ước. Trên nữa là manifest OPTIONAL ở .claude-plugin/plugin.json giữ name, version, description, author. Bỏ manifest đi vẫn chạy, nhưng name là field duy nhất bắt buộc — nó namespace skill của bạn thành company-name:skill-name để không đụng tên với ai khác — và version đánh như mọi dependency khác chính là thứ làm update, version tracking chạy được trên cả team.