Cycling race predictor · Vuelta a España 2026

Stage 4 — 2026-08-25

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.

4 scenarios 183 riders priced models retrained 2026-08-09 book snapshot markets_1358.json

The fork

4 readings of the same road

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.

GC reckoning

The first reckoning — the GC elite shed everyone and settle it between themselves
sprint0.00
mountain0.44
hilly0.00
rolling0.55
break0.01
TT0.00
keyed: GC day 0.6 / mountain escape 0.4 (board order by rider-type retrieval; prices unchanged)
The base case and the book's card, which makes Pogacar a 1.33 favourite (49.0% devig) — shorter than it made him for the cancelled summit finish, because this stage is harder. Three category 1 climbs inside 105 km, Beixalis at 8.5% steep enough to break the race outright, and no flat anywhere to hide. On this reading the escape is caught or absorbed on Ordino, the GC group is down to a handful over La Comella, and the strongest climber in the race takes it with whatever margin the descent allows. References are hard Grand Tour and WT mountain days won by a GC leader from a group of two (mountain 0.41-0.49 over rolling): Pogacar's Peyragudes 2022, Vingegaard's TdF 2024 stage 11, Roglic's Angliru 2023, Almeida's Vuelta 2025 stage 13, Roglic's Dauphine 2024 stage 7. Inherits the config-root day key.
Top 5 (blend): Pogacar Tadej 66.2%; Onley Oscar 6.1%; Gall Felix 4.3%; Mas Enric 2.6%; Roglic Primoz 2.6%

Mountain break

The escape stays — Envalira launches it and Andorra is too short to bring it back
sprint0.00
mountain0.50
hilly0.00
rolling0.49
break0.01
TT0.00
keyed: mountain escape 0.8 / GC day 0.1 (board order by rider-type retrieval; prices unchanged)
The alternative, and it is a live one — the book's second and third choices (Vine 8.0, Fortunato 13.0) are both break-shaped prices. A 23 km climb from kilometre zero on a 105 km stage is the best possible break launchpad: the move goes clear before any team has organised, and with only two and a half hours of racing there is very little road in which to reel it back. References are the canonical mountain-escape days (mountain 0.47-0.52, winner groups of 1 to 4): Carapaz's TdF 2026 stage 18, Soler's Vuelta 2025 stage 14, Barre's Pologne 2026 stage 6, van der Poel's TdF 2026 stage 9, Narvaez's Giro 2026 stage 11. UNLIKE stage 3, a conditional pool is now definable and is applied: the cut drops the top 96 on the actual Manosque standings, i.e. everyone within +2:00, on the reasoning that with fiftieth place 59 seconds down a break carrying anyone inside two minutes is carrying the virtual lead and will be chased. The cut leaves Fortunato (98th, +2:00) as the first man inside the free pool, which is a useful sanity check — the book's own break favourite sits exactly on the boundary the standings draw.
Top 5 if the break wins (top 96 on GC removed): Castrillo Pablo 11.6%; Fortunato Lorenzo 8.9%; Beloki Markel 8.4%; Paret-Peintre Valentin 8.4%; Bilbao Pello 7.8%

Regroup on the descent

La Comella is not enough — the descent brings a group back together
sprint0.00
mountain0.49
hilly0.00
rolling0.51
break0.01
TT0.00
keyed: GC day 0.5 / mountain escape 0.5 (board order by rider-type retrieval; prices unchanged)
The 'not a summit finish' read, drawn explicitly because the stage does not end at the top of anything. La Comella is only 3.9 km at 5.9% — a hard effort but not a launchpad for a decisive solo — and it crests 4.8 km from the line with a fast descent after it. That geometry regularly rewards a rider who is dropped on the climb and descends back on, or a small group that reforms and contests a flat finish in Andorra la Vella, rather than the lone GC winner the base read draws. References are hard mountain days that finished with a group of four or five rather than a solo: Bilbao's TdF 2023 stage 10, Roglic's Tirreno 2023 stage 6, Pogacar's TdF 2020 stage 9, Pogacar's TdF 2023 stage 20, van der Poel's TdF 2026 stage 9. Keyed evenly between the two families because a regroup is exactly the state in which either a surviving escapee or a GC man can win, and the gap between this board and the base read is the cost of assuming the last climb settles it.
Top 5 (blend): Pogacar Tadej 55.3%; Gall Felix 5.0%; Onley Oscar 4.8%; Mas Enric 2.6%; Carapaz Richard 2.5%

Hindsight (post-hoc)

Hindsight (post-hoc) — the day as raced: a solo by 2:39 off a shattered GC group
sprint0.00
mountain0.51
hilly0.00
rolling0.48
break0.01
TT0.00
keyed: GC day (board order by rider-type retrieval; prices unchanged)
Post-race reconstruction, NOT a prediction — run with --no-log and never written to prediction_log. The stage finished with Pogacar alone (1 rider on the winning time, field spread 26.2 min), a six-man GC group at 2:39 (Widar, Gall, Onley, Kuss, Mas, Roglic), Carapaz at 2:57 and Skjelmose at 3:17. References are the five WT mountain days whose finish structure most resembles that — a lone winner riding clear of a GC group by roughly two to four minutes, mountain 0.46-0.54 over rolling: Pogacar's TdF 2024 stage 4, TdF 2025 stage 12 and TdF 2026 stage 6, Pogacar's Giro 2024 stage 20, and Buitrago's Giro 2023 stage 19 as the non-leader solo. Answers the retrospective question: if we had known the day would end in a solo of this magnitude rather than the two-man finishes the base read was built from, would the board have looked different? Given the base read already went 1-4-3-7-6-8-9 through its top seven, the useful comparison is not the winner but the tail — whether a more extreme profile would have surfaced Widar (2nd, 101.0) or Muhlberger (10th, 501.0), the two names every pre-race board missed.
Top 5 (blend): Pogacar Tadej 61.0%; Gall Felix 4.8%; Onley Oscar 3.7%; Mas Enric 2.2%; Carapaz Richard 2.0%

The board

Win probabilities, scenario by scenario

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.

RiderTeamGC reckoningMountain breakRegroup on the descentHindsight (post-hoc)Book oddsBook devigMax edge
Pogacar TadejUAE Team Emirates-XRG66.2%–55.3%61.0%1.3349.0%+17.3pp
Onley OscarNetcompany INEOS6.1%–4.8%3.7%21.003.1%+3.0pp
Gall FelixDecathlon CMA CGM Team4.3%–5.0%4.8%34.001.9%+3.1pp
Mas EnricMovistar Team2.6%–2.6%2.2%67.001.0%+1.7pp
Roglic PrimozRed Bull-BORA-hansgrohe2.6%–1.8%1.8%67.001.0%+1.7pp
Carapaz RichardEF Education-EasyPost2.2%–2.5%2.0%26.002.5%-0.1pp
Johannessen Tobias HallandUno-X Mobility1.1%–1.7%1.3%67.001.0%+0.8pp
Skjelmose MattiasLidl-Trek1.7%–1.2%1.2%51.001.3%+0.4pp
Uijtdebroeks CianMovistar Team1.0%–1.6%1.5%401.000.2%+1.5pp
Vine JayUAE Team Emirates-XRG1.1%–1.5%1.4%8.008.1%-6.7pp
Riccitello MatthewDecathlon CMA CGM Team0.7%–1.0%1.4%201.000.3%+1.1pp
Kuss SeppTeam Visma | Lease a Bike1.1%–1.2%1.4%51.001.3%+0.1pp
Romeo IvanMovistar Team0.7%–1.3%1.1%81.000.8%+0.5pp
Nordhagen JørgenTeam Visma | Lease a Bike1.1%–0.8%1.0%151.000.4%+0.6pp
Fortunato LorenzoXDS Astana Team0.5%8.9%0.6%0.4%13.005.0%-4.4pp
Mountain break is shown conditional on the break winning — the top 96 riders on actual GC are removed and the remaining probabilities renormalize within the break pool. That column isn't comparable with the book line or the other readings, so it's left out of Max edge; a "–" means a GC captain we assume won't be up the road.
The first reckoning — the GC elite shed everyone and settle it between themselves — top 30, all heads
#RiderBlendCascade LambdaRankPodiumTop 15 Book odds
1Pogacar Tadej66.2%59.6%63.4%80.1%92.2%1.33
2Onley Oscar6.1%4.8%6.0%20.8%70.0%21.00
3Gall Felix4.3%3.3%4.3%15.9%62.9%34.00
4Mas Enric2.6%2.0%2.6%11.1%57.5%67.00
5Roglic Primoz2.6%1.7%2.7%7.5%57.6%67.00
6Carapaz Richard2.2%1.5%2.2%8.6%54.5%26.00
7Skjelmose Mattias1.7%1.7%1.6%7.2%48.1%51.00
8Vine Jay1.1%1.2%1.0%4.8%37.7%8.00
9Kuss Sepp1.1%1.4%0.9%6.7%37.5%51.00
10Johannessen Tobias Halland1.1%1.0%1.0%4.2%45.7%67.00
11Nordhagen Jørgen1.1%2.9%0.5%5.0%32.2%151.00
12Uijtdebroeks Cian1.0%1.1%0.9%5.8%38.6%401.00
13van Aert Wout0.8%3.0%0.2%9.2%25.4%301.00
14Romeo Ivan0.7%1.2%0.6%5.3%27.2%81.00
15Riccitello Matthew0.7%0.4%0.8%2.1%35.9%201.00
16Bisiaux Léo0.6%1.0%0.5%5.1%43.6%101.00
17Fisher-Black Finn0.6%1.1%0.4%4.9%31.1%151.00
18Rodriguez Carlos0.6%1.3%0.4%2.9%50.1%201.00
19Almeida Joao0.6%1.0%0.4%6.3%32.7%51.00
20Fortunato Lorenzo0.5%0.7%0.5%4.7%32.2%13.00
21Widar Jarno0.5%0.4%0.5%3.3%24.8%101.00
22Tejada Harold0.5%0.7%0.4%3.8%35.8%81.00
23Castrillo Pablo0.5%0.9%0.3%2.5%9.9%101.00
24Tulett Ben0.5%0.8%0.3%3.7%33.6%101.00
25Buitrago Santiago0.4%0.5%0.4%2.6%36.4%101.00
26Berthet Clément0.4%0.5%0.4%2.4%35.5%301.00
27Bilbao Pello0.4%0.5%0.3%1.9%15.3%151.00
28Omrzel Jakob0.4%0.6%0.3%2.6%33.6%201.00
29Vermaerke Kevin0.3%0.4%0.2%1.2%9.0%601.00
30Landa Mikel0.3%0.1%0.3%1.3%15.7%201.00
The escape stays — Envalira launches it and Andorra is too short to bring it back — top 30, all heads · top 96 on GC removed
#RiderBlendCascade LambdaRankPodiumTop 15 Book odds
1Castrillo Pablo1.0%1.0%0.9%3.4%17.7%101.00
2Fortunato Lorenzo0.7%0.1%0.9%1.9%12.7%13.00
3Beloki Markel0.7%1.2%0.5%4.0%21.4%151.00
4Paret-Peintre Valentin0.7%0.8%0.6%3.4%17.5%41.00
5Bilbao Pello0.6%0.3%0.7%1.6%13.6%151.00
6Svestad-Bårdseng Embret0.5%0.3%0.5%1.3%12.6%501.00
7García Raúl0.5%0.1%0.5%0.5%3.7%151.00
8Landa Mikel0.4%0.1%0.5%0.7%13.0%201.00
9Vermaerke Kevin0.4%0.3%0.4%1.0%9.8%601.00
10Sosa Ivan0.3%0.2%0.3%0.9%5.9%251.00
11Hirt Jan0.3%0.1%0.3%0.5%6.0%251.00
12Lutsenko Alexey0.2%0.2%0.2%0.4%2.3%601.00
13Buchmann Emanuel0.1%0.1%0.2%0.4%4.2%801.00
14Cobo Ivan0.1%0.0%0.1%0.3%2.1%801.00
15Gaffuri Mattia0.1%0.1%0.1%0.5%4.4%601.00
16Steinhauser Georg0.1%0.1%0.1%0.4%2.0%151.00
17Scotson Callum0.1%0.0%0.1%0.1%0.9%801.00
18van Bekkum Darren0.1%0.0%0.1%0.2%1.3%n/a
19Valter Attila0.1%0.1%0.1%0.3%2.3%1001.00
20Diaz Jose Manuel0.1%0.0%0.1%0.2%3.3%501.00
21Marti Pau0.1%0.0%0.1%0.2%2.2%1001.00
22Bouwman Koen0.1%0.0%0.1%0.1%1.2%251.00
23Tjøtta Martin0.1%0.0%0.1%0.1%1.0%n/a
24Armirail Bruno0.1%0.0%0.1%0.2%2.1%501.00
25Kämna Lennard0.1%0.0%0.1%0.2%1.3%251.00
26Shaw James0.1%0.0%0.1%0.1%1.0%1001.00
27Camprubí Marcel0.1%0.0%0.1%0.1%1.3%401.00
28Martinez Juan Guillermo0.1%0.0%0.1%0.2%1.8%501.00
29Hellemose Asbjørn0.0%0.0%0.1%0.1%1.0%1501.00
30Hamilton Chris0.0%0.0%0.0%0.3%0.8%801.00
La Comella is not enough — the descent brings a group back together — top 30, all heads
#RiderBlendCascade LambdaRankPodiumTop 15 Book odds
1Pogacar Tadej55.3%56.0%53.2%71.5%85.5%1.33
2Gall Felix5.0%3.3%5.2%13.5%54.7%34.00
3Onley Oscar4.8%2.9%5.1%12.4%50.9%21.00
4Mas Enric2.6%1.2%2.8%6.9%42.2%67.00
5Carapaz Richard2.5%1.4%2.6%7.5%44.8%26.00
6Roglic Primoz1.8%1.5%1.8%5.5%46.1%67.00
7Johannessen Tobias Halland1.7%1.1%1.8%4.4%41.9%67.00
8Uijtdebroeks Cian1.6%1.9%1.5%6.6%37.2%401.00
9Vine Jay1.5%1.8%1.4%5.1%33.8%8.00
10Romeo Ivan1.3%1.5%1.2%5.4%25.4%81.00
11Skjelmose Mattias1.2%1.4%1.1%4.8%40.1%51.00
12Kuss Sepp1.2%1.8%1.0%6.2%32.5%51.00
13Riccitello Matthew1.0%0.5%1.1%2.3%36.7%201.00
14Bisiaux Léo1.0%1.4%0.8%5.4%40.7%101.00
15Nordhagen Jørgen0.8%1.0%0.8%4.1%27.8%151.00
16Widar Jarno0.8%0.7%0.8%3.8%26.4%101.00
17Tulett Ben0.8%1.0%0.7%4.5%35.2%101.00
18van Aert Wout0.8%2.0%0.4%9.5%32.4%301.00
19Tejada Harold0.8%0.8%0.7%4.1%34.3%81.00
20Castrillo Pablo0.7%0.8%0.7%2.6%9.0%101.00
21Buitrago Santiago0.7%0.5%0.7%2.8%34.5%101.00
22Rodriguez Carlos0.6%0.8%0.6%2.3%40.4%201.00
23Fisher-Black Finn0.6%0.7%0.6%4.3%44.1%151.00
24Berthet Clément0.6%0.5%0.6%2.5%32.3%301.00
25Laporte Christophe0.6%1.3%0.4%2.5%8.1%1501.00
26Fortunato Lorenzo0.6%0.2%0.6%2.5%14.7%13.00
27Beloki Markel0.5%1.3%0.3%3.9%22.2%151.00
28Almeida Joao0.5%1.0%0.4%8.0%26.4%51.00
29Bilbao Pello0.5%0.5%0.5%2.0%17.9%151.00
30Omrzel Jakob0.4%0.6%0.4%3.8%35.7%201.00
Hindsight (post-hoc) — the day as raced: a solo by 2:39 off a shattered GC group — top 30, all heads
#RiderBlendCascade LambdaRankPodiumTop 15 Book odds
1Pogacar Tadej61.0%58.9%59.8%76.5%88.8%1.33
2Gall Felix4.8%3.6%4.9%15.4%59.1%34.00
3Onley Oscar3.7%2.7%3.8%11.6%52.7%21.00
4Mas Enric2.2%1.4%2.3%7.7%47.8%67.00
5Carapaz Richard2.0%1.4%2.2%6.6%44.4%26.00
6Roglic Primoz1.8%1.5%1.9%5.7%49.4%67.00
7Uijtdebroeks Cian1.5%1.6%1.4%6.0%38.1%401.00
8Vine Jay1.4%1.8%1.3%5.3%34.4%8.00
9Riccitello Matthew1.4%1.4%1.4%5.1%40.2%201.00
10Kuss Sepp1.4%1.9%1.3%6.4%34.5%51.00
11Johannessen Tobias Halland1.3%1.0%1.3%4.2%41.7%67.00
12Skjelmose Mattias1.2%1.4%1.1%5.3%43.2%51.00
13Romeo Ivan1.1%1.2%1.0%5.1%22.4%81.00
14Nordhagen Jørgen1.0%2.4%0.6%4.3%33.2%151.00
15Tejada Harold0.8%1.1%0.8%4.9%33.8%81.00
16Tulett Ben0.8%1.3%0.6%5.1%27.5%101.00
17Almeida Joao0.7%0.8%0.7%7.5%30.7%51.00
18Rodriguez Carlos0.7%0.8%0.6%4.3%38.6%201.00
19Bisiaux Léo0.7%1.1%0.5%5.5%42.8%101.00
20Buitrago Santiago0.6%0.4%0.6%2.1%32.3%101.00
21Castrillo Pablo0.6%0.6%0.6%1.8%6.6%101.00
22Fisher-Black Finn0.6%0.7%0.5%3.7%42.7%151.00
23Widar Jarno0.6%0.3%0.6%3.2%30.1%101.00
24van Aert Wout0.5%1.3%0.3%8.6%23.1%301.00
25Berthet Clément0.4%0.4%0.4%2.3%31.0%301.00
26Omrzel Jakob0.4%0.7%0.4%3.7%35.5%201.00
27Bilbao Pello0.4%0.5%0.4%1.7%12.7%151.00
28Fortunato Lorenzo0.4%0.1%0.4%2.3%13.8%13.00
29Landa Mikel0.4%0.1%0.4%1.1%13.5%201.00
30Laporte Christophe0.3%0.6%0.3%1.2%4.1%1501.00

After the stage

Results — won by Pogacar Tadej

PosRiderTeamGC reckoning win pMountain break win pRegroup on the descent win pHindsight (post-hoc) win p
1Pogacar TadejUAE Team Emirates-XRG66.2%46.4%55.3%61.0%
2Widar JarnoLotto-Intermarché0.5%1.1%0.8%0.6%
3Gall FelixDecathlon CMA CGM Team4.3%4.4%5.0%4.8%
4Onley OscarNetcompany INEOS Cycling Team6.1%4.0%4.8%3.7%
5Kuss SeppTeam Visma | Lease a Bike1.1%2.3%1.2%1.4%
6Mas EnricMovistar Team2.6%2.4%2.6%2.2%
7Roglic PrimozRed Bull-BORA-hansgrohe2.6%2.5%1.8%1.8%
8Carapaz RichardEF Education-EasyPost2.2%3.3%2.5%2.0%
9Skjelmose MattiasLidl-Trek1.7%1.3%1.2%1.2%
10Mühlberger GregorDecathlon CMA CGM Team0.2%0.3%0.3%0.2%

Scenario scoring — probability given to the actual winner

ScenarioBlend win pBook devig
GC reckoning66.23%48.98%
Mountain break46.43%48.98%
Regroup on the descent55.27%48.98%
Hindsight (post-hoc)60.97%48.98%

Reflection

What we make of it

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.