TL;DR

Claude Code 2.1.118 (23/04/2026) thêm literal "$defaults" vào 3 mảng config autoMode.allow, autoMode.soft_deny, autoMode.environment. Giờ custom rules được cộng dồn với built-in list thay vì thay thế hoàn toàn. Trước đây, thêm 1 dòng soft_deny âm thầm xoá mọi rules chặn mặc định — force push, curl | bash, mass delete, prod deploy — cực nguy hiểm. Fix này nhỏ về code, rất to về tác động an toàn.

Có gì mới

Từ phiên bản 2.1.118, bạn có thể viết:

{
  "permissions": {
    "autoMode": {
      "soft_deny": [
        "$defaults",
        "Không được sửa file trong infra/terraform/prod/"
      ]
    }
  }
}

Literal "$defaults" được Claude Code thay thế tại chỗ bằng toàn bộ rules mặc định. Rules custom có thể đặt trước hoặc sau — vị trí "$defaults" quyết định thứ tự splice. Ba mảng environment, allow, soft_deny đều hỗ trợ như nhau, và mỗi mảng được xử lý độc lập.

Entry changelog chính thức ghi nguyên văn: "Auto mode: include "$defaults" in autoMode.allow, autoMode.soft_deny, or autoMode.environment to add custom rules alongside the built-in list instead of replacing it."

Tại sao quan trọng

Đây không phải quality-of-life update — đây là safety fix. Trước 2.1.118, config kiểu này:

{
  "autoMode": {
    "soft_deny": ["Không chạy migrations trên prod"]
  }
}

Có vẻ vô hại nhưng thực tế âm thầm xoá sạch mọi soft_deny mặc định của classifier: chặn force push, chặn curl | bash, chặn exfiltrate dữ liệu, chặn prod deploy, chặn mass delete cloud storage, chặn cấp IAM — tất cả biến mất, chỉ còn lại đúng 1 rule bạn vừa viết. Tài liệu chính thức gọi đây là Danger và cảnh báo: "every built-in block rule is discarded: force push, data exfiltration, curl | bash, production deploys, and all other default block rules become allowed."

Nhiều team đã rơi vào cái bẫy này trong lúc tưởng mình đang thắt chặt auto mode. Với "$defaults", lỗi này không thể xảy ra nếu bạn nhớ literal đó.

Technical facts

FieldTrước 2.1.118Từ 2.1.118
autoMode.environmentGhi đè toàn bộ defaults (chỉ trust working repo + remotes)Dùng "$defaults" để giữ defaults + thêm org infra
autoMode.allowGhi đè toàn bộ allow exceptionsDùng "$defaults" để giữ built-in exceptions
autoMode.soft_denyGhi đè toàn bộ block rulesDùng "$defaults" để giữ nguyên default blocks
Settings files đọc autoMode~/.claude/settings.json, .claude/settings.local.json, managed settings, --settingsKhông thay đổi
Shared .claude/settings.jsonClassifier KHÔNG đọc (tránh repo checked-in inject allow rules)Không thay đổi

CLI helpers đã có sẵn từ trước và cực hữu ích lúc này:

  • claude auto-mode defaults — in built-in rules dạng JSON
  • claude auto-mode config — in effective rules sau merge, với "$defaults" đã expand
  • claude auto-mode critique — AI review rules custom của bạn

Use cases thực tế

Config ví dụ dùng cho team, tổng hợp cả 3 mảng:

{
  "permissions": {
    "autoMode": {
      "environment": [
        "$defaults",
        "Source control: github.com/acme-corp và mọi repo bên dưới",
        "Trusted domains: *.internal.acme.com"
      ],
      "allow": [
        "$defaults",
        "Được ghi vào s3://acme-scratch/: bucket lifecycle 7 ngày"
      ],
      "soft_deny": [
        "$defaults",
        "Không sửa file trong infra/terraform/prod/"
      ]
    }
  }
}
  • Mở rộng environment: thêm GitHub org, internal domain, trusted buckets bên cạnh defaults.
  • Mở rộng soft_deny: thêm rủi ro riêng của project mà không mất default blocks.
  • Mở rộng allow: whitelist staging namespace hoặc ephemeral bucket mà classifier hay flag nhầm.
  • Rollout theo team: managed settings set "$defaults" + org rules; dev layer thêm .claude/settings.local.json — tất cả additive.

Daniel San (@dani_avila7) — người spot feature này đầu tiên — đặt config cá nhân vào .claude/settings.local.json vì file này mặc định gitignored và chỉ áp per-project.

Limitations & điều kiện

  • Phiên bản: cần Claude Code ≥ 2.1.118. Auto mode nói chung cần ≥ 2.1.83.
  • Plan: Auto mode không có trên Pro. Chỉ Max, Team, Enterprise, hoặc API. Admin Team/Enterprise phải bật trước.
  • Model: chỉ Sonnet 4.6, Opus 4.6, Opus 4.7. Max plan chỉ hỗ trợ Opus 4.7. Haiku không hỗ trợ.
  • Provider: chỉ Anthropic API. Không hoạt động trên Bedrock, Vertex, Foundry.
  • Không phải hard policy boundary: allow/soft_deny là gợi ý cho classifier, không phải firewall. Dev allow có thể override org soft_deny bên trong classifier. Muốn block cứng bất kể ý định, dùng permissions.deny trong managed settings — chạy trước classifier và không thể override.

What's next

Auto mode tiếp tục được hardening. Hook PermissionDenied đã ship để viết logic retry-on-deny programmatic. Phiên bản 2.1.119 phát hành cùng ngày thêm PowerShell auto-approve, prUrlTemplate, và duration_ms trong PostToolUse hook.

Nếu đang dùng auto mode với config custom, hãy chạy claude auto-mode config ngay và kiểm tra: nếu thấy chỉ có đúng những rules bạn viết, bạn đang chạy với rủi ro default blocks đã biến mất. Thêm "$defaults" vào đầu mỗi mảng và chạy lại để xác nhận list đã đầy đủ.

Nguồn: Claude Code changelog, Configure auto mode, Permission modes, @dani_avila7.