<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tang Haoran</title>
    <description>The latest articles on DEV Community by Tang Haoran (@haorantang).</description>
    <link>https://dev.to/haorantang</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4015038%2F4a7e5d79-1199-427d-8d15-c1ae6f45703e.png</url>
      <title>DEV Community: Tang Haoran</title>
      <link>https://dev.to/haorantang</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/haorantang"/>
    <language>en</language>
    <item>
      <title>rulsynor-core v1.0: An AI Agent You Can Audit</title>
      <dc:creator>Tang Haoran</dc:creator>
      <pubDate>Sat, 08 Aug 2026 06:51:27 +0000</pubDate>
      <link>https://dev.to/haorantang/rulsynor-core-v10-an-ai-agent-you-can-audit-oie</link>
      <guid>https://dev.to/haorantang/rulsynor-core-v10-an-ai-agent-you-can-audit-oie</guid>
      <description>&lt;h1&gt;
  
  
  rulsynor-core v1.0: An AI Agent You Can Audit
&lt;/h1&gt;

&lt;p&gt;How do you trust an AI Agent in production? Not "trust" as in &lt;em&gt;I think it'll do the right thing&lt;/em&gt;. Trust as in &lt;strong&gt;cryptographic proof&lt;/strong&gt; that every decision was correct, traceable, and independently verifiable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Today: &lt;strong&gt;rulsynor-core&lt;/strong&gt; — open-source Guard engine for AI Agents. MIT license. On npm.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  30-Second Demo
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
npx @openoba/rulsynor-core --tool=exec --cmd="rm -rf /"
🛡️ Decision: DENY
📝 Reason: Destructive command blocked.
🧾 Recorded: sha256:8274b0... (tamper-evident)
🧭 Alternative: Use the read tool to inspect first.
Not just "no." The agent learns why and what to do instead.

What It Does
Guard: Evaluates every tool call before execution — ring-sorted, sub-millisecond. 30 preset rules + write your own.
Audit: Every decision produces a 25-field cryptographic record. JCS + SHA-256. Chain-linked.
Verify: Anyone can verify audit records with zero SDK. Just JCS + SHA-256. No rulsynor needed.
What Makes It Different
Most AI safety tools are prompt-based. "Be careful" isn't governance. rulsynor-core gives you:

7 decision types — ALLOW, DENY, CORRECT, QUARANTINE, REQUEST_HUMAN, NOTIFY, EMERGENCY_HALT
Cryptographic audit chain — not "we logged it," mathematical proof
Third-party verified — 101 cross-implementation vectors, 13/13 passed by Concordia
MIT licensed — zero framework dependencies
Rules in Plain Language
复制
# "If the agent runs rm -rf, block it"
name: block-destructive-rm
when:
  conditions:
    - field: context.tool.name
      operator: eq, value: exec
    - field: context.tool.args.command
      operator: matches, value: rm\s+-rf
then:
  decision: DENY
  instruction: Destructive command blocked.
Any LLM can translate English descriptions into ERDL rules. The compiler validates everything before loading.

5-Minute Integration
import { Evaluator, GuardStateManager,
  loadPresetRules, toCompiledRules }
from '@openoba/rulsynor-core';

const rules = toCompiledRules(loadPresetRules());
const evaluator = new Evaluator(new GuardStateManager());

const result = evaluator.evaluate(
  { toolName, toolArgs, sessionId, agentId },
  rules
);
// result.decision → ALLOW | DENY | CORRECT | ...
Works with LangChain, MCP, custom ReAct loops. Same API everywhere.

Roadmap
 30 preset rules, 20 operators
 JCS+SHA-256 audit trail
 Third-party verified
 LangGraph integration guide
 Community rule marketplace
GitHub · npm

"LLM vendors deliver exceptional intelligence. We deliver accountability."

Built at OpenOBA. MIT.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>typescript</category>
      <category>security</category>
    </item>
    <item>
      <title>I proposed a rules layer for the A2A protocol. Here's why.</title>
      <dc:creator>Tang Haoran</dc:creator>
      <pubDate>Sun, 05 Jul 2026 13:04:42 +0000</pubDate>
      <link>https://dev.to/haorantang/i-proposed-a-rules-layer-for-the-a2a-protocol-heres-why-4op5</link>
      <guid>https://dev.to/haorantang/i-proposed-a-rules-layer-for-the-a2a-protocol-heres-why-4op5</guid>
      <description>&lt;p&gt;The AI agent protocol stack is taking shape fast. Two standards are now widely adopted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MCP&lt;/strong&gt; (Anthropic → Linux Foundation): Agent ↔ Tools. 97M+ monthly downloads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A2A&lt;/strong&gt; (Google → Linux Foundation): Agent ↔ Agent. 150+ organizations in production.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both are solid protocols. But they expose a question that every engineer deploying agents hits eventually:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who decides what an agent &lt;em&gt;shouldn't&lt;/em&gt; do?&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The current answer: Prompts
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are a responsible agent. Do not execute dangerous commands.
Follow security policies. Respect data boundaries.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Any engineer who's actually deployed an agent knows how this ends. The prompt is a suggestion. The LLM is a probability engine. It doesn't understand "forbidden" — it understands "low probability."&lt;/p&gt;

&lt;p&gt;That's fine for a chatbot. It's not fine for banking, healthcare, or production infrastructure.&lt;/p&gt;

&lt;p&gt;What's needed is a mechanism that sits &lt;em&gt;before&lt;/em&gt; the tool call and says "no" deterministically — not as an LLM judgment, but as a protocol-level enforcement.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I proposed in the A2A community
&lt;/h2&gt;

&lt;p&gt;Last week, I opened a discussion on the A2A repo (&lt;a href="https://github.com/a2aproject/A2A/discussions/2031" rel="noopener noreferrer"&gt;#2031&lt;/a&gt;) proposing an extension to the Agent Card: a way for agents to &lt;em&gt;declare their behavioral rules&lt;/em&gt; at the protocol level.&lt;/p&gt;

&lt;p&gt;The reactions confirmed what I suspected: this is a real gap.&lt;/p&gt;

&lt;p&gt;A respected contributor from the community (&lt;a href="https://github.com/chopmob-cloud" rel="noopener noreferrer"&gt;chopmob-cloud / AlgoVoi&lt;/a&gt;) responded with a sharp distinction that materially improved the proposal: &lt;strong&gt;a trust score is reputation, but compliance requires evidence.&lt;/strong&gt; A number like 850 says "this agent is generally trusted." A recomputable, content-addressed record — &lt;code&gt;hash(rule_version + inputs + verdict)&lt;/code&gt; — says "this specific decision was permitted, and you can verify it yourself with no keys and no issuer contact."&lt;/p&gt;

&lt;p&gt;That distinction is now baked into the spec. Reputation scores are advisory. Compliance is per-decision, recomputable, no-trust-required.&lt;/p&gt;




&lt;h2&gt;
  
  
  ERDL in 30 seconds
&lt;/h2&gt;

&lt;p&gt;ERDL (Entity-Rule Definition Language) is a declarative rules standard. One YAML file. Placed in the agent's workspace. Evaluated by a deterministic engine before every tool call.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# agent.erdl.yaml&lt;/span&gt;

&lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;no-dangerous-commands"&lt;/span&gt;
    &lt;span class="na"&gt;priority&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;
    &lt;span class="na"&gt;when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;logic&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AND&lt;/span&gt;
      &lt;span class="na"&gt;conditions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;field&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool.name"&lt;/span&gt;
          &lt;span class="na"&gt;operator&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;eq&lt;/span&gt;
          &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;exec"&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;field&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool.args.command"&lt;/span&gt;
          &lt;span class="na"&gt;operator&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;match&lt;/span&gt;
          &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(delete|format|drop&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;table)"&lt;/span&gt;
    &lt;span class="na"&gt;then&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;BLOCK&lt;/span&gt;
    &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Dangerous&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;command&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;intercepted"&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;required-human-approval"&lt;/span&gt;
    &lt;span class="na"&gt;priority&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;45&lt;/span&gt;
    &lt;span class="na"&gt;when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;logic&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AND&lt;/span&gt;
      &lt;span class="na"&gt;conditions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;field&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;action.impact_tier"&lt;/span&gt;
          &lt;span class="na"&gt;operator&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gte&lt;/span&gt;
          &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high"&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;field&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;action.domain"&lt;/span&gt;
          &lt;span class="na"&gt;operator&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;in&lt;/span&gt;
          &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;employment"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;credit"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;healthcare"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;then&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;REQUEST_HUMAN&lt;/span&gt;
    &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;High-impact&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;decision&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;requires&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;human&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;approval"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent cannot bypass this. It's not a prompt. It's a gate.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where ERDL fits
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A2A  (Google)   Agent ↔ Agent   Communication
ERDL (OpenOBA)  Rules &amp;amp; Governance   ← This
MCP  (Anthropic) Agent ↔ Tool   Tools
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It doesn't replace either. It complements them.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MCP says &lt;em&gt;what tools the agent can use&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;A2A says &lt;em&gt;who the agent can talk to&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;ERDL says &lt;em&gt;what the agent should and shouldn't do&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The evidence-first architecture
&lt;/h2&gt;

&lt;p&gt;This is the part I'm most proud of, and it came directly from community feedback.&lt;/p&gt;

&lt;p&gt;Every ERDL decision generates an evidence record:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;rule_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;no-dangerous-commands"&lt;/span&gt;
&lt;span class="na"&gt;rule_version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1.3.2&lt;/span&gt;
&lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;tool&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;exec"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;drop&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;table&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;users"&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
&lt;span class="na"&gt;eval_tree&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;tool.name == "exec" → &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;command MATCH "(delete|format|drop table)" → &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;AND → &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;verdict&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;BLOCK&lt;/span&gt;
&lt;span class="na"&gt;timestamp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2026-07-05T09:23:11.452Z&lt;/span&gt;
&lt;span class="na"&gt;receipt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sha256(canonicalize(above))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Any third party — a regulator, a partner, an auditor — can re-derive the receipt from the record alone. No keys, no issuer contact, no "trust me."&lt;/p&gt;

&lt;p&gt;This is the difference between saying "our agent is safe" and proving it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What we have so far
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Spec v1.0: English + Chinese, MIT license&lt;/li&gt;
&lt;li&gt;Reference implementation: &lt;code&gt;npm install @openoba/erdl&lt;/code&gt;, 197 tests, 0 failures&lt;/li&gt;
&lt;li&gt;Agent Card extension proposal: under active discussion on A2A #2031&lt;/li&gt;
&lt;li&gt;Landing page: &lt;a href="https://openoba.github.io/erdl-landing" rel="noopener noreferrer"&gt;openoba.github.io/erdl-landing&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What we need
&lt;/h2&gt;

&lt;p&gt;This isn't a solo project. A protocol standard only works if people use it, critique it, and contribute to it.&lt;/p&gt;

&lt;p&gt;If you've deployed AI agents and hit the "how do I stop it from doing X" problem — I'd love to hear about your experience. What guardrails did you build? What broke?&lt;/p&gt;

&lt;p&gt;If you think a rules layer in the agent protocol stack makes sense — or doesn't — I'd welcome the debate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/openoba/erdl" rel="noopener noreferrer"&gt;github.com/openoba/erdl&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;A2A Discussion&lt;/strong&gt;: &lt;a href="https://github.com/a2aproject/A2A/discussions/2031" rel="noopener noreferrer"&gt;RFC #2031&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Contact&lt;/strong&gt;: &lt;a href="mailto:support@openoba.com"&gt;support@openoba.com&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Posted by haoran-tang-ch · OpenOBA&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>machinelearning</category>
      <category>llm</category>
    </item>
    <item>
      <title>The AI Agent Protocol Stack is Missing a Layer — Here's the Third One</title>
      <dc:creator>Tang Haoran</dc:creator>
      <pubDate>Sat, 04 Jul 2026 13:07:10 +0000</pubDate>
      <link>https://dev.to/haorantang/the-ai-agent-protocol-stack-is-missing-a-layer-heres-the-third-one-26fh</link>
      <guid>https://dev.to/haorantang/the-ai-agent-protocol-stack-is-missing-a-layer-heres-the-third-one-26fh</guid>
      <description>&lt;p&gt;MCP connects agents to tools. A2A connects agents to agents. Both are excellent. Neither answers one question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do agents know what they're ALLOWED to do?&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;Cisco Research proposed a layered agent protocol architecture in 2025 (arXiv:2511.19699):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;L8&lt;/strong&gt; (Agent Communication Layer) → Standardized message envelopes, speech-act performatives&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;L9&lt;/strong&gt; (Agent Semantic Negotiation Layer) → &lt;em&gt;"does not exist today"&lt;/em&gt; (direct quote from the paper)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;L8 is being implemented by MCP and A2A. &lt;strong&gt;L9 had no answer — until now.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ERDL: The Third Layer
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Entity-Rule Definition Language&lt;/strong&gt; is an open standard for agent behavioral rules. It sits between the agent's reasoning and its tool execution:&lt;/p&gt;

&lt;p&gt;MCP → tools. A2A → communication. ERDL → rules.&lt;/p&gt;

&lt;p&gt;Three layers. One complete agent protocol stack.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopenoba.github.io%2Ferdl-landing%2Fstack.html" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopenoba.github.io%2Ferdl-landing%2Fstack.html" alt="Agent Protocol Stack" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What ERDL brings
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;11 operators including &lt;code&gt;within&lt;/code&gt; and &lt;code&gt;rate&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Complete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16 deterministic action types&lt;/td&gt;
&lt;td&gt;Complete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Execution Rings (Ring 0–3)&lt;/td&gt;
&lt;td&gt;Complete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Guardian Agent model&lt;/td&gt;
&lt;td&gt;Complete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SafeExpr engine (zero code injection)&lt;/td&gt;
&lt;td&gt;Complete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hot reload without restart&lt;/td&gt;
&lt;td&gt;Complete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Structured audit trails&lt;/td&gt;
&lt;td&gt;Complete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Snapshot + rollback&lt;/td&gt;
&lt;td&gt;Complete&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  How it works
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
yaml
rule: block_privileged_commands
priority: 0
description: "Block dangerous shell commands"
when:
  field: "tool.command"
  operator: in
  value: ["sudo", "rm -rf"]
then:
  action: BLOCK
  message: "Privileged commands require human approval"
**One YAML file. When an agent tries to call a blocked tool, ERDL's Action Guard intercepts the call before it reaches the tool. Not after. Not as a suggestion. The engine evaluates conditions, matches rules, and returns a deterministic verdict.

The agent never touches sudo. Period.

OWASP Top 10 (2026) — How ERDL Maps
OWASP Risk  ERDL Mitigation
R1: Excessive Agency    Time windows + rate limiting
R2: Prompt Injection    Guard rules run before LLM output
R3: Supply Chain    Agent BOM with rule audit trail
R4: Data Leakage    Field-level BLOCK rules
R5: Overreliance    Guardian Agent oversight
R6: Multi-Agent Collusion   Cross-agent audit chains
EU AI Act (effective August 2, 2026)
ERDL maps directly to transparency and human oversight requirements. Audit records export to OCSF format, compatible with SIEM systems.

The Stack is Now Complete
MCP — tools (Anthropic, Linux Foundation)
A2A — communication (Google, Linux Foundation)
ERDL — rules (OpenOBA, MIT)
Landing Page: openoba.github.io/erdl-landing
Spec v1.0 (English): spec/index-en.md
GitHub: github.com/OpenOBA/ERDL
MIT License. RFC open.

What do you think — does the agent protocol stack need a dedicated rules layer? Let's discuss.**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>security</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
