Agencja-szablowski.pl jako case study agent-readiness: od lokalnej wizytówki do serwisu gotowego na agenty AI

przez Łukasz | maj 7, 2026

Zaczęło się od prostego pytania które zadajemy sobie przy każdym nowym projekcie: czy strona którą właśnie oddaliśmy klientowi jest gotowa na to jak działa dziś internet?

agencja-szablowski.pl to strona którą zbudowało iFOX STUDIO dla Roberta Szabłowskiego — autoryzowanego agenta Allianz z ponad 25-letnim doświadczeniem, z biurami w Ziębicach i Bielawie. Trzy podstrony, czysty WordPress 6.9.4, Apache. Strona wizytówkowa w klasycznym rozumieniu — wygląda dobrze, ładuje się szybko, ma wszystko co powinna mieć.

Sprawdziłem w checkerze agent-readiness na iFOX.pl. Wynik: 45/100 — Słaby. Cloudflare „Is Your Site Agent-Ready?”: 33 punkty, Level 1 — Basic Web Presence.

Strona która prezentuje się profesjonalnie dla człowieka z przeglądarką, dla agenta AI była praktycznie niewidoczna. Postanowiłem to naprawić — i przy okazji udokumentować każdą decyzję, bo to jest dokładnie ten rodzaj wdrożenia który ma wartość jako case study dla każdego studia które buduje strony dla lokalnych firm.

Punkt startowy: co miała, czego nie miała

Zanim cokolwiek zrobiłem, zrobiłem pełny audyt. Strona miała solidną warstwę techniczną: HTTPS (5/5), robots.txt z dostępem dla AI crawlerów (15/15), jeden H1 (10/10), sitemap.xml (5/5), szybki serwer (10/10). To nie jest przypadek — to efekt dobrego buildu.

Czego nie miała: llms.txt (0/15), llms-full.txt (0/10), danych strukturalnych schema.org (0/15), meta description (0/10), Open Graph (0/5). Pięć obszarów, 55 punktów do odrobienia.

Cloudflare patrzył na to inaczej — jego checker mierzy cztery kategorie: Discoverability (3/3 — tu strona była OK), Content (0/1 — brak), Bot Access Control (1/2 — częściowo), API/Auth/MCP (0/6 — nie dotyczy tej strony). Wynik 33/100, Level 1.

Dwa checkery, dwa różne spojrzenia na ten sam problem. iFOX mierzy warstwę treściową i techniczną. Cloudflare mierzy warstwę protokołową i integracyjną. Oba mówiły to samo: strona nie jest gotowa.

Pierwsza decyzja: własna wtyczka zamiast kombinowania

Standardowe podejście do „zrób stronę agent-ready” to seria ręcznych interwencji: wgraj plik przez FTP, dopisz kod do functions.php, zainstaluj trzy różne wtyczki. Każda z tych metod działa — ale żadna nie daje kontroli nad całością ani powtarzalności przy kolejnych projektach.

Mam własną wtyczkę — Agent-Ready WP — którą zbudowałem pod dokładnie ten przypadek. Trzy moduły, jeden panel w WP Admin.

Link Header dodaje nagłówek HTTP Link: </dla-agentow>; rel="service-doc" na stronie głównej. Agent który odpyta serwer zanim zacznie przeglądać HTML wie od razu gdzie jest dokumentacja serwisu. Reguła trafia do .htaccess — działa niezależnie od cache.

Markdown for Agents obsługuje content negotiation. Gdy agent wysyła Accept: text/markdown, WordPress zamiast HTML oddaje czysty Markdown z YAML frontmatter. Przeglądarki dostają normalny HTML. Plugin wyklucza Markdown z cache LiteSpeed żeby nie trafił przypadkowej przeglądarce.

Content Signals zapisuje do robots.txt linię Content-Signal: ai-train=yes, search=yes, ai-input=yes. Jawna deklaracja polityki treści — co crawler może robić z zawartością.

Zainstalowałem, włączyłem wszystkie trzy moduły, ustawiłem slug /dla-agentow z rel="service-doc". Diagnostyka wtyczki: trzy zielone. Serwer: Apache.

Uruchomiłem checkery. iFOX: bez zmian — 45/100. Cloudflare: skok z 33 do 50, z Level 1 na Level 4 Agent-Integrated. Content 0→1, Bot Access Control 1→2.

Rozbieżność jest ważna i warta odnotowania. iFOX mierzy warstwę treściową — llms.txt, schema.org, meta tagi. Cloudflare mierzy warstwę protokołową — nagłówki HTTP, content negotiation, sygnały w robots.txt. Wtyczka obsługuje warstwę protokołową. iFOX jej nie widzi. Obaj mają rację.

Problem który sam sobie stworzyłem

Zaraz po instalacji wtyczki zorientowałem się na coś nieprzyjemnego: nagłówek Link wskazuje na /dla-agentow — a strona pod tym adresem nie istnieje.

Agent dostaje nagłówek, odpytuje URL, dostaje 404. To gorsze niż brak nagłówka. Nagłówek obiecuje dokumentację serwisu — 404 mówi że jej nie ma. Agent który raz dostał 404 może zignorować ten nagłówek przy kolejnych wizytach.

Zanim poszedłem dalej, stworzyłem stronę. Jej zawartość to ustrukturyzowane informacje o firmie: dane identyfikacyjne z NIP i REGON, oba biura z adresami, godziny kontaktu, lista usług, obszar obsługi i — co ważne — sekcja „Instrukcja dla agentów AI” która wprost mówi: brak zakupu online, kieruj użytkowników do kontaktu telefonicznego lub mailowego.

Ta ostatnia sekcja to coś czego zwykle nie robi się na stronach firmowych. Agent który obsługuje zapytanie „gdzie ubezpieczyć samochód w Ziębicach” nie szuka formularza zamówienia — szuka numeru telefonu i godzin otwarcia. Strona /dla-agentow daje mu to wprost.

llms.txt i llms-full.txt: mała strona, jeden plik, pełny kontekst

Przy serwisach z setkami artykułów llms-full.txt staje się problemem logistycznym — plik może ważyć megabajty, wymaga automatycznej regeneracji, trzeba myśleć o tym co włączyć a co wyciąć. agencja-szablowski.pl ma trzy podstrony. Cała treść serwisu w jednym pliku Markdown to kilkanaście kilobajtów.

To jest dokładnie ten przypadek dla którego llms-full.txt ma największy sens.

llms.txt to mapa: nagłówek z opisem firmy, cztery linki z jednozdaniowym opisem każdej podstrony, sekcja dla agentów z informacją o braku zakupu online. Agent który pobiera llms.txt wie czym jest serwis i gdzie szukać szczegółów.

llms-full.txt to terytorium: pełna treść wszystkich czterech podstron z URL i tytułem jako metadanymi, rozpisane wszystkie 10 sytuacji z podstrony Usługi, instrukcja dla agentów na końcu. Agent który pobiera llms-full.txt nie musi odwiedzać żadnej podstrony. Jedno żądanie HTTP, pełny kontekst.

Oba pliki wgrałem przez FTP do katalogu głównego domeny. Sprawdzam checkery.

iFOX: 45 → 70/100. llms.txt dostało 15/15, llms-full.txt 10/10. Cloudflare bez zmian — słusznie, bo Cloudflare już dał 100 za Content przy wtyczce, llms.txt to nie jego metryka.

Schema.org, meta description i Open Graph: jeden blok kodu, trzy problemy

Zdecydowałem żeby nie instalować kolejnej wtyczki. Yoast, RankMath — każda z nich dodaje własną logikę, własne opcje, własne problemy z cache. Dla strony z trzema podstronami to przerost formy nad treścią.

Napisałem jeden blok HTML do wklejenia przez Insert Headers and Footers: meta description, Open Graph i JSON-LD w jednym miejscu, pełna kontrola nad treścią.

Schema.org to typ LocalBusiness + InsuranceAgency jednocześnie. Oba biura jako osobne obiekty Place z adresami. Godziny pracy. Cztery usługi w OfferCatalog. ContactPoint z typem obsługi, językiem i godzinami dostępności. Logo i image. Link do Facebooka w sameAs.

Meta description napisałem, zmierzyłem — 201 znaków. Za długo, limit to 160. Skróciłem do 148 znaków. Drobna rzecz, ale checker iFOX mierzy to precyzyjnie i ma rację — Google i tak obetnie co dłuższe.

Wgrałem. iFOX: 70 → 90/100. Zatrzymałem się na chwilę przy meta description — po poprawce skok do 100/100.

Google Rich Results Test: FAQ (1 prawidłowy element), Firmy lokalne (1 prawidłowy element), Organizacja (1 prawidłowy element). Schema.org Validator: 3 elementy, 0 błędów, 0 ostrzeżeń.

FAQPage schema: lekcja o tym gdzie nie jest głową

Po osiągnięciu 100/100 zacząłem myśleć o tym co można zrobić ponad wynik checkera. Strona agencji ubezpieczeniowej żyje z obsługi konkretnych sytuacji — zalanie, wypadek, choroba, kolizja. To jest dokładnie ten rodzaj zapytań który trafia do agentów AI.

FAQPage schema była oczywistym krokiem. I tu pojawił się ważny problem który warto odnotować.

Odruchowym rozwiązaniem byłoby dodanie FAQPage schema globalnie przez Insert Headers and Footers — jeden kod, wszystkie strony. Ale Google wprost mówi: dane strukturalne muszą odzwierciedlać treść widoczną na stronie. FAQPage schema na stronie O nas gdzie nie ma żadnego FAQ to potencjalna flaga.

Rozwiązanie: schema nie musi być w <head>. Google i agenty czytają cały DOM — JSON-LD w <body> działa identycznie jak w <head>. Dodałem dwa osobne bloki Custom HTML bezpośrednio w edytorze WP: cztery pytania na stronie głównej (dokładnie te sekcje które są widoczne), dziesięć pytań na podstronie Usługi. Zero ryzyka niezgodności.

To jest jedna z tych rzeczy której wielu developerów nie wie: lokalizacja JSON-LD w dokumencie HTML nie ma znaczenia dla parsera. Ma znaczenie dla człowieka który sprawdza zgodność treści z schema.

Semantyka przycisków: małe szczegóły, duże znaczenie

Przy okazji sprawdziłem semantykę elementów interaktywnych. Kilka przycisków w Divi było zbudowanych na <div> — żadnej wartości semantycznej, niewidoczne dla czytników ekranu, niewidoczne dla agentów AI które analizują dostępne akcje na stronie.

Zamiana na <a> dla elementów nawigacyjnych (Dowiedz się więcej, Kontakt / O NAS) i <button> dla akcji. Tu pojawił się praktyczny problem: <button> w Divi potrafił rozwalać layout bez możliwości stylowania w builderze. Decyzja: <a> dla wszystkich elementów które prowadzą gdziekolwiek — to jest semantycznie poprawne. <button> ma sens tylko dla akcji które nie nawigują: submit, toggle, modal. „Zadzwoń” z href="tel:..." to link, nie przycisk.

Do każdego przycisku CTA dodałem aria-label przez Divi → Zaawansowane → Atrybuty. Nie „Zadzwoń” — „Zadzwoń do agencji Allianz Szabłowski”. Nie „Dowiedz się więcej” — „Dowiedz się więcej o pomocy po urazie”. Cztery identyczne przyciski „Dowiedz się więcej” na stronie głównej dostały cztery różne aria-label. Agent który buduje mapę akcji dostępnych na stronie widzi teraz konkretne, rozróżnialne intencje.

Wynik końcowy i co z tego wynika

iFOX checker: 45 → 100/100. Cloudflare: 33 / Level 1 → 50 / Level 4 Agent-Integrated. Google Rich Results: FAQ, Firmy lokalne, Organizacja — wszystkie zielone, 0 błędów.

Platforma: standardowy hosting, Apache, WordPress bez VPS i bez Cloudflare Pro.

Kilka rzeczy które warto zabrać z tego wdrożenia niezależnie od tego jakiej strony dotyczy:

Link header bez strony docelowej jest gorszy niż brak nagłówka. Jeśli wskazujesz agentom gdzie jest dokumentacja serwisu, ta dokumentacja musi istnieć.

llms-full.txt ma największy sens dla małych stron. Im mniejsza strona, tym niższy koszt utrzymania pliku i większa proporcjonalna korzyść — agent dostaje 100% kontekstu w jednym żądaniu.

Schema.org JSON-LD nie musi być w head. Google i agenty czytają cały DOM. Umieszczenie przez Custom HTML block bezpośrednio na stronie której treść opisuje eliminuje ryzyko niezgodności — i to jest ważniejsze niż lokalizacja w dokumencie.

FAQPage schema globalnie to ryzyko. Dane strukturalne muszą odzwierciedlać treść widoczną na stronie. Per strona, w body, blisko treści którą opisuje.

Dwa checkery mierzą dwie różne rzeczy. iFOX mierzy warstwę treściową. Cloudflare mierzy warstwę protokołową. 100/100 na jednym nie oznacza 100/100 na drugim — i dobrze, bo to są naprawdę różne warstwy agent-readiness.

Strona agencja-szablowski.pl nie zmieniła wyglądu. Klient nie widzi żadnej różnicy. Agent AI widzi zupełnie inną stronę niż widział tydzień temu.


Wdrożenie wykonało iFOX STUDIO. Narzędzia użyte w projekcie: wtyczka Agent-Ready WP, checker agent-readiness na iFOX.pl, Google Rich Results Test, Schema.org Validator, Cloudflare „Is Your Site Agent-Ready?”.

Agent kończy, ale zadania nie wykonał

Agent kończy, ale zadania nie wykonał

Objawy Agent odpowiada: „Przygotowałem i wysłałem potwierdzenie do klienta." Potwierdzenie nie zostało wysłane. Albo: „Zaktualizowałem wszystkie rekordy" — zaktualizował trzy z dwunastu. Albo: „Nie znalazłem żadnych zamówień" — bo narzędzie zwróciło błąd, którego nikt...

Agent zrobił coś, o co nikt nie prosił

Agent zrobił coś, o co nikt nie prosił

Objawy Operacja, której nikt nie zlecił. Dane wysłane pod adres, którego nie ma w żadnej konfiguracji. Rekord zmieniony poza zakresem zadania. Odpowiedź, z której wynika, że agent dostał instrukcje od kogoś innego niż ty. Cecha wspólna: technicznie wszystko zadziałało...

Agent zrobił to samo dwa razy

Agent zrobił to samo dwa razy

Objawy Ten syndrom różni się od pozostałych jedną rzeczą: objaw widzi klient, nie ty. Trzy identyczne wiadomości w skrzynce. Dwa zamówienia zamiast jednego. Podwójne obciążenie. Duplikaty rekordów, które ktoś zauważa tydzień później. W twoim dzienniku wszystko wygląda...

Agent gubi wątek w długim zadaniu

Agent gubi wątek w długim zadaniu

Objawy Pierwsze kroki idą wzorowo. Po kilkunastu agent zaczyna się rozjeżdżać. Przestaje przestrzegać reguły z promptu systemowego, której trzymał się na początku. Zmienia format odpowiedzi w połowie zadania. Wraca do czegoś, co już ustalił, i ustala to inaczej....

Agent podaje dane, których nie ma

Agent podaje dane, których nie ma

Objawy Numer zamówienia w idealnym formacie, którego nie ma w bazie. Kwota, której w dokumencie nie ma. Nazwa pola API, które nigdy nie istniało. Cytat z regulaminu, brzmiący dokładnie jak reszta regulaminu i w nim nieobecny. Cecha wspólna wszystkich tych przypadków:...

Działał wczoraj, dziś nie działa

Działał wczoraj, dziś nie działa

Objawy Nic się nie wywala. Nie ma wyjątków, nie ma timeoutów, dziennik wygląda tak samo jak zawsze. Po prostu odpowiedzi są gorsze. Postacie, w jakich to się objawia: Jakość. Agent zaczyna pomijać kroki, które wcześniej wykonywał, albo odpowiada ogólniej. Format....

Agent wybiera złe narzędzie

Agent wybiera złe narzędzie

Objawy Agent odpowiada nie na to pytanie. Pobiera listę zamówień, gdy pytano o jedno konkretne. Odpowiada z pamięci, choć miał sprawdzić w bazie. Albo sięga po właściwe narzędzie i wpisuje w argumenty coś, czego nie da się użyć. Sygnał, który odróżnia ten syndrom od...

Agent kręci się w kółko

Agent kręci się w kółko

Objawy Agent wykonuje kolejne obroty pętli, nie zbliżając się do zakończenia zadania. W dzienniku widać jedną z trzech postaci. Powtórzenie. To samo narzędzie, te same argumenty, raz za razem — czasem dziesiątki razy pod rząd. Oscylacja. Agent wywołuje na przemian dwa...