VIGSAW / HOW IT WORKS
METHODOLOGY · DATA SOURCES · WHAT THE NUMBERS MEAN

How Vigsaw works

Vigsaw runs five different models against tonight's slate — each with its own scoring formula and its own view of what "a good bet" looks like. This page explains what each one is doing, where the data comes from, and how to read the numbers.

The one-sentence version: we scrape prices from five venues every ~15 minutes, score each side of each market with the model that fits it, and track every pick that clears a threshold against the actual outcome. Numbers on the site are pulled from that tracking log — see /settle-log for the raw record.

product 1/scan — deterministic side-scoring

The workhorse. For every eligible game across MLB / NBA / NFL / CFB / CBB, /scan scores both sides of moneyline, spread, and total markets. The score blends:

Each side ends up with a model_hit probability estimate. Edge is the gap between that estimate and the market's implied probability. Picks that clear the edge threshold get opened in the auto-tracker.

Display note: /scan only shows the model's preferred side of each market. If DET +1.5 scores higher than CHI -1.5, only DET +1.5 appears on the page.

product 2/runline — MLB dog +1.5

A narrow, focused board. Every day, MLB dogs at +1.5 are scored on whether they'll cover — either by winning outright OR losing by exactly 1 run. The current formula (v1) blends:

Runline is its own product because backtesting showed the football teaser formula is actively inverted for baseball — key-number crossing doesn't apply, dog-cover math is the story instead.

product 3/teaser — football + hoops leg board

Every spread bet gets scored as a teaser leg (6 points in football, 4 in basketball). Composite score blends:

Legs are ranked high-to-low. Teasers are meant to be constructed by combining 2 or more legs — a single teased leg on its own is worse than the underlying spread.

product 4/ai-model — LLM cross-venue probability

A different lens: the LLM ingests the game context (teams, splits, recent news) and outputs its own probability estimate, then compares that estimate against every venue's price. When the gap is bigger than 2.0% and confidence clears the threshold, the pick is flagged TRADE; otherwise PASS.

Cross-venue matters because DraftKings / FanDuel move differently than the peer-to-peer exchanges (Kalshi, Polymarket, Novig). Novig's vig is ~0.3% — that's your fair-line anchor.

The AI model runs on paper trades using Kelly-fraction sizing (25% Kelly, capped at 2% of a hypothetical $500 bankroll). All settle activity is logged in /settle-log.

product 5/cappers — Telegram tipster tracking

Signal only. Public Telegram cappers are parsed into structured picks, then settled against ESPN scores. The leaderboard shows lifetime record, CLV (closing line value), units, and ROI across all-time / 90d / 30d / 7d windows.

These never feed the paper-trade ledger. This is purely a research view — some cappers are consistently sharp, some are consistently fades, and the CLV column tells you which is which.

the recordPASS, TRADE, and the settle log

What "PASS" means

Most rows on /scan and /ai-model are PASS. That's the point. The model saw the game, scored the sides, and didn't find enough of an edge to open a pick. PASS is honest — it saves the tracker from garbage picks that inflate the sample.

What "TRADE" means

A pick clears the threshold and gets opened. The auto-tracker records the price and timestamp; the settler resolves it against the final score. If the market moves against the pick after we opened it, we did well on CLV. If it moves with us, we got lucky on price.

How the numbers on the site are computed

Every hit-rate, ROI, and Brier score you see anywhere on Vigsaw is computed from the live settle log. There's no offline spreadsheet — /settle-log is the source of truth. If a claim can't be traced to a row in that log, it doesn't exist.

technicalData sources and refresh

Where the prices come from

VenueWhat we pullMethod
DraftKingsMoneyline, spread, total, splits (%bets/%money)Public content-managed-page + DK Network scraper (fallback)
FanDuelMoneyline, spread, totalPublic content-managed-page (state=NJ)
KalshiPer-game moneyline via KX*GAME series tickersPublic v2 REST
PolymarketPer-game moneyline (MLB / NBA only right now)Public Gamma API
NovigMoneyline via /trading/<league>/page + GraphQL fallbackPublic REST
ESPNTeam stats, ratings, scores for settlingPublic site + core APIs
TelegramCapper picks (public channels)User client + Claude parser

Refresh cadence

The pipeline runs every ~2 hours during the active window (08:00–20:00 ET). Every refresh: scrape all venues → rebuild the unified game view → rescore all models → open new picks that clear thresholds → settle any completed games → regenerate every page. The Updated timestamp on each page reflects the last time that page's data was refreshed.

reading the numbersCalibration, ROI, and win rate

Win rate

Standard — wins divided by wins + losses. Pushes are excluded from the denominator. 60% is strong; anything above 52.4% at -110 juice is a profitable model over a large enough sample.

Units

Every pick is sized at 1 unit ($1). Units P/L is the sum of wins (paying at the actual odds) minus the sum of losses (always -1). ROI = units / total staked.

Brier / calibration

For every settled pick, the model gave it some probability of winning (say 62%). Brier is the mean squared error between that probability and the observed outcome (WIN=1, LOSS=0). 0.0 is perfect prediction, 0.25 is a coin flip, and anything below 0.25 means the model's probabilities are meaningful signal, not noise.

what this is notWarnings and limits

Questions or corrections? Vigsaw is a personal research project — no support inbox, no team account. If something looks wrong, the settle log is the ground truth and everything else is derived from it.