BET · Full project brief · Audited from three director chats + STATE / VISION / WORK_LOG · July 23, 2026

The Whole Story — what BET is, where it stands, and where it's going

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.

Where we are What BET is The journey The model march The forks Where it's heading The rules
You are here
J4R2D Current
Building & freezing the one hierarchical Monte-Carlo research candidate. The prompt was the final message of the latest chat — Codex is on it.
Live product
shipping since Jul 8
The Board, Endgame, the Four Lanes, Kalshi execution and custom stats are all deployed and working at bet.createdimension.com.
Running in background
ESPN capture · active
J4R2A quietly collects every new WNBA game. Outcomes stay sealed — they are the future final exam (J4R3).
The one goal left
a model you can trust
No quantitative model is qualified or live yet. Everything is engineered so that when one is, it was earned honestly — not fitted to look good.

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.

Public feeds ESPN live clock · possession · play-by-play SportsGameOdds sportsbook consensus · line movement Kalshi exchange contracts · price · liquidity Custom stats your own recorded observations One source of truth Opportunity Snapshot immutable · one snapshotId receipts · 3 timestamps honest missing/stale states The screen The Board public + private cards, one card open Endgame richer live-input diagnostics view Four isolated decision lanes 1 · Strict — exchange-blind, facts only 2 · Sanitized Hybrid — market hidden 3 · Contract-Aware — sees the contract 4 · Full AI Choice — all evidence Same snapshot in, independent reads out — so information boundaries are the only thing that differs between lanes. Quant model fair probability + odds — not qualified yet — Your account only TradeProposal exact live terms + fees TradeExecution your Kalshi credentials only Never a shared bot. Never one account acting for another. Confirmed or armed. ● campaign KILLED · unarmed
Live and working today Dashed = the quant model, not qualified yet Trading is armed off by default

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.

Era 1

Foundation — the product itself

Jul 8–11

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.

Era 2

The three-bot reconstruction

mid-July

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.

Era 3

Convergence & the constitution

Jul 20–21

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.

Era 4

The data → model march you are here

Jul 21–now

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.

Era 5

The road ahead

not yet earned

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.

Backend, AI & dashboard

Live
Phases 1–3

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.

1 table, 1 GSI3 AI providersGoogle auth

Endgame + Monte Carlo win-probability

Live · flagship
Phase 5

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.

possession-level simseed/model/pbp labelsESPN live sync

Live odds ingestion + edge screener

Live
Phase 7

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.

append-only historyedge rankerquota-safe

Custom stats + presence

Live
Phases 6 & 8

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.

append-only statsfeeds the AIpresence V1

The core insight

Designed & built
R0–R11 roadmap

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 pinned modelisolate info boundaries

The OpportunitySnapshot pipeline

Live
Phase AK / AM / AN

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).

immutable snapshotexact Kalshi contract firstzero-waste eligibility

J0 · J1 — one analysis system

Complete
d478698 · 625362d

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.

market-leakage bannedA–E evidence classeshonest sport profiles

E · G — public Board & factual grading

Live
1be8af4 + G

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.

public Board livefactual ≠ opinionhonest grading

F · B2 — honest audit & the SGO blocker

Truthful blockers
647db94 · 28badc9

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.

0 fully qualifiedSGO key inactiveno fake passes

M1 · M2 · M3 — the Four Lanes & My Desk

Partial · parked
62e9a58 · 6eec6fd

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.

4 lanes concurrentrecommendation-onlycampaign KILLED

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.

J2A → J2C — inventory, archive, feature store

Accepted
J2A · J2B1/2 · J2C2R

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.

2,178 games10,879 itemsappend-onlyFable: PASS

J2D — immutable training snapshots

Accepted
72d427c

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.

walk-forward folds0 leakagereplay 0 writes

J3 — first model build

Accepted
01cddf9

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.

130 candidates3 engine familiesno holdout touched

J4 — walk-forward validation

Rejected — honestly
b351ff0

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 ①

170,318 predictions38.5M simsslope 1.306p95 570ms

J4R1 — Monte-Carlo forensic repair

Repaired
5f11f39

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.

511 failures explained48,767/48,767 passp95 340ms

J4R2A — sealed forward capture

Active now
owner-promoted

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.

ESPN · free12 games day oneoutcomes SEALED

J4R2B — replacement build, attempt 1

Blocked — fail-closed
b351591

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.

620 ≠ 616 defect0 labels readrefused spent labels

J4R2B-R1 — attempt 2, one clean run

Complete — no candidate
df4e910

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.

log loss 0.113slope 1.329intercept 0.165

J4R2C — diagnosis, attempt 1

Blocked — insufficient evidence
c243911

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 ③

0 row records existedwait — overturned

J4R2C-R1 — diagnosis, done right

Architecture frozen
9fa5541

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).

381 games exact2,159 states40 params

J4R2D — build the research candidate

Current — in flight
from 9fa5541

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.

one fit, no sweepfreezes J4R3 planno deploy · no trades

J4 rejected → repair before anything else

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.

Taken: J4R1 simulator forensic repair Dropped: proceed to J5 live integration Dropped: patch & re-test on the same holdouts

Split the work → model first, providers parked

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.

Taken: J4R2A capture now + model build Parked: M-H1R provider foundation (fully specced) Dropped: buy SGO / Odds API plans first

"Wait for new games" → overturned by you

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.

Taken: J4R2C-R1 reproduce rows from spent data Dropped: wait days for new games Dropped: consume sealed 2026 games early

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.

Finish the candidateJ4R2D
Codex freezes the one hierarchical-MC research candidate and its pre-committed J4R3 exam plan. Best case: COMPLETE_RESEARCH_CANDIDATE_FROZEN on clean main.
now
Provider gateH / M-H1R → M-H2R
Can run in parallel: the dark provider foundation, then a WNBA smoke of ≤10 free Odds-API credits. Needed before live shadow price comparison — not before the final exam. Still parked by choice.
parallel
The one-shot final examJ4R3
When enough sealed games exist, their outcomes are opened once, under the pre-frozen plan. The candidate qualifies or is rejected honestly. No peeking, no retries, no tuning afterward. WNBA resumes Jul 28.
future
Shadow BoardJ5
Only a validated model reaches the live Board in shadow — automatic input fill, immutable predictions and finals, and still no automatic trading. Structured manual overrides only.
future
Model in all four lanesJ6
The validated quantitative bundle integrated into Strict, Sanitized Hybrid, Contract-Aware and Full AI through the existing digest / replay / approval architecture. Endgame requalification and M3 completion follow.
future
More sports, then broader automationJ7 · D/C
WNBA full-live / sides / totals, then NBA and college basketball — each with its own sport-specific model and settlement semantics. Later: optional controls, MLS qualification, a minimum-size bounded canary, and per-sport execution certification.
future
The model can't see the price
Constitutional: the independent probability model may never learn its answer from the current market price. Timestamped pregame closing lines are allowed as priors; live prices belong only to comparison and value.
Spent holdouts never come back
Once test outcomes are observed, they're debugging evidence forever — never fresh proof. This one rule created the entire J4R2 branch and the sealed-capture design.
One writer at a time
Sol (Codex) is the sole repository writer; Fable audits and designs read-only; the director chat decides. No milestone starts until the previous closeout is committed on clean main.
Fail closed, always
Milestones stopped rather than bend a frozen rule (J4, J4R2B, J4R2C, F) — and each stop was accepted as correct. A blocker is recorded honestly, never massaged into a pass.
Never fake data
No invented, seeded or placeholder number is ever presented as empirically grounded. Honest empty, stale, partial and failed states only — the seed/model/pbp labels have been the standard since Phase 5.
Real money is per-account & gated
Every bet goes through your own credentials against your own account — never a shared bot. Only your confirmed action or your explicitly armed campaign executes. The campaign has stayed KILLED and unarmed throughout.