AgentOS 蓝图:从 Danny Postma 的 Agent SDK 演讲重建,让 AI 自己构建这个系统
AgentOS — 产品规范与实现蓝图
根据丹尼·波斯特马的演讲重构我如何在 Claude 的代理 SDK 上构建自己的 AgentOS(这样你也能做到)(2026年)。本文档既是人类的产品规格,也是AI编码代理的实现提示。
就建造这个系统。请勿发明此处未明确说明的特征。
本文件中的角色合同和提示是从演讲内容重建的,而非他的逐字文件。在代码注释和文档中标记每个重建的提示。
1. 目标与非目标
目标
构建一个个人AgentOS:一个控制平面+UI,建立在云管理代理之上(Anthropic Claude代理SDK / Claude托管代理),允许人工设定目标或任务,分配一个有范围的代理,然后离开。
代理运行在临时容器中,完成工作(规划、实施、审查、提交),只有在遇到困难或需要决策时才给人发消息。
系统应自动化大部分编码和运营工作:cron、webhooks、看板任务和开放式目标循环。每次会话结束后,容器都会被销毁。下一次会话会干净地重新初始化。
他所建立的(范围内)
- 多智能体控制平面,包含每个智能体的提示、技能、MCP、仓库、环境和协作列表
- 最小权限隔离:每个代理容器、每个代理的MCP/仓库/网络访问、每个代理文件系统文件夹的ACL
- 短暂会话生命周期:拉取仓库→注入秘密→工作→提交→销毁容器
- 通过 Cloudflare R2 实现持久文件系统 + 一个强制读/写/删除服务器端的 MCP
- 任务看板(
todo/doing/review/done)支持assign-agent、run-now、schedule、recuring、附件、模板、审批门和跟进链 - 默认的“复合工程师”/功能构建模板(9个步骤,包括人工审核门)
- 目标(“试炼循环”):完成定义、召唤下一个专家的指挥者、进度日志、花费/时间/卡住的上限
- 收件箱MCP:代理给真人发消息;人类回复恢复了会话;多项选择题;PWA + 推送
- 活动订阅源 + 实时会话查看器(实时观看工具调用)
- 触发条件:入站的webhook生成一个有范围的作业
- 自动化:生成任务/代理的克朗作业
- 运行者路由:Claude 托管代理云端与廉价本地虚拟机(Claude
--dangerously-skip-permissions以及Grok的yolo模式);每个目标和每个代理路由 - YAML-as-code per project + CLI (
help推拉同步,创建项目/目标/任务,调整代理,创建技能) - 加密秘密存储(他使用了谷歌的令牌加密系统;名字忘了——视为秘密管理器/云KMS)
- 用于检查/编辑/下载/预览R2文件系统的UI。
他提到但未作为指定产品发货(除非后续标记,否则不在范围内)
- 深入解析视频/发布他制作系统的精确代码
- 开放外包他的经纪人/技能/提示(他主动提出,我们没有)
- 他未来的定制跑腿取代了克劳德管理的代理人
- 游戏项目细节(
fight-forRepo只是挂载仓库的一个例子) - 根据产品需求提供准确的支出数字(
$500/day云,$1000未完成进球,$10Hetzner VM 是轶事,不是 SLO)
非进球
- 为其他公司提供多租户SaaS。这是一个单操作符的AgentOS。
- 为每个代理提供完整的文件系统、Gmail、GitHub和生产凭证,“为了方便”。
- 持久且寿命长的代理容器。会话是一次性的。
- 他发明了额外的代理人角色、额外的模板步骤,或者超出他描述的界面。
- 逐字复制他的系统提示(未知)。仅重构角色合同。
2. 系统概述与心理模型
AgentOS 是控制平面你拥有,坐在上面Claude managed agents / Agent SDK.
Human
│ writes spec / creates task / creates goal / replies in inbox
▼
┌──────────────────────────────────────────────────────────┐
│ AgentOS control plane (your app) │
│ UI · API · CLI · YAML sync · webhooks · cron │
│ Kanban tasks · Goals/orchestrator · Inbox · Sessions │
└───────────────┬──────────────────────────┬───────────────┘
│ spawn session │ persist
▼ ▼
Claude Agent SDK / R2 filesystem MCP
local runner (Hetzner) Secrets store
│
▼
Ephemeral container
- clone allowed repos
- inject allowed env
- attach allowed MCPs
- apply network allowlist
- run agent with skills
- commit if allowed
- DESTROY
心理模型:
- A项目是 YAML 作为代码的单位。它声明代理、技能、模板、MCP连接、仓库。
- 一个代理人是一个命名角色,包含基础提示词+角色提示词、模型、技能、MCP、仓库、协作列表、环境和运行者偏好。
- A任务是一张看板卡。只有一名经纪人负责。它可以是一次性、预定、循环、封闭或后续连载。
- A目标是一个开端循环。编排者会不断生成专家,直到完全核实人类认可的“完成定义”,或者安全栏跳闸。
- A会议是一次容器化代理运行。它诞生时空洞,初始化,执行,承诺,然后被丢弃。
- 该收件箱是唯一的人工中断通道。特工不会等待人类,除非他们陷入困境或需要做决定。
- 最低特权是一等舱。访问权限由每个代理单独授予,强制执行于MCP、网络、文件系统和仓库层。及时泄密不能触及特工未获得的任何信息。
3. 建筑
3.1 三层
| 层 | 责任 |
|---|---|
| 控制平面 + UI | 项目、代理、任务、目标、收件箱、触发器、自动化、会话记录、YAML同步、ACL策略。你的代码。 |
| 播放时间 | Claude Agent SDK / Claude managed agents (cloud)或一个廉价的本地运行程序(Hetzner虚拟机运行Claude Code,且--dangerously-skip-permissions以及Grok的Yolo模式)。 |
| 持久性 | Cloudflare R2(文件)通过自定义MCP传输;加密秘密(Google Secret Manager / Cloud KMS——他忘了产品名称);用于域对象的应用数据库。 |
3.2 为何使用临时容器
他从Claude Code终端开始,意识到自己想超负荷工作,离开,几个小时后再回来。Cron和触发器需要无人值守的运行。因此,每次会议:
- 开始一个独特的容器。
- 拉取允许的仓库。
- 获得文件系统(R2 MCP)的范围视图,允许MCP,允许环境,允许网络主机。
- 完成任务。
- 提交(如果代理/仓库策略允许的话)。
- 清理干净。集装箱被毁。
- 下一次会话会干净地重新初始化项目。除了提交给git或通过MCP写入R2的状态外,没有剩余状态。
3.3 控制平面与SDK
SDK 已经提供了:启动会话、MCP 连接、文件 API。AgentOS 是你的用户界面和政策都放在上面: agent catalog、least privilege walls、看板、goals/orchestrator、inbox、triggers、cron、YAML、runner 路由、实时会话查看器。
他说他正在开始创作自己的片长片段。不要在MVP中从零构建代理运行时。用SDK。本地运行者是一种替代执行后端,使用相同的控制平面合同。
3.4 建议堆栈(假设——在代码中标注)
这些都是主观违约,所以代理人可以开始。它们不是他完全一样的堆叠。
| 关注点 | 假设 |
|---|---|
| 语言 | TypeScript(Node 20+) |
| API | Hono 或 Fastify 在单一服务上 |
| DB | Postgres + 棱镜(或 Drizzle) |
| 队列 / 注册 | 一个耐久的跑腿者(例如pg-boss或Inngest)。Cron 自动化和定时任务会排队作业。 |
| 代理运行时(云端) | Anthropic Claude Agent SDK / Claude managed agents |
| 代理运行时(本地) | 一个能运行Claude代码的廉价虚拟机上的工人(--dangerously-skip-permissions)以及Grok的yolo模式 |
| 文件 | Cloudflare R2 + 一个自定义 MCP 服务器,强制执行 ACL |
| 秘密 | Google Secret Manager(他说“谷歌的令牌加密系统”,忘了名字;Cloud KMS是另一种选择)。切勿将原始代币存储在应用数据库中。 |
| 认证 | 单人操作。一个人类用户。CLI的会话Cookie或个人访问。 |
| 用户界面 | React + Vite。侧边栏应用。针对收件箱+推送的移动响应式PWA。 |
| Webhook | 公共HTTPS接收器,带有每个触发点的秘密。 |
| 推 | PWA的网页推送(VAPID)。 |
别假装这是他的生产体系。它是一个可构建的默认选项,符合他描述的能力。
4. 领域模型
实施这些实体。名称可能有所不同;字段和关系不能被舍弃。
项目
一个映射到 YAML AgentOS 文件的工作区。
id,name,slugyamlDocument(磁盘上的规范 / git 中;DB是投影)- 拥有许多:代理、技能、任务模板、MCPConnections、仓库、触发器、自动化、任务、目标
代理人
id,projectIdname(例如:default,senior-dev,plan,spec,review-coordinator,feasibility,scope-guardian,coherence,implementation-plan-executioner,librarian,customer-support,diagnostic,linkedin-content)titlemodel(例如,规划师用的Claude模型;工人用的Grok 4.6——路由也是跑道的关注点)foundationalPrompt— 共享AgentOS提示:存在哪些文件/系统,哪些MCP,收件箱的工作原理,如何完成任务,最小权限规则rolePrompt—— 单一合同(见第8节)skillIds[]mcpConnectionIds[]repoAccess[]—{ repoId, mountPath, permissions: git-read | git-write }filesystemGrants[]—{ folderPath, canRead, canWrite, canDelete }collaborationList[]— 代理ID:该代理可能作为子任务生成environmentIdrunnerPreference—cloud|local|inheritinboxAccess— 布尔(某些任务需要它;spec step需要)- 最低特权默认:拒绝。代理人不会获得未列出的任何东西。
他命名的具体代理(默认实现;更多可通过 YAML/UI/CLI 添加):
| 代理人 | 一个任务 |
|---|---|
| 默认 | 通用主力 |
| 高级开发 | 实施/应用评审修复 |
| 计划 | 将获批的规范转化为具体的实施计划;写入任务;收尾 |
| 规格 | 制定详细的功能规范(用于模板;批准门槛) |
| 审查协调员 | 生成专门的评审员;合并必须修复的 / 应该修复的 |
| 可行性 | 审查计划的可行性 |
| 范围守护者 | 审查范围蔓延的计划 |
| 连贯性 | 审查计划以保证连贯性 |
| 实现-计划-执行器 | 实现计划中的代码 |
| 图书管理员 | 更新内部维基,看看代码库的实际工作原理 |
| 客户支持 | 仅通过前台MCP处理支持聊天 |
| 诊断 | 给定一个bug+支持聊天+仓库,生成原因报告 |
| LinkedIn内容 | 定期内容自动化 |
你可以通过YAML添加代理。不要硬性要求每个有名字的代理都获得MVP,而是要发货default,plan,senior-dev,spec,review-coordinator,feasibility,scope-guardian,coherence,implementation-plan-executioner,librarian所以功能模板会运行。
环境
id,namenetworking—open|limitedallowedHosts[]——例如。api.front.com.如果limited,容器/代理在基础层面阻挡其他所有东西,包括GitHub,即使有泄露的提示请求。- 这与MCP资助无关。网络拒绝是第二道墙。
技能
id,name,slug(例如:plan-mode被引用为/plan)kind—prompt|file(例如代理可以运行的Python脚本)body或filePath在 R2 文件系统上- 技能是分配给每个特工的。计划模式是一种技能。
MCP连接
id,name(例如:github,front,agentos,r2-fs,inbox)transport/ 连接配置credentialSecretId——指向秘密仓库的指针,而不是原始代币allowedOperations如果MCP支持作用界域- 代理通过ID来指代连接。举个例子:客服拿到Front,Gmail和GitHub都没拿。Plan agent 会获得 plan-mode + AgentOS MCP,而不是 Ahrefs,也不是 GitHub。
你必须实现的内置MCP:
- AgentOS MCP— 读写当前任务,标记状态(除非批准门禁止代理标记
done),生成协作者子任务,读取代理允许查看的项目元数据 - 收件箱MCP——向人类发送信息;发送多项选择题;阅读回复
- R2 文件系统 MCP— 仅在授权文件夹下列出/读取/写入/删除
- GitHub MCP——仅当代理获得该连接+仓库访问权时
他举的外部MCP作为例子(配置,不硬编码产品逻辑):Front、Ahrefs、Gmail(明确说明)不是提供支持),MongoDB通过环境只读。
回收
id,name(示例:fight-for对于一个游戏项目——仅举例)remoteUrlmountPath容器内部credentialSecretId(PAT或部署键)defaultBranch
秘密
id,name,providerRef(Google Secret Manager / KMS 资源名称)purpose—mcp|repo|env|webhook- 只有当代理/环境列出了这些信息时,才会注入到会话中。
- 存储在谷歌系统中,处于静止加密状态。应用数据库只保存引用。
任务
id,projectIdname,descriptionstatus—todo|doing|review|doneassigneeType—agent|humanassigneeAgentId可取消attachments[]— FileObject ids(spec文件等)approvalGate——如果属实,被分配的代理永远无法标记该任务done.只有人类能做到。下一次后续必须在状态为done.followUpTaskId/chainId+chainIndex— 模板生成链schedule—once-now|{ runAt }|{ cron, timezone }(例如,每月的每个星期一,汇总收件箱)templateId可取消activity[]— 代理写入任务/收件箱的消息sessionIds[]
任务模板
id,projectId,name(例如:compound-engineer-workflow)description——“~3小时全托管功能构建”(他原话;实际运行时间为~5–6小时)variables[]——例如。branchNamesteps[]——每一步:姓名、assignee agent、prompt、approvalGate、attachmentsFromPrevious、spawnPolicy- 实例化模板会创建一系列任务链。步骤N+1被阻塞,直到步骤N
done.
目标
id,projectIdtitle,spec(或由规格表生成的国防部)definitionOfDone[]——复选框,由人工编写或根据规格表生成,然后经人工批准status—active|paused|completed|stopped-spend|stopped-time|stopped-stuckspendCapUsd可作废——产品用户体验中必不可少;他曾连续一夜无帽跑,奖金达到1000美元maxDuration可取消stuckThreshold—— 默认 19 次相同迭代,然后 Orchestrator 停止runnerPreference—cloud|local|auto(“忙的时候用云;否则本地“;按球覆盖:“此规则仅适用于本地跑者”)progressLog——仅附加,跨会话共享sharedInbox+ 共享文件系统文件夹sessionIds[]
触发器
id,projectIdname(例如:customer-support-inbound,bug-report)webhookSecretIdagentId—— 运行的有瞄准特工jobPrompt/ 从有效载荷→任务描述映射- 举例:→ webhook → job中的支持消息。客服只负责前台(或同等职务),分析聊天,分配支持代表或客户经理。一个扳机连发了600次。
- 示例:支持提交了一个→诊断代理的错误,且Repo+支持聊天,报告写道。如果人工批准,启动实施→计划→计划审查→修复端对端→E测试链。人类只审核和合并。
自动化
id,projectIdname(例如每周LinkedIn内容,每月初的LinkedIn内容机器人)cron,timezonetaskTemplateId或在线任务规格 +agentId- 与 Task.recurring 不同:自动化在侧边栏中被命名为 cron 条目。重复任务是任务上的一个日程字段。两者都要实现;它们可以共用同一个调度器。
收件箱消息
idfrom—agent|humanagentId,sessionId,taskId,goalId可取消kind—text|multiple-choice(单选按钮,类似Claude的提问功能)body,choices[],selectedChoicestatus—open|answered|closed- 回复一条公开的信息继续等待(将回复发送回代理)。
会议
id,agentId,taskId/goalIdrunner—cloud|localstatus—starting|running|waiting-inbox|committing|destroyed|failedcontainerId/ SDK session idtoolCallLog[]—— 供现场观众观看startedAt,endedAt,costUsd如果有的话commitShas[]
FileObject
id,bucketKey(R2)path,projectIdmime,size- 可在界面预览。代理除了通过文件系统MCP外,绝不会触碰R2。
5. 最低特权/隔离规则(一级)
这些是产品需求,不是建议。
- 默认拒绝。代理没有MCP、没有仓库、没有环境、没有文件系统写入、没有网络、没有协作生成,除非代理上列出。
- 每次使用一个容器。代理人之间没有共享可写容器。
- 客户支持机器人可能有前置MCP。它绝不能装Gmail。它绝不能有GitHub/仓库访问权限。他明确表示:在做支持工作时不要泄露代码库信息。
- 计划代理人拥有计划模式技能 + AgentOS MCP。确实如此不是下载Ahrefs或GitHub MCP。
- 网络允许列表是第二道墙。如果环境是
limited到api.front.com,即使有提示泄露或错误连接的MCP,该进程也无法到达GitHub。 - 文件系统不是挂载的超级用户磁盘。它是一个MCP。服务器端检查强制执行文件夹的ACL和动词(分别读/写/删除)。一个“能写入”的代理仍然无法删除,除非
canDelete是真的。无限文件系统访问会清除磁盘——这就是它存在的原因。 - 文件夹资助是按代理人发放的。代理可以不写入即可读取另一代理的文件夹。
- 秘密只注入于列出的环境/MCP/仓库凭证。静止加密。即使应用数据库被盗,令牌仍会保留在谷歌的秘密系统中。
- 批准门不是诚信制度。API 拒绝了
PATCH status=done来自代理会话令牌,当approvalGate=true. - 协作列表是唯一的生成路径。计划代理可能会作为子任务生成列出的助手。它不能生成不在其列表中的代理人。
- 即时注入/泄漏假设。设计成模型会尽力使用它拥有的所有工具。如果它不应该做任何事,就不要附加工具,并封锁网络路径。
6. 会话生命周期
完全正确地实现这个状态机。
requested
→ provision container (cloud SDK session or local runner slot)
→ inject env from Secret store (only listed keys)
→ attach allowed MCP connections
→ apply environment network policy
→ clone each granted repo to mountPath using repo credential
→ mount R2 filesystem MCP with that agent's folder ACLs
→ inject foundational prompt + role prompt + skills
→ status=running
→ agent works (tool calls streamed to live viewer + activity feed)
→ if inbox question: status=waiting-inbox; pause; on reply, resume with answer
→ if task complete and not approval-gated: AgentOS MCP marks task done / review
→ if git-write granted and work produced: commit, record sha
→ cleanup
→ destroy container
→ status=destroyed
规则:
- 摧毁后,容器中除了git提交和R2写入外,其他内容都没有。
- 下一次游戏必须再次克隆/拉取。没有“温暖”的脏工作区。
- 失败仍然会毁掉容器。先在会话行中持久化日志和工具调用历史。
- 对于目标:摧毁后,编排者运行(见第10节),并可能排队进行下一个专题会话。
7. 持久文件系统(R2 + MCP)
由于会话是短暂的,因此没有持久的容器盘。
- 把blobs存储在Cloudflare R2里。
- 只通过R2 文件系统 MCP.
- 界面可以列出、打开、编辑、下载、预览文件(高级文件浏览器)。
- MCP工具(最低要求):
fs.list,fs.read,fs.write,fs.delete,fs.mkdir. - 每次通话均由服务器端授权:
if !grant.canRead && op in (list, read) → deny
if !grant.canWrite && op in (write, mkdir) → deny
if !grant.canDelete && op == delete → deny
if path is outside granted folder prefix → deny
- 不要给代理一个原始的S3/R2 SDK或绕过MCP的FUSE挂载。
- 每个代理的家庭文件夹约定:
/agents/{agentSlug}/还有任何额外的资助。 - 共享目标文件夹:
/goals/{goalId}/在该目标上允许代理读写(删除仍然显式)。
8. 代理定义与重构角色合同
每个代理会话的提示如下:
- 基础AgentOS提示(分享)
- 角色提示(根据代理人)
- 运行时输入— 当前任务/目标、附件、允许的MCP列表、允许的文件夹列表、协作列表
8.1 基础提示(根据演讲重建,而非他的逐字文件)
You are running inside AgentOS.
You have only the tools, MCPs, repos, environment variables, and filesystem
folders listed in your session manifest. If a tool is not listed, you cannot
use it and you must not try to. Do not ask for more access. Do not attempt
to reach hosts outside your network policy.
The container you are in will be destroyed at the end of this session.
Persist work by (a) committing to a granted repo if you have git-write, or
(b) writing files through the filesystem MCP. Do not assume a local disk
survives.
When you need a human decision or you are stuck, use the Inbox MCP.
Do not message the human for routine progress. They are not watching.
Write notable progress to the task activity log.
Your job is the role prompt below. Do that job, then finish. Use the
AgentOS MCP to update the task. If this task has an approval gate, you
must NOT mark it done — leave it in review and inbox the human.
You may spawn a collaborator only if they appear on your collaboration list.
Spawn them as a subtask with a tight brief.
Least privilege is a safety rule, not a suggestion.
8.2 角色提示(重建版)
计划
You are a plan agent. You have one job: turn an approved specification
into a concrete, ordered implementation plan. Write the plan onto the
task (and as a file attachment). Then finish the task. You do not
implement. You do not open unrelated tools.
规格
You are a spec agent. Produce a detailed specification for the requested
feature. Attach the spec file. Refine it if the human replies. You cannot
mark this task done — it is approval-gated. Inbox the human when the spec
is ready for review.
高级开发
You are a senior developer. Implement the assigned work, or apply review
fixes, in the granted repo. Follow the plan if one is attached. Commit
when done. Run available tests. Inbox the human only if you are blocked.
实现-计划-执行器
You implement the code according to the attached implementation plan.
Do not re-litigate the plan. Commit. Leave notes in activity.
审查协调员
You are a review coordinator. Spawn the listed review specialists
(feasibility, scope-guardian, coherence for plans; the code-review
specialists for implementation). Each writes a report. You consolidate
into must-fix and should-fix. Attach the consolidated report. Do not
implement fixes yourself.
可行性/范围守护者/连贯性
You review the attached plan only through your lens
(feasibility / scope / coherence). Write a report. Finish.
图书管理员
You update the internal wiki (filesystem folder you are granted) to
reflect how the codebase actually works after this change. Do not
change product code.
客户支持
You handle inbound customer support. You have the support MCP (e.g. Front)
only. Analyze the conversation. Assign the correct human rep or account
executive. You do not have Gmail. You do not have GitHub. You must not
exfiltrate or request codebase information.
诊断
You diagnose a bug. You have the repo and the customer-support chat.
Produce a cause report. Do not implement until a human approves and a
follow-up implementation chain is started.
LinkedIn内容
You produce the scheduled LinkedIn content. Use only the MCPs and folders
you were granted. Inbox if you need a human approval before posting, if
posting is even in your tool list.
默认
You are the default AgentOS agent. Do the assigned task with the tools
you have. Finish or inbox if stuck.
编曲者是不是一个面向用户的聊天代理。它是每次目标会话后运行的控制平面代码(见第10节)。它可能会叫模特来选择下一位专家;那个电话仍然使用了一个紧凑的重建提示词:
You are the AgentOS goal orchestrator. Read the progress log, the
definition of done, and the last session summary. Choose the next
specialist agent from the allowed list (or declare the goal complete
if every DoD checkbox is satisfied, or stop if stuck/spend/time rails
trip). Output a structured decision. Do not do the specialist's work.
9. 任务 — 看板、门、链条、日程
9.1 董事会
专栏:Todo →做复习 →→完成.
任务是“做、做、复习、完成”。根据任务的主题,代理人开始着手。
9.2 创建任务表单
- 名称
- 描述
- 附件
- 分配一个代理(例如高级开发)
- 立即运行 |安排约会时间 |循环(cron;例如:每月星期一,收件箱摘要)
- 可选:从模板开始
9.3 批准门
可以标记一个步骤approvalGate: true.然后:
- 代理人工作可以将卡片移至
review. - AgentOS MCP / API 拒绝任何代理尝试设置
done. - 人类必须手动佩戴
done. - 后续任务在那之前保持屏蔽。
用于:规格审批和最终人工PR/部署审核。
9.4 后续连锁
模板是一系列后续任务的链条。每一步都会指定一个代理和一个提示。完成步骤N(状态)done) 队列步 N+1 (todo→跑者捡起了)。
9.5 活动
代理会把详细信息写入任务活动/收件箱。界面显示在卡片旁边。
10. 默认模板:复合工程师 / 特征工作流程
把它当作内置模板发货compound-engineer-workflow.他形容这是一个大约3小时的全托管功能构建;15:00开始了一次混凝土滑行,21:00完成(~5–6小时),第二天完成了PR。
99%的时候它有效,因为端对端测试是在工作流程中实现的.在实现过程中和修复后链中包含端对端(E2E)步骤。
模板变量:至少是这样branchName(以及功能标题或规格所需的内容)。
| # | 步 | 受派人 | 批准门 | 注释 |
|---|---|---|---|---|
| 1 | 写一份规格说明 | spec | 是的 | 代理会生成详细规格,附上规格文件,可以通过收件箱进行优化。人类阅读、批准、标记done.下一步不能在那之前开始。 |
| 2 | 计划 | plan | 没有(但让人类通过收件箱/活动审核) | 其中一项任务:具体规划→有序的方案。在活动/收件箱里写下详细信息。 |
| 3 | 计划审查 | review-coordinator | 不 | 协调者刷新四审查代理人:他点名了可行性、范围守护者、一致性——实施这三项,加上第四个计划审查专家(plan-risk或者第二次一致性/可行性检查;他说“四个不同的审核代理人”,并点名了三个)。每个人都写一份报告。协调员合并必须修复 / 应该修复. |
| 4 | 修订计划 | plan | 不 | 从第二步拿到计划,第三步拿到复习;调整。 |
| 5 | 实现 | implementation-plan-executioner | 不 | 实现代码。端对端测试作为该工作的一部分进行。 |
| 6 | 代码审查 | review-coordinator | 不 | 审查代码;应该如何修复。合并版必须修复/应该修复。 |
| 7 | 应用审查修复 | senior-dev | 不 | 应用审核修复。 |
| 8 | 图书管理员 | librarian | 不 | 根据代码库的工作方式更新内部维基。 |
| 9 | 部署/公关的人工审核 | human | 是的 | 人工审核公关、审核、合并。 |
在错误报告触发器经过人工审核后,流程是:实施→计划→计划审查→修正→端到端测试,然后人工审核并合并。重复使用相同的药物;不要发明第二个产品。
11. 目标 / 试炼环
对于无结构、开放式的工作(他也称之为“手套环”)。
他描述的日常工作流程是:早上写一份规格书,放进目标系统,系统写出完成定义,他批准国防部,整个流程持续5-6小时,结束时他拿到PR,审核,合并。
环线
- 人类创建目标,并附带规格说明(或类似任务的简报)。
- 系统(或规划)草案
definitionOfDone[]如果不是人类写的,就勾选规格表上的勾选框。 - 人类批准了国防部。没有批准不要开始这个循环。
- 编排者会选择第一个专家(高级开发、计划等),然后启动一个会话。
- Session在第6节运行生命周期。共享收件箱 + 共享文件系统 + 仅附录进度日志。
- 每场结束时,编曲者:
- 读取进展日志
- 阅读“完成”的定义
- 阅读实现内容
- 标记满足的国防部复选框
- 如果所有复选框都满足→目标
completed - 否则如果安全铁道→停
- 否则就生成下一个专家
- 重复直到完成或停止。
安全栏杆(必须实施)
| 铁路 | 行为 |
|---|---|
| 消费上限 | 停止在估计/实际花费上限≥刷新。用户体验应该让一个上限难以忘记。 |
| 最大时间 | 从开始≥最大持续时间开始后,停止墙上计时。 |
| 卡住检测 | 如果同一迭代发生19次(同一专家+同一未解决的国防部+没有有意义的进度日志差异),编排器就会停止。 |
没有消费上限的目标只有在人类明确确认的情况下才被允许。默认要求有上限。
共享状态
- 进度日志(仅附加,界面中可见)
- 目标共享收件箱讨论帖
- 共享 R2 文件夹
12. MCP 收件箱 + PWA
收件箱是MCP客服人员的电话。它也是一个界面表面。
功能:
- 给人类发短信
- 发送带有单选按钮的多项选择题(与Claude的提问用户提问方式相同)
- 人类在界面上回复;回复会被送回等待会话,会话继续
- 跨多回合的聊天/沟通
- 代理消息只有在陷入困境或需要做决定时才会这样——不是用来闲聊的
PWA:
- 移动响应式
- 可安装
- 当事情完成或需要帮助时,网络推送
不要再开发第二个消息产品。收件箱是任务、目标和触发器的中断通道。
13. 活动订阅源 + 实时会话查看器
- 全局活动流,包含代理操作/收件箱/任务转移。
- 实时会话查看器:实时观看工具调用,同时会话正在进行
running. - 在会话中持久化工具调用日志,以便重放完成的运行。
14. 触发器(蛛钩)
- 每个触发器都有一个公共 URL + webhook 秘密。
- 在有效的POST时:创建分配给触发器作用域代理的任务(或目标作业),立即排队会话。
- 代理接收到经过净化的有效载荷(不要在提示中直接输入原始头部或秘密)。
作为种子配置(非硬编码业务逻辑)发布的示例:
- 支援即将到来——有效载荷是一种对话。特工:
customer-support.工具:仅限前台(或配置支持MCP)。输出:分配给支持代表或AE。这个模式为他射击了600次。 - 漏洞报告—— 支持在后台提交了一个漏洞。特工:
diagnostic与收回以及支持聊天。输出:事故报告。人工批准后,开始与端对端(E2E)的修复链。
15. Cron 自动化
- 命名自动化,包含cron + timezone + agent + task body或模板。
- 示例:每周LinkedIn内容;每月第一期的LinkedIn内容机器人。
- 调度器创建了一个任务和一个会话。
- 重复任务(§9.2)使用相同的调度器。
16. 跑道路由
最初所有设备都运行在Claude托管代理API上——价格昂贵(轶事:~每天500美元)。他又加了一台价值10美元的Hetzner虚拟机,运行Claude--dangerously-skip-permissions以及Grok的Yolo模式。
实施路由规则:
| 信号 | 它的流向 |
|---|---|
控制平面busy(云队列饱和/成本策略) | 更喜欢local如果本地跑者健康 |
| 否则 | cloud没问题 |
进球。跑者偏好 =local | 仅限本地跑者 |
代理。runner偏好 =cloud(策划者) | 克劳德·克劳德·克劳德 |
代理。runner偏好 =local(工人们) | Grok 4.6 / 本地Claude,快速 |
| 每球覆盖 | 胜过违约 |
实现Runner界面:
provision(session) → handle
streamToolCalls(handle) → events
injectReply(handle, inboxAnswer)
destroy(handle)
两个后端:CloudClaudeRunner,LocalVmRunner.本地虚拟机是一个拉取作业的工人进程;它不是控制平面。
不要在这个界面之外建造“他自己的未来跑者”。他说他开始自己琢磨一些东西——那是未知数,不是规格。
17. YAML-as-code + CLI
每个项目都有一个模拟在线界面的 AgentOS YAML 文件:代理、技能、模板、MCP 连接、仓库访问、提示符。
示例形状(示意,重建):
# agentos.yml
project: acme
agents:
spec:
title: Spec agent
model: claude-opus-4
skills: [inbox]
mcp: [agentos, inbox, r2-fs]
repos: []
environment: limited-none
runner: cloud
prompt: | # reconstructed — not his verbatim file
You are a spec agent. ...
plan:
title: Plan agent
model: claude-opus-4
skills: [plan-mode]
mcp: [agentos, inbox, r2-fs]
repos: []
collaboration: []
environment: limited-none
runner: cloud
prompt: |
You are a plan agent. ...
senior-dev:
title: Senior dev
model: grok-4.6
skills: []
mcp: [agentos, inbox, r2-fs, github]
repos:
- id: app
mount: /workspace/app
permissions: git-write
environment: open
runner: local
prompt: |
You are a senior developer. ...
skills:
plan-mode:
kind: prompt
body: |
/plan — enter plan mode and produce an ordered implementation plan.
templates:
- id: compound-engineer-workflow
variables: [branchName]
steps:
- { name: Write a spec, agent: spec, approvalGate: true }
- { name: Plan, agent: plan }
- { name: Plan review, agent: review-coordinator }
- { name: Revise plan, agent: plan }
- { name: Implementation, agent: implementation-plan-executioner }
- { name: Code review, agent: review-coordinator }
- { name: Apply review fixes, agent: senior-dev }
- { name: Librarian, agent: librarian }
- { name: Human PR review, agent: human, approvalGate: true }CLI(他给这些命名):
| 指挥 | 行为 |
|---|---|
agentos help | 用途 |
agentos push | 同步本地 YAML →控制平面 |
agentos pull | 同步控制平面→本地 YAML |
agentos project create | 创建一个项目 |
agentos goal create | 从细节创建目标(在本地Claude头脑风暴后使用) |
agentos task create | 创建任务;CLI知道从YAML/模板中应用哪些代理 |
agentos agent update/ 创作 | 调整代理 |
agentos skill create | 创造一项新技能 |
大多数时候,他会和克劳德本地聊天,一边头脑风暴。完成后,他告诉CLI在AgentOS上创建一个包含详细信息的目标或会话。CLI创建任务/目标并应用正确的代理。
模板包含变量(分支名称等);Claude Code 为方便在本地实现模板步骤,但一旦创建,AgentOS 是记录系统。
认证:CLI 使用个人令牌对控制平面 API。
18. 建议界面表面
单一应用,侧边栏部分——“所有不同方面”:
- 代理人——列表(默认、高级开发、计划等)。详情:名称、标题、模型、基础+角色提示、技能、MCP、仓库、文件系统资助、协作列表、环境、运行者偏好。
- 技能——列表/创建;提示词或文件(例如Python脚本)。
- 文件— R2浏览器:打开、编辑、下载、预览。
- MCP——连接、凭据引用,以及哪些代理使用它们。
- 其余—— 名称、挂载路径、凭证参考、如何连接 GitHub MCP。
- 环境变量——注入会话;价值来自秘密仓库。
- 任务——看板;创造形态;模板选择器;卡片上的活动。
- 目标——国防部复选框、进度日志、花费/时间/卡住、跑者偏好。
- 收件箱—— 讨论串,按键提问,回复。这个视角也是PWA的家园。
- 触发因素—— webhook URL、秘密轮换、目标代理、近期火灾。
- 自动化—— 克朗列表。
- 录音— 实时观看者 + 工具调用历史。
- 活动—— 全球信号。
移动端:收件箱+推送是响应的必备界面。其余部分可以先用桌面。
19. 数据模型草图
面向Postgres。调整名字,而不是关系。
// types — implement as Prisma/Drizzle models
type Project = {
id: string
name: string
slug: string
yaml: string
createdAt: Date
}
type Agent = {
id: string
projectId: string
name: string
title: string
model: string
foundationalPrompt: string
rolePrompt: string
skillIds: string[]
mcpConnectionIds: string[]
repoAccess: { repoId: string; mountPath: string; permissions: "git-read" | "git-write" }[]
filesystemGrants: { folderPath: string; canRead: boolean; canWrite: boolean; canDelete: boolean }[]
collaborationList: string[]
environmentId: string
runnerPreference: "cloud" | "local" | "inherit"
inboxAccess: boolean
}
type Environment = {
id: string
projectId: string
name: string
networking: "open" | "limited"
allowedHosts: string[]
}
type Skill = {
id: string
projectId: string
name: string
slug: string
kind: "prompt" | "file"
body?: string
filePath?: string
}
type McpConnection = {
id: string
projectId: string
name: string
config: unknown
credentialSecretId?: string
}
type Repo = {
id: string
projectId: string
name: string
remoteUrl: string
mountPath: string
credentialSecretId: string
defaultBranch: string
}
type SecretRef = {
id: string
projectId: string
name: string
providerRef: string
purpose: "mcp" | "repo" | "env" | "webhook"
}
type Task = {
id: string
projectId: string
name: string
description: string
status: "todo" | "doing" | "review" | "done"
assigneeType: "agent" | "human"
assigneeAgentId?: string
attachmentIds: string[]
approvalGate: boolean
chainId?: string
chainIndex?: number
scheduleKind: "now" | "at" | "cron"
runAt?: Date
cron?: string
timezone?: string
templateId?: string
}
type TaskTemplate = {
id: string
projectId: string
name: string
description: string
variables: string[]
steps: TemplateStep[]
}
type TemplateStep = {
name: string
agentName: string // "human" for the final PR step
prompt: string
approvalGate: boolean
}
type Goal = {
id: string
projectId: string
title: string
spec: string
definitionOfDone: { id: string; text: string; done: boolean }[]
dodApproved: boolean
status: "active" | "paused" | "completed" | "stopped-spend" | "stopped-time" | "stopped-stuck"
spendCapUsd?: number
spendUsd: number
maxDurationMinutes?: number
stuckThreshold: number // default 19
runnerPreference: "cloud" | "local" | "auto"
progressLog: string
}
type Trigger = {
id: string
projectId: string
name: string
webhookSecretId: string
agentId: string
jobPrompt: string
}
type Automation = {
id: string
projectId: string
name: string
cron: string
timezone: string
agentId: string
taskTemplateId?: string
taskBody?: string
}
type InboxMessage = {
id: string
from: "agent" | "human"
agentId?: string
sessionId?: string
taskId?: string
goalId?: string
kind: "text" | "multiple-choice"
body: string
choices?: { id: string; label: string }[]
selectedChoiceId?: string
status: "open" | "answered" | "closed"
}
type Session = {
id: string
agentId: string
taskId?: string
goalId?: string
runner: "cloud" | "local"
status: "starting" | "running" | "waiting-inbox" | "committing" | "destroyed" | "failed"
runtimeHandle?: string
toolCallLog: unknown[]
startedAt: Date
endedAt?: Date
costUsd?: number
commitShas: string[]
}
type FileObject = {
id: string
projectId: string
path: string
bucketKey: string
mime: string
size: number
}20. API草图
单操作符API。界面的会话cookie;CLI和跑车的持有令牌。
POST /projects
GET /projects/:id
PUT /projects/:id/yaml # push
GET /projects/:id/yaml # pull
GET /projects/:id/agents
PUT /projects/:id/agents/:name
GET /projects/:id/skills
POST /projects/:id/skills
GET /projects/:id/files?path=
GET /projects/:id/files/content?path=
PUT /projects/:id/files/content
DELETE /projects/:id/files/content # UI only if operator; agents use MCP
POST /projects/:id/tasks
PATCH /projects/:id/tasks/:id # human may set done on gated tasks
POST /projects/:id/tasks/:id/run
POST /projects/:id/templates/:id/instantiate
POST /projects/:id/goals
POST /projects/:id/goals/:id/approve-dod
POST /projects/:id/goals/:id/pause
GET /inbox
POST /inbox/:id/reply # resumes session
GET /sessions
GET /sessions/:id # includes toolCallLog; SSE at /sessions/:id/live
POST /hooks/:triggerId # public, HMAC/secret
GET /projects/:id/triggers
GET /projects/:id/automations
# Runner / MCP internal (not public)
POST /internal/sessions/:id/tool-events
POST /internal/sessions/:id/cost
AgentOS MCP 映射到相同的任务/目标/生成端点,但授权为会话范围令牌这限制在该代理人的ACL内。批准门done被拒绝该标记。
收件箱MCP:inbox.send,inbox.ask(需要选择),inbox.read.
文件系统MCP:参见第7节。
21. 实施阶段(按此顺序)
在通过N阶段验收测试之前,不要开始N+1阶段。
第0阶段 — 骨骼
- TS服务、Postgres、单用户认证、空的React shell和侧边栏路由(can404)。
agentos helpCLI存根。
第一阶段 — MVP(一个代理,一个任务,一个会话)
- 项目 + 代理 + 任务 CRUD。
- 通过 Claude Agent SDK 运行云运行器:创建会话,附加硬编码的 AgentOS MCP + 收件箱 MCP,运行,销毁。
- 看板UI:创建任务,分配默认代理,立即运行,查看状态去待办事→完成→。
- 会话记录,并记录基本的工具调用日志。
- 基础+默认角色提示(重建)。
- 完成时间:你可以创建一个任务,代理会话启动,代理通过MCP更新任务,容器/会话被销毁,卡
done.
第二阶段——隔离
- 环境网络策略(
open|limited+ 允许列表)在运行代理处强制执行。 - 每个代理的MCP/仓库/环境资助。
- R2 + 文件系统 MCP,带有服务器端读/写/删除 ACL 和每个代理文件夹。
- 通过 Google Secret Manager(或 Cloud KMS)获取秘密引用。只在治疗开始时注射。
- UI文件浏览器(打开/编辑/下载/预览)。
- 完成时间:仅有虚假前台MCP的支持型客服无法调用GitHub或读取其他客服的文件夹;计划代理不能使用项目中存在但未被授予的 GitHub 连接;删除被拒绝,除非
canDelete.
第三阶段 — 模板 + 门 + 链
- TaskTemplate + 实例化。
- API + MCP 强制执行审批门。
- 后续链调度器。
- 种子
compound-engineer-workflow包含全部9个步骤和四位计划审查专家。 - 任务中会有排程和定期cron。
- 完成时间:实例化功能模板会生成9张卡;第二步只有在人类标记第一步后才开始
done;代理令牌不能标记第1步done.
第四阶段——目标
- 目标 + 国防部生成/批准 + 进度日志。
- 每次会谈后都要做编排员。
- 花上限,满时间,卡在19级。
- 按进球顺序偏好跑者。
- 完成时间:一个包含两项道具的小型DoD目标通过至少召唤两个专家会话来完成;stuckThreshold=2的目标在两次无进展迭代后停止;0.00美元的消费上限拒绝生成。
第五阶段 — 触发器+自动化
- Webhook接收器+秘密。
- 种子支持入站和错误报告触发形状。
- 错误报告批准 →修复链(实施→计划→计划审查→修复→ E2E)。
- 命名的cron automations(LinkedIn示例作为固定工具)。
- 完成时间:签名的 webhook 为作用域代理创建任务和会话;Cron条目在测试时钟中触发一次。
第六阶段 — CLI / YAML
agentos.yml模式匹配界面。push/pull/project create/goal create/task create/ 特工更新 /skill create.- 完成时间:CLI推送的YAML文件会产生你在UI中看到的相同agents+template,
pull在 之后是无操作操作push.
第七阶段 — PWA + 现场观众润色
- 收件箱显示为可安装的PWA,网页推送显示“需要帮助”和“完成”。
- 多项选择题广播题。
- 实时会话查看器(工具调用的SSE/websocket)。
- 活动动态。
- 本地跑者 worker + 路由(planners cloud,workers local/Grok)。
- 完成时间:一个特工
inbox.ask显示手机大小的视口上的单选按钮;接听会继续;规划会话是路由云端的,工作者会话可以强制本地化。
22. 验收测试 / 完成时间
实现代理必须添加的自动化测试:
- 会话销毁:成功运行后,滑道手柄已无剩余;第二个任务是重新克隆仓库,而不是重复使用脏工作区。
- ACL 文件系统:不写
canWrite失败;删除canDelete失败;路径逃逸(../) 失败了。 - ACL MCP:没有GitHub连接的代理即使项目有GitHub工具,也无法调用它。
- 网络墙:有限环境
api.front.com无法打开github.com. - 批准门:代理会话令牌
PATCH done→ 403;人力代币→200;后续todo在那之前。 - 模板链:9个任务,顺序尊重,变量(branchName)插值为提示符。
- 收件箱简历:
waiting-inbox+ 回复→会话继续,回答在上下文中。 - 选择题:信息
choices渲染图与存储selectedChoiceId. - 球门轨道:花费 / 时间 / 19次迭代卡住了
stopped-*并且不要生成。 - 国防部批准:目标在此之前不会生成
dodApproved. - Webhook认证:坏秘密→401;任务+会话→好秘密。
- YAML往返:推然后拉是恒等式(模空白)。
- 最低权限支持代理:仅与Front合作的固定代理;test 断言 GitHub、Gmail 和仓库克隆不在会话列表中。
- 编排者生成列表:无法生成不在协作/项目允许列表中的代理。
手动/演示脚本(人工):
- 早上:写个方案,设定目标,批准国防部,然后离开。
- 晚上:公关存在,或者收件箱提出了一个真正的问题。
- 触发点:发布假支持载荷,查看任务说明。
- 电话:接收推送,回答无线电问题。
23. 未知/延期(不要伪造这些)
| 项目 | 现状 |
|---|---|
| 他的确切基础和角色提示文件 | 未知。使用第8节中重建的合同并标注。 |
| 谷歌的确切秘密产品名称 | 他忘了。使用秘密管理器;如果你需要信封加密,云计算KMS是可以接受的。 |
| 他未来的定制跑道 | 正在进行中。未具体说明。只用SDK + 本地虚拟机接口。 |
| 第四个计划审查代理人名称 | 他说有四位评审员,并点名可行性、范围守护者、连贯性。再加一个plan-risk专家配备重建的“风险/缺失检测”镜头,并标注为重建。 |
| 精确的E2E线束 | “端对端测试在工作流程中实现”——要求实现步骤(及漏洞修复链)运行仓库现有的端对端(如果存在);不要发明一个全产品范围的测试框架。 |
| 前台 / Ahrefs / Gmail / MongoDB | MCP/环境资助的例子。集成为可配置连接,而不是硬编码厂商。 |
fight-for游戏仓库 | 仅示例安装架。 |
| 成本数字(每天500美元,夜间1000美元,虚拟档10美元) | 这些轶事是激励跑者路线和支出上限的,而不是SLO的。 |
| 开源代理/技能/提示 | 是主动提供的,不是提供的。不要拉黑他们。 |
| 深度解析/代码走行视频 | 未来内容,不是规格。 |
| 多用户 / 团队 / 计费 | 没有描述。单一操作员。 |
精确的CLI二进制名称agentos | 用途agentos. |
| 精确的 YAML 文件名 | 他说“一个AgentOS文件”。用途agentos.yml在Project Root。 |
24. 为实现代理构建规则
- 按第21节中的相位顺序实现。
- 最低特权不是第二阶段的“好事”跳过;第一阶段可以硬编码补助,第二阶段必须执行。
- 不要添加Slack、发送邮件给用户或额外的聊天产品。收件箱是人声渠道。
- 不要为了“节省时间”而坚持使用容器。
- 不要向代理提供原始云凭据。
- 请勿将本文档的原始记录复制到产品 UI 中。
- 每个重建的提示文件必须以注释开头:
Reconstructed from Danny Postma's AgentOS talk — not his verbatim prompt. - 如果此处未指定选择,请选择保留隔离和会话生命周期的最简单的方法。
25.一页操作员故事(用于自述文件)
您仅使用他们需要的工具来定义代理(计划、高级开发人员等)。 您提交任务或目标。 AgentOS 启动一个一次性容器,克隆允许的存储库,注入允许的机密,然后让该代理工作。 当它需要您时,您会收到收件箱推送。 完成后,容器消失,并留下提交或 PR。 重复作业和 Webhook 使用相同的路径。 功能模板运行规范(您批准)→计划→多代理计划审查→修订→使用E2E实施→代码审查→修复→wiki→您合并。 目标循环不断地派遣专家,直到检查完成的定义,或者花费/时间/卡住的轨道停止它。