Co weryfikator sprawdza
Weryfikator rozpakowuje memo (JSON-LD ze schema.org Report) i uruchamia ten sam silnik klasyfikujący na polu input z memo. Porównuje wynik z deklarowanym w polu result w siedmiu wymiarach:
- klasyfikacja (Kluczowy / Ważny / Wyłączony);
- tier MŚP (mikro / małe / średnie / duże);
- confidence (high / medium / low);
- cykl audytu (ex-ante 3-letni / ex-post na żądanie / n/a);
- cykl raportowania (24h / 72h / 1m / n/a);
- kolejność uruchomienia reguł (R-numerki w kolejności firingu);
- kindy ostrzeżeń wraz z severity (critical / warning / info).
Jeżeli wszystkie pola są identyczne — memo jest zweryfikowany. Jeżeli różnią się — pokazana zostanie tabela różnic.
Wersja silnika
Memo zawiera pinning wersji rejestru reguł (versionPins.ruleRegistryVersion). Jeżeli wersja silnika uruchomionego w przeglądarce różni się od wersji z memo, weryfikator oznaczy memo jako match-stale — wynik zgodny, ale silnik został zaktualizowany. Memo pozostaje obronny dla momentu wygenerowania (zobacz changelog reguł dla pełnej historii wersji).
Co weryfikator NIE potwierdza
Niezależna weryfikacja silnika nie zastępuje audytu danych wejściowych: weryfikator nie potwierdza, że dane z pola input (liczba etatów, obrót, struktura grupy kapitałowej) odpowiadają stanowi faktycznemu firmy. Ta warstwa pozostaje obowiązkiem operatora oraz audytora w trakcie kontroli. Weryfikator potwierdza jedynie, że dla zadanych danych silnik produkuje deklarowaną klasyfikację — i robi to deterministycznie, synchronicznie, bez wywołań sieciowych.
Integralność memo
Od wersji schematu 2.0.0 każde memo zawiera pole memoHash — wewnętrzny skrót integralności (FNV-1a 8 znaków hex) liczony nad kanoniczną reprezentacją wszystkich pozostałych pól. Weryfikator najpierw przelicza ten skrót i porównuje z zadeklarowanym. Naiwna ingerencja w plik (edycja JSON w edytorze bez przeliczenia skrótu) zostanie wykryta w mikrosekundach, bez nawet uruchomienia silnika klasyfikującego — wynik weryfikacji: mismatch z różnicą w polu memoHash.
Pole memoHash jest środkiem dowodowym, nie środkiem kryptograficznym — wyrafinowany przeciwnik, który zna funkcję kanonizacji, może wygenerować skuteczne sfałszowanie poprzez ponowne uruchomienie silnika na zmodyfikowanym wejściu. W takim przypadku skrót się zgodzi, ale druga warstwa weryfikatora — niezależne przeliczenie silnika na deklarowanym input — wykryje niespójność wyniku z danymi wejściowymi (różnica w polu result.classification lub innych).
URN-style identifier memo zawiera dodatkowy fingerprint wejścia gwarantujący unikalność per (data, dane wejściowe). Dla pełnej niezaprzeczalności prawnej rekomendujemy zewnętrzny podpis kwalifikowany (e-podpis, qualified electronic signature wg eIDAS) na pliku JSON-LD przed przekazaniem do organu nadzoru — memoHash gwarantuje spójność treści, e-podpis gwarantuje tożsamość sygnatariusza.
Memo grupowe (wielopodmiotowe)
Holdingi i grupy kapitałowe generują memo grupowe (z klasyfikatora grupowego) — jeden plik JSON-LD zawierający per-entity decyzje klasyfikacyjne dla wszystkich spółek zależnych. Weryfikator obsługuje ten format automatycznie: jeśli memo zawiera tablicę entities, uruchamiana jest gałąź grupowa.
Memo grupowe ma trzy warstwy obrony:
- groupHash — zewnętrzny skrót integralności nad kanoniczną zawartością całego pliku (włącznie z zagnieżdżonymi memo). Edycja dowolnego pola w pliku, w tym wewnątrz zagnieżdżonego memo, psuje ten skrót.
- Per-entity memoHash — każde zagnieżdżone memo ma własny skrót integralności (jak w memo pojedynczym). Pozwala to na niezależną ekstrakcję i podpis e-IDAS pojedynczego podmiotu, jeśli polityka grupy tego wymaga.
- Per-entity re-run silnika — dla każdego zagnieżdżonego memo weryfikator ponownie uruchamia silnik klasyfikujący na deklarowanym
inputi porównuje wynik z deklarowanymresult. Sfałszowanie inner memoHash i outer groupHash nie wystarczy — silnik musi też zgadzać się z danymi wejściowymi.
Werdykt grupowy zawiera per-entity tabelę werdyktów — jeśli memo wskaże niezgodność, auditor od razu widzi który z N podmiotów zawiódł. Plus weryfikator sprawdza agregat podsumowania (sumę kar, kontaktów Art. 9, K/V/W) względem zsumowania per-entity wyników; ręczna podmiana headline'a w polu summary przy poprawnych zagnieżdżonych memo zostanie wykryta jako różnica w polu summary.*.
Schemat memo grupowego ma pinning wersji (versionPins.groupMemoSchemaVersion) oraz strukturalny fingerprint (SS-3, GROUP_MEMO_SCHEMA_FINGERPRINT) gwarantujący że zewnętrzne integracje audytora dostrzegą każdą zmianę kształtu memo — niezależnie czy bumpniemy MAJOR, MINOR, czy PATCH.