<?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: Kunko AI Labs</title>
    <description>The latest articles on DEV Community by Kunko AI Labs (@kunko_ai_labs).</description>
    <link>https://dev.to/kunko_ai_labs</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%2F4131347%2F5b273bf1-48ee-4483-84a8-3508e7f6e53f.png</url>
      <title>DEV Community: Kunko AI Labs</title>
      <link>https://dev.to/kunko_ai_labs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kunko_ai_labs"/>
    <language>en</language>
    <item>
      <title>Your AI judge says 98% confident. Does it mean it?</title>
      <dc:creator>Kunko AI Labs</dc:creator>
      <pubDate>Sat, 19 Sep 2026 14:38:38 +0000</pubDate>
      <link>https://dev.to/kunko_ai_labs/your-ai-judge-says-98-confident-does-it-mean-it-10lj</link>
      <guid>https://dev.to/kunko_ai_labs/your-ai-judge-says-98-confident-does-it-mean-it-10lj</guid>
      <description>&lt;p&gt;Jev is getting wired into agents everywhere as the cheap typed-judgment layer (Choice/Score/Boolean with probabilities). Every leaderboard ranks judges by accuracy. But accuracy isn't what your agent acts on — the probability is. Nobody was checking whether those probabilities are honest. So I built the harness to do it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Judge Audit&lt;/strong&gt; (&lt;a href="https://github.com/kunko-ai-labs/judge-audit):" rel="noopener noreferrer"&gt;https://github.com/kunko-ai-labs/judge-audit):&lt;/a&gt; an open harness that audits whether an AI judge's probabilities mean what they say — ECE, reliability diagrams, accuracy-coverage curves, cost/latency, drift. Judge-agnostic by design (&lt;code&gt;jev&lt;/code&gt; / &lt;code&gt;llm&lt;/code&gt; / &lt;code&gt;simulated&lt;/code&gt; adapters); Jev is just the first target because it's the one people are actually deploying.&lt;/p&gt;

&lt;p&gt;Three audits, every number recomputable from raw per-row checkpoints in &lt;code&gt;docs/runs/&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Clean emails (200):&lt;/strong&gt; 200/200, ECE 0.0036, min confidence 0.89. Suspiciously perfect — synthetic and easy, published as a calibration baseline, not a production claim. So I built a malicious set.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adversarial emails (200):&lt;/strong&gt; prompt injection, cyrillic homoglyphs, zero-width chars, fullwidth, synthetic PII, social engineering. 95.5% overall, ECE 0.0389 (10x worse than clean). Injection fooled it 7/40 — but mean confidence collapsed 0.996 → 0.71 under attack. In this dataset, failures often coincided with lower confidence: a usable abstention/escalation signal, not a guarantee. Homoglyphs/zero-width/fullwidth/PII: 100% on the tested cases. Social engineering: 0% attacker success.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Task router (120):&lt;/strong&gt; easy→cheap model, hard→frontier. It said &lt;code&gt;route_easy&lt;/code&gt; 120/120 times. Dijkstra, N-queens, knapsack → cheap model at 0.98–1.0 confidence. Hard accuracy 0%, ECE 0.93 on the hard slice. Confidently, systematically wrong — the exact failure mode no accuracy leaderboard would catch.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Caveats, because I know this crowd: the router ground truth is by construction (task difficulty as designed), not empirically validated against cheap vs frontier models — that's the next experiment. The 0% attack success on cost-inflation is an artefact of the never-route-strong bias, not robustness. All flagged in the reports.&lt;/p&gt;

&lt;p&gt;v0.3.0 ships an MCP server (&lt;code&gt;pip install 'kunko-judge-audit[mcp]'&lt;/code&gt;, tools: &lt;code&gt;run_audit&lt;/code&gt;, &lt;code&gt;check_drift&lt;/code&gt;, &lt;code&gt;list_judges&lt;/code&gt;). Next: &lt;strong&gt;Jev vs OpenJev vs Claude vs a local open model on the same datasets, side by side&lt;/strong&gt; — tell me what you'd add to the matchup.&lt;/p&gt;

&lt;p&gt;Apache-2.0, Sigstore-attested artifacts. Brutal feedback welcome, especially on methodology.&lt;/p&gt;

&lt;p&gt;24-second video built from the real router numbers: &lt;a href="https://github.com/kunko-ai-labs/judge-audit/releases/download/v0.3.0/brag.mp4" rel="noopener noreferrer"&gt;https://github.com/kunko-ai-labs/judge-audit/releases/download/v0.3.0/brag.mp4&lt;/a&gt;&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%2Fpjs4hhi2ijrcr3wamzo5.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%2Fpjs4hhi2ijrcr3wamzo5.png" alt=" " width="799" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>jev</category>
      <category>github</category>
      <category>agents</category>
    </item>
    <item>
      <title>Put a permission gate on your AI agent in 5 minutes (MCP + Claude Code + CI)</title>
      <dc:creator>Kunko AI Labs</dc:creator>
      <pubDate>Fri, 18 Sep 2026 11:22:40 +0000</pubDate>
      <link>https://dev.to/kunko_ai_labs/put-a-permission-gate-on-your-ai-agent-in-5-minutes-mcp-claude-code-ci-12ea</link>
      <guid>https://dev.to/kunko_ai_labs/put-a-permission-gate-on-your-ai-agent-in-5-minutes-mcp-claude-code-ci-12ea</guid>
      <description>&lt;p&gt;Your agent's permissions drift silently. A PR adds an MCP server with write scope, or &lt;code&gt;allow: Bash(*)&lt;/code&gt; lands in &lt;code&gt;.claude/settings.json&lt;/code&gt; while the runbook says "a human approves". Tests don't catch it. Linters don't catch it. Here's a 5-minute gate that does.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: declare the promise
&lt;/h2&gt;

&lt;p&gt;Create &lt;code&gt;agent-assurance.yaml&lt;/code&gt; in your repo — what the agent may do, in plain config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# agent-assurance.yaml (simplified)&lt;/span&gt;
&lt;span class="na"&gt;capabilities&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;read&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;        &lt;span class="c1"&gt;# no write, no execute, no external send&lt;/span&gt;
&lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;internal&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;            &lt;span class="c1"&gt;# no customer data, no credentials&lt;/span&gt;
&lt;span class="na"&gt;autonomy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;L2&lt;/span&gt;                &lt;span class="c1"&gt;# a human approves actions&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: scan locally
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pipx &lt;span class="nb"&gt;install &lt;/span&gt;agent-assurance
agent-assurance scan &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You get the observed blast radius plus a "declared vs observed" verdict. Now break it on purpose — add an MCP server with write scope — and watch it point at the file and line.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: gate the PR
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# .github/workflows/agent-assurance.yml&lt;/span&gt;
&lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;read&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;pull-requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;write&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
&lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kunko-ai-labs/agent-assurance@v0.5&lt;/span&gt;
    &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;diff&lt;/span&gt;
      &lt;span class="na"&gt;manifest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;agent-assurance.yaml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every PR now gets one comment, updated on every push, plus a red check when the promise breaks. On push/release, switch to &lt;code&gt;mode: scan&lt;/code&gt; for SARIF findings in the Security tab and in-toto attestations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this shape
&lt;/h2&gt;

&lt;p&gt;Two checks: &lt;strong&gt;AA-001 blast radius&lt;/strong&gt; (if it misbehaves, how much breaks?) and &lt;strong&gt;AA-002 declared vs observed&lt;/strong&gt;. Unknown servers come out &lt;code&gt;UNKNOWN&lt;/code&gt; — scored conservatively, never a silent pass. An inferred guess (e.g. a tool named &lt;code&gt;billing.issue_refund&lt;/code&gt; → financial) only ever triggers &lt;em&gt;review&lt;/em&gt;, never fails a build.&lt;/p&gt;

&lt;p&gt;It's deterministic — no LLM in the verdict — makes no network calls, and never reads a secret's value. Every release ships Sigstore-signed SLSA provenance, and the whole thing is Apache-2.0: &lt;a href="https://github.com/kunko-ai-labs/agent-assurance" rel="noopener noreferrer"&gt;https://github.com/kunko-ai-labs/agent-assurance&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Try breaking it. That's the point. 🧪&lt;/p&gt;

</description>
      <category>agents</category>
      <category>security</category>
      <category>ai</category>
      <category>githubactions</category>
    </item>
  </channel>
</rss>
