Bảng tra cứu harness của agent: thành phần, tệp, vấn đề và checklist khởi chạy
Harness của agent gồm năm hệ thống con: hướng dẫn, công cụ, môi trường, trạng thái và phản hồi. Bộ tệp tối thiểu gồm AGENTS.md ngắn làm bộ định tuyến, script kiểm chứng (make check, verify.sh), tệp tiến độ và danh sách tính năng có trạng thái; trạng thái «xong» do script đặt, không do agent.
Năm hệ thống con của harness
| Hệ thống con | Đó là gì | Hiện vật | Triệu chứng hỏng |
|---|---|---|---|
| Hướng dẫn | Agent cần biết gì về dự án | AGENTS.md / CLAUDE.md, skills, docs/, ADR | Vi phạm các quy ước đã biết |
| Công cụ | Agent có thể làm gì | shell, kiểm thử, linter, trình duyệt, máy chủ MCP | «Muốn nhưng không làm được» |
| Môi trường | Agent làm việc ở đâu | file khoá, Docker/devcontainer, git worktree, sandbox, init.sh | Phiên bắt đầu bằng việc sửa môi trường |
| Trạng thái | Những gì tồn tại qua lần khởi động lại | PROGRESS.md, DECISIONS.md, feature_list.json, commit | Phiên mới không biết đã dừng ở đâu |
| Phản hồi | Agent biết mình sai bằng cách nào | make check, E2E, hook, arch-check, người đánh giá | «Xong» nhưng không chạy |
Thứ tự triển khai từ đầu: phản hồi → hướng dẫn → trạng thái → môi trường → công cụ.
Các tệp của harness
| Tệp | Mục đích | Quy tắc |
|---|---|---|
| AGENTS.md / CLAUDE.md | Điểm vào: dự án là gì, chạy như thế nào, kiểm chứng ra sao | Bộ định tuyến ngắn (khoảng 80 dòng), liên kết đến tài liệu với điều kiện «khi nào đọc» |
| docs/*.md | Chi tiết theo từng chủ đề | Đọc khi cần, không đọc toàn bộ |
| .claude/skills/*/SKILL.md | Các quy trình lặp lại (triển khai, review) | Được nạp khi tác vụ khớp với mô tả |
| PROGRESS.md | Tình trạng, việc đã làm, điểm nghẽn, bước tiếp theo | Cập nhật vào cuối mỗi phiên |
| DECISIONS.md | Quyết định, lý do, các phương án bị loại | Ghi lại đường đi, không chỉ kết luận |
| feature_list.json | Tính năng: behavior, verification, state | Đúng một tính năng active (WIP=1) |
| scripts/verify.sh | Kiểm chứng tính năng và chuyển sang passing | Chỉ script này đặt passing, kèm SHA của commit |
| scripts/arch-check.sh | Ranh giới kiến trúc | Mã thoát 1 + WHY và FIX trong đầu ra |
| scripts/init.sh | Kiểm tra môi trường trước khi làm việc | Môi trường, git sạch, make check xanh, tính năng đang active |
| sprint contract | Hợp đồng cho tính năng trước khi viết mã | Trong phạm vi / ngoài phạm vi / câu hỏi còn mở |
| .claude/settings.json | Quyền và hook của Claude Code | Kiểm chứng gắn với sự kiện, không nằm trong trí nhớ của agent |
Khung AGENTS.md
# Dự án: backend thanh toán (FastAPI, PostgreSQL)
## Khởi chạy
docker compose up -d && ./scripts/init.sh
## Kiểm chứng
make check # lint, kiểu, unit, arch-check
make e2e # kịch bản đầu cuối
## Definition of Done
- make check và make e2e — mã 0
- tính năng được chuyển sang passing bởi scripts/verify.sh
- PROGRESS.md đã cập nhật
## MUST
- truy vấn DB chỉ qua repository
- bí mật chỉ lấy từ biến môi trường
## Tài liệu
- docs/payments.md — khi tác vụ liên quan đến thanh toán và hoàn tiền
- docs/migrations.md — khi thay đổi schema DB
Trạng thái của tính năng
| Trạng thái | Ý nghĩa | Ai chuyển |
|---|---|---|
| pending | Đang chờ | Người lập kế hoạch |
| active | Đang làm (chỉ một) | Agent khi bắt đầu |
| passing | Kiểm chứng đã qua | Chỉ verify.sh |
| blocked | Cần quyết định của con người | Agent, kèm lý do |
Các cấp kiểm chứng
| Cấp | Nội dung | Khi nào |
|---|---|---|
| 1 | Lint, kiểu | Luôn luôn |
| 2 | Unit và test tích hợp | Luôn luôn |
| 3 | E2E | Thay đổi ảnh hưởng nhiều hơn một lớp; trước khi «xong» |
| 4 | arch-check | Có import mới giữa các lớp |
Quyền nói «xong» chỉ có sau cấp cao nhất. Unit test xanh không có nghĩa là hoàn thành.
Cơ chế hoá quy tắc
| Cấp | Công cụ | Chi phí |
|---|---|---|
| Guard kiểu grep | Script tìm mẫu và in thông điệp WHY/FIX | Vài phút |
| Quy tắc linter | import-linter (Python), dependency-cruiser, eslint-plugin-boundaries (JS/TS) | Một giờ |
| Kiểm thử kiến trúc | Test trong CI, thất bại khi vi phạm ranh giới lớp | Nhiều hơn, nhưng hiển thị trong make check |
#!/usr/bin/env bash
fail=0
if grep -rn "from app.db" app/services/; then
echo "WHY: các service không truy cập DB trực tiếp"
echo "FIX: dùng repository trong app/repositories/"
fail=1
fi
exit $fail
Vấn đề thường gặp và cách xử lý
| Vấn đề | Hệ thống con | Giải pháp |
|---|---|---|
| Quy tắc trong CLAUDE.md không được tuân thủ | Hướng dẫn | Rút gọn tệp, biến quy tắc thành kiểm chứng hoặc hook |
| Agent không chạy được test | Công cụ | Cho phép lệnh, cài phụ thuộc vào image |
| Hành vi khác nhau trên các máy | Môi trường | File khoá, Docker/devcontainer, phiên bản runtime cố định |
| Mất trí nhớ giữa các phiên | Trạng thái | PROGRESS.md, bàn giao phiên, đọc khi bắt đầu phiên |
| Ba tính năng đã bắt đầu, không cái nào xong | Trạng thái | WIP=1 trong feature_list.json |
| «Xong» nhưng không chạy | Phản hồi | DoD, E2E, verify.sh, người đánh giá độc lập |
| Test xanh nhưng tính năng hỏng | Phản hồi | E2E với cơ sở dữ liệu và cấu hình thật |
| Agent sao chép mẫu xấu | Phản hồi | arch-check ngay từ đầu |
| Không rõ agent đã làm gì | Trạng thái | Commit nhỏ, báo cáo trong PROGRESS.md, DECISIONS.md |
| Agent làm hỏng môi trường qua đêm | Môi trường | Sandbox, git worktree, điểm kiểm tra, khôi phục qua init.sh |
| Cùng một nhận xét review hai lần | Harness nói chung | Biến thành kiểm chứng trong make check, bỏ văn bản khỏi hướng dẫn |
Vai trò cho các tác vụ dài
| Vai trò | Làm | Không làm |
|---|---|---|
| Người lập kế hoạch | Tính năng kèm tiêu chí chấp nhận | Không viết mã |
| Người sinh mã | Triển khai một tính năng, chạy test | Không tự quyết định đã xong chưa |
| Người đánh giá | Kết luận theo rubric, có dẫn chiếu đến tệp, dòng, log | Không thấy lập luận của người sinh mã |
| Merge | Commit khi review == pass | Đây là mã, không phải agent |
Ngân sách cho làm việc tự động
- Mục tiêu — một câu (ví dụ đưa mọi tính năng về passing).
- WIP=1, giới hạn thời gian và số lần thử cho mỗi tính năng.
- Chỉ số tăng đơn điệu, hồi quy thì hoàn tác ngay.
- Migration, hạ tầng, tiền bạc — leo thang lên con người.
- Sau nhiều lần review thất bại — bắt đầu lại tính năng với ngữ cảnh sạch.
Checklist khởi chạy agent
- Có AGENTS.md: stack, cách chạy, lệnh kiểm chứng, DoD.
- make check chạy được trên một bản clone sạch.
- Môi trường tái lập được: file khoá, Docker hoặc devcontainer.
- Agent có các lệnh cần thiết, lệnh nguy hiểm bị cấm hoặc đặt trong sandbox.
- Có E2E ít nhất cho kịch bản chính.
- Có PROGRESS.md và quy tắc đọc nó khi bắt đầu phiên.
- Tính năng trong danh sách có trạng thái, chỉ một cái active.
- Trạng thái passing do script đặt.
- Thông báo kiểm chứng có WHY và FIX.
- Tác vụ có tiêu chí chấp nhận và ranh giới phạm vi.
- Đã xác định rõ việc nào cần quyết định của con người.
- Đã đo verification gap trước khi thay đổi, để có gì so sánh.
Chỉ số của harness
| Chỉ số | Cách tính |
|---|---|
| Verification gap | Tỷ lệ «xong» không được kiểm chứng xác nhận, trên 10 tác vụ |
| MTTR | Thời gian từ khi hỏng đến khi khôi phục trạng thái làm việc |
| Khởi động nguội | Phiên mới có trả lời được «chúng ta đang ở đâu, tiếp theo là gì» mà không phải đoán không |
| Ablation | Mức sụt giảm khi tắt một hệ thống con trên bộ tác vụ cố định |
Tóm tắt
Harness là một vòng khép kín chứ không phải một tệp: hướng dẫn, công cụ, môi trường, trạng thái và phản hồi. Hãy bắt đầu từ kiểm chứng, giữ AGENTS.md ngắn, giao trạng thái «xong» cho script và xem xét lại harness định kỳ. Toàn bộ điều này được ghép lại trên một dự án thực tế trong khoá học harness engineering.
Câu hỏi thường gặp
AGENTS.md khác CLAUDE.md thế nào?
Về mục đích thì giống nhau: đều là tệp hướng dẫn cho agent. CLAUDE.md do Claude Code đọc, còn AGENTS.md là định dạng chung cho nhiều agent; trong CLAUDE.md có thể chỉ cần tham chiếu đến AGENTS.md.
AGENTS.md nên có bao nhiêu dòng?
Không có giới hạn cứng, nhưng tệp đầu vào nên ngắn — khoảng vài trăm dòng trở xuống, như một mục lục. Chi tiết được chuyển sang các tài liệu riêng.
Dự án nhỏ có cần feature_list.json không?
Với các chỉnh sửa lẻ thì không cần. Nó có ích khi agent làm nhiều tính năng liên tiếp hoặc qua nhiều phiên.
Lưu bí mật mà agent cần truy cập ở đâu?
Trong biến môi trường hoặc trình quản lý bí mật, chứ không nằm trong tệp hướng dẫn hay trong mã. Agent được cấp quyền truy cập môi trường, không phải giá trị được viết trong văn bản.
Chủ đề này được giảng chi tiết kèm thực hành trong khóa học “Harness Engineering: инженерия надёжности AI-агентов”.
- Из чего состоит harness AI-агента: инструкции, инструменты, среда, состояние, обратная связь
- Харнес AI-агента с нуля: AGENTS.md, feature_list.json, verify.sh и автономный цикл