This article is part of the SaskPoly story. Read how it all started.
The Loop, Part 3: The Rules — How a Cold Model Picks Bets Without Lying
The five mechanical rules that turn prediction rows into a daily card — edge floor, EV gate, longshot floor, quarter-Kelly, three bets max — and the two nights that shaped them: the discovery that a third of graded home wins were tickets that should have lost, and the honest accounting decision to keep them.
The ledger is full of numbers. Numbers are cheap. The expensive question is which of them earn a place on the daily card, and the answer is a short list of mechanical rules — five of them, none requiring taste, all public. This post is that list, and then the two nights that explain why the list looks the way it does.
The selection path, as written
Every tick, select.py turns the ledger's open rows into a suggested card.
v1 is rules-based on principle: transparent beats clever while the model is
uncalibrated. The rules, in order:
- Edge floor: 3.0 points. Only rows where our probability beats the market's by three points or more. Below that, we are noise-trading.
- EV gate: positive expected value at the actual price. A row can clear the edge floor and still be a bad ticket if the odds are short. The gate rejects mirages. (This one was added the hard way — see below.)
- Longshot floor: 40%. We drop any pick where our own probability is below 40%. Cold models are rarely calibrated on longshots, and the Brier score punishes confident wrongness hardest exactly there. See Part 2 for why that punishment is structural, not vibes.
- Sizing: quarter-Kelly × 20, capped at 2 units, rounded to quarters. Confidence expressed as stake, mechanically derived from edge and price. The render phase stamps the stake on the carded row at publish time — first publish wins, so a later line move cannot rewrite what the sheet showed.
- Three bets per day, maximum. Edge quality decays fast past the top few. A fourth bet is almost always the model finding noise and calling it an opinion.
Playoff stakes — must-win games, clinch scenarios — surface on the card as flagged context, never as automatic boosts. If must-win teams are mispriced, the ledger will eventually prove it with graded rows, and then motivation becomes a number. Until then it is an argument, and arguments belong in the Case columns, not the stake column.
Night one: the ticket that was priced wrong all season
On 2026-10-04 the grading rule got confirmed by the human who actually stands at the window: the PRO•LINE moneyline in baseball is a three-way market — visitor, tie, home — and the tie is not a draw. The tie is the game decided by exactly one run. The conventional moneyline, the one that pays on any win, is a different product with a different name on the same board: the ±0.5 run line.
The ledger had been pricing the home leg of the three-way as if it were the two-way all season. The audit against real finals was ugly and specific: 28 of 87 graded home wins were one-run games. Twenty-eight tickets the sheet had counted as winners would have lost at the window, because on a one-run home win the tie leg cashes, not the home leg. Restated against the prices actually available, season-to-date went from +19.91 units as graded to −43.11 units at the window. The calibration was never affected — a home-win probability is well-defined either way — but the ticket pricing was wrong, and ticket pricing is where money lives.
The fix shipped the same night, and the human's ruling on history deserves quoting, because it is the whole ethic in one word: mark-forward. The old rows stay as graded — restating a season's P&L retroactively is how ledgers become fiction — and every row from that night on prices the ±0.5 run line, the only product an outright-win model can price honestly. The card now comments on both tickets per side: the run line with real math, the moneyline leg with estimated math, labeled estimated. When the sheet is wrong, the sheet says so in its own footer.
Night two: the mirage the EV gate now catches
A week later, during an elimination game, the sheet nearly carded a team carrying +4.2% edge and −3.4% expected value at its actual price of 1.82. Positive opinion, negative ticket. The run-line repricing of night one had made this possible — a heavier toll on the new product — and the selection path had only been checking the opinion. The bet would have been recommended by a sheet that, three inches lower on the same page, printed a ticket-options block explaining why it was bad.
The fix was one line, mechanically: forward picks must clear EV > 0, not just the edge floor. Historical re-renders bypass the gate so past cards stay as written — same mark-forward rule — and that day's card correctly emptied itself. The board still showed the lean. A lean is an opinion; a card is an offer. The machine is allowed the first and must earn the second.
The injury adjustment: measured, not guessed
Since this week, football and CFL probabilities are injury-adjusted, and the adjustment is a measured quantity, not a hunch. The backtest (6,967 games, nflverse injury files 2009–2025, the market's own closing lines as the ruler) found that a team with its quarterback ruled out scores −5.3 percentage points against the market's expectation relative to a clean team-game baseline — measured across 553 quarterback-out team-games, with doubtful and questionable statuses weighted at 0.398 and 0.433 of that, and a hard cap of 17.4 points on any single game's total swing. Kickers, delightfully, measured at nearly nothing (+0.05 position weight): the market does not blink when a kicker sits, and now neither do we.
Every adjustment is written into its own ledger columns — Injury_Adj, the
swing applied, and Injury_Note, the one-line reason — so a reader can
subtract it back out and see the unadjusted number any time. An adjustment
you cannot see is a story. Ours rows are footnotes.
The learning path
Which brings the loop back to its thesis. Every rule above is scaffolding, deliberately flat and deliberately boring. Around 100 graded rows — the ledger sits at 199, so the data is arriving — the plan is to replace each floor with an empirical cutoff measured from the file itself: edge floors per sport and stakes class, longshot cutoffs where the calibration curve says the model is honest, sizing that migrates from quarter-Kelly toward the calibration-aware version. Rules you can state in a sentence are rules you can grade. That is the point of stating them in a sentence.
Next: the engine that does not predict games at all — it buys points, six at a time, at a price it hopes is wrong. Part 4 — The Teaser Engine: /articles/the-loop-part-4-the-teaser-engine
Process over outcome. And when the process is wrong, mark it forward and say so on the same page.