v1.5.4
PatchJun 20, 2026New
- —Cancelled-race state — a race whose edition is called off now stays listed with a clear CANCELLED treatment instead of being hidden, so riders who look it up learn it's off. New `cancelled` / `cancelled_reason` / `cancelled_at` columns (`drizzle/0024_race_cancelled.sql`); CANCELLED badge + dimmed card + struck-through date in the grid; a cancellation banner on the race page; the commit bar shows "Race cancelled" (no register/track CTAs). The PainPlan squad can set it via the MCP after a verified cancellation is approved. First live example: Styrkeprøven 2026 (Trondheim–Oslo 540 km — permit rejected), which the squad detected autonomously.
Changed
- —Catalogue cleanup (data) — deduped the catalogue (archived 7 stale duplicate rows from a Dec-2025 import batch), backfilled `edition_year` on 286 races (was NULL, broke dedup + lineage), corrected 3 verified data errors (Mondsee/Supergiro dates, Alb Extrem distance), and published 12 complete, real races that were stuck hidden (Salzkammergut Trophy, Stoneman ×2, Munich-Milan Gravel, Cowlands, Monaco di Baviera Classic, Gran Fondo Schleck/Vogesen, …). Visible races 262 → 274, 0 duplicates.
- —Scraping knowledge base — documented Wiclax + EvoData providers and the WAF/browser-only rule (`docs/scraping/README.md`).