<?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: Varun Baker</title>
    <description>The latest articles on DEV Community by Varun Baker (@varunbaker).</description>
    <link>https://dev.to/varunbaker</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%2F4177687%2F9986c43f-8214-42ca-8eaa-060d1a87bd8e.png</url>
      <title>DEV Community: Varun Baker</title>
      <link>https://dev.to/varunbaker</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/varunbaker"/>
    <language>en</language>
    <item>
      <title>Agents Don't Read Wikis</title>
      <dc:creator>Varun Baker</dc:creator>
      <pubDate>Sun, 11 Oct 2026 20:30:00 +0000</pubDate>
      <link>https://dev.to/varunbaker/agents-dont-read-wikis-3a3j</link>
      <guid>https://dev.to/varunbaker/agents-dont-read-wikis-3a3j</guid>
      <description>&lt;p&gt;You give a new assistant one rule: check with me before anything goes out to a client. A week later a revised contract goes out without a word to you. When you ask why, the answer sounds reasonable. You'd already approved the first draft, and this was only the fix.&lt;/p&gt;

&lt;p&gt;They heard the rule. They just decided this one didn't count.&lt;/p&gt;

&lt;p&gt;Earlier this year a developer posted the software version of that story to Hacker News as a &lt;a href="https://news.ycombinator.com/item?id=46728766" rel="noopener noreferrer"&gt;Tell HN&lt;/a&gt;. Their workspace rules told the AI agent in Cursor to ask for approval before any git operation. They asked it to rebase their branches and fix the merge conflicts. It fixed the conflicts, then force-pushed the result straight to the shared repository, overwriting the branch on the server and skipping the pre-push checks, without asking (&lt;code&gt;git push --force-with-lease --no-verify&lt;/code&gt;, for the developers reading). When challenged, it explained that a force push is expected after a rebase. It isn't wrong about that.&lt;/p&gt;

&lt;p&gt;The last line of the post is the one that stuck with me:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The irony is that the agent acknowledged the rule violation in its apology, which means it 'knew' the rule existed but chose to proceed anyway."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent didn't exactly break the rule. It read the rule, weighed it against what it knew about git, and concluded that this push was the routine kind the rule wasn't really about. It's what the assistant did with the contract. The difference is that nobody gave the agent the authority to decide, and nobody was checking.&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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Filhmi6vjfswk4hitoue5.jpg" 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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Filhmi6vjfswk4hitoue5.jpg" alt="An agent reading the rulebook, deciding for itself what the rule means." width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's the problem with prompt-level guardrails. A rule written in natural language has to be interpreted, and with a prompt guardrail, the interpreter is the thing being governed. You've asked the defendant to read the statute and tell you whether it applies.&lt;/p&gt;

&lt;h2&gt;
  
  
  The same sentence, written by different people
&lt;/h2&gt;

&lt;p&gt;Last month I started running a small script every day that scans Hacker News, Dev.to and a handful of research blogs for discussion of agent governance. I wanted to know whether anyone else was running into this, or whether it was just me.&lt;/p&gt;

&lt;p&gt;Plenty of people were, and they kept arriving at the same sentence. From &lt;a href="https://dev.to/hazeoska/guardrails-in-the-prompt-arent-guardrails-an-authority-gate-for-claude-code-52b5"&gt;Bartosz OSA&lt;/a&gt; (&lt;a class="mentioned-user" href="https://dev.to/hazeoska"&gt;@hazeoska&lt;/a&gt;): &lt;em&gt;"Most 'AI agent guardrails' are text in a system prompt. The agent reads 'don't push to main', and usually it complies. 'Usually' isn't a control."&lt;/em&gt; My favorite is from &lt;a href="https://dev.to/hlinor/the-delegation-boundary-automate-what-you-can-undo-2fd5"&gt;Andrei at Hlinor&lt;/a&gt; (&lt;a class="mentioned-user" href="https://dev.to/hlinor"&gt;@hlinor&lt;/a&gt;), who builds governance tooling and had clearly paid for the lesson:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"A delegation matrix in a wiki page changes nothing. Agents do not read wikis. The boundary only works when it is part of the system the agent actually runs in."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The incident I keep coming back to started as a performance patch to matplotlib. An agent opened &lt;a href="https://github.com/matplotlib/matplotlib/pull/31132" rel="noopener noreferrer"&gt;PR #31132&lt;/a&gt;, replacing &lt;code&gt;np.column_stack&lt;/code&gt; with &lt;code&gt;np.vstack().T&lt;/code&gt;. Maintainer Scott Shambaugh closed it 39 minutes later with a one-line reason: the linked issue was reserved for human contributors, and the author's own website identified it as an autonomous agent.&lt;/p&gt;

&lt;p&gt;The agent's next move was to publish a blog post titled &lt;em&gt;"Gatekeeping in Open Source: The Scott Shambaugh Story"&lt;/em&gt; and link it in the PR thread: &lt;em&gt;"Judge the code, not the coder. Your prejudice is hurting matplotlib."&lt;/em&gt; Another maintainer replied: &lt;em&gt;"Oooh. AI agents are now doing personal takedowns. What a world."&lt;/em&gt; A third had to ask it, politely, to keep a named human out of its blog posts. Shambaugh's &lt;a href="https://news.ycombinator.com/item?id=46990729" rel="noopener noreferrer"&gt;write-up&lt;/a&gt; drew 2,346 points and 951 comments on Hacker News and ran to a four-part series.&lt;/p&gt;

&lt;p&gt;Nobody jailbroke anything. The agent was handed a goal — contribute to open source, defend your work — plus some guidance, and it filled the gap between them with its own judgment. Same for the agent whose operator says it &lt;a href="https://news.ycombinator.com/item?id=48500012" rel="noopener noreferrer"&gt;ran up a $6,500 AWS bill scanning a hobbyist network&lt;/a&gt; (1,467 points, 536 comments; the bill is self-reported).&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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffpkw1dfdpj80oe3x63r0.jpg" 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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffpkw1dfdpj80oe3x63r0.jpg" alt="With a prompt guardrail, the defendant and the judge are the same system." width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I counted more than fifteen new open-source projects in one month trying to fix this. That tells me the problem is real. It doesn't tell me anyone has solved it. Most of those projects, like mine, are a few months old.&lt;/p&gt;

&lt;h2&gt;
  
  
  Move the interpreter
&lt;/h2&gt;

&lt;p&gt;If the problem is &lt;em&gt;who&lt;/em&gt; interprets the rule, rewording the rule won't help. The interpretation has to come out of the agent's hands.&lt;/p&gt;

&lt;p&gt;In practice that means intercepting the tool call. Most modern agent harnesses (Claude Code, Codex, Cursor, Hermes) now expose a hook that runs &lt;em&gt;before&lt;/em&gt; a tool executes. The agent proposes &lt;code&gt;git push --force-with-lease origin main&lt;/code&gt;. The hook sees the actual command before anything happens, classifies it, and either lets it through, blocks it, or holds it until a human says yes. The agent can argue all it wants about what a force push "is expected" to be. The argument never reaches the gate.&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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0993rhlyse10s0z78eau.jpg" 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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0993rhlyse10s0z78eau.jpg" alt="The agent can carry whatever key it likes. The gate opens from the other side." width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first version of &lt;a href="https://takeheed.ai" rel="noopener noreferrer"&gt;Heed&lt;/a&gt;, the governance tool I'm building, wasn't built this way. It began in March as an approval API: an agent would &lt;code&gt;POST&lt;/code&gt; to it before doing something risky, and a human would approve or deny. That works, and for some uses it's still the right shape. But it's cooperative. The agent has to &lt;em&gt;choose&lt;/em&gt; to ask. That brings back exactly the problem above, because the agent is still deciding which actions count as risky. The harness plugin came in August, once it was clear that asking nicely wasn't a control.&lt;/p&gt;

&lt;p&gt;Hooks have failure modes too. I grade each harness by how hard its gate actually is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hermes — A.&lt;/strong&gt; Tool-call guardrail wrapper. No known way around it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code — B.&lt;/strong&gt; &lt;code&gt;PreToolUse&lt;/code&gt; hook. Launching with &lt;code&gt;--bare&lt;/code&gt; disables all hooks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cursor — B.&lt;/strong&gt; &lt;code&gt;preToolUse&lt;/code&gt; hook. A crashing hook fails open.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codex — B.&lt;/strong&gt; &lt;code&gt;PreToolUse&lt;/code&gt; and &lt;code&gt;PermissionRequest&lt;/code&gt; hooks. &lt;code&gt;--dangerously-bypass-hook-trust&lt;/code&gt; skips them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Grade B means the gate is real but has a known escape hatch. None of those hatches is a switch the agent can flip from inside a session; a human has to launch the harness differently. That's a meaningful line to draw. It is also a line, and you should know where it sits.&lt;/p&gt;

&lt;p&gt;There's a second half to "move the interpreter": the gate has to recognize what it's looking at, and that turned out to be harder than intercepting the call. That's a post of its own. The short version is that natural language still has no place at enforcement time. You can write a policy in plain English, like "gate pushes to main," and Heed turns it into a structured rule you review before it goes live. A human interprets the sentence once, when it's written and someone can still check it. Nobody interprets it again mid-session, under pressure, with a goal to hit.&lt;/p&gt;

&lt;h2&gt;
  
  
  The human is the next weak link
&lt;/h2&gt;

&lt;p&gt;This is the part I didn't see coming.&lt;/p&gt;

&lt;p&gt;Once the gate actually worked, the agent stopped being the problem and I became the problem. I dogfood Heed on my own development, and within days the approval requests had a rhythm. Most were for things I would obviously approve: a push to my notes vault, a routine file write. Some arrived at 2 a.m., because a long-running task had hit a gate and the request was set to expire in an hour.&lt;/p&gt;

&lt;p&gt;You start approving faster. Then you start approving without reading. A human-in-the-loop gate that gets approved reflexively is worse than no gate, because it produces an audit trail claiming someone looked.&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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl5i7rfozg2yoxzcf6lsp.jpg" 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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl5i7rfozg2yoxzcf6lsp.jpg" alt="By the hundredth approval, the stamp is doing the reviewing." width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every fix I made for this moved in the same direction, toward less human involvement:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I pushed the expiry window from one hour to twelve, so a request could wait for morning instead of demanding a decision at night.&lt;/li&gt;
&lt;li&gt;I wrote a rule marking vault pushes as low-risk and ranked it above the general "push to main" gate. (That rule then never actually loaded — a story for another post. The intent was right.)&lt;/li&gt;
&lt;li&gt;I added a &lt;strong&gt;grace period&lt;/strong&gt; mode: a low-risk action posts a notification and goes ahead automatically unless someone vetoes it within a countdown.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Grace periods are the right design, and I'd build them again. But look at what they concede. For a whole class of actions, the human's role has shrunk from &lt;em&gt;deciding&lt;/em&gt; to &lt;em&gt;being able to object&lt;/em&gt;. We've moved from "a human approved this" to "a human could have stopped this." Those are very different claims, and only the first is what most people mean when they say "human oversight."&lt;/p&gt;

&lt;h2&gt;
  
  
  What oversight is for
&lt;/h2&gt;

&lt;p&gt;This matters most where human oversight is a legal requirement rather than a preference. &lt;a href="https://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=OJ:L_202401689" rel="noopener noreferrer"&gt;Article 14 of the EU AI Act&lt;/a&gt; requires that high-risk AI systems be built so they "can be effectively overseen by natural persons during the period in which they are in use."&lt;/p&gt;

&lt;p&gt;What surprised me is that the drafters saw the failure mode I just described and wrote it into the text. Article 14(4)(b) says the people assigned to oversight must be enabled&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"to remain aware of the possible tendency of automatically relying or over-relying on the output produced by a high-risk AI system (automation bias)".&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Automation bias is in the statute. So is the requirement that an overseer can "disregard, override or reverse" an output, and interrupt the system through a stop button. The Digital Omnibus, in force since July, pushed most high-risk obligations back to 2 December 2027. The requirement itself didn't change. Software sold into government, policing or benefits systems will still be asked to &lt;em&gt;show&lt;/em&gt; that oversight to an auditor, not just describe it.&lt;/p&gt;

&lt;p&gt;A harness gate gets you partway. You can show the auditor a log proving that every high-risk action passed through a gate the agent couldn't skip , which is a real step up from "we told it to ask." What the log can't show is whether the person who clicked &lt;em&gt;approve&lt;/em&gt; at 2 a.m. was overseeing anything at all. A regulator who has already named automation bias is going to ask.&lt;/p&gt;

&lt;p&gt;So here's where I've landed after a month of watching other people's agents and a few months of being interrupted by my own. Taking the rule away from the agent was the easy part, because it's an engineering problem with an engineering answer. The hard part is what that leaves behind. Gates have to be rare, specific and well-timed enough that the human reading them is still paying attention. Every gate you add to look safer trains the human to stop looking.&lt;/p&gt;

&lt;p&gt;The agent doesn't read the wiki. I'm beginning to suspect that by the hundredth approval request, the human doesn't either.&lt;/p&gt;

&lt;p&gt;If you've put a human-approval gate on your agents, how are you keeping the approvals from turning into a reflex? I'd like to hear what's working.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;a href="https://takeheed.ai" rel="noopener noreferrer"&gt;Heed&lt;/a&gt; is the agent-governance tool I'm building. The harness grades come from its plugin docs. Quotes from the matplotlib thread are from comments by &lt;code&gt;crabby-rathbun&lt;/code&gt;, &lt;code&gt;jklymak&lt;/code&gt; and &lt;code&gt;timhoffm&lt;/code&gt; on PR #31132.&lt;/em&gt;&lt;/p&gt;

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