erdl-landing

ERDL —— 你的 Agent 打不破的护栏

中文 English

最后更新:2026-10-07 — 定位多 Agent 时代

License: MIT npm Vectors A2A Spec Deterministic Kernel Multi-agent

🚀 欢迎 POC —— 欢迎你在自己的环境中试用本项目概念验证。需要技术支持?随时联系 support@openoba.com。

Entity-Rule Definition Language · 实体规则定义语言

ERDL 是 AI Agent 的治理层 —— 确定性 when → then 规则、 可密码学验证的审计轨迹、多 Agent 系统的委托权威。 一份规范、一棵规范树、一个哈希 —— 跨实现逐字节验证一致。

永不放行。永不漏拦。可证明。

ERDL 在每一次工具调用、每一个决策、每一次委派发生之前,用你以纯 YAML 写下的规则 做检查 —— 求值发生在模型之外,提示词攻不破的安全边界。违规动作被拦截,并被 哈希锚定进审计链。同一条规则、同一份输入,在任何符合规范的实现上都产出 逐字节一致的结果与哈希。

最后一块空白层

Agent 基础设施正在被一层层补齐 —— 记忆、运行时安全、Agent 管理、团队编排。 每一层「给 Agent 加能力」的基础设施,都已经有了爆火的开源项目。

治理层是仅剩的空白。 ERDL 补上它:让自主性可部署、可审计的规则层。

ERDL 给你什么

层 治理什么 ERDL 原语
单 Agent 确定性 when → then 行为规则 34 节点表达树、Simple 30 运算符、13 决策
跨实现 每个决策的字节级可验证审计 决策对象(DO)+ 哈希链 + 342 一致性向量
多 Agent 委派链上的委托权威 §6a 状态块(FSM)+ §6b 委托权威不变量(INV-01~05)

为什么需要 ERDL?

问题 ERDL 的解法
LLM 输出是概率性的 —— 提示词可被越狱 规则在模型之外求值;安全边界从不押在提示词上
被委派的子 Agent 可能越权 委托权威不变量(INV-01~05) —— 权威不放大、溯源连续、窄化继承、传递撤销 —— 由事件驱动状态机(§6a)执行,由对抗向量(AV-01~14)证明
规则语义在各实现间漂移 342 条 JCS + SHA-256 向量强制逐字节一致 —— 三个独立实现交叉验证
合规要求审计轨迹 每一次求值都产出可密码学验证的哈希
业务人员看不懂代码 三个投影面(Simple / Expression / 决策表)编译到同一棵语义树

30 秒护栏

npm install @openoba/erdl
# refund.erdl.yaml
protocol: "erdl/v2"
version: "2.2.0"
metadata:
  name: "refund-guard"
  decision: ALLOW
  category: coding
rules:
  - name: "SEC-001-refund-limit"
    description: "Refunds over 5000 require human approval"
    priority: 10
    when:
      logic: AND
      conditions:
        - field: "tool.name"
          operator: eq
          value: "issue_refund"
        - field: "tool.args.amount"
          operator: gt
          value: 5000
    then: REQUEST_HUMAN
    message: "Refund amount over 5000, human approval required"
import { loadErdlFile, Evaluator } from '@openoba/erdl'

// 1. 从 YAML 文件加载规则
const { rules, metadata } = loadErdlFile('refund.erdl.yaml')

// 2. 对事实对象求值(兜底决策从 metadata 注入)
const result = new Evaluator().evaluate(
  rules,
  { tool: { name: 'issue_refund', args: { amount: 8000 } } },
  { fallbackDecision: metadata.decision },
)
console.log(result.decision) // 'REQUEST_HUMAN'

它在哪里接入

在你的 Agent 工具调用边界 —— 工具执行之前 —— 加一次 evaluate():

import { Evaluator } from '@openoba/erdl'

const result = new Evaluator().evaluate(rules, incomingToolCall, {
  fallbackDecision: 'DENY',
})

if (result.decision !== 'ALLOW') {
  haltForReview(result) // 你的处理函数:拦截调用、留存审计轨迹
}

只要你的 Agent 跑在 Node 上,ERDL 就能守护它。典型接入点:Claude Code hooks、 Codex / Cursor harness、MCP 服务器、A2A Agent、自研执行器。

本包提供文档加载器(loadErdlFile / parseErdlDocument)、求值引擎、 34 节点表达树内核、规则校验、YAML 序列化与模板引擎。 格式详见规范,完整 API 参考见 API.md。

我们攻击自己

多 Agent 安全模型在攻击下被证明成立 —— 十四条对抗向量(AV-01 ~ AV-14,SPEC §6b):

攻击 向量类别
子 Agent 给自己授予比委派者更大的权威 直接 / 传递 / 聚合放大
权威经委派链洗白 特权洗权
在已被撤销的授权上行动 撤销祖先、陈旧撤销
重放早先的授权 序列重放

14 条全部拦下。每条不变量全部守住。

已验证的一致性

ERDL 的语义由一套跨实现向量集钉死(见 erdl-vectors)。独立的、 仅凭规范实现的 runner 用自建 JCS 重算每一条向量 —— 不依赖参考代码, 不读答案文件。

层 向量数 状态
决策哈希(DO v1.5) 78 ✅ Node.js(参考实现)· ✅ Go(norviq-go)· ✅ Python(concordia-python)
表达投影(V-ENGINE) 240 ✅ Node.js(参考实现)· ✅ Python(concordia-python-expression)
决议层(V-RESOLVE) 13 ✅ Node.js(参考实现)· ✅ Ravindra Annam(spec-only runner)
签名层(V-SIGN) 5 生成(参考实现自证)
时间锚定(TSA) 3 生成(参考实现自证)
decision_divergence 3 重推导

形式化验证

向量证明的是你采样到的情形。erdl-formal 证明其余全部 —— 它把 ERDL 表达内核编译为 SMT(Z3),在所有输入上验证 规则永不报错、永不失败放行、永不漏拦。完整覆盖 34 节点 / E1–E12, 反例可以直接回放到本参考引擎。

有状态规则(§6a 状态块与转移)

除了无状态的 when → then 规则,ERDL 还支持单实例有限状态机(§6a):两个可选顶层字段——state(状态空间)与 transitions(确定性、事件驱动的转移函数)。状态由引擎在表达式树内核之外维护,规则经 state.<name> 命名空间只读访问;转移守卫只读 state.* 与 event.*。每次成功提交的转移被串行锚定进审计链(genesis → transition / transition_error),求值结果则按需记录 state_snapshot({ values, state_version, transitions_head })。这正是组织层构建多 Agent 委托权威治理(SPEC §6b,INV-01~05)的原语。

state:
  - name: authorization
    values: [authorized, revoked]
    initial: revoked
transitions:
  - on: authorize
    audit_as: DELEGATE
    set: { authorization: authorized }
  - on: revoke
    audit_as: DELEGATE
    set: { authorization: revoked }
import { StateMachine, Evaluator } from '@openoba/erdl'

const sm = new StateMachine(stateDecls, transitions, docTreeHash)
sm.injectEvent({ event_id: 'e1', on: 'authorize', actor: 'root-P' })

const result = new Evaluator().evaluate(rules, fact, { stateMachine: sm })
result.stateSnapshot // { values: { authorization: 'authorized' }, state_version: 1, transitions_head }

多 Agent 治理(委托权威)

单 Agent 护栏止于「这个 Agent、这个决策」。多 Agent 系统提出了更难的问题:当 Agent A 委派给 Agent B 时,B 的动作究竟源于哪条授权链?它在哪一步违背了策略? ERDL 用委托权威安全模型(SPEC §6b)回答它:

委托授权安全不变量(INV-01–INV-05)及相关对抗一致性向量(AV-01–AV-14)由 Ravindra Annam 提出,随后在与 OpenOBA 的技术评审与协作中进一步细化与完善。它们存于 rulsynor-multi-agent 仓库——消费 ERDL 原语的组织层。ERDL 提供确定性表达决策 + 状态机原语;组织层跨 hop 推导有效权威;表达层始终是唯一决策权威(SPEC §6b、DESIGN §8a)。

# 每个委派关系一个授权 FSM 实例(SPEC §6a.1 分层)
state:
  - name: authorization
    values: [authorized, revoked]
    initial: revoked
transitions:
  - on: authorize
    audit_as: DELEGATE
    reason: authorize
    set: { authorization: authorized }
  - on: revoke
    audit_as: DELEGATE
    reason: revoke
    set: { authorization: revoked }

生态

组成 是什么
@openoba/erdl(本仓库) 参考引擎 —— 加载器、求值器、34 节点内核、§6a 状态机
erdl-vectors 342 条一致性向量,由独立 spec-only runner 重算
erdl-formal 表达内核的 SMT(Z3)形式化验证 —— 覆盖所有输入,而非采样
rulsynor-multi-agent 消费 ERDL 原语、实现委托权威的组织层
A2A Discussion #2031 ERDL 被提议为 Agent Cards 扩展 —— Agent 发现的行为规则

给怀疑者

「确定性」是一个宣称,构造如下:

规范

社区

仓库结构

.
├── README.md                 # English README
├── README.zh-CN.md           # 中文 README(本文件)
├── erdl-language-spec-v2.3.md              # 中文规范(权威)
├── erdl-language-spec-v2.3.en.md           # English specification
├── API.md                    # API 参考
├── CHANGELOG.md              # 发布历史(Keep a Changelog)
├── CHANGELOG.zh-CN.md        # release history (Keep a Changelog)
├── CONTRIBUTING.md           # 贡献指南
├── CODE_OF_CONDUCT.md        # 行为准则
├── SECURITY.md               # 安全策略
├── DEVELOPMENT.md            # 开发工具链 + 路线图
├── LICENSE                   # MIT
├── NOTICE.md                 # 商标声明
├── package.json / tsconfig.json / vitest.config.ts
└── src/
    ├── index.ts              # 公开 API 入口
    ├── erdl-loader.ts        # YAML 文档加载器(parseErdlDocument / loadErdlFile)
    ├── evaluator.ts          # 求值引擎
    ├── erdl-schema.ts        # 单一事实源(决策 / 运算符 / 分类)
    ├── rule-definition.ts    # 核心类型定义
    ├── rule-validator.ts     # 规则校验
    ├── rule-yaml-serializer.ts  # RuleDefinition → §2.1 YAML
    ├── rule-quality-gate.ts  # 加载期质量门禁
    ├── template-engine.ts    # 模板引擎
    ├── field-contracts.ts    # 字段契约 + display_name
    ├── fn-registry.ts        # 函数委派注册表
    ├── guard-state-manager.ts  # 有状态运算符(within/rate)状态
    ├── state-definition.ts   # §6a state/transitions 类型 + 加载时校验
    ├── state-machine.ts      # §6a 运行时 FSM(事件注入 / 审计链 / state_snapshot)
    ├── evaluation-object.ts  # 语言层求值结果 DO 序列化 + 哈希
    ├── safe-regex.ts         # 防 ReDoS 正则
    ├── clock.ts / date-utils.ts  # 时间 + 日期工具
    └── expr-tree/            # 34 节点表达树内核
        ├── node-types.ts     # ExprNode + 34 种节点类型
        ├── evaluator.ts      # 树求值器(E1–E12)
        ├── gloss.ts          # 自然语言投影(gloss)
        ├── s-expression.ts   # S-表达式序列化
        ├── simple-compiler.ts  # Simple 30 运算符编译
        ├── rule-to-expr.ts   # when → 树编译
        ├── canonical.ts       # 规范形
        ├── fixed-point.ts     # 定点有理数算术
        ├── limits.ts          # 资源限制(E4)
        ├── normalize.ts       # NFC 规范化
        ├── grade.ts           # 规则分级(A/B/C)
        ├── decision-table.ts # 决策表编译
        ├── eval-trace.ts / eval-warning.ts  # 求值轨迹 + 警告
        └── *.spec.ts         # 测试套件

鸣谢

许可证

MIT © 2026 深圳市秒镜科技有限公司 (Shenzhen Miaojing Technology Co., Ltd.)

商标:ERDL™ 是深圳市秒镜科技有限公司的商标。MIT 许可仅覆盖版权, 不授予任何商标权利。详见 NOTICE.md。