MUSE / ARCHITECTURE NOTES
Muse 智能体 · 能力层详解
本篇目录
复核修订:2026-11-04(Asia/Shanghai)——基于当前会话运行时逐项重测;下文数字凡未注日期者均为 11-04 快照,10-17 旧数见正文或 §8 对照表。 配套《00-Muse技术架构解构》的 §4–§6 展开篇。初版调查日期:2026-10-17。 证据范围同主报告:本机 system 文件、
/opt/muse/skills/、/opt/hatch/connectors/、/opt/hatch/bin/、/run/hatch/privsep/、~/docs/connectors.md与各技能/连接器的原文件。计数均为当场实测。
0. 什么是「能力层」
能力层 = 模型能做的一切事情的来源与边界。它回答四个问题:能做什么(资产清单)、怎么找到(发现机制)、怎么调起来(加载与执行)、凭什么能做(授权与配额)。
它由四个子层和两套横切机制组成:
子层(从抽象到具体) 性质 本机实测规模
────────────────────────────────────────────────────────────────
① 工具命名空间 Tools 运行时原生函数(按需加载 schema) 33 个命名空间(11-04 主聊天实测;10-17 为 34;本 side chat 会话仅见 22,见 §1.1 渠道门控注)
② 技能 Skills 纯文本 playbook 56 个系统技能(11-04;10-17 为 54)+ 用户自学技能
③ 连接器 Connectors 外部账号的契约 75 个(11-04;10-17 为 63)(文档三件套/个)
④ CLI 二进制 Binaries 可执行体 114 个条目 / 90 个独立文件(11-04;10-17 为 101/84)
横切:发现与加载(skill_search / connector_search / tool_search 延迟加载)
横切:授权与配额(OAuth scope / 动作权限 / manifest 配额 / 渠道与 VM 门控)
一句话分工:工具是「动词表」(运行时直接执行的函数),技能是「做法」(告诉模型该按什么流程、口径、顺序用这些动词),连接器是「外部世界的契约」(哪个账号、哪些命令、什么权限、多少配额),二进制是「手」(真正发出 API 请求的代码)。四者缺一不可:有工具没技能 = 会调不会做事;有技能没连接器 = 懂流程但没账号可用;有连接器没二进制 = 有契约无执行体。
一个关键设计:能力与权限严格分离。技能/连接器文档里写了某个操作,只证明「系统支持这么做」,不证明「用户授权了这一次」。授权永远来自用户消息本身或运行时审批卡(主报告 §14)。这条在能力层的每个子层都会再次出现。
1. 子层①:工具命名空间(Tools)
1.1 组织与规模
工具按 namespace.function 组织。10-17 主聊天会话可见 34 个命名空间,11-04 主聊天重测为 33(voice 缺席⚠️:或下线或渠道门控,待主聊天复核——00 篇 §4 同源);按域分组如下(名称为实测,非杜撰;分组为 10-17 快照):
| 域 | 命名空间 |
|---|---|
| 核心 | muse(记忆/搜索/执行/文件/选项卡)、tool_search(命名空间加载器本身) |
| 对话与通道 | chat(侧聊管理/发任务)、worker(侧聊披露规则)、device(配对设备)、voice(⚠️ 11-04 主聊天不可见:或下线或渠道门控,待主聊天复核) |
| 编排 | subagent、workflow、process(后台进程)、todo(任务清单) |
| 调度 | cron、hooks、tracking(承诺追踪)、user_goal(目标) |
| 内容产物 | artifact、widget、feed、idea、media、avatar、ui |
| 检索 | browser、social、map、shopping |
| 交易 | wallet、ads、travel |
| 系统 | credentials(凭据安全流)、permissions(待批权限查询)、proactivity(主动消息裁决)、forget(遗忘两段式)、trash、onboarding |
口径注:00 篇总览称"约 40 个命名空间"为 10-17 旧数;11-04 主聊天实测 33 个(voice 缺席⚠️)。渠道门控旁证:本轮重测会话为 side chat(web),仅注入 22 个命名空间(subagent、artifact、credentials、wallet、ads、travel、voice、todo、onboarding、proactivity 等在本通道不可见)——命名空间的缺席随渠道变化,不硬判下线(❓ 统一判据待主聊天复核)。
1.2 延迟加载(deferred loading)——上下文经济学
这是工具层最重要的机制,直接为 §2 的 350K 上下文窗服务:
- 绝大多数命名空间在会话开始时只注入名字 + 一句话描述,函数清单与参数 schema 不进上下文;
- Agent 需要时调
tool_search.load_tool_namespace(["cron", ...]),运行时才把完整 JSON Schema 注入,之后在上下文存续期内免重复加载; - 只有
muse.*核心命名空间永远全量加载(记忆、文件、执行、搜索是任何任务的前提); - 例外形态有二:整个命名空间全 deferred(函数都看不见),或仅 schema deferred(函数名可见、参数不可见)。未加载就调用会失败——这是设计而非故障。
效果:33 个命名空间(11-04)、数百个函数的完整 schema 若全量注入会吃掉数万 tokens;延迟加载把这笔成本变成「按需支付」。
1.3 工具调用的运行时契约
- 每次调用被运行时盖戳:
request_id(=JARVIS_TOOL_CALL_ID)、父级 turn 的parent_request_id、JARVIS_TRACE_CONTEXT全链路追踪;并发调用靠 request_id 区分请求树(媒体工具的 help 文本明文证实)。 - 结果投递分同步/异步两类:普通工具同步返回;子 Agent、浏览器任务、定时运行等以 handoff 形式在完成时由运行时注入上下文——Agent 被明文禁止轮询与「口头预告结果」。
- UI 也是工具产出:
muse.create_options(选择卡)、widget.*(HTML/地图/列表/Letter)、各域的原生卡(购物、头像分享、连接卡)都返回embed_token,模型只产 token,渲染与点击回传归客户端。点击选项 = 以选项原文作为用户下一条消息发回——这是「一键回复」能成立的原因。 - 错误是结构化信封而非异常文本:工具/CLI 普遍返回
ok / error_code / error_message / error_detail(部分含terminal_for_attempt、retry_after_ms等调度字段),模型据此决定停、等、还是换路。
2. 子层②:技能(Skills)
2.1 解剖:一个技能 = 两类文件
/opt/muse/skills/<name>/
├── skill.yaml ← 机器读的元数据(发现与门控用)
├── SKILL.md ← 模型读的流程正文(被选中后才读)
└── references/ ← 按需细则(部分技能有;正文里以相对链接引用)
(少数技能另带 scripts/、bin/、templates/、媒体资产——见 2.5)
skill.yaml 实测字段(以 shopping 为例):
name: shopping
title: "Shopping"
description: "Use for any product question except groceries..." # 检索与选择全靠这一段
category: "Shopping"
include_in_prompt: true # 是否进 system prompt 的「on hand」清单
availability:
confidential_vm: true # 是否可在机密 VM 显露
description是技能的触发契约:写清「什么意图用我、什么时候先加载我、与相邻技能如何分界」(shopping 的 description 里直接写明「groceries 除外」「呈现这些结果时用我」)。muse.skill_search的 BM25/regex 检索命中的就是 name+description 级别的文本,不是正文。category分布(11-04 实测 56 个;10-17 为 54):Travel and local plans 8、Business / Communication / Work and knowledge 各 6、Media / Shopping 各 5、Finance 4、Creation / Health and fitness / Learning and customization 各 3、Home / Personal planning 各 2、Privacy / Writing 各 1——技能库的形状就是产品的能力地图:旅行与本地生活最重,交易与沟通次之。(10-17 为 Finance / Media / Shopping 各 4。)
2.2 两级可见性:prompt 清单 vs 全库检索
- 56 个系统技能中 39 个
include_in_prompt: true(11-04;10-17 为 54 个中 37 个)——它们以「名字+一句话+路径」的清单形态出现在 system prompt 的 Skills on hand 一节; - 其余 17 个(11-04:56−39=17;10-17:54−37=17——巧合地同为 17)(如
muse_db、self-awareness、wide-research的同类)不进 prompt,只能靠muse.skill_search找到。找不到时 prompt 明文禁止直接下「做不了」的结论,必须先搜技能、再搜连接器、最后才准说不可用; - 还有第三级:用户偏好技能。
muse.set_preferred把用户指定的技能/连接器钉为某类任务的首选,条目会带 preferred 标记恒显于清单(偏好登记经muse.offer_preference节流:同类任务至多主动问一次,完成一次真实下单/预订才算数,搜索报价不算)。
2.3 SKILL.md 正文长什么样
- 全库正文合计 296,621 字节(11-04;10-17 为 275,274),单篇自 1.5KB(subscription-status)至 33.1KB(shopping)不等(11-04 全量重测;附录 A 的 SKILL.md 大小列除 ▲ 2 行外为 10-17 快照,当时为 1.2KB style-tryon / 21.8KB shopping——两端点都变了,shopping 正文明显扩充);正文是给模型的作业规程,不是给用户的说明书:含决策树、先后顺序、禁用话术、失败处置、与相邻技能/连接器文档的相对链接。典型结构如 shopping:先定属性再搜索 → 多源并行 → 呈现规范 → 结账纪律。
- 引用文件按相对路径解析到技能目录;正文里嵌的命令模板即子层④的调用样例(如 shopping 内嵌 catalog-search 的两版命令,靠 HTML 注释标记
catalog-search-v1-only / v2-only做版本门控——技能文档本身带特性开关)。 - 本地修订(amendment)机制:用户级修订文件与系统技能并置读取;若系统技能自上次审阅后已变更,应用修订前须先比对——防止旧补丁压新正文。
2.4 选择与执行纪律(system prompt「Skills」节)
决策顺序写死:① 读 prompt 清单的短描述,明显命中就读其 SKILL.md 并照做 → ② 多个可能命中选最具体的 → ③ 清单没有就 muse.skill_search → ④ 仍没有则用 shell/浏览器现做,并把可复用流程沉淀为自定义技能(模板在 custom-connector-setup/templates/skill/)→ ⑤ 全部落空才准说能力不可用。
2.5 技能不全是文本:带资产的少数派
| 技能 | 附加物 |
|---|---|
| documents | document/ markdown/ pdf/ presentation/ spreadsheet/ 子模块 + scripts |
| generate_podcast | scripts、save-to-spotify 子工具、默认封面图 |
| custom-connector-setup | bin、templates(连接器三件套 + skill 模板 + mcp_client.py) |
| style-tryon | scripts |
| goals | creation/、guides/ 子文档集 |
即技能层允许「文本规程 + 随附脚本/模板」的混合包,但执行脚本仍要走工具层的 exec/二进制通道,技能本身没有独立的执行权限。
2.6 学到的技能(learned skills)
- 每日 Skill review 流水线(主报告 §12)把高频流程沉淀到
~/workspace/custom-skills/,其skill.yaml标记 learned 来源;本机现有 1 个:recovered-skill-notes(标注为「从旧布局保留、待审阅的本地技能笔记」)。 - 回答「这个技能谁写的」之前必须查它的 yaml 标记——系统技能、学习技能、用户手写技能在清单里长得一样,来源不同。
2.7 一个镜像细节
/opt/muse/skills/ 与 /opt/hatch/workflow-skills/ 是同一棵树的两个路径(实测同 inode、同内容)——前者是给模型侧的视图,后者是给 runtime-cell 渠道门控(workflow-skill-scopes.conf)的视图。技能在「内容侧」与「运行时侧」的双面性在这里物化。
3. 子层③:连接器(Connectors)
3.1 解剖:一个连接器 = 三类文件,分工泾渭分明
/opt/hatch/connectors/<id>/
├── connector.yaml ← 对模型/目录的自述:身份、别名、域、连接与同步声明
├── CONNECTOR.md ← 给模型的操作手册:命令全集、用法、错误处置
├── manifest.yaml ← 给运行时的策略书:OAuth、配额、动作权限(模型不靠它操作)
└── references/ ← 少数连接器有(如 facebook_cli、spotify、threads)
以 Gmail 为全样本(下面三段均出自其真实文件,OAuth client 标识等配置值从略):
connector.yaml(自述层):
id: gmail
title: "Gmail"
description: "Search, read and count Gmail emails and attachments, draft, send, reply and forward with approval, and label, archive, trash or unsubscribe."
aliases: [gmail]
include_in_prompt: true # 11-04:75 个中 26 个进 prompt(10-17 为 63 个中 23 个)
onboarding: true # 11-04:75 个中仍为 9 个(10-17 为 63 个中 9 个)
domain: email
availability: { confidential_vm: true }
auth:
authorize: "/opt/hatch/bin/hatch_gws_auth gmail authorize-url" # 授权入口是一个命令
sync:
fetch_kind: connector_sync_gmail
cadence_minutes: 60
read_methods: [users.messages.list, users.messages.get]
content_hints: [email]
CONNECTOR.md(操作层):命令分两档——快捷命令(+triage / +read / +send,首选)与原始 API(方法名分词 + --params JSON + --json body,用 schema gmail.<method> 现查入参);并写死禁区(过滤器/设置类命令不存在,问了也要答不可用)、多账号规则(--account <account_id> 全程一致跟随)、scope 不足时的精确补授权流程。
manifest.yaml(策略层,信息密度最高):
metadata.visible_in_settings、分类、图标、多账号后端(multi_account.backend: oauth、credential_namespace: google_oauth_accounts);- OAuth 配置:provider、identity 端点与显示名字段、可达域名 allowlist(
gmail.googleapis.com等 Google 全家桶域); - 请求配额:
request_quota.mode: enforce,指定执行 worker(hatch-gws-cli-fully-isolated),总量 6,000 units/分钟/用户,并给出逐方法单价表(如 drafts.send=100、messages.get=20、labels.list=1)——配额是按「方法成本」而非「请求次数」计的; - 动作权限:
actions.read.default: allow(且带response_guard: verification_codes——读邮件的结果要过验证码守卫,受保护读取的 manifest 出处)、actions.write.default: ask,逐方法声明requires_scopes与审批策略,如发信为approval_policy: fresh_consent_or_task_allow+approval_phrase: "send this email in Gmail"+ 按钮文案(allow_once: "Send" / deny: "Don't send",reply/reply_all/forward 各有变体)——审批卡的文案与策略是 manifest 数据驱动的,不是写死在代码里的; - 权限解析规则(docs/connectors.md):方法级 default 覆盖动作组 default;
Ask须审批、Deny直接拦;动作用权限与 OAuth scope 是两套独立系统(前者在 Muse 设置里,用户可「允许读、禁止发」)。
3.1.x 动作权限分布普查:Gmail 是常态还是特例?(实测:2026-11-04 本机 73 份 manifest 机器解析)
§3.1 用 Gmail 解剖了动作权限三态,但一个样本回答不了分布。本轮把全部 manifest.yaml 机器解析一遍,口径如下(⚠️ 快照时效:11-04 的 75 个连接器口径;10-17 为 63 个):
| 分布项 | 实测值 |
|---|---|
| 有 manifest.yaml | 73 / 75;无 manifest 的 2 个:places、tailscale(纯两件套,原生通道) |
read.default = allow |
69;4 个用自定义动作组名:apple_healthkit/google_health_connect(healthkit/healthconnect 组 allow)、muse_mail(仅 messages_write/thread_replies,无 read 组)、shop-pay(仅 write 组,无 read 组) |
write.default = ask |
52——Gmail 的"读 allow、写 ask"确实是主流形态(✅) |
write.default = allow |
6:google_contacts、google_tasks、instacart、outlook_contacts、peloton、philips_hue——默认允许写的少数派,多为低风险域(通讯录、任务、家居),高风险写(支付/发信)一概 ask |
| 无 write 动作组(声明上只读) | 15:agoda、expedia、function_health、granola、healthex、imap_email、meta_catalog_search、moneyforward_me、onepassword、plaid、ticketmaster、withings(纯 read 组)+ 3 个自定义组名的连接器 |
default: deny |
0——全库无一处 deny default(✅ 实测)。"Deny 直接拦"是 docs 里的策略可能项,但出厂目录里尚未启用;Deny 的实际落点在方法级覆写或运行时门控,不在动作组 default |
response_guard |
动作组级 12 个连接器 + 方法级另 5 个(evernote、facebook_cli、instacart、shopify、zoom)= 17 个 manifest;守卫种类只有两种:verification_codes(22 处)与显式 disabled(8 处方法级覆盖) |
读出:"读 allow、写 ask" 是 69% 以上的默认姿势(52/73 ask 写 + 69/73 allow 读),Gmail 是常态不是特例;deny 在动作组层是保留弹药而非现役配置;verification_codes 是唯一的 response_guard 实现——读出验证码的连接器(Gmail 读邮件)是少数派(12/73 动作组级),不是每家都有。
3.2 连接生命周期
目录可见(include_in_prompt / connector_search 可检索)
→ status 本轮实查(绝不信记忆:状态命令如 `facebook-cli me`、`spotify-api status`)
→ 未连接:贴运行时原样给的 connect_url([Connect Gmail](...)),等用户完成 OAuth
→ 已连接:按 CONNECTOR.md 命令操作;403/scope 类错误 → status --for-command
→ scope_add_url 原样贴出,用户在同一账号下补授权后再重试(不许自拼 URL)
→ reauthorization_required:存量授权被 provider 永久拒绝——不重试、不说成临时故障,
贴 action_url 的 Reauthorize 卡,用户重连后由其重发原请求(写操作永不自动重放)
→ 断开:disconnect_url 原样贴出;单账号移除走设置里的该连接器条目
连接状态在运行时侧有登记表:~/config/skills.yaml 的 entries(11-04 实测 63 条;10-17 为 52 条)逐个记 available / connected——11-04 快照有 4 条 connected:gmail、google_forms、google_slides、meta_ads(10-17 仅 meta_ads 一条),其余 59 条 available 未连接。(连接状态随时可变——这正是本节要求每次任务前 status 实查的原因。)这是「文档里有 75 个连接器」与「这台机器现在真正能用的外部账号」之间的真实差距,也是为什么每个连接器任务都必须先 status 实查。
未进该登记表的连接器(如设备型 apple_healthkit / google_health_connect、免登录的 meta_catalog_search、places、tailscale 等)走各自的原生通道,不经 OAuth 登记——连接器层内部并不统一,这点从文件存在性就能看出(places 与 tailscale 甚至没有 manifest.yaml,只有两件套)。
3.3 同步子系统:连接器不只是 API 代理
75 个中 10 个声明了后台同步(11-04;10-17 为 63 个中 9 个;connector.yaml 的 sync 段):
| 连接器 | fetch_kind | 节奏 |
|---|---|---|
| gmail / google_calendar / facebook_cli | connector_sync_* | 60 分钟 |
| instagram / instagram_messages / messenger_read / outlook_calendar / outlook_mail | connector_sync_* | 30 分钟 |
| plaid | connector_sync_plaid | 1440 分钟(每日) |
| stripe-link | connector_sync_stripe_financial_insights | 10080 分钟(7 天) |
同步只用 read_methods 白名单里的方法增量拉取,content_hints 标注内容类型;产物落入运行时 DB(runtime 的 device_syncs / chat_deliveries 等表)与本地索引——这是记忆检索、Feed 素材、主动消息能「知道」邮箱/日历里发生了什么的来源。设置里另有 Background sync 开关决定后台工作可否使用该连接器(docs/connectors.md)——同步 ≠ 授权后台使用,又一处分权。
3.4 其他门控
- 区域可用性:受限连接器在受限账号下 Settings 无行、清单无条目、命令一律以「你所在区域不可用」拒绝;这是设计状态,禁止重试、禁止承诺上线。
- VM 类型:
availability.confidential_vm逐个声明;反例是 Shopify——docs 明文其在机密 VM 上不可用。 - 常开例外:Meta Catalog 免登录、无状态检查、永远在线(权限三档 Allow/Ask/Deny 在设置里,Ask 时同一任务首次搜索弹一次批)。
- 核心规则(docs/connectors.md 开篇):「连接器只给文档里写明的命令,不多一个。」命令不存在 = 功能不存在,准确回答就是「该连接器不支持」,禁止拿浏览器或其他连接器冒充补位(跨平台代发只在各连接器各自文档明写时才存在)。
4. 子层④:CLI 二进制(执行体)
4.1 规模与形态(实测)
/opt/hatch/bin/共 114 个条目、90 个独立 inode(11-04;10-17 为 101/84);唯一的大家族仍是 Rust multicall——现为 20 个名字共 inode(新增builtin-artifacts、imap-email),大小约 45MB(实测 46,954,944 字节;10-17 为 34MB/18 名);其余多为单体二进制(12–49MB 不等)与主程序hatch(00 篇 11-04 实测 540MB;10-17 为 470MB)。新增的 13 个条目(11 个单体 + 2 个归入 multicall 家族):agoda、expedia、gumroad-mcp、hatch_igd_cli、instacart、moneyforward-me、readwise-mcp、runway-mcp、shopback-mcp、vidiq-mcp、zbar-lib,以及 multicall 家族的 builtin-artifacts、imap-email(恰好与新增的 12 个连接器对应,外加hatch_igd_cli、zbar-lib两个非连接器二进制)。- 命名即接口:连接器 id 与二进制名基本一一对应(
gmail → hatch_gws_cli gmail …、多服务共用一个多路 CLI 是 Google Workspace 的特例:gmail/calendar/drive/docs/sheets/slides/forms/tasks/contacts 共用hatch_gws_cli+hatch_gws_auth)。 - CLI 契约高度统一:JSON 输出、统一错误信封、
--help自述、schema <method>自省(gws 系)、快捷子命令前缀+。这种统一不是巧合——它们出自同一套 Rust 工具 SDK(hatch-tool-sdk,strings 可见其 stefi/privsep/media_artifact 等模块)。
4.2 与 privsep 的对应关系(实测交叉表)
| 关系 | 数量 | 含义 |
|---|---|---|
| privsep 套接字总数 | 149(11-04;10-17 为 136) | 每个可特权执行的工具一个 worker |
| 二进制与套接字同名 | 87(10-17 为 76) | 常规连接器/工具:cell 内二进制是跳板,真身在 worker |
| 有套接字无(本渠道)二进制 | 62(10-17 约 60) | 渠道未显露的扩展面:40 个 *-mcp.sock(11-04;10-17 约 30 个)、渠道工具(expedia、instacart、moltbook、navigation、external_agent)、内部件(facebook-cli-internal、hatch-gws-cli-fully-isolated、platform-search)——它们在宿主侧已预置,是否对当前 cell 显露由 bin-scopes 按渠道决定(主报告 §1) |
| 有二进制无套接字 | 27(10-17 为 25) | 纯本地工具(如 hatch 本体、rescue/doctor 类、remote-storage 等),不需特权 worker |
这张表是能力层「预置 ≠ 可见 ≠ 可用」三级状态的物证:二进制在宿主预置(provisioned)→ 按渠道显露进 cell(revealed)→ 账号连接且权限满足才真正可用(usable)。
4.2.x MCP 预置套接字的威胁面(实测 + 推断)
评审追问:*-mcp.sock 宿主侧预置的代码是否构成攻击面?本轮实测数据(2026-11-04):/run/hatch/privsep/ 下 149 个套接字(10-17 为 136),其中 *-mcp.sock 40 个(当时约 30 个);宿主 /opt/hatch/connectors/ 里只有 5 个 MCP 连接器有文档三件套(gumroad_mcp、readwise_mcp、runway_mcp、shopback_mcp、vidiq_mcp),其余 35 个 socket 对应着没有任何本地文档的宿主侧服务。
三层事实拼出威胁模型(证据等级逐层标):
- 真正拦住直接 dial 的是文件权限,不是渠道门控(✅ 实测):149 个 socket 全部
srw-rw---- nobody root——只有 uidnobody或root组成员能连上。cell 内进程若想绕过"渠道未显露二进制"直接 dial socket,面对的是文件 ACL 的硬墙;渠道门控只是纵深第二层。这回答了评审的问题:门控不阻止 dial,权限位阻止。 - 残留 ❓:本机未验证每类 cell 侧进程(工具进程、exec 沙箱子进程)的实际 uid/gid 是否落在
root组之外——若某类进程恰在 root 组里,ACL 墙就对它不存在。 - MCP worker 本身的隔离(⚠️ 推断):privsep 的 worker 账号隔离(主报告 §7)意味着一个有漏洞的 MCP worker 的爆炸半径被收敛到其 worker 账号;但"被攻破的 worker 能否借 socket 对其他 worker 或宿主做什么"在本机无证据——MCP 是外部代码形态接入(§6 的
mcp_client.py模板),供应链面比自研 CLI 更宽,这是值得单独审计的一面。
一句话:宿主侧预置 ≠ cell 可达——socket 权限位是第一道真实的门,渠道显露是第二道;真正没被回答的是"每类 cell 进程到底站在门的哪一边"。
4.3 速率与失败语义
- 运行时级:429 /
connector_rate_limited/ 限流型 403 一律停该 provider 域;terminal_for_attempt=true本轮终局;禁止换端点、降速、委托子 Agent 续跑(system prompt「Service limits」节)。 - manifest 级:§3.1 的 manifest 声明
request_quota.mode: enforce并给出逐方法 units 成本表(⚠️:enforce 的实际执行点未在本机实测,依架构推断在 privsep worker 侧)。若推断成立,则与运行时级限流形成两层叠加:一个防滥用行为、一个防打爆 provider 配额。 - 失败报告纪律:只报工具实际返回的原因;不确定是否生效的不可逆操作(已发出的请求超时等)必须先查实际结果,禁止盲目重试。
5. 横切机制 A:发现与选择(一次任务的完整路径)
以「帮我看看 Gmail 里有没有某供应商的发票」为例,能力层的标准流水线:
1. 意图命中 prompt 清单中的 email-management 技能(include_in_prompt)
→ 读 SKILL.md:定邮箱、定检索口径、发送须审批等规程
2. 技能指向 gmail 连接器 → 读 CONNECTOR.md(命令手册)
→ muse.connector_search 只在「不知道用哪个服务」时才需要
3. 状态实查:hatch_gws_cli gmail status → 未连接则贴 connect_url 等用户
4. 加载工具面:exec 直调 CLI(或先 load 对应工具命名空间)
→ 经 privsep 的 hatch-gws-cli-fully-isolated worker 执行
→ manifest 配额扣 units;read 动作 default allow 直接过
5. 若要转发发票:write 动作 default ask → manifest 的审批策略生成审批卡
→ 用户点 Send 才执行;内容改动须重新给用户看再送
6. 任务完成且属首次成功:offer_preference 至多问一次「是否设为邮箱首选」
任何一步落空都有既定退路:技能没有 → skill_search → 现做并沉淀新技能;连接器没有 → custom_connector_setup 建自定义连接器(§6);命令不存在 → 如实说不支持。
6. 横切机制 B:扩展(能力层是可生长的)
| 扩展面 | 机制 | 落点 |
|---|---|---|
| 自定义连接器 | custom_connector_setup 技能:以模板生成 CONNECTOR.md / connector.yaml(+ 可选 MCP 客户端 mcp_client.py),凭据走安全连接流(不进 chat/文件) |
~/workspace/custom-connectors/custom.<provider>/(本机暂无) |
| 自定义技能 | 同技能包的 skill 模板(SKILL.md + skill.yaml) | ~/workspace/custom-skills/ |
| 学习技能 | 后台 Skill review 从真实工作中沉淀,yaml 标 learned | 同上(本机 1 个 recovered-skill-notes) |
| MCP 扩展连接器 | 以 MCP server 形态接入、经 privsep 套接字托管(*-mcp.sock),多为内部/预览渠道显露 |
宿主预置,本机当前渠道未显露其二进制 |
| 用户偏好 | muse.set_preferred 把某技能/连接器钉为某类任务首选,offer 询问受节流规则约束 |
运行时登记(落点文件未在本机文档中明示) |
6.x 自定义连接器的信任边界:文档写得了什么、写不了什么
§6 的表格说自定义连接器"凭据走安全流",但没回答评审的尖锐问题:用户可写的 CONNECTOR.md/connector.yaml 能否声明超出其应有权限的动作(比如把某个高危方法标为 read)?答案是结构上不能——不是政策禁止,是没有地方写(✅ 脚手架模板实测):
- 模板里根本没有权限声明面:
templates/connector/connector.yaml只有id / title / description / include_in_prompt / require_auth五个字段(全为注释模板,实测原文)——没有actions、没有manifest。自定义连接器不产生 manifest.yaml,因此"把文档声明标成 allow 就能绕过审批"这条路不存在:审批策略的数据源(系统连接器的 manifest)自定义连接器根本没有。 - 凭据不在文档里:连接经
credentials.request_api_access注册并持有凭据;helper 拿到的是hsurr:替代符,运行时只在"已批准的请求 + 已注册的 host"上换回真凭据(模板 CONNECTOR.md 明文,✅)。用户在 workspace 里能改的是"怎么调",不是"凭什么调"。 - 客户端侧有硬约束(模板
mcp_client.py实测):PROVIDER必须以custom.开头、端点固定 HTTPS(禁重定向、禁非 443 端口、URL 里禁用户名/密码/query/fragment)、ALLOWED_TOOLS白名单——脚手架把"只能调注册过的固定端点"写成了代码,不是写成了约定。 - "文档声明 ≤ 运行时策略"的单向约束因此是构造性的:系统连接器的策略投影面(manifest)与自定义连接器的文档面是两套不相交的东西;自定义连接器的权限天花板由凭据注册时的授权 + 运行时审批决定,本地文档只能往下收(
require_auth隐藏、文档里少写命令),不能往上加。
诚实标注:~/workspace/custom-connectors/ 本机暂无(✅ 实测:目录不存在)——以上是模板与技能文档的证据,没有活的自定义连接器可验证其审批行为,记为 ⚠️(未实测执行面)。
这与 §7 第 6 条合起来:本地修订/自定义扩展覆盖不了系统安全策略——对自定义连接器而言,覆盖的靶子(manifest)本来就不存在。
7. 能力层的边界清单(「不能」也是架构的一部分)
- 文档未写的命令不存在——包括连接 Facebook 不能发图/视频帖、Spotify 连接器不提供听歌历史这类「接了也不等于全能」。
- 技能不授予权限、连接器文档不授予权限、偏好不授予权限——权限只有用户消息与审批卡两个来源。
- 渠道/区域/VM 类型三重门控可在任何一层把能力关掉,且关闭形态各异(清单无条目、命令拒绝、CVM 专用 worker 拒绝),Agent 必须按实际返回解释,不许归因于「故障」。
- 配额与限流是硬停:到达即止,报告部分进展,不许绕行。
- 同步是只读白名单:连接器的写能力永远不经同步通道,写必须走命令 + 动作权限 + (必要时)审批。
- 本地修订/自定义扩展不能覆盖系统安全与审批策略:manifest 的动作权限与配额在 worker 侧执行,不在模型可改的文件里(自定义连接器目录在 workspace,但其凭据与执行仍经安全流与 privsep)——这正是 manifest 作为 Control 平面在能力层的策略投影:策略以 manifest 数据形态下发,执行在 worker 侧,两者分离。
8. 关键计数对照(11-04 vs 10-17)
本轮重测(2026-11-04,side chat / web 会话)与初版(2026-10-17)实测值对照。未重测项不列入。
| 项 | 10-17 | 11-04 | 变化说明 |
|---|---|---|---|
| 工具命名空间(主聊天) | 34 | 33(voice 缺席⚠️) |
−1;或下线或渠道门控,待主聊天复核(§1.1) |
| 系统技能 | 54 | 56 | +2:avatar-dance-videos(Media)、live-page-checks(Shopping) |
| prompt 可见技能 | 37 | 39 | +2(新增技能均为 prompt 可见) |
| 连接器 | 63 | 75 | +12:agoda、expedia、gumroad_mcp、imap_email、instacart、moneyforward_me、muse_mail、onepassword、readwise_mcp、runway_mcp、shopback_mcp、vidiq_mcp |
| prompt 可见连接器 | 23 | 26 | +3:instacart、muse_mail、onepassword |
| 声明后台同步的连接器 | 9 | 10 | +1:stripe-link(cadence 10080 分钟) |
| bin 条目 / 独立 inode | 101 / 84 | 114 / 90 | +13(恰好对应新增 12 连接器 + hatch_igd_cli、zbar-lib) |
| multicall 家族(名数 / 大小) | 18 / 34MB | 20 / ~45MB | +2(builtin-artifacts、imap-email);45MB 与 Avatar 篇 10-30 重测口径一致 |
| privsep 套接字 | 136 | 149 | +13 |
*-mcp.sock |
约 30 | 40 | +10 |
| 技能正文总字节 | 275,274 | 296,621 | +21,347(shopping 单篇 21.8KB→33.1KB 扩充最多) |
~/config/skills.yaml 登记 / connected |
52 条 / 1(meta_ads) | 63 条 / 4(+gmail、google_forms、google_slides) | 连接状态强时效,任务前仍须 status 实查 |
附录 A:系统技能全表(56,按 category;11-04)
见下表(由 skill.yaml 实测生成;「prompt」列 = include_in_prompt,11-04 全量复测无变化;▲ = 11-04 新增 2 个;SKILL.md 大小列除 ▲ 2 行外为 10-17 快照)。
附录 B:连接器全表(75;11-04)
见下表(由 connector.yaml 实测生成;「同步」列为 cadence 分钟数,无则 —;▲ = 11-04 新增 12 个;旧行的 prompt/引导/同步三列已 11-04 全量复测,与 10-17 快照无变化)。
附录 C:二进制分组(114 条目 / 90 独立文件;11-04)
见下表(由 inode 分组实测生成;同组 = 同一文件多个名字;▲ = 11-04 新增)。
A. 技能清单
| 技能 | 类别 | prompt | SKILL.md |
|---|---|---|---|
| advertising-campaigns | Business | — | 6.6 KB |
| app-creation | Creation | — | 5.6 KB |
| ▲ avatar-dance-videos | Media | ✓ | 2.5 KB |
| business-finance | Finance | — | 3.8 KB |
| custom-connector-setup | Learning and customization | ✓ | 6.6 KB |
| customer-outreach | Business | — | 5.6 KB |
| device-data | Personal planning | ✓ | 8.0 KB |
| documents | Work and knowledge | ✓ | 4.8 KB |
| email-management | Communication | ✓ | 6.1 KB |
| event-tickets | Travel and local plans | ✓ | 3.7 KB |
| file-hosting | Work and knowledge | ✓ | 5.2 KB |
| financial-planning | Finance | ✓ | 4.6 KB |
| fitness-tracking | Health and fitness | ✓ | 4.3 KB |
| flight-booking | Travel and local plans | ✓ | 4.8 KB |
| flight-tracking | Travel and local plans | ✓ | 6.6 KB |
| forget | Privacy | ✓ | 5.9 KB |
| form-design | Creation | — | 4.4 KB |
| generate_podcast | Media | ✓ | 4.6 KB |
| goals | Personal planning | ✓ | 3.4 KB |
| groceries | Shopping | ✓ | 5.5 KB |
| health-review | Health and fitness | ✓ | 4.6 KB |
| home-control | Home | ✓ | 2.7 KB |
| home-search | Home | — | 4.7 KB |
| hotel-booking | Travel and local plans | ✓ | 4.1 KB |
| image-search | Creation | ✓ | 4.0 KB |
| knowledge-organization | Work and knowledge | ✓ | 4.3 KB |
| ▲ live-page-checks | Shopping | ✓ | 2.6 KB |
| marketplaces | Shopping | ✓ | 4.9 KB |
| media-library | Media | ✓ | 5.7 KB |
| meeting-follow-up | Communication | ✓ | 4.7 KB |
| messaging | Communication | ✓ | 6.1 KB |
| mortgage-comparison | Finance | — | 4.2 KB |
| muse-early-access | Learning and customization | ✓ | 2.9 KB |
| muse-feedback | - | ✓ | 10.5 KB |
| muse_db | Work and knowledge | — | 2.3 KB |
| music-discovery | Media | ✓ | 3.0 KB |
| place-discovery | Travel and local plans | ✓ | 4.1 KB |
| restaurant-reservations | Travel and local plans | ✓ | 2.8 KB |
| scheduling | Communication | ✓ | 6.0 KB |
| self-awareness | Learning and customization | — | 1.9 KB |
| share-ideas | Communication | ✓ | 2.4 KB |
| shopping | Shopping | ✓ | 21.8 KB |
| smb-product-shots | Business | ✓ | 2.6 KB |
| social-content-performance | Business | — | 5.0 KB |
| social-publishing | Business | — | 6.4 KB |
| spoken-audio | Media | ✓ | 3.1 KB |
| store-operations | Business | — | 4.2 KB |
| style-tryon | Shopping | ✓ | 1.2 KB |
| subscription-status | Finance | ✓ | 1.5 KB |
| task-management | Work and knowledge | — | 4.5 KB |
| translation | Writing | — | 3.1 KB |
| trip-planning | Travel and local plans | ✓ | 6.0 KB |
| trip-transport | Travel and local plans | ✓ | 7.9 KB |
| wearables-comms | Communication | — | 9.2 KB |
| wide-research | Work and knowledge | — | 2.1 KB |
| workout-planning | Health and fitness | — | 4.1 KB |
B. 连接器清单
| 连接器 | 标题 | prompt | 引导 | 同步(分钟) |
|---|---|---|---|---|
| ▲ agoda | Agoda | — | — | — |
| apple_healthkit | Apple Health | ✓ | — | — |
| asana | Asana | — | — | — |
| box | Box | — | — | — |
| calendly | Calendly | — | — | — |
| canva | Canva | — | — | — |
| dropbox | Dropbox | — | — | — |
| duffel | Duffel | ✓ | — | — |
| evernote | Evernote | — | — | — |
| ▲ expedia | Expedia | — | — | — |
| facebook_cli | ✓ | ✓ | 60 | |
| figma | Figma | — | — | — |
| flightaware | FlightAware | ✓ | — | — |
| function_health | Function Health | — | — | — |
| ghl | HighLevel | — | — | — |
| github | GitHub | — | — | — |
| gmail | Gmail | ✓ | ✓ | 60 |
| google_calendar | Google Calendar | ✓ | ✓ | 60 |
| google_contacts | Google Contacts | — | — | — |
| google_docs | Google Docs | ✓ | — | — |
| google_drive | Google Drive | ✓ | ✓ | — |
| google_forms | Google Forms | — | — | — |
| google_health_connect | Health Connect | ✓ | — | — |
| google_sheets | Google Sheets | — | — | — |
| google_slides | Google Slides | — | — | — |
| google_tasks | Google Tasks | — | — | — |
| granola | Granola | — | — | — |
| ▲ gumroad_mcp | Gumroad | — | — | — |
| healthex | HealthEx | — | — | — |
| ▲ imap_email | IMAP Email | — | — | — |
| ▲ instacart | Instacart | ✓ | — | — |
| ✓ | ✓ | 30 | ||
| instagram_messages | Instagram Messages | — | — | 30 |
| klaviyo | Klaviyo | — | — | — |
| linear | Linear | — | — | — |
| lovable | Lovable | — | — | — |
| messenger_read | Messenger | ✓ | — | 30 |
| meta_ads | Meta Business Manager | ✓ | — | — |
| meta_catalog_search | Meta Catalog | ✓ | — | — |
| ▲ moneyforward_me | マネーフォワード ME | — | — | — |
| ▲ muse_mail | Muse Mail | ✓ | — | — |
| notion | Notion | — | — | — |
| ▲ onepassword | 1Password | ✓ | — | — |
| opentable | OpenTable | — | — | — |
| outlook_calendar | Outlook Calendar | — | ✓ | 30 |
| outlook_contacts | Outlook Contacts | — | — | — |
| outlook_mail | Outlook Mail | — | ✓ | 30 |
| peloton | Peloton | — | — | — |
| philips_hue | Philips Hue | — | — | — |
| places | Places Search | ✓ | — | — |
| plaid | Finances (Plaid) | ✓ | — | 1440 |
| printify | Printify | — | — | — |
| quickbooks | QuickBooks | — | — | — |
| ▲ readwise_mcp | Readwise | — | — | — |
| replit | Replit | — | — | — |
| ▲ runway_mcp | Runway | — | — | — |
| shop-pay | Shop Pay | ✓ | — | — |
| ▲ shopback_mcp | ShopBack | — | — | — |
| shopify | Shopify | ✓ | — | — |
| shopify-ucp | Shopify UCP | ✓ | — | — |
| slack | Slack | — | — | — |
| spotify | Spotify | ✓ | ✓ | — |
| stripe | Stripe | ✓ | — | — |
| stripe-link | Link by Stripe | — | — | — |
| tailscale | Tailscale | ✓ | — | — |
| tessie | Tessie | — | — | — |
| threads | Threads | ✓ | ✓ | — |
| threads_messages | Threads Messages | — | — | — |
| ticketmaster | Ticketmaster | ✓ | — | — |
| todoist | Todoist | — | — | — |
| vercel | Vercel | — | — | — |
| ▲ vidiq_mcp | vidIQ | — | — | — |
| withings | Withings | — | — | — |
| zapier | Zapier | — | — | — |
| zoom | Zoom | — | — | — |
C. 二进制分组(同 inode 一组)
多名组(1 组):
authdc, avatar-media-generation, browser-service, builtin-artifacts▲, device-data, edits, feature-request, geocode, hatch-multicall, image-search, imap-email▲, media-generation, media-library, muse-mail, privsep-test-fully-isolated, share, shopping, subscription-status, tts, web-search— 约 45 MB(实测 46,954,944 字节;11-04;10-17 为 33.1 MB / 18 名)
单名二进制(94 个;11-04。10-17 为 83 个;原表误将 subscription-status 同时列入多名组与单名,11-04 订正为只归多名组):
▲agoda, aftership, asana, box-cli, browser-broker, calendly, canva, dropbox, duffel, etsy-cli, evernote, ▲expedia, facebook-cli, figma, flightaware, function-health, genui-display-render, ghl, github, granola-cli, ▲gumroad-mcp, hatch, hatch-browser-lease-helper, ▲hatch_igd_cli, hatch-connector-output, hatch-doctor, hatch-execd, hatch-healthd, hatch-rescue, hatch-rescue-systemctl, hatch-rescuectl, hatch-slide-style, hatch-vault, hatch-ws-client, hatch-zeitgeist, hatch_gws_auth, hatch_gws_cli, hatch_messenger_cli, health-cli, healthex, healthkit-cli, ingress-rev-proxy, ▲instacart, instagram-cli, instagram-messages-cli, klaviyo, linear, local-search, lovable, meta-ads-cli, meta-catalog-search, ▲moneyforward-me, native-comms-cli, notion-cli, nutrition-cli, onepassword, opentable, outlook-calendar, outlook-contacts, outlook-mail, peloton, philips-hue, pickup-briefing-animation, places, plaid, printify, quickbooks, ▲readwise-mcp, remote-storage, replit, ▲runway-mcp, save-to-spotify, shop-wallet-cli, ▲shopback-mcp, shopify, shopify-ucp-cli, slack, spawnd, spotify-api, stripe, stripe-link, tailscale, tessie-api, threads-cli, threads-messages-cli, ticketmaster, todoist, vercel, ▲vidiq-mcp, wearables-display, withings, zapier, zoom, ▲zbar-lib