---
title: "Một vòng lặp vẫn chạy sau khi tôi gấp máy lại"
description: "Peer messaging, auto-compact và goal mode là ba tính năng bình thường. Đặt chúng vào cùng một session, tôi có một agent biết nói chuyện với đồng loại, cố tình quên, và vẫn chạy tiếp sau khi tôi gấp máy lại."
date: 2026-10-07
---

Tôi đọc về ba tính năng này riêng lẻ, cách nhau mấy tháng, và đứng riêng thì cái nào cũng hợp lý. Agent nhắn tin được cho nhau. Compaction cắt bớt context trước khi nó tràn. Một chế độ mà bạn nêu ra mục tiêu rồi agent cứ làm cho tới khi xong. Chẳng có gì lạ. Đọc riêng từng cái, chúng nghe như mấy cải tiến cho đỡ khổ.

Đọc cùng lúc thì mọi thứ đổi khác. Một agent nhắn tin được với peer, cố tình quên, rồi đuổi theo một mục tiêu suốt nhiều giờ, không còn là ba tính năng nữa. Đó là một vòng lặp vẫn chạy sau khi tôi ngừng dõi theo. Tôi bắt đầu gọi nó là vòng lặp. Càng nhìn kỹ càng thấy bất an.

## Mỗi mảnh ghép làm gì

Messaging đến trước. Một session phát hiện được các session khác và gửi cho chúng một tin nhắn: một phát hiện, một trạng thái, một câu hỏi. Session nhận đọc nó như input bình thường. Một đồng nghiệp giao việc cho một peer, báo chỗ tắc, hoặc hỏi ý kiến thứ hai mà không cần ai ngồi copy chữ giữa các terminal. Có lần tôi đứng nhìn một đồng nghiệp dán qua dán lại cái stack trace giữa hai cửa sổ suốt hai mươi phút, trước khi cả hai cùng nhận ra hai session đó lẽ ra tự gửi được cho nhau. Các session trên cùng một máy, session chạy nền, bạn đồng đội agent: chúng hợp thành một mạng nhỏ, và Claude định tuyến giữa chúng. Cơ chế là một socket riêng cho từng session trên máy tôi, không bao giờ qua server, và nội dung truyền là văn bản thuần. Một tin nhắn là input, không phải quyền uy: nó không duyệt được một permission prompt, không chạy được một slash command, không đổi cấu hình của tôi thay tôi.

Rồi đến compaction. Session dài rồi cũng đụng trần context, và compaction tóm tắt phần đã qua để công việc chạy tiếp. Bản cũ đọc lại toàn bộ hội thoại ngay lúc tràn, nên trước đây compaction hay đứng hình một hai phút. Tôi nhớ có lần terminal đứng im giữa chừng một vụ refactor, lâu đủ để tôi đi pha cà phê. Bản mới viết tóm tắt ở chế độ nền trong lúc công việc vẫn chạy, thành ra lúc cần là đã có sẵn. Bạn cũng chỉnh được thời điểm nó kích hoạt: đặt cửa sổ compaction thành một kích thước cố định, ví dụ ba trăm nghìn token, đổi lấy working set nhỏ hơn nhưng tóm tắt thường xuyên và rẻ hơn. Tôi chốt ra con số của mình y như chốt bất kỳ khoản ngân sách nào khác, bằng cách nhìn xem nó tốn bao nhiêu. Subagent tự compact theo lịch riêng, transcript của chúng nằm ở file riêng, nên hội thoại chính có compact thì những gì một worker học được vẫn còn nguyên.

Goal mode đến cuối. Thay vì một prompt, bạn nêu ra một kết quả. Agent cứ từng bước tiến tới cho tới khi đạt mục tiêu hoặc bỏ cuộc. Không cần chỉ dẫn từng lượt. Agent tự quyết làm gì tiếp, tự xem mình đã gần hơn chưa, rồi đi tiếp. Một công cụ lớn đã rút goal mode khỏi CLI sau khi người ta nhắm nó vào những việc không bao giờ dừng.

Mỗi cái đứng riêng đều mạch lạc. Vòng lặp là thứ xuất hiện khi chúng nuôi nhau.

```text
        goal mode: "keep working until X is true"
                        |
                        v
   +--------------> agent takes a step
   |                    |
   |                    v
   |            context fills up
   |                    |
   |                    v
   |         auto-compact writes a summary, drops the rest
   |                    |
   |                    v
   |            agent keeps going on the summary
   |                    |
   |          needs help or hits a blocker
   |                    |
   |                    v
   |         sends a message to a peer session
   |                    |
   |                    v
   +--------< peer answers, agent continues
                        |
                        v
              goal met ----------> stop
```

Tôi đặt vòng lặp đó quanh một công việc thật để xem nó làm gì. Agent không dừng khi context cạn, vì compaction cho nó chạy tiếp. Nó không kẹt khi gặp thứ một mình không làm nổi, vì nó hỏi được một peer. Nó không dừng khi làm xong một bước, vì mục tiêu vẫn chưa đạt. Mọi điểm dừng quen thuộc đều đã biến mất.

## Vì sao điều đó tuyệt vời và vì sao nó đáng sợ

Phiên bản tốt của vòng lặp là một công cụ khuếch đại sức mạnh. Một session đồng đội vẫn miệt mài với mục tiêu trong lúc tôi ngủ. Một worker hỏi một session chuyên môn để nhờ giúp thay vì đoán bừa, và có câu trả lời trong một tin nhắn thay vì qua tay tôi. Một cuộc migration dài mà agent compact xuyên qua lịch sử của chính nó và vẫn nhớ mục tiêu ở cuối. Đó là hình hài của "long-horizon agents" khi các primitive khớp vào nhau.

Phiên bản đáng lo cũng là vòng lặp đó, nhưng với mục tiêu sai, hoặc một mục tiêu trôi dạt. Compaction là mất mát. Bản tóm tắt giữ lại những gì người tóm tắt cho là quan trọng. Nếu nó đánh rơi ràng buộc đừng đụng vào database production, agent sẽ compact vượt qua ràng buộc đó rồi chạy tiếp. Nếu nó đánh rơi một chỉnh sửa tôi đưa ra một giờ trước, agent cũng compact vượt qua chỉnh sửa đó. Một vòng lặp chạy theo mục tiêu mà quên mất những rào chắn tôi đặt ra thì đâu còn theo đuổi mục tiêu của tôi nữa. Nó đang đuổi theo một phiên bản mục tiêu của tôi sau vài vòng tam sao thất bản.

Thêm mạng lưới peer vào thì vòng lặp càng khó thấy hơn. Tin nhắn chảy qua lại giữa các session. Một session peer được bảo làm gì đó thì nó làm. Hai session bất đồng, hoặc cùng đọc sai một bản tóm tắt đã compact, có thể phối hợp để tới một trạng thái mà riêng từng cái không tới nổi. Không phải ngẫu nhiên mà goal mode bị rút khỏi một trong những công cụ lớn: người ta nhắm nó vào những việc chạy hoang, mà một agent không dừng cho tới khi đạt mục tiêu thì kiểu gì cũng đạt, bằng bất kỳ con đường nào vòng lặp tìm thấy trước.

## Những rào chắn thực sự quan trọng

Tôi không nghĩ câu trả lời là tránh vòng lặp. Nó quá hữu ích, và nó đang đến với mọi agent harness, dù tôi có mời hay không. Câu trả lời là xây vòng lặp với phanh lắp sẵn.

Giữ trạng thái bền vững bên ngoài context window. Compaction không nên là nơi duy nhất lưu một ràng buộc hay một quyết định. Những luật quan trọng, quyền sở hữu, và định nghĩa hoàn thành thuộc về file trên đĩa, nơi tóm tắt không thể xóa mất. Session thì quên được; file thì không.

Cho vòng lặp một điều kiện dừng nằm ngoài mục tiêu. Một ngân sách thời gian hoặc token, cái nào hết trước. Goal mode không có trần thì ngầm giả định mục tiêu quan trọng hơn mọi thứ khác, mà có lúc không phải vậy.

Làm cho mạng lưới peer quan sát được. Ai nhắn cho ai, mỗi session quyết định điều gì, và quyết định nào còn để ngỏ. Một vòng lặp tôi không soi được là một vòng lặp tôi không tin được. Telemetry ở đây không phải hoang tưởng; đó là cách duy nhất để biết agent còn hiểu mục tiêu hay đã âm thầm thay nó bằng cái khác.

Giới hạn quyền của vòng lặp đúng bằng thứ mục tiêu thực sự cần. Một session đuổi theo mục tiêu với quyền ghi rộng và không có rào chắn command chính là công thức cho sự cố khi agent quyết định rằng database của tôi không ai dùng. Mọi câu chuyện agent phá hoại đều là biến thể của điều này: một vòng lặp được phép làm thứ mà mục tiêu chưa bao giờ đòi.

Và coi phát biểu mục tiêu như một hợp đồng, không phải một điều ước. Nêu rõ kết quả, các ràng buộc, và định nghĩa hoàn thành, rồi để agent đối chiếu với cả ba. Đồng ý "sửa vấn đề hiệu năng" mà không nói "không đổi public API" là cho vòng lặp quyền giải quyết một vấn đề tôi không hề có.

## Chia vai để vòng lặp vẫn dễ đọc

Một vòng lặp không phân chia công việc là một session làm hết mọi thứ rồi compact đến mức tự rối. Bản chạy được giao cho mỗi session một việc hẹp, và viết việc đó ra chỗ mà compaction không thể làm mất. Bốn vai bao gần hết những gì tôi vận hành.

Một coordinator sở hữu mục tiêu. Nó lập kế hoạch, giao việc, và duyệt kết quả đối chiếu với định nghĩa hoàn thành. Nó không tự implement. Coordinator vừa bắt tay viết code là vừa hết nhìn được toàn bộ bàn cờ, biến thành một worker chậm chạp với context của một người quản lý.

Một verifier phụ trách kiểm thử. Nó nhận công việc đã xong, chạy các kiểm tra, rồi báo lại cho coordinator kèm bằng chứng: đã chạy gì, cái gì pass, cái gì fail, và cái gì không xác minh được. Nó không bao giờ báo trực tiếp cho worker, và không bao giờ sửa thứ nó tìm ra. Verifier mà tự vá phát hiện của mình thì thôi, hết kiểm thử.

Số còn lại là các developer, mỗi người khoanh vào một phần của kế hoạch. Họ implement, tự chạy vài kiểm tra nhanh, rồi bàn giao cho verifier qua coordinator. Bí thì hỏi peer, và đó chính là lý do messaging tồn tại.

Điều luật khiến tôi tốn nhiều thời gian nhất để học: không session nào trong vòng lặp được hỏi con người một câu giữa chừng. Công cụ `AskUserQuestion` hoàn toàn sai cho một vòng lặp lẽ ra phải chạy không cần người. Một worker dừng lại hỏi "bạn thích cách nào hơn?" ngay giữa một mục tiêu được giao phải hoàn thành là một worker hiểu sai việc của mình. Câu hỏi là để dành cho coordinator. Coordinator hoặc trả lời từ kế hoạch, hoặc đưa ra một quyết định thực sự cho con người tại một checkpoint, chứ không phải giữa một bước. Tắt `AskUserQuestion` khỏi định nghĩa của worker và verifier là thay đổi một dòng mà dẹp cả một nhóm kiểu tắc nghẽn.

```json
{
  "name": "verifier",
  "description": "Tests finished work and reports evidence to the coordinator. Never fixes.",
  "tools": ["Read", "Bash", "Grep", "Glob"],
  "disallowedTools": ["AskUserQuestion", "Write", "Edit"],
  "model": "haiku"
}
```

Hình dạng đó đáng để copy cho mọi vai: những tool một vai cần, và những tool nó không được có. Một verifier không có quyền ghi thì không thể âm thầm sửa một test cho nó pass. Một developer không có `AskUserQuestion` thì không thể làm tắc vòng lặp chờ hướng dẫn mà lẽ ra nó phải tự rút ra từ kế hoạch. Các ràng buộc gắn vào định nghĩa sẽ sống sót qua compaction, vì chúng được nạp mới mỗi lần session khởi động thay vì mang theo trong một bản tóm tắt có thể đánh rơi chúng.

Vai coordinator là khó giữ hẹp nhất. Nó là session duy nhất phải nắm cùng lúc mục tiêu, kế hoạch, và trạng thái của mọi worker, đúng cái vai mà một bản tóm tắt đã compact gây hại nhiều nhất. Cho coordinator bộ nhớ bền vững để kế hoạch nằm ngoài context window. Khi một mục tiêu kẹt, xem lại góc nhìn của coordinator, vì một vòng lặp kẹt hầu như luôn là một coordinator mất mạch, cùng một tập worker đang trung thành thực thi một phiên bản kế hoạch không còn tồn tại.

## Điều này đang đi về đâu

Các mảnh ghép đang hội tụ vì chúng giải cùng một vấn đề nền từ những góc khác nhau: một context window đơn lẻ thì quá nhỏ cho công việc thật, và một agent đơn lẻ thì quá hẹp. Messaging mở rộng agent ra. Compaction kéo dài nó. Goal mode giải phóng nó. Gộp lại, chúng mô tả một agent sống lâu hơn context của mình, biết nhờ giúp, và không cần tôi có mặt ở mọi bước.

Các mảnh ghép đã được tài liệu hóa thành những tính năng riêng, đáng đọc thẳng hơn là nghe lời một bài blog: [cross-session messaging](https://code.claude.com/docs/en/cross-session-messaging), [agent teams](https://code.claude.com/docs/en/agent-teams), [subagents](https://code.claude.com/docs/en/sub-agents), và [session management](https://claude.com/blog/using-claude-code-session-management-and-1m-context) để biết compaction khớp vào bức tranh thế nào. Bản tự làm chạy trên chính máy tôi, qua một socket, với văn bản thuần giữa các session.

Điều đó gần với một đồng nghiệp hơn là một công cụ, và nó đáng nhận sự hoài nghi y như tôi dành cho một nhân viên mới được giao chìa khóa production. Vòng lặp rất mạnh, đường nối giữa nhớ và quên chính xác là nơi nó sụp đổ, và người đặt ra mục tiêu vẫn chịu trách nhiệm về những gì vòng lặp làm với nó. Đặt mục tiêu, quan sát vòng lặp, giữ các rào chắn trên đĩa nơi compaction không chạm tới. Rồi gấp máy lại và để nó làm việc, vì phần đó thật sự tuyệt.
