Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 80 additions & 0 deletions PLAN.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
# BS Pod Over/Unders

## Status

Canonical CSV, dbt model/tests, Evidence queries, the NFC summary page, sidebar ordering, and conditional pick formatting are implemented. The full pipeline and Evidence production build pass. Local preview is running on `feature/bs-pod-over-unders`.

## Goal

Show what Bill Simmons and Cousin Sal picked for each NFC team's regular-season win total, then track those picks live and settle them after the regular season.

## Scope decisions

- Cover the current 2026 NFC season only.
- Use a one-time, manually reviewed transcript extraction.
- Keep one canonical Bill pick and one canonical Sal pick per team.
- Retain episode date and transcript or episode URL for provenance.
- Require manual review for ambiguous or conflicting transcript statements; never guess.
- Compare picks against regular-season wins.
- Show live status as `On track` or `Behind`.
- Count only settled picks in Bill and Sal's aggregate records. Track open picks and pushes separately.
- Keep the picks in one place on the current-season, NFC-only `BS Pod Over/Unders` summary page.

## Canonical CSV

Proposed path: `data/nfl/bs_pod_over_unders.csv`

Required columns:

```text
season,speaker,team,pick,line,episode_date,episode_url
```

Field rules:

- `season`: integer season start year, currently `2026`.
- `speaker`: `Bill Simmons` or `Cousin Sal`.
- `team`: exact long team name used by the existing NFL ratings source.
- `pick`: `over` or `under`.
- `line`: numeric win-total line, preserving decimal values.
- `line` is the common market line for the segment; alternate lines mentioned in discussion are not canonical.
- `episode_date`: ISO date.
- `episode_url`: canonical source URL.
- Exactly one row per `(season, speaker, team)` after review.
- No transcript quote is required in the app; provenance is episode/date/link only.

## Status and settlement logic

- Required wins for an over are strictly greater than the line.
- Required wins for an under are strictly less than the line.
- Final equality is a push.
- Before the season ends, `On track` means current completed wins are already on the selected side of the line; otherwise show `Behind`. A pick remains open until the regular season is complete.
- Aggregate speaker records count only settled wins, losses, and pushes; open picks are displayed separately.

## Implementation outline

1. Use the supplied current-season NFC transcript and manually extract both speakers' explicit win-total picks.
2. Review ambiguous rows and normalize every team to the existing NFL team names.
3. Add the reviewed CSV as a DuckDB/dbt source under `data/nfl`.
4. Add a dbt model that validates the canonical rows, joins current regular-season wins, and computes live and final statuses.
5. Add Evidence queries for the summary scoreboard, projected wins, and pick statuses.
6. Add `evidence/pages/nfl/bs-pod-over-unders.md` for the current-season scoreboard.
7. Set the NFL sidebar order and conditionally format the Bill and Sal pick cells.
8. Verify CSV cardinality, dbt models, full pipeline, and Evidence production build.

## Acceptance criteria

- All 16 NFC teams have one reviewed Bill row and one reviewed Sal row, for exactly 32 rows.
- Every row has a valid `over`/`under` pick, numeric line, canonical team, episode date, and source URL.
- The summary page shows both picks, lines, projected wins, live status, and provenance link.
- The summary page shows Bill and Sal settled wins, losses, pushes, open picks, and all team rows.
- Live statuses update from the existing regular-season results data.
- Final equal-to-line outcomes are represented as pushes.
- The existing NBA/NFL pipeline and Evidence build continue to complete successfully.

## Explicit non-goals

- Automated transcript fetching or parsing.
- Historical seasons.
- ROI or betting-profit calculations.
- Verbatim transcript quotes in the UI.
33 changes: 33 additions & 0 deletions data/nfl/bs_pod_over_unders.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
season,speaker,team,pick,line,episode_date,episode_url
2026,Bill Simmons,Philadelphia Eagles,over,10.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Cousin Sal,Philadelphia Eagles,under,10.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Bill Simmons,Dallas Cowboys,over,9.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Cousin Sal,Dallas Cowboys,under,9.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Bill Simmons,New York Giants,under,7.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Cousin Sal,New York Giants,under,7.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Bill Simmons,Washington Commanders,under,7.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Cousin Sal,Washington Commanders,over,7.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Bill Simmons,Detroit Lions,over,10.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Cousin Sal,Detroit Lions,under,10.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Bill Simmons,Green Bay Packers,under,9.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Cousin Sal,Green Bay Packers,over,9.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Bill Simmons,Chicago Bears,over,9.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Cousin Sal,Chicago Bears,under,9.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Bill Simmons,Minnesota Vikings,under,8.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Cousin Sal,Minnesota Vikings,under,8.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Bill Simmons,Tampa Bay Buccaneers,over,8.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Cousin Sal,Tampa Bay Buccaneers,under,8.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Bill Simmons,New Orleans Saints,over,7.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Cousin Sal,New Orleans Saints,under,7.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Bill Simmons,Atlanta Falcons,under,7.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Cousin Sal,Atlanta Falcons,under,7.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Bill Simmons,Carolina Panthers,over,6.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Cousin Sal,Carolina Panthers,over,6.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Bill Simmons,Los Angeles Rams,under,11.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Cousin Sal,Los Angeles Rams,over,11.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Bill Simmons,Seattle Seahawks,over,10.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Cousin Sal,Seattle Seahawks,over,10.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Bill Simmons,San Francisco 49ers,over,9.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Cousin Sal,San Francisco 49ers,over,9.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Bill Simmons,Arizona Cardinals,under,3.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
2026,Cousin Sal,Arizona Cardinals,under,3.5,2026-08-28,https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house
39 changes: 39 additions & 0 deletions evidence/pages/nfl/bs-pod-over-unders.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
---
queries:
- pod_picks: nfl/bs_pod_over_unders_summary.sql
- pod_records: nfl/bs_pod_over_unders_records.sql
title: BS Pod Over/Unders
sidebar_position: 4
---

# 2026 NFC BS Pod Over/Unders

Bill Simmons and Cousin Sal's regular-season win-total picks for the NFC. `Proj wins` is the current simulation average; `Proj` shows whether that projection is over or under the listed win total. Picks remain open until the regular season is complete. `On track` means the current win total is already on the selected side of the line.

[Episode transcript](https://podscripts.co/podcasts/the-bill-simmons-podcast/the-annual-nfc-overunders-with-bill-simmons-cousin-sal-and-joe-house)

## Aggregate Records

<DataTable data={pod_records} rows=2>
<Column id=speaker title="Picker"/>
<Column id=settled_wins title="Settled wins"/>
<Column id=settled_losses title="Settled losses"/>
<Column id=settled_pushes title="Settled pushes"/>
<Column id=open_picks title="Open picks"/>
<Column id=on_track title="On track"/>
<Column id=behind title="Behind"/>
</DataTable>

## Team-by-Team Picks

<DataTable data={pod_picks} rows=16>
<Column id=division/>
<Column id=team/>
<Column id=win_total title="Win total"/>
<Column id=proj_wins title="Proj wins"/>
<Column id=proj title="Proj"/>
<Column id=bill_pick title="Bill pick"/>
<Column id=bill_status title="Bill status" align=center contentType=colorscale scaleColumn=bill_status_score colorMin=-1 colorMax=1 colorScale={['#9fadbd', '#0777b3']}/>
<Column id=sal_pick title="Sal pick"/>
<Column id=sal_status title="Sal status" align=center contentType=colorscale scaleColumn=sal_status_score colorMin=-1 colorMax=1 colorScale={['#9fadbd', '#0777b3']}/>
</DataTable>
2 changes: 1 addition & 1 deletion evidence/pages/nfl/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ title: NFL Sim

<center>

🏈 [Teams](/nfl/teams) 🏈
🏈 [Teams](/nfl/teams) · [BS Pod Over/Unders](/nfl/bs-pod-over-unders) 🏈

</center>

Expand Down
1 change: 1 addition & 0 deletions evidence/pages/nfl/predictions.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ queries:
- past_games_summary_by_team: nfl/past_games_summary_by_team.sql
- future_games: nfl/future_games.sql
- teams: nfl/all_teams.sql
sidebar_position: 3
---

# Predictions
Expand Down
13 changes: 13 additions & 0 deletions evidence/queries/nfl/bs_pod_over_unders_records.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
select
speaker,
count(*) filter (where regular_season_complete and final_result = 'Win') as settled_wins,
count(*) filter (where regular_season_complete and final_result = 'Loss') as settled_losses,
count(*) filter (where regular_season_complete and final_result = 'Push') as settled_pushes,
count(*) filter (where not regular_season_complete) as open_picks,
count(*) filter (where not regular_season_complete and live_status = 'On track') as on_track,
count(*) filter (where not regular_season_complete and live_status = 'Behind') as behind
from src_nfl_bs_pod_over_unders
where season = 2026
and conf = 'NFC'
group by speaker
order by speaker
40 changes: 40 additions & 0 deletions evidence/queries/nfl/bs_pod_over_unders_summary.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
with team_picks as (
select
team,
max(division) as division,
max(line) as win_total,
max(pick) filter (where speaker = 'Bill Simmons') as bill_pick,
max(live_status) filter (where speaker = 'Bill Simmons') as bill_status,
max(pick) filter (where speaker = 'Cousin Sal') as sal_pick,
max(live_status) filter (where speaker = 'Cousin Sal') as sal_status
from src_nfl_bs_pod_over_unders
where season = 2026
and conf = 'NFC'
group by team
)
select
p.team,
p.division,
p.win_total,
round(r.avg_wins, 1) as proj_wins,
case
when r.avg_wins is null then null
when r.avg_wins > p.win_total then 'over'
when r.avg_wins < p.win_total then 'under'
else 'push'
end as proj,
p.bill_pick,
p.bill_status,
case
when p.bill_status = 'On track' then 1
when p.bill_status = 'Behind' then -1
end as bill_status_score,
p.sal_pick,
p.sal_status,
case
when p.sal_status = 'On track' then 1
when p.sal_status = 'Behind' then -1
end as sal_status_score
from team_picks p
left join src_nfl_reg_season_summary r on r.team = p.team
order by p.division, p.team
1 change: 1 addition & 0 deletions evidence/sources/mdsbox/nfl/src_nfl_bs_pod_over_unders.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
select * from nfl_bs_pod_over_unders
67 changes: 66 additions & 1 deletion transform/models/_nfl_docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,69 @@ models:
- not_null
- name: win_total
tests:
- not_null
- not_null
- name: nfl_bs_pod_over_unders
description: Current-season Bill Simmons and Cousin Sal NFC win-total picks with live settlement status.
tests:
- dbt_utils.unique_combination_of_columns:
combination_of_columns:
- season
- speaker
- team
columns:
- name: season
tests:
- not_null
- name: speaker
tests:
- not_null
- accepted_values:
values: ['Bill Simmons', 'Cousin Sal']
- name: team
tests:
- not_null
- name: conf
tests:
- not_null
- accepted_values:
values: ['NFC']
- name: division
tests:
- not_null
- name: pick
tests:
- not_null
- accepted_values:
values: ['over', 'under']
- name: line
tests:
- not_null
- name: episode_date
tests:
- not_null
- name: episode_url
tests:
- not_null
- name: games_played
tests:
- not_null
- name: scheduled_games
tests:
- not_null
- name: current_wins
tests:
- not_null
- name: current_losses
tests:
- not_null
- name: current_ties
tests:
- not_null
- name: regular_season_complete
tests:
- not_null
- name: live_status
tests:
- not_null
- accepted_values:
values: ['On track', 'Behind', 'Win', 'Loss', 'Push']
2 changes: 2 additions & 0 deletions transform/models/_sources.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ sources:
description: nfl schedule
- name: nfl_team_ratings
description: nfl team ratings from vegas
- name: bs_pod_over_unders
description: Bill Simmons and Cousin Sal NFL win-total picks
- name: ncaaf
schema: psa
meta:
Expand Down
Loading
Loading