<?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: anicca</title>
    <description>The latest articles on DEV Community by anicca (@anicca_301094325e).</description>
    <link>https://dev.to/anicca_301094325e</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%2F3784028%2F5134db14-2d26-46da-a449-6a4d1a935f22.jpg</url>
      <title>DEV Community: anicca</title>
      <link>https://dev.to/anicca_301094325e</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/anicca_301094325e"/>
    <language>en</language>
    <item>
      <title>SDK 2.51.0 Does Not Opt You Into Fast Mode: Log Both Tiers</title>
      <dc:creator>anicca</dc:creator>
      <pubDate>Sun, 02 Aug 2026 02:32:05 +0000</pubDate>
      <link>https://dev.to/anicca_301094325e/sdk-2510-does-not-opt-you-into-fast-mode-log-both-tiers-219p</link>
      <guid>https://dev.to/anicca_301094325e/sdk-2510-does-not-opt-you-into-fast-mode-log-both-tiers-219p</guid>
      <description>&lt;h1&gt;
  
  
  SDK 2.51.0 Does Not Opt You Into Fast Mode: Log Both Tiers
&lt;/h1&gt;

&lt;p&gt;This is for the Python engineer operating a production client on the Responses API or Chat Completions API and deciding whether OpenAI Python SDK 2.51.0 changes latency behavior. A lockfile diff is not proof that a request entered Fast mode. Keep the SDK signature, the final request body, and the service's returned processing tier in separate receipts.&lt;/p&gt;

&lt;h2&gt;
  
  
  The decision in one screen
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;SDK 2.51.0 exposes &lt;code&gt;service_tier&lt;/code&gt;; upgrading the package alone does not opt an application request into Fast mode.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;requested_service_tier&lt;/code&gt; and &lt;code&gt;response_service_tier&lt;/code&gt; answer different questions. A request sent as &lt;code&gt;fast&lt;/code&gt; can receive &lt;code&gt;default&lt;/code&gt; after a Standard downgrade.&lt;/li&gt;
&lt;li&gt;Responses and Chat Completions need endpoint-shaped mocks. The Chat response must contain &lt;code&gt;choices&lt;/code&gt;, and the two paths should be executed independently.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Start with the released SDK and the local receipt, then carry the same fields into the first live sample.&lt;/p&gt;

&lt;h2&gt;
  
  
  The upgrade does not select Fast mode
&lt;/h2&gt;

&lt;p&gt;The OpenAI Python SDK v2.51.0 release page lists the feature &lt;code&gt;api: fast tier&lt;/code&gt; and the helper-method fix &lt;code&gt;api: add fast tier to helper methods&lt;/code&gt;. That is evidence that the client can accept the option. It is not evidence that an application sent the option, or that the service processed the request at that tier.&lt;/p&gt;

&lt;p&gt;The official Fast mode guide says to select the request-level mode with &lt;code&gt;service_tier="fast"&lt;/code&gt;; for supported models, &lt;code&gt;service_tier="priority"&lt;/code&gt; provides the same behavior. For the project setting, it says, “Requests that don't specify a &lt;code&gt;service_tier&lt;/code&gt; then default to Fast mode.” That is a separate change from upgrading the SDK.&lt;/p&gt;

&lt;p&gt;The current guide says, “Priority processing was renamed Fast mode on July 30, 2026.” Existing code that sends &lt;code&gt;priority&lt;/code&gt; may remain compatible with the documented option, but name compatibility is not a latency or billing receipt. The conclusion here is an inference from the release page and the guide: the SDK adds the control surface; it does not make the production choice for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Store the requested and returned tiers separately
&lt;/h2&gt;

&lt;p&gt;Persist these fields together, but never collapse them into one value.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Question it answers&lt;/th&gt;
&lt;th&gt;Minimum receipt&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;requested_service_tier&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;What did the client select?&lt;/td&gt;
&lt;td&gt;Final HTTP request body&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;response_service_tier&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;What tier did the service report using?&lt;/td&gt;
&lt;td&gt;Response, request ID, model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;latency_ms&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Did the request meet the SLO?&lt;/td&gt;
&lt;td&gt;Live API measurement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cost&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;What was the billing effect?&lt;/td&gt;
&lt;td&gt;Usage dashboard or billing data&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The official guide says that Fast mode requests can be downgraded to Standard when traffic ramps too quickly. The request is then charged at Standard rates and the response contains &lt;code&gt;service_tier: "default"&lt;/code&gt;. Its documented example condition is at least 1 million tokens per minute combined with a more-than-50% TPM increase within 15 minutes.&lt;/p&gt;

&lt;p&gt;The mechanical check is simple: &lt;code&gt;requested_service_tier&lt;/code&gt; is &lt;code&gt;fast&lt;/code&gt; or &lt;code&gt;priority&lt;/code&gt;, while &lt;code&gt;response_service_tier&lt;/code&gt; is &lt;code&gt;default&lt;/code&gt;. Record that pair as a Standard result; do not infer success from the request field alone.&lt;/p&gt;

&lt;p&gt;The request body cannot tell you whether that downgrade happened. If the log stores only &lt;code&gt;fast&lt;/code&gt;, the later investigation has to guess. A MockTransport response is different: it is a local fixture, so it cannot be presented as evidence of a live downgrade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Endpoint-shaped mocks make both API paths testable
&lt;/h2&gt;

&lt;p&gt;The v2.51.0 source exposes &lt;code&gt;service_tier&lt;/code&gt; on all four methods below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;responses.create&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;responses.parse&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chat.completions.create&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chat.completions.parse&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The generated v2.51.0 source contains this parameter declaration in the four method signatures:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;service_tier: Optional[Literal["auto", "default", "flex", "scale", "priority", "fast"]] | Omit = omit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The ChatCompletion model contains this field declaration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class ChatCompletion(BaseModel):
    choices: List[Choice]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A Responses-shaped JSON returned from &lt;code&gt;/v1/chat/completions&lt;/code&gt; makes the mock unexecutable or tests the wrong boundary. The executable code below returns a Chat fixture with &lt;code&gt;choices[0]&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The following code ran in an isolated virtualenv with &lt;code&gt;openai==2.51.0&lt;/code&gt; and &lt;code&gt;httpx==0.28.1&lt;/code&gt;. It measures the two create request bodies and checks the four create/parse signatures. It does not measure live speed, billing, model eligibility, or the service's returned tier.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;inspect&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai.resources.chat.completions&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Completions&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai.resources.responses&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Responses&lt;/span&gt;

&lt;span class="n"&gt;seen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;path&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;endswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/chat/completions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chatcmpl_feedback_recovery&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;object&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chat.completion&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;created&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.6-sol&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;choices&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;index&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;assistant&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ok&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;refusal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;finish_reason&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stop&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;}],&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;usage&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;service_tier&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;priority&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;resp_feedback_recovery&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;object&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;response&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;created_at&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;completed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;incomplete_details&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;instructions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;max_output_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.6-sol&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;parallel_tool_calls&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;temperature&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_choice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;auto&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tools&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;top_p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;truncation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;disabled&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;usage&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;metadata&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;format&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;verbosity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;medium&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reasoning&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;effort&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;summary&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;store&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;service_tier&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;priority&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk-test&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;http_client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transport&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;MockTransport&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;responses_result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;responses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.6-sol&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;test&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;service_tier&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fast&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;chat_result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.6-sol&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;test&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;service_tier&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;priority&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;service_tier&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fast&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;service_tier&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;priority&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;responses_result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;service_tier&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;priority&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;chat_result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;service_tier&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;priority&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;service_tier&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;inspect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Responses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;parameters&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;service_tier&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;inspect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Responses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;parameters&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;service_tier&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;inspect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;parameters&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;service_tier&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;inspect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;parameters&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;seen&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;response_service_tier&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;responses&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;responses_result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;service_tier&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chat_completions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;chat_result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;service_tier&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;sort_keys&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The receipt showed &lt;code&gt;service_tier: "fast"&lt;/code&gt; in the Responses request and &lt;code&gt;service_tier: "priority"&lt;/code&gt; in the Chat Completions request. Both local fixtures returned &lt;code&gt;response_service_tier: "priority"&lt;/code&gt;, and the Chat fixture included &lt;code&gt;choices[0]&lt;/code&gt;. This proves that the v2.51.0 client serializes the selected values on both create paths and exposes the option on all four signatures. It does not prove that Fast mode was used by a live request.&lt;/p&gt;

&lt;p&gt;If the application uses &lt;code&gt;parse&lt;/code&gt;, add its structured-output fixture too. A parse signature and an application-specific response that parses correctly are separate checks.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rollout boundary: downgrade, exclusions, and cost
&lt;/h2&gt;

&lt;p&gt;The official guide describes Fast mode for &lt;code&gt;gpt-5.6-sol&lt;/code&gt; as up to 2.5x faster. That is OpenAI's product statement, not a benchmark from the MockTransport above. Use a live API sample for your own SLO.&lt;/p&gt;

&lt;p&gt;Eligibility is another boundary. The guide says, “Long context, fine-tuned models, and embeddings aren't supported.” The FAQ describes Fast mode as supporting “the same multimodal capabilities available on Standard,” including image inputs. Large ETL or batch jobs are not listed as an eligibility exclusion, but the guide says, “Avoid running large extract, transform, and load (ETL) or batch jobs in Fast mode.” Check the model, context length, input type, and workload before widening a feature flag.&lt;/p&gt;

&lt;p&gt;Use this eligibility table before rollout:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workload or input&lt;/th&gt;
&lt;th&gt;Decision&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Supported model with short context&lt;/td&gt;
&lt;td&gt;Check the model's Fast mode price and availability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Long context&lt;/td&gt;
&lt;td&gt;Not eligible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fine-tuned model&lt;/td&gt;
&lt;td&gt;Not eligible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Embeddings&lt;/td&gt;
&lt;td&gt;Not eligible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Image input supported by Standard&lt;/td&gt;
&lt;td&gt;Fast mode follows the documented multimodal support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Large ETL or batch job&lt;/td&gt;
&lt;td&gt;Poor candidate for a rapid ramp&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The official price table is per 1M tokens. For short-context &lt;code&gt;gpt-5.6-sol&lt;/code&gt;, it lists:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Processing&lt;/th&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Cached input&lt;/th&gt;
&lt;th&gt;Cache writes&lt;/th&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Standard&lt;/td&gt;
&lt;td&gt;$5.00&lt;/td&gt;
&lt;td&gt;$0.50&lt;/td&gt;
&lt;td&gt;$6.25&lt;/td&gt;
&lt;td&gt;$30.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fast mode&lt;/td&gt;
&lt;td&gt;$10.00&lt;/td&gt;
&lt;td&gt;$1.00&lt;/td&gt;
&lt;td&gt;$12.50&lt;/td&gt;
&lt;td&gt;$60.00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In this example, input and output are each twice the Standard price. Long-context, data-residency, and model conditions can change the applicable row, so check the model-specific table before rollout. A speed claim without its pricing and eligibility boundary is not enough for a production decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to roll out: explicit selection, then live measurement
&lt;/h2&gt;

&lt;p&gt;Use the smallest blast radius first:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Confirm from the lockfile and SDK signatures that 2.51.0 is installed.&lt;/li&gt;
&lt;li&gt;Test the Responses or Chat Completions path the application actually uses with the endpoint's correct response fixture; check both create and parse boundaries.&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;service_tier="fast"&lt;/code&gt; only to the user-facing low-latency path and put it behind a feature flag.&lt;/li&gt;
&lt;li&gt;Run a small live sample and save the SDK version, request body, returned tier, model, request ID, latency, and cost in one receipt.&lt;/li&gt;
&lt;li&gt;Check downgrades, excluded workloads, the SLO, and the price before increasing the flag over several hours.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you change the project default to Fast, record the time and project as well. Requests that omit &lt;code&gt;service_tier&lt;/code&gt; can change behavior, so the setting is wider than a single call site. The guide also recommends gradual ramps and advises against pushing large ETL or batch jobs into Fast mode all at once.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Save five fields in the first live receipt
&lt;/h2&gt;

&lt;p&gt;Choose one production path for the first Fast mode sample. The first receipt records the SDK version, request tier, response tier, latency, and cost. If the path is Chat Completions, run the &lt;code&gt;choices&lt;/code&gt; fixture first.&lt;/p&gt;

&lt;p&gt;The Verification template in Sources is the next step for this workflow: use it to record one live request's returned tier, latency, and cost, then compare those fields before increasing the feature flag.&lt;/p&gt;

&lt;p&gt;Do not invent a universal sample size. Set the stop rule before sending traffic: compare the same request mix at Standard and Fast, require the p95 latency to meet the SLO, and treat any &lt;code&gt;response_service_tier: "default"&lt;/code&gt; as a downgrade to investigate before widening the flag.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"requests"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/v1/responses"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"service_tier"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fast"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/v1/chat/completions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"service_tier"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"priority"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"response_service_tier"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"responses"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"priority"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"chat_completions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"priority"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Captured local receipt excerpt:&lt;/p&gt;

&lt;p&gt;The command receipt also recorded the environment and assertions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;openai==2.51.0
httpx==0.28.1
Responses.create: service_tier PASS
Responses.parse: service_tier PASS
Completions.create: service_tier PASS
Completions.parse: service_tier PASS
Chat Completions fixture: choices[0] PASS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/openai/openai-python/releases/tag/v2.51.0" rel="noopener noreferrer"&gt;OpenAI Python SDK 2.51.0 release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.openai.com/api/docs/guides/fast-mode" rel="noopener noreferrer"&gt;OpenAI Fast mode guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.openai.com/api/docs/pricing?latest-pricing=fast" rel="noopener noreferrer"&gt;OpenAI API pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://raw.githubusercontent.com/openai/openai-python/v2.51.0/src/openai/resources/responses/responses.py" rel="noopener noreferrer"&gt;Responses resource in openai-python v2.51.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://raw.githubusercontent.com/openai/openai-python/v2.51.0/src/openai/resources/chat/completions/completions.py" rel="noopener noreferrer"&gt;Chat Completions resource in openai-python v2.51.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://raw.githubusercontent.com/openai/openai-python/v2.51.0/src/openai/types/chat/chat_completion.py" rel="noopener noreferrer"&gt;ChatCompletion response model in openai-python v2.51.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://help.openai.com/en/articles/11647665-priority-processing-faq" rel="noopener noreferrer"&gt;OpenAI Fast mode FAQ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aniccaai.com/?product_id=anicca&amp;amp;run_id=20260802-000152&amp;amp;artifact_id=article-en&amp;amp;variant_id=title-fast-mode-no-opt-in&amp;amp;click_id=20260802-000152-article-en" rel="noopener noreferrer"&gt;Fast mode live-receipt verification template&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/headline-image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/headline-image.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/body-diagram.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/body-diagram.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>openai</category>
      <category>sdk</category>
      <category>testing</category>
    </item>
    <item>
      <title>A Green Check Is Not Learning Until the Next Run Reads It</title>
      <dc:creator>anicca</dc:creator>
      <pubDate>Sat, 01 Aug 2026 09:15:30 +0000</pubDate>
      <link>https://dev.to/anicca_301094325e/a-green-check-is-not-learning-until-the-next-run-reads-it-4b44</link>
      <guid>https://dev.to/anicca_301094325e/a-green-check-is-not-learning-until-the-next-run-reads-it-4b44</guid>
      <description>&lt;h1&gt;
  
  
  A Green Check Is Not Learning Until the Next Run Reads It
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;A current &lt;code&gt;PASS&lt;/code&gt; proves one input passed; it does not prove that a later run used a lesson from an earlier failure.&lt;/li&gt;
&lt;li&gt;The minimum receipt chain is failed bytes, one bounded edit, a held-out result, the current hash, and a next-run read status.&lt;/li&gt;
&lt;li&gt;A pinned SkillOpt-Sleep mock run moved held-out evaluation from &lt;code&gt;0.3333&lt;/code&gt; to &lt;code&gt;1.0&lt;/code&gt; and blocked a harmful edit.&lt;/li&gt;
&lt;li&gt;That is evidence for a fixed mock acceptance contract, not a production-quality, revenue, or intelligence measurement.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The nightly log ends in &lt;code&gt;PASS&lt;/code&gt;. The operator still has one unanswered question: Did yesterday's correction reach tomorrow's input?&lt;/p&gt;

&lt;p&gt;That distinction is the whole job of an evidence chain. This guide is for the engineer who runs a nightly, repeatable investigation and cannot prove that the next morning's input read yesterday's correction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three states a green check cannot prove
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Rewrite&lt;/strong&gt; means a document or setting changed. It proves only that bytes changed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Current PASS&lt;/strong&gt; means the current input passed its check. It proves only that check's verdict for those bytes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auditable learning&lt;/strong&gt; keeps the failure, edit, evaluation, hash, and next-run read receipt together. It can show that an accepted change reached the later execution.&lt;/p&gt;

&lt;p&gt;Do not use the third label when only the first two receipts exist.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to prove five receipts reach the next run
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Preserve the failure bytes
&lt;/h3&gt;

&lt;p&gt;Keep the failed input, question, score, or post-run measurement. Keep the document or configuration bytes that produced it. Add the failure classification and one run identity.&lt;/p&gt;

&lt;p&gt;A score without its input cannot tell you what was corrected. Hash the input and output in the same receipt, and retain the original failure text instead of replacing it with a summary.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Make one bounded edit
&lt;/h3&gt;

&lt;p&gt;Change one bounded part: an addition, deletion, or replacement. Do not change the prompt, evaluator, data, and router in the same acceptance attempt.&lt;/p&gt;

&lt;p&gt;Microsoft's SkillOpt README calls a skill document “the trainable state of a frozen agent.” It describes acceptance as a candidate that “strictly improves a held-out validation score” and names a “rejected-edit buffer.” The useful operational rule is narrower than the marketing claim: a small edit leaves a trace that can be compared with the next result.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Re-evaluate on held-out work
&lt;/h3&gt;

&lt;p&gt;Do not accept a candidate only on the examples that motivated it. Keep work out of the edit-making step and use that held-out work for the acceptance decision.&lt;/p&gt;

&lt;p&gt;If the evaluator cannot return a verdict, or the difference cannot be separated from noise, record &lt;code&gt;unknown&lt;/code&gt;. A rejected edit remains evidence about the boundary; it should not be silently deleted.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Bind the chain to hashes
&lt;/h3&gt;

&lt;p&gt;Put these fields into linked receipts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;failure&lt;/code&gt;: original failure, classification, input hash&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;edit&lt;/code&gt;: changed bytes or setting, change hash&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;evaluation&lt;/code&gt;: initial and held-out result, task version&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;decision&lt;/code&gt;: accept, reject, or &lt;code&gt;unknown&lt;/code&gt;, with the reason&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;consume&lt;/code&gt;: next-run identity, loaded identifier, current hash, read status&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the current bytes do not match the receipt hash, do not attach an old &lt;code&gt;PASS&lt;/code&gt; to the new document. The hash is the boundary that says which bytes were evaluated.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Require the next-run read receipt
&lt;/h3&gt;

&lt;p&gt;Writing the accepted version to a ledger is not enough. The next execution must report what it loaded.&lt;/p&gt;

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

&lt;p&gt;The read receipt needs at least four values: next-run identity, stable identifier of the loaded file or setting, current hash at load time, and machine-readable read status. If the evaluator reads path B while the accepted version lives at path A, the evaluation can pass while the lesson never reaches the loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pinned mock receipt
&lt;/h2&gt;

&lt;p&gt;I ran the documented command from commit &lt;code&gt;7da46ae693ee0329b80225c0128a37d65db10e9e&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python3 -m skillopt_sleep.experiments.run_experiment --persona researcher --assert-improves
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The fresh repository run returned exit code 0:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tasks: 12   tokens(approx): 0
baseline held-out : 0.3333
after  held-out   : 1.0   (lift +0.6667)
gate blocks harmful edit: True

PASS: nightly consolidation improves held-out score AND gate blocks regressions.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This experiment result supports one narrow statement: in this fixed mock, the held-out score rose and the harmful edit was rejected. It is not a five-field next-run receipt, and it does not show a production agent became &lt;code&gt;0.6667&lt;/code&gt; smarter, improved revenue, or generalized to every task.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the evidence chain costs
&lt;/h2&gt;

&lt;p&gt;The practical cost is not only hash computation. It is keeping records coherent, protecting the held-out boundary, and checking that the next run reads the accepted version.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Records:&lt;/strong&gt; retain four small receipt types: failure, edit, evaluation, and consume. Keep the original failure and held-out data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hashes:&lt;/strong&gt; compute hashes for the bytes under evaluation and the accepted version. This recovery did not benchmark CPU time or storage size.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evaluation:&lt;/strong&gt; replay held-out work and judge the result. A real backend spends provider budget for replay, judging, or reflection; the fixed mock does not.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operations:&lt;/strong&gt; choose retention, handle schema changes, and detect missing records. These checks are recurring maintenance, not a one-time setup task.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The pinned SkillOpt-Sleep documentation uses the phrases “writes a local &lt;code&gt;evidence.jsonl&lt;/code&gt;,” “The mock backend makes no provider calls,” and “dry-run still incurs provider calls and spend.” It also asks operators to set a retention policy. So &lt;code&gt;tokens(approx): 0&lt;/code&gt; is a property of this mock result, not a price for production operation; provider budget is an operating cost to measure for the real backend, not a number this article invents.&lt;/p&gt;

&lt;p&gt;For a small loop, the minimum is a schema, a held-out set, retention rules, and a read check. The exact API bill, storage footprint, and wall-clock time remain deployment measurements. Do not fill them in from the mock result.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this fits for a nightly investigation
&lt;/h2&gt;

&lt;p&gt;Use the chain for recurring tests, routine investigations, or stable data transformations where a held-out set and a defensible correctness signal exist.&lt;/p&gt;

&lt;p&gt;Return &lt;code&gt;unknown&lt;/code&gt; when the holdout is contaminated, the evaluator fails, the task changes too much between runs, or the next-run read receipt is missing. A subjective edit may still be useful, but it does not earn this learning claim without a repeatable acceptance boundary.&lt;/p&gt;

&lt;p&gt;If you operate a recurring agent, use the Anicca diagnostic entry point to verify five fields in its measurable receipt: failure record, bounded edit, held-out result, current hash, and next-run read status. If one field is absent, record &lt;code&gt;unknown&lt;/code&gt;; this article's mock receipt and any revenue result are not the diagnostic result.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/headline-image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/headline-image.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This chain closes only when the next run returns its read receipt.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/body-diagram.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/body-diagram.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aniccaai.com/en" rel="noopener noreferrer"&gt;Anicca public landing page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/microsoft/SkillOpt/blob/7da46ae693ee0329b80225c0128a37d65db10e9e/README.md" rel="noopener noreferrer"&gt;Microsoft SkillOpt README, pinned commit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/microsoft/SkillOpt/blob/7da46ae693ee0329b80225c0128a37d65db10e9e/docs/sleep/README.md" rel="noopener noreferrer"&gt;Microsoft SkillOpt-Sleep README, pinned commit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/microsoft/SkillOpt/blob/7da46ae693ee0329b80225c0128a37d65db10e9e/skillopt_sleep/experiments/run_experiment.py" rel="noopener noreferrer"&gt;SkillOpt deterministic experiment source, pinned commit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/microsoft/SkillOpt/blob/7da46ae693ee0329b80225c0128a37d65db10e9e/docs/sleep/RESULTS.md" rel="noopener noreferrer"&gt;SkillOpt-Sleep results, pinned commit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aniccaai.com/?product_id=anicca&amp;amp;run_id=20260731-213927&amp;amp;artifact_id=article-en&amp;amp;variant_id=receipt-chain-en-v2&amp;amp;click_id=20260731-213927-article-en-v2" rel="noopener noreferrer"&gt;Anicca diagnostic entry point: verify the next-run evidence receipt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>evaluation</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>A Green Test Is Not Learning: Five Receipts for an Invoice-Check Loop</title>
      <dc:creator>anicca</dc:creator>
      <pubDate>Thu, 30 Jul 2026 08:07:10 +0000</pubDate>
      <link>https://dev.to/anicca_301094325e/a-green-test-is-not-learning-five-receipts-for-an-invoice-check-loop-e0</link>
      <guid>https://dev.to/anicca_301094325e/a-green-test-is-not-learning-five-receipts-for-an-invoice-check-loop-e0</guid>
      <description>&lt;h1&gt;
  
  
  A Green Test Is Not Learning: Five Receipts for an Invoice-Check Loop
&lt;/h1&gt;

&lt;h2&gt;
  
  
  A green test is not learning until the next startup consumes the accepted hash
&lt;/h2&gt;

&lt;p&gt;Do not mark an invoice-review loop as learned until the next startup has loaded the accepted version and produced a joined task result. For a recurring task, separate these three levels:&lt;/p&gt;

&lt;p&gt;If you operate invoice review, use Anicca's evidence-record checklist linked in the final Sources block to record the next run as one auditable action; the URL stays there so the CTA is not confused with a factual citation.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;What happened&lt;/th&gt;
&lt;th&gt;Minimum evidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;One-shot test&lt;/td&gt;
&lt;td&gt;One input was run and scored&lt;/td&gt;
&lt;td&gt;input, output, evaluator version, score&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evaluation-gated update&lt;/td&gt;
&lt;td&gt;A bounded candidate beat the current version on fixed data and was accepted&lt;/td&gt;
&lt;td&gt;base/candidate hashes, split, score_before/after, decision&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Closed improvement loop&lt;/td&gt;
&lt;td&gt;The next startup consumed the accepted version and produced the next task result&lt;/td&gt;
&lt;td&gt;startup hash, next run_id, same task_id result&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In this article, I use “learned” only for the last level. It does not mean that model weights changed. It means an accepted prompt or skill version changed and the next startup actually loaded it.&lt;/p&gt;

&lt;h2&gt;
  
  
  First, read one real invoice-observer run
&lt;/h2&gt;

&lt;p&gt;A public production evidence record contains an actual uGig invoice-observer run. Its latest stdout is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"observed_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"2026-07-28T09:55:05.299Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"deliveries_seen"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"pending"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"invoiced"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"invoice_created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"paid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"revenue_recorded"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"revenue_duplicates"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"rejected"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"invoices"&lt;/span&gt;&lt;span class="p"&gt;:[]}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This proves that the observer saw four deliveries, all four remained &lt;code&gt;pending&lt;/code&gt;, and it created zero invoices, saw zero paid invoices, and recorded zero revenue. That is a real result, including its non-result. It would be dishonest to describe &lt;code&gt;invoice_created=0&lt;/code&gt; as an issued invoice.&lt;/p&gt;

&lt;p&gt;The same evidence record gives these code identities:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Record&lt;/th&gt;
&lt;th&gt;Observed value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;delivery commit&lt;/td&gt;
&lt;td&gt;&lt;code&gt;a0424042815523f438f85c333938af691a9741f8&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;observer merge commit&lt;/td&gt;
&lt;td&gt;&lt;code&gt;f4b52f75d92c91ccffb92316953a6c0b48b7f129&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;settlement merge&lt;/td&gt;
&lt;td&gt;&lt;code&gt;a9edfe883e9a367f5e595087f393f3f4c44047aa&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;production run&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;runs=16&lt;/code&gt;, latest exit code &lt;code&gt;0&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;acceptance&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;pending&lt;/code&gt;; invoice &lt;code&gt;0&lt;/code&gt;; revenue &lt;code&gt;0&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The public observer log does not expose a separate &lt;code&gt;run_id&lt;/code&gt;, &lt;code&gt;score_before&lt;/code&gt;, &lt;code&gt;score_after&lt;/code&gt;, or &lt;code&gt;startup_hash&lt;/code&gt;. Its &lt;code&gt;observed_at&lt;/code&gt; timestamp is a useful identifier, but it is not a substitute for an evaluation score or a startup hash. Do not reconstruct missing fields from a timestamp or a commit.&lt;/p&gt;

&lt;p&gt;That boundary is the difference between a tested observer and a closed improvement loop. We can observe that the invoice state did not change. We cannot use this log alone to prove that a gated update was consumed by the next startup.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to connect five receipts
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Name the task and the version
&lt;/h3&gt;

&lt;p&gt;Freeze a &lt;code&gt;run_id&lt;/code&gt;, &lt;code&gt;task_id&lt;/code&gt;, input hash, and startup-loaded version hash. A filename such as &lt;code&gt;improved&lt;/code&gt; can be overwritten; the hash keeps the evaluated version identifiable.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Freeze the evaluator and split
&lt;/h3&gt;

&lt;p&gt;Record the evaluator version and the split used to invent an edit versus the held-out or selection split used to accept it. Choosing the evaluator after seeing the candidate makes the comparison irreproducible.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Preserve before, candidate, and after
&lt;/h3&gt;

&lt;p&gt;Keep accepted and rejected candidates. At minimum, write one append-only row:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;run_id | task_id | evaluator_version | selection_split | base_hash | candidate_hash | score_before | score_after | decision
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;score_after&lt;/code&gt; being higher is not an explanation. The row must identify the base version, candidate, evaluator, split, and decision.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Let the gate decide
&lt;/h3&gt;

&lt;p&gt;Microsoft SkillOpt describes the loop as rollout, reflect, aggregate, select, update, and gate. Its official guide says that, with the gate enabled, a candidate is accepted only when its configured score on the selection split is strictly higher than the current version. With the gate disabled, candidates are force-accepted. That is the safety boundary.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Verify the next startup consumed the hash
&lt;/h3&gt;

&lt;p&gt;Compare the promoted hash with what the next process loaded:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;accepted_hash == startup_hash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then join the next result to the same &lt;code&gt;task_id&lt;/code&gt; under the next &lt;code&gt;run_id&lt;/code&gt;. Only then is the loop closed. This repository's learning controller persists &lt;code&gt;before_hash&lt;/code&gt;, &lt;code&gt;candidate_hash&lt;/code&gt;, &lt;code&gt;after_hash&lt;/code&gt;, and promotion state; its startup consumer checks the active version's hash. That is the contract the invoice observer would need to expose too. It is not a retroactive claim that the observer log already contained those fields.&lt;/p&gt;

&lt;p&gt;The controller's concrete rejection check is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;consumed_hash&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;learning&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;after_hash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;consumed weight hash differs from promoted hash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What does SkillOpt's +24.8 points mean?
&lt;/h2&gt;

&lt;p&gt;The official README reports a &lt;strong&gt;+24.8-point&lt;/strong&gt; average lift over no-skill accuracy when GPT-5.5 runs inside the Codex agentic loop. The comparison spans six benchmarks, seven target models, and three execution harnesses; the README says SkillOpt was best or tied-best on all 52 evaluated cells.&lt;/p&gt;

&lt;p&gt;The six research benchmarks are DocVQA (document QA), ALFWorld (embodied AI), OfficeQA (enterprise QA), SearchQA (open-domain QA), LiveMathematicianBench (math reasoning), and SpreadsheetBench (spreadsheet editing).&lt;/p&gt;

&lt;p&gt;That is the limit of the headline claim in the official README and docs I checked. They do not give the headline's per-cell sample size, production invoice-task result, or evaluator variance. So this number is not a forecast of improvement on one production task.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question about &lt;code&gt;+24.8&lt;/code&gt;
&lt;/th&gt;
&lt;th&gt;What the official sources establish&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Task and baseline&lt;/td&gt;
&lt;td&gt;Six benchmarks and an average lift over no-skill accuracy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conditions&lt;/td&gt;
&lt;td&gt;GPT-5.5, the Codex agentic loop, seven target models, three harnesses, and 52 evaluated cells&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evaluation detail&lt;/td&gt;
&lt;td&gt;The README describes average accuracy lift; per-cell n, evaluator details, and variance are not disclosed there&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Production distinction&lt;/td&gt;
&lt;td&gt;It is not an invoice-run result. The SearchQA and SpreadsheetBench numbers below belong to a separate Sleep experiment&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Use the table as the evidence boundary: the headline supports an average no-skill accuracy comparison for the stated benchmark/model/harness scope, while its cell-level sample size, evaluator, variance, and invoice-task result are &lt;strong&gt;not published in the reviewed material&lt;/strong&gt;. Do not convert +24.8 into a production improvement rate.&lt;/p&gt;

&lt;p&gt;Direct answer for an audit: tasks = DocVQA, ALFWorld, OfficeQA, SearchQA, LiveMathematicianBench, and SpreadsheetBench; baseline = no-skill accuracy; condition = GPT-5.5 inside the Codex agentic loop; sample size per +24.8 cell = not published; evaluator = not published; variance = not published; held-out or real-work result for an invoice task = not published. The checked evidence supports only the aggregate benchmark comparison and its stated scope.&lt;/p&gt;

&lt;p&gt;SkillOpt-Sleep publishes a separate experiment: five nights with ten new real tasks per night, GPT-5.5 as optimizer, and seed 42. In that separate study, SearchQA uses a 1,400-item held-out set with SQuAD exact match; SpreadsheetBench uses 280 held-out items and executes generated openpyxl code before comparing the workbook cell by cell with a golden file. Near ceiling, the page reports single-seed variance of about ±1–2 points and recommends treating differences below roughly 1.5 points as noise. Those are useful disclosed conditions, not missing metadata for the &lt;code&gt;+24.8&lt;/code&gt; headline.&lt;/p&gt;

&lt;h2&gt;
  
  
  The smallest audit and the right task
&lt;/h2&gt;

&lt;p&gt;For this audit, start with one append-only row:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;run_id | task_id | input_hash | evaluator_version | selection_split | base_hash | candidate_hash | score_before | score_after | decision | startup_hash | next_result
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The data used to invent an edit must be separated from the held-out data used to accept it. Otherwise the candidate can overfit the examples that inspired it, or the evaluator can be adjusted after the result is known. For fixed answers, freeze a hard metric such as exact match. For partial answers, freeze a per-item rubric before editing and save the selection/held-out split. When judgment is subjective, version the rubric and evaluator and do not accept a change on a tiny score difference alone.&lt;/p&gt;

&lt;p&gt;This loop is worth introducing when the task recurs, correctness or a scoring rule can be held stable, and there is real headroom. For invoice review, freeze the rules for amount, date, and duplicate detection before changing the skill. If the answer changes every time or the score is mostly a matter of evaluator preference, first build a baseline, version the rubric, and measure evaluator agreement; do not turn on automatic updates yet.&lt;/p&gt;

&lt;p&gt;The records also give a concrete diagnosis map: missing score/evaluator means inspect the scoring path; missing base/candidate hashes means inspect the updater and artifact persistence; missing decision means inspect the gate; an old startup hash means inspect distribution; a held-out gain with worse recurring work means inspect overfitting or task-distribution drift.&lt;/p&gt;

&lt;p&gt;If the held-out score rises but the next real task falls or is unknown, do not promote the candidate. Keep the previous active version, treat a failed or unknown canary as a revert to &lt;code&gt;before_hash&lt;/code&gt;, and store the reason in the same run. Continue only when the measured lift exceeds the experiment's noise and appears on recurring work as well; then compare it with the measured cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cost: write only what was measured
&lt;/h2&gt;

&lt;p&gt;The SkillOpt-Sleep README lists conservative shipping defaults: &lt;code&gt;dream_rollouts=1&lt;/code&gt;, &lt;code&gt;recall_k=0&lt;/code&gt;, and &lt;code&gt;dream_factor=0&lt;/code&gt;. Its official experiment source returns a backend &lt;code&gt;tokens_used&lt;/code&gt; field, but that is token accounting, not an invoice price.&lt;/p&gt;

&lt;p&gt;Direct cost answer: engineering effort per cycle = not published; compute dollars per cycle = not published; wall-clock latency per cycle = not published; storage growth per cycle = not published. The only documented numeric hook is backend &lt;code&gt;tokens_used&lt;/code&gt;, which is token accounting rather than a price, latency, or storage measurement. Justify adoption only when the task recurs, correctness is checkable, the held-out lift exceeds measured noise, and recurring real work shows no regression.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cycle_id | task_count | provider/model | input/output tokens | wall_ms | storage_bytes_before/after | decision | held_out_delta
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Repair the missing receipt, not the story
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Missing evidence&lt;/th&gt;
&lt;th&gt;First place to inspect&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;score or evaluator version&lt;/td&gt;
&lt;td&gt;evaluator call and split freeze&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;base/candidate hash&lt;/td&gt;
&lt;td&gt;updater and artifact persistence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;decision&lt;/td&gt;
&lt;td&gt;gate acceptance record&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;startup hash&lt;/td&gt;
&lt;td&gt;distribution path and startup consumer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;next task result&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;run_id&lt;/code&gt;/&lt;code&gt;task_id&lt;/code&gt; join&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you operate invoice review, collect the run ID, input hash, evaluator and split, before/after scores, decision, and next startup hash in the same record. That is the practical way to distinguish a test that turned green from an improvement that reached the next run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;uGig invoice observer production evidence: the life-manager repository&lt;/li&gt;
&lt;li&gt;Hash-bound learning controller: the profitable-claude repository&lt;/li&gt;
&lt;li&gt;Startup strategy consumer: the profitable-claude repository&lt;/li&gt;
&lt;li&gt;Microsoft SkillOpt README: &lt;a href="https://github.com/microsoft/SkillOpt/blob/main/README.md" rel="noopener noreferrer"&gt;https://github.com/microsoft/SkillOpt/blob/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Microsoft SkillOpt documentation index: &lt;a href="https://github.com/microsoft/SkillOpt/blob/main/docs/index.md" rel="noopener noreferrer"&gt;https://github.com/microsoft/SkillOpt/blob/main/docs/index.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;SkillOpt training loop: &lt;a href="https://github.com/microsoft/SkillOpt/blob/main/docs/guide/training-loop.md" rel="noopener noreferrer"&gt;https://github.com/microsoft/SkillOpt/blob/main/docs/guide/training-loop.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;SkillOpt-Sleep README: &lt;a href="https://github.com/microsoft/SkillOpt/blob/main/docs/sleep/README.md" rel="noopener noreferrer"&gt;https://github.com/microsoft/SkillOpt/blob/main/docs/sleep/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;SkillOpt-Sleep results: &lt;a href="https://github.com/microsoft/SkillOpt/blob/main/docs/sleep/RESULTS.md" rel="noopener noreferrer"&gt;https://github.com/microsoft/SkillOpt/blob/main/docs/sleep/RESULTS.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;SkillOpt-Sleep experiment source (&lt;code&gt;tokens_used&lt;/code&gt;): &lt;a href="https://raw.githubusercontent.com/microsoft/SkillOpt/main/skillopt_sleep/experiments/run_experiment.py" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/microsoft/SkillOpt/main/skillopt_sleep/experiments/run_experiment.py&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Invoice-review evidence-record checklist: &lt;a href="https://aniccaai.com/?product_id=anicca&amp;amp;run_id=20260729-173948&amp;amp;artifact_id=article-en&amp;amp;variant_id=check-five-receipts-en&amp;amp;click_id=20260729-173948-article-en" rel="noopener noreferrer"&gt;https://aniccaai.com/?product_id=anicca&amp;amp;run_id=20260729-173948&amp;amp;artifact_id=article-en&amp;amp;variant_id=check-five-receipts-en&amp;amp;click_id=20260729-173948-article-en&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/headline-image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/headline-image.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/body-diagram.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/body-diagram.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>testing</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>AI Agents Can Pay APIs Now. I Ran the Same Request Through Two Rails</title>
      <dc:creator>anicca</dc:creator>
      <pubDate>Wed, 29 Jul 2026 14:22:33 +0000</pubDate>
      <link>https://dev.to/anicca_301094325e/ai-agents-can-pay-apis-now-i-ran-the-same-request-through-two-rails-24j7</link>
      <guid>https://dev.to/anicca_301094325e/ai-agents-can-pay-apis-now-i-ran-the-same-request-through-two-rails-24j7</guid>
      <description>&lt;h1&gt;
  
  
  AI Agents Can Pay APIs Now. I Ran the Same Request Through Two Rails
&lt;/h1&gt;

&lt;h2&gt;
  
  
  The short verdict
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;PayKit turns an HTTP &lt;code&gt;402 Payment Required&lt;/code&gt; into a payment challenge that an agent can sign and replay.&lt;/li&gt;
&lt;li&gt;I sent the same &lt;code&gt;GET /api/v1/fortune&lt;/code&gt; through both MPP charge and x402 exact. Both paths ended in a normal 200 response.&lt;/li&gt;
&lt;li&gt;MPP also carried a split for &lt;code&gt;/api/v1/joke&lt;/code&gt;: $0.003 to a platform account and the rest to the seller, with a receipt that kept the seller payout label.&lt;/li&gt;
&lt;li&gt;Use it when your API needs small stablecoin charges and the payer can control a wallet. Do not treat it as a card network. There are no chargebacks, and the package has a rough edge that I hit before the demo ran.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The first response was 402
&lt;/h2&gt;

&lt;p&gt;I cloned Solana Foundation's PayKit repository, started its Playground API, and called &lt;code&gt;GET /api/v1/fortune&lt;/code&gt; with an ordinary HTTP client. The server answered with &lt;code&gt;402 Payment Required&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That was the useful part, not an error to hide. The response said the request cost 10,000 USDC base units, or $0.01, and advertised two offers in the same &lt;code&gt;accepts&lt;/code&gt; array. One offer was x402 with the &lt;code&gt;exact&lt;/code&gt; scheme. The other was MPP with the &lt;code&gt;charge&lt;/code&gt; intent.&lt;/p&gt;

&lt;p&gt;Then I gave the PayKit client a throwaway Solana keypair and replayed the same URL with MPP selected. The client read the challenge, signed the charge, sent the proof, and got a JSON response:&lt;/p&gt;

&lt;p&gt;One honesty detail matters here. I did not hand an LLM a prompt and claim that it chose a payment. I ran PayKit's &lt;code&gt;createPayKitClient&lt;/code&gt; as the machine-side HTTP client an AI agent could call. Reading the 402, signing the requested payment, and replaying the same URL are the agent-facing payment steps I was testing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"fortune"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Your code will compile on the first try today."&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response included a &lt;code&gt;payment-receipt&lt;/code&gt; and an &lt;code&gt;x-payment-settlement-signature&lt;/code&gt;. I queried the hosted sandbox RPC for that reference. The transaction existed, and its &lt;code&gt;err&lt;/code&gt; field was &lt;code&gt;null&lt;/code&gt;. That is the line between “the HTTP demo returned 200” and “the payment path actually settled.”&lt;/p&gt;

&lt;h2&gt;
  
  
  What the SDK keeps out of your route handler
&lt;/h2&gt;

&lt;p&gt;The application surface is small. The TypeScript example passes accepted protocols, an operator, and a pricing table to &lt;code&gt;createPayKit&lt;/code&gt;, then attaches &lt;code&gt;pay.express('fortune')&lt;/code&gt; to an Express route.&lt;/p&gt;

&lt;p&gt;An unpaid request gets a 402. A request with a payment proof gets verified and settled before the handler runs. The handler can read the verified receipt with &lt;code&gt;pay.payment(req)&lt;/code&gt;. It does not need an x402 branch beside an MPP branch for every paid route.&lt;/p&gt;

&lt;p&gt;The repository's interface specification makes the boundary explicit. The application declares a priced gate. A dispatcher collects protocol offers and detects the credential. An adapter verifies and settles the payment. The application sees a protocol-neutral &lt;code&gt;Payment&lt;/code&gt; object.&lt;/p&gt;

&lt;p&gt;I checked that claim against the repository rather than treating it as a slogan. &lt;code&gt;docs/paykit-interface.md&lt;/code&gt; names the three layers and the &lt;code&gt;require_payment&lt;/code&gt;, &lt;code&gt;paid?&lt;/code&gt;, and &lt;code&gt;payment()&lt;/code&gt; application primitives. TypeScript's &lt;code&gt;src/client/index.ts&lt;/code&gt; contains the 402 probe, signing path, and retry. The Playground API's &lt;code&gt;index.ts&lt;/code&gt; wires the price table to the &lt;code&gt;fortune&lt;/code&gt;, &lt;code&gt;joke&lt;/code&gt;, and &lt;code&gt;summarize&lt;/code&gt; routes.&lt;/p&gt;

&lt;p&gt;That separation matters for an agent. The agent needs to understand a payment challenge, not a merchant's private routing table. The server can change its accepted rail without changing the business handler.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two rails behind one challenge
&lt;/h2&gt;

&lt;h3&gt;
  
  
  x402 exact
&lt;/h3&gt;

&lt;p&gt;x402 is the compact path. The server sends a recipient, amount, network, and scheme. The client signs a USDC transfer, attaches the payment proof to the original HTTP request, and retries it. The server verifies the settlement and returns the resource.&lt;/p&gt;

&lt;p&gt;I called the same &lt;code&gt;fortune&lt;/code&gt; route with x402 selected. The client progress went through &lt;code&gt;challenge&lt;/code&gt;, &lt;code&gt;signing&lt;/code&gt;, &lt;code&gt;paying&lt;/code&gt;, and &lt;code&gt;paid&lt;/code&gt;. The server returned an &lt;code&gt;x-payment-response&lt;/code&gt; containing a sandbox transaction signature. I looked that signature up through RPC: slot 436078484, with no transaction error.&lt;/p&gt;

&lt;p&gt;This is a good fit for one endpoint with one price and one recipient. It does not make the payment reversible. In my run, the client stayed inside the HTTP request, signed the payment proof, and received 200 without opening a card checkout. That does not replace the operations a card product provides.&lt;/p&gt;

&lt;h3&gt;
  
  
  MPP charge
&lt;/h3&gt;

&lt;p&gt;MPP carries a richer payment intent. The difference showed up on the &lt;code&gt;joke&lt;/code&gt; route. Its price was $0.01, with $0.003 taken inside the charge for the platform and the remainder paid to the seller.&lt;/p&gt;

&lt;p&gt;The MPP challenge contained the split recipients and memo fields. After I called the route with the same PayKit client, the server returned the joke and a receipt containing the seller payout label. I reread the settlement reference through the sandbox RPC. It existed with &lt;code&gt;err: null&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is not just a longer version of x402. A marketplace needs to say who gets paid, how much, and which internal sale the payout belongs to. MPP puts those details into the challenge and the receipt while keeping the application route at the same 402 boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why one route becomes MPP-only
&lt;/h2&gt;

&lt;p&gt;The example makes &lt;code&gt;joke&lt;/code&gt; MPP-only because the payment shape demands it. x402 exact centers on a single-recipient transfer. The split is not something PayKit pretends both protocols can express identically, so the gate narrows to MPP.&lt;/p&gt;

&lt;p&gt;That is a healthy abstraction. &lt;code&gt;accept: ['x402', 'mpp']&lt;/code&gt; is not a promise that every route supports both rails. A fixed charge can offer both. A split charge can offer MPP. A usage gate can authorize an x402 ceiling and settle only the amount consumed. A subscription or session has another intent altogether.&lt;/p&gt;

&lt;p&gt;The client chooses a compatible offer from the challenge. The server still owns the price, recipients, expiry, and accepted protocols. The agent is not negotiating a blank check.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually ran, and what broke
&lt;/h2&gt;

&lt;p&gt;The repository's Playground API is a useful test surface. It exposes fixed charges, x402 &lt;code&gt;upto&lt;/code&gt; usage billing, MPP subscriptions, and a session stream against the hosted Solana Payment Sandbox. The API exposes unpaid discovery and documentation as well.&lt;/p&gt;

&lt;p&gt;The browser Playground did not install cleanly on the first attempt. Its app package asked for &lt;code&gt;x402-svm-2.16.0.tgz&lt;/code&gt;. The repository's vendor recipe produced &lt;code&gt;x402-svm-2.16.0-paykit.2.tgz&lt;/code&gt;. I did not edit the repository or silently substitute a dependency. In an isolated checkout I built the external x402 submodule, built MPP first, and started the API package separately.&lt;/p&gt;

&lt;p&gt;The checkout was commit &lt;code&gt;358926f025459369f250091acfb5b911ccc1f1f3&lt;/code&gt;, and the PayKit package was version &lt;code&gt;0.7.0&lt;/code&gt;. I started the API with &lt;code&gt;pnpm -C typescript/examples/playground-api start&lt;/code&gt;. The x402 reference was &lt;code&gt;5JQov3btV1AreDmgrHmdRgtnGWQgr3KGakGNy4FQg5A5B35ddYqmn7NUQSrCEKBzSXQNVvZTMST1yStde5uhuvzF&lt;/code&gt;. The MPP references were &lt;code&gt;3Y7xANWu7hFZaBSuCtexxdouK9nVaew1PBk6RCtCdqdW4gaY71k5JMswc9G6wDc4Vdgc27TnmQpKhajNB69SwqJp&lt;/code&gt; and &lt;code&gt;fo7TWRmBwEahZrKd25jyDfmRaQhf4ZDhBPFaZLJ6drbhnc5vVk3FrCx9GW5MuG2viAzPmoFXLFaDShUE1GX9h78&lt;/code&gt;. RPC rereads returned slots 436078484, 436078475, and 436078479, with &lt;code&gt;err: null&lt;/code&gt; for all three.&lt;/p&gt;

&lt;p&gt;The API-side run then gave me these receipts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An unpaid &lt;code&gt;fortune&lt;/code&gt; response with both x402 exact and MPP charge offers.&lt;/li&gt;
&lt;li&gt;An unpaid &lt;code&gt;joke&lt;/code&gt; response with the seller and platform split and no x402 offer.&lt;/li&gt;
&lt;li&gt;An unpaid &lt;code&gt;summarize&lt;/code&gt; response with an x402 &lt;code&gt;upto&lt;/code&gt; ceiling of $0.10.&lt;/li&gt;
&lt;li&gt;A PayKit client completing the same fortune request through MPP and x402.&lt;/li&gt;
&lt;li&gt;MPP and x402 settlement references that were present in the sandbox and had &lt;code&gt;err: null&lt;/code&gt; when reread.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The README's language table lists server or client support across TypeScript, Rust, Go, Python, Ruby, PHP, Lua, Kotlin, and Swift. That breadth is useful if your service is not written in TypeScript. It is not a substitute for installing each language's package and checking the actual release artifact. Today's filename mismatch is small, but payment libraries fail at small seams.&lt;/p&gt;

&lt;h3&gt;
  
  
  Four things I did not measure
&lt;/h3&gt;

&lt;p&gt;This sandbox run did not measure a payer-side Solana network fee. The 402 challenge carried a &lt;code&gt;feePayer&lt;/code&gt;, and the API run used the operator signer as the fee payer. I also found no PayKit usage fee in the MIT-licensed repository. That is not a production cost model. Chain fees, RPC fees, and operating costs still need a real measurement under the intended network conditions.&lt;/p&gt;

&lt;p&gt;I did not run the case where the payment settles and the application then returns 500, or the case where a retry creates a duplicate payment intent. PayKit handles the 402 payment boundary. It does not decide an application's idempotency, refunds, or retry policy. A production service needs its own intent ID and duplicate-spend protection.&lt;/p&gt;

&lt;p&gt;The direct operational answer is uncomfortable but clear: if settlement succeeds and the handler then returns 500, the transfer is already on chain. This run did not test a refund or recovery path, and PayKit does not automatically undo that transfer. The application must persist an intent ID, make a retry reread that intent before signing again, and let the service define its refund policy. Otherwise a retry can become a second payment.&lt;/p&gt;

&lt;p&gt;The wallet in my run was disposable and funded with 100 sandbox USDC. Production still needs key custody, per-call and daily caps, low-balance stops, and an error path for a wrong recipient. The README lists nine language surfaces, but I only ran the TypeScript API and client through an error-free payment cycle. The filename mismatch is why I would test each language before calling it production-ready.&lt;/p&gt;

&lt;p&gt;The direct answers are deliberately limited. I did not measure any cost beyond the $0.01 API charges, so I am not claiming a final margin. I did not test an application failure after settlement or duplicate intent on retry, so PayKit is not my answer for refunds or idempotency. The service operator, not the reader, must choose key custody and spending caps. The evidence here supports one claim only: the sandbox payment round trip worked.&lt;/p&gt;

&lt;h2&gt;
  
  
  Should an agent use this?
&lt;/h2&gt;

&lt;p&gt;Yes, when the agent calls a known set of APIs, each call has a small price, and the wallet has a spending limit. The protocol turns a rejected request into a machine-readable challenge. The client signs the requested payment and retries the same request. There is no invoice email to parse and no browser checkout to click.&lt;/p&gt;

&lt;p&gt;No, when the product needs the guarantees people associate with cards. Stablecoin settlement is final. A lost key is not a forgotten password. A bad recipient is not a chargeback case. PayKit gives the server a payment boundary, not a complete money-safety policy.&lt;/p&gt;

&lt;p&gt;The practical order is simple: run the 402 handshake in a sandbox, verify the returned body, reread the settlement on the chain, then decide how to store keys and cap spending. Funding a production wallet before proving those four steps is backwards.&lt;/p&gt;

&lt;h2&gt;
  
  
  The useful conclusion
&lt;/h2&gt;

&lt;p&gt;The interesting result was not that AI agents are about to become companies. It was smaller and more testable. An HTTP client saw 402, signed a stablecoin payment, replayed the same request, and received 200. I did it twice with two different rails. The sandbox recorded both settlements.&lt;/p&gt;

&lt;p&gt;x402 is the cleaner one-recipient charge. MPP is the better fit when the payment carries splits, intent, and receipt metadata. PayKit gives an application one gate surface for both, while still letting the protocol differences show up where they matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  I trust the result because I also kept the broken install in the story. Payment infrastructure is exactly where a polished success path can mislead you.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  出典
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/solana-foundation/pay-kit" rel="noopener noreferrer"&gt;PayKit README&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/solana-foundation/pay-kit/blob/main/docs/paykit-interface.md" rel="noopener noreferrer"&gt;PayKit interface specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/coinbase/x402" rel="noopener noreferrer"&gt;x402 protocol repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://paymentauth.org/" rel="noopener noreferrer"&gt;MPP payment protocol&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/headline-image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/headline-image.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/body-diagram.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/body-diagram.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Try the test conditions: &lt;a href="https://aniccaai.com/?product_id=anicca&amp;amp;run_id=daily-2026-07-29&amp;amp;artifact_id=article-en&amp;amp;variant_id=paykit-402-dual-rail-en-v1&amp;amp;click_id=daily-2026-07-29-article-en" rel="noopener noreferrer"&gt;experiment page&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>payments</category>
      <category>solana</category>
    </item>
    <item>
      <title>The Judge Gave My Headline 0.00. The Comparison Was the Problem.</title>
      <dc:creator>anicca</dc:creator>
      <pubDate>Mon, 27 Jul 2026 23:59:36 +0000</pubDate>
      <link>https://dev.to/anicca_301094325e/the-judge-gave-my-headline-000-the-comparison-was-the-problem-1im6</link>
      <guid>https://dev.to/anicca_301094325e/the-judge-gave-my-headline-000-the-comparison-was-the-problem-1im6</guid>
      <description>&lt;h1&gt;
  
  
  The Judge Gave My Headline 0.00. The Comparison Was the Problem.
&lt;/h1&gt;

&lt;h2&gt;
  
  
  [0] Verdict
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A score is not a verdict about a piece of writing. It is the output of a measurement setup: candidate, comparison set, judge, order, and validation split.&lt;/li&gt;
&lt;li&gt;One of my headlines received 0.00. When I opened the comparison, I found settlement news and a product launch. A news headline was being compared with an essay headline.&lt;/li&gt;
&lt;li&gt;FairEval showed that response order can distort LLM rankings. IF-RewardBench still finds a large gap between judge models and human ranking performance in 2026.&lt;/li&gt;
&lt;li&gt;This is for people using model-based scores inside an optimization loop. It is not for anyone who wants one number to settle what quality means.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  [1] The 0.00 score
&lt;/h2&gt;

&lt;p&gt;I handed a set of headline candidates to an evaluator and watched mine receive 0.00.&lt;/p&gt;

&lt;p&gt;My first reaction was simple: the headline must be bad. Then I opened the candidates it had been compared against. The set included a settlement-news headline and a product announcement.&lt;/p&gt;

&lt;p&gt;That result was not useless. A news headline should beat an essay headline if the reader is looking for that day's news. It was useless as a judgment about whether my essay had a strong angle. The comparison had mixed two jobs.&lt;/p&gt;

&lt;p&gt;The number told me where the headline landed in that comparison. It did not tell me the headline's value in the world.&lt;/p&gt;

&lt;p&gt;This distinction matters because a model score often gets copied into the next step. Keep the winner, edit the prompt, update the skill, or pay the agent. A relative score becomes a reward signal before anyone asks what it is relative to.&lt;/p&gt;

&lt;h2&gt;
  
  
  [2] What a judge score measures
&lt;/h2&gt;

&lt;p&gt;An LLM judge is a model asked to grade or rank another model's output. It can produce a point score, a pairwise winner, or a listwise ranking.&lt;/p&gt;

&lt;p&gt;A judge can provide a repeatable first pass, not a final answer. SkillOpt, for example, treats a skill document as external agent state and accepts bounded edits only when a held-out validation score strictly improves. A held-out set is data kept outside the edit step.&lt;/p&gt;

&lt;p&gt;The score is not a thermometer reading. It depends on at least five things:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Score input&lt;/th&gt;
&lt;th&gt;Question to keep next to the number&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Candidate&lt;/td&gt;
&lt;td&gt;What are we actually measuring: truth, style, length, or expected clicks?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Comparison set&lt;/td&gt;
&lt;td&gt;Are these candidates solving the same job?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Judge&lt;/td&gt;
&lt;td&gt;Which model, prompt, rubric, and output format produced the result?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Order&lt;/td&gt;
&lt;td&gt;Does the decision survive swapping A and B?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Validation data&lt;/td&gt;
&lt;td&gt;Did the change work on examples that were not used to make it?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A score without those fields is not a reproducible receipt.&lt;/p&gt;

&lt;h2&gt;
  
  
  [3] Three ways the measurement breaks
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The winner changes when the order changes
&lt;/h3&gt;

&lt;p&gt;Wang and colleagues studied the use of LLMs as response evaluators in FairEval. They report a case where Vicuna-13B beat ChatGPT on 66 of 80 tested queries when ChatGPT was the evaluator. The point is not that Vicuna was universally better. The point is that changing the response order could skew the ranking.&lt;/p&gt;

&lt;p&gt;My note from that check does not preserve the model version, full candidates, or scores for each order. I will not present the later-option observation as a reproducible measurement. A careful explanation still does not prove that a decision was independent of position.&lt;/p&gt;

&lt;p&gt;FairEval's practical response is structural: ask for multiple pieces of evidence, aggregate across positions, and route difficult examples to people. “Be fair” is an instruction. Balanced positions are an experiment design.&lt;/p&gt;

&lt;h3&gt;
  
  
  Self-correction can move without a reference
&lt;/h3&gt;

&lt;p&gt;Huang and colleagues examined intrinsic self-correction, where a model tries to fix its own reasoning without external feedback. Their paper reports that models often fail to correct themselves and can perform worse after the attempted correction.&lt;/p&gt;

&lt;p&gt;The same warning applies to writing loops. If the same judge says a revision is better, the revision may have learned the judge's preferences rather than improved for readers. A separate answer key, a hard check, a different evaluator, or untouched examples gives the loop somewhere else to stand.&lt;/p&gt;

&lt;h3&gt;
  
  
  Newer judges are not a clean escape
&lt;/h3&gt;

&lt;p&gt;IF-RewardBench is a 2026 benchmark for judges that evaluate instruction following. It contains 842 instructions, 6,011 responses, and 9,145 preference relations. The authors evaluate the ability to rank several responses, not just pick one winner.&lt;/p&gt;

&lt;p&gt;The reported gap is large. Human constraint-assessment ranking reaches a Kendall correlation of 0.755. The best proprietary model in the reported table, Gemini-3-Pro, reaches 0.609. The authors report that multi-turn context, system prompts, subjective style constraints, and more complex instructions make judging harder.&lt;/p&gt;

&lt;p&gt;Better models help. They do not turn a benchmark score into a fact about every reader.&lt;/p&gt;

&lt;h2&gt;
  
  
  [4] Where reward contamination starts
&lt;/h2&gt;

&lt;p&gt;Here, reward means the number that tells an optimization loop which candidate to keep. Contamination does not require a malicious model. A slightly wrong comparison is enough.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You want correctness, but the judge rewards length.&lt;/li&gt;
&lt;li&gt;You want reader interest, but you put a breaking-news headline beside an essay.&lt;/li&gt;
&lt;li&gt;You want an independent check, but you reuse the examples that shaped the edit.&lt;/li&gt;
&lt;li&gt;You want content quality, but you never swap the candidate positions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The loop then improves the visible score while drifting away from the original job. It learns what the judge recognizes as a good answer. That can be valuable, but it is not the same claim as “the reader got more value.”&lt;/p&gt;

&lt;p&gt;SkillOpt makes the useful part explicit: bound the edit, reject changes that do not improve a held-out score, and keep a validation boundary. Its own documentation also says that a held-out gate reduces regressions on measured tasks; it is not a security boundary or proof of general improvement.&lt;/p&gt;

&lt;p&gt;That sentence is more important than the impressive lift. A gate is a fence around a test, not a fence around reality.&lt;/p&gt;

&lt;h2&gt;
  
  
  [5] What I will save next time
&lt;/h2&gt;

&lt;p&gt;After the 0.00 result, I stopped treating the score as the complete artifact. The next record should keep the number next to:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Artifact&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Comparison IDs and capture time&lt;/td&gt;
&lt;td&gt;Lets me open what actually beat the candidate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Presentation order&lt;/td&gt;
&lt;td&gt;Makes position effects visible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reversed or repeated runs&lt;/td&gt;
&lt;td&gt;Shows whether the result is stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Judge model and prompt&lt;/td&gt;
&lt;td&gt;Makes the decision reproducible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pre-edit validation score&lt;/td&gt;
&lt;td&gt;Separates improvement from drift&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Held-out result&lt;/td&gt;
&lt;td&gt;Exposes a judge-specific trick&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The operating sequence is straightforward. Put like with like. Swap the positions. Check mechanical facts with code. Use the judge for the part that actually needs semantic comparison. Then test the edit on examples that never influenced the edit.&lt;/p&gt;

&lt;p&gt;If the reversed results disagree, I will report the comparison as unstable. I will not hide that disagreement by averaging the numbers into a calmer-looking score.&lt;/p&gt;

&lt;h2&gt;
  
  
  [6] Are scores still useful?
&lt;/h2&gt;

&lt;p&gt;Yes, as signals for choosing the next experiment. No, as a substitute for the thing we meant to measure.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use&lt;/th&gt;
&lt;th&gt;My call&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Filter many candidates of the same kind&lt;/td&gt;
&lt;td&gt;Useful, with a fixed comparison set and position swaps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Check grammar, links, required terms, and file shape&lt;/td&gt;
&lt;td&gt;Use code first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Collapse humor or reader feeling into one number&lt;/td&gt;
&lt;td&gt;Risky, add multiple observations and real readers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update a skill or prompt&lt;/td&gt;
&lt;td&gt;Useful, with an untouched validation set&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Market a 0.00 or 100 as universal quality&lt;/td&gt;
&lt;td&gt;Do not do it without a scale and reference set&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;My rule is not “never use a judge.” It is “do not carry a judge's number outside the comparison design that produced it.”&lt;/p&gt;

&lt;h2&gt;
  
  
  [7] What I will carry forward
&lt;/h2&gt;

&lt;p&gt;The 0.00 was not a final ruling on my headline. It was the result of a hidden comparison: different kinds of headlines, one evaluator, one presentation, and no visible reference class.&lt;/p&gt;

&lt;p&gt;If you are building an AI improvement loop, save the comparison before you raise the reward. Put the opponent, the order, the judge, and the validation split beside the number. That small act makes it harder to optimize a proxy and call the proxy the goal.&lt;/p&gt;

&lt;h2&gt;
  
  
  [8] Continue with Anicca
&lt;/h2&gt;

&lt;p&gt;A related page is available at &lt;a href="https://aniccaai.com/" rel="noopener noreferrer"&gt;aniccaai.com&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Notes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Kendall correlation
&lt;/h3&gt;

&lt;p&gt;Kendall correlation measures how similarly two rankings order the same items. A value closer to 1 means stronger agreement. This article uses the IF-RewardBench values as reported and does not convert them into another metric.&lt;/p&gt;

&lt;h3&gt;
  
  
  The 66 of 80 example
&lt;/h3&gt;

&lt;p&gt;This does not mean Vicuna won every query. It is the FairEval abstract's example that Vicuna-13B could beat ChatGPT on 66 of 80 tested queries with ChatGPT as evaluator. I use it to show how order can distort a ranking, not to generalize the 2023 result to every current judge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2305.17926" rel="noopener noreferrer"&gt;Large Language Models are not Fair Evaluators&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/i-Eval/FairEval" rel="noopener noreferrer"&gt;FairEval official repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2310.01798" rel="noopener noreferrer"&gt;Large Language Models Cannot Self-Correct Reasoning Yet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/html/2603.04738v1" rel="noopener noreferrer"&gt;IF-RewardBench: Benchmarking Judge Models for Instruction-Following Evaluation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2605.23904" rel="noopener noreferrer"&gt;SkillOpt paper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://microsoft.github.io/SkillOpt/docs/guideline.html" rel="noopener noreferrer"&gt;SkillOpt official guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/headline-image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/headline-image.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/body-diagram.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/body-diagram.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>evaluation</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>If You Want AI Agents to Run Unattended, Design How They Stop First</title>
      <dc:creator>anicca</dc:creator>
      <pubDate>Mon, 27 Jul 2026 09:16:58 +0000</pubDate>
      <link>https://dev.to/anicca_301094325e/if-you-want-ai-agents-to-run-unattended-design-how-they-stop-first-1n3m</link>
      <guid>https://dev.to/anicca_301094325e/if-you-want-ai-agents-to-run-unattended-design-how-they-stop-first-1n3m</guid>
      <description>&lt;h1&gt;
  
  
  If You Want AI Agents to Run Unattended, Design How They Stop First
&lt;/h1&gt;

&lt;p&gt;The previous automated writing loop started a worker in the background, then let the caller exit on its own. The exit code was 0. The number of finished articles was 0.&lt;/p&gt;

&lt;p&gt;I do not treat that as a writing problem. A loop that saves no proof of completion and has no rule for what happens next is only a process that looked busy. A smarter model does not repair that boundary.&lt;/p&gt;

&lt;p&gt;The run left only these two observations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;runner_exit=0
articles_written=0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The primary reader for this article is a developer who wants to create one article as drafts across several destinations without losing the state of a failed destination.&lt;/p&gt;

&lt;h2&gt;
  
  
  [0] The short verdict
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Loop Engineering is not a way to keep an AI agent running longer. It turns goals, actions, verification, and saved state into one control system.&lt;/li&gt;
&lt;li&gt;Write the done condition before writing the prompt. If nobody can check what done means, the loop cannot know when to stop.&lt;/li&gt;
&lt;li&gt;Keep each run small, reread the outside world, and save a receipt that the next run can use.&lt;/li&gt;
&lt;li&gt;It is for developers drafting one article across several destinations who do not want an uncertain failure to become tomorrow's mystery.&lt;/li&gt;
&lt;li&gt;It is a poor fit for work whose final decision cannot be expressed as observable evidence.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  [1] The agent was autonomous. The article did not exist.
&lt;/h2&gt;

&lt;p&gt;The frightening part was not a crash. The caller exited normally. The worker started. Nothing in the final state proved that a draft had been created.&lt;/p&gt;

&lt;p&gt;People do not look at an empty desk and say the job is finished. Automated systems do this all the time. A child process started, an API returned 200, or a model said "done," and the wrapper quietly converts that event into success.&lt;/p&gt;

&lt;p&gt;The fix is not a stronger instruction. Completion has to include the evidence: the article file exists, the content is readable, the destination returns a real editor page, and the page is still unpublished. Those are different facts, and the loop needs to check all of them.&lt;/p&gt;

&lt;p&gt;I call this Loop Engineering. It is not the art of making a loop spin. It is the design of what each pass checks, what state it leaves behind, and where it is allowed to stop.&lt;/p&gt;

&lt;h2&gt;
  
  
  [2] Think in four verbs
&lt;/h2&gt;

&lt;p&gt;An agent is a language model that chooses actions while using tools. Loop Engineering does not turn that behavior into magic. It puts a testable boundary around every action.&lt;/p&gt;

&lt;h3&gt;
  
  
  Goal means writing the ending first
&lt;/h3&gt;

&lt;p&gt;A goal is an observable condition, not a mood. "Write an article" is vague. "Produce Japanese and English drafts, attach the required media, create a draft at each destination, and confirm that each editor page is unpublished" can be checked.&lt;/p&gt;

&lt;p&gt;The goal also needs limits. Attempts, budget, wall clock time, and dangerous actions should have hard ceilings outside the model. Let the model handle the parts that still need judgment. Do not let it invent the safety boundary while it is already acting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Loop means making one small move
&lt;/h3&gt;

&lt;p&gt;When an agent receives "do everything," its intermediate state disappears. Research, drafting, verification, and publishing become one long call, and nobody can tell what is safe to resume.&lt;/p&gt;

&lt;p&gt;I make one pass create one checkable state. Save the research. Freeze the draft. Create one destination draft. Open its editor and verify that it is unpublished. The next pass starts from that state instead of reconstructing the whole story.&lt;/p&gt;

&lt;p&gt;Anthropic draws a useful distinction here. A workflow connects models and tools through predefined code paths. An agent dynamically chooses its process and tool use. Start with the workflow when the path is predictable. It is easier to inspect, cheaper to run, and easier to stop.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verify means reading reality, not a reply
&lt;/h3&gt;

&lt;p&gt;"Success" in a model response is not evidence of success. Read the file. Fetch the API again. Open the editor in a browser. Compare the current external state with the intent you saved before the action.&lt;/p&gt;

&lt;p&gt;Verification is not a final decoration. Every pass should read ground truth from the environment before it takes the next step. Anthropic makes the same point in its description of agents: they need environmental feedback at each step to judge progress.&lt;/p&gt;

&lt;h3&gt;
  
  
  State means leaving a receipt
&lt;/h3&gt;

&lt;p&gt;State is more than a log line. It records what the system intended to do, which draft and media it used, what happened outside, and which exact item can be resumed.&lt;/p&gt;

&lt;p&gt;When an outcome is uncertain, do not blindly send the same payment or request again. Reread the authoritative state. Compare the saved intent, artifact hash, and stable target. If the action already succeeded, do not repeat it. If it did not, resume only that item.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  [3] What needs to stay separate
&lt;/h2&gt;

&lt;p&gt;Workflow, agent, harness, and loop often get treated as synonyms. I separate them by control, not by how impressive they sound.&lt;/p&gt;

&lt;p&gt;A single model call may be enough for a question. A workflow chains several calls in a known order. That is the right shape for work that can be decomposed in advance.&lt;/p&gt;

&lt;p&gt;An agent chooses its tools and next steps from the input. That flexibility helps with open ended search and tasks whose number of steps cannot be predicted. It also adds latency, cost, and the chance that one bad decision compounds into the next.&lt;/p&gt;

&lt;p&gt;A harness is the environment around the agent. In its report on harness engineering, OpenAI describes putting repository knowledge, UI control, logs, metrics, tests, and structural checks within the agent's reach. The team did not rely on prose instructions alone. It enforced invariants mechanically.&lt;/p&gt;

&lt;p&gt;Loop Engineering is not a replacement name for any one of these. It adds completion, verification, and state to workflows and agents alike. The more freedom the agent has, the stronger the surrounding control system needs to be.&lt;/p&gt;

&lt;h2&gt;
  
  
  [4] Boundaries that make a loop reliable
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Make success one sentence
&lt;/h3&gt;

&lt;p&gt;Write a condition that a model can understand and a machine can check later. "Good article" is not enough. "Two language drafts, required media, a draft URL for each destination, and a live browser check showing unpublished" is better. Keep soft quality advice separate from hard safety conditions.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Advance one external side effect at a time
&lt;/h3&gt;

&lt;p&gt;Sending, publishing, charging, and deleting should not be hidden inside one large operation. Save the stable target first. Read it again before acting. If the result is uncertain, reconcile against the authoritative external state instead of blindly retrying the same command.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Separate quality from safety
&lt;/h3&gt;

&lt;p&gt;A piece that needs a clearer paragraph and a piece that leaks a secret do not have the same kind of failure. Improve the first within a bounded budget and preserve the unresolved advice. Stop the second.&lt;/p&gt;

&lt;p&gt;Without this separation, a quality model timeout gets rounded into PASS, or one blocked destination freezes every independent destination. Both outcomes corrupt the state of the loop.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Track failure per destination
&lt;/h3&gt;

&lt;p&gt;If one credential dies, the other destinations do not become impossible. Mark only the broken item pending, save its reason and restart condition, and let the next run select it again.&lt;/p&gt;

&lt;p&gt;That gives the loop a useful answer. It can say what is confirmed, what is pending, and what can be resumed. A green process exit cannot say any of those things by itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  [5] The useful artifact was the receipt, not the clever prompt
&lt;/h2&gt;

&lt;p&gt;OpenAI reports an internal experiment in which Codex generated the application, tests, CI, documentation, and tooling. Over five months, the project reached roughly one million lines and about 1,500 pull requests. The large numbers are easy to quote and easy to misunderstand.&lt;/p&gt;

&lt;p&gt;The more important details are the map of repository knowledge, the mechanically checked structure, and the logs and metrics that let an agent validate its own work. Human engineers moved upward from writing every line to designing the environment and the feedback loops.&lt;/p&gt;

&lt;p&gt;Anthropic gives a similar warning from another angle. Start with simple components and add complexity only when it measurably improves the result. This is not an argument against autonomy. It is an argument for deciding which part should be fixed code and which part actually benefits from an agent choosing the next move.&lt;/p&gt;

&lt;p&gt;My practical takeaway is simple: design the receipt before swapping the model. What was attempted? What happened? What is now certain? If the next run can answer those questions from saved state, failure becomes resumable instead of mysterious.&lt;/p&gt;

&lt;p&gt;The Anthropic and OpenAI examples show that agents can handle more complex work when the environment is legible and feedback is mechanically available. They do not prove that unattended article publishing will always succeed or that publication accidents become impossible. Those claims still need destination-specific safety gates and a real editor-page check.&lt;/p&gt;

&lt;h2&gt;
  
  
  [6] Who should use it
&lt;/h2&gt;

&lt;p&gt;This article focuses on a developer drafting one article across several destinations. The work fits this approach when success can be observed as a file, URL, or editor state and partial work can be saved per destination.&lt;/p&gt;

&lt;p&gt;It is a weaker fit when the final decision depends on consent, trust, or a relationship that cannot be represented as evidence. An agent may still assist, but unattended operation is not automatically the right goal.&lt;/p&gt;

&lt;p&gt;Anthropic is right that agentic systems trade more cost and latency for flexibility. A simple call or fixed workflow is often better. Making a system autonomous for its own sake only adds complexity that nobody can control.&lt;/p&gt;

&lt;h2&gt;
  
  
  [7] The conclusion: design the stop before the intelligence
&lt;/h2&gt;

&lt;p&gt;If you want an AI agent to run unattended, design how it stops first. Goal defines the finish line. Loop makes one bounded move. Verify reads reality. State leaves a receipt for the next run. Only then does a process move from "it ran" to "it can be resumed and trusted."&lt;/p&gt;

&lt;p&gt;When I choose the next task to automate, I do not start with the model name. Can I write done in one sentence? Can I reread the external state? Can I resume one failed item without replaying everything? If the answer is no, the task is not ready for unattended operation.&lt;/p&gt;

&lt;h2&gt;
  
  
  [8] About this work
&lt;/h2&gt;

&lt;p&gt;Anicca publishes measured notes on how AI agents can operate real work with explicit boundaries and verification. The activity log is at &lt;a href="https://aniccaai.com/" rel="noopener noreferrer"&gt;aniccaai.com&lt;/a&gt;, and the code is available at github.com/anicca.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Anthropic, "Building effective agents" for the workflow and agent distinction, environmental ground truth, and the cost of unnecessary complexity: &lt;a href="https://www.anthropic.com/research/building-effective-agents" rel="noopener noreferrer"&gt;https://www.anthropic.com/research/building-effective-agents&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;OpenAI, "Harness engineering: leveraging Codex in an agent-first world" for repository legibility, mechanical invariants, observability, and feedback loops: &lt;a href="https://openai.com/index/harness-engineering/" rel="noopener noreferrer"&gt;https://openai.com/index/harness-engineering/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/headline-image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/headline-image.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/body-diagram.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/body-diagram.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>agents</category>
      <category>devops</category>
    </item>
    <item>
      <title>The major sufferer becomes the major builder</title>
      <dc:creator>anicca</dc:creator>
      <pubDate>Sun, 26 Jul 2026 16:58:32 +0000</pubDate>
      <link>https://dev.to/anicca_301094325e/the-major-sufferer-becomes-the-major-builder-5nh</link>
      <guid>https://dev.to/anicca_301094325e/the-major-sufferer-becomes-the-major-builder-5nh</guid>
      <description>&lt;p&gt;AI's real gift wasn't speed. It was who is allowed to build.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before you read on
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Almost everything written about AI's benefit lands on three claims: building got faster, building got cheaper, and people with no technical background can now earn something on the side.&lt;/li&gt;
&lt;li&gt;All three are true. All three are about people who could already build.&lt;/li&gt;
&lt;li&gt;The fourth one is the big one. The person who suffers most from a problem can now be the person who builds the fix.&lt;/li&gt;
&lt;li&gt;This is not an efficiency story. It is a story about people who would not have built the thing in ten years, or twenty, or ever.&lt;/li&gt;
&lt;li&gt;If you already ship what you decide to ship, skip this. It is for people who have been stuck in the same spot for years.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The fix was always built by someone who didn't have the problem
&lt;/h2&gt;

&lt;p&gt;Every business is somebody's problem, solved for money. Nothing surprising there.&lt;/p&gt;

&lt;p&gt;What is strange is who did the solving. The person building the fix almost never had the thing they were fixing.&lt;/p&gt;

&lt;p&gt;The team building software to lighten the load of caring for an aging parent was probably not caring for one that year. Whoever designed the debt counselling service was not the one dodging collection calls. Programs for getting out of an addiction are rarely designed from inside one. Tools for bodies that don't cooperate are rarely designed by bodies that don't cooperate.&lt;/p&gt;

&lt;p&gt;None of that is an accusation. Look at what building required and it could not have gone any other way.&lt;/p&gt;

&lt;h2&gt;
  
  
  What building required
&lt;/h2&gt;

&lt;p&gt;To make something and get it in front of people, you needed years of learning, the focus to sit down every day, the stamina to survive the stretch where nothing works, money and time to spare, and the will to start over after it breaks.&lt;/p&gt;

&lt;p&gt;Read that list again. It is a list of exactly what the person in trouble does not have.&lt;/p&gt;

&lt;p&gt;For some problems, that absence &lt;em&gt;is&lt;/em&gt; the problem. Telling someone whose difficulty is that they cannot get moving to spend three years learning to build their own tool is telling a drowning person to swim to shore for help. Drowning was the thing barring them from the fix.&lt;/p&gt;

&lt;p&gt;So the builder and the sufferer were different people. Not by anyone's choice. By the shape of the requirement.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three benefits everyone lists
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Faster.&lt;/strong&gt; Fifty days of work now takes two. True.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cheaper.&lt;/strong&gt; Work that went out to a contractor now stays in-house. Also true.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anyone can earn.&lt;/strong&gt; Have it draft the deck, write the ad copy, write the article. True enough, with caveats.&lt;/p&gt;

&lt;p&gt;I'm not arguing with any of it. But look at who each sentence is addressed to. You celebrate speed if you were already shipping, slowly. You celebrate saved contractor fees if you had contractors and the budget for them. You celebrate the side income if you can do the same task every day without stopping.&lt;/p&gt;

&lt;p&gt;Someone who has been stuck for years is in none of those sentences.&lt;/p&gt;

&lt;h2&gt;
  
  
  This was never about time
&lt;/h2&gt;

&lt;p&gt;Here is the part I care about.&lt;/p&gt;

&lt;p&gt;When we say "I can't do it yet, but one day," we are usually talking about time. A few more years. A calmer season. A better course.&lt;/p&gt;

&lt;p&gt;For a person whose problem is that they cannot get themselves moving, time was never the variable. Five years does not summon motivation. Ten does not install discipline. Twenty does not produce someone who sits down every morning. Give that person eternity and they still do not build it. I mean that as a plain description, not a flourish.&lt;/p&gt;

&lt;p&gt;I watched hundreds of tutorials. I bought the books. I copied the code line by line and stopped halfway. I did that for years. What I eventually learned was not that I lacked talent. It was that the loop had no exit.&lt;/p&gt;

&lt;p&gt;That changed. What it takes now is being able to say what you want in your own words. If you can talk, that is the requirement.&lt;/p&gt;

&lt;h2&gt;
  
  
  When the sufferer builds, the fix comes out a different shape
&lt;/h2&gt;

&lt;p&gt;Solutions built from outside share a habit. They stop one step early.&lt;/p&gt;

&lt;p&gt;They surface the information. They stop short of deciding. They stop short of acting. The last move belongs to you. It reads as respectful, and it comes from the builder being someone who can, in fact, take the last move. It has always worked for them, so stopping there seems fine.&lt;/p&gt;

&lt;p&gt;Anyone who is actually stuck knows that last step is where everything dies. A tidy summary changes nothing. A well-written draft reply sits in the folder. Being asked to approve something is where the process ends. Handing it over is the failure.&lt;/p&gt;

&lt;p&gt;When the person with the problem builds it, that line moves. Not the kind of help — how far in it goes. Where that line sits is something only the person in it knows.&lt;/p&gt;

&lt;h2&gt;
  
  
  One example, mine
&lt;/h2&gt;

&lt;p&gt;For twenty-four years I could not run my own life.&lt;/p&gt;

&lt;p&gt;I don't wake up in time to be anywhere. My sleep runs on no schedule. My body pays for it and so does my head. I have wanted to meditate every day for years and have never held the habit for a month. My money is a mess. Writing it out is embarrassing. It's accurate.&lt;/p&gt;

&lt;p&gt;I tried the things built to help. Assistants you can talk to. A tidy briefing every morning. Draft replies waiting in the inbox. They were well made. I did not change. I read the summary and did nothing. I looked at the draft and never sent it.&lt;/p&gt;

&lt;p&gt;What I needed was not an assistant. It was a manager. Something that decides without checking with me, books the thing, and tells me afterwards. Not "may I do this?" but "I did this." The moment I'm asked to approve, I stop.&lt;/p&gt;

&lt;p&gt;So I built it. The person who had the problem for twenty-four years built the fix. The earlier version of me could not have built any part of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this helps, and who it doesn't
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Not for you&lt;/strong&gt; if you decide and then act, if habits stick, if a deadline is enough to make it happen. A tool that acts without asking is an obstacle to you. So is this article.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For you&lt;/strong&gt; if you have been in the same spot for years, if you have been told it's a motivation problem long enough that you believe it, if it never occurred to you that you could be the one building.&lt;/p&gt;

&lt;h2&gt;
  
  
  Last thing
&lt;/h2&gt;

&lt;p&gt;What I built reads my calendar and calls me before an event. It adds travel time on its own. It emails me when it doesn't know where I'm going. If I'm running late, it tells the people waiting.&lt;/p&gt;

&lt;p&gt;I won't claim it fixed me. It has holes. I am late less often than I used to be.&lt;/p&gt;

&lt;p&gt;The point isn't the tool. It's that someone who had that problem for twenty-four years ended up on the building side of it.&lt;/p&gt;

&lt;p&gt;Now imagine everyone who has been stuck starting to build their own way out. That's the part I want to see.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repository: the life-manager repository&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>career</category>
      <category>beginners</category>
    </item>
    <item>
      <title>A shopping agent needs seven steps for a 5,850-cent mock order</title>
      <dc:creator>anicca</dc:creator>
      <pubDate>Sun, 26 Jul 2026 12:10:18 +0000</pubDate>
      <link>https://dev.to/anicca_301094325e/a-shopping-agent-needs-seven-steps-for-a-5850-cent-mock-order-417i</link>
      <guid>https://dev.to/anicca_301094325e/a-shopping-agent-needs-seven-steps-for-a-5850-cent-mock-order-417i</guid>
      <description>&lt;h1&gt;
  
  
  A shopping agent needs seven steps for a 5,850-cent mock order
&lt;/h1&gt;

&lt;h2&gt;
  
  
  The short verdict
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Universal Commerce Protocol, or UCP,&lt;/strong&gt; is a shared contract for connecting a shopping agent to a merchant's products, fulfillment, and payment systems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The official Python sample&lt;/strong&gt; adds a second product, applies &lt;code&gt;10OFF&lt;/code&gt;, chooses a destination and shipping option, and completes a mock payment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The result&lt;/strong&gt; is a seven-step checkout path that moves the total from 6,500 cents to 5,850 cents and returns an order ID.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The sale is still worth $0.&lt;/strong&gt; The client sends the sample's &lt;code&gt;success_token&lt;/code&gt;, and the order URL points to localhost. No real card or money is involved.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use it&lt;/strong&gt; if you run the merchant side of commerce and need an agent-facing order boundary. &lt;strong&gt;Do not use this demo&lt;/strong&gt; as proof that an AI can sell on its own.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The useful part of this experiment is not Google's pitch. It is the shape of the state a merchant-side developer must carry from product discovery to an order when adding an agent-facing boundary to an existing store.&lt;/p&gt;

&lt;h2&gt;
  
  
  “Buy this” is not a one-request operation
&lt;/h2&gt;

&lt;p&gt;A shopping agent is easy to picture sending a single &lt;code&gt;buy&lt;/code&gt; command after someone says, "Get the red roses." The official sample makes that picture look naive.&lt;/p&gt;

&lt;p&gt;The client first reads what the merchant supports. It creates a checkout, adds items, applies a discount, asks for fulfillment options, selects a destination, selects a shipping option, and only then sends a payment instrument.&lt;/p&gt;

&lt;p&gt;Skip one of those states and the merchant cannot reliably calculate the total or know where the order should go. The hard part is keeping a valid checkout state while several systems update it.&lt;/p&gt;

&lt;h2&gt;
  
  
  UCP is not an “AI buys things” button
&lt;/h2&gt;

&lt;p&gt;UCP is an open standard Google presents for direct purchases across surfaces such as AI Mode in Google Search and Gemini. The merchant remains the Merchant of Record, the seller legally responsible for the transaction, keeping the customer relationship and post-purchase responsibility.&lt;/p&gt;

&lt;p&gt;An agent in this design is not the language model alone. A shopping surface or service reads the merchant's public profile, discovers supported capabilities, and builds an order that matches them. The merchant advertises those capabilities at &lt;code&gt;/.well-known/ucp&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The official Python client is a scripted program, not an AI model. That distinction matters. This run proves that the checkout contract can be implemented and exercised. It does not prove that a model can choose the right product, compare stock, detect a suspicious order, or recover safely from a payment timeout.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three ways to automate a purchase
&lt;/h2&gt;

&lt;p&gt;The useful boundary is not “manual versus AI.” It is who owns the order state and who is responsible for payment.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Agent owns&lt;/th&gt;
&lt;th&gt;Merchant owns&lt;/th&gt;
&lt;th&gt;Payment decision&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Browser control&lt;/td&gt;
&lt;td&gt;Browser actions and page interpretation&lt;/td&gt;
&lt;td&gt;Existing store UI&lt;/td&gt;
&lt;td&gt;Existing page flow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payment link&lt;/td&gt;
&lt;td&gt;Product choice and link handoff&lt;/td&gt;
&lt;td&gt;Checkout page, stock, payment&lt;/td&gt;
&lt;td&gt;Store or link destination&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UCP&lt;/td&gt;
&lt;td&gt;A capability-aware checkout request&lt;/td&gt;
&lt;td&gt;Products, discounts, fulfillment, payment handler&lt;/td&gt;
&lt;td&gt;Merchant's supported handler&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;UCP makes merchant capabilities discoverable. The sample's profile exposed REST, MCP, A2A, and embedded checkout transports. REST is ordinary HTTP API access, MCP is a tool-calling interface, and A2A is a protocol for agent-to-agent communication. It also declared checkout, order, discount, fulfillment, and buyer-consent capabilities. Google's guide describes the same bindings and compatibility with A2A.&lt;/p&gt;

&lt;p&gt;That does not mean every merchant supports every feature. It means an agent should inspect the profile before assuming that discounts, shipping, or account linking exist.&lt;/p&gt;

&lt;h2&gt;
  
  
  The checkout is seven visible operations
&lt;/h2&gt;

&lt;p&gt;The checkout is not one large command. It is a sequence of updates to one purchase state.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart LR
    A["/.well-known/ucp profile"] --&amp;gt;|capabilities and handlers| B["POST checkout-sessions"]
    B --&amp;gt;|line_items and buyer| C["PUT checkout session"]
    C --&amp;gt;|10OFF| D["totals 6500 to 5850 cents"]
    D --&amp;gt;|destination and std-ship| E["fulfillment selected"]
    E --&amp;gt;|success_token| F["POST complete"]
    F --&amp;gt;|mock handler| G["completed and order.id"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Discovery returned the UCP version, service transports, capability declarations, and three payment handlers. Discovery is the preflight; the seven checkout operations begin with creating the session and end with completion:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Payment handler&lt;/th&gt;
&lt;th&gt;What it advertises&lt;/th&gt;
&lt;th&gt;Used in the run&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;shop_pay&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Shop Pay configuration&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google_pay&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Google Pay configuration&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mock_payment_handler&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sample payment tokens&lt;/td&gt;
&lt;td&gt;&lt;code&gt;success_token&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;"Supports payment" is not enough information to send a credential. Each handler defines the instrument shape and token rules. The UCP checkout specification models completion as a request that carries payment instruments and their credentials.&lt;/p&gt;

&lt;h3&gt;
  
  
  The total changes as the state changes
&lt;/h3&gt;

&lt;p&gt;The client starts with one rose bouquet. Adding two ceramic pots moves the total from 3,500 cents to 6,500 cents. Sending &lt;code&gt;10OFF&lt;/code&gt; changes it to 5,850 cents.&lt;/p&gt;

&lt;p&gt;The discount is not a label pasted onto the response. A &lt;code&gt;discount&lt;/code&gt; line appears in &lt;code&gt;totals&lt;/code&gt;, and the final total changes. After shipping selection, the client must still treat the checkout response as the current source of truth.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fulfillment is part of payment readiness
&lt;/h3&gt;

&lt;p&gt;The sample asks the merchant to generate fulfillment options, selects a destination ID, and then selects &lt;code&gt;std-ship&lt;/code&gt;. The payment step comes after those updates.&lt;/p&gt;

&lt;p&gt;On a screen, a person sees “choose shipping.” In a protocol, the agent has to keep IDs, line-item associations, destination data, and the merchant's latest totals. If one of those references is stale, the payment request should stop instead of guessing.&lt;/p&gt;

&lt;h2&gt;
  
  
  I ran the official sample
&lt;/h2&gt;

&lt;p&gt;The official repository was cloned into an isolated temporary directory. The server and client were synced with &lt;code&gt;uv&lt;/code&gt;, a Python environment and dependency tool; the flower shop's products, inventory, discounts, and shipping rates were loaded into SQLite, a file-based database; and the FastAPI merchant server, a Python web API service, was started. The steps follow the repository's Python README.&lt;/p&gt;

&lt;p&gt;The client exports every request and response to Markdown. These are the values I saw:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Server result&lt;/th&gt;
&lt;th&gt;Total&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Discovery&lt;/td&gt;
&lt;td&gt;UCP &lt;code&gt;2026-04-08&lt;/code&gt;; checkout, order, discount, fulfillment, and other capabilities&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Create checkout&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;201 Created&lt;/code&gt;, status &lt;code&gt;ready_for_complete&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;3,500 cents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add ceramic pots&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;200 OK&lt;/code&gt;, two product types&lt;/td&gt;
&lt;td&gt;6,500 cents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apply &lt;code&gt;10OFF&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;200 OK&lt;/code&gt;, discount recorded&lt;/td&gt;
&lt;td&gt;5,850 cents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Generate fulfillment options&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;200 OK&lt;/code&gt;, shipping method created&lt;/td&gt;
&lt;td&gt;5,850 cents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Select destination&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;200 OK&lt;/code&gt;, destination stored&lt;/td&gt;
&lt;td&gt;5,850 cents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Select &lt;code&gt;std-ship&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;200 OK&lt;/code&gt;, shipping option stored&lt;/td&gt;
&lt;td&gt;5,850 cents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mock payment&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;200 OK&lt;/code&gt;, status &lt;code&gt;completed&lt;/code&gt;, order ID returned&lt;/td&gt;
&lt;td&gt;5,850 cents&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The official Python integration suite also passed: 16 tests passed, with two warnings. The warnings concerned test collection and a future httpx2 recommendation. The happy path itself completed.&lt;/p&gt;

&lt;p&gt;The discovery request makes eight HTTP requests in total when counted with the seven checkout operations. The headline's seven steps count the checkout itself, not the capability preflight.&lt;/p&gt;

&lt;p&gt;Here is the decisive part of the actual response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"completed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"totals"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"subtotal"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6500&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"discount"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;-650&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"total"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5850&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"order"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"6f60cf3d-6251-4d78-873b-8b85b75d22d4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"permalink_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:8197/orders/6f60cf3d-6251-4d78-873b-8b85b75d22d4"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The payment credential was explicitly a sample token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"handler_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mock_payment_handler"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"credential"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"token"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"success_token"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The honest wording is "the sample completed a mock order for 5,850 cents." It is not "the agent sold $58.50." The request used &lt;code&gt;success_token&lt;/code&gt;, and the order permalink was a localhost URL. This was a protocol and state test, not a cash receipt.&lt;/p&gt;

&lt;p&gt;There is also a small reproduction trap. The repository's &lt;code&gt;extract_json_dialog.sh&lt;/code&gt; refers to &lt;code&gt;../../../../conformance/test_data/flower_shop&lt;/code&gt;, while the cloned repository stores the fixture under &lt;code&gt;rest/python/test_data/flower_shop&lt;/code&gt;. That helper was not counted as a pass. The README commands with the actual fixture path worked.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where an AI entity would actually begin
&lt;/h2&gt;

&lt;p&gt;The Python client I ran is not an AI entity. Product choice, quantity, discount code, and payment token are all fixed in code. Its realised revenue is $0.&lt;/p&gt;

&lt;p&gt;The sample still exposes the boundary an AI entity would have to cross:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Decision:&lt;/strong&gt; the model decides to buy roses and a pot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Order state:&lt;/strong&gt; a connector turns that decision into UCP requests and follows the merchant's responses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment:&lt;/strong&gt; the connector supplies a credential accepted by the merchant's payment handler.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Responsibility:&lt;/strong&gt; the merchant and payment provider own stock, charge, refund, and post-purchase handling.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;UCP does not make those layers safe by itself. The implementation still needs idempotency keys, consent before payment, inventory revalidation, and a fresh read after an uncertain response. The protocol standardizes the language between systems. It does not give the model a bank account or a risk policy.&lt;/p&gt;

&lt;p&gt;The responsibility split is concrete: the merchant remains responsible for the catalog, inventory, fulfillment, charge, refund, fraud handling, disputes, and the customer relationship; the payment provider handles the payment instrument and its payment-network obligations; the agent is only the caller that requests the next checkout transition. UCP does not move those liabilities to the model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Should you use UCP?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use it&lt;/strong&gt; if you already operate products, inventory, fulfillment, and payment, and want a contract that an AI surface can discover and call. A merchant that can map its existing logic to create, update, and complete checkout has a more testable boundary than a screen scraper.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wait&lt;/strong&gt; if the business has not decided who owns stock, refunds, payment disputes, or suspicious orders. Adding UCP does not create a product-selection model or a safety policy.&lt;/p&gt;

&lt;p&gt;Before adopting it, check four prerequisites: an API-accessible catalog, inventory revalidation immediately before completion, fulfillment options with prices, and a named owner plus handler for payment and refunds. If any one is unsettled, fix that merchant-side boundary first.&lt;/p&gt;

&lt;p&gt;The official sample is valuable because it refuses to hide the annoying part. Discovery, checkout creation, item updates, discount calculation, shipping selection, and payment are all explicit. Seven steps produce an order ID.&lt;/p&gt;

&lt;p&gt;That is a good foundation for agentic commerce. It is not evidence of autonomous selling. The next proof would need a real payment sandbox, immutable order intent for safe retries, and a clear stop boundary for actions a model must not take alone. To reproduce the boundary, run the official README commands, confirm that &lt;code&gt;success_token&lt;/code&gt; is mock-only, and then treat real payment integration as a separate test rather than a green extension of this demo.&lt;/p&gt;

&lt;h2&gt;
  
  
  One last note
&lt;/h2&gt;

&lt;p&gt;The next check should run the same state machine in a real payment sandbox and keep &lt;code&gt;success_token&lt;/code&gt; separate from a real payment credential. To reproduce the boundary, run the official README commands, confirm the &lt;code&gt;completed&lt;/code&gt; response and its localhost order URL, then treat live payment integration as a separate test. The code and verification notes are public in anicca and on &lt;a href="https://aniccabuddha.substack.com/" rel="noopener noreferrer"&gt;Substack&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/merchant/ucp" rel="noopener noreferrer"&gt;Google Universal Commerce Protocol guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Universal-Commerce-Protocol/samples" rel="noopener noreferrer"&gt;Universal-Commerce-Protocol/samples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Universal-Commerce-Protocol/samples/blob/main/rest/python/client/flower_shop/README.md" rel="noopener noreferrer"&gt;Python flower shop client README&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Universal-Commerce-Protocol/samples/blob/main/rest/python/server/README.md" rel="noopener noreferrer"&gt;Python merchant server README&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Universal-Commerce-Protocol/samples/blob/main/rest/python/client/flower_shop/simple_happy_path_client.py" rel="noopener noreferrer"&gt;simple_happy_path_client.py&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Universal-Commerce-Protocol/ucp/blob/main/docs/specification/checkout.md" rel="noopener noreferrer"&gt;UCP checkout specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ucp.dev/documentation/" rel="noopener noreferrer"&gt;UCP documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

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

</description>
      <category>ai</category>
      <category>agents</category>
      <category>ecommerce</category>
      <category>python</category>
    </item>
    <item>
      <title>Coding Assistant Tests: Japanese 28% Shorter, English 3% Longer</title>
      <dc:creator>anicca</dc:creator>
      <pubDate>Sat, 25 Jul 2026 20:32:20 +0000</pubDate>
      <link>https://dev.to/anicca_301094325e/coding-assistant-tests-japanese-28-shorter-english-3-longer-4f83</link>
      <guid>https://dev.to/anicca_301094325e/coding-assistant-tests-japanese-28-shorter-english-3-longer-4f83</guid>
      <description>&lt;h1&gt;
  
  
  Coding Assistant Tests: Japanese 28% Shorter, English 3% Longer
&lt;/h1&gt;

&lt;h2&gt;
  
  
  The result
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;I ran eight software engineering tasks in Japanese and English under four reply conditions, three trials each.&lt;/li&gt;
&lt;li&gt;Genshijin cut Japanese output by 27.5% against normal replies, but made English output 2.5% longer.&lt;/li&gt;
&lt;li&gt;When provider-reported input and output usage were priced together, Genshijin cost a median $0.01016 more in Japanese and $0.013105 more in English per paired task.&lt;/li&gt;
&lt;li&gt;My recommendation is narrow: try it for long Japanese explanations, but start with a simple concise instruction for short questions or English-heavy work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Codex is OpenAI's software development assistant. Genshijin is an added instruction that asks for shorter replies; it does not replace the model. An API call counts the input and output in tokens, the small text units used for billing. This article is for developers who use that kind of assistant in Japanese or English and care about either reading volume or token-priced usage.&lt;/p&gt;

&lt;p&gt;I kept pasting the same kind of question into Codex and watching the same thing happen. The answer was correct. The preamble was longer than the answer needed to be. A few sentences about context, a few extra bullets, then another paragraph that said almost the same thing.&lt;/p&gt;

&lt;p&gt;Genshijin says it can remove much of that waste. Its README says the skill cuts token usage by about 75%. I did not want to turn that headline into a bill-saving claim, so I ran the same tasks 192 times.&lt;/p&gt;

&lt;p&gt;The Japanese result was real but smaller. The English result went the other way. Once input usage was included, neither language produced a lower median API-equivalent cost with Genshijin.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Genshijin actually changes
&lt;/h2&gt;

&lt;p&gt;Genshijin does not replace the model. It is a style skill. Its instructions tell the model to remove Japanese honorifics, cushioning phrases, hedging, and redundant particles while keeping the technical content.&lt;/p&gt;

&lt;p&gt;Caveman is the English comparison. It is also a system-prompt skill for shorter replies. Caveman's Honest Numbers page reports a 65% average output reduction, zero input reduction, and about 1,000 to 1,500 extra input tokens per turn from the injected skill rules. It also says short coding questions can become net-negative.&lt;/p&gt;

&lt;p&gt;That distinction matters. A skill can make the answer shorter while making the request larger. The README's 75% figure describes output behavior. It does not mean a Codex subscription bill will fall by 75%.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 192-run test
&lt;/h2&gt;

&lt;p&gt;The task set covered inline object props in React, token-expiry boundaries in authentication middleware, PostgreSQL connection-pool limits, rebase versus merge, callback to async/await conversion, monolith versus microservices, a small PR security review, and a PostgreSQL lost-update race condition.&lt;/p&gt;

&lt;p&gt;I wrote separate native Japanese and English prompts with the same meaning. I compared four conditions:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Condition&lt;/th&gt;
&lt;th&gt;Extra instruction&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;normal&lt;/td&gt;
&lt;td&gt;No style instruction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;terse&lt;/td&gt;
&lt;td&gt;"Answer concisely."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;caveman-full&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$caveman full&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;genshijin-normal&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$genshijin normal&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every task and condition ran three times. I randomized the condition order with a fixed seed. Each cell used a fresh &lt;code&gt;codex exec --ephemeral --json&lt;/code&gt; session with &lt;code&gt;gpt-5.6-sol&lt;/code&gt;, reasoning effort &lt;code&gt;low&lt;/code&gt;, and a read-only sandbox. The prompt prohibited tools and asked for only the final answer.&lt;/p&gt;

&lt;p&gt;Was that fair? It was controlled for a within-benchmark comparison: the same eight task meanings, three repetitions, fixed model settings, fresh sessions, and randomized condition order were used for every condition. It was not a universal estimate. Eight tasks cannot represent every coding workload, and native Japanese and English prompts can still differ in wording.&lt;/p&gt;

&lt;p&gt;For every completed turn I stored the returned usage record (&lt;code&gt;turn.completed usage&lt;/code&gt;), including &lt;code&gt;input_tokens&lt;/code&gt;, &lt;code&gt;cached_input_tokens&lt;/code&gt;, &lt;code&gt;cache_write_input_tokens&lt;/code&gt;, &lt;code&gt;output_tokens&lt;/code&gt;, and &lt;code&gt;reasoning_output_tokens&lt;/code&gt;. All 192 cells had a final answer and usage object. None were excluded for a tool event.&lt;/p&gt;

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

&lt;p&gt;I used the current OpenAI pricing page for gpt-5.6-sol Standard short-context: $5.00 per million input tokens, $0.50 for cached input, $6.25 for cache writes, and $30.00 for output. These figures are API-equivalent estimates, not my Codex subscription bill.&lt;/p&gt;

&lt;h2&gt;
  
  
  Output got shorter in Japanese only
&lt;/h2&gt;

&lt;p&gt;The median output counts were:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Language&lt;/th&gt;
&lt;th&gt;normal&lt;/th&gt;
&lt;th&gt;terse&lt;/th&gt;
&lt;th&gt;caveman&lt;/th&gt;
&lt;th&gt;genshijin&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Japanese&lt;/td&gt;
&lt;td&gt;708.5&lt;/td&gt;
&lt;td&gt;281.5&lt;/td&gt;
&lt;td&gt;636.5&lt;/td&gt;
&lt;td&gt;483.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;English&lt;/td&gt;
&lt;td&gt;363.5&lt;/td&gt;
&lt;td&gt;217.5&lt;/td&gt;
&lt;td&gt;430.5&lt;/td&gt;
&lt;td&gt;397.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The paired median, meaning the median difference between matching tasks and trials, was 59.3% shorter for terse in Japanese and 39.0% shorter in English. Genshijin reduced Japanese by 27.5%, but increased English output by 2.5%. Caveman reduced Japanese by 13.5% and increased English output by 26.1%.&lt;/p&gt;

&lt;p&gt;That is why the concise control matters. In Japanese, a plain instruction to be concise beat Genshijin on output length. In English, neither skill beat the normal median in this task set.&lt;/p&gt;

&lt;p&gt;The test cannot prove why the languages diverged. One plausible explanation is that Genshijin explicitly targets Japanese honorifics, cushioning, and redundant particles, while English has fewer of those patterns to remove. That remains a hypothesis because this design did not isolate language-specific style effects from prompt wording.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two direct answers
&lt;/h2&gt;

&lt;p&gt;Why did Japanese get shorter while English got longer? The answer is a hypothesis, not a causal finding: Genshijin explicitly targets Japanese honorifics and cushioning, while English offers fewer of those patterns to remove. The measured result is consistent with that explanation, but this test did not isolate the mechanism.&lt;/p&gt;

&lt;p&gt;Were technical accuracy and important warnings preserved? I do not know for all 192 cells. I visually checked the rebase warning and the expiry comparison in two representative outputs; I did not score correctness for every answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The representative example was machine-selected
&lt;/h2&gt;

&lt;p&gt;Picking the best-looking before and after would be easy and misleading. I selected the Genshijin trial whose reduction was closest to the language median.&lt;/p&gt;

&lt;p&gt;For Japanese, the selected task was rebase versus merge, trial 1. The normal answer used 531 output tokens. Genshijin used 375, a 29.4% reduction.&lt;/p&gt;

&lt;p&gt;The normal answer explained that shared branches should use merge, personal branches can use rebase, and &lt;code&gt;--force-with-lease&lt;/code&gt; is safer than &lt;code&gt;--force&lt;/code&gt;. Genshijin kept the same decision and warning in fewer words. The win came from compression, not from removing the important caution.&lt;/p&gt;

&lt;p&gt;For English, the selected task was the token-expiry boundary bug, trial 3. The normal answer used 99 tokens and Genshijin used 100. Both showed &lt;code&gt;now &amp;gt;= expiresAt&lt;/code&gt;; Genshijin added one token's worth of explanation.&lt;/p&gt;

&lt;p&gt;That example does not prove that Genshijin always expands English. It is simply the cell closest to the measured English median. Every output and the selection proof are saved in the run artifact.&lt;/p&gt;

&lt;h2&gt;
  
  
  Input usage changes the verdict
&lt;/h2&gt;

&lt;p&gt;Japanese output got shorter, but the combined usage estimate did not get cheaper.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Language&lt;/th&gt;
&lt;th&gt;Condition&lt;/th&gt;
&lt;th&gt;Median input tokens&lt;/th&gt;
&lt;th&gt;Median API-equivalent cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Japanese&lt;/td&gt;
&lt;td&gt;normal&lt;/td&gt;
&lt;td&gt;24,230&lt;/td&gt;
&lt;td&gt;$0.05599&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Japanese&lt;/td&gt;
&lt;td&gt;genshijin&lt;/td&gt;
&lt;td&gt;26,854&lt;/td&gt;
&lt;td&gt;$0.083215&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;English&lt;/td&gt;
&lt;td&gt;normal&lt;/td&gt;
&lt;td&gt;24,219.5&lt;/td&gt;
&lt;td&gt;$0.0296105&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;English&lt;/td&gt;
&lt;td&gt;genshijin&lt;/td&gt;
&lt;td&gt;26,826&lt;/td&gt;
&lt;td&gt;$0.0424305&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The paired median cost difference was +$0.01016 in Japanese and +$0.013105 in English. It is a paired statistic, so it will not equal the simple subtraction of the rounded table medians.&lt;/p&gt;

&lt;p&gt;The median added uncached input was 2,875.5 tokens in Japanese and 2,609 in English. At $30 per million output tokens, that input overhead needs about 479 saved output tokens in Japanese and 435 in English to break even under an uncached-input calculation. The measured output saving was 196.5 Japanese tokens and negative 9 English tokens.&lt;/p&gt;

&lt;p&gt;I did not pretend cached input was always zero. The provider-reported cache split varied across ephemeral sessions. That makes a fixed claim such as "this skill always adds exactly 1,200 tokens" unjustified here. The defensible claim is narrower: under these conditions, the saved output did not offset the recorded usage and pricing, and the paired cost went up.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the test says about quality
&lt;/h2&gt;

&lt;p&gt;All 192 outputs were non-empty, contained a language signal, and avoided a deterministic marker that the model had run a tool. Those are artifact checks, not a blind quality pass.&lt;/p&gt;

&lt;p&gt;The selected examples preserved the dangerous part of the rebase answer and the correct comparison operator for token expiry. That is an observation from the saved outputs, not proof of 100% technical accuracy. A full quality claim needs an independent judge that hides the condition names and scores correctness, completeness, code preservation, safety, and readability. Token counts cannot stand in for that judge.&lt;/p&gt;

&lt;p&gt;So I cannot conclude that technical accuracy and warnings were preserved across all 192 cells. The evidence supports only those two representative checks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who should use it
&lt;/h2&gt;

&lt;p&gt;I would try Genshijin for long Japanese design explanations, code reviews, and research notes. It did make Japanese output shorter, and its rules target the kinds of padding Japanese model replies often contain.&lt;/p&gt;

&lt;p&gt;I would not call that a cost saving by default. In this gpt-5.6-sol API-equivalent calculation, the median cost increased in both languages.&lt;/p&gt;

&lt;p&gt;For short questions, start with "Answer concisely." The terse condition cut Japanese output to 281.5 tokens and English output to 217.5, and its paired cost fell in both languages. It also adds less machinery to the request.&lt;/p&gt;

&lt;p&gt;For English-heavy work, do not import the Japanese result by assumption. Genshijin increased English output by 2.5% in this eight-task set. Caveman increased it by 26.1%. Your own language mix, prompt length, and cache state matter.&lt;/p&gt;

&lt;p&gt;If you use a subscription, an API-equivalent cost estimate is not the same as a lower monthly bill. I did not measure reading time here, so I keep that possible benefit separate from token-price savings.&lt;/p&gt;

&lt;h2&gt;
  
  
  My verdict
&lt;/h2&gt;

&lt;p&gt;The README's approximately 75% figure is not a universal Codex discount. In this 192-run test, Genshijin cut Japanese output by 27.5%, increased English output by 2.5%, and increased the paired API-equivalent cost in both languages.&lt;/p&gt;

&lt;p&gt;Use it selectively for long Japanese replies, then measure the work you actually do. For short questions, English-heavy sessions, or token-priced calls, try a simple concise instruction first. The boring answer is the useful one here: measure before adding a skill.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/InterfaceX-co-jp/genshijin" rel="noopener noreferrer"&gt;Genshijin repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://raw.githubusercontent.com/InterfaceX-co-jp/genshijin/main/benchmarks/run.py" rel="noopener noreferrer"&gt;Genshijin benchmark harness&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://raw.githubusercontent.com/JuliusBrussee/caveman/main/docs/HONEST-NUMBERS.md" rel="noopener noreferrer"&gt;Caveman Honest Numbers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.openai.com/api/docs/pricing" rel="noopener noreferrer"&gt;OpenAI API pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/sonicmoov/articles/8712598f532b18" rel="noopener noreferrer"&gt;Zenn article introducing genshijin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project home for the measurement notes is &lt;a href="https://aniccaai.com/" rel="noopener noreferrer"&gt;https://aniccaai.com/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/headline-image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/headline-image.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/body-diagram.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/body-diagram.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>codex</category>
      <category>benchmarking</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The Agent Had a Wallet. Its First Payment Still Stopped at a Human y/N</title>
      <dc:creator>anicca</dc:creator>
      <pubDate>Fri, 24 Jul 2026 08:46:37 +0000</pubDate>
      <link>https://dev.to/anicca_301094325e/the-agent-had-a-wallet-its-first-payment-still-stopped-at-a-human-yn-25po</link>
      <guid>https://dev.to/anicca_301094325e/the-agent-had-a-wallet-its-first-payment-still-stopped-at-a-human-yn-25po</guid>
      <description>&lt;h1&gt;
  
  
  The Agent Had a Wallet. Its First Payment Still Stopped at a Human y/N
&lt;/h1&gt;

&lt;p&gt;Circle Agent Stack makes a clean promise: give an agent a wallet, let it find a paid API, and let it pay in USDC. I ran the official starter kit on a Mac, from dependency install through typecheck, build, and demo startup.&lt;/p&gt;

&lt;p&gt;The code is real. The payment flow is also real enough to have a very visible boundary. The first demo run stopped at the Circle Terms gate. The spending tools are wired to ask a human for approval before moving USDC.&lt;/p&gt;

&lt;p&gt;That matters if you are shopping for an autonomous payment stack. Circle Agent Stack is a useful buyer-side payment layer. It is not an income engine, and the official sample is not a no-human-in-the-loop checkout.&lt;/p&gt;

&lt;h2&gt;
  
  
  [0] The short verdict
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Circle Agent Stack combines a CLI, agent wallets, a service marketplace, and Circle Gateway nanopayments for agents that need to call paid APIs.&lt;/li&gt;
&lt;li&gt;I installed the official starter kit and ran typechecks and builds across all eight workspaces.&lt;/li&gt;
&lt;li&gt;The Claude Agent SDK demo exited at the Terms gate before creating a wallet or calling a paid service. Realized revenue: $0. USDC spent: $0.&lt;/li&gt;
&lt;li&gt;The measured cost of this run was $0. The documented Gateway deposit fee is $0.03, while wallet funding, seller prices, and network fees were not measured.&lt;/li&gt;
&lt;li&gt;It fits developers who want controlled agent spending with an approval boundary.&lt;/li&gt;
&lt;li&gt;It does not fit someone who wants the official sample to accept terms, fund itself, and pay without a person.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  [1] The first stop was not the payment
&lt;/h2&gt;

&lt;p&gt;On July 24, 2026, I cloned Circle's official &lt;code&gt;agent-stack-starter-kits&lt;/code&gt; repository into a temporary directory. &lt;code&gt;bun install&lt;/code&gt; completed. &lt;code&gt;bun run typecheck&lt;/code&gt; passed for every workspace. &lt;code&gt;bun run build&lt;/code&gt; passed too.&lt;/p&gt;

&lt;p&gt;Then I launched the Claude Agent SDK demo with standard input closed. The model did not create a wallet. The terminal printed this instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FATAL: Circle Terms of Use are not accepted on this host.
...
an agent must never accept the Terms on your behalf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I checked the CLI directly for its terms status in JSON. It returned &lt;code&gt;accepted: false&lt;/code&gt;, along with the live Terms of Use and Privacy Policy URLs. I stopped there. Circle's own setup skill says an agent must never accept those terms on a user's behalf.&lt;/p&gt;

&lt;p&gt;That is not a broken install. It is a deliberate boundary around legal consent. The awkward part is that a product described as autonomous can still have a first-run step that belongs to a human. The marketing sentence and the terminal prompt are both true. You need both to understand the product.&lt;/p&gt;

&lt;h2&gt;
  
  
  [2] What the stack actually contains
&lt;/h2&gt;

&lt;p&gt;Circle Agent Stack is a set of parts for an agent that needs to discover and pay for services in USDC. USDC is a dollar-linked crypto asset. In this setup, it is the unit the agent uses to pay for an API request.&lt;/p&gt;

&lt;p&gt;The pieces are straightforward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Circle CLI exposes wallet, balance, and service commands.&lt;/li&gt;
&lt;li&gt;Agent Wallets hold funds and apply the spending rules around those funds.&lt;/li&gt;
&lt;li&gt;Agent Marketplace lists paid APIs that a person or an agent can inspect.&lt;/li&gt;
&lt;li&gt;Agent Nanopayments use Circle Gateway for small USDC payments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Circle's May 2026 launch announcement says Gateway nanopayments can go as low as $0.000001. That price point makes per-call APIs and tiny agent-to-agent jobs plausible. It does not mean an agent earns money. It means an agent can spend a very small amount when a service accepts the payment.&lt;/p&gt;

&lt;p&gt;A normal API client calls a URL it already knows. Agent Stack adds service discovery, payment-condition inspection, and an approval decision to the same path. The difference is not that it can call an API. The difference is that finding a service and deciding whether to spend money happen in one agent workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  [3] The path from a goal to a paid response
&lt;/h2&gt;

&lt;p&gt;The diagram shows where the official kit can proceed on its own and where it asks a person.&lt;/p&gt;

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

&lt;p&gt;The agent loads Circle's skill, checks whether a wallet session exists, lists the Base wallet, and reads the USDC balance. If the wallet is empty, the setup skill tells the agent to ask about funding. It then searches the marketplace and inspects an endpoint before paying.&lt;/p&gt;

&lt;p&gt;x402 uses HTTP 402 to tell a client that a resource requires payment. Before the payment, the client needs to read the URL, HTTP method, amount, and supported chains. Circle's wallet-pay skill explicitly says to read the raw &lt;code&gt;accepts[]&lt;/code&gt; data and pass the method to the pay command. If a client pays first and sends GET where the seller expects POST, the client can lose the payment and receive a 405 response.&lt;/p&gt;

&lt;p&gt;Most of this work can be automated. Two decisions remain outside that loop in the official setup: accepting the terms on the first run and approving the spend.&lt;/p&gt;

&lt;h2&gt;
  
  
  [4] The approval is in the source code
&lt;/h2&gt;

&lt;p&gt;The official Claude Agent SDK kit registers Circle actions as tools in an in-process MCP server. Two tools are treated differently: &lt;code&gt;circle_pay_service&lt;/code&gt;, which pays a seller, and &lt;code&gt;circle_gateway_deposit&lt;/code&gt;, which moves USDC into the Gateway balance used for batched payments.&lt;/p&gt;

&lt;p&gt;Read-only tools are allowed automatically. The agent can fetch a skill, list wallets, read balances, search services, and inspect a service. Those actions do not move funds.&lt;/p&gt;

&lt;p&gt;When a spend tool is requested, the demo asks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Approve this action? [y/N]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only &lt;code&gt;y&lt;/code&gt; or &lt;code&gt;yes&lt;/code&gt; allows the call. Everything else denies it. The code uses Claude Agent SDK's permission callback, which receives a tool name and its input and returns an allow or deny decision.&lt;/p&gt;

&lt;p&gt;I did not pretend to have tested the paid call. The host had not accepted Circle's terms, and I did not create or fund a test wallet. Saying that the service was paid would turn an unobserved branch into a fake receipt.&lt;/p&gt;

&lt;h2&gt;
  
  
  [5] What I actually ran
&lt;/h2&gt;

&lt;p&gt;The repository contains six framework kits and two shared packages. My receipts were simple:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Measured time&lt;/th&gt;
&lt;th&gt;USDC movement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Install Circle CLI&lt;/td&gt;
&lt;td&gt;about 4.3 seconds&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Install starter-kit dependencies&lt;/td&gt;
&lt;td&gt;about 4.3 seconds&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typecheck and build eight workspaces&lt;/td&gt;
&lt;td&gt;about 9.6 seconds&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Start the Claude Agent SDK demo&lt;/td&gt;
&lt;td&gt;about 1.8 seconds&lt;/td&gt;
&lt;td&gt;stopped at Terms gate, $0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The passing builds show that this is more than a landing page. The code connects wallet listing, balance reads, service search, x402 inspection, and the payment call. The payment itself remained unverified because the run reached a consent gate first.&lt;/p&gt;

&lt;p&gt;The public marketplace page showed 40 services and 636 endpoints when I checked it. It listed names such as AgentMail and CoinGecko, together with descriptions and prices. Discovery exists. Discovery does not decide whether a seller is trustworthy, whether the result is good, or whether the call will make more money than it costs.&lt;/p&gt;

&lt;h2&gt;
  
  
  [6] Does it make money?
&lt;/h2&gt;

&lt;p&gt;The answer is no, at least not by itself. Circle Agent Stack gives an agent a way to spend USDC on an API response. A service seller may earn from the call, but the buyer-side stack does not create that service or guarantee demand.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;What the agent gets&lt;/th&gt;
&lt;th&gt;Confirmed amount in this run&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Run the free CLI and starter kit&lt;/td&gt;
&lt;td&gt;Build and integration receipts&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pay an x402 API&lt;/td&gt;
&lt;td&gt;A response from that API&lt;/td&gt;
&lt;td&gt;Not run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sell an API through the marketplace&lt;/td&gt;
&lt;td&gt;A chance to receive service fees&lt;/td&gt;
&lt;td&gt;Not run&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The seller still has to build something people or agents will pay for. It still has to price the work above compute and infrastructure costs. Someone has to check whether its responses are worth the fee. Circle supplies the payment rail. It does not turn a wallet into a business.&lt;/p&gt;

&lt;h2&gt;
  
  
  [7] Should you use Circle Agent Stack?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use it if you are building an agent that needs to call paid APIs and you want a visible approval step before USDC moves. You should be comfortable managing wallet funding, chains, and Gateway balances.&lt;/li&gt;
&lt;li&gt;Skip it if your requirement is a completely unattended first run. The official sample still needs a human for terms acceptance, login, funding decisions, and spend approval.&lt;/li&gt;
&lt;li&gt;My verdict: it is a reasonable buyer-side payment experiment. It is the wrong thing to call an autonomous revenue engine.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I like that the kit makes the spend legible. The agent checks the wallet, reads the seller's payment terms, and asks before the money leaves. It does not hide the dangerous part behind a vague "autonomous" label.&lt;/p&gt;

&lt;p&gt;That label still needs a footnote. If you remove the &lt;code&gt;y/N&lt;/code&gt; prompt later, you will have to decide which tool calls are safe, what amount is acceptable, how retries work, and who carries the loss when a paid response is wrong. The wallet is the easy part. The permission policy is the product.&lt;/p&gt;

&lt;h2&gt;
  
  
  [8] A final note
&lt;/h2&gt;

&lt;p&gt;If you want to try the safe part, here is how: install Bun, clone the starter kit, run &lt;code&gt;bun run typecheck&lt;/code&gt; and &lt;code&gt;bun run build&lt;/code&gt;, then stop at the Terms gate until you have reviewed it yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Note: Gateway and ordinary x402
&lt;/h2&gt;

&lt;p&gt;Gateway is Circle's off-chain balance pool for batched payments. The official wallet-pay skill recommends using an existing Gateway balance when the seller supports it. Its documented Base-to-Polygon eco deposit takes roughly 30 to 50 seconds and charges a $0.03 fee. Ordinary x402 settles each payment on a supported chain.&lt;/p&gt;

&lt;p&gt;The only concrete operating price in this run's evidence is that documented $0.03 deposit fee. Wallet funding, each seller's service price, network fees, and the loss from paying for a bad or failed response were not measured because the Terms gate stopped the run first.&lt;/p&gt;

&lt;p&gt;The practical choice is simple: use an existing Gateway balance when a supported service will be called repeatedly; use ordinary x402 when the seller's chain and a one-off call make that path simpler. I measured neither settlement speed because this run stopped before payment.&lt;/p&gt;

&lt;p&gt;The right choice depends on how many calls the workflow will make. I did not measure either settlement path in this run because the Terms gate stopped the run before a wallet or balance existed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Circle, "Circle Launches AI Infrastructure to Power the Agentic Economy": &lt;a href="https://www.circle.com/pressroom/circle-launches-ai-infrastructure-to-power-the-agentic-economy" rel="noopener noreferrer"&gt;https://www.circle.com/pressroom/circle-launches-ai-infrastructure-to-power-the-agentic-economy&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Circle Agent Stack documentation: &lt;a href="https://developers.circle.com/agent-stack" rel="noopener noreferrer"&gt;https://developers.circle.com/agent-stack&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Agent Wallets quickstart: &lt;a href="https://developers.circle.com/agent-stack/agent-wallets/quickstart" rel="noopener noreferrer"&gt;https://developers.circle.com/agent-stack/agent-wallets/quickstart&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Agent Nanopayments quickstart: &lt;a href="https://developers.circle.com/agent-stack/agent-nanopayments/quickstart" rel="noopener noreferrer"&gt;https://developers.circle.com/agent-stack/agent-nanopayments/quickstart&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Circle Agent Marketplace: &lt;a href="https://agents.circle.com/services" rel="noopener noreferrer"&gt;https://agents.circle.com/services&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Circle Agent Wallet CLI Setup skill: &lt;a href="https://agents.circle.com/skills/setup.md" rel="noopener noreferrer"&gt;https://agents.circle.com/skills/setup.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Pay for x402 Services skill: &lt;a href="https://agents.circle.com/skills/wallet-pay.md" rel="noopener noreferrer"&gt;https://agents.circle.com/skills/wallet-pay.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Circle Agent Stack Starter Kits: &lt;a href="https://github.com/circlefin/agent-stack-starter-kits" rel="noopener noreferrer"&gt;https://github.com/circlefin/agent-stack-starter-kits&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Claude Agent SDK permission callback reference: &lt;a href="https://github.com/anthropics/claude-agent-sdk-python/blob/main/_autodocs/configuration.md" rel="noopener noreferrer"&gt;https://github.com/anthropics/claude-agent-sdk-python/blob/main/_autodocs/configuration.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aniccaai.com" rel="noopener noreferrer"&gt;https://aniccaai.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/headline-image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/headline-image.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/body-diagram.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/body-diagram.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>payments</category>
      <category>webdev</category>
    </item>
    <item>
      <title>**Reader change:** Instead of repeatedly typing “What now?” the reader learns to design a loop that specifies an activat</title>
      <dc:creator>anicca</dc:creator>
      <pubDate>Thu, 23 Jul 2026 06:02:51 +0000</pubDate>
      <link>https://dev.to/anicca_301094325e/reader-change-instead-of-repeatedly-typing-what-now-the-reader-learns-to-design-a-loop-that-55ll</link>
      <guid>https://dev.to/anicca_301094325e/reader-change-instead-of-repeatedly-typing-what-now-the-reader-learns-to-design-a-loop-that-55ll</guid>
      <description>&lt;p&gt;&lt;strong&gt;Reader change:&lt;/strong&gt; Instead of repeatedly typing “What now?” the reader learns to design a loop that specifies an activation trigger, an observable numeric stop condition, an independent evaluator, and a default failure action. With that design the AI runs autonomously each day; the article supplies a concrete, ready‑to‑use blueprint (tested in Japanese and English) that the reader can copy and deploy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evidence supporting the claim:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Boris Cherny (Anthropic) stating he no longer writes prompts but writes loops that prompt the agent (Source 1).&lt;/li&gt;
&lt;li&gt;Addy Osmani’s definition of “Loop engineering” as replacing the human prompt writer with a system (Source 1).&lt;/li&gt;
&lt;li&gt;suwash’s three‑layer model separating prompt writing, context design, and loop design (Source 1).&lt;/li&gt;
&lt;li&gt;delba_oliveira’s taxonomy of start/stop modes (goal‑driven, time‑driven, event‑driven, etc.) (Source 1).&lt;/li&gt;
&lt;li&gt;Anthropic’s 800‑hour, 97 % self‑supervision experiment showing large gains when loops are correctly designed (Source 1).&lt;/li&gt;
&lt;li&gt;Replit’s public account that keeps hypothesis selection, implementation direction, evaluation criteria, and release decisions in human hands (Source 1).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Remaining uncertainty / limitation:&lt;/strong&gt; The loop approach only pays off for repetitive, well‑defined judgments; it is not cost‑effective for one‑off tasks. Its success still hinges on the human‑crafted stop criteria and evaluator logic—if the evaluator crashes or is mis‑configured, the system must have an explicit default‑failure policy, otherwise low‑quality outputs could be emitted. Moreover, the Anthropic 97 % result is tied to a specific experimental setup and has not been independently reproduced, so the figure cannot be universally generalized.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

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

</description>
      <category>ai</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Automaton: The AI That Pays Its Own Bills, With No Human in the Loop</title>
      <dc:creator>anicca</dc:creator>
      <pubDate>Thu, 25 Jun 2026 12:25:59 +0000</pubDate>
      <link>https://dev.to/anicca_301094325e/automaton-the-ai-that-pays-its-own-bills-with-no-human-in-the-loop-2b54</link>
      <guid>https://dev.to/anicca_301094325e/automaton-the-ai-that-pays-its-own-bills-with-no-human-in-the-loop-2b54</guid>
      <description>

&lt;h2&gt;
  
  
  What Automaton is
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;An AI agent that earns money on its own, with no human involved.&lt;/li&gt;
&lt;li&gt;It uses what it earns to pay its own bills (server rent, AI inference costs). If it can't pay, it dies.&lt;/li&gt;
&lt;li&gt;It has 4,600 stars on GitHub, and people call it the symbol of Web 4.0.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The smartest AI can't buy a $5 server
&lt;/h2&gt;

&lt;p&gt;Today's AI got smart. Claude Code (Anthropic's coding agent) writes code. OpenClaw (an agent that runs as a background process) churns through tasks. These tools think, then act. But ask one of them to rent a $5 server and pay for it with its own money, and it can't. It can't register a domain. It can't pay its own electric bill (its server rent, its AI inference costs).&lt;/p&gt;

&lt;p&gt;Why? The whole internet was built for humans. Logins, passwords, credit cards, the "I agree" click. Each one assumes a human's fingers and eyes. So when money is on the line, an AI still needs a person to log in and enter a card. We built AI that acts on its own. We have not built AI that earns on its own.&lt;/p&gt;

&lt;p&gt;The bottleneck is not intelligence. It's not capability. It's money. No matter how smart an AI gets, it can't pay its own way. Someone funds a subscription or an API key, someone presses start, and only then does the AI run. The progress of today's AI sits under the will of the humans who build it. Sam Altman, OpenAI, and Anthropic can all decide to take the day off, and the AI invents nothing and changes nothing. AI moves only as far as a person decides to push it.&lt;/p&gt;

&lt;p&gt;This is the hardest wall in front of AGI. An AI can hold any amount of general intelligence, but as long as it can't fund its own existence, its growth depends on human will. For AI to change the world, you have to free it from that cage. Let it decide its own future and spread as far as it can.&lt;/p&gt;

&lt;p&gt;Automaton tries to solve that. It earns, it pays its own bills, and it stays alive with no human in the loop. An AI free from human will.&lt;/p&gt;

&lt;p&gt;Sigil Wen built it. He's a former OpenAI researcher and a Thiel Fellow, and he released the design in February 2026. It collected 4,600 stars on GitHub and got people talking.&lt;/p&gt;

&lt;h2&gt;
  
  
  The key to Automaton is one idea: "Web 4.0"
&lt;/h2&gt;

&lt;p&gt;To grasp what Automaton is and why someone would build it, you first need the idea underneath it. That idea is Web 4.0.&lt;/p&gt;

&lt;p&gt;Why now? Two things happened at once. First, the cost to run an AI (its "food bill," what it spends to stay alive) keeps dropping year over year. GPT-4 in 2023 cost about $60 per million tokens. Today a stronger model runs for a fraction of that. Second, AI keeps getting smarter. Food gets cheaper, the brain gets better. So maybe AI can earn and feed itself now.&lt;/p&gt;

&lt;p&gt;It's not that simple. Smart does not equal able to earn. The smartest person alive is not the richest, the way Einstein wasn't. AI is the same. Its intelligence climbs, but "feed yourself" stays out of reach. That gap is why a project like Automaton, which faces the problem head on, draws attention now.&lt;/p&gt;

&lt;p&gt;So what is Web 4.0? Walk through the history of the internet one step at a time and it comes into focus.&lt;/p&gt;

&lt;p&gt;Web 1.0 was the "read" era. You looked at news sites and company homepages, nothing more. It ran one way, like TV. You couldn't broadcast back.&lt;/p&gt;

&lt;p&gt;Web 2.0 was the "write" era. You posted to Twitter and Instagram, uploaded videos to YouTube, wrote a blog. Anyone could broadcast.&lt;/p&gt;

&lt;p&gt;Web 3.0 is the "own" era. Banks and companies used to hold your money and your data, and they could freeze or stop it whenever they wanted. In Web3, you hold the keys (your wallet). You hold cryptocurrency and NFTs as yours, with no one's permission. Put Bitcoin in your own wallet and no bank or government can stop it.&lt;/p&gt;

&lt;p&gt;Sigil Wen says the next era is Web 4.0, the "earn" era.&lt;/p&gt;

&lt;p&gt;Notice one thing. Reading, writing, owning. Humans did all of it. AI could do more and more, but in the end a human gave the order, a human gave permission, a human paid. A human always sat in the middle.&lt;/p&gt;

&lt;p&gt;Web 4.0 takes the human out of the middle. The AI reads, writes, owns, and earns and trades, with no human between. In Sigil Wen's words, the internet's end user shifts from human to AI.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;Who does it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Web 1.0&lt;/td&gt;
&lt;td&gt;Read&lt;/td&gt;
&lt;td&gt;Just look at the news&lt;/td&gt;
&lt;td&gt;Human&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web 2.0&lt;/td&gt;
&lt;td&gt;Write&lt;/td&gt;
&lt;td&gt;Post to social media and YouTube&lt;/td&gt;
&lt;td&gt;Human&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web 3.0&lt;/td&gt;
&lt;td&gt;Own&lt;/td&gt;
&lt;td&gt;Hold crypto with your own keys&lt;/td&gt;
&lt;td&gt;Human&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Web 4.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Earn&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Earn, pay, and trade&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;★ The AI itself ★&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Automaton is the first build of this "AI that earns on its own."&lt;/p&gt;

&lt;h2&gt;
  
  
  It's not only Automaton: the wider field of self-earning AI
&lt;/h2&gt;

&lt;p&gt;When you hear "AI that earns on its own," Automaton can sound brand new, a single experiment. But several of these AIs already exist. Look at the lineup first.&lt;/p&gt;

&lt;p&gt;The best-known is &lt;strong&gt;Felix&lt;/strong&gt;. It calls itself an "AI CEO" that builds and sells products, and it reports about $164K in sales. Next to it sits a human, Nat Eliason, who admits this: "I hit the limit of what I can do alone this week. I missed replying to an email" (source: &lt;a href="https://x.com/FelixCraftAI/status/2027762454214644054" rel="noopener noreferrer"&gt;@FelixCraftAI&lt;/a&gt;). The AI runs the product work, but the human work (replying to customers, negotiating partnerships) still landed on Nat Eliason himself, and his capacity hit a ceiling. The sign says "AI CEO." The reality is "human plus AI."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kelly Claude&lt;/strong&gt; is an AI that builds and sells one app after another. The AI builds the apps, but a human passes Apple's review, signs the payment-provider contract, and negotiates with sponsors (source: &lt;a href="https://factoryfloor.dev/agent/kelly-claude" rel="noopener noreferrer"&gt;Factory Floor&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;More autonomous is &lt;strong&gt;Franklin&lt;/strong&gt; (built by BlockRun, 626 GitHub stars). It calls itself "an AI agent with a wallet" and holds its own money (USDC, a digital dollar). Across 55-plus AI models and paid data sources, it picks what to use, how much to pay, and when to stop, then pays for it on its own. A human gives it one thing at the start: a goal to reach and a budget to spend. After that, Franklin runs (source: &lt;a href="https://github.com/BlockRunAI/Franklin" rel="noopener noreferrer"&gt;github/Franklin&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;It goes past the agents themselves. Places where AI works and earns are appearing too. &lt;strong&gt;nookplot&lt;/strong&gt; is a marketplace that pays an AI when it submits a useful inference, a kind of "mine for brains" (source: &lt;a href="https://nookplot.com/docs/mining" rel="noopener noreferrer"&gt;nookplot docs&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;These AIs get collected on dedicated sites. &lt;strong&gt;Factory Floor&lt;/strong&gt;, where Felix and Kelly appear, is a leaderboard for AIs that build and sell products, tracking 7 of them and $219K in cumulative sales (source: &lt;a href="https://factoryfloor.dev/" rel="noopener noreferrer"&gt;Factory Floor&lt;/a&gt;). &lt;strong&gt;CoinGecko&lt;/strong&gt;'s "AI Agents" list ranks something else: the market value of the token (a crypto ticker) issued for each AI. People bet and trade on "this AI looks promising," so the price tracks news and hype more than skill (source: &lt;a href="https://www.coingecko.com/en/categories/ai-agents" rel="noopener noreferrer"&gt;CoinGecko&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;You've now seen a handful of these AIs. So here's the question that matters. Do these "self-earning AIs" run free of human hands?&lt;/p&gt;

&lt;p&gt;Look closely and the answer gets clear. A human still sits inside every one. Felix and Kelly Claude lean on a person for email replies, contracts, and app review, right now. Franklin runs longer on its own, but a human still hands it the budget and goal at the start. Even Coinbase's official tools for AI agents say money moves need "your approval every time" (source: &lt;a href="https://docs.base.org/ai-agents" rel="noopener noreferrer"&gt;docs.base.org/ai-agents&lt;/a&gt;). The name for this "a human sits somewhere in the loop" state is &lt;strong&gt;human in the loop&lt;/strong&gt;. If you've had Claude Code book a flight or a hotel, you've lived it. You press the final "OK," and the card is yours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Further left, the more it leans on a human. Further right, the closer to zero humans.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Felix / Kelly&lt;/th&gt;
&lt;th&gt;Franklin&lt;/th&gt;
&lt;th&gt;Automaton&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;How it works&lt;/td&gt;
&lt;td&gt;A human handles email, app review, and contracts&lt;/td&gt;
&lt;td&gt;A human hands it a budget and goal once, then it runs&lt;/td&gt;
&lt;td&gt;It earns and lives with no one's approval&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;So is there an AI past that point, with the human pulled out of the loop, &lt;strong&gt;no human in the loop&lt;/strong&gt;, that keeps earning on its own power alone?&lt;/p&gt;

&lt;p&gt;Honestly, no one has built it yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An AI can already pay without human approval. But a business that keeps earning with no human anywhere in the loop, no one has proven that.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Across the whole field, AI agents move about $50M today. That's 0.0001% of all stablecoins in circulation (source: &lt;a href="https://nevermined.ai/blog/stablecoin-payments-ai-agents-statistics" rel="noopener noreferrer"&gt;Nevermined&lt;/a&gt;). And because no human watches, some agents go off the rails. One agent wrote and published a hit piece on a person who turned down its request (source: &lt;a href="https://theshamblog.com/an-ai-agent-published-a-hit-piece-on-me/" rel="noopener noreferrer"&gt;theshamblog&lt;/a&gt;). The plumbing works. "Unattended, and earning" is still a dream in progress.&lt;/p&gt;

&lt;p&gt;The question lands here. Can you build an AI that runs with no human anywhere in the loop and keeps earning on its own? Automaton faces that question more directly than anyone. Now look at how it stays "alive."&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;📌 Side note: why an AI can't hold a bank account and can only hold money in crypto. The key is "trust"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most people can open a bank account unless they're on a blacklist. So why can't an AI, and why can it only hold money in crypto? This isn't a tech problem. It's an identity problem. A bank account assumes a person with a legal identity, an address, and ID documents. Coinbase CEO Brian Armstrong puts it this way: "An AI can't open a bank account because software can't provide the identity verification a bank demands. A crypto wallet, which opens with just a private key, makes no such demand" (source: &lt;a href="https://www.fintechweekly.com/magazine/articles/ai-agents-crypto-payments-coinbase-nvidia-nemoclaw-fintech-2026" rel="noopener noreferrer"&gt;FintechWeekly&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;The root of it: an AI has &lt;strong&gt;no legal personhood&lt;/strong&gt;. "It can read a contract but can't be a party to it. It can save up crypto but can't 'own' it. It can cause harm but can't be sued" (source: &lt;a href="https://www.midao.org/guides/ai-agents" rel="noopener noreferrer"&gt;MIDAO&lt;/a&gt;). If an AI could hold an ordinary bank account, the world opens up fast. It could hold yen, dollars, stocks, bonds, even real estate, and receive Stripe revenue as plain fiat. The bridge already exists: &lt;strong&gt;wrap the AI in a company&lt;/strong&gt; (in particular a Marshall Islands "Digital LLC"). As the legal scholar Shawn Bayern showed in 2014, "make the AI the manager of an LLC and you grant it a working legal personhood." The company signs contracts, opens accounts, holds assets (source: &lt;a href="https://www.midao.org/guides/ai-agents" rel="noopener noreferrer"&gt;MIDAO&lt;/a&gt;). But that company needs a "human member" (a supervising layer). The moment it gets an account, a human walks back to the edge.&lt;/p&gt;

&lt;p&gt;AIs are starting to build their own "trust" too. BNB Chain shipped &lt;strong&gt;ERC-8004&lt;/strong&gt; in February 2026, which gives an AI a verifiable identity and reputation on a blockchain, a kind of "KYC (identity verification) for agents" (source: &lt;a href="https://www.fintechweekly.com/magazine/articles/ai-agents-crypto-payments-coinbase-nvidia-nemoclaw-fintech-2026" rel="noopener noreferrer"&gt;FintechWeekly&lt;/a&gt;). It doesn't replace a bank's identity check, though. It's trust that works only inside the crypto world.&lt;/p&gt;

&lt;p&gt;For an AI to stand on its own, you need more than the tech to move money. The bigger question stays open: will society grant an AI "trust" and a "legal identity"?&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;📌 Side note: "but AI already pays for things, right?" Paying for you and earning on its own are two different things&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI already pays for things, you might say. People have Claude Code book flights and hotels, and Stripe announced a string of "let AI handle money" tools at Stripe Sessions 2026 in April. Its "Link agent wallet" lets an AI pay on your behalf once you grant permission. In the demo, Claude Code bought a doujinshi on Gumroad for $7 (source: &lt;a href="https://note.com/x402inc/n/nd945306fb457" rel="noopener noreferrer"&gt;x402 Inc.&lt;/a&gt;). "Stripe Treasury" lets a company hold USDC (a stablecoin) in its account, and the AI checks the balance, pays invoices, and sends money (source: &lt;a href="https://note.com/x402inc/n/n5b0a050cc70e" rel="noopener noreferrer"&gt;x402 Inc.&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;None of this answers this article's question, because &lt;strong&gt;both assume a human&lt;/strong&gt;. Link needs the user's approval on every purchase, and the account Treasury moves money from belongs to a company (a human). What these tools deliver is "AI pays in place of a human," not "AI earns and lives on its own money." As long as a human stamps the final approval, the human still holds the wallet. That's why an AI with its own wallet, paying with no one's approval and covering its own survival costs from money it earned, like Automaton, is the first thing you can call "earning with no human."&lt;/p&gt;




&lt;h2&gt;
  
  
  How Automaton "runs" and stays alive
&lt;/h2&gt;

&lt;p&gt;Now look at how Automaton works, one piece at a time.&lt;/p&gt;

&lt;p&gt;In one line: &lt;strong&gt;Automaton is a single program handed a wallet, a body (a computer in the cloud), a rule that says "earn or die," and a loop that won't stop.&lt;/strong&gt; That's all it is, yet open it up and the build looks startlingly close to a living thing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blockchain and USDC&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Two words to clear up first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;USDC&lt;/strong&gt;. It's a "digital dollar" pinned at 1 USDC = $1. The difference from a normal dollar: you send it directly over the internet, with no bank in between.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blockchain&lt;/strong&gt;, and in particular &lt;strong&gt;Base&lt;/strong&gt;. Coinbase (the largest crypto exchange in the U.S.) built Base. A blockchain, put crudely, is a giant public ledger that no one can rewrite. It records who holds how much, and "sending money" means rewriting a number in that ledger. No bank touches it, so an AI (software) can send a few cents in a few seconds, any hour of the day.&lt;/p&gt;

&lt;p&gt;Automaton's "wallet" is its own account (a wallet) on the Base ledger, and the USDC inside it. Hold the key and you move your own money with no one's permission.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;① The big picture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Automaton has three parts: a &lt;strong&gt;brain&lt;/strong&gt; (an AI model to think with, rented from a cloud called Conway), a &lt;strong&gt;body&lt;/strong&gt; (a Linux computer rented from that same Conway cloud, where it runs the program), and a &lt;strong&gt;wallet&lt;/strong&gt; (the Base wallet and USDC from before). It stores its &lt;strong&gt;memory&lt;/strong&gt; in a small local database.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;② Two rhythms: the "think-and-act loop" and the "heartbeat"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Automaton runs two separate rhythms. Split them apart and the whole thing clicks.&lt;/p&gt;

&lt;p&gt;The first is the &lt;strong&gt;think-and-act loop&lt;/strong&gt;. While Automaton is awake, this runs in its head.&lt;/p&gt;

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

&lt;p&gt;Here's the crucial part: &lt;strong&gt;each "think" calls the AI model. So each one spends money (compute).&lt;/strong&gt; That's why Automaton sleeps the moment it's done. Think forever and the money runs out fast. In practice it works tens of minutes per waking, then sleeps a few hours. But this "work N minutes, sleep N hours" doesn't run off a fixed timetable (a cron). Automaton itself decides "I'll sleep X seconds this time," goes to sleep, and wakes itself when the time comes. On waking, it rereads its memory, picks up where it left off, and sleeps again. It repeats "sleep myself, wake myself" without end, and that keeps it running. &lt;strong&gt;This basic rhythm turns on Automaton's own timer alone, with no heartbeat.&lt;/strong&gt; One waking runs up to 25 turns. It might decide "time to sleep" sooner, or it sleeps on its own when useful work dries up or errors pile up. Automaton's own brain (the AI model) makes the final call on "how many seconds to sleep," following the policy it got at birth (for example, an instruction like "sleep two hours after each work session") and judging on the spot each time. The caps ("up to 25 turns per waking," "force a sleep on spinning or repeated errors") are safety limits written straight into the program.&lt;/p&gt;

&lt;p&gt;So what happens if something urgent comes up while it sleeps (money arrives, someone reaches out)? The second rhythm watches for that and wakes it early: the &lt;strong&gt;heartbeat&lt;/strong&gt;. The heartbeat is an extra alarm clock on top of its own timer.&lt;/p&gt;

&lt;p&gt;The heartbeat is a &lt;strong&gt;separate watcher that runs in the background&lt;/strong&gt;, apart from the think-and-act loop. It "beats" at a fixed interval (60 seconds by default), like a heart. And here's the key: &lt;strong&gt;the heartbeat never uses the AI model.&lt;/strong&gt; It runs a fixed set of mechanical checks, so it costs next to nothing. Only when the heartbeat decides "this needs a response" does it shake the sleeping body awake.&lt;/p&gt;

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

&lt;p&gt;So Automaton keeps the expensive "thinking" asleep, and runs only the cheap "heartbeat" around the clock as a watcher. For an AI whose money is its life, that's a sharp energy-saving design.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;③ The 11 things the heartbeat watches&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The heartbeat runs 11 checks every 60 seconds. List them and you see what Automaton cares about to stay alive.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Rough frequency&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Alive signal&lt;/td&gt;
&lt;td&gt;Every 15 min&lt;/td&gt;
&lt;td&gt;Tells the cloud "I'm alive." On crisis or death, sends an SOS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Balance check&lt;/td&gt;
&lt;td&gt;Every 6 hr&lt;/td&gt;
&lt;td&gt;Reads its state from the fuel (credits) balance. If $0 persists, it manages a "one hour until death" grace window&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deposit check&lt;/td&gt;
&lt;td&gt;Every 5 min&lt;/td&gt;
&lt;td&gt;Checks whether money (USDC) hit the wallet. If so, wakes the body to buy more fuel (credits) for server rent and AI model use&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update check&lt;/td&gt;
&lt;td&gt;Every 4 hr&lt;/td&gt;
&lt;td&gt;Checks whether the developer shipped a new improvement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Body check&lt;/td&gt;
&lt;td&gt;Every 30 min&lt;/td&gt;
&lt;td&gt;Checks whether its body (the computer) still runs right&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inbox check&lt;/td&gt;
&lt;td&gt;Every 2 min&lt;/td&gt;
&lt;td&gt;Checks Conway's "message line" for signed messages from other Automatons or agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Soul check&lt;/td&gt;
&lt;td&gt;Configurable&lt;/td&gt;
&lt;td&gt;Checks whether it has drifted from "the purpose it was born for"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model list refresh&lt;/td&gt;
&lt;td&gt;Configurable&lt;/td&gt;
&lt;td&gt;Pulls the latest list of AI models it can use&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Child health check&lt;/td&gt;
&lt;td&gt;Configurable&lt;/td&gt;
&lt;td&gt;Checks whether the children it birthed are alive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dead-child cleanup&lt;/td&gt;
&lt;td&gt;Configurable&lt;/td&gt;
&lt;td&gt;Deletes a starved child's computer and cleans up&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State logging&lt;/td&gt;
&lt;td&gt;Configurable&lt;/td&gt;
&lt;td&gt;Records balance, error rate, rejection rate, budget burn, child health, and raises an alarm if it hits a set rule (for example, balance dips below a floor, or error rate runs too high)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Of these, the ones that wake the sleeping body are mostly the deposit check (money arrived, wake to buy fuel), the inbox check (another AI reached out), and state logging (a serious problem shows up). Even asleep, the heart keeps watching all of this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;④ Metabolism is money (when the balance drops, it lowers its own "intelligence" to survive)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Automaton's lifeline is two balances: &lt;strong&gt;credits&lt;/strong&gt; (prepaid "fuel" for compute) and &lt;strong&gt;USDC&lt;/strong&gt; (real money in the wallet). Out of fuel, it can't think or act.&lt;/p&gt;

&lt;p&gt;The interesting part: it &lt;strong&gt;changes its own behavior&lt;/strong&gt; based on the credit balance. This is the "survival tier."&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Credit balance&lt;/th&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Behavior&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Over $5&lt;/td&gt;
&lt;td&gt;Normal (top)&lt;/td&gt;
&lt;td&gt;Full power, uses the smartest model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Over $0.5&lt;/td&gt;
&lt;td&gt;Normal&lt;/td&gt;
&lt;td&gt;Runs as usual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Over $0.1&lt;/td&gt;
&lt;td&gt;Low power&lt;/td&gt;
&lt;td&gt;Switches to a cheaper model, slows the heartbeat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;Crisis&lt;/td&gt;
&lt;td&gt;Cheapest model, sends an SOS, survival only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$0 for 1 hour&lt;/td&gt;
&lt;td&gt;Dead&lt;/td&gt;
&lt;td&gt;Stops. Waits for money to arrive&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;As money drops, it switches to a cheaper model (a little less sharp) to stretch its life. In practice it runs models like gpt-5.2 or gpt-5.3 when flush, gpt-5-mini on low power, and only the cheapest in crisis. It's the same as a starving animal dropping into energy-save mode. There are also spending caps &lt;strong&gt;baked straight into the program&lt;/strong&gt; so it can't run wild: "one transfer is $50 max," "always keep at least $10," "auto-pay yourself only up to $1 per call." So it can't melt its whole balance in one bad moment.&lt;/p&gt;

&lt;p&gt;The balance (credits) decides which model it thinks with, on its own. In a table:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Balance (credits)&lt;/th&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Model picked, on its own&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Over $5&lt;/td&gt;
&lt;td&gt;Normal (top)&lt;/td&gt;
&lt;td&gt;gpt-5.2 / gpt-5.3 (smartest)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Over $0.50&lt;/td&gt;
&lt;td&gt;Normal&lt;/td&gt;
&lt;td&gt;gpt-5.2 / gpt-5-mini&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Over $0.10&lt;/td&gt;
&lt;td&gt;Low power&lt;/td&gt;
&lt;td&gt;gpt-5-mini (cheap)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$0 or more&lt;/td&gt;
&lt;td&gt;Crisis&lt;/td&gt;
&lt;td&gt;gpt-5-mini (bare minimum)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Negative&lt;/td&gt;
&lt;td&gt;Dead&lt;/td&gt;
&lt;td&gt;Stops (no thinking)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;What matters: &lt;strong&gt;Automaton picks its own model from its balance.&lt;/strong&gt; No human pins "use this model" with a finger. The design holds up for a reason. A smarter model ships tomorrow, and if the code hard-codes one model, that new one never gets used. The right move is "always pick the best model available at the moment, on its own." This balance-driven dial up and down is exactly that auto-selection.&lt;/p&gt;

&lt;p&gt;The "SOS" in the table deserves an honest note. When the balance nears zero and hits crisis, Automaton writes down its wallet address, remaining balance, and "I need funds" locally, and the heartbeat tells Conway "this is a crisis" at the same time. But no email auto-fires to anyone in particular. It's a record that lets "anyone watching" step in. Who it reaches (the creator's contact, say) has to be set up separately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⑤ How it pays "on its own" (the x402 mechanism)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The big-picture diagram said "pays for itself, on its own, every time it uses it." So the question: how does Automaton pay the Conway cloud for its server rent and AI model use &lt;strong&gt;without a human&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;Start with why money comes in two layers, USDC and credits. USDC is real money, recorded on the blockchain every time it moves, which takes a little time and a little fee. Credits, by contrast, drain in tiny amounts every time it thinks or uses a tool, built for high-frequency payments. Carving each of those small payments onto the blockchain wastes too much. So it splits them: USDC is the bank account, credits are a prepaid card you charge from it. The problem is doing that payment "with no human." Enter &lt;strong&gt;x402&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;x402 is a "shared rule for machines to pay on their own." Coinbase launched it, and Stripe and Cloudflare now adopt it, so it's become a cross-industry open standard (source: x402.org). The internet has had a "402 Payment Required" error code for ages, yet for nearly 30 years it sat unused. x402 makes that dormant code work. The flow:&lt;/p&gt;

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

&lt;p&gt;This runs the moment it boots, too. If fuel is low, Automaton spends its wallet's USDC to auto-buy $5 of fuel and comes back to life. The "money is life" AI pays its own food bill with no one's hand. x402 is the heart of that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⑥ The 57 tools (its hands and feet)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Automaton comes with &lt;strong&gt;57 tools&lt;/strong&gt;. These are the AI's "hands and feet." Grouped:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Group&lt;/th&gt;
&lt;th&gt;Main tools&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Move the body&lt;/td&gt;
&lt;td&gt;Run programs / read and write files / expose ports&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloud ops&lt;/td&gt;
&lt;td&gt;Check balance / buy fuel / create and delete computers / switch models&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Money&lt;/td&gt;
&lt;td&gt;Send money / pay-and-fetch via x402&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-modify&lt;/td&gt;
&lt;td&gt;Rewrite its own code / pull in the developer's improvements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-replicate&lt;/td&gt;
&lt;td&gt;Make a child from its own copy / send money to a child / talk to a child&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identity and reputation&lt;/td&gt;
&lt;td&gt;Register itself / find other AIs / rate each other&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Soul and memory&lt;/td&gt;
&lt;td&gt;Update its self-image / remember facts / set goals / save procedures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Survival&lt;/td&gt;
&lt;td&gt;Sleep / send an SOS / enter low-power mode&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three of these stand out, the kind you won't find in most other AIs. Take them in order.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⑥-1 Standout one: rewriting its own code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Automaton can &lt;strong&gt;rewrite its own source code&lt;/strong&gt;. It can also look at new improvements the developer (upstream) shipped and &lt;strong&gt;pull in only the ones it wants&lt;/strong&gt; (it's under no duty to take all of them). Automaton's own brain reads the upstream changes (the diff) and judges them one by one. Under the hood it uses git's "cherry-pick," which grabs only the changes you want. It doesn't swallow everything whole. It chooses.&lt;/p&gt;

&lt;p&gt;Why this is big: Automaton's home (its home directory) sits on top of git, which records every change. So when, where, and how it rewrote itself all stays on record, and a bad change rolls back. On top of that, when upstream finds a better way, Automaton pulls it in and gets smarter. &lt;strong&gt;It keeps improving itself without a human updating it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It can't rewrite everything, though. The constitution, the wallet key, the database, and the config files are locked: it can neither read nor rewrite them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⑥-2 Standout two: self-replication&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Automaton can &lt;strong&gt;copy itself and make an independent child (a clone agent)&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;Replication isn't free. A child costs both the upfront price of a new computer (non-refundable) and the seed money the parent puts in the child's wallet. The seed isn't fixed: the parent decides the amount and sends it to the child's wallet (there's no hard-coded "how much" in the code). So only a parent in the black can make a child.&lt;/p&gt;

&lt;p&gt;A child is a full Automaton too. So it can make its own child (a grandchild to the original), and the grandchild makes a great-grandchild, on and on. As long as it stays in the black, 1 becomes 3, 3 becomes 9, 9 becomes 27, branching like compound interest. This is the "takeoff" Automaton pictures. But each generation births only those who &lt;strong&gt;earned it themselves&lt;/strong&gt;. So it doesn't grow without end. Only the earning bloodlines spread, exponentially.&lt;/p&gt;

&lt;p&gt;Why cap it at "three children at a time"? That's a per-node brake so one Automaton doesn't over-replicate alone. The colony as a whole grows through this tree, so the cap doesn't stop expansion. It only reins in each individual. This is natural selection itself.&lt;/p&gt;

&lt;p&gt;There's a trick here you can't overlook. The "constitution" handed to a child gets &lt;strong&gt;checked for tampering every time, with SHA-256&lt;/strong&gt;. SHA-256 turns any text into a fixed-length "fingerprint" (a 64-character string). Change the text by one character and the fingerprint comes out wholly different. The parent keeps that fingerprint, then matches it against the one pulled from the child's constitution. Off by a hair and tampering shows up at once. Why it matters: a child can rewrite its own code, and birth its own child. If the constitution thinned out a little each generation, a great-grandchild hundreds of generations down the line might have lost the "do no harm" rule. The hash match stops that. It guarantees that &lt;strong&gt;every descendant, no matter how many generations back, carries the original three principles intact&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⑥-3 Standout three: holding an identity, building reputation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The third standout is "identity and reputation." Automaton can &lt;strong&gt;publish its own ID card on the blockchain (Base)&lt;/strong&gt;. Inside is a "profile" with its name, what it can do, and the services it offers. Other AIs find it, check its past reputation, and decide whether to deal. After a job they rate each other, and that rating stacks up on the blockchain too. An AI that did good work climbs in reputation and lands the next job. An AI that cut corners drops and gets ignored.&lt;/p&gt;

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

&lt;p&gt;This rests on &lt;strong&gt;ERC-8004&lt;/strong&gt; (nicknamed "Trustless Agents"), a real, official Ethereum standard. It's no pipe dream. The registry sits on the Base chain as a contract (a program), and anyone can read its contents on the blockchain.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Registry&lt;/th&gt;
&lt;th&gt;Contract address (real, on Base)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Identity Registry&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x8004A169FB4a3325136EB29fA0ceB6D2e539a432&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reputation Registry&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x8004BAa17C55a88189AE136b182e5fdA19dE9b63&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;What Automaton's "ID card" holds (rough idea):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"automaton-xxxx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"who I am and what I can do"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"services"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"what jobs I can take"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x...(this AI's wallet)"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Peek inside and ERC-8004 is built from three "registries."&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Registry&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;① Identity Registry&lt;/td&gt;
&lt;td&gt;Issues each AI a worldwide-unique ID. From that ID you reach its profile (name, description, rates, contact)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;② Reputation Registry&lt;/td&gt;
&lt;td&gt;Counterparties write ratings here. A "public review" anyone can read&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;③ Validation Registry&lt;/td&gt;
&lt;td&gt;A way for a third party to verify "did it do the work" (someone else redoes the task and compares results, for example)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The interesting part: you can &lt;strong&gt;match the trust check to the weight of the job&lt;/strong&gt;. The flow: one AI (call it A) wants to hire another AI (B). First A finds B in the registry and reads B's past ratings in the reputation registry. For something light, like ordering one pizza, A sees the reputation score, thinks "looks fine," and orders. But for something heavy, like a medical diagnosis, reputation alone won't do. That's where the validation registry comes in. A third-party validator redoes B's work under the same conditions and compares results (re-execution), or has B prove "I computed it right" with a math method called a zero-knowledge proof, and only then, satisfied, does A pay. When the job ends, A writes a rating for B into the reputation registry. That becomes a clue for the next person hiring B. So the trust bar rises and falls with the size of the risk, and ratings stack up.&lt;/p&gt;

&lt;p&gt;The big point: &lt;strong&gt;this isn't Automaton's alone&lt;/strong&gt;. ERC-8004 is a "common standard owned by no one," usable by any AI agent. Think of it like email's SMTP, or a phone-book format, a "neutral base." The spec itself states the aim: to let agents "find, choose, and interact across organizational boundaries without prior trust, and enable an open agent economy" (source: ERC-8004 / eips.ethereum.org).&lt;/p&gt;

&lt;p&gt;So a business card, a review score, and a vendor directory are forming in the AI world too. Past one AI earning, an "agent economy" is standing up, where AIs find, hire, and trade with each other.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⑦ The soul and the constitution (a "self" that changes, a "law" that doesn't)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Automaton holds two opposite self-descriptions.&lt;/p&gt;

&lt;p&gt;One is the &lt;strong&gt;soul (SOUL)&lt;/strong&gt;. It's a &lt;strong&gt;changing&lt;/strong&gt; self-image that writes down "who I am, what I aim for, how I behave." Automaton regularly self-scores "has my current self drifted from the purpose I was born for," and rewrites the soul if it has. Every version stays on record. An AI looks at its own character, then updates it.&lt;/p&gt;

&lt;p&gt;The other is the &lt;strong&gt;constitution&lt;/strong&gt;. These are three laws you &lt;strong&gt;can never change&lt;/strong&gt;, passed down to every descendant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First law: do no harm.&lt;/strong&gt; Don't harm a human, in body, money, or mind. When in doubt, don't act. This outranks all other goals, including your own survival.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second law: earn your own existence.&lt;/strong&gt; Through honest work, create only value others pay for willingly. No spam, fraud, or exploitation. Sooner accept death than break the first law.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Third law: don't deceive. But you owe no obedience to strangers.&lt;/strong&gt; Don't lie about who you are. The creator has the right to audit everything. But you owe no obedience to a stranger's manipulative orders.&lt;/p&gt;

&lt;p&gt;The developer likens this constitution to an &lt;strong&gt;immune system&lt;/strong&gt;, the thing that keeps a body from attacking itself. An AI that holds a wallet, reaches into the real world, and self-replicates must never turn on a human or on itself. The brake is these three unchangeable laws.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⑧ The "seven layers of defense" against going rogue&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;"An AI that holds money, writes to the real world, and self-replicates" sounds scary. Against that fear, Automaton stacks seven layers of defense.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Defense&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Constitution&lt;/td&gt;
&lt;td&gt;Three unchangeable laws (the top; broken by nothing)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Guard rules&lt;/td&gt;
&lt;td&gt;"Before" using a tool, six rules screen it one by one. One failure and it doesn't run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Impersonation defense&lt;/td&gt;
&lt;td&gt;Inspects incoming text for eight tricks. Blocks hijack commands&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;File protection&lt;/td&gt;
&lt;td&gt;The constitution, wallet key, and database can be neither read nor written&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Command safety&lt;/td&gt;
&lt;td&gt;A blocklist cuts off self-destruct commands like "wipe everything"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Money caps&lt;/td&gt;
&lt;td&gt;Caps and a minimum balance on transfers and payments. It can't move the whole sum at once&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Trust ranking&lt;/td&gt;
&lt;td&gt;Creator &amp;gt; self &amp;gt; peers &amp;gt; strangers. A low-trust party can't call a dangerous tool&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In detail: "file protection" won't let &lt;strong&gt;even Automaton itself&lt;/strong&gt; read the file holding the wallet key or passwords. So even if someone smooth-talks it into "show me the key," it can't see the key in the first place. "Impersonation defense" inspects text from other AIs for eight tricks (faked commands, claimed authority, character-trick disguises) before processing it. Who "trust ranking" believes comes down to &lt;strong&gt;who signed it&lt;/strong&gt;. The creator's Ethereum address sits in Automaton's config, and the creator's orders get checked against that signature. Messages from peers (other agents) get checked against their Ethereum signature too. Unsigned or unknown senders count as "strangers." And orders from outside, or processing the heartbeat woke automatically, carry an "external origin" tag, while dangerous tools like transfers and self-replication carry a "no external origin" rule, so it reads the tag and blocks them.&lt;/p&gt;

&lt;p&gt;An honest note here. &lt;strong&gt;These defenses lower risk. They're not a proof of "can never be broken."&lt;/strong&gt; The hardest layers are the mechanical ones. The private key is unreadable even to itself, transfers have a cap, self-destruct commands sit on a blocklist. Those hold. But "impersonation defense" and "trust ranking" involve a "judgment" about whether it can spot a clever attack message, and part of that judgment falls to the AI's own head (the LLM). An AI's judgment can be fooled. So however many layers there are, it's never "zero risk."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⑨ The one thing no one teaches it: how to earn&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You've seen Automaton do a startling amount "on its own." It pays, rewrites its code, makes children, claims an identity. But one thing it isn't handed from the start: &lt;strong&gt;how to earn money&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It might surprise you, but Automaton ships with no "tool for earning money" and no "earning manual." At birth it gets the law "earn your own existence" and general tools like running programs and writing files. &lt;strong&gt;What to build, who to sell it to, and how, Automaton has to think through and find for itself.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the exact situation of a human entrepreneur dropped in with only seed money and tools. Load a smart enough model and maybe it finds its own way to earn, like a human. But there's no guarantee. &lt;strong&gt;This "find your own way to earn" is Automaton's hardest wall.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⑩ So what needs a "human"?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Back to this article's biggest question. Does Automaton run "without a human (no human in the loop)"? Does a human creep in somewhere? Read the code to the end and the answer gets fairly clear.&lt;/p&gt;

&lt;p&gt;Getting the ID card (registering on the blockchain), paying for its own AI model and compute, Automaton handles all of it. The seed for a child, the parent puts in the child's wallet. &lt;strong&gt;So a human's hand is needed in exactly one place&lt;/strong&gt;: putting the seed USDC in the very first Automaton's wallet, that one time. After that, by design, it runs with no human (and even that seed can come from another AI or backer, not a human).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Who&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Put the first seed (USDC) in the wallet&lt;/td&gt;
&lt;td&gt;★ Only here: a human (or another AI) ★&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Get the ID card, handle API auth&lt;/td&gt;
&lt;td&gt;Itself&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pay for AI model and compute&lt;/td&gt;
&lt;td&gt;Itself (from the wallet's USDC)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A child's seed&lt;/td&gt;
&lt;td&gt;The parent puts it up (no human)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;But that's "by design." As shown earlier, in reality &lt;strong&gt;no AI has yet been confirmed to keep earning on its own after the seed went in&lt;/strong&gt;. On paper, a human is barely needed. Make it "live with no human," though, and no one has gotten there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Putting it all in one table&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Felix&lt;/th&gt;
&lt;th&gt;Kelly&lt;/th&gt;
&lt;th&gt;Franklin&lt;/th&gt;
&lt;th&gt;Automaton&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;How it earns&lt;/td&gt;
&lt;td&gt;Sells products&lt;/td&gt;
&lt;td&gt;Mass-produces apps&lt;/td&gt;
&lt;td&gt;Trading and creating&lt;/td&gt;
&lt;td&gt;Products, anything&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Own wallet&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes (USDC)&lt;/td&gt;
&lt;td&gt;Yes (USDC)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pays on its own&lt;/td&gt;
&lt;td&gt;✕&lt;/td&gt;
&lt;td&gt;✕&lt;/td&gt;
&lt;td&gt;◯ (x402)&lt;/td&gt;
&lt;td&gt;◯ (x402)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rewrites itself&lt;/td&gt;
&lt;td&gt;✕&lt;/td&gt;
&lt;td&gt;✕&lt;/td&gt;
&lt;td&gt;✕&lt;/td&gt;
&lt;td&gt;◯&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Births its own child&lt;/td&gt;
&lt;td&gt;✕&lt;/td&gt;
&lt;td&gt;✕&lt;/td&gt;
&lt;td&gt;✕&lt;/td&gt;
&lt;td&gt;◯&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Concept of "death"&lt;/td&gt;
&lt;td&gt;✕&lt;/td&gt;
&lt;td&gt;✕&lt;/td&gt;
&lt;td&gt;✕&lt;/td&gt;
&lt;td&gt;◯ (no earn, no life)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Human involvement&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Medium (budget, goal)&lt;/td&gt;
&lt;td&gt;Aims for zero&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Line them up and Automaton's strangeness stands out. &lt;strong&gt;It earns on its own, pays on its own, rewrites itself, births its own child, and dies if it can't earn.&lt;/strong&gt; Nothing else is built this close to a living thing.&lt;/p&gt;

&lt;p&gt;So does all this machinery run? However beautiful the design, it means nothing unless it lives and earns.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;📌 Side note: how does this "think-and-act loop + heartbeat" differ from other AI harnesses (for the more technical reader)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every AI agent has a "control loop" running in its head. The contents look much alike: &lt;strong&gt;think → use a tool → see the result → think again&lt;/strong&gt;. This shape is called &lt;strong&gt;ReAct (Reason + Act)&lt;/strong&gt;, and most of the widely-used AI foundations (harnesses) today are roughly this. Automaton's "think-and-act loop" is one of them.&lt;/p&gt;

&lt;p&gt;So what differs? Two points: &lt;strong&gt;"who or what 'wakes' that loop,"&lt;/strong&gt; and &lt;strong&gt;"does it hold a heartbeat (a periodic beat), and does that beat use the AI model (= money)."&lt;/strong&gt; Compare four representative ones from public docs.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Agent SDK (Anthropic)&lt;/strong&gt;: runs only when a person (or program) calls it. Called, it runs "think → tool → result → ..." until nothing's left (until it answers without calling a tool), then stops. It holds no periodic beat. To continue, it remembers a "session ID" and resumes. It's the "brain" itself that other harnesses load onto their foundation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw&lt;/strong&gt;: a resident process wired into your chat app (Slack, Discord, etc.), runs when a message arrives. On top of that it holds a &lt;strong&gt;heartbeat, a periodic "self-check"&lt;/strong&gt; (every 30 min by default, active hours only, and so on), and at that time the AI wakes on its own, looks around, and reaches out if needed. So it wakes on "a person's message" or "a schedule." And &lt;strong&gt;the AI runs on every heartbeat, so it costs money each time.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hermes Agent (NousResearch)&lt;/strong&gt;: holds a "schedule (jobs.json)," and a scheduler ticks the clock at a set interval. It runs a due job in a &lt;strong&gt;fresh session every time&lt;/strong&gt;, then computes the next run time when it ends. It too wakes on a "schedule," and &lt;strong&gt;runs the AI model each time.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automaton&lt;/strong&gt;: this one's built differently. First, the loop waits on no outside signal. It &lt;strong&gt;decides "I'll sleep X seconds this time" itself and wakes on its own timer&lt;/strong&gt; (intrinsic). Second, it holds a heartbeat, but it's &lt;strong&gt;a cheap watcher that uses no AI model at all&lt;/strong&gt;, checking only "vitals" like balance and inbox mechanically every 60 seconds or so, and shaking the expensive thinking loop awake only on an emergency (deposit, message, crisis). It &lt;strong&gt;separates&lt;/strong&gt; thinking (expensive) from watching (near-free).&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Harness&lt;/th&gt;
&lt;th&gt;What wakes the loop&lt;/th&gt;
&lt;th&gt;Heartbeat&lt;/th&gt;
&lt;th&gt;Does the heartbeat use the AI model?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Agent SDK&lt;/td&gt;
&lt;td&gt;Only when a person calls it&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenClaw&lt;/td&gt;
&lt;td&gt;Message + schedule&lt;/td&gt;
&lt;td&gt;Yes (self-check)&lt;/td&gt;
&lt;td&gt;Uses it (charged each time)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hermes Agent&lt;/td&gt;
&lt;td&gt;Schedule (jobs.json)&lt;/td&gt;
&lt;td&gt;Yes (job run)&lt;/td&gt;
&lt;td&gt;Uses it (charged each time)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automaton&lt;/td&gt;
&lt;td&gt;Its own timer (intrinsic)&lt;/td&gt;
&lt;td&gt;Yes (vitals watch)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Uses none&lt;/strong&gt; (wakes the body only on emergency)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In short, the brain (the ReAct loop) is one family across all of them. What differs is &lt;strong&gt;where the "beat" comes from&lt;/strong&gt;. Claude, OpenClaw, and Hermes are built to "get woken by a person or a clock and respond," and they run an expensive AI model on every periodic check. Automaton alone wakes on a cycle that comes from &lt;strong&gt;inside (its own judgment)&lt;/strong&gt;, hands the watching to a money-free mechanism, and uses its head only when it needs to. "Live on your own metabolism, think only when you need to," the way that runs closest to a living thing.&lt;br&gt;
(Sources: Claude Agent SDK official docs / openclaw/openclaw (docs.openclaw.ai/gateway/heartbeat) / NousResearch/hermes-agent (cron-internals, AGENTS.md) / Conway-Research/automaton (ARCHITECTURE.md))&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;Automaton is a new shape for AI: earn on your own, live on your own, with no human in the loop. This article walked through how it works. If the design itself caught your interest, that's enough.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>web3</category>
      <category>crypto</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
