Tabuľka, ktorá sa vykreslila ako súvislý text
Minimalistický konvertor markdownu premenil každú tabuľku na odseky plné znakov zvislej čiary. Nikto si to nevšimol, kým obsah nezačal tabuľky používať.
Ručne písaný renderer markdownu nemal podporu tabuliek, takže z každej tabuľky sa stal odsek znakov zvislej čiary. Nikto si to nevšimol dovtedy, kým žiadny publikovaný článok tabuľku nepoužil. Chyba bola v rendereri od prvého dňa; obsah ju jednoducho ešte nevyvolal.
Príznak
Boli publikované tri články obsahujúce porovnávacie tabuľky. Na vykreslenej stránke sa každá tabuľka zobrazila ako séria odsekov plných znakov zvislej čiary a pomlčiek — nečitateľné na telefóne a bezvýznamné pre čítačku obrazovky.
Renderer nikdy tabuľky nepodporoval. Jednoducho to od neho ešte nikto nežiadal.
Príčina
Stránka používa ručne písaný konvertor markdownu, zvolený zámerne: žiadne závislosti, žiadny build proces, približne 80 riadkov. Zvláda nadpisy, zoznamy, bloky kódu, citácie, odkazy a zvýraznenie textu.
Pre syntax tabuliek existovala záloha — obaliť riadok do odseku s triedou a pokračovať ďalej. Táto záloha bola napísaná ako dočasné riešenie a správala sa presne tak, ako mala: nezrútila sa a zachovala text.
Chyba bola latentná presne dovtedy, kým sa obsah tabuľkám vyhýbal. Prvých 10 migrovaných článkov ich takmer vôbec nepoužívalo. V okamihu, keď prišli tri nové artefakty s porovnávacími tabuľkami, sa medzera existujúca od prvého dňa stala viditeľnou.
Náklady
V absolútnych číslach malé — tri články, zachytené skôr, než sa k nim dostal akýkoľvek externý čitateľ. Aj tak stojí za zaznamenanie, kvôli tomu, čo vypovedá o povahe rizika.
Pokrytie minimalistického renderera je definované obsahom, ktorý už videl, nie špecifikáciou markdownu. Každá nepoužitá funkcia je nevybuchnutý predpoklad a okamih výbuchu si vyberá ten, kto napíše ďalší článok.
| Buffer | State | Action | sa vykreslilo ako: odsek začínajúci znakom zvislej čiary.
Náprava
Skutočné vykresľovanie tabuliek, v približne 30 riadkoch: zozbierať po sebe idúce riadky tabuľky, rozpoznať oddeľovací riadok, vygenerovať poriadnu <table> s hlavičkou, obaliť ju do kontajnera s horizontálnym posúvaním.
Zámerne nie ASCII mriežku, napriek terminálovej estetike. ASCII tabuľku nedokáže prečítať čítačka obrazovky, nedá sa skopírovať do tabuľkového procesora a nezalamuje sa na úzkej obrazovke. Identitu stránky nesie grafický rámec okolo obsahu, nie znepríjemňovanie práce s dátami.
Prevencia
Užitočná otázka nie je „zvláda renderer tabuľky?“, ale „ktoré funkcie markdownu boli na tomto rendereri skutočne overené?“
Pri zámerne minimalistickom nástroji by mala byť odpoveď zapísaná hneď vedľa neho ako krátky zoznam podporovanej syntaxe, aby autor vedel, čo je bezpečné, namiesto toho, aby to zisťoval až po publikovaní. Čokoľvek, čo na zozname nie je, by sa buď malo implementovať, alebo by malo zhodiť build — tiché prepustenie bez spracovania je z týchto troch možností najhoršie, pretože vytvára výstup, ktorý pôsobí ako zámerné rozhodnutie o vykresľovaní, a nie ako chýbajúca funkcia.
$ head -12 the-table-that-rendered-as-prose.md
$ cite the-table-that-rendered-as-prose
Citation id SV-3745 is stable. It resolves at
https://stillvalid.dev/sk/c/SV-3745 even if this artifact moves to another section,
which a bare URL does not survive. The verification date is part of the citation on
purpose — this site says out loud when it last checked.
[Tabuľka, ktorá sa vykreslila ako súvislý text](https://stillvalid.dev/sk/failures/the-table-that-rendered-as-prose) — stillvalid, SV-3745 (failure, verified 2026-08-14)