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"| ORC

Giờ 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. gh mở 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ựcTrạng tháiThực chất là gì
Bộ thực thi tự chủ (shell · edit · git · web)Có sẵnClaude Agent SDK
Clone → nhánh → commit → push → PRCó sẵnmột shell wrapper
Danh tính GitHub theo userCó sẵngh + token
Chạy test của repoCó sẵnlệnh của chính repo
Review diff soi-từng-khẳng-địnhCó sẵnmột reviewer agent
Stream trực tiếp quá trình làmCó sẵnluồng sự kiện của SDK
Kill switch & chốt duyệtCó sẵnmột cờ stop
Máy trạng thái run + event logMớihai bảng nhỏ
Workspace cô lập + giới hạnMớimột worker + worktree
Vòng lặp plan → build → test → review → PRMớiorchestrator
Giao diện (board · session · diff)Mớimộ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])
  1. Plan — đọc codebase, chẻ mục tiêu thành checklist kèm tiêu chí nghiệm thu rõ ràng.
  2. Build — code trong một bản clone cô lập, stream từng lệnh để tôi xem nó “nghĩ”.
  3. 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.
  4. Review — chạy một reviewer soi chính diff của nó trước khi dám hỏi tôi.
  5. 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.

PhaseGiao gìCông sức
P0 Data model & giao diệnRun record, event log, board rỗng nối endpoint thật~1–2 ngày
P1 Thực thi trong repoClone → agent sửa trong repo → push → PR~2–3 ngày
P2 Vòng lặp & chốt duyệtPlan → test-fix → review, chốt plan/push, steering~3–4 ngày
P3 Giao diện session liveBoard + plan, activity stream, diff, tests, PR~3–5 ngày
P4 HardeningCô lập, secret, rào chắn, ngân sách, audit~1–2 tuần
P5 Tích hợp teamTrigger 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átLàm gì
Cô lậpMỗ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 viToken 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ắnChỉ 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ậtQuét diff tìm key trước khi push; chốt .gitignore để .env không đi kèm
Ngân sách cứngTrần tiền theo từng run, dừng khi chạm trần, chi phí hiện live
Kiểm toánMọ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:

  1. Code không rời máy tôi. Không bên thứ ba nào giữ repo.
  2. 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.
  3. 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.

Xuất nội dung

Bình luận