Deník vývoje dopravního modelu — srpen 2026
Deník vývoje dopravního modelu — srpen 2026
Záznam práce, rozhodnutí a jejich zdůvodnění při přestavbě modelu na
nástroj obhajitelný na zastupitelstvu. Navazuje na PLAN.md (orchestrační
plán) a docs/kalibrace.md (metodika kalibrace). Práci prováděly
orchestrované AI agenty (implementace Sonnet, analýza/verifikace Opus,
orchestrace Fable); každá fáze končila adversariální verifikací a lidský
dohled schvaloval směr mezi fázemi.
Výchozí stav a strategická rozhodnutí
- Původně existovaly dva paralelní nástroje: mikrosimulace SUMO
(
sumo-brandys, mimo tento repozitář) a webový makroskopický model/doprava(MSA + BPR v prohlížeči, MapLibre). Rozhodnutí: hlavní nástroj je webový model — výpočet ~1 s přímo v prohlížeči zvládá libovolné kombinace uzavírek bez serveru a sedne do statického Jekyll webu. SUMO zůstává jako volitelný nezávislý validátor finálních scénářů (fáze 5 plánu, zatím neprovedena). - Účel: argumentace na zastupitelstvu a informování veřejnosti o dopadech rozkopání ulic. Z toho plyne hlavní kritérium všech rozhodnutí: obhajitelnost — každé číslo musí mít dohledatelný zdroj, každá známá slabina musí být přiznaná v dokumentaci.
Fáze 0 — stabilní ID úseků (commit 15ef816)
Problém: uzavírky, sdílené odkazy a scénáře se odkazovaly na pořadové
číslo úseku v sit.geojson; každá regenerace sítě z OSM všechna čísla
přeházela a potichu rozbila odkazy.
Řešení a vývoj úvahy: první návrh klíče <way id>#<pořadí segmentu>
verifikace zamítla s reprodukovaným důkazem — vložení uzlu do way při
běžné editaci OSM posune indexy a klíč pak ukazuje na jinou ulici, bez
varování. Finální klíč je <way id>#<node id prvního uzlu segmentu>
(u smyčkových way s příponou @n), který je stabilní vůči vkládání
uzlů i délkovému filtru; při rozdělení way v OSM si klíč udrží jen část
s původním way id (vědomé omezení, zdokumentováno v js/graf.js).
Vedlejší nález verifikace: sdílený odkaz počítal základní stav včetně
uzavírek, takže dopad vycházel +0 hodin — opraveno (základna se počítá
vždy bez uzavírek).
Fáze 1 — kalibrace na sčítání ŘSD (commity 09061b9, 53d4de5)
Data: 23 sčítacích profilů kolem dvojměstí — předběžné výsledky
celostátního sčítání 2025 (V2_CSD_2025.xlsx, rsd.cz) křížené s finálním
CSD 2020 (scitani.rsd.cz). Uloženo v data/podklady_rsd.json, cíle
v data/kalibrace.json, srovnání počítá tools/test_model.mjs
(GEH statistika).
Průběh: výchozí shoda 3/23 profilů. Většinu zlepšení nepřineslo ladění vah, ale opravy mapování profilů na síť (špatně určená poloha MÚK, D10 jako dva jednosměrné pásy, topologická rekonstrukce průběhu tahů II/610 a II/101 městem ověřená bilancemi intenzit v křižovatkách). Po vyladění GEH < 5 na 19/23.
Klíčový obrat — strukturální validace proti ČSÚ (fáze 1b): nezávislá kontrola proti dojížďce ze Sčítání 2021 odhalila, že model sedící na profilech má obrácenou strukturu: ranní špička tekla do města (1 942 voz/h od Prahy, 104 ven), zatímco vyjížďka Brandýs→Praha je
- nejsilnější proud v ČR. Příčinou byla skutečná chyba v kódu —
atrakce bran se počítala v jiných jednotkách (voz/h) než atrakce zón
(obyvatelé), brány byly jako cíle ~13× podhodnocené a kalibrace to
kompenzovala nafouknutím příjezdů. Poučení: shoda na sčítacích
profilech nestačí, protože profily měří součty obou směrů.
Opraveno oddělenou atrakční vahou
wA, realistickýmtripRateodvozeným z ČSÚ (2,8 cesty/os/den × podíl špičky × podíl řidičů) a doplněním průjezdných vazeb (mj. Neratovice↔Mladoboleslavsko přes brandýský most — doprava, která na mostě chyběla). Výsledek: GEH < 5 na 20/23, bilance města z fyzicky nemožných +2 203 na +395 voz/h, podíl Prahy 33 % produkce města. Známé napětí (dělba Praha D10:610 84:16 vs. ČSÚ 63:37) je přiznáno vzony.json.znameNapeti.
Fáze 2 — kurátorované scénáře (commit 01756dd)
Scénáře přestěhovány z kódu do data/scenare.json (formát viz
docs/formaty.md), sdílení #s=<id>, tlačítko „Zkopírovat scénář”
pro kurátory bez znalosti kódu.
Zásadní nález verifikace: scénář uzavírky centra obklíčil konektor zóny centrum — 1 344 voz/h „zmizelo” a nástroj tvrdil, že uzavírka dopravě ulevila (méně aut = méně vozokilometrů). Pro politický nástroj kredibilitní past první kategorie. Řešení v modelu, ne v datech: fallback konektoru — obklíčená zóna se přichytí na okraj uzavřené oblasti (obyvatelé vyjíždějí bočními ulicemi). Po opravě scénář centra korektně +129 vozohodin; verifikováno hashy, že bez uzavírek je výpočet bitově identický. K tomu trvalá UI pojistka: při významné neobsloužené poptávce se nikdy nezobrazí srovnávací metriky, jen výstraha.
Fáze 3 — panel „Typické cesty” (v tomto commitu)
Referenční body (data/mista.json) a doby jízdy konkrétních cest
před × po uzavírce — překlad modelu do jazyka občana („Boleslav →
náměstí: 3,1 min → 10,9 min při uzavřeném mostě”).
Blokující nález verifikace: model bez zdržení na křižovatkách jezdil
přes náměstí průměrem 48–50 km/h; absolutní časy ~2× podhodnocené proti
realitě i OSRM. Řešení (fáze 3b): křižovatkové penalizace — paušální
zdržení za průjezd křižovatkou (uzel stupně ≥ 3) odstupňované podle
třídy komunikace, parametry v KALIBRACE_KRIZOVATKY (js/graf.js).
Jdou do volného času hrany, takže se konzistentně propisují do
gravitačního modelu, přidělení i panelu cest. Následovala kompletní
rekalibrace s trojím kritériem (profily + struktura + časy):
GEH < 5 na 23/23 profilech, vše v ±15 %, městské průměry 25–33 km/h.
Věcné opravy dat z verifikace: bod „exit 14” byl ve skutečnosti
exit 10 (Brandýs, × II/101) — skutečný exit 14 (Stará Boleslav, × II/610)
je o 4 km jinde; sjednoceno v mista.json i popisech podkladů ŘSD.
Bod „U nádraží” ležel 630 m od nádraží — přejmenován na „Brandýs – západ”.
Epistemická lekce (fáze 3c): ladicí smyčka matematicky dokázala, že původní pásma „reálných časů” nejdou splnit zároveň s profily ŘSD — načež reverifikace správně otočila otázku: pásma byla odhadnutá, nikým neměřená („4–7 min na 1,7 km” = průměr 14,5 km/h, který by sám neobstál). Poučení: nejméně podložený vstup v řetězci nese největší váhu argumentace, a proto musí mít každé kritérium provenienci. Když kritérium provenienci nemá, nesmí být důvodem k ohýbání modelu, který naopak doložené vstupy má.
Co z toho zůstalo otevřené (stav ke commitu): pásma v
tools/test_model.mjs jsou pořád ta původní, odhadnutá z terénu, a tři
z pěti dvojic do nich nespadají. Test je proto vypisuje jen jako INFO
a do exit kódu nevstupují (naostro PRISNE_CASY=1). Nahradit je
měřenou referencí je nedodělek — a je na dosah: Worker doprava/worker/
sbírá dojezdové časy z TomTom Routing API na sedmi trasách, takže pásma
půjdou odvodit z opakovaného měření reálného provozu místo z odhadu.
Dořešeno téhož dne (commit b0b31b3): kritéria GEH a struktury poptávky se do té chvíle jen tiskla, takže úprava vah je mohla potichu rozbít. Nově je test vynucuje — GEH < 5 na ≥ 20/23 profilech, podíl pražských bran 30–45 %, vnitroměstské cesty 35–50 %, bilance města pod 500 voz/h. Meze jsou volnější než dosažený stav záměrně, aby model přežil aktualizaci dat ŘSD nebo regeneraci sítě; zhoršení uvnitř tolerance proto test nezachytí.
Stav k 1. 8. 2026
Hotovo: fáze 0–3 plánu (stabilní klíče, kalibrace ŘSD + ČSÚ,
scénáře jako obsah, panel typických cest s křižovatkovými penalizacemi).
Testy: node tools/test_model.mjs (plus přísný režim PRISNE_CASY=1).
Zbývá z plánu: fáze 4 — stránka metodiky pro veřejnost, prolinkování z webu, kontrola na mobilu (publikace = vědomý krok se schválením); fáze 5 (volitelná) — nezávislé ověření klíčových scénářů mikrosimulací SUMO. Backlog (PLAN.md): okrajové případy fallbacku bran, závod posuvníku intenzity, semafory z OSM dat, částečné uzavírky (kyvadlový provoz), MHD vrstva.
Souběžně (mimo tuto práci) vzniká v repu doprava/worker/ a
js/zive.js — sběr živých dat; není součástí těchto commitů.