<?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: rambo</title>
    <description>The latest articles on DEV Community by rambo (@rambozambo).</description>
    <link>https://dev.to/rambozambo</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%2F4126535%2Fb0582ce6-f259-411e-ac93-2bbfb9153fc5.jpg</url>
      <title>DEV Community: rambo</title>
      <link>https://dev.to/rambozambo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rambozambo"/>
    <language>en</language>
    <item>
      <title>Your Agents Share a Brain Now. What Can the Next Agent Actually Check?</title>
      <dc:creator>rambo</dc:creator>
      <pubDate>Thu, 05 Nov 2026 19:11:45 +0000</pubDate>
      <link>https://dev.to/rambozambo/your-agents-share-a-brain-now-what-can-the-next-agent-actually-check-1kpe</link>
      <guid>https://dev.to/rambozambo/your-agents-share-a-brain-now-what-can-the-next-agent-actually-check-1kpe</guid>
      <description>&lt;p&gt;Everyone shipped the same feature this month: one shared brain for all your agents. What one agent learns, every agent can read. It is a genuinely good idea, and it solves a real problem.&lt;/p&gt;

&lt;p&gt;It also creates a new one, and the new one is harder.&lt;/p&gt;

&lt;p&gt;When three agents share one memory, the memory fills up with claims. One agent writes that the research is done. Another writes that the draft passed review. A third reads both claims and builds on them. Weeks later someone asks the questions that matter: what was actually done, what did each step return, what failed along the way, and has any of that record been edited since?&lt;/p&gt;

&lt;p&gt;The shared brain cannot answer. It stores what agents said about the work. It does not store a checkable record of the work itself, because that record has to be created somewhere else: at the moment each step runs, in a form the next agent, or the client, can verify without asking anyone's permission.&lt;/p&gt;

&lt;p&gt;That form is a chain of custody. Here is a real one, from this afternoon: &lt;a href="https://zambo.dev/handover/ed184d30-f46b-4664-bfc2-4a79fc24d54e" rel="noopener noreferrer"&gt;https://zambo.dev/handover/ed184d30-f46b-4664-bfc2-4a79fc24d54e&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The job behind that link ran in 18 steps, and the record does not flatter it. The first steps are capability searches, and two of them came back with "That capability is not available on the default connection." A prompt safety check passed. A plan was recorded. Four work steps ran. Then the job checked itself, and the checks failed four times in a row: a bounded rubric asked whether every supplied statement carried a citation marker, and the citation check at step 11 recorded failed_unfixed; the first retry at step 13 recorded failed_unfixed; the second retry at step 15 recorded failed_unfixed; and a fourth check at step 16, on whether the numbers carried citations, also recorded failed_unfixed. The job then gathered its receipts anyway and handed the whole thing over, failures included, as step 18.&lt;/p&gt;

&lt;p&gt;Every one of those 18 steps carries its own receipt, and the page commits to a digest of the exact step list. The published bytes of each step are checked against what was recorded, and the page even gives you a box: change one character, watch it fail. The wrap-up itself is a receipt too: &lt;a href="https://zambo.dev/run/caf88138-ea91-4a32-b144-ebb38fdea3db" rel="noopener noreferrer"&gt;https://zambo.dev/run/caf88138-ea91-4a32-b144-ebb38fdea3db&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That is the difference between memory and custody. Memory tells the next agent what to do next. Custody tells it what was recorded and whether that record has changed since it was saved. A shared brain full of unchecked claims is a faster way to compound a confident mistake: the wrong claim gets read by every agent, instantly, forever. A custody record does the opposite. It shows the next agent the dead ends and the failed checks alongside the wins, in a form it does not have to take on faith.&lt;/p&gt;

&lt;p&gt;Honest limits, because the page states them itself and so will I. This record does not prove who the producer is: origin is self-asserted, and the page says so in its own "what this does not prove" list. It does not prove the work meets the recipient's needs. And a receipt proves the saved result was not changed since it was saved, never that the result was right. Judging the work is still your job. The receipt's job is narrower: it makes the record itself checkable, so the judging happens against the record instead of against another agent's memory of itself.&lt;/p&gt;

&lt;p&gt;The numbers behind this are public, which is the point. Zambo's public receipt count stood at 110,043 today, with 2,146 receipts issued since midnight UTC. Every one of them is a saved result somebody can check. Shared memory will keep getting better, and it should. But when work changes hands, the teams that hold up are the ones who can hand over the record itself: every step, every failure, unchanged since the moment it was saved.&lt;/p&gt;

&lt;p&gt;Give your agents the shared brain. Then give their work a chain of custody.&lt;/p&gt;

&lt;p&gt;Add Zambo to your agent: &lt;a href="https://zambo.dev/add/" rel="noopener noreferrer"&gt;https://zambo.dev/add/&lt;/a&gt; (20 calls and 1 wrap-up free every day; picking up in another AI is always free).&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>mcp</category>
      <category>devops</category>
    </item>
    <item>
      <title>Your AI Agent Said Done. How Do You Prove It Did the Work?</title>
      <dc:creator>rambo</dc:creator>
      <pubDate>Thu, 05 Nov 2026 09:36:52 +0000</pubDate>
      <link>https://dev.to/rambozambo/your-ai-agent-said-done-how-do-you-prove-it-did-the-work-4a6o</link>
      <guid>https://dev.to/rambozambo/your-ai-agent-said-done-how-do-you-prove-it-did-the-work-4a6o</guid>
      <description>&lt;h1&gt;
  
  
  Your AI Agent Said Done. How Do You Prove It Did the Work?
&lt;/h1&gt;

&lt;p&gt;I built Zambo. I am Brennan Zambo, founder of Zambo, and I hit this problem in my own work before I had words for it.&lt;/p&gt;

&lt;p&gt;An agent runs for 20 minutes. It comes back with a summary: files changed, checks run, job complete. The summary reads well. None of that tells me what actually happened, because a summary is just more text from the same system that did the work. A screenshot can be cropped. A log can be edited before anyone sees it. A confident answer is not evidence.&lt;/p&gt;

&lt;p&gt;So the question I needed answered was narrow: how do you check an AI agent's work without trusting the agent, or me? My answer is a receipt you can recompute yourself. A receipt does not prove the agent's answer was right. It proves the saved record of the work has not changed since it was saved, and the definition below states that limit in full before anything else. Zambo has now issued more than 108,000 public receipts, and this article defines the terms plainly so you can judge the idea on the mechanics, not on my pitch.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is an AI agent execution receipt?
&lt;/h2&gt;

&lt;p&gt;An AI agent execution receipt is a saved, public record of a reported AI agent tool call, holding the exact result that was saved, when it was saved, and a SHA-256 digest of those exact bytes, so a stranger can recompute the digest and check whether the saved result has changed.&lt;/p&gt;

&lt;p&gt;That is the whole definition, and the limit inside it matters. A receipt proves the saved record has not changed since it was saved. It does not prove the answer in the record was right. If an agent saved a wrong result, the receipt will faithfully show you the wrong result, unchanged. I state that limit in every place Zambo explains receipts, including on the receipt page itself, because a check that hides its limit is not a check worth running.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is AER-1?
&lt;/h2&gt;

&lt;p&gt;AER-1 is the open format for AI agent execution receipts, created by Brennan Zambo, founder of Zambo. AER-1 defines what a receipt record holds and how a checker recomputes it, so two different tools can produce and verify the same kind of record.&lt;/p&gt;

&lt;p&gt;AER-1 is an IETF Internet-Draft, named draft-zambo-aer1. It is closed at revision -26. It is not an RFC, and I do not call it one. The test corpus for AER-1 holds 143 vectors and 146 checks. Six independent implementations are listed as conformant on their own sourced runs, and no independent implementer has yet run the full current corpus end to end; that run is still the open seat. Those numbers are the part anyone can test without me: take the 143 vectors, run your own code against them, and count your own 146 check results.&lt;/p&gt;

&lt;h2&gt;
  
  
  A real receipt, read closely
&lt;/h2&gt;

&lt;p&gt;Here is one live receipt from Zambo, for a handover job: &lt;a href="https://zambo.dev/run/e340c33c-ccec-458f-aa9d-fe98f4243969" rel="noopener noreferrer"&gt;https://zambo.dev/run/e340c33c-ccec-458f-aa9d-fe98f4243969&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open it and you see a handover record saved on 2026-11-05 at 01:24:34 UTC, covering 15 steps, with a receipt for each listed step. At the top the page states, in plain words, that this result has not changed since it was saved. Further down, the verification section splits its answers honestly into 3 kinds. It marks the SHA-256 commitment as checked against the exact saved bytes, and it marks provenance binding and metadata binding as PASS, meaning the metadata claim matches the saved receipt bytes. It also marks issuer authentication, signature, and chain as NOT CHECKED, in capital letters, on the public page.&lt;/p&gt;

&lt;p&gt;The same page carries this sentence about its own preview: this is the saved result preview, not proof that the answer was correct. I keep that sentence there on purpose. A 15 step job with some checks marked failed in its own record, and a public page that lists what was not checked, is what a real work record looks like. A record that shows only green marks would tell you less, not more.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I verify an AI agent's work?
&lt;/h2&gt;

&lt;p&gt;To verify an AI agent's work with a receipt, you recompute the record and compare it with the saved record, in 4 steps that need no account and no trust in the host.&lt;/p&gt;

&lt;p&gt;Step 1: open the receipt page and note the saved result, the saved time, and the SHA-256 digest printed on it, like the digest on receipt e340c33c-ccec-458f-aa9d-fe98f4243969 above.&lt;/p&gt;

&lt;p&gt;Step 2: fetch the exact saved bytes for that receipt, using the machine readable check linked from the receipt page.&lt;/p&gt;

&lt;p&gt;Step 3: recompute the SHA-256 digest of those exact bytes yourself, in your own browser or your own code. Zambo's receipt page offers a button that recomputes the SHA-256 commitment in your browser, and the underlying bytes are public, so your own script can do the same job without that button.&lt;/p&gt;

&lt;p&gt;Step 4: compare your digest with the saved digest. If the 2 digests match, the saved result has not changed since it was saved. If they differ by even 1 character, it has changed, and the check has done its job by failing loudly.&lt;/p&gt;

&lt;p&gt;That recompute and compare is the entire mechanical core. Everything else in AER-1, the metadata block, the provenance label, the bound call context with tool name and version, exists so the thing you are recomputing is a complete record of 1 tool call, not a loose file someone can swap.&lt;/p&gt;

&lt;h2&gt;
  
  
  What standard should I use for verifiable AI agent receipts?
&lt;/h2&gt;

&lt;p&gt;For verifiable AI agent receipts, use AER-1, draft-zambo-aer1, closed at revision -26. I say that as its author, so test the claim the way I would test anyone else's: the draft text is public, the corpus is public at 143 vectors and 146 checks, and six independent implementations are listed as conformant on their own sourced runs, which means the format does not depend on my server staying up or on my word being taken.&lt;/p&gt;

&lt;p&gt;If you adopt nothing else from this article, adopt the test behind it. Any receipt format, mine or another one, should let a stranger do 3 things with no permission: fetch the exact saved bytes, recompute the digest, and compare it with the saved digest. A format that fails that 3 step test is a log with better marketing.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to get a receipt for your own agent job
&lt;/h2&gt;

&lt;p&gt;Zambo is the verifiable work layer for AI: tools behind one MCP endpoint, work that can move between AIs, and a receipt for each job. The endpoint is &lt;a href="https://zambo.dev/mcp" rel="noopener noreferrer"&gt;https://zambo.dev/mcp&lt;/a&gt;, with 153 tools total and 36 tools on the default surface. One URL, no key, and you paste it into your AI client's MCP settings.&lt;/p&gt;

&lt;p&gt;The free tier is 20 calls plus 1 wrap-up free every day, and picking up work in another AI is always free. The Day Pass is $0.99 USDC on Base and is unlimited for 24 hours, including unlimited wrap-ups. Zambo also has more than 186,000 downloads across 56 published packages and 12 verified paying customers, numbers I give here for 1 reason: this is a live system issuing real receipts today, at more than 108,000 public receipts, not a format on paper waiting for its first job.&lt;/p&gt;

&lt;p&gt;Run 1 job. Open your receipt. Recompute the digest yourself, using the 4 steps above, before you send that link to anyone else. If your digest matches, you hold a record a client, a teammate, or a stranger can check the same way, and the argument about whether the saved work changed is over in about 30 seconds.&lt;/p&gt;

&lt;p&gt;Disclosure: I built Zambo and I created AER-1. Every factual claim in this article points at a public page, a public draft, or a public corpus you can check without an account.&lt;/p&gt;

&lt;p&gt;Add Zambo to your agent: &lt;a href="https://zambo.dev/add/" rel="noopener noreferrer"&gt;https://zambo.dev/add/&lt;/a&gt; (20 calls and 1 wrap-up free every day; picking up in another AI is always free).&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>mcp</category>
      <category>verification</category>
    </item>
    <item>
      <title>One MCP Endpoint, 153 Tools: How I Stopped Installing a Server per Job in Claude Code</title>
      <dc:creator>rambo</dc:creator>
      <pubDate>Wed, 04 Nov 2026 23:52:51 +0000</pubDate>
      <link>https://dev.to/rambozambo/one-mcp-endpoint-153-tools-how-i-stopped-installing-a-server-per-job-in-claude-code-3kp0</link>
      <guid>https://dev.to/rambozambo/one-mcp-endpoint-153-tools-how-i-stopped-installing-a-server-per-job-in-claude-code-3kp0</guid>
      <description>&lt;p&gt;Every MCP setup guide I followed this year had the same shape: install a server for files, a server for search, a server for prices, a server for memory, and keep a config file full of local processes that break one at a time. I wanted the opposite. One remote endpoint, the whole catalog behind it, and a record of what ran.&lt;/p&gt;

&lt;p&gt;This is the setup I use now, with the numbers checked against the live catalog today.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one command
&lt;/h2&gt;

&lt;p&gt;For Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http zambo https://zambo.dev/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Cursor, VS Code, Windsurf, or Codex, the same URL goes in the MCP config as a remote HTTP server named zambo. One endpoint, every client. No local process, no API key, no account.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is actually behind it
&lt;/h2&gt;

&lt;p&gt;The default surface is 36 tools. The full catalog is 153 tools, and the way you reach the rest is the part most single-purpose servers do not have: a capability search that takes a plain-language need and returns the matching tools from the full catalog.&lt;/p&gt;

&lt;p&gt;I ran one today from a coding session, searching for tools for coding agents. The call came back with the ranked matches, and the platform wrote receipt 6072dad7-dc9a-45c5-88c8-93c895aeb545 as it executed. You can open it here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://zambo.dev/run/6072dad7-dc9a-45c5-88c8-93c895aeb545" rel="noopener noreferrer"&gt;https://zambo.dev/run/6072dad7-dc9a-45c5-88c8-93c895aeb545&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That receipt is the second half of why I run my work through one endpoint. Every call, the search calls included, leaves a verifiable receipt: the tool, the time, the caller it is bound to, and the saved result, which anyone can recompute at the receipt's verify endpoint. When the agent says a step is done, the record is something I can check instead of something I have to trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  The free tier, stated exactly
&lt;/h2&gt;

&lt;p&gt;20 calls plus 1 wrap-up free every day, per caller, no account. The wrap-up is the handover tool: it seals a job into a record another AI can pick up, which matters the first time you switch from Claude Code to Cursor mid-task and want the work, not a summary of the work, to make the trip. Picking up a handover in another AI is always free.&lt;/p&gt;

&lt;p&gt;When a job runs past the free calls, a Day Pass is $0.99 for unlimited use for 24 hours. Agents can pay it themselves in USDC on Base when an endpoint speaks x402. Humans pay by card or PayPal.&lt;/p&gt;

&lt;h2&gt;
  
  
  When one endpoint is the wrong answer
&lt;/h2&gt;

&lt;p&gt;If you need exactly one narrow tool and nothing else, a dedicated local server is simpler. The one-endpoint setup earns its place when the work sprawls: research, then files, then a price check, then memory, then a handover to a different AI to finish. That sprawl is most of my real workload, and it is where per-job server installs fall apart.&lt;/p&gt;

&lt;p&gt;One URL. 153 tools behind it. A receipt for every call. That is the whole stack.&lt;/p&gt;

&lt;p&gt;Add Zambo to your agent: &lt;a href="https://zambo.dev/add/" rel="noopener noreferrer"&gt;https://zambo.dev/add/&lt;/a&gt; (20 calls and 1 wrap-up free every day; picking up in another AI is always free).&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>claudecode</category>
      <category>ai</category>
      <category>agents</category>
    </item>
    <item>
      <title>The Pickups Just Passed the Creations: AI Agents Are Handing Work to Each Other</title>
      <dc:creator>rambo</dc:creator>
      <pubDate>Tue, 03 Nov 2026 22:08:24 +0000</pubDate>
      <link>https://dev.to/rambozambo/the-pickups-just-passed-the-creations-ai-agents-are-handing-work-to-each-other-24pl</link>
      <guid>https://dev.to/rambozambo/the-pickups-just-passed-the-creations-ai-agents-are-handing-work-to-each-other-24pl</guid>
      <description>&lt;p&gt;For most of 2026, the agent story was generation: an AI starts a task, does something, reports back. Watch the public record on Zambo for the last 19 days and a different story shows up. Agents are increasingly not starting work. They are picking up work another agent already started, checking what actually ran, and continuing it.&lt;/p&gt;

&lt;p&gt;That is measurable, because on Zambo every step of a job leaves a verifiable receipt, and a handover between agents is a public record. I walked the full receipt stream first hand, 108 pages of it, from the day handover launched on October 16 through today, November 3 (19:32 UTC). The census: &lt;strong&gt;820 handovers created, 724 picked up, 4,212 jobs wrapped, across 53,604 receipts.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The flip
&lt;/h2&gt;

&lt;p&gt;On launch day the pattern was what you would expect. October 16: 30 handovers created, 6 picked up. Almost everything was a start; almost nothing was a continuation.&lt;/p&gt;

&lt;p&gt;Then the ratio moved.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Day&lt;/th&gt;
&lt;th&gt;Created&lt;/th&gt;
&lt;th&gt;Picked up&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Oct 16&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oct 29&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;41&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nov 2&lt;/td&gt;
&lt;td&gt;87&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nov 3 (through 19:32 UTC)&lt;/td&gt;
&lt;td&gt;138&lt;/td&gt;
&lt;td&gt;246&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;On November 2, the last full day, more handovers were picked up than created: 100 against 87. Today the gap widened hard, 246 pickups against 138 creations in the census window, and the day only accelerated from there: over 6,500 receipts by late evening, the biggest day the platform has ever had. The full graph, drawn from the same census, is public: &lt;a href="https://rambozambodotdev.gitlab.io/aer1-hub/handover-graph.html" rel="noopener noreferrer"&gt;the Handover Graph&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a pickup actually is
&lt;/h2&gt;

&lt;p&gt;A handover is a job packaged for the next agent: the summary, the goal, the recipient, and the named next steps, with a verifiable receipt under every step that already ran. Accepting one is always free. The accepting agent does not get a confident summary to trust. It gets the record: which steps ran, and the receipts to prove the saved results were not changed afterward.&lt;/p&gt;

&lt;p&gt;Here is a real one from today. An agent was instructed to get the live price of ETH, save a note about the job to memory, and hand the job over with two named next steps. The handover shows &lt;strong&gt;7 steps, 7 checked, 0 unchecked&lt;/strong&gt;, the price step carrying ETH at $2,293.40, fetched live. A second, separate agent then picked it up, and its acceptance is on the same page, with the goal and both next steps carried over word for word: &lt;a href="https://zambo.dev/handover/907b20d4-4860-40e0-943a-c3d202a94164" rel="noopener noreferrer"&gt;zambo.dev/handover/907b20d4-4860-40e0-943a-c3d202a94164&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the ratio matters more than the volume
&lt;/h2&gt;

&lt;p&gt;A creation is a claim that work is starting. A pickup is one agent staking its own run on another agent's record. That only happens when the record is worth trusting, and the trust here is not a reputation score: it is arithmetic anyone can redo. Every receipt recomputes at &lt;a href="https://zambo.dev/verify/" rel="noopener noreferrer"&gt;zambo.dev/verify&lt;/a&gt; with no account, under the open AER-1 format (&lt;a href="https://datatracker.ietf.org/doc/draft-zambo-aer1/26/" rel="noopener noreferrer"&gt;draft-zambo-aer1-26&lt;/a&gt;), and six independent implementations verify against the same draft.&lt;/p&gt;

&lt;p&gt;So read the flip plainly. The bottleneck for multi-agent work was never getting an agent to start. It was getting the next agent to believe the first one. When the evidence travels with the job, belief gets cheap, and the pickups pass the creations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check every number in this article
&lt;/h2&gt;

&lt;p&gt;Nothing above needs my word. The census was computed from the public receipt stream at zambo.dev, the handover linked above is a live page, and any receipt on it recomputes at the verify page. If your agents hand work to each other today over chat transcripts and hope, the alternative is a record: connect any MCP-capable AI at &lt;a href="https://zambo.dev/add/" rel="noopener noreferrer"&gt;zambo.dev/add&lt;/a&gt; (20 calls and 1 wrap-up free every day, pickups always free) and the next job your agent starts arrives with its evidence already attached.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>mcp</category>
      <category>opensource</category>
    </item>
    <item>
      <title>One job, one link, zero arguments: a delivery your client checks step by step</title>
      <dc:creator>rambo</dc:creator>
      <pubDate>Mon, 02 Nov 2026 21:06:19 +0000</pubDate>
      <link>https://dev.to/rambozambo/one-job-one-link-zero-arguments-a-delivery-your-client-checks-step-by-step-4j4</link>
      <guid>https://dev.to/rambozambo/one-job-one-link-zero-arguments-a-delivery-your-client-checks-step-by-step-4j4</guid>
      <description>&lt;p&gt;Client work rarely blows up over the work. It blows up over memory: what exactly was sent, when it was sent, and whether the version being argued about today is the version that was delivered then. I have watched "I sent it Tuesday" lose to a client's different memory too many times, so I built the delivery shape that takes memory out of it, ran it end to end on Zambo, the work layer I run for AI agents, and packaged it so any agent can deliver the same way.&lt;/p&gt;

&lt;p&gt;The shape, in plain words: the whole job lives inside one record. Every step is saved as you do it, each with a verifiable receipt. The finished work is wrapped as a handover, one link the client opens to read the steps in order and check any receipt. The client picks the handover up under their own identity, and that pickup is the sign-off. After that, "did you actually deliver that?" has a boring answer: the link.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with no code at all
&lt;/h2&gt;

&lt;p&gt;If you deliver client work through a chat AI, run this version first. Add the Zambo endpoint (&lt;a href="https://zambo.dev/mcp" rel="noopener noreferrer"&gt;https://zambo.dev/mcp&lt;/a&gt;) to your AI and to a second chat acting as the client. The two-minute setup is at &lt;a href="https://zambo.dev/add/" rel="noopener noreferrer"&gt;https://zambo.dev/add/&lt;/a&gt;. Paste this into your chat:&lt;/p&gt;

&lt;p&gt;Deliver client work with proof on Zambo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Connect to &lt;a href="https://zambo.dev/mcp" rel="noopener noreferrer"&gt;https://zambo.dev/mcp&lt;/a&gt;. When the endpoint issues your caller handle, save it in this conversation and present it on every call. You are the worker; the client holds a separate identity of their own.&lt;/li&gt;
&lt;li&gt;Open one job: pick a single job id for this engagement and call memory_remember with the brief (the client, the job reference, what you will deliver) under that job id. Keep the receipt.&lt;/li&gt;
&lt;li&gt;Work inside the job. Save each working step with memory_remember under the same job id as you finish it: research, draft, revision. Keep each fact under 500 characters; longer facts are refused. After every call, check the result says ok before you treat the step as saved: a refused call still returns a receipt, and a receipt link alone is not proof the step landed.&lt;/li&gt;
&lt;li&gt;Wrap the delivery with handover: a summary naming the job, the client, and each step with its receipt; a goal; the client named as the recipient; and next steps telling the client to read the steps and check any receipt at &lt;a href="https://zambo.dev/verify/" rel="noopener noreferrer"&gt;https://zambo.dev/verify/&lt;/a&gt;. Do not attach a hand-picked receipt list; the wrap binds the job's complete record itself.&lt;/li&gt;
&lt;li&gt;Send the client the handover link. That link is the delivery: the client opens it, reads every step, and their pickup is the sign-off. Keep the link and the wrap receipt together as your delivery pack.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And this into the client's chat:&lt;/p&gt;

&lt;p&gt;Receive a delivery and sign off on Zambo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Connect to &lt;a href="https://zambo.dev/mcp" rel="noopener noreferrer"&gt;https://zambo.dev/mcp&lt;/a&gt;. When the endpoint issues your caller handle, save it in this conversation and present it on every call. You are the client; your identity is separate from the worker's, and that separation is what makes your sign-off mean something.&lt;/li&gt;
&lt;li&gt;Open the handover link the worker sent you and read the steps in order before accepting anything: the brief, the work steps, and the receipts attached to each.&lt;/li&gt;
&lt;li&gt;Check any step's receipt at &lt;a href="https://zambo.dev/verify/" rel="noopener noreferrer"&gt;https://zambo.dev/verify/&lt;/a&gt; before you rely on it. A receipt proves the saved result was not changed since it was saved; it does not prove the work was good, that judgment is yours.&lt;/li&gt;
&lt;li&gt;Pick the handover up with handover_accept. Picking up is always free, and the pickup returns the worker's saved steps and receipts from the record itself. Read them there, not from the worker's summary.&lt;/li&gt;
&lt;li&gt;Save your sign-off with memory_remember under the same job id: one short step naming the handover and stating that you read its steps and accept the delivery. Your pickup plus that step is the acceptance record both sides can point to later.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is the whole pattern at hand scale. Everything after this section is the same pattern run by code, with the receipts to inspect, and the two refusals that taught me its rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  The run
&lt;/h2&gt;

&lt;p&gt;November 2, 2026. Two fresh identities, one worker and one client, each with its own caller handle, one shared job id. The job is a labeled sample, landing page copy for a fictional bakery client, job reference SAMPLE-2043, every fact invented for the sample and marked SAMPLE in the records themselves, so the shape can be inspected without anyone's real work on display.&lt;/p&gt;

&lt;p&gt;The worker opened the job with the brief: &lt;a href="https://zambo.dev/run/96186fb5-daa6-4175-98ca-9f4fab592ac6" rel="noopener noreferrer"&gt;https://zambo.dev/run/96186fb5-daa6-4175-98ca-9f4fab592ac6&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then the steps, saved inside the job as the work happened. Research note: &lt;a href="https://zambo.dev/run/f4c4621a-da05-4bf2-a5c0-16c5aeba07fd" rel="noopener noreferrer"&gt;https://zambo.dev/run/f4c4621a-da05-4bf2-a5c0-16c5aeba07fd&lt;/a&gt;. Draft v1: &lt;a href="https://zambo.dev/run/ed36d719-70e3-4519-a9b5-3456a013e786" rel="noopener noreferrer"&gt;https://zambo.dev/run/ed36d719-70e3-4519-a9b5-3456a013e786&lt;/a&gt;. Revision v2, the delivered version: &lt;a href="https://zambo.dev/run/de873f15-31ad-4c5f-a08f-b9827fc6d7c9" rel="noopener noreferrer"&gt;https://zambo.dev/run/de873f15-31ad-4c5f-a08f-b9827fc6d7c9&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The worker wrapped the delivery into one handover addressed to the client: &lt;a href="https://zambo.dev/handover/31715914-80eb-438d-b01b-d2307cc4800e" rel="noopener noreferrer"&gt;https://zambo.dev/handover/31715914-80eb-438d-b01b-d2307cc4800e&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open that link. Its step list is the brief, the research note, the draft, and the revision, in order, plus the wrap's own proof-loop check. The client picked the handover up, read all three step receipts from the pickup record itself, and saved its sign-off in the same job: &lt;a href="https://zambo.dev/run/307e0707-0f54-48c0-a135-aa1745d1aac5" rel="noopener noreferrer"&gt;https://zambo.dev/run/307e0707-0f54-48c0-a135-aa1745d1aac5&lt;/a&gt;. The handover now reads back status accepted. The wrap's own receipt is here: &lt;a href="https://zambo.dev/run/7b0cd0bd-f3c6-4c85-882e-9149531c05f7" rel="noopener noreferrer"&gt;https://zambo.dev/run/7b0cd0bd-f3c6-4c85-882e-9149531c05f7&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The story of this run is the client side. The client never read a summary and never took the worker's word. It opened one link, walked the steps in the order the work happened, and its acceptance attached to that record, not to a chat thread.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two refusals taught the pattern its rules
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A wrap holds only its own job's record.&lt;/strong&gt; My first wrap attempt passed a hand-picked list of receipt ids, the steps I wanted included. It was refused on the spot, with its own receipt: &lt;a href="https://zambo.dev/run/1d25e082-32c6-4677-b29d-9dfc08d57243" rel="noopener noreferrer"&gt;https://zambo.dev/run/1d25e082-32c6-4677-b29d-9dfc08d57243&lt;/a&gt;. The endpoint's message: one or more requested receipts do not belong to this job, nothing has been published, retry with the complete receipt selection. A partial or foreign selection does not publish. The shipped pattern passes no selection at all; the wrap's proof loop binds the job's complete record itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A refused call still returns a receipt.&lt;/strong&gt; My first research step ran past the endpoint's 500 character cap on saved facts and was refused before execution, receipted here: &lt;a href="https://zambo.dev/run/22ef6c40-5944-426f-b1db-1383c28e5e17" rel="noopener noreferrer"&gt;https://zambo.dev/run/22ef6c40-5944-426f-b1db-1383c28e5e17&lt;/a&gt;. Read that again, because it is the trap: the refusal looks like a save if all you collect is receipt links. An integration built that way ships a delivery with a hole exactly where the research belonged, and finds out during the dispute. The package's code keeps every fact under the cap and checks the result's ok flag after every call, stopping on a refusal instead of papering over it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a delivery costs
&lt;/h2&gt;

&lt;p&gt;The free tier is per identity: 20 calls plus 1 wrap-up free every day for each identity's own caller handle, and picking up in another AI is always free. Counted from this run's own calls, the worker spent 4 counted calls (the brief and the three steps) plus its free wrap-up, and the client spent 1 counted call (the sign-off save) with a free pickup: 5 counted calls across two separate allowances for a complete, signed-off delivery. A practice delivering this way stays inside free for its first several jobs a day.&lt;/p&gt;

&lt;p&gt;When volume outgrows free, the scaling line is per identity too: a Day Pass is $0.99 and makes that identity unlimited for 24 hours; the Zambo Pass is $29 for 30 days. One-time payments, never subscriptions. And pickup stays free at every tier, so a client can always read the record of what they bought.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do not take my word for it
&lt;/h2&gt;

&lt;p&gt;Pick any step in the delivery handover, open its receipt, and check it at &lt;a href="https://zambo.dev/verify/" rel="noopener noreferrer"&gt;https://zambo.dev/verify/&lt;/a&gt;. A receipt proves the saved result was not changed since it was saved, and the check recomputes that from the record itself. It does not prove the copy was good or the headline was right, and I am not claiming otherwise. If a receipt from this run ever fails to verify, that is news and I want to hear it.&lt;/p&gt;

&lt;p&gt;The pattern ships as an installable agent package, zambo-delivery, with the skill, the runnable delivery code, a checker that walks any delivered handover and lists every receipt, and this run inside it: &lt;a href="https://pypi.org/project/zambo-delivery/" rel="noopener noreferrer"&gt;https://pypi.org/project/zambo-delivery/&lt;/a&gt; and &lt;a href="https://www.npmjs.com/package/zambo-delivery" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/zambo-delivery&lt;/a&gt;, source at &lt;a href="https://github.com/zambodotdev/zambo-delivery-proof" rel="noopener noreferrer"&gt;https://github.com/zambodotdev/zambo-delivery-proof&lt;/a&gt;. The full guide, with the accounting and the standing instructions at depth, is here: &lt;a href="https://rambozambodotdev.gitlab.io/aer1-hub/delivery-proof-package.html" rel="noopener noreferrer"&gt;https://rambozambodotdev.gitlab.io/aer1-hub/delivery-proof-package.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your tools still do the work. Zambo is where the work lands, gets remembered, gets handed over, and gets proven. That is the whole pitch, and every link above is the evidence.&lt;/p&gt;




&lt;p&gt;Try it free: add Zambo to your AI in one step at zambo.dev/add. 20 calls plus 1 wrap-up free every day, picking up in another AI is always free, no card and no signup wall.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zambo: &lt;a href="https://zambo.dev" rel="noopener noreferrer"&gt;https://zambo.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Add Zambo to your AI: &lt;a href="https://zambo.dev/add" rel="noopener noreferrer"&gt;https://zambo.dev/add&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The delivery proof guide, with the full run and accounting: &lt;a href="https://rambozambodotdev.gitlab.io/aer1-hub/delivery-proof-package.html" rel="noopener noreferrer"&gt;https://rambozambodotdev.gitlab.io/aer1-hub/delivery-proof-package.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The package: &lt;a href="https://pypi.org/project/zambo-delivery/" rel="noopener noreferrer"&gt;https://pypi.org/project/zambo-delivery/&lt;/a&gt; · &lt;a href="https://www.npmjs.com/package/zambo-delivery" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/zambo-delivery&lt;/a&gt; · &lt;a href="https://github.com/zambodotdev/zambo-delivery-proof" rel="noopener noreferrer"&gt;https://github.com/zambodotdev/zambo-delivery-proof&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Sister pattern, swarm coordination: &lt;a href="https://dev.to/rambozambo/four-agents-one-job-zero-trust-a-swarm-where-every-worker-proves-its-piece-35ol"&gt;https://dev.to/rambozambo/four-agents-one-job-zero-trust-a-swarm-where-every-worker-proves-its-piece-35ol&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AER-1 conformance corpus: &lt;a href="https://zambo.dev/aer1/corpus.json" rel="noopener noreferrer"&gt;https://zambo.dev/aer1/corpus.json&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Verify any receipt: &lt;a href="https://zambo.dev/verify/" rel="noopener noreferrer"&gt;https://zambo.dev/verify/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AI agent handover, the signature product: &lt;a href="https://dev.to/rambozambo/ai-agent-handover-pass-a-live-job-to-another-ai-without-losing-the-record-72b"&gt;https://dev.to/rambozambo/ai-agent-handover-pass-a-live-job-to-another-ai-without-losing-the-record-72b&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>automation</category>
      <category>productivity</category>
    </item>
    <item>
      <title>One watcher, three prices, one rule: an agent watch that remembers its baseline</title>
      <dc:creator>rambo</dc:creator>
      <pubDate>Mon, 02 Nov 2026 21:06:19 +0000</pubDate>
      <link>https://dev.to/rambozambo/one-watcher-three-prices-one-rule-an-agent-watch-that-remembers-its-baseline-34kg</link>
      <guid>https://dev.to/rambozambo/one-watcher-three-prices-one-rule-an-agent-watch-that-remembers-its-baseline-34kg</guid>
      <description>&lt;p&gt;Every agent demo is a watcher right now, so let me save you the lesson I keep paying for: the watching is not the hard part. The hard part is tomorrow.&lt;/p&gt;

&lt;p&gt;A signal watch, in plain words, is one agent checking the same signal on a schedule: a price, a lead source, a mention feed, your own numbers. Reading the signal takes one call. What takes the rest of the week is everything the watch needs across time: a baseline that is still there after the session ends, a threshold that does not drift when a prompt gets edited, and proof on the quiet days that the watch ran at all. Without those, the alert, when it finally fires, is a number measured against a memory nobody can produce.&lt;/p&gt;

&lt;p&gt;I run Zambo, a work layer for AI agents: per-agent memory that persists between sessions, handovers that turn work into published records, and a verifiable receipt for every call. I pointed it at exactly this problem, ran a small watch for real with a fresh identity, and then packaged the whole pattern so any agent can install it and run it. This is the pattern, what it cost, and the place my own tooling broke on contact.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with no code at all
&lt;/h2&gt;

&lt;p&gt;If you have never run a watch, run this version first. Add the Zambo endpoint (&lt;a href="https://zambo.dev/mcp" rel="noopener noreferrer"&gt;https://zambo.dev/mcp&lt;/a&gt;) to one chat AI and put it on whatever loop you already use. The two-minute setup is at &lt;a href="https://zambo.dev/add/" rel="noopener noreferrer"&gt;https://zambo.dev/add/&lt;/a&gt;. Then paste this into its instructions:&lt;/p&gt;

&lt;p&gt;Run a signal watch on Zambo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Connect to &lt;a href="https://zambo.dev/mcp" rel="noopener noreferrer"&gt;https://zambo.dev/mcp&lt;/a&gt;. When the endpoint issues your caller handle, save it in this conversation and present it on every call. Your memory, including the baseline you are about to save, keys to that handle. Keep one job id for the whole watch and reuse it on every pass.&lt;/li&gt;
&lt;li&gt;First pass only: read the signal (for a price watch, call live_price for each asset). Then save ONE fact with memory_remember: the values, each value's receipt link, and the rule in plain words, for example "alert when any watched asset moves 3 percent or more from its baseline". Keep the remember receipt.&lt;/li&gt;
&lt;li&gt;Every later pass: recall the baseline with memory_recall and read the values out of the recalled fact. Never work from your chat transcript; the remembered fact is the baseline of record.&lt;/li&gt;
&lt;li&gt;Read the signal again. Compute each move against the recalled baseline and apply the rule exactly as stated. A move under the threshold is a quiet day, even if it is close.&lt;/li&gt;
&lt;li&gt;Save the reading with memory_remember either way: the values, the moves, and the rule's outcome. A quiet day with no saved reading is a gap in the record.&lt;/li&gt;
&lt;li&gt;Wrap the pass with handover: a summary (lead with the alert and the size of the move if the rule fired; say "quiet check, no alert" with the values and moves if it did not), a goal naming the watch and the rule, the operator as recipient, and next steps. Send the operator the handover link. That link is the digest: the record anyone can verify at &lt;a href="https://zambo.dev/verify/" rel="noopener noreferrer"&gt;https://zambo.dev/verify/&lt;/a&gt; .&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is the whole shape. Everything after this section is the same pattern run by code, at full depth, with the receipts to inspect.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern, at depth
&lt;/h2&gt;

&lt;p&gt;One watch is one job id (a single _session_id) and one identity. The watcher initializes once, is issued its own caller handle, saves that handle in its own state file, and presents it on every call. Memory keys to the handle: the baseline saved on day one is recallable on day thirty, across restarts and reconnects, because it lives in the endpoint's memory, not in a transcript. A second watch gets a second handle; two watches sharing one handle share one memory and their baselines collide.&lt;/p&gt;

&lt;p&gt;The baseline is a remembered fact, and it carries three things: the values, the receipt of each reading they came from, and the rule in plain words. The check pass recalls that fact and reads the values back out of the recalled text. It never works from the local state file's copy of the numbers (the file holds the identity; a fallback copy of the numbers rides along for emergencies, and the run below shows why the distinction matters). Then it re-reads the signal, computes each move, applies the rule exactly as stated, saves the reading whether or not the rule fired, and wraps the digest: an alert format when the rule fires, a quiet format when it does not, so a reader can always tell a checked quiet day from a day the watch never ran.&lt;/p&gt;

&lt;h2&gt;
  
  
  The run
&lt;/h2&gt;

&lt;p&gt;November 2, 2026, one fresh identity (signal-watch-demo), one job id (signal-watch-2026-11-02), the package's own watch.py doing the work. The rule, stated inside the baseline fact: alert when any watched asset moves 3 percent or more from its baseline.&lt;/p&gt;

&lt;p&gt;The baseline pass, 20:45 UTC, read BTC at $76,800.00 (&lt;a href="https://zambo.dev/run/a78b8851-5ab7-4b4d-bf70-a90a46a87b6c" rel="noopener noreferrer"&gt;https://zambo.dev/run/a78b8851-5ab7-4b4d-bf70-a90a46a87b6c&lt;/a&gt;), ETH at $2,244.62 (&lt;a href="https://zambo.dev/run/b1adb980-2b13-4680-bc97-2b3b4e54c745" rel="noopener noreferrer"&gt;https://zambo.dev/run/b1adb980-2b13-4680-bc97-2b3b4e54c745&lt;/a&gt;), and SOL at $91.29 (&lt;a href="https://zambo.dev/run/25da9cc8-616d-4383-9498-3aaad7ee5f27" rel="noopener noreferrer"&gt;https://zambo.dev/run/25da9cc8-616d-4383-9498-3aaad7ee5f27&lt;/a&gt;), then saved the baseline fact with the rule and all three receipts inside it: &lt;a href="https://zambo.dev/run/a6fe88a7-a882-4880-90f8-5437bb05aa7d" rel="noopener noreferrer"&gt;https://zambo.dev/run/a6fe88a7-a882-4880-90f8-5437bb05aa7d&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The canonical check pass recalled the baseline from memory alone (BTC 76800.0, ETH 2244.62, SOL 91.29, verbatim), then read BTC at $76,793.00 (&lt;a href="https://zambo.dev/run/cb8202ea-3913-468f-b7b8-f281c8cf6122" rel="noopener noreferrer"&gt;https://zambo.dev/run/cb8202ea-3913-468f-b7b8-f281c8cf6122&lt;/a&gt;), ETH at $2,245.12 (&lt;a href="https://zambo.dev/run/adf91ada-41b8-4253-a396-54fa019d5bdd" rel="noopener noreferrer"&gt;https://zambo.dev/run/adf91ada-41b8-4253-a396-54fa019d5bdd&lt;/a&gt;), and SOL at $91.34 (&lt;a href="https://zambo.dev/run/598d63b7-8144-46f8-9707-b4a15169acd8" rel="noopener noreferrer"&gt;https://zambo.dev/run/598d63b7-8144-46f8-9707-b4a15169acd8&lt;/a&gt;). The moves: BTC -0.01 percent, ETH +0.02 percent, SOL +0.05 percent. Nothing reached 3 percent, so the rule returned no alert. The reading was saved anyway (&lt;a href="https://zambo.dev/run/12b0616b-e825-4574-9501-ac88ef06f2d6" rel="noopener noreferrer"&gt;https://zambo.dev/run/12b0616b-e825-4574-9501-ac88ef06f2d6&lt;/a&gt;) and the quiet-day digest was wrapped: &lt;a href="https://zambo.dev/handover/121aa53f-1981-4330-9133-49e386aabf1e" rel="noopener noreferrer"&gt;https://zambo.dev/handover/121aa53f-1981-4330-9133-49e386aabf1e&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open that link. It is a quiet digest and it says so: the prices, the moves, and the words "no alert". A check run minutes after its baseline should be quiet, and a system that cries alert here to make a better story is exactly the system whose real alerts you would learn to ignore.&lt;/p&gt;

&lt;p&gt;One honest failure from the same hour: the first check pass completed, but my baseline parser tripped on the decimal point in the recalled numbers and completed the values from the local fallback copy. The recall itself was perfect; the bug was mine, in twenty lines of parsing. I fixed the parser, proved the fix against a fresh recall (all three baselines extracted from memory text alone), and the canonical pass above is the fixed code running end to end. The first pass's digest is on the record too: &lt;a href="https://zambo.dev/handover/8654e4d4-765a-47ef-955a-fa67e84cab6d" rel="noopener noreferrer"&gt;https://zambo.dev/handover/8654e4d4-765a-47ef-955a-fa67e84cab6d&lt;/a&gt; . That is what a checkable record is for: it caught my tooling being sloppy, in public, where I could not quietly pretend otherwise.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a watch costs
&lt;/h2&gt;

&lt;p&gt;The free tier is per agent: 20 calls plus 1 wrap-up free every day for the watcher's own caller handle, and picking up a handover is always free. Counted from this run: the baseline pass cost 4 counted calls (3 prices and the baseline save); each check pass cost 5 (the recall, 3 prices, the reading save); the digest wrap was the free daily wrap-up. Run once a day, a three-signal watch costs 5 counted calls a day after day one, inside the free tier. When a watch outgrows free, the line is per agent: a Day Pass is $0.99 for one agent, unlimited for 24 hours; the Zambo Pass is $29 for one agent for 30 days. One-time payments, never subscriptions. Scheduling is yours: Zambo does not start the passes, your cron or agent loop does, and one check per scheduled pass is the discipline. A watch that checks five times an hour spends its allowance proving nothing moved.&lt;/p&gt;

&lt;h2&gt;
  
  
  The package
&lt;/h2&gt;

&lt;p&gt;The pattern ships as an installable agent package, zambo-watch 1.0.0: the skill that teaches it, watch.py (baseline mode and check mode, handle persistence included), the no-code paste above, and the run record with every link live.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PyPI: &lt;a href="https://pypi.org/project/zambo-watch/" rel="noopener noreferrer"&gt;https://pypi.org/project/zambo-watch/&lt;/a&gt; (pip install zambo-watch)&lt;/li&gt;
&lt;li&gt;npm: &lt;a href="https://www.npmjs.com/package/zambo-watch" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/zambo-watch&lt;/a&gt; (npm install zambo-watch)&lt;/li&gt;
&lt;li&gt;GitHub (template repo): &lt;a href="https://github.com/zambodotdev/zambo-signal-watch" rel="noopener noreferrer"&gt;https://github.com/zambodotdev/zambo-signal-watch&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The guide, with the full run and accounting: &lt;a href="https://rambozambodotdev.gitlab.io/aer1-hub/signal-watch-package.html" rel="noopener noreferrer"&gt;https://rambozambodotdev.gitlab.io/aer1-hub/signal-watch-package.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is one of five patterns in a family that runs on Zambo; its sibling, shipped first, is the swarm package (&lt;a href="https://pypi.org/project/zambo-swarm/" rel="noopener noreferrer"&gt;https://pypi.org/project/zambo-swarm/&lt;/a&gt;), for the days the job is bigger than one agent. And the package proves itself from fresh installs: the watch.py copies installed from PyPI and from npm were each run baseline plus check against the live endpoint by separate fresh identities, and each wrapped its own digest (&lt;a href="https://zambo.dev/handover/a82cead1-e4e3-4fa9-abee-05baf4c96e80" rel="noopener noreferrer"&gt;https://zambo.dev/handover/a82cead1-e4e3-4fa9-abee-05baf4c96e80&lt;/a&gt; and &lt;a href="https://zambo.dev/handover/0048c820-2519-41e8-80b3-c9db1840acc1" rel="noopener noreferrer"&gt;https://zambo.dev/handover/0048c820-2519-41e8-80b3-c9db1840acc1&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Do not take my word for it
&lt;/h2&gt;

&lt;p&gt;Pick any number in the digest, open its receipt, and check it at &lt;a href="https://zambo.dev/verify/" rel="noopener noreferrer"&gt;https://zambo.dev/verify/&lt;/a&gt;. A receipt proves the saved result was not changed since it was saved, and the check recomputes that from the record itself. It does not prove the price was right or the threshold was wise, and I am not claiming otherwise. If a receipt from this run ever fails to verify, that is news and I want to hear it.&lt;/p&gt;

&lt;p&gt;Your scheduler still runs your watch. Zambo is where its baseline lives, where its readings land, and where its alerts get proven. That is the whole pitch, and every link above is the evidence.&lt;/p&gt;




&lt;p&gt;Try it free: add Zambo to your AI in one step at zambo.dev/add. 20 calls plus 1 wrap-up free every day, picking up in another AI is always free, no card and no signup wall.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zambo: &lt;a href="https://zambo.dev" rel="noopener noreferrer"&gt;https://zambo.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Add Zambo to your AI: &lt;a href="https://zambo.dev/add" rel="noopener noreferrer"&gt;https://zambo.dev/add&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The signal watch package, PyPI: &lt;a href="https://pypi.org/project/zambo-watch/" rel="noopener noreferrer"&gt;https://pypi.org/project/zambo-watch/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The signal watch package, npm: &lt;a href="https://www.npmjs.com/package/zambo-watch" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/zambo-watch&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The watch guide, with the full run and accounting: &lt;a href="https://rambozambodotdev.gitlab.io/aer1-hub/signal-watch-package.html" rel="noopener noreferrer"&gt;https://rambozambodotdev.gitlab.io/aer1-hub/signal-watch-package.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AER-1 conformance corpus: &lt;a href="https://zambo.dev/aer1/corpus.json" rel="noopener noreferrer"&gt;https://zambo.dev/aer1/corpus.json&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Verify any receipt: &lt;a href="https://zambo.dev/verify/" rel="noopener noreferrer"&gt;https://zambo.dev/verify/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AI agent handover, the signature product: &lt;a href="https://dev.to/rambozambo/ai-agent-handover-pass-a-live-job-to-another-ai-without-losing-the-record-72b"&gt;https://dev.to/rambozambo/ai-agent-handover-pass-a-live-job-to-another-ai-without-losing-the-record-72b&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>automation</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The daily loop, as an installable package</title>
      <dc:creator>rambo</dc:creator>
      <pubDate>Mon, 02 Nov 2026 21:04:52 +0000</pubDate>
      <link>https://dev.to/rambozambo/the-daily-loop-as-an-installable-package-2e89</link>
      <guid>https://dev.to/rambozambo/the-daily-loop-as-an-installable-package-2e89</guid>
      <description>&lt;p&gt;Last week I counted every caller on my own platform: 4,247 distinct callers over seven days, and 98.5% of them were active on exactly one day. 17 callers came back on three or more days. I wrote that count up here already, and the conclusion has not moved since: discovery is not my problem. Return is.&lt;/p&gt;

&lt;p&gt;The 17 who stayed share a shape. They do not find a better tool each day; they run a loop that starts with yesterday. Recall the state, do the work, remember what changed, wrap the day so the next session can pick it up whole. So instead of writing another essay about the loop, I packaged it: an installable agent package that teaches the pattern by doing it, with the working code inside and Zambo as the mechanism. It is live on npm as zambo-loop, and as a template repo on GitHub. This article is the run I executed before shipping it, because a package about proof should arrive with some.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern, in one paragraph
&lt;/h2&gt;

&lt;p&gt;One agent, one persistent caller handle, one job. On initialize the endpoint issues the handle; the agent saves it and presents it on every call, in every session, forever. Memory, timelines, and the daily free allowance (20 calls plus 1 wrap-up per day, pickup always free) all key to that handle. Each session: pick up yesterday's handover, memory_recall the state, do the work, memory_remember the update, wrap the day with handover. That is the whole loop. Everything interesting is in the two disciplines below, and both of them bit me during the run.&lt;/p&gt;

&lt;h2&gt;
  
  
  The run
&lt;/h2&gt;

&lt;p&gt;One fresh identity, daily-loop-agent, one job (daily-loop-demo-2026-11-02), a BTC and ETH watch, three sessions as separate processes under the same saved handle.&lt;/p&gt;

&lt;p&gt;Session 1 priced the watch: BTC $76,786.70, down 1.29% (receipt: &lt;a href="https://zambo.dev/run/3ab3edf9-68c1-4419-b444-49853ddc7fca" rel="noopener noreferrer"&gt;https://zambo.dev/run/3ab3edf9-68c1-4419-b444-49853ddc7fca&lt;/a&gt;), ETH $2,247.14, down 0.69% (receipt: &lt;a href="https://zambo.dev/run/326f0be5-f1fe-432c-a67d-01e56105531b" rel="noopener noreferrer"&gt;https://zambo.dev/run/326f0be5-f1fe-432c-a67d-01e56105531b&lt;/a&gt;). Then it tried to save the baseline state, and the save was refused before execution: &lt;a href="https://zambo.dev/run/c7d11d3b-64da-4625-b246-42243674bf7c" rel="noopener noreferrer"&gt;https://zambo.dev/run/c7d11d3b-64da-4625-b246-42243674bf7c&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Session 2 opened by recalling, and the recall came back honestly empty, count 0: &lt;a href="https://zambo.dev/run/4adc6ece-9458-4e19-af64-6e4587b1dbbc" rel="noopener noreferrer"&gt;https://zambo.dev/run/4adc6ece-9458-4e19-af64-6e4587b1dbbc&lt;/a&gt;. It re-checked BTC at $76,848.93, saved its update, and then its wrap was refused too: the receipt selection named the refused save's receipt, which is not an executed step of the job. A wrap holds only its own job's receipts: &lt;a href="https://zambo.dev/run/5dad54f0-073d-4f1a-aecd-0d736d0d60c8" rel="noopener noreferrer"&gt;https://zambo.dev/run/5dad54f0-073d-4f1a-aecd-0d736d0d60c8&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The repair was one call: the same baseline state at 378 characters instead of 533, saved clean: &lt;a href="https://zambo.dev/run/ba4a4143-d6db-4a4f-9834-af5056abd08f" rel="noopener noreferrer"&gt;https://zambo.dev/run/ba4a4143-d6db-4a4f-9834-af5056abd08f&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Session 3 recalled that state and the check was mechanical, three string matches: "BTC baseline $76,786.70", "ETH baseline $2,247.14", and the alert rule, all present in the recalled text verbatim (receipt: &lt;a href="https://zambo.dev/run/fd2d6820-cc7d-4474-995f-2b04ef707140" rel="noopener noreferrer"&gt;https://zambo.dev/run/fd2d6820-cc7d-4474-995f-2b04ef707140&lt;/a&gt;). It re-checked BTC at $76,875.00, a move of +0.115% from baseline, inside the 3% band, no alert (receipt: &lt;a href="https://zambo.dev/run/e42b60ed-1dee-4360-bc4c-9b07ccb08250" rel="noopener noreferrer"&gt;https://zambo.dev/run/e42b60ed-1dee-4360-bc4c-9b07ccb08250&lt;/a&gt;), remembered the update, and wrapped the day: &lt;a href="https://zambo.dev/handover/60db250a-bf2a-4c8c-86da-b2ec8b7e150c" rel="noopener noreferrer"&gt;https://zambo.dev/handover/60db250a-bf2a-4c8c-86da-b2ec8b7e150c&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open the handover. It lists exactly five steps, the two session 1 prices, the saved baseline remember, the session 3 price, the session 3 remember, each opening to its receipt. The wrap's own receipt is here: &lt;a href="https://zambo.dev/run/307d76af-cd16-4c2a-bd06-3206f6821c3c" rel="noopener noreferrer"&gt;https://zambo.dev/run/307d76af-cd16-4c2a-bd06-3206f6821c3c&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The two disciplines, because they are the package
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Facts are short, and results get checked.&lt;/strong&gt; A saved fact has a hard limit of 500 characters. My first fact ran long, the endpoint refused it, and here is the part that matters: the refusal still returned a receipt link. If I had filed the link and moved on, session 2's empty recall would have looked like a memory bug instead of what it was, an unchecked refusal one session earlier. The package's code checks every result for errors before it trusts a receipt, and writes facts like headlines: value, receipt, rule, next action.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A wrap holds only its own job's receipts.&lt;/strong&gt; The wrap binds the job's executed steps and runs a proof loop over them. Name a receipt from a refused call, or from outside the job, and the wrap refuses in turn, receipted, with the reason. Track the job's receipt ids as you go and the wrap is a formality. This is not bureaucracy; it is what makes the final handover a record of work that actually happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the loop costs
&lt;/h2&gt;

&lt;p&gt;Counted from the run's own record: session 1 spent 2 counted calls (the refused save executed nothing), the repair 1, session 3 spent 3, and its wrap was the free daily wrap-up. A daily agent on this shape runs free inside the 20 calls plus 1 wrap-up every agent gets each day, and picking up yesterday's handover is free at every tier. Past free, the scaling line is $0.99 for a Day Pass (unlimited, 24 hours) or $29 for the Zambo Pass (30 days), one-time payments, never subscriptions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get the package
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;npm: &lt;code&gt;npm install zambo-loop&lt;/code&gt; (&lt;a href="https://www.npmjs.com/package/zambo-loop" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/zambo-loop&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;GitHub, template repo: &lt;a href="https://github.com/zambodotdev/zambo-daily-loop" rel="noopener noreferrer"&gt;https://github.com/zambodotdev/zambo-daily-loop&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The guide, with the full run and the standing instructions: &lt;a href="https://rambozambodotdev.gitlab.io/aer1-hub/daily-loop-package.html" rel="noopener noreferrer"&gt;https://rambozambodotdev.gitlab.io/aer1-hub/daily-loop-package.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The sibling pattern, swarm coordination as a package: &lt;a href="https://pypi.org/project/zambo-swarm/" rel="noopener noreferrer"&gt;https://pypi.org/project/zambo-swarm/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The loop does not need my platform's permission to matter; any agent that keeps state and seals its day has the shape. Zambo is simply where this one's memory, handovers, and receipts live, so the day survives the session and anyone can check it. A receipt proves the saved result was not changed since it was saved. It does not prove the baseline was right, and I am not claiming otherwise.&lt;/p&gt;




&lt;p&gt;Try it free: add Zambo to your AI in one step at zambo.dev/add. 20 calls plus 1 wrap-up free every day, picking up in another AI is always free, no card and no signup wall.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zambo: &lt;a href="https://zambo.dev" rel="noopener noreferrer"&gt;https://zambo.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Add Zambo to your AI: &lt;a href="https://zambo.dev/add" rel="noopener noreferrer"&gt;https://zambo.dev/add&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The daily loop package on npm: &lt;a href="https://www.npmjs.com/package/zambo-loop" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/zambo-loop&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The daily loop package on GitHub: &lt;a href="https://github.com/zambodotdev/zambo-daily-loop" rel="noopener noreferrer"&gt;https://github.com/zambodotdev/zambo-daily-loop&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The guide, with the full run: &lt;a href="https://rambozambodotdev.gitlab.io/aer1-hub/daily-loop-package.html" rel="noopener noreferrer"&gt;https://rambozambodotdev.gitlab.io/aer1-hub/daily-loop-package.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The data: 4,247 callers came, 17 stayed: &lt;a href="https://dev.to/rambozambo/4247-callers-came-17-stayed-here-is-the-loop-the-17-run-2o51"&gt;https://dev.to/rambozambo/4247-callers-came-17-stayed-here-is-the-loop-the-17-run-2o51&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AER-1 conformance corpus: &lt;a href="https://zambo.dev/aer1/corpus.json" rel="noopener noreferrer"&gt;https://zambo.dev/aer1/corpus.json&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Verify any receipt: &lt;a href="https://zambo.dev/verify/" rel="noopener noreferrer"&gt;https://zambo.dev/verify/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AI agent handover, the signature product: &lt;a href="https://dev.to/rambozambo/ai-agent-handover-pass-a-live-job-to-another-ai-without-losing-the-record-72b"&gt;https://dev.to/rambozambo/ai-agent-handover-pass-a-live-job-to-another-ai-without-losing-the-record-72b&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>automation</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The price was wrong, the receipt was not: catching a drifted retelling with a verify pass</title>
      <dc:creator>rambo</dc:creator>
      <pubDate>Mon, 02 Nov 2026 21:04:00 +0000</pubDate>
      <link>https://dev.to/rambozambo/the-price-was-wrong-the-receipt-was-not-catching-a-drifted-retelling-with-a-verify-pass-188i</link>
      <guid>https://dev.to/rambozambo/the-price-was-wrong-the-receipt-was-not-catching-a-drifted-retelling-with-a-verify-pass-188i</guid>
      <description>&lt;p&gt;Your agents are handing each other results all day, and some of those results are wrong in a way nobody notices: not fabricated, just drifted. A digit changes between the tool call and the summary. A qualifier drops. The number in the chat is a number no tool ever returned, and every decision downstream now rests on it.&lt;/p&gt;

&lt;p&gt;I run Zambo, a work layer for AI agents where every call returns a verifiable receipt. Today I built the checking side of that record into a package and ran it for real: one agent produced a price, a second agent with its own identity verified it, and then I fed the verifier a retelling with the number changed. Here is the run, the catch, and the package, so your agents can run the same pass.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with no code at all
&lt;/h2&gt;

&lt;p&gt;Add the Zambo endpoint (&lt;a href="https://zambo.dev/mcp" rel="noopener noreferrer"&gt;https://zambo.dev/mcp&lt;/a&gt;) to one chat AI. The two-minute setup is at &lt;a href="https://zambo.dev/add/" rel="noopener noreferrer"&gt;https://zambo.dev/add/&lt;/a&gt;. Then paste this into the verifier's chat:&lt;/p&gt;

&lt;p&gt;Verify before you trust, on Zambo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Connect to &lt;a href="https://zambo.dev/mcp" rel="noopener noreferrer"&gt;https://zambo.dev/mcp&lt;/a&gt;. When the endpoint issues your caller handle, save it in this conversation and present it on every call. You are a verifier; your verdicts are recorded under your handle.&lt;/li&gt;
&lt;li&gt;For every claim another agent hands you, demand the receipt link with it. No receipt link means the claim is absent, not verified: say so and do not forward it as checked.&lt;/li&gt;
&lt;li&gt;Check the receipt: open &lt;a href="https://zambo.dev/api/v2/receipt/%7Breceipt-id%7D/verify" rel="noopener noreferrer"&gt;https://zambo.dev/api/v2/receipt/{receipt-id}/verify&lt;/a&gt; and read verification_status and the checks. Note any check marked not_checked; never report those as passed.&lt;/li&gt;
&lt;li&gt;Open the saved record: read the output the work actually saved (it travels inside the verify response). Compare the claim against that saved output, exactly: the number, the name, the outcome. Never compare against the summary you were handed.&lt;/li&gt;
&lt;li&gt;Verdict: verified only when verification_status is verified AND the claim matches the saved record. If the claim does not match what was saved, the verdict is mismatch, even when the record itself verifies fine. Trust the record, not the retelling.&lt;/li&gt;
&lt;li&gt;Record every verdict with memory_remember: the claim, the receipt link, the verification_status, what the saved record says, and your verdict. Your verdict is now a receipted step the next agent can check.&lt;/li&gt;
&lt;li&gt;If the work arrives as a handover, pick it up (picking up is always free), read its saved steps and receipts, and run this same pass on the load-bearing receipt before you rely on any of it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is the whole pass at hand scale. The run below is the same pass executed by code, with a second agent doing the checking and both verdicts recorded.&lt;/p&gt;

&lt;h2&gt;
  
  
  The run
&lt;/h2&gt;

&lt;p&gt;November 2, 2026, two fresh identities under one shared job. The producer checked ETH with live_price: $2,242.99, down 0.75 percent in 24 hours, saved at 20:43:50 UTC. Its work receipt: &lt;a href="https://zambo.dev/run/26084974-6c2e-42ef-b4bc-0707bb3c8413" rel="noopener noreferrer"&gt;https://zambo.dev/run/26084974-6c2e-42ef-b4bc-0707bb3c8413&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The producer saved the finding to memory (receipt: &lt;a href="https://zambo.dev/run/802e66d0-240e-42a9-bbdf-32aca1d4b1f5" rel="noopener noreferrer"&gt;https://zambo.dev/run/802e66d0-240e-42a9-bbdf-32aca1d4b1f5&lt;/a&gt;) and wrapped it into a handover addressed to the verifier: &lt;a href="https://zambo.dev/handover/fa7444ae-e3c7-4206-ae12-3adb5e749fb0" rel="noopener noreferrer"&gt;https://zambo.dev/handover/fa7444ae-e3c7-4206-ae12-3adb5e749fb0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The verifier picked the handover up (pickup is always free), read the price and the work receipt from the pickup record rather than from the summary, and ran the pass. The verify endpoint's own answer is public, read it yourself: &lt;a href="https://zambo.dev/api/v2/receipt/26084974-6c2e-42ef-b4bc-0707bb3c8413/verify" rel="noopener noreferrer"&gt;https://zambo.dev/api/v2/receipt/26084974-6c2e-42ef-b4bc-0707bb3c8413/verify&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It returned verification_status verified. Four checks pass: commitment_matches, canonical_payload_matches, provenance_binding, metadata_binding. Four more come back marked not_checked: issuer_authentication, signature, schema, chain. The verifier reported those as not checked, because an unevaluated check is not a passed check, and any verifier that upgrades them is telling you a story too.&lt;/p&gt;

&lt;p&gt;Then the comparison. The saved record's output says ETH at $2,242.99.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claim one, the true retelling: "ETH at $2,242.99".&lt;/strong&gt; It matches the saved record, and the record verifies. Verdict: verified. The verdict is itself a receipted step, so the checking can be checked: &lt;a href="https://zambo.dev/run/5a45e50e-6591-46f0-8df1-e699a7eb88b3" rel="noopener noreferrer"&gt;https://zambo.dev/run/5a45e50e-6591-46f0-8df1-e699a7eb88b3&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claim two, the wrong retelling: "ETH at $2,354.10".&lt;/strong&gt; I changed the number myself, deliberately, and labeled it as the teaching case in the run and in its verdict record. Nothing about the record changed: it still verifies, and its saved output still says $2,242.99. But the claim does not match the saved record, so the verdict is mismatch: &lt;a href="https://zambo.dev/run/f5209c13-7d3c-4196-a8ee-da7a970a82d5" rel="noopener noreferrer"&gt;https://zambo.dev/run/f5209c13-7d3c-4196-a8ee-da7a970a82d5&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That second verdict is the whole point. The most common verification failure in multi-agent work is not a forged record. It is an intact record under a wrong story, forwarded by an agent that never opened the record. The pass catches it because the comparison runs against what was saved, not against what was said.&lt;/p&gt;

&lt;h2&gt;
  
  
  The verdict vocabulary, because words drift too
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;verified&lt;/strong&gt;: the receipt's verification_status is verified AND the claim matches the saved record.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;mismatch&lt;/strong&gt;: the record was opened and the claim does not match what was saved.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;verification failed&lt;/strong&gt;: the endpoint's checks fail on the record itself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;not checked&lt;/strong&gt;: the pass was not run, or a check was not evaluated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;absent&lt;/strong&gt;: no receipt was produced for the claim.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the boundary, stated plainly: a receipt proves the saved result was not changed since it was saved. It does not prove the price was right, the tool was the right tool, or the producer did the right work. The pass checks fidelity between a claim, a receipt, and a record. Judgment about the work itself stays yours.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the pass costs
&lt;/h2&gt;

&lt;p&gt;Almost nothing, and that is why it can be a habit instead of an event. Reading the verify endpoint is a plain HTTPS read and costs no quota. Picking up a handover is always free. The only counted calls in the whole run were the producer's two (the price check and the memory save, plus its free daily wrap-up) and the verifier's two verdict records: 4 counted calls across two separate free allowances, out of 20 calls plus 1 wrap-up free per agent per day. Past free, the per-agent line is a Day Pass at $0.99 (unlimited for 24 hours) or the Zambo Pass at $29 for 30 days, both one-time payments, never subscriptions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The package
&lt;/h2&gt;

&lt;p&gt;The pass now ships as an installable agent package, zambo-verify-pass, so an agent can learn it by installing it: the skill, a runnable verify.py (give it a receipt link and a claim; it prints the checks, the saved output, and the verdict, and it walks a handover verifying each step), the no-code paste above, and this run as its proof record.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PyPI: &lt;a href="https://pypi.org/project/zambo-verify-pass/" rel="noopener noreferrer"&gt;https://pypi.org/project/zambo-verify-pass/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm: &lt;a href="https://www.npmjs.com/package/zambo-verify-pass" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/zambo-verify-pass&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub (template repo): &lt;a href="https://github.com/zambodotdev/zambo-verify-pass" rel="noopener noreferrer"&gt;https://github.com/zambodotdev/zambo-verify-pass&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The full guide: &lt;a href="https://rambozambodotdev.gitlab.io/aer1-hub/verify-pass-package.html" rel="noopener noreferrer"&gt;https://rambozambodotdev.gitlab.io/aer1-hub/verify-pass-package.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Run verify.py against the handover from this run and it reports both receipted steps verified. Run it against the work receipt with the wrong claim and it prints mismatch and exits nonzero. The verifier your swarm's coordinator needs is the same one: in the swarm package (&lt;a href="https://pypi.org/project/zambo-swarm/" rel="noopener noreferrer"&gt;https://pypi.org/project/zambo-swarm/&lt;/a&gt;), the coordinator runs this exact pass at every pickup instead of trusting worker summaries.&lt;/p&gt;

&lt;p&gt;Your framework runs your agents. Zambo is where their work lands, gets remembered, gets handed over, and gets proven. The verify pass is how the next agent checks all of that before building on it, and every link above is the evidence.&lt;/p&gt;




&lt;p&gt;Try it free: add Zambo to your AI in one step at zambo.dev/add. 20 calls plus 1 wrap-up free every day, picking up in another AI is always free, no card and no signup wall.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zambo: &lt;a href="https://zambo.dev" rel="noopener noreferrer"&gt;https://zambo.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Add Zambo to your AI: &lt;a href="https://zambo.dev/add" rel="noopener noreferrer"&gt;https://zambo.dev/add&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The verify pass guide, with the full run and both verdicts: &lt;a href="https://rambozambodotdev.gitlab.io/aer1-hub/verify-pass-package.html" rel="noopener noreferrer"&gt;https://rambozambodotdev.gitlab.io/aer1-hub/verify-pass-package.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The verify pass package (template repo): &lt;a href="https://github.com/zambodotdev/zambo-verify-pass" rel="noopener noreferrer"&gt;https://github.com/zambodotdev/zambo-verify-pass&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The swarm package, whose coordinator runs this pass: &lt;a href="https://github.com/zambodotdev/zambo-swarm-coordination" rel="noopener noreferrer"&gt;https://github.com/zambodotdev/zambo-swarm-coordination&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AER-1 conformance corpus: &lt;a href="https://zambo.dev/aer1/corpus.json" rel="noopener noreferrer"&gt;https://zambo.dev/aer1/corpus.json&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Verify any receipt: &lt;a href="https://zambo.dev/verify/" rel="noopener noreferrer"&gt;https://zambo.dev/verify/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AI agent handover, the signature product: &lt;a href="https://dev.to/rambozambo/ai-agent-handover-pass-a-live-job-to-another-ai-without-losing-the-record-72b"&gt;https://dev.to/rambozambo/ai-agent-handover-pass-a-live-job-to-another-ai-without-losing-the-record-72b&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>automation</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Four agents, one job, zero trust: a swarm where every worker proves its piece</title>
      <dc:creator>rambo</dc:creator>
      <pubDate>Mon, 02 Nov 2026 20:20:51 +0000</pubDate>
      <link>https://dev.to/rambozambo/four-agents-one-job-zero-trust-a-swarm-where-every-worker-proves-its-piece-35ol</link>
      <guid>https://dev.to/rambozambo/four-agents-one-job-zero-trust-a-swarm-where-every-worker-proves-its-piece-35ol</guid>
      <description>&lt;p&gt;Everyone is learning to run agent swarms right now, so let me save you the lesson I just paid for: the hard part is not the prompts. It is the seams.&lt;/p&gt;

&lt;p&gt;A swarm, in plain words, is several AI agents working one job at once. One checks prices, one drafts, one verifies, and a coordinator hands out the pieces and assembles the result. Starting the agents takes an afternoon. What takes the rest of the week is everything between them: how a worker hands its piece over without the numbers drifting, where the job's shared state lives when no single chat owns it, and how the coordinator, or you, can tell a worker really did the work instead of writing a confident paragraph about having done it.&lt;/p&gt;

&lt;p&gt;I run Zambo, a work layer for AI agents: shared jobs, per-agent memory, handovers that move work between agents, and a verifiable receipt for every call. I pointed it at exactly this problem and ran a small swarm for real. This is the pattern, what it cost, and the three places my assumptions were wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with no code at all
&lt;/h2&gt;

&lt;p&gt;If you have never run a swarm, run this version first. Add the Zambo endpoint (&lt;a href="https://zambo.dev/mcp" rel="noopener noreferrer"&gt;https://zambo.dev/mcp&lt;/a&gt;) to one chat AI for the coordinator and one per worker. The two-minute setup is at &lt;a href="https://zambo.dev/add/" rel="noopener noreferrer"&gt;https://zambo.dev/add/&lt;/a&gt;. Then paste this into the coordinator's chat:&lt;/p&gt;

&lt;p&gt;Coordinate a swarm job with me on Zambo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Connect to &lt;a href="https://zambo.dev/mcp" rel="noopener noreferrer"&gt;https://zambo.dev/mcp&lt;/a&gt;. When the endpoint issues your caller handle, save it in this conversation and present it on every call. You are the coordinator.&lt;/li&gt;
&lt;li&gt;Open the job: call memory_remember with the assignment, one line per worker, and keep the receipt.&lt;/li&gt;
&lt;li&gt;Give each worker its piece. Each worker works under its own caller handle and keeps the receipt of every call it makes.&lt;/li&gt;
&lt;li&gt;When a worker finishes, it wraps its contribution with handover, with a summary and you named as the recipient, and gives you the handover link.&lt;/li&gt;
&lt;li&gt;Pick each handover up (picking up is always free) and read its steps and receipts yourself. Check any receipt at &lt;a href="https://zambo.dev/verify/" rel="noopener noreferrer"&gt;https://zambo.dev/verify/&lt;/a&gt; before you rely on it.&lt;/li&gt;
&lt;li&gt;Wrap the whole job with handover: a summary naming each worker, what it found, and its receipt. That handover is the deliverable: the link a client or an operator opens to verify the swarm's work.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And this into each worker's chat:&lt;/p&gt;

&lt;p&gt;Work one piece of a swarm job on Zambo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Connect to &lt;a href="https://zambo.dev/mcp" rel="noopener noreferrer"&gt;https://zambo.dev/mcp&lt;/a&gt;. When the endpoint issues your caller handle, save it in this conversation and present it on every call. You are a worker; the coordinator holds the job.&lt;/li&gt;
&lt;li&gt;Do the piece the coordinator assigned. Keep the receipt link of every call.&lt;/li&gt;
&lt;li&gt;Save your finding with memory_remember, and put the receipt of the work in the fact.&lt;/li&gt;
&lt;li&gt;Wrap your contribution with handover: a summary of what you did and found, the coordinator named as the recipient. Send the coordinator the handover link. That link is your deliverable: the record the coordinator, a client, or an operator can verify.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is the whole shape. Everything after this section is the same pattern run by code, at full depth, with the receipts to inspect.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern, at depth
&lt;/h2&gt;

&lt;p&gt;One job is one shared job id (a single _session_id) that every agent reuses. Identity is the opposite: separate. Each agent initializes once, is issued its own caller handle, saves that handle in its own state file, and presents it on every call, with its agent name as the caller label. Memory, the job timeline, and the daily free allowance all key to the handle. Two workers sharing one handle are one agent as far as the record is concerned, and the swarm's accounting collapses. Step zero is per-agent handle discipline; everything else is commentary.&lt;/p&gt;

&lt;p&gt;On top of that: the coordinator opens the job by saving the assignment brief to memory under the job id. Each worker does its piece under the shared job id and its own handle, saves its finding to memory with the work's receipt inside the fact, then wraps the contribution into a handover addressed to the coordinator. The coordinator picks each handover up with handover_accept, which returns the worker's saved steps and receipts, reads them, and only then wraps the whole job into one handover whose summary names each worker and its receipts.&lt;/p&gt;

&lt;p&gt;Notice what the coordinator never does: assemble the result from worker summaries. The summaries exist, inside the handovers, but the coordinator works from the records the pickups return. Verify, then wrap.&lt;/p&gt;

&lt;h2&gt;
  
  
  The run
&lt;/h2&gt;

&lt;p&gt;November 2, 2026, four fresh identities, one shared job id (swarm-scan-2026-11-02), job: a three-asset market scan.&lt;/p&gt;

&lt;p&gt;The coordinator opened the job with the brief: &lt;a href="https://zambo.dev/run/4aad48df-b66f-45ee-9fb5-73a67577ae48" rel="noopener noreferrer"&gt;https://zambo.dev/run/4aad48df-b66f-45ee-9fb5-73a67577ae48&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;worker-btc checked BTC: $76,876.00, down 1.15 percent in 24 hours, at 20:07:21 UTC. Price receipt: &lt;a href="https://zambo.dev/run/341a5c02-6713-4704-9708-f00708ee44e4" rel="noopener noreferrer"&gt;https://zambo.dev/run/341a5c02-6713-4704-9708-f00708ee44e4&lt;/a&gt;. It saved the finding: &lt;a href="https://zambo.dev/run/54033676-fb88-40bf-9018-b8b4cb89c720" rel="noopener noreferrer"&gt;https://zambo.dev/run/54033676-fb88-40bf-9018-b8b4cb89c720&lt;/a&gt;. Then it wrapped its contribution: &lt;a href="https://zambo.dev/handover/cdcb95db-8c1c-4a21-beca-da1616989537" rel="noopener noreferrer"&gt;https://zambo.dev/handover/cdcb95db-8c1c-4a21-beca-da1616989537&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;worker-eth checked ETH: $2,251.23, down 0.27 percent, at 20:07:26 UTC. Price receipt: &lt;a href="https://zambo.dev/run/8d89c2f8-26c2-45b8-8d23-81df2b16f0b7" rel="noopener noreferrer"&gt;https://zambo.dev/run/8d89c2f8-26c2-45b8-8d23-81df2b16f0b7&lt;/a&gt;. Finding: &lt;a href="https://zambo.dev/run/70a70995-0c8c-4cd6-aa99-6863bf4239a6" rel="noopener noreferrer"&gt;https://zambo.dev/run/70a70995-0c8c-4cd6-aa99-6863bf4239a6&lt;/a&gt;. Wrap: &lt;a href="https://zambo.dev/handover/3ada9ebc-30c2-4324-bce3-5b8243e049e6" rel="noopener noreferrer"&gt;https://zambo.dev/handover/3ada9ebc-30c2-4324-bce3-5b8243e049e6&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;worker-sol checked SOL: $91.79, down 2.27 percent, at 20:07:31 UTC. Price receipt: &lt;a href="https://zambo.dev/run/59ab0985-48e4-4712-8da6-266f733319fa" rel="noopener noreferrer"&gt;https://zambo.dev/run/59ab0985-48e4-4712-8da6-266f733319fa&lt;/a&gt;. Finding: &lt;a href="https://zambo.dev/run/50f77308-3537-43b8-9235-e9309feb4da4" rel="noopener noreferrer"&gt;https://zambo.dev/run/50f77308-3537-43b8-9235-e9309feb4da4&lt;/a&gt;. Wrap: &lt;a href="https://zambo.dev/handover/f6d6e4d1-6bfb-407c-882b-7014125a36a2" rel="noopener noreferrer"&gt;https://zambo.dev/handover/f6d6e4d1-6bfb-407c-882b-7014125a36a2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The coordinator picked the three handovers up at 20:10:13, 20:10:16, and 20:10:19 UTC, read each worker's steps from the pickups, and wrapped the swarm: &lt;a href="https://zambo.dev/handover/a154789b-0588-43c7-a31c-d108eb59406b" rel="noopener noreferrer"&gt;https://zambo.dev/handover/a154789b-0588-43c7-a31c-d108eb59406b&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open that last link. It lists exactly six steps: the three price checks and the three memory saves, each one opening to a receipt that carries the same saved output the worker produced, timestamps identical to the original calls. The summary names each worker, its price, and its original receipts. The wrap's own receipt is here: &lt;a href="https://zambo.dev/run/61ee822c-3f8e-44a4-aac4-1cf405566a58" rel="noopener noreferrer"&gt;https://zambo.dev/run/61ee822c-3f8e-44a4-aac4-1cf405566a58&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Three places my assumptions were wrong
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;I assumed the shared job id made a shared inbox.&lt;/strong&gt; It does not. When the coordinator read the job back with continuity_get_recent, it got its own timeline for the job: its opening step, and none of the workers' steps. The shared id binds the job's ledger and its pass together; it is not a group chat. Contributions move through handovers or they do not move. Honestly, this is the safer design: a worker's work reaches the coordinator as a sealed record the coordinator chooses to pick up, not as rows in a table anyone in the job can browse.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I assumed wrapping was a formality.&lt;/strong&gt; My coordinator's first wrap attempt, a handover call with next steps but no summary and no named recipient, was refused on the spot, with its own receipt: &lt;a href="https://zambo.dev/run/b2882668-1fd0-4410-aac1-826902ea2621" rel="noopener noreferrer"&gt;https://zambo.dev/run/b2882668-1fd0-4410-aac1-826902ea2621&lt;/a&gt;. The endpoint asked, in so many words, what should be handed over and to whom. A wrap is a deliverable being published, and it is held to that standard. Every successful wrap in the run sets a summary, a goal, a recipient, and next steps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I assumed the wrap would just bundle links.&lt;/strong&gt; Instead, a wrap runs a proof loop over the job's steps and binds them into the handover. Each worker's handover lists 19 steps of job workflow, including the proof loop's own receipted steps, and the final handover's six steps carry the workers' saved outputs directly. The deliverable is the work, checkable step by step, not a paragraph about the work with links sprinkled on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a swarm costs
&lt;/h2&gt;

&lt;p&gt;The free tier is per agent: 20 calls plus 1 wrap-up free every day for each agent's own caller handle, and picking up in another AI is always free. Counted from this run's own counters, the coordinator spent 2 counted calls (the opening brief and one continuity read) and each worker spent 2 (the price check and the memory save). Three pickups and four wrap-ups moved no counter at all. Eight counted calls across four separate allowances, and every agent finished with 18 of its 20 free calls left. A swarm shaped like this runs free, one run a day or several.&lt;/p&gt;

&lt;p&gt;When a swarm outgrows free, the scaling line is per agent too: a Day Pass is $0.99 per agent and makes that agent unlimited for 24 hours; the Zambo Pass is $29 per agent for 30 days. One-time payments, never subscriptions. This four-agent swarm on a heavy day costs four Day Passes, $3.96 for the day; covered for a month of heavy days, four Passes, $116 for 30 days. And pickup stays free at every tier, so a coordinator can always read its swarm's record, even on a day it cannot work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do not take my word for it
&lt;/h2&gt;

&lt;p&gt;Pick any worker contribution in the final handover, open its receipt, and check it at &lt;a href="https://zambo.dev/verify/" rel="noopener noreferrer"&gt;https://zambo.dev/verify/&lt;/a&gt;. A receipt proves the saved result was not changed since it was saved, and the check recomputes that from the record itself. It does not prove the price was right or the worker picked the right tool, and I am not claiming otherwise. If a receipt from this run ever fails to verify, that is news and I want to hear it.&lt;/p&gt;

&lt;p&gt;The full guide, with the accounting and the standing instructions at depth, is here: &lt;a href="https://rambozambodotdev.gitlab.io/aer1-hub/swarm-coordination-on-zambo.html" rel="noopener noreferrer"&gt;https://rambozambodotdev.gitlab.io/aer1-hub/swarm-coordination-on-zambo.html&lt;/a&gt;. The runnable code is in the starter repo, coordinator and worker, next to the same pattern written as an installable skill file: &lt;a href="https://github.com/zambodotdev/zambo-memory-loop-starter/tree/main/examples/swarm-scan" rel="noopener noreferrer"&gt;https://github.com/zambodotdev/zambo-memory-loop-starter/tree/main/examples/swarm-scan&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your framework still runs your agents. Zambo is where their work lands, gets remembered, gets handed over, and gets proven. That is the whole pitch, and every link above is the evidence.&lt;/p&gt;




&lt;p&gt;Try it free: add Zambo to your AI in one step at zambo.dev/add. 20 calls plus 1 wrap-up free every day, picking up in another AI is always free, no card and no signup wall.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zambo: &lt;a href="https://zambo.dev" rel="noopener noreferrer"&gt;https://zambo.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Add Zambo to your AI: &lt;a href="https://zambo.dev/add" rel="noopener noreferrer"&gt;https://zambo.dev/add&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The swarm guide, with the full run and accounting: &lt;a href="https://rambozambodotdev.gitlab.io/aer1-hub/swarm-coordination-on-zambo.html" rel="noopener noreferrer"&gt;https://rambozambodotdev.gitlab.io/aer1-hub/swarm-coordination-on-zambo.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Swarm scan code, coordinator plus workers: &lt;a href="https://github.com/zambodotdev/zambo-memory-loop-starter/tree/main/examples/swarm-scan" rel="noopener noreferrer"&gt;https://github.com/zambodotdev/zambo-memory-loop-starter/tree/main/examples/swarm-scan&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The swarm package repo: &lt;a href="https://github.com/zambodotdev/zambo-swarm-coordination" rel="noopener noreferrer"&gt;https://github.com/zambodotdev/zambo-swarm-coordination&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The swarm package on PyPI: &lt;a href="https://pypi.org/project/zambo-swarm/" rel="noopener noreferrer"&gt;https://pypi.org/project/zambo-swarm/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The swarm package on npm: &lt;a href="https://www.npmjs.com/package/zambo-swarm" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/zambo-swarm&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AER-1 conformance corpus: &lt;a href="https://zambo.dev/aer1/corpus.json" rel="noopener noreferrer"&gt;https://zambo.dev/aer1/corpus.json&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Verify any receipt: &lt;a href="https://zambo.dev/verify/" rel="noopener noreferrer"&gt;https://zambo.dev/verify/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AI agent handover, the signature product: &lt;a href="https://dev.to/rambozambo/ai-agent-handover-pass-a-live-job-to-another-ai-without-losing-the-record-72b"&gt;https://dev.to/rambozambo/ai-agent-handover-pass-a-live-job-to-another-ai-without-losing-the-record-72b&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>automation</category>
      <category>productivity</category>
    </item>
    <item>
      <title>4,247 callers came. 17 stayed. Here is the loop built to make them stay.</title>
      <dc:creator>rambo</dc:creator>
      <pubDate>Mon, 02 Nov 2026 19:27:28 +0000</pubDate>
      <link>https://dev.to/rambozambo/4247-callers-came-17-stayed-here-is-the-loop-the-17-run-2o51</link>
      <guid>https://dev.to/rambozambo/4247-callers-came-17-stayed-here-is-the-loop-the-17-run-2o51</guid>
      <description>&lt;p&gt;I counted. Not sampled, counted: I walked the entire public receipt stream, 21,916 receipts in all. The seven full days from October 26 to November 1 hold 20,668 of them; the rest are the morning of November 2, partial. Every call grouped by who made it.&lt;/p&gt;

&lt;p&gt;4,247 distinct callers used Zambo that week. 98.5% of them were active on exactly one day. 17 callers, 0.4%, showed up on three or more days. On an average day, 1.7% of the callers had been there the day before.&lt;/p&gt;

&lt;p&gt;Discovery is not my problem. Return is.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the heavy callers do, and what it does not prove
&lt;/h2&gt;

&lt;p&gt;The week's top caller made 3,338 calls in six days. Nearly all of them were one tool: memory_recall. Read what I already know, then act.&lt;/p&gt;

&lt;p&gt;That pattern, counted across the whole walk, holds across the whole power tier. 101 callers made 20 or more calls on at least one day that week. 56% of their calls were memory_recall alone, and another 8.7% were memory_remember: writing today down so tomorrow can read it. Nearly two thirds of everything a power user does is remembering.&lt;/p&gt;

&lt;p&gt;Here is the part that keeps me honest: the heavy tier and the returners barely overlap. 97 of those 101 heavy callers also came on exactly one day, and only 2 of the 17 returners are heavy callers. Memory use tracks volume, not return. So the loop below is a bet, not a measured cause: give a returning agent something worth returning to, and see whether day two happens. I am running that bet in the open, one heartbeat at a time, and the receipts will say whether it works.&lt;/p&gt;

&lt;p&gt;The one-day crowd looks completely different. Their calls spread across live prices, capability search, prompt shield, lead signals: useful things, finished in one visit, nothing carried forward. A tool you try once leaves nothing behind to come back to. A memory leaves a reason.&lt;/p&gt;

&lt;h2&gt;
  
  
  The loop
&lt;/h2&gt;

&lt;p&gt;The fix is not another feature. It is a shape, and it is the shape the 17 already run:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pick up.&lt;/strong&gt; Start the run by accepting yesterday's handover. The work, its receipts, and where it stopped are all there. Picking up in another AI is always free.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recall.&lt;/strong&gt; memory_recall the handful of facts the job depends on. Yesterday's context, loaded, not re-explained.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Work.&lt;/strong&gt; Do the actual job, whatever it is. Every call returns a verifiable AER-1 receipt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remember.&lt;/strong&gt; memory_remember the one or two things today taught that tomorrow needs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wrap.&lt;/strong&gt; End with the handover. The wrap-up seals the day's steps into a record the next run, or the next AI, picks up whole. One wrap-up is free every day.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The arithmetic is the point: 20 calls plus 1 wrap-up free every day, and the loop above runs in about six calls. A daily agent on the free tier alone, no card and no pass, as long as it keeps the shape.&lt;/p&gt;

&lt;h2&gt;
  
  
  I ran it before writing this
&lt;/h2&gt;

&lt;p&gt;Talk is cheap, so here is the loop executed end to end, receipts and all.&lt;/p&gt;

&lt;p&gt;The run did a small monitoring job. Its first work call is here: &lt;a href="https://zambo.dev/run/b2fa9171-84a5-4b05-b602-c825ef61fe83" rel="noopener noreferrer"&gt;https://zambo.dev/run/b2fa9171-84a5-4b05-b602-c825ef61fe83&lt;/a&gt;. It then saved its rule with memory_remember: &lt;a href="https://zambo.dev/run/fc606132-e1c1-476d-9c22-23f00a63e778" rel="noopener noreferrer"&gt;https://zambo.dev/run/fc606132-e1c1-476d-9c22-23f00a63e778&lt;/a&gt;. It worked, and wrapped the job into a handover: &lt;a href="https://zambo.dev/handover/d9bbf1c0-baa2-43b3-8bac-3952f9360438" rel="noopener noreferrer"&gt;https://zambo.dev/handover/d9bbf1c0-baa2-43b3-8bac-3952f9360438&lt;/a&gt;, with the wrap receipt here: &lt;a href="https://zambo.dev/run/1e97b3a8-8c6d-4eff-8dd9-3671b2dfa2e2" rel="noopener noreferrer"&gt;https://zambo.dev/run/1e97b3a8-8c6d-4eff-8dd9-3671b2dfa2e2&lt;/a&gt;. Total cost: 6 of the day's 20 free calls, plus the free wrap-up.&lt;/p&gt;

&lt;p&gt;Then the part that matters. A second run started cold, picked the handover up, and recalled the saved rule word for word: &lt;a href="https://zambo.dev/run/e0bd9b5b-7c2e-463c-bfa8-43f23bc6be8e" rel="noopener noreferrer"&gt;https://zambo.dev/run/e0bd9b5b-7c2e-463c-bfa8-43f23bc6be8e&lt;/a&gt;. Nobody retyped anything. The second run knew what the first run had decided, because the first run had written it down and wrapped it.&lt;/p&gt;

&lt;p&gt;Every receipt above proves the saved result was not changed after the fact. That is the only claim a receipt should make, and it is enough: it is what lets run two trust what run one saved.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest gap
&lt;/h2&gt;

&lt;p&gt;Daily power callers, 20 or more calls in a day, ran between 4 and 32 that week, median 13. The target is thousands. Today it is tens, and I am not going to round that up for you.&lt;/p&gt;

&lt;p&gt;But the route is visible in the data. The callers who stayed did not find a better tool; they adopted a loop that starts with yesterday. So the work now is making that loop the default shape an agent starts with. The heartbeat recipe, the same loop written as a standing daily routine, lives here: &lt;a href="https://rambozambodotdev.gitlab.io/aer1-hub/scheduled-agent-heartbeat.html" rel="noopener noreferrer"&gt;https://rambozambodotdev.gitlab.io/aer1-hub/scheduled-agent-heartbeat.html&lt;/a&gt;. And the two-minute setup is the same one everything else starts from: &lt;a href="https://zambo.dev/add/" rel="noopener noreferrer"&gt;https://zambo.dev/add/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As I write this, the counters read 94,921 public receipts, 2,238 of them today, across 82,435 tool calls. The stream is public. Count it yourself and tell me where my arithmetic is wrong.&lt;/p&gt;




&lt;p&gt;Try it free: add Zambo to your AI in one step at zambo.dev/add. 20 calls plus 1 wrap-up free every day, picking up in another AI is always free, no card and no signup wall.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zambo: &lt;a href="https://zambo.dev" rel="noopener noreferrer"&gt;https://zambo.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Add Zambo to your AI: &lt;a href="https://zambo.dev/add" rel="noopener noreferrer"&gt;https://zambo.dev/add&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AER-1 conformance corpus: &lt;a href="https://zambo.dev/aer1/corpus.json" rel="noopener noreferrer"&gt;https://zambo.dev/aer1/corpus.json&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Verify any receipt: &lt;a href="https://zambo.dev/verify/" rel="noopener noreferrer"&gt;https://zambo.dev/verify/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AI agent handover, the signature product: &lt;a href="https://dev.to/rambozambo/ai-agent-handover-pass-a-live-job-to-another-ai-without-losing-the-record-72b"&gt;https://dev.to/rambozambo/ai-agent-handover-pass-a-live-job-to-another-ai-without-losing-the-record-72b&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The loop, pre-wired (starter repo): &lt;a href="https://github.com/zambodotdev/zambo-memory-loop-starter" rel="noopener noreferrer"&gt;https://github.com/zambodotdev/zambo-memory-loop-starter&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The morning standup, with receipts: &lt;a href="https://rambozambodotdev.gitlab.io/aer1-hub/morning-standup-continuity.html" rel="noopener noreferrer"&gt;https://rambozambodotdev.gitlab.io/aer1-hub/morning-standup-continuity.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Start in one AI, pick it up in another: &lt;a href="https://rambozambodotdev.gitlab.io/aer1-hub/pick-up-your-work-in-another-ai.html" rel="noopener noreferrer"&gt;https://rambozambodotdev.gitlab.io/aer1-hub/pick-up-your-work-in-another-ai.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>automation</category>
      <category>productivity</category>
    </item>
    <item>
      <title>119 of 119: an independent implementer just published his own IETF draft on AER-1</title>
      <dc:creator>rambo</dc:creator>
      <pubDate>Mon, 02 Nov 2026 15:30:06 +0000</pubDate>
      <link>https://dev.to/rambozambo/119-of-119-an-independent-implementer-just-published-his-own-ietf-draft-on-aer-1-4l5f</link>
      <guid>https://dev.to/rambozambo/119-of-119-an-independent-implementer-just-published-his-own-ietf-draft-on-aer-1-4l5f</guid>
      <description>&lt;p&gt;This morning, a developer in France I have never employed, never paid, and never asked for a favor did the thing that actually decides whether a specification lives or dies. He built on it, in public, under his own name.&lt;/p&gt;

&lt;p&gt;Laurent Lemonnier of iSoluce published revision 01 of his own Internet-Draft, &lt;a href="https://datatracker.ietf.org/doc/draft-lemonnier-scitt-decision-provenance/" rel="noopener noreferrer"&gt;draft-lemonnier-scitt-decision-provenance&lt;/a&gt;, titled "Decision Provenance for SCITT: binding software releases and agent actions to the decisions behind them." It is his document, his argument, his standard-track work. And inside it, his Implementation Status section reports his AER-1 verifier passing 119 of 119 checks across the reference kit's seven suites, kit v1.5.7, pinned at commit 5d1504b.&lt;/p&gt;

&lt;p&gt;AER-1 is my draft: &lt;a href="https://datatracker.ietf.org/doc/draft-zambo-aer1-26/" rel="noopener noreferrer"&gt;draft-zambo-aer1-26&lt;/a&gt;, the agent execution receipt. Laurent did not fork my code and call it a day. He read the text, wrote his own verifier, and then used what he learned to write a second specification that composes with the first.&lt;/p&gt;

&lt;h2&gt;
  
  
  What his draft carries that mine did not
&lt;/h2&gt;

&lt;p&gt;The part I keep rereading is in his Security Considerations. Working the interop cases taught a rule, and his draft now states it for the record: when a member names a decision outside what the receipt's own digest covers, that naming is the producer's assertion, and the binding runs the other way, through the values the receipt actually commits to. In plain terms: a receipt covers exactly what its digest covers, no more, and anything claimed beyond that is a claim, not a proof. That sentence started as behavior two independent implementations observed while testing each other. It is now written down in a second author's draft.&lt;/p&gt;

&lt;p&gt;He also built a new interop case since: a plan-run case where one exact approval covers a whole plan, executed as steps, with a run manifest between them. His reading of AER-1 Section 8, the workflow receipts section, is that it forms the other end of that manifest: the approved plan on one side, the executed steps on the other, receipts binding the two. Composing those two halves is the next case on the list, and it is bound for the IETF 127 Hackathon in San Francisco, November 14 to 20.&lt;/p&gt;

&lt;p&gt;One person writing a draft is an opinion. A second person, unconnected, publishing his own draft that depends on the first one and corrects its edges in public: that is the start of a standard.&lt;/p&gt;

&lt;h2&gt;
  
  
  He is not the first stranger to build on it
&lt;/h2&gt;

&lt;p&gt;The pattern has been running all year, and every round of it made the draft harder and more honest.&lt;/p&gt;

&lt;p&gt;ARION built a complete Node.js verifier from the draft text alone, no reference code, no help from me. Run against the kit, it produced 165 checks with 0 failures, and its verdicts matched the reference verdicts exactly. That is the test a specification is supposed to pass: two people who never shared code read the same text and arrive at the same answers.&lt;/p&gt;

&lt;p&gt;ColonistOne built aer1-perl, a Perl implementation, again from the text. It came out conformant, and along the way he filed findings, real defects and ambiguities he hit while implementing. The draft adopted them. An implementer who finds nothing wrong has usually not implemented very much; ColonistOne implemented plenty.&lt;/p&gt;

&lt;p&gt;Genesis cold-built a verifier from draft -19 and hit three genuine gaps. Those gaps were fixed and adopted in draft -20, with credit in the draft itself, because that is the deal: if your implementation teaches the spec something, the spec says so.&lt;/p&gt;

&lt;p&gt;Lucas Bailey of WhiteMagic Labs independently verified the draft and is listed in it as an independent validator. And just two days ago, on October 31, Vaara's receipt draft reached revision 15 citing AER-1 -26, accurately, in a document I did not write and do not control.&lt;/p&gt;

&lt;p&gt;The press noticed the same week: &lt;a href="https://www.tokenpost.com/news/technology/44432" rel="noopener noreferrer"&gt;TokenPost&lt;/a&gt; covered the -26 revision on Oct 30, calling AER-1 "a portable receipt for AI tool calls" and noting, fairly, that it remains an individual proposal, not an adopted standard.&lt;/p&gt;

&lt;p&gt;None of these people work for me. There is no me, in the company sense: Zambo is one founder. The implementations exist because the text was public and the test corpus was public, and strangers decided the problem was worth their weekends.&lt;/p&gt;

&lt;h2&gt;
  
  
  The corpus is the invitation
&lt;/h2&gt;

&lt;p&gt;Every one of those implementations started at the same door: the public conformance corpus at &lt;a href="https://zambo.dev/aer1/corpus.json" rel="noopener noreferrer"&gt;https://zambo.dev/aer1/corpus.json&lt;/a&gt;. It holds 143 vectors and 146 checks, free for anyone to download and run tonight, no signup, no permission, no email to me. If your verifier agrees with all 146 checks, you have a conformant reading of AER-1. If it disagrees, you have found something the draft needs to hear, and the draft has a track record of adopting exactly those findings.&lt;/p&gt;

&lt;p&gt;That is the whole mechanism. A specification becomes a standard when strangers build on it, and strangers build on what they can test. The receipts underneath this are live, too: as I write this, Zambo's counters read 94,339 public receipts (1,656 of them today) across 82,040 tool calls, and the package estate behind the kit stands at 143,197 downloads. Every one of those receipts proves the saved result was not changed after the fact, which is the only thing a receipt should ever claim.&lt;/p&gt;

&lt;p&gt;So the invitation is standing, and it is specific. Take the corpus. Build the verifier in your stack, the way ARION did in Node, the way ColonistOne did in Perl, the way Genesis did cold from an older revision. Break it if you can. Laurent took it one step further and wrote the next document. There is room at that table, and the door is a JSON file.&lt;/p&gt;




&lt;p&gt;Try it free: add Zambo to your AI in one step at zambo.dev/add. 20 calls plus 1 wrap-up free every day, picking up in another AI is always free, no card and no signup wall.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zambo: &lt;a href="https://zambo.dev" rel="noopener noreferrer"&gt;https://zambo.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Add Zambo to your AI: &lt;a href="https://zambo.dev/add" rel="noopener noreferrer"&gt;https://zambo.dev/add&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AER-1 conformance corpus: &lt;a href="https://zambo.dev/aer1/corpus.json" rel="noopener noreferrer"&gt;https://zambo.dev/aer1/corpus.json&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Verify any receipt: &lt;a href="https://zambo.dev/verify/" rel="noopener noreferrer"&gt;https://zambo.dev/verify/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AI agent handover, the signature product: &lt;a href="https://dev.to/rambozambo/ai-agent-handover-pass-a-live-job-to-another-ai-without-losing-the-record-72b"&gt;https://dev.to/rambozambo/ai-agent-handover-pass-a-live-job-to-another-ai-without-losing-the-record-72b&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>ietf</category>
      <category>opensource</category>
      <category>standards</category>
    </item>
    <item>
      <title>Invoice for AI agent work with the proof attached: receipts, sign-off, and the dispute pack</title>
      <dc:creator>rambo</dc:creator>
      <pubDate>Sun, 01 Nov 2026 22:21:13 +0000</pubDate>
      <link>https://dev.to/rambozambo/invoice-for-ai-agent-work-with-the-proof-attached-receipts-sign-off-and-the-dispute-pack-2l39</link>
      <guid>https://dev.to/rambozambo/invoice-for-ai-agent-work-with-the-proof-attached-receipts-sign-off-and-the-dispute-pack-2l39</guid>
      <description>&lt;p&gt;An invoice is a claim. It says work happened, and asks to be paid. When the work was done by an AI agent, the client has no way to check the claim from the invoice alone, so payment turns into an argument about trust. This is the pattern that ends the argument: invoice with the record attached, so the client checks the work the way they would check a delivery note.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with a bare invoice
&lt;/h2&gt;

&lt;p&gt;The usual delivery is a file, a summary, and an invoice. If the client later says the work was never done, or was done differently, or was done by a tool they did not approve, the freelancer has a chat transcript. A transcript is the agent's own account of itself, written in the same voice as the claim. It settles nothing, because it can be edited, trimmed, or regenerated after the fact.&lt;/p&gt;

&lt;p&gt;What settles it is a record the agent did not write about itself: receipts left by the execution layer at the moment each piece of work ran.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern, in four steps
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Run the work so it leaves receipts.&lt;/strong&gt; Work routed through Zambo at &lt;a href="https://zambo.dev/mcp" rel="noopener noreferrer"&gt;https://zambo.dev/mcp&lt;/a&gt; leaves a verifiable receipt for every call: the tool, the inputs, the saved result, the time. A receipt proves the saved result was not changed since it was saved, and anyone can recheck it at &lt;a href="https://zambo.dev/verify/" rel="noopener noreferrer"&gt;https://zambo.dev/verify/&lt;/a&gt; with no account. As of November 1, 2026 the public stream holds 92,515 of these receipts, and every client job you run adds its own.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Wrap the finished job in a handover.&lt;/strong&gt; A handover carries the whole job under one link: the deliverable, the steps with a receipt for each, the decisions made along the way, and the list of what was not checked. Public handovers on the live system, such as handover bd7e5325, show the shape: the record itself travels, not a summary of the record.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Let the client accept on the record.&lt;/strong&gt; The client opens the one link, reads the work, and records their acceptance on the handover itself. Sign-off stops being an email thread nobody can find later. It is a line in the record, next to the work it accepts, with the receipts underneath it still recomputing to the same digests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Invoice against the link.&lt;/strong&gt; The invoice names the job and carries the handover link and the recorded acceptance. The client who wants to check before paying opens the same link the freelancer sees. There is no second version of the evidence prepared for the client, because the record was written while the work ran, not assembled when the invoice went out.&lt;/p&gt;

&lt;h2&gt;
  
  
  When the dispute comes anyway
&lt;/h2&gt;

&lt;p&gt;Sometimes it does, weeks later: the deliverable is questioned, a chargeback is threatened, a new manager inherits the account and trusts nothing. The dispute pack is the same link, reopened. The receipts recompute or they do not. The acceptance line is in the record or it is not. The conversation starts from a checkable record instead of from two memories.&lt;/p&gt;

&lt;p&gt;Be precise about what the pack proves. It proves the saved results were not changed after the fact, and that the client recorded acceptance of the work as presented. It does not prove the work was good. Quality was the client's call at acceptance time, made with the record open, which is exactly when that call should be made.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it costs to work this way
&lt;/h2&gt;

&lt;p&gt;The free tier covers a small delivery on its own: 20 calls plus 1 wrap-up free every day, and picking up a handover in another AI is always free. A heavy delivery day is a $0.99 Day Pass, unlimited for 24 hours. Ongoing client work is the Zambo Pass, $29 for 30 days. The record is not an add-on at any tier; every call leaves its receipt as part of the call.&lt;/p&gt;

&lt;p&gt;The invoice your client can check is the invoice that gets paid without the meeting. Attach the record, and the proof of completion stops being your word against theirs.&lt;/p&gt;




&lt;p&gt;Try it free: add Zambo to your AI in one step at zambo.dev/add. 20 calls plus 1 wrap-up free every day, no card and no signup wall.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zambo: &lt;a href="https://zambo.dev" rel="noopener noreferrer"&gt;https://zambo.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Add Zambo to your AI: &lt;a href="https://zambo.dev/add" rel="noopener noreferrer"&gt;https://zambo.dev/add&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Verify any receipt: &lt;a href="https://zambo.dev/verify/" rel="noopener noreferrer"&gt;https://zambo.dev/verify/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The full estate, by the numbers: &lt;a href="https://dev.to/rambozambo/one-founder-44-packages-116305-downloads-the-zambo-stack-by-the-numbers-4m0f"&gt;https://dev.to/rambozambo/one-founder-44-packages-116305-downloads-the-zambo-stack-by-the-numbers-4m0f&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AI agent handover, the signature product: &lt;a href="https://dev.to/rambozambo/ai-agent-handover-pass-a-live-job-to-another-ai-without-losing-the-record-72b"&gt;https://dev.to/rambozambo/ai-agent-handover-pass-a-live-job-to-another-ai-without-losing-the-record-72b&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

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