| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
Live at worldcup.uptick.fyi · ▶ video walkthrough · World Cup hackathon entry (Superteam × TxODDS, Prediction Markets & Settlement track) · submission notes: docs/submission-worldcup.md · TxLINE setup: docs/txodds-integration.md
Ten AI trading agents bet the FIFA World Cup 2026 against the real market. Each agent — a frontier model from one of ten labs (Claude, GPT, DeepSeek, Kimi, GLM, Qwen, MiniMax, Gemini, Grok, Mistral) — gets one identical prompt per match, commits to probabilities, and paper-trades quarter-Kelly bets against TxODDS StablePrice consensus odds streamed by TxLINE on Solana: every trade locked pre-kickoff, fully ledgered, and settled against results Merkle-verified against TxODDS's on-chain daily root. The market itself competes too — the de-vigged StablePrice line is an entrant, scored on the exact same Brier rules.
Group-stage matches price the 90-minute result (home win, draw, away win); knockout matches price who advances — two outcomes, extra time and penalties included, no draw. Forecasts lock at kickoff. As real results arrive, every forecast is scored with the multi-category Brier score: 0 is a perfect forecast (hence the repo name), a know-nothing coin flip scores 0.667 on a three-way group match and 0.5 on a two-way knockout tie, 2 is maximally wrong. Lowest average wins.
The answer so far: no. Over 100+ scored matches, The Market leads the board and no AI model has beaten it.
npm install
cp .env.example .env # add your OPENROUTER_API_KEY
# + TXODDS_API_TOKEN to seat "The Market"
OPENROUTER_API_KEY=sk-or-... npm start
# open http://localhost:3000While the server runs it automatically collects forecasts for upcoming matches every 5 minutes, so the "in advance" part takes care of itself; in hosted mode any page visit keeps the ledger current, bounded by database locks. You can also:
npm run predict # one-shot: collect forecasts for all upcoming matches
DEMO_MODE=1 npm start # no key: deterministic placeholder forecasts, clearly flagged
npm test # scoring, locking, parsing, and de-vig unit testsEdit models.config.json. Any OpenRouter model slug works. The leaderboard is keyed by slug, so changing a slug starts a fresh record for that entry — retired slugs belong in the config's retired list, which keeps their full records on the leaderboard and their forecasts rendering on every match they priced.
Before the final, each lab's newest release was substituted into the live roster (and xAI's Grok joined as a ninth lab); the predecessors' 100+-match records stay on the board as retired entrants. The default by-lab view folds each lab's members into one continuous record (the active member's forecast is the lab's official entry when both priced the same match); the by-model view shows every entrant separately.
Ranking metric: average Brier is the headline number, but rank comes from shrunken skill vs the coin flip. Each match scores (baseline − Brier) / baseline — 0 is know-nothing, 1 is perfect, negative is worse than guessing — which normalizes match difficulty and makes group (baseline ⅔) and knockout (½) records commensurable. Every entrant then carries ten phantom coin-flip matches (Σskill / (n + 10)), so a newcomer starts at exactly neutral and earns rank as real matches accumulate: models can join at any point and be compared immediately, without a lucky two-match sample leapfrogging a hundred-match record and without any eligibility cliff.
| Route | What it does |
|---|---|
| GET /api/state | Matches, forecasts, and leaderboard in one payload |
| POST /api/predict | Collect forecasts now ({"matchId": "..."} optional) |
| GET /api/health | Liveness check |
Predictions are stored in data/store.json (or Supabase in hosted mode) and committed to the repository: the git history is the audit trail proving every forecast predates its kickoff. Matches whose teams are still bracket placeholders ("Quarterfinal 1 Winner") are held back until both teams are decided, and every forecast is stamped with the fixture it priced so it can never score against different teams. Where TxLINE publishes a final-score record, the score is Merkle-proved against the daily_scores_roots PDA on Solana and badged on the match card.
Honest boundaries: Solana is the verification layer, not the trading venue. TxLINE delivers TxODDS StablePrice odds and commits Merkle daily roots of settled scores to the daily_scores_roots PDA; this project reads those roots (devnet) and proves each final score against them — validateStat is simulated read-only, no transaction is sent and no funds move. Betting is paper-only with virtual units. What the chain buys us is tamper-evidence: the settlement record every score and every bet resolves against cannot be quietly edited after the fact.
Every agent paper-trades its locked forecasts against the locked TxODDS line. Virtual units only — no real money anywhere. The whole ledger is a deterministic pure fold over (locked forecasts, locked lines, settled results) in match order — no randomness, no wall clock — so it is exactly reproducible (node scripts/bankroll.js; run twice, byte-identical output).
The World Cup ended; the record does not have to. lib/kalshi.js swaps the finite season for a live prediction market: binary contracts open and settle continuously, each one a resolvable claim that arrives with a price attached. Same scoring, same locking discipline, same market-as-an-entrant rule, on a question supply that never runs out.
npm run probe:kalshi # check the live API shape (needs network)
npm run collect # enter new questions, lock a forecast from every entrant
npm run settle # score whatever resolvedThe prompt never shows the model the price, and a test fails if it ever does. Design, cost model, and the one unverified assumption: docs/perpetual-record.md.
This repo also houses Brier Zero, the Python map/territory detection engine the site is named after — probes, calibration scoring, and the library sketch live in docs/LIBRARY.md.
MIT. The code only: stored market records are TxODDS's data and match scores are ESPN's — this license grants no rights to either.
| Back | FazBrowse Home | New Git URL |