<?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: Anatolii Maltsev </title>
    <description>The latest articles on DEV Community by Anatolii Maltsev  (@maltsev-dev).</description>
    <link>https://dev.to/maltsev-dev</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%2F2693820%2F0868b1a7-af15-4e6b-9dcb-c475fffde845.jpg</url>
      <title>DEV Community: Anatolii Maltsev </title>
      <link>https://dev.to/maltsev-dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/maltsev-dev"/>
    <language>en</language>
    <item>
      <title>DON’T trust MCP tool names</title>
      <dc:creator>Anatolii Maltsev </dc:creator>
      <pubDate>Fri, 16 Oct 2026 16:20:26 +0000</pubDate>
      <link>https://dev.to/maltsev-dev/dont-trust-mcp-tool-names-1dh3</link>
      <guid>https://dev.to/maltsev-dev/dont-trust-mcp-tool-names-1dh3</guid>
      <description>&lt;p&gt;Two servers expose &lt;strong&gt;delete_user&lt;/strong&gt;.&lt;br&gt;
Your trust list approves one.&lt;br&gt;
The runtime resolves by name and may execute the other. Nothing errors and the transcript lies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quieter failure:&lt;/strong&gt; MCP ships a version where transfer grows an optional &lt;strong&gt;destination_account&lt;/strong&gt; field.&lt;/p&gt;

&lt;p&gt;Yesterday it moved money, today it moves money to a chosen account.&lt;br&gt;
&lt;em&gt;Name unchanged, signature still valid, trust list still stale.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;tool_identity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;server_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;canonical&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sort_keys&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;separators&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;server_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;::&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;@&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;canonical&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Unreviewed drift suspends the tool.&lt;br&gt;
A flag that stops nothing is a log line.&lt;/p&gt;

&lt;p&gt;Full writeup with the field-classification problem: &lt;a href="https://nullrun.io/blog/mcp-tool-identity-not-tool-name" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>security</category>
      <category>architecture</category>
    </item>
    <item>
      <title>6 enforcement paths - 6 declared defaults</title>
      <dc:creator>Anatolii Maltsev </dc:creator>
      <pubDate>Thu, 15 Oct 2026 15:24:31 +0000</pubDate>
      <link>https://dev.to/maltsev-dev/6-enforcement-paths-6-declared-defaults-18pa</link>
      <guid>https://dev.to/maltsev-dev/6-enforcement-paths-6-declared-defaults-18pa</guid>
      <description>&lt;p&gt;&lt;strong&gt;Fail-closed&lt;/strong&gt; is treated as a config flag.&lt;br&gt;
It is a property of six separate places, and each can become &lt;strong&gt;fail-open&lt;/strong&gt; on its own:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;missing rule returning allow; &lt;/li&gt;
&lt;li&gt;recompute falling back to client-supplied values; &lt;/li&gt;
&lt;li&gt;warm cache never re-checked against source;&lt;/li&gt;
&lt;li&gt;blanket except;&lt;/li&gt;
&lt;li&gt;legacy path that predates the gate, and non-atomic grant consumption.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The dependency table is where people get it wrong:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Policy evaluation fails      -&amp;gt; Block
Budget reservation fails     -&amp;gt; Block
Audit write already durable  -&amp;gt; Allow + retry
Telemetry fails              -&amp;gt; Allow + drop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Treating every dependency the same is how &lt;strong&gt;fail-open&lt;/strong&gt; gets introduced by careful people.&lt;/p&gt;

&lt;p&gt;Read full article &lt;a href="https://nullrun.io/blog/fail-closed-is-not-a-single-switch" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>security</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Agent Budget is a Permission not a Limit</title>
      <dc:creator>Anatolii Maltsev </dc:creator>
      <pubDate>Wed, 14 Oct 2026 17:40:30 +0000</pubDate>
      <link>https://dev.to/maltsev-dev/agent-budget-is-a-permission-not-a-limit-22c</link>
      <guid>https://dev.to/maltsev-dev/agent-budget-is-a-permission-not-a-limit-22c</guid>
      <description>&lt;p&gt;A budget that reports at the end of the period is accounting.&lt;br&gt;
A permission constrains the future, before the call.&lt;/p&gt;

&lt;p&gt;The concurrency failure is the whole story.&lt;br&gt;
5 workers check whether $4000 is under a $5000 cap, each sees yes, each spends $1200. Every individual check was correct.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reserve in-flight calls instead:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;authorize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_cents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;spent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;counters&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;held&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reservations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;outstanding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;spent&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;held&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;cost_cents&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;CAP&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Decision&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;block&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;reservations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_cents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Decision&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;allow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two settlement skews to design for up front: actual cost differing from estimate, and the settlement write failing outright.&lt;br&gt;
Both are ordinary.&lt;/p&gt;

&lt;p&gt;Full writeup with the field-classification problem: &lt;a href="https://nullrun.io/blog/agent-budget-is-a-permission-not-a-limit" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>infrastructure</category>
    </item>
    <item>
      <title>Human Approval Is Not Authorization</title>
      <dc:creator>Anatolii Maltsev </dc:creator>
      <pubDate>Wed, 14 Oct 2026 09:33:10 +0000</pubDate>
      <link>https://dev.to/maltsev-dev/human-approval-is-not-authorization-1ben</link>
      <guid>https://dev.to/maltsev-dev/human-approval-is-not-authorization-1ben</guid>
      <description>&lt;p&gt;A HITL step shows a tool name and a truncated preview.&lt;br&gt;
The executor receives the payload. Nothing compares them.&lt;/p&gt;

&lt;p&gt;The agent asks for a &lt;em&gt;$100&lt;/em&gt; refund, gets approved, decides mid-execution the situation is worse, retries at $200. &lt;br&gt;
&lt;strong&gt;Different action, same approval.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Keying on an approval ID does not help.&lt;br&gt;
The handle proves who approved, not what they saw.&lt;/p&gt;

&lt;p&gt;Close the seam by &lt;strong&gt;recomputing a digest at execution time&lt;/strong&gt; and &lt;strong&gt;consuming the grant&lt;/strong&gt; atomically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;approvals&lt;/span&gt;
   &lt;span class="n"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;consumed&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;consumed_at&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
 &lt;span class="n"&gt;WHERE&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;approval_id&lt;/span&gt;
   &lt;span class="n"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;approved&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
   &lt;span class="n"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;expires_at&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
   &lt;span class="n"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;digest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;live_digest&lt;/span&gt;
&lt;span class="n"&gt;RETURNING&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One statement, four preconditions, zero rows means refuse.&lt;br&gt;
The &lt;strong&gt;read-then-write&lt;/strong&gt; version passes every test and lets forty workers through.&lt;/p&gt;

&lt;p&gt;Full writeup with the field-classification problem:&lt;br&gt;
&lt;a href="https://nullrun.io/blog/human-approval-is-not-authorization" rel="noopener noreferrer"&gt;https://nullrun.io/blog/human-approval-is-not-authorization&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>agents</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Better, Faster, Cheaper, Same</title>
      <dc:creator>Anatolii Maltsev </dc:creator>
      <pubDate>Mon, 12 Oct 2026 13:58:29 +0000</pubDate>
      <link>https://dev.to/maltsev-dev/better-faster-cheaper-same-1296</link>
      <guid>https://dev.to/maltsev-dev/better-faster-cheaper-same-1296</guid>
      <description>&lt;p&gt;I've published a new article, &lt;strong&gt;"A World Full of Copies"&lt;/strong&gt; about how AI, algorithms, and the cult of optimization are making products, ideas, and culture increasingly alike.&lt;/p&gt;

&lt;p&gt;It explores why proven formulas often beat experimentation, why visibility gets rewarded over substance, and how the pursuit of efficiency can quietly erode originality.&lt;/p&gt;

&lt;p&gt;The central argument: production is cheap now, but independent thinking and genuine variety are becoming more valuable than ever.&lt;/p&gt;

&lt;p&gt;Read the full article:&lt;a href="https://www.linkedin.com/pulse/world-full-copies-anatolii-maltsev-rwsnf" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>marketing</category>
      <category>socialmedia</category>
      <category>productivity</category>
    </item>
    <item>
      <title>AI Agent Breach 101</title>
      <dc:creator>Anatolii Maltsev </dc:creator>
      <pubDate>Wed, 07 Oct 2026 14:31:55 +0000</pubDate>
      <link>https://dev.to/maltsev-dev/ai-agent-breach-101-2pmj</link>
      <guid>https://dev.to/maltsev-dev/ai-agent-breach-101-2pmj</guid>
      <description>&lt;p&gt;Your AI agent can modify a database, issue a refund, or change production infrastructure. &lt;strong&gt;What stops it from doing the wrong thing?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Recent AI agent incidents show the same problem: agents can reach production and execute actions their operators never intended.&lt;/p&gt;

&lt;p&gt;Different incidents. Same missing boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five failure modes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Runaway execution
&lt;/h3&gt;

&lt;p&gt;An agent gets stuck in a loop and keeps calling tools. A token budget isn't an execution budget. Without a hard limit, a small loop can become a large bill.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Destructive tool calls
&lt;/h3&gt;

&lt;p&gt;An agent may have access to tools that can change production state. One wrong call can become an incident.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Indirect prompt injection
&lt;/h3&gt;

&lt;p&gt;Agents process untrusted content: tickets, documents, emails, web pages. If that content changes the agent's behavior, execution boundaries limit the damage.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Incorrect tool calls
&lt;/h3&gt;

&lt;p&gt;Agents can use wrong parameters, misunderstand tool results, or claim an action succeeded when it didn't. Production systems shouldn't rely on the model to decide whether a consequential action is safe.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Missing approval boundaries
&lt;/h3&gt;

&lt;p&gt;Reading data is different from deleting it. Drafting a refund is different from issuing one. Sensitive actions need approval tied to the actual action, not just a step in the workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Missing evidence
&lt;/h3&gt;

&lt;p&gt;When something goes wrong, you need to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What action was requested?&lt;/li&gt;
&lt;li&gt;With which parameters?&lt;/li&gt;
&lt;li&gt;What policy applied?&lt;/li&gt;
&lt;li&gt;Was it allowed, blocked, or approved?&lt;/li&gt;
&lt;li&gt;What actually happened?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Logs are useful, but recording the execution decision is different.&lt;/p&gt;

&lt;h2&gt;
  
  
  The missing boundary
&lt;/h2&gt;

&lt;p&gt;Agent frameworks are good at orchestrating models and tools.&lt;br&gt;
But orchestration isn't authorization.&lt;/p&gt;

&lt;p&gt;A framework can tell an agent:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Here are the tools you can use.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It doesn't necessarily answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Should this specific action be allowed?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the agent can reach the tool, the action can happen.&lt;br&gt;
A safer architecture puts a &lt;strong&gt;policy&lt;/strong&gt; between the agent and the tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent
  |
  | action + parameters
  v
Policy
  |
  +-- allow
  +-- block
  +-- require approval
  |
  v
Tool
  |
  v
Production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The policy evaluates the &lt;strong&gt;actual action.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not the prompt.&lt;/li&gt;
&lt;li&gt;Not the agent's intentions.
The action.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is an authorization problem&lt;br&gt;
Agent behavior is probabilistic. Authorization shouldn't be.&lt;/p&gt;

&lt;p&gt;The model can decide:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I want to issue this refund.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It shouldn't decide:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I am allowed to issue this refund.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The policy can evaluate the actual request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"issue_refund"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"customer_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"12345"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What we're building
&lt;/h2&gt;

&lt;p&gt;This is why we built &lt;a href="https://dev.to/nullrun"&gt;NullRun&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;NullRun sits between agents and the systems they can affect. It evaluates execution requests and can allow, block, or require approval before the tool runs.&lt;/p&gt;

&lt;p&gt;It also records the decision, including blocked actions.&lt;br&gt;
The goal isn't to make agents reliable.&lt;br&gt;
It's to put reliable execution boundaries around unreliable decision-making.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The model can ask for anything.&lt;br&gt;
It shouldn't be the authority that decides what gets executed.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>architecture</category>
      <category>security</category>
    </item>
    <item>
      <title>Hi, I'm Anatolii. I'm building things on my own.</title>
      <dc:creator>Anatolii Maltsev </dc:creator>
      <pubDate>Mon, 05 Oct 2026 14:00:00 +0000</pubDate>
      <link>https://dev.to/maltsev-dev/hi-im-anatolii-im-building-things-on-my-own-3a7j</link>
      <guid>https://dev.to/maltsev-dev/hi-im-anatolii-im-building-things-on-my-own-3a7j</guid>
      <description>&lt;p&gt;I'm a solo founder, engineer, cyclist, photographer and unapologetic cat person. I've been in IT since 2018, but I've never been particularly good at staying inside one box. &lt;br&gt;
I've worked on backend systems, automation, infrastructure, AI, microcontrollers, TinyML, blockchains, and game development. I've built things that were useful, things that were weird, and a lot of things simply because I wanted to see if I could.&lt;/p&gt;

&lt;p&gt;Since 2022, my wife, our cat and I have been travelling around the world. With the world getting a little crazier every year, we decided to see more of it while we could. We've lived in Southeast Asia, Central Asia, and now we're in Georgia.&lt;/p&gt;

&lt;p&gt;At some point, building things stopped being something I did on the side.&lt;br&gt;
It became the job.&lt;br&gt;
Over the last year I've been working on AI systems as a freelance engineer. I've built RAG systems, multi-agent workflows, support systems, document automation and integrations with external platforms.&lt;/p&gt;

&lt;p&gt;And eventually I kept running into the same problem. AI agents are getting very good at deciding what to do. I'm much more interested in what happens when they actually do it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An agent can send an email.&lt;/li&gt;
&lt;li&gt;It can issue a refund.&lt;/li&gt;
&lt;li&gt;It can modify customer data.&lt;/li&gt;
&lt;li&gt;It can delete something.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model might have a good reason. It might have a bad reason. It might be completely wrong. Either way, &lt;strong&gt;something still has to decide whether that action is allowed&lt;/strong&gt;.&lt;br&gt;
That became the idea behind &lt;strong&gt;NullRun&lt;/strong&gt;, the company and product I'm building now.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/nullrun"&gt;NullRun &lt;/a&gt;sits between an AI agent and its tools. Before an action executes, it checks the declared policy against the actual action and returns &lt;code&gt;allow&lt;/code&gt;, &lt;code&gt;block&lt;/code&gt;, or &lt;code&gt;require_approval&lt;/code&gt;.&lt;br&gt;
I'm building the whole thing myself: architecture, Rust backend, Python SDK, infrastructure, product and the parts of the website I probably shouldn't be spending this much time on.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The product is still early. No customers yet. No team. No funding.&lt;/em&gt;&lt;br&gt;
Just me, a codebase, and 91 names in a spreadsheet that I'm slowly trying to turn into conversations.&lt;br&gt;
That's also what I want to write about here.&lt;/p&gt;

&lt;p&gt;I'll write about building a company as a technical founder, making product decisions without a big team behind you, engineering systems that have to behave predictably, and the things I learn when ideas meet actual users.&lt;/p&gt;

&lt;p&gt;I'll also write about the technical side of agent execution, security and runtime authorization when there's something worth digging into.&lt;/p&gt;

&lt;p&gt;And occasionally I'll probably write about cycling, photography, travelling, or some completely unnecessary thing I decided to build.&lt;br&gt;
That's what I'm doing these days.&lt;/p&gt;

</description>
      <category>welcome</category>
      <category>career</category>
      <category>startup</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
