Tháng 12 năm ngoái, Boris Cherny đã gửi 259 pull request trong một tháng duy nhất. Tất cả đều do Claude viết. Anh ấy nói rằng mình không hề mở trình soạn thảo lần nào trong suốt thời gian đó.
Công việc của anh ấy không phải là viết code. Mà là viết thứ sẽ viết code. Peter Steinberger đã tóm gọn nó trong hai dòng đã được xem hơn 8 triệu lần: "Bạn không nên prompt các coding agent nữa. Bạn nên thiết kế các vòng lặp để prompt các agent của mình."
Đó là kỹ thuật vòng lặp (loop engineering). Bạn xây dựng một hệ thống nhỏ tự tìm việc, giao cho một agent, kiểm tra kết quả, quyết định bước tiếp theo, rồi để nó chạy trong khi bạn ngủ.
Điểm hạn chế xuất hiện ngay trong cùng tháng đó. Một vòng lặp của người khác đã chạy không được giám sát trong mười một ngày và đốt mất $47,000 trước khi có ai đó phát hiện ra. Vì vậy, đây thực sự là hai kỹ năng, và hầu như ai cũng chỉ dạy kỹ năng đầu tiên: xây dựng một vòng lặp để hoàn thành công việc, và xây dựng bộ phanh để ngăn nó đưa bạn vào chỗ chết.
Một câu hỏi quyết định bạn đã xây dựng vòng lặp nào: nó có hội tụ về một điều gì đó đúng đắn không, hay nó chỉ là một bước đi ngẫu nhiên đắt đỏ?
1. Một vòng lặp gồm sáu phần và một câu hỏi
Bên dưới lớp vỏ bọc, một vòng lặp hoạt động gồm sáu phần. Danh sách trông có vẻ quá đơn giản khi bạn nhìn thấy lần đầu. Chi tiết bên trong mỗi phần mới là nơi quyết định một vòng lặp hoạt động trơn tru hay để tiền đội nón ra đi qua đêm.
Bạn không còn phải xây dựng bất kỳ thứ gì trong số này bằng tay nữa. Một năm trước, một vòng lặp đồng nghĩa với một đống shell script mà bạn phải tự sở hữu và trông chừng mãi mãi. Giờ đây, các phần này được tích hợp sẵn trong các sản phẩm, và sáu phần tương tự cũng được áp dụng cho cả ứng dụng OpenAI Codex và Claude Code. Một khi bạn thấy được điều đó, công cụ không còn là vấn đề tranh luận nữa mà vòng lặp trở thành thiết kế.
1PHẦN NHIỆM VỤ TRONG VÒNG LẶP CODEX CLAUDE CODE2------------- -------------------------------- ------------------------- --------------------------3Trạng thái ghi nhớ qua các lần chạy markdown / Linear (MCP) markdown / Routines + MCP4Tự động hóa chạy theo lịch trình Tab Automations + Triage /loop (kỹ năng), Routines, /goal5Worktrees cách ly các agent song song Worktree mỗi luồng --worktree, isolation: worktree6Kỹ năng hệ thống hóa ý định của bạn ~/.agents/skills/SKILL.md ~/.claude/skills/SKILL.md7Trình kết nối chạm đến công cụ thực tế của bạn Máy chủ MCP (config.toml) Máy chủ MCP (.mcp.json)8Agent phụ tách người tạo khỏi người kiểm TOML trong .codex/agents/ .claude/agents/ + nhóm agent
2. Trạng thái là thứ duy nhất được kế thừa cho lần chạy tiếp theo
Hãy bắt đầu từ nền tảng, bởi vì mọi thứ khác đều dựa vào nó.
Một model sẽ quên khi một lần chạy kết thúc. Cuộc trò chuyện kết thúc, ngữ cảnh bị xóa, lần chạy tiếp theo thức dậy và không biết gì cả. Bộ nhớ trong cuộc trò chuyện chết theo lần chạy. Nó phải tồn tại trên ổ đĩa.
Trong thực tế, đó là một tệp duy nhất. Một tệp STATUS.md trong kho lưu trữ, hoặc một bảng Linear được truy cập thông qua một trình kết nối, lưu giữ những gì đã hoàn thành, những gì đang tiến hành, những gì tiếp theo, và một số ít những thứ mà vòng lặp không bao giờ được phép động đến.
1# STATUS.md (vòng lặp đọc cái này trước tiên, ghi nó cuối cùng)2## Đã hoàn thành3- [x] auth: đã chuyển sang tokens v2, kiểm tra đều xanh4## Đang tiến hành5- [ ] billing: tái cấu trúc webhook (PR #214, CI đỏ)6## Tiếp theo7- [ ] dashboard: kiểm tra không ổn định trong test/charts8## Không bao giờ9- không sửa đổi infra/ nếu không có sự cho phép của con người
Hãy coi vòng lặp như một ca làm việc ban đêm mà bạn không bao giờ theo dõi. Bạn không bị đánh giá bởi những gì nó đã làm lúc 3 giờ sáng. Bạn bị đánh giá bởi ghi chú đang đợi trên bàn của bạn lúc chín giờ. Hãy thiết kế ghi chú đó trước và phần lớn vòng lặp sẽ tự thiết kế phần còn lại.
3. Tự động hóa chính là sự khác biệt giữa một vòng lặp và thứ bạn chỉ chạy một lần
Một vòng lặp chỉ xứng đáng với cái tên đó khi nó tự động kích hoạt.
Trong ứng dụng Codex, bạn xây dựng một vòng lặp trong tab Automations: kho lưu trữ, prompt, nhịp độ. Các lần chạy tìm thấy thứ gì đó sẽ được đưa vào hộp thư đến Triage; các lần chạy không tìm thấy gì sẽ tự động lưu trữ. OpenAI sử dụng tính năng này cho phần nền tảng ít hào nhoáng của một cơ sở mã: phân loại issue hàng ngày, tóm tắt lỗi CI, bắt lỗi mà ai đó đã lén chèn vào tuần trước.
Claude Code đạt được điều này thông qua một vài primitive (khối xây dựng cơ bản), và các bài viết phổ biến thường hiểu sai chi tiết, vì vậy cần phải chính xác. /loop là một kỹ năng, không phải lệnh tích hợp sẵn, và nó chạy lại một prompt theo một nhịp độ nhất định trong khi phiên của bạn đang mở. Các tác vụ đám mây định kỳ được gọi là Routines, được thiết lập bằng /schedule, với thời gian tối thiểu là một giờ, và chúng tiếp tục chạy ngay cả khi bạn tắt máy tính xách tay. Không có crontab cục bộ.
Cái đáng học là /goal. Nó chạy cho đến khi một điều kiện bạn đã viết trở thành sự thật, và sau mỗi lượt, một model riêng biệt, nhỏ hơn sẽ kiểm tra xem bạn đã thực sự hoàn thành chưa. Agent đã viết code không được phép tự chấm điểm.
1# Claude Code: chạy cho đến khi thực sự hoàn thành, không phải cho đến khi cảm thấy hoàn thành2/goal tất cả các kiểm tra trong test/auth đều đạt và bước lint sạch sẽ34# Claude Code: một tác vụ đám mây định kỳ (tối thiểu 1 giờ)5/schedule phân loại PR hàng ngày lúc 9 giờ sáng67# Codex: một prompt tự động hóa (đặt nhịp độ trong biểu mẫu)8"Ngày trong tuần 9 giờ sáng: quét các PR đang mở, gắn cờ CI thất bại hoặc không có người đánh giá, đăng lên Triage."
Hãy viết điều kiện dừng như một hợp đồng. "Tất cả các kiểm tra trong test/auth đều đạt" là một hợp đồng. "Làm cho nó tốt hơn" là cách một vòng lặp chạy cho đến ngày lĩnh lương.
4. Worktrees giữ các agent song song tránh xa nhau
Ngay khi bạn chạy nhiều hơn một agent, kiểu lỗi sẽ thay đổi. Nó không còn là model nữa. Đó là hai agent đang ghi vào cùng một tệp, sự hỗn loạn giống như hai kỹ sư commit vào cùng một dòng code mà không ai nói chuyện với ai.
Một git worktree là bức tường ngăn cách giữa chúng: một thư mục làm việc riêng biệt trên nhánh riêng của nó, dùng chung lịch sử kho lưu trữ, để các chỉnh sửa của một agent không thể chạm đến bản sao của agent khác.
1# Claude Code: một bản sao làm việc biệt lập cho mỗi agent2claude --worktree feature-auth34# hoặc trên một agent phụ, trong phần frontmatter .claude/agents/<tên>.md:5# isolation: worktree67# Codex: chọn "Worktree" khi bạn mở một luồng (mỗi luồng một detached HEAD riêng)
Một lưu ý mà công cụ sẽ không đề cập đến. Worktrees loại bỏ sự va chạm, nhưng không loại bỏ được nút thắt cổ chai. Bạn vẫn là trần nhà. Dù bạn khởi động bao nhiêu agent, băng thông đánh giá của chính bạn mới quyết định bạn có thể tin tưởng bao nhiêu agent.
5. Kỹ năng là ý định của bạn, được viết một lần, ở bên ngoài
Một agent bắt đầu mỗi lần chạy với trạng thái "lạnh" và lấp đầy mọi khoảng trống trong ý định của bạn bằng một phỏng đoán đầy tự tin. Một kỹ năng chính là ý định đó được ghi lại ở nơi model đọc nó mỗi lần, để nó ngừng phỏng đoán.
Định dạng giống nhau trên cả hai công cụ: một thư mục chứa tệp SKILL.md với hướng dẫn và mô tả, cùng với bất kỳ script nào cần thiết. Nó được kích hoạt khi bạn gọi nó bằng tên hoặc khi nhiệm vụ của bạn khớp với mô tả của nó, đó chính là lý do tại sao một mô tả phẳng, theo nghĩa đen lại tốt hơn một mô tả phức tạp.
1# .claude/skills/triage/SKILL.md (Codex: ~/.agents/skills/triage/SKILL.md)2---3name: triage4description: Đọc các lỗi CI của ngày hôm qua, issue đang mở và commit5 gần đây; ghi từng phát hiện vào STATUS.md dưới dạng một nhiệm vụ.6---71. Lấy các lỗi CI và phân nhóm theo nguyên nhân gốc.82. Khớp từng lỗi với issue đang mở hoặc commit gây ra nó.93. Viết một nhiệm vụ STATUS.md cho mỗi phát hiện thực sự. Bỏ qua các nhiễu.
Nếu không có kỹ năng, mỗi chu kỳ sẽ học lại dự án của bạn từ đầu. Với chúng, vòng lặp sẽ trở nên sắc bén hơn một chút mỗi buổi sáng.
6. Trình kết nối cho phép vòng lặp hành động, không chỉ nói suông
Một vòng lặp chỉ có thể nhìn thấy hệ thống tệp là một món đồ chơi. Các trình kết nối, được xây dựng trên tiêu chuẩn MCP dùng chung, cho phép agent đọc trình theo dõi issue của bạn, gọi đến API staging, truy vấn cơ sở dữ liệu, đăng lên một kênh.
1# Claude Code2claude mcp add --transport http linear https://mcp.linear.app/mcp34# Codex5codex mcp add linear --url https://mcp.linear.app/mcp
Đây là ranh giới giữa một agent nói "đây là bản sửa lỗi" và một vòng lặp tự động mở pull request, liên kết ticket và báo cáo thành công. Vì cả hai công cụ đều sử dụng MCP, một trình kết nối bạn cài đặt cho một công cụ thường có thể dùng được cho công cụ kia.
7. Agent phụ giữ người tạo cách xa người kiểm tra
Động thái mang lại giá trị cao nhất trong bất kỳ vòng lặp nào là tách biệt agent viết code và agent kiểm tra code.
Một model đánh giá lại công việc của chính nó sẽ luôn đạt yêu cầu. Một agent thứ hai, với các hướng dẫn khác và lý tưởng nhất là một model khác, sẽ bắt được những lỗi mà agent đầu tiên đã tự thuyết phục mình.
1# Codex: .codex/agents/reviewer.toml2name = "reviewer"3description = "Người đánh giá PR phản biện: tính đúng đắn, bảo mật, thiếu kiểm tra."4developer_instructions = "Đánh giá như một người chủ. Giả định rằng tác giả sai5 cho đến khi bản diff chứng minh điều ngược lại."6model_reasoning_effort = "cao"78# Claude Code: phần frontmatter .claude/agents/reviewer.md9# name: reviewer10# description: Người đánh giá phản biện. Sử dụng sau bất kỳ thay đổi code nào.11# model: opus
Một agent khám phá, một agent triển khai, một agent xác minh dựa trên đặc tả kỹ thuật. Đây chính xác là những gì /goal đã làm ở tầng bên dưới: một model mới sẽ quyết định xem công việc đã hoàn thành chưa. Các ý kiến thứ hai tốn token, bởi vì mỗi agent chạy model và công cụ riêng của nó, vì vậy hãy chi tiêu chúng ở những nơi mà sai lầm phải trả giá đắt.
8. Một vòng lặp trông như thế nào
Kết hợp sáu phần lại với nhau và một luồng duy nhất trở thành một cỗ máy nhỏ.
Một tác vụ tự động hóa theo lịch trình chạy mỗi sáng trên kho lưu trữ. Nó gọi kỹ năng phân loại của bạn, đọc các lỗi CI qua đêm, các issue đang mở và các commit gần đây, và ghi từng phát hiện thực sự vào STATUS.md. Đối với mỗi phát hiện đáng làm, vòng lặp mở một worktree biệt lập, gửi một agent phụ để phác thảo bản sửa lỗi và một agent phụ thứ hai để đánh giá nó dựa trên các kỹ năng và kiểm tra của bạn. Các trình kết nối mở PR và cập nhật ticket. Bất cứ điều gì nó không thể xử lý sẽ đợi trong hộp thư đến Triage của bạn. STATUS.md ghi nhớ những gì đã thành công và những gì vẫn còn đang mở, để ngày mai bắt đầu từ nơi hôm nay dừng lại.
Những gì bạn thực sự thức dậy để thấy là một bản bàn giao ngắn gọn, không phải một bức tường log:
1# 9:00 sáng — bàn giao qua đêm của vòng lặp (hộp thư đến Triage của bạn)2SẴN SÀNG ĐỂ HỢP NHẤT3 PR #218 sửa lỗi kiểm tra không ổn định trong test/charts CI xanh4 PR #219 thử lại webhook khi gặp lỗi 429, thêm kiểm tra backoff CI xanh5CẦN BẠN6 auth/session.ts hai cách an toàn để sửa lỗi này; tôi đã chọn không cách nào, bạn quyết định7YÊN TĨNH8 7 lần chạy theo lịch trình không tìm thấy gì và đã tự động lưu trữ
Bạn đã thiết kế nó một lần. Bạn không cần prompt nó lần nào.
9. Xây dựng bộ phanh trước khi bạn rời đi
Đây là phần mà không ai dạy, và nó quyết định vòng lặp của bạn là tài sản hay trách nhiệm pháp lý.
Hóa đơn $47,000 đó không phải do một model thông minh nổi loạn. Đó là hai agent, một agent phân tích và một agent xác minh, mỗi agent lịch sự yêu cầu agent kia làm thêm việc, không có giới hạn bước, không có trần ngân sách và không có điều kiện dừng. Nó đã chạy trong mười một ngày. Chỉ cần một giới hạn duy nhất cũng đủ ngăn chặn nó ngay từ đầu.
Hãy lắp phanh trước khi tăng tốc. Đừng giao động cơ cho đến khi bạn đã giao bàn đạp phanh.
1# Hãy bắt chặt những thứ này TRƯỚC KHI bạn rời đi:2- giới hạn bước: --max-turns 50 (dừng cứng, không ngoại lệ)3- trần ngân sách: claude -p --max-budget-usd 10 (chế độ in; mỗi giai đoạn)4- bán kính tác động: một worktree, một nhánh, chỉ đọc bên ngoài src/5- bộ ngắt mạch: cùng công cụ + cùng đối số 3 lần liên tiếp = dừng lại6- kiểm tra an toàn: ghi một tín hiệu (heartbeat) vào STATUS.md mỗi lần chạy; sự im lặng sẽ cảnh báo bạn
Hãy xác định phạm vi của một vòng lặp dựa trên những gì nó có thể phá hủy, không phải dựa trên những gì bạn muốn nó làm: kho lưu trữ nào, nhánh nào, bao nhiêu đô la, bao nhiêu bước trước khi nó buộc phải thoát. Chọn bán kính tác động trước, nhiệm vụ sau.
Và hãy định giá nó một cách trung thực. Đội agent trăm con của Steinberger là có thật, và nó tiêu tốn khoảng 1,3 triệu đô la một tháng. Nó hoạt động vì OpenAI hiện đang thuê anh ta và trả hóa đơn. Trường hợp tiên tiến được tài trợ. Của bạn thì không. Với gói $20 đến $200, vòng lặp mang lại lợi ích là nhỏ, có giới hạn và hướng đến một công việc tẻ nhạt duy nhất, không phải một bầy đàn.
1CHI PHÍ (tất cả đều có thật, tất cả trong sáu tháng qua)2-----------------------------------------------------------------3259 PR trong 30 ngày một kỹ sư, 100% do Claude viết4$47,000 trong 11 ngày một vòng lặp mất kiểm soát không có giới hạn, không ai theo dõi5~$1.3 triệu mỗi tháng một đội 100 agent (hóa đơn được tài trợ)6-----------------------------------------------------------------7Cùng một công nghệ. Sự khác biệt là bộ phanh.
10. Cách các vòng lặp chết
Mọi vòng lặp thất bại đều chết theo một trong bốn cách. Hãy học tên của chúng ngay bây giờ để bạn có thể phát hiện ra chúng lúc 3 giờ sáng.
Đệ quy mất kiểm soát (Runaway recursion). Hai agent nuôi nhau mãi mãi. Phương pháp chữa trị là giới hạn bước và trần ngân sách ở trên, không có gì khôn ngoan hơn.
Chết thầm lặng (Silent death). Một lần chạy qua đêm của một nhà phát triển đã chạm đến một cửa sổ ngữ cảnh đầy, dừng lại, sau đó tiếp tục cố gắng tiếp tục vào cùng một bức tường trong khi vẫn tỏ ra đang hoạt động. Vòng lặp của bạn có thể đã chết hàng giờ và vẫn báo cáo tiến trình. Phương pháp chữa trị là một tín hiệu và một ngữ cảnh mới cho mỗi giai đoạn, không phải một lần chạy vô tận.
Bước đi ngẫu nhiên (The random walk). Không có điều kiện dừng có thể xác minh, vòng lặp trôi ra xa khỏi mục tiêu thay vì hướng tới nó. Một bộ kiểm tra vượt qua là một điểm cố định mà nó có thể đạt tới. "Trông có vẻ xong" thì không phải.
Nợ hiểu biết (Comprehension debt). Vòng lặp gửi code càng nhanh mà bạn không viết, thì khoảng cách giữa những gì kho lưu trữ của bạn làm và những gì bạn hiểu càng rộng. Hãy để nó chạy đủ lâu mà không đọc và bạn không còn là kỹ sư mà trở thành một con dấu cao su. Phương pháp chữa trị là một cổng kiểm tra do con người thực hiện mà vòng lặp không bao giờ được phép bỏ qua.
11. Xây dựng vòng lặp. Hãy luôn là kỹ sư.
Hai người có thể xây dựng cùng một vòng lặp và nhận được kết quả trái ngược nhau. Một người sử dụng nó để di chuyển nhanh hơn trong công việc mà họ hiểu tận gốc rễ. Người kia sử dụng nó để ngừng hiểu công việc hoàn toàn. Vòng lặp không thể phân biệt được họ. Bạn có thể.
Quan điểm của Cherny chưa bao giờ là công việc trở nên dễ dàng hơn. Đó là đòn bẩy đã thay đổi: từ prompt sang vòng lặp, và từ gõ phím sang phán đoán. Đó là một công việc khó hơn là prompt, không phải dễ hơn.
Vì vậy, đây là động thái, và nó có chủ đích là nhỏ, bởi vì điều này còn sớm và chi phí biến động rất lớn. Sáng mai, hãy lấy công việc nhàm chán nhất mà bạn vẫn làm bằng tay, đó là phân loại CI, đóng issue tồn đọng, theo đuổi một bài kiểm tra không ổn định và bao quanh nó bằng một vòng lặp có giới hạn. Phanh trước tiên. Đủ nhỏ để bạn vẫn đọc mọi diff mà nó gửi đi.
Không ai gửi 200 pull request mỗi tháng bắt đầu với một trăm agent. Họ bắt đầu với một vòng lặp duy nhất mà họ tin tưởng, và họ luôn là kỹ sư trong suốt chặng đường. Hãy xây dựng vòng lặp đó.





