---
title: "Meta Harness 的能力闭包"
description: "说明段落覆盖、middleware 卸载与内置 SubAgent 策略如何在会话创建时形成一致的能力边界。"
---

> Documentation Index
> Fetch the complete documentation index at: https://konghayao.github.io/peri-cool/llms.txt
> Use this file to discover all available pages before exploring further.

# Meta Harness 的能力闭包

Meta Harness 不是运行中的 prompt 开关，而是会话装配策略。它在创建会话时把配置解析为
一份冻结状态，再由同一份状态决定提示词段落、middleware 链和内置 SubAgent 定义是否存在。

## 一个 map，三类 key

| key 类型 | 行为 |
| --- | --- |
| 段落 ID | `true` 时读取 `.peri/meta/<ID>.md` 并整段替换 |
| middleware 名 | `false` 时跳过该组件；`true` 可恢复全局配置中的关闭项 |
| `BuiltInSubagents` | 控制 compile-time 内置定义，默认启用 |

全局与项目配置按 key 合并。项目可以恢复一个被全局关闭的 middleware，但不能用 `null`
删除全局 key。未知 key 会告警并忽略；非布尔值是配置错误。

## 关闭必须形成能力闭包

一个 middleware 可能同时拥有提示词段落、direct 工具、deferred 工具、Hook 和命令投影。
因此“关闭”不能只从模型工具数组删除一个名字。当前设计要求以下消费面一起收口：

```text
middleware 缺席
  → 持有段落缺席
  → direct 工具缺席
  → deferred index / resolver 缺席
  → slash route 与 ACP/TUI 投影缺席
  → SubAgent / Workflow 不继承该能力
```

工具视图按 session、按 turn 从当前生产链派生；ToolSearch 也从同一视图建立索引，不能
依赖一份静态工具名单猜测当前能力。

## 审批与提问已经拆分

`PermissionMiddleware` 持有审批策略和 `10_hitl`，`HumanInTheLoopMiddleware` 持有
`AskUserQuestion` 与 `12_ask_user`。这两个能力有不同的生命周期和失败语义：关闭审批
不应让提问消失，关闭提问也不应把敏感工具自动放行。

## 段落冻结，动态贡献按请求读取

段落覆盖在会话创建时进入 frozen base prompt。与此同时，当前 middleware 链还可以在
每次模型请求前提供 contribution，例如项目指引、Skills 摘要或 session-local 工具说明。
这些贡献只能追加在冻结前缀之后，不能回写 Transcript，也不能绕过当前能力策略。

这条分界同时服务一致性与缓存：冻结区保持稳定，运行时能力说明可以随当前 session-local
工具视图变化。Provider adapter 会在发送请求前消费内部缓存边界标记，模型不会看到该标记。

## `BuiltInSubagents` 的边界

`BuiltInSubagents: false` 只移除随二进制分发的 Agent 定义。项目与插件定义仍可进入
catalog，fork、resume、`Agent` 和 `AgentResult` 仍由 `SubAgentMiddleware` 控制。
如果目标是完全关闭子代理，应关闭 `SubAgentMiddleware`，而不是只修改定义来源。

## 验证方法

对每个配置同时写 presence 与 absence 检查：生产链里是否有该 middleware，提示词是否有
对应段落，工具视图和 ToolSearch 是否能发现相关工具，子代理与 Workflow 是否继承相同
边界。只看模型回复不能证明装配正确。

用户配置与风险说明见 [Meta Harness 文档](/peri-cool/docs/features/meta-harness/)。

Source: https://konghayao.github.io/peri-cool/posts/engineering/meta-harness/index.mdx
