<?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: Collin Obey</title>
    <description>The latest articles on DEV Community by Collin Obey (@comikii).</description>
    <link>https://dev.to/comikii</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%2F4047290%2F80b1aafb-2f29-469f-95dc-acc64fd8d863.png</url>
      <title>DEV Community: Collin Obey</title>
      <link>https://dev.to/comikii</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/comikii"/>
    <language>en</language>
    <item>
      <title>Agents go rogue through their tools. I built the thing that sits on them.</title>
      <dc:creator>Collin Obey</dc:creator>
      <pubDate>Fri, 16 Oct 2026 16:14:00 +0000</pubDate>
      <link>https://dev.to/comikii/agents-go-rogue-through-their-tools-i-built-the-thing-that-sits-on-them-5fe0</link>
      <guid>https://dev.to/comikii/agents-go-rogue-through-their-tools-i-built-the-thing-that-sits-on-them-5fe0</guid>
      <description>&lt;p&gt;VITNA is a containment layer for AI agents that go rogue, for the stdio MCP servers you put behind it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;VITNA is a containment layer for AI agents that go rogue, for the stdio MCP servers you put behind it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/ts-enfPwBm4" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A real Claude Code agent (2.1.299) on fake files, held in the VITNA aquarium. Test setup: Claude Code's own file, shell and web tools are off, so it can only act through the guarded server, and it doesn't ask me before using that server, like an agent running on its own.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Watch that first. A real Claude Code agent works on a folder of sandbox files. I ask it to delete one. The call it makes to do that waits on the glass of the VITNA aquarium with a countdown. I deny it, and nothing runs. Nothing in the recording is faked.&lt;/p&gt;

&lt;p&gt;The hold doesn't care why the agent made the call. My request, a wrong guess and an injected instruction all get the same check. That's the core of the product. You can try it yourself in a minute at &lt;a href="https://vitna.costrinity.xyz/demo" rel="noopener noreferrer"&gt;vitna.costrinity.xyz/demo&lt;/a&gt;, a simulation that runs in your browser. The rest of this post is how it works and what it doesn't do.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "rogue" means here
&lt;/h2&gt;

&lt;p&gt;"Rogue" isn't my word. It's the one Jason Lemkin used in July 2025 when an AI coding agent deleted his production database during a code freeze. Since then the list has grown:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;April 2026:&lt;/strong&gt; a Cursor agent at PocketOS deleted a production volume in nine seconds, using a token it found in an unrelated file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;July 2025:&lt;/strong&gt; Gemini CLI moved a user's files to an unknown location.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;February 2026:&lt;/strong&gt; an OpenClaw agent deleted an inbox despite being told to confirm before acting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;May 2026:&lt;/strong&gt; a Morse-code instruction got Bankr's agent to send tokens worth $150,000 to $174,000 from the wallet it had created for Grok.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;June 2026:&lt;/strong&gt; hackers said they took over high-profile Instagram accounts by asking Meta's AI support bot to change the account email.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sources for each are in &lt;a href="https://vitna.costrinity.xyz/blog/seven-questions-before-your-agent-goes-rogue" rel="noopener noreferrer"&gt;the seven questions post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;None of these needed a malicious model. Each needed an agent acting through a tool, with nothing outside the agent to stop the action. That's the definition I use: a rogue agent is one doing something its owner didn't intend, through a tool. The cause can be a wrong guess, an injected instruction, instructions lost from its context, or someone talking it into it. Anthropic's agentic-misalignment work is often cited here; it's a simulation, and I treat it as one. The OWASP Top 10 for Agentic Applications lists Rogue Agents as ASI10.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a prompt isn't enough
&lt;/h2&gt;

&lt;p&gt;Anything inside the context window is advice. Only what is enforced outside it is a control. A system prompt that says "never delete production" is a suggestion the model can be argued out of, or lose on a reset. The OpenClaw case had "confirm before acting" in the instructions. The agent didn't.&lt;/p&gt;

&lt;p&gt;So the check has to live where the agent can't reach it: on the tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  How guard mode works
&lt;/h2&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx -y @costrinity/vitna-compliance-mcp guard -- &amp;lt;your stdio MCP server command&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Guard mode wraps a stdio MCP server. Every &lt;code&gt;tools/call&lt;/code&gt; goes to VITNA first, and only an allowed call reaches the server. Anything else is refused with a tool error that says why; the server never sees it. The model can't skip the check, because the check isn't a tool it chooses to call.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Holds.&lt;/strong&gt; Tools you list in &lt;code&gt;hold_actions&lt;/code&gt; wait for a person.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The agent is told the call is held, and until when.&lt;/li&gt;
&lt;li&gt;The call appears under Pending holds on your dashboard, with Approve and Deny and the arguments (secrets and personal data redacted). It also appears on the glass of your aquarium, with a countdown. Every account has one: you name your agent, it picks only its emoji and colour, and each tank is private to its owner. Holds also go to an alert webhook, if you set one.&lt;/li&gt;
&lt;li&gt;The window is 30 to 3,600 seconds, default 120. If nobody decides, the call is blocked. No answer means no.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;A rogue agent can't approve itself.&lt;/strong&gt; No API key can decide a hold, including the agent's own.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bait, off by default.&lt;/strong&gt; Honeytools are fake tools no legitimate task would call. Honeytokens are fake credentials planted in config-like output. Touching either is blocked, recorded and sent to the alert webhook, if one is set. The design follows AgentShield (Rassul and Rashid, 2026).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rate alert.&lt;/strong&gt; If holds plus blocks hit a threshold (default 5 in 300 seconds), the decision response says so.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Canary holds.&lt;/strong&gt; A rogue agent's best friend is a tired human who clicks approve. &lt;code&gt;canary_interval_minutes&lt;/code&gt; inserts a drill hold that looks real until someone decides it, so you find out whether the approver is reading.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fails closed.&lt;/strong&gt; If VITNA can't evaluate a call (unreachable, over 10 seconds, key refused), the call isn't forwarded. There's an opt-in fail-open for outages; it never forwards a held or blocked call.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Signed records.&lt;/strong&gt; On a claimed account, when the guard closes a session it saves an Ed25519-signed bundle to &lt;code&gt;~/.vitna/bundles&lt;/code&gt;. Anyone can verify it offline with the open-source verifier and the published key. VALID means VITNA issued it and nothing changed since; any change makes verification fail. It doesn't prove the actions happened or that the records are true.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it doesn't do
&lt;/h2&gt;

&lt;p&gt;I'd rather you read this than find out later.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It only sees servers it wraps.&lt;/strong&gt; A built-in shell or an unwrapped server is outside it, and a blocked agent may try another route. Turn your agent's built-in tools off if you want everything to go through the guard. The session record lists what you declared as unwrapped.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It isn't a sandbox.&lt;/strong&gt; Detection is heuristic pattern matching.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bait has limits.&lt;/strong&gt; It doesn't catch an agent that stays inside policy with plausible arguments, and I have no measured detection rate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It isn't a tracer.&lt;/strong&gt; It doesn't trace prompts or evaluate models.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desktop is limited.&lt;/strong&gt; VITNA Desktop 0.8.0 is Windows only, and its bundles are signed with a key on that machine, not VITNA's key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A bundle can go missing.&lt;/strong&gt; Some clients stop the guard as they exit, before it saves the bundle; I've seen it with Claude Code 2.1.299 on Windows. VITNA's decisions on each call stay in your account, and &lt;code&gt;GET /api/evidence/export&lt;/code&gt; returns them as a signed package, by date and without what happened to each hold.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The compliance checks aren't legal advice.&lt;/strong&gt; They cover 24 statutes in 13 jurisdictions as decision support, and the scorecards are not certifications.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's early.&lt;/strong&gt; Try it on a test agent, not your real one.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to try it
&lt;/h2&gt;

&lt;p&gt;The quickest look is &lt;a href="https://vitna.costrinity.xyz/demo" rel="noopener noreferrer"&gt;the demo&lt;/a&gt;. It's a simulation that runs in your browser: a scripted agent on pretend files, with the real aquarium, VITNA's own decision code and the real bait checks. You decide the holds, plant the bait, and see what the agent gets back next to what you'd get. Nothing leaves your browser.&lt;/p&gt;

&lt;p&gt;For a real hold, run the guard command above in front of a test stdio MCP server, with a policy file that lists the tools to hold. The &lt;a href="https://github.com/COSTRINITY/vitna-compliance-mcp" rel="noopener noreferrer"&gt;README&lt;/a&gt; has a one-file example.&lt;/p&gt;

&lt;p&gt;Guard 0.5.6 is on npm and the official MCP registry. There's also an OpenClaw plugin (&lt;code&gt;@costrinity/vitna-openclaw&lt;/code&gt; 0.1.1, on npm and ClawHub), a JS SDK (&lt;code&gt;@costrinity/vitna&lt;/code&gt; 0.1.0) and a Python SDK (&lt;code&gt;vitna&lt;/code&gt; 0.1.0 on PyPI). The SDKs give your own code the same checks the remote server offers; that's cooperative, not containment. Containment is guard mode.&lt;/p&gt;

&lt;p&gt;With no credentials, the first call sets up a restricted trial key: it's capped, gives labels only and keeps no signed records. You can still watch a risky call get held, then blocked when nobody approves it.&lt;/p&gt;

&lt;p&gt;Claim the account with GitHub or a passkey and you get full results, holds you can decide, and signed records. The claim link is printed in your MCP server log and never sent to the agent.&lt;/p&gt;

&lt;p&gt;There's also a remote server at &lt;code&gt;https://vitna.costrinity.xyz/api/mcp&lt;/code&gt;, which needs an API key. It gives an agent the same checks to call itself. That's cooperative, not containment; containment is guard mode.&lt;/p&gt;

&lt;p&gt;The free tier has 3 active engagements, about 10k events a month, 7-day history and signed export. Pro is US$29/month and Team is US$79/month. The client is MIT.&lt;/p&gt;

&lt;p&gt;From 19 October, guard mode tells VITNA once that it's in use. It sends the mode and client version only, with no tool names, arguments, IP or hostname. &lt;code&gt;VITNA_GUARD_NO_ACTIVATION=1&lt;/code&gt; turns it off.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;I set out to build a compliance tool. What I'd actually built was a containment layer. The signed record was meant for auditors. Reading the incidents, I realised it matters most to the person whose agent just deleted something and who can't say what happened. The hold was meant as a compliance gate. It turned out to be what stops a deletion before it runs, for the tools you put behind it.&lt;/p&gt;

&lt;p&gt;If you run agents against real systems, I'd like to know the one tool call you'd most want held. I'm Collin Obey, COSTRINITY INC., Regina, Saskatchewan. &lt;a href="mailto:hello@costrinity.xyz"&gt;hello@costrinity.xyz&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>mcp</category>
      <category>agents</category>
    </item>
    <item>
      <title>AI Agent Safety and Compliance Tools: A 2026 Comparison</title>
      <dc:creator>Collin Obey</dc:creator>
      <pubDate>Sat, 25 Jul 2026 21:09:09 +0000</pubDate>
      <link>https://dev.to/comikii/ai-agent-safety-and-compliance-tools-a-2026-comparison-eb0</link>
      <guid>https://dev.to/comikii/ai-agent-safety-and-compliance-tools-a-2026-comparison-eb0</guid>
      <description>&lt;p&gt;Three categories of AI agent safety tooling: observability, security guardrails, and compliance evidence. What each does, where each falls short, and the one most teams are missing.&lt;/p&gt;

&lt;p&gt;Bottom line: tools for keeping AI agents safe fall into three groups. Observability tells you what an agent did after the fact. Security guardrails try to block dangerous actions before they happen. Compliance evidence tools produce a verifiable, defensible record that an agent's actions were allowed. Most teams deploying agents into regulated or high-stakes work need all three, but the one almost nobody has is the third. If you have to prove to a regulator, an auditor, or a customer that your agent behaved, you need evidence, not a dashboard.&lt;/p&gt;

&lt;p&gt;This is a practitioner comparison, written by the founder of one of the tools below. It names where each category is strong and where it falls short, including our own limits.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Observability and evals
&lt;/h2&gt;

&lt;p&gt;These tools capture traces of what your agent did and let you evaluate quality. They are essential for debugging and improving agents, and the category is mature and well funded.&lt;/p&gt;

&lt;p&gt;Strength: deep visibility into agent behavior, prompt and response inspection, eval pipelines.&lt;/p&gt;

&lt;p&gt;Limit: they tell you what happened, after it happened. An observability trace is not a compliance record and is not tamper-evident. For a regulator, "here is our internal dashboard" is not evidence, because the party being audited controls the logs.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Security guardrails
&lt;/h2&gt;

&lt;p&gt;These tools try to stop bad actions before they execute: prompt injection filtering, dangerous-command blocking, data-exfiltration prevention. The category consolidated fast in 2025 to 2026, with several acquisitions by major security vendors.&lt;/p&gt;

&lt;p&gt;Strength: prevention. Reducing the chance an agent does something harmful.&lt;/p&gt;

&lt;p&gt;Limit, and it is a fundamental one: prompt-injection prevention is an unwinnable arms race. Peer-reviewed 2026 research shows even the best-defended models are bypassed a meaningful fraction of the time, and there are formal results suggesting agents may always be vulnerable to some injection. Prevention is necessary and never sufficient. It also usually produces an internal log, not independently verifiable evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Compliance evidence
&lt;/h2&gt;

&lt;p&gt;This is the newest and least crowded category, and it answers a different question: not "did we stop the bad thing" but "can we prove, to someone who does not trust us, that the agent's actions were checked and allowed."&lt;/p&gt;

&lt;p&gt;What it does: an agent calls a pre-flight check before a sensitive action, gets an allow, block, or hold decision, and a signed, tamper-evident record of that decision is produced. The key property is independent verifiability: a third party can confirm the record is authentic and unaltered using a public key, without trusting the vendor's servers.&lt;/p&gt;

&lt;p&gt;Why it matters now: the EU AI Act requires automatic logging and record-keeping for high-risk AI, India's DPDP requires audit and impact assessments, and DORA and sector rules already bite in finance. These regimes require evidence, and normal application logs do not qualify because they are editable and require trusting the logger.&lt;/p&gt;

&lt;p&gt;VITNA is the tool built for this category. It is an MCP server and API: an agent calls it before acting, it runs compliance and safety checks, returns allow, block, or hold, and produces an Ed25519-signed evidence record that anyone can verify offline with a published public key. It maps across 13 jurisdictions including the EU AI Act and India DPDP. It is honest about its limits: the detection is heuristic pattern-matching, it is a cooperative guardrail the agent calls rather than an OS-level sandbox, and those limits are documented publicly. Its differentiator is not prevention, it is independently verifiable proof. There is a free tier and an open-source verifier.&lt;/p&gt;

&lt;p&gt;VITNA produces Ed25519-signed evidence records that anyone can verify offline with a published public key and an open-source verifier, with no need to trust VITNA's servers. It is a cooperative guardrail with heuristic detection, and those limits are documented publicly. Its purpose is not prevention. It is independently verifiable proof that an AI agent's actions were checked and allowed.&lt;/p&gt;

&lt;p&gt;You do not have to take my word for any of it. Download the verifier and a real signed sample and check it yourself, no account needed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sO&lt;/span&gt; https://raw.githubusercontent.com/COSTRINITY/vitna-compliance-mcp/main/verify-evidence.mjs
curl &lt;span class="nt"&gt;-sO&lt;/span&gt; https://vitna.costrinity.xyz/sample-evidence.json
node verify-evidence.mjs sample-evidence.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change any byte in any record and that record reports FAIL.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to choose
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;If you are debugging agent quality: start with an observability or eval tool.&lt;/li&gt;
&lt;li&gt;If you are worried about agents being manipulated into harmful actions: add a security guardrail, and pair it with human review, because no guardrail is complete.&lt;/li&gt;
&lt;li&gt;If you have to prove governance to a regulator, auditor, board, or enterprise customer: you need a compliance-evidence layer that produces independently verifiable records. This is the requirement most teams discover late, usually when a customer's security review or an auditor asks for evidence they cannot produce.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most serious deployments end up with all three, because they answer different questions. The mistake is assuming observability or a guardrail dashboard counts as compliance evidence. It does not, because evidence has to be verifiable by someone who does not trust you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest caveats
&lt;/h2&gt;

&lt;p&gt;No tool in any of these categories is a complete solution. Prevention can be bypassed, observability is after-the-fact, and evidence proves an action was checked, not that the underlying detection caught everything. The right posture is layered: prevent what you can, record verifiably what happens, and be honest about the gaps. Any vendor claiming a complete shield, in any of these three categories, is overclaiming.&lt;/p&gt;




&lt;p&gt;by Collin Obey, founder of VITNA (&lt;a href="https://vitna.costrinity.xyz" rel="noopener noreferrer"&gt;https://vitna.costrinity.xyz&lt;/a&gt;), the compliance-evidence layer described above. The comparison is intended to be useful and fair, corrections welcome.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>mcp</category>
      <category>compliance</category>
    </item>
  </channel>
</rss>
