Every time we changed
the machine, and why.
Every football account tells you when its model got something right. Here is the other half: every time we changed the model itself, what was wrong with it, and what we did. No tipster publishes their own corrections. We can't hide ours — the site rebuilds from data twice an hour, and the data does not forget.
At a glance
The live model now learns from the same history it was tested on
What we found. Every test that justified our model, including the 17 October fix, rated teams by walking forward through every season we hold, from 2022/23. The live site only read the last two seasons. The model we were publishing was therefore not quite the model we had tested. Mostly the difference was small, but for newly promoted sides it was large: on Hull City v Brentford the live model gave Brentford 39%, the tested set-up 49%.
What we changed. Team ratings on the site and in the picks now walk through every season on file, exactly as in the tests. Upcoming fixtures, odds and everything else are unchanged. Before switching, we wrote down a rule that could block it: across 403 matches already played this season, the full-history version had to be no worse at predicting results or over/under 2.5. It was slightly better at both (match-result log-loss 1.010 against 1.013). The calibration page splits its scores at 26 October so the two set-ups are never pooled.
Why it matters. A public record only means something if the model behind it is the one that passed its tests. Nothing about stakes, the £50 cap or the pick test changes. £0 staked.
Picks now wait for the team news before they count
What we found. Our own pick test has always said no pick without a confirmed line-up, but the public record logged picks a day or more before kick-off and never checked the team news. On 25 October that meant a pick on Hull City with ten of their players listed as missing - something the bookmakers had priced in and our model cannot see, because it does not yet price injuries. We also found our line-up feed had been missing many matches, so we have made it check more often.
What we changed. From 25 October every pick goes up provisional. Once both confirmed line-ups are in, it is checked again on the latest price: if it still clears the pick test (a 4-point edge, odds of 1.50 or longer) it is confirmed and counts; if the price has moved against it, it is withdrawn. A pick whose line-up our feed missed before kick-off is marked unconfirmed. Withdrawn and unconfirmed picks do not count on the record or the strands, and they stay listed on the picks page with their results. The price we first logged is still the price the record is judged on. Nothing logged before 25 October changes.
Why it matters. A record should only count picks someone following the rules could actually have made. We are also logging, as evidence only, a second probability for each confirmed pick that adjusts for regular players missing from the announced XI; it changes nothing until a test says it helps. We tested one more change the same day, starting newly promoted teams from the level of past promoted teams rather than from average. It failed three of its five pre-registered tests and was not adopted. Nothing about stakes, the £50 cap or the pick test changes. £0 staked.
A new strand: the Pick of the Day, and it picks first
What we found. The picks page had four daily strands, each with its own narrow rule, but nothing that answered the plainest question: of everything the model rates today, which single call does it believe in most?
What we changed. The Pick of the Day takes the biggest model-vs-market gap of the day among picks that clear both the 4-point pick test and the 12-point conviction bar, priced 1.50 to 4.00, one a day, and none when nothing qualifies. It picks before every other strand, so from 17 Oct the Daily Double sometimes loses its first-choice match and takes its next-best one. Before adopting the rule we checked it on the 2024/25 and 2025/26 seasons (home, draw, away and over/under 2.5 only, the markets we hold closing prices for): it beat the closing price 51.5% of the time with an average CLV of +0.7%, close to break-even. Backtests flatter, so expect a small paper loss over time. It carries its exit rule from day one: if it beats the close less than 40% of the time with an average CLV below zero after 30 settled picks, it retires. It was pre-registered on 11 Oct to start on 26 Oct; on 17 Oct, the day the model's supremacy fix went live, we brought the start forward to that day, logged before its first pick.
Why it matters. Changing which strand picks first changes the Daily Double's record from that date, so we say so on the picks page instead of letting a run quietly mean something different. This is not a change to the model, only to which of its reads we headline.
Earlier changes
17 Oct 2026 · Every strand now lives under one exit rule - and a Scoreline of the Day joins them
What we found. Each daily strand had its own retirement wording, or none: the Daily Home and Pick of the Day carried a printed exit rule, the older strands did not. And the model changed today, so every strand's record before today came from a different model than the one picking from now on.
What we changed. One rule for all of them, printed before any could be judged by it: over a strand's last 30 settled picks logged since 17 Oct 2026, if it beats the closing price less than 40% of the time with an average closing-line value below zero, it retires at the next Monday review - and it is re-judged every week once those 30 are in. The picks page shows where each strand stands. The Daily Draw and Daily Double start their clocks today like everyone else; their full records stay on the page. We also added a sixth strand, the Scoreline of the Day: each match's likeliest scoreline on the model's grid, kept only when the price is no worse than the model's own number, and the one the model is surest of is headlined. It picks last, so it only ever takes a match no other strand wanted. It cannot be backtested - we hold no historical correct-score closing prices - so it runs live under the same exit rule from day one. The Pick of the Day, written down on 11 Oct to start on 26 Oct, starts today instead.
Why it matters. Six strands means one is nearly always on a run; that is arithmetic, which is why they are only ever shown side by side. A correct-score strand will be wrong most days - expect around one hit in seven and losing runs past twenty - and we say that here rather than let a rare hit look like skill. The cap we set ourselves in August was four strands; Karn lifted it today, and that is recorded, not hidden. Nothing about stakes, the £50 cap or the pick test changes. £0 staked.
17 Oct 2026 · The model was under-rating favourites - we have fixed how it splits the goals
What we found. Most of this season's losing calls were on underdogs: of 73 settled calls on a side to win, 46 backed a team the market gave less than a 40% chance, and they went 9 won, 27 lost, 10 void. That was not bad luck. On two full past seasons the model never once made a conviction call on a market favourite. The cause was a setting from last summer that pulls every team rating 40% back toward average before pricing a match. It was meant to stop the model over-calling goals, and it did - but it also shrank the gap between the two teams, so every favourite looked weaker than it was and every underdog looked closer than it was. Our own calibration page showed the symptom: outcomes we called at 50-70% happened far more often than we said.
What we changed. The total number of goals in a match is still priced the cautious way, so over/under, both-teams-to-score and team-total probabilities are unchanged. How that total is split between the two sides now comes from the full, unshrunk ratings. The test for this was written and locked on 24 September, before any result was known, and run once on two seasons the model had never been tuned on (2022/23 and 2023/24, 2,825 matches). Match-result accuracy improved (log-loss -0.013, z = -5.1), in both seasons on their own. The 50-60% band's gap fell from +8.3 to +2.6 points and the 60-70% band's from +12.1 to +1.8. Closing-line value on the pick test went from -0.17% to +0.27%, and the share of calls on heavy underdogs roughly halved. We also brought the run forward from 26 October: the data it tests on does not change with the date, and the amendment was written down before the run.
Why it matters. Honesty about the test, too: it passed five of its six pre-registered checks and failed the letter of the sixth. That check said no probability band's gap may more than double, and the 30-40% band went from a half-point gap to 1.7 points - a tripling of a gap smaller than the sampling noise on that band, while every other band improved. Karn adopted the change anyway and we are saying so here rather than quietly re-reading the rule. The calibration page now scores the old model and the new one separately from this date, so the fix cannot borrow credit from the past. The record is not reset. Nothing about stakes, caps or the pick test changes.
24 Sep 2026 · The Daily Under is retired - the Daily Home takes its place
What we found. The Daily Under, one of the four daily paper strands on the picks page, was losing to the market it was meant to read. Across its 16 settled picks it beat the closing price only 31% of the time, and after the 28 Aug bettability gate its average closing-line value was -3.2%. A strand that keeps getting worse prices than the market's final word is not showing any skill, so we stopped pretending it might.
What we changed. The Daily Under logs no new picks. Every pick it made stays on the picks page at full size, labelled retired. Its slot goes to the Daily Home: the home side the model rates likeliest to win, priced 1.50 to 3.00, that also clears the same pick test as everything else. We tested the rule on the 2024/25 and 2025/26 seasons, where it won about half its picks and beat the closing price 57% of the time. Backtests flatter, so expect a small paper loss over time, which is the honest expectation. It carries its own exit rule from day one: if it beats the close less than 40% of the time with an average CLV below zero after 30 settled picks, it retires too.
Why it matters. A strand should die by a rule, not quietly fade from the page. Printing the new strand's exit rule before its first pick means nobody - including us - gets to move the goalposts later. This is not a change to the model, only to which of its reads we headline.
13 Sep 2026 · Five more leagues get model reads - as young ratings, with no picks
What we found. We re-ran our expected-goals coverage check across every league the collector tracks. Five passed the 80% bar on settled matches - 2. Bundesliga (92%), Primeira Liga (87%), Scottish Premiership (86%), Serie B (83%) and Eredivisie (83%) - meaning their xG data is now reliable enough to build ratings from. MLS (63%), La Liga 2 (73%), Ligue 2 and the European cups stayed below it and remain results-and-stats only.
What we changed. Those five leagues now get model probabilities on the board and fixture pages - appearing automatically once a club has played six games, exactly like everywhere else. Every such number is badged as a young rating: built on a first season of data with no prior seasons behind it. No picks are generated from young leagues, and their accuracy is scored on the calibration page separately from the established six, a split we wrote down before a single one of their predictions had settled.
Why it matters. More of the board with real reads on it - without pretending a first-season rating is as trustworthy as one with years of history. If the young leagues ever earn picks, the public calibration record will be the evidence, not our say-so.
13 Sep 2026 · The picks are leaning underdog - we have noticed, and we are testing it
What we found. Since the season opened, the model has priced unfancied sides higher than the market almost across the card - by mid-September nearly every open pick backed the outsider, at big claimed edges. Our own calibration page shows the same thing from another angle: outcomes the model called at 40-70% have been happening more often than it said. In plain English, the model has been under-confident - and an under-confident model sees phantom value in every underdog.
What we changed. Nothing in the model - and that is deliberate. On 12 September, before fitting or testing anything, we wrote down and locked a recalibration exam: it runs in late October, on seasons the fit never touched, with its pass/fail rules fixed in advance. The probabilities change only if it passes. Until it settles, the picks page carries a plain notice whenever the open slate leans this way, so a first-time visitor is told what they are looking at.
Why it matters. Five weeks of early-season data is exactly the sample most likely to mislead: clubs are still inside the warm-up window, and a pattern that loud can be an artefact of that. Correcting the model against it now could bake a bug in permanently. Writing the test down before running it is what keeps us from fooling ourselves - and you.
5 Sep 2026 · The board went blank for an afternoon - and why
What we found. For a few hours on 5 September every fixture on the board read 'not enough matches played yet'. The website had been building its ratings from one season at a time - last season until the new one had 200 matches with xG on file, then this season alone. The xG repair below pushed 2026/27 past 200, the site switched seasons, and with clubs on three to five games each, nobody had cleared the six-game warm-up. Meanwhile the picks engine had always carried ratings across seasons with the 20 August early-season blend - so the site and the engine had never quite agreed.
What we changed. The site now builds ratings the same way the picks engine does: every season on file in date order, ratings carried over the summer, and a club's rating pulled toward its prior-season average until it has played six league games this season. Promoted clubs with no prior season start at the league average. The season tables (xPts, goals against xG) still describe this season only.
Why it matters. One set of numbers, not two. The board, fixture pages and team pages now show exactly what the picks are made from, and the early-season caveat already on every fixture page tells you when a rating still leans on last year.
5 Sep 2026 · The model was going hungry in two leagues
What we found. Our collector asked for a match's expected goals once, right after the final whistle - but the data provider often posts xG hours or days later. Any match we asked about too early was filed with no xG and never asked about again. By early September only a third of settled Bundesliga games and just over half of Championship games had xG on file. Ratings only learn from games with xG, so in those two leagues the model was reading the season with half the pages missing.
What we changed. The collector now goes back every morning and re-asks for any recent match still missing xG, and we ran a one-off pass over the whole season. All six full-xG leagues are now complete on settled games. Ratings in the Bundesliga and Championship shifted as the missing games landed.
Why it matters. This was not a change to how the model reads a match; it was a fix to what it was allowed to read. It still belongs here, because every published Bundesliga and Championship read before 5 September came from a thinner picture than we thought, and those reads stay on the record exactly as they were made.
29 Aug 2026 · Closing odds now taken before kick-off, not after
What we found. Our plausibility watchdog flagged impossible prices on one match (Rennes 2-2 PSG, 23 Aug). For closing odds - the price we grade our picks against - we had been reading the market after full-time, which for that game returned in-play prices near the end of a 2-2 draw. No bet was ever placed on the match and no result was affected, but it was wrong data sitting in the record.
What we changed. Closing odds are now taken from the last price we captured before kick-off - which is what 'closing' is meant to be - instead of a fresh reading after the match. We also removed the corrupted prices for that one fixture.
Why it matters. The closing line is how we honestly check whether our picks beat the market (closing-line value). It has to be the real pre-kick-off price, not an in-play snapshot. This makes that check accurate from here on - and it is the sort of correction we publish rather than bury.
23 Aug 2026 · One pick per match (the correlation fix)
What we found. The record logged every conviction selection, so a single match spawned up to sixteen near-identical bets - Asian-handicap lines, team-unders, clean sheet, all the same 'low-scoring' idea in different costumes. Eight days ran to 98 singles across about twelve matches, so one bad afternoon buried the record under correlated red and the whole thing read far worse than the model was actually doing.
What we changed. From now the record keeps one single per match - the model's highest-edge read on that fixture. We also brought the existing record onto the same footing one time: kept the best-edge pick per past match, dropped the correlated duplicates. That moved the settled paper record from about -36 reference units to roughly break-even, which is the model's true per-match story. The full pre-change ledger is kept untouched as a backup.
Why it matters. A record that counts one correlated call sixteen times is not an honest record of the model's calls - it is noise that makes an ordinary, mildly-negative run look like a collapse. This is the picks-correlation lesson (count matches, not chips) applied at the source, and it lines the record up with what the model actually does: one best read per match. We broke the append-only rule once, on purpose and in public, because leaving a misleading record standing would have been the bigger dishonesty.
20 Aug 2026 · Early-season rating blend
What we found. For a club's first few games the ratings leaned on last season's final handful of matches - a tiny, distorted sample. It crowned Levante's attack above Barcelona's, and read Barcelona as a coin-flip away at Elche.
What we changed. While a club has played fewer than six league games this season, its rating is now pulled toward its full prior-season average. We tested it across four past seasons before shipping - it improved the model's honesty in every one, and left mature-season games untouched to five decimal places.
Why it matters. It attacks the model's biggest documented weakness at the root, rather than papering over it. A later check (23 Aug) confirmed it costs a sliver of closing-line value in that early window and changes nothing about the no-profit verdict - it earns its place on honesty, not profit.
20 Aug 2026 · Distrust guard on lopsided favourites
What we found. Early in the season the model sometimes faded a clear market favourite by a wide margin - rating a side the market made a 71% favourite as barely better than a coin-flip.
What we changed. Added a guard that suppresses the model's own picks on any fixture where it fades a strong market favourite by 15 points or more. The read still shows on the page; it just cannot reach our record.
Why it matters. In exactly those spots we trust the market more than our own model. The guard keeps the artifact out of the record without pretending the model never produced it - honesty cuts both ways.
13 Aug 2026 · Asian-handicap and goal-line pricing fix
What we found. Some handicap and total lines were being priced with the wrong push-adjusted maths, inventing edges that were not real - the biggest gap on the board that day was fabricated by the bug.
What we changed. Corrected the maths so every handicap and total line prices the way it actually settles, and added an automated watchdog that fires if a line ladder ever looks impossible again.
Why it matters. A real number in a false frame is the worst kind of error: it passes every test and only shows up when a human looks hard. It reached the board, so it belongs on this page.
Tested, and not adopted
Every one of these was written down before it was run, run once, and failed. So the model did not change. They stay here because a list of only the fixes that worked would be hiding something.
| Date | Idea | What happened |
|---|---|---|
| 25 Oct 2026 | Recalibrating each side's expected goals | Weak attacks looked under-rated on two seasons; on two older seasons the fix made results and goals predictions worse. Failed five of six tests. |
| 25 Oct 2026 | Starting promoted teams from past promoted sides, not average | Right direction, not strong or consistent enough, and closing-price value slipped. Failed three of five tests. |
| 17 Oct 2026 | Filters against backing underdogs | Eleven filters (odds caps, edge caps, market floors) tried against a random placebo on past seasons. None beat it. |
| 18 Sep 2026 | A tighter distrust guard on favourites | Fading the favourite historically beat the closing price more, not less. Not adopted. |
| 5 Sep 2026 | A bigger edge bar for over/under picks | Helped on the seasons it was tuned on, hurt on the seasons it had never seen. Not adopted. |
How the model works → · What we got wrong this week → · The record →