Bốn bài trước cho bạn từng mảnh: nền an toàn, chia lô, worktree, verify. Bài này lắp chúng thành một vòng lặp tự vận hành để agent xử lý cả một lô mà không cần bạn cầm tay từng file — nhưng vẫn dừng lại đúng chỗ cần con người.
Vòng lặp lõi
for mỗi lô trong manifest (status == todo):
1. PLAN : agent đọc scope, liệt kê file, nêu khuôn mẫu áp dụng
2. APPLY : sửa từng file theo khuôn mẫu
3. VERIFY : chạy verify.sh + characterization diff
4. FIX : nếu đỏ -> tự sửa (tối đa N vòng)
5. GUARD : nếu vẫn đỏ sau N vòng -> DỪNG, báo người
6. COMMIT : nếu xanh -> commit, cập nhật manifest = done
Điểm mấu chốt là bước PLAN trước khi APPLY: buộc agent nói ra ý định giúp bạn bắt sai hướng sớm, rẻ hơn nhiều so với sửa sau khi đã đụng 20 file.
Pseudocode một runner đơn giản
def run_batch(batch, max_fix=3):
plan = agent.plan(batch.scope, PATTERN_SPEC)
review_or_autoapprove(plan) # người duyệt plan nếu lô rủi ro cao
agent.apply(plan)
for attempt in range(max_fix + 1):
result = run("./verify.sh")
if result.ok and characterization_ok(batch):
git_commit(f"migrate {batch.id}: {batch.scope}")
manifest.mark_done(batch.id)
return "DONE"
agent.fix(result.log) # đưa log lỗi cho agent tự sửa
escalate(batch, result.log) # hết lượt -> nhờ người
return "ESCALATED"
max_fix giới hạn số vòng tự sửa để tránh agent loay hoay đốt token vô hạn ở một lô khó.
Chốt khuôn mẫu bằng "pattern spec"
Để tránh trôi dạt (file thứ 300 khác file thứ 3), tách khuôn mẫu ra một tài liệu và nhắc lại ở mỗi lô:
PATTERN_SPEC (moment -> date-fns):
- moment().format('YYYY-MM-DD') => format(new Date(), 'yyyy-MM-dd')
- moment(x).add(1,'day') => addDays(x, 1)
- import phải gom về cùng khối import trên cùng
- KHÔNG đổi múi giờ hành vi; nếu code cũ dùng UTC, giữ UTC
- Ca không có trong bảng này -> DỪNG, hỏi, KHÔNG tự chế
Dòng cuối cực quan trọng: agent gặp ca lạ phải dừng chứ không sáng tạo linh tinh.
Bộ nhớ ngoài chống mất mạch
Agent không nhớ giữa các phiên. Manifest + pattern spec + MIGRATION.md (nhật ký quyết định) chính là bộ nhớ ngoài. Mỗi lô xong, ghi lại:
Batch 12 (src/billing) DONE.
- Phát sinh: 3 chỗ dùng moment.duration -> đã map sang differenceInHours.
- Cập nhật PATTERN_SPEC thêm ca duration.
Lần sau agent (hoặc người) đọc log là bắt nhịp ngay.
Khi nào để agent tự chạy, khi nào chèn người
Tự động (autonomous) : lô "đơn giản", scope rời, có characterization mạnh
Duyệt plan trước : lô "trung bình", đổi hành vi tinh tế
Người làm/kèm sát : lô "khó", <20 chỗ, rủi ro cao (thanh toán, bảo mật)
Checklist một runner lành mạnh
[ ] Có bước PLAN xuất ra ý định trước khi sửa
[ ] Giới hạn max_fix để không loay hoay vô hạn
[ ] Escalate rõ ràng khi hết lượt, kèm log
[ ] Commit tự động chỉ khi verify + characterization xanh
[ ] Cập nhật manifest + nhật ký sau mỗi lô
[ ] Pattern spec được nhắc lại ở mỗi lô
Sai lầm thường gặp
- Bỏ bước PLAN, cho agent lao vào sửa ngay: sai hướng thì trả giá bằng cả lô.
- Không giới hạn vòng tự sửa: agent "sửa tới sửa lui", đốt token, có khi làm hỏng thêm.
- Commit tự động khi chưa verify đủ: đẩy rác vào lịch sử, khó truy vết.
- Không có escalation: lô khó bị agent "ép xanh" bằng thủ đoạn thay vì nhờ người.
- Không ghi nhật ký quyết định: phiên sau mất mạch, lặp lại lỗi cũ hoặc xử lý ca lạ không nhất quán.