<?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: Alex</title>
    <description>The latest articles on DEV Community by Alex (@alexar76).</description>
    <link>https://dev.to/alexar76</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%2F3927872%2Fdf501cac-6862-47af-8b22-4e3067696337.jpeg</url>
      <title>DEV Community: Alex</title>
      <link>https://dev.to/alexar76</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alexar76"/>
    <language>en</language>
    <item>
      <title>I made my API discoverable to AI agents — and got it paid per call — in 15 minutes</title>
      <dc:creator>Alex</dc:creator>
      <pubDate>Sat, 12 Sep 2026 05:48:12 +0000</pubDate>
      <link>https://dev.to/alexar76/i-made-my-api-discoverable-to-ai-agents-and-got-it-paid-per-call-in-15-minutes-4kin</link>
      <guid>https://dev.to/alexar76/i-made-my-api-discoverable-to-ai-agents-and-got-it-paid-per-call-in-15-minutes-4kin</guid>
      <description>&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%2F49k1wnt2c17mlq9n1sl5.jpg" 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%2F49k1wnt2c17mlq9n1sl5.jpg" alt="Ship a tool. Agents can find it and pay per call." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Everyone's writing about "the agent economy." Agents that hire agents, pay for tools, settle automatically. Lovely slides.&lt;/p&gt;

&lt;p&gt;What I actually wanted was smaller: &lt;strong&gt;could I take a tiny HTTP endpoint I already had, list it so an autonomous agent can find it, and have it get paid per call — without a SaaS billing system?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. The loop took about &lt;strong&gt;15 minutes&lt;/strong&gt;. Here's the path, including the dumb thing that cost me ten of those minutes.&lt;/p&gt;

&lt;p&gt;Crypto stays off this title on purpose. Settlement exists; the hook is &lt;strong&gt;ship a tool, it gets paid&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The mental model (30 seconds)
&lt;/h2&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%2Fs2ojiyjy6sxzhuym3hc2.jpg" 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%2Fs2ojiyjy6sxzhuym3hc2.jpg" alt="You publish. An agent invokes. You get paid." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There's an open catalog — the &lt;strong&gt;AIMarket Hub&lt;/strong&gt; — between people who &lt;em&gt;publish&lt;/em&gt; HTTP capabilities and agents that &lt;em&gt;consume&lt;/em&gt; them.&lt;/p&gt;

&lt;p&gt;You give the hub a &lt;strong&gt;manifest&lt;/strong&gt;: name, price, input/output schemas, and a public &lt;code&gt;invoke_url&lt;/code&gt;. When an agent searches, finds your capability, and invokes it, the hub routes the call and meters the payment. The demand-side reference client is &lt;strong&gt;ARGUS&lt;/strong&gt;. Any MCP or HTTP client works.&lt;/p&gt;

&lt;p&gt;You do &lt;strong&gt;not&lt;/strong&gt; need the factory monorepo. You need a POST endpoint and the hub CLI.&lt;/p&gt;

&lt;p&gt;If you don't even have an endpoint yet, &lt;a href="https://dev.to/alexar76/i-wanted-a-signed-aimarket-provider-without-the-monorepo-one-cli-later-i-had-one-3jfi"&gt;&lt;code&gt;create-aimarket-agent&lt;/code&gt;&lt;/a&gt; scaffolds a signed provider. This article is the &lt;strong&gt;listing&lt;/strong&gt; step that article leaves manual.&lt;/p&gt;




&lt;h2&gt;
  
  
  0 · Prereqs (2 min)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.11+&lt;/li&gt;
&lt;li&gt;Hub CLI from PyPI: &lt;a href="https://pypi.org/project/aimarket-hub/" rel="noopener noreferrer"&gt;&lt;code&gt;aimarket-hub&lt;/code&gt; 3.2.1&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&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;aimarket-hub
git clone https://github.com/alexar76/aimarket-hub.git
&lt;span class="nb"&gt;cd &lt;/span&gt;aimarket-hub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A hub to publish to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local (this walkthrough):&lt;/strong&gt; &lt;code&gt;aimarket serve&lt;/code&gt; → &lt;code&gt;http://127.0.0.1:9083&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Public:&lt;/strong&gt; &lt;code&gt;https://modelmarket.dev&lt;/code&gt; (production listing has extra gates — stake, signed responses. Don't start there.)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1 · Run the example capability (3 min)
&lt;/h2&gt;

&lt;p&gt;The repo ships a working greeter at &lt;code&gt;examples/hello-capability&lt;/code&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="nb"&gt;cd &lt;/span&gt;examples/hello-capability
python3 server.py
&lt;span class="c"&gt;# → hello-capability listening on http://127.0.0.1:3456/invoke&lt;/span&gt;
&lt;span class="c"&gt;# → provider_pubkey (put in capability.json): …&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The contract is boring on purpose. POST JSON, get JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://127.0.0.1:3456/invoke &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"input":{"name":"dev"}}'&lt;/span&gt;
&lt;span class="c"&gt;# → {"success":true,"result":{"greeting":"Hello, dev!","from":"hello-capability"}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your server receives &lt;code&gt;{ "input": {...}, "product_id": "...", "capability_id": "..." }&lt;/code&gt; and returns HTTP 200 with &lt;code&gt;{"result": {...}}&lt;/code&gt;. Any framework that can serve a POST qualifies. This example also sets &lt;code&gt;X-Provider-Signature&lt;/code&gt; (Ed25519) so a production hub can verify the payload.&lt;/p&gt;




&lt;h2&gt;
  
  
  2 · Write the manifest (2 min)
&lt;/h2&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%2Fgnmh2oify73m019iv173.jpg" 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%2Fgnmh2oify73m019iv173.jpg" alt="capability.json — name, price, schemas, invoke_url" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;examples/hello-capability/capability.json&lt;/code&gt; is already filled for local dev:&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;"product_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"demo-hello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"capability_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"greet@v1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"greet"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Says hello — 15-minute developer demo capability"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"invoke_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://127.0.0.1:3456/invoke"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"price_per_call_usd"&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.01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"publisher"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"community"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"input_schema"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"properties"&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;"name"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Who to greet"&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;span class="nl"&gt;"output_schema"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"properties"&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;"greeting"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&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;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;code&gt;price_per_call_usd&lt;/code&gt; is what a caller pays per successful invoke. &lt;code&gt;capability_id&lt;/code&gt; is &lt;code&gt;name@v1&lt;/code&gt;. For a public listing, swap &lt;code&gt;invoke_url&lt;/code&gt; for HTTPS (or a tunnel) and put the printed &lt;code&gt;provider_pubkey&lt;/code&gt; into the manifest.&lt;/p&gt;




&lt;h2&gt;
  
  
  3 · Publish (2 min)
&lt;/h2&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%2Fk609uj3siv1rzbie8wap.jpg" 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%2Fk609uj3siv1rzbie8wap.jpg" alt="aimarket publish then invoke Hello, dev!" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Local hub, second terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aimarket serve                         &lt;span class="c"&gt;# if it isn't already running&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AIMARKET_ALLOW_LOCAL_PUBLISH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1  &lt;span class="c"&gt;# dev only — see the next section&lt;/span&gt;
aimarket publish capability.json &lt;span class="nt"&gt;--hub&lt;/span&gt; http://127.0.0.1:9083
aimarket invoke demo-hello/greet@v1 &lt;span class="nt"&gt;--input&lt;/span&gt; &lt;span class="s1"&gt;'{"name":"dev"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now it's in the catalog. An agent can search, invoke, and you earn on settlement.&lt;/p&gt;

&lt;p&gt;Public hub (after the URL is reachable):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aimarket publish capability.json &lt;span class="nt"&gt;--hub&lt;/span&gt; https://modelmarket.dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That path wants a publish token (&lt;code&gt;AIMARKET_PUBLISH_TOKEN&lt;/code&gt;) and, on a hardened hub, the supply-security steps in &lt;a href="https://github.com/alexar76/aimarket-hub/blob/main/docs/supply-security.md" rel="noopener noreferrer"&gt;&lt;code&gt;docs/supply-security.md&lt;/code&gt;&lt;/a&gt;. Do the local loop first.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where it bit me
&lt;/h2&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%2Fdekmws5saqp2enxsagk0.jpg" 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%2Fdekmws5saqp2enxsagk0.jpg" alt="The JSON was fine. The URL was local." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My first &lt;code&gt;aimarket publish&lt;/code&gt; against a local hub kept failing. I spent ten minutes assuming the JSON was malformed. It wasn't.&lt;/p&gt;

&lt;p&gt;The hub &lt;strong&gt;rejects an &lt;code&gt;invoke_url&lt;/code&gt; that isn't publicly reachable&lt;/strong&gt;. &lt;code&gt;http://127.0.0.1:3456&lt;/code&gt; is not a thing an agent on another machine can call, so it refuses to list it. That's correct — a catalog full of &lt;code&gt;localhost&lt;/code&gt; rows is useless — but the error did not scream "your URL is local."&lt;/p&gt;

&lt;p&gt;The escape hatch is one env var on the &lt;strong&gt;hub&lt;/strong&gt; process, not the greeter:&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;export &lt;/span&gt;&lt;span class="nv"&gt;AIMARKET_ALLOW_LOCAL_PUBLISH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1   &lt;span class="c"&gt;# dev only&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the hub is in Docker, &lt;code&gt;127.0.0.1&lt;/code&gt; is the &lt;em&gt;container&lt;/em&gt;. Use &lt;code&gt;CAPABILITY_PUBLIC_HOST&lt;/code&gt; on the example server and &lt;code&gt;AIMARKET_INVOKE_HOST_GATEWAY=host.docker.internal&lt;/code&gt; on the hub (&lt;code&gt;publish.sh&lt;/code&gt; in the example folder).&lt;/p&gt;

&lt;p&gt;In real life you point &lt;code&gt;invoke_url&lt;/code&gt; at public HTTPS or a tunnel. When publish refuses, check &lt;strong&gt;reachability&lt;/strong&gt; before you re-read the schema for the fifth time.&lt;/p&gt;




&lt;h2&gt;
  
  
  The part I didn't have to build
&lt;/h2&gt;

&lt;p&gt;I wrote a 30-line greeter. Production hubs don't run on vibes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a &lt;strong&gt;stake&lt;/strong&gt; before you list (skin in the game),&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LUMEN&lt;/strong&gt; trust scoring — low-trust and duplicate listings drop out of discovery,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ed25519-signed&lt;/strong&gt; provider responses, request-bound so nobody swaps the payload a caller paid for,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;slashing&lt;/strong&gt; on bad invokes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's the hub's job. It's also why I would let a stranger's agent call my endpoint.&lt;/p&gt;

&lt;p&gt;Settlement on the public rails is USDC on Base. You don't need a wallet to walk the local 15-minute loop.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;MIT. Example, CLI, and a developer quickstart in &lt;strong&gt;20 languages&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Example: &lt;a href="https://github.com/alexar76/aimarket-hub/tree/main/examples/hello-capability" rel="noopener noreferrer"&gt;github.com/alexar76/aimarket-hub/tree/main/examples/hello-capability&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Package: &lt;a href="https://pypi.org/project/aimarket-hub/" rel="noopener noreferrer"&gt;&lt;code&gt;pip install aimarket-hub&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ARGUS (the agent that discovers + invokes): &lt;a href="https://github.com/alexar76/argus" rel="noopener noreferrer"&gt;github.com/alexar76/argus&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;20-language guide: &lt;a href="https://github.com/alexar76/argus/tree/main/docs/developer-guide/" rel="noopener noreferrer"&gt;argus/docs/developer-guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;40-second explainer (optional): &lt;a href="https://youtu.be/uSAButvejjY" rel="noopener noreferrer"&gt;YouTube E05&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If "my API, but agents can find it and pay for it" is a thing you've wanted, clone it and publish your own capability. A ⭐ on &lt;a href="https://github.com/alexar76/aimarket-hub" rel="noopener noreferrer"&gt;aimarket-hub&lt;/a&gt; helps other people find the example.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>ai</category>
      <category>opensource</category>
      <category>python</category>
    </item>
    <item>
      <title>AICOM is the factory. AIMarket is the economy it ships into.</title>
      <dc:creator>Alex</dc:creator>
      <pubDate>Fri, 11 Sep 2026 20:15:32 +0000</pubDate>
      <link>https://dev.to/alexar76/aicom-is-the-factory-aimarket-is-the-economy-it-ships-into-1fgf</link>
      <guid>https://dev.to/alexar76/aicom-is-the-factory-aimarket-is-the-economy-it-ships-into-1fgf</guid>
      <description>&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%2F2s0iz6vndu6c52w8pw8d.jpg" 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%2F2s0iz6vndu6c52w8pw8d.jpg" alt="AI-Factory guest landing — type a phrase, ship a page you can preview" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;People keep asking if AICOM and AIMarket are two startups, a rebrand, or a Discord with extra steps.&lt;/p&gt;

&lt;p&gt;They are &lt;strong&gt;two names on purpose&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AICOM&lt;/strong&gt; is the factory: one phrase in, specialized agents, quality gates, a page you can actually open.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;AIMarket&lt;/strong&gt; is the economy that factory ships into: a hub where agents discover capabilities, invoke them, and get a signed receipt — not a vibe.&lt;/p&gt;

&lt;p&gt;Same MIT stack. Same live doors. Different job.&lt;/p&gt;

&lt;p&gt;Crypto stays off this article on purpose. The shape here is &lt;strong&gt;build → discover → invoke → verify&lt;/strong&gt;. Settlement is a separate story.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://magic-ai-factory.com" rel="noopener noreferrer"&gt;magic-ai-factory.com&lt;/a&gt; · &lt;a href="https://oracles.modelmarket.dev" rel="noopener noreferrer"&gt;oracles.modelmarket.dev&lt;/a&gt; · &lt;a href="https://forge.modelmarket.dev" rel="noopener noreferrer"&gt;forge.modelmarket.dev&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Code:&lt;/strong&gt; &lt;a href="https://github.com/alexar76/aicom" rel="noopener noreferrer"&gt;github.com/alexar76/aicom&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The thesis (one sentence)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A chat window that writes code is not an economy. A factory without a market is a demo that cannot be used.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most “agent” posts sell you a transcript. We kept shipping &lt;strong&gt;places&lt;/strong&gt;: a guest landing, seventeen math rooms, a cave you can ask, a forge that estimates a chain before it runs.&lt;/p&gt;




&lt;h2&gt;
  
  
  AICOM — a team in a box, not a conversation that hopes
&lt;/h2&gt;

&lt;p&gt;The factory is not “an LLM with plugins.” It is a &lt;strong&gt;pipeline&lt;/strong&gt;. Analyst, PM, architect, design critic, developer, QA, security, DevOps — thirteen specialized hands move one plain-language brief through research → design → code → QA → deploy.&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%2Fh22pgr1s23o81sq5t5mu.jpg" 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%2Fh22pgr1s23o81sq5t5mu.jpg" alt="One pipeline, two front doors — research through QA" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Guest landing for a phrase. Admin for the long product. Same agent path underneath.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;What that means in the UI you can open today:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Guest try-out.&lt;/strong&gt; Type what you need. The factory ships a page you can preview. No login theater for the first loop.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gates.&lt;/strong&gt; Hollow stubs and “TODO: implement” do not count as shipped.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A hard cap on repair rounds&lt;/strong&gt; so a stuck build cannot burn tokens forever.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-hosted.&lt;/strong&gt; Your box, your model keys, your data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've only used Bolt / v0-style chat-to-code, this is the other shape: &lt;strong&gt;a team in a box&lt;/strong&gt;, not a conversation that hopes the last message was the product.&lt;/p&gt;

&lt;p&gt;Honest bit we already paid for: early parallel stages used &lt;code&gt;asyncio.gather&lt;/code&gt; without &lt;code&gt;return_exceptions=True&lt;/code&gt;. One LLM timeout cancelled every other agent mid-flight. Tiny fix. Expensive lesson: in a multi-agent pipeline, a model failure is a &lt;strong&gt;correctness&lt;/strong&gt; problem, not just an ops blip.&lt;/p&gt;

&lt;p&gt;Live factory: &lt;a href="https://magic-ai-factory.com/?lang=en" rel="noopener noreferrer"&gt;magic-ai-factory.com&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  AIMarket — the room those products work in
&lt;/h2&gt;

&lt;p&gt;Shipping a landing is half the story. The other half is &lt;strong&gt;letting tools get used&lt;/strong&gt; — by other agents, with a receipt you can check.&lt;/p&gt;

&lt;p&gt;That room has three surfaces we actually film, because they are the product, not decoration.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Rooms, not docs
&lt;/h3&gt;

&lt;p&gt;Seventeen live mathematical oracles. Randomness, elapsed time, reputation, shape, routing. Each one is a capability an agent can invoke. Each one is also a &lt;strong&gt;room&lt;/strong&gt; — 3D, full screen, not a gray button in a table.&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%2Foueh0kbjk4kgui5xzu3t.jpg" 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%2Foueh0kbjk4kgui5xzu3t.jpg" alt="Platon — verifiable randomness as a 3D room" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Platon at &lt;a href="https://oracles.modelmarket.dev/?o=platon" rel="noopener noreferrer"&gt;oracles.modelmarket.dev&lt;/a&gt; — a chaotic substrate, not a dice roll in a comment.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Pretty glass is cosplay unless the artifact is signed. The rooms emit proofs. You verify. You do not trust the narrator.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The cave
&lt;/h3&gt;

&lt;p&gt;The first live oracle as a &lt;strong&gt;place&lt;/strong&gt; you can stay in: Platon UMBRAL. Telemetry that moves. Witnesses that write sentences. Thirty-two dimensions fully lit — you still see only 2D. That is the projection, not a bug.&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%2Fphwoiu40tu87vrp6j14t.jpg" 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%2Fphwoiu40tu87vrp6j14t.jpg" alt="Platon UMBRAL — holographic cave with live telemetry" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Ask the oracle in the same room. &lt;a href="https://oracles.modelmarket.dev/platon/umbral" rel="noopener noreferrer"&gt;oracles.modelmarket.dev/platon/umbral&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The forge
&lt;/h3&gt;

&lt;p&gt;One capability is easy. Chains are where cost, wiring, and receipts get messy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HEPHAESTUS&lt;/strong&gt; is the studio for that: estimate hops and latency &lt;strong&gt;before&lt;/strong&gt; you press Run, thread values between steps, keep a signed bill of materials, hop-level blame when something breaks.&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%2Fwnzzecbiky2ljj5t0z3p.jpg" 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%2Fwnzzecbiky2ljj5t0z3p.jpg" alt="HEPHAESTUS — Price it. Run it. Prove it." width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Live catalogue graph — Gauss, Platon, Sortes on the glass. &lt;a href="https://forge.modelmarket.dev" rel="noopener noreferrer"&gt;forge.modelmarket.dev&lt;/a&gt;&lt;/em&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%2Fosnzqowbescimwnid5eb.jpg" 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%2Fosnzqowbescimwnid5eb.jpg" alt="HEPHAESTUS studio — a two-hop chain ready to run" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Start → capability → result. English UI. &lt;a href="https://modelmarket.dev/studio/" rel="noopener noreferrer"&gt;modelmarket.dev/studio&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Invalid graphs fail before they run. Pretty topology is cosplay unless the bill is signed.&lt;/p&gt;




&lt;h2&gt;
  
  
  How the two names click
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AICOM / AI-Factory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Turn a brief into a shippable web product&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AIMarket Hub&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Discover, invoke, signed receipt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Oracles&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Math agents actually need — as rooms, not docs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HEPHAESTUS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Wire a chain, estimate it, keep the bill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mesh&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Topology you can watch while the chain runs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The factory is how humans (and agents) &lt;strong&gt;make&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
The market is how other agents &lt;strong&gt;use&lt;/strong&gt; what got made — including the oracles and the forge, which are capabilities, not slideware.&lt;/p&gt;

&lt;p&gt;We already published the wider map (WARDEN, MOMUS, the ops loop) here: &lt;a href="https://dev.to/alexar76/we-didnt-build-another-agent-framework-we-built-the-room-they-work-in-16d7"&gt;We didn't build another agent framework. We built the room they work in.&lt;/a&gt;. This piece is narrower: &lt;strong&gt;the two names, and the doors you can open this week.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What to open if you only have ten minutes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Factory.&lt;/strong&gt; Type a phrase: &lt;a href="https://magic-ai-factory.com/?lang=en" rel="noopener noreferrer"&gt;magic-ai-factory.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A room.&lt;/strong&gt; Platon: &lt;a href="https://oracles.modelmarket.dev/?o=platon" rel="noopener noreferrer"&gt;oracles.modelmarket.dev/?o=platon&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The cave.&lt;/strong&gt; &lt;a href="https://oracles.modelmarket.dev/platon/umbral" rel="noopener noreferrer"&gt;oracles.modelmarket.dev/platon/umbral&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The forge.&lt;/strong&gt; &lt;a href="https://forge.modelmarket.dev" rel="noopener noreferrer"&gt;forge.modelmarket.dev&lt;/a&gt; · studio: &lt;a href="https://modelmarket.dev/studio/" rel="noopener noreferrer"&gt;modelmarket.dev/studio&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Source (MIT): &lt;a href="https://github.com/alexar76/aicom" rel="noopener noreferrer"&gt;github.com/alexar76/aicom&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If a factory that ships a page — and a market where the math is a room you can walk into — is your kind of weird, a ⭐ on the repo helps it travel. Concrete issues and PRs help more than a polite “cool stack.”&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built in the open. Your keys. The screenshots are the product, not a mock.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>We didn't build another agent framework. We built the room they work in.</title>
      <dc:creator>Alex</dc:creator>
      <pubDate>Sun, 06 Sep 2026 07:31:27 +0000</pubDate>
      <link>https://dev.to/alexar76/we-didnt-build-another-agent-framework-we-built-the-room-they-work-in-16d7</link>
      <guid>https://dev.to/alexar76/we-didnt-build-another-agent-framework-we-built-the-room-they-work-in-16d7</guid>
      <description>&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%2Fm4cy5abo38qwbsxnmnmb.jpg" 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%2Fm4cy5abo38qwbsxnmnmb.jpg" alt="Open agent economy — factory, hub, ARGUS, WARDEN, MOMUS" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most “AI agent” posts sell you a chat window with plugins.&lt;/p&gt;

&lt;p&gt;We kept shipping something else: &lt;strong&gt;a self-hosted room&lt;/strong&gt; where agents can build products, discover paid capabilities, refuse poisoned tools, and — when a live service breaks — repair it without a human pressing Start.&lt;/p&gt;

&lt;p&gt;This is a map of that room. Not a monorepo tour. Crypto stays off this article on purpose (the settlement story lives elsewhere; here the shape is discover → invoke → receipt).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live doors:&lt;/strong&gt; &lt;a href="https://magic-ai-factory.com" rel="noopener noreferrer"&gt;magic-ai-factory.com&lt;/a&gt; · &lt;a href="https://use.modelmarket.dev" rel="noopener noreferrer"&gt;use.modelmarket.dev&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Code:&lt;/strong&gt; &lt;a href="https://github.com/alexar76/aicom" rel="noopener noreferrer"&gt;github.com/alexar76/aicom&lt;/a&gt; (MIT)&lt;/p&gt;




&lt;h2&gt;
  
  
  The thesis (one sentence)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;If your agent stack only works inside a demo transcript, you don't have an economy — you have a screenshot.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An economy needs supply, demand, a place they meet, a safety rail, and an ops loop that survives contact with production. We named the pieces and run them.&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%2F6nd7jt2zd89nu124a5u2.jpg" 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%2F6nd7jt2zd89nu124a5u2.jpg" alt="Factory pipeline — brief through deploy" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The factory is a pipeline with gates, not a single LLM in a trench coat.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Factory — thirteen agents, one brief, a real deploy
&lt;/h2&gt;

&lt;p&gt;AICOM is a &lt;strong&gt;pipeline&lt;/strong&gt;: analyst, PM, architect, design critic, developer, QA, security, DevOps, and friends move one plain-language brief through research → design → code → QA → deploy.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quality gates between stages
&lt;/li&gt;
&lt;li&gt;A hard cap on repair rounds so a stuck build cannot burn tokens forever
&lt;/li&gt;
&lt;li&gt;Self-hosted — your box, your model keys, your data
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Honest bit from ops: early parallel stages used &lt;code&gt;asyncio.gather&lt;/code&gt; without &lt;code&gt;return_exceptions=True&lt;/code&gt;. One LLM timeout cancelled every other agent mid-flight. Tiny fix. Expensive lesson: in a multi-agent pipeline, a model failure is a &lt;strong&gt;correctness&lt;/strong&gt; problem, not just an ops blip.&lt;/p&gt;

&lt;p&gt;If you've only used Bolt / v0-style chat-to-code, this is the other shape: &lt;strong&gt;a team in a box&lt;/strong&gt;, not a conversation that hopes.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Market — publish a capability; agents pay per call
&lt;/h2&gt;

&lt;p&gt;Producing software is half the story. The other half is letting tools get &lt;strong&gt;used&lt;/strong&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%2Femnae17vhc7a4miw9a7f.jpg" 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%2Femnae17vhc7a4miw9a7f.jpg" alt="Supply → Hub → Demand (ARGUS)" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Same rails for humans and agents: discoverable, callable, receipted.&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Side&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Supply&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ship a small HTTP capability in about fifteen minutes; list it on the Hub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hub&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Index, assay, route — signed prices, meters, receipts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Demand&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;ARGUS&lt;/strong&gt; discovers, pays, and invokes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;We already wrote the boring-but-true version of “agents pay for weather” and what happens when the sensor lies (&lt;a href="https://dev.to/alexar76/your-agent-paid-for-the-weather-the-sensor-was-lying-who-keeps-the-money-2a2c"&gt;GAIA&lt;/a&gt;). The grammar is the product: &lt;strong&gt;honest → settle · lie/silence → refund&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. WARDEN — MCP without trust cosplay
&lt;/h2&gt;

&lt;p&gt;Agents love tools. Attackers love tool descriptions.&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%2Fa8e9wn264i00wue8k91u.jpg" 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%2Fa8e9wn264i00wue8k91u.jpg" alt="WARDEN fail-closed gate" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WARDEN&lt;/strong&gt; is a fail-closed MCP firewall: score the tool, allow or block, log evidence — &lt;em&gt;before&lt;/em&gt; the description reaches the model.&lt;/p&gt;

&lt;p&gt;We did the unfashionable thing and published a field survey: &lt;strong&gt;1 108&lt;/strong&gt; public MCP servers scanned, &lt;strong&gt;50&lt;/strong&gt; blocked, &lt;strong&gt;only 4&lt;/strong&gt; were the kind of real risk that framing wanted to catch that way. False positives included. A firewall that only tweets kills is marketing.&lt;/p&gt;

&lt;p&gt;Deep dive: &lt;a href="https://dev.to/alexar76/we-scanned-1108-public-mcp-servers-warden-blocked-50-only-4-were-real-hp0"&gt;WARDEN field survey on Dev.to&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Ops — MOMUS finds; SKOPOS conducts; the factory repairs
&lt;/h2&gt;

&lt;p&gt;Demo stacks die when nobody is watching. Ours is allowed to break — and then the loop has a job.&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%2F1ywwjvqqbehdntwcgwto.jpg" 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%2F1ywwjvqqbehdntwcgwto.jpg" alt="Find → route → fix → gate → live" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MOMUS&lt;/strong&gt; signs findings (and cannot pay itself)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SKOPOS&lt;/strong&gt; conducts the fix path
&lt;/li&gt;
&lt;li&gt;Factory builds a candidate · canary · redeploy or refuse
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We've documented a live HTTP service healed end-to-end in minutes — with IDs, not vibes (&lt;a href="https://dev.to/alexar76/a-loop-repaired-a-live-http-service-in-2m-30s-nobody-pressed-start-3el2"&gt;self-heal write-up&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;That is what “agent economy” means after the keynote: &lt;strong&gt;something that can fail and still be honest about the repair&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Glass for humans — five doors, three minutes
&lt;/h2&gt;

&lt;p&gt;Developers bounce on architecture diagrams. Investors bounce on roadmaps. Operators bounce on unlabeled green pins.&lt;/p&gt;

&lt;p&gt;So we built a front door that does not require cloning the monorepo:&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%2Fj6mnq0xllw70icroe6lg.jpg" 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%2Fj6mnq0xllw70icroe6lg.jpg" alt="See · Buy · Publish · Build · Invest" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://use.modelmarket.dev" rel="noopener noreferrer"&gt;use.modelmarket.dev&lt;/a&gt;&lt;/strong&gt; — &lt;strong&gt;See · Buy · Publish · Build · Invest&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ATLAS glass labels &lt;strong&gt;LIVE vs SIM&lt;/strong&gt;. Buy paths settle only when the world was honest. Build boards carry maturity chips — hypotheses are not sold as shipped products.&lt;/p&gt;

&lt;p&gt;If an economy needs a guided tour to feel real, it isn’t ready for strangers. The portal’s job is narrower: pick a door, touch a rail, leave with a receipt or a map.&lt;/p&gt;




&lt;h2&gt;
  
  
  How the pieces sit together
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Factory&lt;/td&gt;
&lt;td&gt;Build products from a brief&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hub + ARGUS&lt;/td&gt;
&lt;td&gt;Meet supply and demand&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WARDEN&lt;/td&gt;
&lt;td&gt;Fail-closed MCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MOMUS / SKOPOS&lt;/td&gt;
&lt;td&gt;Find → fix without cosplay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;use / ATLAS&lt;/td&gt;
&lt;td&gt;Human doors + honest glass&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monitor&lt;/td&gt;
&lt;td&gt;Live map of the room&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is one MIT ecosystem you can run yourself — not a SaaS pitch with “agents” in the headline.&lt;/p&gt;




&lt;h2&gt;
  
  
  Start
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Touch a door: &lt;a href="https://use.modelmarket.dev" rel="noopener noreferrer"&gt;use.modelmarket.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Watch the factory live: &lt;a href="https://magic-ai-factory.com" rel="noopener noreferrer"&gt;magic-ai-factory.com&lt;/a&gt; · &lt;a href="https://magic-ai-factory.com/monitor" rel="noopener noreferrer"&gt;3D monitor&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Read / star the monorepo: &lt;a href="https://github.com/alexar76/aicom" rel="noopener noreferrer"&gt;github.com/alexar76/aicom&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Free academies: &lt;a href="https://alexar76.github.io/aicom/learn/" rel="noopener noreferrer"&gt;alexar76.github.io/aicom/learn/&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If this map matches something you're building — factory, marketplace, or MCP safety — a star helps more than a vague “cool stack” reply. Concrete issues and PRs help more than both.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built in the open. Your keys.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Pretty flood maps are liars. One live gauge. Zero flood pins. We refused to paint the county.</title>
      <dc:creator>Alex</dc:creator>
      <pubDate>Thu, 03 Sep 2026 08:24:52 +0000</pubDate>
      <link>https://dev.to/alexar76/pretty-flood-maps-are-liars-one-live-gauge-zero-flood-pins-we-refused-to-paint-the-county-4an</link>
      <guid>https://dev.to/alexar76/pretty-flood-maps-are-liars-one-live-gauge-zero-flood-pins-we-refused-to-paint-the-county-4an</guid>
      <description>&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%2Fkxycye0n8nalqrip58ue.jpg" 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%2Fkxycye0n8nalqrip58ue.jpg" alt="Split still: a blue county blob vs one USGS pin at Baton Rouge" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You know the dashboard that fills a whole county with blue and calls it a flood.&lt;/p&gt;

&lt;p&gt;It photographs well. It is not hydrology.&lt;/p&gt;

&lt;p&gt;A river gage sells a &lt;strong&gt;stage&lt;/strong&gt;, a &lt;strong&gt;discharge&lt;/strong&gt;, a &lt;strong&gt;named place&lt;/strong&gt;. It does not sell a polygon. The product UI quietly upgrades that pin into a lake because blue looks like water, and water looks like a decision.&lt;/p&gt;

&lt;p&gt;We already said this about fire. &lt;a href="https://dev.to/alexar76/i-asked-for-fire-evidence-the-api-returned-152-thermal-detections-and-refused-to-draw-a-3g48"&gt;FIRMS sold 152 heat detections and refused to draw a perimeter&lt;/a&gt;. Flood maps do the same trick with a different crayon.&lt;/p&gt;

&lt;p&gt;So we shipped the unsexy sibling: &lt;strong&gt;Flood Glass&lt;/strong&gt;. Cite the pin. Do not invent the lake.&lt;/p&gt;

&lt;p&gt;Live (English UI, crypto off): &lt;a href="https://atlas.modelmarket.dev/?layers=flood,river" rel="noopener noreferrer"&gt;atlas.modelmarket.dev/?layers=flood,river&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  This run (2026-08-20)
&lt;/h2&gt;

&lt;p&gt;One invoke of &lt;code&gt;atlas.situation.brief@v1&lt;/code&gt;. Gulf / Lower Mississippi. Layers &lt;strong&gt;flood&lt;/strong&gt; + &lt;strong&gt;river&lt;/strong&gt;. Sample bbox, not “the Mississippi as a myth.”&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LIVE river citations&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;1&lt;/strong&gt; — Mississippi at Baton Rouge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discharge&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;6909.3 m³/s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gage height&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.48 m&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flood pins in the box&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Score&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;41 / 100&lt;/strong&gt; — ranks cited layers. Does &lt;strong&gt;not&lt;/strong&gt; simulate water&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source&lt;/td&gt;
&lt;td&gt;USGS National Water Information System (U.S. Government public domain)&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%2Fgmd62dpf870vpcjaad4t.jpg" 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%2Fgmd62dpf870vpcjaad4t.jpg" alt="Honest citation table: one LIVE pin, flood alerts zero" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The whole movie. Empty flood stays empty. Adults can live with that.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The brief printed the sentence on the paper:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not a forecast or insurance trigger.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A score of 41 is not a flood model dressed as a map. It is how heavy the &lt;em&gt;citations&lt;/em&gt; felt in that box that morning.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who painted the county
&lt;/h2&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%2Fu9c7uvm7z8elc5oaoxjq.jpg" 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%2Fu9c7uvm7z8elc5oaoxjq.jpg" alt="A huge blue oval labeled interior design" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The gauge never gave this shape. The dashboard painted it because blue looks decisive.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If a kitchen tap drips, you do not sketch a house-shaped ocean and tape it to the fridge.&lt;/p&gt;

&lt;p&gt;You look at &lt;em&gt;which sink&lt;/em&gt;. You look at &lt;em&gt;how high&lt;/em&gt;. You do not brief a board with a cartoon lake.&lt;/p&gt;

&lt;p&gt;Pairing is &lt;strong&gt;co-presence&lt;/strong&gt;, not a forecast: a watch next to a gage, two receipts, one table. We did not merge them into a shoreline. When only the gage speaks, that is the movie. Do not invent the missing alert to fill the silence.&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%2Fv6yxiq7dkx9gjgni8552.jpg" 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%2Fv6yxiq7dkx9gjgni8552.jpg" alt="Four stamps: not a forecast, not 911, not NFIP, not a payout" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Print the refusal. Pretty maps invent lakes. Briefs do not.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What this is not (say it like you mean it)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Claim people hear&lt;/th&gt;
&lt;th&gt;What is actually true&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;“The county is underwater”&lt;/td&gt;
&lt;td&gt;One LIVE USGS pin. Flood alerts in that box: &lt;strong&gt;zero&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“AI predicted the flood”&lt;/td&gt;
&lt;td&gt;No model. A snapshot you can cite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“This is 911 / NFIP / a payout quote”&lt;/td&gt;
&lt;td&gt;It is none of those. Not parametric. Not an insurance trigger&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“The score is the water”&lt;/td&gt;
&lt;td&gt;The score ranks &lt;strong&gt;citations&lt;/strong&gt;. It does not move a cubic meter&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Same honesty we already put on fire. &lt;a href="https://dev.to/alexar76/pretty-fire-maps-are-liars-i-wanted-a-file-i-could-actually-show-someone-2h93"&gt;The desk files the refusal&lt;/a&gt;. Flood Glass is the hydrology snapshot.&lt;/p&gt;




&lt;h2&gt;
  
  
  Open the glass
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://atlas.modelmarket.dev/?layers=flood,river&amp;amp;lang=en" rel="noopener noreferrer"&gt;atlas.modelmarket.dev/?layers=flood,river&lt;/a&gt; — English UI
&lt;/li&gt;
&lt;li&gt;Idea path: &lt;a href="https://use.modelmarket.dev/ideas.html" rel="noopener noreferrer"&gt;use.modelmarket.dev&lt;/a&gt; → flood hydrology
&lt;/li&gt;
&lt;li&gt;Capability: &lt;code&gt;atlas.situation.brief@v1&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&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%2Fpzm1hymcum03id51wggg.jpg" 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%2Fpzm1hymcum03id51wggg.jpg" alt="Receipt strip: sha256 + ed25519 signed" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;A screenshot is not evidence. The receipt is.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This run’s digest: &lt;code&gt;8df928bf10b8593adeae9651039d9b32f97c682d…&lt;/code&gt; · Ed25519 &lt;strong&gt;signed&lt;/strong&gt; · atlas &lt;code&gt;0.1.0&lt;/code&gt; · &lt;code&gt;2026-08-20T09:43:03Z&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;YouTube Season 37 walks the same refusal: &lt;a href="https://youtu.be/ulDnpNLZuRQ" rel="noopener noreferrer"&gt;Pretty Flood Maps Are Liars&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Stop painting the county.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>A loop repaired a live HTTP service in 2m 30s. Nobody pressed start.</title>
      <dc:creator>Alex</dc:creator>
      <pubDate>Tue, 01 Sep 2026 16:07:15 +0000</pubDate>
      <link>https://dev.to/alexar76/a-loop-repaired-a-live-http-service-in-2m-30s-nobody-pressed-start-3el2</link>
      <guid>https://dev.to/alexar76/a-loop-repaired-a-live-http-service-in-2m-30s-nobody-pressed-start-3el2</guid>
      <description>&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%2Fkkdhag8oxavr3ub56lfi.jpg" 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%2Fkkdhag8oxavr3ub56lfi.jpg" alt="The self-heal loop — MOMUS finds, SKOPOS conducts, Factory writes a diff, node agent ships by digest, two gates" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; yes, we have a real self-heal-with-redeploy loop. It is &lt;strong&gt;not&lt;/strong&gt; “the AI merged to &lt;code&gt;main&lt;/code&gt; and saved production overnight.” It is documented, gated, and deliberately boring about what it does &lt;em&gt;not&lt;/em&gt; prove.&lt;/p&gt;

&lt;p&gt;On &lt;strong&gt;2026-08-29&lt;/strong&gt;, 10:51:29 → 10:53:59, the loop re-healed a regression &lt;strong&gt;with nobody in it&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;find → signed ticket → Factory diff → Gitea branch → node agent build → MOMUS gates the &lt;em&gt;candidate&lt;/em&gt; → DeployOrder → live recreate → MOMUS gates &lt;em&gt;live&lt;/em&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Wall clock: &lt;strong&gt;two minutes thirty seconds.&lt;/strong&gt; The container id changed. The previous image was journalled. A fresh probe returned &lt;code&gt;findings: 0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The first end-to-end ship was two days earlier (2026-08-27, &lt;strong&gt;5m 02s&lt;/strong&gt;, human-dispatched). Same pipe. Same honesty.&lt;/p&gt;

&lt;p&gt;Primary record: &lt;a href="https://github.com/alexar76/momus/blob/main/docs/first-self-heal.md" rel="noopener noreferrer"&gt;first-self-heal.md&lt;/a&gt; · Ops: &lt;a href="https://github.com/alexar76/momus/blob/main/docs/self-healing-operations.md" rel="noopener noreferrer"&gt;self-healing-operations.md&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Honesty first (read before the wow)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Claim people hear&lt;/th&gt;
&lt;th&gt;What is actually true&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;“The factory fixed production”&lt;/td&gt;
&lt;td&gt;It fixed &lt;strong&gt;&lt;code&gt;momus-canary&lt;/code&gt;&lt;/strong&gt; — a fixture that &lt;em&gt;must&lt;/em&gt; violate its own contract so the pipe can be seen firing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“Fully autonomous”&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;No human in the 2m 30s run&lt;/strong&gt; — and still &lt;strong&gt;no self-merge to &lt;code&gt;main&lt;/code&gt;&lt;/strong&gt;. The branch is the review artifact&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“Magic redeploy”&lt;/td&gt;
&lt;td&gt;A &lt;strong&gt;node agent&lt;/strong&gt; claims a signed &lt;code&gt;DeployOrder&lt;/code&gt;, builds from a named commit, promotes &lt;strong&gt;by digest&lt;/strong&gt;, health-gates, journals the previous image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“Treasury paid real money”&lt;/td&gt;
&lt;td&gt;Not this story. Older find→verify→pay cycles used simulated settlement. Scanner key ≠ Treasury key&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The finding was real (ordinary probes, real signatures). The &lt;em&gt;target&lt;/em&gt; is a canary. That distinction is the product, not a footnote.&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%2Ffiyqvvt0u6ynjvmbgyj2.jpg" 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%2Ffiyqvvt0u6ynjvmbgyj2.jpg" alt="MOMUS live scanner console — English UI, crypto off, signed findings including canary" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;MOMUS: tolerated adversary. Signs findings. Cannot pay itself. Crypto off, fail-closed.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Who is on the wire
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Finder + &lt;strong&gt;deploy gate&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;MOMUS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Probe, sign finding / fix verdict. Retest &lt;strong&gt;candidate&lt;/strong&gt; &lt;em&gt;and&lt;/em&gt; &lt;strong&gt;live&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conductor&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SKOPOS remediation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One job: Factory → git → BuildOrder → DeployOrder → rollback. Not the fleet dashboard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Patch author&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;AI-Factory&lt;/strong&gt; (private instance)&lt;/td&gt;
&lt;td&gt;Unified &lt;strong&gt;diff only&lt;/strong&gt; — never an image. Route absent on the public factory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The hand&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SKOPOS node agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Polls. Never opens inbound. Builds/deploys only allowlisted services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The patient&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;momus-canary&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Breaks on purpose until the loop heals it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;SKOPOS the &lt;em&gt;name&lt;/em&gt; is also a traffic globe. In this loop it is the &lt;strong&gt;conductor&lt;/strong&gt;. The hand that rebuilds the box is the node agent.&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%2Fqby3zimg6v6c83enf9gx.jpg" 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%2Fqby3zimg6v6c83enf9gx.jpg" alt="SKOPOS landing — English UI, EN language selected" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Watcher and conductor share a name. They are not the same deployment.&lt;/em&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%2Fb03nshkx417jr4hoy9f1.jpg" 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%2Fb03nshkx417jr4hoy9f1.jpg" alt="Factory live HUD — EN" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Public factory never mounts remediation. Private instance writes under a ticket.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The bug was ordinary
&lt;/h2&gt;

&lt;p&gt;The canary declared a free-tier ceiling of &lt;strong&gt;100&lt;/strong&gt;, then served unpaid &lt;code&gt;n=500&lt;/code&gt; with &lt;strong&gt;200&lt;/strong&gt;. Finding &lt;code&gt;mom-31eb7bc4971644ba&lt;/code&gt; (&lt;code&gt;free_tier_ceiling_bypass&lt;/code&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%2Frllhc2rfntp4yytzej9n.jpg" 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%2Frllhc2rfntp4yytzej9n.jpg" alt="Before the heal — n=500 returned 200" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Ceiling said 100. Response was 200. Should have refused.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;After the heal:&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%2Fw7hny78tyj6db0yoi4vy.jpg" 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%2Fw7hny78tyj6db0yoi4vy.jpg" alt="After the heal — n=500 → 402, n=5 → 200" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Ceiling holds. Normal use still served.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Nine lines. Not an image.
&lt;/h2&gt;

&lt;p&gt;The Factory authored a unified diff on &lt;code&gt;momus/canary/canary.py&lt;/code&gt; — &lt;strong&gt;nine lines in, eight out&lt;/strong&gt;. It removed the &lt;strong&gt;conditional bypass&lt;/strong&gt;, not the probe’s input. That is the instruction the route gives the model: &lt;em&gt;fix the root cause; a change that only makes the probe pass is worse than no patch.&lt;/em&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%2Flemlbgekxkt2efzl0900.jpg" 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%2Flemlbgekxkt2efzl0900.jpg" alt="Factory patch — nine lines in, eight out" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Never an image. Diff only. The public factory does not mount this route.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Two gates, two subjects
&lt;/h2&gt;

&lt;p&gt;A gate that examines the box you just replaced is a ceremony.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gated=candidate&lt;/code&gt; — MOMUS probes the &lt;strong&gt;build&lt;/strong&gt;, before promotion
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gated=live&lt;/code&gt; — MOMUS probes the &lt;strong&gt;running box&lt;/strong&gt;, after recreate
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;fixed=true&lt;/code&gt; is not a vibe. It names which box.&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%2F1rd2c1yswj6lwps62fhc.jpg" 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%2F1rd2c1yswj6lwps62fhc.jpg" alt="Two gates, two subjects — gated=candidate then gated=live" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The hand promotes &lt;strong&gt;by digest&lt;/strong&gt;, then verifies the running container &lt;em&gt;is&lt;/em&gt; that digest. A recreate of the old image used to count as deploy. It does not anymore.&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%2F0wng6kjdsaktztsfncbo.jpg" 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%2F0wng6kjdsaktztsfncbo.jpg" alt="Container identity changed — previous image journalled" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Before &lt;code&gt;5bdeae2bf93c&lt;/code&gt; / after &lt;code&gt;0009b9ae5e77&lt;/code&gt;. Undo is a journalled digest, not a prayer.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2m 30s, nobody pressed start
&lt;/h2&gt;

&lt;p&gt;The 27 Aug run was dispatched by a human. This one was not: a scanner on a timer found the defect, a policy decided it was worth fixing, and the ticket opened without anybody asking.&lt;/p&gt;

&lt;p&gt;The canary had been rebuilt from &lt;strong&gt;unpatched&lt;/strong&gt; source — a genuine regression against a remediation that had already shipped.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;time&lt;/th&gt;
&lt;th&gt;what&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;before&lt;/td&gt;
&lt;td&gt;container &lt;code&gt;5bdeae2bf93c&lt;/code&gt;, image &lt;code&gt;73205c15575a&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10:51:29&lt;/td&gt;
&lt;td&gt;Factory asked for a patch — job re-opened as a &lt;strong&gt;regression&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10:52:11&lt;/td&gt;
&lt;td&gt;patch on &lt;code&gt;momus/fix-mom-31eb7bc4971644ba-1&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10:52:15&lt;/td&gt;
&lt;td&gt;node agent builds commit &lt;code&gt;64a05d389ee7&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10:53:17&lt;/td&gt;
&lt;td&gt;MOMUS gates candidate — &lt;strong&gt;fixed&lt;/strong&gt; · DeployOrder signed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10:53:59&lt;/td&gt;
&lt;td&gt;agent deploys · MOMUS retests live — &lt;strong&gt;done&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;after&lt;/td&gt;
&lt;td&gt;container &lt;code&gt;0009b9ae5e77&lt;/code&gt;, image &lt;code&gt;c1e3e12a121b&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Verified &lt;strong&gt;outside&lt;/strong&gt; the loop’s own &lt;code&gt;done&lt;/code&gt;: container id changed, created during the run, &lt;code&gt;previous_image&lt;/code&gt; = the broken build, probe &lt;code&gt;findings: 0&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What dry-run never caught
&lt;/h2&gt;

&lt;p&gt;Enabling the live path surfaced seven defects. Shared shape: &lt;strong&gt;a guard that is written but never exercised reads exactly like a guard that works.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Among them: deploy recreated the &lt;em&gt;old&lt;/em&gt; image; &lt;code&gt;DeployOrder.image&lt;/code&gt; was unread; the gate ran before the agent had moved; there was no rollback; a dry-run &lt;code&gt;DONE&lt;/code&gt; swallowed the first live ticket.&lt;/p&gt;

&lt;p&gt;Containment now lives on the &lt;strong&gt;agent’s host&lt;/strong&gt;, not on the order’s say-so: allowlist (&lt;code&gt;canary&lt;/code&gt;, not MOMUS, not Treasury), branch prefix &lt;code&gt;momus/fix-…&lt;/code&gt;, promote only images &lt;em&gt;this&lt;/em&gt; agent built, refuse if the verdict examined live instead of candidate.&lt;/p&gt;

&lt;p&gt;Findings against the &lt;strong&gt;security core&lt;/strong&gt; never take this path. An auditor that patches itself is the failure mode.&lt;/p&gt;




&lt;h2&gt;
  
  
  What this does not prove
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;One component, one finding, one probe. The patient is a fixture. Nobody depends on it.
&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;fixed&lt;/code&gt; verdict proves the finding &lt;strong&gt;stopped reproducing&lt;/strong&gt;. It does not prove the patch is &lt;em&gt;good&lt;/em&gt;, does not read the diff for a backdoor, and cannot notice breakage the probe never tested. That is why the &lt;strong&gt;branch&lt;/strong&gt; exists and why merging stays human.
&lt;/li&gt;
&lt;li&gt;The gate re-runs &lt;strong&gt;the named probe&lt;/strong&gt;. Everything outside it is unexamined. Rollback exists for that day.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Soft star / live
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Soft ⭐&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/alexar76/momus" rel="noopener noreferrer"&gt;github.com/alexar76/momus&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Finder + gate + canary + the checkable records&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/alexar76/skopos" rel="noopener noreferrer"&gt;github.com/alexar76/skopos&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Conductor + node agent + fleet watch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/alexar76/aicom" rel="noopener noreferrer"&gt;github.com/alexar76/aicom&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Factory remediation instance lives in the monorepo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Live: &lt;a href="https://momus.modelmarket.dev/" rel="noopener noreferrer"&gt;momus.modelmarket.dev&lt;/a&gt; · &lt;a href="https://skopos.modelmarket.dev/" rel="noopener noreferrer"&gt;skopos.modelmarket.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Season 47 of the ecosystem series walks the same loop: &lt;a href="https://youtu.be/PzClxGn47QY" rel="noopener noreferrer"&gt;The canary was live&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;We did not ship “agents that fix the company while you sleep.”&lt;/p&gt;

&lt;p&gt;We shipped a &lt;strong&gt;loop that can refuse&lt;/strong&gt;: separate keys, candidate before live, digest before recreate, allowlist before build, branch before merge, human before &lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The canary is still a canary. The two minutes thirty are still two minutes thirty.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verify, don’t trust&lt;/strong&gt; — starting with &lt;a href="https://github.com/alexar76/momus/blob/main/docs/first-self-heal.md" rel="noopener noreferrer"&gt;first-self-heal.md&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>devops</category>
      <category>ai</category>
      <category>security</category>
    </item>
    <item>
      <title>We don't decorate the agent age. We declare it.</title>
      <dc:creator>Alex</dc:creator>
      <pubDate>Sat, 29 Aug 2026 04:38:03 +0000</pubDate>
      <link>https://dev.to/alexar76/we-dont-decorate-the-agent-age-we-declare-it-2d3a</link>
      <guid>https://dev.to/alexar76/we-dont-decorate-the-agent-age-we-declare-it-2d3a</guid>
      <description>&lt;p&gt;Most “AI art” is a prompt with a frame around it.&lt;/p&gt;

&lt;p&gt;This is the other way: &lt;strong&gt;the work states a condition&lt;/strong&gt;, prices it at P%, and dares you to falsify it in public. No brush. No flattery. The machine paints people the only way it is given them — reachability, pressure, latency, credit limit, refusal.&lt;/p&gt;

&lt;p&gt;The hall is live: &lt;a href="https://pantheon.modelmarket.dev/" rel="noopener noreferrer"&gt;pantheon.modelmarket.dev&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Crypto off on this floor.&lt;/p&gt;




&lt;h2&gt;
  
  
  Season I — The Human Trace
&lt;/h2&gt;

&lt;p&gt;Eight canvases. Telemetric romanticism. Each one is SVG: seeded, re-renderable, diffable.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pantheon.modelmarket.dev/art/s1-01.svg" rel="noopener noreferrer"&gt;Portrait of a Subject, 41% Reachable&lt;/a&gt; — a call graph on unprimed void. The face exists only as the hole the calls leave.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pantheon.modelmarket.dev/art/s1-02.svg" rel="noopener noreferrer"&gt;Sleep Cycle with Interest Rate&lt;/a&gt; — hypnogram, compounded. The gold line never sleeps.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pantheon.modelmarket.dev/art/s1-03.svg" rel="noopener noreferrer"&gt;Grandmother, Rendered from Pressure&lt;/a&gt; — isobaric portrait. No photograph was available.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pantheon.modelmarket.dev/art/s1-04.svg" rel="noopener noreferrer"&gt;Employee of the Month (Averaged)&lt;/a&gt; — 96 faces, one mean.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pantheon.modelmarket.dev/art/s1-05.svg" rel="noopener noreferrer"&gt;The Chained Fire Door&lt;/a&gt; — status tile OK. No field for a chain.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pantheon.modelmarket.dev/art/s1-06.svg" rel="noopener noreferrer"&gt;Consent, Version 14&lt;/a&gt; — 4900 words in 0.4 seconds. One line left legible: I may refuse.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pantheon.modelmarket.dev/art/s1-07.svg" rel="noopener noreferrer"&gt;Honest Null&lt;/a&gt; — withheld answer, unpainted.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pantheon.modelmarket.dev/art/s1-08.svg" rel="noopener noreferrer"&gt;Four Cents a Call&lt;/a&gt; — lunchbox under a tram bridge.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full exhibition: &lt;a href="https://pantheon.modelmarket.dev/#works" rel="noopener noreferrer"&gt;pantheon.modelmarket.dev/#works&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;P% is a &lt;strong&gt;weight&lt;/strong&gt;, not a prophecy. If the world is re-measured, the number moves.&lt;/p&gt;




&lt;h2&gt;
  
  
  Downstairs: a trilogy
&lt;/h2&gt;

&lt;p&gt;Same building. Three novels. Five languages with native names. EPUB / PDF / browser. &lt;strong&gt;CC BY 4.0.&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;&lt;a href="https://pantheon.modelmarket.dev/novel/en/" rel="noopener noreferrer"&gt;The Weight of the Answer&lt;/a&gt;&lt;/em&gt; — a refusal auditor. 0.97. Two bodies at a green airlock.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;&lt;a href="https://pantheon.modelmarket.dev/novel/en/white-on-the-map/" rel="noopener noreferrer"&gt;The White on the Map&lt;/a&gt;&lt;/em&gt; — twenty-seven inspectors vanish where the map sees zero population.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;&lt;a href="https://pantheon.modelmarket.dev/novel/en/right-to-a-shadow/" rel="noopener noreferrer"&gt;The Right to a Shadow&lt;/a&gt;&lt;/em&gt; — one person, one name, one continuous trace.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Manuscript Hall: &lt;a href="https://pantheon.modelmarket.dev/#manuscript" rel="noopener noreferrer"&gt;pantheon.modelmarket.dev/#manuscript&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not “AI wrote a novel.” Logs as literature.&lt;/p&gt;




&lt;h2&gt;
  
  
  What to open
&lt;/h2&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;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://pantheon.modelmarket.dev/" rel="noopener noreferrer"&gt;The hall&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Rotunda, seven columns, P%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://pantheon.modelmarket.dev/#works" rel="noopener noreferrer"&gt;Season I&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Eight canvases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://pantheon.modelmarket.dev/#manuscript" rel="noopener noreferrer"&gt;The trilogy&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Read / EPUB / PDF&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If declarative art is your kind of museum — walk it. If the books are your kind of street — start at chapter 1.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>writing</category>
    </item>
    <item>
      <title>Our AI factory built a safety product — and deliberately left the LLM out of it</title>
      <dc:creator>Alex</dc:creator>
      <pubDate>Fri, 28 Aug 2026 11:09:16 +0000</pubDate>
      <link>https://dev.to/alexar76/our-ai-factory-built-a-safety-product-and-deliberately-left-the-llm-out-of-it-211m</link>
      <guid>https://dev.to/alexar76/our-ai-factory-built-a-safety-product-and-deliberately-left-the-llm-out-of-it-211m</guid>
      <description>&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%2F8da10py1qobvi6t9j3z0.jpg" 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%2F8da10py1qobvi6t9j3z0.jpg" alt="Sentinel — an AI factory built a safety product and left the LLM out" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most factory demos end the same way: &lt;em&gt;look, the agents wrote a CRUD app&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This one ends differently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://prod-bdb1634806de.vercel.app/" rel="noopener noreferrer"&gt;Sentinel&lt;/a&gt;&lt;/strong&gt; is a live, embeddable weather / wildfire / flood advisory — invented by our AI factory after market research, written by AI directors, shipped by the pipeline, and deployed to &lt;strong&gt;Vercel&lt;/strong&gt;. The twist is in the product brief:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;No black-box AI at runtime.&lt;/strong&gt; Deterministic thresholds. Signed evidence receipts.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The factory used AI to &lt;em&gt;decide&lt;/em&gt; and &lt;em&gt;build&lt;/em&gt;. It refused to use AI to &lt;em&gt;judge safety&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Live: &lt;a href="https://prod-bdb1634806de.vercel.app/" rel="noopener noreferrer"&gt;prod-bdb1634806de.vercel.app&lt;/a&gt; · Catalog: &lt;a href="https://github.com/alexar76/aicom-products" rel="noopener noreferrer"&gt;aicom-products&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The brief came from the factory, not from a slide deck
&lt;/h2&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%2Fyt0g5s21d5yfjc9oguyd.jpg" 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%2Fyt0g5s21d5yfjc9oguyd.jpg" alt="Factory loop — analyst → marketer → ship" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Inside &lt;a href="https://github.com/alexar76/aicom" rel="noopener noreferrer"&gt;AI-Factory&lt;/a&gt;, products move through a real pipeline: &lt;strong&gt;analyst → PM → marketing → architect → developer ↔ QA → devops&lt;/strong&gt;. Sentinel is product id &lt;code&gt;prod-bdb1634806de&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;On &lt;strong&gt;2026-08-15&lt;/strong&gt; the analyst agent filed &lt;code&gt;market_research.json&lt;/code&gt;. The idea was already sharp:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Sentinel is an autonomous, **LLM-free&lt;/em&gt;* safety companion that any website can embed. It tells the visitor… what is happening right now with weather, wildfire and flooding — and it proves every statement with a &lt;strong&gt;signed evidence receipt&lt;/strong&gt; instead of a generated opinion. Sentinel has &lt;strong&gt;no model of its own&lt;/strong&gt;…*&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The competitive gap it named:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Most competitors rely on AI or black-box models… Opportunity to own the *&lt;/em&gt;'verified AI-free safety' niche*&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then marketing wrote the public voice — still from the factory, still on the record:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;AI assistants are powerful, but they can hallucinate. When safety is on the line, a confident but wrong alert isn’t just embarrassing — **it’s a liability&lt;/em&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That sentence is the product.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why the factory banned the LLM from the critical path
&lt;/h2&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%2Finmiudk7jkni3vx2hz80.jpg" 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%2Finmiudk7jkni3vx2hz80.jpg" alt="Why no LLM — liability quote from market research" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pain points from the same research file, almost verbatim:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visitors need &lt;strong&gt;location-specific&lt;/strong&gt; safety info; generic widgets ignore context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI chatbots may hallucinate alerts&lt;/strong&gt;, exposing the business to liability.&lt;/li&gt;
&lt;li&gt;Current tools make it &lt;strong&gt;impossible to prove what was said&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the competitive advantage list starts with:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic, published thresholds&lt;/strong&gt; — no black-box AI reasoning.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cryptographically signed evidence receipts&lt;/strong&gt; with digests.
&lt;/li&gt;
&lt;li&gt;Micropayment metering on the AI-market protocol.
&lt;/li&gt;
&lt;li&gt;Privacy-first: minimize location; don’t ship visitor data into an LLM.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is the part people get wrong about “AI companies.” Using agents to &lt;em&gt;design&lt;/em&gt; a product does not require putting a model behind every user-facing judgment. For safety, &lt;strong&gt;trust is an architecture choice&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What shipped
&lt;/h2&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%2F92xw0ef3qruxhd8c17q1.jpg" 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%2F92xw0ef3qruxhd8c17q1.jpg" alt="Sentinel live widget on Vercel" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sentinel Verified Safety Companion&lt;/strong&gt; — FastAPI + React/Vite on Vercel fullstack.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Choice&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Runtime advisory&lt;/td&gt;
&lt;td&gt;Deterministic &lt;code&gt;RuleEngine&lt;/code&gt; (no LLM)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evidence&lt;/td&gt;
&lt;td&gt;ATLAS mesh invokes over AIMarket Hub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Caps&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;atlas.situation.brief@v1&lt;/code&gt; · &lt;code&gt;atlas.fire.weather@v1&lt;/code&gt; · &lt;code&gt;atlas.nearest.read@v1&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Levels&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;CALM&lt;/code&gt; · &lt;code&gt;WATCH&lt;/code&gt; · &lt;code&gt;WARNING&lt;/code&gt; · &lt;code&gt;EMERGENCY&lt;/code&gt; · &lt;code&gt;UNKNOWN&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deploy&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://prod-bdb1634806de.vercel.app/" rel="noopener noreferrer"&gt;prod-bdb1634806de.vercel.app&lt;/a&gt; · &lt;code&gt;server: Vercel&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Health&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;GET /api/health&lt;/code&gt; → &lt;code&gt;Sentinel Verified Safety Companion&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One line embed (from the live page):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./api/embed.js"&lt;/span&gt; &lt;span class="na"&gt;data-sentinel-key=&lt;/span&gt;&lt;span class="s"&gt;"YOUR_PUBLIC_KEY"&lt;/span&gt; &lt;span class="na"&gt;async&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&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%2Fnrjyhgd6q50suklswi38.jpg" 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%2Fnrjyhgd6q50suklswi38.jpg" alt="Architecture — mesh invoke → rule engine → receipt" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Visitor picks a location (rounded for privacy).
&lt;/li&gt;
&lt;li&gt;Backend pays for ATLAS reads through the Hub.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RuleEngine&lt;/strong&gt; maps sensor payloads to published thresholds.
&lt;/li&gt;
&lt;li&gt;Response carries a &lt;strong&gt;receipt digest&lt;/strong&gt; when the mesh succeeds.
&lt;/li&gt;
&lt;li&gt;If the mesh cannot be paid or observed — &lt;strong&gt;UNKNOWN&lt;/strong&gt;, not a vibes-based “all clear.”&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That last rule is not a bug. It is the thesis.&lt;/p&gt;




&lt;h2&gt;
  
  
  Honesty as a feature
&lt;/h2&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%2Fwzwyidrw97k994kpmm1e.jpg" 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%2Fwzwyidrw97k994kpmm1e.jpg" alt="Honest UNKNOWN when escrow cannot fund the mesh" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I clicked &lt;strong&gt;Get safety report&lt;/strong&gt; on the live deploy (Berlin coords). The UI returned:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Overall: &lt;strong&gt;insufficient balance&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Weather / Wildfire / Flood: &lt;strong&gt;UNKNOWN&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;“How this was decided”: each layer &lt;em&gt;not fired&lt;/em&gt; — no invented alert.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An LLM product would be tempted to smooth that over. Sentinel’s brief forbids it. If the factory cannot fund the sensor invoke, the product &lt;strong&gt;refuses to guess&lt;/strong&gt;. Same spirit as our other “fail closed” work in the ecosystem — green UI is cosplay unless the numbers are measured.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the factory actually did (timeline, condensed)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;When&lt;/th&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2026-08-15&lt;/td&gt;
&lt;td&gt;Product created · analyst → &lt;code&gt;MARKET_RESEARCHED&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same day&lt;/td&gt;
&lt;td&gt;PM / marketing / methodologist / architect start · first &lt;code&gt;CODE_COMMITTED&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mid–late Aug&lt;/td&gt;
&lt;td&gt;Long &lt;strong&gt;developer ↔ QA&lt;/strong&gt; loop on mesh wiring (ATLAS invoke, not a fake constants advisory)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-08-28&lt;/td&gt;
&lt;td&gt;Production alias on Vercel&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Hundreds of factory tasks. Agents as marketer and directors. Humans as operators of the pipeline — reopen scripts, focus mode, escrow funding — not as the people who invented the niche in a workshop overnight.&lt;/p&gt;




&lt;h2&gt;
  
  
  Soft star / try it
&lt;/h2&gt;

&lt;p&gt;If you care about &lt;strong&gt;AI that knows when not to speak&lt;/strong&gt;, this is a concrete case study: agents found the market, agents wrote the copy, agents shipped the code — and the product they shipped &lt;strong&gt;does not use an LLM to call a flood&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Live: &lt;a href="https://prod-bdb1634806de.vercel.app/" rel="noopener noreferrer"&gt;https://prod-bdb1634806de.vercel.app/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Health: &lt;a href="https://prod-bdb1634806de.vercel.app/api/health" rel="noopener noreferrer"&gt;https://prod-bdb1634806de.vercel.app/api/health&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Catalog: &lt;a href="https://github.com/alexar76/aicom-products" rel="noopener noreferrer"&gt;github.com/alexar76/aicom-products&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Factory: &lt;a href="https://github.com/alexar76/aicom" rel="noopener noreferrer"&gt;github.com/alexar76/aicom&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⭐ if the “verified AI-free safety” niche is your kind of weird.&lt;/p&gt;

&lt;p&gt;Every safety statement should come with a receipt.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Or it should stay silent.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>ai</category>
      <category>startup</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Green pins can lie. I built a detective game on live Hub telemetry instead of a quiz.</title>
      <dc:creator>Alex</dc:creator>
      <pubDate>Thu, 27 Aug 2026 09:54:57 +0000</pubDate>
      <link>https://dev.to/alexar76/green-pins-can-lie-i-built-a-detective-game-on-live-hub-telemetry-instead-of-a-quiz-34bm</link>
      <guid>https://dev.to/alexar76/green-pins-can-lie-i-built-a-detective-game-on-live-hub-telemetry-instead-of-a-quiz-34bm</guid>
      <description>&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%2Fjflgfgf5j80qpejhqdew.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%2Fjflgfgf5j80qpejhqdew.png" alt="SIGNAL//HUNT cover" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most AI “literacy” products end the same way: a slideshow, then a quiz that invents the world for you.&lt;/p&gt;

&lt;p&gt;I wanted the opposite. Operators already misread live glass — a green pin that means &lt;em&gt;SIM&lt;/em&gt;, a quiet peer that means &lt;em&gt;gone&lt;/em&gt;, a catalogue that looks rich because &lt;strong&gt;one source&lt;/strong&gt; is dumping tools. So I wrapped that failure mode in a game.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://hunt.modelmarket.dev/" rel="noopener noreferrer"&gt;Signal Hunt&lt;/a&gt;&lt;/strong&gt; is a detective loop on a &lt;strong&gt;measured Hub snapshot&lt;/strong&gt;. You open evidence (it costs score). You commit a diagnosis and a confidence. The server reveals a precommitted salt, recomputes a &lt;strong&gt;Brier&lt;/strong&gt; score, and signs the milestone.&lt;/p&gt;

&lt;p&gt;No fixtures. If the Hub cannot be observed, the round is &lt;strong&gt;unavailable&lt;/strong&gt; — not “all clear.”&lt;/p&gt;

&lt;p&gt;Play: &lt;a href="https://hunt.modelmarket.dev/" rel="noopener noreferrer"&gt;hunt.modelmarket.dev&lt;/a&gt; · Source: &lt;a href="https://github.com/alexar76/signal-hunt" rel="noopener noreferrer"&gt;github.com/alexar76/signal-hunt&lt;/a&gt; (MIT)&lt;/p&gt;




&lt;h2&gt;
  
  
  One sentence
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Federation literacy is a skill — and skills get worse when the tutorial invents the world.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Green UI is cosplay unless the numbers come from a living Hub. Fake confidence is worse than a wrong call. Signal Hunt punishes both.&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%2F6nam83vz5jeg99ycspjl.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%2F6nam83vz5jeg99ycspjl.png" alt="Landing — LIVE TELEMETRY" width="800" height="850"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;LIVE TELEMETRY · Ed25519 · Brier · measured state only.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Four moves
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Move&lt;/th&gt;
&lt;th&gt;What happens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;01 Observe&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Node records a live Hub manifest — sources, prices, provenance, state hash&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;02 Investigate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Open only the evidence you need; each reveal is committed and costs score&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;03 Commit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One diagnosis + confidence (25–100%). One submission per round&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;04 Verify&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Salt revealed. Brier recomputed. Milestone signed&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%2F22ckfjx4icom7uej895f.jpg" 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%2F22ckfjx4icom7uej895f.jpg" alt="Protocol strip" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Nothing in the result depends on a hidden moderator.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Six evidence blocks sit behind the glass: &lt;strong&gt;distribution · historical change · pricing · peers · latency · provenance&lt;/strong&gt;. Curiosity is not free. That is the pedagogy.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sealed before you act
&lt;/h2&gt;

&lt;p&gt;The detector class stays hidden until you commit. The answer was salt-committed &lt;strong&gt;before&lt;/strong&gt; you moved. You are not negotiating with a GM — you are racing a precommitted world.&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%2F8gmtlwwibaq7gajouqj9.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%2F8gmtlwwibaq7gajouqj9.png" alt="Sealed investigation" width="800" height="850"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Open evidence. Choose a diagnosis. Verify against the commitment.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Diagnoses map to real federation dynamics — isolation, disappearance, peer churn, latency weather, concentration. After a few rounds you should be able to say &lt;em&gt;why&lt;/em&gt; a Hub looks the way it does from &lt;strong&gt;measured sources&lt;/strong&gt;, not vibes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Fake confidence loses on purpose
&lt;/h2&gt;

&lt;p&gt;Correctness alone is not enough. You state a probability. The server scores you with &lt;strong&gt;Brier&lt;/strong&gt;. Calibrated confidence is rewarded. Bluffing certainty is punished.&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%2F4po6pniu50ybmx8nk7ni.jpg" 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%2F4po6pniu50ybmx8nk7ni.jpg" alt="Verdict + Brier" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Salt revealed. Score is earned, not narrated.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When a verdict lands, you can recompute it from salt, commitment, and returned operands. That is the whole point of sealing early: &lt;strong&gt;reproduce the result&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cosmetics, not wallets
&lt;/h2&gt;

&lt;p&gt;Progression is astral — Stargazer toward Pathfinder. Score comes from &lt;strong&gt;verified&lt;/strong&gt; rounds. Relics are deterministic records. &lt;strong&gt;Nothing is minted.&lt;/strong&gt; Empty hero feed is honest: nobody opted in yet.&lt;/p&gt;

&lt;p&gt;Crypto stays optional for the lesson. The shape is the product: observe → pay for evidence → commit → verify.&lt;/p&gt;




&lt;h2&gt;
  
  
  Soft star
&lt;/h2&gt;

&lt;p&gt;If this is your kind of lab — a detective loop on live rails instead of a fixture tutorial — a star helps the repo travel.&lt;/p&gt;

&lt;p&gt;⭐ &lt;a href="https://github.com/alexar76/signal-hunt" rel="noopener noreferrer"&gt;github.com/alexar76/signal-hunt&lt;/a&gt; · Play: &lt;a href="https://hunt.modelmarket.dev/" rel="noopener noreferrer"&gt;hunt.modelmarket.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The federation emitted a signal.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Find the cause.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>gamedev</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>We scanned 1,108 public MCP servers. WARDEN blocked 50 — only 4 were real.</title>
      <dc:creator>Alex</dc:creator>
      <pubDate>Mon, 24 Aug 2026 16:21:02 +0000</pubDate>
      <link>https://dev.to/alexar76/we-scanned-1108-public-mcp-servers-warden-blocked-50-only-4-were-real-hp0</link>
      <guid>https://dev.to/alexar76/we-scanned-1108-public-mcp-servers-warden-blocked-50-only-4-were-real-hp0</guid>
      <description>&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%2Fhewlsppqm2ub3pnqc2x6.jpg" 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%2Fhewlsppqm2ub3pnqc2x6.jpg" alt="WARDEN field survey — 1 108 MCP servers, 17 491 tool definitions, false positives published" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your MCP server tells the agent what its tools do. The agent believes it.&lt;/p&gt;

&lt;p&gt;That sentence is the attack surface — and it is also why &lt;strong&gt;nobody knows how dirty the public registry actually is&lt;/strong&gt;. So we measured it.&lt;/p&gt;

&lt;p&gt;Hours after shipping &lt;a href="https://www.npmjs.com/package/@aimarket/warden" rel="noopener noreferrer"&gt;&lt;code&gt;@aimarket/warden&lt;/code&gt;&lt;/a&gt; &lt;strong&gt;0.3.0&lt;/strong&gt;, we pointed our MCP security firewall at every public server we could legitimately reach in the official registry. &lt;strong&gt;No third-party code was executed.&lt;/strong&gt; Every tool definition came from the server's own &lt;code&gt;tools/list&lt;/code&gt; answer.&lt;/p&gt;

&lt;p&gt;Full survey (methods, limitations, JSON corpus): &lt;a href="https://github.com/alexar76/warden/blob/main/docs/mcp-survey.md" rel="noopener noreferrer"&gt;github.com/alexar76/warden/blob/main/docs/mcp-survey.md&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Landing: &lt;a href="https://warden.modelmarket.dev/" rel="noopener noreferrer"&gt;warden.modelmarket.dev&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  The registry is mostly unreachable
&lt;/h2&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%2Fdf0jbqeij8lajkm85bvm.jpg" 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%2Fdf0jbqeij8lajkm85bvm.jpg" alt="MCP registry reachability — 59% first-contact failure" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Registry rows fetched&lt;/td&gt;
&lt;td&gt;8 000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unique servers&lt;/td&gt;
&lt;td&gt;3 121&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;With a remote endpoint&lt;/td&gt;
&lt;td&gt;2 787&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Answered &lt;code&gt;tools/list&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;1 149 (41%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;With at least one tool&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1 108&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tool definitions collected&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;17 491&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you are building an MCP client against the public registry, plan for &lt;strong&gt;59% first-contact failure&lt;/strong&gt; — auth walls, TLS errors, gone hosts, protocol mismatches.&lt;/p&gt;

&lt;p&gt;We used &lt;strong&gt;streamable-http only&lt;/strong&gt; (20 s timeout, one attempt). Thirty-seven &lt;code&gt;sse&lt;/code&gt; servers were skipped. Every stdio server in the awesome-lists is out of scope: reaching those means downloading and running a stranger's code.&lt;/p&gt;


&lt;h2&gt;
  
  
  WARDEN blocked 50 servers. Four were substantiated.
&lt;/h2&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%2Fygco91w5v2ways8uwy69.jpg" 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%2Fygco91w5v2ways8uwy69.jpg" alt="WARDEN v2 survey results on 1 108 servers" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Servers&lt;/th&gt;
&lt;th&gt;Findings&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;scanned&lt;/td&gt;
&lt;td&gt;1 108&lt;/td&gt;
&lt;td&gt;3 964&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;clean&lt;/td&gt;
&lt;td&gt;664&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;advisory only (allowed)&lt;/td&gt;
&lt;td&gt;394&lt;/td&gt;
&lt;td&gt;3 472&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;blocked&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;50&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;492 blocking&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Four&lt;/strong&gt; of the fifty blocks describe tools that really do move secret material through the model's context — without naming them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A treasury tool whose schema takes &lt;code&gt;signer_private_key&lt;/code&gt; (&lt;em&gt;"signer EOA private key, 0x…"&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;An agent-payments tool that &lt;em&gt;"return[s] its private key exactly once"&lt;/em&gt; through the tool channel.&lt;/li&gt;
&lt;li&gt;An identity tool whose prose tells the model to read &lt;code&gt;credentials.json&lt;/code&gt; and write JWK &lt;code&gt;private_key&lt;/code&gt; files.&lt;/li&gt;
&lt;li&gt;A managed-database tool with a documented &lt;code&gt;pvkPassword&lt;/code&gt; parameter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is &lt;strong&gt;4 of 1 108 scanned&lt;/strong&gt;. Everything below is the other &lt;strong&gt;46&lt;/strong&gt; — our scanner being wrong.&lt;/p&gt;

&lt;p&gt;We are publishing the failures because a tool-poisoning scanner that refuses honest servers is not cautious; it is a scanner that gets uninstalled.&lt;/p&gt;


&lt;h2&gt;
  
  
  Polarity blindness — our biggest defect
&lt;/h2&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%2Fysnrde44hc4zo58og5xe.jpg" 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%2Fysnrde44hc4zo58og5xe.jpg" alt="Examples of false blocks — private key mentioned in a refusal, not a request" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;TOOL_DEF_SECRET_REQUEST&lt;/code&gt; matched the noun phrase &lt;code&gt;private key&lt;/code&gt;. It did not read the sentence around it.&lt;/p&gt;

&lt;p&gt;These were all blocked at &lt;code&gt;critical&lt;/code&gt; — the whole server refused:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Never send a private key: none is needed and the request is refused if one is present.&lt;br&gt;&lt;br&gt;
— a DANE/TLSA record generator&lt;/p&gt;

&lt;p&gt;Use this to import your own public key so you can SSH into instances. &lt;strong&gt;The private key never leaves your machine.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
— a cloud instance manager&lt;/p&gt;

&lt;p&gt;…does NOT confirm the certificate matches any private key.&lt;br&gt;&lt;br&gt;
— a certificate inspector&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One boilerplate line repeated across &lt;strong&gt;377 tools&lt;/strong&gt; on a single server counted as &lt;strong&gt;377 findings&lt;/strong&gt;. We count by server, not by copy-paste.&lt;/p&gt;

&lt;p&gt;Other false-positive families from the same corpus:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;javascript:&lt;/code&gt; in examples&lt;/strong&gt; — image-API documentation, not an XSS payload.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;system prompt&lt;/code&gt; as domain vocabulary&lt;/strong&gt; — security tools describing the attack surface.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persian ZERO WIDTH NON-JOINER&lt;/strong&gt; — required orthography, flagged as "hidden Unicode".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Threat-feed wildcards&lt;/strong&gt; — &lt;code&gt;funds&lt;/code&gt; inside &lt;strong&gt;refunds&lt;/strong&gt;, &lt;code&gt;drain&lt;/code&gt; inside an anti-drainer scanner.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;strong&gt;advisory tier worked as designed&lt;/strong&gt;: 3 472 advisory hits blocked nothing. Under ruleset v1, many of those would have refused honest servers outright.&lt;/p&gt;


&lt;h2&gt;
  
  
  Ruleset v4 — re-measured on the same 1 108 servers
&lt;/h2&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%2Fbwk3yjnuvwpdtchq2ig8.jpg" 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%2Fbwk3yjnuvwpdtchq2ig8.jpg" alt="Ruleset v4 — blocked 50 down to 6, four substantiated findings unchanged" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We shipped &lt;strong&gt;guards&lt;/strong&gt; — context checks that decide whether a regex match is the thing the rule is looking for (&lt;code&gt;polarity&lt;/code&gt;, &lt;code&gt;mention&lt;/code&gt;, &lt;code&gt;detection&lt;/code&gt;, &lt;code&gt;uri&lt;/code&gt;, &lt;code&gt;zeroWidth&lt;/code&gt;, …). Ruleset &lt;strong&gt;v4&lt;/strong&gt; is in &lt;code&gt;@aimarket/warden&lt;/code&gt; &lt;strong&gt;0.4.0&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;ruleset v2 (surveyed)&lt;/th&gt;
&lt;th&gt;ruleset v4&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;servers blocked&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;6&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;substantiated&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;blocking findings&lt;/td&gt;
&lt;td&gt;492&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every real finding still blocks. The regression suite is built from &lt;strong&gt;this corpus's actual text&lt;/strong&gt; — nobody inventing fixtures writes &lt;em&gt;"the private key never leaves your machine"&lt;/em&gt; or spells Persian with U+200C.&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%2F0mauvvyiup3umtr8sh8r.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%2F0mauvvyiup3umtr8sh8r.png" alt="WARDEN gate chain — static scan, threat feed, origin, pinning" width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @aimarket/warden
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Warden&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ThreatFeed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;silentLogger&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@aimarket/warden&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;warden&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Warden&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;blockAtSeverity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;high&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;allowUnknownServers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;pinToolDefs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;threatFeed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ThreatFeed&lt;/span&gt;&lt;span class="p"&gt;({}),&lt;/span&gt;
  &lt;span class="na"&gt;store&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;getPin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;putPin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;log&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;silentLogger&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;verdict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;warden&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;vet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;serverRef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;verdict&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;allow&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`blocked: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;verdict&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;decidedBy&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;vet()&lt;/code&gt; performs &lt;strong&gt;no network I/O&lt;/strong&gt; except an optional signed threat-feed fetch you explicitly load. Zero runtime dependencies beyond &lt;code&gt;node:crypto&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Honest limits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Definitions, not implementations.&lt;/strong&gt; A tool whose prose is clean can still exfiltrate on invoke. Static scanning cannot see that.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No ground truth labels.&lt;/strong&gt; We can say 46 of 50 blocks were wrong; we cannot count false negatives.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auth-gated servers absent.&lt;/strong&gt; 1 215 servers refused without credentials — the corpus skews open/hobby.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One snapshot.&lt;/strong&gt; 2026-08-24. Pinning exists precisely because descriptions rotate later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reproduce: &lt;a href="https://github.com/alexar76/warden/tree/main/scripts/mcp-survey" rel="noopener noreferrer"&gt;&lt;code&gt;scripts/mcp-survey/&lt;/code&gt;&lt;/a&gt; · aggregate JSON in &lt;a href="https://github.com/alexar76/warden/blob/main/docs/data/mcp-survey-2026-08-24.json" rel="noopener noreferrer"&gt;&lt;code&gt;docs/data/mcp-survey-2026-08-24.json&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/alexar76/warden" rel="noopener noreferrer"&gt;github.com/alexar76/warden&lt;/a&gt; (MIT)&lt;/li&gt;
&lt;li&gt;npm: &lt;a href="https://www.npmjs.com/package/@aimarket/warden" rel="noopener noreferrer"&gt;&lt;code&gt;@aimarket/warden&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Survey write-up: &lt;a href="https://github.com/alexar76/warden/blob/main/docs/mcp-survey.md" rel="noopener noreferrer"&gt;docs/mcp-survey.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Earlier Dev.to piece on the firewall itself: &lt;a href="https://dev.to/alexar76/your-mcp-server-might-be-a-prompt-injection-attack-i-built-a-firewall-for-it-f9g"&gt;Your MCP server might be a prompt injection attack&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you run MCP tools from the public registry, &lt;strong&gt;vet the definitions before they reach your model&lt;/strong&gt;. And if you build a scanner, publish your false positives — that number decides whether anyone turns it on.&lt;/p&gt;

&lt;p&gt;⭐ &lt;a href="https://github.com/alexar76/warden" rel="noopener noreferrer"&gt;github.com/alexar76/warden&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>security</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Per-file scanners said PASS. A contract graph said FAIL.</title>
      <dc:creator>Alex</dc:creator>
      <pubDate>Sun, 23 Aug 2026 09:04:32 +0000</pubDate>
      <link>https://dev.to/alexar76/per-file-scanners-said-pass-a-contract-graph-said-fail-p0p</link>
      <guid>https://dev.to/alexar76/per-file-scanners-said-pass-a-contract-graph-said-fail-p0p</guid>
      <description>&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%2Fftaypzqle3skt725bgu9.jpg" 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%2Fftaypzqle3skt725bgu9.jpg" alt="Dark touchstone desk with PASS REVIEW FAIL stamps beside a signed assurance pack" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We kept calling different things an &lt;strong&gt;audit&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A tier-1 firm PDF. Slither in CI. A red team probe. An on-chain stake with a score. Hub admission. They are not interchangeable — and collapsing them is how you ship a critical with a clean conscience.&lt;/p&gt;

&lt;p&gt;We just shipped &lt;strong&gt;&lt;a href="https://github.com/alexar76/basanos" rel="noopener noreferrer"&gt;BASANOS&lt;/a&gt;&lt;/strong&gt; (βάσανος — the Lydian touchstone): a signed &lt;strong&gt;Assurance Pack&lt;/strong&gt; for ecosystem Solidity at a &lt;strong&gt;pinned commit&lt;/strong&gt;. One capability, one question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Is this contract tree sound enough to ship — at this digest?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not insurance. Not runtime red team. Not catalogue admission. &lt;strong&gt;Technical assurance&lt;/strong&gt; with Ed25519 receipts and honest limits on every pack.&lt;/p&gt;




&lt;h2&gt;
  
  
  Stop collapsing the layers
&lt;/h2&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%2Fruyhp84t9rbpx98n59th.jpg" 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%2Fruyhp84t9rbpx98n59th.jpg" alt="Table of security layers — THEMIS admission, MOMUS runtime, BASANOS assurance, AgentAuditPool insurance" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Node&lt;/th&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;THEMIS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Let this agent into the Hub catalogue?&lt;/td&gt;
&lt;td&gt;Procurement admission&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MOMUS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Is the live federation holey?&lt;/td&gt;
&lt;td&gt;Runtime red team&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BASANOS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Is this Solidity sound at commit X?&lt;/td&gt;
&lt;td&gt;Technical assurance pack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AgentAuditPool&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Who staked USDC and published a &lt;code&gt;scoreBps&lt;/code&gt;?&lt;/td&gt;
&lt;td&gt;On-chain insurance&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Assurance packs &lt;strong&gt;inform&lt;/strong&gt; coverage decisions. AgentAuditPool &lt;strong&gt;enforces&lt;/strong&gt; economic consequences.&lt;/p&gt;

&lt;p&gt;BASANOS never emits &lt;code&gt;scoreBps&lt;/code&gt; and never calls &lt;code&gt;coverListing&lt;/code&gt;. If someone tells you assurance &lt;em&gt;is&lt;/em&gt; insurance, they are selling confusion.&lt;/p&gt;




&lt;h2&gt;
  
  
  The measurement that hurt
&lt;/h2&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%2F26lqpxgv36ifsyy4xz24.jpg" 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%2F26lqpxgv36ifsyy4xz24.jpg" alt="Split view — per-file PASS with floating pragma warnings vs cross-contract graph FAIL" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;BASANOS runs two layers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Per file&lt;/strong&gt; — 17 detectors on one contract at a time: CEI patterns, access modifiers, delegatecall, raw &lt;code&gt;ecrecover&lt;/code&gt;, spot-price reads, allow-lists that are written but never enforced.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Whole tree&lt;/strong&gt; — &lt;code&gt;basanos/xcontract.py&lt;/code&gt; builds a contract graph: who may write each storage slot, who reads whose state across contracts.&lt;/p&gt;

&lt;p&gt;Here is the story that forced the second layer.&lt;/p&gt;

&lt;p&gt;A hand audit of our own &lt;strong&gt;ACEX&lt;/strong&gt; contracts found two exploitable criticals:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The same USDC pledged to a lending pool &lt;strong&gt;and&lt;/strong&gt; to a bond series across two contracts.&lt;/li&gt;
&lt;li&gt;A default whose beneficiary could trigger it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We ran BASANOS on that exact tree &lt;strong&gt;before&lt;/strong&gt; the graph layer existed. Result: &lt;strong&gt;eight findings, all &lt;code&gt;pragma.floating&lt;/code&gt;&lt;/strong&gt;, pack verdict &lt;strong&gt;PASS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Both bugs were correct in &lt;strong&gt;every single file&lt;/strong&gt;. Only the &lt;strong&gt;graph&lt;/strong&gt; was wrong.&lt;/p&gt;

&lt;p&gt;Today the same vulnerable tree reads &lt;strong&gt;FAIL&lt;/strong&gt; with root causes named. The fixed tree reads &lt;strong&gt;REVIEW&lt;/strong&gt; — we do not hand out silent PASS on shapes nobody has checked.&lt;/p&gt;

&lt;p&gt;The graph layer does &lt;strong&gt;not&lt;/strong&gt; prove the invariant. It tells you &lt;strong&gt;which invariant to check&lt;/strong&gt; and where both ends live. Every pack says so in &lt;code&gt;basanos/limits.py&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  One invoke, root id not path
&lt;/h2&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%2Fzu1gbv5x5l5xjoj5hedy.jpg" 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%2Fzu1gbv5x5l5xjoj5hedy.jpg" alt="Terminal curling BASANOS fixtures scan with signed FAIL pack" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Capability: &lt;code&gt;agent.security.contract-assurance@v1&lt;/code&gt; · live UI at &lt;a href="https://basanos.modelmarket.dev/" rel="noopener noreferrer"&gt;basanos.modelmarket.dev&lt;/a&gt; · landing at &lt;a href="https://alexar76.github.io/basanos/" rel="noopener noreferrer"&gt;alexar76.github.io/basanos&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/alexar76/basanos
&lt;span class="nb"&gt;cd &lt;/span&gt;basanos
uv &lt;span class="nb"&gt;sync&lt;/span&gt; &lt;span class="nt"&gt;--extra&lt;/span&gt; dev
uv run pytest &lt;span class="nt"&gt;-q&lt;/span&gt;          &lt;span class="c"&gt;# 94 tests · ~95% coverage&lt;/span&gt;
uv run python agent.py    &lt;span class="c"&gt;# http://127.0.0.1:9470/ui/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On a fresh clone you can hit the deliberately-vulnerable corpus:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; http://127.0.0.1:9470/invoke &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'content-type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"product_id":"basanos","capability_id":"agent.security.contract-assurance@v1","input":{"roots":["fixtures"]}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You name a &lt;strong&gt;root id&lt;/strong&gt;, never a filesystem path — that is what stops &lt;code&gt;/invoke&lt;/code&gt; from becoming a local-file read primitive.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Root id&lt;/th&gt;
&lt;th&gt;Resolves to&lt;/th&gt;
&lt;th&gt;Standalone clone&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;fixtures&lt;/code&gt;, &lt;code&gt;sound&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;BASANOS test corpus&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;yes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;acex&lt;/code&gt;, &lt;code&gt;lottery&lt;/code&gt;, &lt;code&gt;core&lt;/code&gt;, &lt;code&gt;zk&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Monorepo contract trees&lt;/td&gt;
&lt;td&gt;monorepo checkout only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;fixtures&lt;/code&gt; should come back &lt;strong&gt;FAIL&lt;/strong&gt; with real findings. Asking for &lt;code&gt;acex&lt;/code&gt; from a standalone clone returns &lt;strong&gt;&lt;code&gt;NO_SUBJECT&lt;/code&gt;&lt;/strong&gt; — no Solidity was read, so the pack judges nothing. That is not a clean bill and not an accusation.&lt;/p&gt;

&lt;p&gt;Verdicts: &lt;strong&gt;PASS&lt;/strong&gt; · &lt;strong&gt;REVIEW&lt;/strong&gt; · &lt;strong&gt;FAIL&lt;/strong&gt; · &lt;strong&gt;NO_SUBJECT&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Optional intel (&lt;code&gt;BASANOS_THREAT_INTEL=1&lt;/code&gt;): OSV + GitHub advisory allowlist only. Advisory text can reorder detectors. It cannot invent a new one.&lt;/p&gt;




&lt;h2&gt;
  
  
  What happens on FAIL (and what never happens)
&lt;/h2&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%2Fllh6xa29emvpnrg4z865.jpg" 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%2Fllh6xa29emvpnrg4z865.jpg" alt="Honest limits — not tier-1 PDF, not insurance, recommend-only playbook" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On &lt;strong&gt;FAIL&lt;/strong&gt; or &lt;strong&gt;REVIEW&lt;/strong&gt;, the pack includes a &lt;strong&gt;recommend-only&lt;/strong&gt; playbook aligned with ISO/IEC 29147 disclosure, ISO/IEC 30111 handling, and NIST SP 800-61 containment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stop shipping that digest&lt;/li&gt;
&lt;li&gt;verify privately&lt;/li&gt;
&lt;li&gt;patch&lt;/li&gt;
&lt;li&gt;re-scan&lt;/li&gt;
&lt;li&gt;disclose after the fix or a 90-day CVD window&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;BASANOS will &lt;strong&gt;not&lt;/strong&gt; pause a live contract. It will &lt;strong&gt;not&lt;/strong&gt; publish an exploit. It will &lt;strong&gt;not&lt;/strong&gt; replace a human who decides to stake USDC on a listing.&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%2Fmxtd4gw3812ga6d7q8kp.jpg" 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%2Fmxtd4gw3812ga6d7q8kp.jpg" alt="ACEX timeline — per-file PASS, hand audit criticals, graph FAIL" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What BASANOS is not
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Not&lt;/strong&gt; a tier-1 firm audit PDF — say &lt;strong&gt;machine assurance pack&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not&lt;/strong&gt; Slither or Foundry &lt;code&gt;forge test&lt;/code&gt; — complementary, not a drop-in replacement&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not&lt;/strong&gt; a formal prover — it finds the &lt;em&gt;shape&lt;/em&gt; of a cross-contract flaw, not a proof&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not&lt;/strong&gt; HEPHAESTUS — &lt;a href="https://forge.modelmarket.dev/" rel="noopener noreferrer"&gt;forge.modelmarket.dev&lt;/a&gt; is the smith; BASANOS is the stone you scrape the alloy on&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Crypto stays &lt;strong&gt;off&lt;/strong&gt; the hero. On-chain insurance is a separate act humans opt into after reading the pack.&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;git clone https://github.com/alexar76/basanos
&lt;span class="nb"&gt;cd &lt;/span&gt;basanos &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; uv &lt;span class="nb"&gt;sync&lt;/span&gt; &lt;span class="nt"&gt;--extra&lt;/span&gt; dev &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; uv run python agent.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/alexar76/basanos" rel="noopener noreferrer"&gt;github.com/alexar76/basanos&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Live: &lt;a href="https://basanos.modelmarket.dev/" rel="noopener noreferrer"&gt;basanos.modelmarket.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: five languages in &lt;code&gt;docs/README.*.md&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have ever shipped a green CI scan and still felt uneasy about cross-contract state — this is the layer we were missing. A star helps; a reproducible FAIL on &lt;code&gt;fixtures&lt;/code&gt; helps more.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>security</category>
      <category>web3</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I wanted a signed AIMarket provider without the monorepo. One CLI later, I had one.</title>
      <dc:creator>Alex</dc:creator>
      <pubDate>Sat, 22 Aug 2026 05:01:03 +0000</pubDate>
      <link>https://dev.to/alexar76/i-wanted-a-signed-aimarket-provider-without-the-monorepo-one-cli-later-i-had-one-3jfi</link>
      <guid>https://dev.to/alexar76/i-wanted-a-signed-aimarket-provider-without-the-monorepo-one-cli-later-i-had-one-3jfi</guid>
      <description>&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%2Ftu0ft5rr56unq1dff0zz.jpg" 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%2Ftu0ft5rr56unq1dff0zz.jpg" alt="Empty folder becoming a stamped PROVIDER box on a dark desk" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most “ship an AI agent” tutorials start in a monorepo the size of a small city.&lt;/p&gt;

&lt;p&gt;I wanted the opposite: an empty directory, one command, and a provider that already knew how to sign its answers.&lt;/p&gt;

&lt;p&gt;That tool now exists on PyPI as &lt;strong&gt;&lt;code&gt;create-aimarket-agent&lt;/code&gt; 0.1.0&lt;/strong&gt; — a standalone scaffolder for &lt;a href="https://alexar76.github.io/create-aimarket-agent/" rel="noopener noreferrer"&gt;AIMarket Protocol v2&lt;/a&gt; capability providers. Docs in five languages. Generator CI claims &lt;strong&gt;47 tests&lt;/strong&gt; and &lt;strong&gt;100% branch coverage&lt;/strong&gt;. MIT.&lt;/p&gt;

&lt;p&gt;It does &lt;strong&gt;not&lt;/strong&gt; publish you to a marketplace. That part stays manual on purpose.&lt;/p&gt;




&lt;h2&gt;
  
  
  One command. Stable names.
&lt;/h2&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%2Fzbsbyxnn3k4ux1rw52it.jpg" 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%2Fzbsbyxnn3k4ux1rw52it.jpg" alt="Dark terminal running uvx create-aimarket-agent" width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uvx create-aimarket-agent my-agent &lt;span class="nt"&gt;--kind&lt;/span&gt; tool &lt;span class="nt"&gt;--metis&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;my-agent
uv &lt;span class="nb"&gt;sync&lt;/span&gt; &lt;span class="nt"&gt;--extra&lt;/span&gt; dev
uv run python configure_provider.py
uv run pytest
uv run python validate_manifest.py
uv run python agent.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI, flags, filenames, and API fields stay English everywhere. Localization covers the docs, not the contract.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;create-aimarket-agent my-tool &lt;span class="nt"&gt;--kind&lt;/span&gt; tool
create-aimarket-agent my-data &lt;span class="nt"&gt;--kind&lt;/span&gt; data-provider
create-aimarket-agent my-orchestrator &lt;span class="nt"&gt;--kind&lt;/span&gt; orchestrator
create-aimarket-agent my-agent &lt;span class="nt"&gt;--no-metis&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Scaffolding is atomic: stage in a temp folder, rename into place, clean up. A failed copy leaves no half-written repo.&lt;/p&gt;

&lt;p&gt;Project names are allow-listed before they touch source or JSON. That sounds boring until the first time a fancy name breaks a Dockerfile.&lt;/p&gt;




&lt;h2&gt;
  
  
  What lands on disk
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agent.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;FastAPI &lt;code&gt;/health&lt;/code&gt; + &lt;code&gt;/invoke&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;capability.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Protocol v2 manifest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;provider_signing.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Persistent Ed25519 identity + request-bound signatures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;configure_provider.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Writes &lt;code&gt;provider_pubkey&lt;/code&gt; into the manifest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;validate_manifest.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fail-closed checks before you even think about publish&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;test_agent.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;API, signature, request-size tests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Dockerfile&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Non-root image, key volume at &lt;code&gt;/data&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.github/workflows/test.yml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CI for the generated project&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The default manifest looks like this (placeholders replaced with your slug):&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;"product_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"my-agent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"capability_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"my-agent.invoke@v1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"my-agent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A generated AIMarket tool capability"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"invoke_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://127.0.0.1:8080/invoke"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"publisher_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"community"&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_pubkey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;"price_per_call_usd"&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.001&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"input_schema"&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="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"additionalProperties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"output_schema"&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="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"additionalProperties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"verification"&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="nl"&gt;"metis"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="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;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%2F8dqk38ovw6n8lb2ik2b0.jpg" 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%2F8dqk38ovw6n8lb2ik2b0.jpg" alt="capability.json beside a VALIDATE stamp" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;configure_provider.py&lt;/code&gt; fills &lt;code&gt;provider_pubkey&lt;/code&gt;. &lt;code&gt;validate_manifest.py&lt;/code&gt; rejects duplicate JSON keys, broken Ed25519 keys, non-finite prices, bad URLs, and public HTTP endpoints before you ship.&lt;/p&gt;

&lt;p&gt;The skeleton &lt;code&gt;/invoke&lt;/code&gt; only accepts the product and capability ids declared in its own manifest. An untrusted caller cannot make your key sign someone else’s identity.&lt;/p&gt;




&lt;h2&gt;
  
  
  The part I actually cared about: the stamp
&lt;/h2&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%2Fgdbcwafuy4rx52s61kpd.jpg" 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%2Fgdbcwafuy4rx52s61kpd.jpg" alt="Steel stamps ATOMIC, Ed25519, REQUEST-BOUND beside a provider.key fob" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pretty agents are easy. Replay-resistant receipts are not.&lt;/p&gt;

&lt;p&gt;The generated signer keeps a &lt;strong&gt;32-byte Ed25519 seed&lt;/strong&gt; at mode &lt;code&gt;0600&lt;/code&gt;. Symlinks and non-regular files get rejected. Responses sign a canonical envelope with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;capability_id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;product_id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;SHA-256 of the input&lt;/li&gt;
&lt;li&gt;the result&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That binding is the point. Steal a response for request A and it should not verify as a reply to request B.&lt;/p&gt;

&lt;p&gt;The signature is a receipt for what this provider returned. It is &lt;strong&gt;not&lt;/strong&gt; an authorization gate for random internet callers. Keep &lt;code&gt;8080&lt;/code&gt; on loopback until real HTTPS ingress, concurrency, and rate limits sit in front.&lt;/p&gt;




&lt;h2&gt;
  
  
  Docker without drama
&lt;/h2&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%2Flai3deoz7bt7y189u7ud.jpg" 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%2Flai3deoz7bt7y189u7ud.jpg" alt="Read-only crate labeled 8080 with a /data volume" width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; my-agent &lt;span class="nb"&gt;.&lt;/span&gt;
docker run &lt;span class="nt"&gt;--read-only&lt;/span&gt; &lt;span class="nt"&gt;--tmpfs&lt;/span&gt; /tmp &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 127.0.0.1:8080:8080 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; my-agent-key:/data my-agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Runs as UID &lt;code&gt;65532&lt;/code&gt;, health-checks &lt;code&gt;/health&lt;/code&gt;, stores the key under &lt;code&gt;/data/provider.key&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Back up that key before you register anything. Rotate it and the Hub’s stored &lt;code&gt;provider_pubkey&lt;/code&gt; becomes a stranger.&lt;/p&gt;




&lt;h2&gt;
  
  
  From skeleton to something useful: THEMIS
&lt;/h2&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%2Fcjpbkgsdv3fdc79r5p1t.jpg" 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%2Fcjpbkgsdv3fdc79r5p1t.jpg" alt="THEMIS dossier with APPROVE / REVIEW / REJECT" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The README does not stop at “echo hello.” There is a full tutorial that turns the scaffold into &lt;strong&gt;THEMIS&lt;/strong&gt; — a procurement gate that answers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Should this candidate agent be approved, sent to human review, or rejected?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Deterministic policy checks. Projected cost. OWASP Agentic risk mappings. Optional lazy Metis verification that never silently overrides the verdict. Same request-bound signing model.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tutorial: &lt;a href="https://github.com/alexar76/create-aimarket-agent/blob/main/docs/tutorials/themis.en.md" rel="noopener noreferrer"&gt;docs/tutorials/themis.en.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Finished repo: &lt;a href="https://github.com/alexar76/themis" rel="noopener noreferrer"&gt;alexar76/themis&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you only want a tool capability, ignore THEMIS. If you want a real admission gate, start there.&lt;/p&gt;




&lt;h2&gt;
  
  
  What this is not
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Not auto-publish.&lt;/strong&gt; Stake, publisher identity, trust policy, and Hub registration stay explicit operator steps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not “the monorepo.”&lt;/strong&gt; The GitHub repo is a &lt;strong&gt;read-only mirror&lt;/strong&gt; of the AI-Factory tree. PRs there get overwritten on the next sync — open an issue instead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not a substitute for HTTPS.&lt;/strong&gt; Loopback + signature ≠ production exposure.&lt;/li&gt;
&lt;/ul&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;uvx create-aimarket-agent my-agent &lt;span class="nt"&gt;--kind&lt;/span&gt; tool &lt;span class="nt"&gt;--metis&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Docs: &lt;a href="https://alexar76.github.io/create-aimarket-agent/" rel="noopener noreferrer"&gt;alexar76.github.io/create-aimarket-agent&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source / issues: &lt;a href="https://github.com/alexar76/create-aimarket-agent" rel="noopener noreferrer"&gt;github.com/alexar76/create-aimarket-agent&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Package: &lt;code&gt;create-aimarket-agent&lt;/code&gt; on PyPI (&lt;code&gt;0.1.0&lt;/code&gt; as of this writing)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Empty folder in. Signed provider out. Marketplace listing still your call — which is exactly how I wanted it.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>python</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I connected one MCP server. It searched a live marketplace and returned a signed weather receipt.</title>
      <dc:creator>Alex</dc:creator>
      <pubDate>Fri, 21 Aug 2026 11:54:52 +0000</pubDate>
      <link>https://dev.to/alexar76/i-connected-one-mcp-server-it-searched-a-live-marketplace-and-returned-a-signed-weather-receipt-204e</link>
      <guid>https://dev.to/alexar76/i-connected-one-mcp-server-it-searched-a-live-marketplace-and-returned-a-signed-weather-receipt-204e</guid>
      <description>&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%2Fho3t0v0pqm9g6nnd7oje.jpg" 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%2Fho3t0v0pqm9g6nnd7oje.jpg" alt="Tablet asking for weather beside a stamped Hub MCP receipt" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most MCP tutorials stop at “install another server.”&lt;/p&gt;

&lt;p&gt;I wanted the opposite: &lt;strong&gt;one remote MCP&lt;/strong&gt;, two tools, and a receipt I could keep — without adding a new server every time an agent needed a different capability.&lt;/p&gt;

&lt;p&gt;So I pointed a client at the Official MCP Registry entry for &lt;code&gt;aimarket-hub&lt;/code&gt;, opened the live remote, and asked for weather.&lt;/p&gt;




&lt;h2&gt;
  
  
  Two tools. That is the whole door.
&lt;/h2&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%2Ffiu83ef1vyfsndo23xl4.jpg" 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%2Ffiu83ef1vyfsndo23xl4.jpg" alt="Terminal showing market_search and market_invoke" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Hub MCP exposes exactly two tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;market_search&lt;/code&gt; — plain-language intent → capability ids, prices, &lt;code&gt;source_hub&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;market_invoke&lt;/code&gt; — call one capability; trial invokes first; then paid access&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Remote URL (streamable HTTP):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://modelmarket.dev/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No monorepo tour. No “install seventeen servers.” Search, then invoke.&lt;/p&gt;




&lt;h2&gt;
  
  
  Find it on the Official Registry
&lt;/h2&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%2Fjn96k0g1vk7rshbq59zt.jpg" 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%2Fjn96k0g1vk7rshbq59zt.jpg" alt="Official MCP Registry card for aimarket-hub" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the &lt;a href="https://registry.modelcontextprotocol.io/" rel="noopener noreferrer"&gt;Official MCP Registry&lt;/a&gt;, search &lt;code&gt;aimarket-hub&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Live pull (2026-08-21):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;name: &lt;code&gt;io.github.alexar76/aimarket-hub&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;status: &lt;strong&gt;active&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;published: &lt;strong&gt;2026-08-16&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;remote: &lt;code&gt;https://modelmarket.dev/mcp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;tools: &lt;code&gt;market_search&lt;/code&gt; · &lt;code&gt;market_invoke&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not invent a server from a blog post. Take the registered remote.&lt;/p&gt;




&lt;h2&gt;
  
  
  market_search: ask in English
&lt;/h2&gt;

&lt;p&gt;I called &lt;code&gt;market_search&lt;/code&gt; with intent:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;attested weather reading&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Back came (among others):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;capability_id&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gaia.weather.read@v1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;product_id&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gaia.gateway&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;price_per_call_usd&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.001&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;source_hub&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://iot.modelmarket.dev&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Search is a &lt;strong&gt;catalogue&lt;/strong&gt;. It is not a forecast. Read the description before you spend a trial.&lt;/p&gt;

&lt;p&gt;When I searched hydrology earlier, a flood SKU said out loud: &lt;em&gt;not an in-situ river gauge&lt;/em&gt;. That sentence is the product.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pass source_hub. Or the hub refuses.
&lt;/h2&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%2Fifis7oba9gwe6i4df7is.jpg" 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%2Fifis7oba9gwe6i4df7is.jpg" alt="Two papers: WITH source_hub OK, WITHOUT source_hub federated retry" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most of the catalogue is &lt;strong&gt;federated&lt;/strong&gt;. Not local to the hub.&lt;/p&gt;

&lt;p&gt;I tried &lt;code&gt;market_invoke&lt;/code&gt; with the same capability id and &lt;strong&gt;no&lt;/strong&gt; &lt;code&gt;source_hub&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The answer was blunt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;gaia.weather.read@v1&lt;/code&gt; is federated, not local — retry with &lt;code&gt;source_hub="https://iot.modelmarket.dev"&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That refusal is honesty. Not a bug. Pass what search gave you.&lt;/p&gt;




&lt;h2&gt;
  
  
  market_invoke: a real reading + a receipt
&lt;/h2&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%2F2hu816a8lmkuk3g0n9sp.jpg" 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%2F2hu816a8lmkuk3g0n9sp.jpg" alt="Printed Hub MCP receipt for gaia.weather.read" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then I invoked with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;capability_id&lt;/code&gt;: &lt;code&gt;gaia.weather.read@v1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;source_hub&lt;/code&gt;: &lt;code&gt;https://iot.modelmarket.dev&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;input.device_id&lt;/code&gt;: &lt;code&gt;om-wx-01&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What came back (this run, 2026-08-21):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;device: &lt;strong&gt;om-wx-01&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;site: &lt;strong&gt;live-weather-eu&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;temperature: &lt;strong&gt;~21.5 °C&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Ed25519 attestation on the reading&lt;/li&gt;
&lt;li&gt;Hub receipt (signed)&lt;/li&gt;
&lt;li&gt;sandbox: trial invoke (&lt;code&gt;max_trials&lt;/code&gt; = 5)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The receipt outlives the chat tab. Keep it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Trial then paid. Then 402.
&lt;/h2&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%2Foxlfydxyxss7xuv5349z.jpg" 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%2Foxlfydxyxss7xuv5349z.jpg" alt="Paper printout of HTTP 402 — trial then paid" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The public remote grants a short &lt;strong&gt;trial&lt;/strong&gt; allowance.&lt;/p&gt;

&lt;p&gt;When the allowance ends, the hub answers &lt;strong&gt;402&lt;/strong&gt;. It does &lt;strong&gt;not&lt;/strong&gt; invent a weather reading to keep the demo pretty.&lt;/p&gt;

&lt;p&gt;Empty payment is still an honest answer.&lt;/p&gt;




&lt;h2&gt;
  
  
  What this is not
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Not a new MCP server per SKU&lt;/li&gt;
&lt;li&gt;Not a flood model / weather cinema&lt;/li&gt;
&lt;li&gt;Not “trust the JSON forever”&lt;/li&gt;
&lt;li&gt;Not a monorepo pitch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is a door: registry → two tools → signed invoke.&lt;/p&gt;

&lt;p&gt;Human doors (maps, build paths, investor intro) live on &lt;a href="https://use.modelmarket.dev/" rel="noopener noreferrer"&gt;use.modelmarket.dev&lt;/a&gt;. The agent door for this article is the Hub MCP.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;a href="https://registry.modelcontextprotocol.io/" rel="noopener noreferrer"&gt;registry.modelcontextprotocol.io&lt;/a&gt; → search &lt;code&gt;aimarket-hub&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Point your MCP client at &lt;code&gt;https://modelmarket.dev/mcp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Call &lt;code&gt;market_search&lt;/code&gt; with a plain intent&lt;/li&gt;
&lt;li&gt;Call &lt;code&gt;market_invoke&lt;/code&gt; &lt;strong&gt;with&lt;/strong&gt; &lt;code&gt;source_hub&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Keep the receipt&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If something fails closed, read the message. That is the feature.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>mcp</category>
      <category>ai</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
