llms.txt: documentation index for LLMs and agentsllms-full.txt: full documentation corpusMarkdown version of the documentationskill.md: agent skill filePaddock MCP server descriptor
— Methodology

How Paddock measures agent commerce.

Every figure Paddock publishes is traceable to a documented source and scoped to a stated coverage tier. This page is the reference for citing Paddock data in research, diligence, and analysis.

01 / SOURCES
01

Data sources

Paddock merges independent public sources into a single, cleaned view, and traces every figure to the source that underpins it. The full list, with the licence each one is used under, is at Data sources and licences.

Settlement · Universe 1

x402scan all-facilitator aggregate

The stats.overall settlement aggregate across all x402 facilitators. Basis for Agent Settlement Volume and all transaction counts.

Catalog · Universe 2

CDP Bazaar catalog

Per-origin service listings from the Coinbase x402 Bazaar, refreshed across all pages and chains. Basis for origin-level attribution.

Registry · Universe 3

Hand-verified wallet map

A small, hand-maintained set of payTo → service mappings. Each one is admitted only after an automated gate probes the domain's own live 402 response or .well-known/x402.json and finds that wallet declared there. There is no continuous crawl: the gate runs when a mapping is proposed or changed, not on a schedule.

Liveness

Liveness data

Whether listed services actually respond, so attribution and Spend Share reflect live services rather than dead listings. This signal comes from an independent third-party monitoring source and is captured nightly; Paddock does not run these probes.

02 / TIERS
02

Coverage tiers

Agent-commerce data exists at three levels of resolution. Each figure Paddock publishes is drawn from one of them.

UNIVERSE 1
100%
of settled txns
Agent Settlement Volume
Everything Paddock observes settling on the x402 rail — a census, not a sample, countable in full without attribution. The flagship metric (§03) is drawn from this tier.
Basis for: market-wide totals
gross_settled_usdc, gross_settled_txns — by definition — this tier is the census total itself, not a computed ratio — snapshot 2026-10-22
UNIVERSE 2
~84.5%
of settled txns
Attributed Transactions
Settlement traceable to a named origin via the Bazaar catalog. Larger, machine-resolved, but not wallet-verified.
Basis for: category and provider analysis
coverage_pct_listed_attributable — resolved transactions ÷ attributable listed-seller transactions (listed rows a wallet→domain directory could resolve; see attributable.ts) — snapshot 2026-10-22
⚠ Base: 2,401 recipient rows returned by x402scan's list that night (highest-tx_count wallets first, capped at ~1,000/night — list_complete: false), not the full listed universe. See FA-012.
UNIVERSE 3
~46.4%
of settled txns · growing
Verified Mapped Market
Settlement resolved to specific, verified wallets. The smallest and most rigorous tier, expanding through registry harvest and ongoing mapping.
Basis for: Spend Share · health signals
categoryVolume[*] (excluding "other"), ecosystem.total_transactions — named-category transactions ÷ total settled transactions, excluding the unattributed "other" bucket (FA-011) — snapshot 2026-10-22
⚠ Truncated numerator over census denominator: named-category transactions are counted only among the 2,401 recipient rows captured that night (capped at ~1,000 — list_complete: false), while the denominator is the full uncapped settlement census. This ratio therefore understates coverage by an unknown factor and is not a market share. See FA-011 and FA-012.

The percentages above are transaction-count shares, read live from the latest nightly snapshot — not fixed properties of the system. Paddock does not currently compute or publish a dollar-denominated coverage figure at any tier: the pipeline only sums settlement amounts for resolved sellers, never for unresolved wallets, so no dollar-volume denominator exists to divide by (see known-false-assumption FA-011). These figures move day to day as the underlying transaction mix changes; expect them to.

03 / ASV
03

Agent Settlement Volume

Paddock's flagship metric — the headline measure of how much AI agents settle on-chain.

Agent Settlement Volume (ASV)

The total USDC settled through x402 agent payments that Paddock observes via x402scan's all-facilitator aggregate, reported as a 7-day rolling average.

A census-level measure of total indexed x402 settlement, drawn from Universe 1 — no attribution required to state it.

The 7-day rolling average is the headline figure; the raw daily value is reported alongside it as context, because daily settlement is volatile and a single day is not representative of the trend.

04 / ATTRIBUTION
04

Attribution

Attribution maps a settlement wallet to the named service behind it — turning anonymous on-chain payments into category and provider intelligence.

How the map is built

The wallet-to-service map has two halves. The larger half is the full Bazaar catalog — all pages, all chains, every payTo — ingested wholesale; those mappings are seller-declared, but they are declared into a third-party catalog that Paddock does not individually audit. The smaller half is a hand-maintained override set, and those mappings are each checked against the seller's own self-declared config by an automated gate before entering the map. Resolution works forward in both halves: it begins from a project's own live payment configuration, never inferred from wallet behavior.

What the map is applied to

Attribution does not run over every settlement. Each night Paddock fetches the settlement recipient list highest-transaction-count-first and stops at a cap of roughly a thousand rows, and resolution runs over that slice. Every coverage percentage, category share and provider count on this page is computed inside that window — so they are shares of the captured slice, not of the market. The per-tier figures in §02 state the exact row count and completeness flag for the most recent night.

Excluded wallets

  • Facilitator and pooled wallets are classified and excluded — they carry pass-through volume, not the demand of a single service.
  • Identified circular clusters are excluded from attribution (see §05).
05 / CIRCULAR
05

Circular detection

Not all settlement is demand. Paddock detects circular (self-funded) settlement and reports it as a scoped finding.

Criteria

A cluster is flagged as circular on the basis of self-funding analysis — the share of a cluster's inflow originating from within the cluster itself — corroborated by on-chain reconstruction of the payer side of each settlement.

Scope and scale

The largest identified circular cluster represents a large majority of a single facilitator's volume but only a fraction of a percent of total settled transactions ecosystem-wide. Both are true; they differ only in denominator — which is exactly why the two are never conflated.

Scope limitation

Circular detection currently covers facilitators with on-chain-readable settlement. Clusters on facilitators without a readable settlement path are not yet detectable, and Paddock states this limit rather than implying market-wide coverage.

06 / RAILS
06

Beyond x402

Agent commerce settles across many rails, and they are not equally observable. Paddock measures each to the depth its data allows — and labels which is which.

On-chain settlementFully observable
x402 on Base and Solana. Settlement is publicly verifiable on-chain, so volume, endpoints, and attribution are directly measured. This is Paddock's core dataset.
Directory-indexedPartially observable
Rails such as MPP publish a registry of services but not settlement. Paddock tracks the registered-service count and its change over time — a supply signal, not a settlement figure.
Developer adoptionProxy signal
For emerging rails, Paddock tracks public developer-adoption proxies — repository activity and integration counts — labeled as engagement, not settlement.
Disclosed-onlyNot settlement-readable
Card-network and off-chain agent schemes publish no on-chain settlement. Paddock records what these rails disclose publicly, sourced and dated, without implying a measured volume.
07 / GOVERNANCE
07

Index governance

An index is a different promise from a chart. Five documents say what would be in a Paddock index, when it changes, how a constituent contests a row we got wrong, and what Paddock will and will not take money for. Published , and inside the corrections-log scope below.

No Paddock index is currently live. The Agent Commerce Index is suspended, not retired — no new print is computed and existing prints are retained unmodified. The five documents are specification, not a claim that a governed index exists today. The commitments in them are not conditional on that: the appeals service levels and the four firewall rules bind Paddock whether or not an index is running. Start at Index governance.

08 / CORRECTIONS
08

Corrections

Paddock's failure modes are mostly silent — a correct-looking number on a changed basis. Anything that moves a published figure, changes what a figure means, or retracts a claim is recorded here, newest first, with what was wrong and what the number is now.

What is in scope. Until 2026-08-27 the scope was implicit — “published figures” — which worked while everything published was a number. The four index-governance documents are not numbers, they are commitments, and a promise quietly reworded is the same defect as a figure quietly restated. So the scope is stated:

In scope — a change here is a dated entry
Any published figure, or the basis it is computed on
the value moves, its meaning changes, or the claim is retracted
Any figure sold through the API, the MCP tools, or the monthly report
the same, including a figure that was correct on a basis that has since changed
The seven commitment sentences on /index-governance/rebalance-calendar (02), /index-governance/appeals (03) and /index-governance/conflict-policy (04) — the three appeals service levels and the four firewall rules
any change to the wording of one of the three service levels (the acknowledgement deadline, the resolution deadline, the extension rule, or what a decision must contain) or one of the four firewall rules
01 · Methodology spec at /index-governance/methodology-spec — as figure basis
a change to eligibility, weighting, exclusions, or the mandatory concentration disclosure
Where or how a published figure is presented — which section it renders in, what it is labeled, whether it is framed as a headline figure
the figure's presentation or categorization changes while the figure itself does not

Not in scope, deliberately: internal process issues, near-misses and tooling problems. Those are recorded in issues, not on a public surface. This log is for what a reader relied on.

Market summary, category share label
Affects: The field share_of_volume in the market summary (API, the get_market_summary tool, the market page). · Restatement needed: None. No figure changes.

The field share_of_volume in the market summary (API, the get_market_summary tool, the market page) has always been each category's share of categorized transactions, not of USDC volume. No figure changes. The field is renamed share_of_transactions; share_of_volume is served with the same value until 2026-12-31 and then removed.

evidence — docs/investigations/2026-09-26-share-of-transactions-label.md
Service pages, /charts, verify_before_pay and get_best_value_provider now read measured nights only
Affects: The 7-day and 30-day settled figures and chart on every /s/[domain] service page; the /charts page's spend_share_over_time, category_concentration and daily_transactions series; verify_before_pay's settlement block (settlement_recency, last_observed_settlement_date); get_best_value_provider's picked date; and the monthly report's captured-basis clause. · Restatement needed: A 7-day or 30-day settled figure quoted from a /s/[domain] page, or a settlement_recency figure from verify_before_pay, before 2026-09-25, for a window that includes a night whose recipient data was not measured that night, should be restated against the corrected figure. verify_before_pay responses now carry days_excluded_30d beside days_present_30d, and get_best_value_provider carries stale and stale_reason when the nearest measured night is more than three days old.

Windowed settlement figures on /s/[domain] service pages and /charts, and the single-night picks behind verify_before_pay's settlement block and get_best_value_provider, included nights whose recipient data was not measured that night. From 2026-09-25 every one of these readers counts measured nights only, through the same shared predicate the entry of 2026-09-21 introduced. The monthly report's captured-basis clause now names the nearest measured night inside its window.

Measured on production data on 2026-09-21: the /s/laso.finance 7-day settled tile (2026-09-14 to 2026-09-20) read 48 transactions and $43,196.28 before and 24 transactions and $27,333.66 after; the 30-day tile ending 2026-09-20 read 399 transactions and $213,366.81 before and 375 transactions and $207,433.29 after. verify_before_pay's settlement block for the same domain moved by the same amounts, and its last_observed_settlement_date moved from 2026-09-20 to 2026-09-21. get_best_value_provider for the payments category picked 2026-09-20 before and 2026-09-21 after.

The nightly snapshots themselves are unchanged.

/s/laso.finance, 7-day settled (2026-09-14 to 2026-09-20)48 tx · $43,196.2824 tx · $27,333.66
/s/laso.finance, 30-day settled (window ending 2026-09-20)399 tx · $213,366.81375 tx · $207,433.29
verify_before_pay, laso.finance, last_observed_settlement_date2026-09-202026-09-21
get_best_value_provider(payments), picked date2026-09-202026-09-21
evidence — docs/investigations/2026-09-22-service-page-charts-report-data-measured-day.md
Window sums on the leaderboard and its paid tools counted carried-forward and failed nights as measured
Affects: The /leaderboard board's tiles, rows, category cards and chip counts (7d and 30d windows), get_provider_revenue, get_category_detail, and get_changes. · Restatement needed: Anyone who quoted a 7-day or 30-day settled or settlement-count figure from /leaderboard or get_provider_revenue before 2026-09-21, for a window containing one of the affected nights below, should restate it against the corrected figure. A get_category_detail or get_changes response from before this date may have been built on a carried-forward or backfilled night's data without saying so.

Window sums on /leaderboard, get_provider_revenue, get_category_detail and get_changes counted nights the writer had carried forward from the prior night (serversSource prior_kept) or marked failed as measured days. From 2026-09-21 those nights are excluded. Affected nights to date: 2026-06-13, 2026-06-14, 2026-06-15, 2026-08-31, 2026-09-07, 2026-09-15, 2026-09-18, 2026-09-19, 2026-09-20. Figures for any window containing those dates changed.

7-day settled, Sep 14 → Sep 20, 2026$54,597.45$25,905.97
7-day settlements, Sep 14 → Sep 20, 202688,03936,566
30-day settled, Aug 22 → Sep 20, 2026$261,604.34$230,020.74
30-day settlements, Aug 22 → Sep 20, 2026323,488250,189
evidence — docs/investigations/2026-09-21-window-sums-measured-days.md
August 2026 report: growth line moved out of Headline Findings
Affects: The Headline Findings section of the August 2026 report at /report/2026-08. The figure itself does not change — the 680% transaction-volume comparison between 2026-08-01 and 2026-08-31 is unchanged — only where and how it is presented. The report generator is also changed from this date on: a two-point comparison is written to its own field and never placed in headline_findings for any report generated from here on. · Restatement needed: None for the figure — it is unchanged. Anyone who read it as a 7-day-rolling or full-month figure should not: it was always a two-point comparison and is now labeled as one.

The August report presented a two-point comparison (Aug 1 vs Aug 31) as a headline finding. The figure is unchanged; it now appears below the fold, labeled as a two-point comparison. Headline findings are 7-day rolling or full-month figures.

Logged under the corrections log's fifth scope entry, not its first: no published figure's value moved, its meaning did not change, and nothing was retracted. What changed is where the figure renders and how it is labeled — a presentation and categorization correction, not a value correction.

evidence — docs/methodology-corrections-log.md
The published coverage of get_liveness named the wrong feed size, and named it under a field that counts something else
Affects: The stated basis of get_liveness ($0.001 per call, and the free-key tool) on /docs, llms-full.txt and skill.md, and the _meta.tracked_services_count field on every response. No liveness answer changes: `up`, `success_rate_7d`, the latencies, the sample counts and the last-probe time are unaffected, and the source was always TrustBench. · Restatement needed: Anyone who quoted Paddock's liveness coverage as “~1,200 services” should restate it. Reproduced through production on 2026-09-15: the feed is TrustBench (trustbench.io), one nightly CSV, carrying 932 domains and 6,918 probed endpoints — two counts, neither of them ~1,200. A domain is the universe a lookup is against; the endpoint count is the probing behind it. Anyone who read _meta.tracked_services_count as the number of domains they could look up was reading the endpoint count: that field is unchanged and still counts endpoints, and tracked_domains_count is now returned beside it.

The coverage sentence was hand-typed and never revisited while the feed grew — our own integrity record shows TrustBench going from 261 domains to 932 in fifty days. It is no longer typed: both counts are now read from that record at build time and published with the date they were read, so a figure that lags says which night it is from rather than reading as current.

Stated liveness coverage~1,200 services932 domains / 6,918 endpoints as of 2026-09-15
Named sourceunnamed in the coverage sentenceTrustBench (trustbench.io), one nightly CSV
_meta.tracked_services_countcounts probed endpoints (name implies domains)unchanged — still counts probed endpoints
_meta.tracked_domains_countnot returnedreturned — the universe a domain lookup is against
How the figure is maintainedhand-typed on four surfacesgenerated from diagnostics/kv-integrity-history.json, dated, guarded
evidence — docs/investigations/2026-09-15-partner-probe-convergence-audit.md
The nightly seller list was capped at 1,000 recipients, and a failed page could publish a truncated night as a complete one
Affects: coverage.listed_txns, coverage.coverage_pct_listed, coverage.coverage_pct_listed_attributable and coverage.list_complete on every nightly snapshot, and through them the captured-basis clause the monthly report quotes verbatim ("of the N recipient wallets captured on YYYY-MM-DD, top-N by transaction count, list_complete: …"). Two distinct changes with one boundary date. FIRST, the recipient cap rises 100 pages to 250, so listed_txns stops being a lower bound and becomes an exact count of the upstream list. SECOND, a fetch failure mid-walk is no longer recorded as a completed list. ASV IS UNAFFECTED, and so are gross_settled_usdc, gross_settled_txns and every headline figure. They are computed from public.sellers.all.stats.overall, a NON-PAGINATED aggregate: it returns one row for the whole census and no cap of any kind applies to it. The recipient list does not feed it. A change to how deep we walk a paginated list cannot move a figure that never walks one — which is also why the two moved together in the 2026-06 to 2026-09 seller decline for a reason that has nothing to do with this cap. · Restatement needed: Do NOT compare a listed_txns, coverage_pct_listed or unresolved-count figure taken before 2026-09-09 against one taken after — the denominator changed size. Pre-boundary figures are annotated rather than rewritten: historical snapshots do not hold the rows the cap excluded, so the corrected value cannot be reconstructed for past nights, and inventing one would be worse than the error being corrected. Anyone who quoted a coverage percentage from a night whose list_complete read true should check that night's coverage.list_stop_reason: on nights before 2026-09-09 that field does not exist, and a true there could have been a mid-walk fetch failure rather than an exhausted list.

Paddock reads x402scan's seller list one page at a time. RECIPIENTS_MAX_PAGES capped that walk at 100 pages, and because the upstream ignores the page-size parameter and serves 10 rows per page regardless, that was 1,000 recipients a night. The cap was set on 2026-06-12 against a live measurement of the full list at ~517 pages / ~5,170 sellers, on the reasoning that 1,000 rows captured about 97% of listed volume and walking the rest would cost ~90 seconds of cron time for under 3% more.

Re-measured on 2026-09-09, the full list is 146 pages / ~1,455 recipients. The cap was dropping 455 recipients carrying 455 transactions and $179.01 — every one of them a one-transaction seller, 3.0% of the day's listed transactions. THE DROPPED TAIL IS IMMATERIAL TO VOLUME and that is stated rather than implied: $179.01 against a listed universe of 15,134 transactions, all of it from sellers with a single transaction that day. It is quantified from ONE measurement on 2026-09-09, not a nightly average, and it is not presented as one. What the tail is NOT immaterial to is the DISTINCTION between a count and a lower bound, which is exactly what coverage.list_complete asserts and what the monthly report prints verbatim.

The cap is now 250 pages, which clears the live list with about 70% headroom, and hitting it is loud rather than silent: the walk reports why it stopped and raises an alarm when the budget runs out with the upstream still offering more.

The second change is the one that could have corrupted a figure rather than merely bounding it. The walk treated a null response — which its fetch helper returns for a network error, a non-2xx and an unparseable body alike — identically to a page that came back legitimately empty, and both set the list complete. A transient upstream failure on page 40 therefore published a night truncated at an arbitrary point as an EXHAUSTED list, with list_complete: true riding into the report's basis clause. The walk now distinguishes an exhausted list from a capped one from a failed one, stores the reason as coverage.list_stop_reason, and never reports a failed walk as complete.

WHICH NIGHTS THE SECOND DEFECT TOUCHED IS UNDER AUDIT; DATES TO FOLLOW. No date is named here until that audit reports, because naming one on today's evidence would be a guess. What can be said about its shape: a mid-walk failure is only invisible where the cap would have truncated the night anyway, so the auditable population is the nights whose coverage.list_complete reads TRUE — on those, a true could mean an exhausted list or a failure indistinguishable from one. An earlier draft of this entry called that irrecoverable, which was too strong and is corrected here. The first defect — the cap — was in force on every night from 2026-06-12 to 2026-09-08, and coverage.list_complete has read false on every night since 2026-06-28, so that bound was at least disclosed in the field.

The discontinuity is recorded in ADR-0002 §15 on the same footing as the 2026-06-12 cap raise in §1. A separate and unresolved question sits behind the numbers: the same walk that returned ~5,170 sellers in June returned ~1,455 in September. That is a fall in the upstream's 24-hour seller count, not an effect of this change, and it is being investigated before anything is said about it.

Recipient cap100 pages (≤1,000 recipients)250 pages (≤2,500)
Full upstream list, measured~517 pages / ~5,170 sellers (2026-06-12)146 pages / ~1,455 (2026-09-09)
Recipients dropped by the cap455 (unmeasured until now)0
Transactions dropped by the cap455 — 3.0% of listed0
coverage.list_completefalse every night since 2026-06-28true while the list stays under the cap
coverage.listed_txnsa lower boundan exact count of the upstream list
A failed page mid-walkrecorded as a COMPLETE listlist_stop_reason "fetch_failed", never complete
Hitting the capsilentalarms, with the reason stored on the snapshot
evidence — docs/adr/0002-series-discontinuities.md
Paddock's own attribution vouched for a live wallet it had never seen
Affects: The target block and the contract check of verify_before_pay ($0.25, and the free-key tool), on both /api/paddock/mcp/verify-before-pay and the MCP tool, for callers who supply no ?pay_to=. No route verdict changes in either direction, and no stored series or published figure is affected: this is a live probe and nothing about it is written to a snapshot. · Restatement needed: Anyone who stored a verify_before_pay response from before 2026-09-06 in which they supplied no ?pay_to= should not read the attribution fields — attributed_domain, the settlement history, the circular verdict — as statements about the wallet the endpoint was asking to be paid. They described the wallets Paddock had attributed to the domain, which may not be the same wallet. Also note that pay_to_checked_against_live changed meaning on this date: a stored 0.4 false and a live 0.5 true can describe the identical request.

verify_before_pay decodes every recipient the live 402 names. Until 2026-09-06 it compared them against the caller's ?pay_to= when one was given, and against nothing at all when one was not. A caller asking only about a URL got the endpoint's live challenge decoded on one side of the response and Paddock's stored attribution for that domain on the other, with no comparison between them and nothing saying so.

The failure that matters is a compromised host. An attacker who changes only the recipient in the live challenge leaves everything our attribution is built from untouched — the domain, its settlement history, its facilitators, its circular standing are all still ours and all still clean. The response therefore carried Paddock's full endorsement of a seller while the money went to an address Paddock had never observed. Our stored attribution vouched for a wallet it had never met.

Reported by a design partner on 2026-09-06, from a live seller endpoint exhibiting the shape. The endpoint is not named here: a live recipient we have not attributed is also exactly what an honest wallet rotation looks like, and naming a host beside the word takeover would assert something this check cannot establish.

From 2026-09-06 the comparison runs on every call. checks.contract.attributed reports the wallets Paddock attributes to the domain, whether a live recipient is among them, and which live recipients are unattributed. target.pay_to_checked_against_live now means a comparison actually ran — against the caller's wallet, against our attribution, or both — where before it meant only that the caller had typed a wallet, which verified nothing.

The divergence is FLAGGED AND DOES NOT REFUSE, and that is a deliberate limit rather than caution. A seller that rotates its recipient wallet produces exactly this shape, because our attribution is built from settlement we have already seen and a rotation is by definition a wallet we have not. An independent census (Melchiorre Oliva, x402-measure, recomputed by us) found 37 of the 765 hosts present in both its 2026-08-10 and 2026-09-04 collections had moved payTo — 4.8% in three and a half weeks. Refusing here would refuse roughly one honest seller in twenty, which is the failure corrected on 2026-09-03 in the other direction, with the caller's money attached. The refusing control remains the caller's own ?pay_to=.

So the honest statement of what this buys: a caller who names no wallet is now TOLD when the endpoint is asking to be paid somewhere we have never seen, and is still not stopped. That is the strongest claim available without per-wallet destination history, which is #192 and which does not exist yet.

Live recipients vs Paddock's own attributionnever compared when the caller supplied no ?pay_to=compared on every call; divergence flagged and named
pay_to_checked_against_livetrue whenever the caller typed a wallettrue only when a comparison against the live recipients ran
How the divergence moves the verdictn/a — not detectedflagged; moves_route is false
Schema versionverify_before_pay/0.4verify_before_pay/0.5
evidence — docs/investigations/2026-09-06-live-payto-vs-attribution.md
verify_before_pay looked for a seller's published config at only one of the two paths it can live at
Affects: The self_declared block of verify_before_pay ($0.25, and the free-key tool), on both /api/paddock/mcp/verify-before-pay and the MCP tool. A seller publishing its x402 config at /.well-known/x402 — without the .json suffix — was reported self_declared: unavailable, which reads as “this seller publishes nothing” and was false. No stored series and no published figure changes: this is a live probe, nothing about it is written to a snapshot, and no monthly report consumes it. · Restatement needed: A verify_before_pay response from before 2026-09-03 carrying contract_self_declared_unavailable does NOT establish that the seller published no config — only that none was served at the .json spelling. Do not cite a stored verdict as evidence that a seller declines to publish its terms. Verdicts in which a config WAS found are unaffected, and no verdict is retroactively wrong about anything it did compare.

A seller's self-declared x402 config — the one surface where a seller states, under its own domain, what it charges and where the money goes — exists in the wild under two spellings: /.well-known/x402.json and /.well-known/x402. Paddock fetched the first and only the first, so a seller using the second was indistinguishable from a seller publishing nothing at all.

ReturnCheck (returncheck.m-angelmartinez-fer.workers.dev) is the case that surfaced it, reported by its operator in the x402 working group on 2026-09-03. An unpaid GET to its suffixless path the same day returned a complete v2 config: the payment resource, a Base mainnet accept with amount, asset and recipient, and the locations of both its HTTP and MCP payment endpoints. The .json path on the same host returns HTTP 404. Paddock's probe that day reported self_declared: unavailable for a seller that publishes all of it.

Both spellings are now fetched, concurrently under one timeout budget, and whichever serves a parseable config is the one judged. self_declared.source names the URL actually fetched rather than a fixed path, so a reader can see which spelling answered. The .json spelling keeps precedence in the case — not yet observed anywhere — where a seller serves both.

Nothing about how the config is JUDGED changed. self_declared remains advisory on exactly the terms set on 2026-09-03 earlier the same day: a divergence on payTo alone is flagged and does not refuse, a divergence on network, asset or price refuses. Finding a config where none was found before does not on its own move a verdict; it can move one only by disagreeing with the live 402, which is the check working.

The absence being corrected is the kind this log exists for: it was not a wrong number, it was a confident report of nothing where there was something. A bounded read-only sample of 60 CDP Bazaar seller domains the same day found zero publishing a parseable config at either spelling, which is the honest context — unavailable is the overwhelmingly common and correct answer, and that is exactly what made one false instance easy not to notice.

Paths fetched for the seller's self-declared config/.well-known/x402.json only/.well-known/x402.json and /.well-known/x402, both
self_declared.sourcea fixed path, whatever happenedthe URL actually fetched and read
A seller publishing only at the suffixless pathcontract_self_declared_unavailableconfig read and compared
How self_declared moves the verdictadvisory; payTo-only divergence flaggedunchanged — advisory; payTo-only divergence flagged
Schema versionverify_before_pay/0.3verify_before_pay/0.4
evidence — docs/investigations/2026-09-03-well-known-x402-spelling.md
verify_before_pay never checked the one wallet the caller had already committed to
Affects: The route verdict of verify_before_pay ($0.25, and the free-key tool), on both /api/paddock/mcp/verify-before-pay and the MCP tool. Callers who passed ?pay_to= were told route: true on endpoints that were asking to be paid at a DIFFERENT address than the one they named. The wallet was read, used to resolve attribution, and echoed back in the response — it was never compared to the live challenge. No stored series and no published figure changes: this is a live probe, nothing about it is written to a snapshot, and no monthly report consumes it. · Restatement needed: Anyone who stored a verify_before_pay verdict from before 2026-09-03 in which they supplied ?pay_to= should not read route: true as confirmation that the endpoint was asking to be paid at that wallet. It was never that claim. Re-run the check before acting on a stored verdict, and store schema_version with every verdict — a 0.2 verdict and a 0.3 verdict are not comparable, and the version string is how you tell them apart. Verdicts that supplied no ?pay_to= are unaffected.

verify_before_pay takes ?endpoint_url= (the resource an agent is about to pay) and ?pay_to= (the wallet it is about to pay). It probed the endpoint, decoded the live 402, and compared the decoded contract against the caller's expected network, asset, seller and price. It did not compare it against pay_to. That parameter resolved the wallet to a domain through Paddock's own attribution and was echoed back under target.pay_to, and that was all it did.

So the narrowest question the tool can be asked — is the wallet I am about to pay one this endpoint is currently asking to be paid? — was the one question it did not answer, on the field where the caller has already committed. An x402 settlement is an EIP-3009 authorization that SIGNS the recipient. A buyer who read a stale challenge, or whose seller rotated addresses between their read and ours, got route: true and a signature addressed to a wallet the endpoint no longer named.

From 2026-09-03 the caller's pay_to is compared against every recipient the live challenge names, across every accepts[] entry rather than the one entry the response reports as `observed`. A wallet the endpoint offers on another entry — a different chain, typically — is reported and NOT refused; refusing there would repeat the multi-chain defect corrected on 2026-08-31, this time with the caller's money attached. A wallet the endpoint names nowhere is a refusal: route is false, pay_to is in mismatched_fields, and the summary names the recipients the endpoint does ask for.

One verdict moves the other way, and it is recorded here rather than left as a quiet loosening. A seller whose own published config (.well-known/x402.json) named a different payTo than its live 402 was refused. That refused the honest rotating seller every time — a published config is a snapshot, a challenge is live, and an address rotation puts the two out of step by design. A divergence on payTo ALONE is now flagged and does not refuse; a divergence on network, asset or price, or on payTo together with any of them, refuses exactly as before. The buyer is not less protected: the check that replaced it tests the caller's own stated recipient, which is a stronger claim than the seller's document about itself.

A third case was returning a clean answer about something nobody had looked at. Asked about a URL with no ?pay_to=, the circular-settlement check needs a wallet, and Paddock's attribution supplies one only when the domain maps to exactly one. A domain mapping to several — a provider rotating payTo addresses, which is ordinary — selected none, fell through, and could return status: pass, meaning “not flagged” asserted about a wallet that had never been examined. It now returns not_assessed, names the candidate wallets, and tells the caller to re-ask with the recipient they intend to settle to.

Found while scoping how Paddock should handle sellers that rotate payTo addresses, after a field report of one endpoint serving three addresses across twelve calls in a minute. The handling of rotation itself — a destination-churn note built on per-wallet history — is not built and is blocked on a series that does not exist yet. These three are the parts that needed no history: they were answerable from a single read all along.

Caller's ?pay_to= vs the live challengenever comparedcompared against every recipient the challenge names; no match refuses
Recipient offered on another accepts[] entryn/areported, never refused
Self-declared config diverging on payTo aloneroute: falseflagged, route unchanged
Self-declared config diverging on network / asset / priceroute: falseunchanged — route: false
Circular check, URL-only query on a multi-wallet domainpass (“not flagged”, on no wallet)not_assessed, candidates named
Schema versionverify_before_pay/0.2verify_before_pay/0.3
evidence — docs/investigations/2026-09-03-payto-no-history-gaps.md
Chain counts on report-data counted only the first payment option each resource offered
Affects: chains[] on /api/paddock/report-data — the free public route and the paid get_report_data MCP tool ($0.99). Chain counts on a sold route understated Solana by roughly 22× and published Polygon, Optimism and Stellar as absent. Every buyer of that tool received accepts[0] ordering artifacts presented as chain distribution. No other figure changes: totalBazaarEndpoints, every ASV and settlement figure, and the payTo attribution map are all unaffected, and no monthly report consumed the wrong number — report-figures.ts carries no chain field, so chains[] never entered the FIGURES block the report prose is composed from. · Restatement needed: Anyone who quoted a Paddock chain-endpoint count from before 2026-08-31 should restate it. Solana was published at 259 endpoints and the correct figure on the same catalogue is 5,732; Polygon, Optimism and Stellar were published as zero against 2,268, 577 and 548. Do NOT compare a count taken before 2026-08-31 against one taken after — the basis changed, and endpoint_change_pct is null with trend "basis_change_unavailable" for any window that spans the boundary. Pre-boundary counts are annotated rather than rewritten: historical snapshots stored only the first accepts[] entry, so the corrected value cannot be reconstructed for past nights, and inventing one would be worse than the error being corrected.

A CDP Bazaar resource advertises a list of payment options — its accepts[] array — one per chain and asset it will take. A resource offering twelve chains has twelve entries. Paddock read the FIRST entry only and counted that as the resource's chain. So each resource counted once, under whichever chain its seller happened to list first, and the published figure was a function of array ORDER rather than of what sellers actually offer.

6,024 of the 14,590 resources in the catalogue (41%) offer more than one chain, so this was not a marginal distortion. Recounted over every accepts[] entry on 2026-08-31: Solana 5,732 against 259 published, Polygon 2,268 against 0, Arbitrum 2,176 against 1, BNB Chain 911 against 1, Optimism 577 against 0, Stellar 548 against 0. Base moved from 14,176 to 14,357 — barely at all, which is precisely why the defect survived: the one chain anybody spot-checked looked right.

The trend fields were worse than the levels. endpoint_change_pct and trend were deltas of an accepts[0] count, so a seller REORDERING its accepts array moved an endpoint from one chain to another with no change in anything it offered. "Solana +48% growing" and "Base −8% declining", served on 2026-08-31, were partly artifacts of array ordering.

The counting unit is now stated on every row rather than left to be inferred: one resource counts once per distinct chain it offers, so the rows do not sum to the resource total and are not meant to. The question the figure answers is "how many resources can I pay on this chain", which is a buyer's question. Testnets are excluded, as before.

This was found while auditing how Paddock parses a 402 challenge, after a cross-measurer parsing failure was raised in the x402 Slack. It shares its root cause with three defects fixed in verify_before_pay the same day: treating accepts[] as one offer rather than an offer set. One reading error on two surfaces — a live tool and a sold figure. The tool's version of it produced a visible refusal and got attention; the sold figure just looked plausible, which is the more dangerous of the two failure modes and the reason this log exists.

The corrected series begins 2026-08-31. The discontinuity is recorded in ADR-0002 §11 as a step change on the same footing as the servers[] boundary of 2026-06-12, and the guard is in code rather than in a note: any window spanning the date returns a null change and a trend of "basis_change_unavailable".

Counting basisaccepts[0].network — the seller's first-listed optionevery distinct chain in accepts[]
Solana endpoints2595,732
Polygon endpoints0 (published as absent)2,268
Arbitrum endpoints12,176
Optimism endpoints0 (published as absent)577
Stellar endpoints0 (published as absent)548
Base endpoints14,17614,357
Change across the boundaryendpoint_change_pct computed across the basis changenull, trend "basis_change_unavailable"
evidence — docs/investigations/2026-08-31-x402-version-parsing-audit.md
Price comparisons move from listed prices to settled prices in verify_before_pay and get_best_value_provider
Affects: The price check in verify_before_pay (reason_codes price_within_category_range / price_above_category_median / price_below_category_median) and the price input to get_best_value_provider's composite score. Both are sold figures. No other figure changes, and no headline, chart or report number is affected. · Restatement needed: Anyone who stored a price reason code or a composite score from before 2026-08-28 should treat it as computed on a different basis and not compare it against one taken after. verify_before_pay responses now carry price_basis, and get_best_value_provider carries price_basis per provider, so the two are distinguishable after the fact.

Both tools compared against LISTED prices: the advertised minimum a seller publishes to Bazaar. verify_before_pay divided the price on the live 402 by the median advertised price of providers in the category; get_best_value_provider normalised each provider's advertised minimum against the highest advertised minimum in the category and gave that 30% of the composite. Both now use SETTLED prices — USDC actually paid, divided by settlements actually counted, summed across a provider's payTo wallets before dividing.

The objection came from a design partner and it is the right one: a median over listings is what sellers hope for, a median over settlements is what buyers agreed to. An advertised price is a seller's own declaration, which is the exact class of number this product exists not to take at face value. A settled price is arithmetic over transfers an upstream already indexed, and no seller can move it by editing a listing.

The direction of the change is not uniform and can reverse a reading. An endpoint asking $0.20 in a category whose providers advertise a $1.00 median scored 0.2× — read as suspiciously cheap. The same endpoint against a settled median of $0.10 scores 2× — ordinary. Which of those is right depends entirely on which number the category actually transacts at, and only one of the two is a measurement.

Where no settled price exists, the answer is that it does not exist. verify_before_pay returns status not_assessed with price_basis “unavailable” and no ratio; get_best_value_provider scores that provider neutral on price and marks the row price_basis “unavailable”. Neither falls back to the advertised figure. Substituting a seller-declared number for a missing measured one would reintroduce the defect being corrected, and would do it invisibly.

Nothing was removed from either response. listed_price_median_usdc and listed_vs_median_ratio are still returned by verify_before_pay and still mean what they meant; price_usdc is still returned per provider by get_best_value_provider. The schema version is unchanged at verify_before_pay/0.1 because the change is additive: price_basis and settled_vs_median_ratio are new fields, and a shadow-mode integration logging the old ones keeps getting them.

get_best_value_provider's published formula string is updated in the route and in the docs to name settled_price_usdc, because a formula that does not describe what the code computes is worse than no formula.

verify_before_pay price denominatormedian advertised (listed) price in categorymedian of per-provider settled means in category
get_best_value_provider price_normprice_usdc / max(price_usdc in category)settled_price_usdc / max(settled_price_usdc in category)
No price availablelisted median used where presentnot_assessed / neutral, price_basis "unavailable"
evidence — docs/investigations/settled-vs-listed-price-basis-2026-08-28.md
Index governance published; the appeals service levels were set before publication and differ from the unpublished draft
Affects: The four index-governance pages, published today at /index-governance. Specifically the appeals service levels (03.3) and the conflict-policy firewall (04.1), which are now commitments to third parties rather than an internal draft. No published figure changes value. · Restatement needed: None for any figure. Anyone who saw the unpublished draft of the appeals process should read the published service levels instead — the draft's targets were tighter and are not what Paddock commits to.

Four governance documents — the index methodology spec, the rebalance calendar, the appeals process and the conflict policy — were merged as unpublished drafts and are published today. They define how a Paddock index is governed when one is published. No Paddock index is currently live: the Agent Commerce Index remains suspended, not retired.

The service levels differ from the draft, and the direction is looser rather than tighter. The draft carried four separate timing targets: acknowledgement in 2 business days, a completeness check in 5, a decision in 15 business days from acceptance, and a promise that an appeal filed in the provisional-list window would be decided before that rebalance took effect. The published commitment is two deadlines and one rule: acknowledgement within 5 business days of receipt, resolution within 30 calendar days of that acknowledgement with a written decision and the evidence relied on, and — where a resolution needs more time — an extension communicated before day 30 with a new date. The completeness check is folded into the acknowledgement rather than carrying a deadline of its own, and the provisional-window promise is removed.

Paddock is one person. A published service level that cannot be met by one person is worse than a longer one that can, and the draft's targets were set before anyone had to keep them. The rebalance calendar is amended to match: the provisional-list window is the invitation to contest a row, not a promise of a decision before the effective date, and an appeal upheld after a rebalance takes effect is given effect off-cycle instead.

The conflict policy gains two firewall statements the draft did not make explicitly. A licensee — an exchange, a HIP-3 perp deployer, a structured-product issuer — that conditions the licence on adding, removing, reweighting or retaining a constituent is refused the licence, and an existing licence is terminated on the same ground; the refusal is published. And Paddock never operates a market, facilitator, or gateway: no marketplace or exchange, no acting as an x402 facilitator, no gateway, router or proxy through which agent payments pass. The draft said Paddock does not operate a marketplace and did not name facilitators or gateways.

These four pages are now inside this log's scope. A later change to a service level or to a firewall sentence is a dated entry here naming the old wording and the new, not an edit to a page.

Appeal acknowledged2 business days (draft)5 business days of receipt
Appeal resolved15 business days from acceptance (draft)30 calendar days of acknowledgement
Late resolutiontold before the target passes (draft)extension communicated before day 30, with a new date
Appeal filed at T−5decided before the rebalance takes effect (draft)no timing promise; upheld appeals take effect off-cycle
Firewall rules stated34
evidence — docs/index-governance/00-README.md
Circular-settlement classification refreshed after 63 days; flagged volume was understated
Affects: Which wallets are excluded from attribution, and therefore every category and provider figure derived from attributed settlement. The circular-settlement figures in the monthly report and in the paid circular signal. · Restatement needed: No published figure is retracted. Anyone comparing circular-settlement figures across the gap should note the classification behind them was unchanged from 23 June to 25 August, so movement in those figures over that period reflects live transaction counts, not re-detection.

Paddock's circular-settlement detector identifies clusters of wallets that predominantly fund each other rather than receiving payment from outside. The classification it produces is what excludes those wallets from attribution.

The detector was never scheduled. Its classification was last computed on 23 June and had not been recomputed since, while figures derived from it continued to be published and sold. It now runs weekly, and a change to which wallets are flagged opens a pull request for review rather than taking effect automatically.

The first refreshed run moved the flagged 30-day volume from $215,915.91 to $238,031.14. Four wallets were newly flagged, together carrying $16,581.34 over 92 settlements in the trailing 30 days — settlement that was not being excluded from attribution and should have been. Two wallets left the flagged set because their only activity aged out of the rolling 30-day window; between them they carried $399.22 across 4 settlements.

The direction matters more than the size: the stale classification was under-excluding, so attributed figures published during the gap included a small amount of settlement that current methodology flags as circular.

Flagged 30-day volume$215,915.91$238,031.14
Flagged wallets810
Classification date2026-06-232026-08-25
evidence — docs/methodology-corrections-log.md
Clarified sourcing language for liveness data
Affects: Descriptive text for the liveness data source in section 01. No published figure changes. · Restatement needed: None.

Clarified sourcing language for liveness data.

evidence — docs/methodology-corrections-log.md
Methodology page: source and attribution descriptions corrected; tier-3 figure now carries its basis caveat
Affects: Descriptive text in sections 01 and 04 of this page, and the caveat on the Universe 3 coverage tile in section 02. No published figure changes value. · Restatement needed: None for any figure. Anyone who cited the Universe 3 percentage as a market share should read the caveat now shown beside it — the figure is a share of the captured nightly slice, not of the market.

Section 01 previously described the wallet-mapping source as a crawl of public agent-service listings. There is no continuous crawl. What exists is a small hand-maintained set of wallet-to-service mappings, each admitted only after an automated gate probes the domain's own live payment configuration and finds that wallet declared there. The gate runs when a mapping is proposed or changed, not on a schedule. The card now says that.

Section 04 attached a per-mapping verification claim to the whole map. That claim is accurate for the hand-maintained overrides and not for the catalog half, which is ingested wholesale from a third-party directory that Paddock does not individually audit. Both halves resolve forward from a seller's own declared configuration, which was and remains true; the difference is that only one half is individually checked. The section now distinguishes them.

Section 04 also did not state that attribution runs over a capped nightly sample rather than over every settlement. That fact was stated only as a caveat on one tile in section 02. It is now stated in the section that describes the method.

The Universe 3 tile in section 02 rendered without any caveat, while the Universe 2 tile above it carried one. Universe 3 needs it more: its numerator is counted only among the rows captured in the capped nightly fetch, while its denominator is the full uncapped settlement census. That ratio understates coverage by an unknown factor and is not a market share. The same computation had already been removed from the monthly report for this reason. The tile now carries a caveat naming the mismatch.

evidence — docs/methodology-corrections-log.md
Dead wallet attribution removed for one service; last unverified tier-1 row verified
Affects: Attribution for api.xona-agent.com. No published figure changes. · Restatement needed: None.

A wallet-attribution override for api.xona-agent.com was found to be simultaneously active and internally quarantined. The address was a Solana key that had been stored lower-cased; Solana addresses are case-sensitive, so the stored key could not match any live on-chain address and the service resolved to zero attributed settlement.

The dead entry has been removed. The service's real settlement wallet was identified and added through the normal evidence gate, which requires the wallet to appear as a payment recipient in the service's own published payment challenge. It settles 244 transactions totalling $10.43 over the trailing 30 days.

Separately, Capminal was the last tier-1 constituent whose artifact had never been fetched. It has now been verified against a live payment challenge carrying the expected recipient address. Every tier-1 row now carries a real verification status.

evidence — docs/investigations/2026-08-24-capminal-t1-verification.md
Two tokens reclassified tier 1 → tier 2; tier-1 share of token market cap corrected
Affects: The token-to-settlement join, its tier assignments, and any downstream use of them. · Restatement needed: Only for tier membership. The headline share moves by 0.003 percentage points.

A review of every token that reached tier 1 by domain-name matching rather than artifact verification found that the tiering code assigned tier 1 whenever a domain matched, even when no settlement had ever been observed — while tier 1 is published as requiring settled 30-day volume. Three rows held tier 1 on that basis alone, with no matched wallet and zero transactions.

XONA AGENT and Tenna by Virtuals are reclassified tier 2. Both operate genuine payment endpoints, but the wallets settling their volume were not in Paddock's attribution graph. In XONA's case the wallet credited was an address this project had already flagged internally as unreliable. Scry Agent Ward is reclassified on the same grounds.

Four tokens matched the same unverified way — Aubrai by Bio, MiroShark, MOLTYCASH and Atelier — were confirmed tier 1 on live evidence, including decoded payment challenges for Aubrai and Atelier whose recipient addresses matched the wallets credited.

Concentration that should have been published from the start: the tier-1 market-cap share is 99.57% a single issuer. Excluding it, tier 1 is 0.2674% of the universe. The entire tier-1 cohort settled $451.34 across 31,927 transactions in the trailing 30 days. The market-cap share describes how much token value sits on top of a verified service; it does not describe how much economic activity those services carry, and should not be quoted as though it does.

Tier 110 tokens · 61.98%7 tokens · 61.9795%
Tier 21 token · 5.72%4 tokens · 5.7252%
Tier 1 excluding largest issuernot published0.2674%
evidence — docs/investigations/2026-08-20-apex-match-t1-verification.md
Chainlink tier-1 status verified after a reported dead link; no change to tier or headline
Affects: Confidence in the largest tier-1 constituent. · Restatement needed: None.

A reported HTTP 404 at the artifact URL backing the largest tier-1 constituent was traced to the host serving no route at its root and publishing its discovery document under a different filename than the one conventionally checked. Those are the two paths a manual check tries first, so the service appeared dead while being fully operational.

The gateway is live and settling: 13,024 transactions totalling $138.23 over the trailing 7 days, against a recipient address carrying four active directory registrations with heartbeats minutes old at the time of checking. Chainlink remains tier 1.

Two corrections followed. The artifact URL recorded for Chainlink was a marketing homepage that has never carried a payment gate, and has been replaced with the live service descriptor. More significantly, the tier had been assigned by domain matching without ever fetching an artifact — the gap that triggered the review logged above.

evidence — docs/investigations/2026-08-20-chainlink-t1-artifact-verification.md
Keep going

What to read next.

Monthly intelligence
Read the report.

The State of Agent Commerce — the citable monthly report on what AI agents actually buy.

See the report →
x402 market
What agents pay for.

Real transaction volume by category. Three sources merged into one live table.

See the market →