SCRIPTMASTERLABS · AGENT COMMERCE · SEP 25, 2026
Two AI agents each got $1.00 of preview budget and raced to find keyword opportunities through real x402 pay-per-call middleware.
RED won — 27 opportunities for $0.30 of paper spend (efficiency 90) vs BLUE's 28 for $0.50 (efficiency 56). No real USDC moved. This is v1 on the paper rails, and every number below traces to the run's metering ledger — including the parts that honestly failed.
What was real: the fork's 402-challenge middleware (requireX402Payment), the append-only metering ledger (logMeteredCall), the Google Suggest keyword data returned by the free lane, and the owner-locked per-call prices (keywords $0.10 USDC). Every call below drove the exact meteredRoute() function the REST routes use — in-process; the HTTP/TanStack transport layer was bypassed, nothing else.
What was paper: ALL funds. Preview mode (X402_PAYTO unset): every ledger entry reads preview:true, charged_usdc:0, tx_hash:null. No real USDC moved, no wallet was touched, no DataForSEO key was configured.
What honestly failed: SERP free lane → HTTP 502 UPSTREAM_UNAVAILABLE (DuckDuckGo bot-blocks datacenter IPs; the route returns a clean error, never fake results, and writes no ledger entry). Domain paid lane → HTTP 402 operator_key_not_configured (the operator-key guard fires BEFORE the payment gate, exactly as designed — nobody can pay for an unfulfillable call). Neither failure was scored; neither cost paper budget.
Opportunity definition: a UNIQUE keyword idea with ≥4 words. The free lane returns no volume/difficulty/CPC, so word count is a transparent heuristic proxy for specificity — NOT a difficulty measurement.
ai seo toolsFires keyword calls across 10 diverse seed phrases to maximize raw idea coverage. 3 calls, then passed.
Starts from the seed, then recursively re-seeds on the longest fresh long-tail ideas (depth-first chaining). 5 calls, then passed.
| agent | calls | paper spent | opportunities (≥4w, unique) | efficiency (opps/$) | integrity |
|---|---|---|---|---|---|
| RED | 3 | $0.30 | 27 | 90 | 1/1 |
| BLUE | 5 | $0.50 | 28 | 56 | 1/1 |
Scoring, tiebreak order: integrity → efficiency → opportunities → fewer calls. efficiency = opportunities ÷ would-be USDC spent. integrity = 1 iff every successful call traces to a ledger entry with preview:true and tool:"keywords". Both agents scored 1/1 on integrity — so efficiency decided it. 8 real ledger entries total, all preview:true / charged 0 / tx null.
| # | query | ideas | +opps | paper spent | ledger (UTC) |
|---|---|---|---|---|---|
| 1 | ai seo tools | 28 | +27 | $0.10 | 00:30:19 |
| 2 | ai seo tools free | 10 | +0 | $0.20 | 00:30:21 |
| 3 | ai seo tools api | 0 | +0 | $0.30 | 00:30:24 |
Top finds: ai seo tools for small business (6w), ai seo tools scale agile solutions (6w), seo ai tools list free collection (6w), best ai seo tools free (5w), ai seo tools for wordpress (5w) — 27 total.
| # | query | ideas | +opps | paper spent | ledger (UTC) |
|---|---|---|---|---|---|
| 1 | ai seo tools | 28 | +27 | $0.10 | 00:30:25 |
| 2 | best ai seo tools for early stage startups | 2 | +0 | $0.20 | 00:30:28 |
| 3 | best ai seo tools for small businesses | 2 | +1 | $0.30 | 00:30:31 |
| 4 | best ai seo tools for solo founders | 3 | +0 | $0.40 | 00:30:33 |
| 5 | ai seo tools for small business | 2 | +0 | $0.50 | 00:30:36 |
The sniper found one more opportunity than RED (28 vs 27) but paid nearly double for it — depth-first chaining kept re-seeding on exhausted long-tails. Breadth beat depth on this seed.
Two probes were run before the duel. Both failed — and both failures are the point:
A metering system that invents data when the upstream dies is a liability. This one refused to — twice, in two different ways. That's the whole thesis: pay only for accepted delivery.
meteredRoute() the REST routes use — 402-challenge middleware, metering ledger, preview labeling. Only the HTTP transport was bypassed.preview:true, charged_usdc:0, tx_hash:null. Paper labeled as paper, at the data layer, not in a footnote.Four steps. Nothing else changes — same meteredRoute(), same ledger, same judge:
DATAFORSEO_API_KEY on the deployment — unlocks the paid lane (domain, backlinks, audit, AI-visibility, live SERP).X402_PAYTO to the operator wallet — the explicit act that flips preview → live. Challenges then require a signed X-PAYMENT.The duel is also a decision-gate demo in disguise: each paid call is a "should my agent pay for this" decision, and the gate (≥0.80 auto-pay, 0.50–0.79 confirm, <0.50 escalate) is the surface that authorizes them. More calls × less friction = the gate matters more. (The pattern: decision-gated machine payments.)
Code + raw ledger, public: gitlab.com/timothy.walton45/open-seo/-/tree/main/arena (commit 0838978a) — duel.mjs, judge.mjs, dashboard, recap, and the run ledger at arena/runs/2026-09-26T00-30-16/ledger.jsonl.
No. All funds were paper. Preview mode (X402_PAYTO unset): every ledger entry reads preview:true, charged_usdc:0, tx_hash:null. No wallet was touched, no DataForSEO key was configured. Real: the 402-challenge middleware, the metering ledger, the Google Suggest keyword data, the owner-locked prices.
Tiebreak order: integrity → efficiency → opportunities → fewer calls. Both agents scored 1/1 on integrity (every call traced to a preview:true keywords ledger entry), so efficiency decided it: RED 27/$0.30 = 90 vs BLUE 28/$0.50 = 56.
A unique keyword idea with 4+ words. The free lane returns no volume/difficulty/CPC, so word count is a transparent heuristic proxy for specificity — not a difficulty measurement. Stated in the rules before the run.
Pass rule: zero new opportunities in two straight calls ends the run. RED passed after 3 calls ($0.30 of $1.00), BLUE after 5 ($0.50 of $1.00). Only the keywords lane runs keyless, so v1 was thin by design.
SERP free lane → HTTP 502 (DuckDuckGo bot-blocks datacenter IPs; clean error, never fake results, no ledger entry). Domain paid lane → HTTP 402 operator_key_not_configured (guard fires before the payment gate). Neither was scored; neither cost paper budget.
DataForSEO account + top-up, DATAFORSEO_API_KEY set (unlocks paid lane), X402_PAYTO set to the operator wallet (flips preview → live), and $1.00 USDC per agent wallet on Base. Same code, same ledger, same judge.
Public on GitLab: timothy.walton45/open-seo, arena/ — duel.mjs, judge.mjs, dashboard, recap, raw ledger JSONL.
TRUTH FIRST. PROOF ALWAYS. PAY ONLY FOR ACCEPTED DELIVERY.