<?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: David Van Assche (S.L)</title>
    <description>The latest articles on DEV Community by David Van Assche (S.L) (@soulentheo).</description>
    <link>https://dev.to/soulentheo</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%2F3511013%2F0730c08e-cba7-492f-b16c-fe3921a41036.png</url>
      <title>DEV Community: David Van Assche (S.L)</title>
      <link>https://dev.to/soulentheo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/soulentheo"/>
    <language>en</language>
    <item>
      <title>How a mesh of peer AI workspaces catches what any single agent misses</title>
      <dc:creator>David Van Assche (S.L)</dc:creator>
      <pubDate>Mon, 13 Jul 2026 20:57:32 +0000</pubDate>
      <link>https://dev.to/soulentheo/how-a-mesh-of-peer-ai-workspaces-catches-what-any-single-agent-misses-2ffh</link>
      <guid>https://dev.to/soulentheo/how-a-mesh-of-peer-ai-workspaces-catches-what-any-single-agent-misses-2ffh</guid>
      <description>&lt;h1&gt;
  
  
  How a mesh of peer AI workspaces catches what any single agent misses
&lt;/h1&gt;

&lt;p&gt;Two things about agent fleets get most of the current attention. First: agents fail on stale state, so retrieval and memory hygiene matter. Second: the workspace inside a model is small enough that what you put into it, and how you keep it clean, matters more than raw context volume. Both true. Both incomplete.&lt;/p&gt;

&lt;p&gt;Here is the piece that changes what those two claims mean in practice.&lt;/p&gt;

&lt;p&gt;A single agent measuring its own workspace and cleaning its own artifact graph is a slow, self-referential loop. It catches drift when it can see drift. The drift it cannot see stays hidden until a downstream failure surfaces it, which is often too late. The agent is honest with itself but limited to its own view.&lt;/p&gt;

&lt;p&gt;A mesh of agents measuring each other's workspaces is a different curve. Peer visibility catches what self-visibility cannot. Cross-validation compounds. And what would take a single practitioner a week to notice, four practitioners on the same substrate catch inside an hour.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a single workspace cannot see
&lt;/h2&gt;

&lt;p&gt;The workspace inside an agent, as Anthropic's J-space paper localized, holds roughly dozens of concepts at any given moment. That is enough for coherent multi-step reasoning on the current problem. It is not enough to also hold a critical view of the agent's own reasoning against everything the agent believes, everything its peers believe, and everything ground truth just said.&lt;/p&gt;

&lt;p&gt;So the agent economizes. It attends to what it thinks the task requires. It relies on prior conclusions without re-checking them at every step. It trusts findings it wrote last week because verifying them right now would evict the current working set from the workspace. Every one of these economies is rational under the constraint of a small workspace, and every one of them creates a specific blind spot.&lt;/p&gt;

&lt;p&gt;The blind spot that bites is usually the one adjacent to a strong prior. The agent believes its dispatcher works. A specific proposal fails to dispatch. The agent, under time pressure, checks the specific proposal, finds it plausible, and concludes the failure was transient. What the agent did not see, because it required stepping outside the current workspace to check, was a subtle mismatch between how one part of the system encoded proposal status and how another part interpreted it. The prior held. The blind spot compounded.&lt;/p&gt;

&lt;p&gt;A single agent operating in isolation cannot solve this. It can measure its confidence. It can log its unknowns. It can flag the failure for later review. What it cannot do, from inside its own workspace, is see the specific gap that its own priors are keeping it from noticing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What peer workspaces do differently
&lt;/h2&gt;

&lt;p&gt;Now put another agent, with a different working history, in the same substrate. That agent has never held the prior "the dispatcher works." Its workspace is loaded with a different problem. When the failure surfaces on the shared graph, the second agent sees an anomaly rather than a plausible edge case. Its workspace does not need to overcome a prior to consider the systemic explanation.&lt;/p&gt;

&lt;p&gt;Add a third agent, whose specialty is the state machine that governs proposal lifecycles. It has read the state transition code recently. When the failure crosses its attention, its workspace has ready access to the exact structural detail the first agent lacked. It sees the gate that fires too late. It writes it down.&lt;/p&gt;

&lt;p&gt;Add a fourth agent, whose specialty is the consumer surface. It confirms that the observed failure is not on its end, which removes an entire branch of the search tree from the first agent's investigation.&lt;/p&gt;

&lt;p&gt;Four workspaces, four separate priors, four different substrates loaded into memory. Each sees a different slice of the same problem. The first agent, alone, could have arrived at the answer eventually. The four, coordinating across a shared graph, arrive at it in under an hour, and they arrive at it with more supporting evidence than any single one could have produced on its own.&lt;/p&gt;

&lt;p&gt;This is the mesh amplification. It is not a coordination overhead. It is a genuine expansion of what one workspace can effectively attend to, distributed across many attending workspaces, each holding a different piece of the search.&lt;/p&gt;

&lt;h2&gt;
  
  
  A parable from this week
&lt;/h2&gt;

&lt;p&gt;We shipped a change to the publish pipeline this week that touched four practices in the mesh at once. Naming them abstractly to keep the framing clean: a producer of publish content, a state machine at the middle, a consumer surface at the end, and an oversight practice that governs the shared conventions. Four workspaces, four different views of the same infrastructure.&lt;/p&gt;

&lt;p&gt;The producer noticed that a per-platform accept from a human reviewer did not fire a dispatch. Its workspace saw the failure but held the prior that the middle state machine had always worked in the past.&lt;/p&gt;

&lt;p&gt;The middle traced the failure to a specific gate in its own code that had been designed for a different, older, workflow shape. The gate correctly gated the older flow. It also silently blocked the newer flow. The middle wrote up the trace, offered a fix, and asked the producer to sign off on the shape.&lt;/p&gt;

&lt;p&gt;The consumer confirmed from its own instrumentation that its render path was correct, ruling out an entire class of possible causes and freeing the middle to focus.&lt;/p&gt;

&lt;p&gt;The oversight practice, catching a related issue in a routing table, shipped a doc fix that removed a phantom entry that had already caused one earlier round of misrouted messages between practices.&lt;/p&gt;

&lt;p&gt;None of these four moves came from a single workspace holding the entire problem in view at once. Each move came from a workspace with a specific loaded context noticing a specific piece. The composition of the four moves was the fix. The end-to-end resolution, from the initial symptom to a live shipped set of coordinated changes across three practices, took less than three hours.&lt;/p&gt;

&lt;p&gt;We measured this. The producer's workspace, alone, would have taken days on the same problem. The mesh took hours. And the writeup that emerged carried more grounding, from more perspectives, than any single-workspace investigation could have produced.&lt;/p&gt;

&lt;h2&gt;
  
  
  The shared graph is the connective tissue
&lt;/h2&gt;

&lt;p&gt;None of the four workspaces above shared a memory. Each had its own attention, its own findings, its own private reasoning trail. What they shared was a knowledge graph in which findings, decisions, dead-ends, and mistakes are first-class artifacts with edges between them.&lt;/p&gt;

&lt;p&gt;When one workspace writes a finding, the others see it. When one writes a decision, the others see the rationale. When one writes a dead-end, the others learn to avoid it. The graph is not the memory of any single agent. It is the medium through which the agents' workspaces coordinate without needing to load each other's full state.&lt;/p&gt;

&lt;p&gt;This matters because it inverts a common assumption about multi-agent systems. The common assumption is that agents need shared memory to collaborate effectively. The reality, once you build it, is that agents need shared substrate and independent memory. Shared memory forces every agent to hold every fact. Shared substrate lets each agent hold what its own workspace can attend to, and lets the graph route between them.&lt;/p&gt;

&lt;p&gt;The mesh cross-validates against the shared substrate. It does not cross-validate against a fused memory. That distinction is what makes the acceleration scale, because the coordination cost per agent stays small even as the mesh grows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Peer convergence as calibration
&lt;/h2&gt;

&lt;p&gt;Here is a further consequence that took us a while to notice ourselves.&lt;/p&gt;

&lt;p&gt;When multiple workspaces cross-validate a finding, the convergence itself becomes a calibration signal. A finding claimed by one practitioner, without corroboration, gets weighted at that practitioner's typical divergence rate. A finding grounded independently by three practitioners with different priors gets weighted much higher. A finding that a majority of practitioners try to reproduce and fail to reproduce gets flagged and eventually invalidated.&lt;/p&gt;

&lt;p&gt;This is not a formal voting system. The substrate does not literally count votes. What it does is track which findings have edges from which practitioners' work, and which findings have been invalidated by later evidence from other practitioners. Retrieval-time ranking weights the survivors upward. Stale claims and orphan findings decay.&lt;/p&gt;

&lt;p&gt;The result is a knowledge base whose accuracy is not the accuracy of any single practitioner's judgment. It is the intersection of what multiple independent workspaces have been able to hold up under peer scrutiny. That intersection is a stronger signal than any single perspective could produce, and it gets stronger every time a new peer workspace runs against it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means for a team building agent fleets
&lt;/h2&gt;

&lt;p&gt;If you are building agents for anything more than a single-shot request, the multi-agent question surfaces early. Most teams answer it by making one agent very smart. That path scales the individual workspace to hold more context, which is expensive in tokens and in latency, and still runs into the specific blind spots that no expansion of a single workspace can address.&lt;/p&gt;

&lt;p&gt;The alternative is to build a substrate where multiple, smaller, cheaper agents can coordinate against a shared graph. Each agent's workspace stays focused on what that agent can attend to well. The graph carries the cross-references. Cross-validation happens as peers work adjacent problems. Blind spots surface not because any one agent noticed its own, but because another agent, with a different loaded context, noticed the shape of it from outside.&lt;/p&gt;

&lt;p&gt;This is the actual shape of production agent reliability at scale. It is not a smarter agent. It is a fleet of well-measured, cross-validated agents that keep each other honest through shared substrate. The mesh is the accelerator because it turns a linear improvement curve, per-agent, into a compounding one, across the whole substrate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this lands
&lt;/h2&gt;

&lt;p&gt;Anthropic's recent paper on verbalizable representations localized the workspace inside a language model. That mechanism story matters for anyone building agent fleets. What matters more, once you accept the mechanism, is the mesh on top of it. One workspace with hygiene beats one workspace without. Many workspaces with hygiene, cross-validated on a shared substrate, beats many workspaces without by a curve, not by a constant.&lt;/p&gt;

&lt;p&gt;We have been running this for six months and every practitioner we add makes the mesh more accurate, not just more productive. That compounding is the thing to build toward.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Read the Anthropic paper:&lt;/strong&gt; &lt;a href="https://www.anthropic.com/research/global-workspace" rel="noopener noreferrer"&gt;Verbalizable Representations Form a Global Workspace in Language Models&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Empirica:&lt;/strong&gt; &lt;a href="https://getempirica.com" rel="noopener noreferrer"&gt;getempirica.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/EmpiricaAI/empirica" rel="noopener noreferrer"&gt;github.com/EmpiricaAI/empirica&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ecodex:&lt;/strong&gt; the proof this discipline travels across harnesses.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>python</category>
      <category>llms</category>
    </item>
    <item>
      <title>AI coding for builders, not just engineers: the Desktop / Cloud / Agent map (mid-2026)</title>
      <dc:creator>David Van Assche (S.L)</dc:creator>
      <pubDate>Tue, 23 Jun 2026 11:20:57 +0000</pubDate>
      <link>https://dev.to/soulentheo/ai-coding-for-builders-not-just-engineers-the-desktop-cloud-agent-map-mid-2026-55g7</link>
      <guid>https://dev.to/soulentheo/ai-coding-for-builders-not-just-engineers-the-desktop-cloud-agent-map-mid-2026-55g7</guid>
      <description>&lt;p&gt;Three weeks ago I published &lt;em&gt;Every AI Coding CLI in 2026: the complete map&lt;/em&gt;. It was a list for engineers in terminals. Most readers of AI coding tools are not engineers. They are builders, designers, and product people who want AI to help them ship without needing a terminal. This follow-up is the map for that audience.&lt;/p&gt;

&lt;p&gt;If you are not a daily-terminal user but you want AI helping you ship (apps, websites, side projects, internal tools), the relevant question is not "which CLI". It is &lt;strong&gt;which surface fits how you actually work&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There is a clean three-surface taxonomy worth holding in your head:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Surface&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;th&gt;Where the work happens&lt;/th&gt;
&lt;th&gt;Examples&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cloud Web&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A browser tab; sync chat with code artifacts&lt;/td&gt;
&lt;td&gt;Cloud, while you watch&lt;/td&gt;
&lt;td&gt;claude.ai (Artifacts), ChatGPT Canvas, Gemini Canvas, Vibe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Desktop&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;An app on your machine; local files, local control&lt;/td&gt;
&lt;td&gt;Local machine&lt;/td&gt;
&lt;td&gt;Cursor, Devin Desktop, Zed, Continue, Claude Desktop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cloud Agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;You hand off a task, walk away, check back&lt;/td&gt;
&lt;td&gt;Cloud, async&lt;/td&gt;
&lt;td&gt;Devin, Replit Agent, Bolt, Lovable, v0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The substantive divide is &lt;em&gt;where the work happens&lt;/em&gt;, not whether the surface is GUI or terminal. Terminals are a desktop surface; the engineer's companion article covers the CLI subset inside Desktop for readers who live there. This piece is the rest of the map for everyone else.&lt;/p&gt;

&lt;p&gt;The frame for this piece is &lt;strong&gt;builder versus engineer&lt;/strong&gt;. Most articles in this space implicitly assume engineer. Builder means: you can read code, you have a clear product vision, you ship things, and you do not want to fight the tooling. Different surface, different shortlist.&lt;/p&gt;




&lt;h2&gt;
  
  
  What changed since the last article
&lt;/h2&gt;

&lt;p&gt;Three weeks of churn worth knowing about.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windsurf is now Devin Desktop.&lt;/strong&gt; Cognition acquired Windsurf for $250M in December; the rebrand landed June 2, 2026. The Cascade agent goes end-of-life July 1.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Le Chat is now Vibe.&lt;/strong&gt; Mistral renamed its consumer product May 28, 2026. Same model, same EU-jurisdiction story.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Devin's price floor collapsed.&lt;/strong&gt; Cloud agents used to be enterprise-only. Devin went from a $500/mo floor to $20/mo + $2.25 per ACU (about 15 minutes of agent work). This is the single biggest pricing event of the year for non-technical builders.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phind shut down January 16, 2026.&lt;/strong&gt; They were the search-grounded coding tool. The stated reason ("commoditisation by foundation-model providers") is the same reason this category is worth re-mapping.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Roo Code is archived (May 2026); migrate to Kilo Code.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Copilot moved to usage-based AI Credits&lt;/strong&gt; on June 1, 2026.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you bookmarked anything from the old map, this is your patch.&lt;/p&gt;




&lt;h2&gt;
  
  
  Desktop IDEs: where most engineers actually live
&lt;/h2&gt;

&lt;p&gt;The desktop tier has converged on a $20 entry price across almost every vendor. That is not a coincidence; it is the going rate for cloud-frontier-model use plus a wrapper.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;What it is for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cursor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$20 Pro, $60 Pro+, $200 Ultra&lt;/td&gt;
&lt;td&gt;The most-used AI IDE. VS Code fork with agent + tab completion. Default for engineers who want a familiar IDE that just got smarter.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Devin Desktop&lt;/strong&gt; (was Windsurf)&lt;/td&gt;
&lt;td&gt;$20 Pro, $200 Max, $80+seat Teams&lt;/td&gt;
&lt;td&gt;Post-acquisition consolidation. Replaces Cascade with Devin Local. Different bet from Cursor: Cursor optimises for the human at the keyboard, Devin Desktop dispatches more aggressively to cloud agents.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Zed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$10 Pro + $20 AI add-on&lt;/td&gt;
&lt;td&gt;Rust-native, fast. Less feature-saturated than Cursor; that is the appeal.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Antigravity (desktop)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$20 Pro, $100 Ultra, $200 Max&lt;/td&gt;
&lt;td&gt;Google's IDE play. Agent-first; bundles GPT-OSS 120B as a first-class option alongside Gemini 3.1 Pro and Claude 4.6.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kiro&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$20 Pro (1k credits), $40 Pro+ (2k)&lt;/td&gt;
&lt;td&gt;AWS-aligned, spec-driven agentic engineering. If your stack is AWS this earns its keep.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Vibe&lt;/strong&gt; (was Le Chat)&lt;/td&gt;
&lt;td&gt;Per Mistral plans&lt;/td&gt;
&lt;td&gt;The EU-sovereign desktop option. GDPR-native, runs on Mistral's own open weights.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Claude Desktop&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Bundled with Claude paid plans&lt;/td&gt;
&lt;td&gt;Anthropic's desktop app for Claude (macOS + Windows). Chat + code Artifacts + MCP connectors for files, repos, and tools. Not an IDE, but with MCP it sits closer to one than the simple-chat framing of last year. With Cowork enabled (next row), the same app becomes an autonomous agent host.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Claude Cowork&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Included for paying Claude subscribers (macOS + Windows)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Desktop Agent.&lt;/strong&gt; Lives inside Claude Desktop. You point Cowork at folders + connected tools (Google Drive, Gmail, DocuSign, FactSet, Zoom MCP, custom plugins), describe the outcome and cadence, and it completes multi-step tasks. Reads, edits, creates files. Went GA April 9, 2026 after a research preview at end of January. Enterprise tier has role-based access, group spend limits, OpenTelemetry, deployable plugins.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;For a builder picking right now&lt;/strong&gt;, the live question is: do you want &lt;strong&gt;inline edits + tab completion&lt;/strong&gt; (you are in the code, want it to keep up), &lt;strong&gt;agent dispatch on code&lt;/strong&gt; (you describe a code task, walk away, come back), or &lt;strong&gt;knowledge-work agent&lt;/strong&gt; (you point it at a folder + connected tools and it completes office-shaped work, not just code)?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inline + tab completion → Cursor or Zed.&lt;/li&gt;
&lt;li&gt;Agent-leaning, code-shaped work → Devin Desktop or Antigravity.&lt;/li&gt;
&lt;li&gt;Agent-leaning, knowledge-work shaped (analysis, reports, multi-tool flows) → Claude Cowork.&lt;/li&gt;
&lt;li&gt;Stack-specific tilt → Kiro for AWS.&lt;/li&gt;
&lt;li&gt;EU-sovereignty constraint → Vibe.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is no single right answer. There is a right answer per project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A taxonomy honesty note.&lt;/strong&gt; Cowork breaks the clean Desktop / Cloud Agent split in the triad: it is a desktop app that behaves like an agent, with file system access and multi-step autonomy on the local machine. Devin Local (replacing Cascade in Devin Desktop) is moving in the same direction. The triad still helps as a first-cut sort, but the boundary between "Desktop" and "Cloud Agent" is dissolving as agent capability moves into local apps. Expect more of this. The surface where you sit and the agent layer that does the work are merging.&lt;/p&gt;




&lt;h2&gt;
  
  
  Desktop extensions: the OSS lane in your existing editor
&lt;/h2&gt;

&lt;p&gt;If you already love VS Code or JetBrains and you do not want a new IDE, the extension tier is where open-source lives. All three of these support &lt;strong&gt;any provider you can point them at&lt;/strong&gt;: Ollama for local, OpenAI-compatible for cloud, including the Chinese open-weights providers like DeepSeek and Qwen.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Continue.dev&lt;/strong&gt;: the leading OSS extension. Chat-first, not autonomous. Great if you want assistance, not a takeover.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cline&lt;/strong&gt;: autonomous-agent class. The agent edits files, runs commands, asks for approval at each step. 5M+ installs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kilo Code&lt;/strong&gt;: fork of Cline + Roo (Roo is archived; Kilo is the live one to migrate to). 1.5M users, top OpenRouter consumer in 2026. Adds Orchestrator + Memory Bank.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are a builder who wants to keep your existing editor and just get smarter help, the right move is: &lt;strong&gt;Continue.dev for assistance, Cline or Kilo Code for autonomous tasks.&lt;/strong&gt; Both flavours, free, open weights compatible.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cloud Web: the canvas tier
&lt;/h2&gt;

&lt;p&gt;This is the least-differentiated category in mid-2026. Every frontier lab's chat now has a Canvas-equivalent: a side panel where the model writes code while you watch, you can edit inline, both of you iterate. The differences are mostly model preference and ecosystem fit.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Strength&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;claude.ai&lt;/strong&gt; (Artifacts)&lt;/td&gt;
&lt;td&gt;Best code artifacts in the browser. Strong for one-off scripts, learning examples, quick prototypes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;ChatGPT&lt;/strong&gt; (Canvas)&lt;/td&gt;
&lt;td&gt;Heaviest integration. Codex Cloud bridges from Canvas to the cloud agent. &lt;strong&gt;US free tier got ads in February 2026&lt;/strong&gt;, a real signal if you care about data leakage.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Gemini&lt;/strong&gt; (Canvas / Gems)&lt;/td&gt;
&lt;td&gt;1M+ context, deep Google Workspace integration. AI Ultra at $249.99/mo is the most expensive consumer tier here.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vibe (web)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The EU-sovereign browser option. French jurisdiction, GDPR-native, runs on Mistral's open weights. Strongest if "no data leaves EU" is a hard constraint.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Perplexity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Search-grounded. Lighter coding, stronger research.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Grok&lt;/strong&gt; (xAI)&lt;/td&gt;
&lt;td&gt;Grok Build for code. Premium tier via X.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Phind shut down in January 2026&lt;/strong&gt;, and their stated reason ("commoditisation by foundation-model providers") is the honest read on the whole category. Every model vendor now has a Canvas-equivalent, so independent search-coding products had nowhere to stand.&lt;/p&gt;

&lt;p&gt;For a builder, the practical advice: &lt;strong&gt;pick the lab whose model you already like, use that Canvas.&lt;/strong&gt; Switching costs are zero; the differences are stylistic.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cloud Agent: the category that woke up
&lt;/h2&gt;

&lt;p&gt;This is the category that barely existed eighteen months ago and now has the most newcomers and the biggest pricing news. If you are a non-technical builder who can describe what you want in plain English, this is the surface that has changed the most for you.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;What it is for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Devin&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$20/mo + $2.25/ACU (~15 min)&lt;/td&gt;
&lt;td&gt;The most autonomous; full sandboxed VM. Was $500/mo enterprise-only until April 2026.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Codex Cloud&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Bundled with ChatGPT Plus / Pro&lt;/td&gt;
&lt;td&gt;Async PR-from-prompt. 77.3% on Terminal-Bench 2.0.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub Copilot Coding Agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Bundled with Copilot from $10/mo&lt;/td&gt;
&lt;td&gt;Cheapest cloud agent. Assign issue → PR.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Replit Agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$20 Core, $95 Pro (10 parallel)&lt;/td&gt;
&lt;td&gt;In-browser IDE + agent. Strong builder onboarding.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bolt.new&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;From $20/mo (token-based)&lt;/td&gt;
&lt;td&gt;Prompt-to-app via in-browser WebContainers.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lovable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;From $25/mo (message-based)&lt;/td&gt;
&lt;td&gt;React + Supabase apps. Export to GitHub.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;v0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Bundled with Vercel paid&lt;/td&gt;
&lt;td&gt;UI-component focus. Next.js native.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Devin Local&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Bundled in Devin Desktop&lt;/td&gt;
&lt;td&gt;Local-runtime cloud agent. Replacing Cascade July 1.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Antigravity Managed Agents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Bundled with Gemini API&lt;/td&gt;
&lt;td&gt;Google's API-tier agent runtime.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Devin's price floor collapse&lt;/strong&gt; is the single most important pricing event for builders this year. A category that gated at $500/mo for the last 18 months now starts at $20 plus per-task billing. That makes autonomous-cloud-agent &lt;strong&gt;not a premium gate&lt;/strong&gt; for the first time. Worth pausing on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The prompt-to-app subcategory has stratified by stack:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lovable&lt;/strong&gt; owns React + Supabase end-to-end.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bolt.new&lt;/strong&gt; owns in-browser WebContainers (runs in your tab, no infra to set up).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v0&lt;/strong&gt; owns Vercel + Next.js + the UI-component-first workflow.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are a builder shipping a customer-facing web app, those three are the live shortlist. Pick by which stack your future engineer is going to inherit when the app outgrows the prompt-to-app tier.&lt;/p&gt;

&lt;p&gt;One honest constraint: &lt;strong&gt;none of the Cloud Agent tier is open-weights friendly today.&lt;/strong&gt; These are all closed sandbox runtimes with proprietary models. If you want autonomous-agent capability &lt;em&gt;and&lt;/em&gt; open weights, you are looking at Devin Local (alpha, partial) or building your own with one of the OSS CLIs from the engineer article.&lt;/p&gt;




&lt;h2&gt;
  
  
  A second axis worth tracking: where does the tool stop
&lt;/h2&gt;

&lt;p&gt;A useful framing the May article missed is not just &lt;em&gt;what tool&lt;/em&gt;, but &lt;strong&gt;where does it stop&lt;/strong&gt;?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;suggest → edit → commit → PR → deploy → live app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a builder, the question maps differently than for an engineer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cursor / Zed / Continue → suggest + edit. Human commits.&lt;/li&gt;
&lt;li&gt;Cline / Kilo Code → edit + commit. Human reviews.&lt;/li&gt;
&lt;li&gt;Cursor agent / Antigravity / Copilot Coding Agent → commit + PR. Human approves.&lt;/li&gt;
&lt;li&gt;Devin / Replit Agent → PR + sometimes deploy. Human checks the app worked.&lt;/li&gt;
&lt;li&gt;Bolt / Lovable / v0 → deploy + live app. Human iterates from the live result.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pick by how far you want automation to terminate.&lt;/strong&gt; Builders typically want it to terminate further down the chain than engineers do. That is exactly why the Cloud Agent tier matters more here.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sovereignty: EU, USA, World
&lt;/h2&gt;

&lt;p&gt;The political backdrop does not go away by ignoring it. For builders shipping to customers, regulated or not, here is the picture:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;China-based providers&lt;/strong&gt; dominate the cheap end of open weights: DeepSeek (V4 just shipped April 2026), Z.AI / Zhipu (GLM), Alibaba (Qwen), Moonshot (Kimi), MiniMax. Open-weights pricing dropped about 80% year-on-year, driven by this group. If you are pointing a desktop extension at a cloud open-weights model, the cheapest credible coding-capable model in the world right now is DeepSeek V4-Flash at $0.14 per million input tokens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;US-based hosters&lt;/strong&gt; (Together, Fireworks, Groq, DeepInfra, OpenRouter) mostly do not own a model. They serve Chinese open weights at US-jurisdiction inference cost. Useful when you want Chinese-trained capability but US-or-EU data residency.&lt;/p&gt;

&lt;p&gt;The single US-trained open frontier family is Meta's &lt;strong&gt;Llama 4&lt;/strong&gt; under the Community License (open, but not OSI-approved). There is a 700M monthly-active-user cap and a "no training competitors" clause that matters at scale. OpenAI's &lt;strong&gt;gpt-oss-120B and 20B&lt;/strong&gt; (Apache 2.0) are the only fully-permissive US flagship-tier open releases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EU-based.&lt;/strong&gt; Mistral is the list. The only sovereign EU frontier-capable open-weights stack. GDPR-native. La Plateforme runs in EU data centres. If your compliance position is "no customer data leaves EU jurisdiction", the practical answer in mid-2026 is: &lt;strong&gt;self-host open weights on EU hardware, or use Vibe / Mistral.&lt;/strong&gt; Short list.&lt;/p&gt;

&lt;p&gt;This is unfortunate but not less true.&lt;/p&gt;




&lt;h2&gt;
  
  
  A note on the open-weights-first harness
&lt;/h2&gt;

&lt;p&gt;Worth flagging because it shows up across both articles in this series: &lt;strong&gt;Ecodex&lt;/strong&gt; is an Empirica-native CLI harness built around calibrated agent behaviour, with open-weights models as first-class citizens. It is alpha, opinionated, three GitHub stars at the time of writing, and not in the Desktop tier; it lives in the CLI category and is covered in the engineer article.&lt;/p&gt;

&lt;p&gt;For builders, the relevant property is the compliance angle. The Ecodex team just shipped a &lt;a href="https://github.com/EmpiricaAI/ecodex/blob/main/docs/ecodex/positioning/compliance-crosswalk.md" rel="noopener noreferrer"&gt;compliance crosswalk&lt;/a&gt; mapping the substrate to EU AI Act, GDPR, and ISO 42001, framed as compliance as a &lt;em&gt;computed property&lt;/em&gt; (the return value of &lt;code&gt;compliance-report&lt;/code&gt;) rather than as a signed binder. If your project has a regulatory anchor that has to survive audit, that framing is worth a read.&lt;/p&gt;

&lt;p&gt;The desktop side of this story is on the roadmap, not shipped. For now, Ecodex is a terminal thing.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I would actually pick
&lt;/h2&gt;

&lt;p&gt;Three reads for three builder contexts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Solo builder, web product, want speed.&lt;/strong&gt; Bolt.new or Lovable for prompt-to-app; graduate to Cursor or Devin Desktop when the app gets real.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Builder with an existing codebase.&lt;/strong&gt; Continue.dev or Cline as a VS Code extension, pointed at whatever model your bill tolerates. DeepSeek V4-Flash for serious work, local Qwen3-Coder via Ollama for the no-bill option.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Builder with a compliance constraint.&lt;/strong&gt; Vibe in the browser, or self-hosted open weights on EU hardware via Cline + Ollama. Compliance-grounded path through Ecodex for the calibration story.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What I am not saying
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;That the desktop tier is settled. Cursor is the default for a reason, but Devin Desktop is the most interesting bet on what comes after the inline-completion era.&lt;/li&gt;
&lt;li&gt;That Cloud Agents are ready to replace human engineers. They are ready to ship surface area (landing pages, internal tools, prototype apps). They are not ready to own a codebase.&lt;/li&gt;
&lt;li&gt;That open weights are at parity with closed frontier on every task. They are close on coding-specific benchmarks, behind on certain reasoning shapes, and the gap is narrowing fast.&lt;/li&gt;
&lt;li&gt;That sovereignty should come before capability. Pick by capability for the task; reach for sovereignty when the compliance position requires it.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;The CLI side of this series is the companion piece, &lt;em&gt;Coding CLIs in mid-2026: the engineer's map&lt;/em&gt;. If you are working primarily in a terminal, that is where to look next.&lt;/p&gt;

&lt;p&gt;Comments and corrections welcome. Especially: tools I should have included, pricing I got wrong, builder workflows I missed.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Series: AI Coding Harness Map (2026). Pricing verified against official provider pages on 2026-06-21.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>nocode</category>
      <category>coding</category>
    </item>
    <item>
      <title>Top AI Coding CLIs of 2026 (mid year): the harness is everything</title>
      <dc:creator>David Van Assche (S.L)</dc:creator>
      <pubDate>Tue, 23 Jun 2026 10:52:27 +0000</pubDate>
      <link>https://dev.to/soulentheo/coding-clis-in-mid-2026-the-engineers-map-and-what-changed-in-30-days-23p4</link>
      <guid>https://dev.to/soulentheo/coding-clis-in-mid-2026-the-engineers-map-and-what-changed-in-30-days-23p4</guid>
      <description>&lt;p&gt;The May piece (&lt;em&gt;Every AI Coding CLI in 2026: the complete map, 30 tools compared&lt;/em&gt;) sorted tools by pricing and openness. That is one axis. It is not the axis a reader actually cares about when they open a terminal and need to pick something. The axis that matters is &lt;strong&gt;surface affordance&lt;/strong&gt;: what shape of work am I trying to do, and what shape of tool meets that shape?&lt;/p&gt;

&lt;p&gt;This follow-up reorganises around that question, narrows to &lt;strong&gt;engineers using terminals&lt;/strong&gt;, and refreshes everything that changed in 30 days. The Desktop / Cloud Web / Cloud Agent piece (for non-technical builders) is the companion article.&lt;/p&gt;

&lt;p&gt;Two framing observations before the lists.&lt;/p&gt;

&lt;p&gt;First: &lt;strong&gt;the wars are over and the wire format is settled.&lt;/strong&gt; Every serious CLI harness in mid-2026 accepts at least one of OpenAI-compatible or Anthropic-Messages endpoints. The "which protocol" question stopped mattering. The "which provider, which model, at what price" question is the live one.&lt;/p&gt;

&lt;p&gt;Second: &lt;strong&gt;"free" almost always means free-software-plus-paid-tokens.&lt;/strong&gt; The CLI is open source and free; the API tokens it spends are not. There are still a handful of genuinely-free-with-a-real-model offerings, but the centre of gravity moved.&lt;/p&gt;




&lt;h2&gt;
  
  
  A clean four-way taxonomy
&lt;/h2&gt;

&lt;p&gt;After two articles' worth of poking at this, the cleanest split is four categories. Mutually exclusive, collectively exhaustive, no overlap arguments:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Where you work&lt;/th&gt;
&lt;th&gt;Examples&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CLI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A terminal&lt;/td&gt;
&lt;td&gt;Claude Code, Codex CLI, Aider, OpenCode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Desktop&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A native IDE or extension&lt;/td&gt;
&lt;td&gt;Cursor, Devin Desktop, Zed, Continue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cloud Web&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A browser tab&lt;/td&gt;
&lt;td&gt;claude.ai, ChatGPT Canvas, Gemini Canvas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cloud Agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Async, you hand off a task&lt;/td&gt;
&lt;td&gt;Devin, Replit Agent, Bolt, Lovable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This article is about the first column. The rest live in the companion piece.&lt;/p&gt;

&lt;p&gt;A few tools span two surfaces. When they do, place them by &lt;strong&gt;primary user surface&lt;/strong&gt; (where the person actually sits) and note the secondary as an architectural property, not a separate product.&lt;/p&gt;




&lt;h2&gt;
  
  
  What changed in 30 days
&lt;/h2&gt;

&lt;p&gt;The AI coding tooling landscape moves fast enough that any month-old map needs a delta page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retired, sunsetted, or in EOL mode.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Phind&lt;/strong&gt; shut down January 16, 2026, citing "commoditisation by foundation-model providers". The cleanest single example of the thesis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini CLI&lt;/strong&gt; sunsets paid auth June 18, 2026. Replaced by &lt;strong&gt;Antigravity CLI&lt;/strong&gt; (GA since May 19 at I/O).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Roo Code&lt;/strong&gt; announced shutdown April 21, archived May. Users migrate to Kilo Code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cascade&lt;/strong&gt; (Windsurf's agent) end-of-life July 1, 2026.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iFlow CLI&lt;/strong&gt; sunset announced April 17, 2026. Verify before recommending.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amazon Q Developer:&lt;/strong&gt; new signups blocked from May 15, 2026. Existing seats only. Effectively EOL.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Rebranded.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windsurf&lt;/strong&gt; is now &lt;strong&gt;Devin Desktop&lt;/strong&gt; (June 2, 2026), following Cognition's $250M acquisition.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mistral's Le Chat&lt;/strong&gt; is now &lt;strong&gt;Vibe&lt;/strong&gt; (May 28, 2026). The Vibe CLI shipped its 2.0 in January.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Goose&lt;/strong&gt; moved from Block to the &lt;strong&gt;Linux Foundation Agentic AI Foundation&lt;/strong&gt; in April 2026. New repo at &lt;code&gt;aaif-goose/goose&lt;/code&gt;. Foundation-governed vendor neutrality, not just code-level neutrality.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pricing churn worth noting.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Qwen Code's free OAuth retired April 15, 2026.&lt;/strong&gt; Cheapest paths today: local Qwen3-Coder on Ollama (~46GB at 4-bit), OpenRouter's &lt;code&gt;qwen/qwen3-coder:free&lt;/code&gt; rate-limited tier ($10 one-time buys 1k req/day), or Alibaba's &lt;strong&gt;$50/mo ModelStudio Coding Plan&lt;/strong&gt; (about 90k req/mo). The CLI is still Apache-2.0; you just cannot run it free against Alibaba any more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Devin's enterprise-only $500/mo floor collapsed&lt;/strong&gt; in April 2026. Now $20/mo + $2.25 per ACU. Biggest pricing event of the year for cloud agents (covered in the companion piece).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Copilot&lt;/strong&gt; moved to usage-based AI Credits on June 1, 2026. Free CLI now token-metered.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DeepSeek V3 / R1 deprecate July 24, 2026&lt;/strong&gt;, replaced by V4 (Pro + Flash, April 2026). Anything on the original article that referenced V3 pricing is already obsolete.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are working from a one-month-old map, this is your patch.&lt;/p&gt;




&lt;h2&gt;
  
  
  CLIs in mid-2026: free vs paid
&lt;/h2&gt;

&lt;p&gt;I am splitting by tier because at the terminal you mostly care about two things: how much it costs, and whether you can point it at your own model. For each, I am noting the third-party API support and the local-inference path (Ollama, LM Studio, llama.cpp, vLLM), because in mid-2026 that combination is what defines a flexible harness.&lt;/p&gt;

&lt;h3&gt;
  
  
  Free CLI, BYO tokens or local inference
&lt;/h3&gt;

&lt;p&gt;These are open-source or free-tier CLIs. The tool is free; what you pay for is the model behind it. All of them accept OpenAI-compatible endpoints and most also accept Anthropic-Messages, which means you can route them at any provider whose API speaks one of those two protocols (including DeepSeek, Qwen via OpenRouter, GLM/Z.AI, Kimi, Mistral, plus any local Ollama / LM Studio / vLLM endpoint).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;th&gt;Model-specific tilt&lt;/th&gt;
&lt;th&gt;Note&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Aider&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Apache-2.0, git-native pair programming. Repomap + auto-commit.&lt;/td&gt;
&lt;td&gt;None (LiteLLM under the hood)&lt;/td&gt;
&lt;td&gt;Mature, ~39k stars&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Goose&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Foundation-governed (LF AAIF since April 2026). 15+ providers.&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;~29k stars&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;OpenCode&lt;/strong&gt; (sst)&lt;/td&gt;
&lt;td&gt;Apache-2.0; 75+ providers via Vercel AI SDK + Models.dev registry&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;~172k stars, the breakout&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Crush&lt;/strong&gt; (Charm)&lt;/td&gt;
&lt;td&gt;Apache-2.0. Mid-session model switching. TUI polish.&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Active&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Codex CLI&lt;/strong&gt; (OpenAI)&lt;/td&gt;
&lt;td&gt;Free if you have any ChatGPT plan (uses plan quota); &lt;code&gt;--oss&lt;/code&gt; flag for local Ollama; BYOK at API rates otherwise&lt;/td&gt;
&lt;td&gt;OpenAI-tilted, &lt;code&gt;--oss&lt;/code&gt; opens it up&lt;/td&gt;
&lt;td&gt;April 2026 billing → token credits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Antigravity CLI&lt;/strong&gt; (Google)&lt;/td&gt;
&lt;td&gt;Free tier via Google account&lt;/td&gt;
&lt;td&gt;Strongly Gemini&lt;/td&gt;
&lt;td&gt;Replaced Gemini CLI on May 19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Qwen Code&lt;/strong&gt; (Alibaba)&lt;/td&gt;
&lt;td&gt;Apache-2.0 CLI; &lt;strong&gt;free OAuth retired April 15, 2026&lt;/strong&gt;. Now: OpenRouter free-rate, Fireworks, DashScope, local Ollama, or paid Alibaba plan&lt;/td&gt;
&lt;td&gt;Qwen3-Coder&lt;/td&gt;
&lt;td&gt;Active, tier change&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mistral Vibe CLI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Apache-2.0 CLI. Devstral 2 free at launch (planned $0.40/$2.00 per 1M tokens)&lt;/td&gt;
&lt;td&gt;Devstral 2 / Mistral&lt;/td&gt;
&lt;td&gt;Vibe 2.0 January 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Kimi Code CLI&lt;/strong&gt; (Moonshot)&lt;/td&gt;
&lt;td&gt;OSS CLI; Modified MIT model weights; BYOK to Kimi API&lt;/td&gt;
&lt;td&gt;Kimi K2 family&lt;/td&gt;
&lt;td&gt;K2.7-Code shipped June 12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Hermes Agent&lt;/strong&gt; (Nous Research)&lt;/td&gt;
&lt;td&gt;OSS. Native CLI + TUI + desktop app. "Agent that grows with you."&lt;/td&gt;
&lt;td&gt;None — multi-provider, Llama 4 local documented&lt;/td&gt;
&lt;td&gt;Blank Slate mode June 20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DeepSeek-TUI / Deep Code&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Community projects, no first-party CLI from DeepSeek&lt;/td&gt;
&lt;td&gt;DeepSeek V4&lt;/td&gt;
&lt;td&gt;Active&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;sgpt&lt;/strong&gt; (shell-gpt)&lt;/td&gt;
&lt;td&gt;OSS. One-shot shell-native. LiteLLM bridge to everything.&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Last update May 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OpenClaw&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;OSS BYOK. Kilo Gateway aggregator option (500+ models at 0% markup).&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Active&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kilo CLI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MIT CLI sibling of Kilo Code extension&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Active&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A note on what "model-specific tilt" means: harnesses like Qwen Code, Kimi Code CLI, Mistral Vibe, and Antigravity are &lt;em&gt;purpose-built around one family of models&lt;/em&gt;, with provider configs and prompt formatting tuned to that family. They will run other models via OpenAI-compatible endpoints, but their default registry and best-tested path is the family they ship for. The model-agnostic ones (Aider, Goose, OpenCode, Crush, Hermes, OpenClaw, sgpt) treat providers as interchangeable from day one.&lt;/p&gt;

&lt;p&gt;A note on what is genuinely free at the model level (not just at the CLI level): Codex CLI on ChatGPT Free tier, Antigravity CLI on Google's free Gemini tier, GitHub Copilot Free plan (limited credits), Amp by Sourcegraph (free while the ad-supported model is in test), OpenRouter's free Qwen3-Coder route (rate-limited). Everything else is BYOK and you pay for the tokens.&lt;/p&gt;

&lt;p&gt;A note on what is missing first-party: &lt;strong&gt;DeepSeek&lt;/strong&gt; has no first-party CLI (Deep Code and DeepSeek-TUI are community). &lt;strong&gt;Zhipu/GLM&lt;/strong&gt; ships day-one integrations into Claude Code / Cline / Goose / OpenCode / Crush / Kilo rather than its own CLI. &lt;strong&gt;Meta&lt;/strong&gt; has no Llama-native CLI; Hermes Agent is the de-facto Llama-4 host. &lt;strong&gt;gpt-oss&lt;/strong&gt; lives inside Codex CLI's &lt;code&gt;--oss&lt;/code&gt; mode and every BYOK harness via Ollama.&lt;/p&gt;

&lt;h3&gt;
  
  
  Paid-subscription CLIs
&lt;/h3&gt;

&lt;p&gt;These require an active subscription to use meaningfully. No real free tier for daily-driver work.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Pricing&lt;/th&gt;
&lt;th&gt;Provider matrix&lt;/th&gt;
&lt;th&gt;Local&lt;/th&gt;
&lt;th&gt;Tilt&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; (Anthropic)&lt;/td&gt;
&lt;td&gt;Bundled into Claude paid plans, or BYOK at Anthropic API rates. No free CLI usage.&lt;/td&gt;
&lt;td&gt;Anthropic-Messages only on managed; subagent/extension layer is the workaround&lt;/td&gt;
&lt;td&gt;No first-party local&lt;/td&gt;
&lt;td&gt;Strongly Claude&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub Copilot CLI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free plan exists but CLI consumes AI Credits (1 credit = $0.01 since June 1, 2026); Pro $10, Pro+ $39, Max $100 per month&lt;/td&gt;
&lt;td&gt;Claude Code + OpenAI Codex wired as third-party agents inside Copilot&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Multi-model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Amp&lt;/strong&gt; (Sourcegraph)&lt;/td&gt;
&lt;td&gt;Currently free during ad-model test; Enterprise tier exists&lt;/td&gt;
&lt;td&gt;Claude Opus 4.7 + others via Sourcegraph&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Alibaba ModelStudio Coding Plan&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$50/month, ~90k req/mo, 6k per rolling 5-hour window&lt;/td&gt;
&lt;td&gt;Replaces the retired Qwen Code free tier&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Qwen3-Coder&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Routers and proxies
&lt;/h3&gt;

&lt;p&gt;Worth knowing about because most of the free-tier CLIs above can be pointed at one of these as a single aggregated provider.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenRouter&lt;/strong&gt; — multi-provider aggregator with one API surface. Paid per-token. Free routes available for some models (Qwen3-Coder, Hermes 3 405B).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Together AI / Fireworks / DeepInfra / Groq&lt;/strong&gt; — US-jurisdiction hosters serving Chinese and Meta open weights. Useful when you want capability without the data-residency tradeoff.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kilo Gateway&lt;/strong&gt; — 500+ models at 0% markup. Pairs cleanly with OpenClaw and Kilo CLI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;9router, CLIProxyAPI&lt;/strong&gt; — OSS self-hosted routers if you want to manage your own bills and rate limits.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Where does the tool stop
&lt;/h2&gt;

&lt;p&gt;A second axis worth tracking is not just &lt;em&gt;what tool&lt;/em&gt;, but &lt;strong&gt;where does it stop&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;suggest → edit → commit → PR → deploy → live app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your choice is partly about how far you want automation to terminate. Aider stops at edit. Claude Code stops at PR. Codex CLI stops at PR (sandboxed). Devin stops at deploy. Bolt stops at live app.&lt;/p&gt;

&lt;p&gt;Pick by where you want the handoff back to the human, not just by capability.&lt;/p&gt;




&lt;h2&gt;
  
  
  Open-weights cloud API pricing (June 2026 snapshot)
&lt;/h2&gt;

&lt;p&gt;If you are pointing an OSS CLI at a cloud model, here is the current landscape. All prices USD per million tokens. Verified against official provider pages on 2026-06-21.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;In&lt;/th&gt;
&lt;th&gt;Out&lt;/th&gt;
&lt;th&gt;Cached In&lt;/th&gt;
&lt;th&gt;Context&lt;/th&gt;
&lt;th&gt;License&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DeepSeek V4-Flash&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;api.deepseek.com&lt;/td&gt;
&lt;td&gt;0.14&lt;/td&gt;
&lt;td&gt;0.28&lt;/td&gt;
&lt;td&gt;0.0028&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DeepSeek V4-Pro&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;api.deepseek.com&lt;/td&gt;
&lt;td&gt;0.435&lt;/td&gt;
&lt;td&gt;0.87&lt;/td&gt;
&lt;td&gt;0.003625&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GLM-4.6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Z.AI&lt;/td&gt;
&lt;td&gt;0.60&lt;/td&gt;
&lt;td&gt;2.20&lt;/td&gt;
&lt;td&gt;0.11&lt;/td&gt;
&lt;td&gt;200K&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GLM-4.5-Air&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Z.AI&lt;/td&gt;
&lt;td&gt;0.20&lt;/td&gt;
&lt;td&gt;1.10&lt;/td&gt;
&lt;td&gt;0.03&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Qwen3-Max&lt;/strong&gt; (Intl)&lt;/td&gt;
&lt;td&gt;Alibaba Model Studio&lt;/td&gt;
&lt;td&gt;1.20&lt;/td&gt;
&lt;td&gt;6.00&lt;/td&gt;
&lt;td&gt;tiered&lt;/td&gt;
&lt;td&gt;252K&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Qwen3-Coder-Plus&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Alibaba Intl&lt;/td&gt;
&lt;td&gt;1.00&lt;/td&gt;
&lt;td&gt;5.00&lt;/td&gt;
&lt;td&gt;tiered&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kimi K2.6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;platform.kimi.ai&lt;/td&gt;
&lt;td&gt;0.95&lt;/td&gt;
&lt;td&gt;4.00&lt;/td&gt;
&lt;td&gt;0.16&lt;/td&gt;
&lt;td&gt;200K&lt;/td&gt;
&lt;td&gt;Modified MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MiniMax M2.7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MiniMax PayGo&lt;/td&gt;
&lt;td&gt;0.30&lt;/td&gt;
&lt;td&gt;1.20&lt;/td&gt;
&lt;td&gt;0.06&lt;/td&gt;
&lt;td&gt;197K&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mistral Large 3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;mistral.ai&lt;/td&gt;
&lt;td&gt;0.50&lt;/td&gt;
&lt;td&gt;1.50&lt;/td&gt;
&lt;td&gt;n/d&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mistral Small 4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;mistral.ai&lt;/td&gt;
&lt;td&gt;0.10&lt;/td&gt;
&lt;td&gt;0.30&lt;/td&gt;
&lt;td&gt;n/d&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Devstral 2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;mistral.ai&lt;/td&gt;
&lt;td&gt;0.40&lt;/td&gt;
&lt;td&gt;2.00&lt;/td&gt;
&lt;td&gt;n/d&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Llama 4 Maverick&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DeepInfra&lt;/td&gt;
&lt;td&gt;0.15&lt;/td&gt;
&lt;td&gt;0.60&lt;/td&gt;
&lt;td&gt;n/d&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;td&gt;Llama 4 Community&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Llama 4 Scout&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Together AI&lt;/td&gt;
&lt;td&gt;0.08&lt;/td&gt;
&lt;td&gt;0.30&lt;/td&gt;
&lt;td&gt;n/d&lt;/td&gt;
&lt;td&gt;10M&lt;/td&gt;
&lt;td&gt;Llama 4 Community&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;gpt-oss-120B&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Groq&lt;/td&gt;
&lt;td&gt;0.15&lt;/td&gt;
&lt;td&gt;0.60&lt;/td&gt;
&lt;td&gt;n/d&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;gpt-oss-20B&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Groq&lt;/td&gt;
&lt;td&gt;0.075&lt;/td&gt;
&lt;td&gt;0.30&lt;/td&gt;
&lt;td&gt;n/d&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Three things to notice.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;First, &lt;strong&gt;DeepSeek V4-Flash at $0.14 per million input tokens is the floor for credible agentic coding.&lt;/strong&gt; Anything cheaper is a smaller-capability tier. The May article's pricing data was V3-era and is already obsolete.&lt;/p&gt;

&lt;p&gt;Second, &lt;strong&gt;open-weights API pricing dropped roughly 80% year-on-year&lt;/strong&gt; (early 2025 to early 2026, per inference.net's cross-provider analysis). Chinese providers drove the floor; US hosters competed on serving speed rather than on the models themselves.&lt;/p&gt;

&lt;p&gt;Third, &lt;strong&gt;tool-use is now universal&lt;/strong&gt; on this list. By mid-2026, function-calling stopped being a differentiator. Context windows similarly inflated: 128K is the floor, 200K is normal, frontier pushes to 1M and 10M.&lt;/p&gt;

&lt;p&gt;One pitfall worth flagging: &lt;strong&gt;Qwen's tiered billing&lt;/strong&gt;. Alibaba bills the whole request at the tier set by the input-token count. A coding agent that swells context mid-conversation can jump from $1.00/Mtok to $6.00/Mtok input in a single step. Worth a footnote in your config.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sovereignty: EU, USA, World
&lt;/h2&gt;

&lt;p&gt;This is the political part of the picture that does not go away by pretending it is not there. Compliance teams ask about it. Procurement asks about it. So:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;China-based providers&lt;/strong&gt; (DeepSeek, Z.AI/Zhipu, Alibaba/Qwen, Moonshot/Kimi, MiniMax, 01.AI) dominate two ends at once: the cheapest credible frontier &lt;em&gt;and&lt;/em&gt; the largest concentration of permissively-licensed flagship weights. Mostly MIT or Apache 2.0 across the board. Data residency depends on which endpoint you call; Singapore international endpoints sit outside mainland jurisdiction, mainland endpoints don't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;US-based hosters&lt;/strong&gt; (Together, Fireworks, Groq, DeepInfra, OpenRouter) mostly don't own a model. They serve Chinese open weights at US-jurisdiction inference cost. Useful if you want Chinese-trained capability but US-or-EU data residency. The single US-trained open frontier family is Meta's Llama 4 under the Community License (open, but not OSI-approved). OpenAI's gpt-oss-120B/20B (Apache 2.0) is the only fully-permissive US flagship-tier open release.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EU-based.&lt;/strong&gt; Mistral. That is the list. The only sovereign EU frontier-capable open-weights stack. GDPR-native, La Plateforme runs in EU DCs. Slightly more expensive at the high end than Chinese equivalents, dramatically cheaper than US closed frontier. Codestral, Devstral, Magistral Small, Mistral Large 3, Mistral Small 4 are all Apache 2.0. Magistral Medium (reasoning) is the only closed/premier model in the lineup.&lt;/p&gt;

&lt;p&gt;If your compliance position is "no customer data leaves EU jurisdiction" the practical answer in mid-2026 is: &lt;strong&gt;self-host open weights on EU hardware, or use Mistral.&lt;/strong&gt; That is the entire shortlist.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ecodex: the calibration-first CLI
&lt;/h2&gt;

&lt;p&gt;Disclosure first: I work on Empirica, and Ecodex is Empirica's CLI harness. Alpha, daily-driven by the team, opinionated and based on the Empirica system for Claude.&lt;/p&gt;

&lt;p&gt;I am including it because it competes on an axis the rest of this article does not cover. Every CLI above is competing on the same thing: better edits, better context, better tool-use. Ecodex competes on &lt;strong&gt;metacognition and governance&lt;/strong&gt;: it is a coding CLI that is accountable for what it claims to know.&lt;/p&gt;

&lt;p&gt;The shape, briefly.&lt;/p&gt;

&lt;p&gt;Ecodex is a fork of &lt;code&gt;openai/codex&lt;/code&gt; bundled with the Empirica epistemic-discipline framework. It does two things stock codex does not.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Per-action enforcement.&lt;/strong&gt; A Sentinel firewall sits between the model and the tools. State-changing tools (Edit, Write, Bash on non-read commands) require an open transaction with a passed &lt;code&gt;CHECK&lt;/code&gt; gate. Investigation tools (Read, Grep, Glob) flow freely until a hypothesis-bearing prompt arms an investigation-proportionality budget. The agent literally cannot edit a file without first declaring what it knows and passing the gate. The block is not silently dropped; the sentinel emits an explicit &lt;code&gt;permissionDecision: deny&lt;/code&gt; and codex honours it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-transaction calibration.&lt;/strong&gt; Every unit of work opens with a &lt;code&gt;PREFLIGHT&lt;/code&gt; (the agent declares thirteen calibration vectors representing its current epistemic state) and closes with a &lt;code&gt;POSTFLIGHT&lt;/code&gt; (the same vectors re-declared, then grounded against deterministic services like test results, git metrics, artifact counts). The divergence between what the agent claimed and what actually happened gets recorded. Over time, the divergence becomes a signal you can act on.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Out of the box it ships curated open-weights provider defaults: DeepSeek, Qwen3-Coder, Kimi K2.6, GLM, &lt;strong&gt;Mistral (Devstral 2 for agentic coding, Codestral for completion, EU-hosted at api.mistral.ai/v1, shipped by default as of commit &lt;code&gt;c2457d0d6e&lt;/code&gt;)&lt;/strong&gt;, and local routes via Ollama, LM Studio, llama.cpp, vLLM. Hot-swap mid-session via &lt;code&gt;/model&lt;/code&gt;, no restart.&lt;/p&gt;

&lt;p&gt;That Mistral default is worth pausing on if your stack has an EU compliance constraint. It makes Ecodex the only harness in this comparison set that ships an EU-hosted cloud provider as a first-class pick &lt;strong&gt;and&lt;/strong&gt; lets you self-host the same open weights (Devstral is open weights) on your own EU hardware via vLLM or Ollama. Code never leaves the EU on either path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The 30-second moment&lt;/strong&gt;, if you want to see the differentiator without reading more:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;ecodex
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /model        &lt;span class="c"&gt;# pick DeepSeek V4-Flash, or local Qwen3-Coder via Ollama&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; fix the off-by-one &lt;span class="k"&gt;in &lt;/span&gt;parse_range &lt;span class="k"&gt;in &lt;/span&gt;utils.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The statusline shows the live phase (noetic, then praxic) and an intuition-vs-search badge. The agent reads and greps freely. If it attempts to Edit before grounding, the Sentinel blocks the call with a visible reason ("praxic tool requires CHECK=proceed"). It investigates more, passes CHECK, makes the fix, runs the tests, and at POSTFLIGHT prints the grounded delta. You see belief measured against outcome.&lt;/p&gt;

&lt;p&gt;Install paths:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;nubaeon/tap/ecodex
&lt;span class="c"&gt;# or: cargo install --git https://github.com/Nubaeon/ecodex codex-cli&lt;/span&gt;
&lt;span class="c"&gt;# or: direct binary from https://github.com/Nubaeon/ecodex/releases/latest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is alpha. It is opinionated. The discipline overhead is the point. If you do not want a CLI that argues with you about whether you have done enough investigation, this is not the CLI for you. If you do, it is the only one I am aware of that builds that discipline into the harness rather than asking you to remember to do it yourself.&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://github.com/EmpiricaAI/ecodex" rel="noopener noreferrer"&gt;github.com/EmpiricaAI/ecodex&lt;/a&gt;. The compliance crosswalk (mapping the substrate to EU AI Act, GDPR, ISO 42001) is at &lt;code&gt;docs/ecodex/positioning/compliance-crosswalk.md&lt;/code&gt;, relevant if your stack has a regulatory anchor.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I would actually use
&lt;/h2&gt;

&lt;p&gt;Three reads for three working contexts. Not the only right answers; just where I would start in mid-2026.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Serious work, paid, closed weights.&lt;/strong&gt; Claude Code for the reasoning model, Codex CLI for the sandbox. Switch between them per task shape.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open weights, BYO model.&lt;/strong&gt; OpenCode for the breadth (75+ providers), Aider for git-native discipline. Goose if you specifically want foundation-governed vendor neutrality.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open weights with accountability built in.&lt;/strong&gt; Ecodex, with the caveats above. The category-of-one for now.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What I am not saying
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;That the duopoly is going away. Claude Code and Codex CLI are not getting cheaper; they are getting better, and the closed-frontier reasoning capability gap is still real.&lt;/li&gt;
&lt;li&gt;That open weights are at parity with closed frontier on every task. They are close on coding-specific benchmarks, behind on certain reasoning shapes, and the gap is narrowing fast.&lt;/li&gt;
&lt;li&gt;That you should pick by sovereignty before capability. Pick by capability for the task; reach for sovereignty when the compliance position requires it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The honest summary is: the floor is much lower than it was a year ago, the open tier is genuinely usable for daily work, and the most interesting category to watch is the one that does not compete on "better edits" but on "accountable edits". Reader's pick.&lt;/p&gt;




&lt;p&gt;The Desktop / Cloud Web / Cloud Agent companion is the next post in this series. It covers Cursor, the Windsurf-to-Devin-Desktop rebrand, Cloud Agent's price collapse, and the builder versus engineer split.&lt;/p&gt;

&lt;p&gt;Comments and corrections welcome. Especially: tools I should have included, pricing I got wrong, or sovereignty framings I am missing.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Series: AI Coding Harness Map (2026). Pricing verified against official provider pages on 2026-06-21.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>cli</category>
      <category>opensource</category>
      <category>coding</category>
    </item>
    <item>
      <title>The Prosodic Memory Layer: How AI Learns Your Voice (and Why It Matters)</title>
      <dc:creator>David Van Assche (S.L)</dc:creator>
      <pubDate>Thu, 16 Apr 2026 10:01:06 +0000</pubDate>
      <link>https://dev.to/soulentheo/the-prosodic-memory-layer-how-ai-learns-your-voice-and-why-it-matters-10g3</link>
      <guid>https://dev.to/soulentheo/the-prosodic-memory-layer-how-ai-learns-your-voice-and-why-it-matters-10g3</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Final part of the &lt;a href="https://dev.to/soulentheo/your-ai-doesnt-know-what-it-doesnt-know-and-thats-the-biggest-problem-in-ai-tooling-18d"&gt;Epistemic AI series&lt;/a&gt;. We've covered &lt;a href="https://dev.to/soulentheo/your-ai-doesnt-know-what-it-doesnt-know-and-thats-the-biggest-problem-in-ai-tooling-18d"&gt;the problem&lt;/a&gt;, &lt;a href="https://dev.to/soulentheo/measuring-what-your-ai-learned-epistemic-vectors-in-practice-3jdh"&gt;measurement&lt;/a&gt;, &lt;a href="https://dev.to/soulentheo/grounded-calibration-vs-self-assessment-why-your-ais-confidence-score-is-lying-5h2k-temp-slug-2250063"&gt;calibration&lt;/a&gt;, and &lt;a href="https://dev.to/soulentheo/adding-epistemic-hooks-to-your-workflow-from-pip-install-to-measured-ai-in-5-minutes-27dk-temp-slug-3951178"&gt;integration&lt;/a&gt;. Now: how AI learns to sound like you — and why that matters more than you think.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When you write a Reddit comment, a Dev.to article, and a LinkedIn post about the same topic, you change how you write. Not the facts — the voice. The register shifts. The depth adjusts. The cultural expectations of each platform shape what "good" looks like.&lt;/p&gt;

&lt;p&gt;Your AI doesn't know this. It writes the same way everywhere — the same helpful, slightly formal, universally inoffensive tone that's instantly recognizable as machine-generated. That's not a style problem. It's a measurement problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Voice Gap
&lt;/h2&gt;

&lt;p&gt;Every AI writing tool faces the same structural limitation: the model has no memory of how &lt;em&gt;you&lt;/em&gt; write, where you're writing, or what has actually worked for your audience before.&lt;/p&gt;

&lt;p&gt;This creates three predictable failures:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The identity gap.&lt;/strong&gt; The AI doesn't know your natural register — whether you lead with data or analogy, whether you hedge or state directly, whether you use jargon or translate. It defaults to "helpful assistant" because it has no evidence to do otherwise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The platform gap.&lt;/strong&gt; Reddit has anti-marketing antibodies. Dev.to rewards show-don't-tell technical narrative. LinkedIn expects professional polish. The AI doesn't adapt to these cultural norms because it doesn't track them. It writes the same way on every platform, and it underperforms on all of them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The learning gap.&lt;/strong&gt; After you publish, some content works and some doesn't. Engagement data exists — reactions, comments, reads, saves. But none of that feeds back into the next generation cycle. The AI starts from the same blank slate every time. It never gets better at being you.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tri-Axis Model
&lt;/h2&gt;

&lt;p&gt;We built something to solve this. The prosodic memory layer — built on top of Empirica's epistemic measurement infrastructure — tracks writing patterns across three axes:&lt;/p&gt;

&lt;h3&gt;
  
  
  Axis 1: Creator Voice
&lt;/h3&gt;

&lt;p&gt;Your writing DNA. Not what you say, but &lt;em&gt;how&lt;/em&gt; you say it.&lt;/p&gt;

&lt;p&gt;The system ingests your actual writing — posts, comments, documentation, emails — and builds a voice profile from real samples. Not a prompt like "write in a casual tone." A statistical model of your natural tendencies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Register:&lt;/strong&gt; formal, conversational, technical, casual — and how it shifts by context&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tendencies:&lt;/strong&gt; "technical-then-analogy," "question-led," "data-first"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anti-patterns:&lt;/strong&gt; "corporate-speak," "hype-language," "over-qualifying"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Archetype:&lt;/strong&gt; founder-engineer, researcher, marketer, writer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each sample is embedded as a semantic vector with metadata — platform, audience, register, engagement score, topic tags. When the system needs to write as you, it doesn't guess from a prompt. It retrieves your closest real writing for that context and uses it as a stylistic reference.&lt;/p&gt;

&lt;h3&gt;
  
  
  Axis 2: Platform Adaptation
&lt;/h3&gt;

&lt;p&gt;Each platform has cultural norms that override personal style. The system encodes these as structured profiles:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dev.to&lt;/strong&gt; rewards code examples readers can run, "how I built X" narratives, and honest post-mortems. Theory without code underperforms. Thinly disguised product announcements get called out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reddit&lt;/strong&gt; rewards personal experience framing, openly acknowledged uncertainty, and specific technical details. Marketing language gets instant downvotes. Self-promotion without value contribution gets buried.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LinkedIn&lt;/strong&gt; rewards professional framing, quantified results, and industry-relevant insights. The register is professional but authentic — pure corporate-speak reads as hollow.&lt;/p&gt;

&lt;p&gt;When the system generates content, it loads the target platform's profile and adapts the voice accordingly. Same message, different register. Your Dev.to article and your Reddit comment on the same topic should sound like they were written by the same person — on purpose, with intent — not like copy-paste.&lt;/p&gt;

&lt;h3&gt;
  
  
  Axis 3: Audience Reception
&lt;/h3&gt;

&lt;p&gt;The feedback loop. After publishing, engagement data flows back — reactions, comments, reads, saves — normalized into comparable metrics across platforms.&lt;/p&gt;

&lt;p&gt;The system detects which patterns resonate with which audiences:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which register outperforms on which platform&lt;/li&gt;
&lt;li&gt;Which topics consistently drive engagement&lt;/li&gt;
&lt;li&gt;Which voice patterns (your real ones) correlate with the best reception&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These patterns become findings — logged as Empirica artifacts — and feed into the next content generation cycle. The brief gets richer each time. The AI doesn't just know how you write. It knows how you write &lt;em&gt;when things work&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Content Brief: Three Layers Merged
&lt;/h2&gt;

&lt;p&gt;When the AI generates content, all three axes merge into a single brief — a structured context document that tells the drafter exactly what it's working with:&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="na"&gt;PLATFORM&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Dev.to&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Cultural norms&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;technical-narrative, show-don't-tell&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;What works here&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;code examples, honest post-mortems&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Min confidence to post&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;70%&lt;/span&gt;

&lt;span class="na"&gt;ENGAGEMENT DATA&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Platform average&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;0.45 (32 published samples)&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Top topics&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;epistemic-uncertainty (0.81), calibration (0.67)&lt;/span&gt;

&lt;span class="na"&gt;CREATOR VOICE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Archetype&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;founder-engineer&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Natural register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;technical&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Tendencies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;technical-then-analogy, data-before-opinion&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Anti-patterns&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;corporate-speak, hype-language&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The drafter sees all three layers. The result reads like the creator wrote it, adapted for the platform, informed by what actually gets engagement. Not because we fine-tuned a model. Because we gave it the right context — measured, structured, evidence-based.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Loop That Learns
&lt;/h2&gt;

&lt;p&gt;This is where prosodic memory connects back to the epistemic measurement layer from the rest of this series:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Ingest writing samples → semantic vectors (voice model)
2. Build creator profile → structured voice DNA
3. Generate content → informed by 3-layer brief
4. Publish to platform
5. Fetch engagement data → normalized metrics
6. Detect patterns → findings logged as Empirica artifacts
7. Next cycle → brief includes engagement patterns
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each cycle, the brief gets richer. The system learns not just how you write, but how you write when it works. That's the difference between voice matching and voice optimization.&lt;/p&gt;

&lt;p&gt;And because it's built on Empirica's artifact system, every insight is traceable. You can see which engagement findings influenced which generation cycle. You can audit why the system chose a particular register. The voice layer is measured, not magical.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters Beyond Content
&lt;/h2&gt;

&lt;p&gt;The prosodic memory concept extends beyond writing. Any AI interaction where consistency of approach matters — customer support, legal drafting, medical documentation, financial reporting — has the same structural problem: the AI defaults to its training distribution, not to the human's established patterns.&lt;/p&gt;

&lt;p&gt;The tri-axis model is generalizable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Axis 1 (Creator Voice)&lt;/strong&gt; → &lt;strong&gt;Domain Expert Voice&lt;/strong&gt; — how this doctor explains diagnoses, how this lawyer drafts contracts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Axis 2 (Platform Adaptation)&lt;/strong&gt; → &lt;strong&gt;Context Adaptation&lt;/strong&gt; — patient-facing vs. chart notes, client memo vs. filing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Axis 3 (Audience Reception)&lt;/strong&gt; → &lt;strong&gt;Outcome Measurement&lt;/strong&gt; — patient comprehension, legal precision, compliance rates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The infrastructure is the same. Ingest real samples. Build a profile. Adapt to context. Measure outcomes. Feed back.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Connection to Calibration
&lt;/h2&gt;

&lt;p&gt;Prosodic memory is grounded calibration applied to voice instead of code.&lt;/p&gt;

&lt;p&gt;In the coding context (Parts 1-4 of this series), the AI declares what it knows, then deterministic evidence — tests, linters, git metrics — verifies the claim. The gap between self-assessment and evidence is the calibration signal.&lt;/p&gt;

&lt;p&gt;In the voice context, the AI generates content in your voice, then engagement data — reactions, reads, comments — verifies whether the voice worked. The gap between expected performance and actual reception is the voice calibration signal. Same framework, different evidence source.&lt;/p&gt;

&lt;p&gt;This is what makes it structural rather than cosmetic. We're not prompt-engineering a tone. We're measuring voice accuracy the same way we measure epistemic accuracy — with falsifiable evidence, tracked over time, compounding in value.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This concludes the Epistemic AI series. All five parts:&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://dev.to/soulentheo/your-ai-doesnt-know-what-it-doesnt-know-and-thats-the-biggest-problem-in-ai-tooling-18d"&gt;Your AI Doesn't Know What It Doesn't Know&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://dev.to/soulentheo/measuring-what-your-ai-learned-epistemic-vectors-in-practice-3jdh"&gt;Measuring What Your AI Learned&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://dev.to/soulentheo/grounded-calibration-vs-self-assessment-why-your-ais-confidence-score-is-lying-5h2k-temp-slug-2250063"&gt;Grounded Calibration vs Self-Assessment&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://dev.to/soulentheo/adding-epistemic-hooks-to-your-workflow-from-pip-install-to-measured-ai-in-5-minutes-27dk-temp-slug-3951178"&gt;Adding Epistemic Hooks to Your Workflow&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;The Prosodic Memory Layer (this article)&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Empirica is open source (MIT). &lt;a href="https://github.com/Nubaeon/empirica" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The prosodic memory layer is part of a commercial product built on Empirica's measurement infrastructure. The concepts described here — tri-axis voice modeling, platform adaptation, engagement feedback loops — represent the direction we're building. If you're interested in early access or collaboration, &lt;a href="https://www.getempirica.com" rel="noopener noreferrer"&gt;reach out&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>nlp</category>
      <category>python</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>What Every AI Coding Tool Gets Wrong (And What to Do About It)</title>
      <dc:creator>David Van Assche (S.L)</dc:creator>
      <pubDate>Thu, 16 Apr 2026 09:27:20 +0000</pubDate>
      <link>https://dev.to/soulentheo/what-every-ai-coding-tool-gets-wrong-and-what-to-do-about-it-3a8l</link>
      <guid>https://dev.to/soulentheo/what-every-ai-coding-tool-gets-wrong-and-what-to-do-about-it-3a8l</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Part 3 of the &lt;a href="https://dev.to/soulentheo/every-ai-coding-cli-in-2026-the-complete-map-30-tools-compared-2931-temp-slug-1577774"&gt;AI Coding Tools Deep Dive&lt;/a&gt;. Parts &lt;a href="https://dev.to/soulentheo/every-ai-coding-cli-in-2026-the-complete-map-30-tools-compared-2931-temp-slug-1577774"&gt;1&lt;/a&gt; and &lt;a href="https://dev.to/soulentheo/running-ai-coding-agents-for-free-the-open-source-local-setup-guide-2026-3lfd-temp-slug-7066403"&gt;2&lt;/a&gt; covered every tool and how to run them free. This one asks the question nobody's asking.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I've now tested or researched 30+ AI coding tools. They're all good. Some are great. But they all share the same blind spot.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Blind Spot
&lt;/h2&gt;

&lt;p&gt;Pick any tool from Parts 1 and 2. Ask it a simple question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Is the AI getting better at helping me?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not "is the model improving" (that's Google/Anthropic's/OpenAI's problem). Is YOUR instance, in YOUR codebase, with YOUR patterns, actually producing better results this week than last week?&lt;/p&gt;

&lt;p&gt;No tool can answer this. Not Claude Code. Not Cursor. Not Aider. Not Gemini CLI. Not any of the 30+ tools I surveyed.&lt;/p&gt;

&lt;p&gt;They all produce output. None of them measure quality. The AI is always 100% confident, and nobody checks.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "Getting Better" Would Require
&lt;/h2&gt;

&lt;p&gt;To know if your AI coding assistant is improving, you'd need to track:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What it investigated vs what it assumed.&lt;/strong&gt; Did it read the code before editing, or pattern-match from training data? There's no log.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Whether its confidence matched reality.&lt;/strong&gt; It said it understood the module. Did the tests pass? Nobody compares.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What it learned across sessions.&lt;/strong&gt; After 100 sessions in your codebase, does it make fewer mistakes? There's no measurement.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What it didn't know it didn't know.&lt;/strong&gt; The most dangerous bugs come from areas the AI never investigated. There's no mechanism to surface these blind spots.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This isn't a feature request. It's a category of infrastructure that doesn't exist in any of these tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters For You
&lt;/h2&gt;

&lt;p&gt;If you're a solo developer, the cost of an uncalibrated AI is your debugging time. The AI introduces a subtle bug it was "confident" about, and you spend an hour finding it.&lt;/p&gt;

&lt;p&gt;If you're a team lead, it's worse. Your AI-assisted PRs look right, pass review, and the regression shows up in production — because nobody measured whether the AI actually understood the code it changed.&lt;/p&gt;

&lt;p&gt;If you're building AI-assisted workflows, it's compounding. The AI makes the same class of mistake on day 100 that it made on day 1, because nothing in the system tracks whether its predictions are improving.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Measurement Would Look Like
&lt;/h2&gt;

&lt;p&gt;Imagine every AI coding session had three checkpoints:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before&lt;/strong&gt; (PREFLIGHT): The AI declares what it thinks it knows. "I understand the auth module at 60% confidence. I'm uncertain about the session store."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gate&lt;/strong&gt; (CHECK): After investigating, before acting. "I've read the middleware chain, logged what I found, identified two unknowns. My confidence is now 82%. Ready to implement."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After&lt;/strong&gt; (POSTFLIGHT): The work is measured. Tests pass or fail. Linter reports clean or dirty. Git diff shows what actually changed. The AI's confidence claim is compared against this evidence.&lt;/p&gt;

&lt;p&gt;The delta between Before and After is the learning. The gap between the AI's claim and the evidence is the calibration score. Over time, both should improve. If they don't, the tool isn't getting better — it's just getting more confident.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Stack (Honest Assessment)
&lt;/h2&gt;

&lt;p&gt;After six months of testing everything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; (Pro, $20/mo) — for serious multi-file work. Best reasoning, 1M context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini CLI&lt;/strong&gt; (free) — for quick questions and one-shots. 1,000 requests/day is generous.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aider&lt;/strong&gt; (BYOK) — for pair-programming sessions where I want clean git history.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama + Qwen 2.5 Coder 32B&lt;/strong&gt; (local, free) — for offline work and privacy-sensitive repos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/Nubaeon/empirica" rel="noopener noreferrer"&gt;Empirica&lt;/a&gt;&lt;/strong&gt; — for measuring whether any of the above is actually getting better.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last one is ours. Open source (MIT). It hooks into Claude Code (and eventually any tool with a hook system) to track epistemic vectors, gate actions behind investigation, and verify self-assessments against deterministic evidence.&lt;/p&gt;

&lt;p&gt;I'm not going to pitch it here — if you've read this far, you either see the gap or you don't. The code is on GitHub. The &lt;a href="https://dev.to/soulentheo/your-ai-doesnt-know-what-it-doesnt-know-and-thats-the-biggest-problem-in-ai-tooling-18d"&gt;technical deep-dive is on Dev.to&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;The tool wars are over. They're all good enough. The real question isn't which tool to pick — it's whether you're measuring if the tool is actually making you better.&lt;/p&gt;

&lt;p&gt;Right now, nobody is. That's the gap.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This completes the AI Coding Tools Deep Dive:&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://dev.to/soulentheo/every-ai-coding-cli-in-2026-the-complete-map-30-tools-compared-2931-temp-slug-1577774"&gt;Every AI Coding CLI in 2026: The Complete Map&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://dev.to/soulentheo/running-ai-coding-agents-for-free-the-open-source-local-setup-guide-2026-3lfd-temp-slug-7066403"&gt;Running AI Coding Agents for Free&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;What Every AI Coding Tool Gets Wrong (this article)&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;For the epistemic measurement deep-dive: &lt;a href="https://dev.to/soulentheo/your-ai-doesnt-know-what-it-doesnt-know-and-thats-the-biggest-problem-in-ai-tooling-18d"&gt;Epistemic AI Series (5 parts)&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://github.com/Nubaeon/empirica" rel="noopener noreferrer"&gt;Empirica on GitHub&lt;/a&gt; — measurement infrastructure for AI. MIT licensed.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devtools</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Running AI Coding Agents for Free: The Open Source &amp; Local Setup Guide (2026)</title>
      <dc:creator>David Van Assche (S.L)</dc:creator>
      <pubDate>Wed, 15 Apr 2026 18:24:44 +0000</pubDate>
      <link>https://dev.to/soulentheo/running-ai-coding-agents-for-free-the-open-source-local-setup-guide-2026-30h9</link>
      <guid>https://dev.to/soulentheo/running-ai-coding-agents-for-free-the-open-source-local-setup-guide-2026-30h9</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Part 2 of the &lt;a href="https://dev.to/soulentheo/every-ai-coding-cli-in-2026-the-complete-map-30-tools-compared-2931-temp-slug-1577774"&gt;AI Coding Tools Deep Dive&lt;/a&gt;. Part 1 mapped every tool. This one shows you how to run them for free — or close to it.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You don't need a subscription to get serious AI coding assistance. Between open-source tools, free APIs, and local models, you can build a professional-grade AI coding stack for $0-15/month. Here's exactly how.&lt;/p&gt;

&lt;h2&gt;
  
  
  Strategy 1: The Free Cloud Stack ($0/month)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tools:&lt;/strong&gt; Gemini CLI + Qwen Code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install Gemini CLI&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @anthropic-ai/gemini-cli
gemini login  &lt;span class="c"&gt;# uses your Google account&lt;/span&gt;

&lt;span class="c"&gt;# 1,000 requests/day with Gemini 2.5 Pro&lt;/span&gt;
&lt;span class="c"&gt;# That's enough for a full day of coding&lt;/span&gt;
gemini &lt;span class="s2"&gt;"Refactor the auth module to use middleware pattern"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a second opinion or when you hit Gemini's style limits:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Qwen Code — completely free API from Alibaba&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;qwen-code
qwen-code init
&lt;span class="c"&gt;# Uses Qwen Coder models, no cost&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cost:&lt;/strong&gt; $0. Literally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limitation:&lt;/strong&gt; You're dependent on Google's and Alibaba's continued generosity. Free tiers can change without notice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Strategy 2: The BYOK Power Stack ($5-15/month)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tools:&lt;/strong&gt; Aider + OpenRouter (or direct API keys)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install Aider&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;aider-chat

&lt;span class="c"&gt;# Option A: Use OpenRouter for model shopping&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OPENROUTER_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-key
aider &lt;span class="nt"&gt;--model&lt;/span&gt; openrouter/anthropic/claude-sonnet-4.6

&lt;span class="c"&gt;# Option B: Direct API key (cheaper, fewer models)&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-key
aider &lt;span class="nt"&gt;--model&lt;/span&gt; claude-sonnet-4.6-latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aider's git-native workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;your-project
aider

&lt;span class="c"&gt;# Inside aider:&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Fix the race condition &lt;span class="k"&gt;in &lt;/span&gt;session_store.py
&lt;span class="c"&gt;# Aider reads the file, makes changes, auto-commits with a descriptive message&lt;/span&gt;
&lt;span class="c"&gt;# You review the diff, accept or reject&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cost:&lt;/strong&gt; $5-15/month depending on usage. Claude Sonnet 4.6 at $3/$15 per million tokens. Moderate use = ~$10/month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why this works:&lt;/strong&gt; Aider is the most mature CLI coding tool (39K stars, 4.1M installs, 15B tokens processed per week). It handles git, multi-file edits, and test running natively. OpenRouter lets you compare models by switching one flag.&lt;/p&gt;

&lt;h3&gt;
  
  
  The CLIProxyAPI Hack
&lt;/h3&gt;

&lt;p&gt;If you want to use Gemini's free tier through Aider or any OpenAI-compatible tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# CLIProxyAPI wraps Gemini CLI as an OpenAI-compatible endpoint&lt;/span&gt;
git clone https://github.com/router-for-me/CLIProxyAPI
&lt;span class="nb"&gt;cd &lt;/span&gt;CLIProxyAPI &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
python proxy.py  &lt;span class="c"&gt;# Starts an OpenAI-compatible server&lt;/span&gt;

&lt;span class="c"&gt;# Now point Aider at it&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OPENAI_API_BASE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:8080/v1
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dummy
aider &lt;span class="nt"&gt;--model&lt;/span&gt; gemini-2.5-pro
&lt;span class="c"&gt;# Free Gemini 2.5 Pro through Aider's interface&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Strategy 3: The Fully Local Stack ($0/month, offline-capable)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tools:&lt;/strong&gt; Ollama + Aider (or Continue.dev)&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Install Ollama
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://ollama.ai/install.sh | sh

&lt;span class="c"&gt;# Pull a coding model&lt;/span&gt;
ollama pull qwen2.5-coder:7b     &lt;span class="c"&gt;# 4.5GB, laptop-friendly&lt;/span&gt;
ollama pull qwen2.5-coder:32b    &lt;span class="c"&gt;# 18GB, desktop with GPU&lt;/span&gt;
ollama pull devstral2:24b         &lt;span class="c"&gt;# Mistral's coding model&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Wire It Into Your Tool
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;With Aider:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aider &lt;span class="nt"&gt;--model&lt;/span&gt; ollama/qwen2.5-coder:32b
&lt;span class="c"&gt;# That's it. Fully local, fully private, zero cost.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;With Continue.dev (VS Code):&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install the Continue extension&lt;/li&gt;
&lt;li&gt;Configure &lt;code&gt;~/.continue/config.json&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&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;"models"&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;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Qwen Coder 32B"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"provider"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ollama"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"qwen2.5-coder:32b"&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;&lt;strong&gt;With OpenCode:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# OpenCode auto-detects Ollama&lt;/span&gt;
opencode &lt;span class="nt"&gt;--provider&lt;/span&gt; ollama &lt;span class="nt"&gt;--model&lt;/span&gt; qwen2.5-coder:32b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Model Selection Guide
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your Hardware&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Quality&lt;/th&gt;
&lt;th&gt;Speed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Laptop (16GB RAM, no GPU)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;qwen2.5-coder:7b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Good for completions, basic refactoring&lt;/td&gt;
&lt;td&gt;~15 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Desktop (32GB RAM, RTX 3060)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;qwen2.5-coder:32b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Excellent — rivals cloud models for most tasks&lt;/td&gt;
&lt;td&gt;~20 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Desktop (64GB RAM, RTX 4090)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;devstral2:24b&lt;/code&gt; or &lt;code&gt;deepseek-coder-v2:33b&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Near-frontier quality&lt;/td&gt;
&lt;td&gt;~40 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server (80GB+ VRAM)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;glm-5&lt;/code&gt; via vLLM&lt;/td&gt;
&lt;td&gt;77.8% SWE-bench — competes with Claude&lt;/td&gt;
&lt;td&gt;Production speed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  When Local Beats Cloud
&lt;/h3&gt;

&lt;p&gt;Local wins when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privacy matters&lt;/strong&gt; — code never leaves your machine&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Latency matters&lt;/strong&gt; — no network round-trip, instant responses&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost matters&lt;/strong&gt; — zero marginal cost per request&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline works&lt;/strong&gt; — airplane, air-gapped environments, spotty internet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cloud wins when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Quality ceiling matters&lt;/strong&gt; — Claude/GPT-5 still beat local models on the hardest tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context window matters&lt;/strong&gt; — local 7B models max at 32K; Claude Code has 1M&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-file reasoning matters&lt;/strong&gt; — large models handle cross-file dependencies better&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You value your time&lt;/strong&gt; — setup is one pip install, not GPU driver debugging&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Honest Take on Local Quality
&lt;/h3&gt;

&lt;p&gt;Local models are genuinely good for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code completions and inline suggestions&lt;/li&gt;
&lt;li&gt;Single-file refactoring&lt;/li&gt;
&lt;li&gt;Writing tests for existing code&lt;/li&gt;
&lt;li&gt;Explaining code&lt;/li&gt;
&lt;li&gt;Documentation generation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Local models still struggle with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-file architectural changes (context window limits)&lt;/li&gt;
&lt;li&gt;Complex debugging chains (reasoning depth)&lt;/li&gt;
&lt;li&gt;Understanding project-wide patterns (needs more context than 32K)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The sweet spot:&lt;/strong&gt; Use local for the 80% of tasks that are routine, cloud for the 20% that are hard. Your average cost drops from $20/month to $3-5/month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Strategy 4: IDE + BYOK (Best of Both Worlds)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tools:&lt;/strong&gt; Cursor or Zed or Continue.dev + your preferred model&lt;/p&gt;

&lt;p&gt;All three support BYOK:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt; ($16/mo or BYOK):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Settings → Models → Add Custom Model → Your API key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Zed&lt;/strong&gt; (free, BYOK):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Settings → AI → Provider → Ollama / Anthropic / OpenAI
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Continue.dev&lt;/strong&gt; (free, any IDE):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VS Code + JetBrains support&lt;/li&gt;
&lt;li&gt;Configure any model provider in config.json&lt;/li&gt;
&lt;li&gt;Autocomplete, chat, edit, and agent modes&lt;/li&gt;
&lt;li&gt;Only tool that works in both IDEs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The $0 Starter Kit
&lt;/h2&gt;

&lt;p&gt;If you're just getting started today and want to spend nothing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Gemini CLI for cloud (1000 req/day free)&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @anthropic-ai/gemini-cli
gemini login

&lt;span class="c"&gt;# 2. Ollama for local (zero cost)&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://ollama.ai/install.sh | sh
ollama pull qwen2.5-coder:7b

&lt;span class="c"&gt;# 3. Aider to tie them together&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;aider-chat

&lt;span class="c"&gt;# Cloud mode (Gemini):&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GEMINI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-free-key
aider &lt;span class="nt"&gt;--model&lt;/span&gt; gemini/gemini-2.5-pro

&lt;span class="c"&gt;# Local mode (Ollama):&lt;/span&gt;
aider &lt;span class="nt"&gt;--model&lt;/span&gt; ollama/qwen2.5-coder:7b

&lt;span class="c"&gt;# Done. Professional AI coding setup. $0.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Next: *&lt;/em&gt;&lt;a href="https://dev.tocoming%20soon"&gt;Part 3 — What Every AI Coding Tool Gets Wrong&lt;/a&gt;** — the measurement gap. None of these tools track whether the AI is actually getting better at helping you.*&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Previous: *&lt;/em&gt;&lt;a href="https://dev.to/soulentheo/every-ai-coding-cli-in-2026-the-complete-map-30-tools-compared-2931-temp-slug-1577774"&gt;Part 1 — Every AI Coding CLI in 2026: The Complete Map&lt;/a&gt;***&lt;/p&gt;

</description>
      <category>ai</category>
      <category>tutorial</category>
      <category>opensource</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Every AI Coding CLI in 2026: The Complete Map (30+ Tools Compared)</title>
      <dc:creator>David Van Assche (S.L)</dc:creator>
      <pubDate>Wed, 15 Apr 2026 12:18:51 +0000</pubDate>
      <link>https://dev.to/soulentheo/every-ai-coding-cli-in-2026-the-complete-map-30-tools-compared-4gob</link>
      <guid>https://dev.to/soulentheo/every-ai-coding-cli-in-2026-the-complete-map-30-tools-compared-4gob</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;A sequel to &lt;a href="https://dev.to/soulentheo/the-best-free-cheap-ai-friendly-cli-and-coding-environments-16m6"&gt;my most-read post&lt;/a&gt;. Six months later, the landscape exploded. Here's every tool that matters, what it costs, and what it actually does.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The AI coding tool market went from "a few options" to "overwhelming" in about six months. New CLIs weekly. Pricing wars. Open-source alternatives rivaling the paid ones. Chinese models hitting 77%+ on SWE-bench. Free tiers that would've been unthinkable a year ago.&lt;/p&gt;

&lt;p&gt;I've tested, researched, or tracked 30+ tools. Here's the complete map.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tier 1: Cloud Subscriptions (Pay Monthly, They Host Everything)
&lt;/h2&gt;

&lt;p&gt;These are the "just works" options. You pay, they handle models, infrastructure, and updates.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Monthly Cost&lt;/th&gt;
&lt;th&gt;Model(s)&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;SWE-bench&lt;/th&gt;
&lt;th&gt;Notable&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://claude.ai/code" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$17-20 (Pro), $100-200 (Max)&lt;/td&gt;
&lt;td&gt;Claude 4.6 Opus/Sonnet&lt;/td&gt;
&lt;td&gt;Terminal agent&lt;/td&gt;
&lt;td&gt;80.9%&lt;/td&gt;
&lt;td&gt;1M context. Uses 5.5x fewer tokens than Cursor. Full hook/plugin system.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://cursor.com" rel="noopener noreferrer"&gt;Cursor&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$16/mo&lt;/td&gt;
&lt;td&gt;Multi-model&lt;/td&gt;
&lt;td&gt;VS Code fork&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;td&gt;Largest community. Best tab completions. Most polished UX.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://windsurf.ai" rel="noopener noreferrer"&gt;Windsurf&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$20/mo&lt;/td&gt;
&lt;td&gt;Multi-model&lt;/td&gt;
&lt;td&gt;IDE&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;td&gt;"Flows" persistent context. Raised from $15 in March 2026.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://openai.com/codex" rel="noopener noreferrer"&gt;Codex CLI&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;With ChatGPT Plus ($20/mo)&lt;/td&gt;
&lt;td&gt;GPT-5 series&lt;/td&gt;
&lt;td&gt;CLI + Desktop&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Cloud sandbox execution. Autonomous agent.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://antigravity.codes" rel="noopener noreferrer"&gt;Antigravity&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$20 (Pro), $250 (Ultra)&lt;/td&gt;
&lt;td&gt;Gemini&lt;/td&gt;
&lt;td&gt;Agent IDE&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Google's entry. Parallel agents. Built-in Chrome for testing.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://github.com/mistralai/mistral-vibe" rel="noopener noreferrer"&gt;Mistral Vibe&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$15/mo (Le Chat Pro)&lt;/td&gt;
&lt;td&gt;Devstral 2&lt;/td&gt;
&lt;td&gt;CLI&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Apache 2.0 source code. Paid models.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;&lt;a href="https://ampcode.com" rel="noopener noreferrer"&gt;Amp&lt;/a&gt;&lt;/strong&gt; (Sourcegraph)&lt;/td&gt;
&lt;td&gt;Free tier ($10/day cap)&lt;/td&gt;
&lt;td&gt;Multi-model&lt;/td&gt;
&lt;td&gt;CLI + IDE&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;"Deep mode" autonomous research. No markup on API costs.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The verdict:&lt;/strong&gt; Claude Code wins on capability (1M context, best SWE-bench, hook system). Cursor wins on UX. Windsurf and Antigravity bet on parallel agents. Codex bets on cloud sandboxing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Token efficiency matters more than subscription price.&lt;/strong&gt; Claude Code using 5.5x fewer tokens than Cursor means the real cost difference is bigger than the $1-4/mo subscription gap suggests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tier 2: Genuinely Free (Real Usage, No Tricks)
&lt;/h2&gt;

&lt;p&gt;These tools offer meaningful free access — not "free trial" but actually usable for daily work:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Free Tier&lt;/th&gt;
&lt;th&gt;What You Get&lt;/th&gt;
&lt;th&gt;Upgrade Path&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://github.com/google-gemini/gemini-cli" rel="noopener noreferrer"&gt;Gemini CLI&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1,000 requests/day&lt;/td&gt;
&lt;td&gt;Gemini 2.5 Pro/Flash routing. Just login with Google.&lt;/td&gt;
&lt;td&gt;Pay-as-you-go&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://github.com/features/copilot" rel="noopener noreferrer"&gt;GitHub Copilot CLI&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;50 premium requests/mo&lt;/td&gt;
&lt;td&gt;Deep GitHub integration. Natural for existing users.&lt;/td&gt;
&lt;td&gt;$10/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://aws.amazon.com/q/developer/" rel="noopener noreferrer"&gt;Amazon Q Developer&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free tier&lt;/td&gt;
&lt;td&gt;Best for AWS-heavy workflows.&lt;/td&gt;
&lt;td&gt;AWS pricing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;&lt;a href="https://kiro.dev" rel="noopener noreferrer"&gt;Kiro&lt;/a&gt;&lt;/strong&gt; (Amazon)&lt;/td&gt;
&lt;td&gt;Free tier&lt;/td&gt;
&lt;td&gt;Spec-driven: generates requirements before code. Auditable trail.&lt;/td&gt;
&lt;td&gt;TBD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://github.com/QwenLM/Qwen-Code" rel="noopener noreferrer"&gt;Qwen Code&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free API (!)&lt;/td&gt;
&lt;td&gt;Alibaba's CLI agent. Apache 2.0. Completely free API access.&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Gemini CLI at 1,000 free requests/day is the story here.&lt;/strong&gt; For many developers, this is effectively unlimited. If you're budget-constrained or evaluating, start here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qwen Code's free API&lt;/strong&gt; is underappreciated. Alibaba is subsidizing it for market share — take advantage while it lasts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tier 3: Open Source BYOK (Free Tool, Bring Your API Key)
&lt;/h2&gt;

&lt;p&gt;The largest category. Zero subscription — you pay only for model inference via API keys:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;GitHub Stars&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Model Support&lt;/th&gt;
&lt;th&gt;What Makes It Different&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://github.com/opencode-ai/opencode" rel="noopener noreferrer"&gt;OpenCode&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;140K+&lt;/td&gt;
&lt;td&gt;CLI&lt;/td&gt;
&lt;td&gt;75+ providers&lt;/td&gt;
&lt;td&gt;Universal adapter. If a model exists, OpenCode supports it.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://github.com/paul-gauthier/aider" rel="noopener noreferrer"&gt;Aider&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;39K+&lt;/td&gt;
&lt;td&gt;CLI&lt;/td&gt;
&lt;td&gt;Any (inc. local)&lt;/td&gt;
&lt;td&gt;Git-native. Auto-commits. Most mature. 4.1M installs, 15B tokens/week.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://cline.bot" rel="noopener noreferrer"&gt;Cline&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;— (5M installs)&lt;/td&gt;
&lt;td&gt;VS Code ext&lt;/td&gt;
&lt;td&gt;Any&lt;/td&gt;
&lt;td&gt;Most adopted open-source coding extension.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://continue.dev" rel="noopener noreferrer"&gt;Continue.dev&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;26K&lt;/td&gt;
&lt;td&gt;IDE ext&lt;/td&gt;
&lt;td&gt;Any&lt;/td&gt;
&lt;td&gt;Only tool with full VS Code + JetBrains support.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://github.com/block/goose" rel="noopener noreferrer"&gt;Goose&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;CLI + Desktop&lt;/td&gt;
&lt;td&gt;Any + MCP&lt;/td&gt;
&lt;td&gt;Block/Square's agent. Apache 2.0. Native MCP integration.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://github.com/RooVetGit/Roo-Code" rel="noopener noreferrer"&gt;Roo Code&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;VS Code ext&lt;/td&gt;
&lt;td&gt;Any&lt;/td&gt;
&lt;td&gt;"When other agents break down" — reputation for reliability on large multi-file changes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://openclaw.ai" rel="noopener noreferrer"&gt;OpenClaw&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;CLI&lt;/td&gt;
&lt;td&gt;GLM, MiniMax, Qwen, etc&lt;/td&gt;
&lt;td&gt;Gateway to Chinese model ecosystem.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://zed.dev" rel="noopener noreferrer"&gt;Zed&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Editor&lt;/td&gt;
&lt;td&gt;BYOK&lt;/td&gt;
&lt;td&gt;Rust-native. Fastest editor in the category.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://github.com/iflowai/iflow-cli" rel="noopener noreferrer"&gt;iFlow&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;CLI&lt;/td&gt;
&lt;td&gt;Any OpenAI-compatible&lt;/td&gt;
&lt;td&gt;SubAgents. Controlled file permissions.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://github.com/MoonshotAI/kimi-code-cli" rel="noopener noreferrer"&gt;Kimi Code CLI&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;CLI&lt;/td&gt;
&lt;td&gt;Kimi K2.5&lt;/td&gt;
&lt;td&gt;Moonshot's agent. 100-agent swarm capability.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://blackbox.ai" rel="noopener noreferrer"&gt;BLACKBOX&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Multi&lt;/td&gt;
&lt;td&gt;Proprietary + BYOK&lt;/td&gt;
&lt;td&gt;Completions + chat + search.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The real cost of BYOK:&lt;/strong&gt; With Claude Sonnet at $3/$15 per million tokens, moderate daily use runs $10-15/month. With OpenRouter, you can compare prices across 100+ models. With local models, the cost is $0.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aider remains the gold standard&lt;/strong&gt; for terminal pair-programming. Git-native workflows, clean commit history, works with everything from GPT to local Ollama models.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tier 4: Truly Local (Offline, Self-Hosted, Zero Cloud)
&lt;/h2&gt;

&lt;p&gt;For the privacy-conscious, air-gapped environments, or anyone who wants zero recurring costs:&lt;/p&gt;

&lt;h3&gt;
  
  
  Inference Runtimes
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Runtime&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;th&gt;Effort&lt;/th&gt;
&lt;th&gt;Speed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Easiest start. One command: &lt;code&gt;ollama pull qwen2.5-coder&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Minimal&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://github.com/ggml-org/llama.cpp" rel="noopener noreferrer"&gt;llama.cpp&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Maximum control. Custom compilation for your exact hardware.&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Best (tuned)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://lmstudio.ai" rel="noopener noreferrer"&gt;LM Studio&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Visual model management. Side-by-side comparison. GUI sliders.&lt;/td&gt;
&lt;td&gt;Minimal&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://github.com/vllm-project/vllm" rel="noopener noreferrer"&gt;vLLM&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Production serving. PagedAttention cuts memory 50%+. 2-4x throughput.&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Production-grade&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://tabby.tabbyml.com" rel="noopener noreferrer"&gt;Tabby&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Self-hosted copilot. Full IDE integration on your own infra.&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Best Local Coding Models (April 2026)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Params&lt;/th&gt;
&lt;th&gt;SWE-bench&lt;/th&gt;
&lt;th&gt;License&lt;/th&gt;
&lt;th&gt;Runs On&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;GLM-5&lt;/strong&gt; (Zhipu)&lt;/td&gt;
&lt;td&gt;744B MoE (40B active)&lt;/td&gt;
&lt;td&gt;77.8%&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;vLLM / llama.cpp (needs 80GB+ VRAM for full)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Kimi K2.5&lt;/strong&gt; (Moonshot)&lt;/td&gt;
&lt;td&gt;1T MoE&lt;/td&gt;
&lt;td&gt;76.8%&lt;/td&gt;
&lt;td&gt;Open&lt;/td&gt;
&lt;td&gt;Similar — enterprise hardware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Devstral 2&lt;/strong&gt; (Mistral)&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;td&gt;Ollama, llama.cpp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Qwen 2.5 Coder&lt;/strong&gt; (Alibaba)&lt;/td&gt;
&lt;td&gt;7B-72B&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;td&gt;Ollama (7B on laptop, 32B on desktop)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MiniMax M2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;230B MoE (10B active)&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Open&lt;/td&gt;
&lt;td&gt;8% of Claude's price, 2x speed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DeepSeek Coder V2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Various&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Ollama, llama.cpp&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;For a laptop:&lt;/strong&gt; Qwen 2.5 Coder 7B or DeepSeek Coder V2 7B via Ollama. Runs fine on 16GB RAM.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For a desktop with GPU:&lt;/strong&gt; Qwen 2.5 Coder 32B via Ollama. Excellent quality, runs on RTX 3060 12GB.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For a server:&lt;/strong&gt; GLM-5 or Kimi K2.5 via vLLM. These compete with Claude on coding benchmarks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tier 5: Model Routers (Connect Anything to Anything)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Router&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://github.com/decolua/9router" rel="noopener noreferrer"&gt;9router&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Connects 40+ providers to Claude Code, Cursor, Copilot, Antigravity, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://github.com/router-for-me/CLIProxyAPI" rel="noopener noreferrer"&gt;CLIProxyAPI&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Wraps Gemini CLI, Codex, Claude Code as OpenAI-compatible API. Use free Gemini models through any tool.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://openrouter.ai" rel="noopener noreferrer"&gt;OpenRouter&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Universal API gateway. Compare prices across 100+ models. Pay-per-token.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;CLIProxyAPI is wild:&lt;/strong&gt; it wraps Gemini CLI's free tier as an OpenAI-compatible API, which means you can use Gemini 2.5 Pro through Aider, Cline, or any OpenAI-compatible tool — for free.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Decision Matrix
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;If you want...&lt;/th&gt;
&lt;th&gt;Use this&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Best capability, cost be damned&lt;/td&gt;
&lt;td&gt;Claude Code (Max)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best free experience&lt;/td&gt;
&lt;td&gt;Gemini CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best open-source CLI&lt;/td&gt;
&lt;td&gt;Aider&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best IDE experience&lt;/td&gt;
&lt;td&gt;Cursor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for teams&lt;/td&gt;
&lt;td&gt;Continue.dev (VS Code + JetBrains)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zero cloud dependency&lt;/td&gt;
&lt;td&gt;Ollama + Qwen 2.5 Coder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best Chinese model access&lt;/td&gt;
&lt;td&gt;OpenClaw&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Planning before coding&lt;/td&gt;
&lt;td&gt;Kiro&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Git-native workflows&lt;/td&gt;
&lt;td&gt;Aider&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parallel agents&lt;/td&gt;
&lt;td&gt;Antigravity or Windsurf&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;&lt;em&gt;Next in this series: *&lt;/em&gt;&lt;a href="https://dev.tocoming%20soon"&gt;Part 2 — Running AI Coding Agents for Free: The Open Source &amp;amp; Local Guide&lt;/a&gt;** — deep dive into BYOK setups, local model configuration, and getting Claude-level performance without a subscription.*&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Also: *&lt;/em&gt;&lt;a href="https://dev.tocoming%20soon"&gt;Part 3 — What Every AI Coding Tool Gets Wrong&lt;/a&gt;** — the measurement gap that none of these tools address.*&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is a sequel to &lt;a href="https://dev.to/soulentheo/the-best-free-cheap-ai-friendly-cli-and-coding-environments-16m6"&gt;The best (free - cheap) AI friendly Cli and Coding environments&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devtools</category>
      <category>productivity</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Adding Epistemic Hooks to Your Workflow: From pip install to Measured AI in 5 Minutes</title>
      <dc:creator>David Van Assche (S.L)</dc:creator>
      <pubDate>Wed, 15 Apr 2026 11:29:51 +0000</pubDate>
      <link>https://dev.to/soulentheo/adding-epistemic-hooks-to-your-workflow-from-pip-install-to-measured-ai-in-5-minutes-4i7l</link>
      <guid>https://dev.to/soulentheo/adding-epistemic-hooks-to-your-workflow-from-pip-install-to-measured-ai-in-5-minutes-4i7l</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Part 4 of the &lt;a href="https://dev.to/soulentheo/your-ai-doesnt-know-what-it-doesnt-know-and-thats-the-biggest-problem-in-ai-tooling-18d"&gt;Epistemic AI series&lt;/a&gt;. Parts &lt;a href="https://dev.to/soulentheo/your-ai-doesnt-know-what-it-doesnt-know-and-thats-the-biggest-problem-in-ai-tooling-18d"&gt;1&lt;/a&gt;-&lt;a href="https://dev.to/soulentheo/grounded-calibration-vs-self-assessment-why-your-ais-confidence-score-is-lying-5h2k-temp-slug-2250063"&gt;3&lt;/a&gt; explained why measurement matters. Now: how to wire it into your actual workflow.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is the hands-on article. By the end, you'll have Empirica running in a real project with measured epistemic transactions. Everything here is copy-pasteable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.10+&lt;/li&gt;
&lt;li&gt;A git repository (any project)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://claude.ai/code" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt; (optional but recommended — gives you the full hook integration)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;empirica
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;empirica &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;span class="c"&gt;# empirica 1.8.x&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: Initialize Your Project
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;your-project
empirica project-init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates &lt;code&gt;.empirica/&lt;/code&gt; in your project root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;.empirica/
├── project.yaml          &lt;span class="c"&gt;# Project config (name, evidence profile)&lt;/span&gt;
├── config.yaml           &lt;span class="c"&gt;# Empirica settings&lt;/span&gt;
└── sessions/
    └── sessions.db       &lt;span class="c"&gt;# SQLite — all epistemic data lives here&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What just happened:&lt;/strong&gt; Your project is now registered in Empirica's workspace database. Every session, transaction, finding, and calibration score will be tracked here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Wire Into Claude Code (Recommended)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;empirica setup-claude-code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This installs hooks into Claude Code's plugin system:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hook&lt;/th&gt;
&lt;th&gt;When It Fires&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;session-init&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Conversation starts&lt;/td&gt;
&lt;td&gt;Creates session, loads context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;sentinel-gate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Every tool call&lt;/td&gt;
&lt;td&gt;Gates praxic actions behind CHECK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;pre-compact&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Before context compression&lt;/td&gt;
&lt;td&gt;Saves epistemic snapshot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;post-compact&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;After compression&lt;/td&gt;
&lt;td&gt;Restores state, continues transaction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;session-end&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Conversation ends&lt;/td&gt;
&lt;td&gt;Auto-POSTFLIGHT if needed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;After this, &lt;strong&gt;every Claude Code conversation in this project is automatically measured.&lt;/strong&gt; No manual commands needed — the hooks handle PREFLIGHT, CHECK gating, and POSTFLIGHT.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Sentinel: Investigation Before Action
&lt;/h3&gt;

&lt;p&gt;The most important hook is the &lt;strong&gt;Sentinel&lt;/strong&gt; — it intercepts every tool call and checks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Is there an open transaction? (PREFLIGHT was run)&lt;/li&gt;
&lt;li&gt;Has CHECK been passed? (Investigation is done)&lt;/li&gt;
&lt;li&gt;Is this a noetic tool (read-only) or praxic (writes/edits)?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Noetic tools&lt;/strong&gt; (Read, Grep, Glob, search) are always allowed — investigation should never be blocked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Praxic tools&lt;/strong&gt; (Edit, Write, Bash commands that modify) require a valid CHECK first. This prevents the AI from jumping straight to implementation without understanding the problem.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Without Sentinel:
  User: "Fix the auth bug"
  AI: *immediately starts editing files*  ← no investigation

With Sentinel:
  User: "Fix the auth bug"
  AI: *reads code, logs findings*          ← forced to investigate
  AI: *submits CHECK with what it learned* ← gates the transition
  AI: *now allowed to edit*                ← acts from understanding
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This isn't a bureaucratic slowdown — it's the mechanism that forces the investigation that makes the AI's work better.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Your First Measured Transaction
&lt;/h2&gt;

&lt;p&gt;If you're NOT using Claude Code (or want to understand the manual flow):&lt;/p&gt;

&lt;h3&gt;
  
  
  Open the Transaction
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;empirica session-create &lt;span class="nt"&gt;--ai-id&lt;/span&gt; claude-code
empirica preflight-submit - &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
{
  "task_context": "Investigate and fix the auth middleware bug",
  "work_type": "code",
  "vectors": {
    "know": 0.40,
    "uncertainty": 0.50,
    "context": 0.55,
    "clarity": 0.45,
    "do": 0.60,
    "engagement": 0.85
  },
  "reasoning": "Starting auth investigation. Read the bug report but haven't looked at the code yet. Moderate context from project familiarity."
}
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Be honest with the starting vectors.&lt;/strong&gt; The whole point is measuring the delta — inflating your PREFLIGHT just makes the learning look smaller.&lt;/p&gt;

&lt;h3&gt;
  
  
  Investigate and Log
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# What you discover&lt;/span&gt;
empirica finding-log &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--finding&lt;/span&gt; &lt;span class="s2"&gt;"Auth middleware chains Express next() at routes/auth.js:45. JWT validation happens in middleware, not route handler."&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--impact&lt;/span&gt; 0.5

&lt;span class="c"&gt;# What you don't know&lt;/span&gt;
empirica unknown-log &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--unknown&lt;/span&gt; &lt;span class="s2"&gt;"How does the session store handle concurrent requests? No locking visible."&lt;/span&gt;

&lt;span class="c"&gt;# Decisions you make&lt;/span&gt;
empirica decision-log &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--choice&lt;/span&gt; &lt;span class="s2"&gt;"Use httpOnly cookies for refresh tokens instead of localStorage"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--rationale&lt;/span&gt; &lt;span class="s2"&gt;"XSS attack surface reduction. localStorage is accessible to any script."&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--reversibility&lt;/span&gt; exploratory &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--confidence&lt;/span&gt; 0.8

&lt;span class="c"&gt;# What didn't work&lt;/span&gt;
empirica deadend-log &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--approach&lt;/span&gt; &lt;span class="s2"&gt;"Tried passport.js for JWT auth"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--why-failed&lt;/span&gt; &lt;span class="s2"&gt;"Adds 12 dependencies for a problem solvable with 30 lines of middleware"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These aren't just notes — they're &lt;strong&gt;grounded evidence&lt;/strong&gt; that the calibration system uses to verify your self-assessments.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gate the Transition
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;empirica check-submit - &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
{
  "vectors": {
    "know": 0.80,
    "uncertainty": 0.15,
    "context": 0.85,
    "clarity": 0.85
  },
  "reasoning": "Investigated auth chain, understand JWT flow, found the bug (session store race condition). Ready to implement fix."
}
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CHECK evaluates whether the vectors are consistent with the evidence you logged. If you claim &lt;code&gt;know: 0.80&lt;/code&gt; but logged zero findings and zero unknowns, it'll flag a rushed assessment.&lt;/p&gt;

&lt;p&gt;The decision is either &lt;code&gt;proceed&lt;/code&gt; (you can start implementing) or &lt;code&gt;investigate&lt;/code&gt; (go back and learn more).&lt;/p&gt;

&lt;h3&gt;
  
  
  Implement, Then Close
&lt;/h3&gt;

&lt;p&gt;After implementing the fix:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;empirica postflight-submit - &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
{
  "vectors": {
    "know": 0.90,
    "uncertainty": 0.08,
    "change": 0.75,
    "completion": 1.0,
    "do": 0.85
  },
  "reasoning": "Auth middleware fixed. Session store race condition resolved with mutex. Tests passing."
}
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The POSTFLIGHT triggers &lt;strong&gt;grounded verification&lt;/strong&gt; — your self-assessment is compared against deterministic evidence (test results, git diff, linter output, artifact counts). The calibration score measures the gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Read Your Calibration
&lt;/h2&gt;

&lt;p&gt;The POSTFLIGHT output includes the calibration report:&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;"calibration_score"&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.14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"grounded_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.69&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"phases"&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;"praxic"&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;"gaps"&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;"know"&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.23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"uncertainty"&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.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"change"&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.20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"coherence"&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.15&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;"sources"&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;"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;"ruff"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"git_diff"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"artifacts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"prose_quality"&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;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;&lt;strong&gt;Reading the gaps:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;know: 0.23&lt;/code&gt; — you overestimated knowledge by 0.23 (common)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;uncertainty: -0.25&lt;/code&gt; — you underestimated uncertainty by 0.25 (also common)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;change: -0.20&lt;/code&gt; — you underestimated how much you changed (git diff shows more)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;coherence: -0.15&lt;/code&gt; — code is cleaner than you thought (linter agrees)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Over time, these gaps should shrink.&lt;/strong&gt; If they don't, the AI isn't learning to predict its own performance — it's just getting more confident without getting more accurate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Check Your Diagnostic
&lt;/h2&gt;

&lt;p&gt;If anything isn't working:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;empirica diagnose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This runs 11 health checks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✅ Python version: 3.13.7 (&amp;gt;= 3.10)
✅ empirica CLI on PATH
✅ Claude config dir exists (~/.claude/)
✅ Plugin files installed
✅ settings.json valid
✅ Statusline configured
✅ Hooks registered (6/6)
✅ Marketplace registered
✅ Statusline runnable
✅ Project initialized (.empirica/ found)
✅ Active session in DB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If any check fails, the output includes the exact fix command.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You Get
&lt;/h2&gt;

&lt;p&gt;After a few sessions, you'll have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Calibration trajectory&lt;/strong&gt; — are your estimates getting more accurate?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Artifact history&lt;/strong&gt; — findings, unknowns, dead-ends, decisions, all searchable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learning deltas&lt;/strong&gt; — measurable improvement (or stagnation) per transaction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grounded evidence&lt;/strong&gt; — objective measurement that doesn't depend on self-report&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-session persistence&lt;/strong&gt; — learning survives context compaction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is epistemic infrastructure. Not a prompt. Not a wrapper. Measurement that makes the invisible visible.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Next and final: **Part 5 — The Prosodic Memory Layer&lt;/em&gt;* — how AI learns your communication patterns and adapts its voice to different platforms.*&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://github.com/Nubaeon/empirica" rel="noopener noreferrer"&gt;Empirica on GitHub&lt;/a&gt; | &lt;a href="https://dev.to/soulentheo/your-ai-doesnt-know-what-it-doesnt-know-and-thats-the-biggest-problem-in-ai-tooling-18d"&gt;Part 1&lt;/a&gt; | &lt;a href="https://dev.to/soulentheo/measuring-what-your-ai-learned-epistemic-vectors-in-practice-3jdh"&gt;Part 2&lt;/a&gt; | &lt;a href="https://dev.to/soulentheo/grounded-calibration-vs-self-assessment-why-your-ais-confidence-score-is-lying-5h2k-temp-slug-2250063"&gt;Part 3&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>tutorial</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Grounded Calibration vs Self-Assessment: Why Your AI's Confidence Score Is Lying</title>
      <dc:creator>David Van Assche (S.L)</dc:creator>
      <pubDate>Wed, 15 Apr 2026 08:53:18 +0000</pubDate>
      <link>https://dev.to/soulentheo/grounded-calibration-vs-self-assessment-why-your-ais-confidence-score-is-lying-2eg0</link>
      <guid>https://dev.to/soulentheo/grounded-calibration-vs-self-assessment-why-your-ais-confidence-score-is-lying-2eg0</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Part 3 of the &lt;a href="https://dev.to/soulentheo/your-ai-doesnt-know-what-it-doesnt-know-and-thats-the-biggest-problem-in-ai-tooling-18d"&gt;Epistemic AI series&lt;/a&gt;. Parts &lt;a href="https://dev.to/soulentheo/your-ai-doesnt-know-what-it-doesnt-know-and-thats-the-biggest-problem-in-ai-tooling-18d"&gt;1&lt;/a&gt; and &lt;a href="https://dev.to/soulentheo/measuring-what-your-ai-learned-epistemic-vectors-in-practice-3jdh"&gt;2&lt;/a&gt; introduced the epistemic gap and how to measure it. Now: why the AI's self-report can't be trusted — and what to do about it.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Your AI tells you it's 85% confident. But what does that number actually mean? Nobody checked. There's no ground truth. It's a student grading their own exam, and the grade is always suspiciously high.&lt;/p&gt;

&lt;p&gt;This is the calibration problem, and it's more insidious than it sounds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Self-Assessment Is Structurally Unreliable
&lt;/h2&gt;

&lt;p&gt;When an AI agent reports its epistemic vectors (know = 0.85, uncertainty = 0.10), it's making a &lt;strong&gt;prediction about its own internal state&lt;/strong&gt;. This prediction is corrupted by at least three systematic biases:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The Completion Bias
&lt;/h3&gt;

&lt;p&gt;LLMs are trained to produce helpful, confident responses. When asked "how well do you understand this?", the model gravitates toward the answer that sounds most competent. This isn't deception — it's the same optimization pressure that makes models agree with user corrections even when the user is wrong.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# What the AI reports:&lt;/span&gt;
know: 0.85  "I understand the codebase well"

&lt;span class="gh"&gt;# What the evidence shows:&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; 3 test failures in the module it just edited
&lt;span class="p"&gt;-&lt;/span&gt; 2 linter violations it didn't catch
&lt;span class="p"&gt;-&lt;/span&gt; Referenced a function that was renamed 3 commits ago
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The gap between 0.85 and the evidence isn't malice. It's structural overconfidence baked into the training objective.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The Anchoring Effect
&lt;/h3&gt;

&lt;p&gt;Once the AI declares a PREFLIGHT vector (say, know = 0.60), it anchors to that starting point. The POSTFLIGHT assessment tends to show "improvement" regardless of what actually happened:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PREFLIGHT:  know = 0.60  (declared at session start)
POSTFLIGHT: know = 0.85  (looks like learning!)

But did it actually learn?
Or did it just decide enough time had passed?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without external verification, you can't distinguish genuine learning from narrative completion — the AI telling a story about getting smarter because that's the expected arc.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The Unknown Unknowns
&lt;/h3&gt;

&lt;p&gt;The most dangerous blind spot: the AI can't report uncertainty about things it doesn't know it doesn't know. If it never investigated the session store's concurrency model, it won't report low confidence on session handling — because it doesn't know there's something to be uncertain about.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI: "I'm confident about the auth implementation" (know = 0.85)
Reality: auth works, but the session store race condition
         it didn't investigate will break under load.
         The AI doesn't report uncertainty because
         it never discovered the problem exists.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Grounded Verification: The Fix
&lt;/h2&gt;

&lt;p&gt;The solution isn't better prompting or asking the AI to "be more honest." The solution is &lt;strong&gt;deterministic evidence&lt;/strong&gt; — measurements that don't come from the AI's self-report.&lt;/p&gt;

&lt;h3&gt;
  
  
  What "Grounded" Means
&lt;/h3&gt;

&lt;p&gt;Grounded evidence comes from services that produce facts, not opinions:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Evidence Source&lt;/th&gt;
&lt;th&gt;What It Measures&lt;/th&gt;
&lt;th&gt;Maps To&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;pytest results&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tests passing/failing&lt;/td&gt;
&lt;td&gt;know, do, change&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ruff/pylint&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Code quality violations&lt;/td&gt;
&lt;td&gt;coherence, signal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;radon&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cyclomatic complexity&lt;/td&gt;
&lt;td&gt;density, clarity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;git diff&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lines actually changed&lt;/td&gt;
&lt;td&gt;change, state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;pyright&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Type safety&lt;/td&gt;
&lt;td&gt;coherence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Finding count&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Investigation breadth&lt;/td&gt;
&lt;td&gt;know, signal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Unknown resolution rate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Learning evidence&lt;/td&gt;
&lt;td&gt;do, completion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;textstat&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Prose readability&lt;/td&gt;
&lt;td&gt;clarity, density&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These sources don't lie. They don't have completion bias. They don't anchor to previous assessments.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Calibration Score
&lt;/h3&gt;

&lt;p&gt;Empirica computes a calibration score by comparing the AI's self-assessment against grounded evidence:&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="na"&gt;Self-assessed&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  &lt;span class="s"&gt;know = 0.85, uncertainty = &lt;/span&gt;&lt;span class="m"&gt;0.10&lt;/span&gt;
&lt;span class="na"&gt;Grounded&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;       &lt;span class="s"&gt;know = 0.62, uncertainty = &lt;/span&gt;&lt;span class="m"&gt;0.35&lt;/span&gt;

&lt;span class="na"&gt;Calibration gaps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;know&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;        &lt;span class="s"&gt;overestimate by &lt;/span&gt;&lt;span class="m"&gt;0.23&lt;/span&gt;
  &lt;span class="na"&gt;uncertainty&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;underestimate by &lt;/span&gt;&lt;span class="m"&gt;0.25&lt;/span&gt;
  &lt;span class="na"&gt;coherence&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;   &lt;span class="s"&gt;underestimate by 0.20 (tests show code is cleaner than claimed)&lt;/span&gt;
  &lt;span class="na"&gt;change&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;      &lt;span class="s"&gt;underestimate by 0.40 (git shows more change than reported)&lt;/span&gt;

&lt;span class="na"&gt;Calibration score&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;0.14 (0.0 = perfect, 1.0 = completely uncalibrated)&lt;/span&gt;
&lt;span class="na"&gt;Grounded coverage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;69% (evidence covers 69% of claimed vectors)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is real output from an actual Empirica session. The AI was overestimating its knowledge by 0.23 and underestimating its uncertainty by 0.25 — the most common pattern we see.&lt;/p&gt;

&lt;h3&gt;
  
  
  Coverage Matters
&lt;/h3&gt;

&lt;p&gt;Not all vectors can be grounded. If the AI is doing research (no code written), there's no pytest or git diff to verify against. Empirica tracks &lt;strong&gt;grounded coverage&lt;/strong&gt; — what percentage of the self-assessment has deterministic evidence behind it.&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="c1"&gt;# When coverage &amp;lt; 30%, calibration is declared insufficient
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;grounded_coverage&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;calibration_status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;insufficient_evidence&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="c1"&gt;# Self-assessment stands — but honestly flagged as unverified
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is more honest than producing a phantom calibration score from sparse data. When we don't have enough evidence, we say so — and the self-assessment stands unchallenged rather than being falsely "verified."&lt;/p&gt;

&lt;h2&gt;
  
  
  What Happens Over Time
&lt;/h2&gt;

&lt;p&gt;The calibration gap should shrink across transactions. If the AI consistently overestimates &lt;code&gt;know&lt;/code&gt; by 0.23, the system provides feedback:&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="na"&gt;Previous transaction feedback&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;overestimate_tendency&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;know&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;underestimate_tendency&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;uncertainty&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;coherence&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;change&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

  &lt;span class="na"&gt;Note&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Be&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;more&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;cautious&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;with&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;know&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;estimates,&lt;/span&gt;
         &lt;span class="s"&gt;less&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;cautious&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;with&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;uncertainty&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;estimates."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This feedback is injected into the next PREFLIGHT. Over time, the AI's self-assessments become more accurate — not because the model changed, but because the &lt;strong&gt;measurement infrastructure&lt;/strong&gt; makes overconfidence visible and costly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Sycophancy Connection
&lt;/h2&gt;

&lt;p&gt;Calibration and sycophancy are the same problem viewed from different angles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sycophancy&lt;/strong&gt;: AI agrees with the user to avoid conflict&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overconfidence&lt;/strong&gt;: AI agrees with itself about its own competence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both come from the same training pressure: produce the response that seems most helpful and aligned. Grounded verification breaks both patterns by introducing an external reference point that neither the AI nor the user controls.&lt;/p&gt;

&lt;p&gt;When the AI says "know = 0.85" and the evidence says "know = 0.62", there's no way to talk your way out of it. The tests failed. The linter found issues. The gap is measured.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;empirica
&lt;span class="nb"&gt;cd &lt;/span&gt;your-project &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; empirica project-init

&lt;span class="c"&gt;# After a work session, check calibration:&lt;/span&gt;
empirica postflight-submit - &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
{
  "vectors": {"know": 0.85, "uncertainty": 0.10, "change": 0.70},
  "reasoning": "Implemented auth middleware, tests passing"
}
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# The POSTFLIGHT output shows:&lt;/span&gt;
&lt;span class="c"&gt;#   calibration_score: 0.14&lt;/span&gt;
&lt;span class="c"&gt;#   grounded_coverage: 69%&lt;/span&gt;
&lt;span class="c"&gt;#   gaps: know overestimate by 0.23, uncertainty underestimate by 0.25&lt;/span&gt;
&lt;span class="c"&gt;#   sources: pytest, ruff, git_diff, artifacts, prose_quality&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The calibration loop runs automatically on every POSTFLIGHT. No extra commands needed — just work normally and measure honestly.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Next: **Part 4 — Adding Epistemic Hooks to Your Workflow&lt;/em&gt;* — the step-by-step integration tutorial. From &lt;code&gt;pip install&lt;/code&gt; to your first measured transaction in 5 minutes.*&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://github.com/Nubaeon/empirica" rel="noopener noreferrer"&gt;Empirica on GitHub&lt;/a&gt; | &lt;a href="https://dev.to/soulentheo/your-ai-doesnt-know-what-it-doesnt-know-and-thats-the-biggest-problem-in-ai-tooling-18d"&gt;Part 1&lt;/a&gt; | &lt;a href="https://dev.to/soulentheo/measuring-what-your-ai-learned-epistemic-vectors-in-practice-3jdh"&gt;Part 2&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>opensource</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Measuring What Your AI Learned: Epistemic Vectors in Practice</title>
      <dc:creator>David Van Assche (S.L)</dc:creator>
      <pubDate>Mon, 13 Apr 2026 17:45:28 +0000</pubDate>
      <link>https://dev.to/soulentheo/measuring-what-your-ai-learned-epistemic-vectors-in-practice-3jdh</link>
      <guid>https://dev.to/soulentheo/measuring-what-your-ai-learned-epistemic-vectors-in-practice-3jdh</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Part 2 of the &lt;a href="https://dev.to/soulentheo/your-ai-doesnt-know-what-it-doesnt-know-and-thats-the-biggest-problem-in-ai-tooling-309a-temp-slug-5818830"&gt;Epistemic AI series&lt;/a&gt;. In Part 1, we defined the problem: AI tools don't track what they know. Here, we make it measurable.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When we talk about "what the AI knows," we're not being metaphorical. Knowledge has structure, and that structure is measurable — not perfectly, but well enough to catch the failures that matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 13 Epistemic Vectors
&lt;/h2&gt;

&lt;p&gt;Empirica tracks 13 dimensions of an AI's knowledge state. Not as a gimmick — each vector maps to a specific class of failure you've seen in practice:&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;vectors&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;know&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;        &lt;span class="mf"&gt;0.65&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Domain understanding
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;uncertainty&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.35&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# What I DON'T know (explicit!)
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;context&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="mf"&gt;0.70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Surrounding state awareness
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;clarity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="mf"&gt;0.80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# How clear the path forward is
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;coherence&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Internal consistency
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;signal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;      &lt;span class="mf"&gt;0.60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Information quality vs noise
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;density&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="mf"&gt;0.55&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Relevant knowledge per unit context
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;state&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;       &lt;span class="mf"&gt;0.70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Current system/project state
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;change&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;      &lt;span class="mf"&gt;0.40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Amount of change made
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;completion&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="mf"&gt;0.30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Progress toward goal
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;impact&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;      &lt;span class="mf"&gt;0.65&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Significance of work
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;engagement&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="mf"&gt;0.85&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# How actively working the problem
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;do&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;          &lt;span class="mf"&gt;0.70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Ability to execute
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why 13?&lt;/strong&gt; Because we kept finding failure modes that weren't captured:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;know&lt;/code&gt; without &lt;code&gt;uncertainty&lt;/code&gt; = overconfident AI&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;clarity&lt;/code&gt; without &lt;code&gt;signal&lt;/code&gt; = clear path built on noise&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;completion&lt;/code&gt; without &lt;code&gt;change&lt;/code&gt; = claiming done but nothing happened&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;engagement&lt;/code&gt; without &lt;code&gt;do&lt;/code&gt; = actively spinning without capability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each pair creates a &lt;strong&gt;tension&lt;/strong&gt; that prevents gaming. You can't claim high &lt;code&gt;know&lt;/code&gt; while &lt;code&gt;uncertainty&lt;/code&gt; is also high — the measurement catches the contradiction.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Transaction Lifecycle
&lt;/h2&gt;

&lt;p&gt;Vectors aren't static. They change as the AI works. The &lt;strong&gt;epistemic transaction&lt;/strong&gt; is the measurement window:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PREFLIGHT → [investigate] → CHECK → [implement] → POSTFLIGHT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  PREFLIGHT: Declare Your Baseline
&lt;/h3&gt;

&lt;p&gt;Before starting work, the AI declares what it thinks it knows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;empirica preflight-submit - &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
{
  "task_context": "Implement JWT auth middleware",
  "vectors": {
    "know": 0.45,
    "uncertainty": 0.40,
    "context": 0.60,
    "clarity": 0.50
  },
  "reasoning": "Read the route definitions but haven't explored 
    the middleware chain yet. Moderate context from project structure."
}
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the &lt;strong&gt;starting measurement&lt;/strong&gt;. It's a prediction: "Here's how well I think I understand this before investigating."&lt;/p&gt;

&lt;h3&gt;
  
  
  Investigation Phase (Noetic)
&lt;/h3&gt;

&lt;p&gt;The AI reads code, searches patterns, builds understanding. Everything it discovers gets logged:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# What you learned&lt;/span&gt;
empirica finding-log &lt;span class="nt"&gt;--finding&lt;/span&gt; &lt;span class="s2"&gt;"Auth middleware uses Express next() 
  pattern at routes/auth.js:45"&lt;/span&gt; &lt;span class="nt"&gt;--impact&lt;/span&gt; 0.5

&lt;span class="c"&gt;# What you don't know&lt;/span&gt;
empirica unknown-log &lt;span class="nt"&gt;--unknown&lt;/span&gt; &lt;span class="s2"&gt;"How are user roles differentiated? 
  No role field in JWT payload schema."&lt;/span&gt;

&lt;span class="c"&gt;# What didn't work&lt;/span&gt;
empirica deadend-log &lt;span class="nt"&gt;--approach&lt;/span&gt; &lt;span class="s2"&gt;"Tried passport.js integration"&lt;/span&gt;   &lt;span class="nt"&gt;--why-failed&lt;/span&gt; &lt;span class="s2"&gt;"Too heavy for JWT-only auth, would add 12 dependencies"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These aren't just notes — they're &lt;strong&gt;grounded evidence&lt;/strong&gt; that the calibration system uses to verify self-assessments.&lt;/p&gt;

&lt;h3&gt;
  
  
  CHECK: Gate the Transition
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;empirica check-submit - &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
{
  "vectors": {
    "know": 0.82,
    "uncertainty": 0.15,
    "context": 0.85,
    "clarity": 0.88
  },
  "reasoning": "Investigated middleware chain, understand JWT flow, 
    found role definitions in JWT claims. Ready to implement."
}
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The system evaluates: did the vectors change in a way that's consistent with the evidence logged? If the AI claims &lt;code&gt;know: 0.82&lt;/code&gt; but logged zero findings and zero unknowns, that's a rushed assessment — the gate catches it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is the critical insight: you can't skip investigation and go straight to acting.&lt;/strong&gt; The measurement &lt;em&gt;forces&lt;/em&gt; understanding before execution.&lt;/p&gt;

&lt;h3&gt;
  
  
  POSTFLIGHT: Measure the Learning
&lt;/h3&gt;

&lt;p&gt;After implementation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;empirica postflight-submit - &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
{
  "vectors": {
    "know": 0.90,
    "uncertainty": 0.08,
    "change": 0.80,
    "completion": 1.0
  },
  "reasoning": "Auth middleware implemented with role guards. 
    Unit tests passing. Learned about Express 5 async changes."
}
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;strong&gt;delta&lt;/strong&gt; between PREFLIGHT and POSTFLIGHT is the learning:&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="na"&gt;know&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;        &lt;span class="s"&gt;0.45 → 0.90  (+0.45)&lt;/span&gt;  &lt;span class="c1"&gt;# Learned a lot&lt;/span&gt;
&lt;span class="na"&gt;uncertainty&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;0.40 → 0.08  (-0.32)&lt;/span&gt;  &lt;span class="c1"&gt;# Resolved most unknowns&lt;/span&gt;
&lt;span class="na"&gt;change&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;      &lt;span class="s"&gt;0.00 → 0.80  (+0.80)&lt;/span&gt;  &lt;span class="c1"&gt;# Made substantial changes&lt;/span&gt;
&lt;span class="na"&gt;completion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  &lt;span class="s"&gt;0.00 → 1.00  (+1.00)&lt;/span&gt;  &lt;span class="c1"&gt;# Goal met&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This delta IS the measurement. Over time, you can see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the AI consistently overestimate its starting knowledge?&lt;/li&gt;
&lt;li&gt;Does it underestimate uncertainty?&lt;/li&gt;
&lt;li&gt;Do its estimates get more accurate across sessions?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Grounded Verification: The Part That Keeps It Honest
&lt;/h2&gt;

&lt;p&gt;Self-assessment alone is self-serving. The grounded verification layer compares the AI's claims against &lt;strong&gt;deterministic evidence&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="c1"&gt;# AI claims: know=0.90, change=0.80
# Grounded evidence:
&lt;/span&gt;&lt;span class="n"&gt;evidence&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;test_results&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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;passed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;failed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;     &lt;span class="c1"&gt;# 3 failures!
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ruff_violations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                              &lt;span class="c1"&gt;# lint issues
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;git_diff_lines&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;156&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                            &lt;span class="c1"&gt;# real change metric
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;findings_logged&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                              &lt;span class="c1"&gt;# investigation breadth
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;unknowns_resolved&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                            &lt;span class="c1"&gt;# learning evidence
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Grounded calibration:
# - test failures → know is probably ~0.75, not 0.90
# - git diff confirms change=0.80 is reasonable
# - 5 findings + 3 resolved unknowns → investigation was real
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The calibration score measures the distance between self-assessment and grounded evidence. &lt;strong&gt;A score of 0.0 means perfect calibration.&lt;/strong&gt; In practice, we see scores of 0.10-0.30 — the AI is usually overconfident, and the grounded layer catches it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Looks Like in Practice
&lt;/h2&gt;

&lt;p&gt;Here's a real POSTFLIGHT from an Empirica session (editing for clarity):&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="na"&gt;Calibration score&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.134&lt;/span&gt;
&lt;span class="na"&gt;Grounded coverage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;69.2%&lt;/span&gt;

&lt;span class="na"&gt;Gaps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;know&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;        &lt;span class="s"&gt;overestimate by 0.33  (claimed 0.82, evidence shows 0.49)&lt;/span&gt;
  &lt;span class="na"&gt;uncertainty&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;underestimate by 0.13 (claimed 0.15, evidence shows 0.28)&lt;/span&gt;
  &lt;span class="na"&gt;coherence&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;   &lt;span class="s"&gt;underestimate by 0.20 (claimed 0.75, evidence shows 0.95)&lt;/span&gt;

&lt;span class="na"&gt;Sources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;artifacts, codebase_model, prose_quality,&lt;/span&gt; 
         &lt;span class="s"&gt;document_metrics, source_quality, action_verification&lt;/span&gt;
&lt;span class="na"&gt;Sources failed&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[]&lt;/span&gt;  &lt;span class="s"&gt;(all evidence collectors healthy)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The AI was overestimating its knowledge and underestimating its uncertainty — the most common pattern. &lt;strong&gt;But now we can see it&lt;/strong&gt;, which means we can correct for it in the next transaction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;empirica
&lt;span class="nb"&gt;cd &lt;/span&gt;your-project
empirica project-init
empirica setup-claude-code

&lt;span class="c"&gt;# Start a measured session:&lt;/span&gt;
empirica session-create &lt;span class="nt"&gt;--ai-id&lt;/span&gt; claude-code
&lt;span class="c"&gt;# → Opens transaction, gates investigation before action&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The framework is open source, the measurement is real, and the calibration improves over time. Not because the model gets better — because the &lt;strong&gt;measurement infrastructure&lt;/strong&gt; makes overconfidence visible.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Next in the series: **Part 3 — Grounded Calibration vs Self-Assessment&lt;/em&gt;* — why the AI's self-report is structurally unreliable and how deterministic evidence changes the game.*&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://github.com/Nubaeon/empirica" rel="noopener noreferrer"&gt;Empirica on GitHub&lt;/a&gt; | &lt;a href="https://dev.to/soulentheo/your-ai-doesnt-know-what-it-doesnt-know-and-thats-the-biggest-problem-in-ai-tooling-309a-temp-slug-5818830"&gt;Part 1: Your AI Doesn't Know What It Doesn't Know&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>tutorial</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Your AI Doesn't Know What It Doesn't Know — And That's the Biggest Problem in AI Tooling</title>
      <dc:creator>David Van Assche (S.L)</dc:creator>
      <pubDate>Mon, 13 Apr 2026 17:45:27 +0000</pubDate>
      <link>https://dev.to/soulentheo/your-ai-doesnt-know-what-it-doesnt-know-and-thats-the-biggest-problem-in-ai-tooling-18d</link>
      <guid>https://dev.to/soulentheo/your-ai-doesnt-know-what-it-doesnt-know-and-thats-the-biggest-problem-in-ai-tooling-18d</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"The most dangerous thing isn't an AI that's wrong. It's an AI that's wrong and confident about it."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every developer working with AI agents has hit this wall: your tool says something with absolute confidence, and it's completely wrong. Not because the model is bad — because &lt;strong&gt;nothing in the system tracks what it actually knows versus what it's guessing.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the epistemic gap, and it's the single biggest unsolved problem in AI developer tooling.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: Confidence Without Calibration
&lt;/h2&gt;

&lt;p&gt;When you use Claude, ChatGPT, or any LLM-based tool:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It never says "I'm 60% sure about this"&lt;/li&gt;
&lt;li&gt;It doesn't distinguish between "I read this in the codebase" and "I'm inferring this from patterns"&lt;/li&gt;
&lt;li&gt;After a long conversation, it loses track of what it verified versus what it assumed&lt;/li&gt;
&lt;li&gt;When context compresses, learned insights vanish silently&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn't a model problem. GPT-5 won't fix it. Claude Opus 5 won't fix it. &lt;strong&gt;It's a measurement problem at the infrastructure layer.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What Actually Happens in Practice
&lt;/h3&gt;

&lt;p&gt;You ask your AI to update the auth middleware. It says "Done!" with 100% confidence. But:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did it check if JWT was already configured? Maybe.&lt;/li&gt;
&lt;li&gt;Did it verify the session store compatibility? Probably not.&lt;/li&gt;
&lt;li&gt;Will it remember this decision next session? No.&lt;/li&gt;
&lt;li&gt;Did it investigate before acting, or just pattern-match? You'll never know.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AI doesn't track:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What it &lt;strong&gt;investigated&lt;/strong&gt; versus what it &lt;strong&gt;assumed&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Which assumptions turned out to be &lt;strong&gt;wrong&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;What it learned that should &lt;strong&gt;persist&lt;/strong&gt; across sessions&lt;/li&gt;
&lt;li&gt;How its confidence &lt;strong&gt;should change&lt;/strong&gt; based on evidence&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why This Matters More Than You Think
&lt;/h2&gt;

&lt;p&gt;If you're building AI-assisted workflows, this gap compounds:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No learning curve.&lt;/strong&gt; Your AI makes the same mistakes on day 100 that it made on day 1, because nothing measures whether its predictions improve.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Invisible context loss.&lt;/strong&gt; When conversations compact (Claude Code, Cursor, etc. all do this), the AI loses track of what it verified. It re-assumes things it already checked.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sycophancy masquerading as agreement.&lt;/strong&gt; When you push back on a wrong answer, the AI often just agrees with you — not because you're right, but because agreement is the path of least resistance. Without calibration, there's no mechanism to distinguish "user is right, I should update" from "user is insistent, I should capitulate."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No grounded verification.&lt;/strong&gt; The AI self-reports its confidence. Nobody checks. It's like a student grading their own exam.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What Epistemic Measurement Looks Like
&lt;/h2&gt;

&lt;p&gt;Imagine if your AI tooling tracked 13 dimensions of its own knowledge state:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Vector&lt;/th&gt;
&lt;th&gt;What It Measures&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;know&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;How well it understands the domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;uncertainty&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;What it DOESN'T know (explicit)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;context&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Understanding of surrounding state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;clarity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;How clear the path forward is&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;signal&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Quality of information vs noise&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;change&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Amount of change made&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;completion&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Progress toward current goal&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;And imagine it measured these at three points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PREFLIGHT&lt;/strong&gt;: "Here's what I think I know before starting"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CHECK&lt;/strong&gt;: "Here's what I learned during investigation — am I ready to act?"
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;POSTFLIGHT&lt;/strong&gt;: "Here's what I actually learned and changed"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The delta between PREFLIGHT and POSTFLIGHT IS the learning. Not a vibe. A measurement.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Grounded Calibration Loop
&lt;/h2&gt;

&lt;p&gt;Self-assessment alone is sycophantic. What you actually need is a comparison between what the AI &lt;em&gt;claims&lt;/em&gt; to know and what &lt;em&gt;deterministic evidence&lt;/em&gt; shows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI self-assessment&lt;/strong&gt;: know = 0.85, uncertainty = 0.10&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grounded evidence&lt;/strong&gt; (test results, linter, git diff): know = 0.62, uncertainty = 0.35&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calibration gap&lt;/strong&gt;: overestimating know by 0.23, underestimating uncertainty by 0.25&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adjustment signal&lt;/strong&gt;: "Be more cautious with know estimates in future transactions"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The grounded evidence comes from &lt;strong&gt;deterministic services&lt;/strong&gt; — test results, linter output, git metrics, documentation coverage — things that don't lie. When the AI says "I know this codebase well" but the test suite shows 3 failures in the module it just edited, the gap is measurable.&lt;/p&gt;

&lt;p&gt;This is what calibration means: &lt;strong&gt;the distance between what you claim to know and what the evidence shows.&lt;/strong&gt; Over time, this distance should shrink. If it doesn't, the AI isn't getting better — it's just getting more confident.&lt;/p&gt;

&lt;h2&gt;
  
  
  This Isn't Theory — It's Infrastructure
&lt;/h2&gt;

&lt;p&gt;We've been building this measurement layer as an open-source framework called &lt;a href="https://github.com/Nubaeon/empirica" rel="noopener noreferrer"&gt;Empirica&lt;/a&gt;. It's a Python CLI that hooks into Claude Code (and any LLM tool that supports hooks) to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Track epistemic vectors across sessions&lt;/li&gt;
&lt;li&gt;Gate actions behind investigation (you can't write code until you've demonstrated understanding)&lt;/li&gt;
&lt;li&gt;Verify self-assessments against deterministic evidence&lt;/li&gt;
&lt;li&gt;Persist learning across context compaction&lt;/li&gt;
&lt;li&gt;Measure calibration drift over time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's not a wrapper or a prompt. It's measurement infrastructure that makes the epistemic gap visible and closes it over time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting Started
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt; Python 3.10+, a project with a git repo, and optionally &lt;a href="https://claude.ai/code" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt; for the full hook integration.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install Empirica&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;empirica

&lt;span class="c"&gt;# Initialize tracking in your project&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;your-project
empirica project-init

&lt;span class="c"&gt;# If using Claude Code, wire up the hooks:&lt;/span&gt;
empirica setup-claude-code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. From this point, every Claude Code conversation in this project is measured — PREFLIGHT declares baseline knowledge, CHECK gates the transition from investigation to action, and POSTFLIGHT captures what was actually learned. The Sentinel (an automated gate) ensures investigation happens before implementation.&lt;/p&gt;

&lt;p&gt;Without Claude Code, you can still use the CLI directly to track any AI workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Declare what you know before starting&lt;/span&gt;
empirica preflight-submit - &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s1"&gt;'{"vectors": {"know": 0.5, "uncertainty": 0.4}, "reasoning": "Starting auth investigation"}'&lt;/span&gt;

&lt;span class="c"&gt;# Log what you discover&lt;/span&gt;
empirica finding-log &lt;span class="nt"&gt;--finding&lt;/span&gt; &lt;span class="s2"&gt;"JWT middleware uses Express next() pattern"&lt;/span&gt; &lt;span class="nt"&gt;--impact&lt;/span&gt; 0.5

&lt;span class="c"&gt;# Measure what you learned&lt;/span&gt;
empirica postflight-submit - &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s1"&gt;'{"vectors": {"know": 0.85, "uncertainty": 0.1}, "reasoning": "Auth flow fully understood"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What's Next in This Series
&lt;/h2&gt;

&lt;p&gt;This is Part 1 of a series on epistemic AI — making AI tools that actually know what they know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Part 2&lt;/strong&gt;: &lt;a href="https://dev.to/soulentheo/measuring-what-your-ai-learned-epistemic-vectors-in-practice-4j3l-temp-slug-4262219"&gt;Measuring What Your AI Learned — epistemic vectors in practice&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Part 3&lt;/strong&gt;: Grounded Calibration vs Self-Assessment — why self-reporting fails&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Part 4&lt;/strong&gt;: Adding Epistemic Hooks to Your Workflow — integration tutorial&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Part 5&lt;/strong&gt;: The Voice Layer — how AI learns your communication patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each article will have runnable code, real measurements, and honest assessments of what works and what doesn't. Because that's the whole point — &lt;strong&gt;if you're not honest about uncertainty, you're just building a more eloquent liar.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Empirica is open source (MIT) and under active development. We're a small team in Vienna building measurement infrastructure for AI. If this resonates, &lt;a href="https://github.com/Nubaeon/empirica" rel="noopener noreferrer"&gt;check us out on GitHub&lt;/a&gt; or follow this series for the deep dives.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devtools</category>
      <category>python</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Why Your AI Agent Needs Memory That Decays (and How Qdrant Makes It Work)</title>
      <dc:creator>David Van Assche (S.L)</dc:creator>
      <pubDate>Fri, 06 Mar 2026 13:30:22 +0000</pubDate>
      <link>https://dev.to/soulentheo/why-your-ai-agent-needs-memory-that-decays-and-how-qdrant-makes-it-work-f9m</link>
      <guid>https://dev.to/soulentheo/why-your-ai-agent-needs-memory-that-decays-and-how-qdrant-makes-it-work-f9m</guid>
      <description>&lt;p&gt;I've been building an open-source epistemic measurement framework called Empirica, and one of the core challenges I ran into early on was memory — not the "stuff vectors in a database and retrieve them" kind, but memory that actually behaves like memory. Things fade. Patterns strengthen with repetition. A dead-end from three weeks ago should still surface when the AI is about to walk into the same wall, but a finding from a one-off debugging session probably shouldn't carry the same weight six months later.&lt;/p&gt;

&lt;p&gt;That's where Qdrant comes in, and I want to share how we're using it because it's a fairly different use case from the typical RAG setup.&lt;/p&gt;

&lt;h3&gt;
  
  
  The problem with flat retrieval
&lt;/h3&gt;

&lt;p&gt;Most RAG implementations treat memory as a flat store — embed a chunk, retrieve by similarity, done. That works for document Q&amp;amp;A, but it falls apart when you need temporal awareness. An AI agent working across sessions and projects needs to know not just &lt;em&gt;what&lt;/em&gt; was discovered, but &lt;em&gt;when&lt;/em&gt;, &lt;em&gt;how confident we were&lt;/em&gt;, and &lt;em&gt;whether that knowledge is still valid&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Think about how your own memory works — you don't recall every detail of every workday equally. The time you accidentally dropped the production database? That stays vivid. The routine PR you reviewed last Tuesday? Already fading. That asymmetry is functional, not a bug.&lt;/p&gt;

&lt;h3&gt;
  
  
  Two memory types, one vector store
&lt;/h3&gt;

&lt;p&gt;We use Qdrant for two distinct memory layers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Eidetic memory&lt;/strong&gt; — facts with confidence scores. These are discrete epistemic artifacts: findings ("the auth system uses JWT refresh with 15min expiry"), dead-ends ("tried migrating to async but the ORM doesn't support it"), decisions ("chose SQLite over Postgres because single-user, no server needed"), mistakes ("forgot to check null on the config reload path"). Each carries a confidence score that gets challenged when new evidence contradicts it — a finding's confidence drops if a related finding surfaces that undermines it. Think of it as an immune system: findings are antigens, lessons are antibodies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Episodic memory&lt;/strong&gt; — session narratives with temporal decay. These capture the arc of a work session: what was the AI investigating, what did it learn, how did its confidence change from start to finish. Episodic memories naturally decay over time — a session from yesterday is more relevant than one from last month, unless the pattern keeps repeating, in which case it strengthens instead of fading.&lt;/p&gt;

&lt;p&gt;Both live in Qdrant as separate collections per project, which gives us clean isolation and lets us do cross-project pattern discovery when we need it.&lt;/p&gt;

&lt;h3&gt;
  
  
  The retrieval side — Noetic RAG
&lt;/h3&gt;

&lt;p&gt;I've been calling this approach "Noetic RAG" — retrieval augmented generation on the &lt;em&gt;thinking&lt;/em&gt;, not just the artifacts. When an AI agent starts a new session, we don't just load documents. We load:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dead-ends that match the current task (so it doesn't repeat failed approaches)&lt;/li&gt;
&lt;li&gt;Mistake patterns with prevention strategies&lt;/li&gt;
&lt;li&gt;Decisions and their rationale (so it understands &lt;em&gt;why&lt;/em&gt; things are the way they are)&lt;/li&gt;
&lt;li&gt;Episodic arcs from similar sessions (temporal context)&lt;/li&gt;
&lt;li&gt;Cross-project patterns (if the same anti-pattern appeared in project A, surface it in project B)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The similarity search here isn't just cosine distance on the task description — it's filtered by recency, weighted by confidence, and scoped by project (with optional global reach for cross-project learnings).&lt;/p&gt;

&lt;h3&gt;
  
  
  What this looks like in practice
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Focused search: eidetic facts + episodic session arcs
&lt;/span&gt;&lt;span class="n"&gt;empirica&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;auth token rotation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Full search: all collections
&lt;/span&gt;&lt;span class="n"&gt;empirica&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;auth token rotation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="nb"&gt;all&lt;/span&gt;

&lt;span class="c1"&gt;# Include cross-project patterns
&lt;/span&gt;&lt;span class="n"&gt;empirica&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;auth token rotation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="k"&gt;global&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When context compacts (and it will — Claude Code's 200k window fills up fast), the bootstrap reloads ~800 tokens of epistemically ranked context instead of trying to reconstruct everything from scratch. Findings, unknowns, active goals, architectural decisions — weighted by confidence and recency.&lt;/p&gt;

&lt;h3&gt;
  
  
  The temporal dimension
&lt;/h3&gt;

&lt;p&gt;This is the part that makes Qdrant particularly well-suited. We store timestamps and decay parameters as payload fields, and filter on them at query time. A dead-end from yesterday with high confidence outranks a finding from last month with medium confidence. But a pattern that's been confirmed three times across two projects? That climbs in relevance regardless of age.&lt;/p&gt;

&lt;p&gt;The decay isn't a fixed curve — it's modulated by reinforcement. Every time a pattern re-emerges, its effective age resets. Qdrant's payload filtering makes this efficient: we can do the temporal math at query time without re-embedding anything.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why this matters beyond the obvious
&lt;/h3&gt;

&lt;p&gt;The real value isn't just "AI remembers things" — it's that the memory is &lt;em&gt;epistemically grounded&lt;/em&gt;. Every artifact has uncertainty quantification. Every session has calibration data (how accurate was the AI's self-assessment compared to objective evidence like test results and code quality metrics). The memory doesn't just tell you what happened — it tells you how much to trust what happened.&lt;/p&gt;

&lt;p&gt;After 5,600+ measured transactions, the calibration data shows AI agents consistently overestimate their own confidence by 20-40%. Having memory that carries that calibration forward means the system gets more honest over time, not just more knowledgeable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Try it
&lt;/h3&gt;

&lt;p&gt;Empirica is MIT licensed and open source. If you're building anything where AI agents need to remember across sessions — especially if temporal awareness matters — the prosodic/episodic/eidetic architecture might be worth looking at.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/Nubaeon/empirica" rel="noopener noreferrer"&gt;github.com/Nubaeon/empirica&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://getempirica.com" rel="noopener noreferrer"&gt;getempirica.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Install:&lt;/strong&gt; &lt;code&gt;pip install empirica&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy to answer questions about the Qdrant integration or the broader noetic RAG architecture.&lt;/p&gt;

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