<?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>Sun, 16 Aug 2026 05:16:50 +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>从 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>
