<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>潘锦的空间 &#187; DSH</title>
	<atom:link href="https://www.phppan.com/tag/dsh/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.phppan.com</link>
	<description>SaaS SaaS架构 团队管理 技术管理 技术架构 PHP 内核 扩展 项目管理</description>
	<lastBuildDate>Sat, 26 Sep 2026 04:51:36 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.9.40</generator>
	<item>
		<title>DeepSeek Harness 的 Harness 到底做了什么</title>
		<link>https://www.phppan.com/2026/09/deepseek-harness-and-what-is-harness/</link>
		<comments>https://www.phppan.com/2026/09/deepseek-harness-and-what-is-harness/#comments</comments>
		<pubDate>Sat, 26 Sep 2026 04:51:36 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[架构和远方]]></category>
		<category><![CDATA[DeepSeek]]></category>
		<category><![CDATA[DeepSeekHarness]]></category>
		<category><![CDATA[DSH]]></category>
		<category><![CDATA[harness]]></category>

		<guid isPermaLink="false">https://www.phppan.com/?p=2541</guid>
		<description><![CDATA[DeepSeek Harness 解决的核心问题，是多轮模型调用、工具执行与会话状态之间的协调：输入何时进入请 [&#8230;]]]></description>
				<content:encoded><![CDATA[<section id="nice" data-tool="mdnice编辑器" data-website="https://www.mdnice.com">
<p data-tool="mdnice编辑器">DeepSeek Harness 解决的核心问题，是多轮模型调用、工具执行与会话状态之间的协调：输入何时进入请求，工具结果如何写回历史，请求失败后从哪里重试，上下文压缩后保留哪些信息，以及任务中断后能够恢复到什么状态。</p>
<p data-tool="mdnice编辑器">围绕这些问题，框架将运行过程拆分为插件装配、回合驱动、会话日志、工具管道和异常处理。分析其架构的关键，在于各部分的状态边界，以及这些边界提供的保证与限制。</p>
<p data-tool="mdnice编辑器">本篇文章限定在提交 477b4f4205（2026 年 9 月 25 日）对应的实现。</p>
<h1 data-tool="mdnice编辑器"><span class="content">1. 插件装配</span></h1>
<p data-tool="mdnice编辑器">插件是 DeepSeek Harness 的核心能力，插件的配置决定 Agent 的运行能力。</p>
<p data-tool="mdnice编辑器">DeepSeek Harness 通过 Cordis 插件组织运行能力。Cordis 提供 Context、Service、Plugin 和 Event 等抽象，插件通过依赖注入与事件系统协作，并由框架管理生命周期。</p>
<p data-tool="mdnice编辑器">LLM 服务、Session、Agent、AgentLoop 和工具注册表等基础组件，由 bundle 统一挂载。启动时，<code>dsh</code> 以 profile 为入口加载配置，按 id 定位配置行，并替换对应的整段 config。</p>
<p data-tool="mdnice编辑器">这里的配置语义是<strong>整段替换，而非字段级合并</strong>。覆盖某个组件的配置时，原配置中未被保留的字段也可能随之消失。</p>
<p data-tool="mdnice编辑器">插件装配因此直接影响 Agent 的实际行为：模型服务是否可用、哪些工具被注册、哪些事件处理器参与执行，都取决于最终加载的插件与配置。仓库包含某项能力，并不等于当前运行实例已经启用该能力。</p>
<p data-tool="mdnice编辑器">这种设计便于替换组件和组合能力，但也让执行逻辑分布在多个插件中。分析一次请求的行为，需要同时查看核心循环、插件注册关系和最终生效的配置。</p>
<h1 data-tool="mdnice编辑器"><span class="content">2. 核心循环</span></h1>
<p data-tool="mdnice编辑器">Agent 循环是 Agent 的核心逻辑，其主要区分回合、步骤与请求重试。</p>
<p data-tool="mdnice编辑器">从实际的工作逻辑上来看，<code>agent-loop</code> 负责驱动模型与工具之间的循环。其主要执行路径包括：</p>
<ol data-tool="mdnice编辑器">
<li>
<section>准备模型请求，解析配置并选择适配器。</section>
</li>
<li>
<section>投影系统提示词，提交本次需要进入历史的用户输入。</section>
</li>
<li>
<section>从会话构造请求，接收并累积流式响应。</section>
</li>
<li>
<section>将 assistant 消息写入 Session。</section>
</li>
<li>
<section>执行模型提出的工具调用，并将结果交给后续模型请求。</section>
</li>
<li>
<section>在没有工具调用或满足结束条件时，结束本轮执行。</section>
</li>
</ol>
<p data-tool="mdnice编辑器">理解这条路径，需要分三个层次：</p>
<ul data-tool="mdnice编辑器">
<li>
<section><strong>turn</strong>：由用户输入驱动的回合。</section>
</li>
<li>
<section><strong>step</strong>：回合内部的执行边界。</section>
</li>
<li>
<section><strong>请求尝试</strong>：一次实际发往模型的调用，失败后可以在同一个 step 内重试。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">因此，step 不能简单等同于一次网络请求。重试可能产生多次请求尝试，但不应重复消费输入或重复提交用户消息。</p>
<p data-tool="mdnice编辑器">Agent 维护 <code>next-turn</code> 和 <code>next-step</code> 两个队列，分别承接下一回合与下一步的输入。队列修改以 <code>agent/inbox/spliced</code> 事件写入 Session，待处理输入可以从日志投影恢复。</p>
<p data-tool="mdnice编辑器">这一设计区分了「系统已经收到消息」和「模型已经消费消息」。</p>
<p data-tool="mdnice编辑器">执行过程中到达的补充要求，需要在相应边界进入后续请求。它不能自动改变已经发出的模型请求，也不能撤销已经发生的工具副作用。输入排队与执行取消因此属于不同机制。</p>
<p data-tool="mdnice编辑器">将队列变化写入日志，还能避免恢复时只找回聊天记录，却丢失尚未处理的输入。</p>
<h1 data-tool="mdnice编辑器"><span class="content">3. Session</span></h1>
<p data-tool="mdnice编辑器">Session 机制实现了运行记录与模型历史分离。</p>
<p data-tool="mdnice编辑器">Session 被设计为只追加的事件日志，事件通过递增序列号确定顺序，以 <code>type</code> 区分类型，以 <code>body</code> 保存内容。</p>
<p data-tool="mdnice编辑器">日志不仅记录用户与 assistant 消息，也记录请求失败、输入队列变化、工具执行和压缩过程等运行事实。</p>
<p data-tool="mdnice编辑器">但<strong>日志中存在的事件，不一定进入模型上下文</strong>。</p>
<p data-tool="mdnice编辑器">真正发送给模型的 <code>messages</code>，由 Session 的 surface 通过 <code>deriveMessages()</code> 重建，再冻结为不可变请求。只有进入 surface 的消息事件参与历史投影；<code>assistant/attempt</code> 等运行记录不会自动成为模型消息。</p>
<p data-tool="mdnice编辑器">这一分离有两个作用：</p>
<ul data-tool="mdnice编辑器">
<li>
<section><strong>保留排障信息</strong>：请求失败与恢复过程可以完整记录，而不必全部占用上下文窗口。</section>
</li>
<li>
<section><strong>允许调整可见历史</strong>：压缩或替换模型上下文时，仍能保留原始事件。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">Session 的 append 还会检查 JSON 可序列化性、事件规则及 surface 替换的合法性，以减少无法持久化或无法正确投影的数据进入日志。</p>
<p data-tool="mdnice编辑器"><strong>日志恢复不等于外部动作回滚</strong></p>
<p data-tool="mdnice编辑器">只追加日志为审计与状态重建提供了基础，但不能单独保证任意中断点都能无损恢复。</p>
<p data-tool="mdnice编辑器">例如，工具已经修改文件，但结果尚未写入 Session 时进程退出，外部环境与日志之间就可能出现状态差异。恢复日志可以还原已提交的记录，却不能仅凭「缺少结果」判断工具没有执行。</p>
<p data-tool="mdnice编辑器">因此，恢复能力需要区分：</p>
<ul data-tool="mdnice编辑器">
<li>
<section>已提交事件及其投影的恢复；</section>
</li>
<li>
<section>外部副作用的确认与处理。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">后者还依赖工具的幂等性、状态检查能力或额外的事务机制，不能仅由 Session 的追加式设计推导出来。</p>
<h1 data-tool="mdnice编辑器"><span class="content">4. 工具管道</span></h1>
<p data-tool="mdnice编辑器">工具管道实现了从模型意图到受控执行。</p>
<p data-tool="mdnice编辑器">工具注册表只向模型暴露 name、description、parameters 等白名单字段。执行函数、超时设置和并发属性保留在运行时。</p>
<p data-tool="mdnice编辑器">这将模型侧的工具描述与运行时的执行控制分开：模型负责提出调用，框架负责判断调用是否可执行，以及如何执行。</p>
<p data-tool="mdnice编辑器">一次工具调用依次经过：</p>
<ol data-tool="mdnice编辑器">
<li>
<section>解析模型生成的参数。</section>
</li>
<li>
<section>查找当前 Agent 可见的工具。</section>
</li>
<li>
<section>通过 <code>tools/pre-execute</code> 进行执行前检查，允许或拒绝调用。</section>
</li>
<li>
<section>进入 <code>tools/execute</code> 包装链。</section>
</li>
<li>
<section>通过 <code>tools/post-execute</code> 处理结果。</section>
</li>
<li>
<section>将结果写回 Session，供后续模型请求使用。</section>
</li>
</ol>
<p data-tool="mdnice编辑器">权限检查、执行包装和结果处理因而拥有独立的介入位置，不必全部写进工具函数。</p>
<p data-tool="mdnice编辑器"><strong>并发执行与顺序提交分离</strong></p>
<p data-tool="mdnice编辑器">同一条 assistant 消息可能提出多个工具调用。调度器通过工具的 <code>isConcurrencySafe</code> 属性分类：</p>
<ul data-tool="mdnice编辑器">
<li>
<section>明确返回 <code>true</code> 的调用进入并行池。</section>
</li>
<li>
<section>其他调用作为独占屏障处理。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">并发是显式声明的能力，未声明安全的工具不会默认并行执行。</p>
<p data-tool="mdnice编辑器">工具本体可以并发，但准备、后处理、<code>tool/result</code> 写入及附加 context 入队，按模型调用顺序提交。这样可以避免工具完成时间的随机性直接改变会话中的结果顺序。</p>
<p data-tool="mdnice编辑器">代价是可能出现等待：后面的工具即使先完成，也需要等待前面的调用提交。并发能够缩短部分执行时间，却不保证结果可以立即进入历史；提前完成的结果还可能需要暂存。</p>
<p data-tool="mdnice编辑器">此外，<strong>提交顺序稳定不等于外部副作用确定</strong>。并发工具是否真正安全，仍取决于它们是否访问共享状态、是否存在执行依赖，以及并发声明是否准确。</p>
<h1 data-tool="mdnice编辑器"><span class="content">5. 安全隔离</span></h1>
<p data-tool="mdnice编辑器">DSH 在实现上让审批与执行限制分别生效，以实现安全隔离。</p>
<p data-tool="mdnice编辑器">Harness 的沙箱模式包括：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs"><span class="hljs-keyword">type</span> SandboxMode =
  | <span class="hljs-string">'read-only'</span>
  | <span class="hljs-string">'workspace-write'</span>
  | <span class="hljs-string">'danger-full-access'</span>
</code></pre>
<p data-tool="mdnice编辑器">策略涉及文件路径权限、命令执行限制和权限提升。工具可以通过 <code>justification</code> 与 <code>sandbox_permissions</code> 请求提升权限，再由 approval 机制处理审批。</p>
<p data-tool="mdnice编辑器">基础 bundle 默认挂载 <code>workspace-write</code> 文件沙箱与 <code>ask</code> 审批策略；<code>sandbox-policy</code> 将当前文件操作模式解析给实际后端。</p>
<p data-tool="mdnice编辑器">这一结构包含三个不同层次：</p>
<ul data-tool="mdnice编辑器">
<li>
<section><strong>工具可见性</strong>：模型能够提出哪些调用。</section>
</li>
<li>
<section><strong>执行审批</strong>：某次调用是否获得许可。</section>
</li>
<li>
<section><strong>后端隔离</strong>：获准执行后，实际能够访问哪些资源。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">三者不能相互替代。审批通过只说明动作获得许可，不代表执行环境具有无限权限；模型看不到某个工具，也不能据此证明其他工具无法访问相同资源。</p>
<p data-tool="mdnice编辑器">安全边界最终取决于策略配置与实际后端的共同约束，而不只是沙箱模式的名称。</p>
<h1 data-tool="mdnice编辑器"><span class="content">6. 异常收敛</span></h1>
<p data-tool="mdnice编辑器">异常是应用中很常见的东西，也是 Harness 的重点处理对象。</p>
<p data-tool="mdnice编辑器">DSH 通过重试、压缩与取消各自处理不同问题。</p>
<h2 data-tool="mdnice编辑器"><span class="content">6.1 请求重试</span></h2>
<p data-tool="mdnice编辑器">通过请求重试来保留失败记录，避免重复提交输入。</p>
<p data-tool="mdnice编辑器">模型请求失败后，系统先写入 <code>assistant/attempt</code>，再交给 <code>agent/request-error</code> 瀑布链处理。</p>
<p data-tool="mdnice编辑器"><code>llm-retry</code> 根据适配器提供的 retry policy，判断错误类型、重试次数与退避方式。计划重试与实际启动分别记录为 <code>llm/retry</code> 和 <code>llm/retry-started</code>。</p>
<p data-tool="mdnice编辑器">重试在同一个 step 中重新准备请求，不重复提交首次用户消息。这一边界避免了网络层重试演变成会话层的重复输入。</p>
<p data-tool="mdnice编辑器">分别记录重试计划与启动，也使日志能够区分“决定重试”与“已经开始下一次尝试”。</p>
<h2 data-tool="mdnice编辑器"><span class="content">6.2 上下文压缩</span></h2>
<p data-tool="mdnice编辑器">上下文压缩实现了替换可见历史，保留原始事件。</p>
<p data-tool="mdnice编辑器">自动压缩在 <code>agent/pre-step</code> 检测上下文压力，并记录：</p>
<ul data-tool="mdnice编辑器">
<li>
<section><code>compaction/start</code></section>
</li>
<li>
<section><code>compaction/summary</code></section>
</li>
<li>
<section><code>compaction/end</code></section>
</li>
</ul>
<p data-tool="mdnice编辑器">随后，系统将选中的连续历史区间替换为一个 checkpoint 用户消息。</p>
<p data-tool="mdnice编辑器">这里发生的是 <strong>surface replace</strong>：模型可见历史缩短，原始日志仍然保留。因此，压缩减少的是请求上下文，不等于同步减少持久化存储。</p>
<p data-tool="mdnice编辑器">压缩也引入了信息损失的可能。原始约束即使仍在日志中，只要没有进入摘要或剩余 surface，后续模型就无法直接使用。压缩是否有效，除了看上下文长度，还取决于任务目标、限制条件和未完成事项是否得到保留。</p>
<h2 data-tool="mdnice编辑器"><span class="content">6.3 取消</span></h2>
<p data-tool="mdnice编辑器">通过取消来传递停止信号，而非撤销既有结果。</p>
<p data-tool="mdnice编辑器">AbortSignal 贯穿回合、请求和工具，使取消信号能够沿执行链传递。</p>
<p data-tool="mdnice编辑器">但信号传递不等于立即停止所有动作。工具是否及时退出，取决于其是否检查并响应取消；已经完成的文件写入或远端操作，也不会因 AbortSignal 自动回滚。</p>
<p data-tool="mdnice编辑器">取消机制提供的是停止继续执行的控制路径，外部副作用的撤销仍需要独立实现。</p>
<h1 data-tool="mdnice编辑器"><span class="content">7. 小结</span></h1>
<p data-tool="mdnice编辑器">DSH 的 Harness 实际上是一种架构的取舍，其取舍考量的是可追溯性与运行成本。</p>
<p data-tool="mdnice编辑器">如下的机制共同形成了 DeepSeek Harness 的主要工程取舍：</p>
<section class="table-container" data-tool="mdnice编辑器">
<table data-draft-node="block" data-draft-type="table" data-size="normal">
<tbody>
<tr>
<th>机制</th>
<th>提供的能力</th>
<th>成本或边界</th>
</tr>
<tr>
<td>Cordis 插件装配</td>
<td>组件替换与能力组合</td>
<td>行为分布在配置和多个处理器中</td>
</tr>
<tr>
<td>turn / step 与输入队列</td>
<td>明确输入归属和执行边界</td>
<td>增加队列状态与事件维护</td>
</tr>
<tr>
<td>追加式 Session</td>
<td>审计与已提交状态重建</td>
<td>日志持续增长，不保证外部动作恰好执行一次</td>
</tr>
<tr>
<td>surface 投影</td>
<td>分离运行记录与模型上下文</td>
<td>需要维护投影一致性与替换规则</td>
</tr>
<tr>
<td>并发执行、顺序提交</td>
<td>利用并发，同时稳定历史顺序</td>
<td>可能产生提交等待与结果暂存</td>
</tr>
<tr>
<td>沙箱与审批</td>
<td>分层控制动作权限</td>
<td>实际保证依赖配置和执行后端</td>
</tr>
<tr>
<td>自动压缩</td>
<td>降低上下文窗口压力</td>
<td>增加摘要成本，并可能丢失任务信息</td>
</tr>
<tr>
<td>AbortSignal</td>
<td>统一传递取消意图</td>
<td>依赖工具配合，不能自动回滚副作用</td>
</tr>
</tbody>
</table>
</section>
<p data-tool="mdnice编辑器">DeepSeek Harness 的核心价值，是将 Agent 执行中的关键状态显式化：输入有队列，执行有边界，请求有可见历史，工具有调度与审批，失败有独立的处理路径。</p>
<p data-tool="mdnice编辑器">这些机制使多轮任务能够被追踪、检查和恢复，同时也明确了框架的能力边界：日志恢复不能替代副作用确认，顺序提交不能替代并发安全，权限审批不能替代环境隔离，上下文压缩也不能保证信息无损。</p>
<p data-tool="mdnice编辑器">以上。</p>
</section>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2026/09/deepseek-harness-and-what-is-harness/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>从 Pi 到 DSH：Agent Harness 如何从「可扩展」走向「自生长」</title>
		<link>https://www.phppan.com/2026/08/from-pi-to-dsh-how-agent-harness-evolves-from-scalable-to-self-growing/</link>
		<comments>https://www.phppan.com/2026/08/from-pi-to-dsh-how-agent-harness-evolves-from-scalable-to-self-growing/#comments</comments>
		<pubDate>Sun, 16 Aug 2026 05:16:50 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[架构和远方]]></category>
		<category><![CDATA[DSH]]></category>
		<category><![CDATA[harness engineering]]></category>

		<guid isPermaLink="false">https://www.phppan.com/?p=2528</guid>
		<description><![CDATA[大模型能力持续提升之后，Agent 系统的竞争焦点正在发生变化。 过去，我们主要关心模型能不能理解任务、调用工 [&#8230;]]]></description>
				<content:encoded><![CDATA[<section id="nice" style="color: #000000;" data-tool="mdnice编辑器" data-website="https://www.mdnice.com">
<p data-tool="mdnice编辑器">大模型能力持续提升之后，Agent 系统的竞争焦点正在发生变化。</p>
<p data-tool="mdnice编辑器">过去，我们主要关心模型能不能理解任务、调用工具、编写代码。现在，更重要的问题逐渐变成：<strong>模型之外的系统，能否为 Agent 提供一个可以持续变化的运行环境？</strong></p>
<p data-tool="mdnice编辑器">这个运行环境通常被称为 <strong>Agent Harness</strong>。</p>
<p data-tool="mdnice编辑器">Harness 负责把模型、提示词、工具、记忆、上下文、权限和外部环境连接起来。它决定模型能够看到什么、调用什么、保存什么，以及一次行动会产生怎样的系统影响。</p>
<p data-tool="mdnice编辑器">从这个角度看，Agent 的能力并不只来自模型，用一个公式来表达，大概如下：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">Agent 能力
=
模型能力
× 上下文组织
× 工具系统
× 运行时结构
× 生命周期治理
</code></pre>
<p data-tool="mdnice编辑器">如果 Harness 是固定的，那么即使模型越来越强，Agent 的能力边界仍然主要由开发者预先决定。</p>
<p data-tool="mdnice编辑器">如果 Harness 可以扩展，用户和开发者就能不断为 Agent 增加工具、技能和工作流。</p>
<p data-tool="mdnice编辑器">但如果我们希望 Agent 进一步具备「自生长」能力，仅仅提供扩展接口还不够。系统还必须允许 Agent：</p>
<ol data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">发现自己的能力缺口；</section>
</li>
<li>
<section style="color: #010101;">生成或引入候选能力；</section>
</li>
<li>
<section style="color: #010101;">在运行时安全地激活这些能力；</section>
</li>
<li>
<section style="color: #010101;">验证变化是否有效；</section>
</li>
<li>
<section style="color: #010101;">在失败时完整回滚；</section>
</li>
<li>
<section style="color: #010101;">将成功经验沉淀为可复用组件；</section>
</li>
<li>
<section style="color: #010101;">淘汰已经失效或长期无用的能力。</section>
</li>
</ol>
<p data-tool="mdnice编辑器">Pi 与 DSH 可以被视为这条演进路径上的两个阶段。</p>
<p data-tool="mdnice编辑器">Pi 回答的是：</p>
<blockquote class="custom-blockquote multiquote-1" data-tool="mdnice编辑器"><p>如何构建一个足够小、足够开放，可以持续扩展的 Agent Harness？</p></blockquote>
<p data-tool="mdnice编辑器">DSH 进一步追问：</p>
<blockquote class="custom-blockquote multiquote-1" data-tool="mdnice编辑器"><p>如何让 Agent 不只是使用外部提供的扩展，而是安全地参与自身能力结构的形成？</p></blockquote>
<p data-tool="mdnice编辑器">这不是从一种插件格式切换到另一种插件格式，而是 Agent Harness 从<strong>开放扩展平台</strong>向<strong>能力生长环境</strong>的转变。</p>
<h1 data-tool="mdnice编辑器"><span class="content">1. 什么是 Agent Harness</span></h1>
<p data-tool="mdnice编辑器">一个最简单的 Agent，可以被表示为：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">Model
  ↓
Prompt
  ↓
Tool Call
  ↓
Environment
</code></pre>
<p data-tool="mdnice编辑器">模型接收上下文，生成工具调用，再根据工具结果继续推理。</p>
<p data-tool="mdnice编辑器">但在真实系统里，Agent 还需要处理更多问题：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">当前有哪些工具可用？</section>
</li>
<li>
<section style="color: #010101;">工具由谁注册？</section>
</li>
<li>
<section style="color: #010101;">不同任务应该使用什么模型？</section>
</li>
<li>
<section style="color: #010101;">哪些信息应该进入上下文？</section>
</li>
<li>
<section style="color: #010101;">哪些记忆需要跨会话保存？</section>
</li>
<li>
<section style="color: #010101;">如何限制文件、网络和进程权限？</section>
</li>
<li>
<section style="color: #010101;">工具调用失败后如何恢复？</section>
</li>
<li>
<section style="color: #010101;">新能力如何加载？</section>
</li>
<li>
<section style="color: #010101;">组件移除后如何清理副作用？</section>
</li>
<li>
<section style="color: #010101;">不同组件之间的依赖如何表达？</section>
</li>
</ul>
<p data-tool="mdnice编辑器">于是，Agent 的实际结构更接近于：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">                ┌─────────────┐
                │    Model    │
                └──────┬──────┘
                       │
                ┌──────▼──────┐
                │ Agent Loop  │
                └──────┬──────┘
                       │
       ┌───────────────┼────────────────┐
       │               │                │
┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐
│    Tools    │ │    Memory   │ │   Context   │
└─────────────┘ └─────────────┘ └─────────────┘
       │               │                │
       └───────────────┼────────────────┘
                       │
                ┌──────▼──────┐
                │ Environment │
                └─────────────┘
</code></pre>
<p data-tool="mdnice编辑器">Harness 并不是模型外面的一层简单包装。</p>
<p data-tool="mdnice编辑器">它实际上规定了 Agent 的：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">能力边界；</section>
</li>
<li>
<section style="color: #010101;">行为边界；</section>
</li>
<li>
<section style="color: #010101;">状态边界；</section>
</li>
<li>
<section style="color: #010101;">权限边界；</section>
</li>
<li>
<section style="color: #010101;">演化边界。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">因此，当我们讨论 Agent 是否可以扩展、重构甚至自生长时，本质上讨论的不是模型参数如何变化，而是 <strong>Harness 能否安全地改变自身结构</strong>。</p>
<h1 data-tool="mdnice编辑器"><span class="content">2. Pi：以最小内核换取最大扩展空间</span></h1>
<p data-tool="mdnice编辑器">Pi 的核心思想非常明确：</p>
<blockquote class="custom-blockquote multiquote-1" data-tool="mdnice编辑器"><p>不要预先替用户决定完整工作流，而是提供足够小的基础能力，让用户自己构建需要的 Harness。</p></blockquote>
<p data-tool="mdnice编辑器">Pi 将自己定义为一个最小化的 Agent Harness，并通过 Extensions、Skills、Prompt Templates、Themes 和 Packages 提供扩展能力。它允许用户修改工具、命令、模型提供商、工作流、上下文处理和终端界面，也支持将这些资源打包后通过 npm 或 Git 分发。(<a style="font-weight: bold; color: #ef7060;" href="https://pi.dev/?via=topaitools">pi.dev</a>)</p>
<p data-tool="mdnice编辑器">这背后是一种「原语优先」的设计哲学：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">不是：
内置所有功能

而是：
提供少量原语
+
开放扩展接口
+
允许用户自行组合
</code></pre>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #ffffff;">2.1 最小化不是能力不足</span></h2>
<p data-tool="mdnice编辑器">传统 Agent 产品通常倾向于内置更多功能：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">规划模式；</section>
</li>
<li>
<section style="color: #010101;">子 Agent；</section>
</li>
<li>
<section style="color: #010101;">权限确认；</section>
</li>
<li>
<section style="color: #010101;">MCP 集成；</section>
</li>
<li>
<section style="color: #010101;">后台任务；</section>
</li>
<li>
<section style="color: #010101;">长期记忆；</section>
</li>
<li>
<section style="color: #010101;">沙箱；</section>
</li>
<li>
<section style="color: #010101;">Todo 系统。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">Pi 选择了另一条路线：这些能力不一定需要成为内核的一部分，它们可以通过扩展或外部环境实现。</p>
<p data-tool="mdnice编辑器">Pi 当前提供文件读取、文件修改、内容搜索和命令执行等内置工具，同时允许通过命令行配置工具集合，也允许 Extension 注册新的工具或覆盖现有工具。(<a style="font-weight: bold; color: #ef7060;" href="https://pi.dev/docs/latest/usage?utm_source=openai">pi.dev</a>)</p>
<p data-tool="mdnice编辑器">这种设计的意义把稳定的内核和变化的能力分开：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">稳定部分：
模型调用、Agent Loop、会话、基础工具、扩展 API

变化部分：
工具、技能、上下文、工作流、权限策略、界面、模型路由
</code></pre>
<p data-tool="mdnice编辑器">只要扩展接口足够开放，功能就不必全部固化在核心代码中。</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #ffffff;">2.2 Pi 的四类扩展资源</span></h2>
<p data-tool="mdnice编辑器">从 Harness 的角度看，Pi 的可扩展性主要体现在以下几个层面。</p>
<h3 data-tool="mdnice编辑器"><span class="content">2.2.1 Extensions：改变运行时行为</span></h3>
<p data-tool="mdnice编辑器">Extension 是可以进入 Agent 运行时的代码模块。</p>
<p data-tool="mdnice编辑器">它可以：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">注册工具和命令；</section>
</li>
<li>
<section style="color: #010101;">监听工具调用；</section>
</li>
<li>
<section style="color: #010101;">拦截或修改行为；</section>
</li>
<li>
<section style="color: #010101;">改变上下文；</section>
</li>
<li>
<section style="color: #010101;">切换模型；</section>
</li>
<li>
<section style="color: #010101;">增加权限检查；</section>
</li>
<li>
<section style="color: #010101;">实现自定义 UI；</section>
</li>
<li>
<section style="color: #010101;">覆盖内置工具；</section>
</li>
<li>
<section style="color: #010101;">连接外部系统。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">因此，Extension 改变的不只是模型“知道什么”，还可以直接改变 Harness“如何运行”。</p>
<h3 data-tool="mdnice编辑器"><span class="content">2.2.2 Skills：注入按需能力</span></h3>
<p data-tool="mdnice编辑器">Skill 更接近一种可复用的过程知识。</p>
<p data-tool="mdnice编辑器">它可以告诉 Agent：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">在什么情况下使用某种方法；</section>
</li>
<li>
<section style="color: #010101;">如何执行特定工作流；</section>
</li>
<li>
<section style="color: #010101;">如何调用外部命令；</section>
</li>
<li>
<section style="color: #010101;">如何处理某类项目；</section>
</li>
<li>
<section style="color: #010101;">如何检查输出质量。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">Pi 将 Skill 设计为按需加载的能力包，使 Agent 不必在每次会话开始时把所有知识都放进上下文。(<a style="font-weight: bold; color: #ef7060;" href="https://pi.dev/?via=topaitools">pi.dev</a>)</p>
<h3 data-tool="mdnice编辑器"><span class="content">2.2.3 Prompt Templates：固化交互模式</span></h3>
<p data-tool="mdnice编辑器">Prompt Template 将常见任务封装成可复用提示词，例如：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">代码审查；</section>
</li>
<li>
<section style="color: #010101;">架构分析；</section>
</li>
<li>
<section style="color: #010101;">发布检查；</section>
</li>
<li>
<section style="color: #010101;">测试生成；</section>
</li>
<li>
<section style="color: #010101;">故障排查。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">它改变的是任务入口和交互结构。</p>
<h3 data-tool="mdnice编辑器"><span class="content">2.2.4 Packages：分发完整能力</span></h3>
<p data-tool="mdnice编辑器">Package 可以将 Extensions、Skills、Prompt Templates 和 Themes 组合起来，通过 npm、Git 或本地路径安装。Pi 还支持临时加载 Package，使组件只对当前运行生效。(<a style="font-weight: bold; color: #ef7060;" href="https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/docs/packages.md">github.com</a>)</p>
<p data-tool="mdnice编辑器">这使 Pi 不只是一个 Agent，也成为一个 Harness 能力分发平台：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">Pi Package
├── Extensions
├── Skills
├── Prompts
└── Themes
</code></pre>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #ffffff;">2.3 Pi 的关键突破：Agent 可以参与修改 Harness</span></h2>
<p data-tool="mdnice编辑器">Pi 最值得关注的地方，不只是「插件多」。</p>
<p data-tool="mdnice编辑器">它的官方描述明确鼓励用户让 Pi 编写自己需要的扩展，并在修改后通过重新加载继续当前工作。(<a style="font-weight: bold; color: #ef7060;" href="https://pi.dev/?via=topaitools">pi.dev</a>)</p>
<p data-tool="mdnice编辑器">这意味着一种新的工作方式正在出现：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">Agent 发现缺少某项能力
        ↓
Agent 编写 Extension
        ↓
用户检查或确认
        ↓
重新加载 Harness
        ↓
Agent 使用新增能力继续任务
</code></pre>
<p data-tool="mdnice编辑器">过去，Agent 与开发工具之间的关系通常是：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">人类开发 Harness
Agent 使用 Harness
</code></pre>
<p data-tool="mdnice编辑器">在 Pi 中，它开始变成：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">人类定义目标
Agent 修改 Harness
Agent 使用修改后的 Harness
</code></pre>
<p data-tool="mdnice编辑器">这是从「可扩展」走向「自生长」的重要一步。</p>
<p data-tool="mdnice编辑器">但是，这还不等于完整的自生长。</p>
<h1 data-tool="mdnice编辑器"><span class="content">3. 行为自治不等于结构自治</span></h1>
<p data-tool="mdnice编辑器">理解 Pi 与 DSH 的关系，需要区分两种不同的自治。</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #ffffff;">3.1 行为自治</span></h2>
<p data-tool="mdnice编辑器">行为自治指 Agent 可以在已有能力范围内自主决定：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">下一步做什么；</section>
</li>
<li>
<section style="color: #010101;">调用哪个工具；</section>
</li>
<li>
<section style="color: #010101;">如何拆解任务；</section>
</li>
<li>
<section style="color: #010101;">是否修改文件；</section>
</li>
<li>
<section style="color: #010101;">是否运行测试；</section>
</li>
<li>
<section style="color: #010101;">如何根据结果调整计划。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">此时，Agent 的选择空间是动态的，但能力集合通常是预先确定的。</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">固定工具集合
    ↓
Agent 自主选择工具
    ↓
完成任务
</code></pre>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #ffffff;">3.2 结构自治</span></h2>
<p data-tool="mdnice编辑器">结构自治指 Agent 可以改变自己的能力结构：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">创建新工具；</section>
</li>
<li>
<section style="color: #010101;">安装新组件；</section>
</li>
<li>
<section style="color: #010101;">替换 Memory；</section>
</li>
<li>
<section style="color: #010101;">修改上下文策略；</section>
</li>
<li>
<section style="color: #010101;">调整模型 Router；</section>
</li>
<li>
<section style="color: #010101;">增加权限规则；</section>
</li>
<li>
<section style="color: #010101;">组合新的执行流程；</section>
</li>
<li>
<section style="color: #010101;">卸载无效组件。</section>
</li>
</ul>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">当前能力结构
    ↓
Agent 发现能力缺口
    ↓
生成候选组件
    ↓
改变 Harness
    ↓
形成新的能力结构
</code></pre>
<p data-tool="mdnice编辑器">Pi 已经为结构自治打开了入口。</p>
<p data-tool="mdnice编辑器">但它的扩展机制主要回答的是：</p>
<blockquote class="custom-blockquote multiquote-1" data-tool="mdnice编辑器"><p>如何把一项新能力加入系统？</p></blockquote>
<p data-tool="mdnice编辑器">真正的自生长还必须回答：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">新能力应该在什么条件下激活？</section>
</li>
<li>
<section style="color: #010101;">它依赖哪些已有能力？</section>
</li>
<li>
<section style="color: #010101;">它失败后能否完整退出？</section>
</li>
<li>
<section style="color: #010101;">它注册的工具和监听器由谁撤销？</section>
</li>
<li>
<section style="color: #010101;">如何判断变化带来了正收益？</section>
</li>
<li>
<section style="color: #010101;">如何防止不同扩展相互冲突？</section>
</li>
<li>
<section style="color: #010101;">如何把一次临时变化沉淀成长期能力？</section>
</li>
<li>
<section style="color: #010101;">如何淘汰不再适用的组件？</section>
</li>
</ul>
<p data-tool="mdnice编辑器">这些问题将我们从扩展系统带到了组件运行时。</p>
<h1 data-tool="mdnice编辑器"><span class="content">4. DSH：为 Harness 自生长建立运行时基础</span></h1>
<p data-tool="mdnice编辑器">本文讨论的 DSH，不只是另一个插件系统。</p>
<p data-tool="mdnice编辑器">它试图将 Agent Harness 表达为一个可以在运行中不断组合和重组的组件系统。</p>
<p data-tool="mdnice编辑器">其基本结构可以概括为：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">Component
=
Context
+
Effect
+
Cleanup
+
Coeffects
</code></pre>
<p data-tool="mdnice编辑器">这四个概念分别回答四个问题：</p>
<section class="table-container" data-tool="mdnice编辑器">
<table>
<thead>
<tr>
<th style="color: #000000;">概念</th>
<th style="color: #000000;">回答的问题</th>
</tr>
</thead>
<tbody>
<tr style="color: #000000;">
<td>Context</td>
<td>组件可以看到和使用什么？</td>
</tr>
<tr style="color: #000000;">
<td>Effect</td>
<td>组件加入系统后会产生什么影响？</td>
</tr>
<tr style="color: #000000;">
<td>Cleanup</td>
<td>组件退出时如何撤销影响？</td>
</tr>
<tr style="color: #000000;">
<td>Coeffects</td>
<td>组件依赖哪些外部能力或其他组件？</td>
</tr>
</tbody>
</table>
</section>
<p data-tool="mdnice编辑器">DSH 的目标不是让所有模块都能任意修改系统，而是让变化成为一种<strong>显式、可追踪、可逆的运行时操作</strong>。</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #ffffff;">4.1 Context：为能力提供明确边界</span></h2>
<p data-tool="mdnice编辑器">一个组件不能直接访问所有系统状态。</p>
<p data-tool="mdnice编辑器">它应该通过 Context 获取所需能力，例如：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">Context
├── Model Registry
├── Tool Registry
├── Memory
├── Event Bus
├── Session
├── Logger
├── Storage
├── Permission
└── Environment
</code></pre>
<p data-tool="mdnice编辑器">Context 的第一层作用是解耦。</p>
<p data-tool="mdnice编辑器">组件不需要知道某个能力的具体实现，只需要知道运行环境向它提供了什么。</p>
<p data-tool="mdnice编辑器">例如，一个模型路由组件可能只依赖：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">Model Registry
Task Metadata
Usage Metrics
</code></pre>
<p data-tool="mdnice编辑器">一个长期记忆组件可能只依赖：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">Session Events
Embedding Service
Storage
Context Injector
</code></pre>
<p data-tool="mdnice编辑器">一个工具组件则可能只依赖：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">Tool Registry
Credentials
Network
Logger
</code></pre>
<p data-tool="mdnice编辑器">Context 的第二层作用是限制能力边界。</p>
<p data-tool="mdnice编辑器">如果组件只能通过 Context 访问环境，那么系统就可以决定：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">哪些资源向它开放；</section>
</li>
<li>
<section style="color: #010101;">哪些能力只读；</section>
</li>
<li>
<section style="color: #010101;">哪些调用需要权限；</section>
</li>
<li>
<section style="color: #010101;">哪些状态不能跨组件共享；</section>
</li>
<li>
<section style="color: #010101;">哪些操作只能在 Sandbox 中执行。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">因此，Context 不只是依赖注入，也是一种能力安全模型：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">组件能做什么
≈
Context 向它暴露什么
</code></pre>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #ffffff;">4.2 Effect 与 Cleanup：让变化可以被撤销</span></h2>
<p data-tool="mdnice编辑器">当组件加入 Harness 时，通常会产生副作用。</p>
<p data-tool="mdnice编辑器">例如：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">注册一个工具；</section>
</li>
<li>
<section style="color: #010101;">添加一个事件监听器；</section>
</li>
<li>
<section style="color: #010101;">打开数据库连接；</section>
</li>
<li>
<section style="color: #010101;">启动后台任务；</section>
</li>
<li>
<section style="color: #010101;">修改模型路由；</section>
</li>
<li>
<section style="color: #010101;">向上下文注入内容；</section>
</li>
<li>
<section style="color: #010101;">挂载文件目录；</section>
</li>
<li>
<section style="color: #010101;">注册快捷键；</section>
</li>
<li>
<section style="color: #010101;">创建缓存；</section>
</li>
<li>
<section style="color: #010101;">改变权限策略。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">这些变化可以统一理解为 Effect：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">Component
    ↓
Effect
    ↓
Harness 状态发生变化
</code></pre>
<p data-tool="mdnice编辑器">问题在于，大多数插件系统只强调如何创建 Effect，却没有把撤销 Effect 当作同等重要的能力。</p>
<p data-tool="mdnice编辑器">于是，组件卸载后可能出现：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">工具仍然留在 Registry 中；</section>
</li>
<li>
<section style="color: #010101;">事件监听器重复注册；</section>
</li>
<li>
<section style="color: #010101;">后台任务继续运行；</section>
</li>
<li>
<section style="color: #010101;">网络连接没有关闭；</section>
</li>
<li>
<section style="color: #010101;">临时文件没有删除；</section>
</li>
<li>
<section style="color: #010101;">Context 中残留失效状态；</section>
</li>
<li>
<section style="color: #010101;">新旧路由规则同时生效。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">在 DSH 中，Effect 应该返回对应的 Cleanup：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">Effect(Context) → Cleanup
</code></pre>
<p data-tool="mdnice编辑器">例如：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;"><span class="hljs-function"><span class="hljs-keyword" style="color: #c678dd;">function</span> <span class="hljs-title" style="color: #61aeee;">activate</span>(<span class="hljs-params">context</span>) </span>{
  <span class="hljs-keyword" style="color: #c678dd;">const</span> unregister = context.tools.register(myTool)

  <span class="hljs-keyword" style="color: #c678dd;">return</span> <span class="hljs-function"><span class="hljs-keyword" style="color: #c678dd;">function</span> <span class="hljs-title" style="color: #61aeee;">cleanup</span>() </span>{
    unregister()
  }
}
</code></pre>
<p data-tool="mdnice编辑器">更复杂的组件可能产生多个副作用：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;"><span class="hljs-function"><span class="hljs-keyword" style="color: #c678dd;">function</span> <span class="hljs-title" style="color: #61aeee;">activate</span>(<span class="hljs-params">context</span>) </span>{
  <span class="hljs-keyword" style="color: #c678dd;">const</span> stopTool = registerTool(context)
  <span class="hljs-keyword" style="color: #c678dd;">const</span> stopListener = registerListener(context)
  <span class="hljs-keyword" style="color: #c678dd;">const</span> stopWorker = startWorker(context)
  <span class="hljs-keyword" style="color: #c678dd;">const</span> closeConnection = connectDatabase(context)

  <span class="hljs-keyword" style="color: #c678dd;">return</span> <span class="hljs-keyword" style="color: #c678dd;">async</span> <span class="hljs-function"><span class="hljs-keyword" style="color: #c678dd;">function</span> <span class="hljs-title" style="color: #61aeee;">cleanup</span>() </span>{
    <span class="hljs-keyword" style="color: #c678dd;">await</span> stopWorker()
    stopListener()
    stopTool()
    <span class="hljs-keyword" style="color: #c678dd;">await</span> closeConnection()
  }
}
</code></pre>
<p data-tool="mdnice编辑器">这使组件具备完整生命周期：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">创建
  ↓
激活
  ↓
运行
  ↓
停用
  ↓
清理
</code></pre>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #ffffff;">4.3 时间可组合性：让 Agent 有资格试错</span></h2>
<p data-tool="mdnice编辑器">Effect 与 Cleanup 提供的是一种<strong>时间可组合性</strong>。</p>
<p data-tool="mdnice编辑器">一个组件可以在某个时刻进入系统，也可以在另一个时刻完整退出：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">t₀：Harness 原始状态

t₁：组件进入
    → 注册工具
    → 启动服务
    → 注入上下文

t₂：组件运行

t₃：组件退出
    → 移除工具
    → 停止服务
    → 撤销上下文

t₄：Harness 恢复到可预测状态
</code></pre>
<p data-tool="mdnice编辑器">这对普通插件系统很重要，但对自生长系统更重要。</p>
<p data-tool="mdnice编辑器">因为自生长必然包含试错。</p>
<p data-tool="mdnice编辑器">Agent 创建的新工具、新路由器、新记忆策略，不可能每次都正确。如果一次失败的尝试不能被完整撤销，那么每次实验都会向系统中留下残余状态。</p>
<p data-tool="mdnice编辑器">最终，所谓“生长”就会退化成不可控的复杂度积累。</p>
<p data-tool="mdnice编辑器">因此，自生长的基本过程不应该是：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">生成组件
  ↓
永久安装
</code></pre>
<p data-tool="mdnice编辑器">而应该是：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">生成候选组件
      ↓
执行受控 Effect
      ↓
验证运行结果
   ┌──┴──┐
 成功    失败
  │       │
保留   Cleanup
</code></pre>
<p data-tool="mdnice编辑器">Cleanup 的意义不只是“支持热卸载”。</p>
<p data-tool="mdnice编辑器">它赋予 Agent 一种更关键的能力：</p>
<blockquote class="custom-blockquote multiquote-1" data-tool="mdnice编辑器"><p>在不永久污染系统的前提下试验新的自身结构。</p></blockquote>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #ffffff;">4.4 Coeffects：让依赖关系成为运行时的一部分</span></h2>
<p data-tool="mdnice编辑器">时间可组合性解决的是组件何时进入、何时退出。</p>
<p data-tool="mdnice编辑器">但 Agent Harness 的组件并不是彼此孤立的。</p>
<p data-tool="mdnice编辑器">如果依赖关系只是组件内部的隐式假设，运行时就无法回答：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">组件现在能否启动？</section>
</li>
<li>
<section style="color: #010101;">它缺少什么能力？</section>
</li>
<li>
<section style="color: #010101;">某个依赖消失后，哪些组件应该停用？</section>
</li>
<li>
<section style="color: #010101;">替换一个 Provider 会影响哪些组件？</section>
</li>
<li>
<section style="color: #010101;">哪些组件可以被安全卸载？</section>
</li>
<li>
<section style="color: #010101;">一个候选组件是否与当前环境兼容？</section>
</li>
</ul>
<p data-tool="mdnice编辑器">Coeffects 用于显式表达组件所需的外部条件：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">Effect：
组件对系统做什么

Coeffects：
组件需要系统提供什么
</code></pre>
<p data-tool="mdnice编辑器">例如：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;"><span class="hljs-keyword" style="color: #c678dd;">const</span> vectorMemory = {
  coeffects: [
    <span class="hljs-string" style="color: #98c379;">"embedding-model"</span>,
    <span class="hljs-string" style="color: #98c379;">"vector-storage"</span>,
    <span class="hljs-string" style="color: #98c379;">"session-events"</span>
  ],

  effect(context) {
    <span class="hljs-comment" style="font-style: italic; color: #5c6370;">// 激活 Memory</span>
    <span class="hljs-keyword" style="color: #c678dd;">return</span> cleanup
  }
}
</code></pre>
<p data-tool="mdnice编辑器">运行时可以根据当前 Context 判断组件是否具备激活条件：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">依赖全部满足
    ↓
组件激活

依赖不完整
    ↓
组件保持未激活

依赖运行中消失
    ↓
执行 Cleanup
</code></pre>
<p data-tool="mdnice编辑器">这使 Harness 不再只是一个插件列表，而是一个动态依赖图：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">Credential
    ↓
GitHub Provider
    ↓
GitHub Tool
    ↓
Repository Agent
</code></pre>
<p data-tool="mdnice编辑器">或者：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">Embedding Model ─┐
                 ├→ Vector Memory → Context Injector
Vector Storage ──┘
</code></pre>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #ffffff;">4.5 空间可组合性：让生长不是无序堆积</span></h2>
<p data-tool="mdnice编辑器">Coeffects 提供的是一种<strong>空间可组合性</strong>。</p>
<p data-tool="mdnice编辑器">组件不是按照固定顺序硬编码在系统中，而是根据能力和依赖形成运行时拓扑。</p>
<p data-tool="mdnice编辑器">当一个能力出现时，依赖它的组件可以被激活；当这个能力消失时，相关组件可以被停用：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">Sandbox 出现
    ↓
Code Executor 激活
    ↓
Test Runner 激活
    ↓
Coding Agent 获得安全执行能力
</code></pre>
<p data-tool="mdnice编辑器">如果 Sandbox 被移除：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">Sandbox 消失
    ↓
Code Executor Cleanup
    ↓
Test Runner Cleanup
    ↓
相关工具从 Agent 能力集合中撤销
</code></pre>
<p data-tool="mdnice编辑器">这与传统插件系统有一个关键区别。</p>
<p data-tool="mdnice编辑器">传统插件系统更像：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">安装了什么
=
系统拥有什么
</code></pre>
<p data-tool="mdnice编辑器">而动态组件运行时更像：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">当前可用能力
=
当前组件
× 当前依赖
× 当前环境
× 当前权限
</code></pre>
<p data-tool="mdnice编辑器">这使 Harness 的结构可以随着任务和环境变化，而不是不断向全局系统中永久添加模块。</p>
<p data-tool="mdnice编辑器">真正的生长，不是组件数量持续增加，而是系统能够形成更适合当前任务的能力结构。</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #ffffff;">4.6 从动态重组到自生长闭环</span></h2>
<p data-tool="mdnice编辑器">Context、Effect、Cleanup 和 Coeffects 为动态重组提供了基础。</p>
<p data-tool="mdnice编辑器">但必须强调：</p>
<blockquote class="custom-blockquote multiquote-1" data-tool="mdnice编辑器"><p>动态重组是自生长的必要条件，不是自生长的全部。</p></blockquote>
<p data-tool="mdnice编辑器">完整的自生长至少需要五个阶段。</p>
<h3 data-tool="mdnice编辑器"><span class="content">4.6.1 第一阶段：发现能力缺口</span></h3>
<p data-tool="mdnice编辑器">Agent 首先要判断自己缺少什么。</p>
<p data-tool="mdnice编辑器">例如：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">当前没有访问某类数据的工具；</section>
</li>
<li>
<section style="color: #010101;">现有 Tool 无法处理特定协议；</section>
</li>
<li>
<section style="color: #010101;">Memory 无法支持长期任务；</section>
</li>
<li>
<section style="color: #010101;">当前模型不适合某类输入；</section>
</li>
<li>
<section style="color: #010101;">缺少项目专用的验证流程；</section>
</li>
<li>
<section style="color: #010101;">当前执行环境不满足安全要求；</section>
</li>
<li>
<section style="color: #010101;">工具调用成本或延迟过高。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">能力缺口不能只由「工具调用失败」判断。</p>
<p data-tool="mdnice编辑器">它还可能来自：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">任务规划；</section>
</li>
<li>
<section style="color: #010101;">运行指标；</section>
</li>
<li>
<section style="color: #010101;">用户反馈；</section>
</li>
<li>
<section style="color: #010101;">测试结果；</section>
</li>
<li>
<section style="color: #010101;">历史失败记录；</section>
</li>
<li>
<section style="color: #010101;">现有能力清单；</section>
</li>
<li>
<section style="color: #010101;">环境变化。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">因此，自生长的起点不是生成代码，而是：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">目标要求
-
当前能力
=
能力缺口
</code></pre>
<h3 data-tool="mdnice编辑器"><span class="content">4.6.2 第二阶段：生成或引入候选能力</span></h3>
<p data-tool="mdnice编辑器">识别缺口后，Agent 可以选择不同方式补齐能力：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">编写新的 Tool；</section>
</li>
<li>
<section style="color: #010101;">生成新的 Skill；</section>
</li>
<li>
<section style="color: #010101;">安装已有 Package；</section>
</li>
<li>
<section style="color: #010101;">包装外部 API；</section>
</li>
<li>
<section style="color: #010101;">组合已有组件；</section>
</li>
<li>
<section style="color: #010101;">替换 Memory Provider；</section>
</li>
<li>
<section style="color: #010101;">调整模型 Router；</section>
</li>
<li>
<section style="color: #010101;">创建新的工作流；</section>
</li>
<li>
<section style="color: #010101;">启动一个专用子 Agent；</section>
</li>
<li>
<section style="color: #010101;">为现有组件增加适配层。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">这里的关键词是「候选」。</p>
<p data-tool="mdnice编辑器">Agent 生成的组件不能因为能够编译或加载，就自动成为系统的永久能力。</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">生成成功
≠
能力有效
≠
适合长期保留
</code></pre>
<h3 data-tool="mdnice编辑器"><span class="content">4.6.3 第三阶段：在受控环境中激活</span></h3>
<p data-tool="mdnice编辑器">候选组件应该先进入受限 Context。</p>
<p data-tool="mdnice编辑器">系统需要明确：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">它可以访问哪些目录；</section>
</li>
<li>
<section style="color: #010101;">可以调用哪些网络服务；</section>
</li>
<li>
<section style="color: #010101;">是否可以读取凭证；</section>
</li>
<li>
<section style="color: #010101;">可以注册哪些工具；</section>
</li>
<li>
<section style="color: #010101;">能否修改全局状态；</section>
</li>
<li>
<section style="color: #010101;">资源消耗上限是多少；</section>
</li>
<li>
<section style="color: #010101;">运行时间是否受限；</section>
</li>
<li>
<section style="color: #010101;">哪些副作用必须登记。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">这一点尤其重要，因为扩展代码通常拥有较高权限。</p>
<p data-tool="mdnice编辑器">以 Pi 为例，其官方安全文档明确说明，内置工具和 Extension 默认继承启动 Pi 的进程权限；第三方 Package 可能执行代码或指示模型执行操作，因此需要代码审查，并在需要时依赖容器或虚拟化提供真正的隔离边界。(<a style="font-weight: bold; color: #ef7060;" href="https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/docs/packages.md">github.com</a>)</p>
<p data-tool="mdnice编辑器">如果 Agent 开始自行生成和加载组件，权限问题只会更加突出。</p>
<p data-tool="mdnice编辑器">所以，自生长必须建立在受控运行时上，而不能建立在「默认信任所有新代码」之上。</p>
<h3 data-tool="mdnice编辑器"><span class="content">4.6.4 第四阶段：验证、保留或回滚</span></h3>
<p data-tool="mdnice编辑器">候选能力激活后，系统需要对它进行验证。</p>
<p data-tool="mdnice编辑器">验证可以包括：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">能否完成目标任务；</section>
</li>
<li>
<section style="color: #010101;">是否通过单元测试；</section>
</li>
<li>
<section style="color: #010101;">是否破坏已有功能；</section>
</li>
<li>
<section style="color: #010101;">是否产生未声明的副作用；</section>
</li>
<li>
<section style="color: #010101;">是否扩大了不必要的权限；</section>
</li>
<li>
<section style="color: #010101;">是否降低了任务成本；</section>
</li>
<li>
<section style="color: #010101;">是否提高了成功率；</section>
</li>
<li>
<section style="color: #010101;">是否造成明显的上下文膨胀；</section>
</li>
<li>
<section style="color: #010101;">是否与现有组件冲突；</section>
</li>
<li>
<section style="color: #010101;">Cleanup 是否完整。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">验证结果通常有三种：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">验证通过
    ↓
保留或固化

部分通过
    ↓
修改后重新试验

验证失败
    ↓
Cleanup + 回滚
</code></pre>
<p data-tool="mdnice编辑器">因此，自生长不是一次性的代码生成，而是一个选择过程：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">Generate
→ Activate
→ Observe
→ Evaluate
→ Select
</code></pre>
<p data-tool="mdnice编辑器">没有评估的生成，只是变化。</p>
<p data-tool="mdnice编辑器">经过评估和选择的变化，才可能成为生长。</p>
<h3 data-tool="mdnice编辑器"><span class="content">4.6.5 第五阶段：沉淀、复用与淘汰</span></h3>
<p data-tool="mdnice编辑器">一次任务中的成功，不代表组件值得永久保留。</p>
<p data-tool="mdnice编辑器">系统还需要决定：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">这项能力是否跨会话有效？</section>
</li>
<li>
<section style="color: #010101;">它适用于哪些任务？</section>
</li>
<li>
<section style="color: #010101;">应该在什么条件下重新激活？</section>
</li>
<li>
<section style="color: #010101;">它依赖哪些版本？</section>
</li>
<li>
<section style="color: #010101;">它的权限范围是什么？</section>
</li>
<li>
<section style="color: #010101;">它由谁生成？</section>
</li>
<li>
<section style="color: #010101;">经过了哪些测试？</section>
</li>
<li>
<section style="color: #010101;">是否允许自动升级？</section>
</li>
<li>
<section style="color: #010101;">何时应该重新评估？</section>
</li>
<li>
<section style="color: #010101;">何时应该被淘汰？</section>
</li>
</ul>
<p data-tool="mdnice编辑器">因此，一个可复用组件除了代码，还需要附带元数据：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">Component
├── Implementation
├── Capability Description
├── Coeffects
├── Permissions
├── Validation Records
├── Version
├── Provenance
├── Metrics
├── Effect
└── Cleanup
</code></pre>
<p data-tool="mdnice编辑器">真正的自生长闭环应当是：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">发现缺口
  ↓
生成候选能力
  ↓
隔离激活
  ↓
观察与验证
  ↓
保留或回滚
  ↓
沉淀为可复用组件
  ↓
持续评估
  ↓
升级或淘汰
</code></pre>
<hr data-tool="mdnice编辑器" />
<h1 data-tool="mdnice编辑器"><span class="content">5. Pi 与 DSH 的核心差异</span></h1>
<p data-tool="mdnice编辑器">Pi 与 DSH 并不是简单的替代关系。</p>
<p data-tool="mdnice编辑器">它们关注的是两个不同层次的问题。</p>
<section class="table-container" data-tool="mdnice编辑器">
<table>
<thead>
<tr>
<th style="color: #000000;">维度</th>
<th style="color: #000000;">Pi</th>
<th style="color: #000000;">DSH</th>
</tr>
</thead>
<tbody>
<tr style="color: #000000;">
<td>核心目标</td>
<td>构建开放、可定制的 Agent Harness</td>
<td>构建支持动态变化的组件运行时</td>
</tr>
<tr style="color: #000000;">
<td>能力来源</td>
<td>Extensions、Skills、Prompts、Packages</td>
<td>运行时组件及其依赖关系</td>
</tr>
<tr style="color: #000000;">
<td>主要变化发起者</td>
<td>用户、开发者，也可以由 Agent 辅助</td>
<td>用户、系统或 Agent</td>
</tr>
<tr style="color: #000000;">
<td>组件组织方式</td>
<td>扩展资源与 Package</td>
<td>动态依赖图</td>
</tr>
<tr style="color: #000000;">
<td>激活方式</td>
<td>启动加载、临时加载或重新加载</td>
<td>根据 Context 与 Coeffects 激活</td>
</tr>
<tr style="color: #000000;">
<td>生命周期</td>
<td>以扩展加载和配置为中心</td>
<td>Effect 与 Cleanup 对称管理</td>
</tr>
<tr style="color: #000000;">
<td>依赖治理</td>
<td>主要由扩展代码和包依赖处理</td>
<td>将运行时能力依赖显式化</td>
</tr>
<tr style="color: #000000;">
<td>失败处理</td>
<td>依赖扩展实现、进程或会话边界</td>
<td>通过 Cleanup 支持组件级回滚</td>
</tr>
<tr style="color: #000000;">
<td>演化方向</td>
<td>从固定产品走向开放平台</td>
<td>从开放平台走向受控自生长</td>
</tr>
<tr style="color: #000000;">
<td>核心价值</td>
<td>让 Harness 容易被改变</td>
<td>让 Harness 可以安全地持续改变</td>
</tr>
</tbody>
</table>
</section>
<p data-tool="mdnice编辑器">可以把两者的关系概括为：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">Pi：
稳定核心
+
开放扩展点
+
能力分发机制

DSH：
组件化 Context
+
显式 Coeffects
+
可逆 Effect
+
动态生命周期
</code></pre>
<p data-tool="mdnice编辑器">Pi 解决了「能力能否加入」的问题。</p>
<p data-tool="mdnice编辑器">DSH 更关注「能力如何进入、如何协作、如何退出，以及如何在运行时形成新的结构」。</p>
<h1 data-tool="mdnice编辑器"><span class="content">6. 从可扩展到自生长，中间还差什么</span></h1>
<p data-tool="mdnice编辑器">可以把 Agent Harness 的演进分为三个阶段。</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #ffffff;">6.1 第一阶段：固定能力</span></h2>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">模型
+
固定提示词
+
固定工具
</code></pre>
<p data-tool="mdnice编辑器">系统能够执行任务，但能力边界在设计阶段已经确定。</p>
<p data-tool="mdnice编辑器">如果缺少能力，只能由开发者修改产品代码并重新发布。</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #ffffff;">6.2 第二阶段：开放扩展</span></h2>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">稳定核心
+
Extensions
+
Skills
+
Packages
+
开放 API
</code></pre>
<p data-tool="mdnice编辑器">用户和开发者可以持续增加能力。</p>
<p data-tool="mdnice编辑器">Agent 也可以帮助编写扩展，但扩展的发现、安装、验证和维护通常仍然依赖人工流程。</p>
<p data-tool="mdnice编辑器">Pi 代表了这一阶段的重要方向：Harness 不再是一个封闭产品，而成为可以根据个人工作流持续定制的平台。</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #ffffff;">6.3 第三阶段：受控自生长</span></h2>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">稳定内核
+
能力缺口识别
+
候选组件生成
+
动态组件运行时
+
显式依赖
+
可逆副作用
+
隔离验证
+
自动回滚
+
能力沉淀
+
持续淘汰
</code></pre>
<p data-tool="mdnice编辑器">Agent 不再只是等待外部为它安装能力。</p>
<p data-tool="mdnice编辑器">它可以根据任务识别不足，提出新的能力结构，在受控环境中试验，并根据结果决定保留、修改还是撤销。</p>
<p data-tool="mdnice编辑器">这时，Agent 的角色从能力消费者变成了能力形成过程的参与者。</p>
<h1 data-tool="mdnice编辑器"><span class="content">7. 自生长不等于无限增长</span></h1>
<p data-tool="mdnice编辑器">「自生长」并不是 Agent 不断为自己增加工具和代码。</p>
<p data-tool="mdnice编辑器">无限增加不是生长，而是熵增。</p>
<p data-tool="mdnice编辑器">一个只会添加能力、不会清理能力的系统，最终会出现：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">工具数量不断膨胀；</section>
</li>
<li>
<section style="color: #010101;">相似能力重复实现；</section>
</li>
<li>
<section style="color: #010101;">组件版本相互冲突；</section>
</li>
<li>
<section style="color: #010101;">权限范围持续扩大；</section>
</li>
<li>
<section style="color: #010101;">上下文被大量描述占据；</section>
</li>
<li>
<section style="color: #010101;">路由规则越来越难以理解；</section>
</li>
<li>
<section style="color: #010101;">无效监听器和后台任务持续运行；</section>
</li>
<li>
<section style="color: #010101;">Agent 无法判断应该使用哪个工具；</section>
</li>
<li>
<section style="color: #010101;">系统行为逐渐不可预测。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">因此，自生长必须同时包含四种能力：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">增加
+
选择
+
清理
+
遗忘
</code></pre>
<p data-tool="mdnice编辑器">可以进一步表示为：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">可持续生长
=
生成新能力
-
淘汰无效能力
+
重组已有能力
</code></pre>
<p data-tool="mdnice编辑器">这也是 Cleanup 和生命周期管理的重要性所在。</p>
<p data-tool="mdnice编辑器">真正成熟的 Agent 不仅要知道「我还需要什么」，还要知道：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">什么已经不需要了；</section>
</li>
<li>
<section style="color: #010101;">什么正在产生负面影响；</section>
</li>
<li>
<section style="color: #010101;">什么应该暂时停用；</section>
</li>
<li>
<section style="color: #010101;">什么可以被更简单的组件替代；</section>
</li>
<li>
<section style="color: #010101;">什么经验只适用于过去的环境。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">遗忘不是生长的反面。</p>
<p data-tool="mdnice编辑器"><strong>受控遗忘本身就是生长的一部分。</strong></p>
<h1 data-tool="mdnice编辑器"><span class="content">9. Pi 与 DSH 不是替代，而是演进</span></h1>
<p data-tool="mdnice编辑器">Pi 的价值在于证明了一件事：</p>
<blockquote class="custom-blockquote multiquote-1" data-tool="mdnice编辑器"><p>Agent Harness 不需要是一个功能固定的封闭产品。</p></blockquote>
<p data-tool="mdnice编辑器">通过开放 Extension、Skill、Prompt 和 Package，Harness 可以被用户重新塑造，也可以让 Agent 辅助编写自身需要的扩展。</p>
<p data-tool="mdnice编辑器">这已经比传统 Agent 产品向前迈出了一大步。</p>
<p data-tool="mdnice编辑器">DSH 所代表的方向，则是在此基础上进一步抽象：</p>
<blockquote class="custom-blockquote multiquote-1" data-tool="mdnice编辑器"><p>如果 Agent 可以创建新能力，那么这些新能力应该如何成为运行时的一等公民？</p></blockquote>
<p data-tool="mdnice编辑器">答案不能只是把更多代码放进扩展目录。</p>
<p data-tool="mdnice编辑器">系统还需要：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">明确组件所处的 Context；</section>
</li>
<li>
<section style="color: #010101;">显式声明组件依赖的 Coeffects；</section>
</li>
<li>
<section style="color: #010101;">管理组件产生的 Effect；</section>
</li>
<li>
<section style="color: #010101;">在组件退出时执行 Cleanup；</section>
</li>
<li>
<section style="color: #010101;">根据环境变化重新计算能力拓扑；</section>
</li>
<li>
<section style="color: #010101;">对候选能力进行验证；</section>
</li>
<li>
<section style="color: #010101;">将有效能力沉淀下来；</section>
</li>
<li>
<section style="color: #010101;">将失效能力安全淘汰。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">因此，二者可以形成一种递进关系：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">Pi：
让 Harness 可以被修改

        ↓

DSH：
让修改具有显式生命周期

        ↓

自生长 Agent：
让 Agent 可以发起、验证并沉淀修改
</code></pre>
<p data-tool="mdnice编辑器">从这个角度看，DSH 不是对 Pi 的否定。</p>
<p data-tool="mdnice编辑器">它是在 Pi 所代表的开放扩展思路上，将“变化”进一步提升为运行时的核心抽象。</p>
<h1 data-tool="mdnice编辑器"><span class="content">10. Harness 正在成为 Agent 的生长环境</span></h1>
<p data-tool="mdnice编辑器">如果说 Pi 的核心贡献，是把 Agent 从一个封闭产品变成一个可编程、可扩展的平台，那么 DSH 所探索的下一步，就是让 Agent 逐渐成为自身能力变化的参与者。</p>
<p data-tool="mdnice编辑器">它不只是使用已有工具，还可以：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">发现能力缺口；</section>
</li>
<li>
<section style="color: #010101;">创建候选组件；</section>
</li>
<li>
<section style="color: #010101;">调整能力组合；</section>
</li>
<li>
<section style="color: #010101;">在受控环境中试验；</section>
</li>
<li>
<section style="color: #010101;">根据结果保留或回滚；</section>
</li>
<li>
<section style="color: #010101;">将成功经验沉淀为长期能力。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">但自生长不等于无限增加。</p>
<p data-tool="mdnice编辑器">一个只会安装新工具、写入新记忆、叠加新策略的 Agent，最终只会被自己积累的复杂度拖垮。</p>
<p data-tool="mdnice编辑器">真正可持续的生长，必须同时包含：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">发现
→ 生成
→ 激活
→ 验证
→ 选择
→ 清理
→ 沉淀
→ 淘汰
</code></pre>
<p data-tool="mdnice编辑器">Pi 回答了：</p>
<blockquote class="custom-blockquote multiquote-1" data-tool="mdnice编辑器"><p>如何让 Agent Harness 可以被持续扩展？</p></blockquote>
<p data-tool="mdnice编辑器">DSH 则进一步追问：</p>
<blockquote class="custom-blockquote multiquote-1" data-tool="mdnice编辑器"><p>如何让 Agent 安全地参与自身能力的形成？</p></blockquote>
<p data-tool="mdnice编辑器">从 Pi 到 DSH，变化的不只是扩展机制，而是 Harness 的角色。</p>
<p data-tool="mdnice编辑器">它正在从承载工具与插件的工程框架，转变为支持能力试验、筛选、重组和沉淀的运行环境。</p>
<p data-tool="mdnice编辑器">未来的 Agent Harness 可能不再只是模型与工具之间的连接层。</p>
<p data-tool="mdnice编辑器">它还将成为 Agent 管理自身变化的基础设施：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">允许新能力出现；</section>
</li>
<li>
<section style="color: #010101;">阻止错误变化扩散；</section>
</li>
<li>
<section style="color: #010101;">保存经过验证的经验；</section>
</li>
<li>
<section style="color: #010101;">清除已经失效的结构；</section>
</li>
<li>
<section style="color: #010101;">在保持稳定内核的同时持续重组外围能力。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">只有当 Agent 既能增加能力，也能验证、回滚、清理和遗忘时，它才真正具备从「可扩展的软件」走向「可持续生长的系统」的可能。</p>
<p data-tool="mdnice编辑器">以上。</p>
</section>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2026/08/from-pi-to-dsh-how-agent-harness-evolves-from-scalable-to-self-growing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
