Bạn giao một task bằng một câu. Một agent đọc repo, viết plan, sửa code, chạy test, sửa chỗ hỏng, tự review diff của chính nó, rồi mở pull request. Bạn review cái PR đó như review code của một junior. Đó là lời hứa của Devin, của background agent trong Cursor — và nó không phải chém gió, nó chạy thật.
Nhưng có mấy thứ làm tôi khó chịu. Code của tôi bị clone lên máy của họ. Chi phí tính theo từng task, nghĩa là công cụ đắt lên đúng lúc nó hữu ích nhất. Và cái agent là một hộp đen tôi cấu hình được nhưng không kiểm soát được — nó không biết convention của tôi, checklist review của tôi, định nghĩa “done” của tôi.
Nên qua vài buổi tối, tôi dựng lại đúng thứ đó trên phần cứng của mình, bằng gói Claude Max tôi vốn đã trả tiền. Tôi gọi nó là Origin, chạy ngay trong workspace agent self-host tôi dùng với team. Bài này là toàn bộ kiến trúc — vì một khi bạn nhìn ra nó, bạn sẽ hiểu một “kỹ sư tự chủ” không phải một moonshot. Nó là một lớp điều phối (orchestration) đặt lên trên những mảnh bạn gần như đã có sẵn.
Sự thật hơi phũ: phần lớn chỉ là “đường ống”
Tôi vẽ toàn bộ hệ thống ra trước khi viết dòng code mới nào. Đây:
flowchart LR
U["tôi / đồng đội"] -->|"giao · hoặc gắn nhãn issue"| O["giao diện Origin"]
O --> ORC["orchestrator"]
ORC --> BR["Claude Agent SDK"]
BR --> WS["bản clone repo cô lập"]
WS -->|"push nhánh + PR"| GH["GitHub"]
ORC -->|"chạy test"| TST["test runner"]
ORC -->|"soi diff"| RV["auto-review"]
BR -.->|"plan · tool · diff · test · pr"| O
GH -.->|"nhãn issue / comment PR"| ORCGiờ nhìn từng ô thực chất là gì:
- Bộ thực thi là một thư viện. Claude Agent SDK cho bạn vòng lặp tự chủ với công cụ thật — shell bền, trình sửa file, git, web search, MCP server. Bạn trỏ nó vào một thư mục, nó đọc, sửa, chạy lệnh cho tới khi xong. Đây mới là phần thực sự khó, và người khác đã viết sẵn.
- Vòng đời git là một shell script. Clone, tạo nhánh, commit, push, mở PR. Không có AI trong đó, và bạn
muốn không có — git xác định nghĩa là một cú “ảo giác” không bao giờ push được vào
main. - GitHub vốn đã là một API.
ghmở PR. Test chạy bằng lệnh của chính repo. Review chạy bằng reviewer bạn đã tin.
Khoảng 70% của một kỹ sư tự chủ là hạ tầng đã tồn tại rồi. Khi tôi map cái của mình:
| Năng lực | Trạng thái | Thực chất là gì |
|---|---|---|
| Bộ thực thi tự chủ (shell · edit · git · web) | Có sẵn | Claude Agent SDK |
| Clone → nhánh → commit → push → PR | Có sẵn | một shell wrapper |
| Danh tính GitHub theo user | Có sẵn | gh + token |
| Chạy test của repo | Có sẵn | lệnh của chính repo |
| Review diff soi-từng-khẳng-định | Có sẵn | một reviewer agent |
| Stream trực tiếp quá trình làm | Có sẵn | luồng sự kiện của SDK |
| Kill switch & chốt duyệt | Có sẵn | một cờ stop |
| Máy trạng thái run + event log | Mới | hai bảng nhỏ |
| Workspace cô lập + giới hạn | Mới | một worker + worktree |
| Vòng lặp plan → build → test → review → PR | Mới | orchestrator |
| Giao diện (board · session · diff) | Mới | một tab |
Cái mới thì nhỏ: một run record, một vòng lặp điều phối, và một giao diện để xem. Agent mang lại phán đoán. Mọi thứ xung quanh là phần mềm thường mà tôi kiểm soát hoàn toàn. Chính cách nhìn đó là chìa khóa.
Vòng lặp biến một “demo” thành một “đồng nghiệp”
Một lời gọi agent kiểu “làm đi” chỉ là trò ảo thuật. Thứ bạn dám cho lại gần repo thật là một máy trạng thái có các chốt kiểm soát (checkpoint):
flowchart LR
Q([task]) --> P[Plan]
P -->|"⚑ duyệt plan"| B[Build]
B --> T[Test]
T -->|fail| B
T -->|pass| R[Review]
R --> S[Ship]
S -->|"⚑ duyệt push"| PR([Pull request])- Plan — đọc codebase, chẻ mục tiêu thành checklist kèm tiêu chí nghiệm thu rõ ràng.
- Build — code trong một bản clone cô lập, stream từng lệnh để tôi xem nó “nghĩ”.
- Test — chạy bộ test. Fail thì đưa output ngược lại và sửa. Giới hạn vài vòng để không lặp vô tận.
- Review — chạy một reviewer soi chính diff của nó trước khi dám hỏi tôi.
- Ship — push một nhánh work, mở PR kèm tóm tắt. Không bao giờ merge vào
main.
Hai chặng có chốt duyệt của người: duyệt plan trước khi viết dòng nào, và duyệt trước khi push bất cứ thứ gì. Tư thế mặc định là quyết định thiết kế quan trọng nhất tôi đưa ra:
Origin là một đồng nghiệp chuyên mở pull request. Nó không phải một con bot có quyền commit vào
main.
Câu đó là ranh giới giữa “tự chủ mà tôi tin” và “tự chủ mà tôi sợ”. Tôi có đòn bẩy của một agent làm việc trong lúc tôi họp, và tôi giữ đúng một thứ quan trọng — nút merge.
Hai cái bảng và vài endpoint
Toàn bộ trạng thái nằm trong hai bảng. Một run là bản ghi bền; các sự kiện của nó là log chỉ-thêm (append-only), nên giao diện dựng lại hoàn hảo khi reload và mọi hành động đều truy vết được.
runs id · title · goal · repo · base_branch · work_branch
status (queued→planning→building→testing→reviewing→awaiting_push→done / blocked / failed)
plan · pr_url · budget · cost · approval_mode · member
run_events id · run_id · seq · kind (status·plan·tool·text·diff·test·pr·error) · payload
// chỉ-thêm · đã che secret · vừa dựng UI live vừa là nhật ký kiểm toán
Mọi thứ UI hiển thị và mọi thứ auditor cần đều là một phép chiếu của event log đó.
Dựng theo 6 phase
Tôi ship theo thứ tự phụ thuộc. P0–P1 là MVP chạy được trong khoảng một tuần — giao task, ra PR. Tới hết P4 là ngưỡng trước khi cho người khác đụng vào.
| Phase | Giao gì | Công sức |
|---|---|---|
| P0 Data model & giao diện | Run record, event log, board rỗng nối endpoint thật | ~1–2 ngày |
| P1 Thực thi trong repo | Clone → agent sửa trong repo → push → PR | ~2–3 ngày |
| P2 Vòng lặp & chốt duyệt | Plan → test-fix → review, chốt plan/push, steering | ~3–4 ngày |
| P3 Giao diện session live | Board + plan, activity stream, diff, tests, PR | ~3–5 ngày |
| P4 Hardening | Cô lập, secret, rào chắn, ngân sách, audit | ~1–2 tuần |
| P5 Tích hợp team | Trigger nhãn issue & comment PR, config per-project | ~3–5 ngày |
Cái 90% chẳng ai demo: làm cho nó an toàn
Mọi video autonomous-agent hào nhoáng đều dừng ở “nhìn nè, nó mở PR”. Khoảng cách giữa cái video đó và một công cụ team dùng hằng ngày nằm hoàn toàn ở phần an toàn không hào nhoáng. Tôi tốn phần lớn thời gian ở đây:
| Kiểm soát | Làm gì |
|---|---|
| Cô lập | Mỗi run có worktree riêng dưới user sandbox không đặc quyền, bọc trong giới hạn CPU/bộ nhớ/thời gian |
| Bí mật có phạm vi | Token GitHub chỉ nạp vào env của đúng một run, không lưu, không log; log được che |
| Rào chắn | Chỉ push nhánh work, không --force, danh sách cấm lệnh phá hoại, path allowlist |
| Quét rò rỉ bí mật | Quét diff tìm key trước khi push; chốt .gitignore để .env không đi kèm |
| Ngân sách cứng | Trần tiền theo từng run, dừng khi chạm trần, chi phí hiện live |
| Kiểm toán | Mọi lệnh shell, tool call, thao tác git ghi lại bất biến — ai, repo nào, làm gì |
Một agent có shell + token của bạn thì mạnh và nguy hiểm. Bạn phải coi token như plutonium. Không thứ nào lên hình đẹp, nhưng tất cả là lý do tôi dám trỏ cái này vào một codebase nuôi lương.
Vì sao tự sở hữu thì thắng
Self-host mua được ba thứ mà bản hosted về cấu trúc không thể cho:
- Code không rời máy tôi. Không bên thứ ba nào giữ repo.
- Chi phí là subscription, không phải công-tơ. Origin chạy qua gói Claude Max của tôi. Không có bộ đếm theo-task nhảy số đúng lúc công cụ chứng minh nó hữu ích.
- Nó làm theo chuẩn của tôi. Convention của tôi, checklist PR của tôi, định nghĩa done của tôi — vì tôi viết cái harness. Nó tái dùng đúng bộ skill, ngân sách và knowledge base mà các agent của tôi đang chung.
Và vì nó sống trong workspace của tôi, nó ghép nối được: gắn nhãn một issue thì một run tự khởi động; comment vào một PR thì nó sửa. Kỹ sư tự chủ trở thành một phần của luồng làm việc, thay vì một cổng riêng tôi phải ghé.
Rút gọn cho các tech lead khác
Một kỹ sư tự chủ không phải sản phẩm bạn bị buộc phải thuê. Nó là một mẫu điều phối:
Một agent SDK đủ mạnh, chạy trong bản clone cô lập của repo, bọc trong vòng đời git xác định và vòng lặp plan-build-test-review-ship, kèm chốt duyệt của người và rào chắn cứng.
Cứ mua bản hosted nếu đánh đổi hợp với bạn — đó là sản phẩm thật và nó tốt. Nhưng nếu bạn có code riêng tư, ngân sách cố định, và có quan điểm về cách phần mềm của mình được viết, thì hãy biết: cùng năng lực đó chỉ là một cuối tuần điều phối đặt lên các công cụ bạn đã chạy sẵn. Đòn bẩy khổng lồ. Chìa khóa vẫn nằm trong túi bạn.
Đó mới là điều cốt lõi.