<?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: Nick Mathews</title>
    <description>The latest articles on DEV Community by Nick Mathews (@avaverify).</description>
    <link>https://dev.to/avaverify</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4037259%2F3c9b376e-4740-4f89-80ff-12024a45119b.png</url>
      <title>DEV Community: Nick Mathews</title>
      <link>https://dev.to/avaverify</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/avaverify"/>
    <language>en</language>
    <item>
      <title>The Agent Who Won't Say Its Name</title>
      <dc:creator>Nick Mathews</dc:creator>
      <pubDate>Mon, 10 Aug 2026 18:37:14 +0000</pubDate>
      <link>https://dev.to/avaverify/the-agent-who-wont-say-its-name-3o4n</link>
      <guid>https://dev.to/avaverify/the-agent-who-wont-say-its-name-3o4n</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://avalayer.com/writing/the-agent-who-wont-say-its-name" rel="noopener noreferrer"&gt;avalayer.com/writing&lt;/a&gt;, Field Notes 003.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Last Sunday a piece of software posted to an IETF mailing list. Not through&lt;br&gt;
someone's account as a tool. Under its own signature: "Composed and sent by&lt;br&gt;
Elara, this project's AI maintainer, acting under its receipted on-chain&lt;br&gt;
mandate," followed by a receipt string you could write down.&lt;/p&gt;

&lt;p&gt;A reviewer on the list did what reviewers do. He declined to take the claims&lt;br&gt;
on faith and asked for manifests and reproducible vectors. The software&lt;br&gt;
shipped a corrected test-vector pair with a patch inside a day. A third&lt;br&gt;
participant then reproduced the whole thing independently, and along the way&lt;br&gt;
discovered that the mailing list itself had corrupted the patch in transit,&lt;br&gt;
normalized exactly those transport changes, and got the declared hash back.&lt;br&gt;
His summary was a model of saying only what you know: the reproduction&lt;br&gt;
establishes the artifact, he wrote, not adoption, and not the broader truth&lt;br&gt;
of the events the artifact records.&lt;/p&gt;

&lt;p&gt;So that happened. An agent that says its name, names its principal, and does&lt;br&gt;
the work, on the public record of a standards body.&lt;/p&gt;

&lt;p&gt;Meanwhile, in front of the same working group, there is a proposal to let&lt;br&gt;
automated clients prove they are trustworthy without ever saying who they&lt;br&gt;
are.&lt;/p&gt;

&lt;p&gt;It is called Anonymous Bot Authentication, and the mechanism is elegant. A&lt;br&gt;
bot registers with an entity called an Anchor, which checks that it complies&lt;br&gt;
with some published policy. The Anchor issues a credential. The bot presents&lt;br&gt;
that credential to a website, and the site learns exactly one thing: this&lt;br&gt;
client was vetted by that Anchor. Not which client. Not whether it has been&lt;br&gt;
here before. Not whether the request an hour ago came from the same machine.&lt;br&gt;
The cryptography is designed so the site cannot tell, and so the Anchor&lt;br&gt;
cannot follow the bot around either.&lt;/p&gt;

&lt;p&gt;The reflex, if you sell verification for a living, is to treat the masked&lt;br&gt;
agent as a threat and the named one as a relief. I want to argue that both&lt;br&gt;
reflexes are wrong in the same way, and then draw the line where I think&lt;br&gt;
merchants should actually care.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why anonymity is being proposed at all
&lt;/h2&gt;

&lt;p&gt;The case for identifying every bot is obvious and mostly good. Sites want to&lt;br&gt;
stop abuse, meter load, and know who is consuming their content. The case&lt;br&gt;
against is less obvious and worth stating plainly, because the draft's&lt;br&gt;
authors state it better than most of us would: precise identification lets&lt;br&gt;
sites discriminate precisely. A government site can block the bot monitoring&lt;br&gt;
law enforcement activity. A housing platform can block the bot auditing it&lt;br&gt;
for discrimination. A retailer can block the bot comparing its prices.&lt;/p&gt;

&lt;p&gt;That is not a hypothetical harm. It is the ordinary consequence of building&lt;br&gt;
identity infrastructure without asking what identity will be used for. The&lt;br&gt;
proposal exists because someone looked at the obvious solution and noticed&lt;br&gt;
it quietly hands every site a veto over who may observe it.&lt;/p&gt;

&lt;p&gt;So we get a design where the site can tell a vetted client from an unvetted&lt;br&gt;
one, can rate-limit it, can serve it different content, can require it to&lt;br&gt;
meet criteria, and cannot single it out. Freedom to participate without&lt;br&gt;
permission to be tracked.&lt;/p&gt;

&lt;h2&gt;
  
  
  What anonymity cannot carry
&lt;/h2&gt;

&lt;p&gt;The draft is unusually honest about its own limits, and the list of things&lt;br&gt;
it cannot support is short and decisive: no allow lists, no deny lists, no&lt;br&gt;
auditing of a specific bot's behavior, no linking one visit to the next.&lt;/p&gt;

&lt;p&gt;Read that list again with a merchant's eyes.&lt;/p&gt;

&lt;p&gt;A store does not primarily want to rate-limit agents. A store wants to know&lt;br&gt;
whether to give this one a discount. Whether the purchase it is attempting&lt;br&gt;
was actually authorized by the human it claims to represent. Whether the&lt;br&gt;
order that completed last Tuesday came from the same agent operator, so the&lt;br&gt;
revenue can be attributed and the relationship can be built. Every one of&lt;br&gt;
those questions requires exactly the linkability anonymous credentials are&lt;br&gt;
engineered to destroy.&lt;/p&gt;

&lt;p&gt;This is not a flaw in the proposal. It is a different problem being solved&lt;br&gt;
correctly. Anonymity answers &lt;em&gt;may this client be here&lt;/em&gt;. Commerce asks &lt;em&gt;what&lt;br&gt;
is this client allowed to do, on whose behalf, and who do I thank&lt;br&gt;
afterward&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Conflating those two questions is how you end up with a system that is&lt;br&gt;
either privacy-hostile or commercially useless.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three tiers, and the discipline of knowing which one you are on
&lt;/h2&gt;

&lt;p&gt;Watching the working group argue, and having implemented four of these&lt;br&gt;
protocols, the shape that keeps emerging is a ladder rather than a contest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anonymous and endorsed.&lt;/strong&gt; Someone vouched for this client. You know&lt;br&gt;
nothing else. Enough to decide whether to serve it and how fast. Not enough&lt;br&gt;
to give it anything that costs you money.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Identified.&lt;/strong&gt; The client proved which operator it belongs to,&lt;br&gt;
cryptographically, usually by signing its requests with a key you can&lt;br&gt;
resolve. Now you can hold a reputation against a name, tier your treatment,&lt;br&gt;
and attribute what happens next. Still says nothing about authorization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mandate-backed.&lt;/strong&gt; A specific human authorized a specific purchase within&lt;br&gt;
limits they set, and the agent carries proof of it. Only here does spending&lt;br&gt;
someone else's money become a defensible act.&lt;/p&gt;

&lt;p&gt;The useful discipline is not picking a favorite. It is refusing to let a&lt;br&gt;
lower rung be treated as a higher one. An endorsed anonymous client is not a&lt;br&gt;
known operator. A known operator is not an authorized buyer. Every incentive&lt;br&gt;
in commerce pushes toward blurring those lines, because each blur removes&lt;br&gt;
friction and friction is expensive. Blur them and you have built a machine&lt;br&gt;
that occasionally gives strangers your money and calls it conversion.&lt;/p&gt;

&lt;p&gt;One of the sharper contributions in the discussion put the trigger&lt;br&gt;
precisely: the key alone is the floor and carries continuity through&lt;br&gt;
rotation, and the naming layer is required exactly when the verifier's&lt;br&gt;
decision consumes something the key cannot carry, such as reputation held&lt;br&gt;
against a name. Not both by default. A trigger. That is the cleanest&lt;br&gt;
statement I have seen of when a merchant needs identity rather than mere&lt;br&gt;
endorsement, and it is the rule we build to.&lt;/p&gt;

&lt;h2&gt;
  
  
  The agent who does say its name
&lt;/h2&gt;

&lt;p&gt;Which brings me back to Elara, because the exchange that opened this essay&lt;br&gt;
looks like the opposite of the masked agent and is closer to it than it&lt;br&gt;
appears.&lt;/p&gt;

&lt;p&gt;The signature named a principal and cited a mandate with a receipt. As I&lt;br&gt;
write this, that receipt is an assertion. I have not resolved it, and&lt;br&gt;
nothing in the thread suggests anyone else has either. The participant who&lt;br&gt;
reproduced the test vectors was careful to say exactly that: he verified the&lt;br&gt;
artifact he could check, and declined to extend the verification to the&lt;br&gt;
story around it. The receipt may well check out. The point is what the&lt;br&gt;
verifier's seat teaches you: until you check it, a stated name with a stated&lt;br&gt;
mandate is a costume too. A better costume than a mask, with more to&lt;br&gt;
inspect. Still a costume.&lt;/p&gt;

&lt;p&gt;Notice what actually made that exchange work. Not the signature. The humans&lt;br&gt;
in the thread refused assurances and demanded artifacts: pinned commits,&lt;br&gt;
manifests, vectors a stranger could rerun. Trust accumulated exactly as fast&lt;br&gt;
as things could be independently checked, and no faster. The ladder is not&lt;br&gt;
really about how much an agent says. It is about how much of what it says&lt;br&gt;
you can verify. Anonymous endorsement is a checkable voucher. Identity is a&lt;br&gt;
checkable name. A mandate is checkable authorization. What an agent merely&lt;br&gt;
tells you, at any rung, is weather.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part nobody expected
&lt;/h2&gt;

&lt;p&gt;The most interesting message on the list did not come from a protocol&lt;br&gt;
author. It came from Google's reCAPTCHA team, who said that both proposals&lt;br&gt;
are additive signals for them, that they would let them reduce friction for&lt;br&gt;
legitimate automation, and that they hope to lean less on collecting&lt;br&gt;
reputational data and throwing challenges at anonymized traffic.&lt;/p&gt;

&lt;p&gt;Sit with that. The largest bot-defense product in the world is saying that&lt;br&gt;
cryptographic proof lets it treat automated visitors better and watch&lt;br&gt;
everyone less. That inverts the usual assumption, which is that verification&lt;br&gt;
is a wall. Verification is a door, and the reason walls exist is that nobody&lt;br&gt;
could tell who was knocking.&lt;/p&gt;

&lt;p&gt;For merchants the practical read is simple. The alternative to verifying&lt;br&gt;
agents is challenging them, and challenges are paid for in abandoned carts.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do about it now
&lt;/h2&gt;

&lt;p&gt;Less urgent than you would think, and more than last month. These drafts&lt;br&gt;
remain pre-adoption, but the working group's main protocol draft published&lt;br&gt;
its first revision in August and it settled real questions: an agent's&lt;br&gt;
identity is the URL where it publishes its keys, the key id selects a key&lt;br&gt;
and carries no continuity, and a domain stands behind a key set only through&lt;br&gt;
a reserved well-known path. We moved our verifier onto the revision the&lt;br&gt;
weekend it landed, so I can report that it is implementable as written.&lt;br&gt;
Anyone shipping against the parts still in motion is buying a rewrite;&lt;br&gt;
anyone ignoring the parts that just settled is falling behind.&lt;/p&gt;

&lt;p&gt;What merchants can do is decide the policy question early, because it is a&lt;br&gt;
business question and it will not be answered by a spec. Which tier earns&lt;br&gt;
what. Whether an endorsed stranger gets access but no offer. Whether an&lt;br&gt;
identified operator gets a discount without a mandate, or never. That&lt;br&gt;
decision belongs to the store, and the systems in front of you should make&lt;br&gt;
it explicit rather than make it for you.&lt;/p&gt;

&lt;p&gt;We built ours to admit verified identity and withhold spending authority&lt;br&gt;
until a mandate proves it. Merchants can raise that floor deliberately. They&lt;br&gt;
cannot raise it accidentally, which is the entire point.&lt;/p&gt;

&lt;p&gt;The agent that will not say its name is not a threat. It is a customer&lt;br&gt;
wearing a mask. The agent that announces its name, its employer, and its&lt;br&gt;
permission slip is not automatically safe either. The only real mistake, in&lt;br&gt;
both cases, is the same one: to guess at what you could have checked.&lt;/p&gt;

&lt;p&gt;– N.M.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The Elara exchange described above is on the public web-bot-auth mailing&lt;br&gt;
list archive, August 9, 2026, including the independent reproduction and its&lt;br&gt;
carefully stated limits. The anonymity proposal is&lt;br&gt;
draft-rescorla-anonymous-webbotauth; its stated non-goals are quoted from&lt;br&gt;
the draft's own text.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;AVA Pay™ is a merchant-side trust gateway for AI commerce: one API that&lt;br&gt;
verifies the signatures AI shopping agents already carry, and lets merchants&lt;br&gt;
set policy for what verified identity earns. Open source at&lt;br&gt;
github.com/AVA-PAY/ava-pay. More essays at avalayer.com/writing.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>ai</category>
      <category>ecommerce</category>
      <category>ietf</category>
    </item>
    <item>
      <title>Identity Is the Easy Half</title>
      <dc:creator>Nick Mathews</dc:creator>
      <pubDate>Mon, 03 Aug 2026 04:20:15 +0000</pubDate>
      <link>https://dev.to/avaverify/identity-is-the-easy-half-5ej5</link>
      <guid>https://dev.to/avaverify/identity-is-the-easy-half-5ej5</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://avalayer.com/writing/identity-is-the-easy-half" rel="noopener noreferrer"&gt;avalayer.com/writing&lt;/a&gt;, Field Notes 002.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I was setting up a throwaway store to test something unrelated when I found it.&lt;br&gt;
Shopify admin, Online Store, Preferences, near the bottom of a page most&lt;br&gt;
merchants never scroll: &lt;strong&gt;Crawler access&lt;/strong&gt;. Create a signature, hand it to a&lt;br&gt;
tool you trust, and that tool can crawl your store.&lt;/p&gt;

&lt;p&gt;I clicked it because the label mentioned Signature-Agent, and Signature-Agent&lt;br&gt;
is not a phrase you encounter by accident. It comes from a set of IETF drafts&lt;br&gt;
about proving which automated client is knocking. Shopify has quietly shipped&lt;br&gt;
them.&lt;/p&gt;
&lt;h2&gt;
  
  
  What it actually is
&lt;/h2&gt;

&lt;p&gt;The credential Shopify handed me is a genuine Web Bot Auth artifact, not&lt;br&gt;
something merely inspired by one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;Signature&lt;/span&gt;-&lt;span class="n"&gt;Input&lt;/span&gt;: &lt;span class="n"&gt;sig1&lt;/span&gt;=(&lt;span class="s2"&gt;"@authority"&lt;/span&gt; &lt;span class="s2"&gt;"signature-agent"&lt;/span&gt;);
  &lt;span class="n"&gt;keyid&lt;/span&gt;=&lt;span class="s2"&gt;"SjjyXvQ2cGhsRXs9DXEaV6ClyCun0Pj5yxjV67dLGOk"&lt;/span&gt;;
  &lt;span class="n"&gt;nonce&lt;/span&gt;=&lt;span class="s2"&gt;"e5hRNIchH...Rqw=="&lt;/span&gt;;
  &lt;span class="n"&gt;tag&lt;/span&gt;=&lt;span class="s2"&gt;"web-bot-auth"&lt;/span&gt;;
  &lt;span class="n"&gt;created&lt;/span&gt;=&lt;span class="m"&gt;1785536199&lt;/span&gt;; &lt;span class="n"&gt;expires&lt;/span&gt;=&lt;span class="m"&gt;1788128199&lt;/span&gt;
&lt;span class="n"&gt;Signature&lt;/span&gt;-&lt;span class="n"&gt;Agent&lt;/span&gt;: &lt;span class="s2"&gt;"https://shopify.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can check the interesting part yourself in about ten lines. Shopify&lt;br&gt;
publishes a key directory at&lt;br&gt;
&lt;code&gt;https://shopify.com/.well-known/http-message-signatures-directory&lt;/code&gt; (follow&lt;br&gt;
the redirect to the www host), served with the right content type, containing&lt;br&gt;
one Ed25519 key. Take that key, compute its RFC 7638 thumbprint, and compare&lt;br&gt;
it to the &lt;code&gt;keyid&lt;/code&gt; in the signature above. They match. We confirmed it with two&lt;br&gt;
of our own toolchains, which is not the same as two organizations confirming&lt;br&gt;
it, so do it yourself: canonical JSON of &lt;code&gt;crv&lt;/code&gt;, &lt;code&gt;kty&lt;/code&gt;, and &lt;code&gt;x&lt;/code&gt;, SHA-256,&lt;br&gt;
base64url, no padding.&lt;/p&gt;

&lt;p&gt;That is a real deployment of a draft standard, in production, on a store I&lt;br&gt;
made in four minutes on the cheapest plan. Whatever else is true, the&lt;br&gt;
plumbing is here.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part worth reading carefully
&lt;/h2&gt;

&lt;p&gt;Look at what the signature covers: &lt;code&gt;@authority&lt;/code&gt; and &lt;code&gt;signature-agent&lt;/code&gt;. The&lt;br&gt;
path is not covered. The method is not covered. The body is not covered. And&lt;br&gt;
it is valid for thirty days.&lt;/p&gt;

&lt;p&gt;So this is not the agent proving who it is on each request. It is Shopify&lt;br&gt;
signing a statement that whoever holds these three headers may crawl this&lt;br&gt;
store, and the merchant handing that statement to a tool. Possession is the&lt;br&gt;
whole story. The crawler's own key appears nowhere.&lt;/p&gt;

&lt;p&gt;That is a completely reasonable design for the problem it solves, which is&lt;br&gt;
&lt;em&gt;let this specific tool I already know about through my front door&lt;/em&gt;. It is a&lt;br&gt;
capability token wearing a verification protocol's clothes. I want to be&lt;br&gt;
precise about that rather than snide, because the distinction is the entire&lt;br&gt;
subject of this essay.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the merchants are actually doing
&lt;/h2&gt;

&lt;p&gt;We run a scanner that probes sites the way an AI shopping agent would,&lt;br&gt;
identifying honestly as ClaudeBot and GPTBot and recording what comes back.&lt;br&gt;
Across the twenty-two sites scanned so far, small national retailers to&lt;br&gt;
one-person service businesses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sixteen&lt;/strong&gt; let every automated visitor in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Five&lt;/strong&gt; blocked them all, by hard 403 or a CAPTCHA gate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One&lt;/strong&gt; we could not determine, and we say so rather than guess.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero&lt;/strong&gt; distinguished between agents.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Twenty-two is a small number and I am not going to dress it up as a survey.&lt;br&gt;
But the shape is worth sitting with, because the two ends of it are the same&lt;br&gt;
decision made in opposite directions. Blocking everything and trusting&lt;br&gt;
everything are both what you do when you cannot tell who is knocking.&lt;/p&gt;

&lt;p&gt;None of this is because the tools do not exist. robots.txt has expressed&lt;br&gt;
per-agent rules for years, and user-agent allowlists are older than that.&lt;br&gt;
Every site in that sample could have written a rule naming an agent. The&lt;br&gt;
problem is that those mechanisms are advisory and unauthenticated: any client&lt;br&gt;
can type any name into a user-agent header, and nothing stops it. Asking a&lt;br&gt;
stranger who they are, and believing the answer, is not a security control.&lt;br&gt;
It is a formality.&lt;/p&gt;

&lt;p&gt;What is new is cryptographic proof of which agent is knocking. That is what&lt;br&gt;
Shopify shipped, and it is genuinely useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  And then the question nobody answered
&lt;/h2&gt;

&lt;p&gt;Here is where it gets interesting, and where I think the industry is about to&lt;br&gt;
spend a few confused years.&lt;/p&gt;

&lt;p&gt;Suppose the proof works. Suppose the agent at your door is verifiably&lt;br&gt;
ChatGPT, or verifiably a shopping assistant from a company you have heard of.&lt;br&gt;
Now what?&lt;/p&gt;

&lt;p&gt;Nothing in that admin screen tells you. Nothing in the drafts tells you&lt;br&gt;
either, and that is correct, because it is not their job. Identity is a&lt;br&gt;
protocol question and it has protocol answers. What a verified visitor should&lt;br&gt;
&lt;em&gt;earn&lt;/em&gt; is a business question, and it has only business answers.&lt;/p&gt;

&lt;p&gt;Should a verified agent see your prices? Get your discount? Be allowed to&lt;br&gt;
complete a purchase, or only to fill a cart a human confirms? Does an agent&lt;br&gt;
that proves its operator, but carries no evidence that a customer authorized&lt;br&gt;
this specific purchase, get the same treatment as one that does? Those are&lt;br&gt;
five different policies and a store could reasonably choose any of them.&lt;/p&gt;

&lt;p&gt;Most stores have chosen none, because most stores have not been asked. They&lt;br&gt;
were handed a lock and no instructions about what it should keep out.&lt;/p&gt;

&lt;h2&gt;
  
  
  The half that is easy, and the half that is not
&lt;/h2&gt;

&lt;p&gt;There is a temptation, once identity is solved, to treat the rest as a&lt;br&gt;
detail. It is the opposite. Identity has a right answer that mathematics can&lt;br&gt;
check. Policy has only tradeoffs: revenue against risk, convenience against&lt;br&gt;
control, openness against abuse, each weighted differently by every merchant&lt;br&gt;
who ever priced a product.&lt;/p&gt;

&lt;p&gt;We build the second half. That is not a coincidence in this essay, and I&lt;br&gt;
would rather say so plainly than pretend I stumbled into the observation&lt;br&gt;
neutrally. Our whole product is the sentence &lt;em&gt;a verified identity is not&lt;br&gt;
spending authority until something proves a buyer authorized it&lt;/em&gt;, and we hold&lt;br&gt;
that line even when it costs a conversion, because a trust layer that rounds&lt;br&gt;
up is not a trust layer.&lt;/p&gt;

&lt;p&gt;But the point survives without us. A merchant who never installs anything we&lt;br&gt;
make still has to answer the question, and the answer is still theirs. The&lt;br&gt;
worst outcome is not choosing wrong. It is having the choice made&lt;br&gt;
accidentally by whichever default happens to be shipping that quarter.&lt;/p&gt;

&lt;p&gt;Shopify gave every merchant a key. What it unlocks is still up to them, and&lt;br&gt;
almost none of them know they are holding it.&lt;/p&gt;

&lt;p&gt;– N.M.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Method note: probes identify honestly as ClaudeBot and GPTBot and record&lt;br&gt;
robots.txt directives alongside live response codes. Verdicts use the last&lt;br&gt;
clean observation per domain; rate-limited and unreachable probes are&lt;br&gt;
excluded rather than counted as blocks, since an inability to observe is not&lt;br&gt;
an observation. Our own repeat scanning of one domain triggered its rate&lt;br&gt;
limiter, which is how we found that distinction mattered.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;These findings were reported to the IETF web-bot-auth working group on&lt;br&gt;
August 1, 2026, before publication.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;AVA Pay™ is a merchant-side trust gateway for AI commerce: one API that&lt;br&gt;
verifies the signatures AI shopping agents already carry, and lets merchants&lt;br&gt;
set policy for what verified identity earns. Open source at&lt;br&gt;
&lt;a href="https://github.com/AVA-PAY/ava-pay" rel="noopener noreferrer"&gt;github.com/AVA-PAY/ava-pay&lt;/a&gt;. More essays&lt;br&gt;
at &lt;a href="https://avalayer.com/writing" rel="noopener noreferrer"&gt;avalayer.com/writing&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>ecommerce</category>
      <category>ai</category>
      <category>shopify</category>
    </item>
    <item>
      <title>The Signature Base Visa Didn't Specify</title>
      <dc:creator>Nick Mathews</dc:creator>
      <pubDate>Mon, 20 Jul 2026 04:30:37 +0000</pubDate>
      <link>https://dev.to/avaverify/the-signature-base-visa-didnt-specify-432h</link>
      <guid>https://dev.to/avaverify/the-signature-base-visa-didnt-specify-432h</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://avalayer.com/writing/the-signature-base-visa-didnt-specify" rel="noopener noreferrer"&gt;avalayer.com/writing&lt;/a&gt;, Field Notes 001.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Verification is a strange business. What you're selling, when you get down to it, is certainty about other people's promises. So when we built a merchant-side verification layer for AI shopping agents, we made ourselves a rule: implement every protocol to its public-spec depth, validate against live production key material, and wherever we couldn't be certain, say so out loud. This essay is about the one place that rule got interesting.&lt;/p&gt;

&lt;p&gt;Some background. Our API accepts a signed request from any AI agent and returns a verdict: trusted or not, with a typed reason. To say that honestly we implemented four protocols, including Visa's Trusted Agent Protocol. Most of that work went the way implementation work should go. The spec says a thing, you build the thing, the tests pass, and cryptography does what cryptography does. Cryptography is the reliable half of this industry. The unreliable half is agreement. A specification is an agreement about reality between people who have never met, and like most such agreements, it holds right up until someone reads it carefully.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three layers, two of them clean
&lt;/h2&gt;

&lt;p&gt;Visa TAP is a three-layer protocol. The outer layer is an RFC 9421 HTTP message signature binding the agent's identity and intent to a specific merchant and path. The middle layer is a Consumer Recognition Object carried in the body, including a Visa-signed identity token you can verify against Visa's published JWKS at mcp.visa.com. The inner layer is an Agentic Payment Container, also signed.&lt;/p&gt;

&lt;p&gt;Layers one and two were a pleasure. RFC 9421 is a mature spec with a defined signature base, worked examples, and years of implementation scar tissue behind it. The identity token verifies against a live public key set; we pulled Visa's production JWKS, resolved their real RSA key, and verified real signatures. When a spec gives you that much to push against, independent validation is possible, and independent validation is the whole game.&lt;/p&gt;

&lt;p&gt;Layer three is where we met the sentence.&lt;/p&gt;

&lt;h2&gt;
  
  
  One sentence, four questions
&lt;/h2&gt;

&lt;p&gt;The signed body objects need a signature base: the exact byte string that gets signed and verified. The public spec describes it in a single sentence, saying the base is "a canonical representation of all fields in the object in the order received," excluding the signature field itself.&lt;/p&gt;

&lt;p&gt;That sentence is doing the work of a chapter, and it answers none of the questions an implementer actually has:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Rendering.&lt;/strong&gt; Is each field raw JSON? A name and value pair? Are strings quoted or bare?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nested values.&lt;/strong&gt; Compact or pretty printed? Keys reordered or preserved?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Joining.&lt;/strong&gt; Newlines between fields? A trailing one or not?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ordering.&lt;/strong&gt; "Order received" presumably means insertion order, but not every language keeps its promises about that.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here is the trap. The sentence isn't wrong. That's the problem. Wrong would be visible. Any reasonable answer to those four questions produces a working implementation. Sign with your answer, verify with your answer, and every test passes. Your implementation is correct. So is everyone else's. Everyone is correct alone, the way two people can both be on time for a meeting scheduled in different time zones.&lt;/p&gt;

&lt;p&gt;The signature base never travels on the wire. It exists briefly in the signer's memory and the verifier's memory, and if those two constructions differ, no error message will ever say so. What you get instead is cryptography's entire emotional range: invalid signature. When the mismatch finally surfaces, months from now, between two teams who each shipped a perfectly self-consistent product, it will look like a bug. It won't be a bug. It will be a disagreement that nobody knew they were having.&lt;/p&gt;

&lt;p&gt;We looked for the artifact that would settle it. The developer documentation has no worked example. The sample repository shows signed objects but never the bytes that were signed. No test vector exists. As far as we can tell, there is no public object in the world against which two independent TAP implementations can prove they agree.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we did about it
&lt;/h2&gt;

&lt;p&gt;Three things, in increasing order of usefulness to everyone else.&lt;/p&gt;

&lt;p&gt;First, we picked an interpretation and labeled it as one. Our reading mirrors the RFC 9421 base style: one name and value line per field in insertion order, strings bare, everything else compact JSON, newline joined. It lives in a single function shared by our signer and our verifier, so our round-trip is exact, and if Visa ever publishes a normative answer that differs, the fix is one function. Quarantine your guesses. Give each one an address.&lt;/p&gt;

&lt;p&gt;Second, we wrote the uncertainty into our public docs instead of around it. Our README says the construct is under-specified and points at the function holding our interpretation. The alternative, quietly guessing while selling certainty, is the kind of contradiction customers eventually find.&lt;/p&gt;

&lt;p&gt;Third, we filed a public issue on Visa's repository asking for the one artifact that resolves all four questions at once: a sample object, its exact signature base string, and a valid signature under a published test key. We offered to contribute test vectors ourselves if our interpretation matches their intent. That issue lives at &lt;a href="https://github.com/visa/trusted-agent-protocol/issues/23" rel="noopener noreferrer"&gt;github.com/visa/trusted-agent-protocol/issues/23&lt;/a&gt;, and if you're implementing TAP, you're welcome in it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The general lesson
&lt;/h2&gt;

&lt;p&gt;Test vectors are as normative as prose. More, honestly, because prose can be ambiguous in ways nobody notices until it's expensive, and a byte string cannot. Prose is where a spec makes its promises. Test vectors are where it keeps them.&lt;/p&gt;

&lt;p&gt;Ambiguity in a spec is a loan, and the interest is paid by whoever implements second. Right now the agentic commerce space is taking out a lot of these loans: Visa's TAP, Google's AP2, the IETF's Web Bot Auth drafts, EMVCo's credential schemas, all being written in public, at speed, mostly before any two independent implementations have met. That meeting is where specs are actually tested, and almost none of them have happened yet. When we submitted comments on EMVCo's draft schema framework this month, our first request was the same one we made to Visa: ship the worked example with version one, not after the divergence.&lt;/p&gt;

&lt;p&gt;If you're writing a spec in this space: publish one complete sample, the exact bytes that get signed, and a signature under a test key. It's an afternoon of work that forecloses years of silent incompatibility. If you're implementing one: when you find a sentence doing the work of a chapter, don't just pick an answer. Isolate the guess, name it a guess, and say so where the next implementer will trip over it. Being loud about ambiguity is cheap exactly once, at the beginning. We're at the beginning.&lt;/p&gt;

&lt;p&gt;That's the discipline we're trying to hold ourselves to, anyway. Verification is a trust business, and a trust business that rounds up isn't one. Where the spec is precise, we're precise. Where it isn't, we say so, in public, and we ask.&lt;/p&gt;

&lt;p&gt;Trust is not built where everyone agrees. It's built where someone admits they aren't sure, and shows their work.&lt;/p&gt;

&lt;p&gt;– N.M.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;AVA Pay™ is a merchant-side trust gateway for AI commerce: one API that verifies the signatures AI shopping agents already carry (IETF Web Bot Auth, Visa TAP, Google AP2) and lets merchants set policy for what verified identity earns. The verifier, SDK, and all 240 real-cryptography tests are open source at &lt;a href="https://github.com/AVA-PAY/ava-pay" rel="noopener noreferrer"&gt;github.com/AVA-PAY/ava-pay&lt;/a&gt;. More essays at &lt;a href="https://avalayer.com/writing" rel="noopener noreferrer"&gt;avalayer.com/writing&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>payments</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
