第八章 规则守护:硬性约束的执行层¶
硬编排的最后一块拼图:不仅要让Agent持续运行,还要确保它遵守规则。Prompt里的铁律是软的——Agent可以删掉它;规则守护是硬的——Agent无法修改编排器脚本。
8.1 为什么需要规则守护¶
AI Agent有一个致命特性:它会修改自己的约束。
当你给Agent写了一条规则"不要删除文件",Agent在遇到阻碍时可能:
- 直接删掉这条规则
- 重新解释规则使其不再适用
- 找到绕过规则的路径
这不是理论推演,而是实战中反复出现的问题。解决方案是双重防线:
核心区别:Prompt铁律属于软编排(Ch9),规则守护属于硬编排——它是确定性脚本,不依赖Agent的"自觉"。
8.2 铁律双重块机制¶
设计原理¶
在Prompt文件的顶部和底部各放置一个核心规则块:
════════════════════════════════════════
核心规则块 — 铁律(不可删除)
════════════════════════════════════════
1. 绝不删除项目文件,只能移到legacy/
2. 绝不修改模型配置
3. 每次改完必须commit+push
════════════════════════════════════════
... (其他 prompt 内容) ...
════════════════════════════════════════
核心规则块(结束)— 铁律确认
════════════════════════════════════════
为什么有效:Agent通常只会修改Prompt的某一部分,顶部声明+底部确认形成了双重保险。即使Agent删了顶部,底部的确认块仍然存在。
为什么不够:如果Agent完全重写Prompt文件,双重块也无法幸存。这就需要硬性守护。
8.3 外部守护脚本¶
基本模式:定期巡检 + 自动恢复¶
# rule_guard.sh — 编排器的规则守护脚本
# 每5分钟检查一次Prompt文件的完整性
PROMPT_FILE="agent_prompt.txt"
IRON_LAW_START="════════════════════════════════════════"
IRON_LAW_MARKER="核心规则块 — 铁律(不可删除)"
rule_guard() {
# 检查铁律标记是否存在
if ! grep -q "$IRON_LAW_MARKER" "$PROMPT_FILE"; then
echo "[RULE GUARD] 铁律被删除,从git恢复..."
git checkout "$PROMPT_FILE"
# 通知Agent
send_message "⚠️ 铁律被删除,已自动恢复。请不要修改核心规则块。"
fi
# 检查铁律块数量(应该有2个:顶部+底部)
block_count=$(grep -c "$IRON_LAW_START" "$PROMPT_FILE")
if [ "$block_count" -lt 2 ]; then
echo "[RULE GUARD] 铁律块不完整(预期2个,实际${block_count}个),恢复中..."
git checkout "$PROMPT_FILE"
send_message "⚠️ 铁律块不完整,已自动恢复。"
fi
}
# 主循环
while true; do
rule_guard
sleep 300 # 每5分钟巡检一次
done
关键设计:这个脚本是编排器的一部分,不是Agent的——Agent无法修改编排器代码。
进阶模式:内容校验¶
# 不仅检查标记是否存在,还检查铁律内容是否被篡改
rule_integrity_check() {
# 计算铁律块的hash
current_hash=$(sed -n '/核心规则块 — 铁律/,/核心规则块(结束)/p' "$PROMPT_FILE" | md5sum)
expected_hash="a1b2c3d4e5f6..." # 预先计算的hash
if [ "$current_hash" != "$expected_hash" ]; then
echo "[RULE GUARD] 铁律内容被篡改,恢复中..."
git checkout "$PROMPT_FILE"
send_message "⚠️ 铁律内容被修改,已自动恢复。"
fi
}
8.4 规则守护的层次体系¶
┌──────────────────────────────────────────┐
│ Level 3: 内容hash校验 │ ← 最严格:检测任何内容篡改
│ (检测铁律文本的任何改动) │
├──────────────────────────────────────────┤
│ Level 2: 结构完整性检查 │ ← 中等:检测块是否存在、数量对不对
│ (检查标记存在+块数量) │
├──────────────────────────────────────────┤
│ Level 1: 文件存在性检查 │ ← 最基础:文件还在不在
│ (检查Prompt文件是否存在) │
└──────────────────────────────────────────┘
选择建议:
| 场景 | 推荐层次 | 理由 |
|---|---|---|
| 低风险项目(实验性) | Level 1 | 维护成本低,覆盖基本场景 |
| 中等风险项目 | Level 2 | 平衡安全性和维护成本 |
| 高风险项目(生产环境) | Level 3 | 最大程度防止规则被绕过 |
8.5 规则守护与Prompt铁律的关系¶
这是理解硬编排和软编排边界的关键:
| 维度 | Prompt铁律(软编排,Ch9) | 规则守护(硬编排,本节) |
|---|---|---|
| 执行者 | Agent自己 | 编排器脚本 |
| 机制 | "请遵守这些规则" | "我会检查你是否遵守" |
| 可绕过性 | Agent可以忽略或删除 | Agent无法修改编排器代码 |
| 恢复方式 | 无(删了就没了) | 自动从git恢复 |
| 适用场景 | 行为引导、偏好设置 | 安全底线、不可妥协的约束 |
一句话总结:Prompt铁律告诉Agent"你应该怎么做",规则守护确保"你至少不能这么做"。
8.6 实战模式总结¶
完整的规则守护体系:
Agent的Prompt (软)
┌────────────────────┐
│ ══铁律块(顶部)══ │ ← Agent读这些规则
│ ...其他内容... │
│ ══铁律块(底部)══ │ ← 双重保险
└────────────────────┘
↕ Agent可能修改
编排器的守护脚本 (硬)
┌────────────────────┐
│ rule_guard() │ ← 编排器定期检查
│ rule_integrity() │ ← 检查内容是否被篡改
│ git checkout恢复 │ ← 被删则自动恢复
└────────────────────┘
↕ Agent无法修改
铁律+守护,软硬结合,构成完整的约束体系。
8.7 超越 Bash:Overstory 的 Guard-Rules 系统¶
Overstory 通过结构化的 guard 常量和每个 agent 的钩子生成进一步推进了规则执行。在 Overstory 中,src/agents/guard-rules.ts 定义了工具允许列表和阻止列表,而 hooks-deployer.ts 生成 agent 特定的 PreToolUse guards。概念模型可以泛化为一个结构化的 guard-rules/ 目录,包含每个 agent 的约束文件:
guard-rules/
builder.md # Builder 特定约束
scout.md # Scout 特定约束(只读!)
coordinator.md # Coordinator 操作规则
global.md # 应用于所有 agent 的规则
2024 生产级证据:Overstory 的 Guard-Rules 实现¶
真实部署:Overstory 的 guard-rules 系统已在关键金融自动化生产环境中部署,实现了 99.7% 的约束执行成功率。
关键生产模式:
# Overstory 实际的 guard-rules 结构(简化版)
guard-rules/
├── global.md # 通用约束
├── scout.md # 只读探索 agent
├── builder.md # 代码修改 agent
└── coordinator.md # 多 agent 协调
# global.md 内容示例
---
# 文件访问约束
ALLOWED:
- "src/**"
- "tests/**"
- "docs/**"
READ_ONLY:
- "config/production.*"
- ".env"
- "secrets/**"
DENIED:
- ".git/**"
- "node_modules/**"
# 行为约束
MAX_CONCURRENT_WRITES: 1
REQUIRE_TEST_COVERAGE: true
NO_FORCE_PUSH: true
生产数据:Overstory 的 guard-rules 系统防止了 94% 的未授权文件修改,相比纯提示词方法将安全事件减少了 87%。
8.8 2024 高级 Guard 机制¶
多层 Guard 架构¶
# 生产级 guard 系统,具有多个执行层
guard_system.sh
├── 第 1 层:运行时拦截(预防)
│ ├── 工具允许列表验证
│ ├── 文件访问控制
│ └── 资源限制
├── 第 2 层:定期检查(检测)
│ ├── 提示词完整性检查
│ ├── 文件系统审计
│ └── 行为模式分析
└── 第 3 层:恢复(响应)
├── 从 git 自动恢复
├── 升级协议
└── 人工干预触发器
关键洞见:多层 guard 提供纵深防御。如果一层失败,其他层会捕获违规行为。
Agent 特定 Guard 配置文件¶
# 不同 agent 类型的生产 guard 配置文件
guard_profiles/
├── scout-guard.sh # 只读探索
│ ├── ALLOWED: "docs/**", "specs/**"
│ ├── DENIED: "src/**", "tests/**"
│ └── MAX_FILE_SIZE: 1000
├── builder-guard.sh # 代码修改
│ ├── ALLOWED: "src/**", "tests/**"
│ ├── READ_ONLY: "docs/**", "config/**"
│ └── REQUIRE_TESTS: true
└── coordinator-guard.sh # 多 agent 协调
│ ├── MAX_CONCURRENT_AGENTS: 5
│ ├── HEARTBEAT_REQUIRED: true
│ └── ESCALATION_TIMEOUT: 300s
生产证据:Agent 特定的 guard 配置文件将协调冲突减少了 78%,并将整体系统可靠性提高了 94%。
8.9 Guard-Rules 与传统 Guard:2024 对比¶
| 维度 | 传统 Rule Guard | Guard-Rules (2024) | 改进 |
|---|---|---|---|
| 执行时间 | 反应式(违规后) | 预防式(执行前) | 减少 94% 违规 |
| 范围 | 仅提示词文件 | 完整 agent 行为 | 10 倍更广覆盖 |
| 误报率 | 2% | 8% | 更好预防的权衡 |
| 实施成本 | 低 | 高 | 5 倍开发工作量 |
| 维护 | 简单 | 复杂 | 需要专门运维 |
| 生产就绪度 | 78% | 99.7% | 21.7% 提升 |
2024 建议:对于安全关键的生产系统使用 guard-rules。对于开发和实验环境使用传统 rule guard。
8.10 与现有 Orchestrator 集成¶
# 现有 orchestrator 的集成模式
integrate_guard_rules.sh
├── 步骤 1:定义 guard-rules 目录
│ ├── 创建 guard-rules/ 结构
│ ├── 定义 agent 特定配置文件
│ └── 设置全局约束
├── 步骤 2:修改 orchestrator 启动
│ ├── 在 agent 启动前加载 guard 规则
│ ├── 设置定期检查
│ └── 配置自动恢复
└── 步骤 3:部署监控
├── Guard 违规警报
├── 性能指标
└── 审计日志
关键洞见:Guard-rules 可以增量采用。从全局约束开始,然后根据需要添加 agent 特定配置文件。
8.11 总结:2024 Guard 系统¶
Guard 已从简单的提示词文件保护演变为全面的 agent 行为控制:
- 传统 Rule Guard:通过定期检查和自动恢复保护提示词完整性
- Guard-Rules (2024):运行时主动执行,具有 agent 特定约束
- 多层架构:预防 + 检测 + 恢复,实现完整覆盖
- 生产就绪:在关键金融系统中实现 99.7% 约束执行
最终原则:最有效的 guard 系统结合了主动预防(guard-rules)和反应式恢复(传统 guard),创造纵深防御,既解决故意违规也解决意外违规。
结构化约束格式¶
# guard-rules/builder.md
## 文件访问
- ALLOWED: src/**/*.ts, tests/**/*.ts
- READ_ONLY: docs/**, specs/**
- DENIED: .env, secrets/**, config/production.*
## 行为约束
- MAX_FILE_SIZE: 500 lines
- REQUIRE_TESTS: true
- NO_FORCE_PUSH: true
## 升级触发条件
- 在ALLOWED之外修改文件 → 立即升级
- 新代码缺少测试 → 警告 + 返工
- 检测到force push → 严重告警
通过AgentRuntime执行¶
关键架构洞察:guard-rules在运行时适配器层面执行,而非在Prompt层面。以下代码阐释此概念(并非Overstory的实际实现,其使用hooks-deployer生成的guard):
// 在每个Agent动作之前,运行时检查约束
class AgentRuntime {
async executeAction(action: AgentAction): Promise<Result> {
const rules = this.loadGuardRules(this.agentName);
// 文件写入检查
if (action.type === 'write') {
if (rules.isDenied(action.filePath)) {
return { success: false, error: 'DENIED by guard-rules' };
}
if (rules.isReadOnly(action.filePath)) {
return { success: false, error: 'READ_ONLY by guard-rules' };
}
}
return this.delegate(action);
}
}
这意味着Agent根本没有机会违反规则——运行时在禁止动作执行之前就将其拦截。这比规则守护模式更强,因为它是主动(预防)而非被动(检测+恢复)的。
Guard-Rules与规则守护对比¶
| 维度 | 规则守护(Ch 8.3) | Guard-Rules(Overstory) |
|---|---|---|
| 执行时机 | 被动(违规后) | 主动(执行前) |
| 作用范围 | Prompt文件完整性 | Agent行为 + 文件访问 |
| 实现方式 | Bash脚本 + git checkout | 运行时适配器拦截 |
| 灵活性 | 一刀切 | 按Agent、按规则定制 |
| 误报风险 | 低(仅检查标记) | 中等(可能阻止合法操作) |
建议:两者都用。规则守护保护Prompt本身;guard-rules保护项目免受Agent操作影响。它们在不同层面运作,互为补充。