核心命題: 當一間創投機構自己開源了「跑自己公司」的 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 罕見地公開了內部三代演化史:
- 第一代:Ruby 小腳本 agent loop + 幾個內部數據工具 + cron/webhook 觸發器
- 第二代:給每個員工配一個 Hermes 實例當私人助理(50+ 個)— 有用,但「管理艦隊本身成了新負擔」:50 份設定、50 份憑證、50 個沒人知道在跑什麼的排程
- 第三代: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.ts 的 filterTapeForAudience:在共享房間裡,不同權限的人看同一場 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:
- Admin grant 變更 — 如果 Agent 能改授權,被注入的 Agent 可以給自己提權、把別人降權
- Impersonation(扮演他人) — Agent 永遠以該 turn 解析出的 principal 身份行事,沒有切換身份的 API
- 命令審批決定 — 審批是人在自己的 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 的工程紀律,幾條值得直接抄:
- 零注釋標準 — 「倉庫裡永遠不留注釋」:不寫解釋性注釋、docblock、TODO/FIXME、lint 抑制、註解掉的代碼。意圖用命名、結構和測試表達,理由寫進 commit message。
- 修每一個實例,不只修被報告的那個 — 發現 bug 就 grep 全倉找同一模式,一次全修。「五個兄弟調用點不動,就是等待被重新發現的回歸。」
- 修復應該讓系統更簡單 — 優先刪代碼和合併,而不是加層、加 flag、加特例。
- Fresh-context review 強制 — 「永遠不要在同一個寫出變更的上下文裡自我審查……產出 diff 的上下文已經相信它是正確的,而這個信念正是 review 要擊敗的偏見。」必須派一個沒看過你寫代碼的獨立 review agent;CI 綠了不算 review。
- Durable by default — 「一個反覆犯的錯誤:把系統後續依賴的狀態塞進進程內存。核心是藍綠部署、多實例運行——任何操作員或系統之後要讀回的東西(審計、日誌、隊列、解析後的配置)必須在持久存儲裡,永遠不能只放 RAM。」
- 私有 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 init 會 materialize 一份「部署技能」給 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 源碼裡有七樣東西值得直接偷:
- Audience-filtered tape — 共享房間裡按觀眾權限過濾對話記錄,無權內容換成結構佔位符而不是直接刪(保持上下文完整性)。任何「多人共用一個 Agent」的場景都需要。
- Egress 代理三件套 — metadata 端點封鎖 + link-local 封鎖 + DNS 重解析。給任何會執行模型的沙盒加一層出境關卡,成本一個文件。
- 「授權未來的決定必須來自 Agent 外部」 — 提權、扮演、審批三件事永遠不給 Agent self-API。這條原則可以直接變成任何 Agent 系統的紅線清單。
- npm min-release-age=7 — 一行 .npmrc 配置,擋供應鏈投毒的窗口期攻擊。
- Fresh-context review — 寫代碼的上下文不許審自己的代碼。我們用 external supervisor 做同樣的事,QM 把它寫成了制度。
- Durable by default — 多實例系統裡,任何之後要讀回的狀態都必須落盤。RAM 只能做緩存。
- 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 官方公告及第三方報導,可能隨時間變化。本文為技術研究,不構成部署或採購建議。