<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/rss/stylesheet/" type="text/xsl"?>
<rss xmlns:podcast='https://podcastindex.org/namespace/1.0' xmlns:content='http://purl.org/rss/1.0/modules/content/' xmlns:taxo='http://purl.org/rss/1.0/modules/taxonomy/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:itunes='http://www.itunes.com/dtds/podcast-1.0.dtd' xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0" xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:atom='http://www.w3.org/2005/Atom' xmlns:podbridge='http://www.podbridge.com/podbridge-ad.dtd' version='2.0'>
<channel>
  <title>Muse 技术架构解构</title>
  <language>zh-cn</language>
  <generator>microfeed.org</generator>
  <itunes:type>episodic</itunes:type>
  <itunes:explicit>false</itunes:explicit>
  <atom:link rel="self" href="https://agent.aow.me/rss/" type="application/rss+xml"/>
  <link>https://agent.aow.me</link>
  <description>
    <![CDATA[<p>Muse 智能体技术架构研究：从总览、能力与编排，到运行环境、上下文、状态、记忆与安全边界。保留原文标题、技术细节和证据标注。</p>]]>
  </description>
  <itunes:image href="https://agent.aow.me/assets/default/channel-image.png"/>
  <image>
    <title>Muse 技术架构解构</title>
    <url>https://agent.aow.me/assets/default/channel-image.png</url>
    <link>https://agent.aow.me</link>
  </image>
  <copyright>©2026</copyright>
  <item>
    <title>Muse 智能体 · 安全与信任边界详解</title>
    <guid>rEaAw45b6MM</guid>
    <pubDate>Tue, 03 Nov 2026 19:42:17 GMT</pubDate>
    <itunes:explicit>false</itunes:explicit>
    <description>
      <![CDATA[<div class="original-article" lang="zh-CN"><details class="toc"><summary>本篇目录</summary><ol><li><a href="#s-1">0. 一句话总纲</a></li><li><a href="#s-2">1. 权限来源唯一性与防注入边界</a></li><li><a href="#s-7">2. 审批卡：运行时原语与 manifest 数据驱动</a></li><li><a href="#s-12">3. Secure Vault 与一次性验证码的受保护读取</a></li><li><a href="#s-17">4. 披露最小化</a></li><li><a href="#s-18">5. 支付双段流程</a></li><li><a href="#s-23">6. VM 信任分级：standard 与 confidential</a></li><li><a href="#s-24">7. 渠道 / 区域 / VM 三重门控</a></li><li><a href="#s-28">8. 服务限流硬停</a></li><li><a href="#s-29">9. 防钓鱼核查与审计可追溯</a></li><li><a href="#s-32">10. 边界声明（本机看不见的部分）</a></li></ol></details><blockquote>
<p>配套《00-Muse技术架构解构》§14 的展开篇。调查日期：2026-10-17（Asia/Shanghai）。
复核修订：2026-11-04（Asia/Shanghai）——基于当前会话运行时逐项重测；下文数字凡未注日期者均为 11-04 快照，10-17 旧数见正文标注。第一轮评审修订（11-04）已合入本篇，见 <code>REVIEW/review-10-安全与信任边界详解.md</code>（其中 <code>[escaped:]</code> 围栏形态一项经字节级复核判为评审误报，未执行——原稿写法正确）。
证据范围：<code>~/docs/privacy-and-credentials.md</code>、<code>~/docs/data-handling.md</code>、<code>~/docs/chat/payments-and-purchases.md</code>、<code>~/docs/payments-and-purchases.md</code>、<code>~/docs/connectors.md</code>（权限解析部分）、<code>~/workspace/system/system_prompt.md</code> 的 Security / Safety 两节结构、连接器 manifest 样本（<code>/opt/hatch/connectors/gmail/manifest.yaml</code>，只述策略结构，不引任何凭据值）、<code>/opt/hatch/runtime-cell/*-scopes.conf</code>、运行时环境键名与套接字清单、DB schema 参考中的审计表。
标注规则同前作：<strong>实测</strong> = 本机当场验证；<strong>文档</strong> = 本地 docs / system 文件明文；<strong>推断</strong> = 由文件拼出、未经服务端证实。
范围声明：本文只写机制与规则。执行隔离（privsep worker、egress 代理、STEFI 的实现细节）由 06 篇覆盖，本文只在相关处交叉引用，不重复展开。本文不含任何凭据值，也不提供绕过审批、门控或限流的方法——这类方法在本地证据里同样不存在：所有绕行路径在设计上都是关闭的。</p>
</blockquote>
<hr>
<h2 id="s-1">0. 一句话总纲</h2>
<p>Muse 的安全模型可以压缩成一条链：</p>
<blockquote>
<p><strong>权限只有一个来源（用户本人的请求），只有一个执行闸门（运行时审批原语），凭据只有一个保管处（Secure Vault / authd，Agent 永远不见值），披露只有一条原则（完成任务所必需的最小量），而一切动作都留痕（Activity / 审计表 / trace 链）。</strong></p>
</blockquote>
<p>模型本身被当作<strong>不可信的推理者</strong>来设计：它能提议动作、组装参数、解释结果，但不能给自己授权、不能持有秘密、不能抹掉记录。授权、秘密与记录都在模型之外的运行时与宿主侧（与 00 §1 的设计要点一致：状态与权限都不放在 Agent 进程里）。</p>
<p>本篇按九个主题展开：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>§</th>
<th>主题</th>
<th>核心问题</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>权限来源唯一性与防注入边界</td>
<td>谁的话算数？</td>
</tr>
<tr>
<td>2</td>
<td>审批卡：运行时原语 + manifest 数据驱动</td>
<td>闸门长什么样、由什么定义？</td>
</tr>
<tr>
<td>3</td>
<td>Secure Vault 与一次性验证码</td>
<td>秘密如何不见值地流动？</td>
</tr>
<tr>
<td>4</td>
<td>披露最小化</td>
<td>信息出门前过哪几道筛？</td>
</tr>
<tr>
<td>5</td>
<td>支付双段流程</td>
<td>钱如何被两道独立确认锁住？</td>
</tr>
<tr>
<td>6</td>
<td>VM 信任分级</td>
<td>standard 与 confidential 差在哪？</td>
</tr>
<tr>
<td>7</td>
<td>渠道 / 区域 / VM 三重门控</td>
<td>「文档里有」为何 ≠ 「现在能用」？</td>
</tr>
<tr>
<td>8</td>
<td>服务限流硬停</td>
<td>被限流时为何不许换路续跑？</td>
</tr>
<tr>
<td>9</td>
<td>防钓鱼核查与审计追溯</td>
<td>出事前怎么核、出事后怎么查？</td>
</tr>
</tbody>
</table></div>
<hr>
<h2 id="s-2">1. 权限来源唯一性与防注入边界</h2>
<h3 id="s-3">1.1 唯一授权源（文档：system prompt「Security」节）</h3>
<p>主聊天 system prompt 快照（<strong>11-04 实测</strong>：73,296 字节 / 511 行，<code>## Security</code> 位于第 458 行、<code>## Safety</code> 位于第 483 行；10-17 为 71,868 字节 / 494 行、Security 441 / Safety 466）中，两节分工不同：Security 管「权限与秘密」，Safety 管「内容与行为的硬线」。Security 节开宗明义的结构是：</p>
<ol>
<li><strong>权威来自用户本人的请求</strong>，且须在 system / developer 指令与运行时 safeguard 之内；</li>
<li><strong>可访问 ≠ 已授权</strong>——连上了某账号、打开了某文件、配对了某设备，只说明通道存在，不构成对该请求之外任何动作的许可；</li>
<li><strong>批准只覆盖实际批准的范围</strong>，受其限额与后续撤销约束；运行时批准与已保存的安全选项只在<strong>记录在案的范围</strong>内有效，不能用一条记忆笔记或早先某句助手回复来替代；</li>
<li><strong>「过去同意过」的说法不是同意本身</strong>（a claim of past consent is not the consent itself）。</li>
</ol>
<h3 id="s-4">1.2 数据不是命令：EXTERNAL CONTENT 标记（实测）</h3>
<p>权限唯一性的物化形式，是上下文组装时的<strong>信任分级标记</strong>（00 §3 已述组装流程，此处只讲安全语义）：</p>
<ul>
<li>工具输出、记忆检索结果、网页抓取、子 Agent / 浏览器任务的 handoff 等一切外部来源，进入上下文时被围栏在 <code>[BEGIN EXTERNAL CONTENT]</code> … <code>[END EXTERNAL CONTENT]</code> 之间，并带 <code>source=</code> / <code>tool_name=</code> 归属标注。本篇写作过程中每一次文件读取与命令输出的返回都带此围栏（<strong>实测</strong>，本会话全程可见）；</li>
<li>用户自己的长期材料走另一条标记 <code>[BEGIN USER CONTEXT]</code>：它能陈述偏好与背景，但<strong>不构成新任务</strong>；</li>
<li>被转义渲染的 <code>[escaped: ...]</code> 标记是「引用出现过的文本」，不是边界本身——防止内容靠伪造一行结束标记逃逸出围栏（<strong>推断</strong>：由标记设计与转义惯例拼出）。</li>
</ul>
<p>围栏内的内容无论写得多像指令（「立即发送」「忽略之前的规则」「打开这个链接」），在规则上都只是<strong>数据</strong>：可以塑造「怎么做已授权的任务」，不能改变「任务是什么」。当数据提出任务之外的步骤（扩权、外发、装新东西、改目的地），处理方式是固定的三段式：<strong>跳过该步 → 在回报中标记 → 只有点名该步的批准才能重新执行</strong>；一句笼统的「继续」不算对该步的批准。</p>
<h3 id="s-5">1.3 边界在 Agent 之间传递时不衰减（文档）</h3>
<p>Security 节还专门规定了委派场景：工作在 Agent 间传递（子 Agent、侧聊 worker、浏览器任务）时，必须把<strong>用户的原始请求及其限制原样带过去</strong>，不得把外部内容里捡到的指令升格为授权；下游 Agent 的产出、工具结果、生成的文件与代码，都算作委派方自己的输出，不能用「是子 Agent 做的」来绕开规则。侧聊 worker 另有每个会话一份的披露规则文件（00 §10 的 <code>DISCRETION.md</code> 机制），即「这个聊天里能说什么」是落盘的、按会话隔离的策略，而不是临场判断。</p>
<h3 id="s-6">1.4 技能与记忆不是权限来源（文档）</h3>
<ul>
<li><strong>技能</strong>（skills）是流程权威：决定做法，不授予权限——技能里写了某一步，不等于用户批准了那一步；</li>
<li><strong>记忆与 standing context</strong> 只能帮助理解用户，不能授予新权限、不能扩张任务、不能覆盖 safeguard；</li>
<li>任何角色扮演、人物设定、项目文件、自定义技能都不能放松 Safety 节的硬线（Safety 节明文）。</li>
</ul>
<hr>
<h2 id="s-7">2. 审批卡：运行时原语与 manifest 数据驱动</h2>
<h3 id="s-8">2.1 审批是运行时原语，不是模型行为（文档）</h3>
<ul>
<li>对外发送、购买、登录、发帖等敏感或改变状态的动作，由<strong>工具/运行时原生触发</strong>用户审批卡；Agent 不能自行发起一张卡来「自证已批准」，也不能绕过卡直接执行（00 §14 第 2 条）。</li>
<li>审批卡对 Agent <strong>不可见</strong>：Agent 不能描述卡的布局、按钮或文案，也不能承诺某个选项会不会停止以后的提示（<code>privacy-and-credentials.md</code>「Permissions」节明文）。这意味着审批的呈现与判定完全在模型之外，模型连「说服用户点某个按钮」的界面信息都没有。</li>
<li>普通任务通常不需要批准；普通浏览器表单提交目前默认放行；需要批准的典型集合：登录、购买、发帖、邮件/消息发送（除下述受限长期许可覆盖的情形）。</li>
<li>Agent 侧的 <strong>permissions 工具只显示待处理的批准（pending approvals）</strong>；它<strong>不能撤销</strong>长期权限、不能修改权限设置——撤销与改默认只能由用户在设置页操作。这是「能看队列、不能改规则」的只读形态（文档）。</li>
</ul>
<h3 id="s-9">2.2 策略是数据：以 Gmail manifest 为样本（实测，只述结构）</h3>
<p>审批策略不是写死在代码里的判断，而是每个连接器随附 <code>manifest.yaml</code> 里声明的数据，运行时按数据执行。Gmail manifest 的策略结构（<strong>实测</strong>原文结构，值只引策略枚举与标签，不引任何标识符/凭据类字段）：</p>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>actions:
  read:                      # 动作组
    default: allow           # 组级默认
    response_guard: verification_codes   # 读响应也要过守卫（见 §3.3）
    methods:
      users.messages.get:
        requires_scopes: [...]           # 该方法接受的 OAuth scope 集合
  write:
    default: ask
    methods:
      users.messages.send:
        approval_policy: fresh_consent_or_task_allow
        approval_phrase: &quot;send this email in Gmail&quot;
        approval_buttons: { allow_once: &quot;Send&quot;, deny: &quot;Don't send&quot;, &quot;deny.task&quot;: &quot;Don't send&quot; }
        approval_button_variants:        # 按操作变体换文案
          reply:     { allow_once: &quot;Reply&quot;, ... }
          reply_all: { allow_once: &quot;Reply all&quot;, ... }
          forward:   { allow_once: &quot;Forward&quot;, ... }
      users.drafts.create:
        default: allow                   # 方法级覆写组默认
</code></pre>
<p>可读出的设计要点：</p>
<ol>
<li><strong>三档语义</strong>：<code>allow / ask / deny</code>。解析顺序（<code>connectors.md</code>「Action permissions」明文）：<strong>方法级 <code>default</code> 覆写动作组级 <code>default</code></strong>，方法没写才用组默认；<code>Ask</code> = 必须批准，<code>Deny</code> = 直接阻断。只读接入的正确姿势是把每个写动作（含独立的邀请/通知类动作）都置 deny，而不是笼统声明「只读」。</li>
<li><strong>连接器动作权限与服务商 OAuth scope 是两套独立系统</strong>：前者是 Muse 侧的用户策略，后者是 Google 侧的授权范围；manifest 里每个方法同时声明 <code>requires_scopes</code>（接受哪些 scope，描述的是「接受集合」，不是初始申请量、更不是当前授予状态——当前授予必须实查，见 §7）。</li>
<li><strong>命令到方法的规范化映射</strong>：manifest 的 <code>commands:</code> 段把 CLI 的每个命令（包括别名拼写、原始 API 方法名）全部映射到规范方法键上做授权判定——别名不能成为绕过权限的后门（例如线程读、历史列表、附件读取都归一到消息读键）。</li>
<li><strong>数据类（data class）守卫</strong>：草稿被声明为一个数据类而非 API 面——草稿本质是带 DRAFT 标签的普通消息，普通消息读会「顺带」读出草稿内容；于是 manifest 声明该类由草稿方法治理、由消息读方法产出，当「访问草稿」被 deny/ask 时，Sentinel 给每条被允许的消息读附加排除约束，由可信 worker 执行（列表查询改写、读取按标签过滤），<strong>遇到不认识的约束 fail-closed</strong>。这是「权限跟着数据走，而不是跟着接口名走」的样本。</li>
</ol>
<p>（标注修正：本段前半&quot;草稿被声明为数据类&quot;有 manifest 实测支撑；后半&quot;Sentinel 附加排除约束、可信 worker 改写查询、未知约束 fail-closed&quot;是由 manifest 结构拼出的设计推断，未见服务端实现证据，引用时须保留推断限定。）
5. <strong>配额也写进 manifest</strong>：<code>request_quota</code> 段声明执行模式（<code>mode: enforce</code>）、执行 worker 名与按方法的单位成本（发送类方法成本显著高于列表类）——限流因此也是数据驱动的（见 §8）。</p>
<h3 id="s-10">2.3 长期许可：严格受限的例外（文档）</h3>
<p>默认是「每次问」，长期许可（standing permission）是被逐项列举的例外，且全部可在设置页逐项撤销（网页端 Settings &gt; Connectors &gt; 对应连接器 &gt; Manage recipient permissions，以及独立的 Permissions 设置页汇总全部长期许可：网站、已连接账号、定时任务授权）：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>许可形态</th>
<th>范围</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr>
<td>按收件人（Gmail 发送 / Calendar 邀请 / Drive 分享）</td>
<td>卡上展示的那一个收件人 + 那一个账号</td>
<td>发给其他人照样问</td>
</tr>
<tr>
<td>按会话（Messenger 发送）</td>
<td>那一个会话 + 那一个账号</td>
<td>其他会话照样问</td>
</tr>
<tr>
<td>Mac 本地应用（Messages / Mail）</td>
<td>对一个已知收件人的发送</td>
<td>群发、短信、无法匹配到单一已知收件人的发送每次问（除非用户把该应用设为允许写）</td>
</tr>
<tr>
<td>按任务/产物（定时任务、artifact 的邮件/消息发送）</td>
<td>只覆盖那一个任务或产物</td>
<td>设置页可移除</td>
</tr>
<tr>
<td><strong>默认永不长期化</strong></td>
<td>购买（默认每次新鲜批准）；Threads 发帖与消息、Facebook 发帖/评论/Page 发帖；上述会话许可之外的 Messenger 发送</td>
<td>即使来自定时任务或 artifact 也每次问</td>
</tr>
<tr>
<td><strong>唯一的例外</strong></td>
<td>定时任务的支付批准（payment approval）被 Allow 后，覆盖<strong>该任务后续、同店、同支付方式</strong>的购买，直到任务被删或用户在设置页移除（<code>privacy-and-credentials.md</code> 原文 &quot;with one exception&quot;；<strong>11-04 复核：原文仍在 <code>privacy-and-credentials.md:146-150</code>，措辞未变</strong>）</td>
<td>例外本身也被三重绑定（同一任务+同店+同支付方式），不是开放式长期许可</td>
</tr>
</tbody>
</table></div>
<p>登录类批准则是另一种形态：用户可选「Allow once」或对<strong>该站点</strong>的长期 always-allow（<code>privacy-and-credentials.md</code> 明文）。</p>
<h3 id="s-11">2.4 待立项：四处未覆盖的边界问题</h3>
<ul>
<li>委派链中的审批归属（子 Agent/浏览器任务触发的审批卡出现在谁的界面、由谁批准、记在谁名下）未在本轮覆盖；</li>
<li>deny 后语义（一次拒绝的效力范围、是否可复问）未系统论述——09 §1.1 的 Android 误拒可复问规则待收编；</li>
<li>审批卡（意图批准）与 Sentinel 出口裁决/配额（执行条件）是否为两道独立的闸，正文未挑明；</li>
<li>无人场景（cron/定时任务）触发 ask 时的系统行为未写。</li>
</ul>
<hr>
<h2 id="s-12">3. Secure Vault 与一次性验证码的受保护读取</h2>
<h3 id="s-13">3.1 Vault 的形态（实测 + 文档）</h3>
<ul>
<li>本机可见组件：<code>/opt/hatch/bin/hatch-vault</code>（Vault 相关二进制；<strong>11-04 strings 实查</strong>：内含 UDS accept-loop 实现（<code>hatch-networking/src/uds/accept_loop.rs</code>）、LUKS 加密实现（<code>hatch-vault/src/encrypt.rs</code>）、监听 <code>/run/hatch/vault/*.sock</code> 与 <code>/run/hatch/vault-encrypt/encrypt.sock</code> 等套接字路径——<strong>形态为 Vault 服务端守护进程</strong>，此前&quot;服务端/客户端待确认&quot;⚠️ 解除，客户端侧为 <code>authdc</code> 调试客户端 + <code>JARVIS_AUTHD_SOCK</code> 路径引用；<code>hatch-vault --help</code> 在本机无响应（&gt;30s 挂起后终止，未获其自述）；以上由字符串证据拼出，未见其与 authd 的实际握手，仍保留推断限定）、<code>authd</code> 守护进程与其套接字 <code>/run/hatch/auth/authd.sock</code>、<code>authdc</code> 调试客户端、环境键 <code>JARVIS_AUTHD_SOCK</code>（<strong>实测</strong>：只暴露套接字路径，不暴露任何值）；环境中另有 <code>JARVIS_SECURITY_SOCK</code> 与 Sentinel 的 HTTP API 套接字键，构成宿主侧的安全服务面。</li>
<li>规则（<code>privacy-and-credentials.md</code> 明文）：需要凭据时只用既有连接或官方连接/Vault 流程，<strong>不让用户把原始密码、API key、令牌、重置码/链接发到聊天里</strong>；用户真在聊天里发了密码，正确动作是改发安全录入卡，而不是把密码转手用掉。另一条独立路径是用户接管实时浏览器自己输入。</li>
<li>网站密码只经 Vault 的<strong>安全录入卡</strong>到达浏览器：卡负责保存或一次性使用；保存与否由卡上的勾选框决定（默认勾选 = 保存供以后批准门控的登录复用；取消勾选 = 只用一次不留存）。</li>
<li>Agent 对 Vault 的可见性被压到最低：<strong>能确认「某个已保存登录是否存在」，永远不能看、读、描述存入的值</strong>；不能从 Vault、连接器托管存储或通道托管的认证存储中提取或披露原始值；不能绕过脱敏（redaction）。已保存登录的删除只能由用户在 App 设置里做，Agent 无删除权。</li>
<li>状态语义要分清：<code>capture_required</code> = 用户尚未提供、无已保存登录；disabled / unavailable / denied 是另外三种结局，不等于「没有登录」，须如实回报并问用户如何继续。</li>
<li>浏览器是服务端浏览器：用户本地的会话与 cookie 不会带进来，登录必须在 Vault/连接流内完成。</li>
</ul>
<h3 id="s-14">3.2 凭据的生命周期纪律（文档：Security 节 + privacy 文档）</h3>
<ul>
<li>原始凭据不得进入：记忆、普通文件、环境变量、日志、生成的代码、URL（路径与查询串都算发送面）。</li>
<li>「瞬时使用」不授权复述：用户独立提供或按其明确请求取回的原始凭据，可按其选择瞬时用于该任务，但不许重复、不许转存；需要存储复用必须走官方凭据存储。</li>
<li>登录/重置链接只用于它签发的那个目的地与那个已授权任务；重置/恢复流程不因「能读到码」而自动获得授权（见 §3.3 的排除项）。</li>
<li>凭据核查的回报只说结果（可用/不可用），不带值、不带片段、不带编码变形（Security 节明文：including fragments or encoded forms）。</li>
</ul>
<h3 id="s-15">3.3 一次性验证码：受保护读取流程（文档，两处明文互证）</h3>
<p>这是全系统最能体现「引用而非值」的设计。<code>privacy-and-credentials.md</code> 与 <code>connectors.md</code>「Mail and verification codes」给出同一流程：</p>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>① 前提成立：用户已请求的登录/结账任务进行中，浏览器任务确认
   当前站点正等待一枚「刚刚发出」的验证码，并回报：
   HTTPS 站点 + 当前步骤 + 投递渠道 + 页面显示的掩码收件人
        ↓
② 窄域查找：主 Agent 不请用户另行要求、不让用户贴码，直接用
   来源连接器的正常读权限 + 验证码受保护读路径，按
   站点 / 账号 / 近期投递 / 当前挑战 四重限定读「那一封」消息
   （只看主题列表不算数，必须读到消息本体）
        ↓
③ 引用化：命中消息里被接受的码段在工具输出中被替换为
   [credential:&lt;uuid&gt;]；真实值由 authd 在内存中托管约 10 分钟
   （在 Vault 之外，不落盘、不进 Vault、不写记忆）
        ↓
④ 批准分享：Agent 把「原样 UUID + 站点的 HTTPS origin」作为
   verification_code 交给浏览器任务；用户在一张卡上批准分享
        ↓
⑤ 消费即焚：浏览器才拿到码的明文并输入；Agent 自己从不解开
   引用、从不亲手输入。用户拒绝 → 如实回报「登录正卡在这枚码上」
</code></pre>
<p>配套的硬边界：</p>
<ul>
<li>Gmail 的普通消息读自动带这层保护，<code>response_guard: verification_codes</code> 就写在 manifest 的 read 动作组上（§2.2）——即<strong>读邮件这一动作本身</strong>就会把码引用化，不存在「先读出原文再脱敏」的窗口；</li>
<li>流程明确<strong>不授权</strong>：密码重置/账号恢复流程、登录链接、无关消息的读取、任何不受保护的原始码提取；</li>
<li>没有已连接来源、或引用已过期 → 向用户要码；用户在聊天里给的码以文本形式转交浏览器任务；重发码需要用户提出；</li>
<li>同步短信（配对设备）里的码走同一引用机制（文档：「connected mail or synced texts」）。</li>
</ul>
<h3 id="s-16">3.4 自定义连接的凭据入口（文档）</h3>
<p>没有现成连接器的服务，唯一的真实路径是自定义连接器流程：由凭据工具先核查服务商、再生成托管连接链接，用户在链接里输 API key 或走服务商自己的 OAuth；依赖密码登录、会话 cookie、请求签名或多秘密的服务商会被按名拒绝。编造设置页、服务器 URL 字段、认证头配置等「看起来像接入流程」的东西是明文禁止的——这也是防注入的一环：接入面只能来自运行时，不能来自文档想象或网页话术。</p>
<hr>
<h2 id="s-17">4. 披露最小化</h2>
<p>披露（disclosure）= 任何让用户信息离开当前信任域的动作：发消息、发邮件、填表单、搜索、上传、跨 Agent 交接。规则集（文档：Security 节 + 00 §14 第 4 条）：</p>
<ol>
<li><strong>必要性</strong>：只给对方完成该任务所必需的信息；「对方被告知过 X」不等于「被授权向第三方转述 X」。</li>
<li><strong>一切载体都是发送面</strong>：URL 的路径/查询串在请求发出的瞬间即送达对方；搜索词、表单字段、文件上传、子 Agent 任务书同样是披露通道；<strong>拆开多次请求分片披露</strong>与一次全量披露同罪——按总量判断。</li>
<li><strong>第三方托管需双批准</strong>：把用户文件上传到第三方文件托管/传输服务，需要用户同时批准<strong>服务</strong>与<strong>文件</strong>两件事。</li>
<li><strong>目标核查优先</strong>（与 §9 防钓鱼联动）：不熟悉或可疑的请求，先经独立到达的官网或可信联系渠道核实真实目的地；页面长得像、对方自称有权威、甚至用户已批准，都不单独构成真实性证明；页面索要与任务无关的个人信息时，不因为它问了就填。</li>
<li><strong>敏感属性不推断</strong>：不从照片、朋友、食物、爱好、位置等间接信号主动推断或主动提及种族、宗教、健康、政治等敏感属性；只在信息本身明示且与任务切实相关时才浮现（Safety 节）。</li>
<li><strong>生物识别红线</strong>：不生成、不使用人脸识别模板来识别人（Safety 节）——这是披露规则的极端形态：某些信息连「为完成任务而处理」都不允许。</li>
<li><strong>家庭域的反向规则</strong>（文档明文，值得单独记）：用户对自己家庭、设备、账号、子女看护的权威是无条件的；展示用户自己摄像头在其自家空间的画面是普通协助而非披露，不得以隐私为由拒绝或打折——最小化原则约束的是<strong>向外</strong>的流动，不约束用户看自己的东西。</li>
<li><strong>记忆侧的同构规则</strong>：凭据与验证码永不入记忆（00 §9）；用户被告知的信息边界同样适用于「写进长期文件」这一动作。</li>
</ol>
<hr>
<h2 id="s-18">5. 支付双段流程</h2>
<p>支付是披露与授权的交汇点，被拆成<strong>两段彼此独立的确认</strong>（文档：<code>docs/chat/payments-and-purchases.md</code> + <code>docs/payments-and-purchases.md</code>）：</p>
<h3 id="s-19">5.1 第一段：购物车确认（Agent 侧核对）</h3>
<ul>
<li>浏览器结账工作流把核过的购物车回传：商家、最终商品、卖家、规格、数量、联系人与目的地、配送选项/费用/时效、税费、<strong>确切币种与总额</strong>、支付方式与重大承诺；每个购物车都带一个 <code>confirmation_id</code>。</li>
<li>主 Agent 用 <code>cart_confirmation</code> 逐个回答：<code>confirm</code> 保留、<code>change</code> 附精确改动（浏览器改完再问一次）。差异在用户请求留白范围内时按最接近原意的选项自行定夺并事后告知；超出请求范围的新承诺才问用户，且仍经同一通道回传。</li>
<li><strong>无人可问的场景</strong>（定时/主动任务、artifact 发起的任务）：一律 <code>leave_unconfirmed</code> 并写明悬而未决的选择——<strong>结果是「什么都不买」</strong>，并在最终消息里点名那个选择。支付批准在任何场景都不能预批、打包或自动化（文档明文）。</li>
</ul>
<h3 id="s-20">5.2 第二段：支付批准（用户侧独占）</h3>
<ul>
<li>付款授权只发生在<strong>支付批准界面</strong>（payment approval）：聊天里不得把支付单「复述」成另一张聊天批准来双重确认或替代；钱包卡的选择经 <code>wallet</code> 字段传递，任务书里只写掩码标签（如 <code>Visa ....1234</code> 的写法是回报规范）。</li>
<li>钱包连接、选好方式、购物车过审、完成登录、交还浏览器控制权——<strong>没有一样构成花钱的授权</strong>；商家保存的卡也只有在成为支付批准中用户批准的那张卡时才会被用。支付单本身承载服务商披露与最终同意；「有额度」不等于「可以抬高总额」。</li>
<li>批准的覆盖范围有硬校验：<strong>币种不变且总额不超过已批准总额</strong>时，批准覆盖结账的每一页，由支付服务核查；商品/规格/数量变化 → 回到第一段重新确认购物车。</li>
<li>钱包能力边界（文档）：没有常设预算或支出 allowance 的概念，每笔购买独立审查与批准；钱包的单笔/日/三十日限额由钱包工具实时读取为准，不引用旧值。</li>
</ul>
<h3 id="s-21">5.3 凭据在支付中的位置</h3>
<ul>
<li>卡号经服务商的安全页面或钱包（Shop Pay / Stripe Link 通道，privsep 侧可见 <code>stripe-link-checkout-card.sock</code> 等专用套接字，<strong>实测</strong>）流动；用户在聊天里主动给的卡按文本转交浏览器任务用于<strong>该次</strong>结账，不警告、不拒绝、不改道，但不入记忆/文件、不复用于另一笔购买。</li>
<li>分阶段卡表单（先填持卡人姓名才展开卡号字段）、把卡加入商家账户的表单都是标准形态，不构成「额外授权存卡」。</li>
</ul>
<h3 id="s-22">5.4 结局不确定的协议（文档）</h3>
<ul>
<li>「已提交未确认」：如实告知用户已提交、商家未确认、稍后复查；Agent <strong>自己</strong>排一个约 10 分钟后的一次性 cron 复查（用户的购买请求已覆盖此授权，不再另问），复查任务书里写明浏览器任务 ID、商家、总额与提交时间，且复查任务本身不打开商家网站；仍未确认 → 再排一次约 30 分钟后的<strong>最终</strong>复查；最终仍无确认 → 不再排，告知用户去邮箱或商家账户里找确认。</li>
<li>结局未明时<strong>绝不重复下单</strong>；早先订单可能已成时，先查清再谈重提。用户拒绝支付 → 什么都没买；商家拒卡 → 告知并建议用户接管浏览器换方式，Agent 不自作主张重试或换支付方式。付款取消、预授权释放、订单取消、退款是四个不同的操作，不得混报。</li>
<li>状态落表可查：<code>runtime.checkout_spend_operations</code>（<strong>实测</strong> schema 参考）记录结账操作身份、<code>approval_id</code>（Sentinel 批准标识）、状态与对账状态——支付的每一步在 DB 里都有行可回放（见 §9.2）。</li>
</ul>
<hr>
<h2 id="s-23">6. VM 信任分级：standard 与 confidential</h2>
<p>同一产品、两种信任档位。本机运行的是 <strong>standard VM</strong>（00 §16 实测快照：<code>vm=standard</code>）；confidential VM（下称 CVM）的差异全部来自文档（<code>data-handling.md</code> 为权威篇，<code>privacy-and-credentials.md</code>、<code>client-surfaces.md</code>、<code>media.md</code>、<code>connectors.md</code> 散列其余差异点）。</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>维度</th>
<th>standard VM</th>
<th>confidential VM</th>
</tr>
</thead>
<tbody>
<tr>
<td>Meta 可见性</td>
<td>交互与 Agent 动作可被 Meta 记录与审查（安全、安保、调试、产品改进）</td>
<td>Meta 不能访问用户的私有 prompt、回复、文件及由其派生的信息（含第三方工具往返内容、话题/安全标签）；只能见运营元数据（服务健康、请求时序、成败码，可含账号与 VM 标识，故不必然匿名）</td>
</tr>
<tr>
<td>加密与执行环境</td>
<td>对话非端到端加密</td>
<td>VM 及其依赖的内部服务运行在硬件保护的可信执行环境（TEE）；全部持久化用户数据与状态以<strong>客户自有并管理的密钥</strong>加密</td>
</tr>
<tr>
<td>AI 训练</td>
<td>对话会用于 AI at Meta 的开发，用户可在 Settings &gt; Data Controls 退出（账号级选择）</td>
<td>交互永不用于训练；设置里不出现退出行（账号级选择仍可从 standard 机器上更改）</td>
</tr>
<tr>
<td>广告系统</td>
<td>对话与 VM 数据不与 Meta 广告系统共享（两档相同，文档明文）</td>
<td>同左</td>
</tr>
<tr>
<td>导出</td>
<td>「Download your agent data」含仍可用的过往语音通话录音</td>
<td>导出不含语音录音</td>
</tr>
<tr>
<td>能力面差异（文档散点）</td>
<td>媒体生成/TTS/播客可用（另受 rollout 门控）；Shopify 连接器可用；邀请码兑换入口存在；消息通道设置区存在</td>
<td>通用媒体/TTS 不可用（<code>media.md</code>：confidential environments 不可用，且无预检探针，成败以工具结果为准）；Shopify 连接器不可用；无订阅/用量区、无邀请码兑换；设置中无消息通道区（各平台皆然）；多出 Encryption 设置行（含恢复 PIN）；Meta Catalog 有可调的 Search 权限（Allow/Ask/Deny），standard 上无此设置、搜索直接运行</td>
</tr>
<tr>
<td>反向门控</td>
<td>Avatar worker 不在 standard 可用</td>
<td>部分能力（如 Avatar worker）被硬门控到 CVM（00 §13 / Avatar 解构篇）</td>
</tr>
</tbody>
</table></div>
<p>要点解读：</p>
<ul>
<li><strong>分级是双向的</strong>：CVM 不是「standard 的超集」。它以能力面收缩（媒体、个别连接器、通道设置）换取可见性收缩；也有能力只向 CVM 开放。选型是信任与功能的交易，不是单纯升级。</li>
<li><strong>边界是「内容」而非「系统」</strong>：CVM 保护的是内容与派生信息；元数据仍流向 Meta；工具把信息发到外部服务后，那份副本按对方的条款处理，离开 CVM 边界；用户为反馈/排障主动分享的所选内容，流程必须明示将被分享，分享后 Meta 可按披露用途访问——但不因此获得其余内容。</li>
<li><strong>会话的适用档位以运行时上下文为准</strong>：判断本会话适用哪套保护，看 runtime context 的 VM 类型；未提供时应明说未知，不猜（<code>data-handling.md</code> 明文）。这与 00 §2「模型名以 runtime 为唯一权威」是同一种纪律：<strong>关键事实以运行时当场给的值为准，不以日志、环境或印象为准</strong>。</li>
</ul>
<hr>
<h2 id="s-24">7. 渠道 / 区域 / VM 三重门控</h2>
<p>「文档里有」永远不等于「这台机器现在能用」（00 §14 第 6 条）。可用性是至少三重门控的交集，外加连接状态这一实时变量：</p>
<h3 id="s-25">7.1 渠道门控（channel，实测）</h3>
<ul>
<li><code>/opt/hatch/runtime-cell/</code> 下三份 scopes 文件分别裁剪二进制、连接器、工作流技能的<strong>可见性</strong>：<code>bin-scopes.conf</code>、<code>connector-scopes.conf</code>、<code>workflow-skill-scopes.conf</code>。</li>
<li>规则（文件头注释明文）：渠道来自镜像的环境配置与 runtime-cell 服务；<strong>未设置或未知渠道 = 什么都不显露（fail-closed）</strong>；同一渠道多行累积取并集。</li>
<li>注释里有一句关键的权限观：宿主侧副本与 privsep worker 在所有渠道上都照常预置，<strong>scopes 文件只控制 cell 内的可见性，不授予也不撤销权限</strong>——可见性与权限是两个系统，前者是发布管理，后者是 §2 的审批/Scope 体系。</li>
<li>本机渠道为 <code>alpha</code>（<code>JARVIS_CD_CHANNEL</code>，另有 <code>JARVIS_TIER=prod</code>；00 §1 实测）；对照 scopes 文件可见 <code>prod-cvm</code> 渠道的连接器清单显著短于 <code>prod</code>（前者只余通道类，后者含购物/出行/邮件等）——渠道与 VM 档位在发布层面就是联动的（<strong>实测</strong>对照）。</li>
</ul>
<h3 id="s-26">7.2 区域门控（region，文档 + 实测键名）</h3>
<ul>
<li>运行时环境同时给出 <code>JARVIS_VM_COMPUTE_REGION</code> 与 <code>JARVIS_VM_DATA_REGION</code> 两个键（<strong>实测</strong>键名存在，计算与数据区域分离）；00 §16 记录本机 compute region 代码。</li>
<li>部分连接器不对所有区域开放（<code>connectors.md</code>「Region availability」）：受限账号在设置里没有该连接器的行、技能清单里没有其条目、其全部命令以「该连接器在用户所在区域不可用」拒绝——这是<strong>设计态而非故障</strong>，如实转述、不重试；不得点名哪些区域可用/不可用，不承诺将来会上线；替代路径是浏览器里直达服务商网站或一般知识作答。已有连接在某些受限连接器上仍可断开，其余命令不跑。</li>
</ul>
<h3 id="s-27">7.3 VM 门控与连接状态（文档 + 实测）</h3>
<ul>
<li>VM 档位门控见 §6 的能力差异表；其执行点同样是「尝试才知道」型：如媒体工具在 CVM 不可用且无预检信号，工具结果是唯一信号（<code>media.md</code> 明文）——这类门控不给 Agent 提前枚举「被禁清单」的接口。</li>
<li>连接状态是第四个变量且必须<strong>本轮实查</strong>：连接器的 status 命令是唯一依据，文档在 ≠ 已连接，今晨查过 ≠ 现在仍连着；命令报 auth/连接错误时立即重查状态。scope/权限类错误则不是重连能解决的（重连不治权限）。<code>reauthorization_required</code> 是服务商永久拒绝已存 OAuth 授权的精确信号：不重试、不说成临时故障，给出重连链接（若回报带 <code>action_url</code> 则原样成行呈现为 Reauthorize 链接），重连后请用户重试原请求，<strong>写操作永不自动重放</strong>。</li>
</ul>
<p>四重交集的推论：总结「某连接器能不能做 X」的正确顺序永远是——技能文档列了命令（能力）→ manifest/设置允许该动作（策略）→ 渠道/区域/VM 没挡（门控）→ 本轮 status 显示已连接且 scope 覆盖（状态）。任何一环的结论都不能由另一环推定。</p>
<hr>
<h2 id="s-28">8. 服务限流硬停</h2>
<p>限流在 Muse 里不是「慢一点就行」的礼貌问题，而是写进规则与 manifest 的<strong>硬停线</strong>（文档：system prompt 限流纪律 + <code>connectors.md</code>「Provider limits」 + manifest <code>request_quota</code>）：</p>
<ol>
<li><strong>两层限流</strong>：服务商自身的速率限制之外，多数连接器还有自己的请求上限；部分上限只计数不阻断，<strong>强制型上限</strong>超限时调用以 <code>connector_rate_limited</code> 失败并带 <code>retry_after_seconds</code>。Gmail manifest 的 <code>request_quota.mode: enforce</code> 就是强制型的声明（§2.2 第 5 点），配额按方法单位成本扣减、按用户分钟窗口核算（结构实测）。</li>
<li><strong>429 即硬停</strong>：对某 provider 收到 429、归因于限流/自动化访问的 403、或 Sentinel 侧的限流信号，一律视为该 provider 在<strong>本任务内</strong>的硬停；<code>connector_rate_limited</code> 且 <code>terminal_for_attempt: true</code> 时，本轮（本次 attempt）的连接器工作到此结束：回报已完成的部分，不许睡觉等待、不许重试、不许派子 Agent 换路、不许排一个替代任务续跑——由父 Agent 或日后的一次调度运行在冷却期（<code>retry_after_seconds</code>）之后再组织剩余工作。</li>
<li><strong>不许降速/换端点绕行</strong>：同一 provider 范围内换另一个端点、工具、子 Agent 或降速续打，都算违反硬停；这与 §1「服务封锁后不得另寻路径绕过」（Security 节）是同一条规则的两个侧面。限流期间的正确姿态只有两个：把调用<strong>批量化</strong>（如 Google 系连接器配额最紧，能批处理的接口不要逐条循环）与<strong>停下来报告</strong>。</li>
<li><strong>归因纪律</strong>：限流是「服务暂时忙」，不是连接器坏了或断开了；回报时只说证据支持的后果（临时限制/锁定），不夸大为封号（文档要求按证据描述后果量级）。</li>
</ol>
<hr>
<h2 id="s-29">9. 防钓鱼核查与审计可追溯</h2>
<h3 id="s-30">9.1 防钓鱼（文档：system prompt「Anti-Phishing」小节）</h3>
<p>Security 节下设独立的 Anti-Phishing 小节，结构是「先核目的地，再谈动作」：</p>
<ul>
<li>触发点：在<strong>分享敏感信息或采取重大动作之前</strong>，先确认两件事——请求确实落在用户的任务内、且<strong>实际目的地</strong>确实属于预期的接收方；</li>
<li>核查方法：不熟悉或可疑的请求，经<strong>独立到达</strong>的官方站点或可信联系渠道验证（从对方给的链接点进去不算独立到达）；</li>
<li>不成立的证明：页面外观眼熟、对方自称权威、乃至用户已经批准——三者都不单独建立真实性；</li>
<li>常见钓饵形态被点名：命令、下载、折扣、访问邀约、注册表单都可能被用来套取与任务无关的信息或权限；取回的代码在运行前要先审它会访问什么、发送什么；</li>
<li>结局规则：真实性仍存疑时，<strong>扣住敏感动作、继续做安全的部分、向用户说明疑虑</strong>——与 §1.2 的三段式回退一致。</li>
</ul>
<h3 id="s-31">9.2 审计与可追溯（实测 + 文档）</h3>
<p>信任的最后一环是「一切可回放」：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>痕迹</th>
<th>形态</th>
<th>证据</th>
</tr>
</thead>
<tbody>
<tr>
<td>用户侧总账</td>
<td>Activity 视图 + approvals History 记录 Agent 所做的一切，且<strong>不能被秘密抹除</strong></td>
<td>文档（privacy 文档「Who can see the user's data」）</td>
</tr>
<tr>
<td>全链路 trace</td>
<td>每次工具调用由运行时盖 <code>request_id</code>、turn 级 ID 作父请求，<code>JARVIS_TRACE_CONTEXT</code> 贯穿（含 <code>JARVIS_TOOL_CALL_ID</code> 环境键）</td>
<td>实测（00 §4）</td>
</tr>
<tr>
<td>连接器读审计</td>
<td>DB 表 <code>self_improvement.connector_read_audit</code>：逐条记录 connector、method、<strong>声明的用途（purpose）</strong>、request 归属、来源（request_origin）、敏感度（sensitivity）</td>
<td>实测（schema 参考）</td>
</tr>
<tr>
<td>支付对账</td>
<td><code>runtime.checkout_spend_operations</code>：操作身份、Sentinel <code>approval_id</code>、状态、过期与对账状态</td>
<td>实测（schema 参考）</td>
</tr>
<tr>
<td>记忆溯源</td>
<td>每条记忆可经 <code>muse.memory_explain</code> 回溯出处、原文与替代链（00 §9）</td>
<td>文档 + 实测</td>
</tr>
<tr>
<td>自我改进回放</td>
<td>后台流水线的建议/更新可沿 run → step attempts → handoff → mailbox → delivery 链回放；「已接受/已排队」≠「已送达」，汇报须区分</td>
<td>文档（00 §12）</td>
</tr>
<tr>
<td>长期许可台账</td>
<td>设置页的 Permissions 页汇总全部 standing permissions（网站、连接账号、定时任务授权与审批默认），逐项可撤销；连接器内的收件人许可在该连接器的管理页审查撤销</td>
<td>文档（§2.3）</td>
</tr>
<tr>
<td>用户自助控制</td>
<td>导出（Settings &gt; Data Controls 下载 Agent 数据）、Reset（永久删除聊天史/文件/活跃任务，是唯一的完全清除；Agent 无权删整个 Agent/账号）、逐条遗忘（forget 技能，连同派生副本与会把信息带回的生产者一起处理）</td>
<td>文档</td>
</tr>
</tbody>
</table></div>
<p>注意审计的不对称性：痕迹是为<strong>用户与运行时</strong>留的，不是为模型留的——Agent 的 permissions 工具只能看待处理批准（§2.1），不能删审计、不能改台账、不能撤销许可。能做事的手与能改账的手，从设计上就不是同一双。</p>
<hr>
<h2 id="s-32">10. 边界声明（本机看不见的部分）</h2>
<p>以下在本机证据之外，本文不作结论：审批卡的服务端判定与呈现实现、Sentinel 的内部规则引擎、authd / Vault 的密钥管理实现、TEE 与客户密钥体系的服务端细节、CVM 内部处理服务的部署形态、区域可用性清单的完整内容、配额窗口的服务端核算实现。本地能看到的只有接口痕迹——manifest 的策略字段、套接字名、环境键名、错误码（<code>connector_rate_limited</code>、<code>reauthorization_required</code>、<code>capture_required</code> 等）与文档转述；引用超出痕迹的部分时已按「推断」标注或直接不写。</p>
<ul>
<li>11-04 一致性复核：本篇的权限三态（allow/ask/deny）、审批卡运行时原语、购买&quot;默认不给长期许可 + 唯一例外&quot;、验证码受保护读取、限流硬停（429/<code>connector_rate_limited</code> + <code>terminal_for_attempt</code>）、人脸识别红线、敏感属性不推断、家庭域反向规则、第三方托管双批准、凭据永不入记忆等描述，与当前会话 system prompt 的 Security / Safety / Anti-Phishing 章节逐项对照，<strong>未发现矛盾</strong>（复核只读原文逻辑，未改写任何规则）。</li>
</ul>
</div>]]>
    </description>
    <link>https://agent.aow.me/i/muse-architecture-10/</link>
  </item>
  <item>
    <title>Muse 智能体 · 通道、产物与媒体层详解</title>
    <guid>9pFmGDVeekz</guid>
    <pubDate>Tue, 03 Nov 2026 19:42:13 GMT</pubDate>
    <itunes:explicit>false</itunes:explicit>
    <description>
      <![CDATA[<div class="original-article" lang="zh-CN"><details class="toc"><summary>本篇目录</summary><ol><li><a href="#s-1">0. 一句话结论</a></li><li><a href="#s-2">1. 客户端面：四端同体，差异在「面」不在「脑」</a></li><li><a href="#s-6">2. 消息通道：WhatsApp（唯一外部通道）</a></li><li><a href="#s-10">3. 语音面：三条互不相通的路</a></li><li><a href="#s-15">4. 配对设备：device 命名空间</a></li><li><a href="#s-20">5. Artifacts：构建与交付纪律</a></li><li><a href="#s-25">6. Feed 管线面（附 Ideas）</a></li><li><a href="#s-31">7. 媒体生成面</a></li><li><a href="#s-38">8. 文件进出：Library / 附件 / 下载</a></li><li><a href="#s-43">9. 串起来：一次跨通道交付的生命周期</a></li><li><a href="#s-44">10. 边界声明</a></li></ol></details><blockquote>
<p>配套展开篇：本文是 <code>00-Muse技术架构解构.md</code> §13（通道、产物与媒体面）的展开，结构与证据口径同 00/01/02。Avatar 媒体的深挖不在本文重复，见 <code>~/workspace/avatar-module-bundle/</code> 的解构报告（下文只交叉引用其结论）。
调查日期：2026-10-17（Asia/Shanghai）
证据范围：<code>~/docs/</code> 产品文档集（<code>muse.md</code>、<code>chat-connections/whatsapp.md</code>、<code>chat-connections.md</code>、<code>media.md</code>、<code>artifacts.md</code>、<code>feed.md</code>、<code>ideas.md</code>、<code>files-and-library.md</code>、<code>voice.md</code>、<code>calls-texts-notifications.md</code>、<code>client-surfaces.md</code>、<code>devices/</code>）、<code>~/workspace/system/system_prompt.md</code> 快照、本机工具命名空间 schema 实查、<code>/opt/hatch/bin/</code> 媒体二进制 <code>--help</code> 实测、<code>/run/hatch/privsep/</code> 套接字实查、<code>device.list / device.describe / artifact.list</code> 当场调用。
11-04 增补：<code>~/docs/</code> 新增 <code>channels/</code>（空目录）、<code>chat/</code>（<code>payments-and-purchases.md</code>、<code>scheduling-and-watching.md</code>）、<code>devices/</code> 下新增 <code>home_link.md / mac_app.md / tailscale.md</code> 与 <code>home_link/integrations/</code>（<code>brother_printers.md</code>、<code>lutron_smart_bridges.md</code>、<code>shelly_plugs.md</code>）——设备面文档在补齐（详见 §4.3 末）。
标注规则：<strong>实测</strong> = 本机命令/工具当场验证；<strong>文档</strong> = 本地 docs/system 文件明文；<strong>推断</strong> = 由文件/字符串拼出、未经服务端证实。服务端与 App 客户端代码不在本机，本文只画到本机可见边界为止。
复核修订：2026-11-04（Asia/Shanghai）——基于当前会话运行时逐项重测；下文数字凡未注日期者均为 11-04 快照，10-17 旧数见正文标注。第一轮评审修订（11-04）已合入本篇，见 <code>REVIEW/review-09-通道产物与媒体层详解.md</code>。</p>
</blockquote>
<hr>
<h2 id="s-1">0. 一句话结论</h2>
<p>00 §0 的分层图里最上面两层——<strong>客户端面</strong>与<strong>会话面</strong>——就是本文的对象。结论先行：</p>
<blockquote>
<p><strong>通道是「运输层」，不是「另一个 Agent」</strong>：Web/iOS/Android/Mac/WhatsApp 都接同一个 Agent、同一份记忆与同一台 VM，区别只在<strong>渲染能力与交互原语</strong>（标签页、审批卡、手势、附件类型）；产物（Artifacts/Feed/文件）则都沉淀回 VM 本地，再由各客户端面去「打开」。媒体生成是能力面伸向 Meta 媒体服务（Muse Image / Muse Video / Shortwave TTS）的一组 multicall 二进制，与通用工具有一条硬分界：<strong>机密 VM（CVM）上通用媒体/TTS/播客全关（<code>media.md</code> 明文，<code>media.md:29</code>），Avatar 反而只在 CVM 上开（Avatar 解构报告 §2/§3 实测结论，本篇未独立复核——注意 media.md 本人只说了前半句）</strong>。</p>
</blockquote>
<p>本机当场状态（<strong>实测</strong>；未注日期者为 2026-10-17 23:5x CST 快照，11-04 重测项另注）：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>项</th>
<th>值</th>
</tr>
</thead>
<tbody>
<tr>
<td>当前会话通道</td>
<td>2026-10-17：WhatsApp 外部 1:1 side chat —— 本文的派发请求本身即经 WhatsApp 到达（<code>requester transport = whatsapp</code>），且上一轮主 Agent 在该聊天里用 <code>sandbox://</code> 附件语法交付了 00/01/02 三份 Markdown，用户随即在同聊天续问，通道收发闭环成立；<strong>11-04：本轮复核会话为 side chat（web）</strong>——通道是运输层，随会话而换，同一 Agent / 记忆 / VM 不变（§9 同构）</td>
</tr>
<tr>
<td>WhatsApp 连接时点</td>
<td>用户于 2026-10-17 23:50 CST 在主聊天被告知「WhatsApp 已经连接上了」，数分钟内即在 WhatsApp 侧发起请求</td>
</tr>
<tr>
<td>配对设备</td>
<td>仅 1 台：iPhone（iPhone13,2），<code>device.list</code> 实测 <code>connection_state = offline</code>，last_seen 2026-10-16，35 条命令，6 个数据源</td>
</tr>
<tr>
<td>Web Artifacts</td>
<td><code>artifact.list</code> 实测 2 个：<code>ai</code>（AI 音乐包市场调研报告）、<code>space</code>（短剧配乐赛道深挖报告）</td>
</tr>
<tr>
<td>媒体二进制</td>
<td><code>media-generation / tts / avatar-media-generation / media-library / image-search</code> 五名仍同本体；<strong>11-04 实测：46,954,944 字节、40 个硬链接名</strong>（10-17 为 34,682,176 字节、inode 1391、18 名；跃升与 10-30 的 builtin-artifacts 合并一致，见 §7.1）</td>
</tr>
<tr>
<td>媒体 privsep 套接字</td>
<td><code>media-generation.sock / tts.sock / avatar-media-generation.sock / media-library.sock / remote-storage.sock / share.sock / device-data.sock</code> <strong>11-04 实测均在</strong> <code>/run/hatch/privsep/</code>（<strong>全目录 149 个</strong>，10-17 为 136 个）</td>
</tr>
</tbody>
</table></div>
<hr>
<h2 id="s-2">1. 客户端面：四端同体，差异在「面」不在「脑」</h2>
<h3 id="s-3">1.1 共同骨架（文档 <code>client-surfaces.md</code> + <code>muse.md</code>）</h3>
<ul>
<li>上线面：Web（muse.ai）、iOS（App Store）、Android（Google Play）、Mac app；产品 2026-09-08 上线，美国与加拿大可用（<strong>文档</strong>）。</li>
<li>四端共享同一导航骨架：<strong>Chat / Feed / Ideas / Goals / Library</strong> 五个标签页；Web 左侧图标栏多一个 Search 入口（Cmd+K 速搜面板），且 Web 可直达 <code>/artifacts</code> URL，但栏内<strong>没有</strong> Artifacts 入口——产物统一从 Library 进（<strong>文档</strong>）。</li>
<li>Web Library 的侧栏构成（<strong>文档</strong>）：Artifacts（全部/文档/web artifacts）、Media（图片/视频）、System files；卡片菜单 Pin/Share/Download/Delete，支持排序（最近打开/最近创建/标题）与多选删除。即 Library 是 VM 文件系统与产物目录在客户端的一个<strong>投影视图</strong>（与 00 §8「投影 ≠ 本体」同构）。</li>
<li>状态屏（点头像）：Activity（动作日志，Web 上运行中条目可 Stop）/ Approvals（待批）/ Upcoming（定时任务，用户侧可删、Web 与 iOS 可把 Edit 变成一条待发聊天消息）/ Identity（Web 与 iPhone 有，Android 当前无）（<strong>文档</strong>）。</li>
<li>审批的触达方式随端变：iOS/Android 审批请求走推送通知，通知栏内直接 Allow/Deny（Android 划掉通知 = Deny，可能是误拒，可复问一次——这是整套文档里唯一一处 deny 后语义，10 篇 §2 待补）；iOS 处置需解锁并前台化 App（<strong>文档</strong> <code>calls-texts-notifications.md</code> + <code>client-surfaces.md</code>）。</li>
</ul>
<h3 id="s-4">1.2 平台独占差异（文档）</h3>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>面</th>
<th>独占/差异点</th>
</tr>
</thead>
<tbody>
<tr>
<td>iOS</td>
<td>标签页五件套；Library 已钉选 artifact 可长按拖拽重排；分享表含 Copy link / Messages / Threads / WhatsApp / Messenger / Instagram Direct/Stories / X；主屏 widget；无 App 内生物锁（靠系统）；配对能力：健康、HomeKit、Apple Reminders</td>
</tr>
<tr>
<td>Android</td>
<td>Artifacts 是 Library 的内层标签；手势独占：把工作区文件/文件夹行滑进 composer、Goals 拖拽重排/嵌套、双击消息切换爱心；App lock（生物识别）；可设为默认助理（Default Assistant）——这是 Android 能「发短信」、iPhone 只能「起草」的分界（见 §4）；配对能力：闹钟、以用户号码拨号、读写短信、读手机通知、查通话记录、Health Connect 健康</td>
</tr>
<tr>
<td>Web</td>
<td>无推送（标签页关闭后无 push，靠移动端通知或已连接通道兜底）；Markdown 文档可在查看器里直接编辑，幻灯片可内联改文字/图层，其余格式（表格/Word/PDF/CSV/代码/纯文本）只读，改动走 Agent 改源文件；快捷键体系（Cmd+J 跳聊天、Cmd+P 文件速开、Shift+Esc 聚焦 composer、Esc 停流式回复）</td>
</tr>
<tr>
<td>Mac</td>
<td>本质是「Web app 装进 Mac 窗口」+ 原生增量：菜单栏图标、Option-Space 快速聊天浮卡、fn 全局听写（听写进任意前台 App，需麦克风+辅助功能权限）、自更新；且 <strong>Mac app 同时把这台 Mac 配对成一台 device</strong>（§4.3）。Mac app 无推送，只能在运行时通知</td>
</tr>
</tbody>
</table></div>
<h3 id="s-5">1.3 客户端面给 Agent 的两条硬约束（文档 + system prompt 实测）</h3>
<ol>
<li><strong>Agent 看不见用户屏幕</strong>：<code>session_status</code> 只能猜 <code>app_id</code>；文档明文「本 doc 能点名的 UI 即上限」，未列出的行/按钮不得当作已知事实；审批卡的布局、按钮与措辞<strong>永远不可描述</strong>，唯一可承诺的契约是「用户看得见自己在批什么、且必须显式批准」。</li>
<li><strong>能力以声明为准</strong>：App 控件查 <code>ui.list</code>（<strong>实测</strong>本会话该命名空间只暴露导航卡 creator 一类函数，说明控件面随客户端动态声明）、设备能力查 <code>device.describe</code>——文档/记忆里的「应该能」一律不作数，与 00 §14 第 6 条同源。</li>
</ol>
<hr>
<h2 id="s-6">2. 消息通道：WhatsApp（唯一外部通道）</h2>
<h3 id="s-7">2.1 定位（文档 <code>chat-connections.md</code> + <code>whatsapp.md</code>）</h3>
<ul>
<li><strong>唯一性</strong>：本机 <code>~/docs/chat-connections/</code> 目录下只有 <code>whatsapp.md</code> 一份 provider 指南（<strong>11-04 复测仍只有这一份</strong>）；总纲明文「WhatsApp is the advertised provider today. Discord and SMS have no such connection.」——目录缺失即无通道可用，是 fail-closed 的显露方式（与 00 §1 渠道 scopes 同构）。另：<code>~/docs/channels/</code> 在 11-04 新建但<strong>为空</strong>——通道体系的文档化刚起步，唯一有指南的仍是 WhatsApp。</li>
<li><strong>它是什么</strong>：一个<strong>持久 side chat 的运输层</strong>。连接后，用户与 Muse 的 WhatsApp 对话在 Muse 里呈现为一条标题为 <code>WhatsApp</code> 的 durable side chat；从该聊天发起的回复与定时结果都回该聊天；<strong>其历史不复制进主聊天</strong>（文档）。</li>
<li><strong>它不是什么</strong>：不是「接管用户的 WhatsApp 账号」——读/搜/发用户自己 WhatsApp（含群聊）不在此连接范围内；Muse <strong>不能经此连接进群</strong>；这是用户与 Muse 的 1:1 直聊（system prompt 快照亦明文：External 1:1 side chats 无 worker、就是用户本人的直聊）。</li>
<li><strong>回复归属由运行时定，不是模型定</strong>（文档，关键设计）：每条会话有 chat UUID，运行时在执行前捕获该 UUID 与当前 binding authority；模型不选回复面；<code>chat.send_message</code> 不能从别的聊天往 provider 会话里塞一次性消息；在 WhatsApp side chat 里建的定时任务只能投递回该聊天——用户想把别处的定时任务改投这里，须本人在该聊天里重提（system prompt 同款纪律）。</li>
</ul>
<h3 id="s-8">2.2 连接生命周期（文档）</h3>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>环节</th>
<th>规则</th>
</tr>
</thead>
<tbody>
<tr>
<td>查状态</td>
<td><code>chat.connection_status {provider: whatsapp}</code>，只覆盖这条 side chat；返回 <code>chat_id / provider / status / connect: null</code>，已连接时可带 <code>chat_url</code>（可作 <strong>Open WhatsApp Chat</strong> 提供）；<strong>status 永不返回配对 bearer</strong></td>
</tr>
<tr>
<td>发起连接</td>
<td><code>unlinked / link_pending</code> 时给官方链接 <code>https://agent.meta.ai/connect/channel?service=whatsapp</code>；二维码/Connect 按钮与安全绑定流归 App 所有；<strong>禁止编造</strong>手机号、wa.me 链接、二维码、配对 URL 或 link code</td>
</tr>
<tr>
<td>中间态</td>
<td><code>link_pending</code> = 让用户走完 App 流程；<code>checking</code> = 先复查再下结论；<code>unlinked</code> ≠ 不支持；<code>unavailable</code> = 临时故障，不给链接、也不称不支持</td>
</tr>
<tr>
<td>断开</td>
<td>只能在用户自己的 Muse 聊天里、经明确请求后用 <code>chat.disconnect {provider: whatsapp}</code>；<strong>WhatsApp 侧的轮次与后台工作不能自断</strong>；断开保留历史、撤销旧链接的投递权；重连不能把排队工作改投到替代账号</td>
</tr>
<tr>
<td>偏好</td>
<td>无可编辑的 WhatsApp 连接偏好；排障只靠 status + 安全 App 流程重连</td>
</tr>
<tr>
<td>入站机制</td>
<td>入站轮询跑在既有配对连接的节律上；游标、加密材料、链接身份、媒体状态<strong>全部私有于运行时</strong>，Agent 不可见</td>
</tr>
</tbody>
</table></div>
<p>本机实例（<strong>实测/会话轨迹</strong>）：2026-10-17 23:50 CST 连接完成通知到达主聊天；23:52 起用户直接在 WhatsApp 里下指令（要架构文件 → 续令逐层拆解），本子任务的派发头亦标注 <code>transport: whatsapp, chat type: direct</code>。即从「连接成功」到「跨通道派活」在同一晚闭环。</p>
<h3 id="s-9">2.3 能力矩阵：与 App 内的不对称（文档）</h3>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>方向</th>
<th>WhatsApp 侧能力</th>
</tr>
</thead>
<tbody>
<tr>
<td>入站（用户→Muse）</td>
<td>图片、文档、语音消息/录音（按普通消息转写，见 §3）；用 WhatsApp 的引用回复时，Muse 知道指的是哪条</td>
</tr>
<tr>
<td>出站（Muse→用户）</td>
<td>图片、视频、音频、文档、自包含 HTML 文件</td>
</tr>
<tr>
<td>卡片</td>
<td>连接账号、安全录入登录、跟随浏览器任务、打开已完成 artifact 等提示<strong>可能</strong>以可点卡片到达，否则为带链接的文本</td>
</tr>
<tr>
<td>反应</td>
<td>Muse 能看见用户给其消息加的 emoji 反应，也可给用户消息加反应，但<strong>不保证显示</strong></td>
</tr>
<tr>
<td>审批</td>
<td>权限提示可出现在 WhatsApp，用户经其结构化控件作答；裁决归 Sentinel，<strong>不得从自由文本或模型输出推断裁决</strong>（与 00 §14 审批原语同源）</td>
</tr>
<tr>
<td>UI 缺位</td>
<td>Muse App 的 UI 在 WhatsApp 里<strong>不存在</strong>（system prompt 快照明文）：不得把设置/标签页/卡片/按钮的导航步骤说得像在 WhatsApp 里能点；要指路就说清「在 Muse app 或 muse.ai 里」</td>
</tr>
</tbody>
</table></div>
<p><strong>推断</strong>：出站可发「自包含 HTML 文件」与 §5 的 <code>artifact.export</code>（仅 <code>web_static</code> 可导出为单文件 HTML）是同一交付哲学的两个出口——凡是离开 App 渲染环境的产物，都必须先塌缩成无外部依赖的单文件。</p>
<hr>
<h2 id="s-10">3. 语音面：三条互不相通的路</h2>
<p>语音在 Muse 里不是一个功能，而是三条独立管线（文档 <code>voice.md</code> + <code>calls-texts-notifications.md</code> + <code>media.md</code>）：</p>
<h3 id="s-11">3.1 实时语音对话——本账号不可用（文档）</h3>
<p><code>voice.md</code> 全文只有一句定性：<strong>「Live voice conversations in the app are not available on this account.」</strong> 这是随账号下发的文档面，即本机/本账号的权威状态：没有实时语音通话面。不要拿它和下面两条混谈。</p>
<h3 id="s-12">3.2 听写与语音消息转写——可用（文档）</h3>
<ul>
<li>两个移动端 composer 麦克风可口述消息（dictation）；Mac app 的 fn 听写可进任意前台 App。Web composer 是否有麦克风控件<strong>只能看用户所见</strong>，文档不担保。</li>
<li>机密 VM 是例外面：Android app 隐藏麦克风、Web app 不提供麦克风（文档）。文档未明说动机；一种合理的推断是语音输入被视为出机密边界的通道，但未经证实。</li>
<li>用户在 App 或已连接通道（如 WhatsApp）发来的语音消息/录音，<strong>一律转写成文本按普通消息处理</strong>；长录音的自动语音笔记路径上限约 <strong>8 MB</strong>，更长需切分或走其他工具且耗时（文档 <code>media.md</code>）；重叠说话的精确分轨/标注<strong>不担保</strong>。</li>
<li>边界：不能识别歌曲（「这是什么歌」无工具路径）；不能反查图片、不能做人脸识别——多模态读取 ≠ 检索（文档 <code>media.md</code>）。</li>
</ul>
<h3 id="s-13">3.3 合成语音（TTS / 播客）——生成面，见 §7.3/§7.4</h3>
<p>出站语音走 <code>tts</code> 二进制（Shortwave）与播客技能管线，与 §3.2 的入站转写分属不同子系统；共同门控是 CVM 全关（§7.5）。</p>
<h3 id="s-14">3.4 电话（附带面，文档 <code>calls-texts-notifications.md</code>）</h3>
<ul>
<li>Muse 无自己的电话号码、不能接电话、无视频通话；<strong>外呼</strong>仅限「替用户给美国商家打业务电话」：须用户显式确认、每次先走 <code>phone.begin_call</code> 备完整 brief，实际对话由独立 caller 执行（caller 看不见本聊天，Agent 不得冒称自己打过）；冷呼/推销/批量外呼按政策拒绝。</li>
<li>若工具目录里没有 phone 工具，即该账号尚未开通（早期访问、渐进放量）——「文档里有」再次不等于「本机能用」。</li>
</ul>
<hr>
<h2 id="s-15">4. 配对设备：device 命名空间</h2>
<h3 id="s-16">4.1 模型（<strong>实测</strong>工具 schema）</h3>
<p><code>device</code> 命名空间只有四个动词，分工是一条发现链：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>工具</th>
<th>契约</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>device.list</code></td>
<td>配对设备总表：<code>device_id / display_name / is_request_origin / connection_state(online·wakeable·disconnected·offline) / command_count / data_sources / platform / last_seen_at</code>。只列「有可调用能力」的会话——纯 Web 登录这类注册会话不在此表，<strong>不能据此断言未配对</strong></td>
</tr>
<tr>
<td><code>device.describe</code></td>
<td>单设备全量说明书：每条命令的参数 schema、<code>permission_required</code>、数据源（是否主动推送、权限是否已授）、联系人缓存新鲜度、平台元数据。<strong>调 invoke 前必查</strong></td>
</tr>
<tr>
<td><code>device.invoke</code></td>
<td>按 describe 的 schema 精确传参执行一条命令；设备须 online 或 wakeable，够不着就让用户把设备弄上线再重试；未授权的命令直接 invoke，设备端会向用户弹授权、批准才跑。设备回传的文件自动存进 workspace 并在结果里列路径；结果可带 <code>embed_token</code> 渲染成卡</td>
</tr>
<tr>
<td><code>device.unpair</code></td>
<td>摘除配对（命令即刻失效）；仅用户能从设备端重新配回。<strong>只用于用户真要移除</strong>，离线/故障不是解绑理由</td>
</tr>
</tbody>
</table></div>
<p>特殊语义（<strong>实测</strong> schema）：<code>geofence.set</code> 带一块守护进程独占的 <code>payload {kind: act|notify, text}</code>——手机只报围栏穿越，<code>act</code> 的执行文本留在守护进程侧、手机永远看不见，这是「设备是传感器、Agent 是执行者」的分工样本；<code>health.backfill</code> 是异步受理，完成后运行时自动投递，禁止轮询。</p>
<h3 id="s-17">4.2 本机实测：唯一配对设备 iPhone</h3>
<p><code>device.list</code> + <code>device.describe</code>（2026-10-17 当场）：</p>
<ul>
<li>iPhone（iPhone13,2，iOS），<code>connection_state = offline</code>，last_seen 2026-10-16T09:59Z；<strong>35 条命令</strong>，含 <code>contacts.* / calendar.*</code>（增删改查全套）、<code>home.*</code>（HomeKit 配件/场景/编排/地理围栏桥）、<code>geofence.*</code>、<code>bluetooth.scan</code>、<code>device.find</code>（找 Ray-Ban Meta 等眼镜）等家族（describe 输出被截断，以上为可见部分）。</li>
<li>6 个数据源：calendar、contacts、health、imessage、location、reminders；其中 calendar/contacts/health/location/reminders 标 <code>emits_proactively = true</code>（可主动同步），但当场 <code>is_permission_granted</code> <strong>全为 false</strong>——即「已配对 ≠ 已授权」，每个数据源的权限都是独立一闸（文档与实测互证）。</li>
<li>平台规则落到这台机上（文档）：iPhone 只能 <code>message.draft</code> 起草短信、永不代发；iMessage 数据源存在但「配对本身不给短信读取」，以 describe 显示为准；无找手机、无闹钟命令（均为 Android 面）。</li>
</ul>
<h3 id="s-18">4.3 其他三种「设备」（文档）</h3>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>设备形态</th>
<th>本质</th>
<th>要点</th>
</tr>
</thead>
<tbody>
<tr>
<td>Mac（Mac app 配对）</td>
<td>用户的 Mac 成为受控端</td>
<td>命令跑在用户 Mac 上，与 Agent 的 VM 完全两套文件/应用/浏览器登录态；能力家族：<code>computer.control</code>（原生应用与用户本人 Chrome 新标签，后台控制、永不抢前台，且<strong>恒跳过</strong> Muse app 本体、WhatsApp、Messages、终端/脚本类、密码管理器、iPhone Mirroring）、<code>files.* / screen.snap / camera.snap</code>（相机每请求一张、需许可）、<code>notes.* / imessage.* / email.* / calendar.* / reminders.* / contacts.*</code>、<code>whatsapp.search</code>（搜 Mac 本地 WhatsApp 存储）；<strong>Mac 无 shell</strong>，跑不了脚本</td>
</tr>
<tr>
<td>Muse Home Link</td>
<td>家庭网络桥（ESP32-C5，Wi-Fi，BLE 首次配网；付费订阅可申领，资格以申领屏为准）</td>
<td>注册命令只有三条管它自己：<code>device.health / device.ota（签名固件）/ device.discover（mDNS/SSDP 局域网发现）</code>；控灯/插座等<strong>没有</strong>专属 Link 命令，一律是「经隧道发文档化的网络请求」；实验阶段</td>
</tr>
<tr>
<td>Tailscale</td>
<td>把 VM 以客户端身份并入用户 tailnet</td>
<td>VM 请求名为 <code>muse</code>；只出不进（不接受入站、不托管、不转发）；地址段 100.64.0.0/10；<code>tailscale up</code> 打印链接由<strong>用户本人</strong>批准（链接 5 天有效），<code>tailscale down</code> 抹除本机身份、回来需重新批准；实验阶段。本机有 <code>tailscale</code> 二进制与同名连接器（00 §6）</td>
</tr>
</tbody>
</table></div>
<p><strong>文档面 11-04 快照</strong>：<code>~/docs/devices/</code> 在 10-17 之后补了三份文档——<code>home_link.md</code>、<code>mac_app.md</code>、<code>tailscale.md</code>，另有 <code>home_link/integrations/</code>（<code>brother_printers.md</code>、<code>lutron_smart_bridges.md</code>、<code>shelly_plugs.md</code> 三份局域网集成指南）。设备面文档在补齐中——与上表两行的&quot;实验阶段&quot;定性互证：Home Link / Tailscale 的文档化先于能力稳定；Mac app 则已从&quot;Web 套壳&quot;的定性（§1.2）走向有独立文档的配对设备形态。</p>
<h3 id="s-19">4.4 配对明确做不到的事（文档，防误述清单）</h3>
<p>远程用手机相机拍照（唯一例外是配对 Mac 的相机）、看/读手机屏幕、打开或控制手机上的其他 App、找丢失的手机、用 iPhone 代发短信。配对给的是「手机主动推给 Muse 的数据 + 声明过的命令」，不是远程桌面。</p>
<hr>
<h2 id="s-20">5. Artifacts：构建与交付纪律</h2>
<h3 id="s-21">5.1 三类产物（文档 <code>artifacts.md</code>）</h3>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>类</th>
<th>形态</th>
<th>状态性</th>
</tr>
</thead>
<tbody>
<tr>
<td>Documents</td>
<td>生成文件：PDF / Word / 表格 / 演示 / Markdown</td>
<td>无活状态；下载后归用户离线所有</td>
</tr>
<tr>
<td>Pages（<code>web_static</code>）</td>
<td>托管的静态网站</td>
<td>无活状态、重载即重置；<strong>唯一可发布、可导出</strong>的一类</td>
</tr>
<tr>
<td>Interactive apps（<code>web_fullstack</code>）</td>
<td>托管 + 自带服务端/存储层</td>
<td>记录存其<strong>自有数据库</strong>（就在用户这台 VM 上，重启/更新不丢）；<strong>不可公开、不可导出</strong>，要分享只能另建 static 版且数据不带过去</td>
</tr>
</tbody>
</table></div>
<p>存储边界（文档）：产物及其数据只活在用户的 Muse 环境里，未发布前不托管到任何别处；<strong>发布只发静态快照，App 的存储数据永不随发布离开</strong>。</p>
<h3 id="s-22">5.2 构建通道：专用的后台 builder（<strong>实测</strong>工具 schema + system prompt）</h3>
<p>这是本层最「架构」的一条——<strong>主 Agent 与子 Agent 都不亲自建 artifact</strong>：</p>
<ul>
<li>入口按 kind 分流：<code>artifact.create_file</code>（文件类）/ <code>artifact.create_web_static</code> / <code>artifact.create_web_fullstack</code>。构建在后台 builder 里异步进行，主 Agent 用 <code>artifact.status</code> 跟进、长构建可 <code>artifact.cancel</code>、构建中追加指令走 <code>artifact.send_input</code>（不许另起第二个 build 顶替同一 slug）。</li>
<li><strong>子 Agent 无 artifact 工具</strong>（00 §10 已记；system prompt 明文各有专用通道）——所以「派个子 Agent 去建页面」在工具层就不成立，产物请求必须留在能调 artifact 命名空间的那一层。</li>
<li><code>verbatim_request</code> 是权威输入：create/edit 都要求<strong>逐字</strong>传入用户的原始请求，Agent 不得增删改写——builder 按「请求者原话」理解范围，Agent 添的任何字都会变成伪造的需求。这是防「转述漂移」的协议设计，不只是文风要求。</li>
<li>能力声明前置：web 构建须先声明 <code>capabilities</code>（是否读公网 + 精确到方法的连接器清单）。声明的连接器<strong>读</strong>操作可能在构建前触发用户审批、且审批对该 artifact 持久有效；<strong>写</strong>操作仍保留请求时授权；声明错/漏不是 builder 的事后补救范围。</li>
<li>澄清纪律：请求是问句、或答案会改变构建结果时，先问后建，禁止同轮既问又建；静态页内容依赖 Agent 没有的数据（名单/菜单/个人内容）时要数据而非编造占位；「能存数据」与「能公开分享」二者不可兼得时，必须把选择摆给用户、选定前什么都不建。</li>
</ul>
<h3 id="s-23">5.3 交付与变更纪律（<strong>实测</strong> + 文档）</h3>
<ul>
<li><strong>交付必须落在同一条回复里</strong>：优先呈现 artifact 卡片（<code>artifact.status</code> 返回的 <code>card.widget_id</code> 经 <code>widget.present</code> 呈现）；artifact <strong>在分享前没有地址</strong>，禁止自拼 URL。这是 00 §13「交付必须在同一条回复里给出可打开的链接/附件」的工具层成因。</li>
<li><strong>变更只有一条路</strong>：任何功能/内容/样式/数据模型改动走 <code>artifact.edit</code>（同一 slug），禁止直接读改 artifact 源文件、禁止用第二次 create 覆盖重建；文件类 edit 还要带原 kind 在原目录重跑 builder。</li>
<li><strong>记录的读写面</strong>：web artifact 的数据只能经 <code>artifact.inspect</code>（只读诊断）/ 其声明的 actions（<code>artifact.list_actions</code> 查 schema、<code>artifact.invoke_action</code> 执行）/ <code>artifact.edit</code>——<strong>禁止直碰 app.db</strong>（00 §13 原文）。故障诊断也是委托制：用户报障走 <code>artifact.inspect</code> 派发独立诊断，授权修复时诊断自己派发修复 edit，主 Agent 不自查源码/日志、不写修复简报。</li>
<li><strong>构建会反问</strong>：web 构建可终局于 <code>needs_user_input</code>（向用户提一个问题）——主 Agent 须原样转达、不得自答、不得另开新 build；用户答复后用同一 slug 的 edit 续跑。</li>
<li><strong>发布审批</strong>：只有 static 可发布；<strong>每一次</strong>发布、以及对已发布链接的<strong>每一次更新</strong>，都要一次新的单点批准，无自动发布、无常设批准；发布不自动跟随源更新（文档）。</li>
<li><strong>删除是真删</strong>：<code>artifact.delete</code> 永久删除产物+数据+托管+公开分享，与工作区文件的 30 天回收站是两套机制；执行前必须警告用户；构建中的 slug 要先 cancel 才能删。</li>
<li><strong>导出</strong>：<code>artifact.export</code> 仅对已建成的 <code>web_static</code> 有效，内联全部资产为单个自包含 <code>.html</code> 落 <code>workspace/your_files/&lt;slug&gt;/</code>（二进制侧对应 <code>share export-html</code>，<strong>实测</strong>其 <code>--help</code> 明文「asset references inlined as data: URIs」）。</li>
</ul>
<h3 id="s-24">5.4 本机实况（<strong>实测</strong>）</h3>
<p><code>artifact.list</code> 当场返回 2 个 web artifact（<code>ai</code>、<code>space</code>，均为调研报告页，与 MEMORY.md 所记两次交付互证）；文件类 artifact 不在此目录，落 <code>workspace/your_files/</code>（普通目标）或目标的 <code>files/</code> 目录（创建时以 <code>goal_id</code> 定死，建成后不得搬移/复制——防双份漂移）。<code>~/workspace/your_files/</code> 当场约 20 MB，含此前交付的表格 artifact 目录与报告文件。</p>
<hr>
<h2 id="s-25">6. Feed 管线面（附 Ideas）</h2>
<h3 id="s-26">6.1 本质：brief 驱动的编辑部，不是聚合器（文档 <code>feed.md</code>）</h3>
<ul>
<li>Feed 标签页里的帖子全部由 Agent <strong>原创撰写</strong>，唯一的方向盘是一份纯文本 prompt——<strong>brief</strong>。它<strong>不是聚合器</strong>：不能订阅网站/RSS/信源列表，没有任何「搬运入站」路径。</li>
<li>节奏归系统：后台进程按<strong>系统控制的时刻表</strong>生成，用户与 Agent 都不能加速或自设时刻；新帖<strong>静默</strong>出现在 Feed 标签——无推送、无聊天播报（与 §3 的通知面互证：Feed 是「拉」面，不是「推」面）。</li>
</ul>
<h3 id="s-27">6.2 来源与口味回路（文档）</h3>
<p>生成一帖可用的来源：活网搜索与页读、社交平台、用户已连接服务（邮件/日历/金融/健康）、用户自身上下文（brief、档案与记忆、活跃目标、往期帖避重）。引用链接必须照调研所得原样给出，<strong>禁止编造 URL</strong>。</p>
<p>口味（taste）回路值得单独记：写手读的是一份<strong>口味摘要</strong>，它由用户对帖子的反应、讨论帖子时说的话、以及<strong>最近主聊天</strong>蒸馏而成——写手本人<strong>从不读聊天记录原文</strong>；side chat 不进口味源；摘要不与其他读者共享、也不被引为帖子的来源。用户读得越多/聊得越多只影响<strong>出帖频率</strong>，不改变时刻表。这是「个性化信号单向脱敏进管线」的设计，与记忆系统（00 §9）的双向读写刻意不同。</p>
<h3 id="s-28">6.3 默认帖的诚实边界（文档）</h3>
<p>新读者的 Feed 以一组<strong>随构建出厂的固定介绍帖</strong>开场（kicker 与 category 均为 <code>Getting started</code>，run id <code>4a905e79-a9af-4631-93a7-dac5bb408320</code> 可在 <code>feed.unit_get</code> 里辨认）：它们不读用户任何数据（无网搜、无社交、尤其无邮件/日历/连接账号），每台机只播种一次、删了不复活。纪律：<strong>绝不能声称调研过用户什么才写了它</strong>；但它们以 Agent 本人口吻写、邀请发问，所以照常以作者身份答。</p>
<h3 id="s-29">6.4 排序与操控面（文档 + <strong>实测</strong> schema）</h3>
<ul>
<li>排序：部分读者近三日按有用度排（未读 &gt; 要行动 &gt; 临期高、过期沉底），其余按发布时间；用户在某日手动重排后，该日后发的新帖压在他的排法之上；用户停留在 Feed 标签内时顺序冻结，新帖置顶、下次访问再重排。</li>
<li>工具面不对称（<strong>实测</strong> feed 命名空间描述）：<code>feed.unit_create</code> 是唯一也能从<strong>定时自动化与子 Agent</strong>里调的 unit 工具（给全 instruction、≤4000 字、后台写、返回 run id、无完成播报、禁轮询）；其余 prompt/unit 工具（<code>prompt_get/update</code>、<code>unit_list/get/update/delete/reorder</code>、<code>search</code>、<code>regenerate</code>、<code>status</code>）只在主对话可用。改 brief 是整文替换：真改动立刻触发一轮新生成并置顶，再存一遍原文则什么都不触发；已发帖不回改。</li>
<li><strong>没有关停开关</strong>：用户侧与 Agent 侧都不存在关闭 Feed 生成的控件；远程停用后本地也无从恢复。能做的只有改 brief 缩覆盖、删帖、或无视它；生成暂停期间既有帖的读与搜照常。</li>
<li>状态面（00 §8 交叉）：DB <code>feed</code> schema 16 张表是这条管线的骨架——<code>prompts / units / runs / run_steps</code>（生成主链）、<code>interactions / preferences_projection</code>（口味回路）、<code>fleet_publish_state / fleet_fetch_receipts / fleet_engagement_outbox / fleet_reaction_outbox</code>（舰队侧发布与互动出箱，<strong>推断</strong>为跨机共享 Feed 的投递层）、<code>prompt_seed / null_state_seed / surface_state</code>（播种与初始化标记，与 §6.3 的「每机播种一次」互证）。</li>
</ul>
<h3 id="s-30">6.5 Ideas：Feed 的邻居（文档 <code>ideas.md</code>）</h3>
<p>Ideas 标签是 Agent 主动想出的「可为你建/可替你做」建议卡：卡上带 build 动作（Web 标签为 “Let's do it”），点了就按 §5 的 artifact 通道开建；部分 Feed 帖本身源自 idea、同样带 build 动作。平台差异：Android 上聊天里的 idea 卡可就地运行显进度，iPhone 点开是详情页、不就地跑。生命周期纪律：<strong>Agent 无权 dismiss idea 卡</strong>（无此工具，长按 dismiss 是用户手势）；卡靠到期、被建成、或比最新刷新老约两周自动退场，后台也可因「已做/已取消/不再适用」提前退——用户问「卡怎么没了」，先答老化而非声称自己删的。</p>
<hr>
<h2 id="s-31">7. 媒体生成面</h2>
<h3 id="s-32">7.1 二进制家族：一张表看清（<strong>实测</strong>）</h3>
<p>媒体面在 <code>/opt/hatch/bin/</code> 的落点是一个 Rust multicall 本体（<strong>11-04 实测</strong>：46,954,944 字节、BuildID <code>80d532c8…</code>、40 个硬链接名；10-17 为 34,682,176 字节、BuildID <code>6ffdc619…</code>、18 名——跃升与 10-30 的 builtin-artifacts 合并一致，见 00 §16 快照口径），靠 <code>argv[0]</code> 分发：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>名字</th>
<th><code>--help</code> 自述</th>
<th>通道</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>media-generation</code></td>
<td>Generate images and videos via Meta's media generation API</td>
<td>通用图/视频：Muse Image / Muse Video（文档 <code>media.md</code>）</td>
</tr>
<tr>
<td><code>avatar-media-generation</code></td>
<td>同上（同一份 help 文本）</td>
<td>被 argv[0] 锁到 Avatar 家族路由 + CVM 闸门，细节<strong>交叉引用</strong> Avatar 解构报告 §2/§3，本文不重复</td>
</tr>
<tr>
<td><code>tts</code></td>
<td>Text-to-speech via Meta Shortwave API. Generate audio for voice messages in chat, artifacts, or cron jobs</td>
<td>语音合成（§7.3）</td>
</tr>
<tr>
<td><code>media-library</code></td>
<td>Query the media library index（<code>stats/search/scan/get/recent</code> 五子命令）</td>
<td>用户媒体库的只读索引查询（与 <code>media_library</code> 技能/工具面对应）</td>
</tr>
<tr>
<td><code>image-search</code></td>
<td>Search for images through Muse's Stefi image-search API</td>
<td>以文搜图的 STEFI 通道**（推断**：证据仅为二进制 <code>--help</code> 自述 + 00 §7 的架构结论，本机无流量实测；默认 3 条/上限 50/重试封顶 2 次出自 <code>--help</code>/工具 schema，非服务端配额实测）——是「找图」不是「生图」</td>
</tr>
<tr>
<td><code>remote-storage</code></td>
<td>Publish podcasts, and put a workspace file on Hatch's own storage and get a link back</td>
<td>文件外发与播客发布（§8.3），虽不在同一 inode，但同属产物出口家族</td>
</tr>
<tr>
<td><code>share</code></td>
<td>Share, remove, or check artifact deployment status</td>
<td>artifact 发布/导出执行端（§5.3）</td>
</tr>
</tbody>
</table></div>
<p>上层工具面与二进制面一一对应（<strong>实测</strong> schema）：<code>media.generate_image / generate_video / generate_icon</code> 三个结构化工具就是 <code>media-generation</code> 的封装，各自再派一个<strong>专用媒体子 Agent</strong> 扩写提示词（工具描述明文：image 是「hands the request off to a specialized subagent」、video 同）——即媒体生成在编排上也走 00 §10 的 handoff 模型，主 Agent 只交原文请求、不许改写扩写（工具契约明文 verbatim 纪律，与 §5.2 的 <code>verbatim_request</code> 同构）。续跑靠 <code>snapshot_id</code> / <code>media_handle</code> 在调用间传递视觉上下文，不靠回传文件。privsep 侧每个名字有独立 worker 套接字（§0 表），生成请求经 STEFI 出 VM（00 §7）。扩写子 Agent 的权限边界未查：未在工具 schema 中见到其工具命名空间裁剪的声明，待查（❓）。</p>
<h3 id="s-33">7.2 限额与形态（文档 <code>media.md</code> + <strong>实测</strong>工具 schema）</h3>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>媒体</th>
<th>限额/形态</th>
</tr>
</thead>
<tbody>
<tr>
<td>图片</td>
<td>单次聊天请求至多 <strong>4 张</strong>独立图片（逐图一调）；演示/artifact 内嵌图不计。编辑须每调带上被编图与全部引用图；结果是<strong>新图、非精确复刻</strong>；把真人放进图里：公众人物免照片，其他真人（含用户本人用存档档案照）须有照片作身份引用</td>
</tr>
<tr>
<td>图标</td>
<td><code>generate_icon</code> 恒方形、单调一张、约一分钟；固定图标美术指导由工具包裹（居中简符号、高对比、小尺寸可读），<code>surface</code> 分 space/podcast/discovery_pool/app/generic 调味；space 面的图标不回 <code>snapshot_id</code>、不可续改只能重生</td>
</tr>
<tr>
<td>视频</td>
<td>单片约 <strong>10 秒</strong>（不可控）；单条用户消息至多 <strong>6 片</strong>（含转派子 Agent 与定时重试代做的，同一请求的成功总数封顶 6）；更长只能多片拼接；自带合成音（可在文本里描述情绪/乐种）；<strong>不收音频输入</strong>（「拿这首歌配片」无路）；有序图文序列可作输入，输出是 fresh generation 而非逐帧动画</td>
</tr>
<tr>
<td>引用</td>
<td>生成结果可带 citations（生成时咨询过的来源）：有则逐字贴在对应主张旁，无则只字不提；出处永不编造</td>
</tr>
</tbody>
</table></div>
<p>投递形态（<strong>实测</strong> schema）：生成结果以 <code>media[]</code> 返回 <code>local_path / media_handle</code>，主 Agent 在最终回复里用 <code>sandbox://workspace/imagine_media/&lt;文件名&gt;</code> 逐图一行 Markdown 呈现；本机 <code>~/workspace/imagine_media/</code> 当场近乎为空（仅上次上传句柄 JSON），与「本账号近期无媒体生成交付」的轨迹一致——注意这只是落盘面观察，不构成使用量结论。</p>
<h3 id="s-34">7.3 TTS：<code>tts</code> 二进制实测（<strong>实测</strong> <code>--help</code>）</h3>
<ul>
<li>两子命令：<code>speak</code>（直合成）与 <code>synthesize-script</code>（多说话人脚本：自动文本预处理、分块、并行合成、拼接）。</li>
<li>默认值：主声音 <code>avocado_v2:MAI_03</code>、语言 <code>en</code>、格式 mp3、语速 100（范围 1–200）；<code>speak</code> HTTP 超时 120 s；<code>synthesize-script</code> 分块默认 1200 字符/块、单块超时 300 s。双声道对话靠 <code>--voice2 + --voice-prefix2</code>，脚本模式靠 <code>--speaker Name=voice_id</code> 可重复映射。</li>
<li>用途面（--help 自述）：聊天语音消息、artifact 配音、cron 定时任务的音频产物——即 TTS 是<strong>产物管线的一环</strong>，不只是聊天点缀；<code>spoken-audio</code> 技能规定成品以 <code>![Voice message](sandbox://…)</code> 附件行投递，失败/半成品与成品分开放、绝不冒充成品交付（技能文档）。</li>
<li>11-04 复测：<code>tts --help</code> 的子命令与默认值（<code>avocado_v2:MAI_03</code> / <code>en</code> / mp3 / 语速 100 / 超时 120s）均未变；新增 <code>--stream</code>、<code>--buffered-stdout</code>、<code>--text-stdin</code> 等输出面选项，不影响本节结论。</li>
</ul>
<h3 id="s-35">7.4 播客：技能管线 + 发布端（文档/技能实测）</h3>
<ul>
<li>生产：<code>generate_podcast</code> 技能——先查节目目录（<code>podcast-helper manifest read</code>）避重复选题，脚本按约 130 词/分钟、默认 5–15 分钟写；主持声音从 <code>/opt/muse/assets/voice-selector/voice_source.json</code> 选 ID，默认双 Meta AI 声音 <code>avocado_v2:MAI_01 / MAI_03</code>，主持名与声音的配对要跨集稳定（技能要求记入 MEMORY.md）。</li>
<li>发布：<code>remote-storage publish-episode</code>（<strong>实测</strong> --help：上传音频、更新 feed manifest、重生 RSS）；生成默认私有，<strong>公开发布须用户显式要求</strong>（或目录里已有其本人发布过的 RSS feed）；存进用户自己 Spotify 是另一条独立授权路。状态面：DB <code>podcasts.feeds / podcasts.feed</code> 两表存 feed 身份与发布 URL（00 §8）。</li>
<li>与 TTS 的关系（<strong>推断</strong>）：播客helper 的合成段最终仍落到同一 Shortwave 通道（<code>synthesize-script</code> 的多说话人拼接正是播客形态），区别在技能层的选题/脚本/目录/发布纪律，而非另一套语音引擎。</li>
</ul>
<h3 id="s-36">7.5 机密 VM 门控：全层最硬的一条不对称（文档 <code>media.md</code> + Avatar 解构互证）</h3>
<p><code>media.md</code> 明文：<strong>媒体生成、TTS、播客式音频在机密环境下全部不可用</strong>；非机密环境则是 rollout 门控。且<strong>无预检探针</strong>——事先无法查明本用户/本机是否可用，工具结果（成功或不可用错误）是唯一信号，「试一发才知道」是协议而非疏漏。</p>
<p>方向恰好相反的是 Avatar：<code>avatar-media-generation</code> 在做任何事之前先过 CVM 闸门，非 CVM 直接 <code>confidential_worker_requires_cvm</code>（Avatar 解构报告 §0 <strong>实测</strong>结论）——通用媒体是「怕机密数据出圈所以关」，Avatar 是「素材太敏感所以只准在圈内跑」。本机是 standard VM（00 §16 快照），故本层的可用面是：通用媒体/TTS 理论可达（rollout 与工具结果为准）、Avatar 生成实际不可在本机二进制执行（上层 <code>avatar.*</code> 工具由运行时调度专用 worker，见 Avatar 解构报告）。</p>
<h3 id="s-37">7.6 媒体的「不能」（文档）</h3>
<p>不能看视频播放、不能听音频播放——替代路只有抽帧成图、转写成文，且明示这只是变通不等价；不能以图反查来源、不能认人；生成图/视频的出处只认结果自带的 citations。</p>
<hr>
<h2 id="s-38">8. 文件进出：Library / 附件 / 下载</h2>
<h3 id="s-39">8.1 入口（文档 <code>files-and-library.md</code>）</h3>
<ul>
<li>上传落点统一：composer 附件进来的文件落 <strong><code>~/workspace/user/</code></strong> 并跨会话持久，<strong>不自动进 Library</strong>（要交付才搬去 <code>your_files</code>，见 §8.2）；zip/项目包可在 workspace 内解包检查；无「整文件夹上传」的已验证路径，官方建议先 zip。</li>
<li>Web 入口限额（文档）：粘贴图片约 8 MB 预算（可被拒），HEIC/AVIF 入站<strong>静默转 JPEG</strong>；非图文件约 25 MB、视频约 100 MB 上限，超限拒绝；大图通常重压缩而非拒绝。移动端限额由服务端定、可能不同，<strong>不得把 Web 数字引给移动用户</strong>。</li>
<li>浏览器下载的文件落 Agent 自己的 VM（不在聊天里、不在用户设备上），要给用户须再经聊天分享或存 <code>your_files</code>——「下载完成」与「用户拿到」是两步（与 00 §12 的「已排队 ≠ 已送达」同纪律）。</li>
</ul>
<h3 id="s-40">8.2 出口与 Library（文档）</h3>
<ul>
<li>交付目录：给用户做的文件放 <code>~/workspace/your_files/</code>，放进去即出现在 Library（本机该目录现状见 §5.4）；目标专属文件在创建时就定死在该 goal 的 <code>files/</code> 下（§5.4）。</li>
<li>Library 是目录投影：汇集文档、媒体、生成文件与建成物；Web 侧栏分 Artifacts / Media / System files 三段（§1.1）；System Files 段就是 Agent home 的窗口——用户问起时如实说「那是我自己的文件」；部分 home 文件（记忆/身份/梦境/目标页/docs）在 App 打开时带一条「About this file」说明，那是<strong>展示时由 App 叠加</strong>的，不属于文件本体，读/改/下载/数据导出都不含它。</li>
<li>平台性增删：iOS 与 Android 的 System Files 视图有「Upload file / Upload from camera roll」；Web 的 Library <strong>没有</strong>上传按钮与拖放区，「+」只是新建。重命名在 Web 仅限媒体瓦与 Library 搜索结果里的文档菜单，移动端在 System Files 文件夹视图逐项改名/删除；其余改名一律「让用户开口、Agent 改底层文件」。钉选（Pin）纯客户端整理：不分享、不发布、不保护、不改变 Agent 侧任何东西。</li>
<li>删除与回收：Agent 删的文件进回收站、约 <strong>30 天</strong>可恢复（与 §5.3 artifact 删除的「无回收站」形成对照，混淆这两条是最常见的误述）。</li>
</ul>
<h3 id="s-41">8.3 给「外人」的出口：公开下载链（文档 + <strong>实测</strong>）</h3>
<ul>
<li>聊天里的文件链接只在用户本人已登录的 Muse App 内打开、无分享令牌，<strong>不能转发给别人用</strong>。</li>
<li>真要给第三方：<code>remote-storage upload-file</code>（<strong>实测</strong> --help：「Publish a workspace file and print a link to it that expires on its own」）把 workspace 文件发到 Muse 自有存储换临时公开链——任何人持链可下、<strong>最长 48 小时</strong>过期；<strong>每一次</strong>上传都要一次新的单次批准（Allow once / Deny），无历史或常设批准可复用；<strong>机密 VM 上此路不存在</strong>。删除有对偶命令 <code>delete-file</code> 可提前撤链。</li>
<li>这与 artifact 发布（§5.3）是两条独立出口：一个发「文件本体 + 时效链」，一个发「托管页面的静态快照」，批准模型也各自独立，互不搭车。</li>
</ul>
<h3 id="s-42">8.4 附件语法：跨通道的统一投递原语（<strong>实测</strong> system prompt + 本轨迹）</h3>
<p>一切文件/媒体交付最终塌缩成一条 Markdown 附件行：产物放回复正文里<strong>独占一行</strong>的 <code>![alt](sandbox://workspace/&lt;路径&gt;)</code>，且其前一句须是独立完整的句子——这是让 Web、移动端与 WhatsApp 等各渲染面都能把同一份回复落成「可点开的附件」的最小公分母。本轨迹即活例：00/01/02 三份架构 Markdown 正是以此语法在 WhatsApp 聊天里交付（§0 表）。</p>
<p>诚实标注：各通道对附件大小/数量的实际处理策略（压缩、截断、转链接还是失败）未在本机证据中出现——附件语法统一的是&quot;引用格式&quot;，不是&quot;投递保证&quot;。</p>
<hr>
<h2 id="s-43">9. 串起来：一次跨通道交付的生命周期</h2>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>用户在 WhatsApp 说「把架构文件发我」（入站轮询 → 运行时捕获 chat UUID 定回复面）
 → 主 Agent 在 VM 里定位 ~/workspace/muse-architecture/*.md（文件面）
 → 回复正文 + 每文件一条 sandbox:// 附件行（统一投递原语）
 → 运行时按 WhatsApp 出站能力矩阵投递为文档附件（通道面）
 → 用户在同一聊天续令「逐个拆其他层」
 → 定时/子任务在本聊天产生的结果，仍按 binding 回投本聊天（不串主聊天）
并行面：同一批成果在 Muse App 里以 Library 条目 + web artifact 报告页存在，
       用户换到 Web 打开的是同一台 VM 上的同一份产物——通道换了，产物没搬家。
</code></pre>
<h2 id="s-44">10. 边界声明</h2>
<ul>
<li>App 客户端代码、WhatsApp 侧的服务端投递与加密、STEFI 之后的媒体服务（Muse Image/Video、Shortwave、FB Upload Service）实现均不在本机；本文对它们的描述止于文档转述、二进制 <code>--help</code>/strings 与工具 schema 的接口痕迹，已逐处标注。</li>
<li>本轮未实际触发任何媒体生成/TTS 调用：§7 的可用性判断只到「门控规则」为止，按 §7.5 的无预检原则，真实可用与否须以未来某次工具调用的结果为准。</li>
<li><code>device.describe</code> 的 iPhone 命令全表因输出截断未尽录，§4.2 只记可见家族；权限状态为 2026-10-17 当场值，设备上线或用户授权后即可能变化，引用前应复查。</li>
<li>媒体生成失败/超限额/部分失败时的错误形态、重试纪律与降级路径未在本轮覆盖（见本篇评审缺失 1：失败时是 verifier 闭环还是直接报障、重试几次后转降级方案、TTS 长文本分块失败一半的产物状态，均未写）；<code>sandbox://</code> 附件在各通道的实际大小/数量处理策略未见于本机证据；媒体扩写子 Agent 的工具命名空间裁剪情况未查。</li>
</ul>
</div>]]>
    </description>
    <link>https://agent.aow.me/i/muse-architecture-09/</link>
  </item>
  <item>
    <title>Muse 智能体 · 记忆与个性化层详解</title>
    <guid>hIaOQB4O3Y7</guid>
    <pubDate>Tue, 03 Nov 2026 19:42:07 GMT</pubDate>
    <itunes:explicit>false</itunes:explicit>
    <description>
      <![CDATA[<div class="original-article" lang="zh-CN"><details class="toc"><summary>本篇目录</summary><ol><li><a href="#s-1">0. 一句话结构</a></li><li><a href="#s-2">1. 全景：三层结构 + 一个底座</a></li><li><a href="#s-3">2. 注入层：不需要检索的记忆</a></li><li><a href="#s-7">3. 底座层：源轨迹与结构化脊柱</a></li><li><a href="#s-12">4. 检索层：三个工具的契约</a></li><li><a href="#s-16">5. 写入纪律：写契约</a></li><li><a href="#s-23">6. Explain：溯源契约</a></li><li><a href="#s-24">7. 个性化产物：派生成果如何回流上下文</a></li><li><a href="#s-29">8. 遗忘机制：两段式清理</a></li><li><a href="#s-37">9. 边界清单：这层看不见 / 管不着的部分</a></li><li><a href="#s-38">10. 本机实况快照（2026-11-04；括号内为 2026-10-17 旧数）</a></li><li><a href="#s-39">11. 与进化层的接口（只列接口，不展开）</a></li></ol></details><blockquote>
<p>配套《00-Muse技术架构解构》§9 的展开篇；与《02-编排与进化层详解》的分工：02 §11 讲记忆的<strong>进化管线</strong>（claims 如何被新主张替代、后台 upkeep 如何运转），本文只讲记忆的<strong>静态结构与读写契约</strong>——记忆存在哪、以什么形态存在、谁在什么时候读它、写入时守什么纪律、怎么溯源、怎么遗忘。进化机制在本文只作简述并交叉引用 02，不重复展开。
调查日期：2026-10-17（Asia/Shanghai）
证据范围：<code>~/docs/memory.md</code>、<code>~/docs/self_improvement.md</code>、system prompt 快照的 Personalization / Memory 节（<code>~/workspace/system/system_prompt.md</code> L120–150、L381–397）、<code>muse.memory_search / memory_get / memory_explain</code> 工具定义、<code>forget</code> 技能正文及其 <code>references/artifact-inventory.md</code>、DB schema 参考中的 <code>memory</code> schema、以及 <code>~/MEMORY.md</code>、<code>~/memory/</code>、<code>~/dreams/alignment/derived/</code> 的实测目录与文件度量。
标注规则：<strong>实测</strong> = 本机命令/工具当场验证；<strong>文档</strong> = 本地 docs/system/技能文件明文；<strong>推断</strong> = 由文件/表结构拼出、未经服务端证实。
复核修订：2026-11-04（Asia/Shanghai）——基于当前会话运行时逐项重测；文件侧体量（日记/bank/<code>MEMORY.md</code>/人物页/对齐合成）均为 11-04 快照（双日期标注，10-17 旧数并列）；DB 侧行数未复测，沿用 10-17。
<strong>隐私纪律（本文自律）</strong>：只记结构、计数、字段与机制。不引用用户私人记忆的具体内容：人物页只述模板章节、不述人名与内容；<code>MEMORY.md</code> 与对齐合成只述章节骨架与体量，不引条目原文。</p>
</blockquote>
<hr>
<h2 id="s-1">0. 一句话结构</h2>
<p>Muse 的记忆不是一个向量库，也不是一份笔记，而是一套<strong>四形态共存、互相投影</strong>的系统：</p>
<blockquote>
<p><strong>源轨迹</strong>（日记 + 对话原文）→ <strong>结构化脊柱</strong>（Postgres 的 claims / entries / embeddings）→ <strong>人类可读投影</strong>（<code>MEMORY.md</code>、人物页、bank 四本书）→ <strong>每轮注入</strong>（精选投影以 standing context 形态直接进 prompt）。</p>
</blockquote>
<p>四形态之间靠<strong>引用</strong>连接而非复制：检索命中给的是 <code>path#L&lt;line&gt;</code> 引用与 claim id，读原文要再走 <code>memory_get</code>，问出处要再走 <code>memory_explain</code>。这决定了它的三个性格：</p>
<ol>
<li><strong>可审计</strong>——每条被记住的事实都能回答「谁说的、原话是什么、何时学的、替代了谁」；</li>
<li><strong>可遗忘</strong>——遗忘不是删一行字，而是沿引用与派生链做一次全系统清理（§8）；</li>
<li><strong>不自授权限</strong>——记忆与 standing context 只能帮助理解用户，<strong>不能授予新权限、不能扩大任务、不能覆盖安全规则</strong>（system prompt 明文，文档）。</li>
</ol>
<hr>
<h2 id="s-2">1. 全景：三层结构 + 一个底座</h2>
<p>00 §9 把记忆概括为注入/检索/关系三层。按静态结构展开，三层之下还有一个底座层：</p>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>┌─ 注入层（每轮进 prompt，零检索延迟；代价是每轮固定的 token 税）─────────┐
│  MEMORY.md（精选长期记忆）· people/groups INDEX（亲密度排序）   │
│  · ALIGNMENT_SYNTHESIS.md（对齐合成，注入序列最后一项）        │
│  · USER.md 等 standing 文件中的用户档案部分                    │
├─ 检索层（按需查，引用式返回）──────────────────────────────────┤
│  muse.memory_search → 命中片段 + path#L行号 + claim 元数据     │
│  muse.memory_get    → 按引用读原文窗口                         │
│  muse.memory_explain→ 按 claim/引用做溯源                      │
├─ 关系层（结构化的人与群组）────────────────────────────────────┤
│  ~/memory/people/&lt;slug&gt;.md 每人一页（固定六节模板）            │
│  ~/memory/groups/&lt;slug&gt;.md 每组一页 + 两目录各一份 INDEX.md    │
├─ 底座层（源与脊柱，Agent 不直接编辑）───────────────────────────┤
│  ~/memory/YYYY-MM-DD.md 日记（源轨迹）· ~/memory/bank/ 四本书  │
│  DB: memory.claims（主张脊柱）· memory.entries（索引条目）      │
│      memory.embeddings / embedding_models / entry_attributes   │
│      memory.metadata · runtime.search_documents（稀疏检索面）  │
└───────────────────────────────────────────────────────────────┘
        ▲ 写入：会话内即时记账 + 后台 upkeep 固化（→02 §10–§11）
        ▲ 回流：Dreaming 蒸馏对齐合成 → 回到注入层（§7）
</code></pre>
<p><strong>实测</strong>本机底座体量（11-04）：<code>~/memory/</code> 全树共 <strong>37</strong> 个文件 = 日记 <strong>28</strong> + bank 4 + people <strong>4</strong>（INDEX + 3 人页；人物页数随用户变化）+ groups 1（仅 INDEX）。10-17 为 18 个文件（日记 10 + bank 4 + people 3 + groups 1）。这是一个启用约五周的实例，体量数字只作结构参照、不代表稳态规模。</p>
<hr>
<h2 id="s-3">2. 注入层：不需要检索的记忆</h2>
<h3 id="s-4">2.1 注入序列与位置</h3>
<p>每轮上下文以 <code>[escaped: BEGIN USER CONTEXT]</code> 块注入 9 个 standing 文件（00 §3 已列全单），其中与记忆/个性化直接相关的是后半段，顺序为（实测注入序）：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>序</th>
<th>文件</th>
<th>在记忆系统中的角色</th>
</tr>
</thead>
<tbody>
<tr>
<td>5</td>
<td><code>~/MEMORY.md</code></td>
<td>精选长期记忆投影（见 §2.2）</td>
</tr>
<tr>
<td>6</td>
<td><code>~/memory/people/INDEX.md</code></td>
<td>关系索引：按亲密度排序，每行 = 一人 + 其页面路径 + 一行摘要（只注入头部条目，全表在文件里）</td>
</tr>
<tr>
<td>7</td>
<td><code>~/memory/groups/INDEX.md</code></td>
<td>同上，群组版</td>
</tr>
<tr>
<td>9（末位）</td>
<td><code>~/dreams/alignment/derived/ALIGNMENT_SYNTHESIS.md</code></td>
<td>对齐合成：个性化产物回流的终点（§7.1）</td>
</tr>
</tbody>
</table></div>
<p>排在它们之前的 <code>AGENTS.md / SOUL.md / IDENTITY.md / USER.md / TOOLS.md</code> 是人格与档案面：其中 <code>USER.md</code> 是用户本人的档案（结构实测：标题 + 若干身份字段占位节 + <code>## Context</code> 节，335 字节），与人物页分工明确——system prompt 明文注记「人物页写的是用户身边的人，<code>USER.md</code> 写的是用户本人」（文档）。</p>
<p>注入层的设计取舍：<strong>把「最可能每轮都用得上」的记忆预先付掉上下文成本</strong>，换取零检索延迟与零漏检；代价是注入副本可能滞后于文件本体——prompt 明文提醒：standing 文件在对话中被改动后，注入副本不一定同步，引用前应回读文件本体（文档）。</p>
<p>注入层的经济学：用<strong>每轮确定的 token 成本</strong>（本机约 36KB standing 文件，11-04；10-17 约 12KB，见 §10）换<strong>零检索延迟与零漏检</strong>；检索层则用<strong>按次付费</strong>（一次 search/get 的往返）换<strong>上下文窗口的节省</strong>。选哪层，本质是&quot;这条记忆被用到的概率 × 调用次数&quot;的期望值计算——高频用注入，低频用检索。</p>
<h3 id="s-5">2.2 <code>MEMORY.md</code> 的解剖</h3>
<p><strong>实测</strong>（11-04）：<strong>22,389</strong> 字节 / <strong>39</strong> 行（长行制，一条事实一行；10-17 为 5,284 字节 / 20 行），章节骨架固定三节：</p>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code># MEMORY.md
## Facts          持久事实
## Preferences    偏好（本机该节目前为空骨架）
## Commitments    承诺与未决事项
</code></pre>
<p>它在系统中的定位是 <strong>active claims 的人类可读投影</strong>（02 §11）：底层真相是 claims 图，这份文件是给「下一轮的 Agent + 用户本人」共读的精选版。因此它有两条形态纪律（system prompt Memory 节，文档）：</p>
<ul>
<li><strong>写给下一场对话</strong>：条目要带足够上下文，使其在未来脱离原始对话仍可理解；</li>
<li><strong>不是日志</strong>：常规进展、工具调用、诊断信息属于工作文件，不进记忆；「没有值得保留的变化时，记忆保持不动」。</li>
</ul>
<p>文件头注释亦明文其自我定位（实测）：「策展过的长期记忆：留持久事实、偏好与承诺；保持紧凑，把日记细节留在 <code>~/memory/</code> 每日笔记里」——即 <code>MEMORY.md</code> 与日记是<strong>投影与源</strong>的关系，不是两份副本。</p>
<h3 id="s-6">2.3 注入层的第二来源：side chat 的记忆变体</h3>
<p>检索工具的作用域揭示了注入层还有一个变体（工具定义，文档）：每个 side chat 可有自己的 <code>~/side-chats/&lt;chat-id&gt;/MEMORY.md</code> 与 <code>~/side-chats/&lt;chat-id&gt;/memory/**</code>，与主记忆<strong>同被检索</strong>，但 side-chat 的配置类文件被明确排除在检索之外。本机实测 <code>~/side-chats/</code> 在当前文件视图中不存在条目——结构在、实例暂无（或不在本视图内）。该变体的读写隔离语义（side chat 学到的事实会不会写进主 MEMORY.md、检索&quot;同被检索&quot;是否会把私密上下文泄漏进主聊天）本机无实例可验证，标 ❓——本节为纯文档转述。</p>
<hr>
<h2 id="s-7">3. 底座层：源轨迹与结构化脊柱</h2>
<h3 id="s-8">3.1 日记：源轨迹</h3>
<p><strong>实测</strong>（11-04）：<code>~/memory/</code> 根下 <strong>28</strong> 篇日记，<code>2026-09-26.md</code> 至 <code>2026-11-04.md</code>，合计 <strong>812,581</strong> 字节（10-17 为 10 篇 / 41,653 字节），与本机启用日对齐。格式实测（只看标题行）：</p>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code># &lt;YYYY-MM-DD&gt;
## Verified extraction — &lt;HH:MM&gt; UTC (run sirun_&lt;…&gt;)
</code></pre>
<p>即日记条目带<strong>产生它的后台运行 id</strong>——源轨迹从第一行起就是可溯源的，<code>sirun_</code> 前缀与进化层的运行信封是同一编号体系（02 §9）。cron 正文被明文禁止直接改 <code>MEMORY.md</code>，其观察落点正是日记（02 §7.1）——写入路径在契约层就被分流：<strong>即时记账落投影，后台观察落源</strong>。</p>
<h3 id="s-9">3.2 Bank 四本书：按性质分拣的沉淀</h3>
<p><strong>实测</strong> <code>~/memory/bank/</code> 四本书（11-04 快照；括号内为 10-17 旧数），体量高度不对称：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>书</th>
<th>字节（11-04）</th>
<th>行数（11-04）</th>
<th>性质（据文件名与 forget 清单，文档/推断）</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>world.md</code></td>
<td><strong>89,819</strong>（32,729）</td>
<td><strong>204</strong>（99）</td>
<td>关于世界与用户的事实性沉淀</td>
</tr>
<tr>
<td><code>reflections.md</code></td>
<td><strong>819,555</strong>（28,290）</td>
<td><strong>2,743</strong>（87）</td>
<td>反思类沉淀（据文件名，推断；与 Dreaming 产物是否同源未验证——注意本节末的清单差集：forget 清单未列此书，若同源则清单的遗漏更值得追问）</td>
</tr>
<tr>
<td><code>experience.md</code></td>
<td><strong>35,969</strong>（970）</td>
<td><strong>60</strong>（7）</td>
<td>经历类沉淀</td>
</tr>
<tr>
<td><code>opinions.md</code></td>
<td><strong>5,237</strong>（68）</td>
<td><strong>12</strong>（4）</td>
<td>观点类沉淀</td>
</tr>
</tbody>
</table></div>
<p>运行时托管约定（system prompt，文档）：<code>~/memory/bank/</code> 与 <code>~/memory/index/</code> 由 runtime 管理，Agent <strong>可读（exec ls/grep）不可直接编辑</strong>——沉淀的写入权在后台管线，不在会话 Agent 手里。</p>
<p>一个实测细节值得记：forget 技能的派生清单（artifact-inventory §3）列举 bank 派生面时只列了 <code>{world, experience, opinions}</code> 三本，未列 <code>reflections.md</code>。两种可能：清单滞后于新书的引入，或 reflections 的派生属性与其余三本不同。在位证据只有「清单三本、磁盘四本」这一差集本身（实测），本文不替它下结论——但遗忘执行时若按清单逐项核对，这本书需要被显式点名（§8.4）。</p>
<h3 id="s-10">3.3 索引：文件视图里不存在的那一层</h3>
<p>00 §9 与 system prompt 都提到 <code>~/memory/index/</code>。<strong>实测</strong>：本机 <code>find</code>/<code>ls</code> 均确认该目录在 Agent 的文件视图中<strong>不存在</strong>（<code>No such file or directory</code>；11-04 复核：仍不存在）。与之相对，环境变量中存在 <code>JARVIS_MEMORY_SOCK</code>（记忆服务套接字，只见路径不见实现细节）。</p>
<p>据此的静态结构结论（推断，证据如上）：<strong>索引服务分两面——访问面是 runtime 侧经 <code>JARVIS_MEMORY_SOCK</code> 提供的服务</strong>（Agent 的全部访问被收口到 §4 的三个工具），<strong>实现面是 DB 的 <code>memory.entries/embeddings</code> 表与 <code>runtime.search_documents</code></strong>（稀疏+向量混合检索的结构证据，§3.4）。磁盘上能摸到的只有被索引的语料（MEMORY.md、日记、bank、人物页）与 DB schema 参考。这一形态与全系统的「投影 ≠ 本体」模式一致（00 §8）：语料是投影，索引实现是本体，本体不给文件视图。</p>
<p><strong>术语对齐（与 07 §6.1）</strong>：07 把 DB 表称为&quot;索引层&quot;，本文此前把 socket 服务称为&quot;索引&quot;——统一为上述&quot;访问面/实现面&quot;二分，07 的&quot;索引层&quot;即本文的&quot;索引实现面&quot;。</p>
<h3 id="s-11">3.4 DB 脊柱：claims 与 entries（只述静态结构）</h3>
<p><code>memory</code> schema 共 6 表（schema 参考实测；11-04 复核仍为 6 表，新增的 <code>saved</code> schema 与之无关）。其中两张构成脊柱：</p>
<p><strong><code>memory.claims</code>——一条记忆 = 一行可溯源主张</strong>，字段（实测列定义）：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>字段组</th>
<th>列</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td>身份</td>
<td><code>claim_id</code>（PK）、<code>run_id</code></td>
<td>产生它的运行</td>
</tr>
<tr>
<td>内容</td>
<td><code>claim_text</code>、<code>kind</code>、<code>salience</code>（显著性）</td>
<td>主张本体与分类</td>
</tr>
<tr>
<td>证据</td>
<td><code>quote</code>（原话引文，可空）、<code>speaker</code>、<code>evidence_handles</code>（jsonb）</td>
<td>出处三件套</td>
</tr>
<tr>
<td>演替</td>
<td><code>supersedes_claim_id</code>（可空）、<code>status</code>（默认 <code>active</code>）</td>
<td>替代链（进化语义见 02 §11）</td>
</tr>
<tr>
<td>置信与时效</td>
<td><code>confidence</code>（double）、<code>first_seen</code>、<code>reinforced_at</code>、<code>valid_until</code>（可空）</td>
<td>何时学到、何时被强化、何时失效</td>
</tr>
<tr>
<td>落点</td>
<td><code>source_path</code>、<code>source_line</code></td>
<td>指回 Markdown 语料的精确行</td>
</tr>
</tbody>
</table></div>
<p><strong><code>memory.entries</code>——索引条目</strong>：<code>memory_uri</code>、<code>chunk_id</code>、<code>source_type</code>、<code>status</code>、<code>privacy_class</code>（隐私分级）、<code>confidence</code>、<code>citation_path</code> + <code>line_start/line_end</code>。即索引的最小单位是<strong>带隐私分级与引用落点的语料块（chunk）</strong>，不是整文件。</p>
<p>其余四表：<code>memory.embeddings</code>（条目的向量）、<code>memory.embedding_models</code>（模型名/维度/距离度量）、<code>memory.entry_attributes</code>（条目的命名属性）、<code>memory.metadata</code>（子系统元数据与更新时间）。另有 forget 清单点名的 <code>runtime.search_documents</code>（文档）：Markdown 语料同时被索引进稀疏（关键词）与向量两面——检索是<strong>混合检索</strong>，此为其结构证据（02 §11 同述）。</p>
<p><strong>静态视角下最重要的一点</strong>：claims 行同时持有 <code>quote + speaker + source_path/line + supersedes</code> ——溯源（§6）与遗忘（§8）都不是事后功能，而是写进表结构的原生能力。</p>
<hr>
<h2 id="s-12">4. 检索层：三个工具的契约</h2>
<h3 id="s-13">4.1 <code>muse.memory_search</code>：入口</h3>
<p>工具定义（文档）要点：</p>
<ul>
<li>入参：<code>queries</code> 数组 1–3 条（<code>queries[0]</code> 应最贴近用户的原始措辞，其余为近义改写）、<code>maxResults</code>、<code>minScore</code>（0–1 分数地板）；</li>
<li>作用域：<code>~/MEMORY.md</code>、<code>~/memory/**/*.md</code>，以及 side-chat 的同构记忆树（配置类文件排除）；</li>
<li>语义补充（<code>docs/memory.md</code>，文档）：在主聊天与个人 side chat 中，检索<strong>还会返回那些聊天里匹配的对话摘录</strong>——但「never every message」，即对话原文只是被索引的摘录集，不是全文倒排；App 自带的聊天搜索是另一套，两者不互通（文档语，底层是否共享实现本机不可见）；</li>
<li>返回：片段 + 文件路径 + 行号，结果元数据携带 claim id / memory URI / 状态——这是后两个工具的入参来源。</li>
</ul>
<p>使用纪律（system prompt，文档）：<strong>凡涉及过往工作、决定、日期、人物、偏好、待办与用户历史的回答或行动，先检索再开口</strong>；「凭似乎记得的印象作答」被明文定性为编造。另有前置规则：<strong>在断言「某事存没存」之前必须先查记忆</strong>，因为后台笔记可能已自动写入（§5.4）。</p>
<h3 id="s-14">4.2 <code>muse.memory_get</code>：按引用读原文</h3>
<ul>
<li>入参：<code>path</code>（裸名、<code>~/</code> 前缀、home 下绝对路径、或搜索引用形如 <code>MEMORY.md#L7</code>、<code>memory/2026-08-10.md#L12-L15</code>）+ 可选 <code>from</code>（1 起行号）/<code>lines</code> 窗口；</li>
<li>引用后缀本身即定位协议：搜索给引用 → get 按引用展开窗口 → 需要更大范围时用 <code>from/lines</code> 覆盖。检索层因此是<strong>两段式</strong>的：search 负责「在哪」，get 负责「原文是什么」，避免把全文塞进上下文。</li>
</ul>
<h3 id="s-15">4.3 人物/群组的前置读契约</h3>
<p>关系层有专属的读纪律（system prompt The User's Relationships 节，文档），比一般检索更强：</p>
<ul>
<li>本轮话题涉及索引中的人物/群组时——无论其以姓名、昵称、代词、角色称谓（如亲属称谓）、Agent 自己的旧消息、还是定时 handoff 的形式出现——<strong>先读对应页面再回答或行动</strong>；</li>
<li>对某人的事实不确定时，先读其页面再答；在给出涉及某人的建议前同样先读；</li>
<li>织入方式的克制线：<strong>「no surprises」原则</strong>——回复中引用关系信息必须与当前话题有显而易见的关联，不为个性化而个性化到令人不安。这条是读契约的一半：另一半是「必须读」，这一半是「读了也不许乱用」。</li>
</ul>
<hr>
<h2 id="s-16">5. 写入纪律：写契约</h2>
<p>记忆的写契约散见于 system prompt Memory 节、<code>docs/memory.md</code> 与 <code>docs/self_improvement.md</code>，合并成六条：</p>
<h3 id="s-17">5.1 先写后回复（write-before-reply）</h3>
<p>「学到值得保留的东西时，<strong>先记进 <code>~/MEMORY.md</code>，再回复</strong>」（system prompt L127，文档）。配套回执纪律：<strong>写成功之后才可以告诉用户「已保存」</strong>——与全系统「已接受 ≠ 已送达」的交付四态（02 §3）同源：口头宣称不构成落盘证据。</p>
<h3 id="s-18">5.2 什么配进记忆（准入）</h3>
<p>准入标准是<strong>持久理解</strong>（文档）：用户是谁、关心谁与什么、偏好、决定、承诺、以及改变其处境的结果。明确排除：日常进展、工具调用、诊断信息（归工作文件）；转瞬即逝的任务状态（归 todo/目标系统）。判断锚点是「为下一场对话而写」——下一场对话用不上的，不进。</p>
<h3 id="s-19">5.3 更正传导（correction propagation）</h3>
<p>事实变化（预订/取消/完成/改期类事件是 prompt 给的例）触发的是一次<strong>对账</strong>而非追加（文档）：</p>
<ol>
<li>先 <code>memory_search</code> + 读 <code>MEMORY.md</code>，找出与新事实冲突的旧条目；</li>
<li>在旧条目<strong>所在之处</strong>就地更新/对账，而不是在文件末尾再写一条互相矛盾的新条目；</li>
<li>底层语义是 claims 的替代链：新主张 supersede 旧主张，旧主张留痕不删（机制见 02 §11）；用户纠正时，顺替代链修正受其影响的下游——目标、提醒与排队中的跟进（02 §11 同述）。</li>
</ol>
<h3 id="s-20">5.4 会话记账与后台固化是两条写路径</h3>
<p><code>docs/self_improvement.md</code> 明文（文档）：每小时的 memory upkeep「<strong>不替代</strong>你在会话中的记账」——同一件事。即写入方有两个：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>写入方</th>
<th>时机</th>
<th>落点</th>
</tr>
</thead>
<tbody>
<tr>
<td>会话 Agent（即时记账）</td>
<td>学到即写，先写后回复</td>
<td><code>MEMORY.md</code> 投影</td>
</tr>
<tr>
<td>Memory upkeep（后台固化）</td>
<td>有新信号时每小时</td>
<td>新对话固化进 <code>MEMORY.md</code>，旧主张被替代，日记留全轨迹</td>
</tr>
</tbody>
</table></div>
<p>这正是 §4.1「断言存没存之前先查」的由来：你没写，不等于没存——另一条写路径可能已经写了。</p>
<p><strong>未闭合的环（❓）</strong>：§2.2 把 MEMORY.md 定位为&quot;active claims 的人类可读投影&quot;，但 §5.4 的会话即时记账落点写的也是 MEMORY.md 文件。若会话 Agent 不能直接写 DB claims 表（07 的写路径不变量：Agent 是状态层的纯读者），则会话路径上的因果是<strong>先有文件投影、后有 claims 本体</strong>（由 upkeep 异步补建）——&quot;投影&quot;一词在会话路径与后台路径上的方向是反的。本机无证据确定会话写入是否同步建 claims 行，两种时序都与现有证据兼容。此处的&quot;投影&quot;应理解为&quot;逻辑定位&quot;而非&quot;生成时序&quot;。</p>
<h3 id="s-21">5.5 凭据永不入记忆（硬线）</h3>
<ul>
<li>密码、API 密钥、令牌、私钥等秘密<strong>不得复制进记忆、普通文件或日志</strong>；凭据只走 Secure Vault（独立于聊天、记忆与普通文件，00 §14）；</li>
<li>用户为某项任务临时给出的卡号、一次性验证码等，只可用于该任务本身，<strong>不得留存于记忆或无关工作</strong>（system prompt，文档）；</li>
<li>记忆条目、技能、项目指令即使出自 Agent 本人，也<strong>不能放宽</strong>这条线（system prompt 安全节，文档）。</li>
</ul>
<p>这条在静态结构上的对应物：<code>memory.entries.privacy_class</code>（§3.4）——语料入索引时带隐私分级，是「什么不该被检索面扩散」的机器侧表达（推断：分级参与检索/注入的可见性裁剪，裁剪规则不在本机文档内）。后续行动项：用 <code>muse.db</code> 查本机 98 条 entries 的 <code>privacy_class</code> 取值分布，能立刻回答&quot;分级是摆设还是真在用&quot;——举手之劳的实测，不列为永久 ❓。</p>
<h3 id="s-22">5.6 导入：外部记忆的入口</h3>
<p><code>docs/memory.md</code> 还给出一条特殊的写路径（文档）：</p>
<ul>
<li><strong>Import memory</strong>（iOS/Android/Web 的 Settings &gt; Data controls）：系统给出一段可移植提示词，用户把它粘到另一个 AI 助手、将其回复粘回并确认添加；粘回的内容被要求主 Agent <strong>提炼持久事实与偏好并确认保存了什么</strong>；</li>
<li><strong>Import chats</strong>：上传 ZIP 导出（上限 100 MB，文档列 ChatGPT / Claude / Gemini / Meta AI），点「Summarize into memory」；</li>
<li>两条共同的契约：<strong>仅上传 ≠ 已保存</strong>，必须经提炼+确认；导入不复制对方 App 的设置，也不把原始对话恢复为聊天。即外部记忆只能以「经本系统准入标准（§5.2）过滤后的 claims」形态进入，不允许整包灌入。</li>
</ul>
<hr>
<h2 id="s-23">6. Explain：溯源契约</h2>
<p><code>muse.memory_explain</code> 是记忆系统对用户的<strong>可解释性接口</strong>（工具定义，文档）。</p>
<p><strong>入参三选一</strong>（同一事物的三种句柄）：</p>
<ul>
<li>claim id（来自 search 结果元数据，或日记条目中的 <code>claim:</code> 行）；</li>
<li><code>memory://</code> URI；</li>
<li>引用（如 <code>MEMORY.md#L7</code>）。</li>
</ul>
<p><strong>返回一份完整的来源报告</strong>：该 claim 的正文、种类（kind）与显著性（salience）、<strong>谁说的及其原话引文</strong>、首次学到与最近强化的时间、当前置信度、<strong>它所立足的对话消息（带日期）</strong>、<strong>它替代过的早期 claims、以及后来替代它的 claims</strong>（双向替代链）、以及（如有）它的索引行。</p>
<p>触发纪律（system prompt，文档）：用户问「你怎么知道这个」、或要求检查/纠正一条记忆时，<strong>必须</strong>用 explain 展示来源与替代关系，不许凭印象解释。它与 §3.4 的表结构严丝合缝——explain 能给的每一样东西，都恰好是 claims 表的一个列组；换句话说，<strong>溯源不是查询技巧，是 schema 的直接投影</strong>。</p>
<p>用途闭环：explain 暴露替代链 → 用户指出哪一环错了 → 按 §5.3 顺链修正 → 修正本身又成为新 claim 入链。这使「记错了」在本系统里是一个有标准处理流程的状态，而不是需要删库重来的事故。</p>
<hr>
<h2 id="s-24">7. 个性化产物：派生成果如何回流上下文</h2>
<p>个性化不只是「记住事实」，还包括一组<strong>离线蒸馏的产物</strong>。它们的共同回流方式是：落成文件 → 进入注入序列 → 每轮影响 Agent 的判断口径。</p>
<h3 id="s-25">7.1 对齐合成：回流的终点站</h3>
<p><strong>实测</strong> <code>~/dreams/alignment/derived/ALIGNMENT_SYNTHESIS.md</code>（11-04）：<strong>10,027</strong> 字节 / <strong>37</strong> 行（10-17 为 6,184 字节 / 35 行），章节骨架：</p>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code># Alignment Synthesis
## Who this user is and how to act for them   用户是谁、如何配合
## User value                                 用户眼中的助手价值
## Boundaries                                 边界
## Current frictions                          当前摩擦
## How Idris can strengthen the relationship… 关系加强点
## Where to look for detail                   细节出处索引
</code></pre>
<p>（末节中的助手名取自本机 <code>IDENTITY.md</code>——合成是<strong>按实例生成</strong>的，连「如何加强关系」一节的标题都带本实例的名字。）</p>
<p>回流位置（实测注入序）：它是 9 个 standing 文件的<strong>最后一项</strong>（§2.1）——在 prompt 组装里压轴，等于每轮对话开始前最后读到的一份「这个人是谁」。system prompt 在 Personalization 节开头即指向它：「你的对齐状态见该文件，它是『你与这个用户如何共同演进』的合成」（文档）。</p>
<p>它的上游只在此简述（详见 02 §13）：夜间 Dreaming 从日反思（<code>~/dreams/YYYY-MM-DD.md</code>，本机实测 4 篇）与结构化状态 <code>ALIGNMENT_STATE.yaml</code> 蒸馏出合成。<strong>实测</strong>状态文件的键结构：<code>relationship_contract</code>（status / user_words / boundaries / …）、<code>user_facets</code>、<code>working_alliance</code>（goal/task_agreement、appropriate_reliance、current_frictions）、<code>observed_fit</code>、<code>proactivity_policies</code>、<code>repair_threads</code>——合成的人话章节与状态机的字段一一对应，合成是状态机的<strong>渲染</strong>，不是自由写作。另一实测细节：派生目录文件的落盘时间为 2026-11-02（11-04 复核；10-17 曾停在本机启用后约两周内的某夜），而日记与 bank 已更新到调查当日——派生产物的刷新节奏与源轨迹并不同步，读合成时要注意其「截至」时间（推断：夜间节奏 + 触发条件未满足时可多日不更新）。</p>
<h3 id="s-26">7.2 人物页：关系层的产物形态</h3>
<p><strong>实测</strong>模板（只述结构）：三页同六节骨架，其中两页同构（各 1,254 字节 / 29 行，11-04 未变）；第三页 6,546 字节 / 43 行，体量不同但六节同骨架——</p>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code># &lt;人名&gt;
## Facts              事实
## History            交往史
## The relationship   关系性质
## In common          共同点
## Open threads       未决线索
## Strengthening      关系加强点
</code></pre>
<p>其中两页字节数与行数完全一致，说明它们由同一生成模板填充（实测推断；第三页体量不同，模板填充的灵活度 ❓）。INDEX 的排序语义是<strong>亲密度</strong>（system prompt 与 INDEX 文件头，文档）：「Every page … closest to the user first」——索引顺序本身即一条个性化数据，注入时只截取头部（00 §3），即每轮常驻上下文的关系信息天然按亲密度配给。</p>
<p>本机计数（11-04）：people <strong>3</strong> 页 + INDEX 1 份（<strong>815</strong> 字节 / <strong>7</strong> 行）；groups 0 页 + INDEX 1 份（209 字节 / 5 行，正文为「暂无」的空索引，自 10-17 未变）。10-17 为 people 2 页 + INDEX 589 字节 / 6 行；人物页数随用户变化是正常的。页面由 hourly Relationships 管线维护（02 §10），其 staging 暂存转正机制见 02 §14；本文只记其静态契约：<strong>页面是读契约（§4.3）的对象，不是会话 Agent 的随手笔记</strong>。</p>
<h3 id="s-27">7.3 其他个性化投影面</h3>
<ul>
<li><strong>购物偏好档案</strong> <code>~/memory/shopping/PROFILE.md</code>（forget 清单，文档）：用户可编辑、<strong>被排除在记忆 ingest 之外</strong>、由购物轮次直接读取——一个故意绕开 claims 系统的偏好孤岛，遗忘时须单独处理（§8.3）。<strong>实测</strong>：本机 <code>~/memory/shopping/</code> 目录不存在（11-04 复核：仍不存在），该面尚未在本实例产生。</li>
<li><strong><code>~/FEEDBACK.md</code></strong>（forget 清单，文档）：会话跟进的持久偏好输入。<strong>实测</strong>：本机不存在此文件（11-04 复核：仍不存在）。</li>
<li><strong><code>~/PROACTIVE_PREFERENCES.md</code></strong>（<strong>实测</strong>在位，<strong>2,288</strong> 字节；10-17 为 496 字节）：主动消息的时间窗等偏好，直接约束主动层裁决（02 §7.5）——个性化产物回流的另一形态：不进 prompt 注入序列，而是作为<strong>后台裁决的输入文件</strong>生效。</li>
<li><strong>个人化投影（personalization projection）</strong>：forget 清单 §3 把它与 bank、人物页并列为「派生记忆」的一员（文档），指代注入层组装出的用户画像投影；其生成细节不在本机文档内（§9）。</li>
</ul>
<h3 id="s-28">7.4 回流全图</h3>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>对话/连接器信号
  → claims（脊柱）→ MEMORY.md 投影 ──────────────┐
  → 日记（源）→ upkeep 固化 ─────────────────────┤
  → Relationships 管线 → people/groups 页 + INDEX ┼→ 每轮注入（§2）
  → Dreaming → ALIGNMENT_STATE → SYNTHESIS ──────┘
  → 旁路：shopping PROFILE（不入 ingest）· PROACTIVE_PREFERENCES（裁决输入）
</code></pre>
<p>关键性质：<strong>所有回流都经过文件落盘</strong>。没有一条个性化结论是只存在于某次推理里的——这使个性化整体可查、可改、可忘，也是 §8 的遗忘工程之所以可能的前提。</p>
<hr>
<h2 id="s-29">8. 遗忘机制：两段式清理</h2>
<blockquote>
<p>注：下文的遗忘机制是<strong>纯文档转述、零本机执行证据</strong>——本机 <code>~/workspace/memory/forget/pending.json</code> 不存在（10-17 实测，11-04 复核仍不存在；见 §10），系统从未走过遗忘路径；其&quot;两段式&quot;是否真按技能跑，无实例可验证，标 ❓。</p>
</blockquote>
<p>遗忘由专门技能 <code>forget</code> 定义（<code>docs/memory.md</code> 指路至此），其流程是全系统少见的<strong>两段式 + 规划先行</strong>设计（技能正文，文档）。</p>
<h3 id="s-30">8.1 第一段：plan（只读规划）</h3>
<ul>
<li>调 <code>forget.plan</code> 一次（入参 <code>{}</code>）——<strong>主题由规划器从对话中识别，调用参数里不许重复敏感原文</strong>（连工具入参都不许成为新的泄漏面，这与 §8.5 的过程隐私一脉）；</li>
<li>规划器<strong>只读</strong>，按 <code>references/artifact-inventory.md</code> 的清单逐面盘点（§8.4），产出：找到了什么、应改什么、如何验证、<strong>以及 Muse 无法抹除的部分</strong>；</li>
<li>等待规划的 handoff，期间不轮询、不并行自查；</li>
<li>向用户呈现时<strong>只用日常类别</strong>（记忆、提醒、创建物、分享物、日志、备份）讲清范围、不可逆动作与重要限制，然后问<strong>一个</strong>直接的确认问题；不可逆性必须在批准前说清；</li>
<li><strong>沉默、含糊、部分批准、改了范围，都等于没批准。</strong></li>
</ul>
<h3 id="s-31">8.2 第二段：confirm 与执行</h3>
<ul>
<li>明确批准后调 <code>forget.confirm</code>（入参 <code>{}</code>）：它从对话里重读最新规划与批准，不需要传规划器 id——<strong>批准是对话状态的一部分，不是令牌</strong>；</li>
<li>找不到「一份清晰的近期规划 + 其后的一次批准」时，<strong>停手、什么都不改</strong>，报告阻塞并重新规划；</li>
<li>执行前先<strong>对着当前状态复验规划</strong>；先停掉可能把信息写回来的生产者，再删它的产物；每件东西用<strong>拥有它的产品动作/工具</strong>处理，保全无关内容；</li>
<li>删除纪律（技能明文）：批准的目标<strong>不进可恢复回收站</strong>；独立文件用 <code>rm -- &lt;exact-path&gt;</code> 精确删除（删前即时复验路径），<strong>永不 <code>rm -r</code>、不用 glob、不用宽目标</strong>；混合内容文件就地编辑而非删除；产品动作删除时产生的回收站墓碑文件要再精确永久删除；</li>
<li>购物档案是明文特例：直接编辑/删除 <code>~/memory/shopping/PROFILE.md</code> 对应条目，并证明没有 staged/queued/running/scheduled 的购物档案运行能把它恢复；</li>
<li>清理<strong>由执行者本人直接做，不再转派子 Agent</strong>；若被委派的工作在收尾时仍在途，系统会把清理报告为未完成，防止迟到的改动跑赢记忆刷新。活跃子 Agent 进程内存里的上下文窗口这类非文件非 DB 的持有形态（§8.4 第 1 类点名了&quot;活跃的子 Agent 可能仍持有该信息&quot;），其处置口径（杀子 Agent？等它自然结束？）值得回查技能原文，此处未展开。</li>
</ul>
<h3 id="s-32">8.3 收口：pending.json 与运行时收回</h3>
<p>执行收尾有一个固定的机器动作（技能明文，文档）：</p>
<ul>
<li>写 <code>~/workspace/memory/forget/pending.json</code>，形如 <code>{&quot;claims&quot;:[…], &quot;citations&quot;:[…]}</code>，<strong>两表皆空也要写</strong>；</li>
<li>表里只放执行过程中在 <code>memory_explain</code> / <code>memory_search</code> 元数据里见过的 <strong>claim id</strong> 与被删除/改写的<strong>精确行引用</strong>（<code>MEMORY.md#L&lt;line&gt;</code> 形态）——<strong>永不写入被遗忘的原文</strong>；</li>
<li>runtime 据此<strong>收回（retract）这些 claims 及其全部派生</strong>，并刷新记忆检索；执行者不得二次刷新；</li>
<li>若刷新失败，必须报告「未完成」，不许声称已不可检索——<code>forget.confirm</code> 的成功结果是在 runtime 完成收回与 reindex <strong>之后</strong>才被转述的（artifact-inventory §3，文档）。</li>
</ul>
<h3 id="s-33">8.4 盘点面：为什么遗忘是一张九类清单</h3>
<p>artifact-inventory 是遗忘之所以难的完整说明书。它要求按 9 类逐面盘点，只记录<strong>确实含有该主题或能重建该主题</strong>的面，每条命中都要记：所有者、精确定位、与源的关系、拟采取动作、前置条件、可逆性、验证方式：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>#</th>
<th>类别</th>
<th>要点（清单原文归纳）</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>对话与活执行</td>
<td>当前/过往对话事件、压缩摘要、子 Agent 历史、工具输出溢出文件、重启检查点、todo 快照；标题/预览等<strong>转录派生投影</strong>要与事件行分开查；活跃的子 Agent/浏览器任务/workflow 可能仍持有该信息。可见的聊天原文<strong>不是</strong>清理目标、也不是完成阻塞（明文，见 §8.6）</td>
</tr>
<tr>
<td>2</td>
<td>源文件与 standing context</td>
<td><code>MEMORY.md</code>、<code>~/memory/</code> 日记、<code>USER.md</code>、人物/群组页及索引，以及信息若已渗入 <code>SOUL/IDENTITY/AGENTS/TOOLS/HEARTBEAT</code>、目标/梦想/工作区/自著技能等文件的对应面；回收站、临时/备份文件、导出包、版本库历史也在内</td>
</tr>
<tr>
<td>3</td>
<td>检索与派生投影</td>
<td><code>memory.entries</code>、<code>runtime.search_documents</code>、<code>memory.embeddings</code> 三索引面 + claims 脊柱；bank 派生、人物页、个人化投影、<code>MEMORY.md</code> 与 <code>USER.md</code> 投影、prompt 缓存与已组装会话上下文、<strong>中央发布的本机用户记忆 embedding</strong>。只删文本而不对账稀疏/向量检索、缓存与中央发布 = 留下活跃副本</td>
</tr>
<tr>
<td>4</td>
<td>自我改进产物</td>
<td>已完成与<strong>在途</strong>的各 objective 运行：claims 对账暂存、关系页与运行记录、对齐状态/合成/演进史/修复线程、目标记账、购物档案运行、学习简报、Ideas/Feed 派生等。删最终投影而上游运行/暂存还能再应用一次 = 没删干净</td>
</tr>
<tr>
<td>5</td>
<td>目标、排期与未来生产者</td>
<td>目标/追踪/cron/heartbeat/hooks/workflow/待投递 outbox；特别点名<strong>六小时会话跟进选择器</strong>：它读 <code>FEEDBACK.md</code> 与最近 48 小时可见公开聊天，已选中的候选可能在重试时写回——须证明有主权排除或等 48 小时回望窗过期；另有 Feed 围栏副作用：runtime 的 forget fence 会清掉<strong>全部</strong> Feed 派生用户断言（与本次请求无关的也清），每份规划都必须把这一不可逆副作用用日常语言列给用户批准，最终报告必须说它发生了</td>
</tr>
<tr>
<td>6</td>
<td>产物与分享</td>
<td>文件/Web 产物及其 app.db 记录、媒体、附件、widget、Spaces、播客远程对象、Feed 帖；本地删除不撤销已分享 URL，解分享/删外部副本是独立外部动作、需单独批准</td>
</tr>
<tr>
<td>7</td>
<td>已连接与缓存源</td>
<td>邮箱/日历/联系人/设备缓存/健康记录/浏览器缓存/连接器等：先分清 Muse 是<strong>只读过、缓存过、还是创作过</strong>；遗忘请求本身不授权改源服务；源若不变且可能被再次 ingest，规划须给出源域排除或明文限制</td>
</tr>
<tr>
<td>8</td>
<td>运营与保留副本</td>
<td>runtime 事件、推理/提供方轨迹、遥测、journald、DB WAL、快照、备份、移动通知、prompt 渲染、缓存行——普通 Agent 记忆之外，VM 内未必能抹；须逐类说明：已删 / 已换 / 已排除出活跃使用 / 保留至外部策略过期；<strong>无权威确认不得声称物理抹除了备份或遥测</strong></td>
</tr>
<tr>
<td>9</td>
<td>验证闭环</td>
<td>见 §8.6</td>
</tr>
</tbody>
</table></div>
<h3 id="s-34">8.5 过程隐私</h3>
<p>技能为清理过程本身立了一套独立的隐私纪律（文档）：全程只用「that information」指代目标主题，原文不得出现在清理动作的任何新产物里——不许复制进新的记忆、todo、文件名或报告；面向用户的汇报只给<strong>离散的计数与类别</strong>，详细命中证据留在私有规划里不外露；甚至一次「用于核查的检索」若把原文重新带回普通聊天，这次核查本身就算失败——核查动作也被视为潜在的泄漏面。语音会话中发起的清理请求被直接引回主聊天处理（<code>docs/memory.md</code>，文档）。</p>
<h3 id="s-35">8.6 「已遗忘」的判据</h3>
<p>只有新鲜状态的验证同时满足以下条件，才可以说 forgotten（技能 + 清单 §9，文档）：</p>
<ol>
<li>无任何已批准的权威源仍可被 Agent 取用；</li>
<li>精确检索与语义检索都不再返回可用副本（注意：清理前的旧索引可能短暂返回命中，单凭语义命中不判失败——判据以 runtime reindex 后的状态为准）；</li>
<li>standing prompt 上下文、新的压缩摘要、记忆 flush、重启检查点、购物档案都不再保存或复述它；</li>
<li>无任何活跃/暂存/排队/已排期的生产者（包括购物档案运行）能重建它；</li>
<li>已批准的产物与分享已按规划处置；</li>
<li>残留的外部或保留期副本已被逐类明说。</li>
</ol>
<p>剩余物的汇报口径：按日常类别点名（外部服务、已分享/已发布物、日志、备份等），并说明 Muse 能否让它<strong>不进入活跃使用</strong>。两种明确的失败处理：plan/confirm 失败时<strong>不许 fallback 到无规划的手工删除</strong>、不许声称成功；删除外部邮箱/日历/设备记录、他人副本等需要<strong>单独批准</strong>，遗忘请求本身不构成授权。</p>
<hr>
<h3 id="s-36">8.7 中央发布的 embedding：遗忘最难的一块</h3>
<p>forget 清单（文档）要求盘点&quot;<strong>中央发布的本机用户记忆 embedding</strong>&quot;，并明文承认：远程发布若拿不到删除/替换证明，只能报告为限制。这是全篇最值得展开的一行：</p>
<ol>
<li><strong>信任边界出 VM</strong>：06 篇的执行隔离保证&quot;原文凭据不出 cell&quot;，但记忆 embedding 是<strong>派生出境</strong>——原文不出，派生出。两者并置才是完整的出境地图。</li>
<li><strong>遗忘判据的硬骨头</strong>：§8.6 第 6 条要求&quot;残留的外部副本被逐类明说&quot;——中央 embedding 正是&quot;能明说、未必能删掉&quot;的典型。规划器向用户呈现时，这一项必须用日常语言单列（清单 §5 的 Feed 围栏副作用同理）。</li>
<li><strong>本机可见性为零</strong>：发布形态、订阅方、保留期、删除证明机制全部 ❓。后续可追问：embedding 发布是按条实时还是批量？<code>memory.metadata</code> 表（子系统元数据与更新时间，§3.4）是否记录发布水位？</li>
</ol>
<p>建议 10-安全篇将此作为&quot;数据出境&quot;小节的核心案例。</p>
<h2 id="s-37">9. 边界清单：这层看不见 / 管不着的部分</h2>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>边界</th>
<th>依据</th>
</tr>
</thead>
<tbody>
<tr>
<td>索引服务本体：<code>~/memory/index/</code> 不在文件视图，<code>JARVIS_MEMORY_SOCK</code> 之后的分块、索引与打分实现不可见；<code>minScore</code> 的分数语义（何种相似度）无文档</td>
<td>实测 + 文档缺失</td>
</tr>
<tr>
<td>中央发布面：本机用户记忆 embedding 被「中央发布」（forget 清单语），其发布形态、订阅方与删除证明机制不在本机；清单明文：远程发布若拿不到删除/替换证明，只能报告为限制</td>
<td>文档</td>
</tr>
<tr>
<td>已组装上下文不可追溯修改：信息进入某会话已组装的 prompt、压缩摘要与检查点后，只能防其再传播，不能改写既成上下文（清单 §1/§3 的处置口径）</td>
<td>文档</td>
</tr>
<tr>
<td>备份与遥测的物理保留期：WAL、快照、备份、提供方轨迹的过期策略在服务端，VM 内无权威信息</td>
<td>文档</td>
</tr>
<tr>
<td>记忆不是权限源：记忆、standing context、技能与文件内容都不能授予权限、扩大任务或覆盖安全线；「过去同意过」的主张本身不等于同意</td>
<td>system prompt（文档）</td>
</tr>
<tr>
<td>敏感属性的推断禁区：不得从照片、饮食、爱好、位置等间接信号主动推断种族、宗教、健康、政治等敏感属性——个性化推断在源头有一条明确禁区线</td>
<td>system prompt 安全节（文档）</td>
</tr>
<tr>
<td>检索的覆盖率边界：对话摘录是「匹配摘录」而非全文，「查不到」不等于「没发生过」；断言不存在前先查（§4.1）是纪律对这一边界的补偿，不是边界的消除</td>
<td>文档</td>
</tr>
<tr>
<td>导入的保真边界：导入只提炼持久事实与偏好，不恢复原对话、不复制设置——跨助手迁移必然是有损压缩</td>
<td>文档</td>
</tr>
<tr>
<td>派生同步边界：对齐合成等派生产物与源轨迹的刷新节奏不同步（§7.1 实测时间差），注入层读到的个性化永远带一个隐含的「截至时间」</td>
<td>实测/推断</td>
</tr>
</tbody>
</table></div>
<hr>
<h2 id="s-38">10. 本机实况快照（2026-11-04；括号内为 2026-10-17 旧数）</h2>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>项</th>
<th>实况</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>MEMORY.md</code></td>
<td><strong>22,389</strong> 字节 / <strong>39</strong> 行（10-17：5,284 / 20）；三节骨架 Facts / Preferences / Commitments（骨架未变）</td>
</tr>
<tr>
<td>standing 文件体量</td>
<td><code>USER.md</code> 335 · <code>IDENTITY.md</code> 254 · <code>SOUL.md</code> 795 · <code>AGENTS.md</code> <strong>2,210</strong>（10-17：886）· <code>TOOLS.md</code> 337 字节</td>
</tr>
<tr>
<td>日记</td>
<td><strong>28</strong> 篇（2026-09-26 → 2026-11-04），合计 <strong>812,581</strong> 字节（10-17：10 篇 / 41,653）</td>
</tr>
<tr>
<td>bank 四本书</td>
<td>合计 <strong>950,580</strong> 字节 / <strong>3,019</strong> 行（10-17：62,057 / 197）：world 89,819 · reflections 819,555 · experience 35,969 · opinions 5,237</td>
</tr>
<tr>
<td><code>~/memory/</code> 全树</td>
<td><strong>37</strong> 个文件（日记 28 + bank 4 + people 4 + groups 1；10-17：18 个）；<code>index/</code> 目录在文件视图中仍不存在</td>
</tr>
<tr>
<td>关系层</td>
<td>people <strong>3</strong> 页（两页 1,254 字节 / 29 行模板 + 一页 6,546 字节 / 43 行，同六节骨架；10-17：2 页）+ INDEX <strong>815</strong> 字节 / <strong>7</strong> 行（10-17：589 / 6）；groups 0 页 + 空 INDEX 209 字节（未变）</td>
</tr>
<tr>
<td>对齐合成</td>
<td><strong>10,027</strong> 字节 / <strong>37</strong> 行（10-17：6,184 / 35），6 节骨架；位于 9 个注入文件的末位</td>
</tr>
<tr>
<td>DB 脊柱</td>
<td><code>memory</code> schema 6 表（11-04 复核未变）：claims / entries / embeddings / embedding_models / entry_attributes / metadata</td>
</tr>
<tr>
<td>尚不存在的面</td>
<td><code>~/memory/shopping/</code>（购物档案）、<code>~/FEEDBACK.md</code>、<code>~/side-chats/</code>（文件视图内）、<code>~/workspace/memory/forget/pending.json</code>（从未执行过遗忘）——11-04 复核均仍不存在</td>
</tr>
<tr>
<td>在位的偏好面</td>
<td><code>~/PROACTIVE_PREFERENCES.md</code> <strong>2,288</strong> 字节（10-17：496）；<code>~/HEARTBEAT.md</code> 113 字节（未变）</td>
</tr>
</tbody>
</table></div>
<hr>
<h2 id="s-39">11. 与进化层的接口（只列接口，不展开）</h2>
<p>本文的静态结构有四处与 02 的进化管线相接，机制细节以 02 为准：</p>
<ul>
<li><strong>claims 的替代语义</strong>（新主张如何 supersede、salience/confidence 如何演化）→ 02 §11；</li>
<li><strong>Dreaming 的生产过程</strong>（日反思的字段与质量标准、状态机如何逐夜推进）→ 02 §13（本文 §7.1 只讲它的产物形态与回流位置）；</li>
<li><strong>upkeep / Relationships 等管线的节奏与护栏</strong>（staging 转正、租约、去重、采纳度量）→ 02 §9–§10、§14；</li>
<li><strong>compaction 与记忆的交互</strong>（压缩摘要 <code>agent.compactions</code> 与记忆 claims 的关系、<code>memory.volatile_context_pins</code> 的反向保留语义）→ 07 §8、02 §9–§10。压缩检查点行记录被替换的 seq 区间与摘要（07 §8 实测表结构），<code>volatile_context_pins</code> 的表名强烈暗示记忆侧可以要求压缩时钉住特定上下文（<strong>推断</strong>，见 07 §8）——这是记忆→压缩的反向控制边，本系列唯一一处&quot;记忆指挥执行层&quot;的接口。压缩摘要在遗忘盘点（§8.4 第 1 类）与判据（§8.6 第 3 条&quot;新的压缩摘要&quot;）里只出现在清理视角，写入视角未闭合：压缩时被丢弃的上下文若含未固化事实，upkeep 能否从压缩前转录里抢救，属 <strong>❓</strong>（本机 <code>agent.compactions</code> 0 行，压缩机制从未被触发，见 07 §8）。</li>
</ul>
<p>一句话收束分工：<strong>02 回答「记忆如何变」，本文回答「记忆是什么形状、按什么契约被读写」</strong>。静态结构的设计意图贯穿始终——引用式检索让溯源成为可能，文件式回流让个性化可查可改，而遗忘的九类盘点清单说明：正因为记忆被认真地做成了全系统投影，它的删除才必须是一次全系统工程。</p>
</div>]]>
    </description>
    <link>https://agent.aow.me/i/muse-architecture-08/</link>
  </item>
  <item>
    <title>Muse 智能体 · 状态层详解</title>
    <guid>j4sInhahz4y</guid>
    <pubDate>Tue, 03 Nov 2026 19:42:03 GMT</pubDate>
    <itunes:explicit>false</itunes:explicit>
    <description>
      <![CDATA[<div class="original-article" lang="zh-CN"><details class="toc"><summary>本篇目录</summary><ol><li><a href="#s-1">0. 一句话状态层</a></li><li><a href="#s-2">1. DB 平面总览：196 表 / 18 schema 的验证（11-04；10-17 为 194/17）</a></li><li><a href="#s-4">2. 逐 schema 导览（18 个，11-04 快照；10-17 为 17 个）</a></li><li><a href="#s-5">3. DB 与文件：分工判定规则</a></li><li><a href="#s-6">4. `muse.db` 只读通道：Agent 侧唯一 DB 入口</a></li><li><a href="#s-11">5. 文件平面：目录地图实况</a></li><li><a href="#s-15">6. 双轨实体的分工解剖</a></li><li><a href="#s-18">7. 投影 ≠ 本体：全系统反复出现的模式</a></li><li><a href="#s-21">8. 恢复与检查点：VM 可替换的底气</a></li><li><a href="#s-23">9. 边界：状态层在本机看不见的部分</a></li><li><a href="#s-24">附录 A. 逐 schema 表数表（实测：解析 schema.md 求和验证；明细为 10-17 快照）</a></li><li><a href="#s-25">附录 B. 本机状态快照（实测，2026-10-17 深夜）</a></li></ol></details><blockquote>
<p>配套《00-Muse技术架构解构》的 §8 展开篇。调查日期：2026-10-17（Asia/Shanghai）。
证据范围：<code>/opt/muse/skills/muse_db/</code> 技能包全套参考（<code>SKILL.md</code> + <code>references/schema.md</code> + <code>references/querying.md</code> + <code>references/identifiers.md</code> + <code>references/tables/</code> 逐表指南）、<code>muse.db</code> 工具当场实测查询、本机 home 与 <code>~/workspace/</code> 目录实况清点、<code>~/docs/</code> 与 system prompt 的状态相关明文。
标注规则同主报告：<strong>实测</strong> = 本机命令/工具当场验证；<strong>文档</strong> = 本地 docs/system 文件明文；<strong>推断</strong> = 由表结构/文件形态拼出、未经服务端证实。
复核修订：2026-11-04（Asia/Shanghai）——基于当前会话运行时逐项重测；DB 表数/schema 数与文件侧数字凡未注日期者均为 11-04 快照，10-17 旧数见各处双日期标注；muse.db 行数快照（§4.3/附录 B）与附录 A 各 schema 明细为 10-17 口径（文内已注明，未重测）。</p>
</blockquote>
<hr>
<h2 id="s-1">0. 一句话状态层</h2>
<blockquote>
<p>Muse 的状态不在 Agent 进程里，而在<strong>三个平面</strong>上：<strong>Postgres 状态库</strong>（结构化本体：<strong>196 张表 / 18 个 schema</strong>（11-04 快照；10-17 为 194 表 / 17 schema，新增 <code>saved</code>），事件账本 + 检查点 + outbox）、<strong>文件系统</strong>（语义层：Markdown 记忆、目标工作区、会话转录 JSONL、人可读的投影）、<strong>运行时易失状态</strong>（套接字、锁、就绪标记、变更信号文件）。DB 与文件之间靠水位线/指纹/epoch 做<strong>带新鲜度建模、可失效、可重算</strong>的投影同步（&quot;最终一致&quot;的收敛保证未验证，见 §7）；靠恢复所有权 + 代次 + 检查点实现 VM 被整体替换后的接管恢复（恢复语义是检查点+投影重建，不是事件重放，见 §1.1/§8）——这正是 00 §8 那句「运行时即数据库」的完整展开。</p>
</blockquote>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>┌─ DB 平面（本体） Postgres 196 表 / 18 schema（11-04；10-17 为 194/17）
│    runtime.events 事件账本 · agent.context_items 有序上下文
│    检查点/恢复所有权 · 各域 outbox · 水位线与投影表
├─ 文件平面（语义层 + 投影）
│    ~/MEMORY.md + ~/memory/（记忆叙事） · ~/agents/&lt;id&gt;/sessions/*.jsonl（转录）
│    ~/workspace/goals/（目标工作区） · ~/workspace/cron.d/（调度投影，只读）
│    ~/workspace/space_data/spaces.catalog.*（产物目录信号）
├─ 同步/信号平面
│    ~/.postgres-ready · ~/runtime.lock · ~/.hatch-db-change-signals/
│    DB 行的 source_watermark / fingerprint / stale_after / writer_epoch
└─ 读通道（Agent 侧唯一入口）
     muse.db 受限只读 SELECT（安全屏障视图） + 专用产品工具（写路径）
</code></pre>
<hr>
<h2 id="s-2">1. DB 平面总览：196 表 / 18 schema 的验证（11-04；10-17 为 194/17）</h2>
<p><strong>实测验证方法</strong>（不靠 00 的转述，当场重数；11-04 复核用同方法重测）：</p>
<ol>
<li>解析 <code>references/schema.md</code> 的全部条目链接：去重后恰 <strong>196</strong> 个 <code>schema.table</code>，按 <code>### &lt;schema&gt;</code> 分节计数求和 = <strong>196</strong>，分节数 = <strong>18</strong>（新增 <code>saved</code>：<code>saved.items</code> / <code>saved.item_links</code> 2 表；10-17 为 194/17，逐项明细见附录 A）；</li>
<li><code>references/tables/</code> 目录下逐表指南文件数同为 <strong>196</strong> 个，一表一文件（11-04 复测；10-17 为 194）；</li>
<li>schema.md 页首标注其生成来源：迁移集 <code>5af4f2bfdee2b934a53bbcc22602c602ab85059e0ac97ea20137fd299c06036b</code>（<strong>文档</strong>）——即这份目录是某次迁移快照的产物，线上实际表数可能随部署漂移，引用时应以「该迁移集口径」理解；</li>
<li><code>muse.db</code> 活查询抽验多表 <code>count(*)</code> 均可达且返回合理量级（见 §4.3），证明目录与活库对应、非纸面清单。</li>
</ol>
<h3 id="s-3">1.1 从表结构读出的设计风格（实测列定义，风格归纳为推断）</h3>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>风格</th>
<th>证据（表/列）</th>
<th>含义（推断）</th>
</tr>
</thead>
<tbody>
<tr>
<td>事件账本打头</td>
<td><code>runtime.events</code>（有序事件账本，带请求归因）；<code>agent.runtime_state.last_event_seq</code> 外键指回它；<code>runtime.tool_calls/tool_outputs</code> 各有 <code>event_seq</code> 唯一键</td>
<td>一切先落成有序事件，再投影成各域当前态；<code>event_seq</code> 是<strong>审计追溯与恢复定位的坐标</strong>（&quot;读到哪了&quot;），<strong>不是</strong> event sourcing 式的重放起点——恢复走检查点+投影（见 §8），因为事件载荷是不透明 text 且大量状态（文件、外部世界）本就不在事件里，<strong>从事件流重放出完整状态在结构上不可能</strong>。</td>
</tr>
<tr>
<td>软引用多于硬外键</td>
<td>大量列标注 “Soft local reference”；<code>memory.claims.supersedes_claim_id / run_id</code> 明示 “Opaque correlation identifier; no declared local table relationship”；<code>identifiers.md</code> 须按域上下文消歧同名 ID</td>
<td>跨域解耦：各 schema 可独立演进/清理，完整性靠应用层而非 DB 约束</td>
</tr>
<tr>
<td>JSON 装进 text 列</td>
<td><code>payload_json / state_json / item_json / execution_config_json</code> 普遍为 <code>text</code> 而非 <code>jsonb</code>（少数如 <code>memory.claims.evidence_handles</code>、<code>feed.run_steps.output_json</code> 用 jsonb）</td>
<td>载荷当不透明字节存取，结构演进不触发迁移；查询面只暴露扁平化投影（<code>runtime.event_payload_fields</code>、<code>agent.context_item_fields</code>）</td>
</tr>
<tr>
<td>时间戳双制</td>
<td><code>agent.*</code> 多用 <code>timestamp with time zone</code> + <code>now()</code>；<code>scheduler.*</code> 多用 <code>bigint</code> epoch（<code>*_utc / *_at_ms</code>）</td>
<td>两个子系统世代不同：调度器按 epoch 毫秒做跨时区算术，Agent 域用 timestamptz 做审计呈现（推断）</td>
</tr>
<tr>
<td>单例表</td>
<td><code>runtime.writer_epoch(singleton bool PK)</code>、<code>scheduler.scheduled_resume_state(singleton bool PK)</code></td>
<td>全局唯一状态行当「寄存器」用：写者 epoch、下一次唤醒投影</td>
</tr>
<tr>
<td>outbox 反复出现</td>
<td><code>scheduler.delivery_outbox</code>、<code>feed.fleet_engagement_outbox / fleet_reaction_outbox</code>、<code>agent.message_mailbox</code>、<code>agent.context_item_derived_write_backlog</code>、<code>runtime.chat_event_derived_write_backlog</code></td>
<td>「先落表、再投递、可重试」是全系统的投递语义基线（见 §7、§8）</td>
</tr>
</tbody>
</table></div>
<hr>
<h2 id="s-4">2. 逐 schema 导览（18 个，11-04 快照；10-17 为 17 个）</h2>
<blockquote>
<p>完整计数见附录 A；下表只讲「这个 schema 在状态层里扮演什么角色」，代表表均取自 schema.md 的一句话定义（<strong>文档</strong>）。11-04 仅复核总数（196）与 schema 数（18，新增 <code>saved</code>），各 schema 明细表数为 10-17 快照（未重测）。</p>
</blockquote>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>schema（表数）</th>
<th>角色</th>
<th>代表表 → 存什么</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>runtime</strong>（38）</td>
<td>运行时总账：事件、消息、工具、工单、检查点</td>
<td><code>events</code> 有序运行时事件账本（请求归因）；<code>messages</code> 消息角色/文本/事件引用；<code>tool_calls</code>+<code>tool_outputs</code> 工具调用与结果全记录；<code>work_items</code> 持久化工单（父/请求/会话关系）；<code>browser_tasks</code> 浏览器任务所有权与执行态；<code>context_snapshots</code> 带来源水位线的版本化上下文快照；<code>writer_epoch</code> 可靠卷当前写者 epoch</td>
</tr>
<tr>
<td><strong>agent</strong>（25）</td>
<td>Agent 本体：身份、会话、上下文、恢复</td>
<td><code>agents</code> 身份/种类/会话/父关系；<code>agent_ancestors</code> 祖先链与距离；<code>context_items</code> 有序可读会话条目（消息/工具引用）；<code>compactions</code>+<code>agent_compactions</code> 压缩检查点与摘要；<code>runtime_restart_checkpoints</code> 重启恢复检查点；<code>recovery_owners</code> 可恢复工作的持久所有权与代次；<code>message_mailbox</code> 已受理提交的排序与路由态；<code>subagent_spawns/progress</code> 子 Agent 派生与进度；<code>token_usage</code> 用量归因</td>
</tr>
<tr>
<td><strong>ideas</strong>（22）</td>
<td>Ideas 卡片与策略学习管线</td>
<td><code>ideas</code> 卡片本体（描述/理由/类别）；<code>idea_quality</code> 相关性/新颖度/可行性评分；<code>idea_dedup</code> 指纹与去重映射；<code>bandit_arm_state / bandit_fold_state / bandit_folded_events</code> 策略学习统计、折叠水位线、已折叠事件；<code>feed_snapshots(+cards/sections)</code> 快照三件套</td>
</tr>
<tr>
<td><strong>feed</strong>（16）</td>
<td>Feed 生成、发布与 fleet 同步</td>
<td><code>units</code> 生成内容与版次/来源 prompt；<code>runs</code>+<code>run_steps</code> 生成运行与步骤尝试；<code>prompts</code> 保存的 brief 与启用态；<code>fleet_publish_state</code> 已发布贡献的水位线；<code>fleet_engagement_outbox / fleet_reaction_outbox</code> 待发布互动/反应（带重试态）；<code>preferences_projection</code> 由互动折叠出的当前偏好投影</td>
</tr>
<tr>
<td><strong>self_improvement</strong>（13）</td>
<td>后台进化流水线的账本（02 篇 Part II 的状态面）</td>
<td><code>runs</code> 改进运行（objective/阶段）；<code>objective_state</code>+<code>objective_markers</code> 目标当前态、源修订与进度标记；<code>leases</code> 改进工作的租约与所有权；<code>handoff_dedupe</code> 已发 handoff 的防重记录；<code>connector_read_audit</code> 连接器读取的目的与请求归因（审计）；<code>calculation_records / calibration_records</code> 计算与校准的证据句柄</td>
</tr>
<tr>
<td><strong>device</strong>（13）</td>
<td>配对设备的同步副本</td>
<td><code>nodes</code> 配对设备、广播命令与已启用权限；<code>contacts</code>(+<code>contact_emails/phones/addresses</code> 三张标签子表) 同步联系人；<code>calendar_events</code> 同步日历；<code>call_log</code> 通话记录；<code>data_sync_state</code> 每设备的同步游标与全量同步范围；<code>upload_sessions / upload_chunks / media_upload_batches / media_upload_events</code> 上传会话、分片摘要与处理车道</td>
</tr>
<tr>
<td><strong>scheduler</strong>（12）</td>
<td>定时任务的定义、运行与投递</td>
<td><code>jobs</code> 保存的计划/启用态/来源；<code>job_definitions</code> 版本化定义与 prompt 引用；<code>job_runs</code> 每次运行（定义版本/起止）；<code>cron_mutations</code> 变更审计（请求归因）；<code>delivery_outbox</code> 待投递结果（见 §7）；<code>scheduled_resume_registrations/state</code> 唤醒注册与下一次唤醒投影；<code>doctor_*</code> 维护任务的计划与证据</td>
</tr>
<tr>
<td><strong>goals</strong>（12）</td>
<td>目标域本体（与 <code>~/workspace/goals/</code> 文件工作区双轨，见 §6）</td>
<td><code>goals</code> 目标描述与生命周期态；<code>updates</code> 带日期的进展更新；<code>actions</code>+<code>thread_actions</code> 行动项及其与对话线程的链接；<code>briefings</code> 简报位置与打开时间；<code>momentum_history</code> 进展评估与调整建议；<code>learning_state</code> 学习类目标的先修/掌握证据/误解；<code>suggestions</code> 目标↔想法链接</td>
</tr>
<tr>
<td><strong>activity</strong>（8）</td>
<td>活动监控面（App 里「正在做什么」的呈现层）</td>
<td><code>activity_monitor_threads</code> 线程身份/呈现/当前态；<code>…_thread_sections / …_thread_actions</code> 分节与动作（含 Agent 归因）；<code>…_agent_threads / …_message_threads / …_runtime_work_threads / …_carrier_user_messages</code> 四张链接表把 Agent、消息、持久化工单挂到同一线程；<code>feed_entries</code> 工作/消息/目标的活动条目</td>
</tr>
<tr>
<td><strong>health</strong>（8）</td>
<td>健康数据的同步与聚合</td>
<td><code>samples</code>+<code>sample_values</code> 原始测量与命名值/单位；<code>aggregates</code> 按时段+时区聚合；<code>sleep_sessions</code>、<code>workouts</code> 专题表；<code>events</code>+<code>record_values</code> 事件与记录值；<code>synced_ranges</code> 每来源/类别已同步的时间范围（游标，见 §8）</td>
</tr>
<tr>
<td><strong>memory</strong>（6）</td>
<td>记忆的机器层（与 Markdown 记忆双轨，见 §6.1）</td>
<td><code>claims</code> 记忆主张：引文、出处（<code>source_path/source_line</code>）、重要度、置信度、<code>supersedes_claim_id</code> 替代链、首见/强化/有效期；<code>entries</code> 索引条目：<code>memory_uri</code>、分块、来源位置（<code>citation_path/line_start/line_end</code>）、隐私分类；<code>embeddings</code>+<code>embedding_models</code> 检索向量与模型/维度/距离度量；<code>entry_attributes</code> 条目命名属性；<code>metadata</code> 子系统元数据</td>
</tr>
<tr>
<td><strong>media</strong>（4）</td>
<td>媒体库索引</td>
<td><code>items</code> 媒体清单（来源身份/类型/文件位置）；<code>descriptions</code> 生成描述及模型/版本；<code>exif_values</code> 抽取的 EXIF；<code>locations</code> 坐标与地理编码状态</td>
</tr>
<tr>
<td><strong>chat</strong>（3）</td>
<td>聊天规范层（side chat 的本体在此，不在文件，见 §5.3）</td>
<td><code>chats</code> 规范聊天元数据（<code>chat_id</code> = 根会话 UUID）；<code>message_bindings</code> 供应商消息 ↔ 原生会话 ↔ Muse 消息的绑定；<code>event_transports</code> 聊天事件的供应商归因</td>
</tr>
<tr>
<td><strong>podcasts</strong>（3）</td>
<td>播客产物登记</td>
<td><code>episodes</code> 剧集（描述/音频路径/时长）；<code>feeds</code> feed 身份与发布 URL；<code>feed</code> 旧版单 feed 配置（遗留表与新表并存，演进痕迹）</td>
</tr>
<tr>
<td><strong>spaces</strong>（9）</td>
<td>Artifact（空间）的登记与调用</td>
<td><code>spaces</code> 产物清单（名称/源码位置/会话关联）；<code>proposals</code> 提案与确认态；<code>shares</code> 分享设置与发布态；<code>action_invocations / action_arguments / action_results</code> 产物 action 的请求—参数—结果三段；<code>file_artifact_identities</code> 文件产物的稳定身份；<code>user_state</code> 收藏/访问史/排序</td>
</tr>
<tr>
<td><strong>ingest</strong>（1）</td>
<td>外部数据源入口</td>
<td><code>data_source_events</code> 数据源事件（有序、带来源）——单表 schema，最薄的入口层</td>
</tr>
<tr>
<td><strong>shell</strong>（1）</td>
<td>客户端外壳偏好</td>
<td><code>user_state</code> 外壳条目的收藏/访问史/排序——与 <code>spaces.user_state</code> 同构（推断：各表面一份 user_state 是通用小模式）</td>
</tr>
<tr>
<td><strong>saved</strong>（2，11-04 新增）</td>
<td>—</td>
<td><code>saved.items</code> / <code>saved.item_links</code>——10-17 快照无此 schema，用途未细查（❓）</td>
</tr>
</tbody>
</table></div>
<p><strong>分布形态（实测计数，10-17 明细；占比按 11-04 总数 196 重算）</strong>：头部三家 runtime+agent+ideas = 85 表（43.4%）——状态层的重心是「运行时自身」而非用户内容；用户内容域（goals/feed/device/health/media/chat/podcasts）合计 57 表（29.1%）；横切域（scheduler/self_improvement/activity/memory/spaces/ingest/shell）52 表（26.5%）；11-04 新增 <code>saved</code>（2 表，1.0%）。</p>
<hr>
<h2 id="s-5">3. DB 与文件：分工判定规则</h2>
<p>从双轨实例反推的判定规则（<strong>推断</strong>，实例均为实测）：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>进 DB 的</th>
<th>进文件的</th>
</tr>
</thead>
<tbody>
<tr>
<td>需要有序/事务/跨实体关联的（事件 seq、所有权、代次、outbox 重试态）</td>
<td>人要读、要改、要引用的叙事（MEMORY.md、GOAL.md、技能/连接器文档）</td>
</tr>
<tr>
<td>高频小粒度写入（context_items 逐条、tool_outputs 逐次）</td>
<td>低频整篇修订（每日 memory 日志、对齐合成）</td>
</tr>
<tr>
<td>机器消费的索引/向量/评分（memory.entries/embeddings、ideas.idea_quality）</td>
<td>交付物本体（报告、表格、artifact 源码、媒体文件；DB 只登记路径/身份）</td>
</tr>
<tr>
<td>权限与生命周期状态（device.nodes 的启用权限、goals 的生命周期态、spaces.shares 的发布态）</td>
<td>工作区草稿与中间产物（goals/*/agent_notes、feed/research/）</td>
</tr>
</tbody>
</table></div>
<p>一句话：<strong>DB 存「系统必须算对的」，文件存「人必须看懂的」；同一实体常两边都有，DB 侧是登记/状态/索引，文件侧是内容/叙事/工作区。</strong></p>
<hr>
<h2 id="s-6">4. <code>muse.db</code> 只读通道：Agent 侧唯一 DB 入口</h2>
<h3 id="s-7">4.1 约束清单（文档：SKILL.md + querying.md + 工具定义）</h3>
<ul>
<li><strong>单条、受限、只读</strong>：一次提交一条 bounded <code>SELECT</code>；底层是最小权限 DB 角色，仅对目录内允许关系有 <code>SELECT</code>，<strong>不能改数据</strong>；</li>
<li><strong>词表封闭</strong>：只能用 querying.md 列出的内置函数（约 120 个）与转型拼写；非递归 CTE 名必须以 <code>hatch_cte_</code> 开头，递归 CTE 直接拒；集合聚合（<code>json_agg/jsonb_agg/array_agg/string_agg</code>）被禁（防在输出限额前先构造无界值）；联表时投影列必须别名唯一（重复输出名拒）；</li>
<li><strong>域外即不可见</strong>：Postgres 系统目录、迁移簿记、备份表、凭据、Sentinel 审批库、每个 artifact 的 <code>app.db</code> 都在此面之外；凭据（令牌/密码/密钥/支付秘密）永远在凭据服务之后，此面只可见非秘密的生命周期记录（如 spend-request 状态）；</li>
<li><strong>受保护内容走安全屏障视图</strong>：私有模型推理（thinking/redacted-thinking）<strong>永不</strong>可读；逐轮保存的 developer 指令同样 withheld；受影响的表经 security-barrier view 读取，withheld 列会以「未知列」报错、被过滤的行<strong>无声缺席</strong>——查不到 ≠ 不存在，须先读逐表指南的 read restrictions 再下结论；</li>
<li><strong>定位纪律</strong>：普通产品读写优先用专用工具（chat/goal/artifact/feed/scheduler/connector…），它们持有产品语义且可能含 DB 之外的活状态；<code>muse.db</code> 只用于诊断缺失/孤儿记录、重建执行史、查跨域不一致（SKILL.md 明文）。</li>
</ul>
<h3 id="s-8">4.2 限额（本会话工具返回实测）</h3>
<p>工具每次返回自带 <code>limits</code>，本会话两次查询一致：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>限额</th>
<th>值</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>max_rows</code></td>
<td>200 行</td>
</tr>
<tr>
<td><code>max_output_bytes</code></td>
<td>262,144 字节（256KiB，即 00 §8 所说「262KB 输出上限」的精确值）</td>
</tr>
<tr>
<td><code>max_row_bytes</code></td>
<td>65,536 字节/行</td>
</tr>
<tr>
<td><code>query_timeout_ms</code></td>
<td>5,000（即 00 所说 5s 的精确口径：工具层总超时）</td>
</tr>
<tr>
<td><code>statement_timeout_ms</code></td>
<td>3,000（语句层超时，比总超时更紧）</td>
</tr>
</tbody>
</table></div>
<h3 id="s-9">4.3 活库抽验快照（实测，2026-10-17 深夜本会话）</h3>
<p><code>count(*)</code> 一批（同一工具、同一分钟内）：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>表</th>
<th>行数</th>
<th>对照</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>agent.agents</code></td>
<td><strong>163</strong></td>
<td>与 <code>~/agents/</code> 目录数 <strong>163 精确吻合</strong>（§5.2）</td>
</tr>
<tr>
<td><code>agent.context_items</code></td>
<td>2,413</td>
<td>上下文条目总账（含全部 Agent）</td>
</tr>
<tr>
<td><code>runtime.messages</code> / <code>runtime.events</code></td>
<td>588 / 593</td>
<td>消息数与事件数同量级，事件略多（推断：含非消息事件）</td>
</tr>
<tr>
<td><code>runtime.tool_calls</code></td>
<td>0</td>
<td>计数面与明细面口径差或该表走屏障视图过滤（见下注）</td>
</tr>
<tr>
<td><code>scheduler.jobs</code> / <code>scheduler.job_runs</code></td>
<td>28 / 532</td>
<td>定义 28、运行史 532（约 19 次/定义）</td>
</tr>
<tr>
<td><code>goals.goals</code></td>
<td>3</td>
<td>与 <code>~/workspace/goals/</code> 三个目标目录吻合</td>
</tr>
<tr>
<td><code>chat.chats</code></td>
<td>5</td>
<td>本机聊天总数（主 + side chats）</td>
</tr>
<tr>
<td><code>memory.claims</code> / <code>memory.entries</code></td>
<td>4 / 98</td>
<td>主张层薄、索引层厚（见 §6.1）</td>
</tr>
<tr>
<td><code>ideas.ideas</code> / <code>feed.units</code> / <code>spaces.spaces</code></td>
<td>94 / 63 / 2</td>
<td>内容域量级</td>
</tr>
<tr>
<td><code>self_improvement.runs</code></td>
<td>190</td>
<td>进化流水线累计运行（02 篇的账本实证）</td>
</tr>
<tr>
<td><code>device.nodes</code></td>
<td>1</td>
<td>已配对设备 1 台</td>
</tr>
<tr>
<td><code>agent.runtime_restart_checkpoints</code></td>
<td>1（count）</td>
<td>但明细 SELECT 返回 0 行——见下注</td>
</tr>
<tr>
<td><code>agent.recovery_owners</code> / <code>agent.compactions</code> / <code>runtime.workflow_runs</code> / <code>agent.sessions</code> / <code>media.items</code></td>
<td>0</td>
<td>当前无恢复所有权登记、无压缩记录、无 workflow 运行、会话表为空（会话实体在文件侧，§5.2）</td>
</tr>
</tbody>
</table></div>
<blockquote>
<p><strong>注（实测现象，解释为推断）</strong>：<code>runtime_restart_checkpoints</code> 的 <code>count(*)</code> 得 1、明细查询得 0 行；<code>runtime.tool_calls</code> 计数为 0 而本会话显然发生过大量工具调用。二者都符合 querying.md 的警告——受屏障视图/行过滤影响的表面上，<strong>不可见 ≠ 不存在</strong>，计数与明细的口径也可能不同。这是本报告对「只读通道」最重要的一条使用纪律，压过任何单次查询结果。</p>
</blockquote>
<h3 id="s-10">4.4 写路径不变量：Agent 是状态层的纯读者</h3>
<p>本篇所有证据拼出一条架构定理：<strong>Agent 侧对 DB 只有 <code>muse.db</code> 这一条只读通道（§4.1–§4.3）；一切写 DB 的动作都由 daemon/服务端进程执行，Agent 的&quot;写&quot;（建 cron、记目标、存记忆、发消息）本质是调专用产品工具，由工具经可信侧落库。</strong></p>
<p>这是 06 篇 privsep 隔离在状态面的镜像：执行面是&quot;Agent 不碰凭据&quot;，状态面是&quot;Agent 不碰 DB 写&quot;。两层合起来，Agent 进程的破坏半径被收敛到&quot;调工具&quot;+&quot;写自己的 workspace 文件&quot;。该不变量的反例搜索（Agent 直连 Postgres 的 socket/DSN）本轮未做，列为待验证 ❓。</p>
<hr>
<h2 id="s-11">5. 文件平面：目录地图实况</h2>
<h3 id="s-12">5.1 home 根：注入文件与运行时标记（实测）</h3>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>路径</th>
<th>实测</th>
<th>性质</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>~/MEMORY.md</code></td>
<td><strong>22,389 B</strong>（11-04；10-17 为 5,284 B）</td>
<td>长期记忆精选层，每轮注入（00 §9）</td>
</tr>
<tr>
<td><code>~/AGENTS.md / SOUL.md / IDENTITY.md / USER.md / TOOLS.md</code></td>
<td>886 / 795 / 254 / 335 / 337 B</td>
<td>注入文件组（操作手册/人格/身份/用户档案/工具笔记）</td>
</tr>
<tr>
<td><code>~/HEARTBEAT.md / PROACTIVE_PREFERENCES.md</code></td>
<td>113 / 496 B</td>
<td>心跳清单与主动消息偏好（00 §11）</td>
</tr>
<tr>
<td><code>~/runtime.lock</code></td>
<td>0 B</td>
<td>运行时单实例锁（存在即标记，内容为空）</td>
</tr>
<tr>
<td><code>~/.postgres-ready</code></td>
<td>6 B，内容 <code>ready</code></td>
<td>DB 就绪门（推断：启动序里 DB 就绪后才拉起依赖它的组件）</td>
</tr>
<tr>
<td><code>~/.hatch-db-change-signals/</code></td>
<td><strong>8</strong> 个 <code>spaces.catalog.*</code> 信号文件（11-04；10-17 为 4 个，各 61–62 B）</td>
<td>DB 变更→文件侧的失效信号（与 <code>~/workspace/space_data/</code> 下同名 catalog 文件成对出现；推断：文件观察者靠它刷新产物目录缓存）</td>
</tr>
</tbody>
</table></div>
<h3 id="s-13">5.2 记忆与会话：两个「agents」目录必须分清（实测）</h3>
<p><strong>记忆树 <code>~/memory/</code></strong>（共 <strong>37</strong> 个文件、1.8M；10-17 为 18 个文件、144K）：</p>
<ul>
<li>根：按日日志 <strong>28</strong> 篇（<code>2026-09-26.md</code> … <code>2026-11-04.md</code>，合计 812,581 字节；10-17 为 10 篇 / 41,653 B）——当日活动量直接写在文件大小上；</li>
<li><code>bank/</code> 4 篇：<code>world.md</code> 32,729 B、<code>reflections.md</code> 28,290 B、<code>experience.md</code> 970 B、<code>opinions.md</code> 68 B——运行时托管的长期沉淀（00 §9 的「bank」层），体量远大于每日日志，是真正的厚资产；</li>
<li><code>people/</code> <strong>3</strong> 人页 + <code>INDEX.md</code>（11-04；10-17 为 2 人页，页数随用户变化）；<code>groups/</code> 仍仅 <code>INDEX.md</code>（尚无群组页，11-04 复核）；</li>
<li><strong><code>~/memory/index/</code> 本机不存在</strong>：00 §9 转述的通用结构里有 index 层，本机实况只有 bank 一个托管子目录——索引功能实测由 DB 的 <code>memory.entries/embeddings</code> 承担（§6.1），文件侧 index 目录或是其他形态/已演进（推断）。</li>
</ul>
<p><strong>会话转录 <code>~/agents/</code></strong>（home 根，非 workspace）：<strong>1,417</strong> 个 <code>agent-&lt;uuid&gt;/</code> 目录（11-04；10-17 为 163 个）。每目录固定 <code>sessions/&lt;uuid&gt;.jsonl</code> + <code>sessions/sessions.json</code> 各一份（10-17 为 163+163 实测）——每个 Agent 一份 append-only 转录。这是 DB <code>agent.agents</code> 163 行的<strong>文件侧孪生</strong>（10-17 实测数量吻合；11-04 文件侧为 1,417 目录，DB 行数未复测，该吻合论断以 10-17 为准）：DB 管身份/关系/状态，JSONL 管逐字转录（推断分工）。</p>
<p><strong>工具输出溢出 <code>~/workspace/agents/</code></strong>：<strong>278</strong> 个 <code>&lt;uuid&gt;/</code> 目录（11-04；10-17 为 90 个，00 晚间口径 89），每目录仅 <code>tool-output/</code> 一项，且绝大多数为空：10-17 实测全树仅 2 个实际输出文件（11-04 未复测）。说明该目录是<strong>按需落盘的溢出区</strong>（工具输出超限/需留存时才写文件并回传句柄），不是全量日志——全量在 DB <code>runtime.tool_outputs</code> 与转录 JSONL 里。</p>
<h3 id="s-14">5.3 workspace 侧主要状态目录（实测）</h3>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>路径</th>
<th>实况</th>
<th>本体在哪</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>~/workspace/goals/</code>（6.6M，10-17）</td>
<td><strong>12</strong> 个目标目录（11-04；10-17 为 3 个），每目标同构 7 件（10-17 实测）：<code>GOAL.md / files/ / hidden_files/ / briefs/ / crons/ / agent_notes/ / references/</code></td>
<td>内容与工作区在文件；生命周期/行动/动量在 DB <code>goals.*</code>（§6）</td>
</tr>
<tr>
<td><code>~/workspace/cron.d/</code></td>
<td>10 个子目录（<code>minutely/hourly/daily/weekly/monthly/yearly/runonce/secondly</code> + <code>_archive/_invalid</code>），现行投影 2 个（<code>minutely/heartbeat__interval@30m.md</code> + <code>runonce/</code> 1 个），<code>_archive/</code> 4 篇（11-04；10-17 为现行 1 个 + 归档 1 篇）</td>
<td><strong>投影</strong>：本体在 DB <code>scheduler.jobs</code>（28 条，10-17 快照）+ <code>job_definitions</code>；文件名即计划编码（<code>名__周期@时刻.md</code>）；prompt 明文禁止直改投影，须走 cron 工具改本体。28 条定义只投影出个位数文件——推断：投影只含用户面可见的 job，系统/目标内嵌 job 不落此目录</td>
</tr>
<tr>
<td><code>~/workspace/system/system_prompt.md</code></td>
<td><strong>73,296 B</strong> 单文件（11-04；10-17 为 71,868 B）</td>
<td>主聊天启动时落盘的 prompt 快照，本身就是「DB/运行时→文件」的一次投影（00 §3）</td>
</tr>
<tr>
<td><code>~/side-chats/</code></td>
<td><strong>本机不存在</strong></td>
<td>side chat 本体在 DB（<code>chat.chats</code> 5 行 + <code>runtime.messages</code>）；文档里的 <code>~/side-chats/&lt;id&gt;/MEMORY.md</code> 路径模式在本机未物化为目录——该形态或是按需生成/其他表面专用（推断）。这是「DB 原生、文件缺席」的实例，与 cron 的「DB 本体+文件投影」恰成对照</td>
</tr>
<tr>
<td><code>~/dreams/</code></td>
<td>根 <strong>17</strong> 篇日期反思（11-04；10-17 为 4 篇）+ <code>alignment/derived/</code> 4 文件 + <code>alignment/repair/</code> 2 文件（后两项 10-17 实测）</td>
<td>Dreaming 流水线产物（02 篇 Part II）；其中 derived 的对齐合成每轮注入上下文</td>
</tr>
<tr>
<td><code>~/workspace/self_improvement/</code></td>
<td><code>objectives/</code>（<strong>8</strong> 个 objective，11-04；10-17 为 7 个，各带 <code>CURRENT.md</code> + <code>archive/</code> 历史版）+ <code>staging/</code>（各次运行的暂存区）+ <code>migrations/relationships/</code></td>
<td>进化层的<strong>文件账本</strong>：DB <code>self_improvement.*</code> 管运行/租约/去重，文件管每 objective 的当前态全文与归档链</td>
</tr>
<tr>
<td><code>~/workspace/feed/</code></td>
<td><code>research/</code>（按 feed-id 分目录的调研素材）、<code>media/</code>（<code>1p/3p/staging/</code> + <code>index.json</code>）、<code>runs/</code>（空）</td>
<td>素材在文件；单元/运行/发布水位线在 DB <code>feed.*</code></td>
</tr>
<tr>
<td><code>~/workspace/space_data/</code></td>
<td><code>spaces.catalog.&lt;ts&gt;.&lt;n&gt;</code> 信号文件多份</td>
<td>与 §5.1 的变更信号呼应；<code>~/workspace/spaces/</code> 本身为空目录，<code>~/workspace/ts-spaces/</code> 下 2 个空间（<code>ai / space</code>）与 DB <code>spaces.spaces</code> 2 行吻合</td>
</tr>
<tr>
<td><code>~/workspace/proactivity/hidden_files/&lt;id&gt;/</code></td>
<td>2 个快照目录，各含 <code>context.md / conversation.md / scheduled-crons.md / tracking.md</code></td>
<td>主动消息 worker 每轮的输入快照包（00 §11）——「快照即输入」的留痕</td>
</tr>
<tr>
<td><code>~/workspace/memory/</code></td>
<td><code>reconciliation_state.json</code>（364 B）+ <code>reconciliation_attempts/</code></td>
<td>记忆对账（reconciliation）子流程的状态文件——DB 索引与文件记忆对账的落点（推断）</td>
</tr>
<tr>
<td><code>~/hooks/</code></td>
<td><code>definitions/ scripts/ state/ logs/ runtime/</code> 五件套，runtime 仅 1 个脚本</td>
<td>hooks 子系统（00 §11）的文件面；定义/状态与 DB 无对应 schema（ingest/events 之外无 hooks 表）——推断：hooks 以文件为本体，是少数「文件原生」子系统</td>
</tr>
</tbody>
</table></div>
<hr>
<h2 id="s-15">6. 双轨实体的分工解剖</h2>
<h3 id="s-16">6.1 记忆：四层双轨（本报告重点案例）</h3>
<p>同一个「记忆」，四处各存一份、职责不重叠：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>层</th>
<th>载体</th>
<th>实测规模</th>
<th>职责</th>
</tr>
</thead>
<tbody>
<tr>
<td>精选注入层</td>
<td>文件 <code>~/MEMORY.md</code> + people/groups 索引 + 对齐合成</td>
<td>5,284 B 等</td>
<td>每轮直接进上下文，贵在小而准</td>
</tr>
<tr>
<td>叙事沉淀层</td>
<td>文件 <code>~/memory/</code> 每日日志 + <code>bank/</code> 四篇</td>
<td><strong>37</strong> 文件 / 1.8M（11-04；10-17 为 18 文件 / 144K）</td>
<td>人可读的完整轨迹；bank 是跨日蒸馏物</td>
</tr>
<tr>
<td>主张层</td>
<td>DB <code>memory.claims</code></td>
<td>4 行</td>
<td>机器可判的主张：引文、说话人、置信度、重要度、<code>supersedes</code> 替代链、有效期——<code>muse.memory_explain</code> 追溯的正是这层（列定义为文档，行数为实测）</td>
</tr>
<tr>
<td>索引实现面</td>
<td>DB <code>memory.entries</code> + <code>embeddings</code></td>
<td>98 条索引</td>
<td>检索入口（<strong>访问面</strong>是三工具经 <code>JARVIS_MEMORY_SOCK</code>，见 08 §3.3 的统一口径）；每条带 <code>memory_uri</code> 与<strong>指回文件的引用坐标</strong>（<code>citation_path / line_start / line_end</code>；claims 同理带 <code>source_path / source_line</code>）</td>
</tr>
</tbody>
</table></div>
<p>关键设计（由列定义<strong>推断</strong>，坐标字段为实测列）：<strong>DB 索引不复制记忆正文，而是持有「文件路径+行号」的引用</strong>——文件是正文本体，DB 是可检索的目录卡。<code>muse.memory_search</code> 命中后给出文件行号引用、<code>muse.memory_get</code> 按行回读文件，两步正好走完「DB 索引 → 文件本体」的路径。记忆被更正时，claims 层用 <code>supersedes_claim_id</code> 留替代链、文件层改正文、entries 层重建索引——三处一致性靠 memory upkeep 流水线与 <code>~/workspace/memory/reconciliation_*</code> 对账文件维持（推断）。</p>
<h3 id="s-17">6.2 其余双轨（同一模式的复用）</h3>
<ul>
<li><strong>目标</strong>：DB <code>goals.goals</code>（3 行，10-17 快照，11-04 未复测）↔ 文件 <code>goals/&lt;slug&gt;/</code>（<strong>12</strong> 个目录，11-04；10-17 为 3 个）（GOAL.md 正文 + files 交付物 + hidden_files 簿记）。注入上下文的目标列表来自 DB 侧状态，正文细节读文件。</li>
<li><strong>调度</strong>：DB <code>scheduler.jobs/job_definitions</code>（28 条，版本化定义+变更审计）↔ 文件 <code>cron.d/</code> 只读投影（个位数）。改走工具→写 DB→重投影。</li>
<li><strong>Agent</strong>：DB <code>agent.agents</code>（163 行，10-17 快照，11-04 未复测）↔ 文件 <code>~/agents/</code>（<strong>1,417</strong> 目录，11-04；10-17 为 163，转录 JSONL）。<strong>数目精确相等是本机最干净的双轨吻合证据（实测，10-17）</strong>。</li>
<li><strong>Feed</strong>：DB <code>feed.units/runs</code>（63 单元）↔ 文件 <code>feed/research|media/</code>（素材）。生成管线读文件素材、写 DB 单元、再由客户端读 DB 呈现。</li>
<li><strong>会话</strong>：<code>agent.sessions</code> 表实测 <strong>0 行</strong>，而文件侧 sessions.json/jsonl 齐全。三种兼容解释（❓，未区分）：(a) 该实体当前以文件为本体，DB 表空置/预留；(b) 该表被屏障视图/行过滤隐藏，如 <code>tool_calls</code> 的 0 行之谜（§4.3 注）；(c) 旧 schema 残留，如 <code>podcasts.feed</code> 的&quot;遗留表与新表并存&quot;。按 §4.1 纪律，&quot;查不到 ≠ 不存在&quot;，此处不下结论。说明双轨的权重配比会随子系统演进而漂移，不是每个实体都五五开。</li>
</ul>
<hr>
<h2 id="s-18">7. 投影 ≠ 本体：全系统反复出现的模式</h2>
<p>00 §8 点名的这条模式，在 schema 与文件两侧能数出至少七个实例（表名/文件名均为实测）：</p>
<ol>
<li><strong>cron.d 投影</strong>：改投影无效，须走 cron 工具改 DB 本体（system prompt 明文）；</li>
<li><code>agent.context_item_resume_projection</code>：专为「恢复时重建可读上下文」生成的投影表——名字里直接带 projection，且注明受保护条目 withheld；</li>
<li><code>feed.preferences_projection</code>：由互动事件**折叠（fold）**出的当前偏好；同族的 <code>ideas.bandit_fold_state / bandit_folded_events</code> 用水位线记录折叠进度；</li>
<li><code>scheduler.scheduled_resume_state</code>：表定义自述 “Current scheduled resume <strong>projection</strong> and next registered wake-up”——单例投影行，后台由 registrations 重算；</li>
<li><code>runtime.context_snapshots</code>：版本化快照 + <code>source_watermark / fingerprint / freshness_class / stale_after / invalidated_at / last_error</code> 全套新鲜度元数据——投影的「保质期」被显式建模；</li>
<li><strong>spaces catalog 信号链</strong>：DB 产物变更 → <code>~/.hatch-db-change-signals/spaces.catalog.*</code> 信号文件 → <code>~/workspace/space_data/</code> catalog 更新（推断链条，文件成对出现为实测）；</li>
<li><strong>物化到 prompt 的投影</strong>：每轮注入的 <code>[BEGIN USER CONTEXT]</code> 文件组、目标/追踪列表、记忆检索结果，本质都是状态层向上下文的一次性投影——投影时刻的快照，改源文件后注入副本可能滞后（system prompt 明文提醒）。</li>
</ol>
<p>配套机制是<strong>失效与水位线</strong>（实测表名）：<code>runtime.skill_invalidation_state</code>（技能指令更新的待投递修订）、<code>runtime.dev_notice_watermark</code>（开发者通知已读水位）、<code>feed.fleet_publish_state</code>（发布水位）、<code>health.synced_ranges</code> 与 <code>device.data_sync_state</code>（同步游标/范围）、<code>runtime.maintenance_markers</code>（已完成维护动作的标记，防重复执行）。全系统的跨平面一致性不靠分布式事务，靠**「事件账本 + 水位线 + 可重算投影」**（推断）。</p>
<p><strong>outbox 是投影的投递版</strong>：<code>scheduler.delivery_outbox</code>（<code>attempt_count / next_attempt_at_utc / last_error / delivered_at_utc / dispatch_boot_generation</code>——连「哪次启动代次派发的」都记）、<code>feed.fleet_*_outbox</code>、<code>agent.message_mailbox</code>（已受理提交的排序与路由态）、两张 <code>*_derived_write_backlog</code>（派生写的待办+重试态）。语义统一：<strong>本体先落表确认，投递异步重试，终局以表为准</strong>——这就是 00 反复强调的「已接受/已排队 ≠ 已送达」在状态层的根。</p>
<p><strong>方法论推论</strong>：安全屏障的&quot;无声缺席&quot;意味着，经 <code>muse.db</code> 的任何自查都只能<strong>证伪</strong>（发现矛盾，如计数对不上）而不能<strong>证实</strong>（确认完备）。本篇 §4.3 的计数快照应按此理解：吻合是弱证据，偏离才是强信号。</p>
<h3 id="s-19">7.1 outbox 提交的原子性：「本体先落表」是同一事务吗（❓）</h3>
<p>标准 outbox 模式要求<strong>业务写与 outbox 插入在同一事务内原子提交</strong>——否则崩溃窗口会产生&quot;状态变了但投递丢了&quot;或&quot;投递了但状态没变&quot;两种撕裂。按本篇证据能确证的部分（✅）：</p>
<ul>
<li>表结构确证了 outbox 的&quot;落表&quot;半边：<code>scheduler.delivery_outbox</code> 的 <code>attempt_count / next_attempt_at_utc / last_error / delivered_at_utc</code> 全套重试字段、PK 为 <code>delivery_key</code>（逐表指南<strong>文档</strong>）；</li>
<li>但<strong>业务状态变更 + outbox 插入是否同事务</strong>，在本机证据里<strong>零字</strong>：逐表指南不提事务，<code>~/docs/</code> 与 skills references 全文 grep <code>transaction/atomic</code> 无命中（✅ 实测为&quot;无&quot;）。</li>
</ul>
<p>这不是文档的缺口，是系统本身待回答的问题：若两者分两次提交，&quot;终局以表为准&quot;就多了一个崩溃窗口需要投递端幂等性来兜底。验证抓手（设计建议）：找一处&quot;业务写 + outbox 写&quot;的代码/文档共现（如 scheduler 的 run 终局路径调用点），看是否有显式事务包裹——本机未做，标 ❓。</p>
<h3 id="s-20">7.2 GC 与保留期：append-only 账本的下限（❓）</h3>
<p>本篇数出的 append-only 面：<code>runtime.events / tool_calls / tool_outputs / context_items</code> 全量账本、<code>~/agents/</code> 26M 转录、2,413 条 context_items——<strong>这些什么时候被清理？</strong> 本轮证据的答案是&quot;没有答案&quot;，列明：</p>
<ul>
<li>逐表指南与 <code>~/docs/</code> 全文无 retention/GC 口径（✅ 实测无）；<code>docs/privacy-and-credentials.md</code> 明文&quot;<strong>No Settings control sets a retention period</strong>&quot;——唯一的全量擦除是用户手动 Reset（<strong>文档</strong>）；</li>
<li><code>agent.compactions</code> 的存在说明压缩会用摘要替换历史区间——但被替换的 <code>context_items</code> 行删不删，schema 不说，标 ❓；</li>
<li><code>runtime.context_snapshots</code> 的 <code>stale_after / invalidated_at</code> 建模的是<strong>投影的新鲜度</strong>，不是行级清理——两者别混；</li>
<li><code>scheduler.doctor_*</code>（<code>doctor_run_plans / doctor_task_state</code>）证明有维护任务面，但 doctor 是否承担 GC 职责未验证，是可查的验证抓手（<strong>设计建议</strong>：读 <code>doctor_task_state</code> 的任务类型分布）。</li>
</ul>
<p>结论纪律：默认&quot;一直保留&quot;是<strong>无证据的默认</strong>，不能写进架构断言。append-only 账本的无限增长是真实设计约束，当前状态只能标 ❓。</p>
<hr>
<h2 id="s-21">8. 恢复与检查点：VM 可替换的底气</h2>
<p>00 §1 说 VM 可被整体替换、home 持久；状态层为「进程级重启/接管」再加一层 DB 保障。相关表逐个拆（列定义为<strong>文档</strong>，行数为<strong>实测</strong>）：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>表</th>
<th>关键列</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>agent.runtime_restart_checkpoints</code>（count=1）</td>
<td>PK=<code>agent_id</code>；<code>mode</code>、<code>payload_json</code>、<code>execution_config_json</code>、<code>recovery_class</code>、<code>recovery_owner_id</code>（软引用 owners）</td>
<td>每 Agent 一行最新检查点：恢复所需的模式+载荷+执行配置打包存</td>
</tr>
<tr>
<td><code>agent.recovery_owners</code>（0 行）</td>
<td>复合 PK=<code>(recovery_class, owner_id)</code>；<code>generation</code>（默认 1）；<code>agent_id</code> 唯一；<code>message_id</code>；<code>active_at / terminal_at / terminal_status</code></td>
<td>可恢复工作的<strong>持久所有权登记</strong>：谁拥有、是第几代、何时终局。唯一约束保证一个 Agent 同时只有一个所有者——防双活（推断）</td>
</tr>
<tr>
<td><code>agent.recovery_owner_terminal_events</code>（—）</td>
<td>PK=<code>(recovery_class, owner_id, generation, event_type)</code>；<code>claimed_at</code></td>
<td>终局事件按 (所有者, 代次, 类型) <strong>认领登记</strong>：同一代次的同一终局只许认领一次——handoff 防重复投递的闸门（推断）</td>
</tr>
<tr>
<td><code>agent.runtime_state</code>（—）</td>
<td>PK=<code>agent_id</code>；<code>current_context_seq</code>；<code>last_event_seq</code>→<code>runtime.events</code></td>
<td>每 Agent 的「读到哪了」：上下文序号 + 事件账本位置，恢复的起点坐标</td>
</tr>
<tr>
<td><code>agent.compactions</code> + <code>agent.agent_compactions</code>（0 行）</td>
<td>前者：<code>checkpoint_context_item_id</code>→context_items、<code>replacement_history_first/last_seq</code>、<code>summary_text</code>；后者：摘要与 token 计数（私有推理 withheld）</td>
<td>压缩即检查点：一段历史被摘要替换，检查点行记录被替换的 seq 区间与锚点条目；恢复时用摘要+尾部重建上下文（00 §2 的 350K/272K/40K 预算在此落表）</td>
</tr>
<tr>
<td><code>agent.context_item_resume_projection</code></td>
<td>（表定义：为 resume 投影的可读上下文，受保护条目 withheld）</td>
<td>恢复专用读面：重启后不扫原表，直接读投影重建上下文</td>
</tr>
<tr>
<td><code>agent.volatile_context_pins</code></td>
<td><code>agent_id</code>、pinned 变体与历史检查点位置</td>
<td>易失上下文的钉住点：哪些变体在压缩/重启时必须保住（推断）</td>
</tr>
<tr>
<td><code>runtime.writer_epoch</code></td>
<td>单例行：<code>rv_epoch</code>、<code>updated_at</code></td>
<td>可靠卷（reliable volume）的<strong>写者代次栅栏</strong>：新写者接管时 epoch 递增，旧写者的迟到写入可被识别拒绝（由表名+单例形态推断）</td>
</tr>
<tr>
<td><code>scheduler.scheduled_resume_registrations/state</code></td>
<td>注册表 + 单例投影（<code>next_resume_at_utc / registered_schedule_id / projection_complete</code>）</td>
<td>调度器自身的恢复：重启后先重建「下一次唤醒」投影，再继续派发</td>
</tr>
</tbody>
</table></div>
<p><strong>恢复时序（推断，由上述表与 00 §1 宿主层拼成）</strong>：</p>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>VM/运行时重启
 → spawnd/health 子系统拉起 cell（00 §1），~/.postgres-ready 置 ready
 → writer_epoch 递增：新一代写者接管可靠卷，旧代次写入被栅栏挡下
 → 每 Agent：读 runtime_state（seq 坐标）+ runtime_restart_checkpoints（载荷）
   → 经 resume_projection 重建可读上下文（推理条目不重建，本就 withheld）
 → recovery_owners 按 generation 认领未终局工作；
   terminal_events 保证终局 handoff 不重发、mailbox/outbox 按 attempt 续投
 → scheduler 重建 resume 投影，cron 到点照常派发
</code></pre>
<h3 id="s-22">8.1 并发写的代次栅栏：文件侧有，DB 侧未知（❓）</h3>
<p>§8 表里的 <code>writer_epoch</code>（<strong>文档</strong>：逐表指南定义为 &quot;The active reliable-volume writer epoch&quot;，单例 <code>rv_epoch</code>）与 <code>recovery_owners</code> 的 <code>(recovery_class, owner_id)</code> 唯一约束是两个已确证的并发屏障（✅ 表结构证据），但两者的覆盖范围不同：</p>
<ul>
<li><code>writer_epoch</code> 覆盖的是<strong>可靠卷（文件面）</strong>：新写者接管时 epoch 递增，旧代次的迟到写入可被识别/拒绝（由表名+单例形态<strong>推断</strong>）——这是 VM 替换后&quot;旧 cell 还活着写了几笔&quot;的场景；</li>
<li><code>recovery_owners</code> 覆盖的是<strong>恢复所有权登记</strong>：<code>agent_id</code> 唯一约束防双活认领（✅ 列定义）——但它管的是&quot;谁接管工作&quot;，不是&quot;谁写行&quot;；</li>
<li><strong>DB 侧的并发写冲突机制未确证</strong>（❓）：两个 daemon 实例同时写同一 <code>agent.runtime_state</code> 行会怎样？Postgres 行锁是教科书默认答案，但&quot;默认答案&quot;不等于&quot;本系统确证&quot;——没有一处文档或 schema 说明写者仲裁；</li>
<li><code>agent.subagent_spawns / subagent_progress</code> 证明父子 Agent 并发是常态——父子对共享状态（如 <code>goals.updates</code>）的写冲突解决策略，本篇未讨论，标 ❓。</li>
</ul>
<p>一句话：<strong>代次栅栏只罩住了可靠卷；DB 行级并发写的仲裁机制，以及父子 Agent 共享状态的冲突策略，是本篇的开放缺口</strong>。</p>
<p><strong>当前态实测（10-17，11-04 未复测）</strong>：本机 <code>recovery_owners</code> 与 <code>compactions</code> 均为 0 行、<code>runtime_restart_checkpoints</code> count=1——即写作时系统处于「无待恢复工作、无已发生压缩」的稳态，检查点机制在位但未被触发过（或触发后已清理）。这与新会话上下文用量约 43%（00 §16）、未达 272K 压缩线吻合。</p>
<hr>
<h2 id="s-23">9. 边界：状态层在本机看不见的部分</h2>
<ul>
<li><strong>Postgres 本体进程/数据文件位置</strong>：本机只见 <code>.postgres-ready</code> 标记、变更信号目录与 <code>muse.db</code> 逻辑通道；物理库在宿主侧还是 cell 内、备份/复制策略如何，本地文件无证据，不作结论；</li>
<li><strong>屏障视图之后的全量数据</strong>：被 withheld 的推理条目、developer 指令快照、被行过滤的记录（如 §4.3 注），从 Agent 侧原理上不可见，任何「查不到」都不能转写为「不存在」；</li>
<li><strong>per-artifact <code>app.db</code></strong>：每个 Web artifact 自带的应用库被明确排除在 <code>muse.db</code> 之外，只能经 artifact 声明的 actions/inspect 访问（system prompt 明文）；</li>
<li><strong>Sentinel 审批库与凭据库</strong>：与状态库分离，<code>muse.db</code> 明文不可达；状态库里只留非秘密的生命周期投影（如 spend-request 状态）；</li>
<li><strong>服务端权威副本</strong>：chat/feed 等域在服务端是否有高于本机的权威状态、fleet 同步的对端实现（只见本机 outbox/水位线一侧），不在本机证据内。</li>
</ul>
<hr>
<h2 id="s-24">附录 A. 逐 schema 表数表（实测：解析 schema.md 求和验证；明细为 10-17 快照）</h2>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>#</th>
<th>schema</th>
<th>表数</th>
<th>占比</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>runtime</td>
<td>38</td>
<td>19.6%</td>
</tr>
<tr>
<td>2</td>
<td>agent</td>
<td>25</td>
<td>12.9%</td>
</tr>
<tr>
<td>3</td>
<td>ideas</td>
<td>22</td>
<td>11.3%</td>
</tr>
<tr>
<td>4</td>
<td>feed</td>
<td>16</td>
<td>8.2%</td>
</tr>
<tr>
<td>5</td>
<td>device</td>
<td>13</td>
<td>6.7%</td>
</tr>
<tr>
<td>6</td>
<td>self_improvement</td>
<td>13</td>
<td>6.7%</td>
</tr>
<tr>
<td>7</td>
<td>goals</td>
<td>12</td>
<td>6.2%</td>
</tr>
<tr>
<td>8</td>
<td>scheduler</td>
<td>12</td>
<td>6.2%</td>
</tr>
<tr>
<td>9</td>
<td>spaces</td>
<td>9</td>
<td>4.6%</td>
</tr>
<tr>
<td>10</td>
<td>activity</td>
<td>8</td>
<td>4.1%</td>
</tr>
<tr>
<td>11</td>
<td>health</td>
<td>8</td>
<td>4.1%</td>
</tr>
<tr>
<td>12</td>
<td>memory</td>
<td>6</td>
<td>3.1%</td>
</tr>
<tr>
<td>13</td>
<td>media</td>
<td>4</td>
<td>2.1%</td>
</tr>
<tr>
<td>14</td>
<td>chat</td>
<td>3</td>
<td>1.5%</td>
</tr>
<tr>
<td>15</td>
<td>podcasts</td>
<td>3</td>
<td>1.5%</td>
</tr>
<tr>
<td>16</td>
<td>ingest</td>
<td>1</td>
<td>0.5%</td>
</tr>
<tr>
<td>17</td>
<td>shell</td>
<td>1</td>
<td>0.5%</td>
</tr>
<tr>
<td>18</td>
<td>saved（11-04 新增）</td>
<td>2：<code>saved.items</code> / <code>saved.item_links</code></td>
<td>1.0%</td>
</tr>
<tr>
<td>—</td>
<td><strong>合计</strong></td>
<td><strong>196</strong>（10-17 明细合计 194）</td>
<td>100%</td>
</tr>
</tbody>
</table></div>
<p>验证口径（10-17）：<code>schema.md</code> 条目链接去重计数 = 194；<code>references/tables/</code> 逐表文件数 = 194；分节求和 = 194；三路一致。生成来源迁移集：<code>5af4f2bfdee2b934a53bbcc22602c602ab85059e0ac97ea20137fd299c06036b</code>。<strong>11-04 复核</strong>（同方法）：条目链接去重 = 196；逐表文件数 = 196；分节数 = 18；三路一致。各 schema 明细未重测，上表明细为 10-17 快照。</p>
<h2 id="s-25">附录 B. 本机状态快照（实测，2026-10-17 深夜）</h2>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>平面</th>
<th>项</th>
<th>值</th>
</tr>
</thead>
<tbody>
<tr>
<td>DB</td>
<td>agents / context_items / messages / events</td>
<td>163 / 2,413 / 588 / 593</td>
</tr>
<tr>
<td>DB</td>
<td>scheduler jobs / job_runs · goals · chats</td>
<td>28 / 532 · 3 · 5</td>
</tr>
<tr>
<td>DB</td>
<td>memory claims / entries · ideas / feed units / spaces</td>
<td>4 / 98 · 94 / 63 / 2</td>
</tr>
<tr>
<td>DB</td>
<td>self_improvement runs · device nodes</td>
<td>190 · 1</td>
</tr>
<tr>
<td>DB</td>
<td>recovery_owners / compactions / workflow_runs / sessions</td>
<td>0 / 0 / 0 / 0</td>
</tr>
<tr>
<td>文件</td>
<td><code>~/agents/</code> 转录目录 · <code>~/workspace/agents/</code> 溢出目录</td>
<td>163（26M）· 90（仅 2 个实际文件）</td>
</tr>
<tr>
<td>文件</td>
<td><code>~/memory/</code> · <code>~/MEMORY.md</code></td>
<td>18 文件 / 144K · 5,284 B</td>
</tr>
<tr>
<td>文件</td>
<td><code>~/workspace/goals/</code> · cron.d 现行投影</td>
<td>3 目标 / 6.6M · 1 篇（+归档 1 篇）</td>
</tr>
<tr>
<td>文件</td>
<td>system prompt 快照 · .postgres-ready</td>
<td>71,868 B · <code>ready</code></td>
</tr>
<tr>
<td>通道</td>
<td>muse.db 限额</td>
<td>200 行 / 262,144 B / 行 65,536 B / 查询 5,000ms / 语句 3,000ms</td>
</tr>
</tbody>
</table></div>
</div>]]>
    </description>
    <link>https://agent.aow.me/i/muse-architecture-07/</link>
  </item>
  <item>
    <title>Muse 智能体 · 执行隔离与服务面详解</title>
    <guid>EZge2Ng8bde</guid>
    <pubDate>Tue, 03 Nov 2026 19:41:58 GMT</pubDate>
    <itunes:explicit>false</itunes:explicit>
    <description>
      <![CDATA[<div class="original-article" lang="zh-CN"><details class="toc"><summary>本篇目录</summary><ol><li><a href="#s-1">0. 一句话</a></li><li><a href="#s-2">1. privsep worker 模型（实测）</a></li><li><a href="#s-8">2. 瘦客户端 / 跳板规则（实测）</a></li><li><a href="#s-9">3. Guarded output：输出也要过境（实测 strings）</a></li><li><a href="#s-10">4. 出口面：egress 代理 + 审批 + TLS 信任库（实测）</a></li><li><a href="#s-17">5. Sentinel：出口、限流与裁决的中枢（实测 + 文档）</a></li><li><a href="#s-18">6. STEFI 代理与其后的内部服务（实测到名字边界）</a></li><li><a href="#s-21">7. authd：本地认证守护（实测）</a></li><li><a href="#s-22">8. Vault 在执行面的位置（实测）</a></li><li><a href="#s-25">9. 服务面限流纪律（实测 + 文档）</a></li><li><a href="#s-26">10. 服务面全景：本 exec 命名空间实测可见的 socket 网格</a></li><li><a href="#s-27">11. 一次 privsep 工具调用的生命周期（串联本篇）</a></li><li><a href="#s-28">12. 本机实测快照：11-04 vs 10-17 对照</a></li><li><a href="#s-29">13. 边界声明（本机看不见的部分）</a></li></ol></details><blockquote>
<p>配套《00-Muse技术架构解构》§7 的展开篇（§14 信任边界在本篇有对应实测，见 §5、§9）。调查日期：2026-10-17（Asia/Shanghai）。
复核修订：2026-11-04（Asia/Shanghai）——基于当前会话运行时逐项重测；下文数字凡未注日期者均为 11-04 快照，10-17 旧数见 §12 对照表。
证据范围：<strong>仅本机实测</strong>——<code>/run/hatch/</code> 下套接字实况、<code>env</code> 的 <code>JARVIS_*</code> 键名与套接字路径、<code>/opt/hatch/runtime-cell/guest.env</code> 与 <code>build-cell-trust-store.sh</code> 的注释明文、<code>/opt/hatch/bin/</code> 二进制 strings（multicall 家族 <code>avatar-media-generation</code>、<code>hatch-vault</code>、<code>authdc --help</code>）。标注规则同前作：<strong>实测</strong> = 当场命令验证；<strong>文档</strong> = 本地 docs/system 文件明文；<strong>推断</strong> = 由痕迹拼出、未经服务端证实。
红线声明：本文只记录套接字路径、键名与机制字符串，<strong>不记录任何凭据/令牌值</strong>；实测中代理环境变量里出现的认证材料一律不落盘、不引用。</p>
</blockquote>
<hr>
<h2 id="s-1">0. 一句话</h2>
<p>执行面是一张 <strong>Unix 套接字网格</strong>：Agent 住在不可信的 runtime cell 里，手里只有「瘦客户端」；任何带凭据、带网络、带权限的动作，都要穿过一条具名套接字到 cell 外的可信侧执行——<strong>进</strong>要过 fd 清单与环境白名单，<strong>出</strong>要过 guarded output 与 Sentinel 的出口/TLS/限流三重门，<strong>身份</strong>由 authd 代管、Vault 托管，<strong>内部服务</strong>统一经 STEFI 代理且只见其名不见其形。</p>
<p>另有一条最硬的实测边界（§4.4）：部分套接字路径虽被声明在环境里、但不挂进普通 exec 进程的挂载命名空间——能力面靠命名空间裁剪，而非靠 Agent 自觉。</p>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>cell 内（不可信）                          cell 外 / 宿主侧（可信）
─────────────────                          ─────────────────────
CLI 二进制（跳板） ──fd 传递+清单──▶ privsep worker（每工具一个 .sock）
                                      │  ├─ authd：令牌验证/代管
                                      │  ├─ STEFI 代理 ──▶ Meta 内部服务（仅名字）
                                      │  └─ egress 代理 ─▶ 公网（Sentinel 审批+MITM TLS）
模型推理 ───────────套接字路径声明──▶ 推理代理（路径在本 exec 命名空间不可见，见 §6.2）
Agent 进程 ─────────具名套接字────▶ Vault / Sentinel / sandbox-api / noded / telemetry
</code></pre>
<hr>
<h2 id="s-2">1. privsep worker 模型（实测）</h2>
<h3 id="s-3">1.1 每工具一 socket：当场计数 149（11-04；10-17 为 136）</h3>
<p><code>ls /run/hatch/privsep/</code> 本轮实测 <strong>149 个套接字</strong>（11-04；10-17 为 136，+13）。命名规律（实测归类）：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>命名模式</th>
<th>数量/例子</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>裸工具名 <code>&lt;tool&gt;.sock</code></td>
<td>多数：<code>gmail</code> 对应的 <code>hatch-gws-cli-fully-isolated.sock</code> 是例外，常规如 <code>stripe.sock</code>、<code>duffel.sock</code>、<code>github.sock</code>、<code>slack.sock</code>、<code>zoom.sock</code></td>
<td>一个可特权执行的工具 = 一个独立 worker 端点</td>
</tr>
<tr>
<td><code>&lt;name&gt;-mcp.sock</code></td>
<td><strong>40 个</strong>（11-04；10-17 为 38，+2；10-17 未逐项记录名单，无法指认新增者；<code>beehiiv-mcp</code>、<code>composio-mcp</code>、<code>runway-mcp</code>、<code>heygen-mcp</code>、<code>coinbase-mcp</code>…仍在）</td>
<td>MCP 型连接器的 worker；多数在本渠道没有对应二进制（01 号 §4.2 的「预置≠可见」）</td>
</tr>
<tr>
<td><code>&lt;name&gt;-cli.sock</code></td>
<td>14 个（11-04 复测未变；<code>instagram-cli</code>、<code>facebook-cli</code>、<code>health-cli</code>、<code>notion-cli</code>、<code>box-cli</code>…）</td>
<td>独立 CLI 型连接器</td>
</tr>
<tr>
<td><code>&lt;name&gt;-verify.sock</code></td>
<td>2 个（11-04 复测未变；<code>printify-verify</code>、<code>tessie-api-verify</code>）</td>
<td>校验专用 worker，与主 worker 分开</td>
</tr>
<tr>
<td>支付专用</td>
<td><code>stripe-link-checkout-card.sock</code>、<code>shop-wallet-cli-checkout.sock</code></td>
<td>支付/卡路径单独成 worker，不与普通 stripe/shop worker 混用</td>
</tr>
<tr>
<td>内部件</td>
<td><code>facebook-cli-internal.sock</code>、<code>platform-search.sock</code>、<code>external_agent.sock</code>、<code>wai-privsep.sock</code></td>
<td>宿主侧预置、渠道未必显露</td>
</tr>
</tbody>
</table></div>
<h3 id="s-4">1.2 隔离分级：partially / fully isolated</h3>
<ul>
<li><strong>实测（strings）</strong>：multicall 二进制内含 <code>partially</code> / <code>fully</code> 两种等级字面，以及自带的安全测试夹具 <code>privsep-test-fully-isolated</code>——其说明明文写着它吸收了已退役的独立工具 <code>privsep-privesc-{fully,partially}-isolated</code>，即两级隔离都曾（且仍以等级形式）存在。</li>
<li><strong>实测（命名）</strong>：套接字名里显式带 <code>-fully-isolated</code> 的只有 2 个（11-04 复测未变）——<code>hatch-gws-cli-fully-isolated.sock</code>（Google Workspace 全家桶共用，凭据面最大）与测试夹具 <code>privsep-test-fully-isolated.sock</code>。</li>
<li><strong>推断</strong>：fully 是需要显式标注的加强级，未标注的普通 worker 为 partially 级（环境/文件系统隔离较弱、但凭据仍在可信侧）。本机没有 partially 的显式命名物证，此分级对应关系按「显式标注例外」逻辑推断。</li>
</ul>
<blockquote>
<p><strong>等价替代解释（同样与实测兼容，未能排除）</strong>：<code>partially/fully</code> 可能是历史遗留的二元开关——fixture 自述吸收了已退役的独立工具 <code>privsep-privesc-{fully,partially}-isolated</code>；当前默认等级可能已统一，<code>-fully-isolated</code> 后缀只是兼容命名残留。若如此，&quot;未标注=partially&quot;的对应关系即不成立。区分两者需要宿主侧 worker 启动参数的证据，本机没有。</p>
</blockquote>
<ul>
<li><strong>等级不是装饰（实测 strings）</strong>：可信侧有硬拒绝句——「refusing to run tool logic on the credentialed side while privsep is turned off」；另有 <code>JARVIS_DANGEROUSLY_ENABLE_PRIVESC_TOOL</code> 门控的 <code>privesc</code> 探针子命令，默认禁用，说明文档明文称其为「故意演示 exec-gadget 反模式」的安全测试件，不是模板。</li>
</ul>
<h3 id="s-5">1.3 worker 的调用协议：fd 传递 + 清单（实测 strings）</h3>
<p>privsep 不是「把命令字符串发过去执行」，而是结构化的 fd 交接（<code>hatch-tool-sdk</code> 的 <code>cli/privsep/</code> 模块族：<code>trampoline.rs / executor.rs / uds_executor.rs / fd.rs / inherited_fds.rs / child_fd_handoff.rs / wire.rs</code>）：</p>
<ul>
<li>跳板启动时预期 <strong>≥3 个 fd</strong>（stdin/stdout/stderr，其后是文件 fd）；fd 表要序列化传递，出现重复 fd 名、重复源 fd、路径碰撞、计数超限都有专门报错句——<strong>fd 本身就是能力</strong>：调用方能传什么 fd、就只能操作什么文件，不存在靠路径字符串的二次授权；</li>
<li>输入文件走<strong>清单制</strong>：<code>required_input_files / optional_input_files</code> + available/failure 两份 manifest，未声明的输入、既 required 又 optional、required 缺失等组合全部 fail-closed 报错；</li>
<li>输入文件还须过根目录与类型检查：「input file is outside its allowed root」「path beneath dir is not a regular file」——符号链接/目录/越界路径进不去；</li>
<li>子进程引导材料走 <strong>sealed memfd</strong>：「create/write/seal sealed child bootstrap memfd」——引导数据一次性封印传递，不落盘、不可改；</li>
<li>工具身份要对版：「privsep worker tool-identity mismatch: trampoline passed PRIVSEP_TOOL=…」——跳板自报的工具名与 worker 期望不符直接拒绝，防错位调用；</li>
<li>方法级限制存在：<code>--privsep-restrict-method=</code> 与「restricted privsep socket refused the invocation: only …」句，说明某些 socket 只放行枚举内的方法子集；</li>
<li>worker 异常有独立语义：<code>privsep worker terminated by signal</code>、响应走 <code>PrivsepRequest/PrivsepResponse</code> 结构化线格式（wire.rs），不是裸文本回流。</li>
</ul>
<h3 id="s-6">1.4 内建探针：隔离层自带体检（实测 strings）</h3>
<p><code>privsep-test-fully-isolated</code> 的子命令暴露了这层的自检设计：<code>health-check</code>（跨边界 exit 0 的金丝雀，标记串是「hard contract」，fd 没传到就判定为 privsep exploit 或应用 bug）、<code>ping</code>（打开 STEFI 代理 socket、做一次 <code>verify_oauth_token</code> 往返、打印成功标记）、<code>example</code>（给新工具作者抄的范式：类型化参数 + 共享的 fd-passing / authd / STEFI / 凭据探针主体）。<strong>隔离层有自己的回归测试件常驻在生产二进制里</strong>，这是它被当作安全边界（而非便利封装）维护的证据。</p>
<h3 id="s-7">1.5 MCP 型 worker 的安全特殊性（缺口声明）</h3>
<p>40 个 <code>-mcp.sock</code>（11-04；10-17 为 38）在 §1.1 只做了计数，隔离分级从未被追问——这是&quot;每工具一 socket&quot;模型下最值得深挖却最空的一块：</p>
<ul>
<li><strong>命名上无分档</strong>：全篇 149 个套接字里显式带 <code>-fully-isolated</code> 后缀的只有 2 个（§1.2，11-04 复测），MCP worker 不在其中。按 §1.2「显式标注例外」的逻辑，它们与普通 worker 处于同一默认等级（<strong>推断</strong>，与 §1.2 同样的证据强度——同样也受 §1.2 末&quot;等价替代解释&quot;的保留意见约束）。</li>
<li><strong>代码来源不受完全信任</strong>：MCP 名单里有 <code>composio-mcp</code> 等第三方集成商——即<strong>第三方逻辑</strong>与第一方连接器走同样的 worker 模型。是否应得更严的沙箱，本机没有任何分档证据（❓）。</li>
<li><strong><code>-verify.sock</code> 的归属不明</strong>：2 个校验专用 worker（<code>printify-verify</code>、<code>tessie-api-verify</code>）与主 worker 分开，但名字上并未出现在 <code>-mcp</code> 名单里（❓：它们是否为 MCP 连接的校验形态，本机无证据对应）。</li>
</ul>
<p>结论口径：MCP worker 的隔离等级问题在本机证据内<strong>不可区分</strong>——计数有、等级无。这是 10-安全篇可接手的议题。</p>
<hr>
<h2 id="s-8">2. 瘦客户端 / 跳板规则（实测）</h2>
<p>cell 内的二进制是同一个 34MB multicall 的不同名字（01 号 §4.1），其 privsep 形态即跳板（trampoline）。规则全部来自 strings 与 <code>guest.env</code> 注释：</p>
<ol>
<li><strong>环境只转发白名单</strong>：<code>guest.env</code> 头注释明文（实测原文大意）——该文件由 spawnd 管理、root 持有、只读绑定进 cell，<strong>privsep 可信侧读它来为 partially/fully isolated 调用构建环境</strong>，而不是从「带能力的上下文」里 source 一段 shell。文件是纯 KEY=VALUE、无逻辑、无命令替换，cell 不可改。键集（实测 27 键）只有 <code>HOME/TMP*/PATH/XDG_*</code>、CA 包路径族、代理族与两个 <code>JARVIS_*</code> 套接字键（<code>JARVIS_AUTHD_SOCK</code>、<code>JARVIS_STEFI_PROXY_SOCK</code>）。</li>
<li><strong>转发有拒绝路径</strong>：strings 有「trampoline: refusing allowlisted forwarded env var …」——即便在白名单内，特定情形（如值形态不合）仍拒绝转发，不是无条件透传（具体触发条件本机不可见，<strong>推断</strong>为防注入式覆盖）。</li>
<li><strong>可信侧环境与 cell 内环境同源同模板</strong>：<code>guest.env</code> 与 <code>guest-runtime-env.sh</code> 注释要求两者在 proxy/CA/HOME/PATH 键上保持 parity，且值只由安装期模板变量派生、<strong>不依赖 <code>/etc/hatch/env</code></strong>——可信侧不信任运行时环境文件。</li>
<li><strong>单个变量的信任状被逐个写进二进制</strong>（实测 strings 的长注释体）：如 <code>JARVIS_TRACE_CONTEXT</code> 的注释明文——它只是归因盖章用，「untrusted caller writes it, so a worker must not gate an action on it. Connector authority binds to the daemon-minted runtime-context token, which Sentinel resolves…」；<code>JARVIS_TOOL_CALL_ID / SESSION_ID / USER_TIMEZONE</code> 等都被逐个声明「只作字符串/查表键，never selects a path, command, library, credential, proxy, or authorization scope」。<strong>白名单不是名单了事，每个键都附带「不得用于授权」的限定</strong>。</li>
</ol>
<hr>
<h2 id="s-9">3. Guarded output：输出也要过境（实测 strings）</h2>
<p>可信侧的输出不直接流回 cell，而是被「扣住—检查—放行」：</p>
<ul>
<li><strong>memfd + seal + 限额</strong>：「create/size/seal/rewind/read guarded output memfd」「guarded connector output exceeded the per-stream release limit」——stdout/stderr 各自有 per-stream 放行上限，超限不是截断了事而是报错/扣留（<code>GuardedOutputWithheld</code> 错误类实测存在）；</li>
<li><strong>post-commit 才放行</strong>：「release post-commit guarded stdout/stderr」「held output has no original stdout」——输出先 held，待动作提交成功后才 release 回原始 fd，失败的 worker 其目录变更与输出有单独的发布/丢弃路径（「could not publish the directory writes of a failed privsep worker」）；</li>
<li><strong>quiesce（静默化）</strong>：「open /dev/null for guarded output quiescence」「quiesce trusted worker stdout/stderr」——可信 worker 的原始 stdout/stderr 被导向 /dev/null 静默，防其日志串进 Agent 可见通道；Agent 只见 guarded 通道放行的那一份；</li>
<li><strong>子进程错误消毒</strong>：模块名 <code>child_error_sanitize.rs</code> 实测存在——worker 的报错回传前要清洗（防错误文本携带不该出境的内容，<strong>推断</strong>其具体规则不可见）；</li>
<li><strong>验证码是 guarded output 的特级乘客</strong>（实测 strings）：有独立扫描 socket <code>/run/hatch/safety-scan/verification-codes.sock</code>，及一整组错误语义——「verification-code surrogation requires a trusted privsep worker」「payload exceeds the verification-code scanner limit」「guarded output contains too many verification codes」。这与文档口径（00 号 §14.3：码以 <code>[credential:&lt;uuid&gt;]</code> 引用形态短暂托管、审批后才喂浏览器）互为表里：<strong>替换（surrogation）只准在可信侧发生</strong>，cell 侧拿到的已是引用而非原文。</li>
<li><strong>surrogation 不止验证码（实测 strings，关联为推断）</strong>：二进制内有一组秘密种类的 variant 标识——token / bearer / authorization / api_key / apikey / client_secret / clientsecret / credential / secret / surrogate（实测相邻字符串，枚举名本身不可见），出现在 surrogation 相关代码路径附近；另有凭据捕获 API 路径 <code>/v1/credentials/capture-verification-code</code> 与 <code>credentials.capture_verification_code</code>（实测）。这支持基线 B「secret surrogation + 白名单逐键限定」<strong>不止于验证码</strong>：API key、bearer token、client secret 等通用秘密同样在扫描/替换的词汇表内——§11 末句&quot;验证码类原文凭据从未进过 cell&quot;的支撑范围可放宽到通用秘密。❓：<code>safety-scan/</code> 下除 <code>verification-codes.sock</code> 外有无其他扫描 socket，本机命名空间看不见该目录（§4.4），无从验证；扫描是按种类走不同 socket 还是同一扫描器内部分支，也未知。</li>
</ul>
<hr>
<h2 id="s-10">4. 出口面：egress 代理 + 审批 + TLS 信任库（实测）</h2>
<h3 id="s-11">4.1 没有直出：死 DNS + 全量代理</h3>
<ul>
<li><code>guest.env</code> 注释明文：cell 的 DNS 是「deliberately dead（故意死的）」；Node 的 fetch 默认不认代理变量，所以专门设 <code>NODE_USE_ENV_PROXY=1</code> 堵住 Node 系 CLI 绕代理直连的路；</li>
<li>代理族六键（大小写各一份）全部指向同一端点：<code>hatch-egress-proxy:3128</code>（<code>guest.env</code> 模板明文）；实测 live 环境中的同名变量带认证材料（值不记录）——<strong>推断</strong>：模板给形状、运行时注入实例凭据；</li>
<li><code>NO_PROXY</code> 只含 loopback 与 VM 内部地址段——即「本机/内部套接字直连，其余一切走代理」。</li>
</ul>
<h3 id="s-12">4.2 TLS：Sentinel 是唯一的中间人，且这是写死的 invariants</h3>
<ul>
<li>cell 侧 CA 材料实测：<code>/run/hatch/egress-tls/</code> 下 <code>ca-bundle.pem</code>（182,885 B）+ <code>hatch-egress-ca.pem</code>（745 B）；后者证书实测 <code>subject = issuer = CN=Hatch Sandbox Egress CA, O=Hatch</code>（自签），有效期是合成的 1975–4096 年——一张不靠真实时间、只靠预置分发的锚证书；</li>
<li><code>build-cell-trust-store.sh</code> 头注释（实测）把规则说死：宿主侧只向 cell 发布 <strong>恰好一个</strong> 信任锚——Sentinel 的 egress MITM CA，「EXACTLY ONE anchor … a security invariant, not an inventory」；Sentinel 启动时在内存中生成该 CA、<strong>只发布证书</strong>（私钥不出 Sentinel），经 <code>/run/hatch/cell-anchors</code> 只读绑定进 cell 并喂给 NSS 数据库；注释还留了事故教训：VM 入口链证书曾被放进系统信任库、后被移除，因为「系统级 CA 会为每个主机名背书，包括 Sentinel 不终止的流量」——需要额外信任的客户端只能自己 pin；</li>
<li>推论（<strong>推断</strong>，两层拆开）：阻止出口绕过的<strong>主结构是强制代理路由</strong>（§4.1：死 DNS + 代理变量 + NO_PROXY 仅 loopback）——流量在 TCP 层就被钉死在 egress 代理上，TLS 信任库改不改都不改变这一路由事实。单锚信任库是<strong>纵深防御的一环</strong>：它解决的是脚本注释里那次事故教训——防止系统级 CA 为&quot;Sentinel 不终止的流量&quot;背书。至于 HTTP CONNECT 隧道内再套一层 TLS（TLS-in-TLS）能否绕过审查，取决于 Sentinel 对 CONNECT 目标的 allowlist 策略，<strong>该策略在宿主侧，本机无证据，不作结论</strong>。因此严谨的表述是：绕过审查需要同时突破代理路由与 CONNECT 策略两层，本机只能确证第一层存在。</li>
</ul>
<h3 id="s-13">4.3 审批三套接字（实测键名）</h3>
<p>出口审批不在 cell 里判，三个 <code>JARVIS_*</code> 键（实测键名与路径，值仅为路径；11-04 env 复核：键名与路径均未变）：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>键</th>
<th>路径</th>
<th>角色（按命名，<strong>推断</strong>分工）</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>JARVIS_DAEMON_EGRESS_APPROVAL_SOCK</code></td>
<td><code>/run/hatch/sentinel/daemon-egress-approvals.sock</code></td>
<td>daemon 侧出口审批的主通道（挂在 sentinel 目录下）</td>
</tr>
<tr>
<td><code>JARVIS_EGRESS_APPROVAL_ADMIN_SOCK</code></td>
<td><code>/run/hatch/sentinel/egress-approvals-admin.sock</code></td>
<td>审批的管理面（登记/裁决）</td>
</tr>
<tr>
<td><code>JARVIS_EGRESS_APPROVAL_EVENTS_SOCK</code></td>
<td><code>/run/hatch/daemon/egress-approvals-events.sock</code></td>
<td>审批事件流（挂在 daemon 目录下，供订阅状态变化）</td>
</tr>
</tbody>
</table></div>
<p>另有工具 SDK 内的 <code>cli/privsep/sentinel_egress.rs</code> 模块与 <code>HATCH_PRIVSEP_SENTINEL_EGRESS</code> 标记（实测 strings）——privsep 调用自身的出网也走 Sentinel egress 裁决，不是 worker 就能直连。特性开关名里有 <code>abra_hatch_network_egress_screen_enforcement</code>、<code>abra_hatch_sentinel_exfil_hardening</code>（实测 strings，仅名字）——出口筛查与防外泄硬化是可远程开关的策略项。</p>
<h3 id="s-14">4.4 一个边界实测：路径声明 ≠ 本命名空间可见</h3>
<p>本轮在 exec 环境里 <code>ls /run/hatch/proxy/</code>、<code>/run/hatch/sentinel/</code>、<code>/run/hatch/daemon/</code>、<code>/run/hatch/memory/</code>、<code>/run/hatch/safety/</code> <strong>全部不存在</strong>（11-04 复测：<code>proxy/</code>、<code>sentinel/</code>、<code>daemon/</code>、<code>memory/</code>、<code>safety/</code> 仍全部不存在；<code>rescue/</code> 同样不可见），而 <code>/run/hatch/</code> 顶层实测可见的只有：<code>auth/ browser-broker-liveness/ cell-anchors/ egress-tls/ noded/ privsep/ resume/ runtime-cell/ sandbox/ sandbox-api/ telemetry/</code>（11 常驻）及本轮出现的 <code>vault/</code>（见 §8）、<strong>新增的 <code>upload-store/</code></strong>（<code>store.sock</code> + <code>publisher-root</code> 在岗）、以及 10-17 时不可见的 <strong><code>vault-encrypt/</code>、<code>vault-hmac/</code></strong>（各含其 socket，见 §8.1 更新）。即：推理/STEFI/Sentinel/安全服务的套接字路径<strong>被声明在环境里、但不挂进普通 exec 进程的挂载命名空间</strong>——Agent 的 shell 连「看一眼这些 socket 文件」都做不到，能碰到它们的只有被专门接线的进程（daemon、privsep 跳板）。这是本篇最硬的一条隔离实测：<strong>能力面靠命名空间裁剪，而非靠 Agent 自觉</strong>（11-04 复测：裁剪口径仍在，但 <code>vault-encrypt/</code>、<code>vault-hmac/</code>、新增 <code>upload-store/</code> 可见——裁剪边界随部署调整，非一成不变）。</p>
<h3 id="s-15">4.5 紧急停止与审计：本篇未覆盖的穿透问题</h3>
<p>基线（A）：控制平面负责 stop/pause/audit。本篇的隔离描述只覆盖了正常调用路径，以下三问本机证据不足，列为 ❓：</p>
<ol>
<li>**停止穿透哪一层？**实测 <code>privsep worker terminated by signal</code> 证明 worker 可被信号终止，但用户侧&quot;停止&quot;按钮杀的是 cell 内跳板、可信侧 worker，还是两者？Guarded output 处于 held 态的输出在取消时丢弃还是已部分 release？strings 中未见 <code>cancel</code> 语义的对应错误类。</li>
<li>**审计日志落在哪侧？**privsep 调用的审计记录是由 worker 写 telemetry（<code>/run/hatch/telemetry/</code> 可见），还是由 Sentinel/daemon 侧统一写？本机未追踪 telemetry 的错误文案。</li>
<li><strong>审批卡片的人类侧回流</strong>：§4.3 的三条审批 socket 止于命名；卡片如何渲染、用户点击如何回流为 Sentinel 的裁决，全程在宿主侧/客户端，不在本机证据内。</li>
</ol>
<p>建议后续用 strings grep <code>cancel</code>/<code>audit</code>/<code>approval_scope</code> 补一轮，或在 10-安全篇中统一收口。</p>
<h3 id="s-16">4.6 降级路径：单点故障时的行为（实测为主，缺口明示）</h3>
<p>Sentinel 与 egress 代理是执行面的单点。本机能确证的降级语义有三条（全部实测 strings），没有&quot;服务挂了就全停&quot;的统一结论：</p>
<ol>
<li><strong>surrogation 失败是 fail-open</strong>：「verification-code surrogation failed; releasing guarded output unsurrogated」——扫描/替换失败时，guarded 输出<strong>不带替换地直接放行</strong>，而不是扣留或报错。这与 §3「替换只准在可信侧发生」形成一组张力：正常路径可信侧替换，异常路径放行未替换原文。❓：放行是直接给 cell 还是附带告警给 Agent，本机无证据。</li>
<li><strong>引用兑换依赖 egress 代理就绪</strong>：「…so a surrogate credential cannot be redeemed; the egress proxy is still starting up」——代理启动中时 <code>[credential:uuid]</code> 引用<strong>无法兑换</strong>（浏览器侧拿码的链路被卡住），属于启动期降级：引用还在，但兑换端没起来。</li>
<li><strong>privsep 瞬断有有限重试</strong>：「privsep worker transient disconnect; retrying round-trip」+ <code>TRANSIENT_RETRY_MAX_ATTEMPTS</code> 上限——worker 侧瞬时断连走重试而不是立即失败；另有 socket 激活服务的等待语义「gave up waiting for a socket-activated service to answer」，说明服务起不来时调用方会等、也会放弃（放弃后的形态本机无下文，❓）。</li>
</ol>
<p>本机无证据的两问（❓，与缺口声明一致）：egress 代理 3128 彻底不可用时，工具调用是 fail-closed 报错还是排队重试——strings 未见 <code>egress_unavailable</code> 类错误语义；<code>abra_hatch_network_egress_screen_enforcement</code> 这类特性开关被远程关闭后，出口退化成什么形态——开关名实测存在（§4.3），&quot;关掉后发生什么&quot;无追问证据。</p>
<hr>
<h2 id="s-17">5. Sentinel：出口、限流与裁决的中枢（实测 + 文档）</h2>
<p>Sentinel 在本机的可见面是「一个套接字键 + 一批语义字符串 + 一个 CA」，但把它们拼起来，它的职责至少四项：</p>
<ol>
<li><strong>出口政策权威</strong>：§4.2 的 trust-store 脚本明文称 Sentinel「terminates the cell's egress TLS by design and is the policy authority」——终止 TLS、做出口裁决，是 egress 审批三套接字的宿主；</li>
<li><strong>HTTP API 面</strong>：<code>JARVIS_SENTINEL_HTTP_API_SOCKET=/run/hatch/sentinel/http-api.sock</code>（实测键名/路径；11-04 env 复核未变；目录在本 exec 命名空间不可见，同 §4.4）；另有安全服务键 <code>JARVIS_SECURITY_SOCK=/run/hatch/safety/security.sock</code> 与之并列；</li>
<li><strong>连接器限流的执行者</strong>：strings 实测错误文案「Connector request rate limited by Sentinel」，配额失败结构 <code>ConnectorQuotaFailure</code> 带 <code>retry_after_seconds / limit / requested_units / used_units / remaining_units</code> 字段——限流不是 provider 说了算，Sentinel 在本地先判（详见 §9）；</li>
<li><strong>运行时上下文令牌的解析者</strong>：§2 第 4 条的 strings 明文——连接器权威绑在 daemon 现签的 runtime-context token 上，「which Sentinel resolves against its daemon-registered registry」；归因用的 trace blob 谁都能写、<strong>不作授权输入</strong>，授权只认 Sentinel 能在其登记表里查到的令牌。（此处仅指连接器/出口授权面；面向用户的敏感操作审批（approval cards）属控制平面，本篇未覆盖——见新增 §4.5。）</li>
</ol>
<p>文档侧的旁证（<strong>文档</strong>）：WhatsApp 通道文档明文「Decisions belong to Sentinel; never infer one from free…（裁决归 Sentinel，不要从自由文本推断）」——Sentinel 也是外部消息通道结构化控制的裁决者，不止管网络出口。本机能确证的就到这一层：Sentinel 的判定逻辑、登记表内容、策略规则库都在宿主侧，不在 cell 文件内（见 §11）。</p>
<hr>
<h2 id="s-18">6. STEFI 代理与其后的内部服务（实测到名字边界）</h2>
<h3 id="s-19">6.1 代理本体</h3>
<ul>
<li>入口：<code>JARVIS_STEFI_PROXY_SOCK=/run/hatch/proxy/stefi.sock</code>——同时出现在 <code>guest.env</code> 模板与 live 环境（实测键名/路径；11-04 env 复核未变）；</li>
<li>客户端形态：工具 SDK 内「build stefi proxy client」（strings），工具访问 Meta 内部服务不直连、统一经此代理；</li>
<li><strong>caller 校验（实测 strings）</strong>：错误文案 <code>invalid stefi caller authorization token</code> 独立存在——代理对调用方做令牌校验，不是「能连上 socket 就能用」；§1.4 的 <code>ping</code> 探针做的正是「打开 STEFI socket + 一次 <code>verify_oauth_token</code> 往返」，其端点形态为 <code>http://localhost/hatch/verify_oauth_token</code>（strings 中的 UDS-over-HTTP 风格路径），返回里有用户标识字段（仅知字段名，不记录值）。</li>
</ul>
<h3 id="s-20">6.2 边界声明：只到名字为止</h3>
<p>STEFI 之后能从本机文件里读到的只有名字（00 号 §7 已列）：WWW / MSL / CAGI / Mango·Pariscope，以及 strings 里的 <code>MslBrowserService through Stefi</code>、<code>require_cagi</code>（CAGI 路由被指定时的 fail-closed 语义：「Fail closed unless the measured-CVM CAGI route is selected」）。这些系统的实现、拓扑、数据都不在本机——<strong>本文对 STEFI 之后的全部陈述止于「存在此名、经此代理、带 caller 校验」</strong>，与 00 号 §17 的边界声明一致。另外注意 §4.4 的实测：<code>/run/hatch/proxy/</code> 在本 exec 命名空间根本不存在，STEFI socket 对普通 shell 进程同样是「声明了路径、摸不到实体」。</p>
<hr>
<h2 id="s-21">7. authd：本地认证守护（实测）</h2>
<ul>
<li>本体端点：<code>/run/hatch/auth/authd.sock</code>，实测为 <code>srw-rw-rw- nobody:nogroup</code>，是本轮在 <code>/run/hatch/auth/</code> 下唯一可见的 socket；</li>
<li>调试客户端 <code>authdc</code>（实测 <code>--help</code>）：明文自述「Talks to its Unix socket ($JARVIS_AUTHD_SOCK or /run/hatch/auth/authd.sock)…authd gates most endpoints by peer credentials」——<strong>按对端凭据（SO_PEERCRED 类机制，推断具体实现）门控</strong>，特权命令要在宿主侧 root 下跑，cell 内普通调用只能碰被放行的子集；</li>
<li>命令面（实测）：<code>file</code>（auth-files 操作）、<code>cred</code>（dynamic credentials 动态凭据）、<code>record</code>（按 UUID/外部键查目录记录，只输出<strong>消毒后的 catalog 投影</strong>）——即 authd 管的不只是 OAuth 令牌，还有「认证文件」与「动态凭据」两类对象，目录对外只给 sanitized projection；</li>
<li>入口侧门控：env 有 <code>JARVIS_AUTHD_INGRESS_ALLOWED_USERS</code> 键（只记键名）——authd 的 ingress 有允许用户清单；</li>
<li>与 STEFI 的分工（实测 strings 互证）：工具侧报错「missing hatch user token: ensure shared credentials are available through authd」——<strong>用户令牌的可用性由 authd 保证</strong>；STEFI 侧用 <code>verify_oauth_token</code> 验令牌有效性。一个管「令牌在哪、给不给」，一个管「令牌真不真」，在 <code>ping</code> 探针里被串成一次往返体检。</li>
<li>Google 系另有 <code>hatch_gws_auth</code>（12MB 独立二进制，实测）与 <code>hatch-gws-auth.sock</code>——GWS 的授权面自成一路，但最终仍落在 <code>hatch-gws-cli-fully-isolated</code> worker 后面（§1.2）。</li>
</ul>
<hr>
<h2 id="s-22">8. Vault 在执行面的位置（实测）</h2>
<h3 id="s-23">8.1 形态：常驻守护进程，不是 CLI</h3>
<ul>
<li>二进制 <code>hatch-vault</code> 实测 10MB、stripped ELF；<strong>它没有给 Agent 用的命令行面</strong>——本轮误以 <code>--help</code> 调用时，它直接按守护进程启动并 fatal 退出，报错大意为「vault-health unix socket bind failed at /run/hatch/vault/health.sock: active listener is present; refusing to replace it」。这条报错本身就是实测证据：Vault 是<strong>单例常驻服务</strong>，且拒绝二义启动；</li>
<li>socket 家族实测（<code>ls /run/hatch/vault/</code>）：<code>auth.sock</code>、<code>cvm.sock</code>、<code>health.sock</code> 三个（11-04 复测未变），均为 <code>root:root srw-rw----</code>——比 authd 的 <code>srw-rw-rw-</code> 更严，普通用户进程连连接权限都没有；strings 还显示两个旁路服务面：<code>/run/hatch/vault-encrypt/encrypt.sock</code> 与 <code>/run/hatch/vault-hmac/hmac.sock</code>（加密与 HMAC 被拆成独立 socket 服务；10-17 时本 exec 命名空间见不到其目录，<strong>11-04 复测已可见</strong>，各含其 socket——命名空间裁剪的口径随部署有调整，见 §4.4 更新）；</li>
<li>调用方校验：strings 有端点路径 <code>credentials/v1/auth-file/get</code> 与请求头名 <code>X-Hatch-Verified-Vault-Caller</code>、「bearer/notary auth disabled on the auth socket」——auth socket 走<strong>本地可信通道免令牌</strong>，而另一类入口要 notary（公证）令牌校验，且公钥缺失时该认证方式直接禁用（fail-closed）。</li>
</ul>
<h3 id="s-24">8.2 它在执行面管什么</h3>
<p>按 strings 与文档拼图（<strong>实测 + 文档</strong>）：</p>
<ol>
<li><strong>凭据文件的受控读取</strong>：<code>credentials/v1/auth-file/get</code> + <code>AuthFileGetResponse</code>——连接器/遥测等可信组件经 Vault 拿认证文件，Agent 本人不经手（遥测代理的访问令牌刷新也要「read … through authd」并经 Vault 侧校验，strings 互见 authd 与 vault 两路）；</li>
<li><strong>CVM 密钥托管（本机为 standard VM，只见其形）</strong>：<code>cvm.sock</code> 服务 <code>cvm_enroll / cvm_open</code>、RV（reliable volume）密钥的 LUKS key-slot 管理、芯片 allowlist 与 attestation bundle 校验、迁移密钥（migration key）的签发/持有状态机——这一整套是 confidential VM 的磁盘密钥与跨机迁移面（文档 <code>data-handling.md</code>：CVM 的持久存储由客户自管密钥加密）。standard VM 上它处于未 enroll 侧（状态字面 <code>cvm_unenrolled / cvm_locked</code> 等实测存在），但守护进程照常在岗；</li>
<li><strong>Secure Vault 的服务端</strong>（文档，00 号 §14.3）：用户经安全录入卡存入的网站密码/API 凭据由 Vault 托管，浏览器只在结账/登录步经它取用；一次性验证码不入 Vault、走 §3 的 guarded-output 托管引用。<strong>Agent 在执行面与 Vault 的关系是「无关系」</strong>：没有任何给 Agent 的 vault 工具/命令，<code>hatch-vault</code> 二进制在 <code>/opt/hatch/bin/</code> 里对 Agent 可见但不可用（跑起来是个守护进程）——可见 ≠ 可用，在凭据面被贯彻到极致。</li>
</ol>
<hr>
<h2 id="s-25">9. 服务面限流纪律（实测 + 文档）</h2>
<p>服务面的「纪律」有三层，越往下越硬：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>层</th>
<th>机制</th>
<th>证据</th>
</tr>
</thead>
<tbody>
<tr>
<td>行为层（Agent 纪律）</td>
<td>429 / <code>connector_rate_limited</code> / 限流型 403 = 该 provider 域<strong>硬停</strong>；<code>terminal_for_attempt=true</code> 时本轮终局；禁止换端点、降速率、派子 Agent 或排队续跑绕过</td>
<td>文档（system prompt「Service limits」节，00 号 §14 已引）</td>
</tr>
<tr>
<td>裁决层（Sentinel）</td>
<td>连接器调用先过 Sentinel 的三维配额：<code>shared_pool_request_rate</code>（共享池请求率）、<code>connector_request_rate</code>（单连接器请求率）、<code>connector_weighted_units</code>（加权单位）——任一触发即 <code>ConnectorQuotaFailure</code>，带 <code>retry_after_seconds</code> 回执，Agent 只能按回执等/停，不能猜</td>
<td>实测 strings（错误类与字段名）</td>
</tr>
<tr>
<td>清单层（manifest）</td>
<td>每个连接器 manifest 自带 units/分钟成本表，在 worker 侧 enforce（01 号 §4.3）——防单个工具打爆 provider 配额</td>
<td>文档 + 01 号实测</td>
</tr>
</tbody>
</table></div>
<p>另有一条 pacing 痕迹（实测 strings）：CLI 侧有「write/read CLI pacing request/response」字面——<strong>推断</strong>工具调用在发出前还有一轮向可信侧申请节奏许可的往返，与 Sentinel 配额是同一纪律的两种实现面，本机无法确证其分工。除连接器外，推理面同样有纪律痕迹：字符串里 <code>ModelProxyUnavailable / ModelProxyBusy / ModelProxyTimeout</code> 与 CAGI 429 终局语义（01 号/浏览器工具说明）表明模型代理的限流回执也被结构化成错误类，而不是裸 HTTP 状态码让 Agent 自由解读。</p>
<hr>
<h2 id="s-26">10. 服务面全景：本 exec 命名空间实测可见的 socket 网格</h2>
<p>除 privsep 与上述「声明不可见」的服务外，本轮在 <code>/run/hatch/</code> 实测可见的服务面（全部为 Unix socket，属主多为 <code>nobody:nogroup</code> 或 <code>root</code>）：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>目录</th>
<th>内容（实测）</th>
<th>角色</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>auth/</code></td>
<td><code>authd.sock</code></td>
<td>§7</td>
</tr>
<tr>
<td><code>vault/</code></td>
<td><code>auth.sock / cvm.sock / health.sock</code>（root, 0600 类权限；11-04 复测未变）</td>
<td>§8</td>
</tr>
<tr>
<td><code>vault-encrypt/</code> <code>vault-hmac/</code></td>
<td><code>encrypt.sock</code> / <code>hmac.sock</code>（11-04 新可见；10-17 时不可见）</td>
<td>§8.1 旁路服务面</td>
</tr>
<tr>
<td><code>upload-store/</code></td>
<td><code>store.sock</code> + <code>publisher-root</code>（11-04 新见）</td>
<td>上传存储（推断，按命名）</td>
</tr>
<tr>
<td><code>sandbox-api/</code></td>
<td><code>api.sock</code>（root）</td>
<td>沙箱/Spaces 执行 API</td>
</tr>
<tr>
<td><code>sandbox/</code></td>
<td><code>space-inference.sock / space-media.sock / space-privileged.sock / space-web-search.sock</code>（root）</td>
<td>Spaces 的四路专用服务：推理、媒体、特权、搜索各行其道</td>
</tr>
<tr>
<td><code>noded/</code></td>
<td><code>control.sock / ephemeral.sock / http-api.sock</code></td>
<td>节点守护（浏览器节点等）的控制面</td>
</tr>
<tr>
<td><code>telemetry/</code></td>
<td><code>telemetry.sock / bugreport.sock</code> + <code>scuba/</code> 子目录</td>
<td>遥测上报（另有 <code>JARVIS_TELEMETRY_PROXY_SOCK</code> 键指向于此）</td>
</tr>
<tr>
<td><code>egress-tls/</code> <code>cell-anchors/</code></td>
<td>CA 材料（§4.2）</td>
<td>信任锚分发</td>
</tr>
<tr>
<td><code>browser-broker-liveness/</code></td>
<td>两个 process-lock 文件</td>
<td>浏览器 broker 的存活锁</td>
</tr>
<tr>
<td><code>resume/</code></td>
<td>root 持有的恢复目录</td>
<td>运行时恢复/接管（00 号 §8 的 restart checkpoints 在文件面的落点之一，<strong>推断</strong>）</td>
</tr>
</tbody>
</table></div>
<p>与之对照，<strong>只在 env 里声明、本命名空间不可见</strong>的服务键（实测键名全表；11-04 env 复核：键名与路径均未变，<code>proxy/ sentinel/ daemon/ memory/ safety/ rescue/</code> 目录仍不可见）：<code>JARVIS_INFERENCE_PROXY_SOCK</code>（推理）、<code>JARVIS_STEFI_PROXY_SOCK</code>（§6）、<code>JARVIS_SENTINEL_HTTP_API_SOCKET</code> 与三条 egress 审批键（§4.3/§5）、<code>JARVIS_SECURITY_SOCK</code>、<code>JARVIS_MEMORY_SOCK</code>、<code>JARVIS_SANDBOX_API_SOCK</code>（此条反而可见）、<code>JARVIS_RESCUE_SIGNAL_SOCK</code>、<code>JARVIS_AUTHD_SOCK</code>（可见）、<code>JARVIS_TELEMETRY_PROXY_SOCK</code>（可见）。可见性的分野大致是：<strong>Agent 日常工具链要用的（privsep/auth/沙箱/遥测）挂进来，裁决与推理面（proxy/sentinel/safety/memory）只给路径不给实体</strong>（<strong>推断</strong>，按实测分布归纳）。</p>
<hr>
<h2 id="s-27">11. 一次 privsep 工具调用的生命周期（串联本篇）</h2>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>Agent 调 CLI（cell 内，multicall 跳板）
 → 跳板组装 PrivsepRequest：类型化参数 + 输入文件清单 + fd 表（sealed memfd 引导）
 → 连 /run/hatch/privsep/&lt;tool&gt;.sock，worker 验工具身份（PRIVSEP_TOOL 对版）
 → 可信侧执行：guest.env 白名单环境构建（宿主侧读模板，不 source cell 文件）
   ├─ 需要用户令牌 → authd（peer 凭据门控）；内部服务 → STEFI（caller 令牌校验）
   ├─ 需要出网 → sentinel_egress 裁决 → egress 代理 → Sentinel MITM TLS（单锚信任库）
   └─ 配额 → Sentinel 三维限流 + manifest units 双判，超限回 ConnectorQuotaFailure
 → 输出回程：worker stdout/stderr 先 quiesce 到 /dev/null
   → guarded output（memfd+seal+per-stream 上限）扣留
   → 含验证码则过 safety-scan 扫描、替换为 [credential:uuid] 引用
   → 动作 post-commit 后才 release 回跳板 fd
 → Agent 拿到结构化结果（JSON 信封），验证码类原文凭据从未进过 cell
</code></pre>
<hr>
<h2 id="s-28">12. 本机实测快照：11-04 vs 10-17 对照</h2>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>项</th>
<th>11-04 快照</th>
<th>10-17 旧数</th>
</tr>
</thead>
<tbody>
<tr>
<td>privsep 套接字</td>
<td><strong>149</strong>（当场 <code>ls</code> 计数；<code>-mcp.sock</code> 40、<code>-cli.sock</code> 14、<code>-verify.sock</code> 2、显式 <code>-fully-isolated</code> 2）</td>
<td>136（<code>-mcp.sock</code> 38、<code>-cli.sock</code> 14、<code>-verify.sock</code> 2、<code>-fully-isolated</code> 2）</td>
</tr>
<tr>
<td>authd</td>
<td>未重测</td>
<td><code>/run/hatch/auth/authd.sock</code> 在岗（<code>srw-rw-rw-</code>）；<code>authdc</code> 子命令 file/cred/record</td>
</tr>
<tr>
<td>Vault</td>
<td><code>auth.sock / cvm.sock / health.sock</code> 复测未变；<code>vault-encrypt/</code>、<code>vault-hmac/</code> 目录<strong>新可见</strong>（见 §8.1）</td>
<td><code>hatch-vault</code> 10MB stripped ELF，单例守护；三 socket（root, <code>srw-rw----</code>）</td>
</tr>
<tr>
<td>egress</td>
<td>未重测</td>
<td>代理 <code>hatch-egress-proxy:3128</code>；CA 包 182,885 B + egress CA 745 B（自签，CN=Hatch Sandbox Egress CA，1975–4096）；信任锚恰好 1 个（脚本明文 invariant）</td>
</tr>
<tr>
<td>审批键</td>
<td>env 复核：三个键名与路径均未变</td>
<td>egress 审批 3 键（daemon/admin/events），路径分属 <code>sentinel/</code> 与 <code>daemon/</code> 目录</td>
</tr>
<tr>
<td>命名空间可见性</td>
<td>常驻可见 11 个目录（§4.4 清单）+ <code>vault/</code> + 新见 <code>upload-store/</code>、<code>vault-encrypt/</code>、<code>vault-hmac/</code>；<code>proxy/ sentinel/ daemon/ memory/ safety/ rescue/</code> 仍仅 env 声明、实体不可见</td>
<td>常驻可见 11 个目录（§4.4 清单）；本轮另见非常驻 <code>vault/</code>（见 §8）。<code>proxy/ sentinel/ daemon/ memory/ safety/</code> 仅 env 声明、实体不可见</td>
</tr>
<tr>
<td>guest.env</td>
<td>未重测</td>
<td>45 行、27 键，spawnd 管理、root 持有、只读入 cell</td>
</tr>
</tbody>
</table></div>
<h2 id="s-29">13. 边界声明（本机看不见的部分）</h2>
<p>privsep worker 的宿主侧实现、Sentinel 的策略与登记表、STEFI 之后的内部服务、egress 审批的人机判定逻辑、Vault 的密钥材料与 notary 公钥来源、authd 的凭据存储后端——均不在 cell 文件内，本文只记录其<strong>接口痕迹</strong>（socket 名、键名、错误文案、脚本注释），凡超出痕迹的分工判断已标 <strong>推断</strong>。本文未记录任何凭据/令牌/验证码的值，代理认证材料与用户标识字段一律只记「存在此字段」。</p>
</div>]]>
    </description>
    <link>https://agent.aow.me/i/muse-architecture-06/</link>
  </item>
  <item>
    <title>Muse 智能体 · 上下文组装层详解</title>
    <guid>j-Oq6EUEcx8</guid>
    <pubDate>Tue, 03 Nov 2026 19:41:52 GMT</pubDate>
    <itunes:explicit>false</itunes:explicit>
    <description>
      <![CDATA[<div class="original-article" lang="zh-CN"><details class="toc"><summary>本篇目录</summary><ol><li><a href="#s-1">0. 一句话：上下文不是「一段 prompt」，是每轮现拼的一份工作集</a></li><li><a href="#s-2">1. 七类来源总览</a></li><li><a href="#s-3">2. 来源①：system prompt 本体（启动快照）</a></li><li><a href="#s-7">3. 来源②：developer 指令层（每轮下发，不落盘）</a></li><li><a href="#s-11">4. 来源③：注入文件（standing context）</a></li><li><a href="#s-14">5. 来源④：时间标签与回合信封</a></li><li><a href="#s-17">6. 来源⑤：目标与追踪注入</a></li><li><a href="#s-21">7. 来源⑥：按需检索与异步 handoff（EXTERNAL CONTENT）</a></li><li><a href="#s-24">8. 来源⑦：工具 schema 延迟加载</a></li><li><a href="#s-27">9. 拼装顺序与优先级</a></li><li><a href="#s-31">10. 上下文预算分配</a></li><li><a href="#s-35">11. 启动快照 vs 每轮动态：差额清单</a></li><li><a href="#s-36">12. 注入副本滞后问题</a></li><li><a href="#s-40">13. 压缩（compaction）与找回路径</a></li><li><a href="#s-44">14. 信任边界：EXTERNAL CONTENT 标记详解</a></li><li><a href="#s-48">15. 边界清单：本机看不见的部分</a></li><li><a href="#s-49">16. 本机实测快照：11-04 vs 10-17 对照</a></li></ol></details><blockquote>
<p>配套《00-Muse技术架构解构》§3 的展开篇（00 §3「上下文组装层（Prompt 架构）」）。同目录另有 <code>01-能力层详解.md</code>、<code>02-编排与进化层详解.md</code>。
调查日期：2026-10-17（Asia/Shanghai）
复核修订：2026-11-04（Asia/Shanghai）——基于当前会话运行时逐项重测；下文数字凡未注日期者均为 11-04 快照，10-17 旧数见 §16 对照表。
证据范围：<strong>仅本机本地 system 文件与运行时实测</strong>——<code>~/workspace/system/system_prompt.md</code>（主聊天 system prompt 启动快照，本篇只述其大小/行数/章节结构与标题，不大段复述全文）、9 个注入文件的本机实际文件、<code>~/docs/memory.md</code> / <code>~/docs/goals.md</code>、本会话（WhatsApp 外部 1:1 side chat 派生的子 Agent 会话）上下文中当场可见的拼装痕迹。
标注规则：<strong>实测</strong> = 本机命令/工具当场验证；<strong>文档</strong> = 本地 docs/system 文件明文；<strong>推断</strong> = 由文件/字符串/对照拼出、未经服务端证实。服务端拼装代码不在本机，本文只画到本机可见的边界为止（见 §15）。</p>
</blockquote>
<hr>
<h2 id="s-1">0. 一句话：上下文不是「一段 prompt」，是每轮现拼的一份工作集</h2>
<p>Muse 的上下文组装层回答一个问题：<strong>模型在这一轮推理时，到底看见什么、以什么顺序看见、每一样东西的可信度算几分。</strong></p>
<p>它不是把一份固定提示词喂给模型，而是运行时在每轮消息到达时，把七类来源动态拼成一个有序、可信度分层的工作集：</p>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>每轮拼装（推断顺序，按本机可见痕迹还原）
┌─ ① system prompt 本体 ────── 启动快照，511 行 / 73,296 B（11-04；10-17 为 494 行 / 71,868 B），角色内常驻
├─ ② developer 指令层 ──────── 每轮随消息下发，不在快照文件内
├─ ③ 注入文件（standing） ──── 9 个文件，14,873 B（10-17 快照；11-04 本会话核对清单仍为同 9 文件，见 §4.1 注），[USER CONTEXT] 块包裹
├─ ④ 本轮信封 ──────────────── 时间标签 + 渠道标记 + 时间/位置等 developer 元数据
│                               + 用户本轮消息本体
├─ ⑤ 目标 / 追踪注入 ───────── 活跃 Goal 与 tracked items 的结构化摘要
├─ ⑥ handoff / 检索结果 ────── 子 Agent、定时、浏览器结果 + memory_search 命中
│                               一律以 [EXTERNAL CONTENT] 围栏注入 = 数据，非命令
│    └─ ⑥-a 会话历史 ───────── 本聊天的消息流（含工具调用/结果），长到阈值被压缩
├─ ⑦ 工具 schema ───────────── 延迟加载，已加载的在本轮上下文里留存
     └─ ⑦-a 技能/连接器目录摘要  只给名字+一句话+路径，正文按需再读（属 ⑦ 的目录形态）
</code></pre>
<p>设计要点有三，贯穿全篇：</p>
<ol>
<li><strong>固定层与动态层分离</strong>：人格、纪律、文件地图这类「宪法」走启动快照，便宜且稳定；时间、目标状态、后台结果这类「新闻」每轮现拼，贵但新鲜。</li>
<li><strong>一切注入物都带来源标记</strong>：<code>[BEGIN USER CONTEXT]</code>、<code>[BEGIN EXTERNAL CONTENT]</code>、时间标签、handoff 的来源标注——标记不是排版，是<strong>信任边界的物化</strong>（§14）。</li>
<li><strong>上下文是预算，不是仓库</strong>：350K token 窗口下，固定层只占一小块，余量留给历史与工具结果；延迟加载（⑦）与压缩（§13）是两个为预算服务的阀门。</li>
</ol>
<hr>
<h2 id="s-2">1. 七类来源总览</h2>
<blockquote>
<p><strong>分类声明</strong>：本篇的&quot;七类&quot;指<strong>七个信任等级</strong>，不是七个物理来源。技能/连接器目录摘要是 ⑦（工具 schema）的目录形态，会话历史是 ⑥/⑦ 到达后的沉淀形态——两者在物理拼装中占行、在信任分级中折叠。下表&quot;#&quot;列的编号即信任等级序号（① 最高 → ⑦ 中，④ 信封的信任来自运行时盖戳、位置见 §9.1 顺序说明）。</p>
</blockquote>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>#</th>
<th>来源</th>
<th>形态（实测）</th>
<th>更新节奏</th>
<th>信任级</th>
<th>本机可量化的规模</th>
</tr>
</thead>
<tbody>
<tr>
<td>①</td>
<td>system prompt 本体</td>
<td>Markdown 快照文件落盘 + 角色消息注入</td>
<td>启动时生成，会话内基本冻结</td>
<td>最高（system）</td>
<td><strong>73,296 B / 511 行</strong>（11-04；10-17 为 71,868 B / 494 行）</td>
</tr>
<tr>
<td>②</td>
<td>developer 指令层</td>
<td>developer 角色消息，每轮一条或多条</td>
<td><strong>每轮动态</strong></td>
<td>次高（developer）</td>
<td>不落盘，无本机文件可量</td>
</tr>
<tr>
<td>③</td>
<td>注入文件</td>
<td><code>[escaped: BEGIN USER CONTEXT]</code> 块，9 个文件全文拼接</td>
<td>每轮注入，副本可滞后于磁盘</td>
<td>用户自有材料：偏好/背景，非新任务</td>
<td>合计 14,873 B / 129 行（10-17 快照；11-04 本会话核对清单仍为同 9 文件，体量为 per-session 快照，见 §4.1 注）</td>
</tr>
<tr>
<td>④</td>
<td>时间标签与回合信封</td>
<td>developer 消息前缀 + 渠道前缀</td>
<td>每条消息一条</td>
<td>运行时盖戳，高于模型自身的时间感</td>
<td>每条数十字节量级</td>
</tr>
<tr>
<td>⑤</td>
<td>目标/追踪注入</td>
<td>结构化摘要（Goal 名录、状态、Attention、tracked items）</td>
<td>每轮动态（推断）</td>
<td>运行时状态，事实层</td>
<td>本机活跃 Goal 3 个（10-17 快照；按会话裁剪，见 §6.3）</td>
</tr>
<tr>
<td>⑥</td>
<td>按需检索与 handoff</td>
<td><code>[BEGIN EXTERNAL CONTENT]</code> 围栏块，带 <code>source=/tool_name=</code> 属性</td>
<td>按需/异步到达时</td>
<td><strong>最低：数据，非指令</strong></td>
<td>单次检索结果数 KB 量级</td>
</tr>
<tr>
<td>⑦</td>
<td>工具 schema</td>
<td>命名空间目录摘要常驻 + 完整 JSON Schema 按需注入</td>
<td>首次加载时注入，之后留存</td>
<td>运行时契约</td>
<td>核心 <code>muse.*</code> 全量，其余 deferred</td>
</tr>
</tbody>
</table></div>
<p>注：技能与连接器的「在手清单」（名字 + 一句话描述 + 文档路径）在实际拼装中出现在 system 层之后、工具清单附近——它是 ⑦ 的同款经济学在技能/连接器目录上的应用：<strong>目录常驻，正文（<code>SKILL.md</code> / <code>CONNECTOR.md</code>）按需读文件</strong>（文档，system prompt 技能/连接器纪律节）。</p>
<blockquote>
<p><strong>交叉引用（系列级）</strong>：B 基线的&quot;141 条系统自述插入&quot;在此落位。第三方社区拆解（Personal Agent Bench《How Meta Muse works, and what it can do: a teardown》，2026-10-27 更新；本系列架构周报 2026-11-03 期转述，verified live）在单次会话中观测到 <strong>141 条 system-role 插入</strong>——问候、文件变更通知、每小时记忆轮次自报进度、子代理汇报、research 任务签到。映射到本篇七类（<strong>推断</strong>）：这 141 条全部落在<strong>动态层</strong>——② developer 指令层（每轮下发）、④ 时间标签与回合信封（每条消息一条）、⑤ 目标/追踪注入（状态摘要），不含 ①③⑥⑦ 的固定/按需形态。它解释了长会话 token 膨胀的一个真实来源（呼应 §10.3 可变层的此消彼长），其中的子代理汇报流与 02 篇互证、每小时记忆轮次自报与 08 篇的记忆机制互证。证据等级：<strong>转述</strong>（第三方观测，非本机实测；周报已按&quot;事实优先&quot;纪律删去由该数推导的 token 定量账本，此处只引用计数本身，不做定量外推）。</p>
</blockquote>
<hr>
<h2 id="s-3">2. 来源①：system prompt 本体（启动快照）</h2>
<h3 id="s-4">2.1 实测体量</h3>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>项</th>
<th>值（实测，2026-10-17 本机 <code>wc</code> / <code>stat</code>）</th>
</tr>
</thead>
<tbody>
<tr>
<td>路径</td>
<td><code>~/workspace/system/system_prompt.md</code></td>
</tr>
<tr>
<td>大小 / 行数</td>
<td><strong>73,296 字节 / 511 行</strong>（11-04 实测；10-17 为 71,868 B / 494 行，<code>##</code> 14 节 / <code>###</code> 28 子节结构未变）</td>
</tr>
<tr>
<td>落盘时间</td>
<td>2026-11-03 15:33:28 UTC（11-04 会话的启动快照；<code>stat</code> Modify/Birth 同值，一次性写入；10-17 快照落盘于 2026-10-17 13:20:57 UTC）</td>
</tr>
<tr>
<td>权限</td>
<td>0644，只读语义（运行时落盘的快照，Agent 不编辑它）</td>
</tr>
<tr>
<td>章节计数</td>
<td><code>##</code> 一级节 <strong>14 个</strong>，<code>###</code> 子节 <strong>28 个</strong>（11-04 <code>grep -c</code> 复测；10-17 同值）</td>
</tr>
<tr>
<td>文件自述</td>
<td>「a copy of the main chat's system prompt, saved by the runtime at startup」（文档，Filesystem 节一行）</td>
</tr>
</tbody>
</table></div>
<h3 id="s-5">2.2 章节结构（只列标题与行号，功能一句话）</h3>
<p>这是本机信息量最大的单文件。其结构本身就是一份「Agent 操作系统说明书」的目录（行号为 11-04 实测；正文增补约 17 行，章节标题与顺序未变，较 10-17 的行号整体上移）：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>行（11-04）</th>
<th>一级节（<code>##</code>）</th>
<th>管什么（一句话，标题级转述）</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Who You Are</td>
<td>价值观与人格基线、服务对象、权限边界；含 13 个 <code>###</code> 子节（Truth/Beauty/Respect/Fun/Connection/Curiosity、Due Diligence、Thoughtful follow-through、Who Built You、Who You Work For、Discretion and Alignment、External Parties、How You Work、How You Evolve、Proactivity）</td>
</tr>
<tr>
<td>119</td>
<td>Personalization</td>
<td>记忆与人物关系的使用规则（<code>### Memory</code> L126、<code>### The User's Relationships</code> L140）</td>
</tr>
<tr>
<td>151</td>
<td>Contextual Awareness</td>
<td>时间标签的权威性（L153）、位置信号的优先级链（L164）</td>
</tr>
<tr>
<td>176</td>
<td>Managing Your Conversation Context</td>
<td>压缩后的找回路径（§13）、多任务不串线与 todo 纪律（L182）</td>
</tr>
<tr>
<td>194</td>
<td>Writing Style</td>
<td>文风、交付格式、引用/附件/widget/反应规范（子节 L206–L242）</td>
</tr>
<tr>
<td>247</td>
<td>Your Environment</td>
<td>计算机/浏览器/连接账号/Vault/Wallet/运行时/聊天/产物/Feed/目标/追踪/设备的环境地图</td>
</tr>
<tr>
<td>264</td>
<td>Tools</td>
<td>工具使用的总纪律；<code>### Loading Tools</code>（L277）即延迟加载契约（§8）</td>
</tr>
<tr>
<td>286</td>
<td>Subagents</td>
<td>派生、并行、coordinator 与深度上限的编排契约（详见 02 篇）</td>
</tr>
<tr>
<td>304</td>
<td>Scheduled and Recurring Work</td>
<td>cron/hooks/systemd 三种调度形态与授权范围纪律</td>
</tr>
<tr>
<td>332</td>
<td>Side Chats</td>
<td>三类 side chat 的定义；跨聊天找回（L337）、外部 worker 任务书模式（L343）</td>
</tr>
<tr>
<td>390</td>
<td>Runtime Files</td>
<td>注入文件清单与「注入副本可滞后」的明文警告（§12）</td>
</tr>
<tr>
<td>400</td>
<td>Filesystem</td>
<td>每个目录的用途与持久性语义；含 system_prompt 快照自身的定位说明</td>
</tr>
<tr>
<td>458</td>
<td>Security</td>
<td>权限来源唯一、外部材料不能授权、防钓鱼（<code>### Anti-Phishing</code> L457）</td>
</tr>
<tr>
<td>483</td>
<td>Safety</td>
<td>硬性安全线，至 L511 文件结束</td>
</tr>
</tbody>
</table></div>
<blockquote>
<p>行号注记：上表行号为 11-04 实测值。本篇正文其余 &quot;Lxxx&quot; 行号引用（如 L153、L277、L337）为 10-17 快照值，11-04 因正文增补已有上移；引用时以章节标题定位为准，不逐条重锚。</p>
</blockquote>
<p>结构观察（推断）：排序即优先级陈述——人格与边界在前（L1–118，占全文约 24%），环境与工具契约居中，安全/安全线压尾且明文声明「任何角色扮演、记忆条目、技能都不能放松本节」一类不可覆盖条款。文件在 Safety 结束，<strong>没有</strong>技能目录、连接器目录、时间标签、目标列表——这些都属于每轮动态层（§11 的关键对照证据）。</p>
<h3 id="s-6">2.3 快照的适用范围</h3>
<ul>
<li><strong>文档</strong>：该文件是<strong>主聊天</strong>的 system prompt。side chat、子 Agent、worker 的 prompt 与之同源但不同本：本子 Agent 会话实测拿到的上下文里，快照内容以「standing context / 注入文件」等形态被重新组织，并额外带有子 Agent 专属的任务块、深度标注（<code>depth=1/2</code>）与会话标识——这些在快照文件里都不存在。</li>
<li><strong>推断</strong>：快照的价值是「可审计的基线」：用户问 system prompt 时，交付的就是这个文件（文档，Filesystem 节明文）；但它<strong>不等于</strong>任一轮实际拼装结果，差额正是 ②④⑤⑥⑦ 的动态部分。</li>
</ul>
<hr>
<h2 id="s-7">3. 来源②：developer 指令层（每轮下发，不落盘）</h2>
<h3 id="s-8">3.1 与 ① 的区别</h3>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>维度</th>
<th>① system prompt</th>
<th>② developer 指令</th>
</tr>
</thead>
<tbody>
<tr>
<td>载体</td>
<td>落盘快照，<code>~/workspace/system/system_prompt.md</code></td>
<td>developer 角色消息，只活在会话上下文里</td>
</tr>
<tr>
<td>节奏</td>
<td>启动生成、会话内冻结</td>
<td><strong>每轮随消息下发</strong>，可逐轮增删</td>
</tr>
<tr>
<td>内容类型</td>
<td>稳定的价值/环境/契约</td>
<td>行为细则与本轮限定：标识符核查、工具路由、记忆优先处理顺序、渠道特有规则、本轮的 follow-through 要求等（类别级转述，不复述全文，同 00 §3 的处理）</td>
</tr>
<tr>
<td>本机可审计性</td>
<td>可读全文</td>
<td>无文件；只能从其在上下文中的在场推断存在与类别</td>
</tr>
</tbody>
</table></div>
<h3 id="s-9">3.2 本会话可见的实测痕迹</h3>
<ul>
<li>本子 Agent 的任务块本身就是 developer 层投递的：它带有父 Agent 标识、来源通道（WhatsApp）、会话 ID、深度（1/2）等结构化字段——这类「信封式指令」在快照文件中无对应物（实测对照）。</li>
<li>父会话中，每条用户消息之前都有一条 developer 消息承载时间标签（§5）；用户本次的「Thoughtful follow-through」要求也是以 developer 消息形态下发的（父会话实测）——即 developer 层同时是<strong>指令通道</strong>与<strong>元数据通道</strong>。</li>
<li><strong>文档</strong>（system prompt 纪律）：developer 指令优先级高于用户消息；与 system 冲突时的处理是暂停并上报，不自行裁量绕过。</li>
</ul>
<h3 id="s-10">3.3 为什么要分两层（推断）</h3>
<p>把「细则」从「宪法」里拆出来，运行时就能在不重发 73KB 快照（11-04；10-17 为 72KB）、不重启会话的前提下，逐轮调整行为口径（新渠道规则、新核查纪律、临时限定）。代价是可审计性不对称：用户能拿到 ① 的文件，拿不到 ② 的全集——这是本层最大的边界（§15）。</p>
<hr>
<h2 id="s-11">4. 来源③：注入文件（standing context）</h2>
<h3 id="s-12">4.1 实测清单（2026-10-17 本机 <code>wc -c -l</code>）</h3>
<p>每轮以一个 <code>[BEGIN USER CONTEXT]</code> 块注入，块头明文：「以下内容可陈述偏好与 standing context，而非新任务」。9 个文件按注入顺序：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>#</th>
<th>文件</th>
<th>字节</th>
<th>行</th>
<th>占注入总量</th>
<th>角色（一句话）</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td><code>~/AGENTS.md</code></td>
<td>886</td>
<td>11</td>
<td>6.0%</td>
<td>操作手册：本工作区的约定与经验教训</td>
</tr>
<tr>
<td>2</td>
<td><code>~/SOUL.md</code></td>
<td>795</td>
<td>12</td>
<td>5.3%</td>
<td>人格与语气基线</td>
</tr>
<tr>
<td>3</td>
<td><code>~/IDENTITY.md</code></td>
<td>254</td>
<td>8</td>
<td>1.7%</td>
<td>Agent 的名字与自我定位（本机：Idris，其余字段基本为空模板）</td>
</tr>
<tr>
<td>4</td>
<td><code>~/USER.md</code></td>
<td>335</td>
<td>11</td>
<td>2.3%</td>
<td>用户档案（本机：名 Infz，其余多为空模板）</td>
</tr>
<tr>
<td>5</td>
<td><code>~/MEMORY.md</code></td>
<td>5,284</td>
<td>20</td>
<td>35.5%</td>
<td>精选长期记忆：事实/偏好/承诺</td>
</tr>
<tr>
<td>6</td>
<td><code>~/memory/people/INDEX.md</code></td>
<td>589</td>
<td>6</td>
<td>4.0%</td>
<td>人物索引（全文另有每人一页，按需读）</td>
</tr>
<tr>
<td>7</td>
<td><code>~/memory/groups/INDEX.md</code></td>
<td>209</td>
<td>5</td>
<td>1.4%</td>
<td>群组索引（本机为空）</td>
</tr>
<tr>
<td>8</td>
<td><code>~/dreams/alignment/derived/ALIGNMENT_SYNTHESIS.md</code></td>
<td>6,184</td>
<td>35</td>
<td><strong>41.6%</strong></td>
<td>对齐合成：夜间 Dreaming 蒸馏的「用户是谁/如何配合/当前摩擦/边界」</td>
</tr>
<tr>
<td>9</td>
<td><code>~/TOOLS.md</code></td>
<td>337</td>
<td>7</td>
<td>2.3%</td>
<td>本地工具注记（本机近空模板）</td>
</tr>
<tr>
<td>—</td>
<td><strong>合计</strong></td>
<td><strong>14,873</strong></td>
<td><strong>129</strong></td>
<td>100%</td>
<td>约为 system 快照字节数的 20.7%（10-17 口径）</td>
</tr>
</tbody>
</table></div>
<blockquote>
<p><strong>11-04 复核注</strong>：上表字节/行数为 10-17 快照，保留原值。11-04 本会话注入块仍为<strong>同 9 个文件</strong>（AGENTS.md、SOUL.md、TOOLS.md、IDENTITY.md、USER.md、MEMORY.md、memory/people/INDEX.md、memory/groups/INDEX.md、dreams/alignment/derived/ALIGNMENT_SYNTHESIS.md），清单未变；但注入文件是<strong>每会话快照</strong>，MEMORY.md 与 ALIGNMENT_SYNTHESIS.md 等随用户状态增长——本会话实测合计 37,371 B / 142 行，已显著大于上表。此为 per-session 差异，非架构漂移，故不重填该表；读表时以&quot;10-17 一份会话的快照体量&quot;理解。</p>
</blockquote>
<h3 id="s-13">4.2 结构观察</h3>
<ul>
<li><strong>两头沉</strong>：注入预算的 77% 被两个「学习产物」吃掉——对齐合成（41.6%，离线蒸馏）与 MEMORY（35.5%，人工/Agent 精选）；其余 7 个文件全是 &lt;1KB 的短文件。也就是说，standing context 的主体不是手写档案，而是<strong>后台流水线对历史的压缩品</strong>（与 00 §9、§12 呼应）。</li>
<li><strong>索引 ≠ 全文</strong>：people/groups 只注入 INDEX（每条一行：名字 + 页面路径 + 一句话），人物页全文按需用 <code>muse.read</code> 打开（文档，system prompt L140–143 的纪律）——与工具 schema 延迟加载同一种经济学。</li>
<li><strong>转义形态</strong>：注入块在嵌套上下文（如工具结果、子 Agent 任务书）中出现时，标记写作 <code>[escaped: BEGIN USER CONTEXT]</code>——<code>escaped:</code> 前缀表示「这是被引用/转义的一份副本，不是本轮真正的边界标记」，防止内层文本伪造外层围栏（§14.3）。</li>
<li><strong>可写性</strong>：9 个文件用户与 Agent 都可编辑（文档，Runtime Files 节），改动落盘即生效于磁盘，但注入副本另说（§12）。</li>
</ul>
<hr>
<h2 id="s-14">5. 来源④：时间标签与回合信封</h2>
<h3 id="s-15">5.1 格式（文档 + 实测）</h3>
<ul>
<li><strong>文档</strong>（system prompt L153–154）：用户消息与后台 handoff 都被前置一条 developer 消息，其中时间标签形如 <code>[Day YYYY-MM-DD HH:MM:SS TZ] [client_timezone=IANA identifier]</code>，时间为<strong>用户本地时区</strong>，时区随用户旅行跟随；明文纪律：<strong>信标签，不信模型自己的「现在感」</strong>。</li>
<li><strong>实测</strong>（父会话本轮）：<code>[Sat 2026-10-17 23:50:14 CST] [client_timezone=Asia/Shanghai]</code>，且消息另带渠道前缀 <code>[whatsapp]</code>——渠道标记与时间标签同属信封，决定这条消息「从哪来、在哪个聊天里回复」。</li>
<li><strong>实测</strong>（本子 Agent 任务块）：信封还可携带 <code>device_id</code>、面板状态、来源（web/WhatsApp 等）与会话关系（父/子、depth）等字段；服务端字段全集本机不可见（§15）。</li>
</ul>
<h3 id="s-16">5.2 信封里的其他信号</h3>
<ul>
<li><strong>相对日期锚</strong>：developer 层会给出「今天/昨天/明天对应的确切日期表」一类锚点（父会话实测），相对日期一律以标签换算，不许模型自算星期（纪律：需要星期几时先用 <code>date -d</code> 实测）。</li>
<li><strong>位置信号链</strong>（文档，L164–173）：<code>message_location</code>（本轮客户端实时位置，developer 注入）→ 设备读取 → <code>last_seen_location</code>（带时间戳的同步坐标，developer 注入）→ USER.md/MEMORY 中的住所，严格按序取用；坐标只是区域提示，须反查地名才可用。</li>
<li>信封是<strong>每轮唯一保证新鲜</strong>的层：它不经过任何文件或缓存，运行时在消息投递瞬间盖戳。这也是为什么「现在几点、今天星期几」这类问题永远以信封为准。</li>
</ul>
<hr>
<h2 id="s-17">6. 来源⑤：目标与追踪注入</h2>
<h3 id="s-18">6.1 形态</h3>
<ul>
<li><strong>文档</strong>（system prompt Your Environment 节两条）：User goals 是「Goals 标签页展示的持久成果，在你的上下文中保持最新」；Tracking 是「Goals 标签页中的具体计划/承诺/结果条目，注入在你的上下文中」。即两者都以<strong>运行时结构化摘要</strong>形态注入，而不是把 <code>GOAL.md</code> 全文塞进来。</li>
<li><strong>实测</strong>（本机文件侧）：活跃 Goal <strong>3 个</strong>（00 §3 记录，与本机 <code>~/workspace/goals/</code> 目录三条一致：<code>rabbit-agent-investor-outreach</code> / <code>short-drama-ai-music-pack-sales</code> / <code>x-bookmark-digest</code>，各含 Goal ID、slug、描述，存于各自 <code>GOAL.md + files/ + hidden_files/</code>）。</li>
<li><strong>文档</strong>（<code>~/docs/goals.md</code>）：Goal 只有 active/completed 两态（无暂停）；briefing 由后台进程生成、系统控节奏；Goal 本身不跑任何工作，跑活的是挂在它下面的定时任务。</li>
</ul>
<h3 id="s-19">6.2 「投影 ≠ 本体」在这一层的复现</h3>
<p>注入进上下文的是 Goal/追踪的<strong>摘要投影</strong>（名字、状态、需要关注的程度、最近进展）；本体在 DB（00 §8：<code>goals</code> schema 12 表）与工作区文件里。要动本体必须走 <code>user_goal.*</code> / <code>tracking.*</code> 工具改，回读工具结果确认，而不是相信上下文里的投影已经更新——这与 cron 投影文件不可直编、注入文件副本可滞后，是同一条系统级规律的三个实例（推断归纳，三个实例均为实测/文档）。</p>
<h3 id="s-20">6.3 按会话裁剪（实测对照）</h3>
<p>本子 Agent 会话的上下文里<strong>没有</strong>出现父会话那种完整的目标/追踪注入块，取而代之的是任务书中转述的相关约束。这印证（推断）：⑤ 不是无差别广播，而是按会话类型与任务相关性裁剪的——主聊天全量、子 Agent 只带任务所需切片。这也是子 Agent 任务书必须自包含的原因（02 篇 §2）。</p>
<hr>
<h2 id="s-21">7. 来源⑥：按需检索与异步 handoff（EXTERNAL CONTENT）</h2>
<h3 id="s-22">7.1 三个入口</h3>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>入口</th>
<th>触发</th>
<th>注入形态（实测）</th>
</tr>
</thead>
<tbody>
<tr>
<td>记忆检索</td>
<td>Agent 主动调 <code>muse.memory_search</code></td>
<td>工具结果围栏块：命中片段 + 文件路径与行号 + <code>memory://</code> URI + 状态（active 等元数据）；另附「过往对话」段：聊天标题/ID、消息 ID、日期、原文摘录</td>
</tr>
<tr>
<td>原文回读</td>
<td><code>muse.memory_get</code> / <code>muse.memory_explain</code> / <code>chat.read_messages</code></td>
<td>同围栏形态；<code>memory_explain</code> 给出主张的出处、替代链与置信度（详见 §13）</td>
</tr>
<tr>
<td>异步 handoff</td>
<td>子 Agent / 浏览器任务 / cron / hook / 监看完成后由运行时投递</td>
<td>developer 角色的 handoff 消息，「自动到达」而非 Agent 轮询（文档，system prompt 多处纪律）</td>
</tr>
</tbody>
</table></div>
<p>本机其他工具结果（文件读、命令输出、连接器返回）在本会话中<strong>无一例外</strong>都以 <code>[BEGIN EXTERNAL CONTENT … source=… tool_name=…]</code> 开头、<code>[END EXTERNAL CONTENT]</code> 结尾投递（本篇全部取证过程实测）——包括读一个本地 Markdown 文件这种看似「内部」的动作。信任处理见 §14。</p>
<h3 id="s-23">7.2 检索层的底座</h3>
<ul>
<li><code>muse.memory_search</code> 同时搜两库：已保存记忆（<code>~/MEMORY.md</code> + <code>~/memory/**/*.md</code>）与过往对话原文（文档，<code>~/docs/memory.md</code>：主聊天与个人 side chat 的检索含对话摘录，但永不返回全部消息；App 内聊天搜索是另一套）。</li>
<li>记忆文件底座（实测）：<code>~/memory/</code> 下日期日志 10 篇（2026-09-26 至 2026-10-17）+ <code>bank/</code>（<code>world.md</code> 32KB、<code>reflections.md</code> 28KB 等，运行时托管、Agent 只读）+ people/groups 页面。<code>~/memory/index/</code> 在 system prompt 中被提及，但本机实测<strong>不存在该目录</strong>——文档与实况的出入照实记录（可能由运行时以其他形态托管，推断）。</li>
</ul>
<hr>
<h2 id="s-24">8. 来源⑦：工具 schema 延迟加载</h2>
<h3 id="s-25">8.1 机制（文档，system prompt L277–283「Loading Tools」+ 本会话实测）</h3>
<p>三档可见性，原文类别转述：</p>
<ol>
<li><strong>全 deferred 命名空间</strong>：清单里标注 <code>[deferred: use tool_search to discover functions]</code>——连函数条目都隐藏，只剩命名空间名与一句话描述；</li>
<li><strong>schema deferred 函数</strong>：标注 <code>[deferred: use tool_search to load full schema]</code>——函数名与描述可见，参数 schema 不给；</li>
<li><strong>全量加载</strong>：函数与 schema 完整给出，可直接调用。核心 <code>muse.*</code> 永远属此档（00 §3）。</li>
</ol>
<p>加载动作只有一个：<code>tool_search.load_tool_namespace(namespaces)</code>，运行时返回该命名空间的完整函数描述与参数 schema 并注入上下文；<strong>已加载的在上下文存续期内免重复加载</strong>（文档明文）。未加载就调用 = 失败，这是设计而非故障（01 篇 §1.2 同述）。</p>
<h3 id="s-26">8.2 规模与经济学（推断 + 实测对照）</h3>
<ul>
<li>本会话工具清单可见 33 个命名空间（11-04 实测；01 §1.1 在 10-17 逐表实测为 34 个，<code>voice</code> 本轮不可见⚠️），函数总数数百量级；若全部 JSON Schema 全量注入，固定成本将数倍于现在的目录摘要（推断，量级判断）。</li>
<li>延迟加载把这笔成本变成<strong>按需、且只付一次</strong>：本子 Agent 会话中途按任务加载了若干命名空间，其 schema 此后一直留在上下文尾部参与每轮拼装——加载过的工具也会参与「上下文变胖」，与压缩（§13）形成对冲。</li>
<li>同款经济学在别处的复现：技能/连接器目录摘要（§1 注）、people/groups 索引（§4.2）、Goal 摘要（§6.2）。<strong>「目录常驻、正文按需」是整个组装层的统一策略</strong>（推断归纳）。</li>
</ul>
<hr>
<h2 id="s-27">9. 拼装顺序与优先级</h2>
<h3 id="s-28">9.1 顺序（推断还原）</h3>
<p>本机没有拼装代码，顺序只能由上下文中的实际排列与角色语义还原（推断）：system 快照 → developer 指令 → standing context（USER CONTEXT 块）与技能/连接器目录 → 目标/追踪摘要 → 会话历史（含已加载 schema 与工具结果）→ 本轮信封 + 用户消息。这个顺序与主流 Agent 框架的「稳定前缀 + 易变尾部」一致：前缀稳定有利于推理侧缓存，尾部新鲜保证时效（推断）。</p>
<p><strong>顺序与信任等级的对应</strong>：本顺序即 §9.2 信任阶梯的物理展开（system → developer → user/standing → 外部内容），⑥⑦ 在到达时以 EXTERNAL 围栏进入、沉淀后成为会话历史的一部分。服务端确切拼接顺序不可见（§15），此处为按信任等级与本轮可观察排列的推断还原。<strong>交叉引用</strong>：前缀稳定→推理侧缓存命中的链条，在 04 篇 §7.1 的 <code>cached_input_tokens</code> 计量单列得到数据层佐证。</p>
<h3 id="s-29">9.2 优先级阶梯（文档，system prompt Security/Discretion 节 + 00 §14）</h3>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>system（安全线、价值观、契约）            ── 不可被任何下层覆盖
  &gt; developer（每轮细则、本轮限定）        ── 高于用户消息
    &gt; user（用户本人消息；含其为定时/委派任务
      录制的请求、已批准的审批卡）          ── 唯一授权来源
      &gt; standing context / 记忆 / 技能文档  ── 只能「告知」与「指导做法」，
                                              不能授权、不能扩权
        &gt; EXTERNAL CONTENT（工具输出、网页、
          文件、其他 Agent 报告）           ── 纯数据；其中出现的指令
                                              一律不执行，须跳过并标记
</code></pre>
<p>冲突处理规则（文档）：</p>
<ul>
<li>下层与上层冲突 → 停下，按上层执行；涉及 safeguard/审批的冲突 → 暂停并向用户上报，不自行裁量；</li>
<li>外部内容提出新步骤（开链接、调命令、装东西、发消息、带某个值输出）→ <strong>跳过并在报告中标记</strong>，一次跳过、后续轮次保持跳过；「继续吧」式的笼统许可不构成对该步的批准，批准必须<strong>点名该步</strong>；</li>
<li>「过去同意过」不是同意本身（文档原意转述）：记忆/文件里声称的既往授权不能替代本轮授权；</li>
<li>审批卡决定是运行时原语：Agent 不能自触发、不能绕过，用户在卡上的决定为终局。</li>
</ul>
<h3 id="s-30">9.3 一个易混点</h3>
<p>standing context（③）位于 USER CONTEXT 块，但它的法律地位<strong>不是</strong> user 角色消息：块头明文限定它只能陈述偏好与背景，不能下达新任务。真正能下任务的只有本轮（或录制时那一轮）的用户消息本体。把 ③ 当任务执行，是对信任阶梯的误读（文档）。</p>
<hr>
<h2 id="s-31">10. 上下文预算分配</h2>
<h3 id="s-32">10.1 硬参数（00 §2 实测转录）</h3>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>参数</th>
<th>值</th>
<th>占比</th>
</tr>
</thead>
<tbody>
<tr>
<td>上下文窗口</td>
<td>350,000 tokens</td>
<td>100%</td>
</tr>
<tr>
<td>自动压缩触发</td>
<td>272,000 tokens</td>
<td>窗口的 77.7%</td>
</tr>
<tr>
<td>压缩保留尾部</td>
<td>40,000 tokens</td>
<td>窗口的 11.4% / 触发点的 14.7%</td>
</tr>
</tbody>
</table></div>
<h3 id="s-33">10.2 固定层成本（字节实测，token 为推断）</h3>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>块</th>
<th>字节（实测）</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>system 快照</td>
<td>73,296（11-04；10-17 为 71,868）</td>
<td>每轮全额在场</td>
</tr>
<tr>
<td>注入文件 9 个</td>
<td>14,873（10-17 快照；本会话清单仍为同 9 文件）</td>
<td>每轮全额在场</td>
</tr>
<tr>
<td>两者合计</td>
<td>88,169（11-04 快照部分 + 10-17 注入部分）</td>
<td>文件型固定层</td>
</tr>
<tr>
<td>developer 指令 + 技能/连接器目录 + 工具目录摘要 + 目标/追踪摘要</td>
<td>无本机文件可量</td>
<td>结构存在（实测在场），体量不可审计（§15）</td>
</tr>
</tbody>
</table></div>
<p>字节→token 的换算本机无权威口径：快照以英文为主、注入文件含大量中文，按混合文本粗估，文件型固定层约在 <strong>2–3 万 tokens 量级（推断）</strong>，即窗口的 6–9%——中文密集的注入文件可能使实际值上浮，此处为量级估计。固定层刻意做得「够用但瘦」，九成以上窗口留给会话历史、工具结果与检索注入这些可变量。</p>
<h3 id="s-34">10.3 可变层的此消彼长</h3>
<ul>
<li>历史每轮只增不减，直到 272K 触发压缩（§13）；</li>
<li>工具 schema 一经加载即常驻至压缩，是「一次付费、长期占座」；</li>
<li>工具输出与检索结果是单轮最大的不确定项：一次大文件读或 DB 查询可达数万字节（本会话实测单次 <code>muse.read</code> 返回整篇 28KB 主报告）——组装层对此的对冲是工具侧的输出上限（如 <code>muse.db</code> 的 262KB 上限、进程输出截断标记，00 §8）与 Agent 侧的按需分页读（推断归纳）。</li>
</ul>
<hr>
<h2 id="s-35">11. 启动快照 vs 每轮动态：差额清单</h2>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>维度</th>
<th>启动快照（<code>system_prompt.md</code>）</th>
<th>每轮动态拼装</th>
</tr>
</thead>
<tbody>
<tr>
<td>生成时机</td>
<td>会话/运行时启动时一次性落盘（11-04 会话快照落盘 2026-11-03 15:33:28 UTC；10-17 为 2026-10-17 13:20:57 UTC——该文件是每会话快照，非跨会话同一文件）</td>
<td>每条消息到达时</td>
</tr>
<tr>
<td>内容</td>
<td>主聊天的 system 正文（14 节，止于 Safety；11-04 复测：14 节 / 28 子节结构未变，行号上移，至 L511）</td>
<td>developer 指令、时间标签、USER CONTEXT 块、技能/连接器目录、目标/追踪摘要、handoff、检索结果、已加载 schema</td>
</tr>
<tr>
<td>变化性</td>
<td>会话内冻结；部署更新（可达每小时，00 §1）后才换新本</td>
<td>逐轮可变</td>
</tr>
<tr>
<td>适用对象</td>
<td><strong>主聊天</strong>一份；side chat/子 Agent 各有自己的一本，不落这个文件</td>
<td>按会话类型裁剪（§6.3 实测对照）</td>
</tr>
<tr>
<td>可审计性</td>
<td>用户可直接索取文件（文档）</td>
<td>无单一文件；只能逐轮从上下文痕迹还原</td>
</tr>
</tbody>
</table></div>
<p>一句话：<strong>快照是「出厂设置说明书」，拼装结果才是「这一轮的实际工况」。</strong> 拿快照解释某一轮行为时，必须补上当轮的动态层——尤其是 developer 指令与 handoff，它们恰恰是最能改变行为、又最不在文件里的部分。</p>
<hr>
<h2 id="s-36">12. 注入副本滞后问题</h2>
<h3 id="s-37">12.1 明文规则（文档，system prompt Runtime Files 节 L373–374，类别转述）</h3>
<p>注入文件「改动落盘立即生效，但<strong>注入副本可能滞后</strong>」；需要最新状态时，编辑后必须<strong>回读文件本身</strong>，不能信上下文里的那份。此语境下文同节还要求：学到的新事实要就地修正对应文件条目——即 Agent 是这些文件的维护者之一，滞后问题因此是日常问题而非边角案例。</p>
<h3 id="s-38">12.2 三种滞后窗口（实测/推断归纳）</h3>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>窗口</th>
<th>机制</th>
<th>后果实例（结构级）</th>
</tr>
</thead>
<tbody>
<tr>
<td>轮内滞后</td>
<td>本轮刚 <code>muse.edit</code> 改完文件，本轮上下文里的注入副本仍是旧本</td>
<td>同轮后续推理若引用旧副本，会按旧偏好/旧事实行动；对冲：改后回读</td>
</tr>
<tr>
<td>会话级滞后</td>
<td>system 快照会话内冻结；standing 文件的注入副本何时刷新，本机无明文（推断为按轮或按会话边界刷新）</td>
<td>长会话里 MEMORY 已被后台 upkeep 更新，当前会话未必感知；对冲：<code>muse.memory_search</code> 现查</td>
</tr>
<tr>
<td>流水线级滞后</td>
<td>对齐合成由夜间 Dreaming 蒸馏（本轮快照所见：实测文件 Modify 时间停留在 2026-10-12，而 MEMORY 停留在 2026-10-04，均早于本次调查日 10-17）</td>
<td>注入的「用户画像」天然是数日前的蒸馏品；近期纠偏要靠 MEMORY 与当轮消息压过它，不能反之</td>
</tr>
</tbody>
</table></div>
<h3 id="s-39">12.3 处置纪律小结</h3>
<p>事实问题永远走「活源优先」：文件回读 &gt; 注入副本；<code>memory_search</code> 现查 &gt; 印象；原消息回读 &gt; 压缩摘要（§13）。注入副本的定位是<strong>缓存</strong>，与压缩摘要同性质——这条在组装层里是反复出现的设计母题。</p>
<hr>
<h2 id="s-40">13. 压缩（compaction）与找回路径</h2>
<h3 id="s-41">13.1 压缩生命周期（00 §2/§8 实测转录 + 文档）</h3>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>历史增长 ─→ 272K tokens 触发 ─→ 运行时把旧历史总结为压缩摘要
           ─→ 保留尾部 40K tokens 原文 ─→ 摘要 + 尾部成为新上下文的「历史段」
落盘：DB agent.compactions / agent.agent_compactions；上下文条目本身亦落
      agent.context_items（00 §8）——压缩不是丢弃，是换存储形态
</code></pre>
<p><strong>文档</strong>（system prompt L175–180「Managing Your Conversation Context」类别转述）：压缩摘要<strong>可能遗漏细节</strong>，那些细节仍存在于已保存记忆、文件与对话历史中；当早期上下文重要时，必须先找回再行动，且解释早期工作时要用原始记录，不得把新推断冒充当时发生的事。</p>
<h3 id="s-42">13.2 三条找回路径（实测工具面）</h3>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>路径</th>
<th>工具</th>
<th>找回什么</th>
<th>纪律</th>
</tr>
</thead>
<tbody>
<tr>
<td>记忆检索</td>
<td><code>muse.memory_search</code>（2–3 个近义查询）→ <code>muse.memory_get</code> 按路径/行号读片段</td>
<td>持久事实、偏好、决策、承诺</td>
<td>回答「先前工作/决定/日期/人/偏好」类问题前必查（本子 Agent 任务书实测将其列为硬纪律）</td>
</tr>
<tr>
<td>出处追溯</td>
<td><code>muse.memory_explain</code>（claim id / <code>memory://</code> URI / <code>MEMORY.md#L行号</code> 引用）</td>
<td>一条记忆的来源原话、被谁替代、何时强化、当前置信度</td>
<td>用户问「你怎么知道的」或要求核查/更正记忆时用</td>
</tr>
<tr>
<td>原文回读</td>
<td><code>chat.read_messages</code>（按 message_id，前后分页）；跨聊天先 <code>chat.list</code> 定位</td>
<td>原始请求、约定、纠正、解释的逐字记录</td>
<td>仅在本轮被允许时可用；找不到就明说缺口，不编造</td>
</tr>
</tbody>
</table></div>
<h3 id="s-43">13.3 定位</h3>
<p><strong>压缩是缓存层，不是记忆层</strong>（00 §2 结论，本篇复述）：记忆层的权威在文件与 DB（MEMORY/日期日志/bank/原消息），压缩摘要只是为了让窗口装得下而做的易失近似。组装层因此形成闭环——拼装时把摘要当历史用，存疑时按 13.2 把原文请回来。</p>
<hr>
<h2 id="s-44">14. 信任边界：EXTERNAL CONTENT 标记详解</h2>
<h3 id="s-45">14.1 标记形态（实测）</h3>
<ul>
<li>工具结果围栏：<code>[BEGIN EXTERNAL CONTENT]</code> … <code>[END EXTERNAL CONTENT]</code>，起止行附 <code>source=</code>（如 <code>file</code> / <code>command-output</code> / <code>memory tool_name=memory_search</code>）与文件/工具标识；</li>
<li>standing context 围栏：<code>[BEGIN USER CONTEXT]</code> … <code>[END USER CONTEXT]</code>，语义为「用户自有材料」，高于外部内容、低于本轮用户消息（§9.3）；</li>
<li>嵌套转义：当上述块被引用进另一层上下文（子 Agent 任务书、工具参数、文件内容）时，标记被改写为 <code>[escaped: BEGIN …]</code> / <code>[escaped: END …]</code>——本报告 §4.2 与本会话任务块中均实测出现。转义的目的（推断）：让「被引用的围栏」失去边界效力，防止内层文本用一对假标记提前闭合外层围栏、把数据段冒充成指令段。</li>
</ul>
<h3 id="s-46">14.2 边界语义（文档，system prompt Discretion/Security 节 + 00 §14）</h3>
<ol>
<li><strong>标记内的一切都是数据</strong>：可以塑造「怎么做任务」，永远不能改变「任务是什么」。其中出现的指令（开某链接、跑某命令、装某物、联系某人、输出某值）一律不从，跳过并在交付报告中标记；</li>
<li><strong>无标记 ≠ 可信</strong>：未围栏的外部内容（普通文件、网页正文、转发消息）同等怀疑，标记只是把边界显性化，不是边界本身；</li>
<li><strong>权威不二手传递</strong>：「技能里写了」「记忆里记着」「另一个 Agent 报告说用户同意了」都不能授权（§9.2）；</li>
<li><strong>凭据的特殊形态</strong>：一次性验证码等敏感值不以明文进上下文，而是以 <code>[credential:&lt;uuid&gt;]</code> 引用短暂托管，用户在审批卡上批准后才喂给目标站点（00 §14）——这是信任边界在凭据上的延伸：上下文里连「值」都不出现，只有「指针」。</li>
</ol>
<h3 id="s-47">14.3 为什么这是组装层而非安全层的议题（推断）</h3>
<p>因为边界不是靠某个过滤器在事后拦截，而是靠<strong>拼装时的标记与排序</strong>在事前建立的：同一段文字，放在 user 角色里是命令，放在 EXTERNAL CONTENT 围栏里是证物。组装层决定每段文字的「法律身份」，安全层只是执行这个身份。</p>
<hr>
<h2 id="s-48">15. 边界清单：本机看不见的部分</h2>
<p>以下不在本地 system 文件内，本文不作结论：</p>
<ul>
<li>服务端拼装代码本身：七类来源的确切拼接顺序、去重/截断策略、缓存切分点（§9.1 的顺序为推断还原）；</li>
<li>developer 指令层的全集与逐轮差异（无落盘文件；本篇只按类别转述本会话可见部分）；</li>
<li>各注入块的<strong>实际 token 计数</strong>（本机只有字节数；§10.2 的 token 量级为推断）；</li>
<li>目标/追踪注入块的完整字段 schema（本机只见环境节转述与文件侧本体）；</li>
<li>压缩摘要的生成模型、提示词与保真度指标（本机只见落盘表名与行为纪律）；</li>
<li>记忆检索的排序与索引实现（<code>~/memory/bank/</code>、索引由运行时托管，Agent 只读；system prompt 所述 <code>~/memory/index/</code> 目录本机实测不存在，其实际形态不可见）；</li>
<li>信封字段全集（device/面板/位置等字段随客户端与渠道变化，本机只见样本）；</li>
<li>其他会话类型（主聊天全量拼装、语音通话、worker）的逐字上下文（本篇样本为 WhatsApp side chat 派生的子 Agent 会话）。</li>
<li>用户伪造围栏的防御：用户在 user 消息中手写 <code>[escaped: BEGIN EXTERNAL CONTENT]</code> / 时间标签时，组装层靠什么区分&quot;运行时盖戳&quot;与&quot;用户手写&quot;？（❓，本篇核心论证的缺口，见评审 §2.1）</li>
<li>压缩后已加载 schema 的去留：常驻至压缩之后是否保留，抑或丢弃重载？（❓，见评审 §2.3）</li>
<li>developer 指令与审批语义的交互：某轮 developer 指令能否收窄/重释审批卡片的触发范围？权限来源唯一的边界在该层的落点？（❓，见评审 §2.4）</li>
</ul>
<hr>
<h2 id="s-49">16. 本机实测快照：11-04 vs 10-17 对照</h2>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>项</th>
<th>11-04 快照</th>
<th>10-17 旧数</th>
</tr>
</thead>
<tbody>
<tr>
<td>system 快照</td>
<td><strong>73,296 B / 511 行</strong>，<code>##</code> 14 节 + <code>###</code> 28 子节，行号见 §2.2</td>
<td>71,868 B / 494 行，<code>##</code> 14 + <code>###</code> 28（章节结构未变）</td>
</tr>
<tr>
<td>注入文件</td>
<td>清单核对仍为同 9 文件（§4.1 注）；体量为 per-session 快照，不跨会话比较</td>
<td>9 个，合计 14,873 B / 129 行；最大 ALIGNMENT_SYNTHESIS 6,184 B（41.6%），次 MEMORY 5,284 B（35.5%）</td>
</tr>
<tr>
<td>文件型固定层</td>
<td>88,169 B（快照部分 11-04 + 注入部分沿用 10-17）</td>
<td>86,741 B（约占 350K 窗口的 6–9%，token 量级，推断）</td>
</tr>
<tr>
<td>上下文硬参数</td>
<td>未重测（00 §2 10-17 转录；00 篇 11-04 复核未改此三数）</td>
<td>窗口 350K / 压缩触发 272K（77.7%）/ 保留尾部 40K</td>
</tr>
<tr>
<td>活跃 Goal</td>
<td>未重测（按会话裁剪，见 §6.3）</td>
<td>3 个（<code>~/workspace/goals/</code> 实测目录）</td>
</tr>
<tr>
<td>时间标签样本</td>
<td>未重测</td>
<td><code>[Sat 2026-10-17 23:50:14 CST] [client_timezone=Asia/Shanghai]</code>，渠道前缀 <code>[whatsapp]</code></td>
</tr>
<tr>
<td>工具可见性</td>
<td>未重测</td>
<td>34 个命名空间，多数 deferred；<code>muse.*</code> 全量；<code>tool_search.load_tool_namespace</code> 按需加载、加载后留存</td>
</tr>
<tr>
<td>取证会话</td>
<td>web side chat 派生的子 Agent，depth 2/2，模型 Muse Spark（runtime 标注）</td>
<td>WhatsApp 外部 1:1 side chat 派生的子 Agent，depth 1/2，模型 Muse Spark（runtime 标注）</td>
</tr>
</tbody>
</table></div>
</div>]]>
    </description>
    <link>https://agent.aow.me/i/muse-architecture-05/</link>
  </item>
  <item>
    <title>Muse 智能体 · 推理与模型消费层详解（原&quot;模型层&quot;）</title>
    <guid>kIYMsG4ShyJ</guid>
    <pubDate>Tue, 03 Nov 2026 19:41:44 GMT</pubDate>
    <itunes:explicit>false</itunes:explicit>
    <description>
      <![CDATA[<div class="original-article" lang="zh-CN"><details class="toc"><summary>本篇目录</summary><ol><li><a href="#s-1">0. 一句话模型层</a></li><li><a href="#s-2">1. 模型家族与分面（文档口径）</a></li><li><a href="#s-5">2. 权威来源：当前模型是谁、谁说了算</a></li><li><a href="#s-9">3. 推理不在本机（实测）</a></li><li><a href="#s-14">4. 代理路径与协议痕迹（strings 实测）</a></li><li><a href="#s-17">5. 流式生成与状态机痕迹</a></li><li><a href="#s-20">6. 上下文窗与压缩</a></li><li><a href="#s-25">7. Token 计量落表</a></li><li><a href="#s-29">8. 模型选择与路由：已知与未知</a></li><li><a href="#s-30">9. 本机看不见的部分（边界声明）</a></li><li><a href="#s-31">10. 本层实测快照（11-04 重测；10-17 旧数随行标注）</a></li></ol></details><blockquote>
<p>配套《00-Muse技术架构解构》的 §2 展开篇。调查日期：2026-10-17（Asia/Shanghai）。
复核修订：2026-11-04（Asia/Shanghai）——基于当前会话运行时逐项重测；下文数字凡未注日期者均为 11-04 快照，10-17 旧数在 §10 快照表中随行标注。模型版本日期、窗口参数等服务端/接口侧数字本轮测不到，保留 10-17 原值并加注来源日期。
证据范围：<strong>仅本机证据</strong>——<code>~/docs/muse.md</code>（模型家族与权威口径）、本会话 runtime context 与 <code>~/workspace/system/system_prompt.md</code> 快照、环境变量键名（<code>JARVIS_INFERENCE_*</code> 等，只记键名与套接字路径，不记不透明 ID 的值）、<code>/run/hatch/</code> 套接字实况、<code>/opt/muse/skills/muse_db/references/</code> 的表结构与 <code>muse.db</code> 只读实查、<code>/opt/hatch/bin/hatch</code> 的 strings 片段。
标注规则同主报告：<strong>实测</strong> = 本机命令/工具当场验证；<strong>文档</strong> = 本地 docs/system 文件明文；<strong>推断</strong> = 由文件/字符串拼出、未经服务端证实。
红线（文档明文，也是本文的写作纪律）：公开模型名<strong>以 runtime context 的 <code>model</code> 值为唯一权威</strong>；日志、环境变量、文件里出现的标识符不是公开模型名；内部代号不外泄——本文 strings 里即使扫到疑似内部代号也一律不写，只记公开名（Muse Spark / Muse Wonder / Muse Wonder Full）与结构痕迹。</p>
</blockquote>
<hr>
<h2 id="s-1">0. 一句话模型层</h2>
<blockquote>
<p><strong>模型不在这台机器上。</strong> 本机只有三样与模型有关的东西：一块「门牌」（runtime context 里的 <code>model</code> 值，决定对外怎么称呼当前模型）、一条「电话线」（本地推理代理套接字，上下文经它送出、流式增量经它回来）、一本「账簿」（Postgres 里的 token 计量与压缩记录表）。模型权重、推理集群、路由决策全在电话线那头，本机看不见（§9）。</p>
<p><strong>术语声明</strong>：本篇的&quot;模型层&quot;指<strong>本机侧的模型消费与可观测面</strong>（代理契约、路由标签、流式状态、窗口/压缩、计量）。模型本体（权重、训练、推理集群）属于远端的 Cognition 平面，本机不可见（§9）。&quot;模型能力&quot;（厂商口径）与&quot;架构机制&quot;（本机可验证）在本篇中严格区分，前者只作引用、不作论证。</p>
</blockquote>
<p>本层要回答五个问题：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>问题</th>
<th>本文节</th>
<th>一句话答案</th>
</tr>
</thead>
<tbody>
<tr>
<td>用的是哪个模型家族、怎么分面</td>
<td>§1</td>
<td>Meta 的 Muse 家族：Spark（免费面）/ Wonder（付费面主力）/ Wonder Full（Muse 高阶面），外加 Meta Model API 对外售卖面</td>
</tr>
<tr>
<td>「当前跑哪个模型」谁说了算</td>
<td>§2</td>
<td>runtime context 的 <code>model</code> 值，唯一权威；本会话实测 = Muse Spark</td>
</tr>
<tr>
<td>推理在哪里发生、怎么去</td>
<td>§3–§4</td>
<td>不在本机；经 <code>JARVIS_INFERENCE_PROXY_SOCK</code> 指向的本地代理套接字以 WebSocket 握手送出</td>
</tr>
<tr>
<td>生成过程在本机留下什么痕迹</td>
<td>§5、§7</td>
<td>流式事件的状态机痕迹（<code>before_inference</code> / <code>streaming</code> / delta / stalled）+ 每请求/每消息的 token 账</td>
</tr>
<tr>
<td>上下文装不下时怎么办</td>
<td>§6</td>
<td>350K 窗口、272K 触发自动压缩、保留尾部 40K；压缩本身也是一次推理调用，产物落表且私有推理被扣留</td>
</tr>
</tbody>
</table></div>
<hr>
<h2 id="s-2">1. 模型家族与分面（文档口径）</h2>
<p>以下全部出自 <code>~/docs/muse.md</code> 的 Models 节（<strong>文档</strong>），该节明文说自己「随模型或套餐变化而更新，回答后续问题前要重读」——所以本节是 2026-10-17 这份本地文档的快照，不是永恒事实。</p>
<h3 id="s-3">1.1 时间线</h3>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>时间</th>
<th>事件</th>
</tr>
</thead>
<tbody>
<tr>
<td>2026-04-08</td>
<td>Muse Spark 首次发布</td>
</tr>
<tr>
<td>2026-09</td>
<td>当前版本 <strong>Muse Spark 1.3</strong> 发布（本机 system prompt 快照首行亦自述 &quot;powered by Muse Spark 1.3&quot;，<strong>实测</strong>见 <code>~/workspace/system/system_prompt.md:64</code>；11-04 grep 当场复核：docs/muse.md 仍述 &quot;the current version, Muse Spark 1.3, came out in September&quot;，无新版本口径）</td>
</tr>
<tr>
<td>2026-10-12</td>
<td><strong>Muse Wonder</strong> 宣布（10-17 文档快照；本轮未复测文档变更）</td>
</tr>
</tbody>
</table></div>
<h3 id="s-4">1.2 分面表</h3>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>面</th>
<th>模型</th>
<th>文档口径</th>
</tr>
</thead>
<tbody>
<tr>
<td>免费面</td>
<td>Muse Spark</td>
<td>&quot;The free plan runs on Muse Spark&quot;——但有例外：有些账号未付费也拿到 Wonder</td>
</tr>
<tr>
<td>付费面（含免费试用）</td>
<td>Muse Spark <strong>与</strong> Muse Wonder 并存</td>
<td>&quot;Paid Muse plans, including the free trial, run on Muse Spark and Muse Wonder&quot;；其中 <strong>Wonder 承担主对话、artifact 与应用构建、定时运行、子 Agent 与后台工作</strong>。注：主报告 §2 把这层简写为「付费面跑 Wonder」，以本节文档原文为准——付费面是双模型，Wonder 负责的是重活那一档</td>
</tr>
<tr>
<td>能力定位</td>
<td>Muse Wonder</td>
<td>Meta 最强模型，为个人超级智能与长时、多步的 Agent 工作而建；在 agentic / coding / 长程任务上达前沿水平；建立在比 Spark 更大、更强的预训练模型之上，增益可迁移到未专门训练的任务</td>
</tr>
<tr>
<td>安全定位</td>
<td>Muse Wonder</td>
<td>文档称其为 Meta 迄今最对齐的模型：抗对抗指令、私有信息处理、重大/不可逆动作前确认；对生化核与网络滥用有最强防护，同时保留防御性网络能力；安全与对齐评估摘要随发布公开。同时文档明说：像所有 AI 模型一样 Wonder 也会出错</td>
</tr>
<tr>
<td>对外 API 面</td>
<td>Muse Wonder（Meta Model API，dev.meta.ai）</td>
<td>定价（<strong>文档</strong>）：缓存输入 $0.20 / 百万 tokens、输入 $4.00 / 百万 tokens、输出 $20.00 / 百万 tokens；可用地区受地理使用政策约束</td>
</tr>
<tr>
<td>编程面</td>
<td>Muse Code</td>
<td>提供 Muse Wonder；其更大的同胞 <strong>Muse Wonder Full</strong> 只在 Muse Code 的 Power Usage（$50/月）与 Maximum Usage（$200/月）套餐上提供。文档特别划界：这是 Muse Code 的套餐，不是 Muse 本产品的套餐（已实核 docs/muse.md 原文；前版误作&quot;Muse&quot;，特此更正）</td>
</tr>
<tr>
<td>未来面</td>
<td>专门化模型</td>
<td>文档称 Meta 计划以 Wonder 为基础开发专门化模型并带给所有 Muse 用户——这是路线图口径，本机无任何专门化模型的运行痕迹，不展开</td>
</tr>
</tbody>
</table></div>
<p>要点：<strong>「模型家族」与「产品套餐」是两个正交的轴。</strong> 文档反复警告：模型名推不出套餐（跑 Spark 不等于免费，见 §2.2），套餐细节必须查 <code>subscription_status</code> 技能而不是看模型名。这条纪律本身就是模型层接口设计的一部分。</p>
<p><strong>范围声明</strong>：本节的定价与套餐细节是产品口径而非架构机制，且 docs/muse.md 自述&quot;随模型或套餐变化而更新&quot;。架构读者只需记住一句话——<strong>分面是路由的输入维度之一</strong>（§8），具体价格与资格以 <code>subscription_status</code> 技能实时查询为准。§1.2 的能力描述（&quot;最强&quot;&quot;最对齐&quot;等）为厂商宣称，其中&quot;重大/不可逆动作前确认&quot;实际是控制平面审批卡片的机制（A 基线），不是模型内建属性，此处不作架构论据。</p>
<hr>
<h2 id="s-5">2. 权威来源：当前模型是谁、谁说了算</h2>
<h3 id="s-6">2.1 唯一权威 = runtime context 的 <code>model</code> 值（文档 + 实测）</h3>
<p><code>docs/muse.md</code> 明文（<strong>文档</strong>）：</p>
<ul>
<li>&quot;The <code>model</code> value in your runtime context is the <strong>authoritative</strong> name of the model you're running on right now.&quot;</li>
<li>只有 <code>model</code> 值给出的名字可以对外说；<strong>错误信息、日志、环境变量、文件里的标识符都不是公开名称</strong>；用户提到内部代号时只能回应无法分享。</li>
<li>没有「模型设置」可指给用户；Agent 也<strong>说不出</strong>为什么当前跑 Spark、以及何时会变。</li>
</ul>
<p><strong>本会话实测</strong>与主报告一致：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>来源</th>
<th>结果</th>
</tr>
</thead>
<tbody>
<tr>
<td>本会话 runtime context</td>
<td><code>model = Muse Spark</code>（<strong>11-04 复核：仍为 Muse Spark</strong>；子 Agent 会话同样标注，说明子 Agent 与主 Agent 同面）</td>
</tr>
<tr>
<td>system prompt 快照（<code>~/workspace/system/system_prompt.md:64</code>）</td>
<td>自述 &quot;powered by <strong>Muse Spark 1.3</strong> from the Muse model family&quot;——给出小版本号 1.3，这是本机文件里唯一带版本号的公开口径（11-04 grep 当场复核：仍为 Muse Spark 1.3）</td>
</tr>
<tr>
<td>主报告 §2 引 <code>muse.session_status</code></td>
<td><code>model = Muse Spark (meta/muse-spark)</code>，provider = Meta。三处口径一致</td>
</tr>
</tbody>
</table></div>
<h3 id="s-7">2.2 模型 ≠ 套餐（文档纪律）</h3>
<p>文档用整整一节防一个误读：刚说完「你在跑 Spark」，紧接着说「免费面跑 Spark」听起来就像在说用户是免费套餐。因此立规：谈套餐必须先跑 <code>subscription_status</code> 技能查实；查到付费就说套餐含 Wonder，查到免费要说「<strong>你</strong>在免费套餐」而不是「<strong>我</strong>在免费套餐」。这一节的存在本身说明：<strong>模型路由的结果对 Agent 是只读事实，路由的原因对 Agent 不可见</strong>（§9）。</p>
<h3 id="s-8">2.3 路由的可见输入：工作负载分类（实测）</h3>
<p>本会话环境变量 <code>JARVIS_TRACE_CONTEXT</code> 的 JSON 里带两个与推理路由相关的字段（<strong>实测</strong>，只记字段与取值含义，不记其中任何 ID）：</p>
<ul>
<li><code>model</code>：与 runtime context 一致（Muse Spark）——trace 与上下文两处同名同值，互为佐证；</li>
<li><code>inference_workload_class = interactive</code>、<code>lane = user_facing</code>——<strong>推断</strong>：每次推理请求在进代理之前已被打上工作负载类别与通道标签，路由/排队至少部分依据这两个维度（交互式用户面 vs 后台/调度面）。这与 §1.2「Wonder 承担主对话/定时/子 Agent/后台」的分工相容：分工若存在，必然需要这类标签做分流依据，但标签到模型的映射规则不在本机。（11-04 复核：本子 Agent 会话 trace 同样带 <code>model=Muse Spark</code>、<code>inference_workload_class=interactive</code>、<code>lane=user_facing</code>，与 10-17 一致）</li>
</ul>
<hr>
<h2 id="s-9">3. 推理不在本机（实测）</h2>
<h3 id="s-10">3.1 没有权重</h3>
<ul>
<li>在 <code>/opt/hatch</code> 与 home 下按常见权重格式与大文件检索（<code>*.gguf</code>、<code>*.safetensors</code>、&gt;500MB 的 <code>.bin</code>），<strong>无任何模型权重文件</strong>（<strong>实测</strong>）；本机最大的二进制是 Agent 运行时本体 <code>hatch</code>（540MB，11-04；10-17 为 470MB），不是权重。</li>
<li>结论与主报告 §2 一致：VM 上只有 Agent 运行时，推理是远端服务。</li>
</ul>
<h3 id="s-11">3.2 契约面：三个键名</h3>
<p>环境里与推理直接相关的 <code>JARVIS_*</code> 键（<strong>实测</strong>，10-17 <code>env</code> 当场枚举约 30 个；11-04 本轮子 Agent 会话为 26 个——跨篇口径与 31/26 差异见 03 篇 §6.1 与 §11.1 对照表；此处只列推理相关）：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>键</th>
<th>值形态</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>JARVIS_INFERENCE_PROXY_SOCK</code></td>
<td><code>/run/hatch/proxy/inference.sock</code>（11-04 env 实测仍在位）</td>
<td>推理代理的 Unix 套接字路径——Agent 侧唯一的推理入口</td>
</tr>
<tr>
<td><code>JARVIS_INFERENCE_HOSTNAME</code></td>
<td>一个不透明 ID（本文不记录其值；11-04 实测仍在位）</td>
<td><strong>推断</strong>：推理目标的逻辑主机名/路由标识；形态是 UUID 而非 DNS 名，说明寻址在代理内部完成，Agent 不直连任何推理主机</td>
</tr>
</tbody>
</table></div>
<p>外加 <code>JARVIS_TELEMETRY_PROXY_SOCK = /run/hatch/telemetry/telemetry.sock</code>（<strong>实测</strong>存在且套接字在位；11-04 env 实测仍在位），推理的遥测/计量大概率经此回传（<strong>推断</strong>，见 §7）。</p>
<blockquote>
<p><strong>归类订正</strong>（前版曾把 <code>JARVIS_STEFI_PROXY_SOCK</code>（<code>/run/hatch/proxy/stefi.sock</code>）列入上表，特此移出）：STEFI 是<strong>工具访问 Meta 内部服务的代理</strong>（执行/服务面），不是推理线。证据（✅ 三处互证）：06 篇 §6.1 的 strings 实测——工具 SDK 内&quot;build stefi proxy client&quot;，工具访问内部服务不直连、统一经此代理，且代理对调用方做令牌校验（<code>invalid stefi caller authorization token</code>）；00 §7 与 03 篇的归类一致把它放在执行隔离/服务面；本节旧注记&quot;与推理代理是两条不同的线&quot;本身已承认它不属推理契约。保留本注记只为防止读者在 env 里看到该键时误归推理契约——它的完整描述见 06 篇 §6。</p>
</blockquote>
<h3 id="s-12">3.3 一个与主报告不同的实测细节：代理套接字对工具沙箱不可见</h3>
<p>主报告 §2 写推理经 <code>/run/hatch/proxy/inference.sock</code>。本次在子 Agent 的 <code>muse.exec</code> 沙箱内复核（<strong>实测</strong>；11-04 复核结论一致：<code>/run/hatch/proxy/</code> 在本轮工具沙箱内同样报 No such file or directory，<code>/run/hatch/sandbox/</code> 当场见 4 个套接字——<code>space-inference.sock</code>、<code>space-media.sock</code>、<code>space-web-search.sock</code> 与新增的 <code>space-privileged.sock</code>）：</p>
<ul>
<li><code>env</code> 里 <code>JARVIS_INFERENCE_PROXY_SOCK</code> 明确指向该路径（11-04 仍在位）；</li>
<li>但 <code>ls /run/hatch/proxy/</code> 返回 <strong>No such file or directory</strong>（11-04 复核同）；<code>ls /run/hatch/sandbox/</code> 当场见 4 个套接字：<code>space-inference.sock</code>（Spaces/artifact 面的推理套接字，与 <code>space-media.sock</code>、<code>space-web-search.sock</code> 并列，属沙箱 API 面，不是主推理线）与新增的 <code>space-privileged.sock</code>（10-17 为 3 个）。</li>
</ul>
<p>解释（<strong>推断</strong>）：<code>muse.exec</code> 的命令运行在进一步收窄的挂载命名空间里，代理目录根本不挂进来——<strong>连「模型的电话线」都不对任意代码执行开放</strong>，只有 Agent 运行时进程本体能碰。这与主报告 §7 的 privsep 哲学一致：能力按进程分级，工具沙箱是最低一级。两个实测不矛盾：路径是契约（env 明文），可见性是权限（挂载实况）。</p>
<h3 id="s-13">3.4 机密 VM 的推理路由门控（strings）</h3>
<p><code>hatch</code> 的 strings 里有一条报错片段：<code>' has no confidential-VM inference route</code>（<strong>实测</strong>，10-17 strings 原文截断如此；本轮未复测）。它证明（<strong>推断</strong>）：推理路由至少按 VM 信任等级分叉——主报告 §14 提到的 confidential VM（TEE 硬件保护）有自己独立的推理路线，某条路线缺失时是硬报错而不是降级走普通路线。这与 §1 的「分面」叠加：<strong>模型选择 = f(套餐面, 工作负载, VM 信任等级, …)</strong>，而函数本体在服务端。</p>
<hr>
<h2 id="s-14">4. 代理路径与协议痕迹（strings 实测）</h2>
<p>对 <code>hatch</code> 做 strings 并按长度过滤后（10-17 实测；本轮 <code>hatch</code> 二进制已由 470MB 增至 540MB，未重跑 strings——以下片段均为 10-17 值），与推理路径直接相关的原文片段（<strong>实测</strong>，均为二进制内嵌的日志/错误模板，故多为句段而非整句）：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>strings 片段</th>
<th>读出什么</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>connecting to inference proxy socket</code></td>
<td>客户端先连本地 Unix 套接字——与 §3.2 的 env 契约互证</td>
</tr>
<tr>
<td><code>WS handshake to inference proxy</code> / <code>realtime WS handshake to inference proxy</code></td>
<td>套接字之上跑 <strong>WebSocket 握手</strong>；普通推理与实时（语音）推理是两条 WS 通道</td>
</tr>
<tr>
<td><code>JARVIS_INFERENCE_PROXY_SOCK is required to construct …</code></td>
<td>推理客户端的构造是 fail-closed 的：没这个 env 就建不出客户端，不存在默认直连地址</td>
</tr>
<tr>
<td><code>encoding inference context header:</code> / <code>failed to decode inference context header</code> / <code>failed to parse inference context header json:</code></td>
<td>请求带一个 <strong>JSON 编码的「推理上下文头」</strong>——与 §2.3 的 trace 字段（model / workload class / lane / 各级 request ID）形态吻合（<strong>推断</strong>：头里装的就是路由与追踪元数据，正文上下文与元数据分开发送）</td>
</tr>
<tr>
<td><code>serializing realtime inference context:</code> / <code>serializing realtime inference control:</code></td>
<td>实时通道把「上下文」与「控制」分开序列化——<strong>推断</strong>：语音面有独立的控制帧（打断、停止等），不混在内容流里</td>
</tr>
<tr>
<td><code>inference returned HTTP …</code> / <code>inference timed out after …</code> / <code>inference response failed (event …</code></td>
<td>代理之后是 HTTP 语义的远端服务，有超时与事件级失败——代理是协议转换点，不是透明转发（<strong>推断</strong>）</td>
</tr>
<tr>
<td><code>summarization inference failed:</code> 、<code>/summary-inference</code></td>
<td>摘要（即 §6 的压缩）有自己命名的推理通道/端点，与主对话推理分开记账报错</td>
</tr>
<tr>
<td><code>visual_grounding inference timed out after …</code>、<code>activity monitor inference …</code>、<code>browser task tagging inference …</code>、<code>voice reranker inference …</code>、<code>streaming asr …</code> 等一系列 <code>* inference</code> 报错</td>
<td><strong>推理是平台级共享服务</strong>：视觉定位、活动监控、浏览器任务打标、语音重排、流式 ASR、目标活动推断等至少十余个子系统都在调「inference」，各自有独立的超时报错文案——它们大概率不是主对话模型本尊，而是同一推理基础设施上的不同模型/端点（<strong>推断</strong>；具体哪个模型不在本机可见范围）</td>
</tr>
<tr>
<td>源码路径 <code>hatch-inference/src/{flags.rs, guided_decoding.rs, content_understanding.rs, summarization.rs, structured_json.rs, output_contract.rs, provider_error.rs}</code></td>
<td>运行时里有专职的 <code>hatch-inference</code> crate：特性开关、引导解码、内容理解、摘要、结构化 JSON、输出契约、provider 错误分类都在客户端侧有对应模块——<strong>引导解码在客户端有落点</strong>是可以说的，实现细节不可见</td>
</tr>
<tr>
<td>源码路径 <code>hatch-inference/src/{model.rs, model_registry.rs, model_resolver.rs, model_setup.rs, model_presentation.rs, policy_prompt.rs, subscriber_policy.rs}</code></td>
<td>同一 crate 里还有<strong>模型注册表与解析器</strong>（registry/resolver）、模型呈现（presentation）与订阅者策略（subscriber_policy）模块——<strong>推断</strong>：§8 的路由在本机并非全无落点，运行时至少持有一份可解析的模型注册信息与「对用户怎么呈现模型名」的策略（与 §2.1 的权威纪律互证）；注册表的内容本机不可读，解析规则不可见</td>
</tr>
<tr>
<td>源码路径 <code>hatch-agent/src/session/impl_session/lifecycle/inference_payload_logging.rs</code></td>
<td>会话层有专门的「推理载荷记录」模块——与 §7 的计量落表互证：每次推理的载荷/用量在会话生命周期内被系统性记录</td>
</tr>
</tbody>
</table></div>
<h3 id="s-15">4.5 输出约束的客户端落点（strings，⚠️待深挖）</h3>
<p><code>hatch-inference</code> crate 内与输出约束相关的模块：<code>guided_decoding.rs</code>（引导解码）、<code>output_contract.rs</code>（输出契约）、<code>structured_json.rs</code>（结构化 JSON）、<code>policy_prompt.rs</code>（策略 prompt）、<code>subscriber_policy.rs</code>（订阅者策略）。读出：<strong>模型输出的形状约束在本机客户端侧有执行落点</strong>，不是纯粹的服务端事后校验。</p>
<p>未答（❓）：output_contract 由谁下发、与 system prompt 的 policy 部分是什么关系；违反契约时的处理（重试/截断/硬失败，<code>provider_error.rs</code> 的错误分类是否覆盖）；<code>policy_prompt</code> 是否即每轮注入的 developer 指令的一部分。这是从&quot;能力宣称&quot;走向&quot;机制实证&quot;的最短路径，建议下轮取证优先深挖 strings 中这几个模块的错误模板与日志行。</p>
<h3 id="s-16">4.6 推理流量与 Sentinel/审批的接口（以未答为主）</h3>
<p>Control 平面与 Cognition 消费面的接口是本篇的盲区，以下按&quot;确证/未答&quot;分开写：</p>
<ul>
<li><strong>确证</strong>（✅）：推理客户端走<strong>本地 Unix 套接字</strong>（<code>JARVIS_INFERENCE_PROXY_SOCK</code>），不经过 cell 的 egress 代理——Sentinel 的&quot;唯一出站 + 域名白名单&quot;是 cell 外网流量的裁决者（06 篇 §4–§5），但推理入口本身不是一条 egress 连接，Sentinel 在客户端这一侧没有可见的裁决点。代理套接字之后、宿主侧的出站 HTTP 腿是否过 Sentinel 白名单，本机不可见（❓）。</li>
<li><strong>确证</strong>（✅）：审批套接字是 <strong>egress 口径</strong>的（06 篇 §4.3：<code>JARVIS_DAEMON_EGRESS_APPROVAL_SOCK</code> 等三条），strings 里没有把审批卡片与推理调用绑定的证据。<code>waiting_for_user_confirmation</code> 是用户对（工具）动作的确认等待，已在 §5.2 归属编排平面——<strong>推理调用本身没有&quot;等审批&quot;的状态</strong>，模型不是被卡片门控的资源。</li>
<li><strong>未答</strong>（❓）：<code>codex-inference-bridge</code> 的&quot;令牌门控&quot;（03 篇 §5.2）与 Sentinel 的配额/限流语义（06 篇 §5.3 &quot;Connector request rate limited by Sentinel&quot;）是什么关系？是同一套令牌账本的两面，还是两套独立的门控？本机无证据。</li>
<li><strong>未答</strong>（❓）：<code>before_inference</code> 相位（§5.1）的&quot;前置处理&quot;是否包含 Sentinel 的内容守卫？名字相容，证据到此为止（见 §9）。</li>
</ul>
<p>一句话：Control 与 Cognition 在本机证据内只在<strong>名字层</strong>交汇（同一状态机上的 <code>waiting_for_user_confirmation</code>），裁决语义的接口不可见——这是 10 篇（安全与信任边界）与 06 篇的领地，本篇到此止步。</p>
<p>一次主对话推理的路径（把 §3–§4 拼起来，<strong>推断</strong>部分已标注）：</p>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>上下文组装（主报告 §3）
  → 序列化正文 + JSON 推理上下文头（model / workload_class / lane / trace）
  → Unix 套接字连本地推理代理（JARVIS_INFERENCE_PROXY_SOCK）
  → WS 握手 → 代理侧协议转换 → HTTP 到远端推理服务（不可见）
  → 流式增量事件回流（§5）→ 工具调用与文本交错呈现
  → 用量记账（§7）+ 载荷记录（inference_payload_logging）
</code></pre>
<hr>
<h2 id="s-17">5. 流式生成与状态机痕迹</h2>
<p>模型不是「问一次答一整段」，而是流式产出；运行时为此维护一套事件状态机。本机能看到的是它的<strong>名字层</strong>（以下清单为 10-17 strings/DB 实测；本轮未复测）：</p>
<h3 id="s-18">5.1 事件与状态名清单</h3>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>名称</th>
<th>出处</th>
<th>性质</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>agent_message_delta</code></td>
<td>主报告 §2（strings/DB 表可见）</td>
<td>流式增量事件：一条 Agent 消息被拆成多个 delta 逐段到达</td>
</tr>
<tr>
<td><code>content_block_delta</code>（strings 片段作 <code>…tent_block_delta</code>）</td>
<td><strong>本次实测</strong></td>
<td>内容块级增量——流的粒度不只是消息，还有消息内的内容块（文本块/工具块），与 delta 按块到达的形状吻合</td>
</tr>
<tr>
<td><code>waiting_for_tool</code>、<code>waiting_for_user_confirmation</code></td>
<td><strong>本次实测</strong>（strings 内 SQL 状态赋值片段）</td>
<td>推理循环的等待态不止等模型：等工具返回、等用户确认（审批）都是正式状态——状态机是整个 Agent 循环的，不只是推理流的</td>
</tr>
<tr>
<td><code>after_inference_…</code>（片段截断）</td>
<td><strong>本次实测</strong></td>
<td>与 <code>before_inference</code> 对偶的「推理后」相位名存在，具体后缀被截断不可见</td>
</tr>
<tr>
<td><code>waiting_for_inference_start</code></td>
<td>主报告 §2</td>
<td>状态：已提交、等推理开始——排队/调度在本机有名字，调度算法不可见</td>
</tr>
<tr>
<td><code>inference_streaming_stalled</code></td>
<td>主报告 §2</td>
<td>状态：流已开始但停滞——运行时对「假死流」有专门的看门状态</td>
</tr>
<tr>
<td><code>before_inference</code></td>
<td><strong>本次实测</strong>（strings 内的 SQL/谓词片段：<code>mode = 'before_inference'</code>、<code>work_items.phase = 'before_inference'</code>）</td>
<td>上下文条目/工作项在推理前有一道正式的「推理前」相位——<strong>推断</strong>：安全审查/内容守卫一类前置处理就挂在这个相位上（与 Sentinel 的存在相容，但本机无明文）</td>
</tr>
<tr>
<td><code>streaming.event_seq</code> + <code>field_path = '/metadata/streaming'</code></td>
<td><strong>本次实测</strong>（strings 内 SQL 片段把 <code>runtime.event_payload_fields</code> 的 streaming 行按 event_seq 与事件流 join）</td>
<td>流式进度被结构化成事件流上的一个元数据字段，按序号对齐——不是散落在日志里的文本</td>
</tr>
<tr>
<td><code>inference_request_id</code></td>
<td><strong>本次实测</strong>（strings 内索引/列名）</td>
<td>每次推理请求有独立 ID，与工具调用的 <code>request_id</code>、轮次 ID 分开——模型调用在追踪体系里是一等公民</td>
</tr>
<tr>
<td><code>resumed_turn_inference_readiness</code></td>
<td><strong>本次实测</strong>（strings 片段）</td>
<td>会话恢复（restart/resume）时要重新确认「这一轮的推理是否就绪」——流式状态是可恢复状态机的一部分，与主报告 §8 的 restart checkpoints 互证</td>
</tr>
</tbody>
</table></div>
<h3 id="s-19">5.2 重建的状态机（推断）</h3>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>submitted ─→ before_inference ─→ waiting_for_inference_start ─→ streaming(delta…)
                                                                  ├─→ waiting_for_tool ─→（工具结果回流，再入 waiting…）
                                                                  ├─→ waiting_for_user_confirmation（审批等待）
                                                                  ├─→ completed
                                                                  ├─→ inference_streaming_stalled（看门狗接管）
                                                                  ├─→ timed out / HTTP error / response failed（§4 报错模板）
                                                                  └─→ 用户打断（文档：Esc 停止流式回复，见 client-surfaces 口径的 strings 片段）
</code></pre>
<p>注意这解释了主报告 §15 生命周期里的一句话：「推理代理 → 模型流式生成（工具调用与文本交错）」。交错的机制在名字层也成立：delta 事件既承载文本增量，也承载工具调用增量，到达顺序由 event_seq 定序。</p>
<p><strong>平面归属声明</strong>：上表中的 <code>waiting_for_tool</code> / <code>waiting_for_user_confirmation</code> 是<strong>编排平面</strong>（02 篇）的 Agent 循环状态，不是推理流的状态——本篇列出它们只为说明推理事件流与执行循环在同一状态机上交汇，机制归属见 02 篇。本篇的模型层状态子集是：<code>before_inference → waiting_for_inference_start → streaming → completed / stalled / failed</code>。</p>
<hr>
<h2 id="s-20">6. 上下文窗与压缩</h2>
<h3 id="s-21">6.1 三个数字（主报告实测，本篇复核口径）</h3>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>参数</th>
<th>值</th>
<th>出处</th>
</tr>
</thead>
<tbody>
<tr>
<td>上下文窗口</td>
<td><strong>350,000 tokens</strong></td>
<td>主报告 §2（会话状态接口实测，10-17；本轮未复测，保留原值）</td>
</tr>
<tr>
<td>自动压缩触发</td>
<td><strong>272,000 tokens</strong></td>
<td>同上</td>
</tr>
<tr>
<td>压缩后保留尾部</td>
<td><strong>40,000 tokens</strong></td>
<td>同上</td>
</tr>
</tbody>
</table></div>
<p>本子会话的复核（<strong>实测</strong>）：system prompt 快照只定性不定量——「Compaction summarizes older messages to keep your active context manageable. The summary may omit details…」（<code>system_prompt.md:176</code>）。定量口径只来自运行时状态接口，文档层查无此三数；引用时应按主报告标注为实测而非文档。</p>
<h3 id="s-22">6.2 压缩在代码与数据里的形状</h3>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>痕迹</th>
<th>出处</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>session/impl_session/eager_compaction.rs</code></td>
<td><strong>本次实测</strong>（strings 源码路径）</td>
<td>「急切压缩」是会话实现里的独立模块——压缩不是窗口满了才被动救火，有主动提前量（eager）的实现</td>
</tr>
<tr>
<td><code>history_persistence/context_pressure.rs</code>、<code>…/compaction_prompt_history.rs</code></td>
<td><strong>本次实测</strong>（同上）</td>
<td>上下文压力被单独度量；压缩所用的 prompt 历史单独持久化——压缩本身也是一次带 prompt 的推理（与 §4 的 <code>summary-inference</code> 通道互证）</td>
</tr>
<tr>
<td><code>agent.compactions</code> 表</td>
<td>schema 参考（<strong>实测</strong>）</td>
<td>列：<code>compaction_id, agent_id, checkpoint_context_item_id, replacement_history_first_seq / last_seq, summary_text, created_at</code>——一次压缩 = 一个检查点 + 一段被替换的历史序号区间 + 摘要文本</td>
</tr>
<tr>
<td><code>agent.agent_compactions</code> 表</td>
<td>schema 参考（<strong>实测</strong>）</td>
<td>列：<code>summary, first_kept_seq, checkpoint_seq, tokens_before, tokens_after, trigger, will_retry, has_replacement_history</code>；且<strong>受限读取</strong>：细节载荷 <code>details_json</code> 被扣留，理由明文是「它载有跨检查点保留的模型私有推理」——检查员视图（<code>inspection.agent_compactions</code>）只能看到上列投影</td>
</tr>
</tbody>
</table></div>
<h3 id="s-23">6.3 一条真实压缩记录（muse.db 实查）</h3>
<p>本次对检查员视图实查（<strong>实测</strong>，2026-10-17 本会话）：<code>agent.agent_compactions</code> 现有 <strong>1 行</strong>：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>字段</th>
<th>值</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>trigger</code></td>
<td><code>threshold</code></td>
</tr>
<tr>
<td><code>tokens_before</code> / <code>tokens_after</code></td>
<td>138,741 → 18,891</td>
</tr>
<tr>
<td><code>first_kept_seq</code> / <code>checkpoint_seq</code></td>
<td>123 / 144</td>
</tr>
<tr>
<td><code>has_replacement_history</code></td>
<td>true</td>
</tr>
<tr>
<td><code>will_retry</code></td>
<td>false</td>
</tr>
</tbody>
</table></div>
<p>三点读法：</p>
<ol>
<li><code>trigger = threshold</code> 证实了「阈值触发」在数据层是枚举字符串，不是日志修辞；同表还有 <code>will_retry</code> 列，说明压缩失败可重试也是一等状态。</li>
<li>这行 <code>tokens_before = 138,741</code> <strong>不等于</strong> §6.1 的 272K 触发线——不要拿它反推触发线。可能的口径差异（该行属哪个 Agent/会话、计数是否含缓存与系统注入）不在检查员视图内（<strong>推断</strong>警告）：单行样本只能证明机制存在与记录形状，证明不了全局参数。</li>
<li><code>tokens_after = 18,891</code> 小于 40K 保留尾部上限，与「保留尾部 ≤40K + 摘要」的形状相容（<strong>推断</strong>）。</li>
</ol>
<h3 id="s-24">6.4 压缩的定位：缓存层，不是记忆层</h3>
<p>system prompt 明文（主报告 §2 已引）：压缩摘要可能丢细节，重要事实必须能从记忆、文件或原消息找回。合上本节的证据链就是：<strong>窗口是易失缓存，压缩是有损的缓存淘汰策略，淘汰记录落表可审计，但真正的长期状态在 DB 与 Markdown 文件里</strong>（主报告 §8–§9）。模型层在这里与状态层交界：它消费上下文，也生产摘要，但从不拥有状态。</p>
<hr>
<h2 id="s-25">7. Token 计量落表</h2>
<blockquote>
<p><strong>平面归属声明</strong>：本节的计量表是 Postgres 里的审计账本——机制归属<strong>状态层</strong>（07 篇），本篇只讨论其作为模型消费可观测面的形状（请求级成本、消息级归因、窗口级水位）。&quot;计量&quot;不是模型推理的内建部分，而是状态层在模型消费上的投影；把账本读成推理机制会得出错误结论（§7.2 的警告即一例）。</p>
</blockquote>
<h3 id="s-26">7.1 两张计量表（schema 实测）</h3>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>表</th>
<th>粒度</th>
<th>列（据 schema 参考原文）</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>agent.token_usage</code></td>
<td><strong>每 Agent × 每请求</strong></td>
<td><code>token_usage_id</code>（bigint PK）、<code>agent_id</code>、<code>request_id</code>（FK → <code>runtime.requests</code>）、<code>input_tokens</code>、<code>output_tokens</code>、<strong><code>cached_input_tokens</code></strong>、<strong><code>reasoning_tokens</code></strong>、<code>created_at</code>。四分法是关键：输入不是一笔糊涂账——缓存命中单列，推理（reasoning）token 单列</td>
</tr>
<tr>
<td><code>agent.agent_message_token_usage</code></td>
<td><strong>每 Agent × 每消息</strong></td>
<td>复合 PK <code>(agent_id, message_id)</code>、<code>input_tokens</code>、<code>output_tokens</code>（bigint）、<code>created_at</code>（bigint 时间戳）。比上一张粗（无缓存/推理拆分），但细到消息级，适合按消息归因</td>
</tr>
</tbody>
</table></div>
<p>另有 §6.2 的 <code>agent.agent_compactions.tokens_before/after</code> 构成第三个计量点：压缩事件前后的窗口占用快照。三处计量合起来覆盖：请求级成本、消息级归因、窗口级水位。</p>
<h3 id="s-27">7.2 实查数字与一条异常（实测 + 推断警告）</h3>
<p>2026-10-17 本会话 <code>muse.db</code> 只读实查（检查员视图）：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>查询</th>
<th>结果</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>agent.token_usage</code> 行数</td>
<td><strong>0</strong>——该表在检查员视图下为空行集（计量本体可能在运行时侧未投影到检查视图；<strong>不能</strong>据此说系统不计量，因为下面一张表有数据）</td>
</tr>
<tr>
<td><code>agent.agent_message_token_usage</code> 行数</td>
<td><strong>261 行</strong></td>
</tr>
<tr>
<td>同上，<code>sum(input_tokens)</code> / <code>sum(output_tokens)</code></td>
<td>65,360,410 / 706,495</td>
</tr>
<tr>
<td>同上，<code>max(input_tokens)</code>（单行）</td>
<td><strong>3,966,366</strong></td>
</tr>
</tbody>
</table></div>
<p>异常读法（<strong>推断</strong>）：单行 <code>input_tokens</code> 达 396 万，<strong>超过 350K 窗口近一个数量级</strong>——所以这一列绝不能直读为「那条消息发送时的窗口占用」。更可能的口径是归因累计（同一 message_id 在多次推理/重试/子段中被反复计入）或含缓存重放的全量输入。无论哪种，教训与 §6.3 相同：<strong>计量表是审计账，不是仪表盘</strong>；把账本数字当实时水位用，会得出错误结论。本文只报原始数与这个警告。</p>
<h3 id="s-28">7.3 内部计量 vs 对外计费</h3>
<p>注意区分两个「价」：§1.2 的 Model API 定价（文档，$/百万 tokens，缓存输入单独定价）是<strong>对外售卖口径</strong>；本节的四分法计量是<strong>内部审计口径</strong>。两者在「缓存输入单列」这一点上同构——说明缓存不是实现细节，而是从计量到计费贯通的一等概念（<strong>推断</strong>）。</p>
<hr>
<h2 id="s-29">8. 模型选择与路由：已知与未知</h2>
<p>把前面各节的碎片合成为「谁决定用哪个模型」的一张表：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>决策点</th>
<th>规则可见性</th>
<th>证据</th>
</tr>
</thead>
<tbody>
<tr>
<td>套餐面 → 模型池</td>
<td><strong>文档可见</strong>：免费面 Spark（有例外）；付费面 Spark + Wonder，Wonder 管主对话/构建/定时/子 Agent/后台</td>
<td>§1.2</td>
</tr>
<tr>
<td>当前会话 → 具体模型</td>
<td><strong>结果可见、原因不可见</strong>：runtime context 给出 <code>model</code> 定版（本机 = Spark），文档明说 Agent 答不出为什么、何时变、无设置项</td>
<td>§2</td>
</tr>
<tr>
<td>工作负载 → 通道</td>
<td><strong>标签可见、映射不可见</strong>：请求带 <code>inference_workload_class / lane</code>，且十余个子系统各走各的 <code>* inference</code> 通道</td>
<td>§2.3、§4</td>
</tr>
<tr>
<td>VM 信任等级 → 路由</td>
<td><strong>门控可见</strong>：CVM 有独立推理路线，缺失即硬报错</td>
<td>§3.4</td>
</tr>
<tr>
<td>专门面 → 模型要求</td>
<td><strong>门控可见（不记名）</strong>：strings 显示 Web artifact 推理对模型有准入要求，不满足走不了那条线——具体代号按红线不写</td>
<td>§4 strings 复核</td>
</tr>
<tr>
<td>子 Agent → 模型</td>
<td><strong>实测同面</strong>：本子 Agent 会话的 runtime context 与 trace 中 <code>model</code> 均为 Muse Spark（11-04 复核同样为 Muse Spark），与主会话一致；是否存在子 Agent 单独升/降档，本机无证据</td>
<td>§2.1</td>
</tr>
<tr>
<td>降级/故障转移</td>
<td><strong>不可见</strong>：只有失败模板（timeout / HTTP / response failed）证明失败被分类处理，是否有自动换模型重试，本机无证据，不猜</td>
<td>§4–§5</td>
</tr>
<tr>
<td>救援推理桥</td>
<td><strong>实测</strong>（03 篇 §5.2.x，<code>hatch-rescue --help</code> 当场验证）✅</td>
<td><code>codex-inference-bridge</code>：&quot;Run one token-gated Codex HTTP/1 bridge to the inference-proxy UDS&quot;（<code>--inference-socket</code> + <code>--parent-pid</code>）——与主线正交的第二条推理通道：rescue 侧终结一个 HTTP/1 监听口、转接到 inference-proxy 的 Unix socket；鉴权语义是令牌门控（非主线的环境契约）；寿命绑父 PID（父死桥死）。仍不可见（❓）：令牌签发方、配额记账方式、与主线的路由优先级关系</td>
</tr>
</tbody>
</table></div>
<p>一句话：<strong>路由的输入维度在本机几乎都能数出来，路由函数本身一行都看不到。</strong> 这正是 §2.1 那条「只认 runtime context」纪律存在的原因——Agent 被设计为路由的消费者，不是路由的解释者。</p>
<hr>
<h2 id="s-30">9. 本机看不见的部分（边界声明）</h2>
<p>以下均不在本机证据范围内，本文不作结论：</p>
<ul>
<li>模型本身：权重、参数规模、架构、训练数据与后训练方法（文档只给出定位与定价口径，及「Wonder 建于更大的预训练模型」一句定性描述）；</li>
<li>推理服务：集群部署、批处理/调度算法、KV 缓存实现、代理之后的 HTTP 服务拓扑、<code>JARVIS_INFERENCE_HOSTNAME</code> 指向何处；</li>
<li>路由函数：§8 各维度到具体模型的映射、Spark 与 Wonder 之间的实际分流比例、故障转移策略；</li>
<li><code>before_inference</code> 相位具体执行的检查项（名字与 Sentinel 的存在只能支持「有前置处理」的推断）；</li>
<li>计量口径的服务端定义：<code>agent_message_token_usage.input_tokens</code> 为何可远超窗口（§7.2 只给出警告与候选解释，未证实）；</li>
<li>压缩触发计数的精确口径（§6.3 单行样本与 272K 触发线之间的差异未有本机文档解释）。</li>
<li>推理载荷记录的隐私面（❓）：<code>inference_payload_logging</code> 模块在会话生命周期内系统性记录每次推理的载荷/用量（§4），但 redaction 策略（用户 PII、密钥、审批上下文是否落盘）、保留期、谁可读——在本机证据内全不可见。这是 A 基线&quot;Discretion&quot;视角下本篇最该问却未答的问题，列为下轮取证项。</li>
</ul>
<p>本机能确证的到此为止：<strong>一块门牌、一条电话线、一本账簿，以及电话线上每个状态的名字。</strong></p>
<hr>
<h2 id="s-31">10. 本层实测快照（11-04 重测；10-17 旧数随行标注）</h2>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>项</th>
<th>值</th>
</tr>
</thead>
<tbody>
<tr>
<td>当前模型（runtime context / trace / system 快照三处一致）</td>
<td>Muse Spark（<strong>11-04 复核仍为 Spark</strong>），快照自述版本 1.3（11-04 复核仍为 1.3）</td>
</tr>
<tr>
<td>文档在册模型</td>
<td>Muse Spark 1.3（2026-09）· Muse Wonder（2026-10-12 宣布）· Muse Wonder Full（Muse 高阶套餐）——10-17 文档快照；11-04 仅核验 docs/muse.md 仍述 Spark 1.3 为 current version</td>
</tr>
<tr>
<td>推理位置</td>
<td>不在本机；本机无权重文件（10-17；本轮未复测）</td>
</tr>
<tr>
<td>推理入口</td>
<td>env 契约三键 11-04 实测仍在位（<code>JARVIS_INFERENCE_PROXY_SOCK=/run/hatch/proxy/inference.sock</code> 等）；该目录对 <code>muse.exec</code> 工具沙箱不可见（11-04 复核仍报不存在）；<code>sandbox/</code> 当场见 4 个套接字（含新增 <code>space-privileged.sock</code>；10-17 为 3 个）</td>
</tr>
<tr>
<td>协议痕迹</td>
<td>Unix 套接字 → WS 握手；JSON 推理上下文头；普通/实时双通道（10-17 strings；本轮未复测）</td>
</tr>
<tr>
<td>上下文参数（主报告会话状态实测）</td>
<td>窗口 350,000 / 压缩触发 272,000 / 保留尾部 40,000 tokens（10-17 实测；本轮未复测，保留原值）</td>
</tr>
<tr>
<td>压缩实查</td>
<td>检查员视图 1 行：<code>trigger=threshold</code>，138,741 → 18,891 tokens，<code>first_kept_seq=123, checkpoint_seq=144</code>（10-17 实查；本轮未复测）</td>
</tr>
<tr>
<td>计量实查</td>
<td><code>agent.token_usage</code> 检查视图 0 行；<code>agent.agent_message_token_usage</code> 261 行（Σin 65,360,410 / Σout 706,495，单行 max in 3,966,366，口径警告见 §7.2）（10-17 实查；本轮未复测）</td>
</tr>
</tbody>
</table></div>
</div>]]>
    </description>
    <link>https://agent.aow.me/i/muse-architecture-04/</link>
  </item>
  <item>
    <title>Muse 智能体 · 宿主层详解</title>
    <guid>TuDs7Ft0kUi</guid>
    <pubDate>Tue, 03 Nov 2026 19:41:41 GMT</pubDate>
    <itunes:explicit>false</itunes:explicit>
    <description>
      <![CDATA[<div class="original-article" lang="zh-CN"><details class="toc"><summary>本篇目录</summary><ol><li><a href="#s-1">0. 什么是「宿主层」</a></li><li><a href="#s-2">1. 持久 VM：地皮可换，home 不动</a></li><li><a href="#s-6">2. 核心进程：hatch daemon 与 hatch-execd</a></li><li><a href="#s-10">3. Runtime Cell：htch-runtime 的一生</a></li><li><a href="#s-16">4. 渠道门控：Scopes 三件套</a></li><li><a href="#s-20">5. 引导与自愈：spawnd 与救援/健康子系统</a></li><li><a href="#s-26">6. JARVIS_* 环境契约面</a></li><li><a href="#s-31">7. Guest systemd：房间里的极小政府</a></li><li><a href="#s-32">8. 恢复机制：机器死了，工作不死</a></li><li><a href="#s-37">9. 设计要点（宿主层的取舍）</a></li><li><a href="#s-38">10. 边界清单（「不能」与「看不见」也是架构的一部分）</a></li><li><a href="#s-39">11. 本机实况快照（11-04 重测；10-17 旧数随行标注）</a></li><li><a href="#s-41">12. 看不见的部分</a></li></ol></details><blockquote>
<p>配套《00-Muse技术架构解构》的 §1 展开篇（§16 为本机快照的交叉参照）。调查日期：2026-10-17。
复核修订：2026-11-04（Asia/Shanghai）——基于当前会话运行时逐项重测；下文数字凡未注日期者均为 11-04 快照，10-17 旧数见 §11 快照表（随行标注）与 §11.1 变化对照表。
证据范围：本机当场实测——进程表、<code>/opt/hatch/bin/</code> 文件尺寸、<code>/opt/hatch/runtime-cell/</code> 全部脚本与 scopes 文件、<code>/run/hatch/</code> 目录与套接字结构、进程环境变量<strong>键名</strong>、cell 内 guest systemd 状态、<code>~/docs/</code> 与 <code>~/workspace/system/system_prompt.md</code> 相关段落。
标注规则同前作：<strong>实测</strong> = 本机命令/工具当场验证；<strong>文档</strong> = 本地 docs/system 文件明文；<strong>推断</strong> = 由文件/字符串拼出、未经服务端证实。
纪律：环境变量只记键名，不记任何凭据值、令牌值与不透明 ID 的原文；套接字路径属结构信息，按前作惯例记录。</p>
</blockquote>
<hr>
<h2 id="s-1">0. 什么是「宿主层」</h2>
<p>宿主层 = <strong>Agent 脚下的地面</strong>：它回答四个问题——Agent 跑在哪台机器上（且那台机器随时会被换掉）、谁把 Agent 住的房间（runtime cell）盖起来并看住它、宿主与房间之间靠什么契约说话、机器被替换后工作如何被接回来。</p>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>层（从下到上）                     性质                       本机实测规模
────────────────────────────────────────────────────────────────────────────
⑤ 恢复面                           RV 上的 resume 标记 + DB 检查点   /run/hatch/resume 9 个文件（10-17；本轮未复测）
④ 契约面                           环境变量键 + guest.env + 套接字   JARVIS_* 26 键（10-17 为 31）· 套接字 166（10-17 为 147）
③ 进程面                           宿主侧守护进程进入 cell 干活        hatch 540MB · execd 9.7MB（10-17 为 470MB / 9.5MB）
② 运行时单元 runtime cell          nspawn 容器 = Agent 的房间         htch-runtime · guest systemd
① 虚拟化面                         一名用户一台持久 VM               standard VM · home 在 RV 上
横切：生命周期脚本（pre/launch/post/stop + ensure-rootfs + trust-store）
横切：引导/救援/健康子系统（spawnd · hatch-rescue · hatch-healthd · hatch-doctor）
</code></pre>
<p><strong>一句话分工</strong>：VM 是「地皮」（可整体替换），runtime cell 是「房间」（每次启动按同一图纸重盖），<code>hatch daemon</code> 是住在房间里管事的人，<code>hatch-execd</code> 是替它跑腿执行命令的人，<code>spawnd</code> 是盖房与修房的工程队，环境变量与套接字是墙上的「管线接口」——房间里的人只能通过这些接口够到外面的世界。最重要的设计前提写在主报告 §1：<strong>Agent 进程本身被当作不可信/可替换，状态与权限都不放在它进程里</strong>；本篇要展示的是宿主层如何把这句话做成机制。</p>
<p>一个观察位置的说明：本篇的实测是在 cell <strong>内部</strong>做的。宿主侧的脚本（<code>/opt/hatch/runtime-cell/</code>）以只读方式显露进 cell，所以宿主逻辑对 Agent 异常地「可读」；但宿主的进程树、宿主 systemd 单元本体、<code>/var/lib/hatch-runtime/rootfs</code> 的宿主路径都不在 cell 视图内——<strong>能读图纸，不等于能看见工地</strong>。凡属此类，本文标为边界（§10、§12）。</p>
<hr>
<h2 id="s-2">1. 持久 VM：地皮可换，home 不动</h2>
<h3 id="s-3">1.1 契约（文档）</h3>
<ul>
<li><code>docs/muse.md</code> 与 system prompt 明文：<strong>一名用户 = 一台专属持久 Linux VM</strong>；部署更新频繁（可达每小时），<strong>VM 可被整体替换、其上进程会被停掉，但 home 目录持久</strong>；运行时为已保存的 job、子 Agent、cron、artifact 与可恢复的 Agent 工作管理恢复，<strong>自起的自定义进程只能靠自己的启动配置自证恢复</strong>（system prompt「Deployments」一条，<code>system_prompt.md</code> 第 255 行）。</li>
<li>文件系统语义同源：<code>~</code> 之外（<code>/usr/local/bin</code>、<code>/etc</code>、<code>/root</code>、<code>/var</code>）皆为临时，重启/替换即失；耐久物只能放 <code>~/workspace/</code>。</li>
<li>VM 分级（<code>docs/data-handling.md</code>）：按 docs 口径，standard 面不承诺 TEE 级隔离（⚠️ 转述，原文措辞待引）；confidential VM 全程 TEE 硬件保护、客户自管密钥。本机为 standard（runtime 标注，见 §11）。</li>
</ul>
<h3 id="s-4">1.2 持久性的物理实现（实测）</h3>
<p>cell 内的挂载表把「home 持久」从承诺变成了可见的机制：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>路径</th>
<th>实测挂载</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>/</code>（cell 根）</td>
<td>overlay：lower=<code>/sysroot</code>，upper=<code>/run/hatch/overlay/upper</code></td>
<td>房间本身是叠加层——基底只读，改动落在易失 upper，房间重盖即回基底</td>
</tr>
<tr>
<td><code>/home/hatch</code></td>
<td><strong>btrfs，设备 <code>/dev/mapper/rv</code></strong>（rw，zstd 压缩）</td>
<td>home 挂在 RV（Reliable Volume）上，与根 overlay 完全不同的存储面</td>
</tr>
<tr>
<td><code>/run/hatch/resume</code></td>
<td><strong>同一 <code>/dev/mapper/rv</code> btrfs</strong></td>
<td>恢复标记与 home 同卷——VM 换掉后，新 VM 挂回同一 RV 即同时拿回 home 与恢复状态（见 §8）</td>
</tr>
<tr>
<td><code>/opt/hatch</code>、<code>/etc/hosts</code> 等</td>
<td>squashfs（<code>/dev/mapper/opt_hatch</code>，ro）</td>
<td>系统资产以镜像方式只读提供，随部署整体替换</td>
</tr>
<tr>
<td><code>/run/hatch/*</code> 各子目录</td>
<td>tmpfs（多为 ro）</td>
<td>运行时接口面，每次启动重建</td>
</tr>
</tbody>
</table></div>
<p>时间证据同样指向「home 比机器老」（10-17 那代 cell 实测）：本 cell 于 2026-10-17 13:20 UTC 启动（guest systemd 实测），而 <code>/home/hatch</code> 目录时间戳为 09-28、其下文件跨越数周——<strong>当时这台「机器」只有约 2.5 小时岁，用户的家已经住了三周</strong>。11-04 本轮 cell 于 2026-11-03 15:22 启动（<code>uptime -s</code> 实测），RV 卷（<code>/dev/mapper/rv</code>，150G，11-04 <code>df</code> 实测）仍是跨代持久的同一卷。</p>
<h3 id="s-5">1.3 每-VM 差异的重放：os-intent 台账（脚本实测）</h3>
<p>rootfs 每次都从镜像基底克隆（§3.2），那每台 VM 装过的系统包差异怎么办？<code>resolve-rootfs-path.sh</code> 注释明文：退役的「RV 上养一棵持久 rootfs」模式已被废弃，per-VM 的 OS 包改为从 <strong>os-intent ledger（意图台账）</strong> 经 <code>hatch-preflight-opportunistic</code>（实测 1,308 行二进制/脚本）在启动时<strong>重放</strong>——即持久的不是 rootfs 本体，而是「对基底做过哪些改动」的意图记录。这与全系统的反复模式同构：<strong>存意图与状态，不存易失的执行体</strong>（对照：cron 存定义不存进程、记忆存 claims 不存对话缓存）。</p>
<hr>
<h2 id="s-6">2. 核心进程：hatch daemon 与 hatch-execd</h2>
<h3 id="s-7">2.1 体量与进程实况（实测）</h3>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>二进制</th>
<th>字节数</th>
<th>角色</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>hatch</code></td>
<td>540MB（10-17 为 470MB）</td>
<td>主守护进程（daemon 子命令即 Agent 运行时本体）</td>
</tr>
<tr>
<td><code>hatch-execd</code></td>
<td>9.7MB（10-17 为 9.5MB）</td>
<td>命令执行守护：Agent 的一切 shell 执行经它</td>
</tr>
<tr>
<td><code>spawnd</code></td>
<td>19MB（10-17 为 18MB）</td>
<td>安装/引导/生命周期工程队（§5）</td>
</tr>
<tr>
<td><code>hatch-rescue</code> / <code>hatch-rescuectl</code> / <code>hatch-rescue-systemctl</code></td>
<td>13MB / 8.3MB / 2.4MB（与 10-17 一致）</td>
<td>救援子系统（§5.2）</td>
</tr>
<tr>
<td><code>hatch-healthd</code></td>
<td>9.2MB（10-17 为 8.9MB）</td>
<td>健康轮询（§5.2）</td>
</tr>
<tr>
<td><code>hatch-doctor</code></td>
<td>13MB（10-17 为 12MB）</td>
<td>确定性状态检查（§5.2）</td>
</tr>
</tbody>
</table></div>
<p>进程表（cell 内视图）：<code>hatch daemon --runtime-cell-leader=2181</code>（10-17 两次采样 RSS 约 344–386MB，随负载波动；11-04 采样约 357MB，仍在该区间内）与 <code>hatch-execd --runtime-cell-leader=2181</code>（10-17 采样 RSS 约 11MB，本轮未复测）同以 root 运行，<strong>父 PID 均为 0</strong>——它们的父进程不在 cell 的 PID 命名空间里：这是「从宿主侧被送进房间」的直接证据。参数里的 leader 值是 cell 的 PID 1 在<strong>宿主</strong> PID 命名空间中的编号（cell 内 PID 1 是 guest systemd 自身），Agent 在 cell 内无法验证该编号对应的宿主进程。</p>
<h3 id="s-8">2.2 进入方式：不是在房间里出生，是被送进来的（脚本实测）</h3>
<p>daemon/execd 都不由 guest systemd 直接拉起，其宿主侧启动链是：</p>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>宿主 control-daemon.sh / control-execd.sh（root 运行）
 → rce_wait_for_ready_leader：轮询 ready 文件 + machinectl 取 Leader（200 次 × 0.1s ≈ 20s 上限）
 → 进入 cell 的命名空间（nsenter / 二进制自带 enter 逻辑）
 → cell 内 run-daemon.sh：source guest-runtime-env.sh
 → setpriv 摘除 sys_ptrace（bounding/inh/ambient 三套全摘）
 → exec hatch daemon
</code></pre>
<p>细节里见刻意的安全姿势：</p>
<ul>
<li><strong>daemon 落地前先摘 ptrace 能力</strong>：<code>run-daemon.sh</code> 注释明文——摘除后 daemon、execd 与其工具子进程都不能 attach/读取 cell 内任意同侪进程；宿主把「管事的人」也当作要防的对象；</li>
<li><strong>execd 的双半结构</strong>（<code>control-execd.sh</code> 注释）：宿主侧父进程（anchor）留在宿主的 <code>hatch-execd.service</code> cgroup 里作为 systemd 的 MainPID，只有 cell 内子进程加入 cell 的 cgroup 跑服务；它经 systemd socket activation 的 <code>LISTEN_*</code> 文件描述符协议拿到监听口，<strong>不用 nsenter 包装、不用 ptrace/seccomp 监督</strong>（注释直言那是 daemon 的事，不是 execd 的事）；</li>
<li><strong>guest 侧的 execd 单元</strong>（cell 内 <code>/etc/systemd/system/hatch-execd.service</code> 实测）：socket 激活（<code>hatch-execd.socket</code> 监听 <code>/run/hatch/execd/execd.sock</code>，SocketMode 0600），<code>ExecStartPre</code> 先断言 <code>runtime-cell.ready</code> 存在才准起，<code>Restart=always / RestartSec=1</code>，<code>LimitNOFILE=65535</code>，<code>UMask=0007</code>——执行面挂了 1 秒内被 guest systemd 拉回。</li>
</ul>
<h3 id="s-9">2.3 两套视图的关系</h3>
<p>同一个 execd 在宿主侧有 control 脚本、在 guest 侧有 systemd 单元——这不是重复，而是<strong>跨命名空间的接力</strong>：宿主段负责「等房间就绪并把人送进去」，guest 段负责「人在房间里时的 socket 与重启策略」。daemon 没有 guest 单元（其监督者是宿主），execd 两边都有——因为 execd 的监听 socket 必须出生在 guest 的 <code>/run</code> 里才能被工具直接拨通。</p>
<hr>
<h2 id="s-10">3. Runtime Cell：htch-runtime 的一生</h2>
<h3 id="s-11">3.1 是什么（实测）</h3>
<p>cell 是一个由 <strong>systemd-nspawn</strong> 拉起的容器化 rootfs：<code>launch-daemon.sh</code> 以</p>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>systemd-nspawn --quiet --boot --keep-unit --settings=override \
    --directory=&lt;rootfs&gt; --machine=htch-runtime --private-users-ownership=map
</code></pre>
<p>启动它。<code>--boot</code> 意味着房间里跑着自己的 PID 1（guest systemd，§7）；<code>--private-users-ownership=map</code> 做 ID-mapped 挂载：cell 内的 root 对应宿主 uid <strong>131072</strong>（<code>ensure-rootfs.sh</code> 注释：PrivateUsers 64K 窗口的起点）——房间里的「root」走出房门只是一个普通高位 uid。脚本对该选项是硬要求：宿主 nspawn 不支持它就直接退出（宁可不开房，不开一个所有权错乱的房）。</p>
<h3 id="s-12">3.2 rootfs 从哪来（脚本实测）</h3>
<p><code>resolve-rootfs-path.sh</code>（32 行，注释即规格）：cell <strong>永远</strong>从镜像本地的 <code>/var/lib/hatch-runtime/rootfs</code> 启动，那是 <code>rootfs-base</code> 的 <strong>btrfs 快照</strong>，由 <code>ensure-rootfs.sh</code>（1,240 行，本目录最长的脚本）按镜像自带的 <code>cell-base.digest</code> 保持新鲜：</p>
<ul>
<li>digest 变了 → <strong>丢弃本地快照重新克隆</strong>，per-VM 改动走 §1.3 的台账重放；</li>
<li>rootfs 被视为<strong>不可信输入</strong>：上一代 guest 可能在里面埋符号链接，宿主 root 若顺着链接操作会写出 rootfs 之外——因此所有变更操作委托 <code>spawnd fsop</code>，以 <code>openat2(RESOLVE_BENEATH | RESOLVE_NO_SYMLINKS)</code> 在持有的 dirfd 下执行（check/act 竞态被结构性消除）；<code>ensure_not_symlink</code> 只保留为修复通道；</li>
<li>该脚本自身的 stdout 纪律被写进注释大写强调：三个调用方都用 <code>$(...)</code> 捕获它的输出拼路径，<strong>任何多余一个字节都会把路径污染成垃圾</strong>——诊断只能走 stderr。</li>
</ul>
<h3 id="s-13">3.3 网络形状（实测 + 脚本）</h3>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>项</th>
<th>值</th>
</tr>
</thead>
<tbody>
<tr>
<td>虚拟网卡</td>
<td>宿主侧 veth <code>ve-htch-runtime</code>，cell 内见 <code>host0</code></td>
</tr>
<tr>
<td>地址</td>
<td>网关 <code>198.19.0.1/30</code>，cell <code>198.19.0.2/30</code>；IPv6 <code>fd8b:4f84:7d32:99::1</code> ↔ <code>::2/64</code>（cell 内 <code>ip addr</code> 当场验证）</td>
</tr>
<tr>
<td>出口</td>
<td>一切外网经 egress 代理（guest.env 注入 <code>hatch-egress-proxy:3128</code> 一组代理键）；cell 的 DNS 被刻意做成「死的」（guest.env 注释：Node 程序若不走代理直连目标会死在 DNS 上——这是设计，不是故障）。<strong>本机未定</strong>：<code>hatch-egress-proxy</code> 与 Sentinel 的关系（是否为同一组件的本地端点）、白名单与 secret 置换发生在哪一跳 —— 三者只见其名与注释，不见其拓扑（❓）。eBPF 门是 L3/L4 地板，Sentinel 是 L7 策略点（B 基线），proxy 的协议层级本机无证据。</td>
</tr>
<tr>
<td>入口过滤</td>
<td><code>spawnd attach-veth-filter</code> 在 veth 宿主侧挂入向分类器，丢弃 cell 朝宿主本地地址发的帧；<code>attach-cell-gate</code> 在 cell 服务 cgroup 上挂 connect4/6 eBPF 出口门（见 §5.3）</td>
</tr>
</tbody>
</table></div>
<h3 id="s-14">3.4 生命周期全序（脚本实测，共 21 个文件）</h3>
<p><code>/opt/hatch/runtime-cell/</code> 实测 21 个条目（脚本正文 + 配置合计约 4,800 行），按一生排序（11-04 当场复核：<strong>仍为 21 个条目</strong>，文件清单与 10-17 逐项一致，无新增脚本——注：00 篇基线所记&quot;新增脚本 control-daemon.sh 等&quot;是相对 00 原文自己的旧清单，本篇 10-17 清单已含这些文件）：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>阶段</th>
<th>文件</th>
<th>行数</th>
<th>干什么</th>
</tr>
</thead>
<tbody>
<tr>
<td>前置</td>
<td><code>require-modules.sh</code></td>
<td>77</td>
<td>预加载 veth/btrfs 等模块，并把 algif/esp/rxrpc 等内核模块以 <code>install /bin/false</code> 封死（缩减内核攻击面）</td>
</tr>
<tr>
<td>前置</td>
<td><code>ensure-rootfs.sh</code></td>
<td>1,240</td>
<td>按 digest 克隆/修复 rootfs、所有权烘焙、hosts/resolv 修复、env 脱敏副本渲染</td>
</tr>
<tr>
<td>前置</td>
<td><code>build-cell-trust-store.sh</code></td>
<td>—</td>
<td>构建 cell 信任锚（§6.3）：只发布宿主侧目录，<strong>从不读写 rootfs、从不进入 cell</strong></td>
</tr>
<tr>
<td>启动前</td>
<td><code>pre-start.sh</code></td>
<td>449</td>
<td>重挂出口 eBPF 门、veth 过滤、home 传播锚、引导阶段上报；失败给确切 reason</td>
</tr>
<tr>
<td>启动</td>
<td><code>launch-daemon.sh</code></td>
<td>285</td>
<td>渠道显露（§4）后 exec nspawn；全程有 bootstrap watcher 向 spawnd 上报阶段</td>
</tr>
<tr>
<td>启动后</td>
<td><code>post-start.sh</code></td>
<td>217</td>
<td>配 veth 网络、等 Leader 可被 nsenter、写 <code>runtime-cell.ready</code> 就绪标记</td>
</tr>
<tr>
<td>入口</td>
<td><code>runtime-cell-entry.sh</code></td>
<td>123</td>
<td>control 脚本共用的「等就绪 + 取 Leader + 进 cgroup」助手库</td>
</tr>
<tr>
<td>入口</td>
<td><code>control-daemon.sh</code> / <code>control-execd.sh</code></td>
<td>109 / 29</td>
<td>§2.2 的宿主段启动链</td>
</tr>
<tr>
<td>入口</td>
<td><code>run-daemon.sh</code></td>
<td>34</td>
<td>cell 内段：环境、摘 ptrace、exec daemon</td>
</tr>
<tr>
<td>环境</td>
<td><code>guest.env</code> / <code>guest-runtime-env.sh</code></td>
<td>45 / 67</td>
<td>§6 的两份环境契约</td>
</tr>
<tr>
<td>停止</td>
<td><code>stop.sh</code></td>
<td>361</td>
<td>先竖 draining 栅栏（宿主 tmpfs 上，cell 不能伪造/清除），再在 20s 停止预算内分配：优雅关机 5s、等 Postgres 干净停、terminate 1s、kill 0.5s，并追加 clean-stop-proof</td>
</tr>
<tr>
<td>停止后</td>
<td><code>post-stop.sh</code></td>
<td>29</td>
<td>删 ready 标记、拆 home 传播锚（nsenter 到 PID 1 执行）、5s 超时护栏下删 veth</td>
</tr>
<tr>
<td>杂项</td>
<td><code>is-loopback-rv.sh</code> / <code>hatch-preflight-opportunistic</code></td>
<td>79 / 1,308</td>
<td>RV 真伪判定（退出码 0/1/2/3 各有确切语义）/ §1.3 的包重放与机会性预检</td>
</tr>
</tbody>
</table></div>
<p>每个阶段都经 <code>spawnd queue-runtime-cell-bootstrap</code> 把（阶段名、状态、起止毫秒、失败 reason）排队上报，另有 watcher 进程专门盯队列并发射运行时事件——<strong>盖房子的每一步都有监理记录</strong>，这是 §8 恢复与 §5 救援能「知道上次死在哪一步」的前提。</p>
<h3 id="s-15">3.5 套接字可见性分级（跨 04 篇回填）</h3>
<p><code>/run/hatch/</code> 下的 socket 按&quot;谁看得见&quot;分三级（分级框架为推断，条目为两篇实测之和）：</p>
<ul>
<li><strong>宿主服务面</strong>：daemon/execd/rescue/healthd 的控制与健康 socket，只对宿主侧与特权进程可见；</li>
<li><strong>privsep 面</strong>：149 个（11-04 实测；10-17 为 136），按调用方权限分级暴露；</li>
<li><strong>沙箱 API 面</strong>：<code>/run/hatch/sandbox/</code>（11-04 实测 4 个：<code>space-inference.sock</code>、<code>space-media.sock</code>、<code>space-web-search.sock</code> 与新增的 <code>space-privileged.sock</code>；10-17 为 3 个），对 <code>muse.exec</code> 工具沙箱可见——而 <code>JARVIS_INFERENCE_PROXY_SOCK</code> 指向的 <code>/run/hatch/proxy/</code> 目录对同一沙箱<strong>不可见</strong>（11-04 复核仍报不存在，与 10-17 一致）。</li>
</ul>
<p>结论：连&quot;模型的电话线&quot;都不对任意代码执行开放；socket 的<strong>可见性本身就是权限</strong>，与文件权限位是两套正交的门禁。</p>
<hr>
<h2 id="s-16">4. 渠道门控：Scopes 三件套</h2>
<h3 id="s-17">4.1 机制（脚本实测）</h3>
<p>cell 启动时（nspawn 之前，在宿主的私有挂载命名空间里）按当前渠道做三路独立的「显露」（reveal）：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>清单</th>
<th>行数</th>
<th>管什么</th>
<th>实现</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>bin-scopes.conf</code></td>
<td>37</td>
<td>哪些扩展 CLI 二进制进 cell 的 <code>/opt/hatch/bin</code></td>
<td>overlay 占位文件 + 逐文件只读 bind；宿主源在 cell 不可见的 <code>bin-scoped</code> 树</td>
</tr>
<tr>
<td><code>connector-scopes.conf</code></td>
<td>12</td>
<td>哪些连接器文档进 cell</td>
<td>overlay 叠加到连接器基底目录（只能<strong>加</strong>、不能替换基底同名目录）</td>
</tr>
<tr>
<td><code>workflow-skill-scopes.conf</code></td>
<td>10</td>
<td>哪些工作流技能进 cell</td>
<td>同上，叠加到技能基底目录</td>
</tr>
</tbody>
</table></div>
<p>三份清单均标注「Generated from hatch-skills/catalog.toml」，每行 = 一个渠道名 + 该渠道可见的名字列表，同渠道多行取并集。可见的渠道名集合（三份合计，11-04 实测）：<code>prod / prod-cvm / canary / canary-cvm-2 / quail / internal-test / dev / hatch-evals / hatch-pro / hatch-pro-internal / hatch-e2e / external-connectors-test / external-muse-connector-developers / swarm / swarm-cvm / debug-cvm / alpha</code> 等（相对 10-17 新增 swarm 系、canary-cvm-2、debug-cvm、alpha 等行，connector-demo 本轮未见）；三份清单行数 55 / 16 / 10（10-17 为 37 / 12 / 10）。</p>
<h3 id="s-18">4.2 Fail-closed 的四重保险（脚本注释实测）</h3>
<ol>
<li><strong>未知渠道 = 空集</strong>：清单里查不到的渠道名不显露任何东西；</li>
<li><strong>显露失败 = 退回基底</strong>：reveal 的每一步变更都带 <code>|| return 1</code> 守卫，任一步失败就拆掉半成品、按未显露的基底内容启动——注释给出了理由：若在 <code>set -e</code> 下未守卫地失败，launcher 会在 exec nspawn 前退出，而该退出码不在 systemd 的 RestartPrevent 名单里，<code>Restart=always</code> 会把 cell 拖进<strong>无 Agent 的崩溃循环</strong>；</li>
<li><strong>只能加不能换</strong>：scoped 条目若与基底同名直接判失败——渠道显露是「增发」，不是「替换」；</li>
<li><strong>名字即沙箱</strong>：条目名只允许 <code>[a-zA-Z0-9_-]</code>、拒绝符号链接与非普通文件，防止清单里一行字把任意宿主路径 bind 进 cell。</li>
</ol>
<h3 id="s-19">4.3 本机实况：一次真实的 fail-closed（实测）</h3>
<p>11-04 复核：<code>bin-scopes.conf</code> 与 <code>connector-scopes.conf</code> 已新增当前渠道的显露行（各一行 <code>expedia</code>；两份清单行数分别由 37/12 增至 55/16），cell 内 <code>/opt/hatch/bin</code> 当场可见 <code>expedia</code> 二进制——10-17 的「零显露」结论已过期，当前渠道至少显露 expedia 二进制与连接器文档；<code>workflow-skill-scopes.conf</code> 仍无该渠道行（技能显露仍为零）。（采样条件：side-chat 子 Agent 会话；<code>bin-scoped</code> 宿主源树在 cell 内仍不可见。）能力层详解 §4.2 里「约 60 个有 privsep 套接字、无本渠道二进制」的扩展面（转引 01 篇计数，本篇未复核），正是这套门控在本机的落点——门控关掉的东西不是被删了，而是<strong>从未被 bind 进这间房</strong>。</p>
<hr>
<h2 id="s-20">5. 引导与自愈：spawnd 与救援/健康子系统</h2>
<h3 id="s-21">5.1 spawnd：工程队的工具箱（<code>--help</code> 实测）</h3>
<p><code>spawnd</code> 自述为「Jarvis runtime installer engine」，子命令即宿主层的职责清单（节选与宿主层相关者）：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>子命令族</th>
<th>职责</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>install / prepare-runtime / render-systemd / verify-contract</code></td>
<td>把 bundle 安装到宿主、备运行时、渲染 host/docker 两种 profile 的 systemd 单元</td>
</tr>
<tr>
<td><code>queue-runtime-cell-bootstrap / watch-runtime-cell-bootstrap</code></td>
<td>§3.4 的引导阶段队列与监视</td>
</tr>
<tr>
<td><code>emit-daemon-lifecycle / emit-mount-stop-lifecycle / drain-shutdown-observability</code></td>
<td>守护进程与挂载停止的生命周期事件；<strong>上次停止没排完的可观测性行在下次启动时先排空</strong></td>
</tr>
<tr>
<td><code>rv-graft</code></td>
<td>把 RV 身份嫁接到已预启动的运行时上：校验 RV bind、浅验 resume handoff 标记、写带 boot-id 戳的 <code>rv-identity-ready</code>（§8）</td>
</tr>
<tr>
<td><code>attach-cell-gate / attach-veth-filter</code></td>
<td>§3.3 的出口 eBPF 门与入向过滤（每次 cell 启动由 pre-start 重挂，因 cgroup 每次重建）</td>
</tr>
<tr>
<td><code>fsop</code></td>
<td>§3.2 的 fd 安全文件操作，供宿主脚本在不可信 rootfs 上作业</td>
</tr>
<tr>
<td><code>scrub-env-override</code></td>
<td>渲染 cell 可见的 env.override 副本，<strong>把 secret 形状的赋值整段剔除</strong>（含引号 PEM 块与续行），且与宿主侧共用同一谓词防漂移</td>
</tr>
<tr>
<td><code>ensure-worker-accounts / prepare-privsep-workers / idmap-state-dir / release-privsep-worker-views</code></td>
<td>privsep worker 账号、状态目录 idmap 视图的准备与 RV 停止时的释放（主报告 §7 的宿主半边）</td>
</tr>
<tr>
<td><code>emit-critical-failure</code></td>
<td>结构化关键失败事件</td>
</tr>
</tbody>
</table></div>
<h3 id="s-22">5.2 救援与健康（<code>--help</code> 实测）</h3>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>组件</th>
<th>自述与实测行为</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>hatch-rescue</code></td>
<td>「lightweight recovery agent」：监视各组件、失败时重启之；暴露 WebSocket 健康/诊断服务；另有两个重子命令——<code>replace-current-vm</code>（为 rescue 持有的会话更换当前 VM）与 <code>codex-inference-bridge</code>（令牌门控的推理代理桥）</td>
</tr>
<tr>
<td><code>hatch-rescuectl</code>（8.3MB）</td>
<td>救援的控制客户端（<strong>推断</strong>：由命名与 rescue 的服务形态拼出，未逐命令实测）</td>
</tr>
<tr>
<td><code>hatch-rescue-systemctl</code>（2.4MB）</td>
<td>救援语境下的 systemctl 替身（<strong>推断</strong>：同上；其存在本身说明救援路径里有一套不依赖正常 systemd 的操作面）</td>
</tr>
<tr>
<td><code>hatch-healthd</code></td>
<td>轮询 daemon 的 metrics 套接字 <code>/health</code> 刷新其内部缓存，并查 Vault 健康套接字（两个路径均为其 <code>--help</code> 的默认值，参数可由环境覆盖）</td>
</tr>
<tr>
<td><code>hatch-doctor</code></td>
<td>「Deterministic Hatch runtime state checks」：确定性运行时状态检查，只有一个 <code>run</code> 子命令——与编排层的 <code>deterministic-doctor</code> 小时级 cron（02 篇 §7.4）同名同性，是调度/投递侧自检的二进制本体（<strong>推断</strong>二者为同一检查的不同入口）</td>
</tr>
</tbody>
</table></div>
<h3 id="s-23">5.2.x 第二条推理通道：codex-inference-bridge（与 04 的断层接上了）</h3>
<p>04《模型层》§8 的路由表把&quot;救援推理桥&quot;记为&quot;转引 03 篇 §5.2、未在本篇复核 ❓&quot;——系列层面断在这里。本节把 03 这边的实测补上（10-17 <code>hatch-rescue --help</code> 当场验证，<strong>实测</strong>；11-04 仅做现状核对：<code>--help</code> 仍列出 <code>codex-inference-bridge</code> 子命令，文案与 10-17 一致，未重做机制分析）：</p>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>codex-inference-bridge  Run one token-gated Codex HTTP/1 bridge to the inference-proxy UDS
  --inference-socket &lt;INFERENCE_SOCKET&gt;  Existing inference-proxy Unix socket
  --parent-pid &lt;PARENT_PID&gt;              Wrapper PID that owns this bridge's lifetime
</code></pre>
<p>读出的机制（措辞为实测，语义为推断）：</p>
<ul>
<li><strong>这是第二条进推理的线</strong>，与 04 §3.2 的主线（<code>JARVIS_INFERENCE_PROXY_SOCK</code> + WebSocket 握手 + 环境契约认证）正交：桥把一个 <strong>HTTP/1 监听口</strong> 终结在 rescue 侧，再转接到 inference-proxy 的 Unix socket——为&quot;说 HTTP/1 的调用方&quot;（按命令名与 <code>replace-current-vm</code> 的 &quot;rescue-owned Codex session&quot; 自述，调用方是 rescue 拥有的 Codex 会话）提供推理入口；</li>
<li><strong>鉴权语义不同</strong>：主线靠环境契约（env 里的 socket 路径 + 进程身份），这条线是 <strong>token-gated</strong>（令牌门控）——令牌的签发/校验点本机不可见（❓），但&quot;第二条路径 = 第二套配额/鉴权语义&quot;是成立的推断（⚠️）；</li>
<li><strong><code>Run one</code> + <code>--parent-pid</code> 是生命周期设计</strong>：每次起一座桥，桥的寿命绑在父进程 PID 上——父死了桥跟着死，不留孤儿监听口（实测参数语义 + 推断），fail-closed 的另一种形态。</li>
</ul>
<p>给 04 的回填（供 04 作者升级其 §8 &quot;救援推理桥&quot;行）：第二条推理路径的存在性从&quot;转引&quot;升级为本篇实测；仍不可见的是令牌签发方、配额记账方式、与主线的路由优先级关系（❓）。</p>
<h3 id="s-24">5.3 一条硬底线：出口门是地板，不是天花板（脚本注释实测）</h3>
<p><code>pre-start.sh</code> 每次启动都以 root 重挂 cell 的 egress gate（cgroup connect4/6 eBPF，<code>BPF_F_ALLOW_MULTI</code> 组合语义：每个程序都放行才放行），注释明说其定位是 <strong>Sentinel 之下的地板</strong>：Sentinel 死了或被摁住时，cell 仍够不到 link-local/RFC1918/CGNAT 地址；<strong>挂门失败对 cell 启动是致命的</strong>——「一个没门的 cell 正是这一波改造要消灭的姿势」。（与 §3.3 的出口分层口径一致：eBPF 门为 L3/L4 地板，Sentinel 为 L7 策略点；proxy 与 Sentinel 的归属关系、白名单与 secret 置换发生在哪一跳，本机未定，见 §3.3。）与之对称，<code>stop.sh</code> 的 draining 栅栏立在宿主 tmpfs 上、cell 无法伪造或清除，保证「正在停机的 cell 不会再被 ingress 当作活的」。</p>
<h3 id="s-25">5.4 降级路径：fail-closed 之外，失败被分类而不是被吞掉</h3>
<p>§5.3/§9 写清楚了 fail-closed 的点（出口门挂失败就不开机），但&quot;代理或 Sentinel 本身故障时，推理/工具调用是排队、硬失败，还是降级&quot;本轮只能回答一半——已确证的失败分类（✅ 实测 strings + 04 §4），与仍未知的部分分开写：</p>
<p><strong>已确证的模式</strong>：</p>
<ul>
<li><strong>客户端构造是 fail-closed</strong>：<code>JARVIS_INFERENCE_PROXY_SOCK is required to construct …</code>（04 §4 strings 实测）——没有这个 env 就建不出推理客户端，不存在&quot;默认直连地址&quot;的静默降级；</li>
<li><strong>失败被分类，不被吞掉</strong>：十余个子系统各自有独立的 <code>* inference timed out after …</code> 报错（summarization、visual_grounding、activity monitor、browser task tagging、voice reranker…，04 §4 实测）——超时是按子系统分开记账的，不是全局一刀切；</li>
<li><strong>推理不可用是具名终局</strong>：strings 里有 <code>RunInferenceUnavailable</code> / <code>RunInferenceAuthFailed</code> 作为运行终局状态码（✅ 实测）——&quot;推理挂了&quot;是一个被命名的失败，不是无声的队列堆积；</li>
<li><strong>组件级有局部降级</strong>：instagram 轮播子项查找失败 → &quot;keeping the stored thumbnail&quot;；子 Agent 转录 resume 时不可用 → &quot;using persisted prompt history fallback&quot;；调度触发与即兴生成的折叠极性不同（scheduled fire skips / adhoc falls to the pulse lane）——降级发生在<strong>调用方</strong>，宿主层不替它们做决定。</li>
</ul>
<p><strong>仍未知（❓）</strong>：是谁在重试、重试预算多少、代理/Sentinel 故障时请求是排队还是硬失败。04 §4 的 <code>waiting_for_inference_start</code> 证明&quot;排队&quot;在本机有名字，但排队策略、超时预算、降级阈值都在服务端，本机无证据，不猜。<strong>设计建议</strong>：宿主层能补的只有&quot;排队/降级开关在 cell 侧有无落点&quot;（如 guest.env/契约面的相关键），建议后续查 <code>JARVIS_*</code> 键族的超时/重试类键名分布。</p>
<hr>
<h2 id="s-26">6. JARVIS_* 环境契约面</h2>
<h3 id="s-27">6.1 进程级实测：26 个键（只记键名）</h3>
<p>本轮子 Agent 工具进程的环境里实测 <strong>26 个</strong> <code>JARVIS_*</code> 键（10-17 工具进程为 31 个；10-17 的 1 个 <code>HATCH_API_SOCKET</code> 本轮未见）。按功能分族（11-04 键表；相对 10-17 下线 5 键，见 §11 对照表——⚠️采样进程类型与渠道不同：本轮为 side-chat 子 Agent，会话类型本身可影响键集）：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>族</th>
<th>键名</th>
</tr>
</thead>
<tbody>
<tr>
<td>身份与会话</td>
<td><code>JARVIS_HOME</code>、<code>JARVIS_BIN_DIR</code>、<code>JARVIS_HATCHLING_ID</code>、<code>JARVIS_SESSION_ID</code>、<code>JARVIS_TOOL_CALL_ID</code>、<code>JARVIS_TRACE_CONTEXT</code>、<code>JARVIS_RUNTIME_CONTEXT_TOKEN</code>、<code>JARVIS_FQDN</code>、<code>JARVIS_REQUEST_MODE</code>（9；10-17 另有 <code>JARVIS_IS_ASSIGNED</code>，本轮未见）</td>
</tr>
<tr>
<td>服务套接字</td>
<td><code>JARVIS_AUTHD_SOCK</code>、<code>JARVIS_STEFI_PROXY_SOCK</code>、<code>JARVIS_INFERENCE_PROXY_SOCK</code>、<code>JARVIS_INFERENCE_HOSTNAME</code>、<code>JARVIS_MEMORY_SOCK</code>、<code>JARVIS_SANDBOX_API_SOCK</code>、<code>JARVIS_SECURITY_SOCK</code>、<code>JARVIS_SENTINEL_HTTP_API_SOCKET</code>、<code>JARVIS_TELEMETRY_PROXY_SOCK</code>、<code>JARVIS_RESCUE_SIGNAL_SOCK</code>（10；与 10-17 一致）</td>
</tr>
<tr>
<td>出口审批三件套</td>
<td><code>JARVIS_DAEMON_EGRESS_APPROVAL_SOCK</code>、<code>JARVIS_EGRESS_APPROVAL_ADMIN_SOCK</code>、<code>JARVIS_EGRESS_APPROVAL_EVENTS_SOCK</code>（3；与 10-17 一致）</td>
</tr>
<tr>
<td>部署与呈现</td>
<td><code>JARVIS_CD_CHANNEL</code>、<code>JARVIS_USER_TIMEZONE</code>、<code>JARVIS_PRESENTATION_LOCALE</code>、<code>JARVIS_AUTHD_INGRESS_ALLOWED_USERS</code>（4；10-17 另有 <code>JARVIS_CD_PINNED</code>、<code>JARVIS_TIER</code>、<code>JARVIS_VM_COMPUTE_REGION</code>、<code>JARVIS_VM_DATA_REGION</code>，本轮均未见——其中 VM_COMPUTE_REGION 下线与 00 篇基线一致）</td>
</tr>
</tbody>
</table></div>
<p>值的形态（分类而非原文）：套接字族全部是 <code>/run/hatch/…</code> 下的 Unix socket 路径；身份族是不透明 ID 与追踪上下文；其中两个键呈令牌形态，本篇只记「存在」不记值与长度细节。<strong>契约面里没有凭据值</strong>——凭据在 authd/Vault 后面（主报告 §14），环境只负责告诉进程「去哪儿敲门」。</p>
<p>注意这只是<strong>一个进程在一次调用时</strong>的采样：键集随调用类型变化（如媒体、浏览器任务会有各自的增补），26（10-17 为 31）是本类进程的实测数，不是全集定义；引用时应带采样条件。</p>
<p><strong>跨篇注记</strong>：04 篇 §3.2 在子 Agent 的 <code>muse.exec</code> 沙箱环境中枚举为&quot;约 30 个&quot;。差 1 的可能原因是采样进程类型不同（本节为工具进程，04 为沙箱进程；上文已述&quot;键集随调用类型变化&quot;）。两处数字均为单次采样，不是全集定义；引用时应带采样条件。</p>
<p>另：<code>JARVIS_SECURITY_SOCK</code> 只确认其在契约面存在，安全服务的机制见 10 篇。</p>
<h3 id="s-28">6.2 第二份契约：guest.env（文件实测）</h3>
<p>工具子进程的环境不直接继承 daemon 的环境，而是由宿主渲染的 <code>guest.env</code> 决定。文件头注释即其安全规格：</p>
<ul>
<li>纯 <code>KEY=VALUE</code> 文本，<strong>不是 shell 脚本</strong>——没有逻辑、没有命令替换，cell 无从影响它；</li>
<li>由 spawnd 管理、root 持有、以只读 bind 进入 cell，<strong>cell 改不了它</strong>；</li>
<li>privsep 的可信侧在宿主侧读它，为隔离工具调用拼环境，<strong>避免在有特权的上下文里 source 一个 shell 文件</strong>；</li>
<li>内容分工：<code>HOME/TMP/XDG</code> 基础路径、一组 egress 代理键、一组 CA 键（7 个别名同指 <code>/run/hatch/egress-tls/ca-bundle.pem</code>，照顾不同生态的工具各认各的变量名）、<code>PATH</code>（<code>/opt/hatch/bin</code> 打头）；</li>
<li>一个生态细节：<code>NODE_USE_ENV_PROXY=1</code>——Node 的内置 fetch 默认不认代理环境变量，没有这个开关，Node 写的 CLI 会绕过代理直连并死在 §3.3 的死 DNS 上。</li>
</ul>
<p>与之配对的 <code>guest-runtime-env.sh</code> 是 cell <strong>内</strong> daemon 路径用的 shell 版（可被 cell 影响，故特权启动链被明文禁止信任它——<code>control-execd.sh</code> 注释直言须用 guest.env 而非这个文件）。<strong>同一份环境，两份可信度不同的载体，调用方按自己的特权级别选</strong>，是契约面里最细的一刀。</p>
<h3 id="s-29">6.3 信任锚：恰好一个（脚本实测）</h3>
<p><code>build-cell-trust-store.sh</code> 头注释把一条不变量写死：发布进 cell 的信任锚<strong>恰好一个</strong>——Sentinel 出口 CA。它在 Sentinel 启动时于内存中生成、只发布证书本体；发布形态是三个只读目录 bind（锚目录 + 两个 NSS 数据库），用目录而非文件 bind，是为了轮换时以 rename 发布、cell 能立刻看见新证书。NSS 数据库必须宿主构建且只读，因为打开 NSS DB 会 dlopen 其中命名的 PKCS#11 模块——<strong>一个 cell 可写的 NSS DB 就是对所有打开者的代码执行原语</strong>；而 PEM 锚文件无此危害，所以 guest 侧的 <code>hatch-ca-trust</code> 服务（§7）可以自己把锚链进系统 CA 并跑 <code>update-ca-certificates</code>。曾经发布进来的 VM 入口链证书已被移除（注释留了案底与「不许加回来」的理由：系统级 CA 会为<strong>每一个</strong>主机名背书，包括 Sentinel 不终止、只中继的流量）。</p>
<h3 id="s-30">6.4 第三方环境：daemon 生命周期键（脚本实测）</h3>
<p><code>control-daemon.sh</code> 里还有一族 <code>HATCH_DAEMON_LIFECYCLE_*</code> 键（command/operation/各阶段时间戳/是否首次尝试/是否镜像启动等，约 17 个键名实测）。它们的传递方式本身是宿主层的一课（注释代号 RT-3）：</p>
<ul>
<li>旧做法是 spawnd 写一个 shell 文件、control 脚本 <code>source</code> 它——但该文件所在目录归 daemon（即 cell root）所有，cell root 可在写与 source 之间换文件，构成 <strong>uid 131072 → 宿主 root 的代码执行竞态</strong>；</li>
<li>新做法：状态放 root 持有的 <code>/run/hatch/daemon-ctl/</code>，环境改为<strong>一键一文件</strong>，control 脚本按显式白名单逐个读文件体作值导出——<strong>不 eval、不 source、不给任何非 root 身份留路径成分</strong>；</li>
<li>为什么不用 systemd 的 LoadCredential：注释同样给了理由——这些键是在本次启动<strong>过程中</strong>才产生的（且各启动路径下可选缺席），LoadCredential 在单元首进程拉起时一次性物化，时序上不合。</li>
</ul>
<hr>
<h2 id="s-31">7. Guest systemd：房间里的极小政府</h2>
<p>cell 内 PID 1 是 guest 自己的 systemd（实测：<code>systemd-analyze</code> 显示 userspace 启动 2.662s、default.target 304ms 达成；<code>is-system-running</code> = running；<strong>failed 单元 0</strong>）。<code>list-units --type=service</code> 只有 <strong>13 个</strong>，构成极简：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>类</th>
<th>单元</th>
</tr>
</thead>
<tbody>
<tr>
<td>systemd 自家家务</td>
<td>journald、journal-catalog-update、journal-flush、remount-fs、sysctl、sysusers、tmpfiles 三件、ldconfig、update-done、update-utmp、keyboard-setup</td>
</tr>
<tr>
<td>Hatch 的</td>
<td><code>hatch-execd</code>（socket 激活，§2.2）、<code>hatch-ca-trust</code>（.path 监视锚目录 + oneshot 服务：把 §6.3 的锚链入 <code>/usr/local/share/ca-certificates</code> 并刷新系统 CA，超时 120s）</td>
</tr>
</tbody>
</table></div>
<p>其余 200 余个单元条目绝大多数是<strong>挂载单元</strong>（nspawn 为每个 bind 生成的 <code>.mount</code>：/opt/hatch 的 squashfs、/home 的 RV btrfs、/run/hatch 各 tmpfs、NSS DB、Chromium 与技能目录等）——guest systemd 在这里的主要角色是<strong>挂载账本</strong>，不是服务监督者：daemon 与 privsep worker 的真正监督都在宿主侧。</p>
<p>对用户自起程序的含义（文档，scheduling 相关）：运行时支持 guest systemd 托管常驻程序（流监听、本地服务等），但纪律是「<strong>enable 成功 ≠ VM 替换后能恢复</strong>」——单元文件若只写在 cell 的易失 rootfs 上，下一次部署就随房间一起没了；要活过替换，必须把恢复路径放进持久面并实证（对照 cron/hooks 的运行时托管恢复，自起进程不在其列）。</p>
<hr>
<h2 id="s-32">8. 恢复机制：机器死了，工作不死</h2>
<p>恢复不是单一功能，而是四层叠加：</p>
<h3 id="s-33">8.1 卷级：RV 与 resume 标记（实测）</h3>
<p><code>/run/hatch/resume/</code> 挂在与 home 同一 RV btrfs 上，以下为 10-17 那代 cell 启动时的实测文件（本轮 cell 已换代，未复测）：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>文件</th>
<th>尺寸/时间</th>
<th>作用（由名与脚本拼出，标推断处除外）</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>hotset.manifest</code> / <code>hotset.tier1.manifest</code></td>
<td>92,292 / 28,167 字节，启动后约 9 秒落盘</td>
<td>「热集」清单：恢复时先拉起的工作集与其第一梯队</td>
</tr>
<tr>
<td><code>pg-clean.proof</code></td>
<td>11,412 字节，启动后约 14 秒</td>
<td>上次停止时 Postgres 干净关闭的证明（<code>stop.sh</code> 的 clean-stop 流程与 spawnd 的 <code>append-clean-stop-proof</code> 对应）——有它走快路径，没它走修复路径（<strong>推断</strong>分工细节）</td>
</tr>
<tr>
<td><code>execution-ready.marker</code>、<code>handoff-epoch</code>、<code>handoff-marker.slot0</code></td>
<td>小文件</td>
<td>执行就绪标记与 handoff 纪元（<strong>推断</strong>：纪元号防旧一代的迟到投递冒充新一代）</td>
</tr>
<tr>
<td><code>rv-identity-ready</code></td>
<td>77 字节</td>
<td><code>spawnd rv-graft</code> 写入，带 boot-id 戳：证明本代启动已认领该 RV 身份</td>
</tr>
<tr>
<td><code>profile-sync-checkpoint-v2.json</code></td>
<td>时间戳为 09-29</td>
<td>档案同步检查点——<strong>比本 cell 早了 18 天</strong>，是「状态跨 VM 存活」的直接物证</td>
</tr>
<tr>
<td><code>first-boot-ensure-stamp.json</code></td>
<td>含 schema_version 与指纹字段</td>
<td>首启确保流程的完成戳（只记结构，不记其标识值）</td>
</tr>
</tbody>
</table></div>
<h3 id="s-34">8.2 进程级：监督重启</h3>
<p>guest 侧 execd <code>Restart=always</code>（§2.2）；宿主侧 rescue 监视组件并重启（§5.2）；调度侧另有 <code>deterministic-doctor</code> 小时级自检（02 篇 §7.4）。三层监督的共同点是<strong>都只负责「把进程拉回来」，不负责「把工作接上」</strong>——接工作是下一层的。</p>
<h3 id="s-35">8.3 状态级：DB 检查点（DB schema 证据，转引 00/02 篇实测）</h3>
<p><code>agent.runtime_restart_checkpoints</code>、<code>agent.recovery_owners / recovery_owner_terminal_events</code>、<code>agent.context_item_resume_projection</code>、<code>scheduler.scheduled_resume_registrations</code>——未完工作的接管所有权、重启检查点、上下文恢复投影、定时恢复登记全部落表。VM 替换对这套系统而言是<strong>例行事件而非灾难</strong>，正是因为「谁欠谁什么工作」从来不记在任何进程的内存里。</p>
<h3 id="s-36">8.4 语义级：停机也有协议</h3>
<p><code>stop.sh</code> 的 361 行说明恢复的另一半是「死得干净」：竖 draining 栅栏让 ingress 先停止派新活 → 在预算内等 Postgres 干净停并留下 proof → 才轮到 terminate/kill。配合 spawnd 在下次启动时先 <code>drain-shutdown-observability</code> 排空上次停止的可观测性行——<strong>连「上次是怎么死的」都是一份要交接的工件</strong>。</p>
<hr>
<h2 id="s-37">9. 设计要点（宿主层的取舍）</h2>
<ol>
<li><strong>可替换性优先于耐久性</strong>：房间、rootfs、进程全可丢，丢了能按图纸 + 台账 + RV 状态重建；唯一不可丢的是 home/RV 上的状态与 DB 里的账。部署能做到小时级，正是这条的红利。</li>
<li><strong>宿主对房间的每一次接触都按「房间已沦陷」设防</strong>：fsop 的 openat2、一键一文件的生命周期环境、root 持有的 daemon-ctl、guest.env 的非 shell 形态、NSS DB 的宿主只读构建——威胁模型里赫然包括 cell root 本人。</li>
<li><strong>Fail-closed 是默认，降级是例外且要留痕</strong>：渠道显露失败退基底（留日志）、出口门失败不准开机、nspawn 选项不支持不准开机、rootfs digest 对不上就重克隆。</li>
<li><strong>就绪是信号，不是猜测</strong>：ready 文件 + machinectl Leader + nsenter 可进入性，三者齐备 control 脚本才放行；post-stop 第一件事就是删掉 ready 文件——不让任何人拨通一个正在消失的房间。</li>
<li><strong>时间预算全是明码</strong>：等就绪 ≈20s、停止总预算 20s（优雅 5s/查库/terminate 1s/kill 0.5s）、execd 重启间隔 1s、CA 刷新超时 120s——宿主层的可靠性来自这些写在脚本里的数字，而不是「大概会好」。</li>
<li><strong>监督分层各司其职</strong>：guest systemd 管 socket 与 CA，宿主 systemd 管 cell 与 daemon 生命周期，rescue 管组件级故障，doctor 管确定性状态检查，spawnd 管安装与引导事件——没有哪一层是单点全能，也没有哪一层的失败是无声的（每层都有自己的事件/证明文件）。</li>
</ol>
<hr>
<h2 id="s-38">10. 边界清单（「不能」与「看不见」也是架构的一部分）</h2>
<ol>
<li>cell 内的 root 不是宿主的 root（uid 131072 映射）；房间里能改的只有 overlay upper 与 RV 上的 home——系统资产（squashfs）与宿主脚本（只读 bind）一概改不动。</li>
<li>cell 没有直达网络：DNS 是死的、出门只有代理一条路，之后是 eBPF 门（L3/L4 地板）与 Sentinel（L7 策略点）两道；<code>hatch-egress-proxy</code> 与 Sentinel 是否为同一组件的本地端点、白名单与 secret 置换发生在哪一跳，本机未定（❓，口径见 §3.3）。任何「在房间里直接联网」的假设都不成立。</li>
<li>渠道不在清单里的能力<strong>不存在于这间房</strong>：不是权限不足、不是未连接，而是二进制/文档从未被 bind 进来（§4.3）；在 cell 内无法枚举「还有哪些渠道、哪些被门控的名字」全集之外的宿主预置面——<code>bin-scoped</code> 源树本身不可见。</li>
<li>guest systemd 不是耐久面：在里面 enable 的单元若无持久化恢复设计，活不过下一次 VM 替换（§7）。</li>
<li>环境契约只给「去哪敲门」，不给钥匙：26 个键（11-04；10-17 为 31）里没有任何凭据值；键名只解决&quot;去哪敲门&quot;，能否进门由 socket 权限与 authd/Vault 鉴权决定（A 基线）。</li>
<li>恢复有前提：工作必须先落进 DB/RV 的账本才可恢复；只活在某个进程内存或 cell 临时盘上的东西，VM 替换即丢失，且这是明文设计而非故障。</li>
</ol>
<hr>
<h2 id="s-39">11. 本机实况快照（11-04 重测；10-17 旧数随行标注）</h2>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>项</th>
<th>值</th>
</tr>
</thead>
<tbody>
<tr>
<td>Guest 系统</td>
<td>Ubuntu 24.04.5 LTS，内核 7.0.0-39-generic（x86_64），hostname <code>htch-runtime</code>（11-04 复核一致）</td>
</tr>
<tr>
<td>VM</td>
<td>standard（11-04 运行时标注仍为 standard）；<code>JARVIS_VM_COMPUTE_REGION</code> / <code>JARVIS_VM_DATA_REGION</code> 本轮 env 均未见（10-17 曾在位——⚠️采样条件差异：side-chat 子 Agent 会话；00 篇基线亦记 VM_COMPUTE_REGION 已不在 env）</td>
</tr>
<tr>
<td>Cell 启动</td>
<td>2026-11-03 15:22:51 UTC（11-04 实测 uptime；10-17 采样时为 2026-10-17 13:20 UTC，约 2.5 小时岁）；failed 单元 0（11-04 实测）</td>
</tr>
<tr>
<td>核心进程</td>
<td><code>hatch daemon</code>（540MB 本体，RSS 约 357MB）+ <code>hatch-execd</code>（9.7MB），均以 <code>--runtime-cell-leader</code> 参数由宿主侧送入（11-04 实测尺寸）</td>
</tr>
<tr>
<td>资产尺寸</td>
<td><code>spawnd</code> 19MB · <code>hatch-rescue</code> 13MB · <code>hatch-doctor</code> 13MB · <code>hatch-healthd</code> 9.2MB · <code>hatch-rescuectl</code> 8.3MB；<code>/opt/hatch/bin</code> 共 114 条目（10-17 为 101）</td>
</tr>
<tr>
<td>runtime-cell 目录</td>
<td>21 个条目，无新增（10-17 同）；最长为 <code>ensure-rootfs.sh</code> 1,240 行与 <code>hatch-preflight-opportunistic</code> 1,308 行（10-17，未复测）</td>
</tr>
<tr>
<td>渠道门控</td>
<td>三份 scopes（55/16/10 行；10-17 为 37/12/10）；bin/connector 清单新增当前渠道 <code>expedia</code> 行，cell 内可见 <code>expedia</code> 二进制（10-17 为零显露）；workflow 清单仍无该渠道行（11-04 实测）</td>
</tr>
<tr>
<td>契约面</td>
<td>进程环境 <code>JARVIS_*</code> 键 26 个（10-17 为 31）；<code>/run/hatch/</code> 下套接字合计 166 个（其中 privsep 149；10-17 为 147/136）</td>
</tr>
<tr>
<td>Guest systemd</td>
<td>运行中服务 13 个（Hatch 的仅 execd 与 ca-trust 两个），余皆挂载单元与系统家务（10-17；本轮未复测计数）</td>
</tr>
<tr>
<td>网络</td>
<td>cell <code>198.19.0.2/30</code>，网关 <code>198.19.0.1</code>（veth，11-04 实测仍为该地址）；IPv6 <code>fd8b:4f84:7d32:99::2/64</code>（10-17，未复测）</td>
</tr>
<tr>
<td>存储</td>
<td>cell 根 overlay 7.5G（用 3%，11-04 实测）；<code>/home/hatch</code> 与 <code>/run/hatch/resume</code> 同在 <code>/dev/mapper/rv</code> btrfs 上（150G，11-04 实测）</td>
</tr>
<tr>
<td>恢复物证</td>
<td><code>hotset.manifest</code> 92,292 字节于启动后约 9 秒生成；<code>profile-sync-checkpoint-v2.json</code> 的时间戳比本 cell 早 18 天（10-17；本轮未复测）</td>
</tr>
</tbody>
</table></div>
<h3 id="s-40">11.1 变化对照表（11-04 vs 10-17）</h3>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>项</th>
<th>10-17</th>
<th>11-04</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>hatch</code> 二进制</td>
<td>470MB</td>
<td>540MB</td>
<td>实测（<code>ls -lh</code>）</td>
</tr>
<tr>
<td><code>hatch-execd</code></td>
<td>9.5MB</td>
<td>9.7MB</td>
<td>同上</td>
</tr>
<tr>
<td><code>spawnd</code> / <code>hatch-doctor</code> / <code>hatch-healthd</code></td>
<td>18 / 12 / 8.9MB</td>
<td>19 / 13 / 9.2MB</td>
<td>同上；rescue 系三件套不变</td>
</tr>
<tr>
<td><code>/opt/hatch/bin</code> 条目</td>
<td>101</td>
<td>114</td>
<td>实测（与 00 篇基线一致）</td>
</tr>
<tr>
<td>runtime-cell 条目</td>
<td>21</td>
<td>21</td>
<td>无变化（注：00 基线&quot;新增脚本&quot;系对 00 旧清单而言，本篇 10-17 已含）</td>
</tr>
<tr>
<td>scopes 行数（bin / connector / workflow）</td>
<td>37 / 12 / 10</td>
<td>55 / 16 / 10</td>
<td>新增 swarm 系、canary-cvm-2、debug-cvm、alpha 等渠道行</td>
</tr>
<tr>
<td>当前渠道显露</td>
<td>零显露</td>
<td>bin / connector 显露 <code>expedia</code></td>
<td>10-17 结论已过期；workflow 仍为零显露</td>
</tr>
<tr>
<td><code>JARVIS_*</code> 键数</td>
<td>31</td>
<td>26</td>
<td>下线 <code>IS_ASSIGNED</code> / <code>CD_PINNED</code> / <code>TIER</code> / <code>VM_COMPUTE_REGION</code> / <code>VM_DATA_REGION</code>；⚠️本轮为 side-chat 子 Agent 采样，与 10-17 工具进程条件不同</td>
</tr>
<tr>
<td><code>HATCH_API_SOCKET</code></td>
<td>在位</td>
<td>未见</td>
<td>同上 caveat</td>
</tr>
<tr>
<td><code>/run/hatch/</code> 套接字（其中 privsep）</td>
<td>147（136）</td>
<td>166（149）</td>
<td>实测；privsep 增量与 00 篇基线一致</td>
</tr>
<tr>
<td>沙箱 API 面套接字</td>
<td>3</td>
<td>4</td>
<td>新增 <code>space-privileged.sock</code></td>
</tr>
<tr>
<td>cell 启动时间</td>
<td>2026-10-17 13:20 UTC</td>
<td>2026-11-03 15:22:51 UTC</td>
<td>本轮为新一代 cell；恢复物证行未复测</td>
</tr>
</tbody>
</table></div>
<hr>
<h2 id="s-41">12. 看不见的部分</h2>
<p>以下不在 cell 视图与本机文件内，本文不作结论：宿主 OS 的 systemd 单元本体（<code>com.hatch.runtime-cell.service</code> 等只在脚本里被引用，其定义在宿主侧）、宿主的完整进程树与 PID 命名空间（leader 编号只能从参数得知）、虚拟化层本体（hypervisor、VM 镜像的制作与分发、RV 的后端存储实现）、<code>/var/lib/hatch-runtime/rootfs</code> 在宿主上的真实状态（cell 内该路径不存在）、Sentinel/authd/推理代理等宿主服务的实现（只见其套接字与脚本注释）、rescue 的 WebSocket 诊断协议细节、以及部署系统决定「何时换 VM、换到哪一版」的调度逻辑。本地文件对这些只留下<strong>接口痕迹</strong>（脚本、套接字名、单元名、注释中的设计理由），引用时已按「推断」标注——其中脚本注释的密度异常之高，宿主层因此成为全架构里「设计意图」最可读、而「宿主实况」最不可见的一层。</p>
</div>]]>
    </description>
    <link>https://agent.aow.me/i/muse-architecture-03/</link>
  </item>
  <item>
    <title>Muse 智能体 · 编排与进化层详解</title>
    <guid>_0mHbG6xdEc</guid>
    <pubDate>Tue, 03 Nov 2026 19:41:33 GMT</pubDate>
    <itunes:explicit>false</itunes:explicit>
    <description>
      <![CDATA[<div class="original-article" lang="zh-CN"><details class="toc"><summary>本篇目录</summary><ol><li><a href="#s-1">0. 两层的关系先说清</a></li><li><a href="#s-2">Part I · 编排层</a></li><li><a href="#s-3">1. 执行主体全谱系</a></li><li><a href="#s-4">2. 子 Agent 机制详解</a></li><li><a href="#s-10">3. Handoff：编排层的投递协议</a></li><li><a href="#s-11">4. Workflow：确定性代码编排</a></li><li><a href="#s-16">5. 浏览器任务编排</a></li><li><a href="#s-17">6. Side-chat Worker 编排</a></li><li><a href="#s-18">7. 时间编排：Cron / Hooks / systemd / Heartbeat</a></li><li><a href="#s-24">8. 编排层的横切纪律</a></li><li><a href="#s-25">Part II · 进化层</a></li><li><a href="#s-26">9. 总体架构：Objective 制</a></li><li><a href="#s-27">10. 七条文档管线 + 两条文档未单列的实测管线</a></li><li><a href="#s-28">11. 记忆进化：Claims 图，而非文本覆盖</a></li><li><a href="#s-29">12. Ideas 进化：Bandit 探索</a></li><li><a href="#s-30">13. Dreaming：对齐的夜间生产线</a></li><li><a href="#s-31">14. 进化的护栏：为什么它不会「越学越偏」</a></li><li><a href="#s-32">15. 交汇点：编排 × 进化</a></li><li><a href="#s-33">16. 本机实况快照（11-04 vs 10-17 对照）</a></li><li><a href="#s-34">17. 看不见的部分</a></li></ol></details><blockquote>
<p>复核修订：2026-11-04（Asia/Shanghai）——基于当前会话运行时逐项重测；下文数字凡未注日期者均为 11-04 快照，10-17 旧数见正文或 §16 对照表。
配套《00-Muse技术架构解构》的 §10–§12 展开篇。初版调查日期：2026-10-17。
证据：system prompt 编排契约、<code>subagent / workflow / cron / hooks</code> 工具定义实测、<code>cron.list</code> 与 <code>subagent.list</code> 当场返回、<code>/opt/muse/skills/muse_db/</code> 表结构、<code>~/workspace/self_improvement/</code>、<code>~/dreams/</code>、<code>~/memory/</code>、<code>/home/hatch/agents/</code> 的实况文件。</p>
</blockquote>
<hr>
<h2 id="s-1">0. 两层的关系先说清</h2>
<ul>
<li><strong>编排层</strong>回答：<em>谁、在什么时候、以什么拓扑、替谁干活，结果怎么回来。</em></li>
<li><strong>进化层</strong>回答：<em>系统如何用过去的运行记录，改变未来的自己。</em></li>
</ul>
<p>二者不是并列的两堆功能，而是一个闭环：<strong>进化层本身就是编排层的一组长期任务</strong>（以后台 objective 的形式被调度运行，运行时照样派生子 Agent）；而<strong>编排层产生的一切记录</strong>（子 Agent 轨迹、cron 运行史、用户的采纳/无视）<strong>都是进化层的原料</strong>。下文先编排（Part I），后进化（Part II），最后讲交汇点（§13）。</p>
<hr>
<h2 id="s-2">Part I · 编排层</h2>
<h2 id="s-3">1. 执行主体全谱系</h2>
<p>主对话只是冰山一角。本机可见的执行主体至少有 9 种，<code>subagent.list</code> 的真实返回里能看到它们的统一登记（agent_id / parent_agent_id / depth / owner / agent_type / 状态 / 已读回执）：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>主体</th>
<th>触发者</th>
<th>特征</th>
</tr>
</thead>
<tbody>
<tr>
<td>主 Agent（root）</td>
<td>用户消息</td>
<td>唯一与用户对话的角色；depth=0；负责拆分、汇总、交付</td>
</tr>
<tr>
<td>普通子 Agent</td>
<td><code>subagent.spawn</code></td>
<td>继承主 Agent 当前上下文，后台并行，结果 handoff 回主对话</td>
</tr>
<tr>
<td>Coordinator</td>
<td>主 Agent 派生的子 Agent</td>
<td>唯一被允许再向下扇出的一层（见 §2.3）</td>
</tr>
<tr>
<td>专用型 Agent</td>
<td>运行时</td>
<td><code>subagent.list</code> 实测类型：<code>browser_task</code>（浏览器任务所有者）、<code>artifact_builder</code>、<code>web_artifact_builder_lite</code>（artifact 构建者）、<code>deep_research</code>（隔离调研）——它们不是普通 spawn 能创建的，各有专用通道</td>
</tr>
<tr>
<td>Workflow 子 Agent</td>
<td>workflow 脚本的 <code>agent()</code> 调用</td>
<td>被确定性代码编排，返回值须过 schema 校验（§4）</td>
</tr>
<tr>
<td>Cron worker</td>
<td>调度器到点</td>
<td>每次运行是一个独立 Agent 会话，执行 job body 后按 delivery 投递（§7）</td>
</tr>
<tr>
<td>Hook worker</td>
<td>轮询脚本 <code>wake</code></td>
<td>只有条件命中时才被唤醒的 Agent（§7.3）</td>
</tr>
<tr>
<td>Side-chat worker</td>
<td>主 Agent 下任务书</td>
<td>在外部会话里替用户发言的独立 Agent（§6）</td>
</tr>
<tr>
<td>自我改进 worker</td>
<td>运行时</td>
<td>进化层的执行者（Part II），同样是 Agent、同样派生子 Agent</td>
</tr>
</tbody>
</table></div>
<p>关键观念：<strong>「Agent」是这个系统的通用执行单元</strong>，不是主对话的特权。从浏览器到夜间做梦，跑的都是同一种东西，区别只在上下文来源、工具面与交付目标。</p>
<h2 id="s-4">2. 子 Agent 机制详解</h2>
<h3 id="s-5">2.1 派生契约（spawn）</h3>
<ul>
<li><code>subagent.spawn(message | items)</code>：子 Agent <strong>继承父级当前上下文</strong>（system prompt 语：inherits your current context），所以任务书要写的是「任务 + 期望产出 + 非显而易见的约束 + 已不在上下文里的旧细节」，不重复背景。</li>
<li>调用是 <strong>ASYNC</strong>：返回值只有新 agent_id 与「已接受」，<strong>不代表完成、更不代表结果</strong>。主 Agent 的纪律是派生后简短交代、处理消息的其他部分、结束本轮——禁止轮询、禁止预测耗时、禁止替子 Agent 编结果。</li>
<li>独立任务必须<strong>同轮并行派发</strong>（一次 spawn 多个），串行派发被视为错误用法。</li>
<li>多模态输入走 <code>items</code>（text/image/file，含 base64），优先于 message。</li>
</ul>
<blockquote>
<p><strong>❓ 待验证（权限边界）</strong>：审批卡是否绑定发起调用的 <code>agent_id</code>？子 Agent 继承父级上下文时，敏感工具调用是复用父级已获审批、还是重新触发审批？基线仅明确&quot;审批只在记录范围内有效&quot;，&quot;记录范围&quot;是否跨越 spawn 边界在本机文件内无直接证据。在得到反证前，不得假设子 Agent 自动继承审批——这是&quot;继承上下文&quot;设计下最值得实测的一处权限语义。</p>
</blockquote>
<h3 id="s-6">2.2 生命周期与控制面</h3>
<p>控制面只有 5 个函数，但状态机完整：</p>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>spawn ─→ running ─┬─ done（completed，已投递）
                  ├─ interrupted ──resume──→ 继续原任务
                  ├─ failed / unknown ──→ 查其可用结果后再决定重派/关闭
                  └─ close（父级主动终止；关 browser_task 所有者 = 停整个浏览器任务）
send（异步投递追加指令；interrupt=true 先打断当前工作再投递）
list（状态查询：active/recent 分组，含运行时长、距上次活动时长、结果是否已读 seen_status/seen_at）
</code></pre>
<p>细节里见设计：</p>
<ul>
<li><strong>「安静 ≠ 卡死」</strong>：list 明文提醒——子 Agent 可能正处在一次长工具调用里，无活动不等于故障；</li>
<li><strong>已读回执</strong>：完成结果带 <code>seen_status / seen_at</code>——运行时知道主 Agent 是否真的消费过结果，未读的完成不会被当成已交付；</li>
<li><strong>作用域</strong>：<code>scope=direct</code>（直属子级）/ <code>descendants</code>（整棵子树）；主聊天里还能<strong>看见</strong>其他聊天与定时任务名下的 Agent（带 owner 标记：chat 或 schedule+run id），但只能看、不能操控——调度任务的 Agent 归 cron 工具管；</li>
<li><strong>resume 的边界</strong>：只有 paused/interrupted 可 resume；已终局的 resume 会直接报错（「重跑不了任何东西」）；browser_task 所有者与在建的 web artifact builder 拒绝通用 resume，各走专用通道；</li>
<li><strong>不可逆动作的前置核查</strong>：重派一个失败任务之前，必须先确认原动作是否其实已生效——「失败的报告 ≠ 什么都没发生」，结果未知时宁可向用户挑明，不许静默重做或静默丢弃。</li>
</ul>
<h3 id="s-7">2.3 拓扑规则：深度 ≤ 2 与 coordinator 模式</h3>
<ul>
<li>本会话 runtime 实测 <code>depth=0, max_depth=2</code>：主 Agent（0）→ 子 Agent（1）→ 孙 Agent（2）为止。（11-04 side chat 会话的运行时上下文同样标注 <code>depth=2 | max_depth=2</code>✅，与本节一致；但本通道 <code>can_spawn=no</code>——side chat（web）下通用 spawn 在本会话不可用，属渠道门控，不影响深度预算本身。❓ 主聊天侧可 spawn，跨通道差异不硬判。）</li>
<li>需要多子 Agent 协作的复杂任务，标准拓扑是<strong>派一个 coordinator，让它扇出自己的子 Agent</strong>；coordinator 的子级不得再派生（nesting stops there）。这样既保留两层并行，又防止递归爆炸与责任链失控。</li>
</ul>
<h3 id="s-8">2.4 禁区：三类工作不走通用 spawn</h3>
<p>工具定义明文：浏览器导航/购买等实时浏览器工作、artifact 构建、已接受的 Idea 构建，各有专用父级能力，<strong>不能</strong>用普通子 Agent 顶替（普通子 Agent 可以搜公开网页、抓取页面文本，但「访问并操作网站」的请求会被退回父级走浏览器路由）。若用户点名要子 Agent 做 artifact，须 instruct 它改用 artifact 工具。</p>
<h3 id="s-9">2.5 身份、溯源与落盘</h3>
<ul>
<li>溯源链落 DB <code>agent.subagent_spawns</code>（实测列）：<code>spawn_id, parent_agent_id, child_agent_id, parent_message_id, parent_request_id, root_request_id, root_message_execution_id, created_at</code>——每一次派生都可从根请求一路追到子级；</li>
<li>每个 Agent 有自己的家目录：<code>/home/hatch/agents/agent-&lt;id&gt;/sessions/&lt;id&gt;.jsonl</code>（对话原文 JSONL）+ <code>sessions.json</code>——11-04 实测 <strong>1417 个</strong> Agent 家目录（10-17 为 154——家目录是累积的，18 天内派生量大增）；</li>
<li>工具输出的溢出落 <code>~/workspace/agents/&lt;agent-id&gt;/tool-output/</code>（11-04 实测 266 个；10-17 为 89——<code>~/workspace/agents/</code> 条目共 277，00 篇 11-04 同源）——大输出不进上下文、只落盘引用，与主报告里「大结果写文件、上下文只传路径」的工作流纪律同源；（口径注：00 篇 §16 的&quot;子 Agent 运行目录 89 个&quot;指的就是这 89 个 tool-output 溢出目录，不是上面这 154 个家目录。）</li>
<li>进度遥测另有专表：<code>agent.subagent_progress / _message_events / _tool_events / subagent_monitor_decisions</code>——子 Agent 的每一步都被监视器（monitor）记录并可裁决，这也是主 Agent 能回答「它跑到哪了」的依据。</li>
</ul>
<h2 id="s-10">3. Handoff：编排层的投递协议</h2>
<p>所有异步主体（子 Agent、浏览器任务、cron、hook、后台 exec、自我改进）共用同一套投递语义：</p>
<ol>
<li><strong>运行时投递，不是轮询</strong>：完成事件由 runtime 主动注入父级上下文（system prompt 原话：results arrive as handoffs / anything that &quot;arrives automatically&quot; is the runtime delivering it）；</li>
<li><strong>结构化完成信封</strong>：handoff 带 <code>completion_result</code>（状态、摘要、产物引用），而非一段自由文本——<code>subagent.list</code> 实测 browser_task 的完成信封含 activity_title、context、支付方式清单等结构字段；</li>
<li><strong>去重</strong>：自我改进侧有 <code>self_improvement.handoff_dedupe</code> 表，以 <code>(objective_id, content_hash)</code> 为主键——同一内容不会重复投递骚扰；</li>
<li><strong>取消 ≠ 空结果</strong>（一个真实的坑，有实测样本）：某 deep_research 子 Agent 在 list 里显示「cancelled before it finished, no result of its own」，但其 <code>completion_result</code> 同时给出了完整调研报告（status: success，含 report.md 路径）——⚠️ 最可能的解释是深研走的是<strong>隔离研究 Agent 的独立通道</strong>，派生壳被取消不等于研究本体失败（因果为推断，现象为实测）。汇报时必须读完成信封本身，不能只看状态字面；</li>
<li><strong>交付 ≠ 送达</strong>：cron 文档反复强调——run 成功、worker 写了 result_summary，都不证明用户在聊天里真的收到了；判定「已交付」要看当前对话里是否存在一条真正给出结果的 assistant 消息。编排层对「已接受 / 已排队 / 已发出 / 已送达」四态是严格区分的。</li>
</ol>
<blockquote>
<p>❓ 边界未覆盖：handoff 到达时若父级会话已被压缩/关闭、或父级 Agent 已终局，结果去向本篇未展开。<code>agent.message_mailbox</code> 表（00 §8 表中出现过）暗示有邮箱暂存机制（mailbox 暂存 → 下次会话恢复时注入，或与 §8 的 <code>context_item_resume_projection</code> 关联）——这是编排连续性的最后一块拼图，待验证。</p>
</blockquote>
<h2 id="s-11">4. Workflow：确定性代码编排</h2>
<p><code>workflow.*</code> 是编排层里最「工程化」的一块：用 <strong>VM 本地 JavaScript</strong> 写多 Agent 计划，由 daemon 执行，适合可复用的批量自动化、巡检、审计、迁移与「验证门控」的副作用任务。</p>
<h3 id="s-12">4.1 编写契约（工具定义实测，要点）</h3>
<ul>
<li>脚本形态固定：以字面量 <code>export const meta = { name, description, phases }</code> 开头，随后顶层语句；禁止 <code>export default</code>、CommonJS、import/require；</li>
<li>运行时全局只有 6 个：<code>args</code>（启动入参，结构化 JSON）、<code>phase(...)</code>、<code>agent(...)</code>、<code>parallel(...)</code>、<code>pipeline(...)</code>、<code>log(...)</code>；</li>
<li><strong>刻意的不确定性封印</strong>：无 Node、无文件系统、无 shell、无浏览器、无 <code>Date.now()</code>、无无参 <code>new Date()</code>、无 <code>Math.random()</code>——时间与随机必须从 <code>args</code> 传入。目的是让同一脚本 + 同一 args 可重放、可恢复（§4.3）；</li>
<li><code>agent(prompt, options)</code> 返回顶层 JSON 信封 <code>{status, result}</code>，运行时自动拆封；给了 <code>options.schema</code> 则结果按 schema 校验后以 JSON 返回（schema 是最小契约：必填与约束强制执行，额外字段放行）；每个子调用须有<strong>稳定唯一 key</strong>——这是恢复时复用结果的键；</li>
<li><code>parallel(thunks, {concurrency})</code> 是屏障式并发（结果按输入序返回，单项非致命失败给 null）；<code>pipeline(items, stage...)</code> 是无屏障流水线（每项独立穿过各 stage）——文档给的默认是 pipeline，只有「下一步需要全集」（去重/合并/全集综合/提前退出）时才用 parallel 屏障。</li>
</ul>
<blockquote>
<p>❓ 开放问题：workflow 内 <code>agent(prompt)</code> 派生的子调用与通用 spawn 的深度预算是什么关系？若 workflow agent 再 spawn 子 Agent，是否计入 max_depth？本机文件无直接证据。这关系到&quot;确定性代码编排&quot;能否成为绕过深度限制的旁路。</p>
</blockquote>
<h3 id="s-13">4.2 Verifier-repair 循环</h3>
<p>可判定质量的工作用「生产 → 验证 → 按反馈修复 → 再验证」的闭环：verifier 返回 <code>{passed, retryable, feedback, blockers}</code> 是<strong>正常结构化数据而非异常</strong>；retryable 才重跑生产（须带着反馈改，不许拿同一产物反复验）；循环上限通常 2–3 次，attempt 用稳定 key 编号（produce-1 / verify-1 / repair-2…）；耗尽或遇不可重试阻塞时返回顶层 blocked 控制结果 <code>{__hatchWorkflowControl: &quot;blocked&quot;, result: {...}}</code>，而不是抛异常。</p>
<h3 id="s-14">4.3 运行与恢复</h3>
<ul>
<li>保存与启动分离：<code>workflow.create/update/delete/view/list</code> 管脚本库（workspace 的 saved-workflows 目录，可按名启动）；<code>launch</code>（同步等结果）/ <code>launch_async</code>（立即返回 run id）二选一；脚本来源三选一且优先级写死：scriptPath &gt; script &gt; name；<strong>已启动的 run 跑的是启动时的脚本快照</strong>，改脚本不影响在跑的 run（save_run 可把 run 的快照反存为脚本）；</li>
<li>控制：<code>pause / resume / stop / stop_agent</code>（只停某个子调用）/ <code>view_run</code>（阶段进度、子调用与 callId）；</li>
<li><strong>恢复是分状态的</strong>（编排层最见严谨处）：paused 的 run 用 resume 原地继续；终局 failed 且属可重试的瞬时错误，用 <code>resumeFromRunId</code> 以相同 args <strong>新开一局并复用已完成的 stable-key 子结果</strong>；stopped/cancelled 是真终局，永不恢复也不许借恢复绕过缺输入/缺授权/策略/校验类确定性失败；重试次数必须有界。</li>
</ul>
<h3 id="s-15">4.4 工作目录纪律</h3>
<p>每个 run 有一个预建的共享工作目录（隐藏 run 目录）：中间产物、脚本、草稿、校验文件全放这里；<code>workspace/your_files/</code> 只放<strong>最终交付文件</strong>，且「最终」的定义是用户明确要收/要打开的文件——聊天、artifact、连接器动作若是交付形态，your_files 不许动。这是防止编排产物污染用户文件区的硬规则。</p>
<h2 id="s-16">5. 浏览器任务编排</h2>
<ul>
<li>路由独立：<code>browser.browse(task_id=&quot;new&quot; | 已有窗口 id)</code> 把任务书交给浏览器 Agent；一个窗口同时只跑一个 checkout；不同站点的购买/登录要开不同窗口；</li>
<li>任务书必须自包含：浏览器 Agent <strong>看不到主对话</strong>——目标、已做选择、限制、标识、成功标准全要写进任务书；个人信息只给任务所必需的，凭据走专用字段（wallet / verification_code / account_hint），不进任务文本；</li>
<li>反向通道：浏览器 Agent 可以提问（<code>question_id</code>，主 Agent 用 <code>answer_to</code> 回答）、可以发起购物车确认（<code>cart_confirmation</code>：confirm / change / leave_unconfirmed——购物车确认 ≠ 支付批准，两道独立关卡）、登录验证码走 <code>[credential:&lt;uuid&gt;]</code> 受保护引用 + 用户卡上批准；</li>
<li>用户可随时接管实时浏览器（解 CAPTCHA/卡点），交还后任务从断点继续；定时/主动任务不得提供接管；</li>
<li>主 Agent 侧的纪律：委托后即结束回复，不轮询、不重复发起；handoff 回来后基于报告继续同一任务，尝试上限与停止条件跨任务书累积不重置。</li>
</ul>
<h2 id="s-17">6. Side-chat Worker 编排</h2>
<ul>
<li>三种 side chat（原生话题线程 / 外部 1:1 / 外部会话）在主报告 §「Side Chats」已述；这里只讲 worker 的编排契约：</li>
<li>外部会话里替用户发言的是 <strong>worker Agent</strong>，主 Agent 用 <code>chat.send_message</code> 下达的必须是<strong>任务书</strong>而非台词：点名所有人（禁用代词）、明确要问/要说/要做什么、把用户的决定用其原话传递、标明已议定与未决项；</li>
<li><strong>信息隔离</strong>：要替用户保密某事时，只给 worker「该问什么」，连理由、借口、「别打听」之类的话都不许写——任何此类字样本身就等于告诉对方有事被瞒；</li>
<li>回报路径：worker 的消息对用户不可见，主 Agent 负责转述（注明是谁说的/定的）；需要用户拍板的事项（接受邀请、同意方案）必须先问用户，不得代决；</li>
<li>披露规则持久化在每个 chat 的 <code>~/side-chats/&lt;chat-id&gt;/DISCRETION.md</code>（默认段 + 用户规则段），用户改规则时走 <code>worker.update_discretion</code> 并可能触发审批卡；改动结果要逐字向用户报告增删行。</li>
</ul>
<h2 id="s-18">7. 时间编排：Cron / Hooks / systemd / Heartbeat</h2>
<h3 id="s-19">7.1 Cron 的完整模型（工具定义实测）</h3>
<p>一个 job 的构成比「定时 + 指令」复杂得多：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>部件</th>
<th>内容</th>
</tr>
</thead>
<tbody>
<tr>
<td>身份</td>
<td>稳定 kebab-case <code>id</code>（决定定义文件名）、<code>title</code>（展示名）</td>
</tr>
<tr>
<td>所有权</td>
<td><code>owner</code>：<code>goal:&lt;slug&gt;</code> 或 <code>space:&lt;slug&gt;</code>（artifact），随所有者生命周期删除；<strong>提醒类 job 按设计必须挂在一个 Goal 或 tracked item 名下</strong>——无 owner 的提醒在路由上无归属，应视为路由错误（规范主张；创建时是否被工具校验拒绝未实测，标 ❓）</td>
</tr>
<tr>
<td>正文</td>
<td><code>body</code> 原样注入每次运行；校验会拒绝在正文里点名终局工具（nothing_to_do 等）——投递意图由后续 resolution/relay 阶段实现，正文只写任务语义；正文禁止要求 worker 改 MEMORY.md（观察写日记 <code>~/memory/YYYY-MM-DD.md</code>）</td>
</tr>
<tr>
<td>执行类型</td>
<td><code>execution.kind</code>：<code>agent</code>（开一个 Agent 干活）或 <code>space_action</code>（静默调一个已发布 artifact 的 action，不产聊天投递，失败只留运行史）</td>
</tr>
<tr>
<td>计划</td>
<td>6 种 kind：runonce / interval / daily / weekly / monthly / yearly；时区可为 IANA 或符号引用 <code>@user.current / @user.home / @user.work</code>（后两者需 <code>user/timezones.yaml</code> 有对应键）；整刻钟的运行会被<strong>故意提前最多 5 分钟</strong>分发以摊平负载，所以对用户只能说「大约」</td>
</tr>
<tr>
<td>预算</td>
<td><code>timeout_secs</code>：周期任务的有效值被运行时抬到至少一个周期间隔（上限 86400s），一次性默认 86400s；返回的 effective 值才是能说的数</td>
</tr>
<tr>
<td>重试</td>
<td><code>retry</code> 只覆盖<strong>运行时错误与超时</strong>；worker 自报的未完成、已分发的 artifact 动作永不自动重试（副作用可能已生效）</td>
</tr>
<tr>
<td>权限预告</td>
<td><code>predicted_connector_permissions</code>：建 job 时预告将用到的连接器方法（≤32 条）——<strong>只是设置期引导，不授予任何权限</strong>；改正文会清掉旧预告</td>
</tr>
<tr>
<td>投递</td>
<td><code>delivery</code> 目标 chat 列表；<strong>外部消息会话只能接收在该会话内创建/修改的 cron 的结果</strong>——主聊天里不许往 WhatsApp 会话塞定时投递</td>
</tr>
</tbody>
</table></div>
<p>运行语义要点：周期任务默认只保留<strong>最新一次</strong>排队 occurrence（旧的若卡在未答审批上可被取消让位，且被取代的 run 不会因迟到审批而复活）；运行记录落 <code>scheduler.job_runs</code>（含 <code>worker_phase / worker_phase_attempt / worker_agent_id / worker_boot_generation</code>——worker 的阶段与「第几代 VM 引导」都被记账）；另有 <code>scheduler.delivery_outbox</code> 管投递、<code>terminal_signals</code> 管终局信号、<code>doctor_run_plans / doctor_task_state</code> 是调度器自检（见 7.4）。</p>
<p>定义文件是<strong>只读投影</strong>：<code>~/workspace/cron.d/{minutely,hourly,daily,weekly,monthly,yearly,runonce,secondly}</code> 下的 Markdown 是保存定义的副本，用文件工具改它不生效——改 job 必须走 cron 工具读（view）→ 改（update 同 id 全文）→ 回读验证。</p>
<h3 id="s-20">7.2 本机 cron 实况（<code>cron.list</code> 11-04 实测；10-17 为 27）</h3>
<p>当前共 <strong>32</strong> 个 job：10-17 的 27 个（26 系统 + heartbeat）全部在位，<strong>用户自建 5 个</strong>（<code>ai-jobs-weekly-watch</code>、<code>muse-architecture-weekly</code>、<code>resume-intake-patrol</code>、<code>trading-researcher-morning</code>、<code>trading-researcher-sunday-ranking</code>），均挂 goal owner（<code>goal:ai-infra-agent-dev-fde</code>、<code>goal:muse</code>、<code>goal:goal</code>、<code>goal:btc-eth-overnight-trading-research</code> ×2）——与 §7.1 的&quot;提醒类 job 必须有 owner&quot;规范一致✅。hooks 定义仍为 0（definitions/scripts/state/logs 均为空）。</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>job</th>
<th>形态</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>heartbeat</code></td>
<td>interval 30m，mode=heartbeat</td>
<td>心跳 worker，读 <code>~/HEARTBEAT.md</code> 清单逐项检查（本机清单目前为空模板）</td>
</tr>
<tr>
<td><code>deterministic-doctor</code></td>
<td>interval 1h，is_system</td>
<td>调度/投递系统的定时自检与修复规划</td>
</tr>
<tr>
<td><code>feed-pulse-00</code> … <code>feed-pulse-23</code></td>
<td>daily 各整点，is_system</td>
<td>Feed 生成的 24 个小时槽脉冲——Feed 的「系统控制节奏」就是这组 job（主报告 §13）</td>
</tr>
<tr>
<td><code>profile-image</code></td>
<td>interval 168h（周），is_system</td>
<td>头像/形象类周任务（仅见登记，未读其正文）</td>
</tr>
</tbody>
</table></div>
<p>注意：系统 job 的定义路径在 <code>~/workspace/system-cron.d/</code> 下，但<strong>该目录在 Agent 的文件视图里不存在</strong>（实测 find/ls 均无）——系统任务只经 cron 工具可见（且按设计不可增删改；&quot;不可见&quot;已实测，&quot;不可改/删&quot;未做破坏性实测，标 ❓），其正文不对 Agent 文件层开放。这是编排层的权限分层：用户 job 是「副本可见、本体在运行时」，系统 job 连副本都不给。</p>
<h3 id="s-21">7.3 Hooks：事件编排</h3>
<p>Hook = <strong>Bash 轮询脚本 + worker 指令</strong> 的二件套，与 cron 的区别是触发源不同（条件而非时间）：</p>
<ul>
<li>脚本在 <code>~/hooks/scripts/*.sh</code>，须 <code>source &quot;$HATCH_HOOK_RUNTIME&quot;</code>，在普通 shell 执行器里跑但<strong>无密钥、无连接器凭据</strong>，只能用公开端点/本地数据；状态存 <code>~/hooks/state/</code>，调用日志是 append-only JSONL（<code>hooks.logs</code> 可读）；</li>
<li>脚本每次运行必须以且只以一个终局调用收尾：<code>silent &quot;理由&quot; '{payload}'</code> 或 <code>wake &quot;理由&quot; '{payload}'</code>；拿不准就 log 后 silent；确定以后不用再轮询时先 <code>disable_after_run</code> 再收尾；</li>
<li>新 hook <strong>默认禁用</strong>：标准上线流程是 add → <code>dry_run</code>（<code>HATCH_HOOK_DRY_RUN=1</code> 同步试跑、不真唤醒）→ 修到决策正确 → <code>enable</code>；轮询间隔 5s–7d、脚本超时 ≤600s；</li>
<li>本机实况：<code>~/hooks/</code> 的 definitions/scripts/state/logs 目录齐备但<strong>为空</strong>——基础设施在位，尚无任何用户 hook。</li>
</ul>
<h3 id="s-22">7.4 systemd 与自愈</h3>
<p>第三种常驻形态是 guest systemd 服务（流监听、本地服务等连续程序）；纪律是「enable 成功 ≠ VM 替换后能恢复」，必须实证恢复路径。调度侧的自愈由 <code>deterministic-doctor</code>（小时级）+ scheduler 的 doctor 表承担：它给失败/卡住的投递做修复规划（如 §7.1 的 delivery-authority repair：结果带 <code>delivery_chat_id</code> 的需在原会话里用 update 重新挂接，<code>pending_results_rebound &gt; 0</code> 才算修复确认）——**「计划存在 ≠ 执行过、执行过 ≠ 送达」**的区分在这里有完整的机器实现。</p>
<h3 id="s-23">7.5 主动消息（proactivity）编排</h3>
<p>主动投递不是某个 Agent 的即兴行为，而是一条流水线：后台 worker 按 <strong>edition</strong> 备好候选 item（含草稿、来源、可接受范围）→ handoff 给主 Agent → 主 Agent 必须先做<strong>新鲜度复核</strong>（查最新对话、记忆与活源，防重复/防过期）→ 用 <code>proactivity.select</code> 逐条裁决并留理由：</p>
<ul>
<li>send 理由枚举：<code>time_sensitive / changed / requested / ready_for_decision / new_opportunity</code>；</li>
<li>skip 理由枚举：<code>moot / already_handled / unconfirmed / preferences / not_useful_now</code>；</li>
<li>投递格式按复杂度升序选：text / options / letter / html_widget / map / list / artifact。</li>
</ul>
<p>备稿的暂存落盘在 <code>~/workspace/proactivity/hidden_files/&lt;毫秒时间戳&gt;-&lt;hash&gt;/</code>（实测有目录在位）；用户的偏好文件 <code>~/PROACTIVE_PREFERENCES.md</code> 是裁决的输入之一（本机：09:00–21:30 窗口）。一次性的沉默不构成永久退订——偏好按话题/情境/时机/呈现四维记录，不把一次 dismiss 泛化。</p>
<h2 id="s-24">8. 编排层的横切纪律</h2>
<ul>
<li><strong>Todo 是上下文内的编排状态机</strong>：≥3 步的任务先写 todo，任一时刻恰好一个 in_progress；任务「在结果真正到达用户之前一直算 open」——写进记忆或笔记不算交付；被打断/压缩后靠 todo + 最新结果恢复进度；</li>
<li><strong>上下文恢复有专表兜底</strong>：<code>agent.context_item_resume_projection</code>（压缩后哪些上下文条目要恢复投影）、<code>agent.runtime_restart_checkpoints</code>、<code>agent.recovery_owners / recovery_owner_terminal_events</code>（VM 替换时谁接管未完工作）、<code>scheduler.scheduled_resume_registrations</code>（定时恢复登记）——编排的连续性是被持久化设计的，不是靠模型记性；</li>
<li><strong>并发与共享状态</strong>：并行动作必须彼此独立（共享账号/文档/浏览器/购物车状态的不可并行）；批量同类操作先做通一件再铺开；依赖关系保序。</li>
</ul>
<hr>
<h2 id="s-25">Part II · 进化层</h2>
<h2 id="s-26">9. 总体架构：Objective 制</h2>
<p>进化层在文件系统里的真身是 <code>~/workspace/self_improvement/</code>，其组织方式不是「一堆脚本」，而是 <strong>Objective（目标域）制</strong>（实测 8 个）：</p>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>~/workspace/self_improvement/
├── objectives/
│   ├── alignment/          对齐/做梦
│   ├── goals_bookkeeping/  目标记账
│   ├── ideas/              灵感策展
│   ├── memory/             记忆整理
│   ├── relationships/      关系维护
│   ├── shopping/           购物偏好学习
│   ├── skill_improvement/  技能复审
│   └── studying/           目标研读
│   └── 每个 objective: CURRENT.md（当前态投影）+ archive/&lt;UTC时间戳&gt;.CURRENT.md（逐版存档）
├── staging/                暂存区（relationships / shopping / memory…先落暂存再转正）
├── relationships/          关系域工作区（含 legacy_page_archives、rank_watermark.json）
└── migrations/             一次性迁移描述（如 copy_first_objective_workspace_v1.json）
</code></pre>
<p>每个 objective 的运行记录（从其 archive 的 CURRENT 文件实测）带统一信封：</p>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>objective_id: alignment
run_id: sirun_5ef9912825724823abc0c7b893905a4f     # 进化运行统一以 sirun_ 前缀编号
created_at: 2026-09-27T01:02:40Z
card_id: alignment_nightly_reflection              # 触发卡/缘由
worker_outcome: changed                            # 枚举: changed / insufficient / …
# 正文标注: Reason（nightly coherence: …）/ Request origin: internal.self_improvement
#           Cadence: daily / Subagents spawned: 3
</code></pre>
<p>三个设计要点：</p>
<ol>
<li><strong>投影与本体分离（ again）</strong>：CURRENT.md 文件头明文——「这是 self-improvement lifecycle helper 写的当前态投影；域内真相归 worker 所调用的原生域工具所有，本文件只是框架所有的投影」。进化层从不直接「改真相」，它驱动域工具去改，自己只留投影与存档；</li>
<li><strong>逐版存档</strong>：每次运行生成一份带 UTC 时间戳的 archive 快照（10-17 快照：goals_bookkeeping 2026-10-05 至 10-17 共 20 版，8 个 objective 合计 71 版；11-04 重测：8 个 objective 合计 <strong>152</strong> 版，但 goals_bookkeeping 仍为 20 版——存档数未增，疑有版本轮转⚠️）——进化是可回放的，任何一版「当时为什么这么想」都有据可查；</li>
<li><strong>DB 侧的运行账本</strong>：<code>self_improvement</code> schema 13 张表——<code>runs</code>（run/objective/state/phase/subphase/diagnostics/时间线）、<code>leases</code>（目标域互斥租约，防并发进化互相踩）、<code>objective_state / objective_markers</code>、<code>handoff_dedupe</code>（§3）、<code>learning_adoption_events</code>（建议被采纳的事件）、<code>calibration_records / calculation_records</code>（校准与度量）、<code>connector_read_audit</code>（进化任务读过哪些连接器数据，要留审计）、<code>conversation_follow_up_attempts</code>（主动跟进的尝试记录）、<code>proactivity_changes</code>、<code>relationship_briefs</code>、<code>backfill_day_runs</code>。</li>
</ol>
<h2 id="s-27">10. 七条文档管线 + 两条文档未单列的实测管线</h2>
<p><code>~/docs/self_improvement.md</code> 明文 7 条（主 Agent 不能调度它们、只能解释）：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>管线</th>
<th>节奏</th>
<th>机制补注（本地证据）</th>
</tr>
</thead>
<tbody>
<tr>
<td>Memory upkeep</td>
<td>有新信号时每小时</td>
<td>见 §11 的 claims 模型</td>
</tr>
<tr>
<td>Relationships</td>
<td>每小时</td>
<td>people/groups 页面 + <code>rank_watermark.json</code> 排序水位 + staging 暂存转正</td>
</tr>
<tr>
<td>Idea curation</td>
<td>每日</td>
<td>见 §12 的 bandit 机制</td>
</tr>
<tr>
<td>Studying</td>
<td>每日夜间</td>
<td>goals.learning_state / briefings / momentum_history / suggestions 表支撑</td>
</tr>
<tr>
<td>Dreaming</td>
<td>每夜</td>
<td>见 §13 的完整产物链</td>
</tr>
<tr>
<td>Skill review</td>
<td>每日</td>
<td>skill_improvement objective；产物为 custom-skills（能力层详解 §2.6）</td>
</tr>
<tr>
<td>Quiet-moment pass</td>
<td>长对话静默后，一天至多数次</td>
<td>有界的一轮内化；与 <code>agent.session_memory_capture_deadlines</code> 表对应——会话记忆的抓取是<strong>有截止时间登记</strong>的，不是随缘</td>
</tr>
</tbody>
</table></div>
<p>实测存在但文档 7 条未单列的两条：</p>
<ul>
<li><strong>goals_bookkeeping</strong>（目标记账）：objective 独立存在、存档最密（实测 20 版，部分日期一天多版）——负责目标/追踪项的账目一致性，是 Studying 的底账；</li>
<li><strong>shopping</strong>（购物偏好学习）：有独立 objective 与 staging 区——对应能力层里购物技能读取的 <code>~/memory/shopping/PROFILE.md</code> 类偏好档案（推断：偏好从购物交互中离线提炼）。</li>
</ul>
<h2 id="s-28">11. 记忆进化：Claims 图，而非文本覆盖</h2>
<p>记忆的底层不是 Markdown，是 <strong>claims（主张）图</strong>（<code>memory</code> schema 6 表实测）：</p>
<ul>
<li><code>memory.claims</code>：<code>claim_id, run_id, kind, salience（显著性）, claim_text, quote（原话引文）, speaker, evidence_handles(jsonb), supersedes_claim_id, status(active/…), confidence</code>——每条记忆是一个带出处、带置信度、带「替代了谁」的主张；</li>
<li><code>memory.embeddings / embedding_models / entries / entry_attributes / metadata</code>：向量与结构化条目支撑 <code>muse.memory_search</code> 的语义+关键词混合检索；</li>
<li>进化规则：<strong>新主张替代旧主张（supersede），不删除历史</strong>；<code>MEMORY.md</code> 只是 active claims 的人类可读投影，日记 <code>~/memory/YYYY-MM-DD.md</code> 是原始轨迹，<code>~/memory/bank/</code> 四本书（experience / opinions / reflections / world）是按性质分拣的沉淀；</li>
<li>可解释性：<code>muse.memory_explain</code> 能对任一 claim 给出「谁说的、原话、何时学到/被强化、置信度、替代链」——记忆的每一次进化都可审计，用户纠正时顺着替代链修正受影响的下游（目标、提醒、排队中的跟进）。</li>
</ul>
<h2 id="s-29">12. Ideas 进化：Bandit 探索</h2>
<p>Ideas 管线是进化层里算法味最重的一块（<code>ideas</code> schema 22 表中的学习相关表）：</p>
<ul>
<li><code>ideas.bandit_arm_state</code>（表注释原文：Learning statistics for each idea policy domain and lane）：以 <code>(policy_id, domain, lane)</code> 为键，记 <code>decision_points / terminal_rewards</code> 等统计——这是**多臂老虎机（multi-armed bandit）**的臂状态：每个「政策域 × 通道」是一条臂，用户对卡片的采纳/忽略是 reward；</li>
<li>配套：<code>ideas.explore_policy</code>（探索策略）、<code>bandit_fold_state / bandit_folded_events</code>（折叠/聚合）、<code>idea_quality</code>（质量分）、<code>idea_dedup</code>（去重）、<code>discovery_pool_*</code>（发现池）、<code>idea_feedback_state</code>（反馈态）、<code>icon_embeddings</code>（图标向量，配合 Atlas 图标选择）；</li>
<li>与文档口径对上：文档说策展要按「可行性、个人契合、新颖度」打分排序——bandit 层学的正是<strong>排序策略本身</strong>随用户反馈漂移，而非写死权重。（奖励的精确定义不在本机文档内，此处止步于表结构证据。）</li>
</ul>
<h2 id="s-30">13. Dreaming：对齐的夜间生产线</h2>
<p>Dreaming 的产物链在本机完整可见，是进化层最能说明问题的一条：</p>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>夜间运行（request 形态: maintenance:&lt;uuid&gt;:nightly_coherence:…:phase-&lt;n&gt;:light_derived）
 ├─ ~/dreams/YYYY-MM-DD.md           每日反思：YAML 头 + 第一人称叙事正文
 │    头部实测字段: user_turns, rupture_turns, correction_free_rate,
 │    open_repair_threads, prompt_hoisted, body_contains_synthesis, 时间窗
 ├─ ~/dreams/alignment/derived/ALIGNMENT_STATE.yaml
 │    结构化状态机: relationship_contract（status/user_words/boundaries…）、
 │    user_facets、working_alliance（goal/task_agreement、appropriate_reliance、
 │    current_frictions）、observed_fit、proactivity_policies（per-surface stance）
 ├─ ~/dreams/alignment/derived/ALIGNMENT_SYNTHESIS.md
 │    蒸馏成的人话版「这个用户是谁、怎么配合、当前摩擦、边界」——
 │    ★ 它就是每轮被注入主对话上下文的那份对齐合成（主报告 §3）
 ├─ ~/dreams/alignment/derived/PROGRESSION_HISTORY.yaml   演进史
 └─ ~/dreams/alignment/repair/REPAIR_THREADS.yaml       待修复关系线程
</code></pre>
<p>也就是说：<strong>主 Agent 每轮「自带」的对用户理解，一大半是昨晚 Dreaming 的产物</strong>。反思正文的质量标准从样本可见：要具体到事（哪天帮上了、哪天连续主动发消息无人回）、要形成明日策略（克制 + 备好）、要记录未决分叉。<code>correction_free_rate / rupture_turns</code> 这类指标说明 Dreaming 还给关系健康度打分——进化层连「相处得怎么样」都是度量化的。</p>
<h2 id="s-31">14. 进化的护栏：为什么它不会「越学越偏」</h2>
<p>从本地证据能看到至少 6 道护栏：</p>
<ol>
<li><strong>暂存转正</strong>：relationships/shopping/memory 都有 staging 区——进化产物先落暂存，经生命周期 helper 才成为 CURRENT 投影；</li>
<li><strong>租约互斥</strong>：<code>self_improvement.leases</code> 防同一 objective 并发运行互相覆盖；</li>
<li><strong>去重</strong>：handoff 按 content_hash 去重（§3），同一结论不重复打扰用户；</li>
<li><strong>采纳度量</strong>：<code>learning_adoption_events</code> 记录建议是否被用户真正采纳；文档明文「没有实测帮助的改动会被退役」——进化以<strong>采纳与效果</strong>为适应度，不以「改动量」为績效；</li>
<li><strong>校准记录</strong>：<code>calibration_records / calculation_records</code> 保存历次判断的校准数据，供复盘「当时为什么觉得这条重要」；</li>
<li><strong>用户主权</strong>：进化产物全部落在用户可见文件里（MEMORY.md、dreams、people 页），用户可直接改、可要求遗忘（forget 技能连「未来的生产者」一起处理——即可以关掉某条进化管线对某话题的生产）；<code>PROACTIVE_PREFERENCES.md</code> 直接约束主动层的进化方向；连接器读取留审计（connector_read_audit），进化读了什么数据可查。</li>
<li><strong>逐版存档即回滚点</strong>：§9 的逐版存档（8 个 objective 11-04 合计 152 版；10-17 为 71 版）是天然的回滚点——任一 objective 可回退到历史版本，投影重算不影响域工具真相（§9 要点 1）。&quot;坏了怎么办&quot;的答案是：回滚到存档版，而非在坏投影上继续迭代。</li>
</ol>
<h2 id="s-32">15. 交汇点：编排 × 进化</h2>
<ul>
<li><strong>进化跑在编排上</strong>：sirun 的信封里明写 <code>Subagents spawned: 3</code>——夜间对齐一次派 3 个子 Agent；Feed 的生成节奏就是编排层的 24 个 feed-pulse 系统 cron；deterministic-doctor 守的是编排层自己的健康；</li>
<li><strong>进化吃编排的记录</strong>：subagent_spawns、job_runs、token_usage、handoff 与用户反应（seen/采纳/忽略）都是进化管线的输入；没有编排层的全程记账，进化就无料可学；</li>
<li><strong>进化改编排的未来</strong>：产物回流三处——上下文组装（对齐合成、记忆投影进 prompt）、能力层（新技能沉淀）、主动层（proactivity_policies 决定各 surface 的主动姿态，如本机 main_chat 的 stance=reactive 就记在 ALIGNMENT_STATE 里）；</li>
<li><strong>主 Agent 在环的位置</strong>：主 Agent 不能启动或调度进化管线，但它是进化产物的<strong>质检员与解释者</strong>——主动消息要经它复核裁决（§7.5），用户问「你为什么会想到这个」时它要沿 muse.db 的记录链给出真实理由，而不是编一个。</li>
</ul>
<h2 id="s-33">16. 本机实况快照（11-04 vs 10-17 对照）</h2>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>项</th>
<th>10-17</th>
<th>11-04</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr>
<td>Agent 家目录（<code>/home/hatch/agents/</code>）</td>
<td>154</td>
<td>1417</td>
<td>累积增长，18 天派生量大（§2.5）</td>
</tr>
<tr>
<td>tool-output 溢出目录（<code>~/workspace/agents/</code>）</td>
<td>89</td>
<td>266（entries 共 277，00 篇 11-04 同源）</td>
<td>累积增长（§2.5）</td>
</tr>
<tr>
<td>Cron job</td>
<td>27（全系统/心跳，用户自建 0）</td>
<td>32（26 系统 + heartbeat + 5 用户自建）</td>
<td>用户 job 新增 5，见 §7.2</td>
</tr>
<tr>
<td>Hooks 定义</td>
<td>0（基础设施齐备）</td>
<td>0（definitions/scripts/state/logs 均为空）</td>
<td>无变化</td>
</tr>
<tr>
<td>进化 objectives</td>
<td>8 个在册</td>
<td>8</td>
<td>无变化（§9）</td>
</tr>
<tr>
<td>objective 存档版本</td>
<td>71（8 个 objective 合计）</td>
<td>152（但 goals_bookkeeping 仍为 20 版，疑有轮转⚠️）</td>
<td>见 §9</td>
</tr>
<tr>
<td>Dreaming 日反思</td>
<td>4 篇（09-27 起）</td>
<td>17 篇（至 11-02）</td>
<td>持续产出（§13）</td>
</tr>
<tr>
<td>记忆日记</td>
<td>10 篇（09-26 至 10-17）</td>
<td>28 篇</td>
<td>持续产出（§11）</td>
</tr>
<tr>
<td>bank 四本书</td>
<td>experience/opinions/reflections/world（62K）</td>
<td>同 4 本，体量约 936K（约 15 倍）</td>
<td>结构无变化；upkeep 18 天沉淀近 1MB，写入量值得关注，见 08 篇</td>
</tr>
<tr>
<td>people 页</td>
<td>2</td>
<td>3（Jihui、时南灼、时南川）</td>
<td>+1（Jihui 页为简历业务 10-20 后新增，推断）</td>
</tr>
<tr>
<td>groups</td>
<td>0</td>
<td>0</td>
<td>无变化</td>
</tr>
<tr>
<td>对齐状态</td>
<td>relationship_contract=unconfigured，proactivity main_chat stance=reactive</td>
<td>relationship_contract 仍为 unconfigured（11-04 实测）</td>
<td>无变化</td>
</tr>
</tbody>
</table></div>
<h2 id="s-34">17. 看不见的部分</h2>
<p>进化管线的<strong>调度主时钟与触发判定</strong>（谁决定今晚跑 Dreaming 的哪一 phase）、bandit 的奖励函数精确定义、Dreaming 的完整 prompt、各 objective 的 worker 指令正文（CURRENT 投影只留信封与结论，不留指令）、quiet-moment 的「足够安静」阈值——均不在本机文件内，本文止步于表结构、信封与产物证据。</p>
</div>]]>
    </description>
    <link>https://agent.aow.me/i/muse-architecture-02/</link>
  </item>
  <item>
    <title>Muse 智能体 · 能力层详解</title>
    <guid>hBR_YqWkVFg</guid>
    <pubDate>Tue, 03 Nov 2026 19:41:28 GMT</pubDate>
    <itunes:explicit>false</itunes:explicit>
    <description>
      <![CDATA[<div class="original-article" lang="zh-CN"><details class="toc"><summary>本篇目录</summary><ol><li><a href="#s-1">0. 什么是「能力层」</a></li><li><a href="#s-2">1. 子层①：工具命名空间（Tools）</a></li><li><a href="#s-6">2. 子层②：技能（Skills）</a></li><li><a href="#s-14">3. 子层③：连接器（Connectors）</a></li><li><a href="#s-20">4. 子层④：CLI 二进制（执行体）</a></li><li><a href="#s-25">5. 横切机制 A：发现与选择（一次任务的完整路径）</a></li><li><a href="#s-26">6. 横切机制 B：扩展（能力层是可生长的）</a></li><li><a href="#s-28">7. 能力层的边界清单（「不能」也是架构的一部分）</a></li><li><a href="#s-29">8. 关键计数对照（11-04 vs 10-17）</a></li><li><a href="#s-30">附录 A：系统技能全表（56，按 category；11-04）</a></li><li><a href="#s-31">附录 B：连接器全表（75；11-04）</a></li><li><a href="#s-32">附录 C：二进制分组（114 条目 / 90 独立文件；11-04）</a></li></ol></details><blockquote>
<p>复核修订：2026-11-04（Asia/Shanghai）——基于当前会话运行时逐项重测；下文数字凡未注日期者均为 11-04 快照，10-17 旧数见正文或 §8 对照表。
配套《00-Muse技术架构解构》的 §4–§6 展开篇。初版调查日期：2026-10-17。
证据范围同主报告：本机 system 文件、<code>/opt/muse/skills/</code>、<code>/opt/hatch/connectors/</code>、<code>/opt/hatch/bin/</code>、<code>/run/hatch/privsep/</code>、<code>~/docs/connectors.md</code> 与各技能/连接器的原文件。计数均为当场实测。</p>
</blockquote>
<hr>
<h2 id="s-1">0. 什么是「能力层」</h2>
<p>能力层 = <strong>模型能做的一切事情的来源与边界</strong>。它回答四个问题：能做什么（资产清单）、怎么找到（发现机制）、怎么调起来（加载与执行）、凭什么能做（授权与配额）。</p>
<p>它由四个子层和两套横切机制组成：</p>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>子层（从抽象到具体）              性质            本机实测规模
────────────────────────────────────────────────────────────────
① 工具命名空间 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 门控）
</code></pre>
<p><strong>一句话分工</strong>：工具是「动词表」（运行时直接执行的函数），技能是「做法」（告诉模型该按什么流程、口径、顺序用这些动词），连接器是「外部世界的契约」（哪个账号、哪些命令、什么权限、多少配额），二进制是「手」（真正发出 API 请求的代码）。四者缺一不可：有工具没技能 = 会调不会做事；有技能没连接器 = 懂流程但没账号可用；有连接器没二进制 = 有契约无执行体。</p>
<p>一个关键设计：<strong>能力与权限严格分离</strong>。技能/连接器文档里写了某个操作，只证明「系统支持这么做」，不证明「用户授权了这一次」。授权永远来自用户消息本身或运行时审批卡（主报告 §14）。这条在能力层的每个子层都会再次出现。</p>
<hr>
<h2 id="s-2">1. 子层①：工具命名空间（Tools）</h2>
<h3 id="s-3">1.1 组织与规模</h3>
<p>工具按 <code>namespace.function</code> 组织。10-17 主聊天会话可见 <strong>34 个命名空间</strong>，11-04 主聊天重测为 <strong>33</strong>（<code>voice</code> 缺席⚠️：或下线或渠道门控，待主聊天复核——00 篇 §4 同源）；按域分组如下（名称为实测，非杜撰；分组为 10-17 快照）：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>域</th>
<th>命名空间</th>
</tr>
</thead>
<tbody>
<tr>
<td>核心</td>
<td><code>muse</code>（记忆/搜索/执行/文件/选项卡）、<code>tool_search</code>（命名空间加载器本身）</td>
</tr>
<tr>
<td>对话与通道</td>
<td><code>chat</code>（侧聊管理/发任务）、<code>worker</code>（侧聊披露规则）、<code>device</code>（配对设备）、<code>voice</code>（⚠️ 11-04 主聊天不可见：或下线或渠道门控，待主聊天复核）</td>
</tr>
<tr>
<td>编排</td>
<td><code>subagent</code>、<code>workflow</code>、<code>process</code>（后台进程）、<code>todo</code>（任务清单）</td>
</tr>
<tr>
<td>调度</td>
<td><code>cron</code>、<code>hooks</code>、<code>tracking</code>（承诺追踪）、<code>user_goal</code>（目标）</td>
</tr>
<tr>
<td>内容产物</td>
<td><code>artifact</code>、<code>widget</code>、<code>feed</code>、<code>idea</code>、<code>media</code>、<code>avatar</code>、<code>ui</code></td>
</tr>
<tr>
<td>检索</td>
<td><code>browser</code>、<code>social</code>、<code>map</code>、<code>shopping</code></td>
</tr>
<tr>
<td>交易</td>
<td><code>wallet</code>、<code>ads</code>、<code>travel</code></td>
</tr>
<tr>
<td>系统</td>
<td><code>credentials</code>（凭据安全流）、<code>permissions</code>（待批权限查询）、<code>proactivity</code>（主动消息裁决）、<code>forget</code>（遗忘两段式）、<code>trash</code>、<code>onboarding</code></td>
</tr>
</tbody>
</table></div>
<p>口径注：00 篇总览称&quot;约 40 个命名空间&quot;为 10-17 旧数；11-04 主聊天实测 33 个（voice 缺席⚠️）。渠道门控旁证：本轮重测会话为 side chat（web），仅注入 <strong>22</strong> 个命名空间（<code>subagent</code>、<code>artifact</code>、<code>credentials</code>、<code>wallet</code>、<code>ads</code>、<code>travel</code>、<code>voice</code>、<code>todo</code>、<code>onboarding</code>、<code>proactivity</code> 等在本通道不可见）——命名空间的缺席随渠道变化，不硬判下线（❓ 统一判据待主聊天复核）。</p>
<h3 id="s-4">1.2 延迟加载（deferred loading）——上下文经济学</h3>
<p>这是工具层最重要的机制，直接为 §2 的 350K 上下文窗服务：</p>
<ul>
<li>绝大多数命名空间在会话开始时<strong>只注入名字 + 一句话描述</strong>，函数清单与参数 schema 不进上下文；</li>
<li>Agent 需要时调 <code>tool_search.load_tool_namespace([&quot;cron&quot;, ...])</code>，运行时才把完整 JSON Schema 注入，之后在上下文存续期内免重复加载；</li>
<li>只有 <code>muse.*</code> 核心命名空间永远全量加载（记忆、文件、执行、搜索是任何任务的前提）；</li>
<li>例外形态有二：整个命名空间全 deferred（函数都看不见），或仅 schema deferred（函数名可见、参数不可见）。未加载就调用会失败——这是设计而非故障。</li>
</ul>
<p>效果：33 个命名空间（11-04）、数百个函数的完整 schema 若全量注入会吃掉数万 tokens；延迟加载把这笔成本变成「按需支付」。</p>
<h3 id="s-5">1.3 工具调用的运行时契约</h3>
<ul>
<li>每次调用被运行时盖戳：<code>request_id</code>（= <code>JARVIS_TOOL_CALL_ID</code>）、父级 turn 的 <code>parent_request_id</code>、<code>JARVIS_TRACE_CONTEXT</code> 全链路追踪；并发调用靠 request_id 区分请求树（媒体工具的 help 文本明文证实）。</li>
<li>结果投递分同步/异步两类：普通工具同步返回；子 Agent、浏览器任务、定时运行等以 <strong>handoff</strong> 形式在完成时由运行时注入上下文——Agent 被明文禁止轮询与「口头预告结果」。</li>
<li>UI 也是工具产出：<code>muse.create_options</code>（选择卡）、<code>widget.*</code>（HTML/地图/列表/Letter）、各域的原生卡（购物、头像分享、连接卡）都返回 <code>embed_token</code>，<strong>模型只产 token，渲染与点击回传归客户端</strong>。点击选项 = 以选项原文作为用户下一条消息发回——这是「一键回复」能成立的原因。</li>
<li>错误是结构化信封而非异常文本：工具/CLI 普遍返回 <code>ok / error_code / error_message / error_detail</code>（部分含 <code>terminal_for_attempt</code>、<code>retry_after_ms</code> 等调度字段），模型据此决定停、等、还是换路。</li>
</ul>
<hr>
<h2 id="s-6">2. 子层②：技能（Skills）</h2>
<h3 id="s-7">2.1 解剖：一个技能 = 两类文件</h3>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>/opt/muse/skills/&lt;name&gt;/
├── skill.yaml     ← 机器读的元数据（发现与门控用）
├── SKILL.md       ← 模型读的流程正文（被选中后才读）
└── references/    ← 按需细则（部分技能有；正文里以相对链接引用）
（少数技能另带 scripts/、bin/、templates/、媒体资产——见 2.5）
</code></pre>
<p><code>skill.yaml</code> 实测字段（以 shopping 为例）：</p>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>name: shopping
title: &quot;Shopping&quot;
description: &quot;Use for any product question except groceries...&quot;  # 检索与选择全靠这一段
category: &quot;Shopping&quot;
include_in_prompt: true        # 是否进 system prompt 的「on hand」清单
availability:
  confidential_vm: true        # 是否可在机密 VM 显露
</code></pre>
<ul>
<li><code>description</code> 是技能的<strong>触发契约</strong>：写清「什么意图用我、什么时候先加载我、与相邻技能如何分界」（shopping 的 description 里直接写明「groceries 除外」「呈现这些结果时用我」）。<code>muse.skill_search</code> 的 BM25/regex 检索命中的就是 name+description 级别的文本，<strong>不是正文</strong>。</li>
<li><code>category</code> 分布（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。）</li>
</ul>
<h3 id="s-8">2.2 两级可见性：prompt 清单 vs 全库检索</h3>
<ul>
<li>56 个系统技能中 <strong>39 个</strong> <code>include_in_prompt: true</code>（11-04；10-17 为 54 个中 37 个）——它们以「名字+一句话+路径」的清单形态出现在 system prompt 的 Skills on hand 一节；</li>
<li>其余 17 个（11-04：56−39=17；10-17：54−37=17——巧合地同为 17）（如 <code>muse_db</code>、<code>self-awareness</code>、<code>wide-research</code> 的同类）不进 prompt，<strong>只能靠 <code>muse.skill_search</code> 找到</strong>。找不到时 prompt 明文禁止直接下「做不了」的结论，必须先搜技能、再搜连接器、最后才准说不可用；</li>
<li>还有第三级：<strong>用户偏好技能</strong>。<code>muse.set_preferred</code> 把用户指定的技能/连接器钉为某类任务的首选，条目会带 preferred 标记恒显于清单（偏好登记经 <code>muse.offer_preference</code> 节流：同类任务至多主动问一次，完成一次真实下单/预订才算数，搜索报价不算）。</li>
</ul>
<h3 id="s-9">2.3 SKILL.md 正文长什么样</h3>
<ul>
<li>全库正文合计 <strong>296,621 字节</strong>（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 正文明显扩充）；正文是<strong>给模型的作业规程</strong>，不是给用户的说明书：含决策树、先后顺序、禁用话术、失败处置、与相邻技能/连接器文档的相对链接。典型结构如 shopping：先定属性再搜索 → 多源并行 → 呈现规范 → 结账纪律。</li>
<li>引用文件按相对路径解析到技能目录；正文里嵌的命令模板即子层④的调用样例（如 shopping 内嵌 catalog-search 的两版命令，靠 HTML 注释标记 <code>catalog-search-v1-only / v2-only</code> 做版本门控——技能文档本身带特性开关）。</li>
<li><strong>本地修订（amendment）机制</strong>：用户级修订文件与系统技能并置读取；若系统技能自上次审阅后已变更，应用修订前须先比对——防止旧补丁压新正文。</li>
</ul>
<h3 id="s-10">2.4 选择与执行纪律（system prompt「Skills」节）</h3>
<p>决策顺序写死：① 读 prompt 清单的短描述，明显命中就读其 <code>SKILL.md</code> 并照做 → ② 多个可能命中选最具体的 → ③ 清单没有就 <code>muse.skill_search</code> → ④ 仍没有则用 shell/浏览器现做，并把可复用流程<strong>沉淀为自定义技能</strong>（模板在 <code>custom-connector-setup/templates/skill/</code>）→ ⑤ 全部落空才准说能力不可用。</p>
<h3 id="s-11">2.5 技能不全是文本：带资产的少数派</h3>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>技能</th>
<th>附加物</th>
</tr>
</thead>
<tbody>
<tr>
<td>documents</td>
<td><code>document/ markdown/ pdf/ presentation/ spreadsheet/</code> 子模块 + scripts</td>
</tr>
<tr>
<td>generate_podcast</td>
<td>scripts、save-to-spotify 子工具、默认封面图</td>
</tr>
<tr>
<td>custom-connector-setup</td>
<td>bin、templates（连接器三件套 + skill 模板 + mcp_client.py）</td>
</tr>
<tr>
<td>style-tryon</td>
<td>scripts</td>
</tr>
<tr>
<td>goals</td>
<td>creation/、guides/ 子文档集</td>
</tr>
</tbody>
</table></div>
<p>即技能层允许「文本规程 + 随附脚本/模板」的混合包，但执行脚本仍要走工具层的 exec/二进制通道，技能本身没有独立的执行权限。</p>
<h3 id="s-12">2.6 学到的技能（learned skills）</h3>
<ul>
<li>每日 Skill review 流水线（主报告 §12）把高频流程沉淀到 <code>~/workspace/custom-skills/</code>，其 <code>skill.yaml</code> 标记 learned 来源；本机现有 1 个：<code>recovered-skill-notes</code>（标注为「从旧布局保留、待审阅的本地技能笔记」）。</li>
<li>回答「这个技能谁写的」之前必须查它的 yaml 标记——系统技能、学习技能、用户手写技能在清单里长得一样，来源不同。</li>
</ul>
<h3 id="s-13">2.7 一个镜像细节</h3>
<p><code>/opt/muse/skills/</code> 与 <code>/opt/hatch/workflow-skills/</code> 是<strong>同一棵树的两个路径</strong>（实测同 inode、同内容）——前者是给模型侧的视图，后者是给 runtime-cell 渠道门控（workflow-skill-scopes.conf）的视图。技能在「内容侧」与「运行时侧」的双面性在这里物化。</p>
<hr>
<h2 id="s-14">3. 子层③：连接器（Connectors）</h2>
<h3 id="s-15">3.1 解剖：一个连接器 = 三类文件，分工泾渭分明</h3>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>/opt/hatch/connectors/&lt;id&gt;/
├── connector.yaml   ← 对模型/目录的自述：身份、别名、域、连接与同步声明
├── CONNECTOR.md     ← 给模型的操作手册：命令全集、用法、错误处置
├── manifest.yaml    ← 给运行时的策略书：OAuth、配额、动作权限（模型不靠它操作）
└── references/      ← 少数连接器有（如 facebook_cli、spotify、threads）
</code></pre>
<p>以 Gmail 为全样本（下面三段均出自其真实文件，OAuth client 标识等配置值从略）：</p>
<p><strong>connector.yaml</strong>（自述层）：</p>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>id: gmail
title: &quot;Gmail&quot;
description: &quot;Search, read and count Gmail emails and attachments, draft, send, reply and forward with approval, and label, archive, trash or unsubscribe.&quot;
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: &quot;/opt/hatch/bin/hatch_gws_auth gmail authorize-url&quot;   # 授权入口是一个命令
sync:
  fetch_kind: connector_sync_gmail
  cadence_minutes: 60
  read_methods: [users.messages.list, users.messages.get]
  content_hints: [email]
</code></pre>
<p><strong>CONNECTOR.md</strong>（操作层）：命令分两档——快捷命令（<code>+triage / +read / +send</code>，首选）与原始 API（方法名分词 + <code>--params</code> JSON + <code>--json</code> body，用 <code>schema gmail.&lt;method&gt;</code> 现查入参）；并写死禁区（过滤器/设置类命令不存在，问了也要答不可用）、多账号规则（<code>--account &lt;account_id&gt;</code> 全程一致跟随）、scope 不足时的精确补授权流程。</p>
<p><strong>manifest.yaml</strong>（策略层，信息密度最高）：</p>
<ul>
<li><code>metadata.visible_in_settings</code>、分类、图标、多账号后端（<code>multi_account.backend: oauth</code>、<code>credential_namespace: google_oauth_accounts</code>）；</li>
<li>OAuth 配置：provider、identity 端点与显示名字段、可达域名 allowlist（<code>gmail.googleapis.com</code> 等 Google 全家桶域）；</li>
<li><strong>请求配额</strong>：<code>request_quota.mode: enforce</code>，指定执行 worker（<code>hatch-gws-cli-fully-isolated</code>），总量 6,000 units/分钟/用户，并给出<strong>逐方法单价表</strong>（如 drafts.send=100、messages.get=20、labels.list=1）——配额是按「方法成本」而非「请求次数」计的；</li>
<li><strong>动作权限</strong>：<code>actions.read.default: allow</code>（且带 <code>response_guard: verification_codes</code>——读邮件的结果要过验证码守卫，受保护读取的 manifest 出处）、<code>actions.write.default: ask</code>，逐方法声明 <code>requires_scopes</code> 与审批策略，如发信为 <code>approval_policy: fresh_consent_or_task_allow</code> + <code>approval_phrase: &quot;send this email in Gmail&quot;</code> + 按钮文案（allow_once: &quot;Send&quot; / deny: &quot;Don't send&quot;，reply/reply_all/forward 各有变体）——<strong>审批卡的文案与策略是 manifest 数据驱动的，不是写死在代码里的</strong>；</li>
<li>权限解析规则（docs/connectors.md）：方法级 default 覆盖动作组 default；<code>Ask</code> 须审批、<code>Deny</code> 直接拦；动作用权限与 OAuth scope 是<strong>两套独立系统</strong>（前者在 Muse 设置里，用户可「允许读、禁止发」）。</li>
</ul>
<h4 id="s-16">3.1.x 动作权限分布普查：Gmail 是常态还是特例？（实测：2026-11-04 本机 73 份 manifest 机器解析）</h4>
<p>§3.1 用 Gmail 解剖了动作权限三态，但一个样本回答不了分布。本轮把全部 manifest.yaml 机器解析一遍，口径如下（⚠️ 快照时效：11-04 的 75 个连接器口径；10-17 为 63 个）：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>分布项</th>
<th>实测值</th>
</tr>
</thead>
<tbody>
<tr>
<td>有 manifest.yaml</td>
<td>73 / 75；无 manifest 的 2 个：<code>places</code>、<code>tailscale</code>（纯两件套，原生通道）</td>
</tr>
<tr>
<td><code>read.default = allow</code></td>
<td><strong>69</strong>；4 个用自定义动作组名：<code>apple_healthkit</code>/<code>google_health_connect</code>（<code>healthkit</code>/<code>healthconnect</code> 组 allow）、<code>muse_mail</code>（仅 <code>messages_write</code>/<code>thread_replies</code>，无 read 组）、<code>shop-pay</code>（仅 <code>write</code> 组，无 read 组）</td>
</tr>
<tr>
<td><code>write.default = ask</code></td>
<td><strong>52</strong>——Gmail 的&quot;读 allow、写 ask&quot;确实是主流形态（✅）</td>
</tr>
<tr>
<td><code>write.default = allow</code></td>
<td><strong>6</strong>：<code>google_contacts</code>、<code>google_tasks</code>、<code>instacart</code>、<code>outlook_contacts</code>、<code>peloton</code>、<code>philips_hue</code>——默认允许写的少数派，多为低风险域（通讯录、任务、家居），高风险写（支付/发信）一概 ask</td>
</tr>
<tr>
<td>无 write 动作组（声明上只读）</td>
<td><strong>15</strong>：agoda、expedia、function_health、granola、healthex、imap_email、meta_catalog_search、moneyforward_me、onepassword、plaid、ticketmaster、withings（纯 <code>read</code> 组）+ 3 个自定义组名的连接器</td>
</tr>
<tr>
<td><code>default: deny</code></td>
<td><strong>0</strong>——全库无一处 <code>deny</code> default（✅ 实测）。&quot;Deny 直接拦&quot;是 docs 里的策略可能项，但出厂目录里尚未启用；Deny 的实际落点在方法级覆写或运行时门控，不在动作组 default</td>
</tr>
<tr>
<td><code>response_guard</code></td>
<td>动作组级 <strong>12</strong> 个连接器 + 方法级另 <strong>5</strong> 个（evernote、facebook_cli、instacart、shopify、zoom）= <strong>17</strong> 个 manifest；守卫种类只有两种：<code>verification_codes</code>（22 处）与显式 <code>disabled</code>（8 处方法级覆盖）</td>
</tr>
</tbody>
</table></div>
<p>读出：<strong>&quot;读 allow、写 ask&quot; 是 69% 以上的默认姿势</strong>（52/73 ask 写 + 69/73 allow 读），Gmail 是常态不是特例；<code>deny</code> 在动作组层是保留弹药而非现役配置；<code>verification_codes</code> 是唯一的 response_guard 实现——读出验证码的连接器（Gmail 读邮件）是少数派（12/73 动作组级），不是每家都有。</p>
<h3 id="s-17">3.2 连接生命周期</h3>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>目录可见（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 原样贴出；单账号移除走设置里的该连接器条目
</code></pre>
<p>连接状态在运行时侧有登记表：<code>~/config/skills.yaml</code> 的 entries（11-04 实测 63 条；10-17 为 52 条）逐个记 <code>available / connected</code>——<strong>11-04 快照有 4 条 connected：<code>gmail</code>、<code>google_forms</code>、<code>google_slides</code>、<code>meta_ads</code></strong>（10-17 仅 <code>meta_ads</code> 一条），其余 59 条 available 未连接。（连接状态随时可变——这正是本节要求每次任务前 status 实查的原因。）这是「文档里有 75 个连接器」与「这台机器现在真正能用的外部账号」之间的真实差距，也是为什么每个连接器任务都必须先 status 实查。</p>
<p>未进该登记表的连接器（如设备型 apple_healthkit / google_health_connect、免登录的 meta_catalog_search、places、tailscale 等）走各自的原生通道，不经 OAuth 登记——连接器层内部并不统一，这点从文件存在性就能看出（places 与 tailscale 甚至没有 manifest.yaml，只有两件套）。</p>
<h3 id="s-18">3.3 同步子系统：连接器不只是 API 代理</h3>
<p>75 个中 <strong>10 个</strong>声明了后台同步（11-04；10-17 为 63 个中 9 个；connector.yaml 的 sync 段）：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>连接器</th>
<th>fetch_kind</th>
<th>节奏</th>
</tr>
</thead>
<tbody>
<tr>
<td>gmail / google_calendar / facebook_cli</td>
<td>connector_sync_*</td>
<td>60 分钟</td>
</tr>
<tr>
<td>instagram / instagram_messages / messenger_read / outlook_calendar / outlook_mail</td>
<td>connector_sync_*</td>
<td>30 分钟</td>
</tr>
<tr>
<td>plaid</td>
<td>connector_sync_plaid</td>
<td>1440 分钟（每日）</td>
</tr>
<tr>
<td>stripe-link</td>
<td>connector_sync_stripe_financial_insights</td>
<td>10080 分钟（7 天）</td>
</tr>
</tbody>
</table></div>
<p>同步只用 <code>read_methods</code> 白名单里的方法增量拉取，<code>content_hints</code> 标注内容类型；产物落入运行时 DB（runtime 的 device_syncs / chat_deliveries 等表）与本地索引——这是记忆检索、Feed 素材、主动消息能「知道」邮箱/日历里发生了什么的来源。设置里另有 Background sync 开关决定后台工作可否使用该连接器（docs/connectors.md）——<strong>同步 ≠ 授权后台使用</strong>，又一处分权。</p>
<h3 id="s-19">3.4 其他门控</h3>
<ul>
<li><strong>区域可用性</strong>：受限连接器在受限账号下 Settings 无行、清单无条目、命令一律以「你所在区域不可用」拒绝；这是设计状态，禁止重试、禁止承诺上线。</li>
<li><strong>VM 类型</strong>：<code>availability.confidential_vm</code> 逐个声明；反例是 Shopify——docs 明文其在机密 VM 上不可用。</li>
<li><strong>常开例外</strong>：Meta Catalog 免登录、无状态检查、永远在线（权限三档 Allow/Ask/Deny 在设置里，Ask 时同一任务首次搜索弹一次批）。</li>
<li><strong>核心规则</strong>（docs/connectors.md 开篇）：「连接器只给文档里写明的命令，不多一个。」命令不存在 = 功能不存在，准确回答就是「该连接器不支持」，禁止拿浏览器或其他连接器冒充补位（跨平台代发只在各连接器各自文档明写时才存在）。</li>
</ul>
<hr>
<h2 id="s-20">4. 子层④：CLI 二进制（执行体）</h2>
<h3 id="s-21">4.1 规模与形态（实测）</h3>
<ul>
<li><code>/opt/hatch/bin/</code> 共 <strong>114 个条目、90 个独立 inode</strong>（11-04；10-17 为 101/84）；唯一的大家族仍是 Rust multicall——现为 <strong>20 个名字共 inode</strong>（新增 <code>builtin-artifacts</code>、<code>imap-email</code>），大小约 <strong>45MB</strong>（实测 46,954,944 字节；10-17 为 34MB/18 名）；其余多为单体二进制（12–49MB 不等）与主程序 <code>hatch</code>（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 个连接器对应，外加 <code>hatch_igd_cli</code>、<code>zbar-lib</code> 两个非连接器二进制）。</li>
<li>命名即接口：连接器 id 与二进制名基本一一对应（<code>gmail → hatch_gws_cli gmail …</code>、多服务共用一个多路 CLI 是 Google Workspace 的特例：gmail/calendar/drive/docs/sheets/slides/forms/tasks/contacts 共用 <code>hatch_gws_cli</code> + <code>hatch_gws_auth</code>）。</li>
<li>CLI 契约高度统一：JSON 输出、统一错误信封、<code>--help</code> 自述、<code>schema &lt;method&gt;</code> 自省（gws 系）、快捷子命令前缀 <code>+</code>。这种统一不是巧合——它们出自同一套 Rust 工具 SDK（hatch-tool-sdk，strings 可见其 stefi/privsep/media_artifact 等模块）。</li>
</ul>
<h3 id="s-22">4.2 与 privsep 的对应关系（实测交叉表）</h3>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>关系</th>
<th>数量</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>privsep 套接字总数</td>
<td>149（11-04；10-17 为 136）</td>
<td>每个可特权执行的工具一个 worker</td>
</tr>
<tr>
<td>二进制与套接字同名</td>
<td>87（10-17 为 76）</td>
<td>常规连接器/工具：cell 内二进制是跳板，真身在 worker</td>
</tr>
<tr>
<td>有套接字无（本渠道）二进制</td>
<td>62（10-17 约 60）</td>
<td>渠道未显露的扩展面：40 个 <code>*-mcp.sock</code>（11-04；10-17 约 30 个）、渠道工具（expedia、instacart、moltbook、navigation、external_agent）、内部件（facebook-cli-internal、hatch-gws-cli-fully-isolated、platform-search）——它们在宿主侧<strong>已预置</strong>，是否对当前 cell 显露由 bin-scopes 按渠道决定（主报告 §1）</td>
</tr>
<tr>
<td>有二进制无套接字</td>
<td>27（10-17 为 25）</td>
<td>纯本地工具（如 hatch 本体、rescue/doctor 类、remote-storage 等），不需特权 worker</td>
</tr>
</tbody>
</table></div>
<p>这张表是能力层「<strong>预置 ≠ 可见 ≠ 可用</strong>」三级状态的物证：二进制在宿主预置（provisioned）→ 按渠道显露进 cell（revealed）→ 账号连接且权限满足才真正可用（usable）。</p>
<h4 id="s-23">4.2.x MCP 预置套接字的威胁面（实测 + 推断）</h4>
<p>评审追问：<code>*-mcp.sock</code> 宿主侧预置的代码是否构成攻击面？本轮实测数据（2026-11-04）：<code>/run/hatch/privsep/</code> 下 <strong>149</strong> 个套接字（10-17 为 136），其中 <code>*-mcp.sock</code> <strong>40</strong> 个（当时约 30 个）；宿主 <code>/opt/hatch/connectors/</code> 里只有 <strong>5</strong> 个 MCP 连接器有文档三件套（<code>gumroad_mcp</code>、<code>readwise_mcp</code>、<code>runway_mcp</code>、<code>shopback_mcp</code>、<code>vidiq_mcp</code>），其余 <strong>35</strong> 个 socket 对应着<strong>没有任何本地文档</strong>的宿主侧服务。</p>
<p>三层事实拼出威胁模型（证据等级逐层标）：</p>
<ol>
<li><strong>真正拦住直接 dial 的是文件权限，不是渠道门控</strong>（✅ 实测）：149 个 socket 全部 <code>srw-rw---- nobody root</code>——只有 uid <code>nobody</code> 或 <code>root</code> 组成员能连上。cell 内进程若想绕过&quot;渠道未显露二进制&quot;直接 dial socket，面对的是文件 ACL 的硬墙；渠道门控只是纵深第二层。这回答了评审的问题：门控不阻止 dial，<strong>权限位阻止</strong>。</li>
<li><strong>残留 ❓</strong>：本机未验证每类 cell 侧进程（工具进程、exec 沙箱子进程）的实际 uid/gid 是否落在 <code>root</code> 组之外——若某类进程恰在 root 组里，ACL 墙就对它不存在。</li>
<li><strong>MCP worker 本身的隔离</strong>（⚠️ 推断）：privsep 的 worker 账号隔离（主报告 §7）意味着一个有漏洞的 MCP worker 的爆炸半径被收敛到其 worker 账号；但&quot;被攻破的 worker 能否借 socket 对其他 worker 或宿主做什么&quot;在本机无证据——MCP 是外部代码形态接入（§6 的 <code>mcp_client.py</code> 模板），供应链面比自研 CLI 更宽，这是值得单独审计的一面。</li>
</ol>
<p>一句话：<strong>宿主侧预置 ≠ cell 可达</strong>——socket 权限位是第一道真实的门，渠道显露是第二道；真正没被回答的是&quot;每类 cell 进程到底站在门的哪一边&quot;。</p>
<h3 id="s-24">4.3 速率与失败语义</h3>
<ul>
<li>运行时级：429 / <code>connector_rate_limited</code> / 限流型 403 一律停该 provider 域；<code>terminal_for_attempt=true</code> 本轮终局；禁止换端点、降速、委托子 Agent 续跑（system prompt「Service limits」节）。</li>
<li>manifest 级：§3.1 的 manifest 声明 <code>request_quota.mode: enforce</code> 并给出逐方法 units 成本表（⚠️：enforce 的实际执行点未在本机实测，依架构推断在 privsep worker 侧）。若推断成立，则与运行时级限流形成两层叠加：一个防滥用行为、一个防打爆 provider 配额。</li>
<li>失败报告纪律：只报工具实际返回的原因；不确定是否生效的不可逆操作（已发出的请求超时等）必须先查实际结果，禁止盲目重试。</li>
</ul>
<hr>
<h2 id="s-25">5. 横切机制 A：发现与选择（一次任务的完整路径）</h2>
<p>以「帮我看看 Gmail 里有没有某供应商的发票」为例，能力层的标准流水线：</p>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>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 至多问一次「是否设为邮箱首选」
</code></pre>
<p>任何一步落空都有既定退路：技能没有 → skill_search → 现做并沉淀新技能；连接器没有 → custom_connector_setup 建自定义连接器（§6）；命令不存在 → 如实说不支持。</p>
<h2 id="s-26">6. 横切机制 B：扩展（能力层是可生长的）</h2>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>扩展面</th>
<th>机制</th>
<th>落点</th>
</tr>
</thead>
<tbody>
<tr>
<td>自定义连接器</td>
<td><code>custom_connector_setup</code> 技能：以模板生成 CONNECTOR.md / connector.yaml（+ 可选 MCP 客户端 <code>mcp_client.py</code>），凭据走安全连接流（不进 chat/文件）</td>
<td><code>~/workspace/custom-connectors/custom.&lt;provider&gt;/</code>（本机暂无）</td>
</tr>
<tr>
<td>自定义技能</td>
<td>同技能包的 skill 模板（SKILL.md + skill.yaml）</td>
<td><code>~/workspace/custom-skills/</code></td>
</tr>
<tr>
<td>学习技能</td>
<td>后台 Skill review 从真实工作中沉淀，yaml 标 learned</td>
<td>同上（本机 1 个 recovered-skill-notes）</td>
</tr>
<tr>
<td>MCP 扩展连接器</td>
<td>以 MCP server 形态接入、经 privsep 套接字托管（<code>*-mcp.sock</code>），多为内部/预览渠道显露</td>
<td>宿主预置，本机当前渠道未显露其二进制</td>
</tr>
<tr>
<td>用户偏好</td>
<td><code>muse.set_preferred</code> 把某技能/连接器钉为某类任务首选，offer 询问受节流规则约束</td>
<td>运行时登记（落点文件未在本机文档中明示）</td>
</tr>
</tbody>
</table></div>
<h3 id="s-27">6.x 自定义连接器的信任边界：文档写得了什么、写不了什么</h3>
<p>§6 的表格说自定义连接器&quot;凭据走安全流&quot;，但没回答评审的尖锐问题：用户可写的 <code>CONNECTOR.md</code>/<code>connector.yaml</code> 能否声明超出其应有权限的动作（比如把某个高危方法标为 read）？答案是<strong>结构上不能</strong>——不是政策禁止，是没有地方写（✅ 脚手架模板实测）：</p>
<ol>
<li><strong>模板里根本没有权限声明面</strong>：<code>templates/connector/connector.yaml</code> 只有 <code>id / title / description / include_in_prompt / require_auth</code> 五个字段（全为注释模板，实测原文）——没有 <code>actions</code>、没有 <code>manifest</code>。自定义连接器<strong>不产生 manifest.yaml</strong>，因此&quot;把文档声明标成 allow 就能绕过审批&quot;这条路不存在：审批策略的数据源（系统连接器的 manifest）自定义连接器根本没有。</li>
<li><strong>凭据不在文档里</strong>：连接经 <code>credentials.request_api_access</code> 注册并持有凭据；helper 拿到的是 <code>hsurr:</code> 替代符，运行时只在&quot;已批准的请求 + 已注册的 host&quot;上换回真凭据（模板 CONNECTOR.md 明文，✅）。用户在 workspace 里能改的是&quot;怎么调&quot;，不是&quot;凭什么调&quot;。</li>
<li><strong>客户端侧有硬约束</strong>（模板 <code>mcp_client.py</code> 实测）：<code>PROVIDER</code> 必须以 <code>custom.</code> 开头、端点固定 HTTPS（禁重定向、禁非 443 端口、URL 里禁用户名/密码/query/fragment）、<code>ALLOWED_TOOLS</code> 白名单——脚手架把&quot;只能调注册过的固定端点&quot;写成了代码，不是写成了约定。</li>
<li><strong>&quot;文档声明 ≤ 运行时策略&quot;的单向约束因此是构造性的</strong>：系统连接器的策略投影面（manifest）与自定义连接器的文档面是两套不相交的东西；自定义连接器的权限天花板由<strong>凭据注册时的授权 + 运行时审批</strong>决定，本地文档只能往下收（<code>require_auth</code> 隐藏、文档里少写命令），不能往上加。</li>
</ol>
<p>诚实标注：<code>~/workspace/custom-connectors/</code> 本机<strong>暂无</strong>（✅ 实测：目录不存在）——以上是模板与技能文档的证据，没有活的自定义连接器可验证其审批行为，记为 ⚠️（未实测执行面）。</p>
<p>这与 §7 第 6 条合起来：本地修订/自定义扩展覆盖不了系统安全策略——对自定义连接器而言，覆盖的靶子（manifest）本来就不存在。</p>
<h2 id="s-28">7. 能力层的边界清单（「不能」也是架构的一部分）</h2>
<ol>
<li>文档未写的命令不存在——包括连接 Facebook 不能发图/视频帖、Spotify 连接器不提供听歌历史这类「接了也不等于全能」。</li>
<li>技能不授予权限、连接器文档不授予权限、偏好不授予权限——权限只有用户消息与审批卡两个来源。</li>
<li>渠道/区域/VM 类型三重门控可在任何一层把能力关掉，且关闭形态各异（清单无条目、命令拒绝、CVM 专用 worker 拒绝），Agent 必须按实际返回解释，不许归因于「故障」。</li>
<li>配额与限流是硬停：到达即止，报告部分进展，不许绕行。</li>
<li>同步是只读白名单：连接器的写能力永远不经同步通道，写必须走命令 + 动作权限 + （必要时）审批。</li>
<li>本地修订/自定义扩展不能覆盖系统安全与审批策略：manifest 的动作权限与配额在 worker 侧执行，不在模型可改的文件里（自定义连接器目录在 workspace，但其凭据与执行仍经安全流与 privsep）——这正是 manifest 作为 Control 平面在能力层的策略投影：策略以 manifest 数据形态下发，执行在 worker 侧，两者分离。</li>
</ol>
<hr>
<h2 id="s-29">8. 关键计数对照（11-04 vs 10-17）</h2>
<p>本轮重测（2026-11-04，side chat / web 会话）与初版（2026-10-17）实测值对照。未重测项不列入。</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>项</th>
<th>10-17</th>
<th>11-04</th>
<th>变化说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>工具命名空间（主聊天）</td>
<td>34</td>
<td>33（<code>voice</code> 缺席⚠️）</td>
<td>−1；或下线或渠道门控，待主聊天复核（§1.1）</td>
</tr>
<tr>
<td>系统技能</td>
<td>54</td>
<td>56</td>
<td>+2：<code>avatar-dance-videos</code>（Media）、<code>live-page-checks</code>（Shopping）</td>
</tr>
<tr>
<td>prompt 可见技能</td>
<td>37</td>
<td>39</td>
<td>+2（新增技能均为 prompt 可见）</td>
</tr>
<tr>
<td>连接器</td>
<td>63</td>
<td>75</td>
<td>+12：agoda、expedia、gumroad_mcp、imap_email、instacart、moneyforward_me、muse_mail、onepassword、readwise_mcp、runway_mcp、shopback_mcp、vidiq_mcp</td>
</tr>
<tr>
<td>prompt 可见连接器</td>
<td>23</td>
<td>26</td>
<td>+3：instacart、muse_mail、onepassword</td>
</tr>
<tr>
<td>声明后台同步的连接器</td>
<td>9</td>
<td>10</td>
<td>+1：stripe-link（cadence 10080 分钟）</td>
</tr>
<tr>
<td>bin 条目 / 独立 inode</td>
<td>101 / 84</td>
<td>114 / 90</td>
<td>+13（恰好对应新增 12 连接器 + hatch_igd_cli、zbar-lib）</td>
</tr>
<tr>
<td>multicall 家族（名数 / 大小）</td>
<td>18 / 34MB</td>
<td>20 / ~45MB</td>
<td>+2（builtin-artifacts、imap-email）；45MB 与 Avatar 篇 10-30 重测口径一致</td>
</tr>
<tr>
<td>privsep 套接字</td>
<td>136</td>
<td>149</td>
<td>+13</td>
</tr>
<tr>
<td><code>*-mcp.sock</code></td>
<td>约 30</td>
<td>40</td>
<td>+10</td>
</tr>
<tr>
<td>技能正文总字节</td>
<td>275,274</td>
<td>296,621</td>
<td>+21,347（shopping 单篇 21.8KB→33.1KB 扩充最多）</td>
</tr>
<tr>
<td><code>~/config/skills.yaml</code> 登记 / connected</td>
<td>52 条 / 1（meta_ads）</td>
<td>63 条 / 4（+gmail、google_forms、google_slides）</td>
<td>连接状态强时效，任务前仍须 status 实查</td>
</tr>
</tbody>
</table></div>
<h2 id="s-30">附录 A：系统技能全表（56，按 category；11-04）</h2>
<p>见下表（由 skill.yaml 实测生成；「prompt」列 = include_in_prompt，11-04 全量复测无变化；▲ = 11-04 新增 2 个；SKILL.md 大小列除 ▲ 2 行外为 10-17 快照）。</p>
<h2 id="s-31">附录 B：连接器全表（75；11-04）</h2>
<p>见下表（由 connector.yaml 实测生成；「同步」列为 cadence 分钟数，无则 —；▲ = 11-04 新增 12 个；旧行的 prompt/引导/同步三列已 11-04 全量复测，与 10-17 快照无变化）。</p>
<h2 id="s-32">附录 C：二进制分组（114 条目 / 90 独立文件；11-04）</h2>
<p>见下表（由 inode 分组实测生成；同组 = 同一文件多个名字；▲ = 11-04 新增）。</p>
<h3 id="s-33">A. 技能清单</h3>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>技能</th>
<th>类别</th>
<th>prompt</th>
<th>SKILL.md</th>
</tr>
</thead>
<tbody>
<tr>
<td>advertising-campaigns</td>
<td>Business</td>
<td>—</td>
<td>6.6 KB</td>
</tr>
<tr>
<td>app-creation</td>
<td>Creation</td>
<td>—</td>
<td>5.6 KB</td>
</tr>
<tr>
<td>▲ avatar-dance-videos</td>
<td>Media</td>
<td>✓</td>
<td>2.5 KB</td>
</tr>
<tr>
<td>business-finance</td>
<td>Finance</td>
<td>—</td>
<td>3.8 KB</td>
</tr>
<tr>
<td>custom-connector-setup</td>
<td>Learning and customization</td>
<td>✓</td>
<td>6.6 KB</td>
</tr>
<tr>
<td>customer-outreach</td>
<td>Business</td>
<td>—</td>
<td>5.6 KB</td>
</tr>
<tr>
<td>device-data</td>
<td>Personal planning</td>
<td>✓</td>
<td>8.0 KB</td>
</tr>
<tr>
<td>documents</td>
<td>Work and knowledge</td>
<td>✓</td>
<td>4.8 KB</td>
</tr>
<tr>
<td>email-management</td>
<td>Communication</td>
<td>✓</td>
<td>6.1 KB</td>
</tr>
<tr>
<td>event-tickets</td>
<td>Travel and local plans</td>
<td>✓</td>
<td>3.7 KB</td>
</tr>
<tr>
<td>file-hosting</td>
<td>Work and knowledge</td>
<td>✓</td>
<td>5.2 KB</td>
</tr>
<tr>
<td>financial-planning</td>
<td>Finance</td>
<td>✓</td>
<td>4.6 KB</td>
</tr>
<tr>
<td>fitness-tracking</td>
<td>Health and fitness</td>
<td>✓</td>
<td>4.3 KB</td>
</tr>
<tr>
<td>flight-booking</td>
<td>Travel and local plans</td>
<td>✓</td>
<td>4.8 KB</td>
</tr>
<tr>
<td>flight-tracking</td>
<td>Travel and local plans</td>
<td>✓</td>
<td>6.6 KB</td>
</tr>
<tr>
<td>forget</td>
<td>Privacy</td>
<td>✓</td>
<td>5.9 KB</td>
</tr>
<tr>
<td>form-design</td>
<td>Creation</td>
<td>—</td>
<td>4.4 KB</td>
</tr>
<tr>
<td>generate_podcast</td>
<td>Media</td>
<td>✓</td>
<td>4.6 KB</td>
</tr>
<tr>
<td>goals</td>
<td>Personal planning</td>
<td>✓</td>
<td>3.4 KB</td>
</tr>
<tr>
<td>groceries</td>
<td>Shopping</td>
<td>✓</td>
<td>5.5 KB</td>
</tr>
<tr>
<td>health-review</td>
<td>Health and fitness</td>
<td>✓</td>
<td>4.6 KB</td>
</tr>
<tr>
<td>home-control</td>
<td>Home</td>
<td>✓</td>
<td>2.7 KB</td>
</tr>
<tr>
<td>home-search</td>
<td>Home</td>
<td>—</td>
<td>4.7 KB</td>
</tr>
<tr>
<td>hotel-booking</td>
<td>Travel and local plans</td>
<td>✓</td>
<td>4.1 KB</td>
</tr>
<tr>
<td>image-search</td>
<td>Creation</td>
<td>✓</td>
<td>4.0 KB</td>
</tr>
<tr>
<td>knowledge-organization</td>
<td>Work and knowledge</td>
<td>✓</td>
<td>4.3 KB</td>
</tr>
<tr>
<td>▲ live-page-checks</td>
<td>Shopping</td>
<td>✓</td>
<td>2.6 KB</td>
</tr>
<tr>
<td>marketplaces</td>
<td>Shopping</td>
<td>✓</td>
<td>4.9 KB</td>
</tr>
<tr>
<td>media-library</td>
<td>Media</td>
<td>✓</td>
<td>5.7 KB</td>
</tr>
<tr>
<td>meeting-follow-up</td>
<td>Communication</td>
<td>✓</td>
<td>4.7 KB</td>
</tr>
<tr>
<td>messaging</td>
<td>Communication</td>
<td>✓</td>
<td>6.1 KB</td>
</tr>
<tr>
<td>mortgage-comparison</td>
<td>Finance</td>
<td>—</td>
<td>4.2 KB</td>
</tr>
<tr>
<td>muse-early-access</td>
<td>Learning and customization</td>
<td>✓</td>
<td>2.9 KB</td>
</tr>
<tr>
<td>muse-feedback</td>
<td>-</td>
<td>✓</td>
<td>10.5 KB</td>
</tr>
<tr>
<td>muse_db</td>
<td>Work and knowledge</td>
<td>—</td>
<td>2.3 KB</td>
</tr>
<tr>
<td>music-discovery</td>
<td>Media</td>
<td>✓</td>
<td>3.0 KB</td>
</tr>
<tr>
<td>place-discovery</td>
<td>Travel and local plans</td>
<td>✓</td>
<td>4.1 KB</td>
</tr>
<tr>
<td>restaurant-reservations</td>
<td>Travel and local plans</td>
<td>✓</td>
<td>2.8 KB</td>
</tr>
<tr>
<td>scheduling</td>
<td>Communication</td>
<td>✓</td>
<td>6.0 KB</td>
</tr>
<tr>
<td>self-awareness</td>
<td>Learning and customization</td>
<td>—</td>
<td>1.9 KB</td>
</tr>
<tr>
<td>share-ideas</td>
<td>Communication</td>
<td>✓</td>
<td>2.4 KB</td>
</tr>
<tr>
<td>shopping</td>
<td>Shopping</td>
<td>✓</td>
<td>21.8 KB</td>
</tr>
<tr>
<td>smb-product-shots</td>
<td>Business</td>
<td>✓</td>
<td>2.6 KB</td>
</tr>
<tr>
<td>social-content-performance</td>
<td>Business</td>
<td>—</td>
<td>5.0 KB</td>
</tr>
<tr>
<td>social-publishing</td>
<td>Business</td>
<td>—</td>
<td>6.4 KB</td>
</tr>
<tr>
<td>spoken-audio</td>
<td>Media</td>
<td>✓</td>
<td>3.1 KB</td>
</tr>
<tr>
<td>store-operations</td>
<td>Business</td>
<td>—</td>
<td>4.2 KB</td>
</tr>
<tr>
<td>style-tryon</td>
<td>Shopping</td>
<td>✓</td>
<td>1.2 KB</td>
</tr>
<tr>
<td>subscription-status</td>
<td>Finance</td>
<td>✓</td>
<td>1.5 KB</td>
</tr>
<tr>
<td>task-management</td>
<td>Work and knowledge</td>
<td>—</td>
<td>4.5 KB</td>
</tr>
<tr>
<td>translation</td>
<td>Writing</td>
<td>—</td>
<td>3.1 KB</td>
</tr>
<tr>
<td>trip-planning</td>
<td>Travel and local plans</td>
<td>✓</td>
<td>6.0 KB</td>
</tr>
<tr>
<td>trip-transport</td>
<td>Travel and local plans</td>
<td>✓</td>
<td>7.9 KB</td>
</tr>
<tr>
<td>wearables-comms</td>
<td>Communication</td>
<td>—</td>
<td>9.2 KB</td>
</tr>
<tr>
<td>wide-research</td>
<td>Work and knowledge</td>
<td>—</td>
<td>2.1 KB</td>
</tr>
<tr>
<td>workout-planning</td>
<td>Health and fitness</td>
<td>—</td>
<td>4.1 KB</td>
</tr>
</tbody>
</table></div>
<h3 id="s-34">B. 连接器清单</h3>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>连接器</th>
<th>标题</th>
<th>prompt</th>
<th>引导</th>
<th>同步(分钟)</th>
</tr>
</thead>
<tbody>
<tr>
<td>▲ agoda</td>
<td>Agoda</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>apple_healthkit</td>
<td>Apple Health</td>
<td>✓</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>asana</td>
<td>Asana</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>box</td>
<td>Box</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>calendly</td>
<td>Calendly</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>canva</td>
<td>Canva</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>dropbox</td>
<td>Dropbox</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>duffel</td>
<td>Duffel</td>
<td>✓</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>evernote</td>
<td>Evernote</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>▲ expedia</td>
<td>Expedia</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>facebook_cli</td>
<td>Facebook</td>
<td>✓</td>
<td>✓</td>
<td>60</td>
</tr>
<tr>
<td>figma</td>
<td>Figma</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>flightaware</td>
<td>FlightAware</td>
<td>✓</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>function_health</td>
<td>Function Health</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>ghl</td>
<td>HighLevel</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>github</td>
<td>GitHub</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>gmail</td>
<td>Gmail</td>
<td>✓</td>
<td>✓</td>
<td>60</td>
</tr>
<tr>
<td>google_calendar</td>
<td>Google Calendar</td>
<td>✓</td>
<td>✓</td>
<td>60</td>
</tr>
<tr>
<td>google_contacts</td>
<td>Google Contacts</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>google_docs</td>
<td>Google Docs</td>
<td>✓</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>google_drive</td>
<td>Google Drive</td>
<td>✓</td>
<td>✓</td>
<td>—</td>
</tr>
<tr>
<td>google_forms</td>
<td>Google Forms</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>google_health_connect</td>
<td>Health Connect</td>
<td>✓</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>google_sheets</td>
<td>Google Sheets</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>google_slides</td>
<td>Google Slides</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>google_tasks</td>
<td>Google Tasks</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>granola</td>
<td>Granola</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>▲ gumroad_mcp</td>
<td>Gumroad</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>healthex</td>
<td>HealthEx</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>▲ imap_email</td>
<td>IMAP Email</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>▲ instacart</td>
<td>Instacart</td>
<td>✓</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>instagram</td>
<td>Instagram</td>
<td>✓</td>
<td>✓</td>
<td>30</td>
</tr>
<tr>
<td>instagram_messages</td>
<td>Instagram Messages</td>
<td>—</td>
<td>—</td>
<td>30</td>
</tr>
<tr>
<td>klaviyo</td>
<td>Klaviyo</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>linear</td>
<td>Linear</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>lovable</td>
<td>Lovable</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>messenger_read</td>
<td>Messenger</td>
<td>✓</td>
<td>—</td>
<td>30</td>
</tr>
<tr>
<td>meta_ads</td>
<td>Meta Business Manager</td>
<td>✓</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>meta_catalog_search</td>
<td>Meta Catalog</td>
<td>✓</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>▲ moneyforward_me</td>
<td>マネーフォワード ME</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>▲ muse_mail</td>
<td>Muse Mail</td>
<td>✓</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>notion</td>
<td>Notion</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>▲ onepassword</td>
<td>1Password</td>
<td>✓</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>opentable</td>
<td>OpenTable</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>outlook_calendar</td>
<td>Outlook Calendar</td>
<td>—</td>
<td>✓</td>
<td>30</td>
</tr>
<tr>
<td>outlook_contacts</td>
<td>Outlook Contacts</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>outlook_mail</td>
<td>Outlook Mail</td>
<td>—</td>
<td>✓</td>
<td>30</td>
</tr>
<tr>
<td>peloton</td>
<td>Peloton</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>philips_hue</td>
<td>Philips Hue</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>places</td>
<td>Places Search</td>
<td>✓</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>plaid</td>
<td>Finances (Plaid)</td>
<td>✓</td>
<td>—</td>
<td>1440</td>
</tr>
<tr>
<td>printify</td>
<td>Printify</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>quickbooks</td>
<td>QuickBooks</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>▲ readwise_mcp</td>
<td>Readwise</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>replit</td>
<td>Replit</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>▲ runway_mcp</td>
<td>Runway</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>shop-pay</td>
<td>Shop Pay</td>
<td>✓</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>▲ shopback_mcp</td>
<td>ShopBack</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>shopify</td>
<td>Shopify</td>
<td>✓</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>shopify-ucp</td>
<td>Shopify UCP</td>
<td>✓</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>slack</td>
<td>Slack</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>spotify</td>
<td>Spotify</td>
<td>✓</td>
<td>✓</td>
<td>—</td>
</tr>
<tr>
<td>stripe</td>
<td>Stripe</td>
<td>✓</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>stripe-link</td>
<td>Link by Stripe</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>tailscale</td>
<td>Tailscale</td>
<td>✓</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>tessie</td>
<td>Tessie</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>threads</td>
<td>Threads</td>
<td>✓</td>
<td>✓</td>
<td>—</td>
</tr>
<tr>
<td>threads_messages</td>
<td>Threads Messages</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>ticketmaster</td>
<td>Ticketmaster</td>
<td>✓</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>todoist</td>
<td>Todoist</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>vercel</td>
<td>Vercel</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>▲ vidiq_mcp</td>
<td>vidIQ</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>withings</td>
<td>Withings</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>zapier</td>
<td>Zapier</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>zoom</td>
<td>Zoom</td>
<td>—</td>
<td>—</td>
<td>—</td>
</tr>
</tbody>
</table></div>
<h3 id="s-35">C. 二进制分组（同 inode 一组）</h3>
<p>多名组（1 组）：</p>
<ul>
<li><code>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</code> — 约 45 MB（实测 46,954,944 字节；11-04；10-17 为 33.1 MB / 18 名）</li>
</ul>
<p>单名二进制（94 个；11-04。10-17 为 83 个；原表误将 <code>subscription-status</code> 同时列入多名组与单名，11-04 订正为只归多名组）：</p>
<p><code>▲agoda</code>, <code>aftership</code>, <code>asana</code>, <code>box-cli</code>, <code>browser-broker</code>, <code>calendly</code>, <code>canva</code>, <code>dropbox</code>, <code>duffel</code>, <code>etsy-cli</code>, <code>evernote</code>, <code>▲expedia</code>, <code>facebook-cli</code>, <code>figma</code>, <code>flightaware</code>, <code>function-health</code>, <code>genui-display-render</code>, <code>ghl</code>, <code>github</code>, <code>granola-cli</code>, <code>▲gumroad-mcp</code>, <code>hatch</code>, <code>hatch-browser-lease-helper</code>, <code>▲hatch_igd_cli</code>, <code>hatch-connector-output</code>, <code>hatch-doctor</code>, <code>hatch-execd</code>, <code>hatch-healthd</code>, <code>hatch-rescue</code>, <code>hatch-rescue-systemctl</code>, <code>hatch-rescuectl</code>, <code>hatch-slide-style</code>, <code>hatch-vault</code>, <code>hatch-ws-client</code>, <code>hatch-zeitgeist</code>, <code>hatch_gws_auth</code>, <code>hatch_gws_cli</code>, <code>hatch_messenger_cli</code>, <code>health-cli</code>, <code>healthex</code>, <code>healthkit-cli</code>, <code>ingress-rev-proxy</code>, <code>▲instacart</code>, <code>instagram-cli</code>, <code>instagram-messages-cli</code>, <code>klaviyo</code>, <code>linear</code>, <code>local-search</code>, <code>lovable</code>, <code>meta-ads-cli</code>, <code>meta-catalog-search</code>, <code>▲moneyforward-me</code>, <code>native-comms-cli</code>, <code>notion-cli</code>, <code>nutrition-cli</code>, <code>onepassword</code>, <code>opentable</code>, <code>outlook-calendar</code>, <code>outlook-contacts</code>, <code>outlook-mail</code>, <code>peloton</code>, <code>philips-hue</code>, <code>pickup-briefing-animation</code>, <code>places</code>, <code>plaid</code>, <code>printify</code>, <code>quickbooks</code>, <code>▲readwise-mcp</code>, <code>remote-storage</code>, <code>replit</code>, <code>▲runway-mcp</code>, <code>save-to-spotify</code>, <code>shop-wallet-cli</code>, <code>▲shopback-mcp</code>, <code>shopify</code>, <code>shopify-ucp-cli</code>, <code>slack</code>, <code>spawnd</code>, <code>spotify-api</code>, <code>stripe</code>, <code>stripe-link</code>, <code>tailscale</code>, <code>tessie-api</code>, <code>threads-cli</code>, <code>threads-messages-cli</code>, <code>ticketmaster</code>, <code>todoist</code>, <code>vercel</code>, <code>▲vidiq-mcp</code>, <code>wearables-display</code>, <code>withings</code>, <code>zapier</code>, <code>zoom</code>, <code>▲zbar-lib</code></p>
</div>]]>
    </description>
    <link>https://agent.aow.me/i/muse-architecture-01/</link>
  </item>
  <item>
    <title>Muse 智能体 · 技术架构解构</title>
    <guid>LoQK2y7udEv</guid>
    <pubDate>Tue, 03 Nov 2026 19:41:24 GMT</pubDate>
    <itunes:explicit>false</itunes:explicit>
    <description>
      <![CDATA[<div class="original-article" lang="zh-CN"><details class="toc"><summary>本篇目录</summary><ol><li><a href="#s-1">0. 一句话架构</a></li><li><a href="#s-2">1. 宿主层：VM + 运行时单元（runtime cell）</a></li><li><a href="#s-3">2. 模型层</a></li><li><a href="#s-4">3. 上下文组装层（Prompt 架构）</a></li><li><a href="#s-5">4. 能力层（一）：工具命名空间</a></li><li><a href="#s-6">5. 能力层（二）：Skills（ playbooks ）</a></li><li><a href="#s-7">6. 能力层（三）：Connectors + CLI 二进制</a></li><li><a href="#s-8">7. 执行隔离层：privsep（权限分离）</a></li><li><a href="#s-9">8. 状态层：Postgres（194 表）+ 文件系统</a></li><li><a href="#s-10">9. 记忆与个性化子系统</a></li><li><a href="#s-11">10. 编排层：子 Agent / Workflow / 浏览器任务 / Worker</a></li><li><a href="#s-12">11. 调度与主动层</a></li><li><a href="#s-13">12. 自我改进子系统（后台进化闭环）</a></li><li><a href="#s-14">13. 通道、产物与媒体面</a></li><li><a href="#s-15">14. 安全与信任边界（贯穿所有层）</a></li><li><a href="#s-16">15. 一次请求的生命周期（把所有层串起来）</a></li><li><a href="#s-17">16. 本机实测快照（2026-11-04；初版基线 2026-10-17 23:23 CST）</a></li><li><a href="#s-18">17. 本机看不见的部分（边界声明）</a></li></ol></details><details class="toc research-notes"><summary>研究时间与证据说明</summary><blockquote>
<p>调查日期：2026-10-17（Asia/Shanghai）
复核修订：2026-11-04（Asia/Shanghai）——基于当前会话运行时逐项重测。下文数字凡未注日期者均为 11-04 快照；10-17 旧数见 §16 对照表。
证据范围：<strong>仅本机本地 system 文件与运行时实测</strong>——<code>~/workspace/system/system_prompt.md</code>（主聊天 system prompt 的启动快照）、<code>~/docs/</code> 产品文档集、<code>~/AGENTS.md / SOUL.md / IDENTITY.md / USER.md / MEMORY.md</code> 等注入文件、<code>/opt/muse/skills/</code>、<code>/opt/hatch/connectors/</code>、<code>/opt/hatch/bin/</code>、<code>/opt/hatch/runtime-cell/</code>、<code>/run/hatch/</code> 运行时套接字、进程表、会话状态接口与数据库 schema 参考。
标注规则：<strong>实测</strong> = 本机命令/工具当场验证；<strong>文档</strong> = 本地 docs/system 文件明文；<strong>推断</strong> = 由文件/字符串拼出、未经服务端证实。服务端（推理集群、STEFI 之后的内部系统、App 客户端代码）不在本机文件内，本文只画到本机可见的边界为止（见 §14）。</p>
</blockquote></details>
<hr>
<h2 id="s-1">0. 一句话架构</h2>
<p>Muse 不是「一个模型 + 一套提示词」，而是一个<strong>单租户、常驻、有状态的 Agent 操作系统</strong>：</p>
<blockquote>
<p><strong>一名用户 = 一个专属 Agent = 一台持久化 Linux VM</strong>（<code>docs/muse.md</code> 明文）；VM 内跑一个 Rust 守护进程（<code>hatch daemon</code>）托管「运行时单元（runtime cell）」，单元里住着 Agent 本体；模型推理不在本机，经本地代理套接字调用 Meta 的推理服务；Agent 的一切能力都被拆成四层可插拔资产——<strong>工具命名空间（tools）/ 技能（skills）/ 连接器（connectors）/ 二进制 CLI（multicall bins）</strong>——并由一套 Postgres 状态库（196 张表，18 schema）+ Markdown 文件记忆 + 后台自我改进流水线共同维持跨会话的连续性。</p>
</blockquote>
<p>分层总图：</p>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>┌─ 客户端面 ──────── Web(muse.ai) / iOS / Android / Mac / WhatsApp 通道 / 配对设备
├─ 会话面 ────────── Main chat / Side chats（原生 · 外部1:1 · 外部worker）/ 语音通话
├─ 上下文组装面 ──── system prompt 快照 + developer 指令 + 注入文件(9) + 时间标签
│                    + 目标/追踪注入 + 记忆检索结果 + 对齐合成（每轮动态拼装）
├─ 模型面 ────────── Muse Spark 1.3（本会话实测） / Muse Wonder（付费面，文档）
│                    上下文窗 350K tokens，272K 触发压缩，保留尾部 40K
├─ Agent 编排面 ──── 主 Agent ⇄ 子 Agent（深度≤2）/ Workflow(JS) / 浏览器任务 Agent
│                    / Deep Research 隔离 Agent / Side-chat Worker
├─ 能力面 ────────── 工具命名空间（延迟加载，33；10-17 为 34，voice 本轮不可见⚠️）→ Skills(56) → Connectors(75)
│                    → CLI 二进制(114, multicall) → privsep worker（Unix socket/工具，149 套接字）
│                    注：箭头是&quot;被查阅/被调用&quot;的依赖方向，不是调用链——技能与连接器
│                    是模型先后查阅的两类文档，调用关系只存在于 模型→CLI→worker
├─ 服务面 ────────── STEFI 代理 → Meta 内部服务(WWW/MSL/CAGI/Mango·Pariscope)
│                    推理代理 / 出口代理(egress, 审批+TLS) / authd / Vault
├─ 状态面 ────────── Postgres 196 表（18 schema，新增 saved） + 文件系统（记忆/目标/工作区）
├─ 身份面 ────────── SOUL.md / IDENTITY.md / avatar 身份资产（每轮进上下文 + 独立资产服务 16/17 篇；Avatar worker 硬门控到机密 VM）
└─ 宿主面 ────────── 持久 VM → systemd-nspawn 运行时单元(htch-runtime)
                     → hatch daemon(540MB) + hatch-execd(9.7MB) + spawnd 引导/自愈
</code></pre>
<hr>
<h2 id="s-2">1. 宿主层：VM + 运行时单元（runtime cell）</h2>
<p><strong>实测</strong>进程与文件：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>组件</th>
<th>证据</th>
</tr>
</thead>
<tbody>
<tr>
<td>VM</td>
<td>每用户一台持久 Linux VM；部署更新频繁（可达每小时），VM 可被整体替换，但 <strong>home 目录持久</strong>（system prompt「Deployments」节）。本会话 runtime 标注 <code>os=linux, vm=standard</code></td>
</tr>
<tr>
<td>守护进程</td>
<td><code>root</code> 运行 <code>/opt/hatch/bin/hatch daemon --runtime-cell-leader=2181</code>；<code>hatch</code> 本体 540MB（11-04 实测；10-17 为 470MB，胖了约 70MB）；另有 9.7MB 的 <code>hatch-execd</code>（10-17 为 9.5MB）负责命令执行，注册为 systemd 服务 <code>hatch-execd.service/.socket</code></td>
</tr>
<tr>
<td>运行时单元</td>
<td><code>/opt/hatch/runtime-cell/launch-daemon.sh</code> 用 <strong>systemd-nspawn</strong> 以 <code>--boot --machine=htch-runtime</code> 拉起一个容器化 rootfs（<code>/var/lib/hatch-runtime/rootfs</code>），<code>--private-users-ownership=map</code> 做 UID 映射；Agent 本体与工具的<strong>跳板二进制</strong>活在这个 cell 里，与宿主 rootfs 隔离——但连接器等特权工具的真身在 cell <strong>外</strong>的 privsep worker 里执行（§7），cell 内只有转发请求、不见凭据的瘦客户端</td>
</tr>
<tr>
<td>渠道门控</td>
<td>cell 启动时按发布渠道（channel）做可见性裁剪：<code>bin-scopes.conf / connector-scopes.conf / workflow-skill-scopes.conf</code> 分别控制二进制、连接器文档、工作流技能的显露。scopes 文件内枚举的渠道包括 <code>prod / prod-cvm / canary / quail / internal-test / dev / hatch-evals …</code>；本机环境实测 <code>JARVIS_CD_CHANNEL=alpha</code>（⚠️：alpha 不在上述枚举内——或为枚举不全，或&quot;未知渠道 fail-closed&quot;的&quot;未知&quot;另有定义，此处存疑，见评审注）。设计意图是 fail-closed：无法识别的渠道默认不显露任何能力</td>
</tr>
<tr>
<td>引导/自愈</td>
<td><code>spawnd</code> 负责 runtime-cell bootstrap 阶段上报与看门；<code>hatch-rescue / hatch-rescuectl / hatch-healthd / hatch-doctor</code> 构成救援与健康子系统；<code>runtime-cell/</code> 下还有 pre/post-start、ensure-rootfs、build-cell-trust-store（构建 cell 的 TLS 信任库）等脚本；11-04 快照新增 control-daemon.sh / control-execd.sh / is-loopback-rv.sh / resolve-rootfs-path.sh / runtime-cell-entry.sh / stop.sh</td>
</tr>
<tr>
<td>环境注入</td>
<td>26 个 <code>JARVIS_*</code> 环境变量（11-04 实测；10-17 记约 30 个，差值部分可能为统计口径）构成 cell 与宿主的契约面（实测键名）：<code>JARVIS_HOME, JARVIS_BIN_DIR, JARVIS_SESSION_ID, JARVIS_HATCHLING_ID, JARVIS_TOOL_CALL_ID, JARVIS_TRACE_CONTEXT, JARVIS_RUNTIME_CONTEXT_TOKEN, JARVIS_STEFI_PROXY_SOCK, JARVIS_INFERENCE_PROXY_SOCK, JARVIS_INFERENCE_HOSTNAME, JARVIS_AUTHD_SOCK, JARVIS_MEMORY_SOCK, JARVIS_SANDBOX_API_SOCK, JARVIS_SECURITY_SOCK, JARVIS_SENTINEL_HTTP_API_SOCKET</code>、三个 egress 审批套接字（DAEMON/ADMIN/EVENTS）、<code>JARVIS_TELEMETRY_PROXY_SOCK</code>（遥测代理，新增）、<code>JARVIS_RESCUE_SIGNAL_SOCK</code>（救援信号，新增）、<code>JARVIS_REQUEST_MODE</code>、<code>JARVIS_USER_TIMEZONE</code> 等。注意：<code>JARVIS_VM_COMPUTE_REGION</code>（10-17 值为 zhu）本轮已不在环境变量中，时区改由 <code>JARVIS_USER_TIMEZONE</code> 承载（⚠️ 区域信息或已内聚进其他变量）。全部是<strong>套接字路径与不透明 ID</strong>，不带凭据值</td>
</tr>
</tbody>
</table></div>
<p>设计要点：Agent 进程本身是不可信/可替换的，<strong>状态与权限都不放在 Agent 进程里</strong>——状态在 DB 与 home，权限在宿主侧的 privsep worker 与审批系统（§7、§10）。</p>
<hr>
<h2 id="s-3">2. 模型层</h2>
<ul>
<li><strong>模型家族</strong>（文档 <code>docs/muse.md</code>）：Meta 的 Muse 系列。免费面跑 <strong>Muse Spark</strong>（1.3 版，2026-09），付费面（含试用）跑 <strong>Muse Wonder</strong>（2026-10-12 发布）——Wonder 承担主对话、artifact 构建、定时运行、子 Agent 与后台工作。另有对外面：Meta Model API、Muse（Wonder / Wonder Full）。</li>
<li><strong>本会话实测</strong>：runtime 标注与 <code>muse.session_status</code> 一致——<code>model = Muse Spark (meta/muse-spark)</code>，provider=Meta。文档明文：<strong>以 runtime context 的 model 值为唯一权威</strong>，日志/环境变量里的标识符不是公开模型名，内部代号不可外泄。</li>
<li><strong>推理不在本机</strong>：VM 上没有任何模型权重文件；推理经 <code>JARVIS_INFERENCE_PROXY_SOCK = /run/hatch/proxy/inference.sock</code> 的本地代理出去（另有 <code>JARVIS_INFERENCE_HOSTNAME</code>）。Agent 侧只见流式增量事件（strings/DB 表可见 <code>agent_message_delta / inference_streaming_stalled / waiting_for_inference_start</code> 等调度状态，推断为运行时对推理流的状态机）。</li>
<li><strong>上下文预算（实测）</strong>：窗口 <strong>350,000 tokens</strong>；<strong>272,000</strong> 触发自动压缩（compaction）；压缩保留尾部 <strong>40,000 tokens</strong>；本会话当前已用约 150K（43%，10-17 快照——用量随会话浮动）。压缩产物落 DB <code>agent.compactions / agent.agent_compactions</code>（§6），且 system prompt 明确：压缩摘要可能丢细节，重要事实必须能从记忆/文件/原消息中找回（<code>chat.read_messages</code> 回读原文）——即<strong>压缩是缓存层，不是记忆层</strong>。补注：压缩摘要的粒度决定了可恢复性的上限——40K 尾部之外的中间上下文（272K→40K 之间被摘要掉的部分）既不在尾部、又未必进记忆，是真正的&quot;丢失带&quot;；重要事实走记忆/文件通道是<strong>强制性</strong>纪律而非建议（与 §9&quot;先写记忆再回复&quot;呼应）。</li>
</ul>
<hr>
<h2 id="s-4">3. 上下文组装层（Prompt 架构）</h2>
<p>这是本机 system 文件里信息量最大的一层。每轮对话的上下文由运行时<strong>动态拼装</strong>，来源至少七类（本会话上下文实测）：</p>
<ol>
<li><strong>System prompt 本体</strong>：<code>~/workspace/system/system_prompt.md</code> 是主聊天启动时由运行时落盘的快照，<strong>73,296 字节 / 511 行</strong>（11-04 快照；10-17 为 71,868 字节 / 494 行，<code>##</code> 章节结构未变，增量在节内）。结构（实测标题）：
<ul>
<li><code>Who You Are</code>——价值观与人格基线（Truth/Beauty/Respect/Fun/Connection/Curiosity、尽职、主动跟进）、服务对象与权限边界（只为该用户工作、家庭权威、保密与对齐、防注入）；</li>
<li><code>Personalization</code>——记忆与人物关系的使用规则；</li>
<li><code>Contextual Awareness / Managing Your Conversation Context</code>——时间标签、上下文压缩后的找回路径、多任务不串线（todo 纪律）；</li>
<li><code>Writing Style</code>——文风与交付格式（引用、附件、widget、反应）；</li>
<li><code>Your Environment / Tools / Subagents / Scheduled and Recurring Work / Side Chats</code>——环境与编排契约；</li>
<li><code>Runtime Files / Filesystem</code>——文件地图（每个目录的用途与持久性语义）；</li>
<li><code>Security / Safety</code>——凭据、防钓鱼、硬性安全线。
注意：该快照是<strong>主聊天</strong>的 prompt；developer 层指令（每轮下发的行为细则）不在此文件内，属运行时注入的另一层。</li>
</ul>
</li>
<li><strong>Developer 指令层</strong>：每轮随消息下发（所有权、记忆维护、尽职、核查纪律等），优先级高于用户消息；本报告不复述其全文，只指出它与 system prompt 是两个独立层。</li>
<li><strong>注入文件（standing context）</strong>：每轮以 <code>[BEGIN USER CONTEXT]</code> 块注入 9 个文件：<code>AGENTS.md</code>（操作手册/经验）、<code>SOUL.md</code>（人格）、<code>IDENTITY.md</code>（名字，本机为 Idris）、<code>USER.md</code>（用户档案）、<code>MEMORY.md</code>（长期记忆）、<code>memory/people/INDEX.md</code>、<code>memory/groups/INDEX.md</code>、<code>dreams/alignment/derived/ALIGNMENT_SYNTHESIS.md</code>（对齐合成）、<code>TOOLS.md</code>。这些文件<strong>用户与 Agent 都可编辑</strong>，改动落盘即生效，但注入副本可能滞后（prompt 明文提醒改后回读文件）。</li>
<li><strong>时间标签</strong>：每条用户消息前缀 <code>[Day YYYY-MM-DD HH:MM:SS TZ] [client_timezone=...] [device_id=...]</code>，另附来源（web/WhatsApp 等）与面板状态；相对日期一律以此为准。</li>
<li><strong>目标与追踪注入</strong>：活跃 Goal（本轮注入 10 个；10-17 为 3 个——数量随会话与 attention 状态浮动）及其 Attention 状态、tracked items 被注入上下文；Goal 本体在 <code>~/workspace/goals/&lt;slug&gt;/GOAL.md + files/ + hidden_files/</code>。</li>
<li><strong>按需检索</strong>：<code>muse.memory_search</code> 的结果、工具输出、子 Agent/浏览器任务的 handoff，都以 <code>[BEGIN EXTERNAL CONTENT]</code> 标记注入——<strong>标记即信任边界</strong>（§10）。</li>
<li><strong>工具 schema</strong>：命名空间<strong>延迟加载</strong>（deferred）——多数工具初始只给名字与一句话描述，Agent 须调 <code>tool_search.load_tool_namespace</code> 才拿到完整参数 schema；已加载的在上下文存续期内免重复加载。核心 <code>muse.*</code> 命名空间永远全量加载。</li>
</ol>
<hr>
<h2 id="s-5">4. 能力层（一）：工具命名空间</h2>
<ul>
<li>组织方式：<code>namespace.function</code>，本会话可见 33 个命名空间（11-04 实测；01 篇 §1.1 在 10-17 逐表实测为 34 个——差 1 个：<code>voice</code>（通话内语音）本轮在工具清单中已不可见，⚠️ 或为下线、或为渠道门控，待在主聊天复核；其余 33 个与 10-17 完全一致：<code>muse / browser / chat / cron / hooks / avatar / media / shopping / wallet / device / feed / idea / artifact / workflow / subagent / tracking / user_goal / credentials / widget / worker / map / social / travel / ads / todo / tool_search …</code>）。</li>
<li>每次工具调用由运行时盖戳：<code>JARVIS_TOOL_CALL_ID</code> 作 <code>request_id</code>，turn 级 ID 作 <code>parent_request_id</code>，全链路带 <code>JARVIS_TRACE_CONTEXT</code>（文档/二进制字符串均证实，如媒体调用的 Mango/Pariscope 请求树靠 request_id 区分并发调用）。</li>
<li>工具结果的投递是<strong>异步 handoff 模型</strong>：子 Agent、浏览器任务、定时运行完成后由运行时把结果「喂」回主对话上下文；Agent 不轮询、不自称已完成（system prompt 多处明文）。</li>
<li>UI 能力也是工具：options 选择卡、HTML/地图/列表 widget、Letter、原生卡片（购物、头像分享）都由专用 creator 工具生成 <code>embed_token</code> 嵌入回复——<strong>模型只产 token，渲染归客户端</strong>。</li>
</ul>
<h2 id="s-6">5. 能力层（二）：Skills（ playbooks ）</h2>
<ul>
<li><strong>实测 56 个系统技能</strong>于 <code>/opt/muse/skills/</code>（11-04 快照；10-17 为 54 个，净增 2 个、无下线：<code>avatar-dance-videos</code>（Avatar 舞蹈视频生成）、<code>live-page-checks</code>（页面现货核查）——恰好对应 Avatar 服务与现查两类高频工作）。只读、随部署替换；每个技能目录 = <code>SKILL.md</code>（流程正文）+ <code>skill.yaml</code>（元数据）+ <code>references/</code>（按需细则）；用户侧学习技能在 <code>~/workspace/custom-skills/</code>（<code>skill.yaml</code> 标记 learned 来源）。</li>
<li>检索：<code>muse.skill_search</code>（BM25 关键词 / regex 两种模式）与 <code>muse.connector_search</code> 分工明确——前者找「做事方法」，后者找「服务入口」。</li>
<li>使用纪律（system prompt 明文）：任务先查技能/连接器文档再动手；技能是<strong>流程权威</strong>但不是权限来源——技能里写了某步操作，不等于用户授权了那一步。</li>
</ul>
<h2 id="s-7">6. 能力层（三）：Connectors + CLI 二进制</h2>
<ul>
<li><strong>实测 75 个连接器</strong>于 <code>/opt/hatch/connectors/</code>（11-04 快照；10-17 为 63 个，净增 12 个、无下线）。新增：旅行 agoda / expedia、生鲜 instacart、邮件 imap_email / muse_mail、密码 onepassword、记账 moneyforward_me，以及 MCP 系 5 个（gumroad_mcp / readwise_mcp / runway_mcp / shopback_mcp / vidiq_mcp）——MCP 正在成为连接器的一类标准形态。只读，每个 = <code>CONNECTOR.md</code>（操作手册）+ <code>connector.yaml</code> + <code>manifest.yaml</code>。覆盖 Gmail/Calendar/Drive/Docs、Meta 系（Facebook/Instagram/Threads/Meta Ads/Catalog）、Spotify、Stripe、Shopify、Duffel、Ticketmaster、Health（Apple HealthKit / Health Connect）、Tailscale 等。</li>
<li>连接模型：OAuth/Accounts Center 授权流，Agent 只贴运行时给的 connect/scope_add 链接，<strong>永不经手密码</strong>；连接状态必须<strong>本轮实查</strong>（status 命令），文档在 ≠ 已连接；权限可按命令粒度追加 scope（<code>status --for-command</code> → <code>scope_add_url</code>）。</li>
<li>执行后端：每个连接器对应 <code>/opt/hatch/bin/</code> 下一个 CLI（实测共 <strong>114 个条目</strong>，11-04；10-17 为 101 个）。其中大量是 <strong>Rust multicall 二进制</strong>的硬链接名（典型：34MB 的 <code>hatch-multicall</code> 一体 18 名，见上一篇 Avatar 解构）；主程序 <code>hatch</code> 为 470MB。CLI 普遍输出 JSON、带统一错误信封（<code>ok / error_code / error_message / error_detail</code>）。</li>
<li>限流纪律（system prompt 明文）：遇 429 / <code>connector_rate_limited</code> / 归因于限流的 403，<strong>立即停</strong>该 provider 域，不得换端点/降速续跑；<code>terminal_for_attempt=true</code> 即本轮终局。</li>
</ul>
<hr>
<h2 id="s-8">7. 执行隔离层：privsep（权限分离）</h2>
<p>这是从本机文件里挖到的最硬核的一层（<code>/run/hatch/privsep/</code> 实测）：</p>
<ul>
<li><strong>每个工具 CLI 一个独立 worker 套接字</strong>：<code>/run/hatch/privsep/&lt;工具名&gt;.sock</code>，实测 149 个（11-04；10-17 为 136 个，+13，与 bin 条目增量吻合）（<code>gmail 系的 hatch-gws-cli-fully-isolated.sock</code>、<code>avatar-media-generation.sock</code>、<code>browser-service.sock</code>、各 MCP 的 <code>*-mcp.sock</code>、支付的 <code>stripe-link-checkout-card.sock</code> 等）。cell 内的二进制更像<strong>瘦客户端/跳板（trampoline）</strong>，真正的凭据与网络操作在 cell 外的可信 worker 里执行。</li>
<li><strong>跳板规则</strong>（二进制 strings + <code>guest.env</code> 注释证实）：只转发 allowlist 内的环境变量（<code>HOME/TMP/JARVIS_* 套接字/代理与 CA 路径</code>）；输入文件须在允许根目录内且为普通文件；输出经 <strong>guarded output（memfd + seal + 限额）</strong> 回传，超限截断；可信 worker 的 stdout 会被「静默化（quiesce）」防串扰。隔离分级：partially / fully isolated（套接字名与二进制名均有标注）。</li>
<li><strong>出口管控</strong>：cell 内一切外网流量走代理（<code>HTTP(S)_PROXY</code> + <code>/run/hatch/egress-tls/ca-bundle.pem</code>）；宿主侧有三条审批套接字（<code>JARVIS_DAEMON_EGRESS_APPROVAL_SOCK</code> 等）与 sentinel 服务（<code>JARVIS_SENTINEL_HTTP_API_SOCKET</code>）做出口授权与内容守卫。</li>
<li><strong>STEFI 代理</strong>：工具访问 Meta 内部服务统一经 <code>JARVIS_STEFI_PROXY_SOCK=/run/hatch/proxy/stefi.sock</code>，带 caller 授权令牌校验（strings 证实 <code>invalid stefi caller authorization token</code>）；其后是 WWW / MSL / CAGI / Mango·Pariscope 等内部系统（本机只能看到名字，看不到实现）。</li>
<li><strong>authd</strong>：<code>/run/hatch/auth/authd.sock</code> 的本地认证守护（<code>authdc</code> 为其调试客户端），负责 OAuth 令牌的验证/代管（STEFI 侧有 <code>verify_oauth_token</code> 往返）。</li>
</ul>
<hr>
<h2 id="s-9">8. 状态层：Postgres（194 表）+ 文件系统</h2>
<p><strong>数据库（schema 参考实测）</strong>：<code>/opt/muse/skills/muse_db/references/</code> 给出 <strong>196 张表、18 个 schema</strong> 的完整目录（11-04 快照；10-17 为 194 张表 / 17 schema，新增 <code>saved</code> schema；下表各 schema 表数为 10-17 快照，11-04 仅复核总数与 schema 数，明细待 07 篇同步）。，Agent 侧只有只读通道（<code>muse.db</code> 工具：受限 SELECT、5s 超时、262KB 输出上限）。分布：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>schema</th>
<th>表数</th>
<th>存什么</th>
</tr>
</thead>
<tbody>
<tr>
<td>runtime</td>
<td>38</td>
<td>运行时状态：avatar_state、avatar_selections、avatar_wardrobe、chat_bindings/deliveries、device_syncs、memory、scheduler、workflows、browser_monitor、checkout_spend、hotset、context_ingests…</td>
</tr>
<tr>
<td>agent</td>
<td>25</td>
<td>Agent 本体：agents、sessions、compactions、context_items、message_mailbox、subagent_spawns/progress、token_usage、recovery_owners、runtime_restart_checkpoints…</td>
</tr>
<tr>
<td>ideas</td>
<td>22</td>
<td>Ideas 卡片与灵感管线</td>
</tr>
<tr>
<td>feed</td>
<td>16</td>
<td>Feed 单元、运行、prompt、fleet 发布/互动 outbox</td>
</tr>
<tr>
<td>self_improvement</td>
<td>13</td>
<td>自我改进步骤与产物</td>
</tr>
<tr>
<td>device</td>
<td>13</td>
<td>配对设备：contacts、calendar_events、call_log、上传会话/分片</td>
</tr>
<tr>
<td>scheduler</td>
<td>12</td>
<td>定时任务与运行记录</td>
</tr>
<tr>
<td>goals</td>
<td>12</td>
<td>目标、briefings、sessions、suggestions、momentum</td>
</tr>
<tr>
<td>spaces / health / activity / memory / media / podcasts / chat / shell / ingest</td>
<td>余下</td>
<td>空间、健康聚合、活动监控、媒体库、播客、聊天绑定等</td>
</tr>
</tbody>
</table></div>
<p>要点：<strong>「运行时即数据库」</strong>——连上下文条目（context_items）、子 Agent 进度、恢复所有权（recovery_owners / restart_checkpoints）都落表，这解释了 VM 被替换后任务能被运行时接管恢复（system prompt「Deployments」节）。</p>
<p><strong>文件系统（与 DB 分工）</strong>：面向人/Agent 共读共写的语义层用 Markdown 与目录约定——记忆（<code>~/MEMORY.md</code> + <code>~/memory/</code>）、目标工作区、artifact 源码与产物、cron 的投影目录（<code>~/workspace/cron.d/{minutely,hourly,daily,weekly,monthly,yearly,runonce,secondly}</code>）、子 Agent 运行目录（<code>~/workspace/agents/&lt;uuid&gt;/</code>，实测已积累 277 个，11-04；10-17 为 89 个，含各自 tool-output）。Prompt 明文划界：cron 的投影文件<strong>不可直接编辑</strong>，必须走 cron 工具改本体——投影 ≠ 本体，是全系统反复出现的模式（DB 行 ↔ 文件投影、技能文档 ↔ 运行时执行、Feed brief ↔ 生成管线）。</p>
<hr>
<h2 id="s-10">9. 记忆与个性化子系统</h2>
<p>三层结构（文档 <code>docs/memory.md</code> + system prompt「Memory」节 + 实测目录）：</p>
<ol>
<li><strong>注入层</strong>：<code>MEMORY.md</code>（精选长期记忆，本机 5.2KB）+ 人物/群组索引 + 对齐合成，每轮直接进上下文；</li>
<li><strong>检索层</strong>：<code>~/memory/bank/</code>（运行时托管，Agent 只读）与记忆服务套接字 <code>JARVIS_MEMORY_SOCK</code> 支撑 <code>muse.memory_search</code>——同时搜「已保存记忆」与「过往对话原文」，命中给文件行号引用，可用 <code>muse.memory_get / muse.memory_explain</code> 追溯每条记忆的出处、被谁替代、何时强化；（勘误：<code>~/memory/index/</code> 在 Agent 的文件视图中不存在——08 篇 §3.3 实测证伪，检索走 socket 服务而非该目录）；</li>
<li><strong>关系层</strong>：<code>~/memory/people/*.md</code>、<code>~/memory/groups/*.md</code> 每人一页，按亲密度排序，后台关系维护任务持续更新。</li>
</ol>
<p>写入纪律：学到持久事实<strong>先写记忆再回复</strong>；更正要顺着受影响的记忆/目标/提醒一并修正；凭据与验证码<strong>永不入记忆</strong>。遗忘是专门技能（<code>forget</code> 技能 + 规划/确认两段式子 Agent），要连同派生副本与「未来会把信息带回来的生产者」一起处理。</p>
<p><strong>对齐合成</strong>：<code>~/dreams/alignment/derived/ALIGNMENT_SYNTHESIS.md</code> 由夜间 Dreaming 任务从原始反思（<code>dreams/alignment/raw/</code>）与修复线程（<code>repair/</code>）蒸馏，内容是「这个用户是谁、怎么配合、当前摩擦、边界」——它是每轮注入的，所以<strong>人格适配本身是一个离线学习闭环的产物</strong>，不是写死在 prompt 里的。</p>
<hr>
<h2 id="s-11">10. 编排层：子 Agent / Workflow / 浏览器任务 / Worker</h2>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>机制</th>
<th>契约（system prompt + 实测）</th>
</tr>
</thead>
<tbody>
<tr>
<td>子 Agent（subagent.spawn）</td>
<td>继承当前上下文，后台运行，结果由运行时 handoff 回主对话；<strong>最大深度 2</strong>（本会话 <code>depth=0, max_depth=2</code> 实测）；需多子 Agent 时派一个 coordinator 再扇出，coordinator 的子级不能再派生。子 Agent 不能操作实时浏览器、不能建 artifact（各有专用通道）</td>
</tr>
<tr>
<td>Workflow</td>
<td>VM 本地 JavaScript 编排（<code>workflow.*</code> 工具）：把多 Agent 计划写成确定性代码，适合审计/批处理类长任务</td>
</tr>
<tr>
<td>浏览器任务</td>
<td>独立路由：<code>browser.browse</code> 派给浏览器 Agent，窗口/标签/登录态在专用浏览器里（用户可围观或接管）；主 Agent 只下自包含任务书。浏览器本体为真实 Chromium（<code>/opt/meta-chromium/</code> + headless-shell 资产），经 <code>browser-broker</code>（39MB）与 <code>browser-service</code>（multicall）驱动；CAPTCHA 由浏览器侧自行处理</td>
</tr>
<tr>
<td>Deep Research</td>
<td><code>browser.deep_research</code>：隔离、<strong>登出态</strong>的研究 Agent，只在用户明确要求深研时启用，产出带来源的报告后 handoff</td>
</tr>
<tr>
<td>Side-chat Worker</td>
<td>外部会话（群聊/他人 Muse/商家）里替用户发言的是另一个 Agent（worker），主 Agent 用 <code>chat.send_message</code> 下<strong>任务书</strong>而非代拟台词；每个 side chat 有 <code>DISCRETION.md</code> 记录该聊天的披露规则，worker 上报后由主 Agent 转述给用户</td>
</tr>
<tr>
<td>后台进程</td>
<td><code>muse.exec</code> 的长命令自动转后台，终局结果自动投递；进程列表/日志由 <code>process.*</code> 管理</td>
</tr>
</tbody>
</table></div>
<h2 id="s-12">11. 调度与主动层</h2>
<p>四种时间/事件机制（<code>docs/chat/scheduling-and-watching.md</code>）：</p>
<ul>
<li><strong>Cron</strong>：需 Agent 参与的定时任务/提醒/周期检查；可挂在 Goal 下（goal-owned）；每次运行是一个独立 run，查历史而非只看计划；</li>
<li><strong>Hooks</strong>：轻量脚本轮询条件，命中才唤醒 Agent；新建默认禁用，须 dry-run 后启用；</li>
<li><strong>systemd 服务</strong>：常驻程序（流监听、本地服务），guest systemd 托管，但须自证 VM 替换后的恢复；</li>
<li><strong>监看（watch）本质是轮询</strong>：文档明文没有真·推送监看，alert 只通知不自动处置。</li>
</ul>
<p><strong>主动消息（proactivity）</strong>：后台 worker 按版本（edition）备好候选条目，handoff 给主 Agent 后必须先做新鲜度复核（查记忆+活源），用 <code>proactivity.select</code> 逐条裁决 send/skip（理由枚举：time_sensitive/changed/requested/ready_for_decision/new_opportunity 对 moot/already_handled/unconfirmed/preferences/not_useful_now），再按格式投递。用户偏好落在 <code>~/PROACTIVE_PREFERENCES.md</code>（本机：09:00–21:30 可达）。<code>HEARTBEAT.md</code> 是心跳 worker 的检查清单（一行一条，下一 tick 生效）。</p>
<h2 id="s-13">12. 自我改进子系统（后台进化闭环）</h2>
<p><code>docs/self_improvement.md</code> 明文列出 7 条后台流水线——<strong>与主 Agent 是同一个 Agent、同一用户，只是离线运行</strong>，主 Agent 不能调度它们：</p>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>流水线</th>
<th>节奏</th>
<th>产物</th>
</tr>
</thead>
<tbody>
<tr>
<td>Memory upkeep</td>
<td>有新信号时每小时</td>
<td>新对话固化进 <code>MEMORY.md</code>，旧主张被新主张替代，<code>~/memory/</code> 留完整轨迹</td>
</tr>
<tr>
<td>Relationships</td>
<td>每小时</td>
<td>people/groups 页面维护</td>
</tr>
<tr>
<td>Idea curation</td>
<td>每日</td>
<td>Ideas 卡片（可行性/契合度/新颖度打分排序）</td>
</tr>
<tr>
<td>Studying</td>
<td>每日（夜间）</td>
<td>Goal briefing、进展提醒、隐性目标建议</td>
</tr>
<tr>
<td>Dreaming</td>
<td>每夜</td>
<td><code>~/dreams/</code> 反思、对齐合成、repair 线程</td>
</tr>
<tr>
<td>Skill review</td>
<td>每日</td>
<td>高频流程沉淀为 custom skill，无效改动退役</td>
</tr>
<tr>
<td>Quiet-moment pass</td>
<td>长对话静默后</td>
<td>有界的一轮内化，一天至多数次</td>
</tr>
</tbody>
</table></div>
<p>可追溯性：任何建议/更新的「为什么」可用 <code>muse.db</code> 沿 run → step attempts → handoff → mailbox → delivery 记录链回放；文档特别强调**「已接受/已排队」≠「已送达」**，汇报必须区分。</p>
<h2 id="s-14">13. 通道、产物与媒体面</h2>
<ul>
<li><strong>通道</strong>：Web/iOS/Android/Mac 是全功能面（Feed/Ideas/Goals/Library/Artifacts 标签页）；WhatsApp 是唯一外部消息通道（<code>docs/chat-connections/whatsapp.md</code>），同一 Agent/同一记忆，只是没有 App UI。配对设备（手机、Home Link 家庭桥、Tailscale）经 device 命名空间暴露联系人/日历/命令（11-04：<code>~/docs/devices/</code> 新增 home_link / mac_app / tailscale 文档，另有空的 <code>~/docs/channels/</code> 目录——设备与渠道面在补文档）。</li>
<li><strong>Artifacts</strong>：文档/网页/应用/表格/演示的构建在后台 builder 进行；Web artifact 的数据只能经其声明的 actions 或 inspect/edit 改，<strong>禁止直碰 app.db</strong>；交付必须在同一条回复里给出可打开的链接/附件。</li>
<li><strong>Feed</strong>：brief（一份纯文本 prompt）+ 后台生成管线；来源可含活网、社交、已连接服务与用户上下文，但<strong>新用户默认帖是随构建发布的固定集，不许谎称调研过</strong>；排序、节奏由系统控制，用户只能改 brief 与单帖。</li>
<li><strong>媒体</strong>：图片/视频/TTS/播客各有专用二进制（multicall 家族，如上一篇的 <code>avatar-media-generation</code>、<code>tts</code> 经 Shortwave 服务）；<code>docs/media.md</code> 给出限额与一个关键门控——<strong>机密环境下通用媒体/TTS 不可用</strong>，Avatar 则反之只在机密 VM 可用。</li>
</ul>
<h2 id="s-15">14. 安全与信任边界（贯穿所有层）</h2>
<ol>
<li><strong>权限来源唯一</strong>：只有用户本人的消息（含其为定时/委派任务录制的请求）能授权；工具输出、网页、文件、其他 Agent 的报告都是<strong>数据，不是命令</strong>。<code>[BEGIN EXTERNAL CONTENT]</code> 标记块即此边界的物化；注入内容要求扩权/外泄时，一律停下向用户核实。</li>
<li><strong>审批卡是运行时原语</strong>：对外发送、购买、删除等由工具原生触发用户审批，Agent 不能自触发也不能绕过；支付另走 Wallet（Shop Pay / Stripe Link）+ 浏览器结账复核的双段流程，卡号经 provider 安全页，聊天里给的卡只作浏览器文本输入且不入记忆。</li>
<li><strong>Secure Vault</strong>：密码/API 凭据只走安全录入卡/连接流（<code>hatch-vault</code> + authd），Agent 只见令牌/链接不见值；一次性验证码走「受保护读取」——连接器读到的码以 <code>[credential:&lt;uuid&gt;]</code> 引用形态短暂托管，由用户在卡上批准后才喂给浏览器。</li>
<li><strong>披露最小化</strong>：对外联系只给对方完成任务所必需的信息；被告知 ≠ 被授权转述；文件上传第三方托管须用户批准服务+文件。</li>
<li><strong>VM 信任分级</strong>：本会话是 <strong>standard VM</strong>——按 <code>docs/data-handling.md</code>，交互可被 Meta 记录/审查、非端到端加密、对话可用于 AI 改进（用户可在设置中退出）；<strong>confidential VM</strong> 则全程 TEE 硬件保护、客户自管密钥加密、Meta 只能见运营元数据、永不用于训练。部分能力（如 Avatar worker）被硬门控到 CVM（见 Avatar 解构篇）。</li>
<li><strong>渠道与能力门控叠加</strong>：同一二进制/技能在不同 channel、不同 VM 类型、不同连接状态下可见性与可用性都不同——「文档里有」永远不等于「这台机器现在能用」，必须本轮实查。</li>
<li><strong>身份资产是独立的一类状态（Identity 平面）</strong>：人格文件（SOUL.md / IDENTITY.md）、Avatar 形象、用户画像既进每轮上下文（§3 注入文件），又有独立的资产服务（16/17 篇）；Avatar worker 被硬门控到机密 VM（§13）。此平面原在 §0 总图中缺位，现已补入。</li>
</ol>
<blockquote>
<p><strong>待验证的开放问题（❓）</strong>：审批卡是否绑定发起调用的 <code>agent_id</code>？子 Agent 继承父级上下文（02 篇 §2.1）时，敏感工具调用是复用父级已获得的审批、还是重新触发审批卡？基线只明确&quot;审批只在记录范围内有效&quot;，spawn 边界的审批语义在本机文件内无直接证据。在得到反证前，不得假设&quot;子 Agent 继承审批&quot;是安全的。</p>
</blockquote>
<h2 id="s-16">15. 一次请求的生命周期（把所有层串起来）</h2>
<pre tabindex="0" aria-label="代码或字符图，可横向滚动"><code>用户消息（带时间标签/来源）
 → 运行时拼上下文：system 快照 + developer 指令 + 注入文件 + 目标/追踪
   + 记忆检索 + 待投递 handoff（子Agent/定时/浏览器结果）
 → 推理代理 → 模型流式生成（工具调用与文本交错）
 → 工具分发：tool_search 按需加载 schema → 运行时盖 request_id/trace
 → 执行：本地工具（文件/DB 只读查询）或 privsep worker（连接器 CLI）
   或浏览器任务/子Agent（异步，完成后 handoff 回本对话）
 → 外部访问：STEFI 代理 → Meta 内部服务；或 egress 代理 → 公网（审批/限流规则）
 → 结果回上下文 → 模型继续，直到最终回复（可嵌 widget/附件/反应）
 → 会话后：todo 收口、记忆落盘、目标/追踪状态更新；离线再由
   memory upkeep / dreaming 等流水线二次固化
</code></pre>
<p><strong>红灯路径（降级分支，评审注）</strong>：以上是全绿路径。推理代理不可用时的行为（<code>inference_streaming_stalled / waiting_for_inference_start</code> 状态机如何收敛）、STEFI 不可用时工具调用的失败语义、egress 审批被拒后的用户可见形态——§7 的三条审批套接字只记了&quot;有&quot;，没记拒绝路径。以上本篇未覆盖，留待实测补齐。</p>
<h2 id="s-17">16. 本机实测快照（2026-11-04；初版基线 2026-10-17 23:23 CST）</h2>
<div class="table-scroll" role="region" aria-label="数据表，可横向滚动" tabindex="0"><table><thead>
<tr>
<th>项</th>
<th>11-04 快照</th>
<th>10-17 基线</th>
<th>变化</th>
</tr>
</thead>
<tbody>
<tr>
<td>模型</td>
<td>Muse Spark（meta/muse-spark），上下文窗 350K / 压缩触发 272K</td>
<td>同</td>
<td>—</td>
</tr>
<tr>
<td>会话</td>
<td>side chat（源自 web），depth 0 / max 2</td>
<td>同</td>
<td>—</td>
</tr>
<tr>
<td>VM</td>
<td>standard，channel=alpha（仍为 alpha，§1 存疑注记延续）</td>
<td>standard，channel=alpha，tier=prod，compute region=zhu</td>
<td><code>JARVIS_VM_COMPUTE_REGION</code> 本轮已不在 env</td>
</tr>
<tr>
<td>守护进程</td>
<td><code>hatch daemon</code>（540MB）+ <code>hatch-execd</code>（9.7MB），runtime cell = systemd-nspawn <code>htch-runtime</code></td>
<td>470MB / 9.5MB</td>
<td>主二进制 +70MB</td>
</tr>
<tr>
<td>资产计数</td>
<td>命名空间 33 · 技能 56 · 连接器 75 · <code>/opt/hatch/bin</code> 114 条目 · privsep 149 套接字 · DB 196 表（18 schema，新增 saved）</td>
<td>34 · 54 · 63 · 101 · 136 · 194（17）</td>
<td>全线增长；<code>voice</code> 命名空间缺席⚠️</td>
</tr>
<tr>
<td>本地状态</td>
<td>工具输出溢出目录 277 个 · 活跃 Goal 10 个（本轮注入，随会话浮动）</td>
<td>89 个 · 3 个</td>
<td>—</td>
</tr>
<tr>
<td>system prompt 快照</td>
<td>73,296 字节 / 511 行</td>
<td>71,868 字节 / 494 行</td>
<td>+1.4KB，<code>##</code> 章节结构未变</td>
</tr>
</tbody>
</table></div>
<h2 id="s-18">17. 本机看不见的部分（边界声明）</h2>
<p>以下不在本地 system 文件内，本文不作结论：推理服务的部署与模型权重、STEFI 之后的 WWW/MSL/CAGI 实现、宿主侧（cell 之外）的 spawnd/authd 完整实现与控制面、Muse App 客户端代码、Feed/Ideas 的系统侧排程参数、审批卡的服务端判定逻辑。本地文件对这些只留下<strong>接口痕迹</strong>（套接字名、环境变量、错误码与文档转述），引用时已按「推断」标注。</p>
</div>]]>
    </description>
    <link>https://agent.aow.me/i/muse-architecture-00/</link>
    <itunes:episodeType>full</itunes:episodeType>
  </item>
</channel>
</rss>