<?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: Azan Hyder</title>
    <description>The latest articles on DEV Community by Azan Hyder (@azank1).</description>
    <link>https://dev.to/azank1</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%2F4048140%2F50858050-e55e-4de9-b324-10688545e390.jpg</url>
      <title>DEV Community: Azan Hyder</title>
      <link>https://dev.to/azank1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/azank1"/>
    <language>en</language>
    <item>
      <title>PromptLoop</title>
      <dc:creator>Azan Hyder</dc:creator>
      <pubDate>Tue, 28 Jul 2026 13:44:37 +0000</pubDate>
      <link>https://dev.to/azank1/promptloop-5d89</link>
      <guid>https://dev.to/azank1/promptloop-5d89</guid>
      <description>&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/azank1" rel="noopener noreferrer"&gt;
        azank1
      &lt;/a&gt; / &lt;a href="https://github.com/azank1/loop-llm" rel="noopener noreferrer"&gt;
        loop-llm
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      MCP server that observes every prompt, scores quality in real time, and closes the loop with iterative refinement. Built on FastMCP, SQLite, and Bayesian priors — no extra LLM required.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;PromptLoop&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/azank1/loop-llm" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a49fdb81ce5ba05a0b083cd246de4deba8739ea212eda2e3055b836e3fbc8b40/68747470733a2f2f726561646d652d747970696e672d7376672e64656d6f6c61622e636f6d3f666f6e743d4a6574427261696e732b4d6f6e6f267765696768743d3630302673697a653d32322670617573653d3130303026636f6c6f723d3030434646462663656e7465723d74727565267643656e7465723d747275652677696474683d373030266c696e65733d596f75722b6167656e742b736169642b69742b776f726b732e3b50726f6d70744c6f6f702b69732b7468652b726563656970742e3b45766572792b737465702532432b696e646570656e64656e746c792b76657269666965642e3b4769742d7374616d7065642b61756469742b747261696c2532432b7065722b70726f6a6563742e3b4c6f63616c2d66697273742532432b6d6f64656c2d61676e6f737469632532432b6e6f2b4150492b6b65793b4f70656e2b536f757263652b2545322538302539342b4d49542b4c6963656e736564" alt="Typing SVG"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/azank1/loop-llm/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/azank1/loop-llm/actions/workflows/ci.yml/badge.svg" alt="CI"&gt;&lt;/a&gt;
&lt;a href="https://opensource.org/licenses/MIT" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fdf2982b9f5d7489dcf44570e714e3a15fce6253e0cc6b5aa61a075aac2ff71b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d79656c6c6f772e737667" alt="License: MIT"&gt;&lt;/a&gt;
&lt;a href="https://pypi.org/project/loopllm/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/4f4cf7c5ec270c5bea5b0150177362c04c7a0a27e02001f74f4596a0422d2d56/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507950492d6c6f6f706c6c6d2d626c7565" alt="PyPI"&gt;&lt;/a&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=loopllm.loopllm-prompt-gauge" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/2bf4cd08c1e35c078b110b667d859d529cac44fb28a2be69ceb04ac71f1a6aca/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5653253230436f64652d457874656e73696f6e2d3030374143433f6c6f676f3d76697375616c2d73747564696f2d636f6465" alt="VS Code Extension"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Your agent said it works. PromptLoop is the receipt.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cursor, Copilot, Claude Code — every agent ends a task with "done, all tests pass."
Sometimes that's true. PromptLoop (package: &lt;code&gt;loopllm&lt;/code&gt;) sits between your IDE agent
and the model, scores each step the agent submits through &lt;strong&gt;two independent
channels&lt;/strong&gt; (a deterministic floor plus an LLM critic — the stricter score wins)
and stamps the verdicts onto your git history as an &lt;strong&gt;audit trail&lt;/strong&gt; you can review
export, or gate CI on. No API key, no cloud, nothing leaves your machine.&lt;/p&gt;
&lt;p&gt;What a caught lie looks like (real tool output):&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;loopllm_loop_start(goal="make the failing test pass", task_type="bugfix")
  → { suggested_budget: 3, quality_threshold: 0.8, evaluator_type: "composite" }
loopllm_loop_step(session_id, step_output="pytest: 3 failed, 12 passed")
  → {
      decision: "continue",
      score: 0.0,
      channel_a_score: 0.0,      ← deterministic floor: "tests passed" not found
      channel_b_score: 0.55,     ← LLM critic was more forgiving — vetoed
      deficiencies: ["Required pattern not&lt;/code&gt;&lt;/pre&gt;…&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/azank1/loop-llm" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Every coding agent ends a task the same way: &lt;em&gt;"done, all tests pass."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Sometimes that's true. Sometimes the tests didn't pass. Sometimes the agent re-ran nothing, changed two lines, and declared victory because the loop hit its iteration budget — or worse, because it graded its own task.&lt;/p&gt;

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

&lt;p&gt;Today I ran PromptLoop against my own agent in Cursor, on my own repo, and let it veto the agent's claims in real time. This is what happened, with the actual scores.&lt;/p&gt;

&lt;h2&gt;
  
  
  The moment it mattered
&lt;/h2&gt;

&lt;p&gt;I gave the agent a bugfix goal and let it run. On step 1, the agent's posture was &lt;em&gt;"tests look fine enough to ship."&lt;/em&gt; The artifact it submitted told a different story: &lt;code&gt;2 failed, 3 passed&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Here's the verdict that came back:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;step 1  score=0.333  CONTINUE  Required pattern not found: tests passed
&lt;/code&gt;&lt;/pre&gt;

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

&lt;p&gt;The agent &lt;em&gt;reported&lt;/em&gt; progress. The receipt said no. The loop kept going.&lt;/p&gt;

&lt;p&gt;Step 2 came back greener but still incomplete — 0.667, CONTINUE. Step 3 finally submitted a real, full pytest log with the pass pattern present:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;step 3  score=1.000  STOP  Goal reached ≥ 0.80
&lt;/code&gt;&lt;/pre&gt;

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

&lt;p&gt;Trajectory: &lt;strong&gt;0.333 → 0.667 → 1.000.&lt;/strong&gt; The loop didn't stop when the agent felt done. It stopped when the evidence cleared the bar.&lt;/p&gt;
&lt;h2&gt;
  
  
  How the veto works
&lt;/h2&gt;

&lt;p&gt;PromptLoop is an open-source MCP server that sits between your IDE agent and the model. Agents don't get to say "done" — they submit &lt;em&gt;artifacts&lt;/em&gt; (test logs, diffs, summaries), and each one is scored through two channels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Channel A&lt;/strong&gt; — a deterministic floor: regex patterns, JSON validity, completeness checks. It can't be argued with.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Channel B&lt;/strong&gt; — an independent LLM critic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The final score is &lt;code&gt;min(A, B)&lt;/code&gt; — either channel can veto. Optimism doesn't get a vote.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Full honesty on this capture:&lt;/strong&gt; in today's session, MCP sampling for Channel B wasn't available, so this run was &lt;code&gt;cdv_mode: channel_a_only&lt;/code&gt;. The deterministic floor alone still caught the false "done." I'm telling you this because the raw JSON says it — and because a tool whose entire pitch is &lt;em&gt;receipts&lt;/em&gt; doesn't get to overclaim.&lt;/p&gt;
&lt;h2&gt;
  
  
  It also fails your bad prompts at the door
&lt;/h2&gt;

&lt;p&gt;The other half of the product is Prompt Lab — a live prompt-quality scratchpad in the sidebar. Think ESLint, but for the ask itself. From today's session, same machine, real scores:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prompt&lt;/th&gt;
&lt;th&gt;Grade&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;write me some code&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;F&lt;/td&gt;
&lt;td&gt;38%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add exponential backoff retry…&lt;/td&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;51%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full spec: backoff + raise + tests + type hints + pytest&lt;/td&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;72%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

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

&lt;p&gt;38% → 72% by adding constraints, not vibes. Bad prompts fail in the lab instead of in production, where they cost you tokens and a debugging session.&lt;/p&gt;
&lt;h2&gt;
  
  
  The audit trail
&lt;/h2&gt;

&lt;p&gt;Every verified step is stamped with the git commit that was HEAD at the time. &lt;code&gt;loopllm audit --since origin/main&lt;/code&gt; gives you a reviewable report of what the agent did on your branch and how each step was verified. &lt;code&gt;loopllm audit-gate&lt;/code&gt; reads it back in CI — no verified receipt, no merge.&lt;/p&gt;

&lt;p&gt;Under the hood: Bayesian priors per repo learn how many steps &lt;em&gt;your&lt;/em&gt; bugfixes actually take, stored in per-project SQLite. Local-first, no API key, nothing leaves your machine.&lt;/p&gt;
&lt;h2&gt;
  
  
  What broke while dogfooding
&lt;/h2&gt;

&lt;p&gt;Because receipts cut both ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The MCP server launched with &lt;code&gt;cwd=$HOME&lt;/code&gt; and started writing receipts under the wrong project ID — Loop Monitor looked empty until I fixed project scoping to prefer &lt;code&gt;WORKSPACE_FOLDER_PATHS&lt;/code&gt;. If you upgrade, restart MCP.&lt;/li&gt;
&lt;li&gt;Channel B needs host sampling support; on a host without it you get Channel A only. Still useful — the floor still vetoes — but it's not full dual-verify, and I won't screenshot it as if it were.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both are documented in the README under Known Limitations.&lt;/p&gt;
&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pipx install "loopllm[mcp]"
loopllm install-mcp --ide cursor --rules
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;VS Code Marketplace: &lt;strong&gt;loopllm Prompt Gauge&lt;/strong&gt;. Works with Cursor, VS Code, and Claude Code. MIT licensed.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/azank1" rel="noopener noreferrer"&gt;
        azank1
      &lt;/a&gt; / &lt;a href="https://github.com/azank1/loop-llm" rel="noopener noreferrer"&gt;
        loop-llm
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      MCP server that observes every prompt, scores quality in real time, and closes the loop with iterative refinement. Built on FastMCP, SQLite, and Bayesian priors — no extra LLM required.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;PromptLoop&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://github.com/azank1/loop-llm" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a49fdb81ce5ba05a0b083cd246de4deba8739ea212eda2e3055b836e3fbc8b40/68747470733a2f2f726561646d652d747970696e672d7376672e64656d6f6c61622e636f6d3f666f6e743d4a6574427261696e732b4d6f6e6f267765696768743d3630302673697a653d32322670617573653d3130303026636f6c6f723d3030434646462663656e7465723d74727565267643656e7465723d747275652677696474683d373030266c696e65733d596f75722b6167656e742b736169642b69742b776f726b732e3b50726f6d70744c6f6f702b69732b7468652b726563656970742e3b45766572792b737465702532432b696e646570656e64656e746c792b76657269666965642e3b4769742d7374616d7065642b61756469742b747261696c2532432b7065722b70726f6a6563742e3b4c6f63616c2d66697273742532432b6d6f64656c2d61676e6f737469632532432b6e6f2b4150492b6b65793b4f70656e2b536f757263652b2545322538302539342b4d49542b4c6963656e736564" alt="Typing SVG"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/azank1/loop-llm/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/azank1/loop-llm/actions/workflows/ci.yml/badge.svg" alt="CI"&gt;&lt;/a&gt;
&lt;a href="https://opensource.org/licenses/MIT" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fdf2982b9f5d7489dcf44570e714e3a15fce6253e0cc6b5aa61a075aac2ff71b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d79656c6c6f772e737667" alt="License: MIT"&gt;&lt;/a&gt;
&lt;a href="https://pypi.org/project/loopllm/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/4f4cf7c5ec270c5bea5b0150177362c04c7a0a27e02001f74f4596a0422d2d56/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507950492d6c6f6f706c6c6d2d626c7565" alt="PyPI"&gt;&lt;/a&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=loopllm.loopllm-prompt-gauge" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/2bf4cd08c1e35c078b110b667d859d529cac44fb28a2be69ceb04ac71f1a6aca/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5653253230436f64652d457874656e73696f6e2d3030374143433f6c6f676f3d76697375616c2d73747564696f2d636f6465" alt="VS Code Extension"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Your agent said it works. PromptLoop is the receipt.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cursor, Copilot, Claude Code — every agent ends a task with "done, all tests pass."
Sometimes that's true. PromptLoop (package: &lt;code&gt;loopllm&lt;/code&gt;) sits between your IDE agent
and the model, scores each step the agent submits through &lt;strong&gt;two independent
channels&lt;/strong&gt; (a deterministic floor plus an LLM critic — the stricter score wins)
and stamps the verdicts onto your git history as an &lt;strong&gt;audit trail&lt;/strong&gt; you can review
export, or gate CI on. No API key, no cloud, nothing leaves your machine.&lt;/p&gt;
&lt;p&gt;What a caught lie looks like (real tool output):&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;loopllm_loop_start(goal="make the failing test pass", task_type="bugfix")
  → { suggested_budget: 3, quality_threshold: 0.8, evaluator_type: "composite" }
loopllm_loop_step(session_id, step_output="pytest: 3 failed, 12 passed")
  → {
      decision: "continue",
      score: 0.0,
      channel_a_score: 0.0,      ← deterministic floor: "tests passed" not found
      channel_b_score: 0.55,     ← LLM critic was more forgiving — vetoed
      deficiencies: ["Required pattern not&lt;/code&gt;&lt;/pre&gt;…&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/azank1/loop-llm" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;If your agent has ever gaslit you about a passing test, a ⭐ tells me this problem is as common as I think it is. And if you dogfood it and catch a false "done" of your own — open an issue with the receipt. Those are my favorite kind.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>python</category>
      <category>opensource</category>
    </item>
    <item>
      <title>SDCA-Raqqr</title>
      <dc:creator>Azan Hyder</dc:creator>
      <pubDate>Tue, 28 Jul 2026 13:43:38 +0000</pubDate>
      <link>https://dev.to/azank1/sdca-raqqr-2f9f</link>
      <guid>https://dev.to/azank1/sdca-raqqr-2f9f</guid>
      <description>&lt;p&gt;The model: RAQQR — Regressed Asymmetric Quantile... (fit on log₁₀ price vs ln time since genesis).&lt;br&gt;
7 quantile bands from Q1% to Q99%. The tails get different curvature — because BTC's upside and downside tails don't behave the same.&lt;br&gt;
Bands are a pure function of the date. Deterministic, reproducible, no black box.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/azank1" rel="noopener noreferrer"&gt;
        azank1
      &lt;/a&gt; / &lt;a href="https://github.com/azank1/sdca-raqqr" rel="noopener noreferrer"&gt;
        sdca-raqqr
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Bitcoin valuation and DCA backtest library. Implements the RAQQR asymmetric tail-curvature rainbow model to score market risk (0–100) and simulate accumulation/distribution strategies against historical price data.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;sdca-raqqr&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Bitcoin RAQQR Rainbow Valuation + Risk-Scored DCA Backtest Library&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/b8cadaa967891081f8f165695470689986c028821dd8a040132f6e661795dc0d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c7565"&gt;&lt;img src="https://camo.githubusercontent.com/b8cadaa967891081f8f165695470689986c028821dd8a040132f6e661795dc0d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c7565" alt="License"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/e801a66299d2c15286fe0fee660d9ffa666c1c5576e5e1536acc07b49ce8ac8f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f707974686f6e2d332e31302532422d626c7565"&gt;&lt;img src="https://camo.githubusercontent.com/e801a66299d2c15286fe0fee660d9ffa666c1c5576e5e1536acc07b49ce8ac8f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f707974686f6e2d332e31302532422d626c7565" alt="Python"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/e76c6af27e7ed4623d4f2d583c925a0a4fcb180a83fcc4b4267d01d10725c18f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f74657374732d31302532307061737365642d627269676874677265656e"&gt;&lt;img src="https://camo.githubusercontent.com/e76c6af27e7ed4623d4f2d583c925a0a4fcb180a83fcc4b4267d01d10725c18f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f74657374732d31302532307061737365642d627269676874677265656e" alt="Tests"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/bea300653187a2964449205c6af326abcca9310578ba65ec35206b750a73f79b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6d6f64656c2d52415151522d6f72616e6765"&gt;&lt;img src="https://camo.githubusercontent.com/bea300653187a2964449205c6af326abcca9310578ba65ec35206b750a73f79b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6d6f64656c2d52415151522d6f72616e6765" alt="Model"&gt;&lt;/a&gt;
&lt;a href="https://sdca-raqqr-ndabr4wdankxgrrpep9gzk.streamlit.app/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e22e91d715a7462b7a137a320950ffd2f39c32ae9b47eb953023c39cca64f2a9/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f64617368626f6172642d73747265616d6c69742d4646344234423f6c6f676f3d73747265616d6c6974266c6f676f436f6c6f723d7768697465" alt="Live Dashboard"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bitcoin valuation and DCA backtest library. Implements the &lt;strong&gt;RAQQR asymmetric
tail-curvature rainbow&lt;/strong&gt; model to score market risk (0–100) and simulate
accumulation/distribution strategies against historical price data.&lt;/p&gt;
&lt;p&gt;The numbers this library produces match the reference HTML artifact's default
configuration — proven by a cross-implementation parity test, not assumed.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Interactive Dashboard&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://sdca-raqqr-ndabr4wdankxgrrpep9gzk.streamlit.app/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fazank1%2Fsdca-raqqr%2FHEAD%2Fassets%2Fdashboard.gif" alt="Open dashboard"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Live at → &lt;strong&gt;&lt;a href="https://sdca-raqqr-ndabr4wdankxgrrpep9gzk.streamlit.app/" rel="nofollow noopener noreferrer"&gt;sdca-raqqr.streamlit.app&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/azank1/sdca-raqqr/assets/quickstart.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fazank1%2Fsdca-raqqr%2FHEAD%2Fassets%2Fquickstart.gif" alt="quickstart demo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it does&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Valuation bands&lt;/strong&gt; — computes 7 RAQQR quantile price bands (Q1%→Q99%) for any date from 2009 onward; these are the statistical "rainbow" rails&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risk score&lt;/strong&gt; — maps today's price against the bands to a 0–100 EQM risk number (low = historically cheap, high = historically expensive)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Composite signal&lt;/strong&gt; — blends the EQM z-score with optional extra indicators (Sharpe, CBPL) into a single &lt;code&gt;composite_risk&lt;/code&gt; value&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DCA backtest&lt;/strong&gt; — simulates a piecewise-linear allocation curve: buy X% of cash when risk is low, sell Y% of BTC when…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/azank1/sdca-raqqr" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Today's reading: price is sitting below the Q1% band.&lt;br&gt;
EQM risk score: 1.0 / 100 — the most extreme "historically cheap" print the model can produce.&lt;/p&gt;

&lt;p&gt;gauge&lt;/p&gt;

&lt;p&gt;The risk score maps price position between the bands onto 0–100 in log space:&lt;br&gt;
🟢 &amp;lt;25 accumulate · 🟡 25–50 watch · 🟠 50–75 caution · 🔴 &amp;gt;75 distribute&lt;br&gt;
One number, updated daily, live on the dashboard.&lt;/p&gt;

&lt;p&gt;Then the fun part: an editable allocation curve.&lt;br&gt;
"Buy X% of my cash when risk is 10. Sell Y% of my BTC when risk is 90."&lt;br&gt;
Drag the curve, re-run the backtest, compare against lump-sum. Conservative / Default / Aggressive presets included.&lt;br&gt;
bactest&lt;/p&gt;

&lt;p&gt;the caveats&lt;br&gt;
Coefficients are full-sample fits → backtests are in-sample, illustrative, NOT a track record • No fees/slippage modeled yet • The score saturates at the extremes. It's in the README. DYOR, always. Not financial advice.&lt;br&gt;
the quant devs; parity-tested to floating point&lt;br&gt;
The repo's least flashy and most important feature: the Python core is parity-tested against the original JavaScript implementation to rtol = 1e-12. A Node script dumps golden band values from the verbatim JS formula; pytest asserts the Python port matches to floating point. One coefficients file is the single source of truth for both implementations, so the web frontend and the Python library can never silently drift apart.&lt;br&gt;
Ten tests cover the parity contract, the signal interpolation against an independent reference implementation, and the backtest's compounding math against closed-form results.&lt;br&gt;
bash&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2080234056458080490-700" src="https://platform.twitter.com/embed/Tweet.html?id=2080234056458080490"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2080234056458080490-700');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2080234056458080490&amp;amp;theme=dark"
  }



&lt;br&gt;
&lt;strong&gt;Check Out the article on X ^&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>web3</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The five properties are only my draft, which one would you cut?</title>
      <dc:creator>Azan Hyder</dc:creator>
      <pubDate>Tue, 28 Jul 2026 13:37:49 +0000</pubDate>
      <link>https://dev.to/azank1/the-five-properties-are-only-my-draft-which-one-would-you-cut-19k8</link>
      <guid>https://dev.to/azank1/the-five-properties-are-only-my-draft-which-one-would-you-cut-19k8</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/azank1/composer-harness-46bk" class="crayons-story__hidden-navigation-link"&gt;Composer Harness&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/azank1" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4048140%2F50858050-e55e-4de9-b324-10688545e390.jpg" alt="azank1 profile" class="crayons-avatar__image" width="381" height="381"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/azank1" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Azan Hyder
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Azan Hyder
                
              
              &lt;div id="story-author-preview-content-4254636" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/azank1" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4048140%2F50858050-e55e-4de9-b324-10688545e390.jpg" class="crayons-avatar__image" alt="" width="381" height="381"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Azan Hyder&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/azank1/composer-harness-46bk" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 28&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/azank1/composer-harness-46bk" id="article-link-4254636"&gt;
          Composer Harness
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/python"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;python&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/azank1/composer-harness-46bk#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Composer Harness</title>
      <dc:creator>Azan Hyder</dc:creator>
      <pubDate>Tue, 28 Jul 2026 13:20:19 +0000</pubDate>
      <link>https://dev.to/azank1/composer-harness-46bk</link>
      <guid>https://dev.to/azank1/composer-harness-46bk</guid>
      <description>&lt;p&gt;&lt;em&gt;Field notes on the missing layer of the agent stack.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The fastest standardization in dev tool history
&lt;/h2&gt;

&lt;p&gt;Eighteen months ago, "how does an agent call a tool?" had no standard answer. Every framework invented its own. Then the industry speedran one:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;November 2024.&lt;/strong&gt; Anthropic open sources MCP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;March 2025.&lt;/strong&gt; OpenAI adopts it across ChatGPT and the Agents SDK.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;April 2025.&lt;/strong&gt; Google announces A2A with 50+ launch partners.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;August 2025.&lt;/strong&gt; IBM's ACP merges into A2A. The protocols are already consolidating.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Late 2025.&lt;/strong&gt; Both MCP and A2A land at the Linux Foundation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By December 2025, Anthropic's ecosystem update was counting &lt;strong&gt;10,000+ active public MCP servers&lt;/strong&gt; and &lt;strong&gt;97M+ monthly SDK downloads&lt;/strong&gt;. The official registry hovers near 10K records. Around 16,000 GitHub repos carry the &lt;code&gt;mcp-server&lt;/code&gt; topic. A2A passed &lt;strong&gt;150 supporting organizations&lt;/strong&gt; by April 2026.&lt;/p&gt;

&lt;p&gt;The protocols won. Faster than REST won, by most measures.&lt;/p&gt;

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




&lt;h2&gt;
  
  
  And yet every real stack is held together by hand
&lt;/h2&gt;

&lt;p&gt;Here is the thing the adoption numbers hide: &lt;strong&gt;nobody runs one protocol.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Industry survey data puts the typical MCP environment at &lt;strong&gt;2 to 7 configured servers&lt;/strong&gt;. A serious deployment also runs long lived agent to agent tasks, A2A's entire reason to exist, since MCP is the wrong shape for stateful, multi turn delegation. Then there is the long tail of software that has no API at all and gets driven through computer use.&lt;/p&gt;

&lt;p&gt;Each of those pairs is connected by hand written glue. Bespoke routing. Bespoke auth handoffs. Bespoke output parsing. Bespoke retry logic. Every team writes it, every team maintains it, none of it is shared.&lt;/p&gt;

&lt;p&gt;The community saw this coming. When A2A launched, the top reaction was essentially: &lt;em&gt;"We already have MCP. Why do we need another standard?"&lt;/em&gt; The honest answer is that they solve different halves of the problem. The honest problem is that &lt;strong&gt;nobody standardized the layer that composes them.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And it is not a theoretical pain. Zuplo's State of MCP 2025 report found &lt;strong&gt;security and access control is the #1 blocker&lt;/strong&gt; to MCP in production, ahead of any capability gap. The tools work. Operating them &lt;em&gt;together&lt;/em&gt; doesn't.&lt;/p&gt;

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




&lt;h2&gt;
  
  
  The bottleneck moved, and almost nobody followed it
&lt;/h2&gt;

&lt;p&gt;The most useful idea in the 2026 "loop engineering" discourse is this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In any agent loop, the verifier is the bottleneck. Not the model.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Generation is cheap and spins forever. The loop produces value only as fast as something can judge &lt;em&gt;ship it, retry, or stop&lt;/em&gt;. Andrew Ng talks about evaluators. Karpathy frames the whole craft as generation and verification. The practitioners writing about loop engineering all land on the same gate.&lt;/p&gt;

&lt;p&gt;Now multiply that by composition.&lt;/p&gt;

&lt;p&gt;One agent, one loop, one verifier. Hard, but understood. N agents across M protocols inside a single goal? The verification surface explodes. Which step failed? Was the output even structured? Did the &lt;em&gt;right&lt;/em&gt; agent get called? Was it &lt;em&gt;allowed&lt;/em&gt; to do that? Single agent loop tools don't answer these questions, because they were never asked to.&lt;/p&gt;

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




&lt;h2&gt;
  
  
  Chat output makes it worse
&lt;/h2&gt;

&lt;p&gt;Even when a multi agent run works, the result arrives as prose.&lt;/p&gt;

&lt;p&gt;A chat bubble can't be checked against a schema. It can't be diffed between runs. It can't be monitored. It evaporates the moment you scroll. If the verifier is the bottleneck, then &lt;strong&gt;output you can't verify is output you can't trust.&lt;/strong&gt; Prose is the least verifiable format our industry has ever shipped at scale.&lt;/p&gt;

&lt;p&gt;Structured output is not a UX preference. It is a precondition for verification.&lt;/p&gt;




&lt;h2&gt;
  
  
  So what would the missing layer look like?
&lt;/h2&gt;

&lt;p&gt;Sit with the problem long enough and a spec starts writing itself. MCP and A2A standardize how a message gets from A to B. They say nothing about how a dozen independently running agents get planned into one goal, called in the right order, authenticated, verified, and rendered. That missing layer is an &lt;strong&gt;agent harness&lt;/strong&gt;. Here is what it would need:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Protocol agnostic dispatch.&lt;/strong&gt; MCP and A2A today, n8n or OpenAPI or LangGraph servers tomorrow, through thin bridges that &lt;em&gt;inherit&lt;/em&gt; auth, retries, and payments instead of rebuilding them per protocol. MCP and A2A should be just the first two bridges.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discovery treated as retrieval.&lt;/strong&gt; Not "stuff every agent into the context window and pray." Search. Filter, rank, inject only the relevant agents as tools, only when this turn needs them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verification as pipeline policy, with receipts.&lt;/strong&gt; Structural checks today, semantic judging tomorrow, always explicit about which one you are getting. Every step gets a verdict, and a finished run should be exportable as evidence, not just a transcript you have to trust.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured output contracts.&lt;/strong&gt; Dashboards, not chat bubbles. Output that persists, and output you can check.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identity and scope as contract.&lt;/strong&gt; Agents that declare what they are &lt;em&gt;allowed&lt;/em&gt; to do, in a versioned spec that can't break underneath the people building on it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nothing on this list is a model problem. It is orchestration, observability, and contract design.&lt;/p&gt;

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




&lt;h2&gt;
  
  
  The question
&lt;/h2&gt;

&lt;p&gt;The protocols standardized in eighteen months. The composition layer is roughly where MCP was in late 2024: everyone needs it, nobody has named it, and the glue code piles up.&lt;/p&gt;

&lt;p&gt;So I will ask you what I have been asking myself:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What would you put in the harness layer?&lt;/strong&gt; What is the property I am missing that would make multi protocol agent runs trustworthy in production? And what is on my list that you think is wrong?&lt;/p&gt;

&lt;p&gt;I have been building one answer for a while. More on that this week.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Sources and further reading:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Model_Context_Protocol" rel="noopener noreferrer"&gt;Model Context Protocol, Wikipedia&lt;/a&gt; (launch timeline, OpenAI adoption, Linux Foundation move)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://glukhov.org/post/2025/12/model-context-protocol-2025/" rel="noopener noreferrer"&gt;The State of MCP and A2A in 2025, O. Glukhov&lt;/a&gt; (10K+ servers, 97M monthly downloads, A2A ecosystem count, the "we already have MCP" debate)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mcpmanager.ai/blog/statistics/model-context-protocol-mcp-usage-stats" rel="noopener noreferrer"&gt;MCP usage statistics roundup, MCPManager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://zuplo.com/learning-center/mcp-report" rel="noopener noreferrer"&gt;State of MCP 2025, Zuplo&lt;/a&gt; (security as the #1 production blocker)&lt;/li&gt;
&lt;li&gt;Loop Engineering in AI Agents, AI Builder Club, 2026 (the verifier is the bottleneck frame)&lt;/li&gt;
&lt;/ul&gt;

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