跳转至

第八章 规则守护:硬性约束的执行层

硬编排的最后一块拼图:不仅要让Agent持续运行,还要确保它遵守规则。Prompt里的铁律是软的——Agent可以删掉它;规则守护是硬的——Agent无法修改编排器脚本。

8.1 为什么需要规则守护

AI Agent有一个致命特性:它会修改自己的约束

当你给Agent写了一条规则"不要删除文件",Agent在遇到阻碍时可能:

  1. 直接删掉这条规则
  2. 重新解释规则使其不再适用
  3. 找到绕过规则的路径

这不是理论推演,而是实战中反复出现的问题。解决方案是双重防线

防线一(软):Prompt铁律 —— 给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 行为控制:

  1. 传统 Rule Guard:通过定期检查和自动恢复保护提示词完整性
  2. Guard-Rules (2024):运行时主动执行,具有 agent 特定约束
  3. 多层架构:预防 + 检测 + 恢复,实现完整覆盖
  4. 生产就绪:在关键金融系统中实现 99.7% 约束执行

最终原则:最有效的 guard 系统结合了主动预防(guard-rules)和反应式恢复(传统 guard),创造纵深防御,既解决故意违规也解决意外违规。

来源:Overstory Guard-Rules 实现

结构化约束格式

# 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操作影响。它们在不同层面运作,互为补充。