BET is a betting-research operating system for two people — one live app at bet.createdimension.com that answers a single question: is this specific bet worth looking into? This brief traces the entire arc: from the first dashboard, through the disciplined march toward a trustworthy quantitative model, to the road still ahead. Every card links to its milestone. Nothing here has ever placed a real trade.
Not a website with pages — an OS the two of you live inside: one screen, no page loads, tools stay warm as you switch. Public feeds flow into one immutable snapshot, that snapshot feeds the Board and four independent analysis lanes, and only your own confirmed action (or an explicitly armed campaign) ever reaches your own Kalshi account. Here is the whole machine on one line.
BET moved through five distinct phases. The first three built a working product. The fourth is a deliberate, self-disciplined march to earn a model you can actually trust — and it's where you are now. The fifth is the road ahead. Each chip links to detail below.
A real multi-sport betting-research dashboard shipped in days: single-table backend, multi-provider AI, a possession-level Monte Carlo win-probability engine, live odds ingestion, an edge screener, and custom stats that actually feed the AI. Live at bet.createdimension.com.
The key insight: to fairly compare betting approaches you must run them over one shared opportunity pipeline, so information boundaries are the only difference. Built the immutable OpportunitySnapshot, exact Kalshi contract discovery before any paid AI call, fee-aware local evaluation, and the live card-open → auto three-bot comparison.
Everything was unified under one written constitution (VISION.md): one analysis system, stage-specific models, typed owner inputs, and a hard rule that the model may never learn its answer from the current market price. The public Board, factual grading, an honest Endgame audit, the SGO migration, and the fourth "Full AI" lane all landed here.
The heart of the project: build a WNBA last-three-minute win-probability model the honest way — inventory the evidence, archive the raw history, freeze features and snapshots, train, then validate under gates that are allowed to fail. They did fail, twice, and each failure was accepted rather than massaged. Full detail and the fork map are below.
Only a validated model advances. After the candidate is built, sealed future games become its one-shot final exam; a pass unlocks the shadow Board, then the four live lanes, then more sports. Live trading always stays behind its own explicit gate.
A single DynamoDB table (PK/SK + one GSI) with 10 CRUD Lambdas and a Cognito Google sign-in; a multi-provider AI orchestrator that calls Claude, Gemini and ChatGPT in parallel with a rate/cost guard; and a React dashboard with an odds viewer, profiles and chat. The domain bet.createdimension.com was flipped from the API to the frontend, matching your other sites' convention.
The flagship: a possession-level Monte Carlo engine that simulates the remaining game many times from the live state, with real end-game strategy (trailing teams hurry and foul, leaders milk the clock, ties go to OT). It honestly labels whether each estimate is seed, model, or real play-by-play driven — the same honesty discipline that governs the whole project today. Endgame wraps it in a 3-column live-context / market / AI console.
Connected the app to a real automated feed (SportsGameOdds) with append-only OddsSnapshots, an EdgeScore ranker (line movement, book disagreement, model-vs-market gap), and a Screener page. Quota-safe: on a 429 it logs and exits, never retry-loops. This is where the app first touched real market data.
You can record anything no feed exposes — an injury note, a qualitative read, an untracked number — tied to a player/team/event, and it actually feeds the AI Engine's context rather than sitting unused. Phase 6 added lightweight live presence and a permission model (see who's looking at what) without a second always-on service.
The early automated lanes used three different AI providers with different models, timing and read IDs — so their results couldn't isolate what actually mattered. The reconstruction fixed this: run every lane through the same pinned provider, model, parameters, schema and validator, over one shared opportunity — so the only variable is how much information each lane is allowed to see.
One immutable OpportunitySnapshot — a single snapshotId, readId and traceId spanning the eligible opportunity and every refreshed observation. Opening a card runs one refresh through the sports → sportsbook/SGO → Attention → Kalshi pipeline, then auto-runs the paid three-bot comparison only when the result is genuinely executable. Ineligible cards spend zero AI dollars and show an honest typed reason (closed, suspended, stale, no mapped contract).
The turning point. VISION.md became a written constitution: one analysis orchestration system for pregame/live/Endgame/final/scenario, stage- and sport-specific quantitative models, four typed owner-input types, and a hard constitutional rule — the model must never learn its answer from the current market price. J1 added the A–E evidence-policy classes, honest sport profiles (no sport is "model-ready" until proven), and one shared context package reused by every surface.
E made the logged-out app open directly to a useful public Board with server-authoritative ordering (live cards lead, finished cards trail), while every paid/mutating route stays authenticated. G added one factual-signal bundle — book consensus, movement, disagreement, freshness, the sportsbook↔Kalshi gap — every measurement carrying receipts, timestamps and explicitly zero authority over probability or proposals, plus prospective grading that can only count genuinely independent events.
F audited every Endgame sport/market and reported the uncomfortable truth: nothing was fully qualified — WNBA/MLB full-game were provider-blocked, everything else partial. No code-only assertion could change that. B2 migrated every consumer onto one canonical SGO receipt — and then the SGO key returned 403 Inactive API key. That blocker is exactly why the later model work leans on free ESPN data and why the provider track is still parked.
Added the fourth lane — Full AI Choice — beside Strict, Sanitized Hybrid and Contract-Aware, all running concurrently over one immutable card package, every result recommendation-only. M2 built the desktop My Desk (portfolio, model report, all four Real-$ lanes) in the Porcelain/Textile system. M3 was the first live manual run — it proved the plumbing but the AI provider returned 429s, so it's parked until a lane can return a real recommendation. The campaign has stayed KILLED and unarmed throughout.
This is the disciplined core. A model is only trustworthy if it was built without ever peeking at the answers — so the work proceeds one gated milestone at a time, one repository writer at a time, and a milestone is allowed to fail. The map below shows every step, the three forks where the plan changed, and the pulsing you-are-here at J4R2D.
The data foundation, built in order. J2A read-only audited every sport's evidence and ranked WNBA first. J2B archived the entire 2018–2026 WNBA history from free ESPN — 2,178 completed games, 878 MB, append-only, with deterministic state/possession reconstruction and honest missingness. J2C turned that into a self-contained feature/label store: 10,879 items across all games, zero conflicts, a Fable-audited storage repair, and a full replay that wrote zero.
Froze who is allowed in which dataset: walk-forward partitions (WF-2022…WF-2026) with zero overlap or leakage, a partial-2026 holdout, exact source digests, and a full replay that wrote zero new items. Not machine learning — the indexing/freezing step that lets every later model claim cite an exact, tamper-evident snapshot.
The first authorized training milestone: 130 candidates in 3 families — historical neighbors, a possession-aware monotonic classifier, and a possession-transition Monte-Carlo simulator. J3 produced candidates only; every comparison, calibration and selection was reserved for J4 so the builder could never grade its own homework. Zero holdout outcomes were touched.
The candidate beat both baselines across 170,318 predictions and 38.5M simulations — and was still rejected, because gates are gates: invalid/terminated Monte-Carlo runs in every test fold (structural), calibration slope 1.306 out of range, p95 runtime 570 ms > 500 ms. Nothing deployed. The test holdouts are now spent forever — the single fact that shaped every later milestone. → Fork ①
Traced all 511 failed trajectories to one root cause — an arbitrary 100-transition cap after extended overtime — plus contradictory possession logic. The repaired v2 engine swept all 48,767 states with zero invalid or terminated runs, 100/100 deterministic replays, and p95 down from 444→340 ms. Repaired ≠ qualified: no model claim was made.
Your call at Fork ②: start the waiting clock immediately. A frozen holdout protocol plus the existing ESPN hook now captures every new WNBA game automatically, free, no credentials. Outcomes begin SEALED behind a label firewall; only a future J4R3 may ever open them. First day registered 12 real games, all sealed. The future final exam writes itself in the background.
Stopped before reading a single answer: the frozen protocol demanded projection rows for all 620 snapshot games, but only 616 legitimately have them (four are no-play edge cases). Rather than bend a frozen rule, Codex halted and committed the blocker — verdict: exactly right. It also refused the prompt's suggestion to reuse spent J4 labels.
Membership corrected (620 = 616 + 4 exclusions), the frozen 36-stack search ran once. Winner: the repaired conservative Monte-Carlo, uncalibrated — excellent accuracy (log loss 0.113, Brier 0.035) but failing the calibration gates: slope 1.329 (limit 1.25), intercept 0.165 (limit 0.15). It ranks games brilliantly but its absolute probabilities run too conservative — and for betting, absolute probability is the product. No candidate frozen; gates not loosened.
Tried to diagnose why calibration failed using only committed artifacts — and found the evaluation had stored aggregates but zero row-level prediction records. It stopped honestly with WAIT_FOR_NEW_EVIDENCE. You challenged the waiting ("that doesn't make sense") — and you were right. → Fork ③
Reproduced the selected stack's predictions bit-for-bit — 381 games, 2,159 states, every metric matching to 1e-12 — then ran the full slice diagnostics. Finding: the miscalibration is a season-level shift, not a state-dependent flaw. Frozen decision: HIERARCHICAL_MC_CORRECTION — keep the repaired simulator as the base, learn a small pooled correction (season slopes, season/ruleset intercepts, team effects, ≤40 parameters, <500 ms, ≤1 MiB).
This is where you are. The final message of the latest chat is the J4R2D prompt: implement exactly the frozen hierarchical MC correction, fit it once on spent 2018–2020 data, prove structure (all 48,767 states again), runtime (p95 ≤ 500 ms) and size (≤1 MiB), then freeze the candidate and its J4R3 exam plan before any outcome is opened. Ceiling status by design: RESEARCH_CANDIDATE_NOT_PROSPECTIVELY_VALIDATED — a real validation claim can only come from sealed future games.
The first candidate beat its baselines but failed three frozen gates. The director called this a success of the process — a flawed model was stopped before touching real money — and, critically, the test holdouts were now "spent" and can never be reused as fresh proof. The queue was reordered: fix the simulator first, provider work waits.
You asked to run two agents at once. The rule that made it safe: only one repository writer. Sol (Codex) repaired the simulator while Fable did read-only provider audits (H-A/H-A2/H-A3) in parallel. Then, when you asked "when are we going to build a model?", the replacement program jumped ahead of provider implementation and J4R2A switched on free ESPN capture so the future exam games start accumulating now — no paid SGO key needed.
After the replacement model failed its calibration gates, the diagnostic (J4R2C) blocked — the needed row-level records had never been committed — and the director initially said wait for new evidence. You pushed back: "waiting for WNBA games doesn't make sense." The director agreed: the fix was to deterministically reproduce the rows from already-spent 2018–2020 data. That became J4R2C-R1, it worked exactly, and it froze the architecture now being built.
From STATE.md's forward plan. This is a sequence, not a promise — each step is promoted into the queue only by you, one at a time, and never starts until the one before it is genuinely earned. Real trading always stays behind its own explicit gate.