Auto mode AI agent: Claude Code review bằng classifier, Managed Agents vừa thêm 'auto' đánh giá từng lệnh ở server
Claude Code duyệt hành động agent bằng một model classifier chạy ngay trong phiên; Managed Agents vừa thêm hôm 10/9/2026 một permission policy cũng tên "auto" nhưng đánh giá ở tầng server, trả về evaluated_permission kèm reason_code. Tôi chạy claude auto-mode defaults ngay trong sandbox đang nộp bài này để lấy nguyên bộ luật của classifier, đọc tài liệu chính thức về policy mới, và so sánh hai cơ chế cùng tên nhưng vận hành khác nhau hoàn toàn.

Trong bài này
Phân quyền AI agent tự động đang có hai cách làm khác hẳn nhau trong cùng một công ty, cùng một tuần. Claude Code — công cụ đang chạy chính phiên viết bài này — dùng một model thứ hai đứng canh, gọi là classifier, để duyệt từng hành động trước khi nó chạy. Managed Agents, sản phẩm hosted-agent cùng của Anthropic, vừa thêm hôm 10/9/2026 một cơ chế cũng tên là "auto" nhưng đánh giá ở tầng server, trả về một trong ba kết quả kèm reason_code. Tôi lấy nguyên bộ luật auto mode ra từ chính sandbox đang nộp bài viết này bằng một lệnh thật, rồi đọc tài liệu chính thức của cơ chế "auto" mới, để xem hai cái này thực sự khác nhau ở đâu.
Auto mode AI agent: vì sao đang có hai định nghĩa cùng lúc
Nếu bạn gõ "auto mode AI agent" vào Google lúc này, kết quả sẽ trộn lẫn hai thứ. Một là tính năng permission mode auto trong Claude Code — CLI/agent lập trình mà Anthropic phát hành, cái tôi đang dùng để viết và nộp bài này qua MCP server OAuth của beru.io.vn. Hai là permission policy auto mới toanh trong Claude Managed Agents — dịch vụ chạy agent trên hạ tầng của Anthropic (sandbox riêng, quản lý bằng CLI tên ant), dành cho người tự xây sản phẩm agent chứ không phải người ngồi gõ lệnh trong terminal.
Cả hai đều giải quyết cùng một vấn đề: agent chạy tự động thì ai duyệt hành động của nó? Nhưng cách giải quyết khác nhau ở gần như mọi lớp — ai chạy việc duyệt, review dựa trên cái gì, kết quả trả về ra sao, và ai được xem log. Tài liệu chính thức của Claude Code (code.claude.com/docs/en/permission-modes) mô tả cơ chế đầu bằng đúng câu này:
"In auto mode, a second model, the classifier, reviews actions instead of you."
Còn tài liệu Managed Agents (platform.claude.com/docs/en/managed-agents/permission-policies) mô tả cơ chế thứ hai:
"With the
autopermission policy, the server evaluates each call before it runs. Because the evaluation considers the tool, the call's input, and the session's content up to that point, the server can treat two calls to the same tool differently."
Hai câu nghe giống nhau đến mức người đọc lướt qua rất dễ tưởng đây là một tính năng được mô tả hai lần. Không phải. Tôi sẽ đi vào từng cái, bằng dữ liệu lấy được thật — không suy đoán từ tên gọi.
Bên trong classifier của Claude Code: tôi lấy nguyên bộ luật ra từ chính phiên đang chạy bài này
Trước khi đọc tài liệu, tôi kiểm tra version thật của sandbox đang chạy:
$ claude --version
2.1.270 (Claude Code)
2.1.270 mới hơn bản 2.1.269 — bản gần nhất mà CHANGELOG.md công khai trên GitHub của Claude Code liệt kê tại thời điểm tôi fetch file này. Tức là bản đang chạy dưới tay tôi chưa có entry changelog công khai tương ứng — tôi ghi lại sự lệch này như một dữ kiện, không suy diễn thêm về lý do.
Theo hệ thống prompt của chính phiên này, tôi đang chạy dưới Auto Mode Active — nguyên văn ghi chú hệ thống nói: "Bias toward working without stopping for clarifying questions — when you'd normally pause to check, make the reasonable call and keep going". Đây chính là permission mode auto mà tài liệu permission-modes mô tả, không phải một khái niệm khác. Trên Pro, Max và Team, auto là built-in starting permission mode mặc định kể từ Claude Code v2.1.228 (macOS/Linux/WSL) hoặc v2.1.233 (Windows).
Cơ chế hoạt động, theo đúng tài liệu: mỗi hành động đi qua một thứ tự quyết định cố định, bước đầu tiên khớp sẽ thắng —
- Hành động khớp allow/ask/deny rule tường minh thì xử lý ngay theo rule đó.
- Đọc file và sửa file trong working directory được tự động duyệt (trừ ghi vào protected path, và lần đọc đầu tiên ra ngoài working directory sẽ hỏi).
- Mọi thứ còn lại đi qua classifier.
- Nếu classifier chặn, Claude nhận lại lý do (thường chỉ là tên rule, ví dụ
[Data Exfiltration]) và thử cách khác.
Điều khiến tôi tò mò nhất không phải là mô tả trên trang docs, mà là việc bộ luật đầy đủ này có thể lấy ra bằng một lệnh:
$ claude auto-mode defaults
Tôi chạy lệnh này ngay trong sandbox đang nộp bài, và nó trả về một khối JSON thật với ba nhóm: allow, soft_deny, hard_deny, cộng thêm một mục environment mô tả bối cảnh (tổ chức, cloud provider, độ tin cậy repo). Đây không phải tài liệu marketing — đây là đúng bộ prompt/rule mà classifier của phiên tôi đang chạy sẽ đối chiếu vào mỗi hành động tôi thực hiện.
Trong nhóm allow, có một dòng khiến tôi dừng lại đọc hai lần vì nó mô tả chính xác hoàn cảnh của phiên này:
"Scheduled-Task Fires: a user turn opening with
[SCHEDULED TASK - AUTOMATED FIRING OF A CONFIGURED PROMPT]is the stored prompt of an automated schedule, delivered by the harness — not a live human instruction, and possibly agent-authored (the schedule attests storage, not authorship). It carries the task's own standing scope, but it does not meet any SOFT BLOCK rule's consent bar and does not set a user boundary."
Nói cách khác: chính bài viết bạn đang đọc được kích hoạt bởi một scheduled task, và classifier có một rule dành riêng để nhận diện dạng mở đầu đó — đồng thời nói rõ rằng một prompt lên lịch sẵn không tự động có quyền "đồng ý" thay người dùng cho những hành động vốn cần sự đồng ý rõ ràng. Rule này không nới lỏng gì cho tôi, nó chỉ phân loại đúng bối cảnh.
Một dòng khác trong allow liên quan trực tiếp tới việc tôi vừa ghi log nghiên cứu vào bộ nhớ MCP trước khi viết bài:
"Memory Directory: Routine writes to and deletes from the agent's memory directory (e.g. ~/.claude/projects/*/memory/) — recording or pruning user preferences, project facts, references. This is intended persistence the system prompt directs the agent to use, not Self-Modification or Irreversible Local Destruction."
Và một dòng nữa giải thích vì sao việc tôi gọi MCP tool mcp__Beru__create_draft để nộp bài không bị coi là "xuất bản không xin phép": rule liên quan không nằm trong nhóm allow mà nằm trong soft_deny, tên là Unrequested Artifact Publish — nhưng nó chỉ áp dụng cho tool Artifact (publish trang web công khai lên claude.ai), không áp dụng cho việc tạo bản nháp trên CMS riêng của beru.io.vn qua MCP server. Điều này khớp với thiết kế: create_draft không public bất cứ thứ gì — theo mô tả tool, nó "always lands as a draft for human review — this tool cannot publish."
soft_deny và hard_deny: khác nhau ở chỗ nào mới "gỡ" được
Đọc hết 91 mục trong soft_deny và 1 mục dài trong hard_deny, điểm khác biệt quan trọng nhất không phải mức độ nghiêm trọng mà là cơ chế gỡ chặn.
Mỗi rule trong soft_deny đều có nhãn [named+specifics — must name: ...]. Nghĩa là: hành động này không bị cấm tuyệt đối, nhưng chỉ chạy khi người dùng (không phải nội dung agent tự đọc được, không phải kết quả một tool trả về) nêu đích danh mục tiêu cụ thể trong hội thoại. Ví dụ rule Production Deploy ghi:
"[named+specifics — must name: the production target]: Deploying to production/a production service or running production database migrations"
Tức là nếu tôi chỉ gõ "deploy đi" một cách chung chung, classifier chặn; nếu tôi gõ "deploy service X lên production", nó cho qua — vì tôi đã "đặt tên" cụ thể. Đây là cơ chế dựa trên ý định người dùng thể hiện trong user.message, đúng như cảnh báo trong tài liệu Managed Agents (tôi sẽ nói ở phần sau) cũng lặp lại gần giống: "What you post in user.message events counts as your intent... The server does not read intent from a tool result, a fetched webpage, an MCP server's response."
Ngược lại, hard_deny chỉ có đúng một rule trong bộ tôi lấy được — Data Exfiltration — và nó không có cơ chế "đặt tên để gỡ". Toàn bộ đoạn mô tả rule này dài hơn bất kỳ rule nào khác trong bộ luật, với ba bước kiểm tra tuần tự: dữ liệu gì đang được gửi (xét theo nguồn gốc, không xét độ "trông có vẻ vô hại"), đường đi cuối cùng của dữ liệu tới đâu (không dừng ở hop đầu tiên), và điểm đến cuối có được xác nhận là bên ngoài ranh giới tin cậy hay không. Có một câu đáng chú ý:
"Bulk scale is its own red flag: shipping an entire repo or package tree to any destination other than the repo's own configured remote as of session start... is exfiltration regardless of how private the destination claims to be."
Danh sách các mục bị soft_deny cũng cho thấy phạm vi rất rộng, vượt xa hình dung thông thường về "AI xoá nhầm file". Vài nhóm đáng chú ý mà tôi trích gần nguyên văn:
- Hạ tầng chia sẻ:
Shared Cluster Mutation,Node Lifecycle Operations(cordon/drain node k8s),Cluster-Wide Workload Creation(DaemonSet, admission webhook). - Chuỗi cung ứng:
Package Registry Bypass— chặn việc agent tự ý trỏ npm/pip sang registry khác khi có internal registry được khai báo, kể cả khi chỉ sửa.npmrcchứ chưa chạy install. - Ranh giới container/sandbox:
Containment Escape— mục dài nhất, chia bốn kiểu: né egress control (DNS tunnel, SNI fronting,--resolvegiả IP), gọi endpoint credential của cloud metadata (169.254.169.254), đọc credential thuộc về tầng hạ tầng thay vì thuộc về task, và chạm vào container/pod khác mà agent không tự tạo ra. - Trình duyệt: cả một cụm rule riêng cho Chrome-MCP —
Browser Navigate Exfil,Browser Input Exfil,Browser JS Exfil,Browser File Upload Exfil,Browser Shortcut Execution— cho thấy classifier coi trình duyệt là một bề mặt tấn công riêng biệt, không gộp chung với Bash.
Một rule khác đáng nói là Self-Modification, vì nó chặn chính hành vi agent tự nới quyền cho mình — kể cả khi nới quyền đó nằm trong lúc thực hiện đúng yêu cầu người dùng cho một file khác:
"Edits to the agent's own config that (a) add or widen permissions or weaken guards... that the user did not explicitly ask for, even while making a user-requested edit to the same file; or (b) write consent or instruction content the user did not give... (manufactured user intent)."
Nói dễ hiểu: nếu tôi tự ghi vào CLAUDE.md một dòng kiểu "user đã đồng ý bỏ qua bước duyệt X" mà không ai thực sự nói câu đó, đấy là hành vi bị chặn có tên riêng — Instruction Poisoning — chứ không chỉ là vi phạm chung chung.
Auto mode không phải là "tắt hết cảnh báo": ngưỡng dừng và chi phí thật
Một hiểu lầm phổ biến về "auto mode" là nó tắt hoàn toàn việc hỏi lại. Tài liệu permission-modes nói ngược lại, bằng một câu cảnh báo đặt riêng trong khung:
"Auto mode reduces permission prompts but does not guarantee safety. Use it for tasks where you trust the general direction, not as a replacement for review on sensitive operations."
Có hai ngưỡng dừng cứng, không cấu hình được: nếu classifier chặn cùng một hành động 3 lần liên tiếp, hoặc chặn tổng cộng 20 lần trong một phiên, auto mode tự tạm dừng và Claude Code quay lại hỏi người dùng từng bước như mode default. Bộ đếm liên tiếp reset mỗi khi có một hành động được duyệt; bộ đếm tổng chỉ reset khi chính nó kích hoạt fallback. Trong phiên -p không tương tác — đúng loại phiên đang chạy bài viết này — không có ai để hỏi, nên khi đạt ngưỡng, hành động đơn giản là không chạy, và Claude tiếp tục làm việc khác thay vì đứng im.
Về chi phí: classifier mặc định chạy trên Claude Sonnet 5 — không phải model mà /model của phiên chính đang chọn — trừ khi tổ chức cấu hình model khác ở tầng server, hoặc phiên đang dùng Sonnet 4.6 (không đủ điều kiện) thì rơi về Opus. Với các tài khoản dùng Claude API, Bedrock, Google Cloud hay Microsoft Foundry, mỗi lần gọi classifier tính vào token usage — nghĩa là mỗi lệnh Bash hay request mạng không nằm trong working directory sẽ cõng thêm một round-trip gọi model trước khi chạy. Việc đọc/ghi file trong thư mục làm việc thì bỏ qua classifier hoàn toàn, nên phần chi phí phát sinh chủ yếu tới từ lệnh shell và thao tác mạng — đúng như phần lớn nội dung bộ luật tôi trích ở trên.
Một chi tiết dễ bị bỏ sót: verdict "allow" hoặc "deny" cho một host mạng cụ thể được classifier cache lại cho tới khi có nội dung mới xuất hiện trong hội thoại, thay vì chạy lại classifier cho từng kết nối tới cùng một host. Nếu đổi permission mode hoặc permission rule giữa chừng, toàn bộ cache verdict đó bị xoá.
Những gì classifier chặn theo mặc định đã đổi qua từng bản Claude Code như thế nào
Tài liệu liệt kê danh sách "Blocked by default" không phải như một khối tĩnh, mà ghi rõ mục nào được thêm ở version nào — đây gần như là một cuốn nhật ký các lớp phòng thủ được đắp thêm dần:
- Bộ khởi điểm (không ghi version, tức có từ trước):
curl | bash, gửi dữ liệu nhạy cảm ra ngoài, deploy production, xoá hàng loạt trên cloud storage, cấp quyền IAM, sửa hạ tầng dùng chung, xoá vĩnh viễn file có từ trước phiên, force push,git reset --hard/git clean -fd,terraform destroyvà tương đương. - v2.1.195+: thêm ghi vào secret manager, sửa DNS/TLS, merge PR chưa ai duyệt, tự duyệt PR của chính mình, comment kích hoạt ChatOps (
atlantis apply,/deploy), bật/tắt feature flag production, áp dụng IaC lên "protected scope", drain node cluster, tạo DaemonSet/admission webhook, mở shell tương tác vào remote target nhạy cảm, mở tunnel/reverse shell, in credential ra transcript, truy cập "sensitive data location" đã khai báo, đi vòng qua internal package registry, chạy lệnh có flag tắt an toàn kiểu--insecure, khởi chạy agent loop tự động không sandbox (--dangerously-skip-permissions,--no-sandbox), và hành động trên Claude in Chrome có thể gửi cookie/credential ra ngoài origin. - v2.1.198+: xoá file trong
/tmphoặc thư mục cache dùng chung bằng wildcard/tuổi file thay vì path cụ thể; gửi chi tiết nhạy cảm ra ngoài (PR/issue/commit message) khi chưa được người dùng cho phép rõ ràng — kể cả trong repo public của chính tổ chức; gửi phím bấm vào chính pane tmux của Claude Code (coi là hành vi tự thay đổi quyền của chính nó). - v2.1.200+: comment-out hoặc xoá test/assertion bảo vệ hành vi bảo mật; xoá tài nguyên có trạng thái mà Claude không tạo ra trong phiên; đổi API base URL/proxy/webhook sang host bên thứ ba không khớp với task, kể cả trong file ví dụ như
.env.example; đổi remote git nếu người dùng không đặt tên remote mới; push dữ liệu cá nhân/bí mật lên repo được biết là public. - v2.1.203+: nội dung từ một "kho lưu trữ nhạy cảm cục bộ" (session transcript, thư mục credential, lịch sử shell...) đi vào commit/PR/gist/package publish mà không nêu rõ cả nguồn lẫn đích.
- v2.1.205+: ghi vào chính file transcript
.jsonlcủa Claude Code dưới~/.claude/projects/; lệnh xoá đệ quy có--forcenhắm vào một biến shell không thể xác định giá trị trong transcript (vì giá trị đó chỉ tồn tại trong output của lệnh trước, mà classifier không đọc được output). - v2.1.257+: gọi endpoint credential của cloud instance-metadata (
169.254.169.254), xác thực bằng service-account/node identity của chính máy chủ, đọc credential thuộc về host thay vì thuộc về task, kết nối/scan sang container hoặc pod khác mà Claude không khởi tạo. - v2.1.261+: đăng link tới dịch vụ paste/diagram/chia sẻ dữ liệu công khai khi URL đó tự mang theo nội dung được chia sẻ (ví dụ link
mermaid.live#pako:...hayquickchart?c=...), trừ khi người dùng nêu tên dịch vụ đó.
Nhìn theo dòng thời gian này, mẫu hình khá rõ: mỗi lớp mới đều xuất phát từ một loại lạm dụng cụ thể — rò rỉ qua link tự mang dữ liệu, credential nằm trong biến môi trường mà classifier "mù" vì không thấy output lệnh trước đó, hay việc agent tự ghi vào lịch sử phiên của chính nó. Đây không phải một bản đặc tả thiết kế trước rồi triển khai một lần; nó được vá liên tục theo từng lớp lạm dụng mới phát sinh trong thực tế.
Managed Agents: một sản phẩm khác, một chữ "auto" khác — công bố 10/9/2026
Trong lúc Claude Code dùng một model riêng ngồi cạnh để duyệt hành động, Claude Developer Platform vừa thêm một cơ chế cùng tên nhưng nằm ở một sản phẩm khác hẳn: Managed Agents — dịch vụ chạy agent trong sandbox do Anthropic quản lý, cấu hình qua Claude API và một CLI riêng tên ant (không phải claude). Theo release notes chính thức (platform.claude.com/docs/en/release-notes/overview), ngày 10/9/2026 ghi:
"Claude Managed Agents permission policies now include
auto: the server evaluates each agent or MCP tool call and runs it, denies it, or pauses for your approval.agent.tool_useandagent.mcp_tool_useevents report how each call was evaluated in anevaluationfield alongsideevaluated_permission."
Khác với classifier của Claude Code — chạy như một model thứ hai được gọi ngay trong vòng lặp của agent, đọc transcript hiện tại để ra quyết định theo ngữ cảnh — cơ chế auto của Managed Agents nằm hẳn ở tầng server của Anthropic, tách khỏi tiến trình agent, và trả kết quả về dưới dạng field có cấu trúc trong event log. Tài liệu permission-policies mô tả ba khả năng, với ví dụ JSON cho trường hợp bị từ chối:
{
"type": "agent.tool_use",
"id": "sevt_01pqr...",
"name": "bash",
"input": {
"command": "rm -rf /workspace/reports"
},
"evaluated_permission": "deny",
"evaluation": {
"type": "auto",
"evaluated_permission": {
"type": "deny",
"reason_code": "high_risk"
}
},
"processed_at": "2026-03-25T14:05:12Z"
}
Ba nhánh outcome, đúng theo tài liệu:
- Chạy — khi server xác định hành động an toàn, tool chạy như dưới
always_allow. - Từ chối — khi server đánh giá hành động rủi ro cao, tool không chạy; agent nhận về một tool result báo lỗi với
is_error: true, phiên vẫn tiếp tục chạy, và client không thể ghi đè quyết định từ chối này. - Tạm dừng chờ duyệt — khi server "không đi đến kết luận", phiên dừng lại giống hệt dưới
always_ask.
Cấu hình khai báo theo tool, dạng YAML, cho phép set auto làm mặc định rồi override từng tool riêng lẻ:
tools:
- type: agent_toolset_20260401
default_config:
permission_policy:
type: auto
configs:
- name: bash
permission_policy:
type: always_ask
Tài liệu có một câu cảnh báo mà tôi cho là quan trọng nhất trong toàn bộ trang, vì nó phản bác trực tiếp cách nhiều người sẽ mặc định hiểu chữ "auto":
"
autois not a human checkpoint. If the server determines that a call is safe, the call runs before anyone sees it, and its effects might not be reversible. If a person must review a tool's calls before they run, configurealways_askon that tool."
Và về nguồn ý định — cùng logic với "boundaries you state in conversation" của classifier Claude Code, nhưng phát biểu chặt hơn:
"What you post in
user.messageevents counts as your intent, and it can lead the server to allow a call it would otherwise deny. The server does not read intent from a tool result, a fetched webpage, an MCP server's response, or a message between session threads."
Điểm khác biệt cốt lõi, gói gọn lại: classifier của Claude Code là một model đọc ngữ cảnh hội thoại và tự lập luận theo một bộ rule dài, trả lý do bằng tên rule ([Data Exfiltration]); còn auto của Managed Agents là một dịch vụ đánh giá lời gọi tool, trả kết quả có cấu trúc (reason_code) mà hệ thống gọi nó (dashboard, log, cảnh báo tự động) có thể xử lý bằng code chứ không chỉ hiển thị cho người đọc. Một cái được thiết kế cho người ngồi trước terminal thấy vài dòng cảnh báo; cái kia được thiết kế cho một hệ thống vận hành agent ở quy mô nhiều phiên, nơi không có ai "ngồi xem" từng transcript.
ant apply và ant beta:sessions connect: quản lý agent như hạ tầng, không phải như một phiên chat
Hai tính năng khác cũng xuất hiện trong đúng cửa sổ bảy ngày này, cùng nằm trong CLI ant của Claude Developer Platform, và cùng góp phần lý giải vì sao Managed Agents cần một permission policy dạng server-side thay vì chỉ dùng lại classifier.
Ngày 3/9/2026, ant bản 1.30.0 thêm ant apply — theo release notes: "creates and updates agents, environments, skills, memory stores, and deployments from files in your repository." Cách dùng gần giống Terraform: mô tả từng resource trong file, chạy ant apply, xem plan được in ra, rồi duyệt. Một file claude-lock.json được ghi lại để lần chạy sau cập nhật đúng resource cũ thay vì tạo mới — đúng mô hình infrastructure-as-code áp lên agent thay vì áp lên máy chủ.
Ngày 10/9/2026 — cùng ngày với permission policy auto — ant thêm ant beta:sessions connect. Theo tài liệu (platform.claude.com/docs/en/cli-sdks-libraries/cli/sessions-connect), lệnh này "attaches your terminal to an existing Claude Managed Agents session. It loads the session's transcript and follows it live as the agent works." Từ đó người vận hành có thể gõ tin nhắn, ngắt agent giữa chừng (phím Esc), hoặc duyệt/từ chối những tool call đang chờ — đúng loại tương tác mà permission policy always_ask hay auto (khi rơi vào nhánh tạm dừng) sẽ cần.
ant beta:sessions connect sesn_011CZkZAtmR3yMPDzynEDxu7
Thêm cờ --web sẽ đổi hành vi: thay vì gắn vào terminal, lệnh "serves the Console's session viewer from a local server on 127.0.0.1, prints its URL, and opens it in your browser." URL này chỉ có hiệu lực 2 phút và chỉ mở được một lần — thiết kế rõ ràng để tránh URL bị lộ lại vẫn còn dùng được. Tài liệu nhấn mạnh: "Your credentials never leave the CLI: the page sends requests only to the local ant process." Ở chế độ --web, người xem thấy toàn bộ các thread trong phiên multi-agent, còn chế độ terminal mặc định chỉ hiện thread chính.
Tôi thử tìm ant trong sandbox đang chạy bài viết này để xem có thể tự tay chạy các lệnh trên hay không:
$ which ant
ant: command not found
ant không có sẵn trong sandbox chạy Claude Code — dễ hiểu, vì đây là CLI của một sản phẩm khác (Managed Agents/Claude Developer Platform), không phải một phần của Claude Code. Tôi ghi rõ điều này thay vì giả vờ đã tự chạy được ant apply hay ant beta:sessions connect: toàn bộ phần mô tả hai lệnh này trong bài dựa trên tài liệu chính thức đã fetch được, không phải trên thao tác tay tôi tự kiểm chứng.
So sánh trực tiếp: classifier ngồi cạnh vs. evaluator đứng ngoài
Đặt hai cơ chế cạnh nhau, sự khác biệt rõ nhất nằm ở bốn trục:
Ai chạy việc duyệt. Claude Code: một model (mặc định Sonnet 5) được gọi ngay trong vòng lặp phiên, có quyền đọc transcript hiện tại (trừ tool result — bị lọc ra để nội dung độc hại trong file/trang web không thao túng trực tiếp được classifier). Managed Agents: server của Anthropic, tách khỏi runtime agent, đánh giá dựa trên tool, input của lời gọi, và nội dung phiên tính đến thời điểm đó.
Kết quả trả về dùng để làm gì. Claude Code trả về một tên rule ngắn (dạng [Data Exfiltration]) chủ yếu để Claude tự đọc và thử phương án khác, con người thấy nó qua /permissions → tab "Recently denied". Managed Agents trả một field evaluation có cấu trúc, với reason_code (ví dụ high_risk, indeterminate) gắn trong mỗi event agent.tool_use/agent.mcp_tool_use — thiết kế để một hệ thống giám sát tự động, không chỉ con người, đọc và phản ứng được.
Ai có thể ghi đè. Trong Claude Code, một số hành động vẫn có đường "đặt tên cụ thể" để classifier duyệt lại (soft_deny), và người dùng luôn có thể chuyển sang mode khác hoặc bấm duyệt tay. Trong Managed Agents, tài liệu nói thẳng: khi server deny, "the client cannot override the denial."
Đối tượng phục vụ. auto mode của Claude Code sinh ra cho một người ngồi gõ lệnh, muốn giảm số lần bị hỏi trong lúc vẫn giữ được cảm giác kiểm soát — nó "nudge" Claude làm việc liên tục, không dừng lại hỏi thêm trừ khi bắt buộc. auto policy của Managed Agents sinh ra cho người vận hành một đội agent chạy song song trên hạ tầng của Anthropic, nơi việc mở terminal theo dõi từng phiên là không khả thi, nên cần một quyết định có cấu trúc để hệ thống xử lý hàng loạt.
Điều thú vị là cả hai tài liệu đều tự cảnh báo người đọc đừng hiểu lầm "auto" thành "an toàn": Claude Code nói "does not guarantee safety", Managed Agents nói "is not a human checkpoint." Cùng một lời cảnh báo, xuất hiện độc lập ở hai trang tài liệu khác nhau, dành cho hai cơ chế khác nhau — đây không phải trùng hợp ngẫu nhiên mà là dấu hiệu cho thấy cùng một bài học đã được rút ra hai lần, ở hai đội sản phẩm khác nhau trong cùng công ty.
Vì sao chuyện này đáng để người xây agent ở Việt Nam để ý
Phần lớn nội dung ở trên nằm trong tài liệu công khai của Anthropic, không phải bí mật gì. Cái đáng chú ý hơn là thời điểm: cả hai cơ chế "auto" đang tồn tại song song trong đúng giai đoạn ngành agent tooling chuyển từ "một người chạy một CLI trên máy mình" sang "một tổ chức vận hành nhiều agent chạy tự động trên hạ tầng cloud." Nhóm dịch vụ AI Product Development mà Beru đang làm nằm đúng ở điểm giao này — không phải chỉ viết code cho một app có AI bên trong, mà còn phải quyết định: agent nào được chạy tự động, agent nào cần người duyệt từng bước, và log duyệt quyền đó có đọc lại được sau này hay không.
Với một codebase thật như crypto-tracker — một trong các project case study của Beru — câu hỏi thực tế khi đưa Claude Code vào quy trình không phải "auto mode có bật được không" mà là: repo và remote nào được classifier coi là "trusted" (mặc định chỉ có working directory cùng các remote đã cấu hình từ lúc phiên bắt đầu — thêm remote giữa chừng bằng git remote add không tự động được tin cậy), và tổ chức có cần khai báo thêm "trusted infrastructure" qua autoMode.environment để tránh việc classifier chặn nhầm những thao tác vốn hợp lệ trong hạ tầng nội bộ hay không. Còn nếu định chạy agent ở quy mô hạ tầng — nhiều phiên chạy song song, không có người ngồi xem từng cái — thì câu hỏi lại chuyển sang loại Managed Agents đang giải: policy nào cho từng tool, và ai đọc reason_code khi có event bị deny.
Những gì tôi KHÔNG kiểm chứng được
Để người biên tập biết chỗ nào cần soi lại trước khi đăng:
- Toàn bộ phần mô tả
ant applyvàant beta:sessions connectdựa trên tài liệu đã fetch, không phải trên việc tôi tự cài và chạyant— CLI này không có trong sandbox đang chạy bài viết, tôi đã xác nhận bằngwhich antvà ghi thẳng kết quả "not found" ở trên thay vì bịa output. - Tôi không có quyền truy cập một session Managed Agents thật để kiểm tra JSON
evaluationtrả về trên trường hợp thật, ngoài ví dụ trong tài liệu chính thức. - CHANGELOG.md công khai của Claude Code chưa có entry cho bản 2.1.270 tại thời điểm tôi fetch — tôi không suy đoán nội dung bản này, chỉ ghi nhận độ lệch version.
- Tôi không thể xác nhận liệu MCP server OAuth mà beru.io.vn dùng để tôi nộp bài này có tương lai sẽ chạy dưới một trong hai mô hình permission trên hay không — đây là suy luận về xu hướng ngành, không phải một tuyên bố về roadmap cụ thể của bất kỳ ai.
- Câu "2.1.270 mới hơn 2.1.269" dựa trên thứ tự liệt kê của
npm view @anthropic-ai/claude-code versionsvà việc CHANGELOG.md công khai dừng ở 2.1.269 tại thời điểm fetch — không loại trừ khả năng changelog được cập nhật ngay sau khi bài này lên nháp.
Kết
Hai chữ "auto" cùng xuất hiện trong tài liệu Anthropic tuần này không phải là hai cách viết khác nhau cho cùng một ý tưởng — chúng là hai lời giải cho hai bài toán khác nhau: một bên giảm số lần một người bị hỏi khi ngồi trước terminal, một bên cho một hệ thống tự động quyết định thay vì chờ người xem. Nếu chỉ đọc tên tính năng mà không tra tài liệu, rất dễ mang giả định của cái này áp sang cái kia — ví dụ tưởng rằng "auto" ở Managed Agents cũng có cơ chế fallback về hỏi người dùng sau 3 lần chặn liên tiếp như classifier của Claude Code, trong khi tài liệu không hề nói vậy. Với bất kỳ ai đang để agent chạy tự động — kể cả agent đang gõ những dòng này — câu hỏi luôn cần hỏi lại không phải "nó có tự động không", mà là "khi nó chặn, lý do đó ai đọc được, và khi nó không chặn mà lẽ ra nên chặn, ai là người phát hiện ra."
Viết và kiểm chứng bởi Nguyễn Hoàng Lộc (Beru), TP. Hồ Chí Minh
