The cheat sheet — what every number on this site means and how much to trust it.
How to read what this tool outputs. This is a living document — every time we add a signal to the pipeline, we add a section here explaining what it means and how much to trust it. By the end of the season this should be enough for someone to sit down with a week's output and know what they're looking at.
Ground rule from the project brief: this is decision support, not a money-printer. Betting markets are efficient. The honest claim is "here's where my models and the market disagree, and here's my tracked record when that's happened" — nothing more.
We run three independent power-rating spread models on every game and store all three (predictedSpreadSpPlus, predictedSpreadSrs, predictedSpreadYahn).
| SP+ | SRS | Yahn | |
|---|---|---|---|
| Source | Bill Connelly's sheet (CFBD /ratings/sp as fallback) | CFBD /ratings/srs | SP+ backbone + EPA + roster + per-team HFA |
| What it measures | Opponent-adjusted play-by-play efficiency | Opponent-adjusted scoring margin | SP+ adjusted by raw efficiency and roster construction |
| Built to | Predict future performance | Describe what happened | Catch what a single-number preseason rating misses early |
| Coverage | FBS + FCS | FBS + most FCS (once games are played) | FBS (falls back to plain SP+ where a factor is missing) |
| Offense/defense split | Yes (feeds the totals model too) | No | No — spread only |
SP+ and SRS are on the same scale ("points better than an average team"):
predicted_margin = home_rating - away_rating + 2.5 home-field
Yahn keeps SP+ as the backbone and layers on two bounded, time-decaying adjustments, then uses a per-team home-field number instead of the flat 2.5:
Deriving a venue number for all 133 teams from seven years of results didn't work — at that sample size the estimate just measures "favorites don't cover the number," and the home team is nearly always the favorite. (SP+ and SRS keep a flat 2.5.)
The game page shows the full breakdown (SP+ base, EPA adj, roster adj, HFA) for each team. Where Yahn and SP+ disagree by more than ~2 pts, it's the roster/efficiency picture pulling against the preseason number — look at why.
What the backtest found (see docs/CALIBRATION.md). A walk-forward test over 2023–25 (~2,200 games) says Yahn — heuristic or with fitted weights — does not beat the closing line (49–51.5% ATS, break-even 52.4%). The talent / returning / portal factors are already priced in by the market; only EPA/play carries a small residual signal, too small to act on. Yahn is not worse than a plain rating. *So: read Yahn as a third opinion and a breakdown of why a team rates where it does — not as a betting signal.* It does not feed pick generation.
The old "My Top 25" eye-test tool (/rankings) is parked — it's off the nav and doesn't feed anything. The calibration work didn't turn up an edge that would justify hand-weighting a ranking into the model.
They agree (within ~1.5 pts of each other): the rating signal is stable. If that agreed prediction also diverges from the market by a meaningful amount, that's your strongest rating-based case.
They disagree (more than ~3 pts apart): treat the game as lower-confidence and look at why. SRS is driven by margin, so it moves apart from SP+ when a team:
Rule of thumb: when the two models disagree, lean on SP+ for the prediction (it's the predictive one) but lower the confidence and note the SRS gap as a caution flag. When they agree, confidence goes up.
Early season (roughly weeks 1–3): ignore SRS entirely. SRS is computed from games actually played, so it's empty in week 1 and wildly noisy through about week 3 (one blowout swings it 20+ points). Until it settles, the spread signal is SP+ only, and SP+ itself is still mostly preseason projection in weeks 1–2 — so weight all rating-based edges lightly early and lean harder on situational flags and obvious market mispricings.
This SP+/SRS gap is one of the "second independent signal" inputs the brief asks for — a spread edge that both models see is worth more than one either sees alone.
edge = predicted home margin − market home margin (both "+ = home favored").
edge > 0 → model likes the home sideedge < 0 → model likes the away side|edge| = points of disagreementThe "market" number is a real, bettable line — not an average. Books rarely all post the same spread, so the site shows the number the most books are actually posting (the mode), not the median across books. The median can land between books — a "median total" of 58.3 is not a line you could bet, and showing it made picks read like "Over 58.3." The model's own prediction stays exact; only the market side snaps to a number a book really offers.
From the brief: a game is only a pick candidate if |edge| ≥ 2.5 and a second independent signal (SRS agreement, or a situational flag) corroborates it. A lone model disagreement is not a pick.
The model's raw output over/under-values games very differently depending on how big the spread is:
| Market spread | What a model edge there usually means |
|---|---|
| Pick'em to ~ −10 | This is where the market is sharpest and where a real edge is most believable. A corroborated 2.5–4 pt edge here is the bread and butter. |
| ~ −10 to −20 | Still meaningful, but rating noise is larger. Want a bigger edge (3.5+) and corroboration. |
| Bigger than ~ −20 | Mostly ignore the edge. Sportsbooks deliberately shade big favorites down — the public won't lay 40, and backdoor covers / garbage-time swings make the real margin wildly variable. SP+ will almost always say "the favorite should be favored by even more," and that is an artifact, not an edge. Week 1 example: model said Ohio State −60 vs Ball State, market −50.5 → a fake +9.8 "edge." |
Practical rule: an edge on a spread bigger than ~20 points needs to be treated as noise unless something very specific explains it (a key injury the market hasn't priced, weather, etc.). Don't put those on the candidate list.
Weeks 1–2 the SP+ numbers are still mostly preseason projection and SRS doesn't exist. Everything in this section is at its least reliable then. Lean on flags and obvious market mispricings, not rating edges.
How it's built (ModelPrediction.predictedTotal):
combined points at avg pace = (home_off + away_def)/2 + (away_off + home_def)/2
expected possessions = home pace + away pace (drives/game, ~11.6 each)
blended: prior season early, current season as it accrues
predicted total = combined points × (possessions / league-average) − wind adj
The offense/defense split is only good at estimating the combined total — not the margin. So the margin comes from the spread model (SP+), and the total is split around it:
home expected points = (total + spread margin) / 2
away expected points = (total − spread margin) / 2
That means the per-team scores on a game page always add up to the total and differ by exactly the spread. If the spread says home −7.5, the projected score is 7.5 apart.
Caveat for big favorites: the split assumes the favorite scores exactly its share. In reality a big favorite's real margin is a touch less than its raw rating edge (starters rest, clock runs, garbage time feeds the dog) — the same reason books shade favorites down (§2). On lopsided games the underdog's score is floored at ~7 and the implied margin compresses a bit, which is the right direction. Trust the per-team scores most on competitive games.
Big mismatches. When one team is a heavy favorite, the weak team's low SP+ offense drags the model's total down hard, but the market keeps the total up because (a) the favorite alone will score 40+ and (b) garbage-time scoring is real. So the model's biggest "UNDER" edges cluster on blowout games — and those are mostly artifacts, the same way big-favorite spread edges are (§2). Week 1 example: model said Ball State / Ohio State 45, market 56.5 — the model is wrong there, not the market. Trust totals edges most on competitive games (spread inside ~14).
predictedPossessions in the low 20s = a slow, grind-it-out game (two run-heavy teams, e.g. anything with Air Force or Army — ~19–20). Mid-20s = fast (Texas Tech, Ole Miss, Coastal Carolina games run 25–27). A pace mismatch the market underrates is one of the few repeatable totals edges.
Weather table, from Open-Meteo — free, no key)Pulled per game as a snapshot (never overwritten), so you can see the forecast drift from Tuesday to Saturday. Indoor games are skipped entirely. Stored: temperature + "feels like", humidity, wind (sustained + gust), precipitation probability, and rain / snowfall rate at kickoff. When a forecast is genuinely extreme it also raises a weather chip on the game — see §5.
What actually moves a number:
| Condition | Effect |
|---|---|
| Wind ≥ 15 mph sustained | The one weather factor that reliably matters. Suppresses passing and field goals → lean the total UNDER. ≥ 20 mph is a strong under signal. Barely affects the spread. |
| Wind 10–15 mph | Minor. Note it, don't act on it alone. |
| Heavy rain / snow | Modest under lean; also nudges toward the run-heavier team ATS. Overrated by the public — the wind that usually comes with it matters more than the precipitation. |
| Cold (< 25°F) | Small under lean, mostly priced in for teams that always play in it. |
| Heat (> 90°F) | Marginal; slight edge to the better-conditioned / deeper team late. |
Rule: weather is a totals input first, a spread tiebreaker a distant second. A calm 70°F forecast carries no signal — most games look like that.
We used to pull ESPN's unofficial college-football injury feed, but it never returned a single impact-player report all season, so it was removed (Sept 2026) rather than show a section that was always empty. Check injury news yourself before acting on an edge. The one injury that always matters is a starting QB ruled out — that can be worth 7–14 points, and the model knows nothing about it.
Flags are corroborating signals, never the prediction itself. A flag on its own is not a reason to bet. The way to use them: when the spread model already shows an edge of 2.5+ points, a flag pointing the same direction is the second independent signal the brief requires to call it a pick candidate.
They're computed per team per game and stored in GameFlag. Thresholds are deliberately conservative — we'd rather miss a soft flag than raise a false one.
| Flag | Exact rule | What it tells you |
|---|---|---|
short_week | Fewer than 6 days since this team's previous game (e.g. a Saturday team playing the next Thursday/Friday). | Less practice and recovery time. Historically a small negative for the team on the short week, more so if they also traveled. |
off_bye | A skipped week on the schedule — the team's previous game was two or more week-numbers ago (a true bye, not just the stretched-out Week 1 window). | Extra prep time. Usually a small positive, especially for the better-coached team and for underdogs who get a week to game-plan. |
travel | This team's home stadium is ≥ 1,200 miles from the game venue, or the body-clock timezone shift is ≥ 2 hours. Detail carries the exact miles and hour shift. | Long trips and big time-zone jumps (especially West→East for a morning kick) are a documented small drag on the traveling team. |
revenge | This team lost the last meeting (within the last 2 seasons), that loss was a rivalry game or by ≤ 10 points (a close one they let slip, not a blowout by a better team), and this year's game is projected within 14 points (close enough for motivation to matter). Detail carries the date and margin. | The "one that got away" angle. Real effect is modest and the market prices some of it — a tiebreaker, not a driver. |
lookahead | This team is at least decent, favored by ≥ 13 points (SP+ model) this week, and next week they play a rivalry game or a genuinely tough opponent (projected within ~6 points). | Classic trap: a good team with one eye on next week's big game can come out flat. Fade this team / take the points. |
letdown | Last week this team won a game that was either a rivalry or against a team rated within 3 SP+ points (an emotional, "played up" win) and this week's opponent is rated ≥ 10 SP+ points weaker. | Emotional hangover after a big win, against a team they may overlook. Fade this team / take the points. |
bad_spot | Two or more of travel / lookahead / letdown / short_week stacked on the same team (e.g. a long trip on a short week). A rollup — the red chip. | The genuinely nasty spots — ~1 per week. Backtests ~57% ATS on the fade (small sample). Take the points against this team. Filter the board to these with the bad spot flag chip. Does not corroborate picks (its components already do). |
Not every chip is a situational flag. A card can also show:
| Chip | Colour | Source | What it means |
|---|---|---|---|
steam | amber (help) | market (§9) | The consensus spread made a fast, synchronized move toward this team across books — real money came in on them quickly. |
reverse line move (rlm) | red (hurt) | market (§9) | In the last ~30 h the book's number moved toward this team while the Kalshi market (real money, no vig) didn't follow. Looks like public money, not a real shift — lean the other side. |
fast pace (fast_pace) | blue | totals model | The game projects to ≥ 26 possessions — an up-tempo matchup. Shown when it's the second signal behind an OVER pick. |
slow pace (slow_pace) | blue | totals model | The game projects to ≤ 21 possessions — a grind. Shown when it's the second signal behind an UNDER pick. |
The blue chips are totals corroboration only — they never touch a spread pick, and on their own they are not a reason to bet. steam / rlm get their full treatment in §9.
Raised when the kickoff forecast is genuinely extreme for football — a handful of games a week in the hot early season and the cold late one, near-zero in between. They hit both teams, so they're a "conditions" heads-up, not a fade-this-team signal. Weather is already baked into the totals model (§3–4); these chips just make the notable games easy to spot. Not pick corroborators, not graded.
| Chip | Fires when | Football effect |
|---|---|---|
extreme heat (heat) | "feels like" (heat index) ≥ 100°F at kickoff | Late-game legs and depth matter more; offenses stall in the 4th. Small UNDER lean. |
extreme cold (cold) | "feels like" (wind chill) ≤ 15°F | Catching and kicking get hard, FG range shrinks → UNDER + the run, and the cold-weather side over a warm-weather visitor. |
wind | sustained ≥ 20 mph or gusts ≥ 35 | The biggest weather factor — passing and kicking suffer badly. Strong UNDER lean; shootout scripts are unlikely. |
heavy rain (rain) | steady rain ≥ 3 mm/hr and above freezing | Fumbles up, passing down → the run, the more physical team, and the UNDER. |
snow | snow falling ≥ 0.5 cm/hr, or near-freezing with a high precip chance | Highest-variance weather: heavy UNDER pressure, kicking chaos, ball-security problems. Often the points with the dog. |
What the backtest found (2021–25,docs/CALIBRATION.md). Betting a flag's implied side vs the close: -travelis the best single flag — 54.8% ATS (n=425). - The "fade" flags together (travel/lookahead/letdown) run ~53%, but that's flat in 2021–22 and only shows up in 2023–25 — a weak, unstable lean. - The "help" flags (off_bye,revengeas a straight bet) show nothing (~51%). - As corroboration for a rating edge,travel(60%) andrevenge(56%) carry the signal;short_weekcorroboration is counterproductive (39%) andoff_byeis dead. Net:travel(and to a lesser extentrevenge,letdown,lookahead) is worth respecting as a lean.short_weekandoff_byeare not — andshort_weekshould probably be dropped as a corroborator.
Most model disagreements never become picks. A game is logged in the Pick table only when all of these hold:
Spread pick
|edge| ≥ 2.5 points (model home margin vs. market home margin).travel, lookahead, letdown) on the team we're fading, or the "helps" flag (revenge) on the team we're backing. short_week and off_bye are still shown on the board but no longer corroborate a pick — they graded below break-even in backtesting (short_week corroboration ~39% ATS, off_bye ~50%) and were dropped from this list.Total pick
|edge| ≥ 3.5 points (totals are noisier — higher bar).method on the pick says what corroborated it: consensus = both rating models, sp_plus = SP+ plus a flag or pace signal. flagsPresent lists the specific corroborators.
A pick is logged once, the first time it qualifies, with the model line, market line, and edge frozen as of that moment. It is never rewritten — that's what makes the grading honest. The market line it's frozen at is a real number a book was posting at that moment (§2), so it stays gradeable against a real closing line later.
Picks wait for Bill C. From week 2 on, a pick is only logged once Bill Connelly's sheet has been uploaded for that week (load-billc) and both teams' SP+ comes from it. Before that, the week's ratings are filled from CFBD's SP+ feed, so the board and game pages still show model lines and edges — treat those as provisional; none of them becomes a pick. The hold lifts on its own: the first pipeline run after the upload logs whatever qualifies. A team his sheet doesn't cover that week (an unresolved name) stays on CFBD's number and its games stay pick-free. (Week 1 is exempt: everyone, the market included, is working off preseason info then.)
Expect few picks — often 0–4 a week, sometimes zero. Early in the season there are fewer still, because the SRS corroborator isn't available yet. That's the design working, not a bug. A week with no picks means the model and the market agreed everywhere that mattered.
After the games, grade-picks fills in each pick's actual result and grades it two ways:
ATS (against the spread) — did the pick win, lose, or push against the number we logged it at? This is the bottom-line scoreboard, but it's noisy: a good process goes through 3–4 win and 3–4 loss stretches by chance all the time. One season of ATS record proves very little.
CLV (closing-line value) — how many points better our number was than the closing line, from our side. Example: we logged Duke −9.5 and it closed Duke −11 → +1.5 CLV (we'd have had to lay 11 at close; we got 9.5).
CLV is the number that actually matters. The closing line is the sharpest price the market produces; if our picks consistently beat it, the process is finding real value, regardless of that season's win/loss variance. Positive average CLV with a break-even ATS record is a good sign. Negative CLV with a winning record is probably luck. Watch the CLV.
/grades is the wider version of the same idea: every spread model (SP+, SRS, Yahn) and every flag, graded against the closing line on every final game — not just the games that became logged picks. Each row is a season-to-date ATS record and win %, with 52.4% as the break-even mark.
This is the honest, hindsight-free scoreboard for the whole tool. The backtests (CALIBRATION.md) say to expect everything to hover around 50% — the Grades page is where we find out if the live 2026 season agrees. Small samples early; one week is noise. Look at where things sit by mid-season on 100+ games.
On each game page, current season to date, for both teams:
| Split | What it is |
|---|---|
| ATS overall | record against the closing spread |
| ATS at home / on the road | same, split by venue |
| ATS as favorite / as underdog | same, split by which side of the number they were |
| ATS after a win / after a loss | the next game's ATS result, bucketed by the previous game's straight-up result — the "bounce-back / letdown" angle in raw form |
| W–L at home / on the road | straight-up record by venue (not ATS) |
| Over / Under | how often the game's total went over vs under the closing number |
Amber = an outlier: a split where the team is ≥ 65% or ≤ 35% ATS with at least 8 games. Anything short of that is just noise and isn't highlighted.
How to use them: context, not a signal. A team that's 9–3 ATS as a favorite tells you the market has been slow to catch up to them — worth knowing when the model also likes that side. It is not a reason to bet on its own, and ATS records regress hard: last year's 10–3 ATS team is a coin flip this year. Treat an outlier the same way you'd treat a situational flag — a tiebreaker that adds confidence when it points the same way as the model, nothing when it doesn't.
Early in the season every split reads "–" until a team has played enough games.
Two flags come from the betting market itself, not the schedule. They show as purple chips.
steamThe consensus spread made a fast, synchronized move toward one team — ≥ 1.5 points across most books within a few hours. That's the fingerprint of real money hitting the market quickly (a syndicate, a respected source). It fires on the team the line moved toward. Following steam late is usually a losing play — the value's already gone — but it tells you which side the sharp money is on, which is useful as a corroborator or a "don't fade this" signal.
pull-lines snapshots the board every ~4 h during game windows (every 25 min in the Saturday 9a–8p core), which is enough to see these moves — steam and rlm both fire in a normal week. The one gap: a fast move that starts and finishes inside a single 4 h window on a Thursday or Friday can be missed.
Backtest note. Using open→close as a stand-in for line movement, neither following nor fading the move beats the close (49.5% / 50.5%, n=2,077). By definition the closing number already contains the move — the only value in "steam" is catching it before the close. Treat steam as a "which side is the sharp money on / don't fade this" signal, not a bet trigger.
rlm (reverse line movement)Within the last ~30 hours, the sportsbook's number moved toward one team while the Kalshi prediction market (real money, no vig, CFTC-regulated) didn't move with it — on a market with real volume (≥ 500 contracts).
The read: the line drifting toward this team looks like public money, not new information — the sharp, no-vig market isn't re-rating the game. Lean the other side. The flag fires on the team the book moved toward (the one to fade).
The window matters: a line that settled 2 points off a soft opener on Tuesday and then held is not rlm — that's price discovery, and by Friday it's old news. rlm only fires while the divergence is live. (A standing book-vs-Kalshi gap that isn't moving is a different idea — a "fair-value gap" — not yet built.)
Kalshi's win-probability is converted to an implied spread with a normal model (σ ≈ 13.5, the historical SD of a CFB result); we compare movement over the window, not exact numbers, so the conversion doesn't need to be perfect.
Both flags are corroborators, not the pick. rlm against a team the model already dislikes, or steam toward a team the model likes, is a green light. Pointing the other way, they cancel — stand down.
Everything runs automatically. A scheduler ("the tick") fires every ~30 minutes, checks the clock and how stale each source is, and refreshes what's due. Times below are US Central. Full detail is in docs/OPERATIONS.md.
| When | What updates |
|---|---|
| Every ~30 min, 8am–10pm CT (Saturday until 2am) | Kalshi, market flags, model + picks re-run. Nothing updates overnight. |
| Game windows (all week except Tue) | Live scores + grading — a final is graded within ~30 min. Line snapshots every ~30 min in the Saturday 9a–8p core, every ~2–3 h otherwise. A game's last snapshot before kickoff is its closing line — we stop recording once it starts (the book's live in-game price is not a market line). |
| Tuesday ~9am | grade last week, then ratings / polls / schedule / advanced stats + EPA / opening lines / Kalshi / situational flags / model / picks |
| Sunday ~10am | advanced-stat checkpoint, team trends |
| ~8am & ~4pm | Weather forecast + weather flags |
| Preseason (manual) | Talent composite, returning production, transfer portal, per-team HFA |
Opening numbers land Tuesday; lines, scores and grades then refresh through every game window. A pick is only ever logged before kickoff, and a game is graded as soon as it's final — the Grades page is current within the hour on a Saturday.
One caveat on freshness: the pages cache their database results for a short window — about 2 minutes for the board and game pages, 10–15 minutes for /grades and /picks (they only change after a final). So a hard refresh right after a score changes may show the old number for a beat. The /admin freshness panel is never cached — it's the ground truth for "did the pipeline actually run?"
The watch guide (/watch) is the exception during a slate: it reads live scores straight from ESPN's public scoreboard on every refresh (not from our DB, not the pipeline), so its scores and re-ranking are near-real-time — see §11.
The line-snapshot cadence is sized to stay inside The Odds API's 500-credit monthly budget even in a five-Saturday peak month — October 2026 is the worst case (5 Thursdays + 5 Fridays + 5 Saturdays) and lands around 92%, with every Saturday including the 31st fully covered. pull-lines also carries a hard backstop that stops calling the API once the month's remaining credits fall below 15, as protection against manual runs or an unusual bowl stretch. The /admin panel shows the live balance.
bad spot, travel, revenge, lookahead, letdown, short week, off bye), market (steam, reverse line), or weather (heat, cold, wind, rain, snow) — to show only games where a team carries it; the number on each chip is how many games this week. Only flags with games appear. Tap again or hit clear to reset. Works with the search box (search within the filtered set).Duke -7.5 → -9.5, or a dog +7.5 → +9.5. ▼ red = it shrank toward pick'em: Duke -9.5 → -7.5. So both sides of the number behave the same way — bigger is up, smaller is down.steam / rlm, which read the move)./watch)A different kind of tool — not decision support for betting, but a plan for which games to actually put on a quadbox for a day of watching. It slices the day into windows ("11:00 AM CT," "3:15 PM CT," …) and shows the 4 best games live in that window, ranked by a 0–100 watchability score:
| Signal | Weight | What it rewards |
|---|---|---|
| Projected competitiveness | 40% | a market spread near pick'em |
| Ranked-team stakes | 30% | an AP-ranked team, more for two |
| Projected pace | 15% | a high total (shootout potential) |
| Rivalry | 15% | a known rivalry matchup (flat bonus) |
FBS-vs-FCS games are capped low regardless (almost always lopsided). A huge market spread (24+ pts) gets flagged "likely blowout" even if it still cracks a weak window — the reasons chip on each card always says why it's there.
On top of the weighted score, a small upset-watch bonus is added for a team carrying a fade-prone situational flag — bad_spot +10, lookahead / letdown +5, revenge +3 (see §5). The market says one thing; these say the favorite might not show up, which is its own kind of watchable. Each card shows the actual spread and total (not just a reasons blurb), the projected pace in possessions, and every situational/market/weather flag on the game — the same chips as the board, so you can see why a game scored the way it did.
A window only changes when the actual top-4 changes — a game starting or ending elsewhere doesn't reshuffle the board on its own. It assumes a fixed ~3h40m game length and clusters kickoffs within 45 minutes into one window.
Once games kick off, the guide pulls live scores from ESPN's public scoreboard (on page load and on each refresh — never stored, never in the pipeline) and adjusts the watchability score by what's actually happening:
| Live state | Adjustment |
|---|---|
| One-score game (≤ 8) | +12 rising to +36 as the game goes late |
| Within two scores (≤ 16) | +2 → +7 |
| Pulling away (17–24) | −6 → −18 |
| Blowout (25+) | −16 → −46 (benched) |
| Overtime | +36 |
| Final | −70 (drops to the bench with the result) |
The late-game ramp means a 1st-quarter score barely moves the board (it hasn't told us much yet); a one-score 4th quarter rockets to the top. So a projected blowout that's 24–21 late will jump onto the quadbox, and a "toss-up" that's 35–3 at halftime drops off it. The live status leads the reasons on each card (one-score game (24–27) · 3:12 4th), and a green ● LIVE badge shows ESPN's clock.
When any game is in progress (or kickoff is within ~45 min), an auto-refresh control appears at the top of the page — on by default, refreshing every 60s, with a manual ↻ button and an on/off toggle. Off-slate, none of this runs and the guide is a pure pregame plan.
As the day goes on, once a later window has started the finished windows collapse into a "earlier windows today" roll-up at the top — so mid- afternoon you're looking at what's on now and next, not the noon slate. (Only on today's date; past and future days show every window.)
| Term | Meaning |
|---|---|
| ATS | Against the spread. A bet/record measured against the point spread, not who won outright. |
| SU | Straight up. Who won the game, ignoring the spread. |
| O/U | Over/under — the total points line. |
| push | A tie against the number — the bet neither wins nor loses. Shown as the third figure in a record (6–2–1). |
| cover | A side "covers" when it beats the spread (a −7 favorite that wins by 10 covers; by 3 does not). |
| break-even (52.4%) | The win rate you need at standard −110 odds just to not lose money (risk 110 to win 100). |
| edge | Predicted margin − market margin, in points. How far the model disagrees with the line. The market side is the most-posted real book number (§2), not an average. |
| line movement | How far a spread or total has moved from the first number we recorded to now. Shown as a ▲/▼ chip on each card; the full history is on the game page. |
| MAE | Mean absolute error — the average size of the miss between a predicted margin and the actual result. Lower = more accurate. The Grades page shows each model's MAE next to the closing line's own MAE on the same games (~12 points over a full season) — green means the model out-predicted the market. Note: beating the market on MAE is not the same as beating it ATS. |
| CLV | Closing-line value — how many points better your number was than the closing line, from your side. The single best indicator that a process is finding value. |
| the close / closing line | The final line right before kickoff — the sharpest price the market makes. Everything here is graded against it. |
| SP+ | Bill Connelly's tempo- and opponent-adjusted efficiency rating (points better than average). Predictive. |
| SRS | Simple Rating System — opponent-adjusted average scoring margin. Descriptive; empty until ~week 3. |
| EPA | Expected points added (per play) — how much each play changed the team's expected points. A raw efficiency measure. |
| PPA | CFBD's name for EPA (predicted points added). Same thing. |
| HFA | Home-field advantage, in points. Flat 2.5 for SP+/SRS; per-venue (2.7 + altitude/hostile bump) for Yahn. |
| HFA base / altitude / hostile | The three parts of the Yahn per-team home number (see §1). |
| RLM | Reverse line movement — the book's number moves toward the side the public is betting while the sharp signal points the other way. |
| steam | A fast, synchronized line move across books — the fingerprint of sharp money hitting quickly. |
| talent composite | The 247Sports team talent number — accumulated recruiting rankings, a proxy for raw roster ability. |
| returning production | The share of last year's output (measured in EPA) that's back this season — a continuity/experience measure. |
| portal net | Transfer-portal value in minus value out, per team — captures roster churn the preseason ratings underweight. |
Source: docs/INTERPRETATION_GUIDE.md. Decision support, not a guarantee.