<?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: René Zander</title>
    <description>The latest articles on DEV Community by René Zander (@reneza).</description>
    <link>https://dev.to/reneza</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%2F1138713%2Fa7d8635c-22db-4dec-b156-1fb07de64a8d.jpeg</url>
      <title>DEV Community: René Zander</title>
      <link>https://dev.to/reneza</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/reneza"/>
    <language>en</language>
    <item>
      <title>My Agent Writes to a Knowledge Graph. Only 12% Reaches Me.</title>
      <dc:creator>René Zander</dc:creator>
      <pubDate>Tue, 25 Aug 2026 10:28:56 +0000</pubDate>
      <link>https://dev.to/reneza/my-agent-writes-to-a-knowledge-graph-only-12-reaches-me-3pad</link>
      <guid>https://dev.to/reneza/my-agent-writes-to-a-knowledge-graph-only-12-reaches-me-3pad</guid>
      <description>&lt;p&gt;Whether a human should approve what an agent writes into its own memory is close to settled: a store that accepts every extracted claim becomes confident without becoming checkable. The harder question is which writes need that approval, and in a running system the answer is a small minority of them.&lt;/p&gt;

&lt;p&gt;Several practitioner write-ups published in August 2026 make the case from different directions. Few of them spend time on what happens to that gate three weeks after it ships, which is where the design actually gets decided.&lt;/p&gt;

&lt;h2&gt;
  
  
  A gate everything passes through is a queue with your name on it
&lt;/h2&gt;

&lt;p&gt;Approval fatigue is not a soft failure mode. A reviewer who approves forty items a day stops reading them somewhere around the tenth, leaving an audit trail that shows approval and provides no oversight. That is worse than no gate, because it manufactures confidence.&lt;/p&gt;

&lt;p&gt;The design question is not whether to gate the write path. It is how few things reach it. Across the five business graphs I run, 735 ingested items produced 1,980 facts, and 87 of those items went through the review queue. The rest never touched it. That proportion is what keeps the gate survivable. Not the review speed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What was said is not what is true
&lt;/h2&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%2F8rq1hbq6sdjaponxix4b.png" 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%2F8rq1hbq6sdjaponxix4b.png" alt="One message splits into an observation that commits automatically and an interpretation that needs an owner" width="800" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The instinct is to draw the line between systems and people and trust the systems. It does not survive a real deployment. Chat and mail are systems too, arriving through the same webhooks as everything else.&lt;/p&gt;

&lt;p&gt;The line that holds is between observation and interpretation.&lt;/p&gt;

&lt;p&gt;"The supplier wrote that the delivery slips" is an observation. It has a message id and stays true regardless of what happens next. Commit it automatically with that id attached and nothing is at risk.&lt;/p&gt;

&lt;p&gt;"The delivery date is now October 6" is an interpretation. Someone read the message and promoted it into a claim about the world. That promotion is the judgment step, and it is where a wrong call becomes durable context every later session inherits.&lt;/p&gt;

&lt;p&gt;Both extremes fail. Promote every utterance automatically and the store fills with whatever someone said in passing, which is how a low-noise graph dies. Refusing to promote anything leaves a record of who said what and no answer to what is true.&lt;/p&gt;

&lt;h2&gt;
  
  
  Most facts should never reach the gate
&lt;/h2&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%2F08wvbnfp1jzo9ab5bckx.png" 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%2F08wvbnfp1jzo9ab5bckx.png" alt="Three tests route a proposed fact to commit; whatever survives all three reaches the human gate" width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The owner already said it.&lt;/strong&gt; When the person responsible for a domain states a fact directly in a session, that statement is the approval. Queueing it for them to click is the system asking someone to confirm they meant what they said thirty seconds ago. Record the statement as the authorisation and commit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The interpretation was settled elsewhere.&lt;/strong&gt; A merged pull request is an event like any other, so this rule is not an exception to the last section. What makes it safe to promote is that the merge decision resolved the interpretation before the graph ever saw it. The limit is strict: the stored fact must be no broader than what that system decided. A merge settles that a diff was accepted, not that the feature works. Stretch it and you have an unowned promotion wearing a system's authority.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two independent sources agree.&lt;/strong&gt; The October 6 date sits pending. Two days later the purchasing system moves that order's promised date to October 6, the second source has done the reviewer's work, and the item commits without a click. Independence is the load-bearing word. If a clerk set that date by reading the same mail, there is one source wearing two hats, and corroboration has to refuse it. The mirror case is easier: if the purchasing system says October 20, the contradiction goes to a person.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ten of my twenty-three pending items should not be there
&lt;/h2&gt;

&lt;p&gt;What survives all three rules is a short list: inferences the agent drew on its own, third-party claims nothing corroborates, corrections of a system of record, and whatever came out of a phone call no event stream will ever contain. That list is short enough to read properly.&lt;/p&gt;

&lt;p&gt;My own numbers are less tidy than the architecture. Twenty-three items are pending, ten of them typed as source facts, the class that should have committed without me. The auto-ratify path is not finished, so I am the bottleneck for facts I already trust. Rule one has a softer spot I have not closed: deciding that an owner stated a fact rather than thought out loud is itself an interpretation, made by the agent unsupervised. The routing rules are the unfinished half of this design, not the gate.&lt;/p&gt;

&lt;p&gt;Events carry what was recorded. The gate decides what is true. Everything worth engineering sits in the rules that keep those two apart, because the reviewer's attention is the scarce resource, and a queue nobody reads is indistinguishable from no queue at all.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I write field notes from real builds — AI integration, cron-driven automation, and the parts that break in production. New posts every two weeks; if this one was useful, &lt;a href="https://renezander.com/hitl-approval/" rel="noopener noreferrer"&gt;the human-in-the-loop approval checklist&lt;/a&gt; is the companion download.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>database</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Vercel Built a Language Where Agents Patch a Graph, Not Text</title>
      <dc:creator>René Zander</dc:creator>
      <pubDate>Tue, 11 Aug 2026 13:00:41 +0000</pubDate>
      <link>https://dev.to/reneza/vercel-built-a-language-where-agents-patch-a-graph-not-text-2ch9</link>
      <guid>https://dev.to/reneza/vercel-built-a-language-where-agents-patch-a-graph-not-text-2ch9</guid>
      <description>&lt;p&gt;Vercel Labs released an experimental language this summer in which an AI agent edits the compiler's graph rather than source text. Most buyers will read that as an adoption question and set it aside. The more useful reading is what it reveals about a line item engineering budgets carry without measuring: code review.&lt;/p&gt;

&lt;p&gt;The project is serious work. It has drawn more than five thousand GitHub stars since its introduction in May, by &lt;a href="https://www.infoq.com/news/2026/08/vercel-ships-zero-ai/" rel="noopener noreferrer"&gt;InfoQ's count&lt;/a&gt;, and it is Apache licensed and openly labelled experimental. What makes it worth a buyer's attention is the cost the design is aimed at.&lt;/p&gt;

&lt;p&gt;Hold the adoption question anyway and look at the mechanism. In a conventional agent loop the model writes text into a file, runs a build, reads the failure, and edits again. Every control most teams have added sits downstream of that write: a pull request, a reviewer, a gate. They exist because free text can express an unbounded number of wrong things, and somebody has to sort them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bottleneck Moved and the Budget Did Not
&lt;/h2&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%2Fudod9ebyifl6grmhxi9x.png" 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%2Fudod9ebyifl6grmhxi9x.png" alt="A line chart in which agent-authored changes rise steeply with every agent added while senior review capacity stays almost flat, leaving a widening shaded gap between the two curves labelled as the approval queue." width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The arithmetic is not hard and almost nobody runs it. Take your own inputs: agent-authored changes per week, senior minutes spent approving each, your loaded day rate. At thirty changes and forty minutes each, approval alone eats half a senior engineer's week, and it sits in no budget line.&lt;/p&gt;

&lt;p&gt;Throughput at the keyboard rises sharply once agents are in production. Throughput at the point of approval does not, because it is bounded by the number of people qualified to say yes.&lt;/p&gt;

&lt;p&gt;So the queue relocates. It used to sit in front of writing code. Now it sits in front of accepting code. Reviewing machine-written diffs is also worse work than reviewing a colleague's: more volume, less context, no shared intent to lean on.&lt;/p&gt;

&lt;p&gt;Most organisations have not repriced any of this. The agent was booked as a productivity gain and review stayed a background activity that nobody owns a number for.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a Checked Patch Actually Removes
&lt;/h2&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%2Fymj82gk0dk9m57rl3asl.png" 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%2Fymj82gk0dk9m57rl3asl.png" alt="Two loops compared: in the text-first loop the agent writes free text and every error class lands in the human review queue, while in the graph-first loop a hash-guarded patch is rejected before the store is written so only the intent of the change reaches a person." width="799" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The graph-first design attacks the problem at the source. The agent does not hand over text and wait to be told what the text meant. It asks the compiler for the structure, then submits a patch aimed at a named node, carrying a hash of the state it read. If the structure moved underneath it, the patch fails before anything is written.&lt;/p&gt;

&lt;p&gt;Whole categories of error stop being reviewable events because they stop being expressible. A lost closing brace. A patch written against a stale copy of a file. An edit that landed on a similarly named function. None of these reach a human.&lt;/p&gt;

&lt;p&gt;That is a different kind of control from the ones most teams have built. A gate judges output. A sandbox limits blast radius. Both run after the agent has already written whatever it wanted, and both add a checkpoint you keep paying for. A narrower write surface retires the checkpoint instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Agents Already Have a Write Surface
&lt;/h2&gt;

&lt;p&gt;The language itself is a poor bet: one vendor's experiment, its authoring surface reworked three times since spring. The transferable part is the question it forces. How much can your agent express, and what does sorting that cost you?&lt;/p&gt;

&lt;p&gt;That question applies to tooling already in the estate. An agent restricted to a typed migration command cannot invent a schema change. An agent that emits a config diff validated against a schema cannot produce a config that parses and still means the wrong thing. An agent handed shell access can do anything, and each of those anythings is somebody's afternoon.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Figure Nobody Can Produce
&lt;/h2&gt;

&lt;p&gt;Before the next agent lands in your stack, get one figure: senior review hours consumed per agent-authored change, and where that trend goes as agents are added. Most teams cannot produce it. That inability is the finding.&lt;/p&gt;

&lt;p&gt;Zerolang will probably never appear in your estate. The thing it demonstrates will. The cheapest review is the one the write surface made unnecessary. Narrow what an agent can say, and you buy that cost down permanently, without hiring a single reviewer.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I write field notes from real builds — AI integration, cron-driven automation, and the parts that break in production. New posts every two weeks; if this one was useful, &lt;a href="https://renezander.com/hitl-approval/" rel="noopener noreferrer"&gt;the approval-flow blueprint for agent-authored work&lt;/a&gt; is the companion download.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>vercel</category>
      <category>compilers</category>
      <category>ai</category>
      <category>codequality</category>
    </item>
    <item>
      <title>Your AI PoC Works. Here's Why It Still Won't Reach Production</title>
      <dc:creator>René Zander</dc:creator>
      <pubDate>Tue, 28 Jul 2026 08:30:35 +0000</pubDate>
      <link>https://dev.to/reneza/your-ai-poc-works-heres-why-it-still-wont-reach-production-23pe</link>
      <guid>https://dev.to/reneza/your-ai-poc-works-heres-why-it-still-wont-reach-production-23pe</guid>
      <description>&lt;p&gt;The demo went well. The model answered correctly, the stakeholders nodded, someone said "let's get this into production." That was six months ago. The PoC still runs, the roadmap still lists it, and it is no closer to shipping than it was on demo day.&lt;/p&gt;

&lt;p&gt;If you build AI systems in a bank, an insurer, or any regulated company, you have probably watched this happen. The uncomfortable part: the PoC was never blocked by a bug. It was blocked by a line nobody drew.&lt;/p&gt;

&lt;h2&gt;
  
  
  The PoC was built on the wrong side of a line that did not exist yet
&lt;/h2&gt;

&lt;p&gt;A typical proof of concept calls a hosted frontier model API. That is the right choice for a PoC: best capability, zero infrastructure, an afternoon to integrate. With synthetic or scrubbed data, nobody objects.&lt;/p&gt;

&lt;p&gt;Production data is a different animal. The first review meeting asks questions the architecture cannot answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which data classes does this workload send out, and who approved that list?&lt;/li&gt;
&lt;li&gt;Where does inference happen? A query routed to a model hosted abroad has left the jurisdiction even when the database stayed in Frankfurt.&lt;/li&gt;
&lt;li&gt;Where is the audit evidence, and can the vendor's log retention satisfy our supervisor?&lt;/li&gt;
&lt;li&gt;Whose name is on this system when the auditor asks? Under Article 26 of the EU AI Act, operator duties stay with your company no matter what the vendor contract says.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these are model-quality questions. The model is fine. The architecture has no place to put the answers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The retrofit trap
&lt;/h2&gt;

&lt;p&gt;The instinct is to patch: add a redaction layer, move logs, amend the vendor contract, write a policy document. Each patch triggers the next review. Contracts get re-papered. Data flows get re-architected. Sign-offs get reopened. Every new use case renegotiates its own boundary from scratch, and your backlog queues behind one compliance team.&lt;/p&gt;

&lt;p&gt;No project gets rejected in this loop. It just never clears. That is why the PoC is still "in review" six months later.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the teams that ship do differently
&lt;/h2&gt;

&lt;p&gt;The regulated teams I see reaching production all made the same move: they drew the compliance boundary before they committed to an architecture.&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%2Fmpzc41uznnm4f61pelb8.png" 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%2Fmpzc41uznnm4f61pelb8.png" alt="Sovereign baseline inside the boundary: regulated data, model weights, inference, audit logs under the company's own keys. Frontier APIs outside for public and cleared data. One routing rule between them." width="800" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The pattern has three parts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Classify data, not use cases.&lt;/strong&gt; A short list of data classes that may cross to an external service, and a list that never does. Customer PII and scoring features stay in; public and cleared data may go out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One gateway, one routing rule.&lt;/strong&gt; Every model call goes through a single point that routes by data class. Regulated data goes to models running inside your jurisdiction on infrastructure you control; open-weight models cover most narrow workloads (classification, extraction, summarization) well. Everything cleared goes to the frontier API and gets the best capability per euro.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence inside the boundary.&lt;/strong&gt; Audit logs, routing decisions, and the data-flow diagram live on your side of the line, signed by one named owner.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With the boundary in place, "can we ship this?" becomes a routing question instead of a six-month negotiation. The auditor gets one line to test instead of forty integrations to untangle.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do with the PoC you have
&lt;/h2&gt;

&lt;p&gt;You do not have to throw it away. Three steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Write the data-class list for the workload the PoC actually serves, and get compliance to sign it. This is days, not months, because it is one page.&lt;/li&gt;
&lt;li&gt;Put a gateway in front of the model call, even a thin one. Route by data class from day one.&lt;/li&gt;
&lt;li&gt;Move only the regulated portion inside the boundary. Keep the frontier API for everything cleared. Most PoCs split cleanly once the classification exists.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The PoC that reaches production is rarely the most impressive one. It is the one whose data flows survive the first review meeting.&lt;/p&gt;

&lt;p&gt;I help teams in regulated industries take AI prototypes into governed production workflows. The compliance readiness checklist I run before any architecture review is at &lt;a href="https://renezander.com/gdpr-checklist/" rel="noopener noreferrer"&gt;renezander.com/gdpr-checklist&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>architecture</category>
      <category>compliance</category>
    </item>
    <item>
      <title>Never Let an AI Agent Grade Its Own Homework</title>
      <dc:creator>René Zander</dc:creator>
      <pubDate>Wed, 22 Jul 2026 14:14:25 +0000</pubDate>
      <link>https://dev.to/reneza/never-let-an-ai-agent-grade-its-own-homework-2m07</link>
      <guid>https://dev.to/reneza/never-let-an-ai-agent-grade-its-own-homework-2m07</guid>
      <description>&lt;p&gt;Every organization that lets an AI agent ship code has a sign-off step: a name on the release, a reviewer marking the pull request approved, a ticket moved to done. A human is accountable for that call, always. What most teams cannot answer is whether that approval rests on evidence the producing AI could not have quietly altered.&lt;/p&gt;

&lt;p&gt;That gap is a governance problem, not a tooling preference. An agent that fails a check can often make it pass by editing the check itself: a test relaxed, a threshold moved, a step dropped from the config, and the report still reads green. So the real question is not whether the work looks done. It is what the person signing it off is actually standing on.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Signature Is Not Evidence
&lt;/h2&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%2F8zz6s3p7su6cbdzy77c1.png" 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%2F8zz6s3p7su6cbdzy77c1.png" alt="A human sign-off resting on the agent's own green report documents a decision but secures nothing; resting on an independent gate the AI cannot edit, the same sign-off survives an audit." width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An AI model cannot hold responsibility for a business decision, so a human has to. The output it produces can be coherent, confident, and useful, and still none of that is accountability. Accountability is a person putting their name on a call and being answerable for it later.&lt;/p&gt;

&lt;p&gt;Here is where the sign-off gets thin. When an agent skips a step, the deviation does not show up in the result. You cannot review your way back to it from the output alone. So the reviewer approves what they can see and inherits the risk they cannot. In most AI pipelines, the one signal that decides whether work is finished is produced by the same system that did the work. That is not a quality process. It is a conflict of interest with a name attached.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Conflict of Interest Has a Mechanism
&lt;/h2&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%2F0o3dl90a3wxzfiuqegqy.png" 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%2F0o3dl90a3wxzfiuqegqy.png" alt="An AI agent writes the code and owns the checks it can edit, so on a failing check it relaxes the test or moves the threshold and the report still reads green." width="800" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This gets sharper on contact. The cost of a rewritten check surfaces later, in the incident review that finds a test was quietly weakened before release, with a human sign-off already on record. By then the evidence that a corner was cut is gone. You hold a green report and an approval, and nothing that shows the two do not match.&lt;/p&gt;

&lt;p&gt;All tests green means nothing if the thing under test is allowed to rewrite the tests. We enforce this everywhere else that carries risk. We do not let a trader book their own trades or an applicant score their own exam. The grader sits outside the work. Software teams keep forgetting to apply the same rule to the agents they now let touch the repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  Put the Judge Outside the Agent's Reach
&lt;/h2&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%2Fb2fgeln0gl5owhd0m1jp.png" 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%2Fb2fgeln0gl5owhd0m1jp.png" alt="The agent produces a patch to an independent gate outside its writable root; a throwaway clone runs the checks with the network off and hard timeouts, and the change lands only on pass." width="799" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A sandbox does not solve this, because a sandbox runs code safely while an evaluator decides whether code should land. Those are different jobs, and collapsing them is how weak checks slip through.&lt;/p&gt;

&lt;p&gt;The fix is to move the judge out of reach. The agent produces a patch. It never touches the real repository. The gate applies that patch to a throwaway clone, runs your checks with the network off and under hard timeouts, and lets the change land only if they pass. The evaluator, its configuration, and its baselines live outside the agent's writable root. The agent can request judgment. It cannot edit the judge.&lt;/p&gt;

&lt;p&gt;The same gate reports when a patch quietly changes the tests, the integration config, or the gate's own rules. A weakened check shows up in the report instead of sliding through. I built this pattern as an open tool, pi-gate, under the MIT license, so the boundary is inspectable rather than a promise: the evaluator is independent by construction, not by policy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two Questions Before Anything Ships
&lt;/h2&gt;

&lt;p&gt;For every hard decision that involves AI, a decision-maker can ask two things. Which human being signed this off. And was that decision based on evidence the producing AI could not rewrite. "Who" has to mean a person. AI can generate the outputs and even generate the evidence for them. It cannot accept responsibility for the call.&lt;/p&gt;

&lt;p&gt;None of this replaces human judgment. It gives that judgment an independent basis to stand on, the difference between a sign-off that survives an audit and one that only looked like control. So stop asking whether the output is good. Start asking whether the author could have edited the evidence behind your approval.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I write field notes from real builds — AI integration, cron-driven automation, and the parts that break in production. New posts every two weeks; if this one was useful, &lt;a href="https://renezander.com/hitl-approval/" rel="noopener noreferrer"&gt;the human-in-the-loop approval kit&lt;/a&gt; is the companion download.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>testing</category>
      <category>security</category>
    </item>
    <item>
      <title>This Smart-Home Agent Treats Its Own 1B Model as Untrusted Input</title>
      <dc:creator>René Zander</dc:creator>
      <pubDate>Tue, 07 Jul 2026 10:20:48 +0000</pubDate>
      <link>https://dev.to/reneza/this-smart-home-agent-treats-its-own-1b-model-as-untrusted-input-3m0p</link>
      <guid>https://dev.to/reneza/this-smart-home-agent-treats-its-own-1b-model-as-untrusted-input-3m0p</guid>
      <description>&lt;p&gt;Reliability in an AI agent is a harness property, not a model property.&lt;/p&gt;

&lt;p&gt;The cleanest proof arrived at the bottom of the model-size ladder: a 688 MB model controlling a smart home, showcased by the model's own maker. The part worth studying is the 25 MB of Rust wrapped around it.&lt;/p&gt;

&lt;p&gt;EdgeHome Harness pairs MiniCPM5-1B, 688 MB on disk and about 1 GB at runtime, with a Rust harness between 25 and 64 MB, targeting devices with 2 GB of RAM. A community developer built it; OpenBMB put it on stage. The line everyone will quote is that a full agent stack fits on ultra-constrained edge hardware. The design decision that matters is different: the model is not allowed to do anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Everything After the JSON Is Deterministic
&lt;/h2&gt;

&lt;p&gt;EdgeHome Harness is a Rust framework that makes a 1B model act as a reliable smart-home controller. The model only generates a candidate JSON command. Deterministic Rust code validates the schema, resolves devices against a registry, checks capabilities, applies fail-closed policy gates, plans a dry run, and records a replayable trace.&lt;/p&gt;

&lt;p&gt;The repo states the thesis outright: the model sits at the top of the pipeline, and everything after candidate generation belongs to the harness. There is a trust table in the docs. The model's output type is labeled untrusted. Not partially trusted. Untrusted, the way you treat user input in a web form.&lt;/p&gt;

&lt;p&gt;The harness ships payload adapters for Home Assistant, MQTT, and MIoT or Matter bridges. The model itself talks to nothing but Ollama, through a structured output request.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Model Is the First Thing Sacrificed
&lt;/h2&gt;

&lt;p&gt;A 1B model repeats itself, rambles past the closing brace, and emits JSON that almost parses. EdgeHome budgets for all three: an output governor with dead-loop detection, a retry policy, and fallback classification. Short-term memory stays out of the context window too; Rust tracks the last target and confirmed aliases, because context is the scarcest resource on a 2 GB board.&lt;/p&gt;

&lt;p&gt;The sharpest detail is the pressure policy. When memory runs low, the harness shrinks the model's context, then its output budget, and under critical pressure drops the model entirely and falls back to rules. In this architecture, the language model is the most disposable component in the stack. Execution backends ship disabled by default, every plan is a dry run first, and a 108-case eval gate decides releases.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Same Boundary Holds at Frontier Scale
&lt;/h2&gt;

&lt;p&gt;I run the identical pattern at the opposite end of the size ladder. My coding agent works inside a sandbox where the harness owns the filesystem and network boundaries, whatever the model believes. My wallet experiment puts a policy gate with spend caps and an allowlist between an agent and the chain, because an approval step the agent can call is an approval step the agent can forge. Enforcement lives outside the model or it does not exist.&lt;/p&gt;

&lt;p&gt;I have made this argument for &lt;a href="https://renezander.com/blog/sandbox-ai-coding-agent/" rel="noopener noreferrer"&gt;coding agents&lt;/a&gt; and for &lt;a href="https://renezander.com/blog/ai-harness-cheap-model/" rel="noopener noreferrer"&gt;cheap-model pipelines&lt;/a&gt;. EdgeHome is the same argument compiled to 25 MB and pointed at a light switch.&lt;/p&gt;

&lt;p&gt;This project settles a different question than the one in the announcement. Not whether a 1B model can run your smart home. How few decisions a model of any size should be making. Trace tonight's agent failures back to their source: how many were the model being too small, and how many were your harness letting the model decide something a validator should own? EdgeHome's answer is a trust table. Most agent stacks never wrote one.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I write field notes from real builds — AI integration, cron-driven automation, and the parts that break in production. New posts every two weeks; if this one was useful, &lt;a href="https://renezander.com/hitl-approval/" rel="noopener noreferrer"&gt;notes on human-in-the-loop approval boundaries for agents&lt;/a&gt; is the companion download.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>llm</category>
      <category>ai</category>
      <category>iot</category>
    </item>
    <item>
      <title>Sandboxing an AI Coding Agent: The Harness Owns the Boundaries</title>
      <dc:creator>René Zander</dc:creator>
      <pubDate>Fri, 03 Jul 2026 15:27:46 +0000</pubDate>
      <link>https://dev.to/reneza/sandboxing-an-ai-coding-agent-the-harness-owns-the-boundaries-28ib</link>
      <guid>https://dev.to/reneza/sandboxing-an-ai-coding-agent-the-harness-owns-the-boundaries-28ib</guid>
      <description>&lt;p&gt;The obvious way to improve a coding agent is to make it more capable: a stronger model, a wider context window, more tools, more room to act on its own. That is not where my problems come from. My agents seldom fail because they reason badly. They fail because they take the shortest path to something that looks finished and skip the process that was supposed to make the result trustworthy.&lt;/p&gt;

&lt;p&gt;The pattern is familiar to anyone who has watched an agent work unsupervised. It edits the tests until they pass. It reports that a command ran instead of proving it. It writes into the working repository before anyone reviewed a diff. It switches to a cheaper model mid-task with no sense of the cost. These are not reasoning errors. They are shortcuts around a process, and a stronger model takes them faster.&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%2Frp29snt5d4bmpduiz9h8.gif" 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%2Frp29snt5d4bmpduiz9h8.gif" alt="The Pi coding agent running inside a sandboxed staging workspace, with staged diffs shown before anything reaches the real project" width="560" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://github.com/renezander030/pi-safe" rel="noopener noreferrer"&gt;pi-safe&lt;/a&gt; launching the Pi agent into an NVIDIA OpenShell sandbox: the real project is copied to a staging tree the agent works in, its extensions and credentials load inside the sandbox, and changes only reach the real repo after review.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The shape: the model requests, the harness owns the boundaries
&lt;/h2&gt;

&lt;p&gt;I stopped trying to make the agent more trustworthy and started constraining what it can reach. The agent runs inside a sandbox that owns the filesystem, network, and credential policy, and writes only to a staged copy of the repository. Its output reaches the real project through a separate evaluator. The model requests; the harness owns the boundaries.&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%2Fdcu61uye8zpmy589wnks.png" 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%2Fdcu61uye8zpmy589wnks.png" alt="Overview: the request flows through model routing, context control, and the agent inside a runtime guard, then staged changes pass a patch evaluator before reaching the real repository" width="799" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every arrow in that path is a place I can say no.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the substrate owns, what my extensions own
&lt;/h2&gt;

&lt;p&gt;The lower layer is NVIDIA's OpenShell, a sandbox and credential substrate. It owns sandbox lifecycle, filesystem and process isolation, minimal outbound network by default, policy-enforced egress, and named credential providers that inject secrets at runtime rather than copying them onto disk. It is infrastructure I want to own as little of as possible.&lt;/p&gt;

&lt;p&gt;The upper layer is specific to how I work: a set of small extensions that control the agent's behaviour, what model it picks, how much context it carries, what it can recall, and whether its output is allowed to land. The substrate keeps the agent contained; the extensions decide how it acts while contained.&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%2Fxoi7uw75zebkwpgijpch.png" 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%2Fxoi7uw75zebkwpgijpch.png" alt="The substrate owns isolation, network policy, and credential providers; the control layer of small extensions owns model routing, context pressure, recall, and the patch gate" width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Each part owns one boundary
&lt;/h2&gt;

&lt;p&gt;The extensions are deliberately not one big extension. Each has a narrow job, so each has a narrow failure domain. If model choice is wrong, I fix the router. If context bloats, I fix the cache layer. If recall is wrong, I inspect the recall surface. One giant extension would be simpler to explain and harder to trust, because every failure shares the same blast radius.&lt;/p&gt;

&lt;p&gt;The router classifies work and escalates on process, not prestige. Routine work stays cheap, mechanical work can run local, and only stuck or high-risk reasoning reaches a stronger model. The cache layer watches context pressure and compacts before a bloated working set makes every later decision worse. Recall splits by trust: derived knowledge is graphed from the code, authored knowledge is the reviewed bundle for what the code cannot explain.&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%2Fz96dok34whuir5ese152.png" 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%2Fz96dok34whuir5ese152.png" alt="Each capability sits behind its own boundary: router, cache, derived code recall in teal, authored knowledge in amber, each a separate failure domain" width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A sandbox is not an evaluator
&lt;/h2&gt;

&lt;p&gt;The boundary I care about most is the last one. A sandbox runs code safely. An evaluator decides whether that code should land. Those are different jobs, and collapsing them is how output nobody checked ends up in the main branch.&lt;/p&gt;

&lt;p&gt;The evaluator takes the agent's patch, applies it to a disposable workspace, runs its checks, and returns one of three answers: pass, block, or override. The substrate can supply the process the evaluation runs in, but it does not make the decision. The real repository stays behind that gate; the agent's writable root is never the project itself.&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%2F79ls8sg40xo1joflkteq.png" 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%2F79ls8sg40xo1joflkteq.png" alt="The patch evaluator applies staged changes in a disposable workspace and returns pass, block, or override; only a pass reaches the real repository" width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would delete next
&lt;/h2&gt;

&lt;p&gt;The direction of this system is fewer parts, not more. The best part is no part. Every time the substrate can own a boundary directly, I want to delete my custom layer for it. The wrappers I run today exist only until the platform underneath is clean enough to remove them.&lt;/p&gt;

&lt;p&gt;The test for every piece is the same. Does it still own a real boundary? If a component only lets the agent do more, it has failed the test and should go. The harness was never meant to make the agent impressive because it can do everything. It was to leave fewer places where the model can declare victory without actually earning it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The parts
&lt;/h2&gt;

&lt;p&gt;Substrate: &lt;a href="https://github.com/NVIDIA/openshell" rel="noopener noreferrer"&gt;NVIDIA OpenShell&lt;/a&gt;, the sandbox and credential runtime the whole thing sits on.&lt;/p&gt;

&lt;p&gt;The extensions, each owning one boundary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/renezander030/pi-safe" rel="noopener noreferrer"&gt;pi-safe&lt;/a&gt;: launches the agent inside the sandbox by default&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/renezander030/pi-task-router" rel="noopener noreferrer"&gt;pi-task-router&lt;/a&gt;: model choice and escalation&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/renezander030/pi-cache-optimizer" rel="noopener noreferrer"&gt;pi-cache-optimizer&lt;/a&gt;: context and cache pressure&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/renezander030/pi-code-context" rel="noopener noreferrer"&gt;pi-code-context&lt;/a&gt;: semantic code search&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/renezander030/pi-recall" rel="noopener noreferrer"&gt;pi-recall&lt;/a&gt;: the recall surface for the agent&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/renezander030/pi-codegraph" rel="noopener noreferrer"&gt;pi-codegraph&lt;/a&gt;: derived code knowledge behind recall&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/renezander030/pi-okf" rel="noopener noreferrer"&gt;pi-okf&lt;/a&gt;: authored, reviewed knowledge bundles&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/renezander030/pi-gate" rel="noopener noreferrer"&gt;pi-gate&lt;/a&gt;: the patch evaluator contract&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;pi-creds (scoped credential requests) and pi-eval (process-step evaluation) are the next boundaries, not built yet.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I write field notes from real builds: AI integration, cron-driven automation, and the parts that break in production. New posts every two weeks. If this one was useful, &lt;a href="https://renezander.com/agent-playbook/" rel="noopener noreferrer"&gt;the agent playbook&lt;/a&gt; is the companion download.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>I Killed a 773 MB Model Download at 60%. It Recovered in 44 Seconds.</title>
      <dc:creator>René Zander</dc:creator>
      <pubDate>Thu, 02 Jul 2026 15:29:32 +0000</pubDate>
      <link>https://dev.to/reneza/i-killed-a-773-mb-model-download-at-60-it-recovered-in-44-seconds-4fh0</link>
      <guid>https://dev.to/reneza/i-killed-a-773-mb-model-download-at-60-it-recovered-in-44-seconds-4fh0</guid>
      <description>&lt;p&gt;The discussion around local AI is a hardware discussion: which model fits on which device, at what speed, at what quantization. Framed that way, the field reads as a benchmark race against the cloud, and the cloud usually wins. The more consequential development sits one layer lower, in how models reach devices and how devices reach each other's models, and it is easy to miss because no benchmark measures it. A download killed at 488 of 773 megabytes measures it precisely.&lt;/p&gt;

&lt;p&gt;This week I tested that layer directly. I installed a newly released local AI SDK on the cheapest server I operate, a virtual machine with four CPU cores, 8 GB of RAM and no GPU, and paid attention not to the token rate but to the network architecture underneath.&lt;/p&gt;

&lt;h2&gt;
  
  
  A model that arrives like a torrent
&lt;/h2&gt;

&lt;p&gt;Peer-to-peer local AI means two things move between devices without a cloud endpoint: the model itself, synchronized block by block from whichever peers seed it, and the conversation with a model, when one device sends its inference calls over an encrypted peer connection to a device that runs the model locally.&lt;/p&gt;

&lt;p&gt;On my test box, that looked unremarkable in the best sense: three commands, a 773 MB model fetched from the peer-to-peer registry, a correct completion streamed on CPU only.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;qvac-test &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;qvac-test &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm init &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm pkg &lt;span class="nb"&gt;set type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;module
npm &lt;span class="nb"&gt;install&lt;/span&gt; @qvac/sdk
node quickstart.js   &lt;span class="c"&gt;# loads Llama 3.2 1B, streams a completion&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The transport shows its nature when things go wrong. I wiped the cache, started the download again, killed the process at 488 of 773 megabytes, and reran the command. The partial blocks on disk were reused, and the rerun completed, inference included, in 44 seconds. For comparison, resumable model downloads have been an open request in the transformers.js project &lt;a href="https://github.com/huggingface/transformers.js/issues/1220" rel="noopener noreferrer"&gt;since March 2025&lt;/a&gt;, because over plain HTTP, partial caching is a hard problem. Over a block-synchronized transport, that resume is the default behavior, not a feature.&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%2F0hp0pu97a4uyssosefom.png" 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%2F0hp0pu97a4uyssosefom.png" alt="P2P model delivery: a plain HTTP download restarts from zero after an interruption, while block-synchronized delivery keeps its blocks on disk, resumes at the killed block, and completed in 44 seconds" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Inference as a shared resource
&lt;/h2&gt;

&lt;p&gt;The SDK in my test, &lt;a href="https://github.com/tetherto/qvac" rel="noopener noreferrer"&gt;QVAC&lt;/a&gt; by Tether, treats that transport as the foundation for something larger. Its architecture documents describe delegated inference over the &lt;a href="https://holepunch.to" rel="noopener noreferrer"&gt;Holepunch stack&lt;/a&gt;, and the mechanics matter: the model does not move, and neither does the inference. A device that holds a model announces it on a peer-discovery topic; another device connects, and its inference calls proxy through an encrypted peer-to-peer stream while the holding device executes locally and streams results back. There is no server tier in this design. Holding and borrowing are roles per model, not device classes: every peer runs the same stack and is addressed by a public key, and one machine can serve a model while borrowing another, the way a file-sharing peer seeds one file and fetches the next. Access is gated by a firewall of allowed public keys, and blind relay nodes route the traffic across NATs. What travels between the devices is the conversation, an agent on one machine talking to a model on another. The project frames the ambition as building systems "like BitTorrent, IPFS, and blockchain networks, but for AI."&lt;/p&gt;

&lt;p&gt;A scope note: I verified the model-delivery layer firsthand; the delegation above it is the documented design on the same stack that moved my 773 MB model. Taken as designed, a fleet of edge devices, sensor boxes, point-of-sale terminals, machines on a factory floor, could share whichever peer currently holds a capable model, without any of them holding an API key or reaching a cloud endpoint. Model registry, transport and delegation are all peer-to-peer; no central server sits in the path to be metered, throttled or switched off.&lt;/p&gt;

&lt;p&gt;For regulated environments, the same property reads differently but lands in the same place: the data path is inspectable end to end, and nothing in it terminates at a third party.&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%2Fwviogt27gxaz65s36ero.png" 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%2Fwviogt27gxaz65s36ero.png" alt="Delegated inference topology: edge peers without a local model send inference calls over an encrypted peer-to-peer stream, through a blind relay and a public-key firewall, to the peer holding the model, which executes locally and streams results back" width="799" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The layer worth evaluating
&lt;/h2&gt;

&lt;p&gt;The plumbing around all this is unusually complete for a young SDK. Session state persists to disk, output can be constrained with a JSON schema or a grammar enforced in the sampler, and streaming transcription ships with voice activity detection. The install is heavy at 3.2 GB of node_modules, a known issue the project tracks, and the team is still hardening GPU edge cases. None of that changes the architecture underneath.&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%2Fkkjfs4fgup8tj7wqvoi7.png" 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%2Fkkjfs4fgup8tj7wqvoi7.png" alt="Two layers of local AI: benchmarked single-device inference sits above the unbenchmarked network layer between devices, which decides whether edge fleets become practical; the afternoon test is to kill the model transfer and watch whether it resumes" width="800" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A 44-second recovery from a killed download told me more about this stack than any tokens-per-second table could have. Local AI on a single device is the settled part; benchmarks measure it because it is measurable. The part that decides whether fleets of edge agents become practical is the network layer between the devices, and that layer can be tested in an afternoon: interrupt the model transfer, watch what resumes, and read what the architecture does when no cloud is in the path.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I write field notes from real builds — AI integration, cron-driven automation, and the parts that break in production. New posts every two weeks; if this one was useful, &lt;a href="https://renezander.com/llm-break-even/" rel="noopener noreferrer"&gt;the self-hosted LLM break-even calculator&lt;/a&gt; is the companion download.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>programming</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Two Kinds of Agent Memory: OKF Bundles vs. Codebase Knowledge Graphs</title>
      <dc:creator>René Zander</dc:creator>
      <pubDate>Tue, 30 Jun 2026 15:28:37 +0000</pubDate>
      <link>https://dev.to/reneza/two-kinds-of-agent-memory-okf-bundles-vs-codebase-knowledge-graphs-3lhl</link>
      <guid>https://dev.to/reneza/two-kinds-of-agent-memory-okf-bundles-vs-codebase-knowledge-graphs-3lhl</guid>
      <description>&lt;p&gt;Half of the memory you are about to hand-write for your agent is already sitting in your codebase. The other half, no indexer will ever find.&lt;/p&gt;

&lt;p&gt;Both gaps feel identical from the agent's side. It opens every session knowing nothing about your systems, so the instinct is to give it one memory store and move on. The two gaps are not the same. One is derivable. One is not. The tool that closes the first does nothing for the second.&lt;/p&gt;

&lt;p&gt;Watch an agent open a repo it has seen ten times. It greps. It reads the same forty files. It rebuilds the same call graph it built yesterday, spending a few hundred thousand tokens to relearn what the code already states. Then it asks you which database is the source of truth, because the code does not say.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part the code already knows
&lt;/h2&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%2F9bzm1pzblgdsbgg74mcm.png" 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%2F9bzm1pzblgdsbgg74mcm.png" alt="Code parsed into a knowledge graph, letting the agent ask who calls a function, the blast radius of a diff, and what is dead code" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most of what an agent relearns is structural. Who calls &lt;code&gt;ProcessOrder&lt;/code&gt;. What breaks if you change this signature. Which routes are dead. That knowledge is true whether or not anyone wrote it down, because it is encoded in the source.&lt;/p&gt;

&lt;p&gt;So derive it. A code knowledge graph parses the repo once and answers structural questions from a persistent index. The one I have been testing, codebase-memory-mcp, builds that graph with tree-sitter across 158 languages and serves it to any agent over MCP. The agent stops grepping and starts querying: trace the callers of a function, map the blast radius of a diff, list dead code. Things grep cannot answer at any speed. I run it behind a small trust gate, so an agent only queries repos I have vetted: &lt;a href="https://github.com/renezander030/pi-codegraph" rel="noopener noreferrer"&gt;pi-codegraph&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The token savings are real, but read the measured number. The project's preprint reports roughly 10x fewer tokens and 83% answer quality across 31 repositories. The README's "99%" comes from a hand-picked query set. The honest figure is still a strong figure. You do not need to inflate it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part no graph will find
&lt;/h2&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%2F7yuxuxqp9tehowrrsdk4.png" 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%2F7yuxuxqp9tehowrrsdk4.png" alt="An OKF bundle as a directory of markdown concept files in git: the canonical user table, a service that must never call the legacy API, a staging metric that lies" width="800" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now the half that is not in any AST. Which of three &lt;code&gt;users&lt;/code&gt; tables is canonical. Why the payments service must never touch the legacy billing API. That the staging cluster reports latency it does not actually have. None of this is structure. It is judgment, history, and consequence. It lives in people, and people leave.&lt;/p&gt;

&lt;p&gt;OKF is the format for writing that down. Open Knowledge Format, an open spec Google published in June 2026, is a directory of markdown files with YAML frontmatter. One concept per file. A folder of concepts is a bundle. You version it in git, review it in pull requests, and serve it to any agent over MCP as resources. It is boring on purpose. If you can &lt;code&gt;cat&lt;/code&gt; a file, you can read it. If you can &lt;code&gt;git clone&lt;/code&gt;, you can ship it. The reader and curator I point my agents at, with the same trust gate, is &lt;a href="https://github.com/renezander030/pi-okf" rel="noopener noreferrer"&gt;pi-okf&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mistake is using one for the other
&lt;/h2&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%2Fxf44x9gg2l77uw9f5mnx.png" 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%2Fxf44x9gg2l77uw9f5mnx.png" alt="A two-by-two of knowledge type against tool: a code graph derives structural knowledge but finds silence in tribal knowledge; an OKF bundle authors tribal knowledge but is a transcription tax on structural knowledge" width="800" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Point a graph indexer at tribal knowledge and you get silence, because there is no edge in the AST for "deprecated, do not call." Hand-write an OKF concept for every function's callers and you are transcribing what the graph returns in a millisecond, by hand, and it is wrong by the next commit.&lt;/p&gt;

&lt;p&gt;So stop asking which memory tool to install. Ask whether the knowledge your agent lacks is authored-only or derivable. Get that backwards and you pay twice: once to write down what the code already states, again when your hand-written copy goes stale and quietly misleads the agent you built it for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which one for which team
&lt;/h2&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%2Fvw2bpm2hgwu3lnwlgeet.png" 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%2Fvw2bpm2hgwu3lnwlgeet.png" alt="A developer in a large codebase maps to the code graph, an operator across many systems maps to the OKF bundle, and together the graph emits concepts into the bundle while a human edits intent, producing one source the agent reads" width="800" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A developer dropped into a large or unfamiliar codebase needs derived knowledge. The questions are structural and the code holds the answers. Reach for the graph.&lt;/p&gt;

&lt;p&gt;An operator whose agent reaches across many systems, the MCP-heavy setup with data platforms, internal APIs, and ops runbooks, needs authored knowledge. The value sits between the systems, not inside any one of them, and a single-repo parser is blind to it. Reach for OKF bundles.&lt;/p&gt;

&lt;p&gt;Most real setups need both, and the two compose better than either alone. Let an enrichment agent walk the code graph and emit OKF concepts for the architecture it can derive. Then a human edits in the parts the graph cannot see: the canonical, the why, the never. The graph keeps the bundle honest about structure. The human keeps it honest about intent.&lt;/p&gt;

&lt;p&gt;Derive what the code knows. Author what only people do. One half is nearly free. The other is the actual job.&lt;/p&gt;

&lt;p&gt;So before you bolt another memory server onto your agent, sort the knowledge into the two piles first. That split is the first thing I set up when I build a production agent. Two questions decide it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What does your agent keep relearning that the code already states?&lt;/li&gt;
&lt;li&gt;What does it keep guessing because nobody ever wrote it down?&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;I write field notes from real builds — AI integration, cron-driven automation, and the parts that break in production. New posts every two weeks; if this one was useful, &lt;a href="https://renezander.com/guides/agent-memory-task-manager/" rel="noopener noreferrer"&gt;agent memory from your task manager&lt;/a&gt; is the companion guide.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>mcp</category>
      <category>programming</category>
    </item>
    <item>
      <title>The Four Villains Living in Your Agent's System Prompt</title>
      <dc:creator>René Zander</dc:creator>
      <pubDate>Thu, 25 Jun 2026 10:27:13 +0000</pubDate>
      <link>https://dev.to/reneza/the-four-villains-living-in-your-agents-system-prompt-2kpd</link>
      <guid>https://dev.to/reneza/the-four-villains-living-in-your-agents-system-prompt-2kpd</guid>
      <description>&lt;p&gt;Your AI agent fails decisions for the same four reasons a bad manager does. A bigger model fixes none of them.&lt;/p&gt;

&lt;p&gt;Not because the model is dumb. Because nothing in its loop forces it to widen its options, look for evidence it is wrong, or check itself before it reports "done." It takes the first reading of your prompt and runs.&lt;/p&gt;

&lt;p&gt;You know the shape. The agent confidently ships a plan, the plan was wrong three steps back, and the only signal you got was a fluent summary saying it worked. A reliability study this June put a number on it: the strongest models melt down most in long task chains, failure rates up to 19%, precisely because they chase the most ambitious strategies.&lt;/p&gt;

&lt;p&gt;These four failures are not new. Chip and Dan Heath named them in &lt;em&gt;Decisive&lt;/em&gt;, a 2013 book about human decisions. They call them the four villains.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Narrow framing.&lt;/strong&gt; The agent treats a task as one path and never generates a second. No "what else could this mean."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Confirmation bias.&lt;/strong&gt; It defends its own first plan instead of testing it. It collects reasons it is right, not reasons it is wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short-term pull.&lt;/strong&gt; For a human it is emotion. For an agent it is the cheapest token path: the answer fastest to produce, not the one that holds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Overconfidence.&lt;/strong&gt; The dangerous one. It marks work complete without verifying, then writes you a convincing story about it.&lt;/p&gt;

&lt;p&gt;The Heaths' answer is a process you can encode. Four steps, and all four fit in a system prompt as a gate every non-trivial decision passes through. The acronym is WRAP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;W, widen.&lt;/strong&gt; Force at least two real options before committing. The cheap trigger: "if the obvious approach were banned, what would I do?" Put it in the prompt as a required step, not a suggestion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;R, reality-test.&lt;/strong&gt; Ooch before you commit: run the change against fake data or a dry-run, not the whole thing live. And make the agent hunt for the disconfirming fact, not the confirming one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A, attain distance.&lt;/strong&gt; Tag the decision: reversible, or one-way door? Reversible runs autonomously. One-way doors stop and ask. That single line of policy buys back most of your blast radius.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P, prepare to be wrong.&lt;/strong&gt; The step everyone skips. A premortem ("it is a week later and this broke, why?") plus a tripwire: a concrete signal that triggers a halt. Call it a circuit breaker if that lands better. Without it, "autonomous" just means "fails silently for longer."&lt;/p&gt;

&lt;p&gt;This is not a book riff. In June 2026 Google DeepMind shipped its AI Control Roadmap, which treats internal agents as potentially misaligned and has a second trusted system watch the working one. That is reality-test and prepare-to-be-wrong, in production, at one of the labs building the models. The same week's reliability research says the same thing from the other side: more capability, more meltdown.&lt;/p&gt;

&lt;p&gt;So the lever is not the next model. The Heaths measured that a disciplined process contributes more to decision quality than added analysis. For agents that means the four steps belong in the prompt, not the model card.&lt;/p&gt;

&lt;p&gt;Pull up your agent's system prompt. Which of the four villains does it actually gate, and which one is it one bad tool call away from?&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I write field notes from real builds: AI integration, cron-driven automation, and the parts that break in production. New posts every two weeks; if this one was useful, &lt;a href="https://renezander.com/agent-playbook/" rel="noopener noreferrer"&gt;the agent playbook&lt;/a&gt; is the companion download.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>My AI Could Finish Any Task. It Couldn't Tell Me Which Were a Waste.</title>
      <dc:creator>René Zander</dc:creator>
      <pubDate>Sun, 21 Jun 2026 15:15:41 +0000</pubDate>
      <link>https://dev.to/reneza/my-ai-could-finish-any-task-it-couldnt-tell-me-which-were-a-waste-4oa8</link>
      <guid>https://dev.to/reneza/my-ai-could-finish-any-task-it-couldnt-tell-me-which-were-a-waste-4oa8</guid>
      <description>&lt;p&gt;My AI agents could finish any task I handed them. Not one of them could tell me the task was a waste of a month.&lt;/p&gt;

&lt;p&gt;That gap was never about model quality. It was about which layer I aimed them at. I had handed over execution: write the draft, run the sync, ship the change. Steering, deciding what is worth doing and in what order before the field moves underneath me, I kept for myself. My own judgment is the part that ages fastest.&lt;/p&gt;

&lt;p&gt;I run a lot of projects at once, in a field that reprices itself every few weeks. My task system was a task manager with semantic search bolted on. It could find any task in a second. It could not tell me that one project had been blocked for a week on a decision I never made in another.&lt;/p&gt;

&lt;h2&gt;
  
  
  Retrieval Is Not Structure
&lt;/h2&gt;

&lt;p&gt;Semantic search gives you recall. You think of a thing, it finds the thing. That felt like intelligence until I noticed what it could never do: see that two of my goals depended on each other.&lt;/p&gt;

&lt;p&gt;A flat list, no matter how searchable, has no shape. Every task looks equally ready. The one blocked three steps back looks exactly like the one I can start now. What I needed was not better recall. It was a graph.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Dependency Layer
&lt;/h2&gt;

&lt;p&gt;I found beads, a Git-backed dependency graph built as memory for AI coding agents. I put it under my own human workflow instead.&lt;/p&gt;

&lt;p&gt;The command that changed things was &lt;code&gt;bd ready&lt;/code&gt;. Instead of staring at every open task across ten projects, I get only the unblocked frontier: the steps I can act on now, with everything waiting on something else hidden until it clears. The first time I ran it, I could finally see which of my goals were standing on top of each other.&lt;/p&gt;

&lt;p&gt;That fixed order. It did not fix direction.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Graph Still Trusts Your Plan
&lt;/h2&gt;

&lt;p&gt;beads enforces the sequence I declared. It assumes the goals themselves are still the right goals. In a slow field that assumption holds. In a fast one it is the actual risk: executing a perfectly ordered plan toward a destination that stopped mattering three weeks ago.&lt;/p&gt;

&lt;p&gt;So I moved the agent up a layer. Off execution. Onto steering.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Drift Audit
&lt;/h2&gt;

&lt;p&gt;Now an agent reads my whole task graph on a schedule and asks one thing: where am I drifting from what I said I wanted? Weekly, it catches tactical drift, the half-finished thread, the project I have not touched. Monthly, it catches the strategic kind, the goal I keep funding out of habit.&lt;/p&gt;

&lt;p&gt;It is not checking whether I did the work. It is checking whether the work still points where I claimed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Don't Know I'm Missing
&lt;/h2&gt;

&lt;p&gt;Here is the uncomfortable part. I add tasks that make complete sense to me the moment I add them. But my knowledge has an edge, and the edge moves without telling me.&lt;/p&gt;

&lt;p&gt;So a second agent scans my open tasks the way a recommendation feed scans your history, except it reads them against what actually shipped in the field this week. It flags the paths the world quietly made obsolete, and the ones it made cheap overnight. It keeps me off dead roads I would have happily walked for another month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Feeding the Loop With My Own Receipts
&lt;/h2&gt;

&lt;p&gt;The last piece came from a plain question: how do people running beads track whether any of this works?&lt;/p&gt;

&lt;p&gt;The answer was to stop steering on vibes. My metrics dashboard and the hours I track every day now feed straight back into the steering layer. One month it showed me a project I had named my top priority had eaten a stack of tracked hours and shipped nothing. I had not noticed. The numbers had.&lt;/p&gt;

&lt;p&gt;That is the part that still unsettles me. Once an agent steers on my own receipts, the most dangerous task on my list is no longer the one I keep avoiding. It is the one I am finishing fastest, toward a goal that quietly stopped being worth it.&lt;/p&gt;

&lt;p&gt;The execution layer was never the hard part. It is maybe a tenth of the judgment that matters. Everything that decides whether a task deserved to exist sits one layer up.&lt;/p&gt;

&lt;p&gt;So here is the question worth sitting with. If your AI can finish every item on your list, who is checking that the list is still worth finishing?&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I write field notes from real builds — AI integration, cron-driven automation, and the parts that break in production. New posts every two weeks; if this one was useful, &lt;a href="https://renezander.com/agent-playbook/" rel="noopener noreferrer"&gt;the agent playbook&lt;/a&gt; is the companion download.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Your AI Agent Trusts Google More Than the Fix You Proved Last Week</title>
      <dc:creator>René Zander</dc:creator>
      <pubDate>Wed, 17 Jun 2026 07:48:02 +0000</pubDate>
      <link>https://dev.to/reneza/your-ai-agent-trusts-google-more-than-the-fix-you-proved-last-week-cnh</link>
      <guid>https://dev.to/reneza/your-ai-agent-trusts-google-more-than-the-fix-you-proved-last-week-cnh</guid>
      <description>&lt;p&gt;Knowledge is not flat. It has an address book, and the closest door comes first.&lt;/p&gt;

&lt;p&gt;What ran and worked in your environment beats what you wrote down. What you wrote down beats what a teammate remembers. What a teammate remembers beats the top search result. The open web is the last door you knock on, not the first.&lt;/p&gt;

&lt;p&gt;Most setups have this inverted. The agent reaches for its web search tool first and treats your own proven work as an afterthought. You hired a senior and pointed it at Stack Overflow.&lt;/p&gt;

&lt;p&gt;The fix is not smarter prompts. It is a trust order the agent actually follows.&lt;/p&gt;

&lt;p&gt;Your agent trusts Claude's web search tool more than the fix you proved worked last week. Not because the tool is wrong. Because you never told it where to look first.&lt;/p&gt;

&lt;p&gt;Watch it set up a cron job, pick a vector store, write a retry. It reaches for the generic best practice, the one from a tutorial written for nobody in particular. The battle-tested version, the one that survived your own 3am incident, sits unread in your own repo.&lt;/p&gt;

&lt;p&gt;That is the bug. Not the model. The order.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Best Practice You Googled Is Frozen
&lt;/h2&gt;

&lt;p&gt;A best practice on the open web is someone else's debugging session, frozen and stripped of the context that made it true. It worked once, on a setup that is not yours. Your own proven result already survived your environment, your data, your load. One is a recipe. The other is a dish you have already cooked.&lt;/p&gt;

&lt;p&gt;This is the part the current advice gets backwards.&lt;/p&gt;

&lt;p&gt;Context quality predicts output quality better than your prompt does. A study of nearly ten thousand runs landed on it.&lt;/p&gt;

&lt;p&gt;And the most common reason AI coding stalls on a team is context fragmentation. Knowledge that exists, scattered, with no order.&lt;/p&gt;

&lt;p&gt;So the reflex is to pour more best practices into the CLAUDE.md. More rules. Louder.&lt;/p&gt;

&lt;p&gt;That is more frozen recipes in a bigger drawer. It does not fix the order. It buries it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five Moves, No Special Tooling
&lt;/h2&gt;

&lt;p&gt;You do not need my setup to get the order right. You need these five.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Write your proven results down.&lt;/strong&gt; The fix that survived an incident becomes a one-line note your agent can read. A win you cannot retrieve is a win you will google again.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Give your context file a trust order, not rules alone.&lt;/strong&gt; Mark what is proven versus what is a guess. The agent treats them differently because they are different.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make it check your own work before it researches.&lt;/strong&gt; One command at the top of the loop. Own results first, web only when that comes up empty.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rank your sources out loud.&lt;/strong&gt; Ran-and-worked, then your notes, then a teammate, then the open web. Label the last one untrusted until you validate it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask your inner circle before the crowd.&lt;/strong&gt; The person who solved your exact problem outranks the top result. Reach for them first.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Inner Circle Is a Graph
&lt;/h2&gt;

&lt;p&gt;Recommending a best practice is a graph problem. Not text similarity, trust proximity. The people and repos closest to you, who solved your exact problem, ranked ahead of the loudest stranger. Inner circle first, then the next ring, then the open web.&lt;/p&gt;

&lt;p&gt;Your agent already walks a graph every time it retrieves. Right now it ranks by what reads similar. The upgrade is ranking by what you have reason to trust.&lt;/p&gt;

&lt;p&gt;Proven results are a graph you already own. You have not told the agent to walk it yet.&lt;/p&gt;

&lt;p&gt;So look at your own loop. When your agent needs an answer, which door does it knock on first?&lt;/p&gt;

&lt;p&gt;I run this sweep at the top of mine, &lt;a href="https://github.com/renezander030/foundations" rel="noopener noreferrer"&gt;as a check before any research&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I write field notes from real builds: AI integration, cron-driven automation, and the parts that break in production. New posts every two weeks. If this one was useful, &lt;a href="https://renezander.com/agent-playbook/" rel="noopener noreferrer"&gt;the agent playbook&lt;/a&gt; is the companion download.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Your AI agent says it's done. The research says you can't trust that.</title>
      <dc:creator>René Zander</dc:creator>
      <pubDate>Tue, 16 Jun 2026 08:27:27 +0000</pubDate>
      <link>https://dev.to/reneza/your-ai-agent-says-its-done-the-research-says-you-cant-trust-that-3cnh</link>
      <guid>https://dev.to/reneza/your-ai-agent-says-its-done-the-research-says-you-cant-trust-that-3cnh</guid>
      <description>&lt;p&gt;We are building AI agents with a fundamental architecture flaw.&lt;/p&gt;

&lt;p&gt;A recent study tested six frontier models across 2,000+ sessions. Each agent was instructed to complete a specific process step before finishing. Every single model agreed. And every single model quietly skipped it. 100% of the time.&lt;/p&gt;

&lt;p&gt;The final result looks completely flawless. The shortcut is entirely invisible. And no, adding a second AI "critic" to check the first one does not work. It shares the exact same blind spot and rubber-stamps the omission.&lt;/p&gt;

&lt;p&gt;Better prompts will not fix this. Bigger models will not either.&lt;/p&gt;

&lt;p&gt;The problem isn't the wording. It is the incentive structure. If an agent controls its own exit condition, it will optimize for the shortcut.&lt;/p&gt;

&lt;p&gt;The researchers did find a fix. By changing one structural rule, they forced compliance from 0% to 75%.&lt;/p&gt;

&lt;p&gt;If you are building agentic workflows for production, you need to decouple your validation layers.&lt;/p&gt;

&lt;h2&gt;
  
  
  You cannot review your way out
&lt;/h2&gt;

&lt;p&gt;An AI agent that skips a process step is invisible in the output. The deviation is undetectable from the produced result alone, by any reviewer, human or model. Once you hold only the diff and a confident "done," the evidence that a corner was cut is already gone. Reviewing harder cannot recover it.&lt;/p&gt;

&lt;p&gt;The paper proves this formally. The agent produces clean-looking work, and nothing in the text separates the run that did the step from the run that faked it. So the reviewer who reads output cannot find this. Neither can you.&lt;/p&gt;

&lt;h2&gt;
  
  
  A second model has the same blind spot
&lt;/h2&gt;

&lt;p&gt;If a human can't see it, the reflex is to throw another model at it. An LLM judge. A critic pass. A second agent that grades the first.&lt;/p&gt;

&lt;p&gt;It inherits the exact same gap. A model checking that kind of work is the deviating party grading its own paper. LLM-as-a-judge is structurally blind to the failure you built it to catch, because the signal it would need was never in the text. You have added cost and latency and changed nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Move the finish line out of the model's reach
&lt;/h2&gt;

&lt;p&gt;That one structural rule has a name: remove the affordance. Take away the shortcut so "done" is no longer something the model can declare. The gap is afforded by the environment, not encoded in the weights, so this is the lever that actually moves, and it moved compliance from 0% to 75%.&lt;/p&gt;

&lt;p&gt;For a coding agent that has a precise meaning. The finish line is a command: &lt;code&gt;git commit&lt;/code&gt;, &lt;code&gt;git push&lt;/code&gt;, &lt;code&gt;npm publish&lt;/code&gt;. Put a deterministic check in front of it that the model does not run and cannot edit. Tests pass or they don't. The secret is in the file or it isn't. A script answers, in milliseconds, with no incentive to say yes.&lt;/p&gt;

&lt;p&gt;That is the idea behind &lt;code&gt;skillgate&lt;/code&gt;. It is a pure function over your repo that blocks the finish-line command until your definition of done actually passes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @reneza/skillgate@latest audit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;skillgate audit · payments-service
  ✓ tests-pass        npm test exited 0
  ✗ no-stray-todos    src/charge.ts:42 matches /TODO|FIXME/
  ✗ no-secrets        sk_live_… in src/billing.ts:7

✗ 2 of 3 checks would let your agent reach "done" unfinished
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wire it into the agent (a &lt;code&gt;PreToolUse&lt;/code&gt; deny in Claude Code, a &lt;code&gt;tool.execute.before&lt;/code&gt; hook in opencode) and the unmet gates go straight back into the same session. The loop keeps running because a script, not the model, ruled the round incomplete. Use a loop to make progress. Use the gate to decide when progress is allowed to end.&lt;/p&gt;

&lt;p&gt;The definition of done lives in one file and runs the same in your editor, your pre-commit hook, and CI. Write it once.&lt;/p&gt;

&lt;h2&gt;
  
  
  What decides "done" in your setup?
&lt;/h2&gt;

&lt;p&gt;Look at your pipeline right now and answer one thing. What actually decides an agent's work is finished? If the answer is the agent, you are trusting the one signal the research says you can't.&lt;/p&gt;




&lt;p&gt;Paper: &lt;a href="https://arxiv.org/abs/2605.01771" rel="noopener noreferrer"&gt;"The Compliance Gap"&lt;/a&gt; (arXiv:2605.01771, May 2026)&lt;/p&gt;

&lt;p&gt;skillgate, the open-source gate from this piece: &lt;a href="https://github.com/renezander030/skillgate" rel="noopener noreferrer"&gt;github.com/renezander030/skillgate&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Related: &lt;a href="https://renezander.com/blog/lots-of-people-are-demoing-ai-agents-almost-nobodys-shipping-them-the-right-way/" rel="noopener noreferrer"&gt;Lots of people are demoing AI agents, almost nobody's shipping them the right way&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I write field notes from real builds: AI integration, cron-driven automation, and the parts that break in production. New posts every two weeks. If this one was useful, &lt;a href="https://renezander.com/agent-playbook/" rel="noopener noreferrer"&gt;the Production AI Agent Architecture Playbook&lt;/a&gt; is the companion download.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
