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:

  1. Đọc code cũ và xác định phần nào còn là source of truth.
  2. Thiết kế lại homepage, Notes, Tools và Work trong apps/web.
  3. Chuyển Git integration của Cloudflare Pages từ repository cũ sang monorepo.
  4. 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 độngAgent được làm gìĐiểm dừng
Read-onlyĐọc repo, Git history, cấu hình và public edgeDừng nếu evidence mâu thuẫn
Safe localSửa code, build, audit, preview và responsive QAKhông tự coi local pass là production pass
External mutationCommit, push, đổi Git integration và deployChỉ 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ệmKhông được tự tuyên bố
LeadGiữ mục tiêu, source of truth, dependency và decision logKhông gọi task hoàn tất chỉ vì executor nói xong
ExecutorThực hiện patch hẹp, build và thu evidenceKhông mở rộng scope hoặc tự cấp quyền production
ReviewerTìm lỗi SEO, accessibility, responsive, security và operational gapKhông thay thế verification ở runtime
OwnerChốt business intent và hành động có hậu quả thậtKhô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:

  1. Money: giá bán, thanh toán, hoàn tiền, credit hoặc thay đổi economy.
  2. Data: xóa, migrate, rollback hoặc sửa dữ liệu người dùng.
  3. Security: secret, permission, auth boundary hoặc credential rotation.
  4. 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ó.

ClaimEvidence dùng trong case này
Code build đượcAstro sinh đủ 8 static pages và sitemap
Bài nháp không bị indexnoindex, 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 sourceRepository, branch, root directory và commit hiển thị trong deployment
Edge đang phục vụ artifact mớiHTTP 200, content marker và SHA-256 của OG image khớp local
Đường cũ không chếtKiể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:

  1. Viết một câu objective có terminal condition rõ.
  2. Chỉ ra source of truth: repo, config, runtime hay edge.
  3. Tách read, write và decision boundary.
  4. Cho phép agent tự làm hết phần local có thể đảo ngược.
  5. Đặt owner gate trước money, data, security và production.
  6. Gắn từng claim quan trọng với một phép kiểm tra cụ thể.
  7. Sau deploy, kiểm tra runtime hoặc edge thay vì tin dashboard.
  8. 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.