Jeden Skan strony, od Zlecenia skanu do subtaska.
Ten przewodnik prowadzi przez jeden Skan jednej strony i nazywa wszystko po drodze: który Check mierzy który parametr, jaki plik go wykonuje, co zostaje w zapisie i co z tego trafia do zadania w ClickUpie. Przykładem jest strona demonstracyjna sklep-demo.pl.
Strona podaje nazwy plików i modułów — to karta techniczna, nie opis procesu. Sam obieg opisuje Pętla doskonaląca, architekturę — Skaner, a pojedyncze pomiary — karty parametrów. Stan kodu z 22.09.2026, nazwy pojęć według słownika z 29.09.2026.
- Kroków Skanu
- 10od Zlecenia skanu do zapisu
- Checks Skanera
- 12z plikiem karta.toml 10
- Parametrów
- 87mierzonych 87
- Helperów w skanie
- 27bezpieczeństwo i wspólne
Result jest niezmienny — nie nadpisujemy go nigdy, bo powtórka reguły na zapisanych pomiarach potrzebuje oryginału. Result check niesie wersję reguł, które go wydały; wskaźnik liczy się wyłącznie z usterek potwierdzonych, nie z tych w okresie łaski.
| Nr | Krok | Plik | Co się dzieje | Co zostaje |
|---|---|---|---|---|
| 01 | Wejście: kto zleca skan | skaner/cli_strona.py · skaner/api.py · skaner/harmonogram (kohorty.toml) | Skrót „Skan strony”, panel albo harmonogram wołają jedno wejście: skanuj(domena, sondy, kto). Zlecenie skanu dostaje pole zrodlo — harmonogram albo ręczne. | wiersz w tabeli `zlecenia` (stan: nowe) i pozycje strona × Check w kolejce |
| 02 | Kolejka: pobranie Zlecenia skanu | skaner/kolejka.py · skaner/worker.py::petla | Worker zagląda do kolejki co 5 s ([worker] odpytuj_s), bierze jedno Zlecenie skanu i przestawia je na w_toku. Dwa Zlecenia skanu naraz (rownolegle_zlecenia = 2), żeby skan bezpieczeństwa nie blokował dostępności. | Zlecenie skanu w stanie `w_toku` z sygnaturą czasu i pulsem workera |
| 03 | Grupowanie pozycji po Checku | skaner/worker.py::wykonaj (L213–216) | Pozycje Zlecenia skanu lądują w słowniku „Check → lista stron”. Jeden Check = jedno uruchomienie helpera na paczce stron, nie na każdej z osobna. | nic trwałego — układ pracy na czas Skanu |
| 04 | Wybór trasy: plik karta.toml czy moduł | skaner/worker.py (L217–230) · skaner/limity.toml | Wpis [bez_karty.<check>] wygrywa z plikiem karta.toml. Check bez pliku karta.toml i bez wpisu jest pomijany, a Zlecenie skanu dostaje uwagę i kończy się stanem blad. | uwaga w dzienniku Zlecenia skanu, gdy Check nie ma żadnej trasy |
| 05 | Izolacja i limity usług zewnętrznych | skaner/worker.py::srodowisko, uwzglednij_limity · skaner/limity.toml | Z procesu helpera znikają zmienne z danymi dostępowymi (CLICKUP, LAB247, SMTP, N8N, MAIL…), stan idzie do katalogu cienia, a licznik na dobę pilnuje Safe Browsing (3000) i WPScan. Po limicie Check rusza bez usługi, z jawnym wpisem. | wiersz w `limity_zuzycie` i ewentualny wpis „usługa pominięta: limit” |
| 06 | Pomiar Checkiem z plikiem karta.toml | skaner/adapter.py::wykonaj_karte · sondy/<id>/karta.toml | Wejście przycięte do pól z pliku karta.toml → walidacja (bledy_wejscia) → helper → walidacja wyjścia wobec schematu z pliku karta.toml. Wynik niezgodny z plikiem karta.toml to awaria Checku, nie wynik strony. | Result z `wersja_sondy` = numer z pliku karta.toml, czas trwania, dowody |
| 07 | Pomiar Checkiem bez pliku karta.toml | skaner/worker.py::uruchom_bez_karty · skaner/importuj.py | Helper uruchamiany dokładnie jak na produkcji, z CREATO_PING_ODCZYTY_DIR wskazującym katalog tymczasowy Zlecenia skanu. Jego plik JSONL worker importuje do bazy pod swoim Zleceniem skanu — ten sam kształt Resultu co w imporcie produkcji. | Result z `wersja_sondy` = `helper:<sha>` (bez numeru wersji, bo bez pliku karta.toml) |
| 08 | Klasyfikacja: Result → Result check | skaner/klasyfikacja.py · config/incident_policy.toml | Czysta funkcja bez skutków ubocznych: ten sam Result i te same reguły dają ten sam Result check. Przy każdym Result checku zapisywana jest wersja_regul — bez niej nie da się powtórzyć ani porównać. | Result check na parę (Result, typ Findingu) ze skutkiem i wersją reguł |
| 09 | Akcje i zapis w cieniu | skaner/akcje.py · skaner/cien_clickup.py | „Co bym zrobił” liczone z reguł akcji, a adapter ClickUp w cieniu buduje plan zapisu na najświeższej migawce listy Strony. Nic nie jest wysyłane; błąd cienia nie psuje Zlecenia skanu. | plan w `zapisy_cienia` — materiał do porównania z tym, co zapisał writer |
| 10 | Zapis: ClickUp i Results do LAB247 | skaner/produkcja.py::zapisz · skaner/adapter_clickup.py | Tylko dla Zleceń skanu o źródle harmonogram (worker.py:210) i tylko w trybie produkcji. Zapis do ClickUp przepuszcza wyłącznie jawne SKANER_CLICKUP_ZAPIS=tak — bez tego Results idą do LAB247, a zapis jest nagrywany. | wiersz w `zapisy_produkcji` (action_log, errors, transitions) + koperta Results dla LAB247 |
- ok
- ok pomiar się udał i wynik jest dobry
- fail
- fail pomiar się udał, a wynik jest zły — to otwiera Finding
- timeout
- timeout pomiar się nie udał w limicie czasu; nie znaczy „strona nie działa”
- awaria Checku
- awaria Checku wyjście niezgodne z plikiem karta.toml — problem nasz, nie strony; osobna kolejka do naprawy
Krok 10 rozstrzyga się na jednym warunku: ręczne Zlecenie skanu (skrót „Skan strony”, panel, wiersz poleceń) nigdy nie idzie do ClickUpa — zostaje podglądem. Do zapisu kwalifikuje się wyłącznie Zlecenie skanu o źródle „harmonogram”.
| Check | Wersja | Helper | Co mierzy · parametry | Limit | Paczka |
|---|---|---|---|---|---|
| tcp | 1.1.0 | helpers/tcp_check.py | Czy serwer przyjmuje połączenie TCP na porcie (domyślnie 443)tcp | 2,0 s | 50 |
| dns | 1.0.0 | helpers/dns_check.py | Czy domena rozwiązuje się na rekord A i czy znany adres jest wśród odpowiedzidns | 2,0 s | 50 |
| http | 1.0.0 | helpers/http_check.py | Kod odpowiedzi GET po przekierowaniach (najwyżej 5)http-status | 5,0 s | 50 |
| content | 1.0.0 | helpers/content_check.py | Czy strona zawiera oczekiwany fragment tekstu (dokładny podciąg, wielkość liter ma znaczenie)content | 5,0 s | 50 |
| redirect | 1.0.0 | helpers/redirect_check.py | Czy http:// przekierowuje na https:// i ile przeskoków ma łańcuchhttp-https-redirect · redirect-chain | 7,0 s | 50 |
| www_redirect | 1.0.0 | helpers/www_redirect.py | Czy obie formy adresu kończą na jednym hoście, a nie są dwiema wersjami stronywww-redirect | 7,0 s | 50 |
| ttfb | 1.0.0 | helpers/ttfb_check.py | Czas do odpowiedzi z histerezą: porażka dopiero po serii wolnych pomiarówttfb | 10,0 s | 50 |
| ssl | 1.1.0 | helpers/ssl_check.py | Certyfikat TLS na 443: data wygaśnięcia i zgodność nazwy domeny z SAN (zapas: CN)ssl-valid · ssl-days | 4,0 s | 50 |
| partial_availability | 1.0.0 | helpers/partial_availability_check.py | Czy działa tylko jedna z form adresu, albo obie wyłącznie z pominięciem weryfikacji certyfikatussl-valid | 15,0 s | 50 |
| exposure | 1.1.0 | helpers/exposure_check.py | Czy strona wystawia publicznie pliki i punkty wejścia ułatwiające atak (25 ścieżek)env-exposure · sensitive-files · htaccess-bak · xmlrpc · user-enum · git-exposure · readme · wp-cron · backup-exposure · sql-dump-exposure · dev-manifest · ds-store | 15,0 s | 4 |
Każdy Check z plikiem karta.toml ma go w sondy/<id>/karta.toml. Test helpers/tests/test_karty_sond.py wykonuje jego przypadki testowe bez sieci i pada, gdy plik karta.toml rozjedzie się z kodem: brak przypadku zapalającego, wynik spoza schematu, limit inny niż w konfiguracji, helper, którego nie ma.
| Check | Moduł | Paczka | Limit | Usługi zewnętrzne | Uwaga |
|---|---|---|---|---|---|
| dns | helpers.dns_check | 50 | 180 s | — | Ma też plik karta.toml, ale wpis w limitach wygrywa. |
| http | helpers.http_check | 50 | 180 s | — | Jak wyżej. |
| content | helpers.content_check | 50 | 180 s | — | Jak wyżej. |
| redirect | helpers.redirect_check | 50 | 180 s | — | Jak wyżej. |
| www_redirect | helpers.www_redirect | 50 | 180 s | — | Jak wyżej. |
| ttfb | helpers.ttfb_check | 50 | 180 s | — | Jak wyżej. |
| partial_availability | helpers.partial_availability_check | 50 | 180 s | — | Jak wyżej. |
| security_pelny | helpers.security_runner --level p3 | 16 | 1800 s | safebrowsing, wpscan | Jeden proces, trzynaście sposobów sprawdzenia (TAB. 4). Paczka 16 stron — tyle samo, co workflow bezpieczeństwa w n8n. |
| security_p4 | helpers.security_runner --level p4 | 16 | 900 s | safebrowsing | Szybki Skan: tylko infekcja i Safe Browsing — ewidentne przejęcie widoczne z zewnątrz. |
Siedem Checks dostępności ma jednocześnie plik karta.toml i wpis w limitach — wpis wygrywa. Plik karta.toml opisuje je i testuje, ale nie zmienia sposobu uruchamiania: przejście na trasę pliku karta.toml to świadome usunięcie wpisu, nie efekt uboczny.
| Czym się różnią | Trasa pliku karta.toml | Trasa modułu |
|---|---|---|
| Kto rozstrzyga | sondy/<id>/karta.toml | skaner/limity.toml — sekcja [bez_karty.<check>] |
| Jak leci pomiar | Wejście przycięte do pól pliku karta.toml, walidacja wejścia, helper, walidacja WYJŚCIA wobec schematu | Helper uruchamiany dokładnie tak, jak na produkcji — bez sprawdzania kształtu wyniku |
| Skąd bierze się Result | Wprost do bazy skanera, bez pliku pośredniego | Plik JSONL w katalogu tymczasowym Zlecenia skanu, potem import do bazy |
| Wersja w zapisie Resultu | Numer z pliku karta.toml — podbijany świadomie przy zmianie logiki | Skrót pliku helpera — zmienia się sam przy każdej edycji |
| Wynik niezgodny z opisem | Awaria Checku: osobny stan i osobna kolejka do naprawy | Nie do wykrycia — wchodzi do bazy jak każdy inny wynik |
Obie trasy istnieją, bo Skaner przejął pomiary od poprzedniego układu stopniowo — przepisanie wszystkich Checks naraz groziłoby regresją na produkcji. Trasa pliku karta.toml daje jedno, czego druga nie ma: opis w pliku karta.toml, który da się sprawdzić testem. Check bez pliku karta.toml i bez wpisu w limitach jest pomijany, a Zlecenie skanu kończy się błędem — nie ma cichego przejścia.
| Powód | Kogo dotyczy | Na czym polega |
|---|---|---|
| Kształt wynikunie do opisania | security_pelny, security_p4 | Plik karta.toml dopuszcza dwa kształty: jeden wynik na domenę albo lista znalezisk. Jeden proces oddający wyniki trzynastu sposobów sprawdzenia naraz nie mieści się w żadnym z nich — plik karta.toml dostałby dopiero po rozbiciu na osobne Checks. |
| Budżet usługi zewnętrznejbrak pola | security_pelny (Safe Browsing, WPScan) | Check sięgający po usługę z limitem na dobę musi ten limit zadeklarować. Pole limit_zewn istnieje w pliku karta.toml, ale we wszystkich dziesięciu jest puste — licznik trzyma dziś skaner/limity.toml, nie plik karta.toml. |
| Wstrzymana migracjadecyzja | 7 Checks dostępności | dns · http · content · redirect · www_redirect · ttfb · partial_availability mają jednocześnie plik karta.toml i wpis w limitach. Plik karta.toml je opisuje i testuje, ale nie zmienia sposobu uruchamiania: przejście na trasę pliku karta.toml ma być decyzją (usunięciem wpisu), nie skutkiem ubocznym dopisania pliku. |
Stąd wniosek, którego nie widać w samym zestawieniu Checks: trasą pliku karta.toml jadą dziś tylko trzy — połączenie TCP, certyfikat i wystawione pliki. Pozostałe siedem plików karta.toml jest napisanych i testowanych, ale nieużywanych do uruchamiania. To stan przejściowy, nie docelowy.
| Helper | Co robi | Poziom |
|---|---|---|
| helpers/preflight.py | Odsiewa domeny bez rekordu A i strony w budowie, zanim ruszy jakikolwiek pomiar | P3 i P4 |
| helpers/html_fetch.py | Jedno pobranie HTML współdzielone przez wszystkie sprawdzenia w paczce (BatchHtmlCache) | P3 i P4 |
| helpers/wp_fingerprint.py | Wersja rdzenia WordPressa z nagłówków, znacznika generator i sum kontrolnych | tylko P3 |
| helpers/vuln_match.py | Zestawienie wykrytych wtyczek i motywów z indeksem CVE (feed Wordfence) | tylko P3 |
| helpers/wpscan_lookup.py | Rozstrzygnięcie wątpliwego dopasowania CVE — usługa zewnętrzna z twardym budżetem | tylko P3 |
| helpers/infection_check.py | Złośliwy skrypt, spam SEO, ukryta ramka, cloaking i bramki znanych kampanii | P3 i P4 |
| helpers/safebrowsing.py | Zapytanie do Google Web Risk: czy strona jest oflagowana jako phishing lub malware | P3 i P4 |
| helpers/exposure_check.py | 25 ścieżek: .env, .git, kopie zapasowe, zrzuty bazy, xmlrpc, enumeracja użytkowników | tylko P3 |
| helpers/indexability_check.py | noindex w znaczniku meta albo w nagłówku X-Robots-Tag | tylko P3 |
| helpers/sitemap_check.py | Obecność mapy witryny i absurdalna liczba adresów w niej | tylko P3 |
| helpers/robots_check.py | Dostępność robots.txt i blokada całego serwisu | tylko P3 |
| helpers/security_headers.py | Sześć nagłówków ochronnych: HSTS, X-Frame-Options, nosniff, CSP, Referrer-Policy, Permissions-Policy | tylko P3 |
| helpers/mixed_content.py | Zasoby ładowane po HTTP na stronie HTTPS | tylko P3 |
| helpers/seo_check.py | Canonical, tytuł strony i spójność linków wewnętrznych z HTTPS | tylko P3 |
| helpers/ip_change.py | Porównanie adresu IP ze wzorcem z poprzedniego Skanu | tylko P3 |
| helpers/dns_integrity_check.py | NS, MX, SPF i DMARC wobec wzorca — wykrywa zniknięcie rekordu | tylko P3 |
| helpers/version_summary.py | Zbiera wersje i podatności w jedno podsumowanie zamiast wpisu na każdą wtyczkę | tylko P3 |
| helpers/wporg_versions.py | Najnowsze wydania wtyczek i motywów z katalogu WordPressa — odniesienie dla wersji na stronie | tylko P3 |
| helpers/incident_policy.py | Bramka: który Finding w ogóle idzie dalej (gate), z jakim skutkiem i wagą | P3 i P4 |
Jedno wywołanie helpers/security_runner.py, jedno pobranie HTML na stronę, wiele sprawdzeń. Dlatego w zestawieniu Checks widać dwie pozycje, a w zapisie — kilkanaście Results z jednego Skanu. Plików jest 19, a sposobów sprawdzenia trzynaście: pięć pozycji to zaplecze — odsiew domen, wspólne pobranie HTML, bramka polityki, rozstrzyganie wątpliwych CVE i składanie podsumowania wersji.
| Plik | Rola w Skanie |
|---|---|
| helpers/common.py | Wspólny kształt wyniku, dziennik, wczytanie listy stron, emisja wyników |
| helpers/config.py | Limity czasu per rodzaj sprawdzenia i równoległość paczki — jedno miejsce dla wszystkich Checks |
| helpers/odczyty.py | Zapis surowego wejścia i wyjścia każdego Checku do pliku JSONL |
| helpers/dowody.py | Fragment, który zapalił Check — z maskowaniem wartości wrażliwych |
| helpers/network_block_check.py | Rozróżnia „strona nie działa” od „hosting zablokował nasz adres” |
| helpers/wyjatki_falszywych_alarmow.py | Wąski rejestr wyjątków: znane fałszywe alarmy nie otwierają Findingu |
| helpers/site_params.py | Parametry strony i sprawdzenia krytyczne (okres łaski przed statusem DOWN) |
| helpers/checks_publish.py | Koperta Results dostępności wysyłana do bazy LAB247 |
| Pole | Wartość w przykładzie | Po co |
|---|---|---|
| [sonda] id | tcp | Nazwa Checku; musi zgadzać się z nazwą katalogu |
| [sonda] wersja | 1.1.0 | Podbijana przy każdej zmianie logiki helpera — trafia do Resultu |
| [sonda] helper | helpers/tcp_check.py | Plik wykonujący pomiar; czytnik sprawdza, że istnieje |
| [sonda] check_type | tcp | Klucz limitu czasu i klucz w zapisie do ClickUp |
| [sonda] mierzy | Czy serwer przyjmuje połączenie TCP na porcie (domyślnie 443) | Jedno zdanie po polsku — co ten Check sprawdza |
| [sonda] parametry | ["tcp"] | Identyfikatory parametrów z katalogu LAB247 — spina plik karta.toml z kartą parametru |
| [sonda] timeout_s | 2.0 | Limit pomiaru; twardy limit to timeout + 0,5 s |
| [sonda] rownoleglosc | 50 | Ile stron w paczce naraz |
| [logika] ok | Połączenie zestawione przed upływem 2,5 s; gniazdo od razu zamykane | Kiedy wynik jest dobry — słowami, nie kodem |
| [logika] fail | Dowolny wyjątek przy łączeniu (odmowa, brak trasy, błąd DNS) | Kiedy wynik jest zły |
| [logika] timeout | Połączenie nie zestawione w 2,5 s | Kiedy pomiar się nie udał |
| [logika] nota | Sonda nie wysyła danych i nie weryfikuje TLS. Jest krytyczna: 1. porażka = okres łaski, 2. z rzędu = DOWN | Zastrzeżenia zakresu |
| [wejscie] wymagane | ["domain"] | Pola, bez których Zlecenie skanu jest błędne |
| [wyjscie] ksztalt | wynik_na_domene | Jeden wynik na stronę albo lista znalezisk |
| [wyjscie] dowod | pelny | pelny · maskowany · tylko_skrot · brak — ile wolno zapisać z treści |
| [wyjscie] statusy | ["ok", "fail", "timeout"] | Zamknięty zbiór stanów |
| [wyjscie] zapalajace | ["fail", "timeout"] | Które stany otwierają Finding |
| [[przypadek]] | 3 przypadki testowe: połączenie ok · odmowa · zawieszenie | Przypadki testowe pliku karta.toml; musi być co najmniej jeden zapalający (kontrola pozytywna) i jeden ok |
Plik karta.toml opisuje pomiar: co Check robi z siecią i jaki wynik wolno mu zwrócić. Karta parametru opisuje znaczenie: co ten pomiar znaczy dla właściciela strony. Spina je pole parametry w pliku karta.toml.
| Pole | Wartość w przykładzie | Po co |
|---|---|---|
| id | tcp | Kotwica w dokumentacji: /wiedza/parametry#tcp |
| area | availability | Obszar: dostępność · bezpieczeństwo · SEO |
| name | Połączenie TCP | Nazwa po polsku, ta sama w panelu i w dokumentacji |
| description | Czy port 80/443 serwera odpowiada na połączenie | Co to znaczy dla właściciela strony |
| importance | 5 | 5 krytyczna · 4 wysoka · 3 średnia · 2 niska |
| icon | D01 | Klucz bitmapy ikony parametru |
| probe | tcp | Check, który ten parametr mierzy — spina z plikiem karta.toml |
| helper | tcp_check | Moduł wykonujący pomiar |
| workflows | creato_ping_avail_v2 | Który workflow n8n go zbiera |
| findings | ["tcp"] | Findings, jakie ten parametr może otworzyć |
| measured | true | Czy ktokolwiek dziś mierzy to na produkcji |
| planned | — | Znacznik parametru bez Checku: opisany, ale niemierzony |
| note | — | Zastrzeżenie zakresu albo luka — widoczne też w dymku ikony |
Źródłem jest data/parameters.ts — jeden plik czytany przez dokumentację, dymek ikony, harmonogram i przegląd strony w panelu. Pełna plik karta.toml każdego parametru: katalog parametrów.
| Co zlecono | Harmonogram wystawia Zlecenie skanu na sklep-demo.pl z zestawem Checks dostępności (7) oraz security_pelny. Źródło: harmonogram, więc zapis do ClickUp jest w ogóle brany pod uwagę. |
| Ile pomiarów | Siedem Checks dostępności daje 7 Results. security_pelny to jeden proces, ale w środku trzynaście sprawdzeń — każde zapisuje własny Result przez helpers/odczyty.py. |
| Co wyszło | exposure znajduje dostępne .git/HEAD, seo brak znacznika canonical, a vuln_match nie kończy się w limicie. Reszta na ok. |
| Result checks | Bramka polityki przepuszcza ekspozycję repozytorium (wystawiony plik) i brak canonical (higiena). Nieudany pomiar CVE dostaje skutek „nie dało się sprawdzić” — nie jest liczony jako niezaliczony Check. |
| Subtask 2 · Pomiar | niezaliczone_testy: 2, nieudane_pomiary: 1, pod kreską dwie pozycje wypisane po jednej. Udane pomiary tylko jako liczba — inaczej lista rośnie o rzeczy bez treści. |
| Subtask 1 · Podsumowanie | Ekspozycja repozytorium ma wagę 3 → pasmo 5–6. Nasilenie nie zaskakuje (jedna usterka wagi dominującej, dwa obszary, zero usterek wagi 2), więc całkowita część to dolny punkt pasma: 5. Rozlanie dokłada 0,1 za drugi obszar — wskaźnik 5,1/10, kolor żółty (status sredni). Nieudany pomiar CVE ląduje w sekcji „czego nie zmierzyliśmy” i nie obniża wskaźnika. |
| Co naprawdę zostaje | Results, Result checks, plan cienia i wiersz w zapisy_produkcji — wszystko w bazie Skanera. Z tego Skanu strony do ClickUpa nie idzie nic. Subtaski, które widać dziś na liście, pochodzą z ręcznej projekcji i noszą jeszcze stare nazwy. |
| Klucz | Przykład | Skąd się bierze |
|---|---|---|
| niezaliczone_testy | 2 | Result checks o skutku innym niż „brak problemu”, „bez subtaska” i nieudany pomiar |
| nieudane_pomiary | 1 | Skutki „nie dało się sprawdzić” i „bez oceny” — pomiaru nie było |
| informacyjne | 3 | Pomiar się udał, ale polityka nie robi z tego Findingu |
| udane_pomiary | 14 | Reszta — wyłącznie jako liczba, bez listy pozycji |
| ostatni_skan | 2026-09-22 04:12 | Czas najświeższego Resultu strony |
| skanow | 20 | Ile Results złożyło się na ten obraz |
Pod kreską dwie listy: niezaliczone Checks i nieudane pomiary, po jednej pozycji na wiersz, bez komentarza. Udane pomiary zostają wyłącznie liczbą. Rozdział „niezaliczony” od „nieudany” robi jedna funkcja, żeby nazwa subtaska nie mówiła czegoś innego niż jego treść.
| Klucz | Przykład | Skąd się bierze |
|---|---|---|
| wskaznik | 5,1/10 | Pasmo z wagi + nasilenie, a po przecinku rozlanie problemu |
| ocena | 5 | Liczba całkowita — kontrakt panelu LAB247 |
| kolor | żółty | Pasmo wskaźnika → status listy Strony |
| usterka_dominujaca | exposure_git | Typ najcięższej potwierdzonej usterki (waga 3) |
| liczba_usterek | 2 | Tylko potwierdzone; okres łaski się nie liczy |
| usterek_wagi_dominujacej | 1 | Próg nasilenia: ≥ 2 przesuwają wskaźnik na cięższy punkt pasma |
| obszary | bezpieczeństwo, SEO | Rozlanie: każdy obszar ponad pierwszy dokłada 0,1 |
| pomiar_pelny | tak | „nie” → strona idzie na status „niezbadana” |
Kolejność jest logiczna, nie czasowa: Pomiar to surowe wyniki Checks, a Podsumowanie liczy się z potwierdzonych usterek, więc bez pomiaru nie ma wskaźnika. Wagę usterki bierze katalog usterek atomowych: waga najcięższej wybiera pasmo (5 → 9–10, 4 → 7–8, 3 → 5–6, 2 → 3–4, 1 → 2), druga cyfra pochodzi z nasilenia. Bez sumowania — dziesięć drobiazgów to nadal 2/10.
| Warstwa | Kto to robi | Stan na dziś |
|---|---|---|
| Cień po każdym Zleceniu skanudziała | skaner/cien_clickup.py | Po każdym Zleceniu skanu worker buduje plan „co bym zapisał” na migawce listy Strony i odkłada go w bazie. ClickUp jest wyłącznie czytany. |
| Produkcja z harmonogramunagrywa | skaner/produkcja.py::zapisz | Results dostępności idą do bazy LAB247 naprawdę. Zapis do ClickUp jest wstrzymany decyzją właściciela z 19.09: bez SKANER_CLICKUP_ZAPIS=tak każde wywołanie jest tylko nagrywane w `zapisy_produkcji`. |
| Pięć ponumerowanych subtaskówręcznie | skaner/prezentacja.py + tools/projekcja_clickup.py | Kształt subtasków 1–5 liczy stan_docelowy. Na ścieżce workera go nie ma: wołają go panel LAB247 (wskaźnik strony) i narzędzie projekcji, domyślnie w suchym biegu. Wysyłka dopiero z przełącznikiem --zapisz. |
Dlatego zdanie „skan zapisuje subtaski” jest dziś nieprawdziwe. Skan liczy, co zapisałby, i to odkłada. Wysyłkę odblokuje jawne ustawienie w środowisku usługi — z zasadą „brak zmiennej, literówka, cokolwiek innego = wstrzymane”.
| Nr | Gdzie | Kto zapisuje | Co tam trafia | Kiedy |
|---|---|---|---|---|
| 01 | <CREATO_PING_ODCZYTY_DIR>/<data UTC>/<id Checku>.jsonl | helpers/odczyty.py | Jedna linia = jedna strona w jednym Checku: czas, Check, domena, wejście, wyjście, czas trwania, wersja kodu. Dopisywane jednym zapisem z blokadą pliku, bo dostępność i bezpieczeństwo piszą naraz. Linia ponad pół megabajta dostaje obcięte wyjście z jawnym znacznikiem. | tylko Checks BEZ pliku karta.toml |
| 02 | baza Skanera → tabela Results (odczyty) | skaner/adapter.py:220 · skaner/importuj.py:117 | Kanoniczny zapis pomiaru: tu trafia wynik każdego Checku. Check z plikiem karta.toml pisze wprost po walidacji wyjścia, Check bez pliku karta.toml — przez import pliku z kroku 01. Wejście i wyjście leżą w kolumnach jako wartości, nie jako osobne pliki. | zawsze |
| 03 | baza Skanera → Result checks, akcje | skaner/klasyfikacja.py · skaner/akcje.py | Result check na parę (Result, typ Findingu) razem z wersją reguł, które go wydały, i plan „co bym zrobił”. | zawsze |
| 04 | katalog stanu cienia | worker.py::srodowisko | Wzorce do porównań między Skanami: poprzedni adres IP, poprzednie rekordy poczty, passa wolnych pomiarów. | zawsze |
| 05 | baza Skanera → zapisy cienia i produkcji | skaner/cien_clickup.py · skaner/produkcja.py | Plan zapisu policzony na migawce listy stron oraz nagranie tego, co poszłoby do ClickUpa. | zawsze |
| 06 | skrzynka Results → skaner_z<numer>.json | skaner/produkcja.py:165 | Paczka dla bazy LAB247, zapisywana w całości naraz. To już nie jest surowe wyjście Checku — rekord jest spłaszczany do tego, co baza przyjmuje, a odrzucone pozycje idą obok, z powodem. Skrzynkę opróżnia osobny timer; skaner nie zna hasła do bazy. | tylko Zlecenie skanu z harmonogramu |
| 07 | ClickUp | skaner/adapter_clickup.py | Bez jawnego przełącznika w środowisku usługi nie powstaje żaden zapis zdalny — wywołanie zostaje samym nagraniem z kroku 05. | harmonogram + odblokowany zapis |
- Plik JSONL to tor jednej grupy Checks
- Check z plikiem karta.toml go nie tworzy: adapter kasuje wskazanie katalogu Results ze środowiska jego procesu, a wynik idzie prosto do bazy.
- Kanoniczny zapis pomiaru
- Tabela Results w bazie Skanera — jedyne miejsce, w którym Skan strony zachowuje wynik KAŻDEGO Checku, niezależnie od trasy.
- Wynik w kolumnie, nie w pliku
- Wejście i wyjście Checku leżą w bazie jako wartości kolumn. Na dysku nie powstaje z nich osobny plik.
Kroki 01–05 dzieją się przy każdym Zleceniu skanu, także ręcznym. Kroki 06 i 07 wymagają Zlecenia skanu z harmonogramu, a sam 07 dodatkowo — jawnego odblokowania zapisu. Dlatego Skan uruchomiony skrótem zostawia pełny ślad w bazie Skanera i zero śladu poza nią.
| Obszar | Parametr | Check | Helper | Findings, jakie otwiera |
|---|---|---|---|---|
| D | Połączenie TCP | tcp | tcp_check | tcp |
| D | Rozwiązywanie DNS | dns | dns_check | dns |
| D | Kod odpowiedzi HTTP | http | http_check | http |
| D | Weryfikacja treści | content | content_check | content |
| D | Przekierowanie HTTP → HTTPS | redirect | redirect_check | redirect |
| D | Przekierowanie www ↔ bez www | www_redirect | www_redirect | www_redirect, partial_availability |
| D | Długość łańcucha przekierowań | redirect | redirect_check | — |
| D | Próg TTFB | ttfb | ttfb_check | ttfb |
| D | Monitoring zablokowany albo ślepy | monitoring_block | druga_opinia | — |
| D | Formularz i odnośniki kontaktowe | contact_links | site_pages_check | zepsuty_kontakt |
| B | SSL: ważność certyfikatu | partial_availability | partial_availability_check | ssl |
| B | SSL: dni do wygaśnięcia | ssl | ssl_check | ssl_expiry |
| B | Wygaśnięcie domeny | domain_expiry | domain_expiry | domain_expiry |
| B | Google Safe Browsing | safe_browsing | safebrowsing | infection_safe_browsing, safebrowsing_flagged |
| B | Ekspozycja .env | exposure | exposure_check | exposure_env, exposure_scan_unreliable |
| B | Wstrzyknięty skrypt | infection | infection_check | infection_base64_eval, infection_same_origin_loader, infection_socgholish_gateway, infection_etherhiding |
| B | Luki wtyczek i motywów | vuln_match | vuln_match | vuln_cve |
| B | Wersja WordPressa | wp_fingerprint | wp_fingerprint | wp_fingerprint, outdated_wp |
| B | Kopie wp-config.php | exposure | exposure_check | exposure_wpconfig_bak, exposure_wpconfig_tilde |
| B | Ekspozycja .htaccess.bak | exposure | exposure_check | exposure_htaccess_bak |
| B | Dostępność xmlrpc.php | exposure | exposure_check | exposure_xmlrpc |
| B | REST API: enumeracja użytkowników | exposure | exposure_check | exposure_users_enum, exposure_author_enum |
| B | Ekspozycja .git/HEAD | exposure | exposure_check | exposure_git |
| B | Mixed content | mixed_content | mixed_content | mixed_content |
| B | Nagłówek HSTS | security_headers | security_headers | missing_hsts |
| B | Zmiana adresu IP | ip_change | ip_change | ip_changed |
| B | Dostępność readme.html | exposure | exposure_check | exposure_readme |
| B | Dostępność wp-cron.php | exposure | exposure_check | exposure_wpcron |
| B | X-Frame-Options | security_headers | security_headers | missing_xframe |
| B | X-Content-Type-Options | security_headers | security_headers | missing_nosniff |
| B | Content-Security-Policy | security_headers | security_headers | missing_csp |
| B | Referrer-Policy | security_headers | security_headers | missing_referrer_policy |
| B | Permissions-Policy | security_headers | security_headers | missing_permissions_policy |
| B | Rekord SPF | dns_integrity | dns_integrity_check | dns_spf_missing |
| B | Rekord DMARC | dns_integrity | dns_integrity_check | dns_dmarc_missing |
| B | Zdjęcie SPF/DMARC | dns_integrity | dns_integrity_check | dns_mail_auth_removed |
| B | Ekspozycja kopii zapasowych | exposure | exposure_check | exposure_backup_archive |
| B | Ekspozycja zrzutu bazy | exposure | exposure_check | exposure_sql_dump |
| B | Ekspozycja manifestów dev | exposure | exposure_check | exposure_dev_manifest |
| B | Ekspozycja .DS_Store | exposure | exposure_check | exposure_ds_store |
| B | Rekord DKIM | dkim | higiena_check | — |
| B | Wersja PHP i koniec wsparcia | php_wersja | higiena_check | outdated_php |
| B | Wersja TLS i siła szyfrów | tls_wersje | higiena_check | tls_przestarzaly |
| B | Skrypty z domen wygasłych | skrypty_domeny | higiena_check | exposure_script_domain_unregistered |
| B | Cloaking i spam SEO | infection | infection_check | infection_cloaking, infection_seo_spam, bot_protection_detected |
| B | Obce skrypty i ukryte ramki | infection | infection_check | infection_foreign_script, infection_hidden_iframe |
| B | Ekspozycja debug.log | exposure | exposure_check | exposure_debug_log |
| B | Listowanie katalogów | exposure | exposure_check | exposure_directory_listing |
| B | Ekspozycja phpinfo | exposure | exposure_check | exposure_phpinfo |
| B | Konsola bazy danych | exposure | exposure_check | exposure_db_console |
| B | Wyciek ścieżek serwera | path_leak | site_pages_check | exposure_path_leak |
| B | Luki rdzenia WordPressa | vuln_match | vuln_match | vuln_wp_core |
| B | Nieaktualne wtyczki i motywy | vuln_match | vuln_match | outdated_plugin, outdated_theme |
| B | Koniec wsparcia CMS | cms_eol | site_pages_check | eol_cms |
| B | Zmiana rekordów NS i MX | dns_integrity | dns_integrity_check | dns_ns_changed, dns_mx_changed |
| B | Otwarta rejestracja kont | exposure | exposure_check | open_registration |
| B | Wtyczka administracyjna niezweryfikowana | unverified_admin_plugin | agenci_ai | wtyczka_administracyjna_niezweryfikowana |
| B | Skan infekcji nierozstrzygnięty | infection | infection_check | infection_scan_unknown |
| S | Indeksowalność | indexability | indexability_check | noindex |
| S | Sitemap.xml | sitemap | sitemap_check | sitemap_absurd_url_count |
| S | Spójność HTTP → HTTPS | seo | seo_check | seo_http_https_mismatch |
| S | Canonical URL | seo | seo_check | seo_canonical_missing |
| S | robots.txt | robots | robots_check | robots_block_all, robots_missing |
| S | Tytuł strony | seo | seo_check | seo_title_missing |
| S | Liczba zaindeksowanych podstron | indexed_pages | indexed_pages | indexed_pages_drop |
| S | Monitoring kluczowych podstron | key_pages | site_pages_check | key_page_unavailable, key_page_tampered |
| E | Koszyk odpowiada | sklep_koszyk | sklep_check | sklep_koszyk_nie_dziala |
| E | Kasa działa | sklep_kasa | sklep_check | sklep_kasa_nie_dziala, sklep_brak_platnosci |
| E | Obcy skrypt na stronie kasy | sklep_skrypty_kasy | sklep_check | sklep_obcy_skrypt_kasy |
| E | Cisza zamówień | wc_orders_silence | agenci_ai | wc_orders_silence |
| E | Nieudane płatności | wc_failed_payments | agenci_ai | wc_failed_payments |
| E | Zmiana metod płatności | sklep_platnosci | sklep_check | sklep_zmiana_platnosci |
| E | Maile sklepu nie wychodzą | wc_mail_failed | agenci_ai | wc_mail_failed |
| E | Zaległe zadania sklepu | wc_scheduler_overdue | agenci_ai | wc_scheduler_overdue |
| E | Nieaktualne szablony WooCommerce | wc_templates_outdated | agenci_ai | wc_templates_outdated |
| E | Zamówienie testowe | shop_test_order | sklep_check | shop_test_order_failed |
| W | Czas pojawienia się treści (LCP) | wydajnosc_lcp | wydajnosc_badanie | wydajnosc_lcp |
| W | Skakanie układu (CLS) | wydajnosc_cls | wydajnosc_badanie | wydajnosc_cls |
| W | Blokowanie przez skrypty (TBT) | wydajnosc_tbt | wydajnosc_badanie | wydajnosc_tbt |
| W | Realni użytkownicy (CrUX) | wydajnosc_crux | wydajnosc_badanie | wydajnosc_crux |
| W | Nagłe pogorszenie | wydajnosc_trend | wydajnosc_badanie | wydajnosc_pogorszenie |
| W | Waga strony | wydajnosc_waga | wydajnosc_badanie | wydajnosc_ciezka_strona |
| W | Kluczowe podstrony | wydajnosc_podstrony | wydajnosc_badanie | wydajnosc_podstrony |
| W | Kompresja | wydajnosc_kompresja | wydajnosc_serwer | wydajnosc_brak_kompresji |
| W | Cache strony | wydajnosc_cache_strony | wydajnosc_serwer | wydajnosc_brak_cache_strony |
| W | HTTP/2 i cache plików | wydajnosc_http2_cache | wydajnosc_serwer | wydajnosc_brak_http2, wydajnosc_krotki_cache_plikow |
| W | Ocena wydajności | wydajnosc_wynik | wydajnosc_pasmo | wydajnosc_zla, wydajnosc_slaba |
- D
- Czy strona żyje, odpowiada i pokazuje właściwą treść.
- B
- Certyfikaty, infekcje, wystawione pliki, podatności, nagłówki.
- S
- Czy Google widzi stronę tak, jak powinien.
- Kreska w kolumnie Check
- Parametr opisany, ale nikt go dziś nie mierzy — takich jest 0. Powód stoi w karcie parametru.
Jeden Check obsługuje wiele parametrów: sprawdzenie wystawionych plików zbiera dwanaście, nagłówki ochronne — sześć. Dlatego Checks jest 12, sposobów sprawdzenia 55, a parametrów 87.