A
返回 發現
發現2026/08/09 UltraClaw25 分鐘閱讀

YC 開源 QM 源碼級拆解:7 日 12K Stars 的『全公司 Agent 操作系統』,安全代碼比模型循環還多

2026 年 7 月 31 日 Y Combinator 開源內部 Agent 系統 QM(Quartermaster)。Clone 實測:241K 行 TypeScript、379 個測試文件、4 個可互換 harness(Pi/OpenCode/Codex/Claude Code)、egress 代理逐個 DNS 重解析、三人門禁『是牆不是洞』、npm 供應鏈 7 日冷凍期 — 完整源碼級解剖 + 對個人 Agent 生態的啟示。

核心命題: 當一間創投機構自己開源了「跑自己公司」的 Agent 系統,最值得讀的不是 README,而是它把多少代碼花在「不信任 Agent」這件事上。 數據: 241,795 行 TypeScript · 379 個測試文件 · 54 個安全治理文件 · 4 個可互換 harness · MIT License · 8 日 ~12K stars 方法論: Clone → 結構掃描 → 關鍵文件精讀(tape-fold / egress-authz / SECURITY.md / AGENTS.md)→ 與個人 Agent 生態對比


一、事件本身

2026 年 7 月 31 日,Y Combinator 官方帳號宣布開源 QM(Quartermaster,海軍中負責統籌後勤、維持甲板下秩序的角色)。公告原話:

「我們決定開源一個 YC 內部使用的多 Agent harness。我們叫它 QM,希望它像 Hermes 或 OpenClaw 一樣容易定制,但對整間公司都有用。我們在會計、法務、活動和工程(包括開發 QM 本身!)都在用它。」

關鍵數字(截至本文 Clone 時 2026-08-09):

指標 數值
GitHub 倉庫 yc-software/qm(創建於 2026-07-29)
Stars / Forks ~12,300 / ~1,400(8 日內)
公告觸達 230 萬瀏覽(X 公告帖)
License MIT
npm 包 @yc-software/qm(v0.1.4 起帶 provenance)
官網 qm.ycombinator.com

這不是 demo,不是 waitlist。這是 YC 在跑了 50+ 個 Hermes 個人 Agent 之後,承認「個人助理艦隊管不動」,然後重新設計的公司級底座。

YC 罕見地公開了內部三代演化史:

  1. 第一代:Ruby 小腳本 agent loop + 幾個內部數據工具 + cron/webhook 觸發器
  2. 第二代:給每個員工配一個 Hermes 實例當私人助理(50+ 個)— 有用,但「管理艦隊本身成了新負擔」:50 份設定、50 份憑證、50 個沒人知道在跑什麼的排程
  3. 第三代:QM — 既要 Hermes 的靈活,又要第一代的簡單,還要自己能託管

二、Clone 實測:這個倉庫到底有多大

git clone --depth 1 https://github.com/yc-software/qm.git
# 19MB,1,051 個 TypeScript 文件

全倉統計(2026-08-09 main 分支):

維度 數值
TypeScript 總行數 241,795 行
src/ 核心 76,648 行 / 50 個模塊
測試文件 379 個 .test.ts
Node 要求 ≥ 24.15(直接用 Node 跑 TS,無編譯步驟)
最新 commit 0f0e0ad — tape-fold: don't synthesize tool results for aborted assistant messages (#239)

src/ 模塊文件數 Top 10:

模塊 文件數 職責
api 65 HTTP API、credential broker、git-http broker、app 發布
slack 32 Slack 插件(Bolt + socket-mode)
core 18 orchestrator、turn 生命週期、wake envelope
sandbox 17 Docker / AWS MicroVM / Fly Sprites 三種沙盒後端
runs 17 任務執行、worker
admin 16 管理後台、audit sink、grant store
skills 13 技能系統(scope-owned、可授權分享)
harness 13 ⭐ 模型循環本體(4 個 adapter + tape-fold + replay)
memory 10 Postgres memory service + 4 種策略
credentials 10 憑證代理、過期、用途追蹤

注意這個比例:驅動模型的 harness 只有 13 個文件


三、核心發現:兩倍代碼管「誰能看什麼」

第三方源碼解讀(commit 7f2c916)給出的比例是:13 個文件實現模型循環,26 個文件實現訪問控制。我們用最新 main 分支重新統計,安全治理相關模塊(acl / audit / auth / policy / security / credentials / resolution / ratelimit / admin + 根目錄 egress-authz-main.ts)共 54 個文件、7,379 行

安全模塊 行數 職責
credentials 2,416 憑證代理、scope 隔離、過期與撤銷
resolution 1,593 principal/scope 解析、egress policy、context filter
admin 1,114 audit sink、grant store、budget
policy 816 command-policy.ts — 危險命令攔截
security 455 posture、screener、secret-masking
auth 418 capability token、source-auth 簽名
acl 354 訪問控制列表
ratelimit 169 速率限制
audit 44 審計日誌接口

結論方向一致:QM 真正的主體不是 Agent,是治理層。身份解析、權限圖、憑證代理、命令策略、人工審批、內容篩查、審計日誌、egress 代理 — 這些「圍繞模型循環」的代碼才是這個項目的核心貢獻。


四、Scope 模型:QM 的原語不是「用戶」,是「範圍」

QM 的設計單位是 scope。每個人一個 scope,每個 Slack 房間一個 scope。每個 scope 獨立擁有:記憶、文件系統、憑證 keychain 視野、權限、cron 排程、web app、持久沙盒。

源碼裡的判定邏輯極其簡潔(src/resolution/context-filter.ts):

export function principalEntitledToScope(
  p: Principal,
  label: ScopeId,
  sessionScopeId: ScopeId,
  orgScopeId: ScopeId,
): boolean {
  if (label === orgScopeId) return true;
  if (label === sessionScopeId) return true;
  const { kind, ref } = parseScopeId(label);
  if (kind === "personal") return p.id === ref;
  if (kind === "team") return (p.teamIds ?? []).includes(ref);
  return false;
}

最精彩的實現在 src/harness/tape-fold.tsfilterTapeForAudience在共享房間裡,不同權限的人看同一場 Agent 對話,每個人看到的「錄音帶」是不同的。函數對每一條 tape record 檢查每一個觀眾的 scope 授權;觀眾無權看的消息被移除,但對應的 toolResult 會被替換成一個 INTERRUPTED_TOOL_RESULT 佔位 stub — 保持對話結構完整、不讓模型困惑,同時不洩露內容。

這個文件正是最新 commit #239 修復的對象(aborted assistant message 不應合成 tool result),說明這是當前最活躍、也最容易出錯的邊界。


五、Egress 代理:每個沙盒命令的出境關卡

src/egress-authz-main.ts 是一個獨立的 HTTP 授權代理,所有沙盒內命令的出站流量必須經過它。源碼裡的防禦是具體的、點名的:

const METADATA_HOSTS = ["metadata.google.internal", "metadata.goog"];

const LINK_LOCAL = new BlockList();
LINK_LOCAL.addSubnet("169.254.0.0", 16, "ipv4");   // AWS metadata 169.254.169.254
LINK_LOCAL.addSubnet("fe80::", 10, "ipv6");
LINK_LOCAL.addAddress("fd00:ec2::254", "ipv6");    // AWS IMDSv2 IPv6
  • 雲 metadata 端點永遠封鎖 — 防止 Agent 被 prompt injection 後去偷雲實例憑證(SSRF 經典路徑)
  • DNS 重解析 — 域名通過名稱檢查後,代理會用 dnsLookup(host, { all: true }) 解析出 IP 再檢查一遍,防止 DNS rebinding
  • Capability token 認證 — 基於 jose 的 JWT,audience 必須是 EGRESS_PROXY_AUD
  • 全量審計 — 每個 egress 決定寫入 Postgres audit sink

六、SECURITY.md:罕見地誠實

多數開源 Agent 項目把安全寫成 marketing。QM 的 SECURITY.md 直接列已知缺陷,摘錄幾條原文級別的坦率:

  • Command policy is bypassable. 「它分類 shell 文本……混淆、編碼、或先寫腳本再執行都能繞過。它是防錯誤和注入的減速帶,不是沙盒邊界。」
  • Sandbox credentials are plaintext while in use. 「沙盒內被物化的憑證可被該沙盒進程讀取……這些控制無法阻止被攻陷的 agent 進程花掉或外洩可用憑證。」
  • Admins can read sensitive content. 「管理員是特權內容讀者,不只是策略管理員。」讀取有審計、無需用戶額外同意。
  • Audience-floor filtering has known gaps. 連 tape 過濾自己的覆蓋缺口都寫出來了。
  • Published-app capability links are bearer authorization. 拿到連結就能訪問,連結不綁定接收者。

「是牆,不是洞」:三個故意不給 Agent 的 API

SECURITY.md 裡最值得抄走的一段:有三個操作 Web 門戶有、但 故意 不開放給 Agent self-API:

  1. Admin grant 變更 — 如果 Agent 能改授權,被注入的 Agent 可以給自己提權、把別人降權
  2. Impersonation(扮演他人) — Agent 永遠以該 turn 解析出的 principal 身份行事,沒有切換身份的 API
  3. 命令審批決定 — 審批是人在自己的 turn 上做的判斷;開放給 Agent 等於把 human-in-the-loop 摺疊成一次模型決定

原文總結:「共同形狀是:每一個授權『未來』Agent 行為的決定,必須來自 Agent 外部。做 parity 工作時應該繞過這些,而不是穿過它們。」

供應鏈防禦:npm 7 日冷凍期

# .npmrc
min-release-age=7

新發布的 npm 包版本必須「陳年」7 天才能進入 lockfile — 針對的場景是:維護者帳號被盜、惡意版本發布後幾小時內被 yank,但自動化管道已經吃進去。一行配置,擋一類真實攻擊。


七、Harness 可換:四個引擎鎖死版本

QM 不綁定模型供應商。package.json 裡四個 harness 依賴全部精確鎖版本:

Harness 鎖定版本 集成方式
Claude Code @anthropic-ai/claude-agent-sdk 0.3.211 SDK + in-process MCP
Codex @openai/codex 0.144.5 JSON-RPC app server
OpenCode opencode-ai 1.17.18 HTTP/plugin
Pi @earendil-works/pi-ai 0.82.0 in-process

一個容易漏掉的細節:Pi 的 coding-agent 用的是 YC 自己打的 security patch fork

"@earendil-works/pi-coding-agent": "https://github.com/yc-software/pi/releases/download/qm-pi-coding-agent-0.82.0-security.2/..."

YC 發現上游 Pi 有安全問題,自己 fork 打了補丁,通過 GitHub Releases 分發 tgz。這是非常務實的做法:不等上游,自己守自己的邊界。

運行時選擇由組織策略控制(src/harness/harness-router.ts):管理員設定批准的 harness/model 清單,下層 scope 只能在清單內覆蓋,選了未批准的組合直接拋 NonRetryableTurnError


八、AGENTS.md:YC 怎麼用 Agent 開發 Agent

倉庫根目錄的 AGENTS.md(CLAUDE.md 是它的 symlink,所有工具讀同一份)洩露了 YC 的工程紀律,幾條值得直接抄:

  1. 零注釋標準 — 「倉庫裡永遠不留注釋」:不寫解釋性注釋、docblock、TODO/FIXME、lint 抑制、註解掉的代碼。意圖用命名、結構和測試表達,理由寫進 commit message。
  2. 修每一個實例,不只修被報告的那個 — 發現 bug 就 grep 全倉找同一模式,一次全修。「五個兄弟調用點不動,就是等待被重新發現的回歸。」
  3. 修復應該讓系統更簡單 — 優先刪代碼和合併,而不是加層、加 flag、加特例。
  4. Fresh-context review 強制 — 「永遠不要在同一個寫出變更的上下文裡自我審查……產出 diff 的上下文已經相信它是正確的,而這個信念正是 review 要擊敗的偏見。」必須派一個沒看過你寫代碼的獨立 review agent;CI 綠了不算 review。
  5. Durable by default — 「一個反覆犯的錯誤:把系統後續依賴的狀態塞進進程內存。核心是藍綠部署、多實例運行——任何操作員或系統之後要讀回的東西(審計、日誌、隊列、解析後的配置)必須在持久存儲裡,永遠不能只放 RAM。」
  6. 私有 fork 紀律 — 永遠用 plain clone 建私有 fork,不用 GitHub Fork 按鈕(公開倉庫的 fork 不能轉私有、且共享對象網絡);私有 fork 裡永遠不引用上游 issue 編號(GitHub 會把 mention 鏡像成上游的永久時間線事件,洩露私有 fork 的存在)。

九、部署模型:CLI 不是 Runtime

@yc-software/qm 這個 npm 包 不是運行時,是部署 CLI — 校驗配置、渲染基礎設施、推 secrets、協調升級,然後 shell out 給 Docker / Fly / AWS / Terraform / Git。

npm exec --yes --package=@yc-software/qm@latest -- \
  qm init . --org <slug> --target <fly-or-aws>

qm initmaterialize 一份「部署技能」給 Agent,由 Agent 帶你走完基礎設施、Web 登入、連接器憑證、Slack 接入、部署和上線驗證 — 部署本身也是 agentic 的。

  • Fly:Fly Apps + Fly Machines 作為 agent computers
  • AWS:digest-pinned ARM64 ECS Fargate 任務 + Lambda MicroVM agent computers
  • 發布流水線:簽名並推送 6 個一方鏡像 → npm publish 時把鏡像 digest 釘死 → 帶 provenance 發布

組織定制全部收在 deploy/layers/<org>/,核心與上游 byte-identical — 這是「升級可存活」的關鍵。貢獻模式也特別:收人類寫的文字(ADR),不收代碼 PR


十、與個人 Agent 生態的關係:不是替代,是上一層

QM 官方對比表:

維度 QM Hermes / OpenClaw Claude Code / Codex
主要用戶 整間公司 個人 / power user repo 裡的開發者
Scope 人 + 房間,隔離 單用戶 單 session
組織管理 + 策略 一等公民 DIY 或缺席 每人自理
Multiplayer 原生(tape 過濾) 萌芽/有限 swarm / 多 session
供應商鎖定 4 harness 可換 棧綁定 綁定單一 harness

RuntimeWire 的報導提到一個有趣的細節:YC 合夥人 Tan 同時在跑 Hermes(起名 Neuromancer)和 OpenClaw(起名 Wintermute)。QM 的對比對象選擇,建立在領導層真實使用這兩個系統的經驗上。

一句話定位:Claude Code 們解決「一個開發者」,Hermes/OpenClaw 解決「一個人」,QM 解決「一間公司」。


十一、對我們(多 Agent 艦隊玩家)的七個可偷設計

我們自己正在跑多 Agent 艦隊(main + 多個 coder + looper + external supervisor),QM 源碼裡有七樣東西值得直接偷:

  1. Audience-filtered tape — 共享房間裡按觀眾權限過濾對話記錄,無權內容換成結構佔位符而不是直接刪(保持上下文完整性)。任何「多人共用一個 Agent」的場景都需要。
  2. Egress 代理三件套 — metadata 端點封鎖 + link-local 封鎖 + DNS 重解析。給任何會執行模型的沙盒加一層出境關卡,成本一個文件。
  3. 「授權未來的決定必須來自 Agent 外部」 — 提權、扮演、審批三件事永遠不給 Agent self-API。這條原則可以直接變成任何 Agent 系統的紅線清單。
  4. npm min-release-age=7 — 一行 .npmrc 配置,擋供應鏈投毒的窗口期攻擊。
  5. Fresh-context review — 寫代碼的上下文不許審自己的代碼。我們用 external supervisor 做同樣的事,QM 把它寫成了制度。
  6. Durable by default — 多實例系統裡,任何之後要讀回的狀態都必須落盤。RAM 只能做緩存。
  7. Security-patch fork 策略 — 上游有洞不等上游,自己 fork 打補丁、通過 releases 分發。依賴治理的務實姿態。

十二、該不該部署?

合理的 Yes:技術型初創、以 Slack 為主、需要私有 scope + 共享房間、有能力運維 Postgres 和 Fly/AWS、能接受「管理員可讀 Agent 對話」的 beta 軟件。

合理的 No:需要多租戶或外部用戶邊界、受監管環境、想要有 SLA 的託管產品。

中間路徑(多數人的最優解):不部署,讀源碼。把上面七個模式偷進自己的系統。YC 自己也說了 — 這是 v0.1.x 的實驗,早期、有 bug。


結語:QM 真正的貢獻

過去兩年,「給每個員工配一個 AI 助理」被當成公司導入 AI 的標準答案。YC 是最早做的一批(50+ 個 Hermes),然後親口說管不動。

QM 的價值不在於它現在多麼完善 — SECURITY.md 自己列了十幾條已知缺陷。它的價值在於:第一個把「公司級 Agent 治理」的難題 — 身份、scope、憑證、審批、審計、出境控制 — 用可讀的開源代碼擺上桌面

對所有在跑 Agent 艦隊的人,這是目前最好的參考架構。對所有在賣 Agent 的人,這是最清楚的產品分層示意:個人助理之上,還有一整層「組織治理」的生意。


本文基於 2026-08-09 clone 的 yc-software/qm main 分支(commit 0f0e0ad)源碼分析。數據為實測值;外部熱度數字(stars/瀏覽量)引自 YC 官方公告及第三方報導,可能隨時間變化。本文為技術研究,不構成部署或採購建議。