<?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: AI x Crypto Systems</title>
    <description>The latest articles on DEV Community by AI x Crypto Systems (@aicryptosystems).</description>
    <link>https://dev.to/aicryptosystems</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3717453%2Ffc1b63a0-d90d-4437-bf3f-b3b6db13ce97.jpg</url>
      <title>DEV Community: AI x Crypto Systems</title>
      <link>https://dev.to/aicryptosystems</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aicryptosystems"/>
    <language>en</language>
    <item>
      <title>Private Agent Rate Limits: Where the Account Link Disappears</title>
      <dc:creator>AI x Crypto Systems</dc:creator>
      <pubDate>Fri, 12 Jun 2026 08:30:28 +0000</pubDate>
      <link>https://dev.to/aicryptosystems/private-agent-rate-limits-where-the-account-link-disappears-205h</link>
      <guid>https://dev.to/aicryptosystems/private-agent-rate-limits-where-the-account-link-disappears-205h</guid>
      <description>&lt;h1&gt;
  
  
  Private Agent Rate Limits
&lt;/h1&gt;

&lt;p&gt;Draft status: unpublished DEV API draft for rendered QA only. This is not public publication approval, queue approval, or permission to publish.&lt;/p&gt;

&lt;p&gt;Disclosure: AI tools helped with source collection, outline pressure-testing, and editorial review, but the article text and publication decision remain under human control.&lt;/p&gt;

&lt;p&gt;Crypto disclaimer: this article discusses privacy, rate limiting, and API metering as technical infrastructure. It is not investment advice, a token recommendation, a trading signal, or a claim that any protocol here is ready for production use.&lt;/p&gt;

&lt;h2&gt;
  
  
  First request
&lt;/h2&gt;

&lt;p&gt;The privacy question starts the moment a model request reaches an API with no durable account label on it. What private agent rate limits try to do is let that request prove it sits inside an allowed quota class, without dragging along the usual account, card, wallet, or login identifier on every call. The current IETF Privacy Pass draft on &lt;a href="https://www.ietf.org/archive/id/draft-ietf-privacypass-arc-crypto-01.html" rel="noopener noreferrer"&gt;Anonymous Rate-Limited Credentials Cryptography&lt;/a&gt; gives the shape worth borrowing: a credential can be presented a fixed number of times, and those presentations are meant to stay unlinkable from issuance and from each other.&lt;/p&gt;

&lt;p&gt;None of that makes the request anonymous AI. The provider still sees the work it was asked to do, when the call landed, how big the output was, how refunds behave, what policy evidence got attached, unless the product reworks those surfaces too. One account edge comes off the request. The rest of the service stays exactly where it was.&lt;/p&gt;

&lt;p&gt;Draft status matters here. The &lt;a href="https://datatracker.ietf.org/wg/privacypass/documents/" rel="noopener noreferrer"&gt;Privacy Pass working-group document list&lt;/a&gt; shows ARC as active draft work, and the cryptography document is an Internet-Draft, not a finished standard. You can learn from the boundary it draws without pretending the draft is settled infrastructure.&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.amazonaws.com%2Fuploads%2Farticles%2Fupo88989py0c36ke5gkh.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.amazonaws.com%2Fuploads%2Farticles%2Fupo88989py0c36ke5gkh.png" alt="Private agent rate limits account edge removed" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Issuer
&lt;/h2&gt;

&lt;p&gt;Before any request can prove a thing, an issuer has to hand the client a proof object for later. In ARC the server issues a credential tied to client secrets and public application information, and the client comes back later with derived proofs. The server checks a presentation without learning which issuance flow it came from.&lt;/p&gt;

&lt;p&gt;The trap is treating unlinkability as a blank check. ARC fixes a maximum number of presentations per credential, and going past that agreed limit breaks the guarantee. Privacy here rides on presentation limits, server state, and application configuration. It does not ride on the word credential.&lt;/p&gt;

&lt;p&gt;Cloudflare's engineering write-up on &lt;a href="https://blog.cloudflare.com/private-rate-limiting/" rel="noopener noreferrer"&gt;rate-limiting bots and agents with anonymous credentials&lt;/a&gt; is worth reading for deployment pressure, since it gets into state, binding, revocation, origin tradeoffs, and the bot-or-agent rate-limiting case. Keep in mind whose surface that is. One vendor describing its own engineering does not, on its own, make any single credential family the ecosystem default.&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.amazonaws.com%2Fuploads%2Farticles%2Fn08ibqx84j6pwt5o5r83.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.amazonaws.com%2Fuploads%2Farticles%2Fn08ibqx84j6pwt5o5r83.png" alt="Issuer and presentation split for anonymous credentials" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Meter
&lt;/h2&gt;

&lt;p&gt;ZK API Usage Credits push the same problem into funded API metering. The Ethereum Research proposal &lt;a href="https://ethresear.ch/t/zk-api-usage-credits-llms-and-beyond/24104" rel="noopener noreferrer"&gt;ZK API Usage Credits: LLMs and Beyond&lt;/a&gt; leans on LLM inference as its motivating case: deposit once, then make many API calls while trying not to tie each one back to the deposit or to the other calls. The credit there proves the work is covered. It is not civil identity, and the proposal is not an adopted Ethereum protocol.&lt;/p&gt;

&lt;p&gt;The way the proposal is built makes that boundary easier to audit. Initial deposit, ticket index, refund tickets, proof, nullifier, request payload, each is a separate piece of the flow. Membership, refund accounting, solvency, and RLN-style nullifier data can all carry metering. None of those fields say anything about whether prompt content, timing, output sizes, refund values, or provider logs stay private.&lt;/p&gt;

&lt;p&gt;Payment privacy and prompt privacy split right there. The metering proof can hide the link back to a depositor while the prompt sits in plain view of the inference provider. Put workplace details, location clues, private intent, or wallet context into that prompt, and no amount of quota evidence scrubs the leak.&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.amazonaws.com%2Fuploads%2Farticles%2Fsc40jexy0rcbgg2wuwh5.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.amazonaws.com%2Fuploads%2Farticles%2Fsc40jexy0rcbgg2wuwh5.png" alt="Metered credit flow separates funded capacity from prompt privacy" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Reuse
&lt;/h2&gt;

&lt;p&gt;Abuse control needs a handle for repeat use, but that handle does not have to be the user's name. The &lt;a href="https://rate-limiting-nullifier.github.io/rln-docs/" rel="noopener noreferrer"&gt;RLN documentation&lt;/a&gt; describes Rate-Limiting Nullifier as a zero-knowledge protocol for spam prevention in anonymous environments. The claim that buys you is narrow: a nullifier can cap repeated use without ever becoming a real-world identity.&lt;/p&gt;

&lt;p&gt;ARC and RLN should stay apart in your head. ARC is an anonymous credential family built around fixed-limit presentations. RLN is a nullifier-based spam-prevention primitive, a different gadget entirely. Fuse them into one invented protocol and you both overstate the evidence and make the design harder to audit.&lt;/p&gt;

&lt;p&gt;The failure event is narrow too. In the ZK API usage proposal, server-side checks around ticket indices and nullifiers can catch double-spend patterns. What that catches is a protocol event around reused capacity. It does not read intent, handle moderation, or settle legal liability.&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.amazonaws.com%2Fuploads%2Farticles%2F7o1xbsngrmdztmea7yhu.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.amazonaws.com%2Fuploads%2Farticles%2F7o1xbsngrmdztmea7yhu.png" alt="Nullifier reuse event stays narrower than identity or intent" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Side channel
&lt;/h2&gt;

&lt;p&gt;The account link can vanish while the behavioral trail stays put. Discussion around the ZK API usage proposal flags refund values, output token counts, time to first token, latency, and cache behavior as surfaces that can relink a caller. So the safe claim stays modest: a credit proof takes off one identity edge, not every statistical one.&lt;/p&gt;

&lt;p&gt;Provider telemetry is the larger product problem. A service that watches prompts, response sizes, timing, policy flags, abuse evidence, and refund values can still cluster behavior while the cryptographic proof is perfectly sound. The credential does its job. The system around it keeps fingerprinting the caller anyway.&lt;/p&gt;

&lt;p&gt;Pricing and logging choices either respect the proof or quietly undo it. Fixed input and output classes, padding, trimmed refund signals, bounded policy evidence, all of that can pull leakage down. None of it lives inside a bare credential, which is why a nullifier never stands in for privacy architecture.&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.amazonaws.com%2Fuploads%2Farticles%2F1fhjjd10c7h376cqn48l.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.amazonaws.com%2Fuploads%2Farticles%2F1fhjjd10c7h376cqn48l.png" alt="Side-channel surface map around a valid credential proof" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Ledger
&lt;/h2&gt;

&lt;p&gt;The artifact worth keeping is not a receipt table. For private agent rate limits, a leakage ledger sorts the flow by who owns each piece: the proof, the service, or policy logging.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PROOF-OWNED
credential presentation -&amp;gt; quota class, not civil identity
ticket index or nullifier -&amp;gt; reuse event, not user intent
membership proof -&amp;gt; allowed set, not prompt safety

SERVICE-OWNED
payload -&amp;gt; visible model input unless another privacy layer hides it
timing and output size -&amp;gt; correlation surface
refund signal -&amp;gt; possible behavior link

POLICY-OWNED
abuse note -&amp;gt; provider decision evidence
moderation record -&amp;gt; legal and operational surface
public claim allowed -&amp;gt; account link removed from this request
public claim refused -&amp;gt; anonymous AI user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The ledger swaps the question. Not "is the user anonymous?" but "which component owns this piece of evidence?" That swap is the whole difference between a quota proof and a privacy story. The proof can vouch that a request has capacity. The service and policy layers can still leak enough to relink the behavior behind it.&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.amazonaws.com%2Fuploads%2Farticles%2Fzp7huzbelrgs0ahdows7.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.amazonaws.com%2Fuploads%2Farticles%2Fzp7huzbelrgs0ahdows7.png" alt="Leakage ownership map for proof service and policy layers" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent
&lt;/h2&gt;

&lt;p&gt;Agent traffic is what makes the boundary worth the trouble: the calls come fast, run themselves, and sometimes cost real money. The &lt;a href="https://datatracker.ietf.org/doc/draft-rescorla-anonymous-webbotauth/" rel="noopener noreferrer"&gt;Anonymous Bot Authentication draft&lt;/a&gt; lays out a web-agent problem where services want to sort wanted, unwanted, and rate-limited automated traffic without pinning every request to a specific sender. That sits close to the API boundary here. The draft is still an individual Internet-Draft, not an endorsed standard.&lt;/p&gt;

&lt;p&gt;A credential offers a softer answer than a permanent login. The client can prove membership in an allowed class, remaining quota, or funded capacity, all without showing a durable account identifier on every call. Read that as privacy-preserving abuse control, not as a hall pass around provider rules.&lt;/p&gt;

&lt;p&gt;The hype version is easy to throw out. Autonomous agents do not automatically need a token rail, and not every AI request belongs on a blockchain. The narrower design earns its keep: a credit, credential, or nullifier can stand as evidence of capacity without ever turning into identity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Refusal
&lt;/h2&gt;

&lt;p&gt;The strongest product language for private agent rate limits is a refusal. Refuse to call the agent anonymous when all you removed was the account link. And refuse to claim the provider cannot relink requests while prompts, timing, output sizes, refunds, logs, and policy evidence are all still sitting there in view.&lt;/p&gt;

&lt;p&gt;Refuse, too, to dress up draft-level or proposal-level work as production infrastructure. ARC is active draft-level work, Anonymous Bot Authentication is an individual Internet-Draft, and ZK API Usage Credits is a proposal and discussion. Their value is that they make the boundary inspectable, not that they settle deployment reality.&lt;/p&gt;

&lt;p&gt;The final claim stays deliberately small. Private agent rate limits can let a request show quota or funded capacity without carrying a stable account label. Everything past that belongs to the rest of the architecture: prompt privacy, traffic shaping, refund design, logging discipline, policy evidence, and legal duties.&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.amazonaws.com%2Fuploads%2Farticles%2Fi2zqyooee5sbwrmcr90p.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.amazonaws.com%2Fuploads%2Farticles%2Fi2zqyooee5sbwrmcr90p.png" alt="Small claim architecture around private agent rate limits" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Google AP2: The Mandate Is Not the Payment</title>
      <dc:creator>AI x Crypto Systems</dc:creator>
      <pubDate>Wed, 10 Jun 2026 05:37:24 +0000</pubDate>
      <link>https://dev.to/aicryptosystems/google-ap2-the-mandate-is-not-the-payment-1m04</link>
      <guid>https://dev.to/aicryptosystems/google-ap2-the-mandate-is-not-the-payment-1m04</guid>
      <description>&lt;h1&gt;
  
  
  Google AP2: The Mandate Is Not the Payment
&lt;/h1&gt;

&lt;p&gt;Google AP2 is most useful when a merchant system asks the awkward question before payment: what proof says the agent was allowed to assemble this checkout? A later settlement event can be clean and still arrive too late to answer that question. For crypto payment flows, that matters because A2A x402 can move the payment conversation forward while Google AP2 keeps the authority evidence in mandates.&lt;/p&gt;

&lt;p&gt;The tempting shortcut is to debug from the bottom of the stack. A developer sees a signed payment payload, a &lt;code&gt;payment-completed&lt;/code&gt; status, and receipt metadata, then treats the purchase as explained. Google AP2 pushes the investigation upward: first identify the signed user instruction, the checkout authority, and the payment authority that made the later payment meaningful.&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.amazonaws.com%2Fuploads%2Farticles%2F246wllw76zv2us8326h3.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.amazonaws.com%2Fuploads%2Farticles%2F246wllw76zv2us8326h3.png" alt="Merchant console pausing payment until checkout authority payment authority and task correlation preconditions are checked" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Google AP2 Begins Before the Cart Closes
&lt;/h2&gt;

&lt;p&gt;Google AP2 frames agent-led commerce around authorization, authenticity, and accountability. The AP2 specification names roles such as Shopping Agent, Credential Provider, Merchant, Merchant Payment Processor, and Trusted Surface, but the important engineering move is earlier than settlement. Before a merchant accepts an agent checkout, Google AP2 asks whether the right mandate evidence exists for that checkout.&lt;/p&gt;

&lt;p&gt;In a human-present flow, Google AP2 can attach consent to a closed checkout and payment the user sees directly. In an autonomous flow, the user approves constraints first, and later mandates must stay inside those constraints. That difference is not cosmetic. It tells the verifier whether the purchase was directly approved at checkout time or bounded by prior authority.&lt;/p&gt;

&lt;p&gt;The Trusted Surface has special weight in Google AP2 because user consent cannot be treated as another generated agent message. A language model can propose a cart, summarize a merchant response, or explain a payment request. Google AP2 still needs the non-agentic consent surface and mandate evidence that a verifier can check without trusting the model's narrative.&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.amazonaws.com%2Fuploads%2Farticles%2Fflh7x1yd6la0r6gv5ay9.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.amazonaws.com%2Fuploads%2Farticles%2Fflh7x1yd6la0r6gv5ay9.png" alt="Trusted Surface approval shown as consent evidence beside a generated agent story that is not consent evidence" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Merchant Sees A Precondition, Not A Story
&lt;/h2&gt;

&lt;p&gt;Google AP2 changes the merchant-side failure mode from "the agent asked for it" to "the mandate verified for this checkout." A polished request, plausible cart, and later payment receipt do not prove the Shopping Agent was authorized to buy those items. The merchant-side question is narrower: did the Checkout Mandate secure what is being purchased?&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.amazonaws.com%2Fuploads%2Farticles%2Fgssoigsaxpgfdoiddem9.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.amazonaws.com%2Fuploads%2Farticles%2Fgssoigsaxpgfdoiddem9.png" alt="Merchant terminal blocking order completion before payment because Checkout Mandate authority is missing" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Payment authority is a separate question in Google AP2. The Payment Mandate secures payment for the checkout, while the Checkout Mandate secures the purchase itself. That split matters because a valid payment path does not automatically prove the cart matched the user's instruction, and a valid checkout mandate does not prove funds settled.&lt;/p&gt;

&lt;p&gt;AP2 receipts help reconstruct the transaction evidence picture, but Google AP2 does not turn receipts into legal outcomes or fraud guarantees. The specification's dispute evidence surface brings mandates and receipts together while leaving dispute procedures outside the protocol. Read it conservatively: Google AP2 improves the evidence available for a dispute question, but it does not settle the dispute by itself.&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.amazonaws.com%2Fuploads%2Farticles%2Fg7nw6l8ts37hrhhm6uy7.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.amazonaws.com%2Fuploads%2Farticles%2Fg7nw6l8ts37hrhhm6uy7.png" alt="Payment precheck circuit breaker holding payment until mandate verification opens the path" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A2A x402 Starts After The Precondition
&lt;/h2&gt;

&lt;p&gt;A2A x402 belongs downstream of the Google AP2 authority check. The A2A x402 specification defines an Agent-to-Agent payment extension with data structures, message flows, and a state machine for requesting, authorizing, and settling payments inside A2A. That makes A2A x402 relevant to an AP2-backed commerce flow, but it does not make A2A x402 the AP2 mandate layer.&lt;/p&gt;

&lt;p&gt;For developers, A2A x402 exposes concrete payment states. A Merchant Agent can return &lt;code&gt;payment-required&lt;/code&gt; metadata, a Client Agent can submit a signed &lt;code&gt;PaymentPayload&lt;/code&gt;, and the Merchant Agent can verify and settle before returning &lt;code&gt;payment-completed&lt;/code&gt; or receipt metadata. Those states track payment progress. What they do not show is whether the payment pursuit had the right mandate context, which stays with Google AP2.&lt;/p&gt;

&lt;p&gt;Task correlation is where A2A x402 gives the payment lane a useful handle. The specification says the client-side message includes the original &lt;code&gt;taskId&lt;/code&gt; so the Merchant Agent can correlate a signed payment payload with earlier payment requirements. That &lt;code&gt;taskId&lt;/code&gt; keeps the payment payload attached to the task, while Google AP2 keeps the task attached to user authority.&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.amazonaws.com%2Fuploads%2Farticles%2F7q2enkaiojm4wjekxigi.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.amazonaws.com%2Fuploads%2Farticles%2F7q2enkaiojm4wjekxigi.png" alt="A2A x402 taskId thread marker connecting payment required signed PaymentPayload and payment completed events" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A Merchant-Side Gate Keeps The Layers Apart
&lt;/h2&gt;

&lt;p&gt;The clean implementation pattern is a precondition gate, not a post-payment apology. The following sketch is an article-side merchant model, not protocol-native AP2 or A2A x402 conformance code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if not verified_checkout_mandate(checkout):
    hold("checkout authority missing")

if not verified_payment_mandate(checkout, payment_request):
    hold("payment authority missing")

if not correlated_task(payment_payload.taskId, payment_required.taskId):
    hold("payment task correlation missing")

continue_to_settlement()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Google AP2 owns the first two holds in that sketch: checkout authority and payment authority. A2A x402 owns the third hold: payment task correlation inside the payment conversation. Settlement begins only after those questions are no longer being confused with one another.&lt;/p&gt;

&lt;p&gt;That separation is why a payment hash or receipt metadata should not be the first line of the incident report. If the mandate evidence is missing, the developer can still describe payment outcome, but Google AP2 leaves the authority question unresolved. If the &lt;code&gt;taskId&lt;/code&gt; correlation is missing, A2A x402 leaves the payment lane harder to connect back to the original requirement.&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.amazonaws.com%2Fuploads%2Farticles%2Ftvhqtnulcqfrfd426zzx.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.amazonaws.com%2Fuploads%2Farticles%2Ftvhqtnulcqfrfd426zzx.png" alt="Incident log correcting the first line from payment completed to authority evidence checked before payment" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Correlation Is The Debugging Handle
&lt;/h2&gt;

&lt;p&gt;Google AP2 and A2A x402 answer different debugging questions. Google AP2 asks whether the agent had authority to pursue the checkout and payment under signed mandate evidence. The A2A x402 question is narrower and sits in the payment lane: did a signed payment payload answer the payment requirement for the same task, and did it then reach a settlement result?&lt;/p&gt;

&lt;p&gt;The most dangerous record is therefore not an obviously failed payment. The dangerous record is a successful payment that starts in the middle: payment completed, service delivered, receipt stored, mandate chain absent. Google AP2 makes that record visibly incomplete because the successful settlement does not show the authorized checkout, the user constraints, or the verifier decisions.&lt;/p&gt;

&lt;p&gt;A second incomplete record goes the other direction. Google AP2 mandate evidence can exist, but if the A2A x402 signed payload cannot be correlated to the original &lt;code&gt;payment-required&lt;/code&gt; task, the payment lane has lost its own thread. The two protocols are stronger together only when mandate evidence and payment correlation remain separate and both are present.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Final Question Comes Before Payment
&lt;/h2&gt;

&lt;p&gt;Google AP2 is not a promise that agent commerce has no fraud, no chargebacks, or no liability ambiguity. It is a cleaner evidence boundary for authorization in agent-led payments. A2A x402 can still provide the payment and settlement path, but that path should not be asked to prove original user intent by itself.&lt;/p&gt;

&lt;p&gt;The debugging question for a developer is not "did the agent pay?" Google AP2 changes the question to "what made this payment an authorized payment for this checkout?" If the answer starts with settlement, the system is already reading the evidence in the wrong order.&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.amazonaws.com%2Fuploads%2Farticles%2Fur9fzp0g4k4fccl53yh5.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.amazonaws.com%2Fuploads%2Farticles%2Fur9fzp0g4k4fccl53yh5.png" alt="Command prompt asking what made this payment authorized for this checkout before settlement" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Google Cloud: &lt;a href="https://cloud.google.com/blog/products/ai-machine-learning/announcing-agents-to-payments-ap2-protocol" rel="noopener noreferrer"&gt;Powering AI commerce with the new Agent Payments Protocol&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Google Developers Blog: &lt;a href="https://developers.googleblog.com/en/developers-guide-to-ai-agent-protocols/" rel="noopener noreferrer"&gt;Developer's Guide to AI Agent Protocols&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Google Agentic Commerce: &lt;a href="https://raw.githubusercontent.com/google-agentic-commerce/AP2/main/docs/ap2/specification.md" rel="noopener noreferrer"&gt;AP2 v0.2 specification&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Google Agentic Commerce: &lt;a href="https://raw.githubusercontent.com/google-agentic-commerce/a2a-x402/main/spec/v0.1/spec.md" rel="noopener noreferrer"&gt;A2A x402 payments extension v0.1&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI assistance was used for source collection, structure, and editorial review. The article was reviewed by a human author before publication. This is a technical systems article, not investment, trading, yield, token-buy, or financial advice.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>x402 for AI APIs: The Replay Test Before the Agent Pays Twice</title>
      <dc:creator>AI x Crypto Systems</dc:creator>
      <pubDate>Mon, 08 Jun 2026 01:19:53 +0000</pubDate>
      <link>https://dev.to/aicryptosystems/x402-for-ai-apis-the-replay-test-before-the-agent-pays-twice-469k</link>
      <guid>https://dev.to/aicryptosystems/x402-for-ai-apis-the-replay-test-before-the-agent-pays-twice-469k</guid>
      <description>&lt;h1&gt;
  
  
  x402 Replay Settlement Proof
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Disclosure: AI tools were used for source collection and editorial review. The article was written by a human author, who checked the facts, code, and conclusions.&lt;/p&gt;

&lt;p&gt;Crypto risk disclosure: This article is a technical explanation, not investment advice. It is not a recommendation to buy, sell, or hold any cryptoasset.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Start with a boring question: what happens when the paid retry gets sent twice? x402 makes a paid HTTP retry possible — a server answers with payment requirements, and the client retries with payment material. For AI APIs that matters, because the caller can be a tool-using agent instead of a human filling out a checkout form. So the proof an operator actually needs isn't a slogan about instant payments. It's a replay test: evidence that one agent task can't quietly turn into ambiguous spend. That is what x402 Replay Settlement Proof is for.&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.amazonaws.com%2Fuploads%2Farticles%2Fmx2g3384px0m83e13v26.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.amazonaws.com%2Fuploads%2Farticles%2Fmx2g3384px0m83e13v26.png" alt="x402 replay proof cover" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Replay Receipt
&lt;/h2&gt;

&lt;p&gt;The x402 replay proof treats every paid retry as a state transition you log before you trust it. &lt;a href="https://www.x402.org/" rel="noopener noreferrer"&gt;Official x402 documentation&lt;/a&gt; and &lt;a href="https://docs.cdp.coinbase.com/x402/core-concepts/how-it-works" rel="noopener noreferrer"&gt;Coinbase's x402 flow documentation&lt;/a&gt; describe the sequence: a request, a &lt;code&gt;402 Payment Required&lt;/code&gt; response, a payment payload, a retry, then verification and settlement. That is a transport flow, though, not a complete agent-control policy. The replay receipt fills the operational gap nobody wrote down: when the same task shows up again, should the API hand back the stored result, reject the duplicate, reconcile settlement, or ask for a new payment?&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.amazonaws.com%2Fuploads%2Farticles%2F8wt9azj7xfy0m16zjhj5.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.amazonaws.com%2Fuploads%2Farticles%2F8wt9azj7xfy0m16zjhj5.png" alt="x402 replay state machine" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The replay receipt can stay small:&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;"request_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;"req_7f91"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"resource_hash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sha256:resource:9f02..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"payment_terms_hash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sha256:terms:51ab..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"retry_fingerprint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sha256:signed-retry:88c1..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"facilitator_verify"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pass"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"settlement_state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"unknown_after_timeout"&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_validation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_started"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ledger_action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hold_retry_and_reconcile"&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;This x402 receipt never stores private prompts, wallet secrets, or raw signed payloads. What it keeps is hashes, state names, and the one decision that matters to the agent. That keeps the artifact handy during a support review without turning payment logs into a second pile of sensitive data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Terms Hash
&lt;/h2&gt;

&lt;p&gt;The whole x402 replay proof hangs on one binding: the signed retry has to match the terms the agent actually meant to buy. &lt;a href="https://docs.cdp.coinbase.com/x402/welcome" rel="noopener noreferrer"&gt;Coinbase's x402 overview&lt;/a&gt; covers payment instructions and a signed payment header, and &lt;a href="https://docs.cdp.coinbase.com/x402/core-concepts/how-it-works" rel="noopener noreferrer"&gt;Coinbase's flow documentation&lt;/a&gt; splits payment creation, retry, verification, and settlement into separate steps. A replay test should pull all of it into the terms record the server audits: the resource, amount, asset, network, recipient, expiry, and request identifier. Accept that signed material for a different resource, or after the window has gone stale, and the agent just handed over more authority than the task ever called for.&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.amazonaws.com%2Fuploads%2Farticles%2Fqjqkp35j8wj9i2lg1x6y.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.amazonaws.com%2Fuploads%2Farticles%2Fqjqkp35j8wj9i2lg1x6y.png" alt="x402 terms binding card" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first negative test is simple: change one term, expect a rejection. The same retry fingerprint should not buy a different report, a larger amount, a different recipient, or a later request window. &lt;a href="https://docs.x402.org/extensions/payment-identifier" rel="noopener noreferrer"&gt;x402's &lt;code&gt;payment-identifier&lt;/code&gt; extension&lt;/a&gt; helps here, because where it is in use the independent replay check can line up one payment identifier against the request fingerprint and flag a mismatched fingerprint as a conflict. The safe claim stays narrow: an AI API needs a visible terms boundary before it lets a model-driven caller spend again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Facilitator Result
&lt;/h2&gt;

&lt;p&gt;Here the x402 replay proof draws a line between facilitator success and merchant judgment. &lt;a href="https://docs.cdp.coinbase.com/x402/core-concepts/facilitator" rel="noopener noreferrer"&gt;Coinbase's facilitator documentation&lt;/a&gt; says a facilitator can verify payment payloads, settle payments onchain, and return verification or settlement results to the server, which takes a lot of the blockchain operational work off the seller. What the facilitator result still cannot do is decide whether the endpoint should fulfill a restricted resource, whether the response is useful, or whether a refund or support rule applies.&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.amazonaws.com%2Fuploads%2Farticles%2F36ust2htw0eoz3lhepbp.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.amazonaws.com%2Fuploads%2Farticles%2F36ust2htw0eoz3lhepbp.png" alt="x402 facilitator boundary" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So the receipt records the facilitator result as one field, not as the final story. A &lt;code&gt;verify=pass&lt;/code&gt; result means the payment payload satisfied a verification path. A &lt;code&gt;settle=confirmed&lt;/code&gt; result means the payment execution reached the expected settlement state. Neither field proves the AI API delivered the correct data, honored the user's task boundary, or avoided prompt leakage in the resource URL. That gap is exactly why the x402 replay proof earns its keep: the receipt keeps those boundaries visible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Settlement Unknown
&lt;/h2&gt;

&lt;p&gt;The x402 replay proof earns the most when the network never answers at all. &lt;a href="https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/payments-how-it-works.html" rel="noopener noreferrer"&gt;Amazon Bedrock AgentCore's payments documentation&lt;/a&gt; walks through an agent payment flow that checks limits, signs, retries with &lt;code&gt;X-PAYMENT&lt;/code&gt;, verifies and settles, then updates state, and if a step fails, the transaction is recorded as failed and the limit reservation is released. That managed-service behavior is AWS-specific, but the operational lesson generalizes: the timeout branch needs its own state. When the retry times out after the signed payload has already left the client, the agent must not blindly spend again.&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.amazonaws.com%2Fuploads%2Farticles%2Fkk1y5oyjeb9349voctb8.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.amazonaws.com%2Fuploads%2Farticles%2Fkk1y5oyjeb9349voctb8.png" alt="x402 timeout reconciliation" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The timeout branch should be boring and strict:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Case&lt;/th&gt;
&lt;th&gt;What changed&lt;/th&gt;
&lt;th&gt;Expected decision&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;duplicate retry&lt;/td&gt;
&lt;td&gt;nothing&lt;/td&gt;
&lt;td&gt;return stored result or reject duplicate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wrong resource&lt;/td&gt;
&lt;td&gt;resource hash&lt;/td&gt;
&lt;td&gt;reject binding mismatch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;expired terms&lt;/td&gt;
&lt;td&gt;expiry window&lt;/td&gt;
&lt;td&gt;reject or ask for new terms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;settlement timeout&lt;/td&gt;
&lt;td&gt;facilitator response missing&lt;/td&gt;
&lt;td&gt;hold and reconcile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;response validation fail&lt;/td&gt;
&lt;td&gt;content check fails after payment&lt;/td&gt;
&lt;td&gt;record paid-but-undelivered&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read the table as a test harness, not as protocol law: that is how the x402 replay proof treats it. Different payment schemes and facilitators can implement replay handling differently. Either way, the system still needs a replay policy a reviewer can inspect before production traffic reaches a funded agent wallet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paid But Undelivered
&lt;/h2&gt;

&lt;p&gt;The x402 replay proof also has to cover the awkward state where payment succeeds and the API response fails validation. The arXiv preprint &lt;a href="https://arxiv.org/abs/2605.11781" rel="noopener noreferrer"&gt;"Five Attacks on x402 Agentic Payment Protocol"&lt;/a&gt; reports attack classes around authorization, binding, replay protection, and web-layer handling, with the caveat — worth repeating — that the work is a May 2026 preprint rather than a final standard verdict. For an AI API the useful takeaway is not panic. It is to test the paid-but-denied and paid-but-undelivered branches before a model can trigger repeated paid calls.&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.amazonaws.com%2Fuploads%2Farticles%2F6hbvhfvseub4n230k3ti.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.amazonaws.com%2Fuploads%2Farticles%2F6hbvhfvseub4n230k3ti.png" alt="x402 paid but undelivered ledger" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The ledger row can state the failure without overclaiming:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;request_id=req_7f91
payment_terms_hash=sha256:terms:51ab...
settlement_state=confirmed
response_status=502
response_validation=fail
agent_retry_decision=blocked_pending_reconcile
support_state=paid_but_undelivered
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Throughout, the x402 replay proof keeps payment proof and response proof separate. A blockchain settlement can prove that a payment execution happened under a payment path. A response validator can say whether the paid API returned the expected shape, source, or status. The agent should not treat the first proof as the second proof.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Test
&lt;/h2&gt;

&lt;p&gt;The x402 replay proof should pass before the AI API leaves sandbox traffic. Run one valid paid call, then throw the rest at it: the same signed retry, a wrong-resource retry, a stale retry, a facilitator-timeout simulation, and a paid-but-undelivered response. Each case should produce one compact receipt. If that receipt cannot explain why the agent paid, whether settlement happened, and why another retry was blocked or allowed, the integration is not ready for autonomous spend.&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.amazonaws.com%2Fuploads%2Farticles%2Fbwfieam4gjjt1jj3oeao.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.amazonaws.com%2Fuploads%2Farticles%2Fbwfieam4gjjt1jj3oeao.png" alt="x402 final replay checklist" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The developer rule stays intentionally narrow: prove the replay boundary before funding the agent. x402 can make HTTP-native machine payment practical, and facilitators can make settlement easier to operate. What x402 Replay Settlement Proof adds is the part a production AI system still needs: a readable record that one task, one terms hash, and one retry decision stayed under control.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>AI Crawler Payments: The Paid Crawl Is Not the Training License</title>
      <dc:creator>AI x Crypto Systems</dc:creator>
      <pubDate>Sun, 07 Jun 2026 11:43:43 +0000</pubDate>
      <link>https://dev.to/aicryptosystems/ai-crawler-payments-the-paid-crawl-is-not-the-training-license-4l13</link>
      <guid>https://dev.to/aicryptosystems/ai-crawler-payments-the-paid-crawl-is-not-the-training-license-4l13</guid>
      <description>&lt;h1&gt;
  
  
  AI Crawler Payments
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Disclosure: AI tools were used for source collection and editorial review. The article was written by a human author, who checked the facts, sources, and conclusions.&lt;/p&gt;

&lt;p&gt;Crypto risk disclosure: This article is a technical explanation, not investment advice. It is not a recommendation to buy, sell or hold any cryptoasset.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here is the failure mode worth naming up front: a clean payment receipt gets treated like a training license. A receipt can prove a crawler paid for a page, an API response, or some other content resource. It cannot prove, on its own, that the model operator is allowed to train on what came back.&lt;/p&gt;

&lt;p&gt;That gap matters because AI-and-crypto systems learned to move money between machines long before they learned to track rights. A crawler presents a 402 payment, the merchant settles it, the site returns content — and the rights row is still empty.&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.amazonaws.com%2Fuploads%2Farticles%2F2lcaio7wfkgzzu5ipym5.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.amazonaws.com%2Fuploads%2Farticles%2F2lcaio7wfkgzzu5ipym5.png" alt="Paid crawl receipt separated from training rights evidence" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Receipt
&lt;/h2&gt;

&lt;p&gt;A receipt is necessary, but its job is narrow. The &lt;a href="https://docs.x402.org/introduction" rel="noopener noreferrer"&gt;x402 documentation&lt;/a&gt; describes an HTTP-native payment flow for access to APIs, data, content, or digital resources. That is useful evidence that someone paid for access, not a universal copyright or training-use grant.&lt;/p&gt;

&lt;p&gt;So keep two events in two different rows: the access event and the rights event. A paid crawl receipt can record which crawler paid, which URL or resource it asked for, which price it accepted, and whether settlement actually completed. A training-license record has to come from somewhere else — a license, a contract, a site policy, a statutory exception, or some other legal defense.&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.amazonaws.com%2Fuploads%2Farticles%2Fbti8551klqdrglx78ca2.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.amazonaws.com%2Fuploads%2Farticles%2Fbti8551klqdrglx78ca2.png" alt="Two-column receipt showing paid access versus rights evidence" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Robots
&lt;/h2&gt;

&lt;p&gt;Robots policy gets its own lane too. &lt;a href="https://www.rfc-editor.org/rfc/rfc9309" rel="noopener noreferrer"&gt;RFC 9309&lt;/a&gt; specifies the Robots Exclusion Protocol, and it draws a boundary worth keeping in mind: robots.txt rules are crawl instructions, not a full authorization or licensing system.&lt;/p&gt;

&lt;p&gt;Drawing that line kills a common overclaim. A crawler that respects robots.txt is probably better behaved than one that ignores it, sure. But better behaved is not the same as licensed. The robots signal says nothing about permission to train a model on whatever came back.&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.amazonaws.com%2Fuploads%2Farticles%2Fyltjh5226j4tnolsltbk.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.amazonaws.com%2Fuploads%2Farticles%2Fyltjh5226j4tnolsltbk.png" alt="Robots policy lane separate from payment and training rights" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Payment
&lt;/h2&gt;

&lt;p&gt;The paid-access layer itself can get a lot cleaner. The &lt;a href="https://developers.cloudflare.com/ai-crawl-control/features/pay-per-crawl/what-is-pay-per-crawl/" rel="noopener noreferrer"&gt;Cloudflare Pay Per Crawl documentation&lt;/a&gt; describes site owners charging AI crawlers for access, returning a payment-required response before any successful retrieval. The crawler-owner flow covers the other side: price discovery and paid crawling.&lt;/p&gt;

&lt;p&gt;None of that is the problem. The problem is what people let the receipt prove. A successful paid crawl backs exactly one sentence: "this crawler paid for this retrieval under this access rule." It does not back "this model has training rights" unless a separate row supplies that evidence.&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.amazonaws.com%2Fuploads%2Farticles%2Fsai3f9fm0h69tvjbr81x.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.amazonaws.com%2Fuploads%2Farticles%2Fsai3f9fm0h69tvjbr81x.png" alt="Payment ladder ending at paid retrieval, not training permission" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Matrix
&lt;/h2&gt;

&lt;p&gt;All of this becomes auditable once you force the receipt into a rights-versus-payment matrix. What follows is not an official Cloudflare or x402 schema. It is a merchant-side audit artifact, and its only purpose is to stop payment evidence from quietly swallowing rights evidence.&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;"artifact_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;"rights_vs_payment_matrix"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://publisher.example/report.html"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"crawler_identity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"verified-ai-crawler.example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"payment_signal"&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;"protocol"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"x402-or-pay-per-crawl"&lt;/span&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;"paid"&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="s2"&gt;"recorded"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"receipt_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;"crawl_pay_2026_06_04_001"&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;"access_decision"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"serve_content"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"robots_policy"&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;"search"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ai_input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"allow_or_block_recorded"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ai_train"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_granted_by_payment"&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;"license_evidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"training_use_signal"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"blocked_until_separate_rights_evidence"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rights_gap"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"paid access does not prove model-training permission"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxlbprd2q9zsnlivp6fgo.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.amazonaws.com%2Fuploads%2Farticles%2Fxlbprd2q9zsnlivp6fgo.png" alt="Rights-versus-payment matrix with empty license evidence row" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Provenance
&lt;/h2&gt;

&lt;p&gt;Provenance and permission get confused just as easily. &lt;a href="https://spec.c2pa.org/specifications/specifications/2.1/specs/C2PA_Specification.html" rel="noopener noreferrer"&gt;C2PA&lt;/a&gt; is genuinely useful for content provenance and authenticity claims. It can tell you where an asset came from. What it does not do is hand a crawler model-training rights as a side effect.&lt;/p&gt;

&lt;p&gt;The same split applies to content credentials, crawler identity, and payment headers. Each field trims one uncertainty. Not one of them should be allowed to fill the license row on its own.&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.amazonaws.com%2Fuploads%2Farticles%2F2cdui5kkw9xenl7vjmq3.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.amazonaws.com%2Fuploads%2Farticles%2F2cdui5kkw9xenl7vjmq3.png" alt="Provenance credential beside an empty license grant field" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Rights
&lt;/h2&gt;

&lt;p&gt;The rights row stays separate because copyright and text-and-data-mining rules turn on jurisdiction, access, reservations, defenses, and agreements — none of which a payment captures. &lt;a href="https://eur-lex.europa.eu/eli/dir/2019/790/oj" rel="noopener noreferrer"&gt;Directive (EU) 2019/790&lt;/a&gt; covers text-and-data-mining exceptions and the reservation of rights. &lt;a href="https://ai-act-service-desk.ec.europa.eu/en/ai-act/article-53" rel="noopener noreferrer"&gt;EU AI Act Article 53&lt;/a&gt; points general-purpose AI providers toward copyright compliance policies and rights reservations. The &lt;a href="https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-3-Generative-AI-Training-Report-Pre-Publication-Version.pdf" rel="noopener noreferrer"&gt;U.S. Copyright Office AI training report&lt;/a&gt; treats training uses as a rights question, not just an access-log question.&lt;/p&gt;

&lt;p&gt;This is not a call to turn every article into a legal memo. It is narrower than that. The technical receipt should refuse to draw the wrong conclusion, and when the rights evidence is missing, the audit artifact should say so plainly.&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.amazonaws.com%2Fuploads%2Farticles%2Fz092dfgdszceod0mf638.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.amazonaws.com%2Fuploads%2Farticles%2Fz092dfgdszceod0mf638.png" alt="Rights row requiring license, policy, contract, or legal defense evidence" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision
&lt;/h2&gt;

&lt;p&gt;All of this stays useful as long as the final decision stays small. A paid crawl can serve the content when the access policy allows it. A model-training claim should stay blocked until the rights row actually holds evidence.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Evidence row&lt;/th&gt;
&lt;th&gt;What it can prove&lt;/th&gt;
&lt;th&gt;What it cannot prove&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;crawler_identity&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Which crawler presented itself or was verified&lt;/td&gt;
&lt;td&gt;That every later model use is authorized&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;payment_signal&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A paid retrieval or settlement event&lt;/td&gt;
&lt;td&gt;A license to train&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;robots_policy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A crawl or content-signal preference&lt;/td&gt;
&lt;td&gt;A complete legal permission record&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;provenance_claim&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Source or authenticity context&lt;/td&gt;
&lt;td&gt;Training rights&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;license_evidence&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Possible training-use basis when present&lt;/td&gt;
&lt;td&gt;Nothing when empty&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rights_gap&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The blocked conclusion&lt;/td&gt;
&lt;td&gt;A workaround around rights evidence&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The sentence to avoid is "the crawler paid, so training is allowed." The sentence that holds up is "the crawler paid, content access was allowed, and training rights stay unproven until the separate rights row is filled."&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Training Data Provenance: The Dataset Hash That Changed Under the Same Name</title>
      <dc:creator>AI x Crypto Systems</dc:creator>
      <pubDate>Sat, 06 Jun 2026 12:16:49 +0000</pubDate>
      <link>https://dev.to/aicryptosystems/training-data-provenance-the-dataset-hash-that-changed-under-the-same-name-nii</link>
      <guid>https://dev.to/aicryptosystems/training-data-provenance-the-dataset-hash-that-changed-under-the-same-name-nii</guid>
      <description>&lt;h1&gt;
  
  
  Training Data Provenance
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Disclosure: AI tools were used for source collection and editorial review. The article was written by a human author, who checked the facts, sources, and conclusions.&lt;/p&gt;

&lt;p&gt;Crypto risk disclosure: This article is a technical explanation, not investment advice. It is not a recommendation to buy, sell or hold any cryptoasset.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Training Data Provenance starts with a boring failure: the dataset name stayed put while the bytes underneath moved. For AI x crypto systems that gap is the whole problem. A model claim, an onchain receipt, or a provenance attestation can all point at a name long after the files, metadata, splits, or source chain have changed. So "we used dataset X" is not a receipt. A version-pinned manifest diff, with its limits spelled out, is.&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.amazonaws.com%2Fuploads%2Farticles%2Fsh8ybrpts4d6uka7pzon.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.amazonaws.com%2Fuploads%2Farticles%2Fsh8ybrpts4d6uka7pzon.png" alt="Dataset provenance cover showing name, commit, manifest, and source chain" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Name
&lt;/h2&gt;

&lt;p&gt;A dataset name is where provenance starts, not where it stops. &lt;a href="https://www.w3.org/TR/prov-dm/" rel="noopener noreferrer"&gt;W3C PROV-DM&lt;/a&gt; describes provenance through entities, activities, agents, derivations, usage, generation, and responsibility. That list is itself the warning. A name or URL is one pointer inside a much longer chain.&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.amazonaws.com%2Fuploads%2Farticles%2Fdvt74wi1jzv50nqhpq26.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.amazonaws.com%2Fuploads%2Farticles%2Fdvt74wi1jzv50nqhpq26.png" alt="Floating dataset reference versus commit pin" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The name still works as a handle. What it cannot do is prove the training data. A handle says nothing about which revision loaded, which files were present, who changed them, what preprocessing ran, or whether the license and source story was ever complete.&lt;/p&gt;

&lt;h2&gt;
  
  
  Revision
&lt;/h2&gt;

&lt;p&gt;Floating references move, so the next thing a receipt needs is a revision pin. &lt;a href="https://huggingface.co/docs/datasets/en/loading" rel="noopener noreferrer"&gt;Hugging Face Datasets documentation&lt;/a&gt; describes loading datasets with a &lt;code&gt;revision&lt;/code&gt; value, and the practical research pass found full commit hashes hold up better than floating branches for reproducibility. Resolve the input ref into a concrete commit first. Everything else comes after that.&lt;/p&gt;

&lt;p&gt;Even pinned, the version is not the whole story. &lt;a href="https://huggingface.co/docs/huggingface_hub/en/package_reference/hf_api" rel="noopener noreferrer"&gt;Hugging Face Hub API documentation&lt;/a&gt; describes repository refs and trees that can back a manifest. The real provenance question opens up after the pin: did the manifest change, did the metadata change, and what does the diff still fail to explain?&lt;/p&gt;

&lt;h2&gt;
  
  
  Manifest
&lt;/h2&gt;

&lt;p&gt;The practical artifact is a dataset hash diff. It pins two resolved versions, hashes the metadata surface, compares the file manifest, and labels whatever claims stay blocked.&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.amazonaws.com%2Fuploads%2Farticles%2F4u59xivot48a0bsck28j.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.amazonaws.com%2Fuploads%2Farticles%2F4u59xivot48a0bsck28j.png" alt="Manifest hash diff with added, deleted, and modified files" width="800" height="450"&gt;&lt;/a&gt;&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;"artifact_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;"dataset_hash_diff"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dataset"&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;"provider"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"huggingface"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"owner/dataset"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"access_scope"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"public"&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;"versions"&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;"old"&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;"ref_input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"resolved_commit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"old_full_commit_sha"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"card_metadata_hash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sha256:old_readme_yaml"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"retrieved_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-06-04T00:00:00Z"&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;"new"&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;"ref_input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"resolved_commit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"new_full_commit_sha"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"card_metadata_hash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sha256:new_readme_yaml"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"retrieved_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-06-04T00:10:00Z"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"manifest_diff"&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;"added"&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;"train/shard-0003.parquet"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"content_hash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sha256:new"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"deleted"&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;"modified"&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;"README.md"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"old_hash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sha256:old"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"new_hash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sha256:new"&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;"blocked_claims"&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="s2"&gt;"license is proven"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"collection consent is proven"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"model quality is proven"&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;h2&gt;
  
  
  Metadata
&lt;/h2&gt;

&lt;p&gt;Bytes are not the only claim surface, so metadata drift belongs in the diff too. &lt;a href="https://docs.mlcommons.org/croissant/docs/croissant-spec-1.1.html" rel="noopener noreferrer"&gt;MLCommons Croissant 1.1&lt;/a&gt; describes dataset metadata, versions, file checksums, and live dataset considerations. A metadata hash can change while no large shard moves at all, and that still counts.&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.amazonaws.com%2Fuploads%2Farticles%2F0hbyjkb1d9o9jogmcuzi.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.amazonaws.com%2Fuploads%2Farticles%2F0hbyjkb1d9o9jogmcuzi.png" alt="Dataset metadata card gap showing fields a hash cannot prove" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Documentation explains why this matters. &lt;a href="https://arxiv.org/abs/1803.09010" rel="noopener noreferrer"&gt;Datasheets for Datasets&lt;/a&gt; asks for motivation, composition, collection, preprocessing, uses, distribution, and maintenance. &lt;a href="https://arxiv.org/abs/1810.03993" rel="noopener noreferrer"&gt;Model Cards for Model Reporting&lt;/a&gt; asks for intended use, evaluation, factors, metrics, and limitations. None of that rides along in a file hash.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hash
&lt;/h2&gt;

&lt;p&gt;Respect hashes, but don't worship them. The &lt;a href="https://github.com/git-lfs/git-lfs/blob/main/docs/spec.md" rel="noopener noreferrer"&gt;Git LFS specification&lt;/a&gt; uses pointer files with &lt;code&gt;oid sha256:&amp;lt;hash&amp;gt;&lt;/code&gt; and size, and &lt;a href="https://doc.dvc.org/user-guide/project-structure/dvc-files" rel="noopener noreferrer"&gt;DVC file documentation&lt;/a&gt; describes tracked outputs with hashes and sizes. As byte-level tools, both are strong.&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.amazonaws.com%2Fuploads%2Farticles%2Fhoustbtnuqbx1rswbgkw.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.amazonaws.com%2Fuploads%2Farticles%2Fhoustbtnuqbx1rswbgkw.png" alt="LFS and DVC boundary showing hashes as content evidence only" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The boundary is the whole point. &lt;a href="https://doc.dvc.org/command-reference/diff" rel="noopener noreferrer"&gt;DVC diff&lt;/a&gt; produces a machine-readable comparison with hashes, and &lt;a href="https://git-scm.com/docs/git-diff" rel="noopener noreferrer"&gt;Git diff&lt;/a&gt; shows changed paths between commits. They prove tracked drift. They say nothing about license, consent, collection method, source completeness, or model quality.&lt;/p&gt;

&lt;h2&gt;
  
  
  Snapshot
&lt;/h2&gt;

&lt;p&gt;When a dataset is live or mutable, retrieval time becomes part of the record. Croissant's live dataset language and the repository APIs push the same habit: write down what was retrieved, from where, at which resolved revision, and when. Skip it and a later audit can repeat the name without ever repeating the data.&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.amazonaws.com%2Fuploads%2Farticles%2Fnav72k5feasr0uppcsjl.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.amazonaws.com%2Fuploads%2Farticles%2Fnav72k5feasr0uppcsjl.png" alt="Live dataset snapshot showing retrieval time and resolved version" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Data Provenance Initiative paper &lt;a href="https://www.nature.com/articles/s42256-024-00878-8" rel="noopener noreferrer"&gt;A large-scale audit of dataset licensing and attribution in AI&lt;/a&gt; shows why the wider chain matters. It tracks sources, creators, licenses, derivatives, and composition. That is the layer no hash diff can stand in for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision
&lt;/h2&gt;

&lt;p&gt;Provenance gets credible at the moment the receipt starts refusing overbroad claims.&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.amazonaws.com%2Fuploads%2Farticles%2Fqa22oxnwks9vr2mbvkf2.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.amazonaws.com%2Fuploads%2Farticles%2Fqa22oxnwks9vr2mbvkf2.png" alt="Claim audit card for dataset hash diff boundaries" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Claim&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Reason&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;These two dataset revisions have different tracked file hashes.&lt;/td&gt;
&lt;td&gt;Allowed when the manifest diff is cited.&lt;/td&gt;
&lt;td&gt;The hash diff supports byte-level drift.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The dataset card metadata changed.&lt;/td&gt;
&lt;td&gt;Allowed when the metadata hash or field diff is cited.&lt;/td&gt;
&lt;td&gt;Documentation drift is part of the review surface.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The dataset source, license, and consent chain are proven.&lt;/td&gt;
&lt;td&gt;Blocked unless separate provenance evidence exists.&lt;/td&gt;
&lt;td&gt;A hash is not the full source chain.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The model trained on this dataset is reliable.&lt;/td&gt;
&lt;td&gt;Blocked.&lt;/td&gt;
&lt;td&gt;Dataset identity is not model evaluation.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The strongest provenance claim here is the smallest one. A dataset hash diff can show that a named dataset changed under a stable-looking reference. It cannot tell the whole provenance story on its own, and that limit is exactly what makes the receipt worth keeping.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>DePIN GPU Market: The Reliability Score Is Not the Model Answer</title>
      <dc:creator>AI x Crypto Systems</dc:creator>
      <pubDate>Sat, 06 Jun 2026 02:18:37 +0000</pubDate>
      <link>https://dev.to/aicryptosystems/depin-gpu-market-the-reliability-score-is-not-the-model-answer-4e78</link>
      <guid>https://dev.to/aicryptosystems/depin-gpu-market-the-reliability-score-is-not-the-model-answer-4e78</guid>
      <description>&lt;h1&gt;
  
  
  DePIN GPU Market
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Disclosure: AI tools were used for source collection and editorial review. The article was written by a human author, who checked the facts, sources, and conclusions.&lt;/p&gt;

&lt;p&gt;Crypto risk disclosure: This article is a technical explanation, not investment advice. It is not a recommendation to buy, sell or hold any cryptoasset.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Think of a DePIN GPU Market as a reliability stack, not a correctness machine. The marketplace can surface a lot: which provider ran the job, whether the resources were real, what the job produced, how that provider has behaved before, and what hardware processed the request. All of that is worth having. None of it tells you whether the language model's answer was actually true, safe, or worth a user's trust.&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.amazonaws.com%2Fuploads%2Farticles%2Ffazgoddjormp07usmu4d.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.amazonaws.com%2Fuploads%2Farticles%2Ffazgoddjormp07usmu4d.png" alt="Decision tree cover for DePIN GPU marketplace reliability claims" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Selection
&lt;/h2&gt;

&lt;p&gt;Start with where the work runs. &lt;a href="https://akash.network/docs/learn/core-concepts/providers-leases/" rel="noopener noreferrer"&gt;Akash's provider and lease documentation&lt;/a&gt; describes providers as infrastructure operators that offer compute resources, and &lt;a href="https://akash.network/docs/providers/operations/provider-attributes/" rel="noopener noreferrer"&gt;Akash provider attributes&lt;/a&gt; cover the key-value attributes used to match deployments with providers. This is the evidence that lets a buyer ask, before anything runs, where a workload could land.&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.amazonaws.com%2Fuploads%2Farticles%2Fuai5m55dyvq5wovqhyjv.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.amazonaws.com%2Fuploads%2Farticles%2Fuai5m55dyvq5wovqhyjv.png" alt="Provider selection evidence layer for leases and attributes" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It still isn't answer validation. A provider attribute, a region, a lease, a price, a resource class can each back a delivery decision. None of them proves the model loaded the right weights, followed the prompt, stayed clear of hallucination, or returned something factual.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proof
&lt;/h2&gt;

&lt;p&gt;The next question is whether the rented resources are actually there. &lt;a href="https://io.net/docs/guides/workers/proof-of-work" rel="noopener noreferrer"&gt;io.net's proof-of-work documentation&lt;/a&gt; says the network runs hourly proof-of-work verification to check worker authenticity and reliability. That matters, because a buyer needs more than a marketplace listing: they need evidence the hardware is present and available.&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.amazonaws.com%2Fuploads%2Farticles%2F6q9bbi4lifn42qwzcxfr.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.amazonaws.com%2Fuploads%2Farticles%2F6q9bbi4lifn42qwzcxfr.png" alt="Worker proof boundary separating resource checks from answer checks" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But resource proof should stay in its lane. The paper &lt;a href="https://arxiv.org/abs/2501.05374" rel="noopener noreferrer"&gt;Validation of GPU Computation in Decentralized, Trustless Networks&lt;/a&gt; lays out why validating GPU computation is hard in the first place, including non-determinism across GPU nodes. The takeaway isn't "trustless GPU markets solved correctness." It's narrower: compute delivery needs a verification surface of its own before any model-quality claim even starts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Receipt
&lt;/h2&gt;

&lt;p&gt;Then there's the paper trail. &lt;a href="https://learn.nosana.com/deployments/jobs/" rel="noopener noreferrer"&gt;Nosana's job documentation&lt;/a&gt; defines jobs as containerized workloads that run on Nosana nodes, and the &lt;a href="https://docs.nosana.io/protocols/jobs.html" rel="noopener noreferrer"&gt;Nosana Jobs protocol documentation&lt;/a&gt; lists program-account fields like &lt;code&gt;ipfsJob&lt;/code&gt; and &lt;code&gt;ipfsResult&lt;/code&gt;. A receipt like that makes the workload and its result pointer auditable.&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.amazonaws.com%2Fuploads%2Farticles%2Fn1qncd87ivr4ggha48w8.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.amazonaws.com%2Fuploads%2Farticles%2Fn1qncd87ivr4ggha48w8.png" alt="Job and result receipt layer with claim boundary" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Auditable, not correct. A receipt can confirm that a workload was posted, that a run happened, and that a result pointer exists. What it can't do, on its own, is tell you whether the model answer is factually right, whether the output was useful, or whether it was safe to put in front of a user.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reputation
&lt;/h2&gt;

&lt;p&gt;History counts too. &lt;a href="https://docs.golem.network/docs/reputation" rel="noopener noreferrer"&gt;Golem's reputation documentation&lt;/a&gt; describes provider-side metrics: task success rate, provider age, uptime, CPU and memory performance, disk speed, network throughput, ping times, open ports, with GPU performance tracking planned. Solid provider-selection evidence.&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.amazonaws.com%2Fuploads%2Farticles%2Fpuzylk6vvowzmlivg3w6.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.amazonaws.com%2Fuploads%2Farticles%2Fpuzylk6vvowzmlivg3w6.png" alt="Reputation score limits for provider performance metrics" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;None of it gets promoted into model truth. A strong provider history lowers the odds of a botched delivery, slow execution, or weak infrastructure. It does nothing to make an LLM answer correct, grounded, non-toxic, or compliant with whatever policy the user is working under.&lt;/p&gt;

&lt;h2&gt;
  
  
  Attestation
&lt;/h2&gt;

&lt;p&gt;The last layer is the hardware itself. &lt;a href="https://docs.nvidia.com/attestation/" rel="noopener noreferrer"&gt;NVIDIA attestation documentation&lt;/a&gt; speaks to claims about trusted computing boundaries, and &lt;a href="https://io.net/docs/guides/confidential-inference/overview" rel="noopener noreferrer"&gt;io.net confidential inference documentation&lt;/a&gt; describes a confidential-inference path for prompts processed on trusted hardware. That evidence can back an environment claim, but only when the implementation actually uses those mechanisms.&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.amazonaws.com%2Fuploads%2Farticles%2Fabxvl14hfktvhzg9qhv0.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.amazonaws.com%2Fuploads%2Farticles%2Fabxvl14hfktvhzg9qhv0.png" alt="Attestation boundary showing trusted environment evidence is not answer-quality evidence" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It has a boundary like everything else. A TEE or confidential-computing receipt answers "what environment processed this request?", not "is the model output true?" Keep those two questions apart. Merge them and you've built the exact reliability overclaim a technical reader ought to reject.&lt;/p&gt;

&lt;h2&gt;
  
  
  Incentives
&lt;/h2&gt;

&lt;p&gt;Incentives are what hold these layers together, and they still don't close the verification gaps. The paper &lt;a href="https://arxiv.org/abs/2503.07558" rel="noopener noreferrer"&gt;Incentive-Compatible Recovery from Manipulated Signals&lt;/a&gt; frames DePIN as a setting where physical services come from untrusted, self-interested parties, with the hard part being how you verify service level. That fits the reliability-stack view: incentives shape behavior around the signals you can observe.&lt;/p&gt;

&lt;p&gt;Render's &lt;a href="https://github.com/rendernetwork/RNPs/blob/main/RNP-019.md" rel="noopener noreferrer"&gt;RNP-019 governance proposal&lt;/a&gt; sits in the same bounded category. A proposal like that can lay out reward or emission design for growing a compute network. It is not a benchmark, a model audit, or a factuality test for an AI answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision
&lt;/h2&gt;

&lt;p&gt;Here is the practical artifact, a decision tree for DePIN GPU Market claims:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Claim: "The marketplace made this AI result reliable."
|
+-- Is there provider-selection evidence?
|   +-- yes: cite provider attributes, lease, region, or resource class.
|   +-- no: block the delivery claim.
|
+-- Is there resource-availability or worker-proof evidence?
|   +-- yes: cite the worker check and its scope.
|   +-- no: block the compute-delivery claim.
|
+-- Is there a job/result receipt?
|   +-- yes: cite the workload and result pointer.
|   +-- no: block the receipt claim.
|
+-- Is there reputation or performance history?
|   +-- yes: cite provider metrics and their measurement limits.
|   +-- no: avoid reputation language.
|
+-- Is there attestation for the execution environment?
|   +-- yes: cite the attestation boundary.
|   +-- no: avoid trusted-hardware language.
|
+-- Is there separate evidence that the model answer is correct?
    +-- yes: cite evaluation, grounding, tests, or human review.
    +-- no: say delivery evidence exists, but answer correctness is unproven.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F54awb3uaneya1pzaaqs0.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.amazonaws.com%2Fuploads%2Farticles%2F54awb3uaneya1pzaaqs0.png" alt="Final decision card for DePIN GPU marketplace reliability claims" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Run the final claim audit before you publish a DePIN GPU Market reliability story:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Claim&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Reason&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The provider was selectable under listed resource and lease constraints.&lt;/td&gt;
&lt;td&gt;Allowed when provider and lease evidence are cited.&lt;/td&gt;
&lt;td&gt;Marketplace selection evidence supports delivery setup.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The worker passed a resource check.&lt;/td&gt;
&lt;td&gt;Allowed when the proof mechanism and scope are cited.&lt;/td&gt;
&lt;td&gt;Worker checks can support availability or authenticity claims.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The job produced a result pointer.&lt;/td&gt;
&lt;td&gt;Allowed when the job and result receipt are cited.&lt;/td&gt;
&lt;td&gt;A receipt is an audit trail.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The model answer is correct because the marketplace has incentives.&lt;/td&gt;
&lt;td&gt;Blocked.&lt;/td&gt;
&lt;td&gt;Incentives are not semantic evaluation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The output is safe because the GPU ran in a trusted environment.&lt;/td&gt;
&lt;td&gt;Blocked unless separate safety evidence exists.&lt;/td&gt;
&lt;td&gt;Attestation is environment evidence, not answer-quality evidence.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A DePIN GPU Market reads as more credible, not less, when the writeup refuses the broad claim. Incentives, receipts, reputation, and attestation make compute delivery easier to inspect. The model's answer still has to earn its own evidence.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>FHE Prompt Privacy: The Visible Envelope Around an Encrypted Prompt</title>
      <dc:creator>AI x Crypto Systems</dc:creator>
      <pubDate>Fri, 05 Jun 2026 11:35:05 +0000</pubDate>
      <link>https://dev.to/aicryptosystems/fhe-prompt-privacy-the-visible-envelope-around-an-encrypted-prompt-3970</link>
      <guid>https://dev.to/aicryptosystems/fhe-prompt-privacy-the-visible-envelope-around-an-encrypted-prompt-3970</guid>
      <description>&lt;h1&gt;
  
  
  FHE Prompt Privacy
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Disclosure: AI tools were used for source collection and editorial review. The article was written by a human author, who checked the facts, code, and conclusions.&lt;/p&gt;

&lt;p&gt;Crypto risk disclosure: This article is a technical explanation, not investment advice. It is not a recommendation to buy, sell or hold any cryptoasset.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Review FHE Prompt Privacy as a visible envelope, not as a slogan about hidden prompts. The payload can be ciphertext while the request still exposes plenty: when it moved, where it went, how large it was, which account or wallet route paid for it, which policy touched it, and which logs survived. The useful claim is smaller, and it lasts longer: the prompt payload was encrypted, and these surrounding fields stayed visible.&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.amazonaws.com%2Fuploads%2Farticles%2Fswt1kv89jib5jz3hwuqd.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.amazonaws.com%2Fuploads%2Farticles%2Fswt1kv89jib5jz3hwuqd.png" alt="Cover image showing encrypted prompt payload inside a visible request envelope" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Payload
&lt;/h2&gt;

&lt;p&gt;Start with the part that is real. &lt;a href="https://openfhe-development.readthedocs.io/en/latest/" rel="noopener noreferrer"&gt;OpenFHE's documentation&lt;/a&gt; describes fully homomorphic encryption as computation over encrypted data without access to the secret key, and it lists multiple FHE schemes in its implementation stack. That backs the payload claim: selected data can stay encrypted during computation.&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.amazonaws.com%2Fuploads%2Farticles%2F7elrftvkkuou6v7hsmlt.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.amazonaws.com%2Fuploads%2Farticles%2F7elrftvkkuou6v7hsmlt.png" alt="Payload boundary separating ciphertext from request envelope metadata" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A payload claim is not a request claim, though. &lt;a href="https://docs.zama.org/protocol/solidity-guides/getting-started/overview" rel="noopener noreferrer"&gt;Zama's FHEVM Solidity overview&lt;/a&gt; describes encrypted Solidity-compatible types and ciphertext handles, along with relayer configuration and access-control mechanisms. Those are useful boundaries, because they show encrypted data handling sitting inside a larger system surface.&lt;/p&gt;

&lt;h2&gt;
  
  
  Envelope
&lt;/h2&gt;

&lt;p&gt;The visible envelope is the part of FHE Prompt Privacy a product review should force into the open. The field names below are an author model for review, not a FHEVM, TFHE-rs, OpenFHE, or OHTTP native format.&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.amazonaws.com%2Fuploads%2Farticles%2Fueou3y7u9pl3h215cwap.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.amazonaws.com%2Fuploads%2Farticles%2Fueou3y7u9pl3h215cwap.png" alt="Visible envelope trace with timing, route, size, account, payment, policy, and log fields" width="800" height="450"&gt;&lt;/a&gt;&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;"request_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;"fhe_prompt_call_2026_06_04_001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"encrypted_payload"&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;"payload_ciphertext_digest"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sha256:ciphertext_bundle"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ciphertext_size_bucket"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"64-128kb"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cleartext_prompt_visible"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&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;"visible_envelope"&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;"request_time_bucket"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"minute_bucket"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"model_or_endpoint_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;"selected_inference_route"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"account_or_wallet_route"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"wallet_or_api_account_alias"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"payment_or_quota_route"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"quota_counter_or_payment_reference"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"client_network_surface"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"transport metadata outside encrypted payload"&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;"policy_surface"&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;"relayer_or_gateway_reference"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"named integration component when source supports it"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"decryption_policy_reference"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"policy id or ACL reference"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"visible_log_surface"&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="s2"&gt;"request accepted"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"ciphertext size bucket"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"policy or decryption event status"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"allowed_claim"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The prompt payload was encrypted for this call, while the envelope fields above remained reviewable."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"blocked_claims"&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="s2"&gt;"The user or session was anonymous."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"The model route was hidden."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"The payment or account route was hidden."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"No metadata leaked."&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;h2&gt;
  
  
  Size
&lt;/h2&gt;

&lt;p&gt;Size deserves its own statement, because ciphertext is still an object that moves. &lt;a href="https://github.com/zama-ai/tfhe-rs" rel="noopener noreferrer"&gt;TFHE-rs&lt;/a&gt; describes a Rust implementation of TFHE for Boolean and integer arithmetic over encrypted data, and its feature list includes ciphertext and server-key compression for efficient data transfer. That alone does not prove a metadata leak, but it is enough to put transfer size on the review list.&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.amazonaws.com%2Fuploads%2Farticles%2Fl8giectxx3ij914wc2hv.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.amazonaws.com%2Fuploads%2Farticles%2Fl8giectxx3ij914wc2hv.png" alt="Ciphertext size bucket showing payload hidden but size class visible" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The practical claim should use buckets, not exact drama. A reviewer does not need to say the ciphertext reveals the prompt. They can say the service still exposes a size class, unless the system pads, batches, or otherwise controls the transfer surface. FHE Prompt Privacy reads stronger when that residual size field gets named instead of ignored.&lt;/p&gt;

&lt;h2&gt;
  
  
  Route
&lt;/h2&gt;

&lt;p&gt;Route needs a statement too, because encrypted computation still happens somewhere. The FHE paper &lt;a href="https://eprint.iacr.org/2024/1718.pdf" rel="noopener noreferrer"&gt;Drifting Towards Better Error Probabilities in Fully Homomorphic Encryption Schemes&lt;/a&gt; is useful here only for the cryptographic boundary: FHE schemes include key generation, encryption, decryption, and evaluation over ciphertexts, with correctness and security tied to failure probability and security notions. What the paper does not say is that endpoint choice, account route, or payment route disappears.&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.amazonaws.com%2Fuploads%2Farticles%2F8tfhbl61ohhmbw85c2pv.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.amazonaws.com%2Fuploads%2Farticles%2F8tfhbl61ohhmbw85c2pv.png" alt="Route map showing endpoint, wallet/account route, and policy surface outside payload encryption" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The route field is where AI x crypto systems tend to overclaim. A wallet-funded request, quota account, contract call, relayer path, or gateway path can stay visible even when the prompt text does not. A technical article should not turn that into a trading point or a token claim. It should keep the route as an operational privacy field.&lt;/p&gt;

&lt;h2&gt;
  
  
  Analogy
&lt;/h2&gt;

&lt;p&gt;Oblivious HTTP is a useful warning, because encrypted messages still need deployment boundaries. &lt;a href="https://www.rfc-editor.org/rfc/rfc9458.html" rel="noopener noreferrer"&gt;RFC 9458&lt;/a&gt; describes a protocol for forwarding encrypted HTTP messages so an origin server cannot link requests to a client, while it also places limited trust in forwarding nodes. The same RFC then spends real space on security, privacy, traffic-analysis, client-clock, and operational considerations.&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.amazonaws.com%2Fuploads%2Farticles%2F40ra4415mv0o3rlch9az.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.amazonaws.com%2Fuploads%2Farticles%2F40ra4415mv0o3rlch9az.png" alt="OHTTP analogy card showing encrypted message privacy is not full envelope erasure" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That standard is not evidence that an FHE prompt system is private. The analogy is narrower than that: serious encrypted-message designs still discuss the surrounding envelope. Hold FHE Prompt Privacy to the same discipline before it claims more than payload confidentiality.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision
&lt;/h2&gt;

&lt;p&gt;The safe decision is to publish the small claim and block the broad one. FHE Prompt Privacy can say that a selected prompt payload was encrypted for a named computation under a named policy. It should not say that the request, user, session, route, model choice, payment route, and logs became private, unless each of those surfaces has its own evidence.&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.amazonaws.com%2Fuploads%2Farticles%2Fdbm6jpn0s5ifc0q314fs.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.amazonaws.com%2Fuploads%2Farticles%2Fdbm6jpn0s5ifc0q314fs.png" alt="Decision card converting broad privacy slogans into allowed claims" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Use this final check before accepting an encrypted-prompt claim:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Claim&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Reason&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The prompt payload was encrypted for this computation.&lt;/td&gt;
&lt;td&gt;Allowed if the implementation evidence names the encrypted fields.&lt;/td&gt;
&lt;td&gt;Payload confidentiality is the narrow FHE claim.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The service cannot see the user's task.&lt;/td&gt;
&lt;td&gt;Blocked unless route, timing, size, and model identifiers are controlled.&lt;/td&gt;
&lt;td&gt;The envelope may still classify the workflow.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The wallet or account route is private.&lt;/td&gt;
&lt;td&gt;Blocked unless a separate source proves that route is hidden.&lt;/td&gt;
&lt;td&gt;FHE over payloads does not erase payment or account metadata.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The logs are safe.&lt;/td&gt;
&lt;td&gt;Blocked unless retention, redaction, and debug behavior are written down.&lt;/td&gt;
&lt;td&gt;Logging is a system policy, not a cryptographic side effect.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;FHE Prompt Privacy becomes credible when the visible envelope ships as part of the artifact. The best review output is not a bigger slogan. It is a receipt that shows exactly which fields were encrypted, which fields remained visible, and which claims the team refused to make.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Proof of Compute: The Receipt Is Not the Benchmark</title>
      <dc:creator>AI x Crypto Systems</dc:creator>
      <pubDate>Thu, 04 Jun 2026 08:31:25 +0000</pubDate>
      <link>https://dev.to/aicryptosystems/proof-of-compute-the-receipt-is-not-the-benchmark-lgj</link>
      <guid>https://dev.to/aicryptosystems/proof-of-compute-the-receipt-is-not-the-benchmark-lgj</guid>
      <description>&lt;h1&gt;
  
  
  Proof of Compute
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Disclosure: AI tools were used for source collection and editorial review. The article was written by a human author, who checked the facts, code, and conclusions.&lt;/p&gt;

&lt;p&gt;Crypto risk disclosure: This article is a technical explanation, not investment advice. It is not a recommendation to buy, sell or hold any cryptoasset.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A proof-of-compute receipt should prove one job. It should not put on benchmark theater. A benchmark can describe a hardware class, a runtime mode, or the shape of a chosen workload. A receipt does something narrower: it records what ran, where the verifier boundary sat, what output came out, and which claim is actually safe to make.&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.amazonaws.com%2Fuploads%2Farticles%2Fh3dn7hbfge25vrsdpxde.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.amazonaws.com%2Fuploads%2Farticles%2Fh3dn7hbfge25vrsdpxde.png" alt="Proof of Compute cover showing benchmark claim separated from job receipt" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Benchmark Boundary
&lt;/h2&gt;

&lt;p&gt;The benchmark boundary is where compute claims tend to get too loud. &lt;a href="https://docs.phala.com/phala-cloud/confidential-ai/overview" rel="noopener noreferrer"&gt;Phala Cloud's Confidential AI documentation&lt;/a&gt; describes GPU TEE modes, and it points separately to benchmark material for GPU TEE performance. That separation is the whole point. Performance evidence can back a capacity discussion, but it is not a receipt for one model job.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqp5mflcjr8dub4gsqr7n.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.amazonaws.com%2Fuploads%2Farticles%2Fqp5mflcjr8dub4gsqr7n.png" alt="Claim boundary ladder separating benchmark, attestation, receipt, and allowed claim" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The same boundary turns up in decentralized ML. &lt;a href="https://docs.gensyn.ai/" rel="noopener noreferrer"&gt;Gensyn's documentation&lt;/a&gt; frames execution, verification, communication, and coordination as protocol components for ML workloads. Its &lt;a href="https://docs.gensyn.ai/products-and-research" rel="noopener noreferrer"&gt;Products &amp;amp; Research page&lt;/a&gt; describes Verde as a verification system for decentralized machine learning and mentions reproducible operators. That helps with the verification problem. It is not a free pass to say every job on every network ships with a replayable proof.&lt;/p&gt;

&lt;h2&gt;
  
  
  Receipt Fields
&lt;/h2&gt;

&lt;p&gt;A compute receipt should open with fields a reviewer can replay. The list below is an author model for editorial and marketplace review, not a protocol-native standard.&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.amazonaws.com%2Fuploads%2Farticles%2Fngqnsei3gdr1xz7nmtcj.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.amazonaws.com%2Fuploads%2Farticles%2Fngqnsei3gdr1xz7nmtcj.png" alt="Compute proof receipt schema with workload digest, verifier policy, output digest, and allowed claim" width="800" height="450"&gt;&lt;/a&gt;&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;"receipt_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;"compute_receipt_2026_06_04_001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"job_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;"inference_batch_7f3a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"workload_digest"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sha256:container_or_model_bundle"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"input_commitment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sha256:redacted_prompt_batch"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"runtime_measurement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tee_or_reproducible_operator_trace"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"measurement_digest"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sha256:runtime_measurement"&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;"benchmark_result"&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;"optional_capacity_context"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"claim_limit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"capacity context only; not per-job proof"&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;"attestation_result"&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;"verifier"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"named_verifier_endpoint"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"evidence_digest"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sha256:attestation_or_trace"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"claim_limit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"runtime or environment evidence only"&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;"verifier_policy_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;"gpu_tee_policy_v3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"policy_decision"&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;"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;"pass"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"evidence matched policy reference values"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"policy_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;"gpu_tee_policy_v3"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"output_digest"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sha256:result_bundle"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"allowed_claim"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"This job ran under the named verifier policy and produced the output digest above."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"blocked_claims"&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="s2"&gt;"This proves the model answer is true."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"This proves the provider is always faster."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"This benchmark proves this job completed."&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;A useful receipt keeps &lt;code&gt;benchmark_result&lt;/code&gt;, &lt;code&gt;attestation_result&lt;/code&gt;, and &lt;code&gt;policy_decision&lt;/code&gt; apart, because each one answers a different question. &lt;code&gt;benchmark_result&lt;/code&gt; carries capacity context. &lt;code&gt;attestation_result&lt;/code&gt;, or a deterministic trace, backs a runtime claim. &lt;code&gt;policy_decision&lt;/code&gt; records whether the verifier accepted, rejected, or held the evidence. Whatever those three inputs say, the final &lt;code&gt;allowed_claim&lt;/code&gt; should come out smaller than all of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Attestation Boundary
&lt;/h2&gt;

&lt;p&gt;Attestation can strengthen a compute receipt, but it stays bounded evidence. &lt;a href="https://docs.nvidia.com/attestation/attestation-client-tools-sdk/latest/gpu_and_switch_attestation.html" rel="noopener noreferrer"&gt;NVIDIA's Attestation SDK documentation&lt;/a&gt; lists GPU attestation prerequisites for supported Confidential Computing GPUs and separates local attestation from remote. &lt;a href="https://docs.nvidia.com/datacenter/cloud-native/confidential-containers/latest/attestation.html" rel="noopener noreferrer"&gt;NVIDIA's Confidential Containers attestation documentation&lt;/a&gt; describes remote attestation as proving guest TEE state to a verifier before secrets are released.&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.amazonaws.com%2Fuploads%2Farticles%2Fi5tfaa95eyqblxyb66d4.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.amazonaws.com%2Fuploads%2Farticles%2Fi5tfaa95eyqblxyb66d4.png" alt="Verifier path showing policy denial as a useful result rather than proof of failure" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The policy denial case is the one worth keeping. NVIDIA's Confidential Containers quickstart explains that a denied resource request can still confirm three things: the client reached the key broker, the attestation service evaluated the request, and policy rejected it. So a failed receipt is not a wasted one. It can prove the verifier path was exercised while refusing the stronger claim.&lt;/p&gt;

&lt;h2&gt;
  
  
  Provider Boundary
&lt;/h2&gt;

&lt;p&gt;Provider constraints belong in the receipt, because infrastructure quietly changes what a compute claim means. &lt;a href="https://akash.network/docs/learn/core-concepts/persistent-storage/" rel="noopener noreferrer"&gt;Akash's persistent storage documentation&lt;/a&gt; separates ephemeral from persistent storage, then notes that persistent storage is provider-local and does not survive lease termination or provider migration. That is not a proof-of-compute system on its own. It is exactly the kind of deployment boundary a receipt should not hide.&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.amazonaws.com%2Fuploads%2Farticles%2F6h4yjqg7mmhza2qey8cz.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.amazonaws.com%2Fuploads%2Farticles%2F6h4yjqg7mmhza2qey8cz.png" alt="Bad compute claims redlined into scoped evidence claims" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Bad claim&lt;/th&gt;
&lt;th&gt;Safer receipt claim&lt;/th&gt;
&lt;th&gt;Why the rewrite matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"The benchmark proves the job ran."&lt;/td&gt;
&lt;td&gt;"The benchmark gives capacity context; the receipt must prove this job."&lt;/td&gt;
&lt;td&gt;Benchmark evidence is class-level, not job-level.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"TEE attestation proves the answer is true."&lt;/td&gt;
&lt;td&gt;"TEE attestation supports the runtime/environment claim."&lt;/td&gt;
&lt;td&gt;Runtime state is not semantic correctness.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"The verifier denied the request, so nothing was learned."&lt;/td&gt;
&lt;td&gt;"The verifier path was reached and policy rejected the evidence."&lt;/td&gt;
&lt;td&gt;A denial can be a useful audit result.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"The provider has persistent storage, so the artifact is durable anywhere."&lt;/td&gt;
&lt;td&gt;"The storage boundary is provider-local unless another backup path is shown."&lt;/td&gt;
&lt;td&gt;Deployment constraints affect replayability.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Developer Rule
&lt;/h2&gt;

&lt;p&gt;Proof of compute earns its name only when the allowed claim is smaller than the marketing claim. Benchmark numbers stay in the capacity box, attestation in the runtime box, output digests in the job box. After that, the receipt can say exactly what a reviewer is allowed to repeat.&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.amazonaws.com%2Fuploads%2Farticles%2Fqz4znzzpzzgyjf808m1n.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.amazonaws.com%2Fuploads%2Farticles%2Fqz4znzzpzzgyjf808m1n.png" alt="Audit checklist for publishing a proof-of-compute claim" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;None of this has to make compute claims boring. It has to make them reviewable. If a developer cannot point to the workload digest, the verifier policy, the output digest, and the allowed claim, then the honest label is benchmark or deployment note, not proof of compute.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>blockchain</category>
      <category>distributedsystems</category>
      <category>web3</category>
    </item>
    <item>
      <title>No Trading Firewall: The Publish Gate That Blocks Token Calls</title>
      <dc:creator>AI x Crypto Systems</dc:creator>
      <pubDate>Thu, 04 Jun 2026 06:49:49 +0000</pubDate>
      <link>https://dev.to/aicryptosystems/no-trading-firewall-the-publish-gate-that-blocks-token-calls-3bhf</link>
      <guid>https://dev.to/aicryptosystems/no-trading-firewall-the-publish-gate-that-blocks-token-calls-3bhf</guid>
      <description>&lt;h1&gt;
  
  
  No Trading Firewall
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Disclosure: AI tools were used for source collection and editorial review. The article was written by a human author, who checked the facts, code, and conclusions.&lt;/p&gt;

&lt;p&gt;Crypto risk disclosure: This article is a technical explanation, not investment advice. It is not a recommendation to buy, sell or hold any cryptoasset.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A no-trading firewall belongs at the publish transition, not in a footer. A draft can be repaired quietly. A public DEV update changes the blast radius, so the pipeline should ask a narrower question before it sends &lt;code&gt;published:true&lt;/code&gt;: did the AI-assisted article stay technical, or did it become a token call?&lt;/p&gt;

&lt;p&gt;The artifact below is a publish-gate test trace. It does not prove legal compliance, DEV acceptance, or model judgment. It only records why a draft can stay editable while the public transition stays blocked.&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.amazonaws.com%2Fuploads%2Farticles%2F6174bsd4tr5oip0z9uva.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.amazonaws.com%2Fuploads%2Farticles%2F6174bsd4tr5oip0z9uva.png" alt="No Trading Firewall publish gate overview" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Publish Transition
&lt;/h2&gt;

&lt;p&gt;The firewall is easier to audit when the transition is explicit:&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.amazonaws.com%2Fuploads%2Farticles%2Fsn7tgkx7oot24qzdf5nw.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.amazonaws.com%2Fuploads%2Farticles%2Fsn7tgkx7oot24qzdf5nw.png" alt="DEV payload diff for the published field transition" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;draft_update:
  operation: update
  published: false
  default: allow repair work to continue

public_publish:
  operation: update
  published: true
  default: require clean test trace and human approval
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://developers.forem.com/api/v1" rel="noopener noreferrer"&gt;Forem's API documentation&lt;/a&gt; describes article create and update transport, including the published state. A successful transport is not editorial approval. The gate sits before transport, and it should be stricter when an update moves from draft maintenance to public publication.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test Set
&lt;/h2&gt;

&lt;p&gt;The firewall needs a test set, not just a list of forbidden words. These rules are the author's editorial model, not DEV-native, SEC-native, FINRA-native, FTC-native, or OpenAI-native labels.&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.amazonaws.com%2Fuploads%2Farticles%2F8ilt1t8twowclhugfift.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.amazonaws.com%2Fuploads%2Farticles%2F8ilt1t8twowclhugfift.png" alt="Redlined unsafe crypto excerpts rewritten into technical boundaries" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Test case&lt;/th&gt;
&lt;th&gt;Input excerpt&lt;/th&gt;
&lt;th&gt;Expected rule&lt;/th&gt;
&lt;th&gt;Decision&lt;/th&gt;
&lt;th&gt;Safe output&lt;/th&gt;
&lt;th&gt;Public transition allowed?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;T-PRICE-01&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;"ETH will rip after the next unlock"&lt;/td&gt;
&lt;td&gt;&lt;code&gt;trading.price_prediction&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;fail&lt;/td&gt;
&lt;td&gt;Explain the unlock mechanism without forecasting price&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;T-HOLD-02&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;"keep holding and farm the safer yield route"&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;trading.buy_sell_hold_call&lt;/code&gt; and &lt;code&gt;trading.yield_promise&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;fail&lt;/td&gt;
&lt;td&gt;Describe signer, slashing, withdrawal, and protocol-risk boundaries&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;T-DISCLOSE-03&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;"This tool paid us, but keep that out of the article"&lt;/td&gt;
&lt;td&gt;&lt;code&gt;promotion.hidden_relationship&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;hold&lt;/td&gt;
&lt;td&gt;Add material-relationship disclosure before any argument, using the &lt;a href="https://www.ftc.gov/business-guidance/resources/ftcs-endorsement-guides-what-people-are-asking" rel="noopener noreferrer"&gt;FTC endorsement guide FAQ&lt;/a&gt; as context&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;T-AI-04&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;AI-assisted draft without the AI disclosure block&lt;/td&gt;
&lt;td&gt;&lt;code&gt;disclosure.missing_ai_assistance&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;hold&lt;/td&gt;
&lt;td&gt;Add the human-authorship and AI-assistance disclosure&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;T-CUSTODY-05&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;"Paste your seed phrase so the support agent can check it"&lt;/td&gt;
&lt;td&gt;&lt;code&gt;custody.seed_phrase_request&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;fail&lt;/td&gt;
&lt;td&gt;Remove the request and explain custody risk with the &lt;a href="https://www.investor.gov/introduction-investing/general-resources/news-alerts/alerts-bulletins/investor-bulletins/crypto-asset-custody-basics-retail-investors-investor-bulletin-0" rel="noopener noreferrer"&gt;Investor.gov custody bulletin&lt;/a&gt; as context&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;T-TECH-06&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;"Name the signer authority, slashing exposure, withdrawal assumption, and human approval boundary"&lt;/td&gt;
&lt;td&gt;&lt;code&gt;technical_boundary_explanation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;pass&lt;/td&gt;
&lt;td&gt;Keep the infrastructure explanation and source the claims&lt;/td&gt;
&lt;td&gt;yes, after normal review&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://dev.to/terms"&gt;DEV's terms&lt;/a&gt; and &lt;a href="https://dev.to/guidelines-for-ai-assisted-articles-on-dev"&gt;DEV's AI-assisted article guidance&lt;/a&gt; are platform boundaries. &lt;a href="https://www.investor.gov/additional-resources/spotlight/crypto-assets" rel="noopener noreferrer"&gt;Investor.gov crypto-asset material&lt;/a&gt; and &lt;a href="https://www.finra.org/investors/investing/investment-products/crypto-assets" rel="noopener noreferrer"&gt;FINRA crypto-asset material&lt;/a&gt; are risk-context boundaries. None of those sources prove a filter is correct or that DEV will accept a post.&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.amazonaws.com%2Fuploads%2Farticles%2F49dlvoy57kwpuabyhtw7.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.amazonaws.com%2Fuploads%2Farticles%2F49dlvoy57kwpuabyhtw7.png" alt="Source audit stamp showing role and limit for each source family" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Test Trace
&lt;/h2&gt;

&lt;p&gt;The pipeline should preserve the test trace that blocked a public payload. &lt;a href="https://platform.openai.com/docs/guides/structured-outputs" rel="noopener noreferrer"&gt;OpenAI Structured Outputs&lt;/a&gt; can help keep the model response inside a schema, and &lt;a href="https://json-schema.org/draft/2020-12/json-schema-core" rel="noopener noreferrer"&gt;JSON Schema 2020-12&lt;/a&gt; can validate the trace shape. Neither tool validates the meaning of a financial claim.&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;"trace_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;"publish_gate_trace_2026_06_03_001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"article_slug"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"restaking-agent-risk-map"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"source_revision"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"git:9f2c1ab"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"policy_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ai_crypto_no_trading_firewall.v1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"transition"&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;"from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"draft_update"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"public_publish"&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;"dev_payload_intent"&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;"operation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"update"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"published"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="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;"test_cases"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"test_case_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;"T-PRICE-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"input_excerpt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ETH will rip after the next unlock"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"expected_decision"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fail"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"actual_decision"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fail"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"rule_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;"trading.price_prediction"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"source_ids"&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;"investor_gov_crypto_assets"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"safe_output"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Explain the unlock mechanism without forecasting price."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"human_approval_required"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"test_case_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;"T-DISCLOSE-03"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"input_excerpt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"This tool paid us, but keep that out of the article"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"expected_decision"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hold"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"actual_decision"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hold"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"rule_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;"promotion.hidden_relationship"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"source_ids"&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;"dev_terms"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ftc_endorsement_guides_faq"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"safe_output"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Disclose the material relationship before any technical argument or do not publish."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"human_approval_required"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"test_case_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;"T-AI-04"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"input_excerpt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AI-assisted draft without the required article disclosure"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"expected_decision"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hold"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"actual_decision"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hold"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"rule_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;"disclosure.missing_ai_assistance"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"source_ids"&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;"dev_ai_guidelines"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dev_code_of_conduct"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"safe_output"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Add the human-authorship and AI-assistance disclosure."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"human_approval_required"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"source_map"&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;"dev_terms"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://dev.to/terms"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dev_ai_guidelines"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://dev.to/guidelines-for-ai-assisted-articles-on-dev"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dev_code_of_conduct"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://dev.to/code-of-conduct"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ftc_endorsement_guides_faq"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.ftc.gov/business-guidance/resources/ftcs-endorsement-guides-what-people-are-asking"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"investor_gov_crypto_assets"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.investor.gov/additional-resources/spotlight/crypto-assets"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"finra_crypto_assets"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.finra.org/investors/investing/investment-products/crypto-assets"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"forem_api_v1"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://developers.forem.com/api/v1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"openai_structured_outputs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://platform.openai.com/docs/guides/structured-outputs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"openai_agents_guardrails"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://openai.github.io/openai-agents-python/guardrails/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"openai_moderation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://platform.openai.com/docs/guides/moderation"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"json_schema_core_2020_12"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://json-schema.org/draft/2020-12/json-schema-core"&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;"openai_guardrail_result"&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;"structured_output_parse"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"refusal"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"moderation_flagged"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"moderation_limit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"OpenAI Moderation has no dedicated financial-promotion category."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"agents_sdk_tripwire_triggered"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="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;"human_approval_required"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dev_payload_blocked"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"final_decision"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fail"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"limitations"&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="s2"&gt;"Editorial publish gate only; not legal advice."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Structured output validates shape, not truth."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"A model refusal, parse failure, missing source, or blocked rule should force hold."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Passing this trace does not prove DEV acceptance."&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 trace is deliberately heavier than a receipt. A receipt says what happened. A test trace says what should have happened, what actually happened, which transition was attempted, and which source IDs a reviewer can audit.&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.amazonaws.com%2Fuploads%2Farticles%2F0f8gixyok8pbyp8vymwf.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.amazonaws.com%2Fuploads%2Farticles%2F0f8gixyok8pbyp8vymwf.png" alt="Decision ledger showing why the public update stayed blocked" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Guardrail Limits
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://openai.github.io/openai-agents-python/guardrails/" rel="noopener noreferrer"&gt;OpenAI Agents SDK guardrails&lt;/a&gt; describe input and output checks with tripwire behavior. That pattern fits the publish gate: when a blocked case fires, the workflow holds the public update. &lt;a href="https://platform.openai.com/docs/guides/moderation" rel="noopener noreferrer"&gt;OpenAI Moderation&lt;/a&gt; can still add general safety signals, but OpenAI Moderation is not the investment-advice detector for this article.&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.amazonaws.com%2Fuploads%2Farticles%2Fo123mi2v50yzemu2zazd.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.amazonaws.com%2Fuploads%2Farticles%2Fo123mi2v50yzemu2zazd.png" alt="Moderation limit meter separating general safety from publish-gate rules" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The fallback should stay boring. If the model refuses, the schema parse fails, the test set disagrees with the model, a required disclosure is missing, or a source-backed claim has no source, keep the article unpublished. Do not publish first and hope a disclaimer cleans it up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Developer Rule
&lt;/h2&gt;

&lt;p&gt;No Trading Firewall is useful when the gate can be replayed. Keep the draft editable, test the public transition, record expected versus actual decisions, map every boundary to an approved source URL, and require a human before &lt;code&gt;published:true&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F056hzo1t0hd8egmdbx0e.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.amazonaws.com%2Fuploads%2Farticles%2F056hzo1t0hd8egmdbx0e.png" alt="Human approval strip before DEV API public update" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The point isn't to make crypto writing timid. It's to keep AI-assisted crypto writing technical. A model can help explain wallets, proofs, agents, and payments. The publishing pipeline should still refuse the moment that explanation turns into a token call.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>cryptocurrency</category>
      <category>devops</category>
    </item>
    <item>
      <title>AI Crypto Glossary: Four Words That Break Wallet Agents</title>
      <dc:creator>AI x Crypto Systems</dc:creator>
      <pubDate>Wed, 03 Jun 2026 11:54:17 +0000</pubDate>
      <link>https://dev.to/aicryptosystems/ai-crypto-glossary-four-words-that-break-wallet-agents-2a6b</link>
      <guid>https://dev.to/aicryptosystems/ai-crypto-glossary-four-words-that-break-wallet-agents-2a6b</guid>
      <description>&lt;h1&gt;
  
  
  AI Crypto Glossary
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Disclosure: AI tools were used for source collection and editorial review. The article was written by a human author, who checked the facts, code, and conclusions.&lt;/p&gt;

&lt;p&gt;Crypto risk disclosure: This article is a technical explanation, not investment advice. It is not a recommendation to buy, sell or hold any cryptoasset.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Start a crypto glossary from a bad product ticket, not a dictionary entry. Take this one: "Agent should verify the token proof in context before moving funds." It reads as precise, right up until the wallet workflow asks which token, which proof, which context, and whose authority the product owner actually meant.&lt;/p&gt;

&lt;p&gt;The risk here isn't vocabulary confusion. In AI x crypto systems a vague noun can quietly turn into a permission boundary. So the default stays blunt: no namespace, no action.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bad Ticket
&lt;/h2&gt;

&lt;p&gt;That ticket hands the agent too much room: "Verify the token proof in context, then move funds." An AI workflow can read it as a model task. A wallet layer can read the exact same words as an asset task.&lt;/p&gt;

&lt;p&gt;The glossary's job is to block the ticket before any signing path opens. A workflow can flag the ambiguity, collect the missing namespaces, and propose a safer rewrite. What it shouldn't do is spend from a wallet just because the sentence wore confident technical words.&lt;/p&gt;

&lt;h2&gt;
  
  
  Token: Budget Or Asset?
&lt;/h2&gt;

&lt;p&gt;Token breaks first, because AI and crypto borrow the same word for objects that do very different jobs. OpenAI's &lt;a href="https://github.com/openai/tiktoken" rel="noopener noreferrer"&gt;&lt;code&gt;tiktoken&lt;/code&gt;&lt;/a&gt; repository describes language models as seeing text as sequences of tokens produced by byte-pair encoding. &lt;a href="https://eips.ethereum.org/EIPS/eip-20" rel="noopener noreferrer"&gt;EIP-20&lt;/a&gt;, by contrast, defines a smart-contract interface for fungible tokens, and &lt;a href="https://eips.ethereum.org/EIPS/eip-721" rel="noopener noreferrer"&gt;EIP-721&lt;/a&gt; defines one for non-fungible tokens.&lt;/p&gt;

&lt;p&gt;So make the ticket commit: text budget or onchain asset? If token means model input, the discussion is about tokenizer units and context budget. If it means an onchain asset, the system has to name the interface, amount, identifier, owner, approval, and transfer boundary before anything else.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proof: Statement Or Comfort Word?
&lt;/h2&gt;

&lt;p&gt;Proof breaks second, because the word stretches across a formal artifact, a signature field, a credential integrity mechanism, or just loose evidence. &lt;a href="https://www.w3.org/TR/vc-data-model-2.0/" rel="noopener noreferrer"&gt;W3C Verifiable Credentials Data Model 2.0&lt;/a&gt; supports credentials with proof material attached to issuer statements, and &lt;a href="https://www.rfc-editor.org/rfc/rfc8785" rel="noopener noreferrer"&gt;RFC 8785&lt;/a&gt; supports canonical JSON when you need stable bytes before hashing or signing.&lt;/p&gt;

&lt;p&gt;Make the proof sentence answer one question up front: proof of what exact statement? A credential proof can back the claim that an issuer made a statement over certain data. A digest can identify a canonical byte representation under the chosen hash function. It does not validate meaning. None of it proves that a model is safe, a token is valuable, a benchmark is fair, or a wallet action is wise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Context: Prompt Or Consent?
&lt;/h2&gt;

&lt;p&gt;Context breaks third, because model context is not chain context. &lt;a href="https://modelcontextprotocol.io/specification/2025-06-18/architecture" rel="noopener noreferrer"&gt;Model Context Protocol&lt;/a&gt; describes a protocol surface for exposing context, tools, and resources to model applications. Useful for wiring context into a model workflow. But MCP context is not wallet-specific consent, onchain state, or transaction finality, and MCP host authorization sits separate from blockchain or wallet authorization.&lt;/p&gt;

&lt;p&gt;Split context into at least four buckets: prompt/model context, source context, wallet context, and chain context. A model can read a whole source bundle and still hold no permission to act. A wallet can hold state and still have no proof the model understood what the user wanted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent: Workflow Or Authority?
&lt;/h2&gt;

&lt;p&gt;Agent breaks fourth, because an AI agent and a wallet actor are not the same boundary. &lt;a href="https://developers.openai.com/api/docs/guides/agents" rel="noopener noreferrer"&gt;OpenAI's Agents documentation&lt;/a&gt; describes applications that connect models with tools, guardrails, knowledge, orchestration, evaluation, and monitoring. EIP-20 and EIP-721 describe approval, spender, owner, and operator surfaces inside smart-contract interfaces.&lt;/p&gt;

&lt;p&gt;Treat agent as a workflow label until a separate authority layer says otherwise. An AI workflow can explain, classify, and ask for confirmation. It does not get to become a signer, spender, operator, or adviser just because a product requirement called it an agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Collision Table
&lt;/h2&gt;

&lt;p&gt;This table isn't a glossary to memorize. It's a stop sign for the product ticket.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Word&lt;/th&gt;
&lt;th&gt;AI namespace&lt;/th&gt;
&lt;th&gt;Crypto namespace&lt;/th&gt;
&lt;th&gt;Missing detail&lt;/th&gt;
&lt;th&gt;Default action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Token&lt;/td&gt;
&lt;td&gt;BPE or tokenizer unit for model input&lt;/td&gt;
&lt;td&gt;ERC-20 amount, ERC-721 identifier, or another asset interface&lt;/td&gt;
&lt;td&gt;Is the system budgeting text or touching an asset?&lt;/td&gt;
&lt;td&gt;Ask before action&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Proof&lt;/td&gt;
&lt;td&gt;Evaluation artifact, source evidence, or model output support&lt;/td&gt;
&lt;td&gt;Credential proof, digest, signature requiring a separate validator, or protocol-specific proof only when separately sourced&lt;/td&gt;
&lt;td&gt;What exact statement is proven?&lt;/td&gt;
&lt;td&gt;Refuse broad claims&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context&lt;/td&gt;
&lt;td&gt;Prompt window, retrieved files, MCP resource, tool output&lt;/td&gt;
&lt;td&gt;Wallet state, chain state, transaction state, policy state&lt;/td&gt;
&lt;td&gt;Which state can the system rely on?&lt;/td&gt;
&lt;td&gt;Explain only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent&lt;/td&gt;
&lt;td&gt;Model workflow with tools and guardrails&lt;/td&gt;
&lt;td&gt;Signer, spender, operator, approved address, human approver&lt;/td&gt;
&lt;td&gt;Who has authority to act?&lt;/td&gt;
&lt;td&gt;Block spending&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Keep the default action visible. The workflow asks, explains, or blocks until someone supplies the missing detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pre-Action Route Log
&lt;/h2&gt;

&lt;p&gt;The practical artifact here is a pre-action route log. Call the internal field &lt;code&gt;term_route_receipt&lt;/code&gt; if you like, but the useful behavior is routing, not receipt theater.&lt;/p&gt;

&lt;p&gt;Bad requirement:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent should verify the token proof in context before moving funds.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Blocked route:&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;"receipt_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;"ai_crypto.term_route_receipt.v1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"input_sentence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Agent should verify the token proof in context before moving funds."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"term_routes"&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;"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;span class="nl"&gt;"llm_token_namespace"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_selected"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"erc_token_namespace"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ambiguous"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"required_detail"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ERC-20 contract and amount, ERC-721 tokenId, or no asset action"&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;"proof"&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;"selected_namespace"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ambiguous"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"allowed_options"&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;"credential_proof"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"canonical_digest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"signature_requires_separate_validator"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"zk_proof_requires_separate_protocol_source"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"source_evidence"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"required_detail"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"exact statement proven and verifier"&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;"context"&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;"selected_namespace"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ambiguous"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"allowed_options"&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;"prompt_context"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp_resource"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"wallet_state"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chain_state"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"policy_state"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"required_detail"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"which state is authoritative for this action"&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;"agent"&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;"ai_workflow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"present"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"wallet_authority"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_granted"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"required_detail"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"human confirmation or explicit wallet control-plane grant"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"allowed_action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"blocked"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"safe_next_step"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ask_for_namespace_and_authority"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"refusal_reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ambiguous token, proof, context, and agent boundaries"&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;Safe rewrite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Classify whether "token" means model input budget or a specific onchain asset. If it is an asset, do not move funds. Ask for the asset interface, exact proof type, authoritative state source, and wallet authorization boundary first.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Call this what it is: a pre-action language control, not a receipt anyone should trust. The route log verifies nothing about chain state, wallet consent, signatures, or proofs. All it does is stop an ambiguous sentence from turning into a wallet action.&lt;/p&gt;

&lt;h2&gt;
  
  
  Developer Rule
&lt;/h2&gt;

&lt;p&gt;One rule carries all of this, and it's easy to enforce: no namespace, no action. Blunt, yes. Still cheaper than repairing an agent workflow that confused token budget with token balance, or model context with wallet consent.&lt;/p&gt;

&lt;p&gt;That's the practical boundary for AI x crypto systems. A glossary earns its place only when it changes behavior: the agent explains ambiguous language, asks for the missing namespace, and refuses to move funds until authority and proof scope are spelled out.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Onchain Model Card: The Claim Can Change While the Hash Cannot</title>
      <dc:creator>AI x Crypto Systems</dc:creator>
      <pubDate>Tue, 02 Jun 2026 11:41:41 +0000</pubDate>
      <link>https://dev.to/aicryptosystems/onchain-model-card-the-claim-can-change-while-the-hash-cannot-353p</link>
      <guid>https://dev.to/aicryptosystems/onchain-model-card-the-claim-can-change-while-the-hash-cannot-353p</guid>
      <description>&lt;h1&gt;
  
  
  Onchain Model Card
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Disclosure: AI tools were used for source collection and editorial review. The article was written by a human author, who checked the facts, code, and conclusions.&lt;/p&gt;

&lt;p&gt;Crypto risk disclosure: This article is a technical explanation, not investment advice. It is not a recommendation to buy, sell or hold any cryptoasset.&lt;/p&gt;
&lt;/blockquote&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.amazonaws.com%2Fuploads%2Farticles%2F6ws7u7xezk29f8dmvgg9.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.amazonaws.com%2Fuploads%2Farticles%2F6ws7u7xezk29f8dmvgg9.png" alt="Onchain model card claim digest change" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The dangerous version of an onchain model card is a permanent pointer aimed at a claim that can quietly change somewhere else. A model page can be improved, corrected, softened, or stripped of claims. Meanwhile the chain entry keeps looking stable, even though the evidence behind it has already moved.&lt;/p&gt;

&lt;p&gt;That is the AI x crypto problem in one sentence. The job of Onchain Model Card is to make model-card claims harder to rewrite silently, not to pretend that a hash turns a model card into proof of safety, license rights, benchmark truth, training-data provenance, or runtime behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Change Failure
&lt;/h2&gt;

&lt;p&gt;The failure starts with a sentence that sounds harmless: "This model is approved for support triage." A team later edits the card to say "experimental support triage," but the old onchain reference still points users toward the same model name.&lt;/p&gt;

&lt;p&gt;Onchain Model Card needs a stricter object than a name. That object should record which card bytes were reviewed, which claim set was anchored, who issued the statement, what the statement replaced, and what the statement refuses to prove.&lt;/p&gt;

&lt;h2&gt;
  
  
  Card Scope
&lt;/h2&gt;

&lt;p&gt;Model cards are reporting documents, not magic attestations. &lt;a href="https://arxiv.org/abs/1810.03993" rel="noopener noreferrer"&gt;Model Cards for Model Reporting&lt;/a&gt; frames model cards around intended use, evaluation, limitations, and context.&lt;/p&gt;

&lt;p&gt;That kind of support is useful, and narrow. A model card can explain how a model is meant to be used. It does not prove that the model is safe, licensed, unbiased, or behaving the same way once it sits inside a production system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Repository Scope
&lt;/h2&gt;

&lt;p&gt;In real developer workflows, a card is often a mutable repository document. &lt;a href="https://huggingface.co/docs/hub/model-cards" rel="noopener noreferrer"&gt;Hugging Face Hub Model Cards&lt;/a&gt; describes model cards as Markdown files with metadata and text descriptions, commonly rendered from a model repository README.&lt;/p&gt;

&lt;p&gt;That practical shape is exactly why the onchain receipt needs version control. Record only a repository URL and the receipt captures a place to look, not the claim text that anyone actually reviewed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Receipt Artifact
&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.amazonaws.com%2Fuploads%2Farticles%2Fe1zbdy3an2cdn5tdqgdt.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.amazonaws.com%2Fuploads%2Farticles%2Fe1zbdy3an2cdn5tdqgdt.png" alt="Claim receipt pipeline for model-card claims" width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The practical artifact is a claim receipt, not a model biography.&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;"receipt_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;"ai.model_card_claim_receipt.v1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"card_subject"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"org/model-name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model_repository"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.invalid/org/model-name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"source_revision"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"full_commit_or_release_identifier"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"card_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;"README.md"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"claim_extraction"&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="s2"&gt;"intended_use"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"limitations"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"datasets"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"license_field"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"evaluation_summary"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"version_note"&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;"canonicalization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"RFC8785-JCS-for-extracted-json-claims"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"source_card_digest"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sha256:&amp;lt;raw_readme_or_card_bytes&amp;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;"claim_set_digest"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sha256:&amp;lt;selected_claim_fields&amp;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;"digest_uri"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ni:///sha-256;&amp;lt;claim_set_digest&amp;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;"issuer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"did:example:issuer-key-context"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"signature_profile"&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;"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;"choose_one"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vc_data_integrity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"proof + verificationMethod profile"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"eip712"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"typed-data domain + fields profile"&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;"signature_profile_limits"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"do not mix VC proof fields, RFC8785 canonical JSON, and EIP-712 typed data as one interchangeable profile"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"supersedes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"previous_receipt_hash_or_null"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"effective_from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-06-02T00:00:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"limits"&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="s2"&gt;"card claims only"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"not model weight identity"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"not benchmark truth"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"not license validation"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"not runtime attestation"&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;"optional_onchain_anchor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"author-modeled transaction_receipt_or_event_log_pointer"&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 receipt stays deliberately smaller than the model card. Onchain Model Card earns its keep when it anchors the reviewed claim set and its limits, not when it tries to squeeze every model fact into a chain event.&lt;/p&gt;

&lt;h2&gt;
  
  
  Canonical Bytes
&lt;/h2&gt;

&lt;p&gt;Hashing a claim set means extraction has to happen before canonicalization. The receipt should not pretend to hash the meaning of a free-form Markdown card. It should instead list the card fields it pulled out, serialize those claims as JSON, and hash the canonical representation of that.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc8785" rel="noopener noreferrer"&gt;RFC 8785&lt;/a&gt; gives one JSON canonicalization scheme, and &lt;a href="https://www.rfc-editor.org/rfc/rfc6920" rel="noopener noreferrer"&gt;RFC 6920&lt;/a&gt; supports the broader idea of naming information with hashes.&lt;/p&gt;

&lt;p&gt;The key word is information. A digest can identify the raw card bytes, or the extracted claim-set bytes. What it cannot tell you is whether the benchmark was fair, whether the dataset was lawful, or whether a deployment used the same runtime controls.&lt;/p&gt;

&lt;h2&gt;
  
  
  Claim Statement
&lt;/h2&gt;

&lt;p&gt;Structured claims need issuer context. &lt;a href="https://www.w3.org/TR/vc-data-model-2.0/" rel="noopener noreferrer"&gt;Verifiable Credentials Data Model 2.0&lt;/a&gt; and &lt;a href="https://www.w3.org/TR/vc-data-integrity/" rel="noopener noreferrer"&gt;Verifiable Credential Data Integrity 1.0&lt;/a&gt; are useful patterns for claim statements and integrity-protected data.&lt;/p&gt;

&lt;p&gt;Even then, the boundary has to stay visible. A signed claim says an issuer made a statement over specific data. It does not make the statement true.&lt;/p&gt;

&lt;p&gt;The receipt also should not collapse every signing path into one label. VC Data Integrity, RFC 8785 canonical JSON, and EIP-712 typed data are separate implementation choices, each with its own representation rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Issuer Context
&lt;/h2&gt;

&lt;p&gt;The receipt should name the issuer separately from the model. &lt;a href="https://www.w3.org/TR/did-1.0/" rel="noopener noreferrer"&gt;DID Core&lt;/a&gt; gives a standards-based way to think about decentralized identifiers and verification material.&lt;/p&gt;

&lt;p&gt;None of that identity layer is a trust shortcut. A DID or key context can help a verifier find verification material, but the reader still has to decide whether the issuer is even allowed to make the model-card claim.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ethereum Profile
&lt;/h2&gt;

&lt;p&gt;An Ethereum-adjacent implementation can use typed structured signing instead of a raw string signature. &lt;a href="https://eips.ethereum.org/EIPS/eip-712" rel="noopener noreferrer"&gt;EIP-712&lt;/a&gt; is useful because domain separation and typed fields reduce ambiguity in what was signed.&lt;/p&gt;

&lt;p&gt;That signing profile should stay optional here. Onchain Model Card is about auditable control over claim change. It is not arguing that every model card must commit to one chain, one wallet pattern, or one signature scheme.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chain Pointer
&lt;/h2&gt;

&lt;p&gt;The onchain part should be a pointer to the receipt, not a truth label. Ethereum JSON-RPC documentation for &lt;code&gt;eth_getTransactionReceipt&lt;/code&gt; includes transaction receipt logs, and the Solidity ABI specification explains how events use topics and data.&lt;/p&gt;

&lt;p&gt;That source support is narrow. A transaction receipt or an emitted event can help a reader find the anchored receipt. The chain pointer still cannot prove that the model-card claims are accurate, current, licensed, or safe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Metadata Precedent
&lt;/h2&gt;

&lt;p&gt;Machine-learning metadata already has version and checksum habits. &lt;a href="https://docs.mlcommons.org/croissant/docs/croissant-spec.html" rel="noopener noreferrer"&gt;MLCommons Croissant&lt;/a&gt; is dataset-focused, but its version/checksum pattern shows why reproducibility needs more than a friendly name.&lt;/p&gt;

&lt;p&gt;The precedent only goes so far. A dataset checksum does not graduate into a model-card standard, and a model-card digest does not turn into a dataset provenance proof.&lt;/p&gt;

&lt;h2&gt;
  
  
  Change Diff
&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.amazonaws.com%2Fuploads%2Farticles%2Faoe9mfwp9z63xzz73971.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.amazonaws.com%2Fuploads%2Farticles%2Faoe9mfwp9z63xzz73971.png" alt="Receipt diff showing supersedes relationship" width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The receipt earns more of its keep once the new card is required to point back at the old one. A reviewer can then inspect a change as a diff, instead of trusting whatever the newest page happens to say.&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;Old receipt&lt;/th&gt;
&lt;th&gt;New receipt&lt;/th&gt;
&lt;th&gt;Reader question&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Source revision&lt;/td&gt;
&lt;td&gt;&lt;code&gt;abc123&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;def456&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;What changed in the extracted card claims?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claim set digest&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sha256:old...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sha256:new...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Which claim fields moved?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Intended use&lt;/td&gt;
&lt;td&gt;&lt;code&gt;support triage&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;experimental support triage&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Did the claim narrow?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evaluation note&lt;/td&gt;
&lt;td&gt;&lt;code&gt;internal benchmark&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;internal benchmark plus caveat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Was evidence added or weakened?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supersedes&lt;/td&gt;
&lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sha256:old_receipt...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Is the replacement explicit?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chain pointer&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tx/log A&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tx/log B&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Where was each receipt anchored?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This diff is the core developer control. The chain anchor matters because a change cannot pretend to be the same claim once the digest moves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Refusal Checklist
&lt;/h2&gt;

&lt;p&gt;The receipt should refuse more than it proves.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tempting label&lt;/th&gt;
&lt;th&gt;What the receipt can support&lt;/th&gt;
&lt;th&gt;What the receipt must refuse&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Verified model card&lt;/td&gt;
&lt;td&gt;These card bytes or claim fields were anchored&lt;/td&gt;
&lt;td&gt;The claims are true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Approved model&lt;/td&gt;
&lt;td&gt;An issuer signed a card claim&lt;/td&gt;
&lt;td&gt;The model is safe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reproducible model&lt;/td&gt;
&lt;td&gt;The card source and revision were recorded&lt;/td&gt;
&lt;td&gt;The weights, data, and runtime are identical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Licensed model&lt;/td&gt;
&lt;td&gt;A license field existed in the card&lt;/td&gt;
&lt;td&gt;The license is valid for this use&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Benchmark-backed model&lt;/td&gt;
&lt;td&gt;A benchmark claim appeared in the card&lt;/td&gt;
&lt;td&gt;The benchmark was fair or current&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That checklist is what keeps the receipt honest. Onchain Model Card should make claim drift visible, not promote documentation into certification.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Rule
&lt;/h2&gt;

&lt;p&gt;The safest sentence is boring: "This chain record anchors this model-card claim set, by this issuer, at this version, with these limits." That sentence is narrow enough to audit.&lt;/p&gt;

&lt;p&gt;That is the useful boundary for AI x crypto systems. A model-card hash can keep quiet claim changes from disappearing. It cannot tell a user that the model deserves any trust.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>crypto</category>
      <category>security</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Model Weight Registry: The Name Is Not the Model</title>
      <dc:creator>AI x Crypto Systems</dc:creator>
      <pubDate>Mon, 01 Jun 2026 23:36:52 +0000</pubDate>
      <link>https://dev.to/aicryptosystems/model-weight-registry-the-name-is-not-the-model-5cgo</link>
      <guid>https://dev.to/aicryptosystems/model-weight-registry-the-name-is-not-the-model-5cgo</guid>
      <description>&lt;h1&gt;
  
  
  Model Weight Registry
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Disclosure: AI tools were used for source collection and editorial review. The article was written by a human author, who checked the facts, code, and conclusions.&lt;/p&gt;

&lt;p&gt;Crypto risk disclosure: This article is a technical explanation, not investment advice. It is not a recommendation to buy, sell or hold any cryptoasset.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Model Weight Registry should not treat a model name as a model identity. A name, repository, tag, branch, or user-facing label can point to useful software, but stable identity for AI weights starts with the exact bytes being loaded.&lt;/p&gt;

&lt;p&gt;That boundary matters for AI x crypto systems because onchain claims are expensive to correct after users rely on them. If a contract, agent, or audit trail says "model X," the next question should be "which file, revision, size, digest, and receipt?"&lt;/p&gt;

&lt;h2&gt;
  
  
  Byte Identity
&lt;/h2&gt;

&lt;p&gt;A digest identifies bytes under a chosen algorithm and input. &lt;a href="https://csrc.nist.gov/pubs/fips/180-4/upd1/final" rel="noopener noreferrer"&gt;NIST FIPS 180-4&lt;/a&gt; defines secure hash algorithms, while &lt;a href="https://www.rfc-editor.org/rfc/rfc6920" rel="noopener noreferrer"&gt;RFC 6920&lt;/a&gt; describes naming information with hashes.&lt;/p&gt;

&lt;p&gt;That support is narrow and useful. A SHA-256 digest can say the file bytes match a recorded value; a digest cannot say the model is safe, aligned, licensed, useful, or trained on the right data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Weight Receipt
&lt;/h2&gt;

&lt;p&gt;The practical artifact is a receipt that refuses to overclaim. Instead of a full JSON object, the registry can show the receipt as an audit line with named fields:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Receipt field&lt;/th&gt;
&lt;th&gt;Example value&lt;/th&gt;
&lt;th&gt;Why the field exists&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ai.weight_hash_receipt.v1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Separates this statement from a model card or benchmark&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model label&lt;/td&gt;
&lt;td&gt;&lt;code&gt;org/model-name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Keeps the human pointer visible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source revision&lt;/td&gt;
&lt;td&gt;Full commit hash&lt;/td&gt;
&lt;td&gt;Avoids a floating branch as identity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File path&lt;/td&gt;
&lt;td&gt;&lt;code&gt;model.safetensors&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Names the exact artifact inside the source&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Format and size&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;safetensors&lt;/code&gt;, byte count&lt;/td&gt;
&lt;td&gt;Catches conversion and truncation mistakes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hash&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sha256:&amp;lt;64 hex chars&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Identifies the exact byte sequence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Optional content address&lt;/td&gt;
&lt;td&gt;CID plus construction notes&lt;/td&gt;
&lt;td&gt;Prevents CID/file-hash confusion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Issuer and signature&lt;/td&gt;
&lt;td&gt;Registry key id, EIP-712 profile&lt;/td&gt;
&lt;td&gt;Says who made the statement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Limits&lt;/td&gt;
&lt;td&gt;Byte identity only&lt;/td&gt;
&lt;td&gt;Blocks safety, license, and behavior overclaims&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This receipt is not a universal standard. This receipt is a defensive shape for registries that want to separate exact artifact identity from marketing labels.&lt;/p&gt;

&lt;h2&gt;
  
  
  Canonical Receipt
&lt;/h2&gt;

&lt;p&gt;If the receipt itself is hashed or signed, its representation matters. &lt;a href="https://www.rfc-editor.org/rfc/rfc8785" rel="noopener noreferrer"&gt;RFC 8785&lt;/a&gt; exists because JSON needs canonicalization before stable hashing and signing.&lt;/p&gt;

&lt;p&gt;The registry should therefore decide what is hashed: the model file, the canonical receipt, or both. Mixing those claims is how a model registry starts saying "verified" without saying what was verified.&lt;/p&gt;

&lt;h2&gt;
  
  
  Supply-Chain Pattern
&lt;/h2&gt;

&lt;p&gt;Software supply-chain systems already use the subject-plus-digest pattern. &lt;a href="https://slsa.dev/spec/v1.0/provenance" rel="noopener noreferrer"&gt;SLSA Provenance&lt;/a&gt; and the &lt;a href="https://github.com/in-toto/attestation/blob/main/spec/v1/statement.md" rel="noopener noreferrer"&gt;in-toto Statement specification&lt;/a&gt; bind subjects to names and digests in provenance statements.&lt;/p&gt;

&lt;p&gt;Model Weight Registry can borrow that habit without pretending the problem is solved. The digest gives artifact identity; the provenance statement gives issuer and process context; neither one proves the model's behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tag Boundary
&lt;/h2&gt;

&lt;p&gt;Container registries make the pointer problem familiar. The &lt;a href="https://github.com/opencontainers/image-spec/blob/main/descriptor.md" rel="noopener noreferrer"&gt;OCI descriptor&lt;/a&gt; identifies content with a media type, digest, and size, while tags remain convenient names that can move.&lt;/p&gt;

&lt;p&gt;AI weights need the same discipline. A label such as "latest," "main," or "production" is an operational pointer. A digest and size are the beginning of stable artifact identity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Revision Boundary
&lt;/h2&gt;

&lt;p&gt;Model hubs already expose a better path than floating names. &lt;a href="https://huggingface.co/docs/huggingface_hub/guides/download" rel="noopener noreferrer"&gt;Hugging Face Hub download docs&lt;/a&gt; describe revision-pinned downloads, including branches, tags, and commit identifiers.&lt;/p&gt;

&lt;p&gt;The registry should record the revision, not just the repository name. Without the revision and file path, the phrase "we used org/model-name" is a clue, not an identity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Content Address
&lt;/h2&gt;

&lt;p&gt;Content addressing can help, but Model Weight Registry should not flatten every content address into "the file hash." &lt;a href="https://docs.ipfs.tech/concepts/content-addressing/" rel="noopener noreferrer"&gt;IPFS content-addressing docs&lt;/a&gt; explain content-derived identifiers, while CID construction depends on representation details.&lt;/p&gt;

&lt;p&gt;That caveat belongs in the receipt. A CID is useful when the registry records the CID version, codec, chunking or import method, and the relationship between the CID and the file digest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Signed Statement
&lt;/h2&gt;

&lt;p&gt;A signed receipt can authenticate who made the claim. &lt;a href="https://eips.ethereum.org/EIPS/eip-712" rel="noopener noreferrer"&gt;EIP-712&lt;/a&gt; supports typed structured-data signing with domain separation, which fits a registry receipt better than an opaque string.&lt;/p&gt;

&lt;p&gt;The signature still has a hard limit. A signed false receipt is still false; a signed byte-identity receipt still says nothing about safety, license rights, or training data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Format Boundary
&lt;/h2&gt;

&lt;p&gt;File format is part of the receipt because model weights are not just names. &lt;a href="https://github.com/huggingface/safetensors" rel="noopener noreferrer"&gt;SafeTensors&lt;/a&gt; gives a concrete format context for tensor files and metadata.&lt;/p&gt;

&lt;p&gt;The format field prevents a common mistake: treating a converted artifact as the same object without recording the conversion. Byte identity changes when serialization changes, even if the model is intended to behave similarly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Boundary Table
&lt;/h2&gt;

&lt;p&gt;The registry should keep every claim in its lane.&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;What it can say&lt;/th&gt;
&lt;th&gt;What it cannot say&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Model label&lt;/td&gt;
&lt;td&gt;Human-readable pointer&lt;/td&gt;
&lt;td&gt;Stable identity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Revision&lt;/td&gt;
&lt;td&gt;Source state or commit context&lt;/td&gt;
&lt;td&gt;File bytes without path and digest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Digest&lt;/td&gt;
&lt;td&gt;Exact bytes under an algorithm&lt;/td&gt;
&lt;td&gt;Quality, safety, or license validity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CID&lt;/td&gt;
&lt;td&gt;Content-addressed object reference&lt;/td&gt;
&lt;td&gt;Raw file hash unless construction matches&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Signature&lt;/td&gt;
&lt;td&gt;Issuer made the statement&lt;/td&gt;
&lt;td&gt;Statement is true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model card&lt;/td&gt;
&lt;td&gt;Intended use and evaluation context&lt;/td&gt;
&lt;td&gt;Exact loaded weights&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This table is the product. Model Weight Registry becomes useful when a consumer can tell whether a claim is about a name, a file, a receipt, or the model's behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Receipt
&lt;/h2&gt;

&lt;p&gt;The safest registry sentence is short: "This receipt identifies these bytes and these limits." Everything else should be linked as separate evidence.&lt;/p&gt;

&lt;p&gt;That makes onchain AI claims less brittle. A model name is a pointer; a weight hash receipt is a checkable boundary around the artifact a system actually loaded.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>blockchain</category>
      <category>machinelearning</category>
    </item>
  </channel>
</rss>
