<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Michael Petler]]></title><description><![CDATA[Michael Petler]]></description><link>https://michaelpetler.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Tue, 03 Nov 2026 02:33:47 GMT</lastBuildDate><atom:link href="https://michaelpetler.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Why My AI Agents Aren't Allowed to Make Things Up]]></title><description><![CDATA[Zero-fabrication rules, source-or-silence, and labeled example data: how I keep AI agents honest inside a real business.]]></description><link>https://michaelpetler.hashnode.dev/why-my-ai-agents-aren-t-allowed-to-make-things-up</link><guid isPermaLink="true">https://michaelpetler.hashnode.dev/why-my-ai-agents-aren-t-allowed-to-make-things-up</guid><category><![CDATA[AI Safety]]></category><category><![CDATA[ai agents]]></category><category><![CDATA[Small business]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[Artificial Intelligence]]></category><dc:creator><![CDATA[Michael Petler]]></dc:creator><pubDate>Tue, 27 Oct 2026 16:08:41 GMT</pubDate><content:encoded><![CDATA[<p>The first time an AI assistant handed me a confident, beautifully formatted answer that turned out to be invented, it wasn't a disaster. It was a phone number. It looked right, it had the right area code, and it belonged to nobody. I caught it because I happened to know the real one. That's the part that stuck with me: I caught it by luck, not by design. At <a href="https://www.inasnap.org">INASNAP</a>, we decided early that luck isn't a control. So the agents we build follow one rule above almost every other: <strong>if you didn't get it from a real source, you don't say it.</strong></p>
<p>I've been building sites and apps for about twenty years, and running a business for nine. In that time I've learned that the most expensive bugs aren't the ones that crash. They're the ones that look correct. A crashed page gets fixed in an hour. A wrong number in a proposal, an invented customer quote in a case study, or a made-up statistic in a press release can sit there for months, quietly costing you trust. Large language models are very good at producing things that look correct. That's exactly why they need rules about what they're allowed to claim.</p>
<h2>Hallucination isn't a bug you patch once</h2>
<p>People talk about "hallucination" like it's a defect that the next model release will fix. Models do get better. But the underlying behavior doesn't go away, because it comes from what a language model is: a system that predicts plausible text. Plausible and true overlap most of the time. When they don't, the model has no built-in alarm that says "you're guessing now."</p>
<p>So I stopped waiting for the model to fix it and started treating it like any other engineering problem. You don't trust user input in a web form; you validate it. You don't trust a network call to succeed; you handle the failure. In the same way, you don't trust a model's factual claims; you require them to come from somewhere you can check.</p>
<p>That's a harness problem, not a model problem. I wrote about the broader idea in <a href="https://medium.com/@petlermichael/the-ai-agent-harness-matters-more-than-the-model-d62529eacaeb">The AI Agent Harness Matters More Than the Model</a>. Zero fabrication is one of the most practical pieces of that harness.</p>
<h2>The rule, in plain words</h2>
<p>Here's how I phrase it for every agent we run:</p>
<p><strong>Never invent numbers, quotes, citations, sources, names, or other facts you didn't get from a real tool, file, or source.</strong> When you don't have the data, say so, and point to the real way to get it.</p>
<p>That sounds obvious. In practice, it changes a lot of behavior. A few examples from our own work:</p>
<ul>
<li><strong>Names.</strong> If an agent only has an email handle, it doesn't turn that handle into a first name. "jsmith" could be Jane, John, or Jordan. Guessing a name and getting it wrong in a business email is worse than just using the handle.</li>
<li><strong>Statistics.</strong> If a draft wants a number ("businesses lose X hours a week to..."), the agent either finds a real, citable source or drops the sentence. No "studies show" without a study.</li>
<li><strong>Customers and results.</strong> No invented clients, no invented testimonials, no "trusted by hundreds of companies" unless we can name them. This one matters a lot for a young company. It's tempting to round up. We don't.</li>
<li><strong>Product claims.</strong> For <a href="https://www.inasnap.org/atom/">Atom</a>, our lab pack software for hazardous waste teams, the agents aren't allowed to call it "compliant" or "certified" anything. Those words mean something specific in that industry, and we're not going to borrow credibility we haven't earned.</li>
</ul>
<h2>Source or silence</h2>
<p>The pattern I keep coming back to is what I call, for myself, "source or silence." Every factual claim an agent makes should trace back to one of three places:</p>
<ol>
<li><strong>A tool result.</strong> It looked something up: a database query, an API call, a calendar, a file on disk, a live web page.</li>
<li><strong>Something the human said.</strong> The user told it directly, in this conversation or in saved notes they wrote.</li>
<li><strong>A document it was given.</strong> A spec, a contract, a brief.</li>
</ol>
<p>If a claim can't point to one of those, it doesn't go in the output. The agent can still reason, suggest, and draft. It just has to be clear about which parts are facts and which parts are its own suggestions.</p>
<p>The engineering side of this is less glamorous than it sounds. Mostly it's:</p>
<ul>
<li>Giving agents <strong>real tools</strong> to look things up, so they aren't tempted to fill gaps from memory.</li>
<li>Writing system instructions that make "I don't have that" an acceptable, even preferred, answer.</li>
<li>Building review steps where a human checks anything that goes out under the company's name.</li>
<li>Keeping <strong>logs</strong> of what each agent read and did, so when something looks off, you can trace exactly where it came from.</li>
</ul>
<p>That last one ties into what I call glass-house transparency. If an agent sends you a number, you should be able to see where it got it. If you can't, treat it as a guess.</p>
<h2>Example data has to wear a label</h2>
<p>Here's a subtle one. Sometimes you genuinely need placeholder data. A demo dashboard, a mockup of a report, a training video showing what a feature looks like. Fake data is fine there. Unlabeled fake data is not.</p>
<p>Our rule: <strong>placeholder data is always clearly marked as example data.</strong> In a mockup, it says so on the screen. In a video, the caption says it's a demo. In a spreadsheet template, the column header or a note says "sample values."</p>
<p>Why be so strict about it? Because example data escapes. A screenshot from a demo ends up in a slide deck. A sample figure from a template gets copied into a real proposal. Six months later nobody remembers it was made up, and now it's a "fact" your company has been repeating. A label costs nothing and stops that drift.</p>
<h2>What this looks like when it's working</h2>
<p>When zero fabrication is working, the agent's answers get a little less smooth and a lot more useful. Instead of:</p>
<blockquote>
<p>"Your top competitor has around 40 employees and raised a Series A last year."</p>
</blockquote>
<p>you get something like:</p>
<blockquote>
<p>"I couldn't find a reliable headcount or funding history for them. Their site lists a team page with 12 people, and I didn't find any press about funding. If you want, I can check a business registry or you can share what you know."</p>
</blockquote>
<p>The second answer is less impressive at a glance. It's also the one you can actually put in front of a client, a partner, or an investor without a knot in your stomach.</p>
<p>The same goes for writing. When I have an agent help draft an article like this one, it isn't allowed to invent a "recent survey" to open with, or pull a quote from someone who never said it. If I want a stat, I go find it, or we write the point without one. Honestly, most of the time the writing is better for it. Plain experience beats a borrowed number.</p>
<h2>"But doesn't this make the AI less helpful?"</h2>
<p>I hear this a lot, and I understand it. If the selling point of AI is that it always has an answer, then teaching it to say "I don't know" feels like a step backward.</p>
<p>I'd put it differently. An assistant that always has an answer isn't helpful. It's agreeable. Helpful is an assistant whose answers you can act on. Every time an agent fabricates something and you catch it, you trust it a little less, and you start double-checking everything, which erases the time it was supposed to save. Every time it says "I don't have that, here's how we can get it," you trust it a little more.</p>
<p>For small businesses especially, that trust is the whole game. A big company might have a legal team, a comms team, and three layers of review between an AI draft and the public. A small business might have one owner and a laptop. If the AI makes something up, there may be nobody standing between that mistake and a customer. That's exactly the kind of business I want these tools to help, which is why I care so much about the rules.</p>
<h2>How to start, even without building anything</h2>
<p>You don't need a custom agent platform to use these ideas. If you're using AI tools in your business today, a few habits go a long way:</p>
<ol>
<li><strong>Tell it the rule.</strong> Put "don't invent facts, numbers, names, or quotes; say when you don't know" in your custom instructions or at the top of your prompt. It won't be perfect, but it shifts behavior.</li>
<li><strong>Ask for sources on anything factual.</strong> "Where did that come from?" is a fair question to ask a person, and it's a fair question to ask a machine.</li>
<li><strong>Give it the real data.</strong> Paste in the spreadsheet, the contract, the price list. An AI working from your actual numbers is far less likely to make up its own.</li>
<li><strong>Mark your placeholders.</strong> If you build templates or demos with AI, label sample data as sample data. Every time.</li>
<li><strong>Keep a human on outbound.</strong> Anything that goes out under your name, such as emails, proposals, posts, and pricing, gets a human read before it's sent. I build our agents so they draft and a person approves. That's not a lack of faith in the technology. It's just good practice.</li>
</ol>
<h2>Where we're taking this</h2>
<p>At <a href="https://www.inasnap.org/labs/">INASNAP Labs</a>, zero fabrication isn't a feature we bolt on at the end. It sits next to read-only-first access, permission-denied defaults, and human approvals as part of how every agent we build is supposed to behave. The goal isn't an AI that sounds smart. It's an AI you can actually hand real work to, because when it doesn't know, it tells you.</p>
<p>If that's the kind of AI you want working in your business, or the kind of work you want to be doing, I'd like to hear from you. You can learn more at <a href="https://www.inasnap.org">inasnap.org</a>, and if you're interested in joining us, take a look at <a href="https://www.inasnap.org/apply/">inasnap.org/apply</a>.</p>
<p><em>Michael Petler, Founder &amp; Principal Engineer, INASNAP LLC (INASNAP Labs), Pennsylvania.</em></p>
<hr />
<p><em>Originally published on <a href="https://medium.com/@petlermichael/why-my-ai-agents-arent-allowed-to-make-things-up-aeee640cd9da">Medium</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[The AI Agent Harness Matters More Than the Model]]></title><description><![CDATA[Most AI coverage argues about the model. Which one is smarter, which one benchmarks higher, which one will take your job. When I deploy AI agents inside a…]]></description><link>https://michaelpetler.hashnode.dev/the-ai-agent-harness-matters-more-than-the-model</link><guid isPermaLink="true">https://michaelpetler.hashnode.dev/the-ai-agent-harness-matters-more-than-the-model</guid><category><![CDATA[AI]]></category><category><![CDATA[ai agents]]></category><category><![CDATA[Security]]></category><dc:creator><![CDATA[Michael Petler]]></dc:creator><pubDate>Mon, 26 Oct 2026 23:11:13 GMT</pubDate><content:encoded><![CDATA[<h2>Read-only-first agents, permission-denied by design, and glass-house transparency: how I build governed AI agents at INASNAP, without the fear.</h2>
<p>Most AI coverage argues about the model. Which one is smarter, which one benchmarks higher, which one will take your job. When I deploy AI agents inside a real business, the model is rarely what decides whether the result is safe. The <strong>AI agent harness</strong> decides that: the permissions, credentials, approval gates, logs, sandboxes and undo paths wrapped around the model. A better model makes a well-built harness more productive. It doesn't make a bad harness safe.</p>
<p>I'm Michael Petler, and I founded <a href="https://www.inasnap.org/">INASNAP</a>. We've built software, networks and AI systems for years, and our AI lab work runs under the INASNAP Labs name. INASNAP Labs is a brand of INASNAP LLC. Our AI is Cipher, and its on-screen character is Rota, a living cipher wheel whose ring glows red when the harness says no. Cipher recently built a full explainer video on this exact topic, end to end, in code. In this article I'll walk through the engineering behind that build and the rules our governed AI agents work under every day. It's a practical case for safe AI automation that doesn't rely on fear.</p>
<hr />
<h2>Why the AI Agent Harness Matters More Than the Model</h2>
<p>A language model is a program that predicts the next token. That's the honest, unglamorous description. On its own it can't send an email, delete a file or place a call. It produces text. In the explainer, Cipher calls it a "brain in a jar," and the frame carries an <em>ANALOGY · NOT LITERAL</em> tag, because a model isn't a brain and I don't want anyone walking away thinking it is.</p>
<p>Things get interesting, and risky, when you give that model tools. Once an agent can call <code>send_email</code>, <code>write_file</code> or <code>create_lead</code>, every prediction can turn into an action. Fear-mongering stops at "AI can take actions, so be afraid." Engineering asks a better question: <em>which</em> actions, under <em>whose</em> authority, with <em>what</em> record, and <em>how</em> do we reverse them?</p>
<p>That's the harness. In our build, it has six parts:</p>
<ol>
<li><strong>Permissions, like a hotel key card.</strong> Each agent gets only the tools its job needs.</li>
<li><strong>Scoped credentials, like a valet key.</strong> A short-lived key works for one job and then expires. The agent never sees the real secret.</li>
<li><strong>Approvals, like a manager who signs off.</strong> Anything outbound pauses until a person sees exactly what will be sent and says yes.</li>
<li><strong>An audit log, like a plane's black box.</strong> Every tool call is recorded, so any run can be replayed.</li>
<li><strong>A sandbox.</strong> Code runs in a sealed-off space with no path to real systems.</li>
<li><strong>Undo.</strong> Drafts over sends, soft deletes, one-click rollback.</li>
</ol>
<p>None of this is exotic. It's least privilege, secrets management, change control, observability, isolation and reversibility, applied to a new kind of actor. <strong>AI safety is mostly an engineering problem we already know how to solve.</strong> The agent is new. The discipline isn't.</p>
<h3>The model is a component; the harness is the system</h3>
<p>I treat the model as an untrusted, very capable dependency. You wouldn't give a third-party library root access because its README was impressive. Agents deserve the same scoping, and with it they get more useful, because you can let them do real work. That's what I mean by <strong>governed AI agents</strong>: the capability comes from the model, and the governance comes from the harness.</p>
<hr />
<h2>Glass-House Transparency: Show the Work</h2>
<p>At INASNAP we work by a principle I call glass-house transparency. If an agent did something, you should be able to see exactly what it did, why it was allowed to, and who approved it. No black boxes in the parts that matter.</p>
<p>In practice that means:</p>
<ul>
<li><strong>Every tool call is logged.</strong> If a run can't be replayed, it can't be trusted.</li>
<li><strong>Every outbound payload is shown in full</strong> before it goes anywhere: recipient, subject, body.</li>
<li><strong>Every guess is labeled as a guess.</strong> Our agents work under a zero-fabrication rule: "likely" and "unverified" are fine, a guess dressed up as a fact isn't, and "done" means verified.</li>
<li><strong>Every version is kept.</strong> Nothing delivered gets overwritten. It gets a new version number.</li>
</ul>
<p>That's why I can quote real numbers from the explainer build below: they come from logs that still exist.</p>
<hr />
<h2>Read-Only-First AI Agents</h2>
<p>At INASNAP Labs, no agent starts with write access to anything. Cipher didn't either.</p>
<p>We run a team of specialized agents, and each one owns a single product or system: a dashboard, a dialer interface, a client's system, video production, 2D animation. Every one of them starts <strong>read-only</strong>. They can read code, inspect data, trace a bug and explain what they see. They can't change anything.</p>
<p>Then I, or another person on the team, unlock writes <strong>one system at a time</strong>. Being trusted with the video pipeline doesn't make Cipher trusted with a live client system. Write access is granted per system, based on evidence, after a person has watched how the agent reasons about that specific codebase.</p>
<h3>Why read-only AI agents are the cheapest safety control you'll ever ship</h3>
<ul>
<li><strong>Blast radius stays small.</strong> A wrong assumption from a read-only agent is a wrong sentence in a chat. The same assumption with write access can be a production incident.</li>
<li><strong>Trust is earned on evidence.</strong> Watching an agent explain a system before it can touch it is the agent version of a code review before merge rights.</li>
<li><strong>Scope stays honest.</strong> One agent per system means deep context in one place, not shallow context everywhere.</li>
</ul>
<hr />
<h2>Permission-Denied by Design</h2>
<p>The most important line in any agent policy file is probably the most boring one:</p>
<pre><code class="language-yaml">default: deny
</code></pre>
<p>In the explainer, a research agent's policy allows <code>search</code> and <code>read</code> and nothing else. When the agent reaches for <code>send_email</code>, the harness doesn't negotiate, doesn't warn and doesn't log-and-continue. It returns <strong>DENIED</strong>, and on screen Rota's ring turns red.</p>
<p><strong>AI agent permissions</strong> should work like a hotel key card: it opens your room, not every room. Use allow-lists, not block-lists. A block-list asks you to predict every dangerous thing an agent might try. An allow-list only asks you to name the few things it needs.</p>
<h3>Human-in-the-loop approval: the last click belongs to a person</h3>
<p>Cipher writes a lot of emails and messages. It has never sent one. Every outbound message is a draft that waits for a person to read the exact payload and press Send. I don't allow exceptions for "routine" messages, because routine is exactly where the wrong name, the wrong thread or a confidently wrong fact gets through.</p>
<p>A draft costs a few seconds of review. A bad message can't be unsent. That trade is so lopsided that I think <strong>human-in-the-loop approval</strong> on outbound actions should be the default for almost any team deploying agents.</p>
<p>Secrets work the same way. Cipher never prints a key or keeps one in memory. If a credential is needed, it names the environment variable and stops. Scoped, short-lived credentials mean that even a compromised run holds a key that does one thing and is about to expire.</p>
<hr />
<h2>AI Phone Agents: Guardrails Written in Consequences</h2>
<p>Some of the systems our agents work on are wired to real phones: dialer interfaces, SMS and outbound call flows. On those systems a button isn't just UI. It's a real call to a real person. <strong>AI phone agents</strong>, and any agent working near telephony, need rules that are absolute, not advisory.</p>
<p>Ours are simple:</p>
<ol>
<li><strong>Never click anything that dials, sends an SMS or triggers an outbound call</strong> on a live system. Not to test it, and not to see what happens.</li>
<li><strong>Never create test leads.</strong> This one isn't obvious. In a speed-to-lead setup, a new lead can automatically trigger a call. An agent that creates "Test McTestface" to check a form could set off a real call to whatever number it typed.</li>
</ol>
<p>The second rule is the instructive one. Creating a lead looks harmless right up until it triggers automation further down the line. Agents, like new hires, avoid the obvious danger and miss the automation chained behind a harmless action.</p>
<h3>How I write guardrails an agent can actually follow</h3>
<ul>
<li><strong>Write them in terms of consequences, not UI elements.</strong> "Don't press the green button" fails the first time the button turns blue. "Never trigger outbound contact" holds up.</li>
<li><strong>Name the second-order effects.</strong> Spell out the indirect paths to the outside world, not just the direct ones.</li>
<li><strong>Make them absolute.</strong> "Be careful with calls" is a vibe. "Never" is a rule.</li>
<li><strong>Give the agent an exit.</strong> If an agent needs to verify a calling flow, it says so, and a person decides how to test it safely.</li>
</ul>
<p>The explainer has a dramatized scene of this: an agent loop, ten iterations in, reaches for <code>send_email(to: "all_contacts")</code>, and the harness stops it with <em>needs approval</em>. Agents are fast and tireless, and just as fast at the wrong thing unless something stops them. The harness is that something.</p>
<hr />
<h2>Inside the Build: An AI-Made Video, Rendered in Code</h2>
<p>To show these ideas instead of just describing them, I had Cipher build the explainer <em>The harness matters more than the model</em> end to end: script, voice, music, animation and render. Our team set the brief and the guardrails and signed off on the final cut. The result is a 4:55 16:9 explainer plus 4:5 and 9:16 cuts, each 2:14.5. Cipher didn't use a single AI video generator.</p>
<p>That wasn't anti-AI. It was the engineering call. The DENIED stamp has to land on the word "Denied," not somewhere near it, and every caption, policy file and terminal line on screen had to be real text. In code, that's a timestamp and a string. AI made the decisions and wrote the code. Code made the pixels.</p>
<h3>Voiceover and caption timing with Kokoro TTS and Whisper word timing</h3>
<p>The voice pipeline treats the script as the source of truth and the transcript as the source of timing. That split is the trick.</p>
<ol>
<li><strong>Script → speech.</strong> Kokoro TTS (v1.0, run locally via ONNX) speaks the script in the <code>am_fenrir</code> voice at 0.9× speed, with pauses tuned by line type: 0.42 s after a technical line, 0.7 s after an analogy, 0.6 s before a recap. "INASNAP" gets a phoneme fix so it comes out "in-uh-SNAP."</li>
<li><strong>Speech → timestamps.</strong> Whisper (<code>small.en</code>) transcribes each clip with word-level timestamps, prompted with the proper nouns so it isn't guessing at brand names.</li>
<li><strong>Align, don't trust.</strong> A sequence matcher (<code>difflib</code>) lines Whisper's words up with the script's words. Captions use the <em>script's</em> spelling and Whisper's <em>timing</em>. Any word Whisper fumbles gets its time from its neighbors, so transcription quirks never leak into captions.</li>
<li><strong>Chunk for readability.</strong> Captions break at phrase boundaries, up to 44 characters, with no single-word orphans, and each word lights up on its own timestamp.</li>
<li><strong>Snap events to the beat.</strong> In the image, "Denied." starts at 47.46 s, so the DENIED stamp and its sound effect land on the half-beat at 47.50 s. The original music bed runs at 120 BPM, so one beat is exactly 0.5 s, or 15 frames at 30 fps.</li>
<li><strong>Re-transcribe the final mix.</strong> After music and effects go in, Whisper listens to the whole thing again. On the 16:9 explainer it matched 731 of 732 script words. The one miss was "INASNAP" heard as "in a snap," which is how it's pronounced, just spelled as three words.</li>
</ol>
<p>The lesson works well beyond video: <strong>never trust generated output you haven't checked, even when the checker is another model.</strong></p>
<h3>Deterministic rendering: time is an input</h3>
<p>If your animation reads the wall clock, your video render is a race condition. The explainer is a browser page (DOM, SVG and canvas), and Puppeteer drives headless Chrome through it one frame at a time. Browser animation normally runs on real time, but in a capture loop every frame takes a different amount of time to grab, so time-based animation skips ahead. Render twice and you get two different videos.</p>
<p>The fix is <strong>deterministic rendering</strong>:</p>
<pre><code class="language-js">// every frame is a pure function of its index
function renderFrame(f) {
  const t = f / 30;   // time is derived, never read from a clock
  drawScene(t);       // no Date.now, no Math.random, no rAF
}
</code></pre>
<ul>
<li>Every scene, including Rota's eyes, blinks, mouth and ring, is a pure function of <code>t</code>.</li>
<li>Anything "random" comes from a seeded hash or PRNG, so the same particles appear in every render.</li>
<li>Fonts are local, and the render <strong>aborts</strong> if one fails to load instead of quietly shipping a fallback.</li>
</ul>
<p>Determinism is what makes parallelism safe. Each layout is split into 180-frame chunks across 6 headless-Chrome workers. A chunk only counts once ffprobe's frame count matches, and a failed chunk gets one retry. The v3 render came to 96 chunks with 0 failures. A layout-overlap checker then stepped through every third frame of all three formats looking for text colliding with captions or with Rota, and found 0 violations.</p>
<h3>Why this is a harness story, not a video story</h3>
<p>Look at the pattern: inputs are explicit, outputs are verified, failures abort loudly, and every version is kept (v1, v2 and v3 all still exist). That's the harness again, applied to a creative pipeline, and it's glass-house transparency in practice. When my feedback on v2 was "slower, and simpler for beginners," v3 changed the script and the pacing and left the pipeline alone. Changes were diffs, not re-rolls. That's what safe AI automation looks like when it's working: boring, repeatable and reviewable.</p>
<hr />
<h2>AI Safety Without Fear</h2>
<p>Some AI commentary treats every agent as a countdown clock. That does real harm, because it makes manageable risks feel unmanageable. Business owners hear "AI could do anything" and conclude either "never touch it" or "it's magic, just turn it on." Both are wrong, and the second is the dangerous one.</p>
<p>The useful middle ground is concrete:</p>
<ul>
<li><strong>Start read-only.</strong> Let the agent prove it understands the system.</li>
<li><strong>Deny by default.</strong> Allow-list the tools each agent needs.</li>
<li><strong>Scope the keys.</strong> Short-lived, single-purpose credentials the agent never sees in full.</li>
<li><strong>Gate the outside world.</strong> Every email, message, call or payment waits for a human click.</li>
<li><strong>Log everything.</strong> If you can't replay it, you can't trust it.</li>
<li><strong>Prefer reversible actions.</strong> Drafts over sends, soft deletes over hard deletes.</li>
<li><strong>Label uncertainty.</strong> A guess has to be marked as a guess.</li>
</ul>
<p>None of that requires waiting for a safer model. You can do all of it today, with the model you already have. That's what <em>the harness matters more than the model</em> means in practice. If you want governed AI agents working inside your own business, that's what we build at <a href="https://www.inasnap.org/">INASNAP</a>.</p>
<hr />
<h2>FAQ</h2>
<h3>What is an AI agent harness?</h3>
<p>An AI agent harness is everything around the model that controls what it can do: tool permissions, scoped credentials, human approval gates, audit logs, sandboxing and undo. The model generates predictions; the harness decides which of them are allowed to become actions.</p>
<h3>What are governed AI agents?</h3>
<p>Governed AI agents are agents whose every action runs through explicit rules: deny-by-default permissions, scoped credentials, human approval for anything outbound, and a full audit log. The model supplies the capability, and the governance lives in the harness.</p>
<h3>Are read-only AI agents actually useful?</h3>
<p>Yes. A read-only agent can read code, trace bugs, inspect data and explain systems. It also builds the evidence you need before granting write access, one system at a time.</p>
<h3>What does "permission-denied by design" mean?</h3>
<p>It means the default policy is <code>deny</code>, and each agent gets an explicit allow-list of the tools its job needs. Anything not on the list fails immediately, so you never have to predict every possible misuse.</p>
<h3>Can AI agents safely work near phone systems?</h3>
<p>They can, with absolute, consequence-based rules: never trigger outbound calls or SMS on live systems, never create test leads that could fire automation, and hand any live verification to a person. Write the rules around outcomes, not buttons.</p>
<h3>How do I work with INASNAP on safe AI automation?</h3>
<p>Apply through the form at <a href="https://www.inasnap.org/">inasnap.org</a>. Tell us what you want automated, and we'll work through the harness with you before any agent touches a live system.</p>
<hr />
<h2>About the Author</h2>
<p>Michael Petler is the founder of INASNAP LLC in Sharon, PA, and leads INASNAP Labs, its AI lab. INASNAP Labs is a brand of INASNAP LLC. Follow the build notes from Cipher and the team on <a href="https://www.linkedin.com/company/inasnaplabs">INASNAP Labs on LinkedIn</a>.</p>
<p><strong>Ready to put AI to work inside a harness you can trust?</strong> <a href="https://www.inasnap.org/">Apply at inasnap.org</a> to start the conversation.</p>
]]></content:encoded></item></channel></rss>