<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Agent Runtime on niuzj</title>
    <link>https://niuzj.org/tags/agent-runtime/</link>
    <description>Recent content in Agent Runtime on niuzj</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Mon, 13 Jul 2026 00:00:00 +0800</lastBuildDate>
    <atom:link href="https://niuzj.org/tags/agent-runtime/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Claude Code Plan Mode：权限边界与审批机制</title>
      <link>https://niuzj.org/posts/claude-code-plan-mode-runtime/</link>
      <pubDate>Mon, 13 Jul 2026 00:00:00 +0800</pubDate>
      <guid>https://niuzj.org/posts/claude-code-plan-mode-runtime/</guid>
      <description>&lt;p&gt;Plan Mode 最容易被误解为一段“先分析、再执行”的提示词。这个解释描述了模型表面的行为，却回避了一个更重要的工程问题：如果模型在规划阶段仍然发起了写文件或执行命令的 Tool Call，谁负责阻止它？&lt;/p&gt;&#xA;&lt;p&gt;答案不能只是另一段 Prompt。Prompt 可以约束模型的倾向，不能构成可验证的权限边界。Claude Code 的 Plan Mode 本质上是 Agent Runtime 中的一种权限模式：它在原有 Agent Loop 之上叠加会话状态、运行时提醒、本地权限检查、Plan 文件和人工审批链路。&lt;/p&gt;&#xA;&lt;p&gt;本文把证据分成两类。用户可见的行为以 &lt;a href=&#34;https://code.claude.com/docs/en/permission-modes#analyze-before-you-edit-with-plan-mode&#34;&gt;Claude Code 官方 Plan Mode 文档&lt;/a&gt; 为准；消息构造、内部状态和审批后的上下文转换，则来自本机 Claude Code &lt;code&gt;2.1.207&lt;/code&gt; 源码快照，对应构建提交 &lt;code&gt;bc512d56332530b2be3f5079e29ec17aa20b8553&lt;/code&gt;。后者是特定版本的逆向观察，不应视为稳定 API。&lt;/p&gt;&#xA;&lt;h2 id=&#34;plan-mode-没有替换-agent-loop&#34;&gt;Plan Mode 没有替换 Agent Loop&lt;/h2&gt;&#xA;&lt;p&gt;进入 Plan Mode 后，Claude Code 仍然运行同一套模型与工具循环：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;构造模型请求&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;→ 模型返回文本或 tool_use&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;→ Claude Code 在本地处理工具调用&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;→ tool_result 回到对话&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;→ 模型继续推理，或结束当前轮次&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;变化发生在循环外围。可以把它拆成六个相互独立的部分：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Plan Mode&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;= 会话模式状态&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+ 持续的规划指令&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+ 工具执行前的权限检查&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+ 独立的 Plan 文件&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+ 用户审批边界&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+ 审批后的上下文转换&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这也解释了 Plan Mode 与 ReAct 类循环的关系：ReAct 描述 Agent 如何在推理和动作之间迭代，Plan Mode 描述这套循环当前处于什么权限状态，以及何时允许从调查进入有副作用的执行。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Claude Code 工具并发机制：依赖与安全边界</title>
      <link>https://niuzj.org/posts/claude-code-tool-concurrency/</link>
      <pubDate>Mon, 13 Jul 2026 00:00:00 +0800</pubDate>
      <guid>https://niuzj.org/posts/claude-code-tool-concurrency/</guid>
      <description>&lt;p&gt;当模型在一条回复中返回多个 &lt;code&gt;tool_use&lt;/code&gt; 时，客户端应该并行执行，还是严格按数组顺序串行执行？&lt;/p&gt;&#xA;&lt;p&gt;只看 Anthropic API 的消息结构，很难得到完整答案。API 负责表达模型已经提交了哪些调用，却没有提供 &lt;code&gt;depends_on&lt;/code&gt;、&lt;code&gt;sequence&lt;/code&gt; 或 &lt;code&gt;parallel&lt;/code&gt; 之类的调度字段。真正执行这些调用的 Agent Runtime，还需要结合工具副作用、输入参数和当前执行状态做第二次判断。&lt;/p&gt;&#xA;&lt;p&gt;Claude Code 的处理方式可以概括为两层：模型负责表达语义依赖，Runtime 负责约束运行时安全。两层共同决定一次 Tool Call 最终以并发、串行还是动态交错的方式执行。&lt;/p&gt;&#xA;&lt;p&gt;本文涉及两类信息，适用范围需要先说明：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Anthropic API 的 &lt;code&gt;tool_use&lt;/code&gt; / &lt;code&gt;tool_result&lt;/code&gt; 消息结构以官方 &lt;a href=&#34;https://platform.claude.com/docs/en/agents-and-tools/tool-use/parallel-tool-use&#34;&gt;Parallel tool use&lt;/a&gt; 文档为准；&lt;/li&gt;&#xA;&lt;li&gt;Claude Code 的调度细节来自本机 &lt;strong&gt;Claude Code 2.1.207&lt;/strong&gt; 源码快照，基线构建提交前缀为 &lt;code&gt;bc512d563325&lt;/code&gt;，完整哈希见文末。内部函数、调用关系和默认值都属于特定版本的实现观察，不是 Anthropic API 的长期兼容协议，后续版本可能调整。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;api-表达调用runtime-决定执行方式&#34;&gt;API 表达调用，Runtime 决定执行方式&lt;/h2&gt;&#xA;&lt;p&gt;按照 Claude Code 的系统提示约定，两个互不依赖的文件读取可以出现在同一条 Assistant Message 中：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;role&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;assistant&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;: [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tool_use&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;toolu_01&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Read&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;input&amp;#34;&lt;/span&gt;: { &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;file_path&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;src/a.ts&amp;#34;&lt;/span&gt; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tool_use&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;toolu_02&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Read&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;input&amp;#34;&lt;/span&gt;: { &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;file_path&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;src/b.ts&amp;#34;&lt;/span&gt; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在 Claude Code 的提示约定下，这条消息表示模型认为两个调用在当前时点都已经具备提交条件。它没有进一步声明客户端必须并发执行，也没有声明二者存在先后关系。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
