324
Total
0
Active
0
Bugs
3
Features
320
Done
99%
Progress
Development Progress
99%Planned
4The HRR prediction pipeline now routes the new v1.1-marcel-plus model version through its dedicated orchestrator, enabling side-by-side evaluation against v1-marcel on the admin backtest page.
Add NFL support with team rosters, player stats, game schedules, and betting data.
Add NBA support with team rosters, player stats, game schedules, and betting data.
Add NHL support with team rosters, player stats, game schedules, and betting data.
Completed
320The Odds API Pull Schedule panel now groups time slots into Daily, Weekday, and Weekend sections with per-group active counts.
Live forecast of Odds API spend on the admin dashboard - projected requests per day and per 30-day cycle - that recalculates instantly as individual pulls and schedule slots are toggled on/off. Powered by actual billed-request logs rather than hardcoded estimates, and documented as a mandatory pattern for all future Odds API cron jobs.
Every recurring Odds API pull (props + game odds, closing lines, ump tracker) now has its own on/off switch on the MLB admin dashboard, layered under the sport-wide master switch, so API spend can be trimmed selectively instead of all-or-nothing. Added a Pull Schedule panel for the sync time slots and taught the health monitor to treat switched-off pulls as intentionally paused. The convention is documented as mandatory for all future sports.
Audited every season-scoped code path so the platform rolls cleanly into 2027 and beyond: the Runs Under model retrain no longer pins its training data to 2026, park-factor lookups fall back gracefully before new-season factors are seeded, sync jobs derive the season from Central Time, and public pages keep serving the completed season through the offseason instead of going blank in January. Added a season-rollover runbook documenting the few remaining yearly manual steps.
Fixed a recurring database deadlock in the Runs Under model lock job (now retries per player instead of failing the whole batch) and cleaned up System Health false alarms: baselines poisoned by one-time backfills were reset, naturally spiky tables can now opt out of the daily-volume check, and NFL launch-week noise was cleared. The health dashboard is back to zero unacknowledged warnings.
Documented the per-sport Odds API master switch end to end: how to gate new API callers, how health monitoring pauses with the switch, and a step-by-step onboarding checklist for future sports (NBA, NHL) and the first NFL odds sync. Also wired the NFL admin connectivity-test button to respect the NFL master switch.
System Health freshness checks now understand master/kill switches: when a pipeline is intentionally turned off (like the MLB Odds API in the off-season), its tables show as informational paused entries instead of raising stale-data alarms, while in-season breakage still alerts on the same schedule.
Added a sport-wide Odds API master switch to the MLB odds admin page. One toggle now stops every MLB Odds API pull — scheduled prop syncs, nightly closing lines, the umpire-tracker fallback, and manual grabs — so MLB API spend can be shut off in the off-season while other sports keep running. The same switch is seeded for NFL ahead of its first odds sync.
The NFL Prop Finder gains an All Props leaderboard (every prop at a standard line, ranked by hit rate, with an ALL-positions option), a game-date selector that binds results to that day's slate with matchup and kickoff times, and a Not Started filter to hide games already underway.
New Analysis section on the NFL site with a Prop Finder: pick any season, position, prop, line, and direction to see Season / L3 / L5 hit rates for every qualifying player, with a per-game log, playoffs toggle, home/away splits, and usage filters.
Added /team-stats to nfl.gamedayanalytics.net: ranked league tables with season + week filters, sortable columns, and direction-aware color grading. Backed by a new nfl_team_stats weekly pipeline (nflverse stats_team release) wired into the nightly sync.
Added /players (filterable, sortable, position-aware season stat table) and /player profile pages (season stats, game log, career totals) to nfl.gamedayanalytics.net, backed by the nflverse weekly stat data. Navigation centralized into a single nav include.
Stood up nfl.gamedayanalytics.net: isolated NFL database, five seasons (2021-2025) of nflverse games, rosters, and weekly player stats plus the full 2026 schedule, nightly sync pipeline with validation, The Odds API integration with shared-key quota tracking, an NFL admin dashboard, and System Health monitoring integration.
Analyzed 38 days of graded strikeout-model picks and found all bankroll losses concentrated in the marginal 1.0-1.25 edge band. Raised the pick threshold to 1.25, added a self-fitting post-hoc calibration layer to every nightly retrain, and sharpened the refinement report so marginal bands can no longer hide inside healthy-looking buckets.
New team-level OVER/UNDER layer: per-team OVER rate, average line vs actual runs, runs-vs-line, and home/road splits, derived from the same graded games as the umpire tracker. Dark-themed, database-only viewer with today's-slate cards that show each team's and the umpire's dominant lean and flag games where both teams and the umpire all lean the same direction, plus a sortable leaderboard and per-team game-log drill-downs.
Today Slate now displays game start time (CT), the assigned HPU dominant lean (under-leaning umps show their UNDER rate in red, over-leaning show OVER in green), the full O-U-P record and runs-vs-line, ordered by first pitch. Enriched at read time by joining the games table and recomputed umpire profiles; the 5-minute poll renders identical cards.
Surface whether each umpire is the scheduled home-plate umpire in a game today (leaderboard Today badge + detail-page banner + live Today Slate panel). Added a 5-minute seed cron that re-pulls the MLB schedule/officials so assignments stay current as they are posted, plus a read-only JSON endpoint the page polls every 5 minutes to self-update.
Public Umpire Analysis page (Over/Under Trends): sortable umpire leaderboard (OVER/UNDER rate, avg line vs actual runs, runs-vs-line), low-sample filtering and flagging, today-slate panel, and per-umpire game logs with last-10 streak tallies. Wired to the live ump_over_under_profiles / ump_game_results / ump_today_slate tables; help modal included.
New per-umpire OVER/UNDER tracker. For every MLB game it captures the home-plate umpire, the closing game total line, the final combined runs, and the OVER/UNDER/PUSH result, then maintains an auto-updating per-umpire OVER-rate profile. Backfilled 2020-present (~10.5K graded games, zero missing lines) and kept current in perpetuity by three daily jobs (seed slate -> capture closing lines -> grade + recompute). Registered with the System Health and Cron dashboards.
Per-umpire OVER/UNDER profiling for MLB game totals. Captures the home-plate umpire, closing total line, and final combined runs for every game — historical back to 2020 and perpetually forward via three daily jobs (seed, hourly line capture, grade) — and maintains an auto-updating per-umpire OVER-rate profile plus a today slate showing each game-s home-plate umpire and their OVER rate.
New MLB model predicting which players are most likely to score zero runs (Under 0.5 runs). Calibrated LightGBM classifier with isotonic calibration, a daily projected-then-confirmed lineup lock + grading pipeline, admin tuning/refinement pages, public slate with edge + odds filters, and a methodology page. Picks publish only after a sufficiency gate (min graded sample + Brier ceiling) is met.
Admin report surfacing the specific signals needed to recalibrate the league-wide H+R+RBI parlay model: calibration curve, under-55% diagnosis, OVER/UNDER realized edge, line-level edge, residuals by feature, and isotonic readiness. Read-only, table-heavy, verdict-first.
Prop Finder now shows a # rank column in results (persisting across pages and any sort) and includes the minimum plate-appearances filter in its plain-language search description.
New checkbox on the Prop Finder that filters out games that have already started or finished, showing only upcoming games you can still bet pre-game. Works on the main finder and the All Props leaderboard.
Season-stats and game syncs now retry transient MLB Stats API failures instead of skipping a player until the next run, and the props sync treats expired Odds API events as routine skips instead of errors. System Health findings driven by these noise classes were cleared.
Error-scan findings on the System Health page now show the originating job name instead of the full error message in the object column, and the findings table got layout hardening — clamped cells with click-to-expand — so long messages can no longer break the row layout.
The System Health monitor now discovers and registers new GameDay Analytics databases automatically on its nightly refresh — inferred sport label, error-log mapping, and a review reminder, with a deny list protecting unrelated schemas. Health alerts on the admin dashboard are now sport-prefixed so multi-sport issues are distinguishable at a glance.
New database-level health monitor: nightly checks scan every registered database for recurring error-log patterns, numeric columns nearing their storage limits (the class of bug behind the June pitcher rate-stat overflow), stale tables, and data-sanity anomalies. Findings surface on a new System Health admin page and as an alert banner on the admin dashboard, with per-finding acknowledge and a registry form that adds future databases (NFL, NHL, ...) with zero code changes.
Fully reconciled the git repository with the production tree (150+ source files adopted, runtime artifacts gitignored) so git is the source of truth again. Fixed a season-stats sync failure where small-sample pitcher rate stats (hits/runs/walks per 9) overflowed their database columns — over 10,000 failed row updates since March 30 — by widening the columns and re-syncing all pitcher season stats.
Standardized all game-day date logic on America/Chicago via new shared helpers (PHP todayCt()/nowCt(), Python gd_lib.dates), fixing an off-by-one bug where late-evening syncs and API calls could resolve today as tomorrow. Also brought server-only config/DB files under version control and gave each parlay model its own sim-regression config knob.
Applied the new left-sidebar admin chrome (grouped navigation, sticky topbar, mobile drawer) to the main gamedayanalytics.net admin panel, matching the MLB admin redesign.
The MLB admin panel moved its navigation to a modern fixed left sidebar with grouped sections, icons, a sticky topbar, and mobile support. All existing tools and data carried over unchanged.
Redesigned footer across gamedayanalytics.net and the MLB app: quick links, model/sport links, live database stats, developer credits, disclaimer, and a terminal-style system status bar.
The Prop Finder results table now shows each game's posted over/under run total whenever a game date is selected, in both the single-prop view and the All Props leaderboard.
The league-wide MLB Parlay (H+R+RBI) model page now has History and Performance tabs — every past featured parlay with its legs, grades, odds, and units, plus parlay record by window, a cumulative-units chart, and league-wide leg accuracy broken down by direction, confidence, featured-vs-board, posted line, and lineup slot.
The public Braves Parlay (H+R+RBI) model page now has History and Performance tabs — every past parlay with its legs, grades, odds, and units, plus rolled-up parlay record, a cumulative-units chart, and leg accuracy broken down by direction, confidence, parlay membership, and lineup slot.
The Has line today checkbox now works for individual props, not just the All Props leaderboard — it keeps only players whose chosen sportsbook posts that market today at any line.
New Game total filter on the Prop Finder narrows results by the game's posted over/under run total (e.g. find Under bets in low-total games). Also fixed a regression that had stopped game-level odds (moneyline, run line, totals) from being stored since mid-May.
Game Research picks are now graded automatically against final box scores, with public History (filterable pick-by-pick results) and Performance (win rate by window, confidence, direction, prop, side, and day) tabs.
Each research pick card now shows the player's Season, last-5, and last-10 hit rates against the exact line and direction of the pick.
The All Props leaderboard now applies the Min/Max odds filter and anchors its Line and Odds columns to the selected sportsbook instead of always using best-available.
On the All Props leaderboard, the Has line today filter now keeps only combos where a sportsbook posts the exact standard bet line — alternate-line fallbacks (e.g. bet 0.5 but only 1.5 posted) are hidden.
The All Props leaderboard gained a Direction select (Both / Over only / Under only) so the board can be limited to a single bet direction.
The All Props leaderboard now shows each player's game today (opponent and Central Time start), the best-available posted line and odds for every prop combo, a sortable Odds column, and a Has line today filter to cut the board to props books are actually offering.
The Prop Finder detail card's Opposing SP panel now includes the starter's season innings pitched and games started alongside ERA, WHIP, and rate stats.
Refined the All Props leaderboard — batter boards now show position players only (no pitchers), the Home Runs prop is excluded (its "under 0.5" rate is trivially high for everyone), and pagination is now a compact windowed pager instead of listing every page.
Updated the Prop Finder verification script so its scout-note assertions match the current, clearer note wording — the test suite passes cleanly again.
New "All Props" mode in Prop Finder ranks every prop for batters or pitchers — both over and under at standard lines — into one sortable hit-rate leaderboard. Filter by minimum Season/L5/L10 hit rate to find the highest-hitting props across the league, and click any row for that combo's game log.
Prop Finder now has Well-rested BP and Overworked BP checkboxes (batter side, with a game date) to filter for batters facing a well-rested or overworked opposing bullpen, using the same workload definition as the player detail card.
The player detail popout in Prop Finder now has a Game Log view — a game-by-game breakdown of the prop vs your line with L5 / L10 / season tabs, per-window hit rate, and hit/miss/push marks, plus a link back to the notes.
In the research editor, the player dropdown for an angle now repopulates to the two teams in the selected game whenever you change the game, instead of keeping a stale list. Players like recent call-ups now appear correctly.
The Player Stats page now filters by minimum plate appearances instead of minimum games played, and the filter control is properly aligned with the rest of the filter bar.
The player detail / notes popout now shows the line for the sportsbook you picked in the filters instead of always defaulting to the best-available book. Falls back to best-available (clearly labeled) only when your book has not posted the prop.
The "Has line" checkbox is now an "Exact line" toggle — it shows only props your chosen sportsbook posts at the exact line you searched, hiding alternate-line fallbacks (e.g. searching a 0.5 line no longer surfaces 1.5 rows).
The league-wide H+R+RBI parlay model now evaluates every hitter against their own sportsbook line (0.5 / 1.5 / 2.5 / …) instead of a fixed 1.5. Confidence, pick direction, and grading all use the player's posted line, and performance stats were reset to start fresh under the new logic.
Expanded the parlay concept league-wide: confidence-ranked H+R+RBI legs across all 30 teams, rolling per-game locks, and an on-demand best-bettable parlay (one leg per game) drawn only from games not yet started. Includes public page, admin panel, poller+grading crons, and a daily featured-parlay record.
A parlay-optimized sibling of the Braves H+R+RBI model: ranks legs by probability of the correct direction (not edge) and auto-builds the best 3-leg parlay. Includes public Models page, admin panel (today/history/performance), poller+grading crons, and shared simulation engine.
Added a public page under Models for the Atlanta Braves Hits+Runs+RBIs model: todayx27s locked picks (projection, over/under probabilities, line, recommendation) plus an all-time win/loss record and ROI summary.
New isolated Monte Carlo model that predicts each Atlanta Braves starter combined Hits+Runs+RBIs via a sequential base-out simulation. Predictions freeze the instant the official lineup posts, with de-vigged book lines, edge and over/under recommendations. Includes a lineup poller, grading, and an admin panel (today view, history, performance with W/L and ROI, live config tuning).
Admin-authored, public-facing MLB game research with per-pick live enrichment: official-lineup status, opponent defensive rank for the prop, opposing-pitcher line, and player form. Draft/publish workflow, date feed + archive, mobile-first, help modal.
Added an admin Grab Odds Now command that forces an immediate background odds pull (bypassing the schedule), with a live-updating status panel and quota safeguards.
Added a cross-league API Data page to the admin showing Odds API quota, last-pull status, 30-day request volume, and props inventory per sport, plus a dashboard quota glance. Scales automatically as new leagues come online.
Added an official-lineup filter, projected-spot display in the Lineup column with faster game-day lineup syncing, and opponent-matchup highlighting that flags the softest defensive matchups for each prop.
Added on-demand Run now buttons for every scheduled job on the admin Cron dashboard, audited the cron registry, moved MLB official-lineup sync to a 10 AM CT start with 5-minute game-day cadence, and fixed the transparent run-history popup.
Fixed the Breakdowns tables on the Strikeout and Recorded Outs performance pages where the Units column was clipped at the card edge. Numeric columns now size to content and stay right-aligned within the card.
Added an admin methodology reference for the Recorded Outs pitcher model (with a public JSON mirror), and rewrote the public help to explain why a pick can differ from the projected outs and how to use the model.
Filter the strikeout slate by the buy-down (one line down) line value, complementing the buy-down odds filter.
Filter the strikeout prediction slate by the buy-down-one-line Over odds, alongside the existing side, line, and odds filters.
Strikeout prediction cards now display the Over odds for one line below the official line, giving a quick look at the safer alternate-line play.
Added a Performance tab to the Recorded Outs model (/models/outs/performance): 7-day / 30-day / all-time records with units and ROI, a cumulative-units chart, projection accuracy (how close projected outs land to actual), and breakdowns by edge, side, line range, home/away, and park, plus loss diagnostics.
Launched a brand-new, fully isolated prop model that projects how many outs each starting pitcher will record and compares it to the sportsbook line. It blends a pitcher's season and last-5-start averages, then adjusts for pitch efficiency vs. the opposing lineup, lineup difficulty (Statcast), the team manager's hook tendency, and park factors, producing Over/Under picks with a probability edge. Includes a public slate + results page at /models/outs, an admin tuning panel, and isolated nightly/hourly/freeze/grading crons.
Issued individual auto-renewing certificates for 7 freaklabs.dev subdomains (arcraiders, bills, cruise, news, skins, starcitizen, status) so they no longer depend on the manual wildcard. A few redirect-only subdomains remain on the wildcard pending a separate fix.
Renewed the expired SSL certificate for the MLB site and repaired the automatic-renewal pipeline (re-enabled the renewal timer and added a deploy step so renewed certificates are installed where the web server actually serves them). Site is secure again and will renew itself going forward.
Added an admin-only How the Model Works page to the K-Model dashboard with separate plain-language and technical explanations of the strikeout model. The public strikeout page help now shows a simplified, consumer-friendly description instead of model internals.
Relocated the current-season starter plate-appearance baseline inline next to the Min PA filter for easier calibration.
The starter plate-appearance baseline on Bet Labs is now always computed for the current season (older seasons were too sparse to be useful), with the season shown in the label.
The landing page hero showed a stale "MLB 2025 Season Live"; it now derives the year dynamically so it stays current each season.
Added image upload to the Admin Notes system — attach screenshots to notes or comments via picker, drag-and-drop, or clipboard paste, with gallery thumbnails and delete. Internal admin tooling.
Surfaced the average total plate appearances of everyday starters for the active season and filter set on the Bet Labs player results, helping users calibrate the Min PA qualifier.
Corrected misaligned numeric column headers on the Bet Labs player results table by right-aligning them to match their values.
Reordered the strikeouts model Line History popup so the opening line is on top and the latest line at the bottom for natural top-to-bottom reading.
Removed the Strikeouts History and Performance links from the Models dropdown menu.
Admin diagnostic surface for refining the strikeout model: live-vs-CV accuracy, calibration buckets, performance splits, loss diagnostics, CLV, and RF feature importance.
The Strikeout Predictions page now shows an always-visible marker next to each line — up, down, or no-change versus the opening line — so you can tell at a glance how the market has moved.
Added prediction-accuracy breakdowns to the Strikeout model. History shows, per day, how often the model landed within 1, 2, 3 (or 4+) strikeouts of the actual result — both overall and on the correct side of the line. Performance shows the same metrics all-time.
Bet Labs Players now has an explicit Batter/Pitcher selector that reshapes the page around your choice. Save filters as a system across multiple opponents (e.g. Olson vs NYM/WSH/LAA) and alerts will surface whenever your player faces any of them. Batter qualifier floor is now Plate Appearances; pitcher qualifier is Games Started. Results table realigned with clearer column semantics (H/G + PA for batters, H/GS for pitchers).
Updated Odds API monthly quota constant to match the current 5M plan so the API Quota admin dashboard chart and burn-rate projections show accurate numbers instead of red-flagged daily bars.
Cron registry initial seed missed two active gamedayanalytics crons (sync_odds_api_props.php every 30 min, and the bug_rate_limit cleanup inline mysql daily). Added them so the dashboard covers all active scheduled jobs. Also enriched all descriptions to call out which external API each cron pulls from.
Added /admin/notes — a task tracker for logging ideas, bugs, and features. Each note has a type (Bug/Feature/Enhancement/Task/Documentation), a status (Planning → Ready → In Progress → In Review → Pushed → Completed), a sport, and a section. Lets Claude pick up work from a queue and post progress comments back. Locked behind the admin login. Notes become edit-locked once status passes Ready, so the brief is frozen while work is underway.
New /admin/crons page lists every scheduled job across MLB and future subdomains, with last-run time and status pills rolled up from each sport sync_log. Registry-driven — adding a cron requires updating cron_jobs (documented in CLAUDE.md).
Activated the 26-feature Round 1 model after side-by-side review. Improved RMSE by 2 percent and MAE by 1.4 percent vs the prior 18-feature baseline. R-squared rose 25 percent.
Added velocity, umpire, swstr, pitches-per-PA, putaway, and platoon-aware lineup features (model now has 26 inputs, up from 18). New round-1 training improved RMSE by 2 percent. Shipped early-hook tracking: losses where the pitcher was pulled before reaching projected volume despite a strong K pace are flagged and surfaced in a rate-adjusted view and loss-diagnostics breakdown. Real W-L and units are unchanged everywhere.
Strikeout prediction cards now show Over/Under odds with the picked side highlighted, L5/L10/Season hit-rate strip vs closing line, per-pitcher model accuracy (W-L-P, MAE, units). Added a filter bar (side, line range, odds range) plus three new sort options (accuracy, under L10, over L10). Filter values persist across visits.
Strikeout model now uses predicted_lineups for early predictions and falls back to team L30 only when neither confirmed nor projected is available. Each card shows a color-coded tag (Confirmed / Projected / Team avg only) so the lineup signal driving the prediction is visible at a glance. Source flag is persisted to k_model_starters and recomputed on every 10-min repoll.
New k_model_line_snapshots table captures Hard Rock Bet line and odds every time they change for a today-starter. The card shows a small green/red delta vs the opening line; clicking the line opens a modal with every snapshot for that pitcher (line, both sides odds, CT timestamp). Going forward, lines accumulate every 10 minutes via the repoll cron.
Added six sort options to the strikeout slate (game time, edge, predicted Ks, pitcher A-Z, result). For graded picks, the Final badge is replaced with a bold WIN / LOSS / PUSH / VOID badge color-coded green/red/grey so wins and losses are scannable at a glance.
New /models/strikeouts/methodology page documenting how the model produces predictions, picks, and graded results. Includes live model state (active version, training window, RF hyperparameters, 5-fold CV metrics overall and per fold), full feature inventory with descriptions, lineup priority cascade, daily pipeline phases (T-24h seed, 10-min repoll, T-30 lock, 15-min reconciler, 3 AM retrain), edge formula and pick selection logic, live settings table, grading rules with units math, and an honest list of v1 limitations.
Clicking the line on a strikeout card was opening both the line-history modal and the pitcher matchup modal because the card-level click listener caught the bubble after the line handler ran. Added stopPropagation in the line handler.
The strikeout slate page was rendering Loading... indefinitely because the line-history modal markup was emitted after the inline script, so document.getElementById of the modal close button returned null, threw, and aborted the script before load() could fire. Moved the modal markup above the script block.
Player props from sportsbooks would accumulate in the database when a book swapped its projected starter mid-day (e.g. an early-morning guess gets replaced once the actual starter is announced). Pitchers who were no longer on the slate could still appear as cards on the dashboard with their hit-rate history. The sync now drops orphaned prop rows per (game, market, sportsbook) on every run, and a one-time cleanup removed ~3,700 stale rows from today and future games.
Three new admin pages: settings editor with versioned save and full change history, model versions list with one-click activation and manual retrain button, manual ops table for voiding picks, scratching pitchers, and force-unlocking starters. Strikeout model module is now feature-complete.
Three pages under /models/strikeouts: today slate (cards with predicted Ks, current line, edge, recommendation, status badge), filterable pick history with win/loss summary, performance dashboard with cumulative units and breakdowns.
Five cron jobs running automatically: T-24h slate seed (9 PM CT), 10-min lineup poll and re-prediction, every-minute T-30 lock with Hard Rock Bet line pull and pick creation, every-15-min post-game reconciliation with full units math (win/loss/push/void), and nightly retrain at 3 AM CT. Auth via credentials.conf so cron runs as gamedayanalytics user; kill switch is fail-closed.
Random Forest regressor trained on 1,568 historical starter rows. RMSE 2.27 / MAE 1.81 in 5-fold time-series cross-validation. 17 features (pitcher form, statcast metrics, opponent lineup K%, environment). Active model registered as v1.0-baseline. Prediction CLI ready for daily pipeline integration. Also retires HRR/HR/U15 legacy systems no longer in use.
Standalone strikeout-prediction module skeleton: 8 isolated DB tables, Python package with healthcheck, PHP placeholders, cron skeleton with kill switch, and verified isolation from existing model projects. No user-facing changes yet.
Added a Game Phase toggle to /bet-labs/teams that surfaces teams W-L-T records computed from runs through the bottom of the 5th inning. F5 is a straight-up market (no totals, no run-line, no moneyline filter in F5 mode), graded on linescore data sourced from MLB Stats API. Detail modal shows F5 results side-by-side with full-game outcomes so users can spot teams that lead early but blow late (or vice versa). Saved systems persist phase and surface an F5 badge.
New admin dashboard at /admin/k-correlation that identifies which statistics most strongly predict starting pitcher strikeouts. Pulls Statcast pitch data plus MLB box-score info, computes pitcher rolling form, opponent splits vs handedness, park K-factors, weather, and umpire tendencies, then runs univariate correlations (Pearson/Spearman/mutual info/univariate R²) and three models (Linear, Random Forest, LightGBM) with 5-fold time-series CV. Refreshes nightly via cron; admin can also trigger an analysis on demand (rate-limited to once per 15 min).
Shipped the tracking layer for the U1.5 betting model: append-only u15_bet_history ledger with denormalized batter/team metadata; u15_daily_performance per-strategy aggregates with running bankroll/peak/drawdown; u15_model_versions and u15_filter_versions registries. Nightly reconciliation job settles outcomes and computes CLV vs prop_history closing odds. Updated apply_filter_strategy.py to capture live bet-time odds from player_props (so CLV becomes meaningful going forward). Generated /reports/u15_state_summary.html (Claude handoff doc, refreshes nightly) plus /reports/weekly/index.html for Sunday weekly reports. Added /admin/u15 live monitoring dashboard. Operational README at python/u15_model/README.md.
Narrowed the U1.5 LightGBM model to its profitable edge zone via a hard filter (market 0.50-0.55 bucket, model edge >= 3pp, lineup spot not in 2/6/7, confirmed lineup). Test-window backfill: filter delivers +12.17 percent ROI on 223 bets (63.2 percent win rate) vs unfiltered -1.77 percent on 864 bets. Added u15_bets_recommended + u15_bets_shadow tables and a daily cron to track filter ROI vs unfiltered ROI out-of-sample. Investigated the 0.55-0.60 bucket -6.39 percent ROI failure mode: it is a juice problem (avg odds -164, breakeven 62.1 percent, model win rate 58.2 percent). Combo rule (exclude spots 2/6/7 + weak SP era>4.5) recovers a 202-bet subset at +5.33 percent ROI; documented as a v2 candidate. One-page analysis at /reports/u15_055_060_failure_mode.html.
Trained a calibrated LightGBM model for Under 1.5 Total Bases predictions. Pipeline includes data cleaning, feature engineering (interactions, composite z-scores, percentile ranks, expected-PA proxy), 50-trial Optuna hyperparameter tuning, isotonic calibration, market-importance guard, 5-fold time-series CV, betting backtest with quarter-Kelly bankroll simulation, daily inference cron, and a 9-section shareable HTML report.
The U1.5 TB EDA summary.json was emitting bare NaN tokens (invalid per RFC 8259) for the u15_line_posted feature. Added a NaN guard in the pointbiserialr path and allow_nan=False on json.dumps to catch future leaks at write time.
Built a per-batter-per-game 2026 dataset and a shareable HTML EDA report covering base rates, feature correlations, decile analysis, hitter archetype clusters, and market efficiency. Foundation for the data-driven v2 Under-1.5-TB model.
The Under 1.5 Total Bases model now runs every 30 minutes from 8 AM to 8 PM CT, picking up lineup confirmations and odds movement throughout the day instead of just twice. The public page always reflects the most recent evaluation.
New model that predicts batters likely to go Under 1.5 Total Bases. Hybrid architecture: six-step filter pipeline (lineup spot, contact quality, pitcher matchup, venue, divergence display, odds floor) plus a seven-component confidence score (luck regression, contact quality, pitcher quality, GB inducer, pitch-mix exploitation, lineup spot, venue). Admin pages tune every threshold and weight; nightly cron predicts and grades; backtest page tracks hit rate, Brier score, ROI, and reliability over time.
The Player team filter on the Prop Finder now supports selecting multiple teams at once, matching the existing Opp teams picker. Bookmarked links to single-team searches keep working.
Added Over/Under direction, moneyline favorite/underdog, and run-line -1.5/+1.5 filters to Bet Labs Teams. Backed by a new game_odds_closing store; backfilled 513 games of 2026 closing odds from the Odds API. Saved systems with these filters match against tonight"s posted odds.
Prop Finder results table headers now stick to the top of the viewport when scrolling, so column labels remain visible through long result lists.
Removed the sticky positioning on the Prop Finder filter panel so it scrolls off-screen normally, freeing the full viewport for results.
Added a Player team dropdown that restricts Prop Finder results to a single team's players. Works on both sides; independent of the Game date and the existing Opp teams picker.
Added a Has line checkbox on Prop Finder so users can hide players whose chosen sportsbook has not posted the prop today.
Renames the opposing-team count from "hits overs allowed" to "Batter-games over 0.4 hits" (or "SP starts" for pitcher props) so it does not read as total hits allowed. Notes now phrase it as "Across 45 games, opposing batters went over 0.4 hits 290 times vs the Phillies" u2014 the count tracks batter-game prop overs, not total stat units.
The live filter summary sentence now reflects the Opp teams picker. Pick 1u20133 teams and you see e.g. "u2026playing the Philadelphia Philliesu2026" or "u2026playing the Phillies or Yankeesu2026" in the sentence; 4+ teams collapse to "playing 1 of N selected teams".
Adds a new Venue filter section to Prop Finder so you can narrow results to players whose today game is at a ballpark matching stat thresholds u2014 HR/game, Hits/game, Runs/game, TB/game (from final games this season) plus admin-curated Hit/HR/Run park factors. Backed by a new nightly-refreshed venue_season_stats table. Also: the live filter summary sentence now includes min/max odds when set.
Prop Finder now shows a live one-sentence description of the active filters next to the Search button (e.g. "Batters with xBA u2265 .300 vs starting pitchers with WHIP u2265 1.20 going over .5 hits 80% of the time in their L10 games."). Updates as you adjust the form so you can read your search like a sentence before running it.
Fixed the Players page save modal to include a required player dropdown populated from the results table, ensuring saved systems capture the correct player_mlb_id. Updated stale help modal text on both Players and Teams pages.
Sub-project 3 of 3 in the Bet Labs suite. Admin can save any filter combination from /bet-labs/players or /bet-labs/teams as a named system. /bet-labs/saved (public) lists every active saved system and surfaces each one's matches against today's and tomorrow's game slate. In-memory matcher with no caching. Single-owner model: admin writes, public reads.
Sub-project 2 of the Bet Labs suite. /bet-labs/teams shows per-team Win/Loss records and game-total Over/Under records side-by-side, filtered by season window (Full / L5 / L10 / L20), team, opponent, venue, opposing-pitcher hand, day/night, a user-supplied total line, and a min-games floor. Row-click opens a per-game breakdown modal. Total Line is user-supplied; closing-line history is deferred to a possible 2B.
Game sync now records the local Central Time hour for each game, enabling time-of-day breakdowns in the Bet Labs team performance pages.
New top-level Bet Labs suite. Sub-project 1 ships /bet-labs/players: pick a season, prop, line, and direction and optionally constrain by player, opponent, venue, and pitcher hand. Returns one filtered hit rate per qualifying player with a per-game detail modal.
Team logos now render inline with the team abbreviation on the new /team-stats page, and the duplicate badge that previously appeared next to ATH/AZ/CWS (teams without locally cached logos) is gone.
New /team-stats page listing season batting and pitching stats for every MLB team. Includes sortable columns, rank badges, and tab-based switching between Batting and Pitching views. Accessible from the Stats nav dropdown.
The team season stats sync now captures total runs allowed (pitching_r) from the MLB Stats API, enabling leaderboard sorting by runs allowed vs. earned runs only.
Player detail pages now load headshots from the MLB CDN instead of a stale local /img/players/{id}.png cache that keyed on a different ID system, so the placeholder no longer shows for every player.
Prop Finder now shows a Line column with the line your chosen sportsbook is actually posting per player. When you filter for a line your book does not offer (e.g. Hits 0.5 at Hard Rock Bet for a top hitter), the row still appears with that book’s actual line shown in red so you can tell at a glance which players the book hasn’t lined at your number.
Added 30-minute Odds API prop sync windows — Mon-Fri 1PM-9PM CT and Sat-Sun 10AM-7PM CT. Each 30-min slot is independently toggleable from the admin Odds API page. Cron architecture refactored to a single */30 entry gated by the existing schedule table, so adding/removing slots no longer requires crontab edits.
Dashboard batter prop cards now default Min G to (team games played - 15) so the filter loosens as the season progresses. Pitcher prop default unchanged.
The LINEUP column on Prop Finder now displays where the batter is hitting in todays confirmed starting lineup (1st through 9th) instead of a season average. Updates every 10 minutes as teams post their cards, falling back to a dash when the lineup isnt out yet.
Starting lineups for todays games update every 10 minutes from 3pm CT through 10:50pm CT, pulled directly from MLB. Replaces the deprecated Ball Dont Lie feed. Confirmed lineups now feed Prop Finder, HRR systems, and pitcher matchup pages instead of falling through to predicted orders.
Fixed bug where all HR Matchup predictions had null edge values because the odds-attach query filtered by a specific sportsbook (DraftKings) that had no batter_home_runs props. Added best-available book fallback: prefers configured default book (case-insensitive), falls back to best-priced row from any available book. Also corrected case mismatch in hr_default_book app setting.
New standalone home-run prediction model that overlays each starting pitcher's pitch arsenal on every opposing hitter's per-pitch-type Barrel% and xwOBA. Marcel-style baseline x matchup x park-HR-factor formula with fully interpretable Primary Driver text. Daily predictions + per-game live grading 15 min after final. Surfaces at /systems/hr-matchup. Public page kept gated until a 5-7 day soak completes.
Added admin backtest page at /admin/models/hr/backtest showing windowed performance metrics (7d/30d/season), edge-bucket breakdown, reliability calibration diagram, and on-demand evaluator re-run.
Added the /hr-matchup page with hero leaderboard (top edges), full sortable slate table, past-date grading, and a help modal covering the model's Power Blend, arsenal matchup, and park factor logic.
Admin page for editing per-venue HR park factors used by the HR Matchup model. Inline per-row editor with season selector; hit and run factors are read-only.
Added /admin/models/hr/weights page for editing HR Matchup model config: league means, component weights, matchup caps, regression constants, and lineup-spot projected PAs (with JSON validation). Includes model activation switching and CSRF-protected PRG form handling.
Added live grading pipeline that runs every 10 minutes (12 PM – 2 AM CT). After a game goes Final, hr_actuals rows are written within 15 minutes. Rolling Brier score, log-loss, and edge-bucket breakdowns are recomputed for 7-day, 30-day, and season windows after each grading pass.
Implemented the end-to-end HR matchup prediction pipeline (Task 16). For today's slate of MLB games, the script loads pitcher arsenals, batter vs pitch-type splits, park factors, and lineup spots, computes per-batter HR probabilities, attaches devigged prop odds, and writes to hr_predictions. Includes 2 E2E unit tests locking the fixture outputs.
Added an admin sync page at /admin/models/hr/sync with kill-switch toggles for nightly sync, predict, and evaluate pipelines; a data status panel showing latest snapshot dates and row counts; and a manual run button that triggers the sync script in the background.
Supplemented the batter-vs-pitch statcast sync to populate barrel_pct and avg_exit_velocity per pitch type. The pitch-arsenal-stats endpoint does not expose these metrics, so a second statcast_search endpoint is fetched using a BIP-only filter (hfAB=in-play events) which keeps each pitch type under the 25K row cap. Barrel detection uses launch_speed_angle==6 (Savant's barrel category). Fill rate is now 99.9%% across all pitch types.
Nightly sync of Baseball Savant pitch-arsenal-stats (batter view) into statcast_batter_vs_pitch. Captures per-batter xwOBA, wOBA, BA, SLG, hard-hit %, and whiff % vs each pitch type — feeds the upcoming HR matchup scoring model.
Nightly sync of Savant pitch-arsenal-stats into statcast_pitcher_arsenal. Fetches per-pitch-type usage, wOBA, xwOBA, whiff%, put-away% from the pitch-arsenal-stats leaderboard and supplements with avg velocity and spin rate from the spin-direction-pitches endpoint.
Added schema for HR Matchup model v1-arsenal: per-pitch-type sync tables (pitcher arsenal, batter vs pitch type), model registry, predictions/actuals/performance tables, HR park factor extension, app settings, and systems registry row.
The Prop Finder GAME column now shows each game start time inline (CT). A new sportsbook selector defaults to Hard Rock Bet (with a Best available option) and pairs with optional Min/Max odds inputs to filter results by price. A sortable ODDS column displays the chosen book's price for your direction, falling back to best available across active books when needed.
Attached real-time sportsbook odds to Prop Finder results — players now show book, line, over/under odds, and direction-relevant odds. Supports sorting by odds and filtering by min/max range. Falls back gracefully to best-available book when the chosen book has no line posted.
Extended the Prop Finder filter validator to accept a sportsbook selector, min/max American odds bounds, and book_odds as a sort column. Foundation for odds-aware filtering in subsequent pipeline stages.
Multi-select opposing-team filter, per-row "vs Opp %" hit-rate column, click-to-open detail card with today's line, opposing-SP stats and Statcast, opposing-team qualifying-overs aggregate at the user's chosen line, plain-language scout notes (player rank, opp-team rank, opp recent trend, bullpen workload), date selector replacing has-game-today checkbox, per-prop default line and direction, help-button restyle, and an 8 PM CT cron so tomorrow's predicted lineups are ready in the evening.
Added three optional minimum-hit-rate filters (Min Season %, Min L5 %, Min L10 %) to the Prop Finder, letting users narrow results to players whose hit rate in any window meets a floor.
New /prop-finder page lets users compose batter or pitcher prop searches with optional lineup, performance, and pitcher-matchup filters. Returns Season / L5 / L10 hit rates side-by-side against a user-chosen line.
Fixed: clicking a pitcher on /game-preview was opening the wrong modal (K%/career-vs-pitcher view from /pitching-matchups) instead of the intended HRR Over% / Runs Under% view. Caused by a global click handler in app.js matching the same .matchup-pitcher class.
New /game-preview page with today's MLB schedule, both starting pitchers, and season Statcast pills (xERA, xwOBA, HardHit%, Barrel%, Whiff%) per pitcher. Click a pitcher to see opposing batters' HRR Over% and Runs Under% trends.
vs-handedness HR rate now requires at least 25 AB before showing as a percentage — prevents misleading 0% values from tiny samples. Also removed orphan venue-stats.php files from prod that predated the stadium-stats work.
New /stadium-stats page combines park factors, home/road team splits with L5/L10 totals, and top HR hitters per lineup with Statcast power metrics + vs-handedness HR rate. Designed for HR-hunting research without being a pick-generation system. Two views: today's slate sorted by HR park-friendliness, and a sortable browse view of all 30 ballparks.
Filled in all 7 help modal sections for the Stadium Stats page and registered the page in the admin help-content tracker. Sections cover: page purpose, park factors, home/road splits, L5/L10 totals, top hitters table, vs-handedness caveat, and All Stadiums browse view.
Added the All Stadiums browse tab on the Stadium Stats page. Displays all 30 parks in a sortable table (HR factor, Run factor, Hit factor, alphabetical by name/city/roof, or by whether a game is scheduled today). Clicking any row expands it inline showing the home team HR rate at that park and the top 5 HR hitters who have played there this season.
The Stadium Stats page now renders full interactive game cards for today's slate — park factor chips with color coding (green/yellow/red), pitching matchup row with hand/ERA/WHIP/HR9, home/road team splits with L5/L10 totals, and a top-hitters mini-table with Statcast power metrics and vs-handedness HR rates.
Added the /stadium-stats page with tab toggle (Today / All Stadiums), date picker, help modal placeholder, and URL-persisted view state. Wired to the /api/stadium-stats.php API; card and table rendering ship in follow-up tasks.
Added the all-stadiums browse view and lazy venue-detail expansion to the stadium-stats API. Returns all 30 parks ranked by HR park factor with todays game labels; clicking a park loads home-team HR rate and top 5 HR hitters at that venue this season.
API endpoint now handles games with TBD start times (renders 'TBD' instead of stray ' CT') and falls back to latestStatsSeason() when the requested date is in a year with no batter stats yet.
New API endpoint (/api/stadium-stats.php) powering the Stadium Stats page. Today view returns all games for a given date sorted by HR park factor descending, with per-game venue metadata, park factor ranks, starting pitcher cards, and team panels including home/road splits, L5/L10 totals, and top-5 hitters enriched with statcast data and vs-handedness HR rates.
Added a static PHP lookup file mapping MLB venue IDs to city and roof type (open/retractable/fixed). Used by the upcoming Stadium Stats page to display venue context and filter by weather exposure.
Added refresh_batter_handedness_splits.php to cron_daily.sh so batter vs LHP/RHP split stats update automatically each morning. Dry-run verified: 1833 rows refreshed in 335ms.
Diagnosed v1.1-marcel-plus as strictly worse than v1-marcel on Brier (0.2499 vs 0.2428), log-loss (0.6930 vs 0.6784), and edge-bucket hit rate (44.0% vs 45.1% on >=5% edge). Highest-edge picks were anti-signal: 30.8% win rate on Over picks with 10%+ edge. Rolled active model back to v1-marcel and created v1.2-recent-soft experiment config (w_recent 0.30 -> 0.10, w_park_hr 0 -> 0.5) for parallel A/B comparison. Backfilled today slate predictions for both models and updated predict.py dispatch to recognize v1.2-* configs.
Fixed a bug where the Min/Max Odds filter on the dashboard could let through props whose visible side fell outside the bounds (e.g., a -195 favorite showing under a -180 cap). The filter now correctly applies to the displayed Over or Under odds when a toggle is active.
Each MLB prop card now shows a season hit-rate against today's line restricted to prior games against the opposing starter (for batters) or opposing team (for pitchers). Lazy-loads after card render so initial page time is unaffected.
Added a Player Props Stats link to the Prop Analysis nav dropdown. Each per-market detail card now shows the favorite-side American odds beneath Today's Line, plus L5 and L10 over/under hit rates against today's line.
Added Favorite Price (best American odds for the prop) and L5/L10 over/under hit-rate rows to each market detail card on the Player Props Stats page.
Added a passcode-gated bug report widget to the navbar of every GameDay Analytics property. Reports flow into a central admin dashboard with status workflow, admin notes, and screenshot uploads. Passcode is editable from the admin without redeploying.
Added Baseball Savant–style hover tooltips to every Statcast column header (mobile-friendly tap-to-show). Pitcher tab now filters to starters via Games Started and drops batter-flavored columns (PA, HR, BA, SLG) plus Chase%, CSW%, Zone%. Batter tab drops maxEV, Chase%, Pull%, GB%, LD%, FB%; the previously blank H/HR/AB now populate from season totals. Table layout tightened to fit on desktop without horizontal scroll.
New /cold-pitchers page surfacing today's starters whose Statcast profile (xERA, xwOBA, Hard-Hit %, Barrel %, Whiff %) marks them as getting destroyed. Includes batter-trend modal showing opposing-lineup HRR Over% and Runs Under% across L5/L10/Season, admin-tunable thresholds, and history tracking with postgame ER grading.
Widened the Min Odds, Max Odds, Min L5%, and Min L10% inputs in the dashboard toolbar so 3-4 digit values like -180 are no longer truncated.
Added Min L5% and Min L10% inputs to the dashboard toolbar so users can filter the prop card grid to players whose recent hit rate meets a chosen floor. The filter follows the active Over/Under toggle so it compares the same percentage the card displays.
Replaced the bulky All Players / With Game Today segmented control on /players with a small Games today checkbox so the filter bar fits without wrapping.
Added today's game info beside player names (vs/@ opponent + time, or Off), a With-Game-Today filter toggle, dynamic min-games-played filter (defaults to season max GP - 10), and three new sortable columns: Avg Runs/Game, HRR Over/Under %, and Run Over/Under %.
Routed season-window Statcast sync through Savants custom-leaderboard endpoint so contact-quality metrics (barrel_pct, hard_hit_pct, whiff_pct, k_pct, sweet_spot_pct) populate alongside expected stats. Unblocks HRR Monger and any future system using these columns.
Statcast-driven HRR 1.5+ overs system with hard-gated qualifiers, weighted Monger Score, rolling 7-game predicted lineup table, and per-metric tuning analytics.
Player Stats returned to position-players-only with H+R+RBI and HRR/GP columns; Pitcher Stats now lists starting pitchers with an Outs/GS column.
Model upgrade that blends a batters last-10-games rate (Marcel-shrunk, 21-day cap, min 5 games) into the season-rate estimate. Addresses boom-bust misses where season rates ignored a players recent cold/hot streaks (e.g. Christian Walker picked at 49% model-over despite going cold in his last ten games). Default 30 percent weight to recent form; all five knobs editable via the admin Models page. v1-marcel retained as rollback baseline.
New /admin/models/hrr/backtest page presenting stored model performance (Brier, log-loss, RMSE, MAE across 7d/30d/season windows), edge-bucket hit rates, reliability diagrams, and over/under side breakdown, with side-by-side model comparison and a manual Re-run evaluate trigger.
Ship /hrr-predictions — hero grid of todays top HRR edges with expandable PMF charts, Model Inputs panel, and Recent Form panel; filterable full-slate table; past-date browsing with graded outlines; per-user sportsbook selection with automatic best-line fallback. Also adds a new Models admin section mirroring the Systems pattern: /admin/models landing page with per-model config cards, shared HRR settings (park factors, public-page settings), and diagnostic. Legacy HRR admin routes kept as aliases.
Upgraded HRR pipeline from a league-mean stub to a real predictive model: Marcel-shrunk batter hit/run/RBI rates, multiplicative pitcher-matchup (xwOBA-against) and park-factor adjustments, numpy Monte Carlo producing full PMF + devigged edge. New admin editors for park factors and model weights; model-switching via is_active flip preserves historical predictions for comparison.
Python pipeline scaffold + HRR schema + stub predictions + post-game grading + admin debug view. Foundation for the HRR predictive model; no user-visible features yet. Real model lands in Project 2B.
Nightly sync of Baseball Savant Statcast expected-stats leaderboards (batter + pitcher) into the MLB database. New public browse page at /statcast with filterable, sortable leaderboards, player photos, snapshot-date time-travel, and CSV export. New admin dashboard at /admin/statcast for enable/disable, per-leaderboard toggles, manual sync, and backfill. Scope: Project 1 ships season-to-date snapshots only — rolling windows (last 7/15/30 days) deferred to Project 2 since Baseball Savants CSV endpoints don honor date ranges.
Added a Team dropdown to the Player Props Stats page so you can narrow the table to one MLB team at a time. Default view still shows every player.
Added an Exclusions picker to the Auto Parlay toolbar so users can remove specific market+side combinations (e.g. exclude Over Runs while keeping Under Runs eligible) from the candidate pool.
Added Start Time / End Time inputs to the Auto Parlay toolbar so users can narrow parlay candidates to a specific CT window (e.g. early-afternoon slate only).
Clicking a pitcher card on the Pitching Matchups page now opens a modal with the opposing lineup and each batter's head-to-head stats vs. that pitcher. Columns expanded from PA/K/K%/AVG/OPS to PA, AB, H, HR, BB, K, K%, AVG, OBP, SLG, OPS across Career, Season, L10, and L5 views. Added a contextual help modal and fixed the pitcher-detail page that was blank for pitchers with assigned umpires.
Fixed a fatal database error on pitcher profile pages (incorrect umpire JOIN columns), corrected pitcher card photos to use the standard MLB CDN endpoint, and confirmed help modal styling matches site standards.
New /admin/bets page accepts Hard Rock Bet CSV exports and shows net P/L, ROI, parlay record, and leg-level hit rates by market, player, team, and price range. Uploads are idempotent — re-importing the same CSV updates statuses without duplicating rows.
Added a sportsbook selector to the Player Props Stats page. Default Best Available keeps the existing behavior (best over odds across all active books); picking a specific book shows only that book's lines.
Reworked the Player Props Stats page to show every active batter and starting pitcher this season, with matchup and prop info appearing only when the player has a game on the selected date. Added pagination and server-side sort to keep load times fast as the player universe grew from ~130 to 600+.
Added today's opponent and game start time to each player row on the Player Props Stats page so you can see matchup context without leaving the table.
Silent Failures panel now cross-references prop_history and backfill runs — dates with closing line data from backfills no longer show as failures
Added a new Research navigation dropdown with a Venue Stats page showing aggregated batting and pitching stats by MLB ballpark with sortable columns and totals/per-game toggle
Added a Player Props Stats page showing player season stats alongside their prop lines for any date, with historical and today-line hit rate calculations
Added min/max under odds range filter to the Top Unders page. Props outside the configured odds range are excluded from results.
Added a pre-computed table tracking each player's most frequent batting order position per season. Integrated into No Run Score and Under .5 Runs systems so they no longer depend on lineup cards being published.
Added historical batting order position as a 6th qualifying check to the Under .5 Runs system. Players must most frequently bat in the 6th spot or lower to qualify, filtering out top-of-the-order hitters who are more likely to score.
Replaced the live lineups table lookup with historical mode batting order position from player_batting_order_history for the lineup position factor. Improves scoring stability before game-day lineups are confirmed.
Created player_batting_order_history table to store the mode batting order position per player per season. Backfilled 2026 season data from existing game stats (433 player records). Added batting_order_min config param to the Under .5 Runs system.
Admin system detail pages now show a Filtered Out stat in the Live Preview summary, matching the metric shown on public system pages for easier comparison.
Added VS Team hit rate (performance against today's prop line in games vs the opponent) and full-season closing-line percentage to prop cards on the MLB dashboard.
Rewrote team season stats sync script to use MLB Stats API instead of deprecated BDL API. Includes team batting, pitching, and fielding stats synced daily.
New evaluation system that identifies players likely to go under 0.5 runs scored by combining team offensive weakness (bottom N in runs scored), opponent pitching strength (top N in ERA), individual run drought indicators, and sportsbook odds filtering. Includes admin-configurable parameters and team rankings display.
Created team_season_stats table and rewrote sync script to use MLB Stats API instead of deprecated BDL API. Populates hitting, pitching, and fielding stats for all 30 teams.
Added early morning prop sync so player props are available before the first pitch.
Fixed timestamp format issue causing closing lines to fail since April 12. Backfilled missing data.
Admin-controlled prop sync schedule with per-slot toggles. Added 5:30 PM and 7:00 PM CT sync windows for better pre-game line coverage. Six total daily sync runs, each controllable from the Odds API admin page.
Added real-time API quota tracking with burn rate projections, daily usage chart, and per-sync-job breakdown. Fixed broken admin page that was showing empty status data.
Added info tooltips to each check in the Failed Check Impact table across all history pages. Applied the new scorecard design to No Run Score history with backfilled prediction data.
Replaced the confusing Check Effectiveness table on HRR Overs and Unders history pages with a Failed Check Impact scorecard. Now clearly shows which checks matter most by tracking hit rate when each check is the one that fails on near-miss predictions.
Fixed a bug where HRR Overs and HRR Unders predictions were never being locked due to a missing function dependency in the sync script. Backfilled historical predictions so history pages now show tracked results.
New scoring system that calculates probability of a player not scoring a run using 12 weighted factors (OBP, lineup position, opposing starter, platoon, park factor, etc.). Compares model probability against sportsbook odds to detect value betting opportunities. Includes admin configuration, prediction tracking, and history page.
Added date-navigable schedule page and rebuilt game detail as a player-first prop breakdown with closing-line history, top-performer/top-under badges, and collapsible box score sections.
Admin dashboard now shows prop history gaps and silent sync failures, so missing data is immediately visible.
Fixed a bug where the closing lines sync was calling the live events API instead of the historical events API, causing games from past dates to not match. Backfilled March 26-29 prop history data.
Top Performers now compares players against their actual historical closing lines from sportsbooks instead of applying today's line retroactively. Also shows a secondary vs-today's-line badge per prop.
New page that surfaces players with high under hit rates using historical closing lines from sportsbooks. Compares against actual past prop lines and today's line. Admin-configurable thresholds and market toggles.
Fixed a bug where props with odds outside the configured Min/Max Odds filter range could still appear on the dashboard. Each side (over/under) is now checked independently against the filter.
Added a help icon to the Heavy Home Favorites page explaining the bridge system, all five checks, the moneyline override feature, and how to read qualifying vs near miss results.
Added a help icon to the Parlay Builder page explaining how to build a parlay, what each field means, how to read results, and the difference from Auto Parlay.
Added a help_content table to track when each page's help modal was last updated. Admin dashboard now shows help content age with color-coded freshness indicators. CLAUDE.md documents the help modal pattern for consistent implementation.
Added a help icon to the Prop Hit Rate Analyzer page explaining filters, column meanings, and usage tips.
Added a help icon to the Team Top Performers page showing current settings, enabled markets with directions, and how to use the page.
Added a help icon to the Top Performers page that shows current settings (min hit rate, min games), which markets are enabled and their direction, and how to read the results.
Added help icons to HRR Overs and HRR Unders pages that open a modal explaining how the system works, what each check means, and how to read the results.
Auto Parlay now backtests against real closing prop lines from prop_history instead of applying today's line retroactively. Hit rates now reflect whether the player actually beat the line that was set for each game.
Auto Parlay now ensures the same player cannot appear in multiple legs of the same parlay, preventing correlated parlays that sportsbooks penalize with reduced payouts.
Fixed check effectiveness tables showing all zeros due to MariaDB JSON_VALUE boolean comparison. Added full-criteria vs near-miss badges to daily breakdown. Adjusted HRR Unders min-games offset for early season.
Auto Parlay cards now show each players game matchup and start time
Added Min Odds and Max Odds filter fields to the Auto Parlay page, filtering out props whose odds for the chosen direction fall outside the range
New page that automatically discovers and ranks the best parlay combinations from todays props based on historical hit rates. Includes admin settings for per-leg hit rate threshold and per-market minimum lines.
Added a sportsbook dropdown to the Top Performers page, allowing users to filter results by a specific sportsbook
Fixed game times on HRR Overs, HRR Unders, Hits Over, and Home Favorites pages that were displaying UTC times instead of Central Time
Added Min Line and Max Line filter fields to the MLB dashboard toolbar, allowing users to filter props by line value range
New evaluation system for H+R+RBI prop under opportunities. Identifies batters in unfavorable offensive situations using 7 checks: under hit rate, bottom-of-lineup batting order, low pitcher WHIP, low team implied runs, venue filtering, platoon disadvantage, and min games played. Includes admin configuration, prediction tracking, and history page.
Min games parameter now auto-calculates from max team games played this season plus a configurable offset. Applied in admin dashboard, public API, and prediction lock script.
Added prediction tracking infrastructure — locks HRR Overs predictions ~1hr before games, grades postgame, and provides history page with accuracy breakdown by confidence level and individual check effectiveness
Added a cron sync script that snapshots qualifying and near-miss HRR Overs predictions approximately 1 hour before each game, storing locked predictions in system_predictions for grading and hit-rate tracking.
Renamed the H+R+RBI Advantage system to HRR Overs for clarity — updated all file names, URLs, routes, DB slug, and navigation links
Dashboard now auto-calculates minimum games based on season progress and market type. Added odds range filter to control which prop lines are displayed. All defaults are configurable from the admin panel.
Added us2 region to The Odds API integration to include Hard Rock Bet odds in player prop displays.
Odds API sync script now auto-discovers and upserts sportsbooks encountered during each run into odds_api_sportsbooks, mirroring the existing market auto-discovery pattern.
Added active-sportsbook filtering to all five prop API endpoints so disabling a sportsbook in the admin panel immediately removes it from all prop results across the site.
Added POST /api/odds-api-sportsbook-toggle endpoint to enable or disable individual sportsbooks, controlling which books are included in odds API responses.
Added odds_api_sportsbooks reference table to control which sportsbooks appear in front-end props displays. Seeded from existing sportsbook data in player_props.
Changed admin gear icon color from white to black for visibility on light navbar
Under toggle on the dashboard now properly recalculates hit rates instead of only switching displayed odds
New evaluation system that identifies batters with high Hits+Runs+RBIs prop hit rates in favorable matchup conditions including batting order, opposing pitcher WHIP, team implied runs, venue, and platoon advantage. Includes Over/Under toggle and admin dashboard with configurable venue toggles for all 30 MLB parks.
Fixed player team assignments showing previous season teams instead of current rosters on the Prop Analyzer page
Player headshots now display correctly on Top Performers and Team Top Performers pages using the MLB CDN.
Added a team-filtered Top Performers page where users can select a team and see which players are hitting prop lines at the highest rates.
Top Performers prop markets are now configurable from the admin dashboard. Each market can be set to Over, Under, or Off with a visual toggle. Removed irrelevant props like stolen bases, singles, and doubles by default.
New page under Prop Analysis that surfaces players hitting their prop lines at a high rate. Shows player cards with position badges, game info, and all qualifying prop lines with hit rates. Admin-configurable thresholds.
Multi-leg parlay analyzer that lets you build 2-6 player prop combinations and see historical hit rates, matching days, and near misses across the season.
Added a team game stats aggregation pipeline and Hits Over evaluation system. Users enter a hits threshold and direction (over/under) to find teams whose rolling batting average vs opponent pitching suggests they will hit over or under that number.
Added a systems overview page that lists all evaluation systems with today qualifying game highlights and per-system stats
Disambiguated Strikeouts and Walks labels so pitcher and batter versions are clearly distinguished in dropdowns.
Added a configurable minimum games filter to the dashboard prop cards view. Defaults to 3 games to filter out small-sample noise early in the season.
Dashboard prop cards now tiebreak by total games when hit rates match, and L5/L10 labels show game count for small samples to reduce misleading 100% displays early in the season.
Switched entire site from Eastern Time to Central Time (America/Chicago). Added formatGameTime() helper for consistent UTC-to-CT conversion. Fixed broken game times on dashboard that displayed as year values (e.g. 2014:05 PM).
Resolved silent cron failure where the props sync script could not write to a missing log directory. Created /var/log/gamedayanalytics and fixed file ownership for the sync scripts.
Added configurable Systems section to MLB Admin with live preview for Heavy Home Favorites system parameters (moneyline range, starter tiers, bullpen LOB%, reliever risk mode, sweep detection).
Fixed player photos to use MLB CDN, corrected market type mapping for props queries, and added fallback market list for the dropdown.
Fixed broken daily-props API that referenced non-existent table columns, preventing the props dashboard from loading.
Created a standalone admin dashboard for MLB-specific tools with password authentication, sync monitoring, and data overview. Admin pages are now protected behind login.
Grouped closing line history by game date with collapsible accordion UI showing matchup and O/U summary per game.
Fixed column name mismatches and missing table reference in the prop grading script that prevented closing line history from showing results beyond March 30.
Game times on Bridge Builder page now display in Central Time (America/Chicago) instead of Eastern
Added admin dashboard for manual pitcher tier/reliever role assignments and Bridge Builder page that filters today's MLB slate for qualifying heavy-favorite home bets using a 5-point validation system
Backfilled Opening Day game stats and updated cron scripts to use rolling date windows, preventing data gaps at season start.
Rewrote player-detail.php and player-stats API to use the actual server DB schema: batters/pitchers tables, correct game_pk/game_date column names, base_on_balls/strike_outs/pitches_thrown in game stats, avg/obp/slg/ops in season stats. Added Closing Line History section with O/U trend dots from prop_history table.
Built a hit rate analyzer that grades player props against historical closing lines (15 min before first pitch). Captures consensus lines from The Odds API Historical endpoint, grades against actual stats, and surfaces CL10 hit rates with O/U trend indicators on dashboard cards.
Replaced Ball Don't Lie with The Odds API for live player prop lines. Built a 4-layer name matching engine (alias, exact, normalized, fuzzy), admin dashboard for market management and unmatched player resolution, and automated sync schedule at 6 AM and 1 PM ET.
Fixed pitcher-matchup API to work with new MLB Stats API schema. Click any pitcher on the matchup page to see the opposing lineup with K% breakdown: Season, L5, L10 plate appearances, and Career vs that specific pitcher.
Built complete data pipeline: game stats (373K+ lines), lineups (235K), umpires (122), standings, and injuries — all synced from MLB Stats API with rate limiting, retry logic, and comprehensive sync logging. Automated via cron: 6 AM daily, every 10 min during games, 1:30 AM postgame sweep.
Added ESPN-style leaderboard validation page to admin dashboard. Shows batting leaders (AVG, HR, RBI, OPS, Hits, SB) and pitching leaders (W, ERA, SV, K, WHIP, K/9) for quick comparison against ESPN. Includes database health checks, season breakdown, and sync activity log.
Added player_game_stats table storing individual game batting and pitching lines for every player in every game. Enables L5, L10, and over/under calculations for prop analysis.
Lineup data with batting order and positions synced from MLB boxscores for every game.
Umpire registry and per-game assignments synced from MLB boxscores. Home plate umpire impacts scoring environment.
Full standings data from MLB Stats API including splits (home/away, day/night, L10, extra-inning, one-run games).
Current injured list status synced from team depth chart rosters. Rebuilt fresh each sync run.
Three cron jobs: daily pre-game sync (6 AM ET), live score updates every 10 min with instant stats on game completion, final postgame sweep (1:30 AM ET).
Backfilling per-game player stats, lineups, and umpires for all regular season games from 2020 to 2025 (~14,000+ games).
Replaced Ball Don't Lie API with the official MLB Stats API for all game schedules, pitcher stats, and batter stats. New database schema uses MLB personIds and game_pk as primary keys for direct API compatibility.
The Prop Hit Rate Analyzer now returns all players meeting the games and hit rate thresholds, not just those with a prop listed today. Players without a game today show a dash in the Game column.
The prop analyzer now shows each player's today's matchup (opponent and game time) in a dedicated Game column. Hidden on mobile for readability.
Completed games and their props are now filtered out of the daily props dashboard, keeping focus on upcoming and in-progress games.
Fixed an issue where game tabs on the daily props dashboard were repeated multiple times due to a database join producing duplicate rows.
Fixed a data type mismatch in the lineup sync where empty string values from the API caused database insert errors for the is_probable_pitcher field.
Player stats, prop results, and lineups now process within ~10 minutes of a game ending instead of waiting until 1:30 AM. Play-by-play and Statcast data still sync overnight.
Player profile game log now excludes spring training games, showing only regular season data.
Complete mirror of all 19 BDL MLB API endpoints into local database. Includes Statcast pitch-by-pitch data, play-by-play, standings, lineups, player splits, injuries, and batter-vs-pitcher matchups. Comprehensive logging with verbose/debug/dry-run modes. Nightly automated sync with historical backfill for 2022-2025.
New page showing today's starting pitchers grouped by game with expandable head-to-head matchup panels showing opposing lineup strikeout rates via the MLB Stats API.
Reorganized MLB site navigation into grouped dropdowns: Stats, Prop Analysis, and Umpire Analysis. Cleaner layout with desktop hover and mobile accordion behavior.
New cross-player discovery tool that finds players with consistent hit rates against their current prop lines. Includes all 16 MLB player prop types, over/under direction filtering, configurable thresholds, and sortable results with L5/L10 trend data.
Added per-season O/U hit rate breakdown on the Umpire Game Preview page for both umpire vs line and pitcher combo data. Fixed betting odds sync to correctly map BDL API field names. Also fixed game stats sync pagination bug and NULL season values.
Renamed Accuracy to Hit Rate on props cards and fixed hit rate data showing N/A by falling back to the most recent season with game stats data when the current season has no completed games yet.
Redesigned the MLB home page with a card-based player props view featuring prop type selector, game filters, sportsbook filter, sort options, and hit rate trending metrics.
Date-selectable page showing home plate umpire O/U hit rates with threshold grids and starting pitcher combo analysis for daily MLB games.
Added a safeguard to prevent games from showing a LIVE badge if they started more than 6 hours ago. This handles cases where the API is slow to update game status from in_progress to final.
Updated the Today's Games section on the dashboard to display team logos instead of plain text abbreviations. Logos are sourced from ESPN CDN.
Added season filter checkboxes to the Umpires listing page, allowing users to filter umpire stats by specific seasons. The umpire filter API now accepts season parameters for targeted analysis.
Fixed umpire stats pages and cache to exclude spring training games. All umpire queries (listing, detail, analysis, filter API, and stats cache) now only include regular season games, matching industry-standard sources like OddShark.
New Umpire Analysis page for analyzing home plate umpire tendencies with custom over/under thresholds. Supports Total Runs, Strikeouts, Walks, Home Runs, and Hits stat types with season filtering, hit rate summary cards, common threshold grid, and full game history table.
Scheduled games now show their start time (ET) instead of just a generic Scheduled badge. Game times are synced from the BDL API and displayed on the dashboard, games today page, and game detail pages.
Added interactive filters to the Umpires page — set minimum HP games, enter a custom O/U line threshold, and toggle between Over and Under to see hit rates. Includes sortable columns and historical vs. actual betting line tracking.
Redesigned the entire site with the Hardball theme: dark header/footer with warm body sections, rust-red accent color, Space Grotesk display font, JetBrains Mono for stats, sharp 2px corners, and square player photos. Applied across the landing page, MLB app, and admin dashboard.
Full player profiles with season stats, game logs, batting and pitching leaderboards, and headshot photos from MLB Stats API.
Automated sync of player props and game betting odds with historical result tracking and hit-rate analysis.
Admin panel with manual sync triggers, data audit tools, season backfill, and changelog management.
Cron-based sync for teams, players, games, season stats, game stats, props, odds, and prop results with real-time live score updates.