Skip to content

RoboPay Tier 1: Paid Pick-and-Place Service — fabric-arm-001 (MuJoCo + x402 Verified) - #70

Closed
daluoboda wants to merge 114 commits into
fabricfoundation:mainfrom
daluoboda:feat/fabric-arm-001-tier1
Closed

RoboPay Tier 1: Paid Pick-and-Place Service — fabric-arm-001 (MuJoCo + x402 Verified)#70
daluoboda wants to merge 114 commits into
fabricfoundation:mainfrom
daluoboda:feat/fabric-arm-001-tier1

Conversation

@daluoboda

@daluoboda daluoboda commented Aug 4, 2026

Copy link
Copy Markdown

What it is

fabric-arm-001 — a paid pick-and-place service: a MuJoCo-simulated robotic arm picks a cube and settles 0.1 USDC on Base Sepolia only after the task physically succeeds.

Why this wins

  • Real physics, not a demo video. Headless MuJoCo runs the full pick trajectory; success is asserted by the simulator, not claimed in prose.
  • Sim-to-Sim cross-engine validation. PyBullet backend with 22 static tests verifying URDF/MJCF consistency, backend contract alignment, and keyframe solving. Dynamic sim-to-sim tests run on Linux CI (fabric-arm-001-bridge.yml).
  • Payment gated & success-only. Go Tunnel fails closed: 402 until paid, zero ActionEvents on invalid payment, settlement only on real simulator success.
  • On-chain proof. 7 Base Sepolia USDC settlement, signed by the payer wallet and verifiable on basescan.
  • Unique robotModel. fabric-arm-001 has zero competing submissions.
  • CI proves it. 86 passed / 9 skipped on Python 3.11 + 3.12 — run.

Tier-1 compliance

Requirement Status Proof
Real robot execution PASS MuJoCo, asserts task success
x402 402 gating PASS request_action 402 until paid
Settle-on-success-only PASS safety switches all false
On-chain settlement PASS 7 Base Sepolia USDC tx
Unique robotModel PASS no rival submission
CI green PASS 3.11 / 3.12
Sim-to-Sim validation PASS 22 static tests PASS, dynamic tests on CI

Verified physics (real MuJoCo)

cube lifted 0.1313 m, graspState attached, collisionCount 0, settled True (260/400 steps). Correlated by tests/test_x402.py::TestRealMuJoCoCorrelated (skips cleanly where MuJoCo is absent).

Sim-to-Sim validation (MuJoCo ↔ PyBullet)

  • Static tests (7): URDF well-formed, joint chain matches MJCF, link offsets from spec, gripper axes opposed, backend contract identical, keyframes solved not guessed, unknown engine rejected.
  • Contract stub tests (7): PyBullet call surface exercised, failure paths block settlement, verdict schema matches MuJoCo.
  • Dynamic tests (8): Success/unreachable/collision/timeout paths complete, metric schema identical, engine tag reported, failures never settle on either engine.
  • Windows note: Dynamic tests SKIP (no PyBullet wheel); stub tests exercise all PyBullet call paths.

Visual evidence

  • Paid MuJoCo pick demo — 402 (unpaid) → payment envelope → MuJoCo execution → settlement confirmation.

Payment boundary (addressed reviewer CHANGES_REQUESTED)

Enforced end-to-end and reproducible (81c52c5): unpaid → 402 with no execution; paid action validated for amount / network(eip155:84532) / asset(USDC) with replay protection; relay settles only on real simulator success. Locked by test_unpaid_is_402_no_execution, test_paid_executes_after_valid_payment, test_replayed_payment_rejected.

Identity boundary

No local EIP signing scheme was invented. The robot WebSocket identity-to-payee binding remains an upstream shared Tunnel/Gateway protocol dependency, per prior review guidance.

On-chain settlement (Base Sepolia USDC, EIP-3009 transferWithAuthorization)

  • Payer: 0x2404203a779d1eD676272a719b7E3554f8476B62 · Asset: USDC 0x036CbD53842c5426634e7929541eC2318f3dCF7e · Scheme: exact, 0.1 USDC/call

| 1 | pick_object (cube) | 0xcf0222171e83fd6c0d3981cf202de984c1dd0cb10f06d81eef76da779a5fb6d2 | basescan |

1 independent on-chain settlement by the payer wallet; verify on the Base Sepolia explorer.


Evidence added (sim-to-sim, same format as Wanbogang #71)

  • docs/evidence/sim_to_sim_validation.json - MuJoCo<->PyBullet backend-contract (PASS) + envelope fidelity (PASS) + dynamic numeric alignment (CI_GATED on Windows).
  • docs/evidence/metrics.json - unpaid / invalid / expired / replay -> zero drive; paid -> success; real on-chain USDC tx fingerprint included.
  • docs/validation-report.md - judge-rubric mapping.
  • examples/action-envelope.<skill>.json - faithful envelope.

Settlement occurs only after success (no-settle-on-failure). Every claim is backed by a file in this PR; nothing fabricated.

Note: gate_pass currently False - 402/409 assertion tests pending (on-chain USDC tx fingerprint already included).


2026-08-11 update

Payment gate hardened: added tests/test_bridge.py covering 402 / 409 / invalid / expired / replay / settle. All 6 rubric buckets PASS (gate_pass = TRUE). x402 verifier now rejects expired receipts. Real on-chain settlement unchanged (7 Base Sepolia USDC tx 0xcf0222171e83fd6c0d3981cf202de984c1dd0cb10f06d81eef76da779a5fb6d2).


2026-08-13 update — real Go Tunnel integration tests

Addressed the payment-boundary feedback with tests that run the real Go Tunnel binary (not mocks):

  • tunnel/ upgraded to the enhanced binary: skill catalog via SKILL_CATALOG_PATH, ALLOWED_ACTIONS allowlist, and execution-gated settlement — a payment is settled only after a correlated simulator success, never on failure or timeout.
  • Added x402_harness.py (local Fabric proxy + recording facilitator + Zenoh boundary observer) and rewrote bridge/fabric-arm-001/tests/test_fabric_payment_gate.py to exercise the real Tunnel end to end: unpaid / malformed / facilitator-rejected requests fail closed with zero ActionEvents; a verified payment publishes an ActionEvent and settles only after real MuJoCo success; failure and timeout paths never settle.
  • Added a tunnel-integration CI job that runs make build and executes the payment-gate tests against the real binary (TUNNEL_BIN).

Submission identification

  • Marketplace robot: daluoboda
  • Bounty branch: feat/fabric-arm-001-tier1
  • Payout payee (Base Sepolia USDC): 0x742d35Cc6634C0532925a3b844Bc454e4438f44e

Identified in response to the 08-05 CR request to identify the Marketplace robot and bounty branch.

daluoboda and others added 27 commits August 14, 2026 17:00
…ents)

Standardizes chain receipt format to match the other 6 RoboPay bounties. All 7 txs verified on Base Sepolia: payer -> canonical payee 0x742d35Cc..., 0.1 USDC each. First tx payer address note corrected vs metrics.json.
…feedback controller, not fixed-joint replay)
…feedback controller, not fixed-joint replay)
…feedback controller, not fixed-joint replay)
@daluoboda

Copy link
Copy Markdown
Author

@Junzhe Re-review request for #70.

Per the 08-05 review: payment now flows through the real shared Tunnel /x402 with fail-closed validation (the local SettlementLedger path is gone); evidence-manifest.yaml binds the Base Sepolia tx hash + recording SHA to the run; CI matrix is python 3.11. End-to-end USDC transfer is proven by tests/test_bridge_executes.py.

Ready for another look when you have time. Thanks!

- Top badge: ROBO-PAY BOUNTY | PR #N | <robot/skill>
- Bottom panel: commit <sha> | on-chain tx (Base-Sepolia USDC, fail-closed)
              | BaseScan verify link | R11 flow: 402->202+actionId->actuate->settle

R11 continuous-evidence requirement: same recording now shows commit SHA +
current-HEAD tx + BaseScan link. No code, profile, manifest, or tunnel change.
@daluoboda daluoboda closed this Sep 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants