<?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: Ilya Golovenkov</title>
    <description>The latest articles on DEV Community by Ilya Golovenkov (@__f61d6e248).</description>
    <link>https://dev.to/__f61d6e248</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%2F4146369%2F91862d6c-106d-498c-9a1d-e41ca88d8615.jpg</url>
      <title>DEV Community: Ilya Golovenkov</title>
      <link>https://dev.to/__f61d6e248</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/__f61d6e248"/>
    <language>en</language>
    <item>
      <title>Pro Sells Time, Not Safety — ELY Agent Input Preflight v0.8.0</title>
      <dc:creator>Ilya Golovenkov</dc:creator>
      <pubDate>Mon, 05 Oct 2026 19:34:25 +0000</pubDate>
      <link>https://dev.to/__f61d6e248/pro-sells-time-not-safety-ely-agent-input-preflight-v080-48gj</link>
      <guid>https://dev.to/__f61d6e248/pro-sells-time-not-safety-ely-agent-input-preflight-v080-48gj</guid>
      <description>&lt;p&gt;ELY Agent Input Preflight v0.8.0 is released.&lt;/p&gt;

&lt;p&gt;This release introduces an optional paid Pro entitlement, but I made one rule non-negotiable:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pro sells time, not safety.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The Community edition keeps the complete verification and safety core.&lt;/p&gt;

&lt;p&gt;GitHub Release:&lt;br&gt;
&lt;a href="https://github.com/Golovenkov79/ely-agent-input-preflight/releases/tag/v0.8.0" rel="noopener noreferrer"&gt;https://github.com/Golovenkov79/ely-agent-input-preflight/releases/tag/v0.8.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Product page:&lt;br&gt;
&lt;a href="https://elyzorix.ru/tools/agent-input-preflight/" rel="noopener noreferrer"&gt;https://elyzorix.ru/tools/agent-input-preflight/&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What is ELY Agent Input Preflight?
&lt;/h2&gt;

&lt;p&gt;ELY Agent Input Preflight is a local-first verification layer for AI coding agents.&lt;/p&gt;

&lt;p&gt;Its job is not to replace the coding agent.&lt;/p&gt;

&lt;p&gt;Its job is to independently answer questions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the project ready before the agent starts?&lt;/li&gt;
&lt;li&gt;Did the agent change files it was not supposed to change?&lt;/li&gt;
&lt;li&gt;Did generated Python code remain structurally valid?&lt;/li&gt;
&lt;li&gt;Did the requested work actually happen?&lt;/li&gt;
&lt;li&gt;Is there independent execution evidence?&lt;/li&gt;
&lt;li&gt;Can the final result be trusted instead of trusting only &lt;code&gt;exit code 0&lt;/code&gt;?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project is built around an important distinction:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PROCESS → EXECUTION → ACCEPTANCE → FINAL&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A successful process exit is not automatically proof of a successful result.&lt;/p&gt;




&lt;h2&gt;
  
  
  What changed in v0.8.0?
&lt;/h2&gt;

&lt;p&gt;v0.8.0 adds the foundation for an optional Pro entitlement.&lt;/p&gt;

&lt;p&gt;New functionality includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ely-preflight upgrade&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ely-preflight license status&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;online Pro activation&lt;/li&gt;
&lt;li&gt;local license deactivation&lt;/li&gt;
&lt;li&gt;Ed25519-signed entitlement verification&lt;/li&gt;
&lt;li&gt;pinned public verification key&lt;/li&gt;
&lt;li&gt;local signed entitlement storage&lt;/li&gt;
&lt;li&gt;safe fallback to Community mode&lt;/li&gt;
&lt;li&gt;public license API via &lt;code&gt;elyzorix.ru&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;dedicated HTTP User-Agent for Cloudflare compatibility&lt;/li&gt;
&lt;li&gt;public Pro checkout and license claim flow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important part is what did &lt;strong&gt;not&lt;/strong&gt; change.&lt;/p&gt;




&lt;h2&gt;
  
  
  Community is still complete
&lt;/h2&gt;

&lt;p&gt;I did not move the safety core behind the paywall.&lt;/p&gt;

&lt;p&gt;Community still includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Preflight checks&lt;/li&gt;
&lt;li&gt;project detection&lt;/li&gt;
&lt;li&gt;skills&lt;/li&gt;
&lt;li&gt;read-only agent mode by default&lt;/li&gt;
&lt;li&gt;execution evidence&lt;/li&gt;
&lt;li&gt;failure diagnosis&lt;/li&gt;
&lt;li&gt;diagnostic probes&lt;/li&gt;
&lt;li&gt;Generated-Code Admission&lt;/li&gt;
&lt;li&gt;Independent Postflight&lt;/li&gt;
&lt;li&gt;PROCESS / EXECUTION / ACCEPTANCE / FINAL semantics&lt;/li&gt;
&lt;li&gt;local run history&lt;/li&gt;
&lt;li&gt;core safety policy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You do not need Pro to know whether an AI coding agent did something unsafe or failed verification.&lt;/p&gt;

&lt;p&gt;That would defeat the purpose of the tool.&lt;/p&gt;




&lt;h2&gt;
  
  
  So what is Pro for?
&lt;/h2&gt;

&lt;p&gt;The design principle is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Community protects correctness. Pro should reduce time and friction.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The paid layer is intended for convenience, automation and productivity rather than making the free version artificially unsafe or incomplete.&lt;/p&gt;

&lt;p&gt;I think developer tools should earn money by making work faster — not by intentionally weakening the free safety layer.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-money end-to-end test
&lt;/h2&gt;

&lt;p&gt;Before releasing v0.8.0, I tested the commercial route with an actual 499 RUB subscription purchase.&lt;/p&gt;

&lt;p&gt;The verified path was:&lt;/p&gt;

&lt;p&gt;payment&lt;br&gt;
→ payment provider webhook&lt;br&gt;
→ license issued&lt;br&gt;
→ license claim&lt;br&gt;
→ Windows activation&lt;br&gt;
→ signed entitlement&lt;br&gt;
→ PRO ACTIVE&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>opensource</category>
      <category>devtool</category>
    </item>
    <item>
      <title>What changed after I stopped trusting exit code 0: ELY Agent Input Preflight v0.7.0</title>
      <dc:creator>Ilya Golovenkov</dc:creator>
      <pubDate>Sat, 03 Oct 2026 13:59:12 +0000</pubDate>
      <link>https://dev.to/__f61d6e248/what-changed-after-i-stopped-trusting-exit-code-0-ely-agent-input-preflight-v070-2109</link>
      <guid>https://dev.to/__f61d6e248/what-changed-after-i-stopped-trusting-exit-code-0-ely-agent-input-preflight-v070-2109</guid>
      <description>&lt;p&gt;A few days ago I wrote about why I stopped treating &lt;code&gt;exit code 0&lt;/code&gt; from an AI coding agent as proof that the requested work was actually completed correctly.&lt;/p&gt;

&lt;p&gt;That idea has now turned into the next release of &lt;strong&gt;ELY Agent Input Preflight: v0.7.0&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The biggest change is a new layer called &lt;strong&gt;Generated-Code Admission&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The goal is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;before generated source code is allowed to contribute to a successful final result, ELY should independently check whether that source can be admitted at all.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;GitHub:&lt;br&gt;
&lt;a href="https://github.com/Golovenkov79/ely-agent-input-preflight" rel="noopener noreferrer"&gt;https://github.com/Golovenkov79/ely-agent-input-preflight&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Release v0.7.0:&lt;br&gt;
&lt;a href="https://github.com/Golovenkov79/ely-agent-input-preflight/releases/tag/v0.7.0" rel="noopener noreferrer"&gt;https://github.com/Golovenkov79/ely-agent-input-preflight/releases/tag/v0.7.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Project page:&lt;br&gt;
&lt;a href="https://elyzorix.com/tools/agent-input-preflight/" rel="noopener noreferrer"&gt;https://elyzorix.com/tools/agent-input-preflight/&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The verification boundary is now more explicit
&lt;/h2&gt;

&lt;p&gt;One of the most useful pieces of feedback on my previous post was that there are several different questions hidden behind a single word like "success".&lt;/p&gt;

&lt;p&gt;Did the agent process complete?&lt;/p&gt;

&lt;p&gt;Did the requested operations actually execute?&lt;/p&gt;

&lt;p&gt;Does the resulting repository satisfy the acceptance criteria?&lt;/p&gt;

&lt;p&gt;Can the generated source itself be independently admitted?&lt;/p&gt;

&lt;p&gt;I now keep those questions separate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PROCESS
  ↓
EXECUTION
  ↓
ACCEPTANCE
  ↓
FINAL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important part is that these states are not silently collapsed into one green check.&lt;/p&gt;

&lt;p&gt;An agent can complete successfully while the repository still needs review.&lt;/p&gt;

&lt;p&gt;A test command can run while the generated source itself is invalid or out of scope.&lt;/p&gt;

&lt;p&gt;And sometimes the honest answer is simply:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NOT_PROVEN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;which then becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NEEDS_REVIEW
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;instead of a false &lt;code&gt;VERIFIED&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generated-Code Admission
&lt;/h2&gt;

&lt;p&gt;v0.7.0 adds an independent admission layer between AI-generated source changes and the final Postflight decision.&lt;/p&gt;

&lt;p&gt;For Python source, the Community release currently performs bounded, deterministic checks including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;syntax validation;&lt;/li&gt;
&lt;li&gt;structural parsing;&lt;/li&gt;
&lt;li&gt;source-scope checks;&lt;/li&gt;
&lt;li&gt;project-local policy checks;&lt;/li&gt;
&lt;li&gt;baseline dangerous-construct detection.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The baseline currently detects or blocks supported forms of:&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="nf"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;
&lt;span class="nf"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;
&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;system&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;
&lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(...,&lt;/span&gt; &lt;span class="n"&gt;shell&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;including supported import aliases.&lt;/p&gt;

&lt;p&gt;This is intentionally not presented as a complete security scanner.&lt;/p&gt;

&lt;p&gt;It is a bounded admission layer with deterministic rules.&lt;/p&gt;

&lt;p&gt;If ELY cannot prove a result, it does not silently convert uncertainty into safety.&lt;/p&gt;

&lt;p&gt;For example, a dynamic subprocess flag such as:&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;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;flag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;cannot automatically be treated as safe just because &lt;code&gt;flag&lt;/code&gt; is not literally &lt;code&gt;True&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The admission result stays &lt;code&gt;NOT_PROVEN&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project-local scope and policy
&lt;/h2&gt;

&lt;p&gt;A project can also define local admission rules.&lt;/p&gt;

&lt;p&gt;For example:&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;"admission"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"allowed_paths"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"src/*.py"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"denied_paths"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"secrets/*"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"forbidden_calls"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"open"&lt;/span&gt;&lt;span class="p"&gt;]&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;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;p&gt;This lets the project say not only "is this valid Python?", but also:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;was this file supposed to be changed here?&lt;/li&gt;
&lt;li&gt;is this path allowed?&lt;/li&gt;
&lt;li&gt;is this call allowed by this project's policy?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An invalid, dangerous, out-of-scope, or policy-violating source does not get promoted to a successful final result.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I did not put the safety layer behind Pro
&lt;/h2&gt;

&lt;p&gt;I also made a product decision while building this release.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Community version keeps the full core verification and safety functionality&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I do not want a model where:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"we found a dangerous generated-code pattern, but you need the paid plan to verify it properly."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That would defeat the purpose of the project.&lt;/p&gt;

&lt;p&gt;The future Pro layer is planned around &lt;strong&gt;time and automation&lt;/strong&gt;, not better safety.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one-command end-to-end workflows;&lt;/li&gt;
&lt;li&gt;reusable workflow profiles;&lt;/li&gt;
&lt;li&gt;batch and multi-project orchestration;&lt;/li&gt;
&lt;li&gt;CI / PR automation;&lt;/li&gt;
&lt;li&gt;richer reports;&lt;/li&gt;
&lt;li&gt;history analytics;&lt;/li&gt;
&lt;li&gt;unattended or scheduled workflows;&lt;/li&gt;
&lt;li&gt;team-oriented workflow management later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same verification core should remain available in Community.&lt;/p&gt;

&lt;p&gt;A short version of the product rule is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pro sells time, not safety.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Local-first is still the default
&lt;/h2&gt;

&lt;p&gt;The Community core remains local-first.&lt;/p&gt;

&lt;p&gt;It does not require:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an ELY account;&lt;/li&gt;
&lt;li&gt;a remote dashboard;&lt;/li&gt;
&lt;li&gt;telemetry;&lt;/li&gt;
&lt;li&gt;a cloud database.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Run history and verification evidence remain local.&lt;/p&gt;

&lt;p&gt;The project is still released under &lt;strong&gt;Apache-2.0&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What v0.7.0 was tested against
&lt;/h2&gt;

&lt;p&gt;Before publishing the release, I ran the full regression suite plus adversarial admission cases.&lt;/p&gt;

&lt;p&gt;The final release candidate passed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;169 automated tests;&lt;/li&gt;
&lt;li&gt;self-preflight;&lt;/li&gt;
&lt;li&gt;release archive audit;&lt;/li&gt;
&lt;li&gt;SHA-256 verification;&lt;/li&gt;
&lt;li&gt;fresh Windows install smoke;&lt;/li&gt;
&lt;li&gt;successful admission smoke;&lt;/li&gt;
&lt;li&gt;adversarial &lt;code&gt;NOT_PROVEN&lt;/code&gt; smoke.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Windows source package SHA-256 is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;698996db4534579dc99b5c4625e3c56ed246b7e188117919e65ddc75bfd351cf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The current idea
&lt;/h2&gt;

&lt;p&gt;The project started with a simple rule:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;an AI agent saying "success" is evidence, not authority.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;v0.7.0 pushes that idea one step further.&lt;/p&gt;

&lt;p&gt;Now the generated source itself has to cross an independent admission boundary before it can help produce a verified final result.&lt;/p&gt;

&lt;p&gt;There is still a lot to build.&lt;/p&gt;

&lt;p&gt;But I would rather have a system that says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NEEDS_REVIEW
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;when evidence is incomplete than one that produces a confident green check from assumptions.&lt;/p&gt;

&lt;p&gt;If you work with coding agents and have run into similar verification problems, I would be interested in hearing where your current workflow still relies on trust rather than independent evidence.&lt;/p&gt;

&lt;p&gt;GitHub:&lt;br&gt;
&lt;a href="https://github.com/Golovenkov79/ely-agent-input-preflight" rel="noopener noreferrer"&gt;https://github.com/Golovenkov79/ely-agent-input-preflight&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Release:&lt;br&gt;
&lt;a href="https://github.com/Golovenkov79/ely-agent-input-preflight/releases/tag/v0.7.0" rel="noopener noreferrer"&gt;https://github.com/Golovenkov79/ely-agent-input-preflight/releases/tag/v0.7.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Website:&lt;br&gt;
&lt;a href="https://elyzorix.com/tools/agent-input-preflight/" rel="noopener noreferrer"&gt;https://elyzorix.com/tools/agent-input-preflight/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>testing</category>
      <category>python</category>
    </item>
    <item>
      <title>Why I stopped trusting “exit code 0” from AI coding agents</title>
      <dc:creator>Ilya Golovenkov</dc:creator>
      <pubDate>Mon, 28 Sep 2026 05:55:03 +0000</pubDate>
      <link>https://dev.to/__f61d6e248/why-i-stopped-trusting-exit-code-0-from-ai-coding-agents-1aaa</link>
      <guid>https://dev.to/__f61d6e248/why-i-stopped-trusting-exit-code-0-from-ai-coding-agents-1aaa</guid>
      <description>&lt;p&gt;AI coding agents are getting much better.&lt;/p&gt;

&lt;p&gt;They can inspect repositories, change multiple files, run commands, write tests, and sometimes complete work that would have taken a developer hours.&lt;/p&gt;

&lt;p&gt;But I kept running into the same problem:&lt;/p&gt;

&lt;p&gt;the agent would finish, return exit code 0, and say that everything was successful.&lt;/p&gt;

&lt;p&gt;Sometimes it really was.&lt;/p&gt;

&lt;p&gt;Sometimes it wasn't.&lt;/p&gt;

&lt;p&gt;That made me realize that I did not only need a better coding agent.&lt;/p&gt;

&lt;p&gt;I needed an independent way to verify what the agent had actually done.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;When an AI coding agent works on a project, several things can go wrong:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;required files may be missing before the run even starts;&lt;/li&gt;
&lt;li&gt;the agent may misunderstand the project structure;&lt;/li&gt;
&lt;li&gt;it may modify files it was not supposed to touch;&lt;/li&gt;
&lt;li&gt;tests may not actually run correctly;&lt;/li&gt;
&lt;li&gt;the agent may report success even when verification is incomplete;&lt;/li&gt;
&lt;li&gt;a successful process exit does not necessarily mean the project is actually in a good state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The stronger coding agents become, the more important this problem becomes.&lt;/p&gt;

&lt;p&gt;If an agent changes 10 or 20 files, I do not want to manually inspect every line after every run.&lt;/p&gt;

&lt;p&gt;And if agents become even more autonomous, manual verification becomes even less practical.&lt;/p&gt;

&lt;p&gt;That is the problem I wanted to solve.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;I built a small open-source CLI called &lt;strong&gt;ELY Agent Input Preflight&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Try ELY Agent Input Preflight on GitHub:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/Golovenkov79/ely-agent-input-preflight" rel="noopener noreferrer"&gt;https://github.com/Golovenkov79/ely-agent-input-preflight&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The idea is simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check whether the project is ready before the AI agent starts.&lt;/li&gt;
&lt;li&gt;Detect the project type.&lt;/li&gt;
&lt;li&gt;Prepare the right context and instructions.&lt;/li&gt;
&lt;li&gt;Run the coding agent in read-only mode by default.&lt;/li&gt;
&lt;li&gt;Monitor whether project files changed unexpectedly.&lt;/li&gt;
&lt;li&gt;Run independent verification after the agent finishes.&lt;/li&gt;
&lt;li&gt;Record the result locally.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The important part is this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;an agent exit code of 0 is not automatically treated as success.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ELY can return:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;VERIFIED&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FAILED&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NEEDS_REVIEW&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the agent's own result is only one signal.&lt;/p&gt;

&lt;p&gt;It is not the final authority.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before the agent starts
&lt;/h2&gt;

&lt;p&gt;The first layer is Preflight.&lt;/p&gt;

&lt;p&gt;Before the coding agent runs, ELY checks whether the project has the inputs it is supposed to have.&lt;/p&gt;

&lt;p&gt;That can include things such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;required files;&lt;/li&gt;
&lt;li&gt;required directories;&lt;/li&gt;
&lt;li&gt;file patterns;&lt;/li&gt;
&lt;li&gt;environment variables;&lt;/li&gt;
&lt;li&gt;valid JSON files;&lt;/li&gt;
&lt;li&gt;non-empty files;&lt;/li&gt;
&lt;li&gt;optional files that should produce warnings instead of blocking the run.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If something critical is missing, ELY can stop the run before the coding agent starts.&lt;/p&gt;

&lt;p&gt;That sounds simple, but it avoids wasting an expensive agent run just to discover later that the required context was incomplete.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project detection and skills
&lt;/h2&gt;

&lt;p&gt;ELY also detects the type of project it is looking at.&lt;/p&gt;

&lt;p&gt;The current release includes project detection for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python;&lt;/li&gt;
&lt;li&gt;Android;&lt;/li&gt;
&lt;li&gt;.NET.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Based on that detection, ELY can select matching built-in guidance before preparing the handoff to the coding agent.&lt;/p&gt;

&lt;p&gt;The goal is not to replace the agent.&lt;/p&gt;

&lt;p&gt;The goal is to make sure the agent starts with better context and clearer rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read-only by default
&lt;/h2&gt;

&lt;p&gt;One design decision was especially important to me:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;the coding agent should not get write access by default.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With the current Codex integration, ELY starts the agent in an explicit read-only sandbox unless write access is deliberately enabled.&lt;/p&gt;

&lt;p&gt;If I only want an agent to inspect a project, I do not want it silently modifying files.&lt;/p&gt;

&lt;p&gt;Write access has to be explicitly requested.&lt;/p&gt;

&lt;p&gt;That gives me a much clearer separation between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;inspection;&lt;/li&gt;
&lt;li&gt;modification.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  File integrity monitoring
&lt;/h2&gt;

&lt;p&gt;ELY also takes a snapshot of project files before an agent run.&lt;/p&gt;

&lt;p&gt;After the agent exits, it compares the workspace again.&lt;/p&gt;

&lt;p&gt;This allows ELY to detect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;created files;&lt;/li&gt;
&lt;li&gt;modified files;&lt;/li&gt;
&lt;li&gt;deleted files.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That matters especially for read-only runs.&lt;/p&gt;

&lt;p&gt;If a supposedly read-only agent run changes protected project files, ELY can treat the result as a failure.&lt;/p&gt;

&lt;p&gt;This is independent of what the agent claims it did.&lt;/p&gt;

&lt;h2&gt;
  
  
  A real example
&lt;/h2&gt;

&lt;p&gt;During development I had a Codex run where the agent completed with exit code 0.&lt;/p&gt;

&lt;p&gt;Inside its sandbox, however, many tests could not run correctly because temporary writable storage was unavailable.&lt;/p&gt;

&lt;p&gt;The agent still completed its inspection and reported the limitation.&lt;/p&gt;

&lt;p&gt;ELY did not simply trust the agent result.&lt;/p&gt;

&lt;p&gt;After Codex exited, ELY ran its own Postflight verification outside the agent sandbox and independently checked the project.&lt;/p&gt;

&lt;p&gt;The Postflight verifier was able to run the project's tests normally and verify the state independently.&lt;/p&gt;

&lt;p&gt;That was the moment when the idea became useful to me.&lt;/p&gt;

&lt;p&gt;The interesting part was not that the coding agent was "bad".&lt;/p&gt;

&lt;p&gt;It was that the agent and the verifier were operating under different conditions.&lt;/p&gt;

&lt;p&gt;A successful agent run and a successfully verified project are not always the same thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Independent Postflight verification
&lt;/h2&gt;

&lt;p&gt;After the coding agent exits, ELY performs its own verification step.&lt;/p&gt;

&lt;p&gt;For Python projects, the current built-in verifier can run the project's unittest suite when a &lt;code&gt;tests&lt;/code&gt; directory is available.&lt;/p&gt;

&lt;p&gt;The final result can then be classified as:&lt;/p&gt;

&lt;h3&gt;
  
  
  VERIFIED
&lt;/h3&gt;

&lt;p&gt;The independent verification passed.&lt;/p&gt;

&lt;h3&gt;
  
  
  FAILED
&lt;/h3&gt;

&lt;p&gt;The agent failed, the project changed when it should not have, the Preflight checks became blocked, or the independent verifier failed.&lt;/p&gt;

&lt;h3&gt;
  
  
  NEEDS_REVIEW
&lt;/h3&gt;

&lt;p&gt;ELY does not currently have enough automated verification for that project type.&lt;/p&gt;

&lt;p&gt;I prefer this to pretending that every run can be automatically proven correct.&lt;/p&gt;

&lt;p&gt;Sometimes the right answer really is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;this needs a human review.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Current flow
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
text
Preflight
  -&amp;gt; Project detection
  -&amp;gt; Skill selection
  -&amp;gt; Agent handoff
  -&amp;gt; Codex
  -&amp;gt; File integrity check
  -&amp;gt; Independent Postflight verification
  -&amp;gt; Run history
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>testing</category>
      <category>python</category>
    </item>
  </channel>
</rss>
