Orca: chạy song song nhiều coding agent, mỗi agent một worktree
Khi chạy nhiều hơn một coding agent cùng lúc, vấn đề không còn nằm ở model mà nằm ở bàn làm việc: agent nào ở checkout nào, dev server nào chiếm cổng nào, diff nào đã sẵn sàng để review. Orca là một môi trường phát triển cho agent, mã nguồn mở, xây quanh git worktree. Nó là gì, worktree giúp chạy agent song song an toàn ra sao, cấu hình repo để dùng được thật, cho nhiều agent đua cùng một việc, điều khiển Orca bằng CLI, chạy trên máy remote, và những chỗ nó còn thiếu.

English version: Orca: Running Several Coding Agents in Parallel, Each in Its Own Worktree. Phần 10 của series. Phần trước: Graph engineering. Phần sau: Paseo.
Bàn làm việc của tôi hồi tháng 3 trông thế này: năm tab terminal, Claude Code ở hai tab, Codex ở một tab khác, hai git worktree tôi tự tạo bằng tay, và một file text nhắc tôi branch nào nằm ở thư mục nào. Một buổi chiều, hai agent cùng sửa một checkout vì tôi khởi động agent thứ hai nhầm tab. Không agent nào nhận ra. Tôi mất hết phần còn lại của ngày để gỡ một diff chứa một nửa thay đổi của mỗi bên.
Model không phải vấn đề. Chạy một agent là một cuộc hội thoại. Chạy bốn agent là việc vận hành: cô lập, ghi chép sổ sách, review, và biết agent nào đang cần mình ngay lúc này. Orca là công cụ đầu tiên tôi dùng coi đó chính là công việc cần giải quyết.
Orca là gì
Orca là một ứng dụng desktop mã nguồn mở, giấy phép MIT, do team Stably AI làm, tự gọi mình là agentic development environment (ADE). Nó chạy trên macOS, Windows và Linux, kèm ứng dụng đồng hành trên iOS và Android.
Điều quan trọng cần hiểu là Orca không phải gì. Nó không phải một agent và không có model. Nó là chỗ chứa những agent bạn đang dùng: Claude Code, Codex, CLI của Cursor, GitHub Copilot, OpenCode, Antigravity, Qwen Code, tổng cộng hơn ba mươi agent có tên, và bất cứ thứ gì chạy được trong terminal. Thứ Orca thêm vào là không gian làm việc bao quanh chúng. Mỗi task có git worktree riêng, terminal riêng, trình duyệt riêng và khung diff riêng, tất cả trong một cửa sổ, với một sidebar cho biết agent nào đang làm, agent nào đang chờ input, agent nào đã xong.
Bên trên là các tính năng giúp quản lý được cả một nhóm agent: công cụ review gửi comment trên diff ngược lại cho agent, tích hợp GitHub, GitLab, Linear và Jira để một worktree có thể bắt đầu từ một issue hay một PR, SSH worktree trên máy remote, một CLI mà chính các agent cũng dùng được, và một app điện thoại cho lúc bạn rời bàn.
Vì sao là worktree
Git worktree là một thư mục làm việc thứ hai gắn vào cùng một repository. Nó dùng chung object database và lịch sử với checkout chính nhưng có file riêng, index riêng và branch đang checkout riêng. Tạo bằng git thuần cũng được:
git worktree add -b fix-invoice-rounding ../app-fix-invoice-rounding main
git worktree add -b fix-invoice-rounding-2 ../app-fix-invoice-rounding-2 main
git worktree list
/tmp/wt-demo/app 0a10f4b [main]
/tmp/wt-demo/app-fix-invoice-rounding 0a10f4b [fix-invoice-rounding]
/tmp/wt-demo/app-fix-invoice-rounding-2 0a10f4b [fix-invoice-rounding-2]
Đó là toàn bộ câu chuyện cô lập cho coding agent chạy song song. Hai agent ở hai worktree không ghi đè file của nhau được, vì đó là những file khác nhau. Mỗi agent tự chạy test, build và commit trên branch của nó. Khi một agent xong, bạn review branch của nó như mọi branch khác.
Mọi thứ Orca làm với worktree, bạn đều làm được bằng git cộng kỷ luật. Trên thực tế, chính kỷ luật là thứ hỏng trước, và đó là lý do công cụ này đáng dùng. Orca tạo worktree, đặt tên branch theo task hoặc issue được liên kết, chạy setup script, mở terminal trong đó, khởi động agent bạn chọn, và dọn worktree cùng branch của nó bằng một cú click khi bạn xong việc.
Worktree cô lập file, và chỉ file. Hai agent cùng chạy npm run dev vẫn tranh nhau cổng 3000. Hai bộ test cùng trỏ vào một database Postgres local vẫn làm hỏng dữ liệu của nhau. Mọi thứ trong thư mục home (~/.config, cache toàn cục, Docker daemon) đều dùng chung. Hãy tính chuyện này trước khi khởi động năm agent, đừng đợi tới sau.
Cài đặt và phiên đầu tiên
Tải app từ trang của dự án, hoặc dùng package manager:
# macOS (Homebrew)
brew install --cask stablyai/orca/orca
# Arch Linux (AUR)
yay -S stably-orca-bin
CLI đi kèm sẵn trong app. Bật nó ở Settings → General → Orca CLI, rồi kiểm tra từ terminal bất kỳ:
command -v orca
orca status --json
Thêm một repository, và mỗi lần bấm "New Workspace" Orca tạo một worktree từ base ref của repo (thường là origin/main), hoặc từ một branch, một commit hay một PR khác bạn chọn. Đặt tên, chọn agent, gõ prompt. Làm thêm hai lần nữa là bạn có "phiên ba agent đầu tiên" như trong docs: ba worktree, ba agent, một cửa sổ.
Làm cho repository thân thiện với worktree
Lần đầu tôi chia việc cho ba agent trên chính blog Next.js này, cả ba mất bốn phút đầu để chạy npm install song song. Một worktree mới tinh không có node_modules, không có .env, không có build cache. Orca đọc file orca.yaml ở gốc repository để xử lý chuyện đó:
# orca.yaml (repo root)
scripts:
setup: |
npm ci --prefer-offline
npm run prerender
worktree:
sharedDirectories:
- .next/cache
scripts.setup chạy sau khi worktree được tạo (chính repository của Orca dùng đúng key này cho pnpm install của họ). Bạn cũng có thể đặt setup hook cho từng repository trong phần settings, và flag --setup run|skip|inherit của CLI quyết định cho từng worktree có chạy chúng hay không.
worktree.sharedDirectories link các thư mục bị gitignore từ checkout chính vào từng worktree thay vì copy hay build lại. Các mục phải là thư mục đã tồn tại và nằm trong gitignore; đường dẫn được track hoặc không tồn tại sẽ bị bỏ qua. Cẩn thận với thứ bạn chia sẻ. Chia sẻ build cache thì ổn. Chia sẻ node_modules thì nhanh, cho tới lúc một agent nâng cấp một dependency và các agent khác bắt đầu hỏng vì những lý do không nằm trong diff của chúng.
Những file bị gitignore cần được copy thay vì link thì liệt kê trong file .worktreeinclude ở gốc repo, mỗi dòng một đường dẫn cụ thể:
# .worktreeinclude (repo root)
.env.local
.vscode/settings.json
Tiện, nhưng đáng dừng lại suy nghĩ một chút. Thứ gì bạn liệt kê ở đây, mọi agent trong mọi worktree đều đọc được, và một agent đọc được secret thì cũng có thể in nó ra log, vào commit hay vào mô tả PR. Quy tắc của chúng tôi: worktree chỉ nhận một .env.local cho môi trường dev với credential phạm vi hẹp, giá trị thấp, không bao giờ là key production mà đôi khi vẫn nằm trong checkout chính của lập trình viên. (Nếu repository của bạn đang track một file .env chứa secret thật thì đó là vấn đề lớn hơn Orca, và là việc đầu tiên cần sửa.)
Chỉ dẫn cho agent không cần gì đặc biệt. Orca không đụng vào CLAUDE.md và AGENTS.md, mỗi agent đọc chúng từ worktree như bình thường. Hook theo repo trong .claude/ và .codex/ vẫn chạy khi Orca khởi động các agent đó, nên phần việc harness ở phần 2 dùng lại nguyên vẹn.
Cho các agent đua cùng một việc
Tính năng khiến Orca hút mắt trong các bản demo là chia một prompt cho nhiều agent rồi merge kết quả tốt nhất. Công thức trong docs rất đơn giản: ba worktree từ cùng một điểm xuất phát, mỗi worktree một agent khác nhau, cùng một prompt, chia pane để quan sát, rồi review từng diff và ship bản thắng. Xoá một worktree thua là xoá luôn branch của nó.
Docs cũng nêu ra điều biện minh cho chi phí. Khi các agent khác nhau cho cùng một đáp án, đáp án đó có lẽ đúng. Chỗ chúng tách nhau ra là chỗ khó của bài toán. Đó chính là ý "đồng thuận khác với kiểm chứng" ở bài trước, ở quy mô nhỏ hơn. Sự đồng thuận giữa các họ model khác nhau chỉ là bằng chứng yếu. Sự bất đồng là bằng chứng mạnh rằng bạn nên tự đọc đoạn code đó.
Cho đua thì hoá đơn nhân ba, nên tôi không cho đua mọi thứ. Tôi cho đua khi:
- task đủ mơ hồ để tôi muốn thấy hai, ba cách hiểu trước khi chọn một,
- nó chạm vào code mà một lỗi tinh vi rất đắt (tiền, phân quyền, migration dữ liệu),
- hoặc tôi đang đánh giá một agent hay model mới so với cái đang dùng, trên code của chúng tôi chứ không phải benchmark công khai.
Với task thường ngày, mỗi task một agent và chạy song song nhiều task là cách dùng cùng số tiền đó hiệu quả hơn.
CLI giúp việc chia việc thành script được. Đây là thứ tôi chạy khi muốn cho đua, với task viết sẵn trong một file để mọi agent nhận đúng một prompt:
#!/usr/bin/env bash
# race.sh — one prompt, three agents, three worktrees
set -euo pipefail
prompt="$(cat "${1:?usage: race.sh task.md}")"
slug="$(basename "$1" .md)"
for agent in claude codex antigravity; do
orca worktree create --name "${slug}-${agent}" --agent "$agent" \
--prompt "$prompt" --setup run --json
done
orca worktree ps --json
Sau đó tôi review trong app, nơi khung diff so mỗi worktree với điểm xuất phát của nó, đặt cạnh nhau.
Review những gì agent viết
Review là chỗ việc chạy agent song song thường gãy. Bốn agent sinh ra bốn diff trong hai mươi phút; một người không thể review cẩn thận chúng trong hai mươi phút. Hai tính năng của Orca giúp được.
Annotate AI Diff. Bạn để comment trên từng dòng cụ thể trong diff của agent và gửi chúng ngược lại cho agent đó làm chỉ dẫn tiếp theo. "Chỗ này phải dùng Decimal, không phải float" ghim đúng vào dòng đó là một prompt tốt hơn nhiều so với cùng câu ấy gõ vào terminal, và agent sửa ngay trong cùng worktree.
Attribution. Orca ghi lại dòng nào do agent viết và đánh dấu ở lề khung diff; dòng nào bạn tự sửa thì chuyển lại thành của người. Nhờ đó bạn biết nên dồn sự chú ý review vào đâu. Dữ liệu này chỉ nằm trong Orca, không được commit vào git, nên nếu cần cho audit thì export từ thanh công cụ của khung diff.
Không tính năng nào thay đổi được phép tính cơ bản. Nếu không review nổi thì đừng sinh ra. Số agent tôi chạy song song được quyết định bởi số diff tôi đọc kỹ được trong một phiên, với tôi là khoảng bốn.
Để agent tự điều khiển Orca
CLI không chỉ dành cho bạn. Cài skill của Orca là agent của bạn cũng dùng được nó:
npx skills add https://github.com/stablyai/orca --skill orca-cli
Khi đó, một agent đang làm việc trong worktree có thể mở terminal, khởi động dev server ở một pane bên cạnh, và dùng trình duyệt có sẵn của worktree để tự kiểm tra thay đổi giao diện của mình, tức là quy tắc "test như người dùng thật" ở phần 2, giờ có sẵn trình duyệt:
orca terminal split --direction vertical --command "npm run dev" --json
orca goto --url http://localhost:3000/blog --json
orca snapshot --json # accessibility snapshot with element refs like @e1, @e3
orca click --element @e3 --json
orca screenshot --json
snapshot trả về các tham chiếu phần tử mà click và fill nhận, nên agent làm việc với cấu trúc trang thay vì toạ độ pixel. Design Mode là phiên bản dành cho người: click vào một phần tử trong trình duyệt, HTML, CSS và một ảnh chụp cắt gọn của nó đi thẳng vào prompt của agent.
Còn có một lớp orchestration thử nghiệm, trong đó một agent điều phối tạo một run, định nghĩa các task có phụ thuộc, khởi động các worker có giám sát trong worktree riêng và chờ chúng báo lại. Nó thú vị và được đánh dấu rõ là thử nghiệm, với các flag thay đổi giữa các bản phát hành. Tôi đang theo dõi, chưa dựa vào nó. Nếu bạn cần một bộ điều phối ngay hôm nay, graph ở phần 9 với các worker gọi orca worktree create là con đường dễ đoán hơn.
Rời khỏi laptop
Năm agent, năm dev server và năm bộ test sẽ làm quạt laptop gào lên. Orca có hai cách chuyển việc sang chỗ khác.
SSH worktree. Thêm một host ở Settings → SSH và chọn nó khi tạo worktree. Agent, git và terminal chạy trên máy remote; editor và giao diện ở lại trên laptop, có tự kết nối lại và port forwarding để dev server ở máy remote mở được trong trình duyệt local. Chúng tôi dùng một build server lớn ở văn phòng cho việc này, và nó thay đổi số agent tôi sẵn lòng chạy.
Một Orca server remote. Một máy chạy Orca, hoặc bản headless orca serve, sở hữu project, worktree và các process agent, còn laptop, trình duyệt hay điện thoại của bạn kết nối vào như client:
orca serve --port 6768 --pairing-address 100.64.1.20 --json
Trong ví dụ của docs, pairing address là một IP Tailscale, và Tailscale cũng là thứ tôi sẽ dùng. Đừng mở cổng này ra internet. Server chạy agent với toàn quyền trên code và credential của bạn, nên chỗ của nó là mạng riêng.
App điện thoại ghép cặp được với cả hai. Nó thực sự hữu ích cho đúng một việc: một agent xong việc hoặc kẹt ở một câu hỏi lúc bạn không ngồi ở bàn, bạn nhận thông báo, và trả lời hay gửi chỉ dẫn tiếp mà không phải quay về.
Những chỗ còn thiếu
Vài điều nên biết trước khi chuyển cả team sang dùng.
Nó thay đổi rất nhanh. README nói team ship hằng ngày và danh sách tính năng lúc nào cũng chậm hơn changelog. Nghĩa là bug được sửa nhanh, và cũng nghĩa là hành vi thay đổi dưới chân bạn. Khi triển khai cho team, hãy ghim một phiên bản và nâng cấp có chủ đích.
Nó nặng. Đây là một app Electron chứa terminal, một trình duyệt Chromium cho mỗi worktree và bao nhiêu agent tuỳ bạn khởi động. Trên laptop 16 GB, bốn agent với bốn dev server là trần thực tế của tôi trước khi chuyển sang SSH worktree.
Nó không sandbox gì cả. Agent trong Orca chạy dưới user của bạn với quyền của bạn, y như khi chạy trong terminal của bạn. Worktree bảo vệ file khỏi nhau, không bảo vệ máy bạn khỏi agent. Cấu hình quyền của từng agent (phần 4) và, với việc rủi ro, một container hay một máy remote vẫn là việc của bạn.
Telemetry bật mặc định. Orca thu thập dữ liệu sử dụng ẩn danh và có tài liệu ghi rõ thu thập gì, tắt thế nào. Đọc trang đó trước khi cài lên máy chứa code của khách hàng, và tắt đi nếu hợp đồng yêu cầu.
Nhiều tài khoản cần cẩn thận. Orca hiển thị được mức dùng và thời điểm reset rate limit của Claude và Codex, và chuyển qua lại giữa các tài khoản. Tiện để tách subscription cá nhân và của công ty. Dùng nó để kéo giãn rate limit qua nhiều tài khoản có thể vi phạm điều khoản của nhà cung cấp, nên hãy đọc kỹ.
Orca hay thứ khác
Orca là công cụ đúng nếu bạn ngồi ở bàn, chạy nhiều agent trên cùng vài repository, và dành nhiều thời gian trong ngày để review những gì chúng viết. Nó là một không gian làm việc. Mọi thứ được thiết kế quanh một con người theo dõi và review trong một cửa sổ.
Nếu thứ bạn muốn là chiều ngược lại, agent chạy trên một máy nào đó còn bạn kiểm tra và điều khiển từ bất cứ đâu, ít giao diện hơn và thiên về daemon hơn, thì bài tiếp theo nói về Paseo, công cụ tiếp cận cùng bài toán từ hướng đó.
Tài liệu tham khảo
- Orca trên GitHub (MIT) và tài liệu
- Orca docs, Worktrees, Race three agents on the same task, CLI overview, Ways to run Orca
- Tài liệu Git, git-worktree