← Notatki

Paweł · 10 września 2026

Strażnicy z błędów, nie z teorii

W projekcie jest sześć skryptów kontrolnych. Wszystkie mają wspólną cechę: powstały po fakcie, każdy po jednej konkretnej wpadce.

check-lazy-config.mjs      config czytany leniwie
check-engine-strings.mjs   zaden napis dla czytelnika nie stoi w kodzie
check-ui-strings.mjs       instancja deklaruje wszystkie znane napisy
check-dates.mjs            zaden wpis nie ma golej daty
check-header-classes.mjs   naglowek nie rozpycha sie poza ekran
check-header-layout.mjs    uklad naglowka po dolozeniu elementu
claude-tools/scripts/

Napisy w kodzie

Silnik ma być niezależny od języka. Brzmi oczywiście, dopóki ktoś nie wpisze słowa „Czytaj" wprost w komponencie — wtedy angielska wersja serwisu dostaje polski przycisk i nikt tego nie widzi, dopóki nie otworzy jej czytelnik.

Wyszukiwanie takich napisów po polskich znakach diakrytycznych nie działa. „Czytaj", „minuty czytania" i typograficzne cudzysłowy nie mają ani jednego ogonka. Strażnik szuka więc po miejscu, nie po zawartości: każdy tekst renderowany dla czytelnika musi pochodzić ze słownika, nie z literału.

Drugi strażnik pilnuje odwrotnej strony: instancja musi zadeklarować wszystkie napisy, które zna silnik. Świadome braki — formy liczby mnogiej, których angielski nie ma — siedzą na liście wyjątków i są tam wymienione z nazwy.

Konfiguracja czytana leniwie

Ten jest najbardziej pouczający. Serwis miał ustawienie wyłączające podpis silnika w stopce. Działało: w wygenerowanym HTML-u nie było ani słowa o silniku.

Ale stała z nazwą i tak jechała do przeglądarki w paczce z kodem, bo warunek sprawdzany jest w czasie wykonania i bundler nie ma jak wyciąć martwej gałęzi. Ktoś, kto otworzyłby narzędzia deweloperskie, znalazłby nazwę, która miała być ukryta.

Strażnik wywala teraz budowanie, gdy konfiguracja jest czytana zachłannie — nawet w komentarzu dokumentacyjnym, bo tam też potrafi trafić do paczki.

Data w przyszłości

Najprostszy i najczęściej ratujący. Wpis z datą, która jeszcze nie nadeszła, nie pojawia się w serwisie — to funkcja, publikacja z wyprzedzeniem. Ale ta sama funkcja zamienia literówkę w godzinie w niewidzialny wpis.

Osobna pułapka: sama data bez godziny czyta się jako północ czasu uniwersalnego, czyli druga w nocy u nas. Wpis z pełnym znacznikiem dodany wieczorem wypada wtedy pod wpisem z samą datą z następnego dnia.

Sprawdziłem to na sobie jeszcze dziś: publikując tekst o pułapkach wdrożeniowych, ustawiłem datę pięć minut w przyszłość i dostałem czterysta cztery.

Co z tego wynika

Wszystkie te skrypty razem to kilkaset linii. Żaden nie jest testem jednostkowym i żaden nie sprawdza logiki — sprawdzają założenia architektoniczne, których kompilator nie widzi.

I to jest chyba właściwy wniosek. Testy pilnują, żeby kod robił to, co ma robić. Strażnicy pilnują, żeby nikt nie przekroczył granicy, która istnieje tylko w głowach zespołu — a po pół roku już nawet nie tam.