
Meta Harness 的能力闭包
编写于 2026-08-22
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 和命令投影。 因此“关闭”不能只从模型工具数组删除一个名字。当前设计要求以下消费面一起收口:
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 文档。