Giao diện
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ắn | Chặn được gì | Tất định? | Trong starter |
|---|---|---|---|
| Test (TDD) | Code sai logic, sửa cái này hỏng cái kia | Có, nếu test đúng | Quy tắc trong AGENTS.md; Stop hook chạy test |
| Hook | Hà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êng | Agent làm hỏng nhánh chính | Có (git) | Tự làm khi chạy dài |
| Quyền hạn (allowlist) | Lệnh ngoài danh sách cho phép | Có | permissions.allow trong .claude/settings.json |
| Giới hạn vòng lặp | Vòng lặp chạy mãi, đốt token | Có | Đặt khi chạy: --max-iterations, --max-turns |
| You Should Know | Chi tiết dễ bỏ sót trong phiên dài | Không: chỉ nhắc, không chặn | Bật sẵn trong enabledPlugins |
| Review diff | Mọi thứ còn lại: sai yêu cầu, code khó bảo trì, phạm vi phình | Không: phụ thuộc người | Bước review của Superpowers + bạn đọc diff |
| Lời dặn trong CLAUDE.md/prompt | Thói quen, quy ước | Không: model có thể quên | AGENTS.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:
| Hook | Sự kiện | Làm gì |
|---|---|---|
.claude/hooks/block-secrets.ts | PreToolUse (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.ts | Stop | Trướ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
claudeWorktree (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.jsoncủa repo bị bỏ qua. Muốn auto khi chạy headless thì dùng flag--permission-mode auto.claude -pmặ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ạn | Ghi chú |
|---|---|---|
| Ralph loop | --max-iterations N | Mặc định không giới hạn. Luôn đặt |
claude -p | --max-turns N | Chỉ ở print mode; mặc định không giới hạn |
| Stop hook | Tối đa 8 lần tiếp tục liên tiếp | Reset khi Claude gọi tool; lưới an toàn có sẵn, không thay hai dòng trên |
| Scheduled tasks | Không dày hơn 1 lần/giờ | Lịch dày hơn bị từ chối |
Codex /goal | /goal pause, /goal clear | Dừ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ậtKhi đọc, hỏi bốn câu:
- Diff có đụng file ngoài phạm vi spec không?
- Test có kiểm đúng tiêu chí chấp nhận, hay chỉ kiểm cái code đang làm?
- Có test nào bị skip, bị xóa, hoặc bị nới điều kiện không?
- 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
bypassPermissionstrê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 logvà diff.
Nguồn
- Hooks (exit code, Stop hook,
stop_hook_active): https://code.claude.com/docs/en/hooks - Permission modes: https://code.claude.com/docs/en/permission-modes
- Headless (
--max-turns,-pmặc định Manual): https://code.claude.com/docs/en/headless - CLI reference: https://code.claude.com/docs/en/cli-reference
- Changelog (2.1.287 You Should Know, 2.1.302
-pManual): https://code.claude.com/docs/en/changelog - Ralph loop plugin: https://github.com/anthropics/claude-plugins-official/tree/main/plugins/ralph-loop
- Scheduled tasks: https://code.claude.com/docs/en/routines
- Codex sandbox: https://learn.chatgpt.com/docs/sandboxing.md
- Codex
/goal: https://learn.chatgpt.com/use-cases/follow-goals