The same production stack priced under 4 course readings, against the bookmaker's pre-stage line. Each scenario is one opinion about what kind of day this is; the results section settles the argument.
The fork
Course profile is an input the model can't see from a map — it's set from reference races (or overridden by hand). Different readings redistribute the same probability mass across rider types.
The board
Blend win probability per scenario (cascade × LambdaRank, DNF-adjusted at the pricing layer), next to the devigged Kambi (Unibet) win line captured the morning before the stage. "Max edge" compares the most favourable scenario against the book — treat it as scenario-conditional, not a free bet.
Read "Max edge" as directional, not as a price. The blend is a set of per-rider marginals and does not sum to one book — across this field each reading totals GC reckoning 107%, Regroup on the descent 103%, Hindsight (post-hoc) 103% — while the devigged book column sums to exactly 100%. Putting the two side by side flatters the model, and Max edge is inflated by about that factor: divide a rider's probability by his reading's total before calling anything an edge. Of our heads only the LambdaRank one is natively book-preserving.
| Rider | Team | GC reckoning | Mountain break | Regroup on the descent | Hindsight (post-hoc) | Book odds | Book devig | Max edge |
|---|---|---|---|---|---|---|---|---|
| Pogacar Tadej | UAE Team Emirates-XRG | 66.2% | – | 55.3% | 61.0% | 1.33 | 49.0% | +17.3pp |
| Onley Oscar | Netcompany INEOS | 6.1% | – | 4.8% | 3.7% | 21.00 | 3.1% | +3.0pp |
| Gall Felix | Decathlon CMA CGM Team | 4.3% | – | 5.0% | 4.8% | 34.00 | 1.9% | +3.1pp |
| Mas Enric | Movistar Team | 2.6% | – | 2.6% | 2.2% | 67.00 | 1.0% | +1.7pp |
| Roglic Primoz | Red Bull-BORA-hansgrohe | 2.6% | – | 1.8% | 1.8% | 67.00 | 1.0% | +1.7pp |
| Carapaz Richard | EF Education-EasyPost | 2.2% | – | 2.5% | 2.0% | 26.00 | 2.5% | -0.1pp |
| Johannessen Tobias Halland | Uno-X Mobility | 1.1% | – | 1.7% | 1.3% | 67.00 | 1.0% | +0.8pp |
| Skjelmose Mattias | Lidl-Trek | 1.7% | – | 1.2% | 1.2% | 51.00 | 1.3% | +0.4pp |
| Uijtdebroeks Cian | Movistar Team | 1.0% | – | 1.6% | 1.5% | 401.00 | 0.2% | +1.5pp |
| Vine Jay | UAE Team Emirates-XRG | 1.1% | – | 1.5% | 1.4% | 8.00 | 8.1% | -6.7pp |
| Riccitello Matthew | Decathlon CMA CGM Team | 0.7% | – | 1.0% | 1.4% | 201.00 | 0.3% | +1.1pp |
| Kuss Sepp | Team Visma | Lease a Bike | 1.1% | – | 1.2% | 1.4% | 51.00 | 1.3% | +0.1pp |
| Romeo Ivan | Movistar Team | 0.7% | – | 1.3% | 1.1% | 81.00 | 0.8% | +0.5pp |
| Nordhagen Jørgen | Team Visma | Lease a Bike | 1.1% | – | 0.8% | 1.0% | 151.00 | 0.4% | +0.6pp |
| Fortunato Lorenzo | XDS Astana Team | 0.5% | 8.9% | 0.6% | 0.4% | 13.00 | 5.0% | -4.4pp |
| # | Rider | Blend | Cascade | LambdaRank | Podium | Top 15 | Book odds |
|---|---|---|---|---|---|---|---|
| 1 | Pogacar Tadej | 66.2% | 59.6% | 63.4% | 80.1% | 92.2% | 1.33 |
| 2 | Onley Oscar | 6.1% | 4.8% | 6.0% | 20.8% | 70.0% | 21.00 |
| 3 | Gall Felix | 4.3% | 3.3% | 4.3% | 15.9% | 62.9% | 34.00 |
| 4 | Mas Enric | 2.6% | 2.0% | 2.6% | 11.1% | 57.5% | 67.00 |
| 5 | Roglic Primoz | 2.6% | 1.7% | 2.7% | 7.5% | 57.6% | 67.00 |
| 6 | Carapaz Richard | 2.2% | 1.5% | 2.2% | 8.6% | 54.5% | 26.00 |
| 7 | Skjelmose Mattias | 1.7% | 1.7% | 1.6% | 7.2% | 48.1% | 51.00 |
| 8 | Vine Jay | 1.1% | 1.2% | 1.0% | 4.8% | 37.7% | 8.00 |
| 9 | Kuss Sepp | 1.1% | 1.4% | 0.9% | 6.7% | 37.5% | 51.00 |
| 10 | Johannessen Tobias Halland | 1.1% | 1.0% | 1.0% | 4.2% | 45.7% | 67.00 |
| 11 | Nordhagen Jørgen | 1.1% | 2.9% | 0.5% | 5.0% | 32.2% | 151.00 |
| 12 | Uijtdebroeks Cian | 1.0% | 1.1% | 0.9% | 5.8% | 38.6% | 401.00 |
| 13 | van Aert Wout | 0.8% | 3.0% | 0.2% | 9.2% | 25.4% | 301.00 |
| 14 | Romeo Ivan | 0.7% | 1.2% | 0.6% | 5.3% | 27.2% | 81.00 |
| 15 | Riccitello Matthew | 0.7% | 0.4% | 0.8% | 2.1% | 35.9% | 201.00 |
| 16 | Bisiaux Léo | 0.6% | 1.0% | 0.5% | 5.1% | 43.6% | 101.00 |
| 17 | Fisher-Black Finn | 0.6% | 1.1% | 0.4% | 4.9% | 31.1% | 151.00 |
| 18 | Rodriguez Carlos | 0.6% | 1.3% | 0.4% | 2.9% | 50.1% | 201.00 |
| 19 | Almeida Joao | 0.6% | 1.0% | 0.4% | 6.3% | 32.7% | 51.00 |
| 20 | Fortunato Lorenzo | 0.5% | 0.7% | 0.5% | 4.7% | 32.2% | 13.00 |
| 21 | Widar Jarno | 0.5% | 0.4% | 0.5% | 3.3% | 24.8% | 101.00 |
| 22 | Tejada Harold | 0.5% | 0.7% | 0.4% | 3.8% | 35.8% | 81.00 |
| 23 | Castrillo Pablo | 0.5% | 0.9% | 0.3% | 2.5% | 9.9% | 101.00 |
| 24 | Tulett Ben | 0.5% | 0.8% | 0.3% | 3.7% | 33.6% | 101.00 |
| 25 | Buitrago Santiago | 0.4% | 0.5% | 0.4% | 2.6% | 36.4% | 101.00 |
| 26 | Berthet Clément | 0.4% | 0.5% | 0.4% | 2.4% | 35.5% | 301.00 |
| 27 | Bilbao Pello | 0.4% | 0.5% | 0.3% | 1.9% | 15.3% | 151.00 |
| 28 | Omrzel Jakob | 0.4% | 0.6% | 0.3% | 2.6% | 33.6% | 201.00 |
| 29 | Vermaerke Kevin | 0.3% | 0.4% | 0.2% | 1.2% | 9.0% | 601.00 |
| 30 | Landa Mikel | 0.3% | 0.1% | 0.3% | 1.3% | 15.7% | 201.00 |
| # | Rider | Blend | Cascade | LambdaRank | Podium | Top 15 | Book odds |
|---|---|---|---|---|---|---|---|
| 1 | Castrillo Pablo | 1.0% | 1.0% | 0.9% | 3.4% | 17.7% | 101.00 |
| 2 | Fortunato Lorenzo | 0.7% | 0.1% | 0.9% | 1.9% | 12.7% | 13.00 |
| 3 | Beloki Markel | 0.7% | 1.2% | 0.5% | 4.0% | 21.4% | 151.00 |
| 4 | Paret-Peintre Valentin | 0.7% | 0.8% | 0.6% | 3.4% | 17.5% | 41.00 |
| 5 | Bilbao Pello | 0.6% | 0.3% | 0.7% | 1.6% | 13.6% | 151.00 |
| 6 | Svestad-Bårdseng Embret | 0.5% | 0.3% | 0.5% | 1.3% | 12.6% | 501.00 |
| 7 | García Raúl | 0.5% | 0.1% | 0.5% | 0.5% | 3.7% | 151.00 |
| 8 | Landa Mikel | 0.4% | 0.1% | 0.5% | 0.7% | 13.0% | 201.00 |
| 9 | Vermaerke Kevin | 0.4% | 0.3% | 0.4% | 1.0% | 9.8% | 601.00 |
| 10 | Sosa Ivan | 0.3% | 0.2% | 0.3% | 0.9% | 5.9% | 251.00 |
| 11 | Hirt Jan | 0.3% | 0.1% | 0.3% | 0.5% | 6.0% | 251.00 |
| 12 | Lutsenko Alexey | 0.2% | 0.2% | 0.2% | 0.4% | 2.3% | 601.00 |
| 13 | Buchmann Emanuel | 0.1% | 0.1% | 0.2% | 0.4% | 4.2% | 801.00 |
| 14 | Cobo Ivan | 0.1% | 0.0% | 0.1% | 0.3% | 2.1% | 801.00 |
| 15 | Gaffuri Mattia | 0.1% | 0.1% | 0.1% | 0.5% | 4.4% | 601.00 |
| 16 | Steinhauser Georg | 0.1% | 0.1% | 0.1% | 0.4% | 2.0% | 151.00 |
| 17 | Scotson Callum | 0.1% | 0.0% | 0.1% | 0.1% | 0.9% | 801.00 |
| 18 | van Bekkum Darren | 0.1% | 0.0% | 0.1% | 0.2% | 1.3% | n/a |
| 19 | Valter Attila | 0.1% | 0.1% | 0.1% | 0.3% | 2.3% | 1001.00 |
| 20 | Diaz Jose Manuel | 0.1% | 0.0% | 0.1% | 0.2% | 3.3% | 501.00 |
| 21 | Marti Pau | 0.1% | 0.0% | 0.1% | 0.2% | 2.2% | 1001.00 |
| 22 | Bouwman Koen | 0.1% | 0.0% | 0.1% | 0.1% | 1.2% | 251.00 |
| 23 | Tjøtta Martin | 0.1% | 0.0% | 0.1% | 0.1% | 1.0% | n/a |
| 24 | Armirail Bruno | 0.1% | 0.0% | 0.1% | 0.2% | 2.1% | 501.00 |
| 25 | Kämna Lennard | 0.1% | 0.0% | 0.1% | 0.2% | 1.3% | 251.00 |
| 26 | Shaw James | 0.1% | 0.0% | 0.1% | 0.1% | 1.0% | 1001.00 |
| 27 | Camprubí Marcel | 0.1% | 0.0% | 0.1% | 0.1% | 1.3% | 401.00 |
| 28 | Martinez Juan Guillermo | 0.1% | 0.0% | 0.1% | 0.2% | 1.8% | 501.00 |
| 29 | Hellemose Asbjørn | 0.0% | 0.0% | 0.1% | 0.1% | 1.0% | 1501.00 |
| 30 | Hamilton Chris | 0.0% | 0.0% | 0.0% | 0.3% | 0.8% | 801.00 |
| # | Rider | Blend | Cascade | LambdaRank | Podium | Top 15 | Book odds |
|---|---|---|---|---|---|---|---|
| 1 | Pogacar Tadej | 55.3% | 56.0% | 53.2% | 71.5% | 85.5% | 1.33 |
| 2 | Gall Felix | 5.0% | 3.3% | 5.2% | 13.5% | 54.7% | 34.00 |
| 3 | Onley Oscar | 4.8% | 2.9% | 5.1% | 12.4% | 50.9% | 21.00 |
| 4 | Mas Enric | 2.6% | 1.2% | 2.8% | 6.9% | 42.2% | 67.00 |
| 5 | Carapaz Richard | 2.5% | 1.4% | 2.6% | 7.5% | 44.8% | 26.00 |
| 6 | Roglic Primoz | 1.8% | 1.5% | 1.8% | 5.5% | 46.1% | 67.00 |
| 7 | Johannessen Tobias Halland | 1.7% | 1.1% | 1.8% | 4.4% | 41.9% | 67.00 |
| 8 | Uijtdebroeks Cian | 1.6% | 1.9% | 1.5% | 6.6% | 37.2% | 401.00 |
| 9 | Vine Jay | 1.5% | 1.8% | 1.4% | 5.1% | 33.8% | 8.00 |
| 10 | Romeo Ivan | 1.3% | 1.5% | 1.2% | 5.4% | 25.4% | 81.00 |
| 11 | Skjelmose Mattias | 1.2% | 1.4% | 1.1% | 4.8% | 40.1% | 51.00 |
| 12 | Kuss Sepp | 1.2% | 1.8% | 1.0% | 6.2% | 32.5% | 51.00 |
| 13 | Riccitello Matthew | 1.0% | 0.5% | 1.1% | 2.3% | 36.7% | 201.00 |
| 14 | Bisiaux Léo | 1.0% | 1.4% | 0.8% | 5.4% | 40.7% | 101.00 |
| 15 | Nordhagen Jørgen | 0.8% | 1.0% | 0.8% | 4.1% | 27.8% | 151.00 |
| 16 | Widar Jarno | 0.8% | 0.7% | 0.8% | 3.8% | 26.4% | 101.00 |
| 17 | Tulett Ben | 0.8% | 1.0% | 0.7% | 4.5% | 35.2% | 101.00 |
| 18 | van Aert Wout | 0.8% | 2.0% | 0.4% | 9.5% | 32.4% | 301.00 |
| 19 | Tejada Harold | 0.8% | 0.8% | 0.7% | 4.1% | 34.3% | 81.00 |
| 20 | Castrillo Pablo | 0.7% | 0.8% | 0.7% | 2.6% | 9.0% | 101.00 |
| 21 | Buitrago Santiago | 0.7% | 0.5% | 0.7% | 2.8% | 34.5% | 101.00 |
| 22 | Rodriguez Carlos | 0.6% | 0.8% | 0.6% | 2.3% | 40.4% | 201.00 |
| 23 | Fisher-Black Finn | 0.6% | 0.7% | 0.6% | 4.3% | 44.1% | 151.00 |
| 24 | Berthet Clément | 0.6% | 0.5% | 0.6% | 2.5% | 32.3% | 301.00 |
| 25 | Laporte Christophe | 0.6% | 1.3% | 0.4% | 2.5% | 8.1% | 1501.00 |
| 26 | Fortunato Lorenzo | 0.6% | 0.2% | 0.6% | 2.5% | 14.7% | 13.00 |
| 27 | Beloki Markel | 0.5% | 1.3% | 0.3% | 3.9% | 22.2% | 151.00 |
| 28 | Almeida Joao | 0.5% | 1.0% | 0.4% | 8.0% | 26.4% | 51.00 |
| 29 | Bilbao Pello | 0.5% | 0.5% | 0.5% | 2.0% | 17.9% | 151.00 |
| 30 | Omrzel Jakob | 0.4% | 0.6% | 0.4% | 3.8% | 35.7% | 201.00 |
| # | Rider | Blend | Cascade | LambdaRank | Podium | Top 15 | Book odds |
|---|---|---|---|---|---|---|---|
| 1 | Pogacar Tadej | 61.0% | 58.9% | 59.8% | 76.5% | 88.8% | 1.33 |
| 2 | Gall Felix | 4.8% | 3.6% | 4.9% | 15.4% | 59.1% | 34.00 |
| 3 | Onley Oscar | 3.7% | 2.7% | 3.8% | 11.6% | 52.7% | 21.00 |
| 4 | Mas Enric | 2.2% | 1.4% | 2.3% | 7.7% | 47.8% | 67.00 |
| 5 | Carapaz Richard | 2.0% | 1.4% | 2.2% | 6.6% | 44.4% | 26.00 |
| 6 | Roglic Primoz | 1.8% | 1.5% | 1.9% | 5.7% | 49.4% | 67.00 |
| 7 | Uijtdebroeks Cian | 1.5% | 1.6% | 1.4% | 6.0% | 38.1% | 401.00 |
| 8 | Vine Jay | 1.4% | 1.8% | 1.3% | 5.3% | 34.4% | 8.00 |
| 9 | Riccitello Matthew | 1.4% | 1.4% | 1.4% | 5.1% | 40.2% | 201.00 |
| 10 | Kuss Sepp | 1.4% | 1.9% | 1.3% | 6.4% | 34.5% | 51.00 |
| 11 | Johannessen Tobias Halland | 1.3% | 1.0% | 1.3% | 4.2% | 41.7% | 67.00 |
| 12 | Skjelmose Mattias | 1.2% | 1.4% | 1.1% | 5.3% | 43.2% | 51.00 |
| 13 | Romeo Ivan | 1.1% | 1.2% | 1.0% | 5.1% | 22.4% | 81.00 |
| 14 | Nordhagen Jørgen | 1.0% | 2.4% | 0.6% | 4.3% | 33.2% | 151.00 |
| 15 | Tejada Harold | 0.8% | 1.1% | 0.8% | 4.9% | 33.8% | 81.00 |
| 16 | Tulett Ben | 0.8% | 1.3% | 0.6% | 5.1% | 27.5% | 101.00 |
| 17 | Almeida Joao | 0.7% | 0.8% | 0.7% | 7.5% | 30.7% | 51.00 |
| 18 | Rodriguez Carlos | 0.7% | 0.8% | 0.6% | 4.3% | 38.6% | 201.00 |
| 19 | Bisiaux Léo | 0.7% | 1.1% | 0.5% | 5.5% | 42.8% | 101.00 |
| 20 | Buitrago Santiago | 0.6% | 0.4% | 0.6% | 2.1% | 32.3% | 101.00 |
| 21 | Castrillo Pablo | 0.6% | 0.6% | 0.6% | 1.8% | 6.6% | 101.00 |
| 22 | Fisher-Black Finn | 0.6% | 0.7% | 0.5% | 3.7% | 42.7% | 151.00 |
| 23 | Widar Jarno | 0.6% | 0.3% | 0.6% | 3.2% | 30.1% | 101.00 |
| 24 | van Aert Wout | 0.5% | 1.3% | 0.3% | 8.6% | 23.1% | 301.00 |
| 25 | Berthet Clément | 0.4% | 0.4% | 0.4% | 2.3% | 31.0% | 301.00 |
| 26 | Omrzel Jakob | 0.4% | 0.7% | 0.4% | 3.7% | 35.5% | 201.00 |
| 27 | Bilbao Pello | 0.4% | 0.5% | 0.4% | 1.7% | 12.7% | 151.00 |
| 28 | Fortunato Lorenzo | 0.4% | 0.1% | 0.4% | 2.3% | 13.8% | 13.00 |
| 29 | Landa Mikel | 0.4% | 0.1% | 0.4% | 1.1% | 13.5% | 201.00 |
| 30 | Laporte Christophe | 0.3% | 0.6% | 0.3% | 1.2% | 4.1% | 1501.00 |
After the stage
| Pos | Rider | Team | GC reckoning win p | Mountain break win p | Regroup on the descent win p | Hindsight (post-hoc) win p |
|---|---|---|---|---|---|---|
| 1 | Pogacar Tadej | UAE Team Emirates-XRG | 66.2% | 46.4% | 55.3% | 61.0% |
| 2 | Widar Jarno | Lotto-Intermarché | 0.5% | 1.1% | 0.8% | 0.6% |
| 3 | Gall Felix | Decathlon CMA CGM Team | 4.3% | 4.4% | 5.0% | 4.8% |
| 4 | Onley Oscar | Netcompany INEOS Cycling Team | 6.1% | 4.0% | 4.8% | 3.7% |
| 5 | Kuss Sepp | Team Visma | Lease a Bike | 1.1% | 2.3% | 1.2% | 1.4% |
| 6 | Mas Enric | Movistar Team | 2.6% | 2.4% | 2.6% | 2.2% |
| 7 | Roglic Primoz | Red Bull-BORA-hansgrohe | 2.6% | 2.5% | 1.8% | 1.8% |
| 8 | Carapaz Richard | EF Education-EasyPost | 2.2% | 3.3% | 2.5% | 2.0% |
| 9 | Skjelmose Mattias | Lidl-Trek | 1.7% | 1.3% | 1.2% | 1.2% |
| 10 | Mühlberger Gregor | Decathlon CMA CGM Team | 0.2% | 0.3% | 0.3% | 0.2% |
| Scenario | Blend win p | Book devig |
|---|---|---|
| GC reckoning | 66.23% | 48.98% |
| Mountain break | 46.43% | 48.98% |
| Regroup on the descent | 55.27% | 48.98% |
| Hindsight (post-hoc) | 60.97% | 48.98% |
Reflection
Pogacar rode away and won alone by 2:39, and the base read did not just call the winner — it called the whole GC group in order. 'GC reckoning' had Pogacar at 63.4% against a book that already made him a 1.33 favourite (49.0% devig), and its top seven finished 1st, 4th, 3rd, 7th, 6th, 8th and 9th. Onley, Gall, Roglic, Mas, Carapaz and Skjelmose were ranked 2-3-4-5-6-7 and came home 4-3-7-6-8-9. Six of the seven were priced above the book, several by multiples: Gall at 4.3% against 1.9% (34.0), Roglic 2.7% against 1.0% (67.0), Mas 2.6% against 1.0% (67.0). On a day the market thought it understood, the model's ordering of the contenders behind the favourite was close to perfect.
The pre-registered disagreement resolved emphatically in the model's favour. The book's second and third choices were Vine (8.0, 8.1% devig) and Fortunato (13.0, 5.0%) — Andorra-local and break-specialist prices the model refused to pay, rating them 9th (1.0%) and 17th (0.5%) and never getting them above 2.1% and 0.9% even on its own break board. Vine finished 11th, Fortunato 40th; the other two break cards, Paret-Peintre and Castrillo, came 146th and 120th. The escape never mattered. That is a real point for the model on a hole we had flagged against it: the GT hard-day gap is about not being able to see WHO makes a break, and here the correct answer was that break membership was worth nothing, which is exactly what a rider-quality model defaults to. One clean day is not a refutation of the hole — it is evidence that the default is not always the expensive error.
The key scored exact — but only after a bug fix, and the bug is the more important finding. `score_day_keys.py` initially labelled the day `res_2` and marked our 0.6 gc_day read a miss. The cause: `morning_gc_ranks` sourced the morning classification from the archived race-page standings, and mid-race FirstCycling's race page serves only the DNF board — every row place='DNF', so the digit filter dropped all of them and returned an empty map. An empty map silently disables the gc_day branch of the oracle, meaning EVERY GC day for the rest of this Vuelta would have fallen through to a residual item and every gc_day key would have scored zero. Patched to fall back to the newest per-stage `results/stage_NN/gc.csv` (the classification parsed off the stage page), the same source `build_stage_page.standings_pool_ids` already uses. Re-scored: oracle `gc_day`, exact=True, weight 0.6. Stages 1 and 2 re-scored unchanged — they route on `itt` and `bunch` before the GC test — so the campaign record is 2/3 exact, 2/3 covered, mean weight 0.53.
Two names beat every board, and the post-hoc run says course knowledge would not have found them. Jarno Widar was 2nd at 101.0 (model #14, 0.5%) and Gregor Muhlberger 10th at 501.0 (model #36, 0.2%); neither was in any pool. The hindsight scenario — references rebuilt from the day's actual shape, a lone winner clear of a GC group by two to four minutes — moved both DOWN, Widar to #19 and Muhlberger to #44, while leaving the leaders essentially where they were. So feeding the model the true finish structure sharpened nothing and cost a little: it is the stage-17 lesson from the Tour again, that matching on how the day ENDED imports a selection story that does not identify the individuals who happened to be there. The retrieval channel was neutral on the day — 10 of the actual top 15 on the day-menu board against production's 10 on the base read, +1 on the break board — which is the expected result when the key is right and the pool is genuinely the GC group.
Carry-forward. (1) The `--all` flag is now mandatory for the daily results capture: the walk stops at the first stage with no results, and cancelled stage 3 is permanently empty, so a default run archives nothing for the rest of the race. Tonight's first capture silently found nothing before the flag was added. (2) GC has finally separated — this is the first day the standings carry climbing information, so `exclude_top_gc` cuts become meaningful from here and should be re-derived nightly rather than inherited. (3) Almeida finished 115th at +22:45 and Uijtdebroeks last at 26 minutes; the model had Almeida in its pool and Uijtdebroeks at #11. Both are riders whose form reading is now clearly stale, and the live-form re-aging should pick that up from tomorrow.