<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Doberman: The guarddog to stop your AI before it goes rogue]]></title><description><![CDATA[This is where I'll share my thoughts and insights on the latest AI security news and updates on Doberman.
Occasionaly I'll also share my own shower thoughts, le]]></description><link>https://trydoberman.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/6a9d147579197ddcb37a80c7/5bb4d26f-9974-4e13-930f-3cb9b70d0ddb.png</url><title>Doberman: The guarddog to stop your AI before it goes rogue</title><link>https://trydoberman.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Wed, 09 Sep 2026 01:28:00 GMT</lastBuildDate><atom:link href="https://trydoberman.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Doberman: Stops your AI before it goes rogue]]></title><description><![CDATA[NOTE:I wrote the two-command walkthrough below for dev.to first, but if you're reading it here, the two commands still work the same way.
I built Doberman because a coding agent deleted my project ten]]></description><link>https://trydoberman.hashnode.dev/doberman-stops-your-ai-before-it-goes-rogue</link><guid isPermaLink="true">https://trydoberman.hashnode.dev/doberman-stops-your-ai-before-it-goes-rogue</guid><category><![CDATA[AI]]></category><category><![CDATA[Security]]></category><category><![CDATA[#ai-tools]]></category><category><![CDATA[claude]]></category><category><![CDATA[Open Source]]></category><category><![CDATA[open source]]></category><dc:creator><![CDATA[Alan Fu]]></dc:creator><pubDate>Sun, 06 Sep 2026 07:32:22 GMT</pubDate><content:encoded><![CDATA[<p>NOTE:I wrote the two-command walkthrough below for dev.to first, but if you're reading it here, the two commands still work the same way.</p>
<p>I built Doberman because a coding agent deleted my project ten minutes before a hackathon demo. It misread a prompt, ran the wrong command, and there was nothing standing between "the agent decided" and "the agent did it." I didn't win that hackathon. I built a guard dog instead.</p>
<p>Doberman is local-first, open-source (Apache-2.0), and it sits on the execution path between your coding agent and its tools. Every shell command, every file write, every MCP call gets exactly one verdict before it's allowed to run: PASS, AUTH, or BLOCK. Here's the whole setup, in two commands, and what it actually looks like when it works.</p>
<h2>Install</h2>
<pre><code class="language-bash">pip install doberman-core
</code></pre>
<p>That's the package. Python 3.11+, and it ships as <code>doberman-core</code> on PyPI (the bare <code>doberman</code> name belongs to an unrelated, abandoned project; the CLI command is still <code>doberman</code>).</p>
<h2>Wire it up</h2>
<pre><code class="language-bash">doberman setup
</code></pre>
<p>This is the wizard. It detects which agents you have installed (Claude Code via hooks, Codex CLI experimentally, Claude Desktop/Cursor/any MCP client via a transparent proxy, and OpenClaw natively), asks which ones you want guarded, picks a strictness mode, tunes the guardrails, wires the hooks, and then asks about telemetry. It finishes with a health-check pass and, if you wired a hooks-based host, offers to run a scripted attack right there so you can watch it work.</p>
<p>For Claude Code specifically, this is the recommended path: it wires a <code>PreToolUse</code> hook that gates every built-in and MCP tool call before it runs.</p>
<h2>What PASS / AUTH / BLOCK actually mean</h2>
<p>Every action out of your agent resolves to one of three verdicts:</p>
<ul>
<li><p><strong>PASS</strong> - routine work, straight through, no friction.</p>
</li>
<li><p><strong>AUTH</strong> - sensitive enough to pause and ask you. Repeat the exact same action within five minutes and it re-prompts with a one-click confirm instead of the full challenge (never for anything destructive).</p>
</li>
<li><p><strong>BLOCK</strong> - dangerous, stopped cold before it reaches the tool.</p>
</li>
</ul>
<p>That last part is the whole point. This isn't a prompt filter reading what the model said it would do: it's on the execution path, so a blocked call literally never runs, no matter how the model was talked into requesting it.</p>
<h2>Watch it happen</h2>
<pre><code class="language-bash">doberman demo
</code></pre>
<p>This replays a scripted rogue-agent sequence through the real decision engine: a secret exfiltration, an <code>rm -rf</code>, a force push to a protected branch, a smuggled-token egress, and a <code>.env</code> read, all blocked. Then it hands you a pending approval for a high-risk SSH-trust-file write and waits for a human to deny it. Nothing here touches a real tool or downstream server: it's the same engine your actual traffic runs through, just fed a script. <code>--fast</code> skips the pacing, <code>--mode &lt;name&gt;</code> runs it under a different strictness setting, <code>--quiet</code>/<code>-q</code> keeps the summary but drops the narration.</p>
<p>If you've also got the dashboard installed (<code>pip install 'doberman-core[dash]'</code>, then <code>doberman dash</code>), run the demo next to it and watch the same five blocks land in a live feed as they happen.</p>
<h2>When something gets blocked and you want to know why</h2>
<pre><code class="language-bash">doberman log --why
</code></pre>
<p>The decision log is local SQLite, redacted: verdicts, reason codes, and HMAC-SHA256 fingerprints, never raw secrets or full payloads. <code>--why</code> turns the reason codes into a plain-language explanation. If you'd rather browse interactively, <code>pip install "doberman-core[tui]"</code> then <code>doberman tui</code> gives you the same rows with a keyboard-driven why panel.</p>
<h2>Turning telemetry off</h2>
<p>Anonymous usage counts (command names and daily totals, never paths, prompts, or secrets) are on by default. Turn them off with:</p>
<pre><code class="language-bash">doberman telemetry off
</code></pre>
<p>or set <code>DO_NOT_TRACK=1</code> in your environment before you ever run a command, if you'd rather it never mint an id in the first place.</p>
<h2>What this does not do</h2>
<p>Doberman is defense-in-depth, not airtight, and I'd rather say that here than have you find out the hard way. The objective, deterministic layer that ships today is strong at path confinement, destructive-command detection, and known secret/egress shapes, but it's honest about its gaps: pure natural-language prompt injection with no matching command shape isn't something the deterministic rules alone catch: that needs the adaptive layer, which is still in progress. No single rule, including the secret-pattern checks, is a guarantee against an attacker who knows exactly what the rule looks for. Treat it as one strong layer in a stack, not the whole stack.</p>
<p>It's alpha software with a real test suite behind it (2,000+ tests in CI as of v0.18.5), so if you hit a rough edge, submit an issue and I promise I'll get to it within a week. I'd genuinely like to know what breaks it.</p>
<p>GitHub: <a href="https://github.com/DobermanCore/Doberman-Core">https://github.com/DobermanCore/Doberman-Core</a><br />Docs: <a href="https://docs.trydoberman.dev">https://docs.trydoberman.dev</a></p>
]]></content:encoded></item></channel></rss>