Skip to content

Thông tin kiểm chứng ngày 2026-10-24T00:00:00.000Z

6. Rào chắn & chi phí ​

Tự động hóa không có nghĩa là bỏ kiểm soát. Nó có nghĩa là chuyển kiểm soát từ "người ngồi duyệt từng bước" sang "rào chắn đặt sẵn". Chương này liệt kê các rào chắn, cái nào tất định (model không lách được), cái nào chỉ là lời dặn.

Tổng quan ​

Rào chắnChặn được gìTất định?Trong starter
Test (TDD)Code sai logic, sửa cái này hỏng cái kiaCó, nếu test đúngQuy tắc trong AGENTS.md; Stop hook chạy test
HookHành động cụ thể bạn đã viết luật (commit file bí mật, báo xong khi test đỏ)Cóblock-secrets.ts, check-on-stop.ts
Worktree / nhánh riêngAgent làm hỏng nhánh chínhCó (git)Tự làm khi chạy dài
Quyền hạn (allowlist)Lệnh ngoài danh sách cho phépCópermissions.allow trong .claude/settings.json
Giới hạn vòng lặpVòng lặp chạy mãi, đốt tokenCóĐặt khi chạy: --max-iterations, --max-turns
You Should KnowChi tiết dễ bỏ sót trong phiên dàiKhông: chỉ nhắc, không chặnBật sẵn trong enabledPlugins
Review diffMọi thứ còn lại: sai yêu cầu, code khó bảo trì, phạm vi phìnhKhông: phụ thuộc ngườiBước review của Superpowers + bạn đọc diff
Lời dặn trong CLAUDE.md/promptThói quen, quy ướcKhông: model có thể quênAGENTS.md, CLAUDE.md

Nguyên tắc: thứ gì bắt buộc phải đúng thì đưa xuống hàng tất định (test, hook, quyền). Lời dặn chỉ dùng cho thứ "nên".

Test (TDD) ​

Test là cách duy nhất để agent tự biết mình đúng mà không hỏi bạn. Không có test thì mọi cơ chế tự động ở chương 5 chỉ là agent tự chấm điểm cho mình.

practice/starter/AGENTS.md ghi hai quy tắc:

markdown
- Logic nghiệp vụ (tính toán, quy tắc) viết thành hàm thuần trong `packages/api/src/`, có test `*.test.ts` bên cạnh.
- Viết test trước, thấy test fail rồi mới viết code.

"Thấy test fail trước" quan trọng: test viết sau code dễ chỉ mô tả lại cái code đang làm, kể cả khi nó sai. Khi review, kiểm cả test chứ không chỉ code: agent sửa test cho khớp code sai là lỗi hay gặp.

Hook ​

Hook là lệnh chạy ở một sự kiện, model không bỏ qua được. Cách viết: Hook. Hai điều cần nhớ:

  • Chỉ exit 2 mới chặn (và stderr được đưa lại cho Claude). Exit 1 là lỗi không chặn: hook "tưởng là chặn" mà dùng exit 1 thì không chặn gì cả.
  • Hook của dự án nằm trong .claude/settings.json, ai clone repo cũng có.

Starter có hai hook:

HookSự kiệnLàm gì
.claude/hooks/block-secrets.tsPreToolUse (Bash)Chặn git add/git commit có file bí mật (.env, .pem, .key...), kể cả khi file đã nằm sẵn trong index
.claude/hooks/check-on-stop.tsStopTrước khi agent báo xong: chạy bun run check-types và bun test; lỗi thì exit 2 để agent sửa tiếp

Hook Stop khi chạy cùng Ralph loop

check-on-stop.ts cho qua ngay khi input có stop_hook_active là true (đang tiếp tục vì một stop hook trước), để không lặp vô hạn khi test không thể pass. Ralph loop cũng chạy bằng Stop hook, nên các lượt sau lượt đầu có thể đều là "đang tiếp tục vì stop hook", và cổng test của starter có thể không chạy ở những lượt đó.

Cách xử lý: ghi "check-types và test pass" thẳng vào prompt và tiêu chí xong của vòng lặp (như ví dụ ở chương 5), và tự chạy lại bun run check-types và bun test khi vòng lặp kết thúc.

Sandbox và worktree ​

Chạy dài thì cho agent một chỗ làm riêng, hỏng thì bỏ:

bash
# Nhánh + thư mục riêng cho vòng lặp, nhánh chính không bị đụng
git worktree add ../so-chia-tien-loop -b loop/backlog-1
cd ../so-chia-tien-loop
# .env không nằm trong git: chép từ thư mục chính, rồi cài dependency
cp ../so-chia-tien/apps/server/.env apps/server/.env
cp ../so-chia-tien/apps/web/.env apps/web/.env
bun install
claude

Worktree (bản làm việc tách riêng) là thư mục git thứ hai trên nhánh khác, để agent làm song song mà không đụng nhau. Xong việc, review diff của nhánh rồi mới merge.

bypassPermissions (--dangerously-skip-permissions) bỏ qua mọi kiểm tra quyền. Chỉ cân nhắc trong môi trường cô lập hoàn toàn, có thể vứt đi được; không dùng trên máy chứa dữ liệu thật hay khóa bí mật. Bên Codex, cô lập là khái niệm có sẵn: sandbox_mode = read-only | workspace-write | danger-full-access (xem chương 7).

Quyền hạn: allowlist hẹp ​

Cho đúng những lệnh agent cần, không hơn. Starter cho phép:

json
"allow": [
  "Bash(bun install)",
  "Bash(bun run dev)",
  "Bash(bun run build)",
  "Bash(bun run check-types)",
  "Bash(bun run db:push)",
  "Bash(bun test*)",
  "Bash(bunx create-better-t-stack@3.49.0 *)",
  "Bash(git status*)",
  "Bash(git diff*)",
  "Bash(git log*)",
  "Bash(git add *)",
  "Bash(git commit *)"
]

Để ý: không có git push, không có lệnh xóa, version của create-better-t-stack được ghim. bun run chỉ cho đúng 4 script, không dùng bun run *: bun run <file>.ts chạy được code tùy ý do agent tự viết. bun install không kèm tên gói, nên thêm thư viện (bun add) vẫn phải hỏi. Những gì ngoài danh sách vẫn bị hỏi (Manual) hoặc để bộ phân loại quyết định (auto).

Ba điều dễ nhầm:

  • permissions.defaultMode: "auto" trong .claude/settings.json của repo bị bỏ qua. Muốn auto khi chạy headless thì dùng flag --permission-mode auto.
  • claude -p mặc định là Manual: không có allow rule thì tool cần duyệt bị từ chối.
  • Thư mục chưa trust: allow rule của dự án không áp dụng khi chạy claude -p.

Chi tiết: Permission mode.

Giới hạn vòng lặp và chi phí ​

Mỗi vòng lặp là token. Đặt trần trước khi chạy, không phải sau khi nhận hóa đơn.

Công cụGiới hạnGhi chú
Ralph loop--max-iterations NMặc định không giới hạn. Luôn đặt
claude -p--max-turns NChỉ ở print mode; mặc định không giới hạn
Stop hookTối đa 8 lần tiếp tục liên tiếpReset khi Claude gọi tool; lưới an toàn có sẵn, không thay hai dòng trên
Scheduled tasksKhông dày hơn 1 lần/giờLịch dày hơn bị từ chối
Codex /goal/goal pause, /goal clearDừng tay khi thấy lệch

Cách đặt số hợp lý: chạy thử một mục backlog ở chế độ có người theo dõi, đếm số vòng nó cần, rồi đặt giới hạn khoảng gấp rưỡi. Bài về nhà dùng --max-iterations 15.

Thêm các cờ giới hạn khác của claude -p: xem cheat sheet.

You Should Know ​

Agent phụ theo dõi phiên và nhắc điều bạn hoặc Claude có thể bỏ sót. Bật:

text
/plugin enable cc-plugin-you-should-know@builtin

Đặt nó đúng chỗ trong bảng rào chắn: lớp nhắc nhở, không phải lớp chặn. Nó không dừng agent, không sửa gì, và không thay review diff. Lợi ích lớn nhất là ở phiên dài, nơi một dòng "test skipped" hay một lỗi bị nuốt dễ trôi mất giữa hàng trăm dòng output.

Review diff: người vẫn phải đọc ​

Mọi rào chắn trên chỉ kiểm được thứ bạn đã nghĩ tới. Đọc diff là để bắt thứ chưa nghĩ tới.

bash
git log --oneline main..HEAD     # nhánh này có những commit nào
git diff main...HEAD --stat      # file nào bị đụng, đụng bao nhiêu
git diff main...HEAD             # đọc thật

Khi đọc, hỏi bốn câu:

  1. Diff có đụng file ngoài phạm vi spec không?
  2. Test có kiểm đúng tiêu chí chấp nhận, hay chỉ kiểm cái code đang làm?
  3. Có test nào bị skip, bị xóa, hoặc bị nới điều kiện không?
  4. Có gì bạn sẽ không chấp nhận nếu đồng nghiệp gửi PR này?

Workflow Superpowers có bước review riêng (xem chương 3); đó là agent review agent. Nó hữu ích, nhưng người chịu trách nhiệm merge vẫn là bạn.

Giới hạn tính năng theo môi trường ​

Không phải lỗi cài đặt, chỉ là tính năng khác nhau theo cách đăng nhập:

  • Dùng API key, Bedrock, Vertex hoặc Foundry: không có You Should Know (nó chỉ chạy ở phiên first-party có bật telemetry). Các rào chắn còn lại vẫn dùng được.
  • Gói Pro có giới hạn sử dụng; vòng lặp dài hoặc nhiều subagent dễ chạm trần giữa chừng. Chạy vòng lặp nhỏ, giới hạn chặt, hoặc để người dạy demo phần chạy dài.

Checklist trước khi để agent chạy một mình ​

  • [ ] Có spec và plan file; prompt trỏ tới chúng.
  • [ ] Tiêu chí xong đo được (test, lệnh kiểm tra), ghi trong prompt.
  • [ ] Đặt --max-iterations (Ralph) hoặc --max-turns (-p).
  • [ ] Đang ở nhánh hoặc worktree riêng.
  • [ ] Allowlist hẹp; không chạy bypassPermissions trên máy thật.
  • [ ] Hook chặn bí mật và hook kiểm tra khi dừng đang bật.
  • [ ] You Should Know đã bật (nếu môi trường hỗ trợ).
  • [ ] Đã hẹn giờ quay lại đọc git log và diff.

Nguồn ​