深入 QM:我们阅读了 Y Combinator 的公司级代理运行时
QM 为每位员工和每个共享房间配备一台持久化的计算机、持久化内存、凭证和后台作业,然后通过一个策略核心将四种不同的编码代理框架路由起来。公开发布雄心勃勃、表述清晰,并且在其安全模型失效之处异常坦率。
By Ryan Merket · Published
Primary source: GitHub
Why it matters
QM turns YC's experience operating more than 50 internal agents into a self-hostable control plane, making permissions, persistent workspaces and fleet administration the core infrastructure problem.

已审查代码: yc-software/qm 在提交 7f2c916,该源修订为 npm 包 @yc-software/qm@0.1.4 所记录
在 Y Combinator 发布 QM 两天后,该项目已获得 6,600 个 GitHub star、700 个 fork、68 个 pull request 和 14 个未关闭 issue。这样的关注度很合理。QM 是少数由知名组织发起、旨在将本地编码代理模式转变为共享公司基础设施的开源尝试之一。
简短描述 —— “用于工作的多人代理框架” —— 低估了其中涉及的机械量。QM 是一个耐久且有作用域的代理运行层。模型循环是可替换的组件之一。其周围有身份解析、权限图、文件和内存边界、凭证中介、命令策略、人工审批、内容筛查、后台调度、应用发布、审计日志以及与云相关的沙箱生命周期管理。
这是我们对 RuntimeWire 发布报道 的后续。我们下载了公共仓库和 npm 包,将二者固定到相同修订,阅读了运行时和部署代码,生成了一个新的部署目录并运行了该包的 CLI 测试套件。结果是一个源代码级别的地图,展示了 QM 的功能、其最强思想所在,以及哪些安全承诺仍应被视为实验性。
精简版
- “多人”意味着人和房间获得隔离的作用域。 私信解析为个人作用域;频道或群组消息解析为共享状态。只有当当前受众的每个成员都有权查看时,才会保留来自先前回合的上下文。
- 持久计算机是核心产品理念。 每个作用域在沙箱内获得文件、已安装的软件和长期运行的进程。模型可以更换,而工作区保持存续。
- QM 支持 Pi、OpenCode、Codex 和 Claude Code。 它们实现了同一个 harness 接口,尽管能力不同。Codex、Claude 和 OpenCode 暴露原生子代理角色;Pi(推荐的默认)在没有原生子代理层的情况下运行作用域循环。
- npm 包是一个部署 CLI。 它不包含 QM 运行时。它生成一个部署仓库并通过 SHA-256 摘要固定六个预构建容器镜像。
- 内存是以纯文本形式存在并由模型辅助维护。 持久事实以条目形式保存在
memory/MEMORY.md;回忆使用不区分大小写的子串匹配、有限的上下文并可选地由模型合并。默认路径中没有向量数据库。 - 安全是控制平面,而非强化隔离的宣称。 命令规则、审批、凭证授予、受众下限和筛查增加了有用的摩擦。YC 自身的威胁模型指出命令策略可被绕过、凭证材料在沙箱中可见、筛查不完整且该系统面向单一受信任组织。
- 一条安全警告已过时。
SECURITY.md说已发布的应用可通过持有者能力链接访问。已固定的实现删除了那些查询令牌,拒绝铸造相关 cookie,并测试该链接“不会授予任何权限”。内置子域入口现在需要 portal 会话加上 ACL 成员资格,并有单独的短期所有者链接用于管理。
我们实际检查的内容
公共仓库的历史始于 7 月 29 日的一次提交,提交信息为 “Fresh repo history”。报告时的最新包为 0.1.4,于 7 月 31 日 18:03 UTC 发布。其 npm 元数据指向提交 7f2c916360f1797a8ff2a77ce2ce40c5fabab087。该修订贯穿本文使用。
| 检查项 | 结果 |
|---|---|
| npm 工件 | @yc-software/qm@0.1.4,126 个文件,256,580-byte tarball,1,211,641 bytes unpacked |
| Tarball SHA-256 | 51593f853eade42ed04f10e96e1c8ddffca876c5be0ee98d753636018ee5e473 |
| 源对应性 | 126 个包文件中有 125 个与固定的 cli/ checkout 完全字节对字节匹配;预期的例外是 manifest.json,发布作业会用生产镜像摘要重写它 |
| 包元数据 | MIT license,无运行时依赖,npm 签名和 SLSA 溯源记录 |
| CLI 冒烟测试 | qm --version、qm --help 和 qm init 在 Node 24.14.0 下运行成功 |
| 生成的项目 | 针对 Docker 的目标,包含 OpenAI 和 SMTP 设置;生成了配置、密钥模板、运行手册、部署 skill、镜像清单和示例沙箱扩展 |
| CLI 验证 | 类型检查通过;503 个 CLI 单元测试全部通过,无失败 |
| 源代码规模 | src/ 下 TypeScript 文件共 74,814 行;checkout 中共有 1,264 个文件;完整树中有 514 个测试/规范文件 |
74,814 行数字描述的是 src 下的 TypeScript 运行时,而非整个仓库或人工书写的逻辑行数。这是可复现的文件系统统计,主要用于衡量表面面积。最大的文件包括 2,841 行的 orchestrator、2,483 行的通用工具层和 2,047 行的 Pi 适配器。
我们没有将 QM 部署到 Fly.io 或 AWS、也没有连接真实的 Slack 工作区、提供真实模型凭证或执行完整的基于 Postgres 的根套件。仓库自身的 CI 更为广泛:五个 root-test 分片、Postgres 耐久性测试、类型检查、四个插件构建、镜像冒烟测试、若干 linters、死码检查、打包工件测试和部署契约测试。我们的独立执行覆盖了已发布的 CLI 路径。
YC 为什么要构建它
YC 的 发行说明 提供了简明的历史。组织一开始有一个简单的 Ruby 代理循环和一些内部数据工具,随后添加了定时任务和 webhook 触发器,然后为个人助理配置了超过 50 个 Hermes 代理。虽然单个代理很有用,但管理整个舰队成为问题。YC 想要保留该设置的灵活性、早期循环的简洁性,以及他们可以自行托管的基础设施。
该名称是 quartermaster(军需官)的缩写:负责甲板下协调工作的人。这个比喻契合代码。QM 在决定某次回合获得谁的计算、内存和权限方面投入的精力远多于定义模型提示的精力。
公共历史比正常的开源仓库披露得要少。SECURITY.md 说明公开源码发布会有意从新历史开始,且不支持私有历史哈希。可见的 40 次提交涵盖 7 月 29 日至 7 月 31 日。它们显示了发布准备和快速修复;但无法支撑对早期内部系统的取证性记述。
安装 QM 时随包发布的内容
第一个惊讶是 npm 包不是运行时。cli/README.md 直接说明:该包是一个发布与部署 CLI。它验证配置、渲染基础设施、推送密钥、协调升级并调用诸如 Docker、Fly、AWS、Terraform 和 Git 等工具。它本身没有 JavaScript 运行时依赖。
运行 qm init 会创建一个组织所有的部署目录。在我们的 Docker 目标测试中它生成了:
qm.config.jsonc,一个固定为0.1.4的包文件,包含 lockfile 输入和按摘要固定的镜像清单;.env.example包含密钥名,另有一个空的、被忽略的.env,而非凭证值;- 操作员文档和一个
AGENTS.md文件; - 一个针对 Codex 的部署 skill,带有设置、检查、部署和验证的运行手册;
- 为组织特定的 skills 和沙箱工具生成的示例目录。
发布流程构建六个镜像——core、web UI、admin、portal、auth 和 sandbox base——然后用 Sigstore 对每个精确摘要进行签名。npm 的发布工作流将占位镜像引用替换为这六个摘要并调用 npm publish --provenance。我们下载的包包含与该发布生成的相同摘要。此设计为操作员提供了不可变的第一方工件,同时将组织特定的部署状态保留在单独的仓库中。
这也创建了一个重要的审查边界。仅阅读 npm tarball 能告诉你如何生成部署。运行时行为存在于链接的 Git 修订对应的容器源中。安全审查需要同时查看两者。
有用的心智模型:一个作用域,一个持久计算机
QM 的顶层架构有三块持久部分:
- Postgres 保存会话、消息、内存修订、作业、授予、审计记录和其他控制平面状态。
- core API 负责解析身份与作用域、应用策略、调度工作、调用所选的 harness 并记录结果。
- 每个作用域的沙箱提供文件、命令、进程和已安装的软件。
Slack runs as an optional in-process plugin. The web UI, admin interface, authentication service and portal are optional HTTP services around the headless core. The runtime is TypeScript executed directly by Node; Fastify serves the API, Slack Bolt handles Slack, and the browser client is built with Vite and Lit. The repository README provides YC’s own concise diagram.
一次普通的交互大致如下进行:
- The Slack or web surface authenticates the sender and describes the current audience.
- Resolution maps the conversation to a scope and computes mounted scopes, instructions, ACL grants, command policy, security posture and egress floor.
- QM loads only the history and memory the full audience may see.
- The selected harness receives a common turn object and fixed set of QM tools.
- Tool calls run through policy wrappers. Commands execute inside the scope’s sandbox; credential use passes through the keychain and broker rules.
- Results and provenance can be screened before re-entering the model context.
- The reply is delivered, the turn is persisted and memory extraction runs asynchronously.
该顺序很重要。QM 并不要求每个模型供应商实现公司隔离。它在调用模型之前计算公司上下文,并在之后将工具层包裹在模型周围。
“Multiplayer” is an authorization graph
公开描述称每个员工和项目都有一个 agent。在代码中,agent 更好地被理解为已解析的作用域加上持久状态。src/types.ts 定义了五种作用域类型:
| 范围 | 典型含义 | 默认写入边界 |
|---|---|---|
personal |
一个员工,通常为直接消息 | 该人员的记忆、文件和设置 |
channel |
一个 Slack 频道或可比的房间 | 共享房间状态 |
group |
群组对话 | 共享群组状态 |
team |
一个持久的组织团队 | 团队层,通常以只读方式挂载到成员上下文 |
org |
公司范围的策略和知识 | 管理员控制的全局层 |
resolution service 会将 DM 映射为行为者的个人作用域,并将房间映射为共享的 channel 或 group 状态。当前作用域以读写方式挂载。组织和相关团队层可以以只读方式挂载。组织级指令位于较低作用域指令之上;本地自定义不能放宽组织的安全或审批下限。
最尖锐的实现细节是受众过滤器。context-filter.ts 仅当当前受众中的每个人都有权查看该条历史时才保留该历史项。如果一次私密交互变成共享交互,模型不会自动继承私密的记录。外发规则使用相同的保守形态:允许的主机在受众之间取交集,拒绝的主机取并集。
共享由 ACL 图支持。管理者授予或撤销访问权限;除非策略另行允许,接收者不能传递地转发共享对象。对于受众拥有的文件句柄,检查会同时考虑所有者和被授权的接收者。这是真正的授权逻辑,而不是告诉模型要小心的提示。
YC 的威胁模型仍记录了一个缺口:来源标签尚未覆盖每一条来源路径,且环境中的 Slack 判定器并不会执行完整的内部受众检查。受众下限是 QM 最重要的理念之一。其自身的维护者并不将其呈现为完整的信息流控制。
Memory: a notebook, an extractor and a janitor
QM 的默认记忆系统便于检查。每个可写作用域都有一个 memory/MEMORY.md 文件,包含最多 300 条要点。召回上限约为 6,000 字符。memory-service.ts 会去重精确事实,在笔记本满时删除最旧条目,并用小写 AND-子串匹配来回答记忆查询。
在默认实现中没有语义索引或向量嵌入存储。模型为纯文本账本提供智能。
在一段活动突发后——默认情况下,最多十轮、每轮之间不超过三分钟静默——per-turn 策略会请求模型提取持久的偏好、标识符和项目事实。其提示会排除秘密和系统机制。在 channel 或 group 中说出的事实也可能被复制到说话者的个人笔记本中,保留诸如 “said in #channel” 的来源注记;来自 DM 的事实会被排除在该复制路径之外。
在新增十条事实后,合并过程可以通过 ADD、UPDATE 和 DELETE 操作重写笔记本。提示要求显式的“remember this” 指令不得被弱化或删除,并且来源注记应得以保留。数据库保留修订记录,因此记忆可以恢复。由于抽取和合并发生在答案之后,新记忆为最终一致性,而非保证在刚完成的该轮中即可出现。
存在两种替代策略。agent-only 将维护留给显式的 agent 操作。scratch-promote 会写入带日期的临时日志,默认回忆最近两天并周期性地请求模型将持久项提升到笔记本中。策略可在界面后选择;per-turn 为默认策略。
这种方法易于审计和编辑。但它也使模型成为保留策略的一部分。错误的抽取可能记录错误事实,且持久材料可能无限期存在,除非用户或管理员将其移除。QM 承认这一风险。
The sandbox implementations are materially different
沙箱接口涵盖进程执行、持久磁盘、临时环境、挂起、恢复和可选的外发能力。可用的后端并不提供相同的隔离级别。
| 后端 | 持久状态 | 生命周期 | 代码中的网络态势 |
|---|---|---|---|
| Local Docker | 每个作用域的容器和命名卷 | 容器可以停止并在之后重用其卷 | 报告没有本地外发控制 |
| Fly Sprites | 整盘持久化,默认镜像配置为 100 GB | 自动睡眠与恢复 | 仅在配置了代理时支持域名外发;否则报告无外发 |
| AWS MicroVM | 主目录归档到 S3 | 启动时恢复;在会话上限前旋转 | 报告没有本地外发控制 |
AWS 的默认配置为四个 vCPU、8 GB RAM、8 GB 磁盘和最长八小时会话,且在 7.5 小时时进行旋转。在挂起或旋转之前,作用域的主目录会被打包并写入 S3;下一个 VM 会将其恢复。这就是“已安装的工具能保留已安装状态”在短暂计算基底上得以继续的方式。
QM 还为狭窄任务创建临时沙箱。临时环境不含凭证,仅挂载组织全局上下文,并在该轮后销毁。这使它们在以较小冲击半径处理不受信任材料时非常有用。
“耐久计算机(durable computer)”这一表述不应被理解为通用的网络沙箱。部署描述符接受外发配置,然而 docs/deploy-directory.md 表明第一版会验证该描述符,但并不声称在运行时强制执行。安全文档指出条件性外发取决于后端。Local Docker 和 AWS 在此接口上明确报告没有本地外发支持。
Four harnesses, one core—and uneven capabilities
QM 在此修订中固定了四种模型—agent 集成:
| Harness | Pinned dependency | Integration style | Native child agents in QM |
|---|---|---|---|
| Pi | @mariozechner/pi-ai 0.82.0 plus YC’s packaged coding-agent fork |
In-process | No native QM child-agent layer |
| OpenCode | 1.17.18 | HTTP/plugin | Research, code and consult roles |
| Codex | 0.144.5 | JSON-RPC app server | Spawned tasks with a constrained child tool set |
| Claude Code | Agent SDK 0.3.211 | SDK with in-process MCP | Research, code and consult roles |
所有四者都实现了 HarnessAdapter 合约。这使得相同的作用域解析、策略、持久化和工具账本可以包围不同的 agent 循环。模型和 harness 可在全局选择,并在操作员权限范围内按作用域覆盖。
常见的工具界面很小:execute、read、write、publish、memory、history 和 background,当控制面允许时会增加 cron、sharing、guidance 和 turn-ending 工具。在只读模式下,只保留 memory recall、history 和静默的回合结束。严格模式将每次有副作用的工具调用封装为需人工批准。
Codex、Claude 和 OpenCode 随后暴露了它们各自受限的子任务机制。Claude 的 hook 阻止子代理与人联系、安排日程、更改常设配置或压制父代理的回复。Codex 将应用服务器的任务事件映射到 QM 的 run 并限制子工具。这些是真正的子代理,区别于 YC 更广义的“fleet”表述。fleet 主要是持久的人员和房间作用域集合;子代理是在某些 harness 内的临时工作者。
Pi 这个依赖值得一则脚注。YC 从其 yc-software/pi 仓库发布了 qm-pi-coding-agent-0.82.0-security.2。将该标签与上游 Pi 0.82.0 比较显示在七个文件中有更改:在 lock/package 元数据中将 brace-expansion 的覆盖从 5.0.7 移到 5.0.8,并且向包中添加了 MIT 许可证。我们在该差异中没有发现行为上代理循环的分叉。该自定义标签是一个狭窄的打包和供应链补丁。
Credentials: strong brokerage until materialization
QM 的钥匙串存储加密的凭证记录。实现使用 AES-256-GCM,密钥通过 HKDF 派生。Grants 将凭证绑定到一个作用域、人员和模式;它们可以是一次性的或常设的,并且可以过期。一个人可以从自己的个人作用域授予凭证。常设授权和更广泛的共享仍受操作员规则约束。
对于受支持的 HTTP 使用,凭证代理是最佳路径。核心会验证调用者头和权限,要求 HTTPS,匹配目标主机名和可选的子域规则,限制方法和路径前缀,在核心内部注入密钥,并限制请求和响应大小。sandbox 命令看到的是代理端点,而不是底层令牌。
当凭证被物化到无法使用代理的 CLI 或其他工具的沙箱中时,这种保护就结束了。SECURITY.md 说明物料是明文的,并且该沙箱中的软件可以读取。一个 grant 的 purpose 字段会被记录并显示给模型;在物化之后它不是强制执行的授权。一时性(one-time)指的是一次原子级别的物化,而不是一次下游 API 操作。
这个区分至关重要。QM 有一个严肃的凭证控制平面。但它无法让任意已登录的命令行客户端在控制同一台电脑的代理面前对令牌保密。
Three security postures, plus an always-on command floor
操作员为组织选择一种 posture;更窄的作用域可以收紧它:
| Posture | External-content screening | Human approval |
|---|---|---|
dangerous |
关闭 | 不对每个工具暂停 |
auto (default) |
分类器筛查标记为外部的内容和工具结果 | 不对每个工具暂停 |
strict |
禁用筛查,改为人工批准 | 每次有副作用的 harness 工具调用都需人工批准 |
三种模式都保留一个命令策略底线。默认规则要求对递归删除、强制推送、破坏性 SQL 和通过 shell 管道下载的操作进行批准;文件系统格式化和 fork bomb 被拒绝。扫描器会递归展开嵌套的 shell 有害载荷,深度为八层。
这对防止意外和明显攻击是有用的保护。它不是一个 shell 安全边界。维护者表示,对载荷进行编码或编写并执行脚本可以绕过规则。模型和沙箱被明确视为不可信,而操作员、核心主机和数据库仍然拥有特权。
自动筛查层同样有其限制。它收集带有溯源标记的外部内容,限制发送给分类器的内容量,并在分类器返回严格判决时将内容隔离。一些不可用或不受支持的筛查路径会在失败时以警告标记和审计事件的方式“开门”(fail open)。环境性的 Slack 判定器和 OpenCode sidecar 的路径并非全部通过相同的模型网关。浏览器操作位于命令/HITL 策略之外,且浏览器提供者的网络访问不一定遵循沙箱的出网规则。
YC 的安全文档对于预期环境的描述令人耳目一新且直截了当:一个内部的、单组织部署,有一个受信任的操作员。它并未被呈现为经过加固的公共多租户环境、认证或隔离证明。管理员是有特权的内容读取者,模型和浏览器提供者会接收发送给它们的数据,持久会话、审计记录、文件和内存可能会无限期保留。
The app-link documentation drift
我们最重要的代码与文档不一致发现涉及已发布的应用。
威胁模型说所有者可以分发一个 bearer 能力链接,并且任何持有它的人都可以访问该应用。在早期设计中这显然是成立的。在固定发布版本中,内置子域入口行为不同。
deployments.ts 会从 URL 中移除 ?access=,删除过期的能力 cookie 并拒绝铸造替代品。普通的应用访问需要有效的门户会话和 ACL 检查。所有者可以请求一个单独的带签名管理链接,该链接五分钟后过期。相应的 test 名为“a capability link grants nothing — reach is the ACL alone”,并断言过期的查询和 cookie 凭证会失败。
准确的结论是狭义的:在 0.1.4 中,内置子域网关上禁用了持票访客链接;SECURITY.md 尚未更新。自定义插件或对外暴露的应用端点需要各自审查。
Launch-week bug reports
公共问题跟踪器在迅速移动。撰写时有 14 个未关闭的问题。其中若干是详尽的、引用代码的报告,而非功能请求。它们包括一个新的 Fly 部署未能请求并推送 SPRITES_TOKEN(#130)、固定的 GitHub CLI RPM 在用于 AWS MicroVM 构建时不再可用(#122)、在运行中期引导期间仅附件的 Slack 消息丢失(#48),以及在 Slack 回复成功发布之前就发生交付确认(#44)。
我们未能重现那四条运行路径。它们应被视为未决报告,而非已确认的漏洞。它们的具体性仍然是关于成熟度的有用证据:0.1.4 是一个发布周的版本,云端和交付的边缘情况正在公开被发现。
Background work: crons, watches and a webhook-shaped gap
QM 的后台系统有两种明确的机制。
Crons 支持 cron 表达式、时区、间隔调度、首次触发时间、以何身份运行以及目标。每次触发都会创建一个新的线程,而任务定义、工作区和触发日志会持久化。基于 Postgres 的作业使用 pg-boss;单例标识符和租约限制重复工作。可用调度器扫描作为恢复手段。默认的 cron 触发并发度为四。
background 工具也可以在沙箱中让一个进程继续运行并在其输出、退出、匹配文本或其他条件上注册一个 watch。监视轮询器默认使用三分钟心跳,强制最小间隔,限制存储事件并通过安全筛查的回合路径唤醒原始对话。watch 有过期时间,进程会话有严格的生存时间规则;事件的扇出也被限制。
YC 的发布说明称其历史上的 Ruby 代理获得了 webhook 触发器。开放运行时包含 webhook 作为溯源/会话来源类型,部署文档显示可代理的 webhook 形端点。我们在此修订版中未找到一个通用的内置 webhook 接收器会创建普通回合。该能力可能需要组织插件或外部集成来提供。Crons 和进程 watches 是公共核心中完整且可直接追溯的后台路径。
Internal app publishing
publish 工具将属于作用域的代码变为版本化的内部应用。部署记录将应用绑定到其所有者和作用域,保留版本,支持更新和回滚,并附加查看/管理授权。应用在通过 ACL 共享之前仅限所有者。Git 访问使用签名、可过期、与主体绑定的授权并检查撤销。
QM 将应用代码视为一个独立的信任边界。核心不会审查生成的应用代码以确保其安全性。提供给应用的凭据或环境值是明确的,环境中作者的凭据不会进入应用运行时。内置网关会添加门户身份和 ACL 检查,如上所述。
此功能使 QM 超出了聊天助手的范围。一次对话可以产生一个小的运行面,发布给团队并在后台继续更新其数据。它也扩大了应用安全的工作量:每个生成的应用都变成了操作员必须监控、修补并最终退役的软件。
部署与回滚
支持的目标是本地 Docker、Fly.io 和 AWS。Fly 将应用与 Sprites/Machines 结合。AWS 呈现为 ECS Fargate 服务、RDS、S3 和 MicroVM 沙箱层。Slack 在 core 内使用 Socket Mode;portal 是预期的公开入口点。
生成的目录是组织与 CLI 之间的契约。配置和秘密名称保存在那里;秘密值保留在操作员环境和提供商的密钥存储中。组织可以在不修改 core 的情况下添加工具、技能、自定义沙箱镜像和插件。发布镜像仍通过摘要(digest)固定。
回滚在不同目标上含义不同。Fly 路径会恢复先前的沙箱 pin。Docker 在请求 purge 时的清理可能具有破坏性。AWS 在发生变更的部署前会对 RDS 做快照;代码和配置回滚本身不会恢复数据库内容,因此 CLI 会打印供操作员采取行动的恢复点。
默认项目不包含任何实时生产部署工作流。Terraform 和云操作仍由操作员运行。这样可以避免在不知情的情况下赋予 CI 广泛的基础设施权限,但这也意味着可重复的变更控制由采用者自行负责。
希望将 core 与私有定制放在一个仓库中的组织被建议创建一个独立的私有克隆,而不是 GitHub fork。GitHub fork 共享对象网络并且公开的 fork 无法变为私有;推入该网络的提交可能仍可通过哈希获取。QM 将私有材料放在 deploy/layers/<org>/ 下,并提供用于合并上游和准备已清理上游补丁的技能。core 预计保持与公共 QM 字节相同。
由代理构建、通过文本治理的代码库
QM 的贡献政策与运行时一样有意思。CONTRIBUTING.md 表示编码代理编写大部分底层代码。外部贡献者被要求在 adrs/ 下提交非正式的人工书写文本提案;维护者随后使用他们自己的代理和上下文去实现被接受的想法。经审阅的修订版中公共目录除了占位符外是空的。
内部的 AGENTS.md 要求严格:避免注释和 docblock,绝不自我复审,使用独立代理进行复审,运行受影响的测试,在相关情况下执行实时 Slack QA,为可见更改捕获截图,并保持私有/公共仓库边界。
这有助于解释代码的形态。接口是显式的,测试充足,因不鼓励注释名称承载更多解释性含义。它也创造了一种不寻常的治理模型:贡献者提出意图,维护者消耗推断预算,而代理执行独立复审。该复审的质量取决于提示、上下文和执行纪律,而这些在 Git 中只有部分可见。
QM 做对了什么
作用域是持久单元,而不是供应商特定的对话。这个决定让 QM 能对多个难题给出连贯的答案:共享工作、个人定制、持久计算、模型切换和权限感知的上下文。
面向受众的上下文过滤尤其强大。许多工作场所代理将访问控制强行附加到检索上,然后将对话历史作为环境上下文保留。QM 会针对当前整个受众重新评估历史。它关于外发(egress)的交集/并集规则将同样的想法应用于动作。
部署拆分也很有纪律性。一个带有可追溯来源的小型 CLI 创建组织仓库并固定签名镜像。组织细节可以保留在公共源树之外。可重现性和隐私有具体机制,而不是依赖 README 的承诺。
最后,威胁模型是有用的,因为它明确指出操作员可能误解的失败点。受控计算机内的明文凭据、可绕过的 shell 模式规则、不完整的出处、浏览器边信道和特权管理员是内部代理系统的实际断层线。
模型仍然透过抽象泄露的地方
在控制平面层,harness 接口使供应商可互换。但它们在行为上并不等同。引导方式、由提供商管理的会话、思考模式、镜像处理和子代理支持在各适配器间各不相同。公司在更换 harness 时应预期即便权限保持稳定,任务质量、延迟、成本和失败模式也会不同。
记忆整合和内容筛查都将判断权交回给模型。周边代码限定它们的输入并记录结果;但它无法保证分类正确。默认的记忆查询也足够字面化,以至于除非当前措辞与存储要点重叠,否则有用事实可能会被遗漏。
外发是最不统一的基础设施控制。一些后端可以强制通过代理进行域路由;另一些则在 QM 中不暴露本地强制手段。浏览器提供商和应用运行时添加了独立的网络边界。在将“外发策略”视为普遍保证之前,操作员需要一个针对部署的具体数据流图。
操作成熟度是最终的约束。源码包含一个实质性的测试程序和谨慎的发布机制。该包只有几天历史,公共历史被故意保持浅显,且上线周的云错误仍在打开。这些事实可以共存。
结论
QM 是一个对于公司范围代理的可信参考架构。其决定性贡献是作用域权限与持久计算的结合:每个人或房间都获得一个持久的工作环境,而 core 为每个受众和动作重新计算上下文与权限。模型回路可以是 Pi、OpenCode、Codex 或 Claude,而不会成为组织真相的来源。
该项目已准备好在受信任且有经验的操作员的组织内进行研究、原型和适配。生产采用需要与所选沙箱、身份提供商、连接器、模型供应商和保留义务相关联的威胁模型。严格的姿态可以暂停操作;但它不能在人工批准后修复不安全的生成命令。自动筛查可以降低暴露;但它不能证明提示注入已被遏制。持久工作区同时提高了能力与保留风险。
公开发布很重要,因为它揭示了难点。QM 最有价值的代码位于代理周围:受众过滤器、解析服务、ACL 存储、凭据中介、运行账本、调度器和沙箱生命周期。这是一层工作场所代理讨论常常跳过的内容。YC 现在在桌面上放出了一个严肃的实现,并附带足够的备注以显示该类别尚未完成的程度。
复现说明
# Pin the reviewed source
git clone https://github.com/yc-software/qm.git
git -C qm checkout 7f2c916360f1797a8ff2a77ce2ce40c5fabab087
# Download the reviewed package
npm pack @yc-software/qm@0.1.4
sha256sum yc-software-qm-0.1.4.tgz
# Inspect package metadata and provenance pointer
npm view @yc-software/qm@0.1.4 version time dist --json
# Generate a local deployment directory without putting secrets in config
npm exec --yes --package=@yc-software/qm@0.1.4 -- \
qm init ./qm-deploy --org example --target docker
RuntimeWire’s tarball SHA-256 was 51593f853eade42ed04f10e96e1c8ddffca876c5be0ee98d753636018ee5e473。读者应预期 npm 发布的 integrity 字段在相同不可变版本下保持稳定。
主要来源索引
- YC 的 QM 发布说明
- QM 仓库 和 已审查的提交
- README 和系统架构
- 威胁模型和已知限制
- CLI 和部署契约
- 作用域解析 和 受众过滤
- 记忆服务 和 记忆策略
- 沙箱接口, 本地 Docker, Sprites 和 AWS
- Harness 接口和适配器
- 安全姿态, 命令策略 和 keychain
- 已发布应用入口 和 capability-link 测试
- CI 工作流, 签名镜像工作流 和 npm 溯源工作流
- 贡献指南 和 agent 说明
披露:RuntimeWire 执行了静态源码和包审查以及本地 CLI 测试。这不是一次渗透测试或生产部署审计。仓库和问题计数为 2026 年 8 月 2 日的快照。