TL;DR

Addy Osmani - engineering director tại Google, tác giả của nhiều bài viết định hình cách dùng AI trong development - chia sẻ về loop engineering: mô hình thay thế việc bạn trực tiếp prompt agent bằng một hệ thống tự tìm việc, giao việc, kiểm tra kết quả và quyết định bước tiếp theo. Bài viết xuất phát từ hai câu của người trong ngành: Peter Steinberger và Boris Cherny (head of Claude Code tại Anthropic) - cả hai đều nói một điều: đừng prompt agent nữa, hãy viết loop để prompt thay bạn.

Loop engineering là gì

Cách làm cũ: bạn viết prompt, đọc output, viết prompt tiếp theo - tay bạn cầm agent cả session. Cách mới: bạn xây một hệ thống nhỏ tự tìm việc, phân công, kiểm tra, ghi lại trạng thái, rồi quyết định việc tiếp theo - hệ thống đó mới là người cầm agent, không phải bạn.

Loop không phải bash script tuỳ chỉnh như một năm trước. Bây giờ nó nằm thẳng trong sản phẩm: Codex và Claude Code đều có đủ primitives để xây một loop hoàn chỉnh, và hình dạng của chúng gần như giống nhau - bất kể bạn đang ngồi ở tool nào.

Năm thành phần của một loop

1. Automations - nhịp tim của loop

Automation là thứ biến một lần chạy thành loop thực sự. Trong Codex, bạn tạo automation với một prompt, một lịch chạy, và một worktree riêng. Các run tìm thấy vấn đề đổ vào Triage inbox, run không tìm thấy gì thì tự archive. Claude Code làm tương tự qua /loop (chạy lặp theo interval) và /goal (chạy cho đến khi điều kiện bạn viết là đúng, dùng một model riêng để grading thay vì để agent tự chấm bài của nó).

Đây là lớp surface công việc: CI failure hôm qua, issue mới mở, commit gần đây có gì lạ - automation đọc tất cả, viết vào file trạng thái, rồi phần còn lại của loop mới bắt đầu hoạt động.

2. Worktrees - tránh đụng nhau khi chạy song song

Ngay khi bạn chạy nhiều hơn một agent, các file bắt đầu xung đột. Git worktree giải quyết bằng cách cho mỗi agent một working directory riêng trên branch riêng, dùng chung repo history. Codex build sẵn worktree vào tool. Claude Code có git worktree, flag --worktree và setting isolation: worktree cho subagent - worktree tự dọn sau khi xong.

Worktree xử lý va chạm cơ học, nhưng review bandwidth của bạn vẫn là trần giới hạn thực sự - bạn review được bao nhiêu PR thì mới chạy được bấy nhiêu agent song song.

3. Skills - đừng giải thích project từ đầu mỗi session

Skill là cách để agent không phải tự suy đoán lại context của project mỗi lần chạy. Cả hai tool dùng cùng format: thư mục chứa SKILL.md với instructions và metadata, kèm theo script hoặc asset tuỳ chọn. Skill được gọi bằng $skill-name hoặc tự kích hoạt khi task description khớp.

Không có skill, loop phải tự derive toàn bộ context từ đầu mỗi cycle. Có skill, intent được viết một lần, agent đọc mỗi lần chạy, kiến thức bắt đầu compound thay vì reset.

4. Plugins và Connectors - loop chạm vào tool thực

Loop chỉ đọc được filesystem là loop nhỏ. Connector (build trên MCP) cho agent đọc issue tracker, query database, gọi staging API, drop message vào Slack. Connector viết cho Codex thường chạy được luôn trong Claude Code vì cả hai nói cùng MCP protocol.

Đây là sự khác biệt giữa agent nói đây là fix và loop tự mở PR, link ticket Linear, ping channel khi CI xanh - mà không cần bạn ngồi xem.

5. Sub-agents - tách người viết khỏi người kiểm tra

Model đã viết code sẽ rất ngại chấm điểm thấp cho chính nó. Một agent thứ hai với instructions khác - đôi khi model khác - bắt được những lỗi mà cái đầu tiên tự thuyết phục mình là không có. Trong cả Codex lẫn Claude Code, cấu trúc phổ biến là: một agent explore, một agent implement, một agent verify theo spec.

Sub-agent đốt token hơn vì mỗi agent có context và tool call riêng - dùng khi second opinion thực sự đáng tiền. Đây cũng là cơ chế bên dưới của /goal trong Claude Code: một model mới quyết định loop đã done hay chưa, thay vì để agent làm việc tự chấm điểm bản thân.

Thành phần thứ sáu: Memory

Một file markdown, một Linear board, bất kỳ thứ gì tồn tại ngoài conversation. Agent quên mọi thứ giữa các run, nhưng repo thì không - state file giữ lại cái gì đã thử, cái gì pass, cái gì vẫn còn open, để sáng hôm sau loop tiếp tục từ chỗ hôm nay dừng.

Một loop trông như thế nào

Automation chạy mỗi sáng trên repo: prompt gọi skill triage, đọc CI failure hôm qua, issue đang mở, commit gần đây, viết findings vào file trạng thái. Với mỗi finding đáng xử lý, loop mở một worktree riêng, gửi sub-agent vào draft fix, sub-agent thứ hai review draft theo skill và test hiện có. Connector mở PR và update ticket. Bất kỳ thứ gì loop không xử lý được thì land vào triage inbox cho bạn.

Bạn design nó một lần. Bạn ko prompt bất kỳ bước nào trong đó.

Ba vấn đề loop không giải quyết cho bạn

Verification vẫn là của bạn. Loop chạy không có người giám sát cũng là loop mắc lỗi không có người giám sát. Sub-agent verifier giúp done có nghĩa gì đó, nhưng done vẫn là claim, không phải proof. Bạn ship code bạn đã xác nhận là đúng - ko phải code loop nói là đúng.

Comprehension debt tích luỹ nhanh hơn. Loop ship code bạn không viết. Khoảng cách giữa codebase thực tế và cái bạn thực sự hiểu sẽ lớn dần nếu bạn không đọc output của loop.

Posture thoải mái là posture nguy hiểm nhất. Khi loop chạy ổn, rất dễ dừng có ý kiến và nhận lại bất cứ thứ gì nó trả về. Osmani gọi đó là cognitive surrender. Thiết kế loop để di chuyển nhanh hơn trên công việc bạn hiểu sâu là một thứ. Dùng loop để tránh hiểu công việc là thứ hoàn toàn khác.

Kết

Loop engineering không thay thế bạn - nó dịch chuyển leverage point. Câu của Boris Cherny không phải là công việc trở nên dễ hơn. Nó là: điểm bạn tác động vào công việc đã thay đổi chỗ.

Hai người có thể build đúng một loop và nhận hai kết quả hoàn toàn ngược nhau. Một người dùng nó để di chuyển nhanh hơn trên công việc họ hiểu sâu. Người kia dùng nó để tránh hiểu công việc. Loop không biết sự khác biệt. Bạn biết.

Build loop. Nhưng build như người có ý định ở lại làm engineer - không phải chỉ là người nhấn nút Go.