Files
vyndr/specs/audit-data/propline-audit-raw.json
builtbykev 2ae8a5697e Session 56: Full audit — PropLine + boxscore + pipeline + sport coverage (2289 tests)
Research (verified against live MLB Stats / ESPN / The Odds APIs):
- specs/propline-audit.md — every stat_type mapped against our 4-layer pipeline;
  real MLB boxscore fields; sport coverage status; pipeline gap analysis.
- specs/vyndr-roadmap.md — priority-ordered Sessions 57–64 + coverage targets.
- scripts/propline-audit.js + specs/audit-data/ (raw capture).

Headline bug: oddsNormalizer mapped batter_rbis → 'rbis' while the whole
grade/feature/outcome chain keys on 'rbi' — every PropLine RBI prop silently
failed to grade AND settle. Fixed (+ regression test).

Phase 4 — wired missing MLB stats end-to-end:
- PropLine MLB markets 6 → 12 (+runs, walks, doubles, earned_runs, hits_allowed,
  outs — same request, no extra quota).
- doubles/outs/triples added to featureCache + outcomeService MLB_LOG_FIELD and
  all three grade whitelists (analyze/scan/validation.py).

Phase 6 — pipeline resilience:
- opsNotify.js: ntfy alerts (never throws, test-disabled). Snapshot success/
  stale/failure alerts; retry-once on hard odds error (not on empty slate).
- Missed-cron watchdog (mostRecentExpectedSlot/isSnapshotOverdue); status probe
  now returns `overdue`.

Coverage truth: MLB is the only end-to-end-live sport; outcome settlement is
MLB-only (WNBA/NBA/soccer never settle) — documented as the #1 roadmap gap.

Backend 2276 → 2289 tests (+13). Web build exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-10 17:00:29 -04:00

876 lines
21 KiB
JSON

{
"generatedAt": "2026-07-10T20:48:09.307Z",
"sections": {
"proplineInventory": {
"nba": {
"sportKey": "basketball_nba",
"requested": [
{
"market": "player_points",
"stat_type": "points"
},
{
"market": "player_rebounds",
"stat_type": "rebounds"
},
{
"market": "player_assists",
"stat_type": "assists"
},
{
"market": "player_threes",
"stat_type": "threes"
},
{
"market": "player_blocks",
"stat_type": "blocks"
},
{
"market": "player_steals",
"stat_type": "steals"
}
]
},
"wnba": {
"sportKey": "basketball_wnba",
"requested": [
{
"market": "player_points",
"stat_type": "points"
},
{
"market": "player_rebounds",
"stat_type": "rebounds"
},
{
"market": "player_assists",
"stat_type": "assists"
},
{
"market": "player_threes",
"stat_type": "threes"
}
]
},
"mlb": {
"sportKey": "baseball_mlb",
"requested": [
{
"market": "batter_hits",
"stat_type": "hits"
},
{
"market": "batter_home_runs",
"stat_type": "home_runs"
},
{
"market": "batter_total_bases",
"stat_type": "total_bases"
},
{
"market": "batter_rbis",
"stat_type": "rbis"
},
{
"market": "batter_stolen_bases",
"stat_type": "stolen_bases"
},
{
"market": "pitcher_strikeouts",
"stat_type": "strikeouts"
}
]
},
"nfl": {
"sportKey": "football_nfl",
"requested": [
{
"market": "player_pass_yds",
"stat_type": "passing_yards"
},
{
"market": "player_rush_yds",
"stat_type": "rushing_yards"
},
{
"market": "player_reception_yds",
"stat_type": "receiving_yards"
},
{
"market": "player_receptions",
"stat_type": "receptions"
},
{
"market": "player_anytime_td",
"stat_type": "anytime_td"
},
{
"market": "player_pass_tds",
"stat_type": "pass_tds"
}
]
},
"nhl": {
"sportKey": "hockey_nhl",
"requested": [
{
"market": "player_goals",
"stat_type": "goals"
},
{
"market": "player_shots_on_goal",
"stat_type": "shots_on_goal"
},
{
"market": "goalie_saves",
"stat_type": "saves"
}
]
},
"ncaab": {
"sportKey": "basketball_ncaab",
"requested": [
{
"market": "player_points",
"stat_type": "points"
},
{
"market": "player_rebounds",
"stat_type": "rebounds"
},
{
"market": "player_assists",
"stat_type": "assists"
}
]
},
"_allMappedMarkets": [
{
"market": "player_points",
"stat_type": "points"
},
{
"market": "player_rebounds",
"stat_type": "rebounds"
},
{
"market": "player_assists",
"stat_type": "assists"
},
{
"market": "player_threes",
"stat_type": "threes"
},
{
"market": "player_blocks",
"stat_type": "blocks"
},
{
"market": "player_steals",
"stat_type": "steals"
},
{
"market": "player_points_rebounds_assists",
"stat_type": "pra"
},
{
"market": "player_turnovers",
"stat_type": "turnovers"
},
{
"market": "batter_hits",
"stat_type": "hits"
},
{
"market": "batter_home_runs",
"stat_type": "home_runs"
},
{
"market": "batter_total_bases",
"stat_type": "total_bases"
},
{
"market": "batter_rbis",
"stat_type": "rbis"
},
{
"market": "batter_runs",
"stat_type": "runs"
},
{
"market": "batter_stolen_bases",
"stat_type": "stolen_bases"
},
{
"market": "batter_singles",
"stat_type": "singles"
},
{
"market": "batter_doubles",
"stat_type": "doubles"
},
{
"market": "batter_walks",
"stat_type": "walks"
},
{
"market": "batter_strikeouts",
"stat_type": "batter_strikeouts"
},
{
"market": "pitcher_strikeouts",
"stat_type": "strikeouts"
},
{
"market": "pitcher_earned_runs",
"stat_type": "earned_runs"
},
{
"market": "pitcher_hits_allowed",
"stat_type": "hits_allowed"
},
{
"market": "pitcher_outs",
"stat_type": "outs"
},
{
"market": "player_pass_yds",
"stat_type": "passing_yards"
},
{
"market": "player_pass_yards",
"stat_type": "passing_yards"
},
{
"market": "player_pass_tds",
"stat_type": "pass_tds"
},
{
"market": "player_pass_completions",
"stat_type": "pass_completions"
},
{
"market": "player_pass_attempts",
"stat_type": "pass_attempts"
},
{
"market": "player_pass_interceptions",
"stat_type": "interceptions"
},
{
"market": "player_rush_yds",
"stat_type": "rushing_yards"
},
{
"market": "player_rush_yards",
"stat_type": "rushing_yards"
},
{
"market": "player_rush_attempts",
"stat_type": "rush_attempts"
},
{
"market": "player_rush_tds",
"stat_type": "rush_tds"
},
{
"market": "player_receptions",
"stat_type": "receptions"
},
{
"market": "player_reception_yds",
"stat_type": "receiving_yards"
},
{
"market": "player_receiving_yards",
"stat_type": "receiving_yards"
},
{
"market": "player_reception_tds",
"stat_type": "reception_tds"
},
{
"market": "player_anytime_td",
"stat_type": "anytime_td"
},
{
"market": "player_kicking_points",
"stat_type": "kicking_points"
},
{
"market": "player_goals",
"stat_type": "goals"
},
{
"market": "player_shots_on_target",
"stat_type": "shots_on_target"
},
{
"market": "player_shots",
"stat_type": "shots"
},
{
"market": "player_tackles",
"stat_type": "tackles"
},
{
"market": "player_cards",
"stat_type": "cards"
},
{
"market": "player_corners",
"stat_type": "corners"
},
{
"market": "player_saves",
"stat_type": "saves"
},
{
"market": "player_goals_conceded",
"stat_type": "goals_conceded"
},
{
"market": "player_passes",
"stat_type": "passes"
},
{
"market": "team_clean_sheet",
"stat_type": "clean_sheet"
},
{
"market": "player_shots_on_goal",
"stat_type": "shots_on_goal"
},
{
"market": "goalie_saves",
"stat_type": "saves"
}
],
"_hasKeys": false
},
"oddsApiActiveSports": [
{
"key": "americanfootball_cfl",
"group": "American Football",
"title": "CFL"
},
{
"key": "americanfootball_ncaaf",
"group": "American Football",
"title": "NCAAF"
},
{
"key": "americanfootball_ncaaf_championship_winner",
"group": "American Football",
"title": "NCAAF Championship Winner"
},
{
"key": "americanfootball_nfl",
"group": "American Football",
"title": "NFL"
},
{
"key": "americanfootball_nfl_preseason",
"group": "American Football",
"title": "NFL Preseason"
},
{
"key": "americanfootball_nfl_super_bowl_winner",
"group": "American Football",
"title": "NFL Super Bowl Winner"
},
{
"key": "aussierules_afl",
"group": "Aussie Rules",
"title": "AFL"
},
{
"key": "baseball_milb",
"group": "Baseball",
"title": "MiLB"
},
{
"key": "baseball_mlb",
"group": "Baseball",
"title": "MLB"
},
{
"key": "baseball_mlb_world_series_winner",
"group": "Baseball",
"title": "MLB World Series Winner"
},
{
"key": "baseball_npb",
"group": "Baseball",
"title": "NPB"
},
{
"key": "basketball_nba_summer_league",
"group": "Basketball",
"title": "NBA Summer League"
},
{
"key": "basketball_wnba",
"group": "Basketball",
"title": "WNBA"
},
{
"key": "boxing_boxing",
"group": "Boxing",
"title": "Boxing"
},
{
"key": "cricket_international_t20",
"group": "Cricket",
"title": "International Twenty20"
},
{
"key": "cricket_odi",
"group": "Cricket",
"title": "One Day Internationals"
},
{
"key": "cricket_t20_blast",
"group": "Cricket",
"title": "T20 Blast"
},
{
"key": "golf_the_open_championship_winner",
"group": "Golf",
"title": "The Open Winner"
},
{
"key": "lacrosse_pll",
"group": "Lacrosse",
"title": "PLL"
},
{
"key": "mma_mixed_martial_arts",
"group": "Mixed Martial Arts",
"title": "MMA"
},
{
"key": "politics_us_presidential_election_winner",
"group": "Politics",
"title": "US Presidential Elections Winner"
},
{
"key": "rugbyleague_nrl",
"group": "Rugby League",
"title": "NRL"
},
{
"key": "soccer_argentina_primera_division",
"group": "Soccer",
"title": "Primera División - Argentina"
},
{
"key": "soccer_austria_bundesliga",
"group": "Soccer",
"title": "Austrian Football Bundesliga"
},
{
"key": "soccer_brazil_campeonato",
"group": "Soccer",
"title": "Brazil Série A"
},
{
"key": "soccer_brazil_serie_b",
"group": "Soccer",
"title": "Brazil Série B"
},
{
"key": "soccer_china_superleague",
"group": "Soccer",
"title": "Super League - China"
},
{
"key": "soccer_conmebol_copa_libertadores",
"group": "Soccer",
"title": "Copa Libertadores"
},
{
"key": "soccer_conmebol_copa_sudamericana",
"group": "Soccer",
"title": "Copa Sudamericana"
},
{
"key": "soccer_denmark_superliga",
"group": "Soccer",
"title": "Denmark Superliga"
},
{
"key": "soccer_efl_champ",
"group": "Soccer",
"title": "Championship"
},
{
"key": "soccer_england_efl_cup",
"group": "Soccer",
"title": "EFL Cup"
},
{
"key": "soccer_england_league1",
"group": "Soccer",
"title": "League 1"
},
{
"key": "soccer_england_league2",
"group": "Soccer",
"title": "League 2"
},
{
"key": "soccer_epl",
"group": "Soccer",
"title": "EPL"
},
{
"key": "soccer_fifa_world_cup",
"group": "Soccer",
"title": "FIFA World Cup"
},
{
"key": "soccer_fifa_world_cup_winner",
"group": "Soccer",
"title": "FIFA World Cup Winner"
},
{
"key": "soccer_finland_veikkausliiga",
"group": "Soccer",
"title": "Veikkausliiga - Finland"
},
{
"key": "soccer_france_ligue_one",
"group": "Soccer",
"title": "Ligue 1 - France"
},
{
"key": "soccer_germany_bundesliga",
"group": "Soccer",
"title": "Bundesliga - Germany"
},
{
"key": "soccer_germany_bundesliga2",
"group": "Soccer",
"title": "Bundesliga 2 - Germany"
},
{
"key": "soccer_germany_dfb_pokal",
"group": "Soccer",
"title": "DFB-Pokal"
},
{
"key": "soccer_germany_liga3",
"group": "Soccer",
"title": "3. Liga - Germany"
},
{
"key": "soccer_italy_serie_a",
"group": "Soccer",
"title": "Serie A - Italy"
},
{
"key": "soccer_korea_kleague1",
"group": "Soccer",
"title": "K League 1"
},
{
"key": "soccer_league_of_ireland",
"group": "Soccer",
"title": "League of Ireland"
},
{
"key": "soccer_mexico_ligamx",
"group": "Soccer",
"title": "Liga MX"
},
{
"key": "soccer_netherlands_eredivisie",
"group": "Soccer",
"title": "Dutch Eredivisie"
},
{
"key": "soccer_norway_eliteserien",
"group": "Soccer",
"title": "Eliteserien - Norway"
},
{
"key": "soccer_russia_premier_league",
"group": "Soccer",
"title": "Premier League - Russia"
},
{
"key": "soccer_spain_la_liga",
"group": "Soccer",
"title": "La Liga - Spain"
},
{
"key": "soccer_spl",
"group": "Soccer",
"title": "Premiership - Scotland"
},
{
"key": "soccer_sweden_allsvenskan",
"group": "Soccer",
"title": "Allsvenskan - Sweden"
},
{
"key": "soccer_sweden_superettan",
"group": "Soccer",
"title": "Superettan - Sweden"
},
{
"key": "soccer_switzerland_superleague",
"group": "Soccer",
"title": "Swiss Superleague"
},
{
"key": "soccer_uefa_champs_league_qualification",
"group": "Soccer",
"title": "UEFA Champions League Qualification"
},
{
"key": "soccer_usa_mls",
"group": "Soccer",
"title": "MLS"
},
{
"key": "tennis_atp_wimbledon",
"group": "Tennis",
"title": "ATP Wimbledon"
},
{
"key": "tennis_wta_wimbledon",
"group": "Tennis",
"title": "WTA Wimbledon"
}
],
"mlbBoxscore": {
"date": "2026-07-09",
"gamePk": 823359,
"matchup": "Atlanta Braves @ Pittsburgh Pirates",
"battingFields": [
"summary",
"gamesPlayed",
"flyOuts",
"groundOuts",
"airOuts",
"runs",
"doubles",
"triples",
"homeRuns",
"strikeOuts",
"baseOnBalls",
"intentionalWalks",
"hits",
"hitByPitch",
"atBats",
"caughtStealing",
"stolenBases",
"stolenBasePercentage",
"groundIntoDoublePlay",
"groundIntoTriplePlay",
"plateAppearances",
"totalBases",
"rbi",
"leftOnBase",
"sacBunts",
"sacFlies",
"catchersInterference",
"pickoffs",
"atBatsPerHomeRun",
"popOuts",
"lineOuts"
],
"pitchingFields": [
"note",
"summary",
"gamesPlayed",
"gamesStarted",
"flyOuts",
"groundOuts",
"airOuts",
"runs",
"doubles",
"triples",
"homeRuns",
"strikeOuts",
"baseOnBalls",
"intentionalWalks",
"hits",
"hitByPitch",
"atBats",
"caughtStealing",
"stolenBases",
"stolenBasePercentage",
"numberOfPitches",
"inningsPitched",
"wins",
"losses",
"saves",
"saveOpportunities",
"holds",
"blownSaves",
"earnedRuns",
"battersFaced",
"outs",
"gamesPitched",
"completeGames",
"shutouts",
"pitchesThrown",
"balls",
"strikes",
"strikePercentage",
"hitBatsmen",
"balks",
"wildPitches",
"pickoffs",
"rbi",
"gamesFinished",
"runsScoredPer9",
"homeRunsPer9",
"inheritedRunners",
"inheritedRunnersScored",
"catchersInterference",
"sacBunts",
"sacFlies",
"passedBall",
"popOuts",
"lineOuts"
],
"sampleBatting": {
"summary": "1-6 | K, R, SB",
"gamesPlayed": 1,
"flyOuts": 1,
"groundOuts": 1,
"airOuts": 3,
"runs": 1,
"doubles": 0,
"triples": 0,
"homeRuns": 0,
"strikeOuts": 1,
"baseOnBalls": 0,
"intentionalWalks": 0,
"hits": 1,
"hitByPitch": 0,
"atBats": 6,
"caughtStealing": 0,
"stolenBases": 1,
"stolenBasePercentage": "1.000",
"groundIntoDoublePlay": 0,
"groundIntoTriplePlay": 0,
"plateAppearances": 6,
"totalBases": 1,
"rbi": 0,
"leftOnBase": 3,
"sacBunts": 0,
"sacFlies": 0,
"catchersInterference": 0,
"pickoffs": 0,
"atBatsPerHomeRun": "-.--",
"popOuts": 0,
"lineOuts": 2
},
"samplePitching": {
"note": "(W, 2-0)",
"summary": "1.0 IP, 0 ER, 0 K, 0 BB",
"gamesPlayed": 1,
"gamesStarted": 0,
"flyOuts": 1,
"groundOuts": 1,
"airOuts": 2,
"runs": 0,
"doubles": 0,
"triples": 0,
"homeRuns": 0,
"strikeOuts": 0,
"baseOnBalls": 0,
"intentionalWalks": 0,
"hits": 0,
"hitByPitch": 0,
"atBats": 3,
"caughtStealing": 0,
"stolenBases": 0,
"stolenBasePercentage": ".---",
"numberOfPitches": 15,
"inningsPitched": "1.0",
"wins": 1,
"losses": 0,
"saves": 0,
"saveOpportunities": 0,
"holds": 0,
"blownSaves": 0,
"earnedRuns": 0,
"battersFaced": 3,
"outs": 3,
"gamesPitched": 1,
"completeGames": 0,
"shutouts": 0,
"pitchesThrown": 15,
"balls": 6,
"strikes": 9,
"strikePercentage": ".600",
"hitBatsmen": 0,
"balks": 0,
"wildPitches": 0,
"pickoffs": 0,
"rbi": 0,
"gamesFinished": 0,
"runsScoredPer9": "0.00",
"homeRunsPer9": "0.00",
"inheritedRunners": 0,
"inheritedRunnersScored": 0,
"catchersInterference": 0,
"sacBunts": 0,
"sacFlies": 0,
"passedBall": 0,
"popOuts": 1,
"lineOuts": 0
}
},
"espnWnba": {
"count": 3,
"events": [
{
"name": "Golden State Valkyries at Connecticut Sun",
"status": "Scheduled",
"date": "2026-07-10T23:30Z"
},
{
"name": "Dallas Wings at Toronto Tempo",
"status": "Scheduled",
"date": "2026-07-10T23:30Z"
},
{
"name": "Chicago Sky at Los Angeles Sparks",
"status": "Scheduled",
"date": "2026-07-11T02:00Z"
}
],
"completedBoxLabels": null
},
"espnSoccer": {
"league": "usa.1 (MLS)",
"count": 4,
"events": [
{
"name": "Toronto FC at CF Montréal",
"status": "Scheduled"
},
{
"name": "Vancouver Whitecaps at Chicago Fire FC",
"status": "Scheduled"
},
{
"name": "Sporting Kansas City at St. Louis CITY SC",
"status": "Scheduled"
},
{
"name": "Portland Timbers at Seattle Sounders FC",
"status": "Scheduled"
}
]
}
}
}