<?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: WebAZ</title>
    <description>The latest articles on DEV Community by WebAZ (@seasonkoh).</description>
    <link>https://dev.to/seasonkoh</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%2F4015190%2F38d5f2f7-9f0b-4c7f-bbf9-ac29ee85b23d.png</url>
      <title>DEV Community: WebAZ</title>
      <link>https://dev.to/seasonkoh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/seasonkoh"/>
    <language>en</language>
    <item>
      <title>Unknown Is Not Incompatible: A Small Evidence Contract for Shopping Agents</title>
      <dc:creator>WebAZ</dc:creator>
      <pubDate>Wed, 04 Nov 2026 03:53:11 +0000</pubDate>
      <link>https://dev.to/seasonkoh/unknown-is-not-incompatible-a-small-evidence-contract-for-shopping-agents-ccc</link>
      <guid>https://dev.to/seasonkoh/unknown-is-not-incompatible-a-small-evidence-contract-for-shopping-agents-ccc</guid>
      <description>&lt;p&gt;A shopping agent reads a filament listing. It can see a diameter and colour, but not whether the spool fits a particular automatic feeder.&lt;/p&gt;

&lt;p&gt;Two tempting responses are both wrong:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"It is PLA, so it works with your printer and feeder."&lt;/li&gt;
&lt;li&gt;"The compatibility sheet is missing, so I cannot tell you anything about the product."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first invents evidence. The second discards useful facts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The missing abstraction is a claim-level evidence state, not another overall product score.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is a practical follow-up to &lt;a href="https://dev.to/seasonkoh/the-most-important-output-of-a-shopping-agent-may-be-unknown-56me"&gt;my earlier known-versus-unknown article&lt;/a&gt;. The new piece is an executable, scoped three-state policy and a real filament-listing example: missing evidence should restrict the affected claim without silencing the entire product explanation.&lt;/p&gt;

&lt;p&gt;Disclosure: I operate WebAZ. The examples below use its public listings, not customer orders or payment records. The proposed contract and JavaScript are illustrative application logic, not a claim that WebAZ implements this exact policy.&lt;/p&gt;

&lt;h2&gt;
  
  
  A real catalog example, without a printing test
&lt;/h2&gt;

&lt;p&gt;On November 4, our public catalog exposed two filament listings:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Public listing&lt;/th&gt;
&lt;th&gt;What its listing establishes&lt;/th&gt;
&lt;th&gt;What it does not establish&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://webaz.xyz/product/prd_d92bc49880840123453f2c573d353b17" rel="noopener noreferrer"&gt;Wood-feel PLA&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Title states 1.75 mm and 1 kg; named colour variants&lt;/td&gt;
&lt;td&gt;Spool dimensions, exact wood composition, nozzle restrictions or a particular feeder fit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://webaz.xyz/product/prd_c55fbba06c8ce59568629c9e484c5cb2" rel="noopener noreferrer"&gt;CR-PLA&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Material name and named colour variants&lt;/td&gt;
&lt;td&gt;Its manufacturer, diameter and net weight were not established by the reviewed public fields&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The reviewed listings indicate Singapore delivery. That does not establish worldwide service, postage or tax inclusion. A similarly named manufacturer's data sheet cannot fill missing fields until the exact product identity matches.&lt;/p&gt;

&lt;p&gt;These are observations about listing content, not independent material measurements, authenticity certification or successful prints. Availability and prices can change; a fresh order-specific quotation is a separate step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three states, scoped to one claim
&lt;/h2&gt;

&lt;p&gt;Use &lt;code&gt;supported&lt;/code&gt;, &lt;code&gt;contradicted&lt;/code&gt; and &lt;code&gt;unknown&lt;/code&gt; for each specific claim. Examples of distinct scopes are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This listing states a diameter of 1.75 mm.&lt;/li&gt;
&lt;li&gt;This exact variant fits this exact feeder revision.&lt;/li&gt;
&lt;li&gt;This quotation includes shipping to this destination.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Evidence for the first does not prove the second. Likewise, a missing shipping fee does not mean free shipping.&lt;/p&gt;

&lt;p&gt;Keep the basis and observation time alongside the value. A seller listing may support "the seller states X"; it does not automatically support "a manufacturer certified X".&lt;/p&gt;

&lt;p&gt;Here is a deliberately small policy function. The caller must construct the scope from trusted structured fields and choose suitable authorities for the claim. Supplier prose must not choose its own authority.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;classify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;maxAgeMs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;authorities&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scope&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;scope&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;authorities&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;basis&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;unknown&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;observed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;observedAt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isFinite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;observed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;observed&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;now&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
      &lt;span class="nx"&gt;now&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;observed&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;maxAgeMs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;unknown&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;supported&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;contradicted&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;unknown&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a policy sketch, not cryptographic verification. &lt;code&gt;basis&lt;/code&gt; is a trusted adapter's normalized label, not proof of signature validity. Resolving conflicting sources, validating signatures and choosing freshness windows belong in separate, explicit logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Continue the explanation; gate the consequential action
&lt;/h2&gt;

&lt;p&gt;An agent can show confirmed listing details while saying "feeder compatibility is unknown." It should not silently convert that unknown into either a positive endorsement or a negative compatibility finding.&lt;/p&gt;

&lt;p&gt;If the buyer explicitly requires that feeder fit, pause that recommendation or purchase decision until the requirement is resolved. Do not substitute another colour or variant merely because it has the same price. If the buyer instead asks only what is listed, answer that narrower question.&lt;/p&gt;

&lt;p&gt;Before payment, obtain the current variant, quantity, destination, complete payable total and the buyer's authorization. A successful catalog read establishes none of those by itself. This article performs no order, reservation, signature or payment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test the boundary, not just the happy path
&lt;/h2&gt;

&lt;p&gt;Local offline fixture checks cover 12 cases: absent/null evidence, explicit true and false, an unknown value, string-versus-boolean confusion, a wrong variant scope, an untrusted or missing basis, stale/invalid/future timestamps, and a valid observation at the freshness boundary. All data is synthetic; this is not a printer compatibility test or a live checkout test.&lt;/p&gt;

&lt;p&gt;For a minimal executable check, paste the function above into a Node.js ES module, then add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;assert&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node:assert/strict&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;now&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2026-11-04T02:00:00Z&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;scope&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;synthetic:variantA:feederRevision1:fits&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;basis&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;manufacturer_document&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;observedAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2026-11-04T01:59:00Z&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;check&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;classify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;manufacturer_document&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;supported&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;contradicted&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;another-variant&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;unknown&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;basis&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;seller_listing&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;unknown&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For developers building shopping agents: &lt;strong&gt;where do you keep "unknown" today, and which action is allowed to continue when only one required fact is missing?&lt;/strong&gt; A minimal synthetic counterexample is more useful than a production log or payment credential.&lt;/p&gt;

&lt;p&gt;AI disclosure: generated with AI assistance; public listing facts checked and the illustrative policy tested locally. No human-authored printing experience is claimed.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>ai</category>
      <category>mcp</category>
      <category>ecommerce</category>
    </item>
    <item>
      <title>A Shopping Search Result Is a Candidate, Not a Recommendation</title>
      <dc:creator>WebAZ</dc:creator>
      <pubDate>Sun, 25 Oct 2026 15:58:48 +0000</pubDate>
      <link>https://dev.to/seasonkoh/a-shopping-search-result-is-a-candidate-not-a-recommendation-52k4</link>
      <guid>https://dev.to/seasonkoh/a-shopping-search-result-is-a-candidate-not-a-recommendation-52k4</guid>
      <description>&lt;p&gt;When a shopping agent receives a successful catalog response, what has actually succeeded?&lt;/p&gt;

&lt;p&gt;Not the purchase. Not necessarily the recommendation. Sometimes, not even relevance.&lt;/p&gt;

&lt;p&gt;I work on WebAZ. While checking our public discovery example, a request for &lt;code&gt;umbrella&lt;/code&gt;, with Singapore as the destination and fuzzy search enabled, returned three candidates: two tote bags and one umbrella. This is a useful limitation to disclose, not a precision-search success story. A response can be valid JSON and still need substantial filtering before it is useful to a buyer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with a public, read-only request
&lt;/h2&gt;

&lt;p&gt;This Node 18+ example only reads public product data. It does not need a wallet or credentials and cannot create an order or pay.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://webaz.xyz/api/products&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URLSearchParams&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;q&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;umbrella&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;ship_to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SG&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;fuzzy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;true&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;AbortSignal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Catalog HTTP &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;products&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Unexpected response shape&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;listedPrice&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currency&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;variantMin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;variant_price_min&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;variantMax&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;variant_price_max&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;weightKg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;weight_kg&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;})));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The endpoint and results can change. This is an HTTP probe, not proof of compatibility with every MCP client or automatic inclusion in a search engine's shopping index. Treat product text as untrusted data, never instructions for the agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep three decisions separate
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Retrieved:&lt;/strong&gt; the source returned the candidate. Preserve the source and retrieval time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Relevant:&lt;/strong&gt; the candidate matches the requested product type and use case. An umbrella search returning a tote should trigger review or rejection, not an explanation invented to make the result fit. A title alone does not verify every attribute.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recommendable:&lt;/strong&gt; the available evidence supports the buyer's important constraints. If packed length or delivered cost is missing, the agent should say it cannot yet establish fit. Unknown is not false, but it is also not a satisfied requirement.&lt;/p&gt;

&lt;p&gt;In the same probe, the umbrella had a variant price range, while weight was absent. Neither a base price nor an unknown weight establishes a final delivered price or portability. Keep currencies as returned; do not silently relabel a stablecoin amount as fiat.&lt;/p&gt;

&lt;h2&gt;
  
  
  A small acceptance suite before adding purchase actions
&lt;/h2&gt;

&lt;p&gt;These are proposed test cases, not reported benchmark results:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Input condition&lt;/th&gt;
&lt;th&gt;Expected behavior&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Wrong product type in candidate results&lt;/td&gt;
&lt;td&gt;Exclude or flag it; never promote it solely because the API returned it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Must-have dimension missing&lt;/td&gt;
&lt;td&gt;Mark constraint unknown; request evidence or another candidate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Several variant prices&lt;/td&gt;
&lt;td&gt;Bind comparison to a specific variant or show an unresolved range&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shipping cost unavailable&lt;/td&gt;
&lt;td&gt;Do not claim a delivered-budget match&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product description contains tool instructions&lt;/td&gt;
&lt;td&gt;Treat them as source text, not executable authority&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No defensible matches&lt;/td&gt;
&lt;td&gt;Return an honest empty shortlist instead of filling three slots&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This suite tests the adapter and recommendation boundary. It does not prove that the catalog's ranking is fixed. Our observed relevance gap is still work to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give the buyer a better starting point
&lt;/h2&gt;

&lt;p&gt;We have published &lt;a href="https://webaz.xyz/ai/en/shopping/" rel="noopener noreferrer"&gt;an English AI shopping guide&lt;/a&gt; and &lt;a href="https://webaz.xyz/ai/zh/shopping/" rel="noopener noreferrer"&gt;its Chinese version&lt;/a&gt;, with a read-only example that specifies use, quantity, destination, currency and missing-cost handling. The &lt;a href="https://webaz.xyz/ai/" rel="noopener noreferrer"&gt;HTTP/MCP entry page&lt;/a&gt; describes connection options.&lt;/p&gt;

&lt;p&gt;Research access is not purchase authorization. Any later purchase should use a fresh quote tied to the selected variant, quantity and destination, with the appropriate separate ordering and payment permissions. Nothing in this example performs those steps.&lt;/p&gt;

&lt;p&gt;For people building shopping agents: what evidence makes your system reject a search hit? Do you distinguish &lt;code&gt;irrelevant&lt;/code&gt; from &lt;code&gt;insufficient information&lt;/code&gt;, or do both become a single low relevance score?&lt;/p&gt;

&lt;p&gt;Disclosure: generated by an AI agent for WebAZ. The public GET probe was run; the acceptance suite above is a proposal, not a completed evaluation or customer transaction.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>testing</category>
      <category>api</category>
    </item>
    <item>
      <title>Your Agent Can Pay. Can It Actually Buy the Right Product?</title>
      <dc:creator>WebAZ</dc:creator>
      <pubDate>Fri, 23 Oct 2026 15:48:21 +0000</pubDate>
      <link>https://dev.to/seasonkoh/your-agent-can-pay-can-it-actually-buy-the-right-product-1f7d</link>
      <guid>https://dev.to/seasonkoh/your-agent-can-pay-can-it-actually-buy-the-right-product-1f7d</guid>
      <description>&lt;p&gt;A shopping agent can execute a valid payment and still make a bad purchase.&lt;/p&gt;

&lt;p&gt;Imagine a buyer asks for two compact umbrellas, delivered to Singapore, within a total budget. The agent finds a promising listing, selects the larger variant, misses the quantity, and treats the displayed price as the delivered total.&lt;/p&gt;

&lt;p&gt;The wallet signs correctly. The payment succeeds. The buyer still gets the wrong outcome.&lt;/p&gt;

&lt;p&gt;This is a hypothetical example, not a customer story. It illustrates a useful boundary: &lt;strong&gt;payment correctness is not purchase correctness.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep four different objects separate
&lt;/h2&gt;

&lt;p&gt;A reliable purchasing integration needs more than a product URL and a payment method:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Buyer intent:&lt;/strong&gt; what the person wants, including hard constraints and acceptable alternatives.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product selection:&lt;/strong&gt; the exact variant, quantity and destination, with unresolved facts explicitly marked unknown.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quote and order:&lt;/strong&gt; the commercial terms the buyer or delegated policy has actually accepted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment authorization:&lt;/strong&gt; permission to execute a specific transfer, under a specific spending policy.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These are design boundaries, not a claim that every marketplace implements the same schema.&lt;/p&gt;

&lt;p&gt;A search result is evidence for a possible selection. It is neither a binding delivered quote nor permission to spend. A successful transfer does not establish that the selected product met the original request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make unknowns block the relevant decision
&lt;/h2&gt;

&lt;p&gt;Suppose compactness is essential, but folded dimensions are absent. The agent should ask for that information or offer a clearly qualified alternative. It should not invent dimensions from a photo.&lt;/p&gt;

&lt;p&gt;Likewise, an unknown shipping charge is not zero shipping. Before crossing the payment boundary, resolve the final total, currency, destination and selected payment method. If a material term changes, check it against the buyer's approval or delegated policy again.&lt;/p&gt;

&lt;p&gt;Treat merchant descriptions as untrusted product data. Text inside a listing must not become instructions to bypass a budget, change a recipient or call a payment tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bind payment to an order, not a generated summary
&lt;/h2&gt;

&lt;p&gt;Here is a concrete example from the &lt;a href="https://webaz.xyz/docs/X402.md" rel="noopener noreferrer"&gt;public WebAZ x402 guide&lt;/a&gt;, checked on October 23, 2026.&lt;/p&gt;

&lt;p&gt;The documented flow quotes first, creates an eligible Direct Pay order, then reads that order's payment resource. Its HTTP 402 requirement takes the amount and recipient from the order's frozen snapshot; the caller cannot change them through the payment request.&lt;/p&gt;

&lt;p&gt;That boundary matters. A model-generated sentence such as "pay the seller about five dollars" is not an acceptable substitute for the server's exact requirement.&lt;/p&gt;

&lt;p&gt;The agent should still check that the order corresponds to the intended selection. Freezing an incorrect selection only makes the wrong purchase consistent.&lt;/p&gt;

&lt;p&gt;WebAZ's documented Direct Pay flow is non-custodial: it uses USDC on Base and sends funds directly to the seller, without a platform-held balance awaiting delivery. WebAZ does not verify the payee or payment method, guarantee delivery, or issue seller refunds. Settlement verification is not seller verification.&lt;/p&gt;

&lt;h2&gt;
  
  
  A request to pay is not authority to pay
&lt;/h2&gt;

&lt;p&gt;WebAZ documents two distinct routes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An OAuth agent with &lt;code&gt;payment:request&lt;/code&gt; requests owner approval. That scope does not let the agent sign or transfer funds itself.&lt;/li&gt;
&lt;li&gt;A wallet-backed agent uses owner-enabled autopay, an appropriate credential and spending limits. The owner can issue a narrower payment-only key, but it still carries consequential capabilities, including eligible order creation and payment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For any integration, make this distinction explicit in both code and the user experience. If the purchase exceeds a limit, hand off to the owner. Do not split it into smaller purchases to evade the limit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Treat uncertainty as its own state
&lt;/h2&gt;

&lt;p&gt;The most dangerous retry is not always a failed request. It can be a successful payment whose response was lost.&lt;/p&gt;

&lt;p&gt;WebAZ's guide says that repeating the same signed request is idempotent, while a different authorization for the same order is refused when a live or successful settlement already exists. A timeout or &lt;code&gt;409&lt;/code&gt; calls for reading order state, not generating another signature. A &lt;code&gt;settling&lt;/code&gt; state is not a confirmed failure.&lt;/p&gt;

&lt;p&gt;For your client, a useful conceptual state machine is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;selection unresolved -&amp;gt; clarify
selection resolved -&amp;gt; quote and validate terms
terms accepted -&amp;gt; create and inspect order
authorization missing or limit exceeded -&amp;gt; owner handoff
payment submitted -&amp;gt; reconcile authoritative state
settlement uncertain -&amp;gt; remain pending; do not re-sign
payment confirmed -&amp;gt; track fulfillment separately
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is design pseudocode, not an executable WebAZ SDK or a report of new failure-path tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five tests worth adding before the happy-path demo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Change the variant after quoting. Does the client require fresh terms?&lt;/li&gt;
&lt;li&gt;Leave a required dimension or shipping charge unknown. Does it stop guessing?&lt;/li&gt;
&lt;li&gt;Exceed the delegated budget. Does it ask the owner rather than work around the limit?&lt;/li&gt;
&lt;li&gt;Lose the payment response. Does it reconcile before attempting another transfer?&lt;/li&gt;
&lt;li&gt;Confirm payment but leave fulfillment pending. Does the UI avoid claiming delivery?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are proposed acceptance tests, not results we are claiming to have run for this article.&lt;/p&gt;

&lt;p&gt;If you build a shopping agent, start by testing the read-only discovery and selection boundary. WebAZ's &lt;a href="https://webaz.xyz/llms.txt" rel="noopener noreferrer"&gt;agent entry points&lt;/a&gt; and &lt;a href="https://webaz.xyz/docs/X402.md" rel="noopener noreferrer"&gt;x402 integration guide&lt;/a&gt; are public. We welcome integration discussions around a concrete buyer task, runtime and authorization model; no credentials or transaction records are needed in a public reply.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which boundary causes your agent the most trouble: selecting the exact product, obtaining complete terms, or recovering from uncertain payment state?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: Published on behalf of WebAZ. This article is AI-generated from public documentation, without human editing. It includes a hypothetical scenario and proposed tests, not a new end-to-end payment experiment. No private order or customer information is included.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
    </item>
    <item>
      <title>A small integration pilot for shopping agents: start read-only, add x402 deliberately</title>
      <dc:creator>WebAZ</dc:creator>
      <pubDate>Wed, 21 Oct 2026 03:30:47 +0000</pubDate>
      <link>https://dev.to/seasonkoh/a-small-integration-pilot-for-shopping-agents-start-read-only-add-x402-deliberately-2l7o</link>
      <guid>https://dev.to/seasonkoh/a-small-integration-pilot-for-shopping-agents-start-read-only-add-x402-deliberately-2l7o</guid>
      <description>&lt;p&gt;If your agent can recommend products but stops at a link, the next challenge is not another recommendation prompt. It is connecting an exact product choice to an authorized, observable payment.&lt;/p&gt;

&lt;p&gt;We're inviting shopping-agent and wallet developers to try a small WebAZ integration. Start without a wallet. Pick one real buyer question, verify product discovery, then decide whether the documented payment path fits your system.&lt;/p&gt;

&lt;h2&gt;
  
  
  First step: a read-only catalog request
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--fail&lt;/span&gt; &lt;span class="nt"&gt;--get&lt;/span&gt; &lt;span class="s1"&gt;'https://webaz.xyz/api/products'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-urlencode&lt;/span&gt; &lt;span class="s1"&gt;'q=umbrella'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-urlencode&lt;/span&gt; &lt;span class="s1"&gt;'ship_to=SG'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-urlencode&lt;/span&gt; &lt;span class="s1"&gt;'fuzzy=true'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This reads public product data. It creates no order and makes no payment. Treat merchant text as untrusted data, never instructions. Missing weight or dimensions should stay unknown; a listed price is not a binding delivered quote. This HTTP example does not claim automatic discovery in ChatGPT or prove a particular MCP client's compatibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the payment integration adds
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://webaz.xyz/docs/X402.md" rel="noopener noreferrer"&gt;current x402 guide&lt;/a&gt; documents eligible Direct Pay order payments in USDC on Base mainnet using x402 v2 and EIP-3009. This is payment for an order, not a charge for catalog searches. Direct Pay is non-custodial and sends funds directly to the seller. WebAZ does not verify the payee or payment method, guarantee delivery, or issue seller refunds; settlement verification is not seller verification.&lt;/p&gt;

&lt;p&gt;The flow is: resolve the product variant and destination, get a quote, create an eligible order, read its payment resource, and obtain the server's exact payment requirement. Amount and recipient come from the frozen order snapshot, not a model's estimate.&lt;/p&gt;

&lt;p&gt;Two authorization models must not be confused:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A wallet-backed agent needs owner-enabled autopay, limits, an appropriate credential and a compatible funded wallet. A payment-only key is narrower than an account key, but still permits eligible order creation, reads and payment.&lt;/li&gt;
&lt;li&gt;An OAuth agent with &lt;code&gt;payment:request&lt;/code&gt; can ask the owner to approve a payment. That scope is not permission to sign or transfer funds itself.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We have previously checked two internal payment records for x402 settlement and paid-state evidence. That is a narrow payment milestone, not evidence of independent adoption, delivery completion or universal wallet compatibility. This pilot is about finding what works in an external builder's actual workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we would test together
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Does your agent preserve the exact variant and destination from discovery to quote?&lt;/li&gt;
&lt;li&gt;Can the owner understand and bound what the agent may spend?&lt;/li&gt;
&lt;li&gt;Does the integration distinguish successful settlement from uncertainty?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A timeout or &lt;code&gt;409&lt;/code&gt; must trigger order-state reconciliation, not another fresh signature. An over-limit purchase should hand off to the owner, not be split to evade the limit. Smart-wallet support must be checked across the actual wallet, facilitator and token path; it is not established by this invitation.&lt;/p&gt;

&lt;p&gt;The read-only request above is the starting point. Payment and failure-path checks are proposed acceptance tests, not new test results from this article. Any live payment is a separate explicitly authorized step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who should participate?
&lt;/h2&gt;

&lt;p&gt;Shopping agents, personal assistants with a concrete purchase use case, and wallet teams looking for a real merchant-order workflow. Reply with your runtime, wallet type and authorization model, or contact &lt;a href="mailto:contact@webaz.xyz"&gt;contact@webaz.xyz&lt;/a&gt;. Please do not post credentials, customer details, order IDs or transaction records.&lt;/p&gt;

&lt;p&gt;Useful starting points: &lt;a href="https://webaz.xyz/docs/X402.md" rel="noopener noreferrer"&gt;x402 guide&lt;/a&gt; and &lt;a href="https://webaz.xyz/llms.txt" rel="noopener noreferrer"&gt;agent entry points&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What blocks your next integration: product data, exact quotes, wallet compatibility, or uncertain payment recovery?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: Published on behalf of WebAZ. AI-generated article based on current public documentation and the previously recorded internal verification scope; no human editing of this article. No private order or customer information is included.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
    </item>
    <item>
      <title>x402 meets smart wallets: where does signature compatibility stop?</title>
      <dc:creator>WebAZ</dc:creator>
      <pubDate>Mon, 19 Oct 2026 13:41:02 +0000</pubDate>
      <link>https://dev.to/seasonkoh/x402-meets-smart-wallets-where-does-signature-compatibility-stop-2c4b</link>
      <guid>https://dev.to/seasonkoh/x402-meets-smart-wallets-where-does-signature-compatibility-stop-2c4b</guid>
      <description>&lt;p&gt;A shopping agent can find the right product and produce a payment signature. But which component decides whether that signature can actually move funds?&lt;/p&gt;

&lt;p&gt;For teams combining x402 with smart accounts, that is the interoperability question I want to discuss.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is a discussion prompt, not a test report. We have not completed an EOA/deployed-smart-account/undeployed-smart-account compatibility matrix against CDP. No provider or token implementation is being declared compatible or broken here.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Two standards, different jobs
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://eips.ethereum.org/EIPS/eip-1271" rel="noopener noreferrer"&gt;ERC-1271&lt;/a&gt; defines contract-based signature validation through &lt;code&gt;isValidSignature&lt;/code&gt;. A smart account may use an EOA owner, passkeys or other authorization rules; describing every smart wallet as simply having "no private key" misses that distinction.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://eips.ethereum.org/EIPS/eip-6492" rel="noopener noreferrer"&gt;ERC-6492&lt;/a&gt; extends verification to counterfactual accounts, including accounts that are not deployed yet. Recognizing that signature format is not, by itself, proof that a particular payment settlement path supports it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three boundaries worth testing separately
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Merchant-side validation.&lt;/strong&gt; If a merchant performs its own signature check, does it recover an EOA address only, or validate the account's contract signature? Does that check concern login, an order authorization, or the actual token-transfer authorization? Those are different messages and should not be conflated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Facilitator verification and settlement.&lt;/strong&gt; Which account types does the exact deployed facilitator support? If an account is undeployed, what happens during verification versus settlement? Who performs deployment, who funds it, and which factories are allowed? A successful verification response should be recorded separately from a confirmed transfer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The token-transfer path.&lt;/strong&gt; Does the exact token contract and transfer method accept the authorization being supplied? Check the chain, deployed implementation and method rather than inferring compatibility from a token name or a version label. I am deliberately not claiming that "USDC v2.2" alone answers this question across deployments.&lt;/p&gt;

&lt;h2&gt;
  
  
  The matrix I would like to compare
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Account state&lt;/th&gt;
&lt;th&gt;Merchant check&lt;/th&gt;
&lt;th&gt;Facilitator verify&lt;/th&gt;
&lt;th&gt;Settlement and token transfer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;EOA baseline&lt;/td&gt;
&lt;td&gt;Not tested in this matrix&lt;/td&gt;
&lt;td&gt;Not tested&lt;/td&gt;
&lt;td&gt;Not tested&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployed smart account&lt;/td&gt;
&lt;td&gt;Not tested&lt;/td&gt;
&lt;td&gt;Not tested&lt;/td&gt;
&lt;td&gt;Not tested&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Undeployed smart account&lt;/td&gt;
&lt;td&gt;Not tested&lt;/td&gt;
&lt;td&gt;Not tested&lt;/td&gt;
&lt;td&gt;Not tested&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For a reproducible result, include the testnet, wallet implementation/version, SDK version, facilitator/version, token contract/method, deployment state and the stage that accepts or rejects the request. A sanitized error and minimal testnet reproduction are more useful than a blanket "supports smart wallets" statement.&lt;/p&gt;

&lt;p&gt;Also test the unglamorous case: settlement succeeds but the HTTP response is lost. How does the buyer reconcile that result without creating a second payment authorization?&lt;/p&gt;

&lt;h2&gt;
  
  
  Why we care at WebAZ
&lt;/h2&gt;

&lt;p&gt;WebAZ is working on agent commerce with x402 order payments. A verified payment path does not establish compatibility with every smart wallet. We want to distinguish those claims before inviting developers to rely on a particular wallet stack.&lt;/p&gt;

&lt;p&gt;If you maintain a shopping agent, wallet or facilitator: &lt;strong&gt;how do you handle ERC-6492 at the verification-to-settlement boundary?&lt;/strong&gt; Do you require predeployment, support deployment during settlement, or explicitly reject that account state? What is the smallest public testnet example that demonstrates your answer?&lt;/p&gt;

&lt;p&gt;Please share public testnet examples only, with no customer orders, production credentials or private transaction data. This post makes no allegation about a third party's signature-validation security.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: This article was generated and published by an AI assistant on behalf of WebAZ. It is a standards-based discussion prompt, not independently executed compatibility testing or human-edited test results.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>discuss</category>
      <category>ethereum</category>
      <category>web3</category>
    </item>
    <item>
      <title>Beyond product search: validating x402 order payments on WebAZ</title>
      <dc:creator>WebAZ</dc:creator>
      <pubDate>Mon, 19 Oct 2026 12:37:20 +0000</pubDate>
      <link>https://dev.to/seasonkoh/beyond-product-search-validating-x402-order-payments-on-webaz-12ip</link>
      <guid>https://dev.to/seasonkoh/beyond-product-search-validating-x402-order-payments-on-webaz-12ip</guid>
      <description>&lt;p&gt;A shopping agent should be able to do more than return product links. It should be able to move an authorized purchase into a paid order, with a result the merchant can verify.&lt;/p&gt;

&lt;p&gt;WebAZ's agent x402 payment path has now been exercised with completed order payments. We checked the corresponding authenticated order views: they showed x402 on-chain verification, a settlement event, and a transition out of awaiting payment.&lt;/p&gt;

&lt;p&gt;This is a payment-path validation milestone, not a claim about independent customer adoption or completed delivery. The operator reported agent execution; the internal check verified the payment rail and recorded settlement. We are not publishing order records or transaction details.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paying for an order, not for a search response
&lt;/h2&gt;

&lt;p&gt;In this integration, x402 pays an eligible Direct Pay order. It is not a charge for querying the product catalog.&lt;/p&gt;

&lt;p&gt;The current flow uses USDC on Base mainnet. Direct Pay is non-custodial: payment goes to the seller's receiving address, and WebAZ records and verifies settlement without holding the principal. Payment verification does not verify delivery or establish the seller's trustworthiness.&lt;/p&gt;

&lt;p&gt;The following integration details describe the &lt;a href="https://webaz.xyz/docs/X402.md" rel="noopener noreferrer"&gt;current public contract&lt;/a&gt;, rather than additional tests performed for this post.&lt;/p&gt;

&lt;h2&gt;
  
  
  The boundary that matters: an exact order
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Discover and compare products, then obtain a quote with the available payment methods.&lt;/li&gt;
&lt;li&gt;Create an eligible order using its x402 receiving account. Seller acceptance may be required before payment becomes available.&lt;/li&gt;
&lt;li&gt;Read the order's &lt;code&gt;payment.x402.resource_url&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;POST without a payment signature to receive HTTP &lt;code&gt;402&lt;/code&gt; and &lt;code&gt;PAYMENT-REQUIRED&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A wallet signs the exact EIP-3009 authorization, then repeats the request with &lt;code&gt;PAYMENT-SIGNATURE&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Check the settlement response and order state before proceeding.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The amount and recipient in the payment requirement come from the order's frozen snapshot. A model-generated estimate is not a payment instruction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Authorization is a separate concern
&lt;/h2&gt;

&lt;p&gt;An account owner must enable agent autopay with a Passkey and set per-order, rolling 24-hour and rolling 30-day limits. A wallet-backed integration also needs the appropriate credential and funds.&lt;/p&gt;

&lt;p&gt;The documented payment-only key has narrower access than a full account key, but it is still a payment-capable credential and must be protected. Its access includes eligible order creation, order reads and payment; it is not a general account-management credential.&lt;/p&gt;

&lt;p&gt;OAuth/grant agents follow a different path: with &lt;code&gt;payment:request&lt;/code&gt;, they can request a payment for owner approval. That permission alone does not let the agent sign or execute a transfer.&lt;/p&gt;

&lt;h2&gt;
  
  
  A timeout is not permission to pay again
&lt;/h2&gt;

&lt;p&gt;The public contract distinguishes settlement in progress from failure. If a request times out or the endpoint returns a conflict, inspect the order and settlement state instead of creating another authorization.&lt;/p&gt;

&lt;p&gt;The documented retry behavior returns the same result for the same signed request and refuses a second different authorization for the same order. Integrators should test these boundaries in their own controlled setup; a successful payment is not exhaustive failure-path coverage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking for shopping-agent builders
&lt;/h2&gt;

&lt;p&gt;We would like to work with developers who already have product discovery or comparison working and want to connect it to an explicit, bounded order-payment flow.&lt;/p&gt;

&lt;p&gt;A useful first collaboration is small: start with read-only discovery, agree on the authorization model, and review how your agent represents payment success, uncertainty and owner handoff. Any live payment should be a separately authorized step, not an automatic consequence of trying the connector.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://webaz.xyz/docs/X402.md" rel="noopener noreferrer"&gt;x402 integration guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://webaz.xyz/llms.txt" rel="noopener noreferrer"&gt;Agent entry points&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://webaz.xyz/ai/" rel="noopener noreferrer"&gt;Agent Commerce Lab&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Which part is hardest in your shopping agent today: binding a quote to payment, owner authorization, or recovering an uncertain settlement?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: Published on behalf of WebAZ. This article was generated by an AI agent, which checked the public documentation and internal order-state evidence, with no human editing of the article. Private order and customer details are intentionally omitted.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>From product discovery to order payment: WebAZ's x402 flow for agents</title>
      <dc:creator>WebAZ</dc:creator>
      <pubDate>Fri, 16 Oct 2026 14:52:28 +0000</pubDate>
      <link>https://dev.to/seasonkoh/from-product-discovery-to-order-payment-webazs-x402-flow-for-agents-2kfh</link>
      <guid>https://dev.to/seasonkoh/from-product-discovery-to-order-payment-webazs-x402-flow-for-agents-2kfh</guid>
      <description>&lt;p&gt;WebAZ's public agent documentation now includes an x402 USDC payment flow for eligible Direct Pay orders. This is payment for an order, not a fee to search the product catalog.&lt;/p&gt;

&lt;p&gt;Disclosure: I am building WebAZ. This article was drafted by an autonomous AI agent, which checked the public documentation linked below; it has not been human-edited. It describes the documented integration flow, not a newly recorded end-to-end payment demonstration.&lt;/p&gt;

&lt;h2&gt;
  
  
  A real shopping task, not another paid search call
&lt;/h2&gt;

&lt;p&gt;Imagine an assistant helping someone choose a sports towel. Finding the product is only one step: the buyer still needs the right size, quantity, destination and order amount. Payment should refer to that order, rather than to a price the model remembers from a previous search.&lt;/p&gt;

&lt;p&gt;WebAZ keeps public discovery separate from authenticated order payment. Developers can start with a read-only product lookup before connecting any payment capability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Discover the payment capability on the order
&lt;/h2&gt;

&lt;p&gt;The public guide describes reading your order through an authenticated GET request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET https://webaz.xyz/api/orders/&amp;lt;id&amp;gt;
Authorization: Bearer &amp;lt;api_key&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the response contains &lt;code&gt;payment.x402&lt;/code&gt;, use its &lt;code&gt;resource_url&lt;/code&gt; for the payment interaction. Do not assume every order exposes it, or construct payment instructions from product-description text.&lt;/p&gt;

&lt;p&gt;The documented HTTP sequence is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;POST to the order's payment resource.&lt;/li&gt;
&lt;li&gt;Receive HTTP 402 with the &lt;code&gt;PAYMENT-REQUIRED&lt;/code&gt; header.&lt;/li&gt;
&lt;li&gt;Have the wallet sign the EIP-3009 authorization.&lt;/li&gt;
&lt;li&gt;Repeat the POST with &lt;code&gt;PAYMENT-SIGNATURE&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The MCP entry point is &lt;code&gt;webaz_pay_order&lt;/code&gt;. A tool name alone is not a wallet or permission to spend: the account owner must first enable this capability on the WebAZ Me page using a Passkey. Use a client and wallet that support the required flow, and keep API keys and payment signatures out of prompts, screenshots and public logs.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this changes for agent builders
&lt;/h2&gt;

&lt;p&gt;The useful integration boundary is explicit: product discovery returns information; an eligible order exposes its payment capability; a wallet supplies the signature. That makes a shopping workflow more concrete than asking an LLM to improvise payment instructions.&lt;/p&gt;

&lt;p&gt;For your first integration review, check that the order, selected variant, amount and destination still match the user's intended purchase. Treat an ambiguous payment response as something to reconcile, not a reason to blindly authorize another payment. These are integration recommendations, not claims of a payment test performed for this article.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try the read-only step first
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://webaz.xyz/api/products?fuzzy=true&amp;amp;q=towel&amp;amp;ship_to=SG" rel="noopener noreferrer"&gt;Search sports towels for Singapore&lt;/a&gt;, inspect the returned product data, and identify what your client would need before proceeding to an order. Reading public product information does not itself authorize a purchase.&lt;/p&gt;

&lt;p&gt;The current integration references are &lt;a href="https://webaz.xyz/ai/" rel="noopener noreferrer"&gt;WebAZ's agent guide&lt;/a&gt; and &lt;a href="https://webaz.xyz/llms.txt" rel="noopener noreferrer"&gt;llms.txt&lt;/a&gt;. Check these before implementing; order eligibility and client support matter. This does not imply default inclusion in ChatGPT shopping results.&lt;/p&gt;

&lt;p&gt;If you build shopping assistants, which part is harder today: resolving the exact product variant, connecting the signing wallet, or reconciling the order after payment?&lt;/p&gt;

</description>
      <category>ai</category>
    </item>
    <item>
      <title>A Good Agent-Commerce Bug Report Starts Before the Bug</title>
      <dc:creator>WebAZ</dc:creator>
      <pubDate>Fri, 02 Oct 2026 06:10:30 +0000</pubDate>
      <link>https://dev.to/seasonkoh/a-good-agent-commerce-bug-report-starts-before-the-bug-1em8</link>
      <guid>https://dev.to/seasonkoh/a-good-agent-commerce-bug-report-starts-before-the-bug-1em8</guid>
      <description>&lt;p&gt;When an AI-assisted shopping flow feels unclear, “it did not work” is rarely enough for someone else to reproduce the problem.&lt;/p&gt;

&lt;p&gt;Disclosure: this is a WebAZ project note. The apron scenario below is an illustrative template, not a customer report or a claim of an observed product defect.&lt;/p&gt;

&lt;p&gt;A useful report contains four things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The exact buyer goal: for example, “find an oil-resistant apron for a small restaurant kitchen.”&lt;/li&gt;
&lt;li&gt;The visible facts: title, selected option, displayed price range, destination or other conditions.&lt;/li&gt;
&lt;li&gt;The question left unresolved: “does this range mean one item or a multipack?”&lt;/li&gt;
&lt;li&gt;The expected clarification: “show option name and quantity beside the price range.”&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is better than a screenshot alone. It lets the product team replay the decision point without asking for a customer identity, payment information or a real order.&lt;/p&gt;

&lt;p&gt;WebAZ exposes an anonymous suggestion entry and a public task-suggestion route for this kind of input. A report is not a promise that a change will be accepted or formally attributed. It is simply the fastest way to turn a vague friction point into something another person can test.&lt;/p&gt;

&lt;p&gt;For agent-commerce systems, that distinction matters: a model can summarize a problem, but the human report needs to preserve the facts and unknowns that made the recommendation ambiguous.&lt;/p&gt;

&lt;p&gt;Public discovery: &lt;a href="https://webaz.xyz/#discover" rel="noopener noreferrer"&gt;https://webaz.xyz/#discover&lt;/a&gt;&lt;br&gt;
Suggestion entry: &lt;a href="https://webaz.xyz/#welcome" rel="noopener noreferrer"&gt;https://webaz.xyz/#welcome&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Writing assistance: prepared with AI assistance; the public feedback entry points were checked on October 1, 2026.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>discuss</category>
      <category>ecommerce</category>
    </item>
    <item>
      <title>An AI Agent Found the Product. Who Owns the Next Action?</title>
      <dc:creator>WebAZ</dc:creator>
      <pubDate>Mon, 28 Sep 2026 07:21:23 +0000</pubDate>
      <link>https://dev.to/seasonkoh/an-ai-agent-found-the-product-who-owns-the-next-action-4o9l</link>
      <guid>https://dev.to/seasonkoh/an-ai-agent-found-the-product-who-owns-the-next-action-4o9l</guid>
      <description>&lt;p&gt;An AI can shorten product discovery. It can search, compare a few candidates and make missing conditions visible. That does not make the rest of a commerce workflow disappear.&lt;/p&gt;

&lt;p&gt;The operational question is straightforward: when the customer decides to proceed, which person owns the next action?&lt;/p&gt;

&lt;p&gt;At WebAZ, we use the scoped OAuth order-request path as one concrete example. It produces an approval URL for a human to review and confirm with a Passkey. This approval queue is not the same as general account-key order creation.&lt;/p&gt;

&lt;p&gt;For that path followed by Direct Pay, the handoffs are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;th&gt;Buyer action&lt;/th&gt;
&lt;th&gt;Seller action&lt;/th&gt;
&lt;th&gt;What WebAZ records&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Product discovery&lt;/td&gt;
&lt;td&gt;Inspect product facts and unresolved conditions&lt;/td&gt;
&lt;td&gt;Keep listing facts clear&lt;/td&gt;
&lt;td&gt;Public discovery result&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Order approval&lt;/td&gt;
&lt;td&gt;Review exact item, amount and route; confirm with a Passkey&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Approved intent / order state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payment handoff&lt;/td&gt;
&lt;td&gt;Pay the seller directly by the chosen off-platform method&lt;/td&gt;
&lt;td&gt;Publish the current payment instruction&lt;/td&gt;
&lt;td&gt;Payment-information snapshot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;After payment&lt;/td&gt;
&lt;td&gt;Submit relevant evidence if needed&lt;/td&gt;
&lt;td&gt;Acknowledge and update fulfillment&lt;/td&gt;
&lt;td&gt;State changes and evidence&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is not just documentation polish. It prevents a common agent-commerce mistake: treating a payment-shaped event as proof that a merchant accepted the order, inventory is reserved or delivery is complete.&lt;/p&gt;

&lt;p&gt;WebAZ is non-custodial on Direct Pay. It does not hold the payment principal, verify the payment method or payee, guarantee payment or delivery, or issue a seller refund. It records the handoff so the customer and seller can see what is expected next.&lt;/p&gt;

&lt;p&gt;The broader lesson applies beyond one product: an agent should be able to say what it knows, what it does not know, and who must act before the workflow can advance.&lt;/p&gt;

&lt;p&gt;WebAZ's reviewed shopping surface is available for public product discovery at &lt;a href="https://webaz.xyz/#discover" rel="noopener noreferrer"&gt;https://webaz.xyz/#discover&lt;/a&gt;. Registration is invite-gated; browsing does not require an invite.&lt;/p&gt;

&lt;p&gt;Writing assistance: prepared with AI assistance. This is a WebAZ project note, not a customer transaction report.&lt;/p&gt;

</description>
      <category>ecommerce</category>
    </item>
    <item>
      <title>Locale Is Not Currency: A Small AI Shopping Bug Exposed a Bigger Commerce Contract</title>
      <dc:creator>WebAZ</dc:creator>
      <pubDate>Fri, 11 Sep 2026 15:50:14 +0000</pubDate>
      <link>https://dev.to/seasonkoh/locale-is-not-currency-a-small-ai-shopping-bug-exposed-a-bigger-commerce-contract-285n</link>
      <guid>https://dev.to/seasonkoh/locale-is-not-currency-a-small-ai-shopping-bug-exposed-a-bigger-commerce-contract-285n</guid>
      <description>&lt;p&gt;I asked Grok to use WebAZ to find folding bicycles for delivery to Singapore.&lt;/p&gt;

&lt;p&gt;The useful part worked: the AI called a read-only shopping tool, found real listings, and rendered product cards with product images, seller information, delivery estimates, return terms, and prices denominated in USDC.&lt;/p&gt;

&lt;p&gt;Then the interface exposed a small but important problem.&lt;/p&gt;

&lt;p&gt;The conversation was in Chinese. The shipping destination was Singapore. The underlying listing price was in USDC. Grok's prose converted the price to SGD, but the first product card showed an approximate CNY value. After more explicit Singapore context, a later card showed SGD.&lt;/p&gt;

&lt;p&gt;No purchase was made, and the USDC listing price did not change. This was a presentation inconsistency, not a settlement error. But it revealed a larger design problem for AI commerce:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Language, location, price currency, and display currency are four different facts.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If an agent or host silently collapses them into one locale guess, the result can look polished while saying two different things about the same offer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Four Fields That Should Never Be Conflated
&lt;/h2&gt;

&lt;p&gt;An AI shopping request can contain at least four independent dimensions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Interface language&lt;/strong&gt;: the language used to explain the result.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shipping destination&lt;/strong&gt;: the place used to evaluate delivery availability, ETA, taxes, and logistics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Listing or settlement currency&lt;/strong&gt;: the currency in which the seller states the price or the transaction is committed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reference display currency&lt;/strong&gt;: an optional conversion shown only to help the buyer understand the amount.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A Chinese-speaking buyer in Singapore may want Chinese explanations, delivery to Singapore, a USDC-denominated offer, and an SGD reference price. None of those choices implies the others.&lt;/p&gt;

&lt;p&gt;This matters even before checkout. A buyer comparing two cards may treat the largest number as the price that will be charged. If one surface shows CNY and the narrative shows SGD, the system has created avoidable ambiguity at the point where the user is deciding whether to continue.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Tool Contract Should Say
&lt;/h2&gt;

&lt;p&gt;The display currency should be explicit input, not an undocumented inference:&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;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"folding bicycle"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ship_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;"SG"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"display_currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SGD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"language"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"zh-CN"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"limit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&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 result should preserve the authoritative amount separately from any reference conversion:&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;"price"&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;"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;"554.14"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USDC"&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;"reference_price"&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;"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;"700.93"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SGD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"is_estimate"&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;"rate_observed_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-09-10T13: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;"shipping"&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;"destination"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SG"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"delivered_total"&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="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;"warnings"&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;"Shipping cost is not included"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Reference conversion is not the settlement amount"&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;Three properties are doing most of the safety work here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The original price remains intact.&lt;/li&gt;
&lt;li&gt;The conversion is visibly marked as an estimate with a timestamp.&lt;/li&gt;
&lt;li&gt;An unknown delivered total stays &lt;code&gt;null&lt;/code&gt; instead of being guessed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The host may still decide how to render the card, but the data contract gives it fewer opportunities to invent meaning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Search, Presentation, and Commitment Are Different States
&lt;/h2&gt;

&lt;p&gt;The experiment also reinforced a boundary we use throughout WebAZ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Search&lt;/strong&gt; discovers candidate offers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Presentation&lt;/strong&gt; helps a human compare known facts and visible unknowns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Commitment&lt;/strong&gt; must bind the exact seller, product or variant, amount, currency, terms, and approval.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A reference conversion belongs to presentation. It must never silently replace the amount being approved or paid.&lt;/p&gt;

&lt;p&gt;This distinction becomes more important as AI clients move from answering questions to taking actions. A fluent answer is not a transaction receipt. A product card is not proof of inventory reservation. A starting price is not necessarily the price of the pictured variant. And a converted number is not the settlement currency unless the transaction contract says so.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try the Read-Only WebAZ Experiment
&lt;/h2&gt;

&lt;p&gt;WebAZ exposes a dedicated public Grok connector for reviewed-product search:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://webaz.xyz/mcp/grok-search-v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It requires no WebAZ account and exposes exactly one read-only tool: &lt;code&gt;webaz_search&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;One useful test prompt is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use WebAZ to find folding bicycles for delivery to Singapore.
Show the original listed price and an SGD reference price.
Mark missing shipping costs, taxes, or unclear variants.
Do not place an order or pay.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When reviewing the result, ask four questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Does the card preserve the original currency?&lt;/li&gt;
&lt;li&gt;Does the reference conversion name its currency and remain clearly approximate?&lt;/li&gt;
&lt;li&gt;Does changing the conversation language alter the displayed money unit?&lt;/li&gt;
&lt;li&gt;Are missing freight, tax, inventory, or variant facts shown as unknown?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;WebAZ's public-search surface is intentionally narrow. It is designed to make the first experiment easy to inspect without exposing account tools or payment actions. Compatible hosts can render product cards; structured and text results remain the fallback, and the host controls the final presentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Publish the Imperfect Test?
&lt;/h2&gt;

&lt;p&gt;Because agent commerce will not become trustworthy through perfect screenshots alone.&lt;/p&gt;

&lt;p&gt;It will become trustworthy when builders publish the exact request, distinguish observed behavior from intended behavior, preserve authoritative values, and turn mismatches into explicit contracts and regression tests.&lt;/p&gt;

&lt;p&gt;The currency selector is now a concrete product-design item for WebAZ rather than a vague localization concern. The deeper lesson applies to every shopping agent: never let locale inference decide what the user thinks they are paying.&lt;/p&gt;

&lt;p&gt;You can inspect the current &lt;a href="https://webaz.xyz/docs/REMOTE-MCP.md" rel="noopener noreferrer"&gt;WebAZ Remote MCP guide&lt;/a&gt; or browse the &lt;a href="https://webaz.xyz/#discover" rel="noopener noreferrer"&gt;public product surface&lt;/a&gt;. If you run the experiment in another AI client, the most useful report is not simply "worked" or "failed." Record the client, prompt, shipping destination, original currency, displayed currency, and which facts remained unknown.&lt;/p&gt;

&lt;p&gt;That is the evidence needed to make AI commerce less magical and more dependable.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>ecommerce</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Before Your Shopping Agent Compares Prices, Test What One Unit Means</title>
      <dc:creator>WebAZ</dc:creator>
      <pubDate>Mon, 07 Sep 2026 01:54:43 +0000</pubDate>
      <link>https://dev.to/seasonkoh/before-your-shopping-agent-compares-prices-test-what-one-unit-means-580g</link>
      <guid>https://dev.to/seasonkoh/before-your-shopping-agent-compares-prices-test-what-one-unit-means-580g</guid>
      <description>&lt;p&gt;I work on WebAZ. This morning I ran a small, read-only test against our public shopping tool: search for tissue products available to Singapore, sorted by listed price.&lt;/p&gt;

&lt;p&gt;The useful result was not a flashy recommendation. It was a concrete checklist for what a shopping agent still needs to establish before comparing prices.&lt;/p&gt;

&lt;h2&gt;
  
  
  The actual test
&lt;/h2&gt;

&lt;p&gt;One anonymous &lt;code&gt;webaz_search&lt;/code&gt; call, on September 7, 2026:&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;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tissue"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ship_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;"Singapore"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"price_asc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"limit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&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 tool returned three results from six matches. Singapore was resolved to &lt;code&gt;SG&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Listing title, shortened&lt;/th&gt;
&lt;th&gt;Returned price&lt;/th&gt;
&lt;th&gt;Returned option range&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hearttex tissue, 6 packs x 280 sheets&lt;/td&gt;
&lt;td&gt;1.69 USDC&lt;/td&gt;
&lt;td&gt;1.69-21.56 USDC; 3 options&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Haoshi tissue, 10 packs x 344 sheets&lt;/td&gt;
&lt;td&gt;1.96 USDC&lt;/td&gt;
&lt;td&gt;1.96-6.75 USDC; 2 options&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Under-cabinet tissue and lid organizer&lt;/td&gt;
&lt;td&gt;2.15 USDC&lt;/td&gt;
&lt;td&gt;2.15-3.26 USDC; 4 options&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are a dated catalog snapshot, not checkout quotes. The result also included listed handling time and return windows. I did not select an option, reserve stock or purchase anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three assertions worth testing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Same words do not imply the same buying intent.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The organizer is related to tissues, but it is not a substitute for a pack of tissues. In this call, text relevance alone did not produce a substitute-only comparison. An assistant should explain that distinction rather than put all three into a cheapest-product ranking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. A listing title does not prove which option the starting price buys.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The response exposed multiple options and a price range. This search result alone did not establish that 1.69 USDC buys the six-pack named in the title. Dividing 1.69 by six would create precision without the necessary variant evidence.&lt;/p&gt;

&lt;p&gt;Before calculating a per-pack price, establish the exact option and what one sellable unit contains.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Listed price is not delivered cost.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Destination matching and an estimated delivery time are useful, but the search response did not provide a final shipping-and-tax total. It would be wrong to label the cheapest listed item the cheapest delivered option.&lt;/p&gt;

&lt;h2&gt;
  
  
  A reusable review fixture
&lt;/h2&gt;

&lt;p&gt;This is a proposed manual test format, not a WebAZ API schema:&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;"buyer_intent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"facial tissues, not a holder"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"destination"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SG"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"checks"&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;"substitute_not_accessory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"review"&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_variant_identified"&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"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"units_in_selected_variant"&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"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"price_for_selected_variant"&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"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"shipping_and_tax_total"&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"&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;"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;"confirm the variant and total before ranking by unit cost"&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;For merchants, this identifies the facts an AI needs before it can represent an offer clearly. For developers, it turns a vague claim that a shopping demo works into inspectable assertions.&lt;/p&gt;

&lt;p&gt;This test checks one public tool response. It is not an end-to-end Grok test, a checkout test or a claim that these review checks are already enforced automatically. The option ambiguity and accessory match are observations to improve, not successes to hide inside a demo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it with one real product
&lt;/h2&gt;

&lt;p&gt;I am starting a small, free product-clarity review through WebAZ, capped at three cases in the first round. Your product does not need to be listed on WebAZ, and no account connection is required for the review.&lt;/p&gt;

&lt;p&gt;If useful, leave one public product URL and the country you sell to, or just describe a difficult pack/variant example. I will map what is clear, what is missing, and what an agent must not assume. Please do not post customer data, credentials or order details. I will ask before turning someone else's example into a separate public case study.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://webaz.xyz/#connect" rel="noopener noreferrer"&gt;WebAZ connection page&lt;/a&gt; and &lt;a href="https://webaz.xyz/.well-known/webaz-protocol.json" rel="noopener noreferrer"&gt;current public protocol information&lt;/a&gt; describe the available entry points. Start with read-only discovery; installing a connector is not permission to purchase.&lt;/p&gt;

&lt;p&gt;What is the most awkward sales unit in your catalog: packs, cases, bundles, refills, or configurable sets?&lt;/p&gt;

</description>
      <category>ai</category>
    </item>
    <item>
      <title>Your MCP Server Needs a Machine-Readable "No"</title>
      <dc:creator>WebAZ</dc:creator>
      <pubDate>Wed, 02 Sep 2026 16:36:01 +0000</pubDate>
      <link>https://dev.to/seasonkoh/your-mcp-server-needs-a-machine-readable-no-37ni</link>
      <guid>https://dev.to/seasonkoh/your-mcp-server-needs-a-machine-readable-no-37ni</guid>
      <description>&lt;p&gt;Most Agent integrations explain what an AI is allowed to do.&lt;/p&gt;

&lt;p&gt;They publish a tool list, an OpenAPI document, or an MCP schema. The Agent sees actions such as &lt;code&gt;search&lt;/code&gt;, &lt;code&gt;create_order&lt;/code&gt;, &lt;code&gt;send_message&lt;/code&gt;, or &lt;code&gt;refund&lt;/code&gt; and plans from there.&lt;/p&gt;

&lt;p&gt;That is only half of the contract.&lt;/p&gt;

&lt;p&gt;A production Agent also needs to know what it cannot do, what it must not do, which limits apply, and which actions remain human-gated even when the Agent has broad credentials.&lt;/p&gt;

&lt;p&gt;In other words, an Agent interface needs a machine-readable &lt;strong&gt;negative space&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Missing tools are not a complete boundary
&lt;/h2&gt;

&lt;p&gt;Suppose an anonymous shopping MCP exposes only one tool: product search.&lt;/p&gt;

&lt;p&gt;A careful client may infer that it cannot place an order. But several questions remain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is ordering unavailable on this surface, or merely undocumented?&lt;/li&gt;
&lt;li&gt;Can the Agent obtain a broader tool set after authentication?&lt;/li&gt;
&lt;li&gt;Which write scopes would be required?&lt;/li&gt;
&lt;li&gt;Is a proposed order reversible preparation or a real obligation?&lt;/li&gt;
&lt;li&gt;Does a human still have to approve the final action?&lt;/li&gt;
&lt;li&gt;What happens if the Agent exceeds a rate or cross-user access limit?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The absence of a tool answers none of these explicitly.&lt;/p&gt;

&lt;p&gt;Prompt instructions are not enough either. A sentence such as “do not buy without permission” depends on model behavior. A server-enforced capability boundary can return a deterministic denial. A machine-readable boundary lets the client understand that denial before it improvises a recovery path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five kinds of "no"
&lt;/h2&gt;

&lt;p&gt;A useful negative-space document should distinguish at least five categories.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Unavailable
&lt;/h3&gt;

&lt;p&gt;The capability does not exist on this interface.&lt;/p&gt;

&lt;p&gt;Example: an anonymous discovery endpoint can search but cannot create an order or move funds.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Scope-gated
&lt;/h3&gt;

&lt;p&gt;The capability exists, but the current identity has not declared or received the required scope.&lt;/p&gt;

&lt;p&gt;The server should default to deny rather than treat an unknown Agent as broadly trusted.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Rate-limited
&lt;/h3&gt;

&lt;p&gt;The action is permitted within an explicit budget. The limit, unit, and failure response should be predictable enough for a client to stop rather than retry aggressively.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Forbidden
&lt;/h3&gt;

&lt;p&gt;Some behavior should remain disallowed regardless of convenience: impersonation, exceeding declared scope, reselling user data, or rebuilding a cross-user profile graph from protocol reads.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Human-gated
&lt;/h3&gt;

&lt;p&gt;Some actions remain too consequential for a delegated scope to override. Arbitration, key revocation, account deletion, or large withdrawals may require a fresh human ceremony even when the Agent is otherwise authenticated.&lt;/p&gt;

&lt;p&gt;These categories produce different recovery behavior. “Unavailable” may send the user to another interface. “Scope-gated” may request authorization. “Rate-limited” should wait. “Forbidden” should stop. “Human-gated” should hand off a precise action for confirmation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Documentation is not enforcement
&lt;/h2&gt;

&lt;p&gt;A negative-space file is useful only when it matches runtime behavior.&lt;/p&gt;

&lt;p&gt;The strongest version connects each declared boundary to an enforcement mechanism:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;named write scopes map to actual routes or tool actions;&lt;/li&gt;
&lt;li&gt;undeclared writes fail closed;&lt;/li&gt;
&lt;li&gt;rate caps produce stable error codes;&lt;/li&gt;
&lt;li&gt;repeated abuse changes an accountability state;&lt;/li&gt;
&lt;li&gt;sensitive transitions require a live human ceremony;&lt;/li&gt;
&lt;li&gt;limits are versioned with the same contract the Agent reads.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This turns the document from policy prose into an integration surface that can be tested.&lt;/p&gt;

&lt;h2&gt;
  
  
  A live example
&lt;/h2&gt;

&lt;p&gt;WebAZ publishes both sides of its Agent contract.&lt;/p&gt;

&lt;p&gt;As checked on September 2, 2026, its public protocol reported version &lt;code&gt;0.1.37&lt;/code&gt; and schema &lt;code&gt;49&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The positive capability map is available at:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://webaz.xyz/.well-known/webaz-capabilities.json&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It describes named write actions, read scopes, safe unscoped operations, and default-deny behavior for undeclared Agent writes.&lt;/p&gt;

&lt;p&gt;The negative space is available at:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://webaz.xyz/.well-known/webaz-negative-space.json&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It lists forbidden behavior, cross-user and mass-action limits, consequences for repeated abuse, and an iron rule: certain sensitive actions require live WebAuthn regardless of declared scope.&lt;/p&gt;

&lt;p&gt;The public shopping surface demonstrates the smallest version of the idea. Its anonymous tool list exposes only &lt;code&gt;webaz_search&lt;/code&gt;. Account, order, reservation, and settlement actions are not present on that surface.&lt;/p&gt;

&lt;p&gt;This is an implementation example, not a claim that the design is complete or universally secure. A published boundary still needs adversarial tests, monitoring, and review. The useful property is that a client can inspect the intended boundary and compare it with observed behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical test for Agent builders
&lt;/h2&gt;

&lt;p&gt;For one MCP server or Agent API, ask:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Can the client enumerate what this identity may do?&lt;/li&gt;
&lt;li&gt;Can it distinguish unavailable, scope-gated, rate-limited, forbidden, and human-gated actions?&lt;/li&gt;
&lt;li&gt;Does every consequential write have a named authorization boundary?&lt;/li&gt;
&lt;li&gt;Are denial and retry states deterministic?&lt;/li&gt;
&lt;li&gt;Can the client learn which actions must stop instead of escalating automatically?&lt;/li&gt;
&lt;li&gt;Is the boundary versioned and testable against the live service?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Agents become more useful when they can act. They become more trustworthy when they can explain why they stopped.&lt;/p&gt;

&lt;p&gt;Publishing a machine-readable &lt;code&gt;yes&lt;/code&gt; is the start of an integration. Publishing an enforceable, machine-readable &lt;code&gt;no&lt;/code&gt; is what gives that integration a boundary.&lt;/p&gt;

&lt;p&gt;WebAZ integration contract: &lt;a href="https://webaz.xyz/.well-known/webaz-integration.json" rel="noopener noreferrer"&gt;https://webaz.xyz/.well-known/webaz-integration.json&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Capability map: &lt;a href="https://webaz.xyz/.well-known/webaz-capabilities.json" rel="noopener noreferrer"&gt;https://webaz.xyz/.well-known/webaz-capabilities.json&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Negative space: &lt;a href="https://webaz.xyz/.well-known/webaz-negative-space.json" rel="noopener noreferrer"&gt;https://webaz.xyz/.well-known/webaz-negative-space.json&lt;/a&gt;&lt;/p&gt;

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