Calibrated multi-sport forecasting, audited in public -- with the rejects and retractions left in.
CourtVision is an NBA-origin forecasting and decision-research system covering NBA, MLB, soccer and tennis. Its central result is deliberately unglamorous: against real closing lines the market is efficient. The pregame model matches the Shin-devigged close within noise; conditioning on the realized game state sharpens the forecast against a static prior, and the live market has that state too. Everything here is a calibration result. Nothing here is a betting-edge claim.
Every row links to its proof in EVIDENCE.md (claim -> number -> verdict -> artifact -> reproduce command).
| Question | What the record says | Verdict |
|---|---|---|
| Does the pregame model beat the closing line? | NBA held-out Brier 0.1735 vs 0.1666 for the devigged close (n=743, CI includes 0); same picture across six corpora | matches or trails the close -- never beats it |
| Does in-game state help? | vs a static pregame prior: NBA Brier 0.209 to 0.159, MLB 0.241 to 0.126 | sharper than static |
| Does it beat the live market? | NBA end-Q1: market sharper (n=1,592). Later checkpoints: underpowered. Kalshi paired ticks (2026-09-14): model behind | no -- and the page says so |
| How many discovered signals shipped? | 0 of 60 candidate classes; 513 recorded reject / defer verdicts | the gate rejects, by design |
| What got retracted? | six headline figures, each root-caused to a leak or a grading artifact by the project's own harnesses | the retraction record |
| Player-prop accuracy | PTS MAE 4.83, REB 1.92, AST 1.39 on a 20,354-row chronological holdout | accuracy only |
The strongest signal in this repository is not a metric. It is that the same person who built the system also built the instruments that caught his own overclaims, and published the result.
One person directing an agentic build pipeline, 6,300+ commits since March 2026. Counts below are read from committed artifacts or the audited evidence packet; the layer-by-layer map is docs/CAPABILITIES.md.
| Layer | Scale |
|---|---|
| Sports covered by one kernel + per-sport adapters | NBA, MLB, soccer, tennis |
| Analytics site (public, static, CI-gated) | 29 research papers, 77 measurement modules, 18 findings, 10 interactive inspectors, 1,549 entity cards, 1,653 searchable records |
| Intelligence layer between raw data and models | 151 files; a 291,625-pair player-vs-player matchup matrix; 1,249 player dossiers across 28 categories |
| Signal discovery under a gate built to refute | 60 candidate signal classes, 0 shipped; 513 recorded reject / defer verdicts; 197 hypothesis-ledger rows with every NULL kept (the ledgers are public) |
| Fact-claims corpus | 103,048 generated claims, 101,864 re-verified from their declared source and formula |
| Simulation | possession-level Monte Carlo where the negative teammate correlation emerges from a shared scoring pie instead of a hand-tuned matrix |
| Engine (private repository) | about 99 API endpoints across 12 routers, 9 long-running daemons under a watchdog, a 430-module codebase, about 7,400 tests |
| Execution | paper only, behind six pre-registered go-live gates; the order lifecycle has no reachable live path |
- Calibration -- every reliability bin with a game-cluster bootstrap interval.
- Papers -- research write-ups whose evidence paths are machine-checked against the published artifacts before deploy.
- Inspectors -- state reliability, residual anatomy, blowout timing, pitch sequencing, score decomposition, cross-sport comparability.
- Experimental metrics, the measurement lab, Compare, the entity library (1,549 cards), and Ask Scout -- every answer cites its artifact and
as_ofdate, or returnsNO_DATA. - The retraction finding -- what was claimed, what was wrong, how it was caught.
The site is a static export built from webapp/ on every push; published JSON is
scrubbed and receipt-checked in CI before it ships. Page-by-page map, data lineage and the CI gates:
docs/ANALYTICS_SITE.md.
git clone --depth 1 https://github.com/neeljshah/court-vision.git
cd court-vision
pip install "numpy>=1.24" "pandas>=2.0" "matplotlib>=3.8"
python scripts/platformkit/analytics_showcase/check_all.pyEach showcase module re-verifies its own committed artifact; 0 FAIL is the bar. Details and scope limits: REPRODUCE.md. Generated receipts, one row per measurement: RECEIPTS.md.
flowchart LR
D["DATA<br/>keyless leak-free ingest<br/>4 sports, as-of stamped"] --> S["SIGNALS<br/>ratings, per-player rates<br/>151-file intelligence layer"]
S --> M["MODELS<br/>one calibrated win prob per sport<br/>count distributions for props"]
M --> E["ENGINES<br/>possession Monte Carlo<br/>in-game repricer"]
E --> P["PREDICTIONS<br/>moneyline, spread, total, props<br/>pregame and in-game, coherent"]
P --> X["EXECUTION - paper only<br/>no reachable live order path"]
P --> V["EVIDENCE SURFACE<br/>analytics site, receipts<br/>EVIDENCE.md"]
L["AGENTIC LOOP<br/>propose -> walk-forward gate<br/>-> permutation control -> ship or reject"] -. re-validates every stage .-> S
L -.-> M
V -. retractions and rejects recorded .-> L
classDef pub fill:#0b3d2e,stroke:#2ea043,color:#ffffff;
classDef priv fill:#1f2937,stroke:#6b7280,color:#ffffff;
class V pub;
class D,S,M,E,P,X,L priv;
Green is what this repository holds; grey runs in the private engine. The full capability map, layer by layer with scale numbers, status and a public place to verify each one, is docs/CAPABILITIES.md.
One calibrated win probability per sport anchors the moneyline, spread, total and the in-game
reprice, so the markets are coherent reads off one engine rather than independent models that can
disagree. A sport-blind kernel/ holds the validated machinery; each sport is an
adapter. Candidate signals are proposed automatically and must survive walk-forward folds, a
null-shuffle permutation control, ablation against the full model, and a multiple-comparisons
correction before they ship. Most do not.
The code that enforces this is readable here: the walk-forward harness, leak guard, calibration
and deflated-metric modules in scripts/platformkit/eval_gate/,
and the conformance and golden-set kit in kernel/testing/.
Longer reads: ARCHITECTURE.md - the full system tour - how the honesty gates work - how the agentic build pipeline works - the MCP answer-engine interface
| Path | What is there |
|---|---|
| EVIDENCE.md | the claim-by-claim evidence index -- start here |
| docs/JOB_EVIDENCE_PACKET.md | the adversarially audited account, including the do-not-claim list |
| docs/evidence/ | per-claim pages, calibration artifacts, in-game and props gate results, written memos |
| webapp/ | the analytics site (Next.js static export) and its published data |
| scripts/platformkit/analytics_showcase/ | the generators and committed artifacts behind the site |
| scripts/platformkit/eval_gate/ | walk-forward, leak guard, calibration, multiplicity correction |
| kernel/ | sport-blind validated machinery |
| docs/INDEX.md | the full documentation map |
This repository is the public evidence surface. The production engine, sport adapters, API, operational tooling, bulk raw corpora, model artifacts and ledgers are kept in a private repository; reviewers can request read access. What is public is chosen by one reviewed allowlist (scripts/hooks/public_allowlist.txt) that the push guard enforces.
- Not a betting-edge or ROI product. No dollar figure on this repository is a result.
- Not third-party reproduced.
check_all.pyis self-serve artifacts evaluated -- functional; the private corpora behind recorded rows are not in a fresh clone. - Not copyleft-clean: the computer-vision lineage depends on Ultralytics YOLO (AGPL-3.0). The repository's own code is proprietary and published for evaluation (LICENSE).
Built solo by Neel Shah, directing an agentic build pipeline. Open to quant research, ML engineering and founding-engineer roles, and to conversations about the system itself.
- Start with docs/JOB_EVIDENCE_PACKET.md
- Resume: docs/assets/NeelShahResume.pdf
- Portfolio: neelshahportfolio.netlify.app
- Email: neeljshah22@gmail.com
All numbers are calibration and sharpness measures (Brier, CRPS, MAE, ECE). Retracted figures appear only in explicit retraction context in docs/JOB_EVIDENCE_PACKET.md and docs/KNOWN_LIMITATIONS.md, never here.

