Phân tích kiến trúc · Multi-agent orchestration · So sánh có evidence

superset.sh vs cmux-worker

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).

Ngày: 2026-06-17 Nguồn: 4 (superset docs · SKILL.md · benchmark 260614 · telemetry run này) Mọi số liệu: có citation E# ở Appendix
§0

TL;DR cho người ra quyết định

Bản chất khác nhau ở mô hình concurrency, không phải ở tính năng.

Trục quyết địnhsuperset.shcmux-worker
Mô hình concurrencyShared-nothing · optimistic · fork/joinShared-state · dependency-gated pipeline (giảm xung đột, không khoá ghi)
Đơn vị cách lygit worktree (filesystem + branch)cmux surface (process + agent session)
Xung đột ghiHoãn tới lúc merge, không tự giảiGiảm bằng dependency DAG (không khoá ghi); vẫn race nếu thiếu isolation
Kiểm chứngNgười đọc diff rồi mergeVerify pair tự động + oracle rerun, never-trust-DONE
Phục hồi lỗiWorktree còn trên disk, người restart tayLadder 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 choThroughput nhiều task ĐỘC LẬP1 deliverable qua pipeline ĐƯỢC kiểm chứng
§1

Phân kỳ lõi: chiến lược cách ly

Đâ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.

§2

Cơ chế cách ly: số liệu cụ thể

Boundary nằm ở tầng nào quyết định chi phí và chế độ hỏng.

Thuộc tínhgit worktree (superset)cmux surface (cmux-worker)
Tầng cách lyFilesystem: working dir + index + branch riêng E1Process: PTY + agent session riêng, file CHUNG E2
Chi phí tạoGiây (share object store) E1Giây (new-surface --type terminal) E2
Chi phí diskFull checkout mỗi cây · repo 1GB × 10 = ~10GB E1~0 (một cây duy nhất)
Thời điểm xung độtLúc merge (deferred)Runtime (nếu 2 surface ghi cùng file)
Giải xung độtkhông tự động người resolve merge E1Né bằng dispatch theo dependency, không phải bằng filesystem E2
Trần song song thực5-7 agent/laptop comfortable E1Dependency-gated, không nhắm unbounded fan-out E2
Backend agentClaude/Codex/Cursor/Copilot/Amp/Gemini E3claude/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.

§3

Ngữ nghĩa hỏng & phục hồi

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).
● Evidence live · ladder chạy thật trong chính run này

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á.

§4

Mô hình kiểm chứng: ranh giới niềm tin

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ị:

Case 1 · oracle bắt false-DONE (benchmark 260614)

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

Case 2 · gate bắt defect tác giả bỏ sót (run này)

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.

§5

Scale & chi phí: số thật, bỏ marketing

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.

superset: marketing vs tài liệu của chính họ

Chỉ sốLanding nóiGuide kỹ thuật của họ nói E1/E3
Số agent đồng thời10-100+5-7 comfortable trên laptop hiện đại
Disk"minimal disk space"repo 1GB × 10 worktree = ~10GB
Rate limitkhông nhắcnhiề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.

Chi phí thật · telemetry đo được

NguồnModelKết quảCostTỉ lệ
Benchmark 3×3
260614, oracle-verified E5
opus-4-83/3$2.96175.12×
sonnet-4-63/3$1.00531.74×
haiku-4-53/3$0.57891.00×
Gate run này
model-tier theo vai E4
W2 health · haikuPASS$0.5763+143 dòng
W1 human · opusPASS$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.

§6

Khi nào dùng cái nào + gap mỗi bên phải đóng

Không có cái thắng tuyệt đối. Khác target.

Chọn superset.sh khi

  • Nhiều task ĐỘC LẬP, chơi throughput
  • Có băng thông người review diff
  • Muốn GUI polish + an toàn worktree
  • Chấp nhận merge sau, conflict giải tay
  • ≤ 5-7 agent (trần thực dụng)

Chọn cmux-worker khi

  • 1 deliverable qua pipeline ĐƯỢC kiểm chứng
  • Cần self-heal + persist qua restart/compact
  • Gate tự động thay băng thông review người
  • Chuỗi vai trò (creator→review→test), depth > breadth
  • Không cần fan-out hàng trăm agent

Gap mỗi bên phải đóng (đánh giá CTO)

APPENDIX

Evidence ledger

Mọi số liệu trong bài map về một nguồn ở đây. Dành cho reviewer truy vết.

E1 · superset architecture guide
worktree = working dir + index + branch riêng, share object store, tạo trong giây · disk 1GB×10=10GB · "5-7 concurrent comfortable" · "two agents same file → merge conflicts" · "no automated conflict resolution" · "manual worktree breaks down at scale" · review bottleneck 10 diff/giờ.
src: superset.sh/blog/parallel-coding-agents-guide
E2 · cmux-worker SKILL.md
worker = terminal surface + interactive agent · dispatch theo dependency (downstream chờ upstream kết quả thật) · recovery ladder P1 resume / P2 recreate / P3 sub-agent fallback · idempotent dispatch (task_id + [[CMUXW-ACK]]) · run-log.jsonl replay · monitor 300s · backend claude/codex/opencode/gemini.
src: .claude/skills/cmux-worker/SKILL.md
E3 · superset landing + repo
agent-agnostic (Claude Code/Codex/Cursor/Copilot/Amp/Gemini) · one-click open IDE · cloud workspace + port forwarding · không tài liệu hoá recovery ladder tự động.
src: superset.sh · github.com/superset-sh/superset
E4 · telemetry run này (e2e-human gate)
3 surface thật workspace D656A93E. W1 human (Opus, kimi-WB Chrome thật) chạy trên bản MARKETING: chết file://+socket → heal HTTP:8771 + task_id=w1-heal-1 + playwright fallback → PASS; DOM probe {emDash:0, len:3398}; bắt+sửa code-switch "watchable" + verdict noun-phrase. W2 runtime + W3 visual RE-RUN trên bản ENGINEERING này (06-17): W2 0 console error + IBM Plex Sans/Mono loaded + 13 font 200; W3 0 page-overflow @1280+375. Bản engineering thêm vào: codex-impl-review REVISE → 4 block fixed.
src: reports/{w1-human,w2-health,w3-visual,e2e-human-gate-summary}.md
E5 · benchmark 3 model × 3 task (260614)
9 cell ground-truth oracle-rerun · opus 3/3 $2.9617 / sonnet 3/3 $1.0053 / haiku 3/3 $0.5789 · Opus/Haiku=5.12× (khớp price ratio 25:15:5) · oracle bắt false-DONE opus-T1 (self-report PASS, thực tế SyntaxError) · enter-race 3/9 cell · caveat: task không tách được model, chưa định vị break-even của Opus.
src: plans/260614-1809-cmux-worker-3model-3test-benchmark/improve/findings.md