Tôi dùng AI mỗi ngày trên nhiều codebase. Có task kéo dài qua nhiều session, có task chạm GitHub, Cloudflare và production. Vấn đề lớn nhất không phải model viết code chậm. Vấn đề là một model làm rất nhanh nhưng không biết nó được quyền quyết định đến đâu.
Case thật: đưa GreenJade lên production
GreenJade trước đó là một Astro experiment nằm ở repository riêng. Mục tiêu mới là gom phần AI và programming về monorepo chính, giữ layout tối giản, tách hoàn toàn nội dung tép cảnh sang các subdomain riêng và mở một editorial surface có thể bán dịch vụ.
Nghe giống một lần sửa giao diện. Thực tế nó gồm bốn lớp công việc:
- Đọc code cũ và xác định phần nào còn là source of truth.
- Thiết kế lại homepage, Notes, Tools và Work trong
apps/web. - Chuyển Git integration của Cloudflare Pages từ repository cũ sang monorepo.
- Chứng minh custom domain, redirects, sitemap, security headers và SEO state đều đúng sau deploy.
Nếu chỉ giao một câu “làm site rồi deploy”, agent có thể dừng sau khi local build xanh. Nó cũng có thể đi quá xa: tự đổi production source, publish bài nháp hoặc xóa đường dẫn cũ khi chưa có quyền.
Contract tôi dùng tách task thành ba loại hành động:
| Loại hành động | Agent được làm gì | Điểm dừng |
|---|---|---|
| Read-only | Đọc repo, Git history, cấu hình và public edge | Dừng nếu evidence mâu thuẫn |
| Safe local | Sửa code, build, audit, preview và responsive QA | Không tự coi local pass là production pass |
| External mutation | Commit, push, đổi Git integration và deploy | Chỉ chạy sau owner gate rõ ràng |
Lead, executor và reviewer làm gì
Tôi không coi ba vai trò này là ba nhân viên ảo. Chúng là ba kiểu trách nhiệm. Một model mạnh có thể giữ vai lead, model khác xử lý phần cơ khí, còn review pass cố tìm bằng chứng rằng kết quả đang sai.
| Vai trò | Trách nhiệm | Không được tự tuyên bố |
|---|---|---|
| Lead | Giữ mục tiêu, source of truth, dependency và decision log | Không gọi task hoàn tất chỉ vì executor nói xong |
| Executor | Thực hiện patch hẹp, build và thu evidence | Không mở rộng scope hoặc tự cấp quyền production |
| Reviewer | Tìm lỗi SEO, accessibility, responsive, security và operational gap | Không thay thế verification ở runtime |
| Owner | Chốt business intent và hành động có hậu quả thật | Không cần ngồi canh phần local an toàn |
Cách chia này cũng giải quyết bài toán quota. Model mạnh dùng cho conflict, architecture và risk. Phần crawl file, kiểm tra pattern, chạy build hoặc so hash có thể giao cho worker rẻ hơn. Routing theo loại quyết định, không routing theo thương hiệu model.
Bốn vùng AI không tự quyết
Tôi cho agent tự động khá nhiều, nhưng có bốn vùng luôn cần owner authority nếu hành động tạo hậu quả thật:
- Money: giá bán, thanh toán, hoàn tiền, credit hoặc thay đổi economy.
- Data: xóa, migrate, rollback hoặc sửa dữ liệu người dùng.
- Security: secret, permission, auth boundary hoặc credential rotation.
- Production: deploy, restart, đổi traffic source hoặc public một surface mới.
Gate không có nghĩa là mọi bước đều phải hỏi. Agent vẫn có thể chuẩn bị patch, chạy test, so cấu hình và viết checklist. Nó chỉ dừng đúng trước điểm mà quyết định trở nên khó đảo ngược hoặc mang ý nghĩa kinh doanh.
$ greenjade release --scope editorial
PASS static build: 8 pages
PASS responsive: 390 / 768 / 1440
PASS draft articles excluded from sitemap
STOP production source change needs owner GO
Evidence thay cho niềm tin
Một handoff đẹp không chứng minh hệ thống đúng. “Trang mở được” cũng không chứng minh SEO, redirect hay CDN đã nhận artifact mới. Mỗi claim phải đi cùng một phép kiểm tra có thể đánh trúng failure mode của nó.
| Claim | Evidence dùng trong case này |
|---|---|
| Code build được | Astro sinh đủ 8 static pages và sitemap |
| Bài nháp không bị index | noindex, follow trên ba route ở bản deploy đầu tiên và không có trong sitemap |
| UI không vỡ | Preview ở 390px, 768px và 1440px, không có horizontal overflow |
| Cloudflare nhận đúng source | Repository, branch, root directory và commit hiển thị trong deployment |
| Edge đang phục vụ artifact mới | HTTP 200, content marker và SHA-256 của OG image khớp local |
| Đường cũ không chết | Kiểm tra 301 cho Lab, Products, Contact và các surface aquatics |
Điểm quan trọng là evidence được định nghĩa trước khi chạy. Nếu đợi đến cuối mới nghĩ cách chứng minh, agent rất dễ chọn phép kiểm tra thuận tiện nhất thay vì phép kiểm tra có giá trị nhất.
Deploy success vẫn chưa phải xong
Deployment đầu tiên của editorial site đã thành công. Cloudflare clone đúng commit, build đủ route, parse 9 redirect rules và 2 header rules rồi publish asset. Nếu chỉ nhìn badge xanh, task có thể dừng ở đây.
Nhưng build log cho thấy dependency audit có cảnh báo high. Tôi cho workflow quay lại local, nâng Astro từ 6.3.2 lên 7.1.6, pin Sharp 0.35.3 và chạy lại audit. Kết quả cuối là không còn vulnerability được phát hiện, frozen install pass và static build vẫn pass.
Ngay sau đó, CI Secret Scan lại đỏ. Không có secret mới bị leak. Scanner đang quét chính file hook chứa regex mẫu của nó. Hook local đã exclude file này nhưng workflow GitHub chưa đồng bộ. Patch cuối chỉ làm hai nơi dùng cùng một exclusion, sau đó Secret Scan xanh.
- kết luận: Cloudflare báo success nên đã xong
+ dependency audit: 0 vulnerability được phát hiện
+ Frontend CI / Backend CI / Secret Scan: success
+ Cloudflare Pages: success trên commit cuối
+ public edge: content, sitemap, redirects và headers đã kiểm tra
Case này không chứng minh AI “thông minh như một team”. Nó chứng minh một workflow có boundary tốt sẽ tiếp tục tìm lỗi sau success đầu tiên, và chỉ dừng khi evidence chain đã khép kín.
Playbook có thể dùng lại
Đây là checklist tôi dùng khi muốn agent tự chạy sâu nhưng không vượt quyền:
- Viết một câu objective có terminal condition rõ.
- Chỉ ra source of truth: repo, config, runtime hay edge.
- Tách read, write và decision boundary.
- Cho phép agent tự làm hết phần local có thể đảo ngược.
- Đặt owner gate trước money, data, security và production.
- Gắn từng claim quan trọng với một phép kiểm tra cụ thể.
- Sau deploy, kiểm tra runtime hoặc edge thay vì tin dashboard.
- Chỉ handoff khi nói được: đã đổi gì, đã kiểm tra gì và còn gì chưa xong.
Khi nào nên audit workflow
Bạn chưa cần thêm model nếu repo càng chạy agent càng rối, mỗi session hiểu source of truth một kiểu, handoff nói đã xong nhưng runtime không khớp, hoặc bạn không dám để task chạy qua đêm vì sợ nó chạm production.
Lúc đó vấn đề thường nằm ở workflow: authority không rõ, memory bị dùng như execution truth, verification đặt sai chỗ hoặc không có recovery path.