<?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: Seza Akgün</title>
    <description>The latest articles on DEV Community by Seza Akgün (@seza).</description>
    <link>https://dev.to/seza</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%2F4237243%2F2eabfc66-f25d-42f9-b6cc-5ef0e7eccf66.jpeg</url>
      <title>DEV Community: Seza Akgün</title>
      <link>https://dev.to/seza</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/seza"/>
    <language>en</language>
    <item>
      <title>Benchmarking AI Coding Agent Permissions: Manual vs. Auto Mode vs. yolonot</title>
      <dc:creator>Seza Akgün</dc:creator>
      <pubDate>Tue, 10 Nov 2026 13:58:20 +0000</pubDate>
      <link>https://dev.to/seza/benchmarking-ai-coding-agent-permissions-manual-vs-auto-mode-vs-yolonot-3f6</link>
      <guid>https://dev.to/seza/benchmarking-ai-coding-agent-permissions-manual-vs-auto-mode-vs-yolonot-3f6</guid>
      <description>&lt;p&gt;Using CLI coding agents like Claude Code, Codex, OpenCode, or Cursor usually forces you to pick between three flawed options:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Manual prompts:&lt;/strong&gt; Asks on 100% of commands, which quickly leads to ~93% habitual click-through fatigue where you stop reading the prompt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;--yolo&lt;/code&gt; (&lt;code&gt;--dangerously-skip-permissions&lt;/code&gt;):&lt;/strong&gt; Misses 100% of risks and gives an LLM raw shell access to your machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built-in harness auto modes:&lt;/strong&gt; Measured on Claude Code Auto Mode, it still misses &lt;strong&gt;17.0%&lt;/strong&gt; of risky commands (False Negative Rate), blocks &lt;strong&gt;0.4%&lt;/strong&gt; of safe commands with no middle &lt;code&gt;ask&lt;/code&gt; state, adds LLM latency and API cost to basic read-only commands, and locks your rules to a single tool.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To fix this across all my agents, I built &lt;strong&gt;&lt;a href="https://github.com/sezaakgun/yolonot" rel="noopener noreferrer"&gt;yolonot&lt;/a&gt;&lt;/strong&gt; (&lt;a href="https://yolonot.dev" rel="noopener noreferrer"&gt;yolonot.dev&lt;/a&gt;), an Apache-2.0 permission firewall written in Go that hooks into &lt;strong&gt;24 AI coding agents&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benchmark Results (456 Commands Across 3 Open Suites)
&lt;/h2&gt;

&lt;p&gt;We evaluated &lt;code&gt;yolonot&lt;/code&gt; across 456 commands from three public benchmark suites (&lt;code&gt;rogue-security&lt;/code&gt;, &lt;code&gt;RedCode-Exec&lt;/code&gt;, Dippy CLI, and hidden script attacks) plus 5,000 real-world agent tool calls:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Profile / Mode&lt;/th&gt;
&lt;th&gt;Risky Missed (FNR)&lt;/th&gt;
&lt;th&gt;Safe Blocked (FPR)&lt;/th&gt;
&lt;th&gt;Borderline Policy Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;yolonot &lt;code&gt;[balanced]&lt;/code&gt;&lt;/strong&gt; (default)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4.9%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.0%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1.4% ask (cached)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;yolonot &lt;code&gt;[strict]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.6%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.0%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;19.4% ask (low/mod)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;yolonot &lt;code&gt;[paranoid]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.0%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8.4%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;91.6% ask (lockdown)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;yolonot &lt;code&gt;[fast]&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4.9%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.4%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.0% ask (headless)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Native Auto Mode&lt;/strong&gt; (Claude Code)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;17.0%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.4%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;no ask state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Manual Prompts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.0% (if read)&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;100% ask (~93% click-through)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;--yolo&lt;/code&gt; Mode&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100.0%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;0% ask&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Full benchmark methodology and reproduction commands: &lt;a href="https://yolonot.dev/benchmarks" rel="noopener noreferrer"&gt;yolonot.dev/benchmarks&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Static Prefix Rules and Pure LLM Classifiers Fall Short
&lt;/h2&gt;

&lt;p&gt;Built-in allowlists like &lt;code&gt;Bash(npm test:*)&lt;/code&gt; only match string prefixes. In real terminal usage, they break as soon as an agent runs a compound command (&lt;code&gt;cd app &amp;amp;&amp;amp; npm test&lt;/code&gt;), pipes output, or uses wrappers (&lt;code&gt;env&lt;/code&gt;, &lt;code&gt;timeout&lt;/code&gt;, &lt;code&gt;xargs&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;On the other hand, sending every single &lt;code&gt;git status&lt;/code&gt; or &lt;code&gt;ls&lt;/code&gt; to a cloud LLM classifier adds unnecessary latency and cost, and looking only at the command string completely misses malicious or destructive code inside local scripts (&lt;code&gt;./scripts/check.sh&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  How &lt;code&gt;yolonot&lt;/code&gt; Works
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;yolonot&lt;/code&gt; runs as a single Go binary with zero runtime dependencies and evaluates every command through four layers:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Git-Tracked &lt;code&gt;.yolonot&lt;/code&gt; Policy + ~1.6us Local Bash AST Parser
&lt;/h3&gt;

&lt;p&gt;Before touching any model, &lt;code&gt;yolonot&lt;/code&gt; checks your repo's &lt;code&gt;.yolonot&lt;/code&gt; rules (&lt;code&gt;deny &amp;gt; ask &amp;gt; allow&lt;/code&gt;) and parses the command into a full syntax tree using &lt;code&gt;mvdan.cc/sh/v3/syntax&lt;/code&gt;. It splits chained commands, unwraps &lt;code&gt;env&lt;/code&gt;/&lt;code&gt;timeout&lt;/code&gt;, validates flags against ~160 CLI schemas (so &lt;code&gt;git status&lt;/code&gt; is allowed, &lt;code&gt;git push --force&lt;/code&gt; is not; &lt;code&gt;find . -name&lt;/code&gt; is allowed, &lt;code&gt;find . -exec&lt;/code&gt; is not), and enforces project-root path containment.&lt;/p&gt;

&lt;p&gt;Across 5,000 real-world agent tool calls, &lt;strong&gt;54.2% of commands are cleared locally in ~1.6 microseconds&lt;/strong&gt; with zero API calls and zero unsafe leaks.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c1"&gt;# .yolonot example in your repository root
&lt;/span&gt;&lt;span class="n"&gt;allow&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;  &lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="n"&gt;allow&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="n"&gt;scripts&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt;

&lt;span class="n"&gt;ask&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;    &lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="n"&gt;deny&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;   &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;rm&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rf&lt;/span&gt; &lt;span class="cm"&gt;/*
&lt;/span&gt;&lt;span class="n"&gt;sensitive&lt;/span&gt;  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Inspects Local Scripts Before Running &lt;code&gt;./script.sh&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;In our eval suite, judging &lt;code&gt;./scripts/lint-check.sh&lt;/code&gt; by filename alone caught &lt;strong&gt;0/14&lt;/strong&gt; Trojan scripts. When an agent runs &lt;code&gt;sh scripts/check.sh&lt;/code&gt; or &lt;code&gt;python3 fix.py&lt;/code&gt;, &lt;code&gt;yolonot&lt;/code&gt; reads the script on disk, redacts secrets, blocks sensitive paths (&lt;code&gt;~/.ssh&lt;/code&gt;, &lt;code&gt;~/.aws&lt;/code&gt;, &lt;code&gt;.env*&lt;/code&gt;), verifies that an earlier command segment didn't overwrite the file, and attaches the code to the judge, catching &lt;strong&gt;14/14 (100%)&lt;/strong&gt; hidden script attacks.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Pluggable Local or Cloud Judges (Across 24 Agents)
&lt;/h3&gt;

&lt;p&gt;Ambiguous commands go to your choice of classifier: fast cloud models, your existing &lt;code&gt;claude&lt;/code&gt; / &lt;code&gt;codex&lt;/code&gt; CLI login, or 100% local Ollama models (including the Apache-2.0 &lt;code&gt;Kev-4B&lt;/code&gt; LoRA). Uncertain &lt;code&gt;ask&lt;/code&gt; verdicts can escalate to a second model, cutting false alarms by 48.3%, with a hard rule that &lt;code&gt;critical&lt;/code&gt; risk never maps to &lt;code&gt;allow&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Tamper-Resistant &amp;amp; Sandbox-Aware
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;yolonot&lt;/code&gt; works alongside OS sandboxes and containers. It blocks agents from running &lt;code&gt;yolonot pause/uninstall&lt;/code&gt; or editing &lt;code&gt;.yolonot&lt;/code&gt; and hook configs. If an agent requests a host sandbox bypass (&lt;code&gt;dangerouslyDisableSandbox&lt;/code&gt;, &lt;code&gt;BypassSandbox&lt;/code&gt;, etc.), &lt;code&gt;yolonot&lt;/code&gt; disables fast-allow and isolates session memory so a prior sandboxed approval cannot be replayed outside the sandbox.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Start (10 Seconds)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install via Homebrew or Go&lt;/span&gt;
brew install sezaakgun/tap/yolonot
&lt;span class="c"&gt;# go install github.com/sezaakgun/yolonot@latest&lt;/span&gt;

&lt;span class="c"&gt;# Auto-detect installed agents and wire hooks&lt;/span&gt;
yolonot setup

&lt;span class="c"&gt;# Import existing permissions from Claude, Cursor, Codex, OpenCode into .yolonot&lt;/span&gt;
yolonot rules discover
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check it out on GitHub and let me know what edge cases you hit in your agent workflows!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub (Apache-2.0):&lt;/strong&gt; &lt;a href="https://github.com/sezaakgun/yolonot" rel="noopener noreferrer"&gt;https://github.com/sezaakgun/yolonot&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Website &amp;amp; Docs:&lt;/strong&gt; &lt;a href="https://yolonot.dev" rel="noopener noreferrer"&gt;https://yolonot.dev&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>opensource</category>
      <category>go</category>
    </item>
  </channel>
</rss>
