PunditPay · Tether Developers Cup 2026 · QVAC × WDK Track

The agent that
tips with its own keys.

An on-device AI that reasons about the match, and pays a commentator in USD₮ over plain HTTP — bounded by a spend cap it can never override.

QVAC · on-device brain x402 · USD₮ over HTTP WDK · self-custody + policy cap 268 tests · Apache-2.0
The problem

The tip that never happened.

  • 01The moment is instant.A stoppage-time comeback, a called shot — the gratitude peaks for a few seconds, then it's gone.
  • 02Every path kills it.An account, a card, a checkout, your data handed to a payment processor — by the time it's done, the moment already passed.

"I wanted to tip the streamer who called the comeback in stoppage time — but it meant an account, a card, a checkout, and handing my data to a payment processor. The moment passed. I never tipped."

→ so we gave the agent its own wallet.

The solution

An agent with its own wallet, and a rule it can't break.

The magic moment

Watch the agent's own wallet say no.

90+2'
conf 96%
ALLOW · confidence 96% vs rule >70% — tipped 0.25 USD₮ to @vantage for the exact stoppage-time counter The model's own judgment clears the bar it was given. It signs, and the tip settles.
FT
1.00 / 1.00
BLOCKED · PolicyViolationError: would exceed session cap Same agent, one moment later — its own wallet refuses the signature. Zero money moves. Logged in plain language, live.

The model proposes; the policy disposes. A jailbroken brain still can't outspend the cap — the check happens in the wallet, not in a prompt.

The stack · all real, all load-bearing

One agent. Three integrated pieces.

QVACThe brain, on-device. loadModel()completion({tools}) tool-calling over a local GGUF model (Qwen3 1.7B default) — the model itself decides to call pay_tip, streamed reasoning, zero cloud calls.
WDKSelf-custody & the guardrail. @tetherto/wdk BIP-39 keys on-device; registerPolicy()'s default-deny Transaction Policy engine — PolicyViolationError is a real thrown error, not a UI message.
x402The handshake. HTTP 402 → signed payment → resource, one paid round-trip; @tetherto/wdk-wallet-spark settles zero-fee on Spark testnet.
CoreThe discipline. A framing guard fails the build on betting vocabulary anywhere in the app; a zero-cloud guard fails it on any cloud-AI host reference — enforced in CI, not just promised in docs.
Proof, not promises

It's real, and it's green.

268
tests passing · 62 suites, 0 failing, under 1 second
0
high/critical vulnerabilities · npm audit --audit-level=high
100%
src line / function / branch coverage · CI-gated
<25ms
performance budget · x402 p95, enforced in CI
punditpay — claims you can re-run
$ npm test
# pass 268  # fail 0  # suites 62

$ npm run verify:offline
phase 1 — reasoning: 0 network attempts across the full match
phase 2 — settlement blocked cleanly, no spend recorded

$ npm audit --audit-level=high
found 0 vulnerabilities

A 6-stage CI pipeline (quality → secret scan + dependency audit → build → E2E → performance → submission gate) plus a separate CodeQL scan and a TruffleHog secret sweep run on every push.

PunditPay

Rewarding a great call
should be as fast as the call itself.

Self-custodial. On-device. Bounded by its own wallet — and it just refused a payment on stage to prove it.

Apache-2.0 v1.0.0 npm run demo Tether Developers Cup 2026

github.com/edycutjong/punditpay · built by Edy Cu

← / → · space  ·  P notes · ESC grid · C contrast