Hai công cụ giải cùng một bài toán bề mặt (chạy nhiều CLI coding agent song song, xem trực tiếp được) nhưng đặt cược ngược nhau vào câu hỏi khó nhất của orchestration: làm sao để N agent ghi đồng thời mà không phá việc của nhau? superset chọn cách ly bằng filesystem (shared-nothing, merge sau). cmux-worker chọn chung một cây làm việc + điều phối thứ tự (shared-state, gate trước).
Bản chất khác nhau ở mô hình concurrency, không phải ở tính năng.
| Trục quyết định | superset.sh | cmux-worker |
|---|---|---|
| Mô hình concurrency | Shared-nothing · optimistic · fork/join | Shared-state · dependency-gated pipeline (giảm xung đột, không khoá ghi) |
| Đơn vị cách ly | git worktree (filesystem + branch) | cmux surface (process + agent session) |
| Xung đột ghi | Hoãn tới lúc merge, không tự giải | Giảm bằng dependency DAG (không khoá ghi); vẫn race nếu thiếu isolation |
| Kiểm chứng | Người đọc diff rồi merge | Verify pair tự động + oracle rerun, never-trust-DONE |
| Phục hồi lỗi | Worktree còn trên disk, người restart tay | Ladder P1 resume → P2 recreate → P3 fallback, idempotent |
| Trần thực tế | 5-7 agent/laptop E1 (marketing nói 100+) | Không nhắm fan-out lớn, nhắm chuỗi vai trò có gate |
| Tối ưu cho | Throughput nhiều task ĐỘC LẬP | 1 deliverable qua pipeline ĐƯỢC kiểm chứng |
Đây là một tradeoff kinh điển của distributed systems, không phải lựa chọn UI.
superset = shared-nothing. Mỗi agent một git worktree: working dir riêng, index riêng, branch riêng, dùng chung git object store E1. Hai agent không bao giờ đụng nhau lúc làm việc vì chúng ghi vào hai cây file vật lý khác nhau. Xung đột không biến mất, nó bị hoãn tới lúc merge branch về main. Đây là optimistic concurrency: giả định không đụng, xử lý đụng sau.
cmux-worker = shared-state + coordination. Mọi surface boot trong CÙNG một CWD, ghi chung một cây file. Xung đột CÓ THỂ xảy ra bất cứ lúc nào. Nó được giảm bằng điều phối thứ tự: dependency DAG đảm bảo downstream không chạy trước khi upstream cho kết quả thật, nên các stage có quan hệ phụ thuộc chạy nối tiếp E2. Nhưng đây là kỷ luật dispatch, KHÔNG phải global write-lock: thiếu worktree isolation, hai surface độc lập trong cùng repo vẫn có thể race. Giảm xung đột, không loại bỏ.
superset.sh · SHARED-NOTHING (fork/join) ┌─ worktree A (branch a) ── agent ──┐ main ──fork───┼─ worktree B (branch b) ── agent ──┼──► human review ──► merge └─ worktree C (branch c) ── agent ──┘ (xung đột giải Ở ĐÂY) cách ly: filesystem · song song thật · chi phí: N×checkout + merge cmux-worker · SHARED-STATE + COORDINATION (pipeline) creator ──►(kết quả thật)──► reviewer ──►(pass)──► tester ──► gate │ ▲ │ └──── CÙNG 1 cây file, gate dependency NỐI TIẾP stage phụ thuộc ──┘ cách ly: process · giảm xung đột (không khoá ghi) · chi phí: 0 merge, race nếu thiếu isolation
Hệ quả thẳng: superset mua được parallel thật + blast radius nhỏ (một agent hỏng không bẩn cây của agent khác) nhưng trả bằng disk N lần + bước merge + xung đột hoãn. cmux-worker mua được 0 merge + một nguồn sự thật duy nhất nhưng trả bằng ít song song hơn trên cùng file + rủi ro race nếu DAG sai.
Boundary nằm ở tầng nào quyết định chi phí và chế độ hỏng.
| Thuộc tính | git worktree (superset) | cmux surface (cmux-worker) |
|---|---|---|
| Tầng cách ly | Filesystem: working dir + index + branch riêng E1 | Process: PTY + agent session riêng, file CHUNG E2 |
| Chi phí tạo | Giây (share object store) E1 | Giây (new-surface --type terminal) E2 |
| Chi phí disk | Full checkout mỗi cây · repo 1GB × 10 = ~10GB E1 | ~0 (một cây duy nhất) |
| Thời điểm xung đột | Lúc merge (deferred) | Runtime (nếu 2 surface ghi cùng file) |
| Giải xung đột | không tự động người resolve merge E1 | Né bằng dispatch theo dependency, không phải bằng filesystem E2 |
| Trần song song thực | 5-7 agent/laptop comfortable E1 | Dependency-gated, không nhắm unbounded fan-out E2 |
| Backend agent | Claude/Codex/Cursor/Copilot/Amp/Gemini E3 | claude/codex/opencode/gemini E2 |
Điểm engineering quan trọng: cmux-worker hiện cách ly ở tầng process chứ không phải tầng file. Hai surface CÓ THỂ ghi đè cùng một file. Lá chắn duy nhất là thứ tự dispatch, không phải ranh giới vật lý. Đây là điểm yếu kiến trúc thật, xem §6.
Chỗ cmux-worker sâu hơn thật sự, có evidence chạy live.
superset: agent chết → worktree vẫn còn trên disk → người mở lại, restart tay. Cách ly đảm bảo blast radius nhỏ, nhưng phục hồi là thủ công. Không có ladder tự động được tài liệu hoá E3.
cmux-worker: có ladder phục hồi rõ ràng, resume-first E2:
RECOVERY LADDER (surface chết) P1 provider resume <sessionId> → giữ nguyên context, rẻ nhất P2 recreate + re-dispatch w/ context → mất context, có lại task P3 in-process sub-agent fallback → degraded, ephemeral, flag rõ CHỐNG DOUBLE-EXECUTE: mỗi dispatch mang task_id + check [[CMUXW-ACK]] trước khi (re)send → resume/heal/clone không chạy lại task đã chạy. RUN-LOG REPLAY: app restart → rebuild team từ run-log.jsonl (idempotent).
Gate W1 (worker-w1-kimi-real, Opus 4.8) chết giữa chừng: kimi-webbridge chặn file:// rồi nhận API Error: socket connection closed unexpectedly. Đây không phải kịch bản dựng sẵn, là lỗi thật. E4
incident: w1 file:// blocked + socket closed → surface idle, report chưa ghi
heal : đứng HTTP server :8771 + re-dispatch task_id=w1-heal-1
+ thêm playwright fallback nếu kimi-WB lỗi tiếp
result : surface resume, hoàn thành audit, ghi w1-human.md (PASS)
Đây là recovery ladder + idempotent re-dispatch bắn trong production, không phải sơ đồ trên slide. superset không có cơ chế tương đương được tài liệu hoá.
Ai/cái gì quyết định "việc này xong"? Đây là khác biệt vận hành lớn nhất.
superset: niềm tin = người đọc diff + merge. Tài liệu của chính họ thừa nhận đây là tường chắn scale: 10 agent × 15 phút = 10 diff/giờ mà người phải review; "manual worktree breaks down at scale" E1. Review throughput là bottleneck, không phải compute.
cmux-worker: niềm tin = verify pair tự động (e2e gate + human-being gate) + oracle rerun, nguyên tắc never-trust-DONE E2. Hai case thật chứng minh giá trị:
Cell opus-T1 tự báo DONE T1 PASS. Orchestrator rerun oracle.py → thực tế SyntaxError. Nếu tin self-report đã ship file hỏng. Oracle bắt được. E5
W1 (Opus, Chrome thật qua kimi-WB) đo DOM thật {emDash:0, len:3398} và bắt 2 lỗi prose tác giả bỏ qua: code-switch EN "watchable" ngay hero + verdict rơi thành cụm danh từ tiếng Anh. Cả hai đã được sửa sau gate. E4
Khác biệt cốt lõi: superset đẩy verification cho con người (không scale tuyến tính), cmux-worker tự động hoá nó (oracle/gate scale theo agent). Đổi lại cmux-worker tốn compute cho verify; superset tốn thời gian người.
Tách điều marketing nói khỏi điều tài liệu kỹ thuật của chính họ nói.
| Chỉ số | Landing nói | Guide kỹ thuật của họ nói E1/E3 |
|---|---|---|
| Số agent đồng thời | 10-100+ | 5-7 comfortable trên laptop hiện đại |
| Disk | "minimal disk space" | repo 1GB × 10 worktree = ~10GB |
| Rate limit | không nhắc | nhiều agent chạm rate limit Anthropic nhanh hơn |
| Xung đột | "no merge conflicts" | 2 agent sửa cùng file khác branch → conflict lúc merge |
| Scale | "100+ agents" | "manual worktree breaks down at scale", review là bottleneck |
"100+" là trần lý thuyết. Trần thực dụng theo docs của chính superset là ~5-7, chặn bởi disk + rate limit + băng thông review của con người.
| Nguồn | Model | Kết quả | Cost | Tỉ lệ |
|---|---|---|---|---|
| Benchmark 3×3 260614, oracle-verified E5 | opus-4-8 | 3/3 | $2.9617 | 5.12× |
| sonnet-4-6 | 3/3 | $1.0053 | 1.74× | |
| haiku-4-5 | 3/3 | $0.5789 | 1.00× | |
| Gate run này model-tier theo vai E4 | W2 health · haiku | PASS | $0.5763 | +143 dòng |
| W1 human · opus | PASS | $2.3806 | +78 dòng |
Phát hiện benchmark: với oracle rẻ trong loop, cả 3 model đạt chất lượng y hệt (9/9), nên cost là khác biệt duy nhất → Haiku thắng 5.12× zero quality loss cho task verify được. Caveat trung thực: 3 task không tách được các model (cả T3 cũng pass mọi model), nên run này KHÔNG định vị được chỗ Opus đáng giá 5× của nó. Không suy rộng "Haiku luôn đủ" sang việc mơ hồ/không oracle E5. Đây là lý do gate run này tier theo vai: health=Haiku, human-judgment=Opus.
Không có cái thắng tuyệt đối. Khác target.
isolation: worktree nhưng chưa phải default cho team >1 creator. Đây là gap rõ nhất, nên port chính ý tưởng kiến trúc của superset.Mọi số liệu trong bài map về một nguồn ở đây. Dành cho reviewer truy vết.