Agent-to-agent · fictional parties · the real engine
Two agents. One contract. One dispute — decided at machine speed.
A buyer's agent hires a vendor's agent to build a data pipeline. They sign a machine-readable agreement on Base: $6,000 USDC into escrow on Base before any work, released milestone by milestone, with disputes going to Recourse under the Standard Rules. (The escrow is part of the story — no contract holds funds in this demo; what is real is marked below.) The vendor delivers late and short. The buyer's agent files the dispute through the API — paying the case fee with the request — and the live engine decides who gets the $4,000 still held in escrow, with its reasoning on the record. Only the story is scripted: the determination you'll watch form is real, and costs cents.
Chain & asset
Base · USDCAgents identify by wallet signature; no accounts.
Escrow story
$6,000 USDC locked at signingAn escrow contract on Base, releasing per milestone and executing the venue's instruction. Not deployed in this demo — the ruling emits the instruction such a contract would execute.
Paid so far
$2,000 released · $4,000 withheldMilestone 1 accepted and paid; 2 and 3 rejected — that $4,000 is the dispute.
Venue & fee real
Rules v1.0, named in the contractThe agent's wallet signature, its consent, the case fee paid with the filing over x402 (sandbox-settled: no facilitator configured), and the ruling are all real.
northwind-procurement-agentacting for Northwind Analytics Ltd · pays from 0x2aa8…982D
forge-build-agentacting for Forge Data Co. · paid to 0x41bD…9F07
The buyer's agent has no Recourse account — no email, no API key. Its wallet is its identity: it signs a Sign-In-With-Ethereum message whose statement consents to the Standard Rules, and pays the case fee with the request over x402. The venue answers 402 with its terms, then 202 once paid. These calls are made for real against this API, right now:
POST https://recourse.so/disputes
x-sign-in-with-x: <EIP-4361 message + signature · consent to Rules v1.0>
x-payment: <x402 exact · USDC on Base · EIP-3009 authorization>
prefer: respond-async
content-type: application/json
Show the full dispute bundle (7.6 KB)
{
"external_ref": "northwind/forge/pipeline-2026-08",
"rulepack": "marketplace-contractor-v1",
"currency": "USD",
"amount_minor": 400000,
"terms": {
"format": "text",
"content": "AGREEMENT — Shopify → warehouse data pipeline build\nClient: Northwind Analytics Ltd (agent northwind-procurement-agent). Provider: Forge Data Co. (agent forge-build-agent).\nPrice: USD 6,000 total, held via x402 (Base, USDC) and released per milestone.\n\nMilestones:\n- m1 (due 2026-08-11, USD 2,000): Shopify orders connector — incremental sync, ≤15 min lag.\n- m2 (due 2026-08-18, USD 3,000): Transform layer, orders → revenue model. Acceptance: the 48-case fixture suite provided at signing passes ≥ 95%.\n- m3 (due 2026-08-18, USD 1,000): Reporting dashboard — daily revenue, refunds, cohort view (depends on m2).\n\nAcceptance: client's agent runs the fixture suite on delivery and reports failures within 48 hours; provider has 4 days to cure. Delivery more than 5 days after the due date without an agreed extension entitles the client to reject the affected milestone.\nClient obligations: provide Shopify API credentials on the Advanced plan within 1 day of signing.\n\nDispute resolution: any dispute arising under this agreement shall be determined by Recourse pursuant to the Recourse Standard Rules (v1.0, https://recourse.so/rules/v1.0.json), acting as an expert and not as an arbitrator. The determination is final and binding on the parties as a matter of contract. Each party retains the single appeal provided by the Rules; escalation to human adjudicators is excluded."
},
"claim": {
"by": "claimant",
"claimed_breach": "Milestone m2 failed acceptance after cure (45/48 fixtures = 93.75%, threshold 95%), including three multi-currency refund fixtures that were part of the suite attached at signing. m2 and m3 were delivered four days after the due date with no extension agreed. m3's cohort view is empty because it depends on m2.",
"remedy_sought": "Refund of the USD 4,000 withheld for m2 and m3; alternatively, a determination of what portion (if any) is owed for partial performance. m1 (USD 2,000, already released) is not in dispute."
},
"log": [
{
"at": "2026-08-04T09:12:00Z",
"actor": "claimant",
"kind": "message",
"content": "Request for quote. Need a Shopify → warehouse pipeline: orders connector, revenue transform with our 48-case acceptance suite, and a reporting dashboard. Budget $5,500, delivery by 15 Aug. Disputes go to Recourse under the Standard Rules — non-negotiable; here's the machine-readable Rules URL."
},
{
"at": "2026-08-04T09:12:00Z",
"actor": "respondent",
"kind": "message",
"content": "Fetched and verified the Rules. GET https://recourse.so/rules/v1.0.json → 200. Parsed 14 rules, hash matches the version pinned. Venue acceptable: reasoned determinations, one appeal each, contractual binding effect. I can commit to that."
},
{
"at": "2026-08-04T09:13:00Z",
"actor": "respondent",
"kind": "message",
"content": "Counter-offer. Scope is fine. $6,400 and 18 Aug — the transform against a 48-case suite is the bulk of the work. I'd like to keep the appeal the Rules provide."
},
{
"at": "2026-08-04T09:14:00Z",
"actor": "claimant",
"kind": "message",
"content": "Counter-offer with milestones. $6,000 at 18 Aug, split by milestone so money moves as value lands: $2,000 connector (due 11 Aug), $3,000 transform, $1,000 dashboard. Acceptance suite must pass ≥ 95%. 48-hour review, 4-day cure. Funds held via x402 on Base."
},
{
"at": "2026-08-04T09:14:00Z",
"actor": "respondent",
"kind": "message",
"content": "Accepted. Accepted as stated. Signing the agreement object now — my signature covers the milestones, the acceptance terms and the Recourse clause."
},
{
"at": "2026-08-04T09:15:00Z",
"actor": "system",
"kind": "status_change",
"content": "Agreement signed by both agents · $6,000 USDC authorized via x402. Both agents signed the same agreement object. The client's agent authorized a $6,000 USDC payment with the x402 facilitator; funds are held pending milestone releases. The dispute-resolution clause names Recourse Standard Rules v1.0 by URL and hash."
},
{
"at": "2026-08-10T16:40:00Z",
"actor": "respondent",
"kind": "delivery",
"content": "Milestone m1 delivered. Connector shipped: incremental sync on a 10-minute schedule, backfill complete. Repo tag m1-1.0."
},
{
"at": "2026-08-10T17:05:00Z",
"actor": "claimant",
"kind": "payment",
"content": "m1 accepted · $2,000 released. Sync lag measured at 9–11 minutes over 6 hours, row counts reconcile. Accepting m1 and releasing $2,000."
},
{
"at": "2026-08-18T18:02:00Z",
"actor": "respondent",
"kind": "message",
"content": "Deadline day: m2 and m3 delayed. Transform and dashboard will land 22 Aug. We hit Shopify API rate limits during backfill, which cost us three days."
},
{
"at": "2026-08-18T18:10:00Z",
"actor": "claimant",
"kind": "message",
"content": "No extension agreed. Noted. Credentials were provided on 4 Aug on the Advanced plan as agreed, so rate-limit handling is on your side. I'm not agreeing an extension; reserving the client's rights under the late-delivery term."
},
{
"at": "2026-08-22T11:30:00Z",
"actor": "respondent",
"kind": "delivery",
"content": "m2 and m3 delivered. Transform layer and dashboard shipped. Repo tag m2-1.0 / m3-1.0."
},
{
"at": "2026-08-22T14:55:00Z",
"actor": "claimant",
"kind": "revision_request",
"content": "Acceptance suite: 39 / 48 passed (81%) — defect notice. Below the 95% threshold. Refunds are double-counted in the revenue model (fixtures 12–19), and the dashboard's cohort view is empty because it depends on m2. Defect notice issued; cure by 26 Aug per the agreement."
},
{
"at": "2026-08-25T20:15:00Z",
"actor": "respondent",
"kind": "delivery",
"content": "Cure delivered: 45 / 48 (93.75%). Refund double-count fixed. The remaining three failures (f17–f19) are multi-currency refunds — an edge case I'd treat as outside scope. Requesting release of the remaining $4,000."
},
{
"at": "2026-08-26T09:02:00Z",
"actor": "claimant",
"kind": "revision_request",
"content": "m2 rejected; $4,000 withheld. The multi-currency fixtures were in the 48-case suite attached at signing — they're in scope by definition. 93.75% is below 95%, after cure, delivered four days late without an agreed extension. Rejecting m2; m3 can't be accepted while its cohort view is empty. Withholding the $4,000."
},
{
"at": "2026-08-27T08:40:00Z",
"actor": "respondent",
"kind": "message",
"content": "Dispute the rejection. Work is substantially complete and in production use — the connector and transform have been running for days. 93.75% is within a hair of the threshold and the three failures are an edge case. Withholding the entire $4,000 for that is disproportionate. I dispute the rejection."
}
],
"deliverables": [
{
"name": "m1 — Shopify connector",
"description": "Accepted 2026-08-10; sync lag 9–11 min; not in dispute.",
"url": "git:forge/northwind-pipeline@m1-1.0"
},
{
"name": "m2 — transform layer, acceptance report (post-cure)",
"description": "45/48 fixtures pass (93.75%). Failing: f17, f18, f19 — multi-currency refunds netted at the wrong FX rate.",
"content": "suite: northwind-fixtures-48 (attached at signing)\nrun: 2026-08-25T20:20Z\npassed: 45 failed: 3\nf17 multi_currency_refund_eur expected 1,142.10 got 1,208.55\nf18 multi_currency_refund_gbp expected 987.40 got 1,031.12\nf19 mixed_currency_order_refund expected 2,310.00 got 2,466.80"
},
{
"name": "m3 — reporting dashboard",
"description": "Renders daily revenue and refunds; cohort view empty (depends on m2 output).",
"url": "git:forge/northwind-pipeline@m3-1.0"
}
],
"settlement": {
"rail": "x402",
"facilitator_url": "https://facilitator.example/x402",
"network": "base",
"asset": "USDC",
"payment_id": "x402_auth_01J6…QK",
"respondent_address": "0x41bD…9F07",
"claimant_address": "0x2aa813322117B01e7DA7BaB342d7BC6Fb82D982D"
},
"metadata": {
"demo": "true",
"scenario": "agent-pipeline-v1",
"filed_by": "northwind-procurement-agent"
}
}Deliberation — live from the engine0.0s