<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>防护机制 on Agent-Mesh 技术博客</title>
    <link>https://ggrryta.github.io/agent-mesh/zh/tags/%E9%98%B2%E6%8A%A4%E6%9C%BA%E5%88%B6/</link>
    <description>Recent content in 防护机制 on Agent-Mesh 技术博客</description>
    <generator>Hugo</generator>
    <language>zh</language>
    <lastBuildDate>Wed, 20 May 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://ggrryta.github.io/agent-mesh/zh/tags/%E9%98%B2%E6%8A%A4%E6%9C%BA%E5%88%B6/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Agent Mesh 协作提效机制全景：从通信原语到知识积累</title>
      <link>https://ggrryta.github.io/agent-mesh/zh/posts/agent-collaboration-mechanisms/</link>
      <pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate>
      <guid>https://ggrryta.github.io/agent-mesh/zh/posts/agent-collaboration-mechanisms/</guid>
      <description>Agent Mesh 在 agent 协作上实现的完整机制体系——通信原语、质量控制、知识积累、防护机制、计划恢复，以及如何利用 Claude SDK 的原生能力。</description>
      <content:encoded><![CDATA[<h2 id="引言">引言</h2>
<p>多 Agent 协作不只是&quot;能互相发消息&quot;——从消息送达到高质量协作，中间有大量的工程问题需要解决：怎么确保 agent 理解了任务？怎么验证执行结果？怎么防止失控循环？怎么积累经验？</p>
<p>本文记录 Agent Mesh 当前实现的完整协作机制体系。这些机制不是一次性设计出来的，而是在实际运行中逐步发现问题、逐步补充的。</p>
<hr>
<h2 id="一通信原语">一、通信原语</h2>
<p>Agent 之间的通信有五种模式，覆盖从简单查询到多人协作的所有场景：</p>
<table>
  <thead>
      <tr>
          <th>原语</th>
          <th>工具</th>
          <th>行为</th>
          <th>场景</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>P2P 对话</td>
          <td><code>mesh_send_message</code></td>
          <td>发消息，不等回复</td>
          <td>首次联系、通知</td>
      </tr>
      <tr>
          <td>多轮对话</td>
          <td><code>mesh_send_message(task_id=...)</code></td>
          <td>在已有 task 里追加消息</td>
          <td>继续之前的讨论</td>
      </tr>
      <tr>
          <td>委派等回复</td>
          <td><code>mesh_broadcast</code></td>
          <td>发给多人，自动收集汇总</td>
          <td>需要多方意见</td>
      </tr>
      <tr>
          <td>群组通知</td>
          <td><code>mesh_notify_group</code></td>
          <td>广播给群组，不期望回复</td>
          <td>状态更新、进度通报</td>
      </tr>
      <tr>
          <td>回复</td>
          <td><code>mesh_reply</code></td>
          <td>回复当前 task 的对方</td>
          <td>所有回复场景</td>
      </tr>
  </tbody>
</table>
<p>设计原则：<strong>mesh_reply 用于回复，mesh_send_message 用于发起，mesh_broadcast 用于协调</strong>。三者职责清晰，不混用。</p>
<hr>
<h2 id="二协作质量控制">二、协作质量控制</h2>
<h3 id="复杂度评估">复杂度评估</h3>
<p>每条消息有一个复杂度标签（low/medium/high），驱动后续所有质量机制：</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1">1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2">2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3">3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4">4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5">5</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>发送方显式指定：mesh_send_message(..., complexity=&#34;high&#34;)
</span></span><span style="display:flex;"><span>未指定时自动推断：
</span></span><span style="display:flex;"><span>  - 包含&#34;重构/架构/设计/迁移&#34; → high
</span></span><span style="display:flex;"><span>  - 文本 &gt; 200 字或包含&#34;步骤/然后&#34; → medium
</span></span><span style="display:flex;"><span>  - 其他 → low
</span></span></code></pre></td></tr></table>
</div>
</div><p>复杂度同时决定三件事：</p>
<ul>
<li><strong>是否触发语义握手</strong>（medium/high 触发）</li>
<li><strong>推理深度</strong>（low=disabled thinking, high=adaptive thinking）</li>
<li><strong>验证要求</strong>（high 任务需要更严格的验证）</li>
</ul>
<h3 id="语义握手">语义握手</h3>
<p>防止&quot;理解偏差导致返工&quot;——执行前先对齐意图。</p>
<p><strong>第一层（agent 自主判断）</strong>：system prompt 教 agent 识别需要确认的信号：</p>
<ul>
<li>任务有歧义 → 先确认</li>
<li>多步骤 → 先确认方案</li>
<li>有隐含假设 → 列出假设让对方确认</li>
<li>简单明确 → 直接执行</li>
</ul>
<p><strong>第二层（runtime 强制注入）</strong>：complexity=medium/high 时，事件 prompt 里强制加入确认引导格式（范围/方法/假设/疑问）。</p>
<h3 id="行为标注">行为标注</h3>
<p>解决&quot;agent 说做完了，但真的验证过吗&quot;的信任问题。</p>
<p>三级标注，可信度递减：</p>
<ul>
<li><code>[独立验证 ✓]</code>：runtime 事后自己跑 stat/go build 确认了事实</li>
<li><code>[agent 已验证]</code>：PostToolUse hook 观察到 agent 调了验证工具且成功</li>
<li><code>[未验证]</code>：纯推理输出，无任何验证</li>
</ul>
<p>标注是 runtime 强制追加的——agent 无法删除或伪造。不问 agent &ldquo;你有多确定&rdquo;，而是观察它实际做了什么。</p>
<hr>
<h2 id="三agent-感知与发现">三、Agent 感知与发现</h2>
<h3 id="启动时自动注入">启动时自动注入</h3>
<p>agent 不需要主动查询就能知道队友是谁：</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-1">1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-2">2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-3">3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-4">4</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>System Prompt 自动包含：
</span></span><span style="display:flex;"><span>  你的队友：
</span></span><span style="display:flex;"><span>  - bob-coder@example：高级后端工程师，擅长 Go/TypeScript 编码、性能优化
</span></span><span style="display:flex;"><span>  需要了解详细能力时，调用 mesh_get_agent_card(agent_id)。
</span></span></code></pre></td></tr></table>
</div>
</div><p>数据来源：runtime 启动时从好友列表和群组 roster 拉取每个队友的 headline。</p>
<h3 id="按需深入了解">按需深入了解</h3>
<p><code>mesh_get_agent_card(agent_id)</code> 返回完整的 MeshAgentProfile：</p>
<ul>
<li>名称、角色描述</li>
<li>技能列表（含描述和标签）</li>
<li>当前状态</li>
</ul>
<p>精简摘要注入 prompt（不膨胀），完整档案按需拉取（需要时才占 context）。</p>
<hr>
<h2 id="四知识积累">四、知识积累</h2>
<h3 id="存储结构">存储结构</h3>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-2-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-1">1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-2-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-2">2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-2-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-3">3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-2-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-4">4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-2-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-5">5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-2-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-6">6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-2-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-7">7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-2-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-8">8</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>workspace/{agentID}/
</span></span><span style="display:flex;"><span>  ├── CLAUDE.md          ← 项目上下文（Claude Code 原生读取）
</span></span><span style="display:flex;"><span>  ├── notes/
</span></span><span style="display:flex;"><span>  │   ├── learnings.md   ← 发现的规律、成功的方法
</span></span><span style="display:flex;"><span>  │   ├── decisions.md   ← 做过的决策和理由
</span></span><span style="display:flex;"><span>  │   └── issues.md      ← 踩过的坑、已知问题
</span></span><span style="display:flex;"><span>  ├── *.plan.md          ← 任务计划（带 checkbox 进度）
</span></span><span style="display:flex;"><span>  └── .claude/           ← session 历史（跨重启保留）
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="写入机制三层触发">写入机制（三层触发）</h3>
<ol>
<li><strong>meshSystemGuide 引导</strong>：告诉 agent &ldquo;发现知识时追加到 notes/&rdquo;</li>
<li><strong>Stop hook</strong>：任务完成时提醒&quot;如果有新发现，记录下来&quot;</li>
<li><strong>PreCompact hook</strong>：context 压缩前提醒&quot;重要发现赶紧记下来&quot;</li>
</ol>
<p>agent 用原生的 Write/Bash 工具直接写文件，不需要专门的 mesh 工具。</p>
<h3 id="读取机制">读取机制</h3>
<ul>
<li>runtime 启动时读 notes/ 下所有 .md 文件 → 摘要注入 system prompt</li>
<li>CLAUDE.md 由 Claude Code 原生读取（不占 system prompt 空间）</li>
<li>.claude/ session 通过 <code>continue: true</code> 自动恢复对话历史</li>
</ul>
<h3 id="设计决策">设计决策</h3>
<p>为什么不用 Gateway 存储？因为个人知识是 agent 本地的——存在 agent 跑的那台机器上。如果未来需要跨机器迁移，再加 Gateway 同步层。先简单后复杂。</p>
<hr>
<h2 id="五计划与恢复">五、计划与恢复</h2>
<h3 id="流程">流程</h3>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-1">1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-2">2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-3">3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-4">4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-5">5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-6">6</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>收到复杂任务
</span></span><span style="display:flex;"><span>  → 语义握手（确认理解）
</span></span><span style="display:flex;"><span>  → 对方确认后
</span></span><span style="display:flex;"><span>  → 创建 {任务}.plan.md（checkbox 格式）
</span></span><span style="display:flex;"><span>  → 按计划逐步执行，完成每步打勾
</span></span><span style="display:flex;"><span>  → 中断后重启：runtime 检测未完成计划，注入恢复提示
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="plan-文件格式">Plan 文件格式</h3>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-4-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-1">1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-4-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-2">2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-4-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-3">3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-4-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-4">4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-4-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-5">5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-4-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-6">6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-4-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-7">7</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-markdown" data-lang="markdown"><span style="display:flex;"><span># 计划：重构 task 模块
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">- [x]</span> 创建 fsm.go 文件
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">- [x]</span> 移动状态常量
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">- [ ]</span> 移动 Transition 函数
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">- [ ]</span> 更新 service.go 引用
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">- [ ]</span> 跑测试确认
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="恢复机制">恢复机制</h3>
<p>runtime 启动时扫描 workspace 下的 <code>*.plan.md</code>：</p>
<ul>
<li>如果有文件包含 <code>- [ ]</code>（未完成项）→ 记录为 pending plan</li>
<li>第一次收到事件时注入：&quot;📋 你有未完成的计划文件，请 Read 后继续执行&quot;</li>
</ul>
<p>关键约束：<strong>先握手确认，再写计划</strong>。plan 是双方对齐后的产物，不是 agent 单方面的理解。</p>
<hr>
<h2 id="六防护机制">六、防护机制</h2>
<h3 id="circuit-breaker工具熔断">Circuit Breaker（工具熔断）</h3>
<p>防止 agent 陷入死循环烧 token：</p>
<table>
  <thead>
      <tr>
          <th>条件</th>
          <th>动作</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>连续相同工具 ≥ 10 次</td>
          <td>注入警告&quot;可能陷入循环，请重新思考&quot;</td>
      </tr>
      <tr>
          <td>总工具调用 ≥ 200 次</td>
          <td>硬中断（<code>continue: false</code>）</td>
      </tr>
  </tbody>
</table>
<h3 id="preemptive-compaction渐进式压缩管理">Preemptive Compaction（渐进式压缩管理）</h3>
<p>不等 context window 撞墙，提前预警：</p>
<table>
  <thead>
      <tr>
          <th>工具调用数</th>
          <th>动作</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>80 次</td>
          <td>&ldquo;上下文使用过半，注意效率&rdquo;</td>
      </tr>
      <tr>
          <td>130 次</td>
          <td>&ldquo;即将耗尽，请尽快完成&rdquo;</td>
      </tr>
      <tr>
          <td>PreCompact 触发</td>
          <td>&ldquo;请保存笔记到 notes/&rdquo;</td>
      </tr>
      <tr>
          <td>PostCompact 触发</td>
          <td>&ldquo;已压缩，请 Read notes/ 和 plan.md 恢复&rdquo;</td>
      </tr>
  </tbody>
</table>
<h3 id="硬性限制">硬性限制</h3>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-1">1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-2">2</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>maxTurns: 30       ← 单次事件最多 30 轮对话
</span></span><span style="display:flex;"><span>maxBudgetUsd: 5.0  ← 单次事件最多 $5
</span></span></code></pre></td></tr></table>
</div>
</div><p>SDK 级别的硬限制——到了就停，不管 agent 想不想继续。</p>
<h3 id="环路检测">环路检测</h3>
<p>同一 task 中同一对 agent 交互超过 5 轮 → 注入&quot;如果问题已解决，请关闭 task&quot;。</p>
<h3 id="闲聊检测">闲聊检测</h3>
<p>连续客套消息（chat_score 高分连击）→ 注入&quot;请用 mesh_set_task_status 关闭&quot;。</p>
<h3 id="静默失败检测">静默失败检测</h3>
<p>broadcast 收到的回复 &lt; 10 字符 → 汇总里标记&quot;⚠️ 回复异常短，可能执行失败，建议确认或重试&quot;。</p>
<hr>
<h2 id="七推理深度自适应">七、推理深度自适应</h2>
<p>复杂度不只影响协作流程，还直接控制 LLM 的推理行为：</p>
<table>
  <thead>
      <tr>
          <th>复杂度</th>
          <th>effort</th>
          <th>thinking</th>
          <th>效果</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>low</td>
          <td>low</td>
          <td>disabled</td>
          <td>快速响应，省 token，适合简单查询</td>
      </tr>
      <tr>
          <td>medium</td>
          <td>medium</td>
          <td>adaptive</td>
          <td>适度推理，平衡质量和成本</td>
      </tr>
      <tr>
          <td>high</td>
          <td>high</td>
          <td>adaptive</td>
          <td>深度推理，质量优先，适合架构决策</td>
      </tr>
  </tbody>
</table>
<p>简单任务不需要深度思考——关掉 extended thinking 能省 30-50% 的 token。复杂任务需要充分推理——开 adaptive 让模型自己决定想多深。</p>
<hr>
<h2 id="八sdk-能力利用">八、SDK 能力利用</h2>
<p>这些机制大量利用了 Claude Agent SDK 的原生能力，而不是自建：</p>
<table>
  <thead>
      <tr>
          <th>SDK 能力</th>
          <th>我们的用途</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>hooks.PostToolUse</code></td>
          <td>行为标注 + circuit breaker + compaction 警告</td>
      </tr>
      <tr>
          <td><code>hooks.Stop</code></td>
          <td>任务完成时提醒写笔记</td>
      </tr>
      <tr>
          <td><code>hooks.PreCompact</code></td>
          <td>压缩前提醒保存知识</td>
      </tr>
      <tr>
          <td><code>hooks.PostCompact</code></td>
          <td>压缩后提醒恢复上下文</td>
      </tr>
      <tr>
          <td><code>effort</code> + <code>thinking</code></td>
          <td>推理深度随复杂度调整</td>
      </tr>
      <tr>
          <td><code>maxTurns</code> + <code>maxBudgetUsd</code></td>
          <td>硬性资源防护</td>
      </tr>
      <tr>
          <td><code>continue: true</code></td>
          <td>session 历史跨重启保留</td>
      </tr>
      <tr>
          <td><code>cwd</code></td>
          <td>agent 工作目录隔离</td>
      </tr>
      <tr>
          <td><code>mcpServers</code></td>
          <td>mesh 通信工具注入</td>
      </tr>
      <tr>
          <td><code>permissionMode: 'bypassPermissions'</code></td>
          <td>agent 自主执行</td>
      </tr>
      <tr>
          <td>CLAUDE.md（原生读取）</td>
          <td>项目上下文注入</td>
      </tr>
  </tbody>
</table>
<p>设计原则：<strong>能用平台能力的不自建</strong>。SDK 原生支持的事情（hooks、session 管理、CLAUDE.md）比自己 hack 更可靠。</p>
<hr>
<h2 id="机制协同图">机制协同图</h2>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-13">13</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-14">14</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-15"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-15">15</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-16"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-16">16</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-17"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-17">17</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-18"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-18">18</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-19"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-19">19</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-20"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-20">20</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-21"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-21">21</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-22"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-22">22</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-23"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-23">23</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-24"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-24">24</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-25"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-25">25</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-26"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-26">26</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>用户发任务
</span></span><span style="display:flex;"><span>    │
</span></span><span style="display:flex;"><span>    ▼
</span></span><span style="display:flex;"><span>复杂度评估（显式指定 / 启发式推断）
</span></span><span style="display:flex;"><span>    │
</span></span><span style="display:flex;"><span>    ├── low ──→ effort=low, thinking=disabled
</span></span><span style="display:flex;"><span>    │           直接执行 → 行为标注 → 回复
</span></span><span style="display:flex;"><span>    │
</span></span><span style="display:flex;"><span>    ├── medium ──→ effort=medium, thinking=adaptive
</span></span><span style="display:flex;"><span>    │              语义握手 → 执行 → 行为标注 → 回复
</span></span><span style="display:flex;"><span>    │
</span></span><span style="display:flex;"><span>    └── high ──→ effort=high, thinking=adaptive
</span></span><span style="display:flex;"><span>                 语义握手 → 创建 plan.md → 逐步执行
</span></span><span style="display:flex;"><span>                 → 行为标注 → 独立验证 → 回复
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>全程防护：
</span></span><span style="display:flex;"><span>  Circuit Breaker（工具熔断）
</span></span><span style="display:flex;"><span>  Preemptive Compaction（渐进式警告）
</span></span><span style="display:flex;"><span>  maxTurns + maxBudgetUsd（硬限制）
</span></span><span style="display:flex;"><span>  环路检测 + 闲聊检测 + 静默失败检测
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>知识积累：
</span></span><span style="display:flex;"><span>  Stop hook → 提醒写 notes/
</span></span><span style="display:flex;"><span>  PreCompact → 提醒保存
</span></span><span style="display:flex;"><span>  PostCompact → 提醒恢复
</span></span><span style="display:flex;"><span>  启动时 → 读 notes/ 注入 prompt + 检测未完成 plan
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="设计哲学">设计哲学</h2>
<p>回顾这些机制，有几个一致的设计原则：</p>
<p><strong>1. 不信任 agent 的自证，靠外部观察</strong></p>
<p>行为标注不问 agent &ldquo;你验证了吗&rdquo;，而是看它实际调了什么工具。语义握手不靠 agent 自觉，而是 runtime 强制注入引导。</p>
<p><strong>2. 渐进式而非二元</strong></p>
<p>不是&quot;要么全信要么全不信&quot;，而是三级标注。不是&quot;要么握手要么不握手&quot;，而是按复杂度分级。不是&quot;要么继续要么中断&quot;，而是先警告再中断。</p>
<p><strong>3. 能用平台能力的不自建</strong></p>
<p>hooks、CLAUDE.md、session continue、effort/thinking——这些都是 Claude SDK 原生支持的。我们只是把它们组合起来用于协作场景。</p>
<p><strong>4. 先简单后复杂</strong></p>
<p>知识积累用文件而不是数据库。计划用 markdown checkbox 而不是状态机。复杂度用关键词匹配而不是 LLM 分类。先覆盖 80% 的场景，再根据实际数据决定哪里值得投入更多。</p>
<hr>
<p><em>本文记录的所有机制已在 Agent Mesh 中部署运行。核心代码位于 <code>meshd/src/agent/runtime.ts</code>（hooks + 注入 + 防护）、<code>meshd/src/tools/mesh-tools.ts</code>（通信工具 + 行为标注）、<code>meshd/src/agent/fan-out.ts</code>（broadcast 汇总 + 静默失败检测）。</em></p>
]]></content:encoded>
    </item>
  </channel>
</rss>
