· Case study · Szkoła kursów (CKKS/MedActive) · PHP custom · 🌐 External client

kursybp.pl — score 6793 (+26 pkt, 3 iteracje)

Pierwszy external case (NIE nasza domena) na legacy PHP custom stack. Strona szkoły kursów MedActive (Centrum Kształcenia Kadr Sportowych, działa od 2014 r.) — własny framework PHP, brak build pipeline'a, edycja przez SSH direct file modification. 3 iteracje pokazują pełny flow: techniczne fixy (+15) → copy + FAQ (+12) → real-world wins z plateau (-1). Lekcja: nie każda iter musi podnosić score żeby mieć wartość.

Wzrost score +26 pkt 67 → 93 / 100 (needs-improvement → good)
Stack Legacy PHP custom framework "ckks-admin2", brak build, edycja przez SSH
Discovery .htaccess bug rewrite do nieistniejącego sitemap.php → catch-all → fake 200
3 iteracje +15 / +12 / -1 techniczne / copy + FAQ / plateau z real-world wins

Dlaczego ten case jest inny?

Poprzednie 3 case studies (selpio.com, webcomp.pl, getmepost.com) to nasze własne repozytoria z git, build pipeline (Astro/Next.js), deploy przez Vercel/MyDevil rsync. Klient zewnętrzny przychodzi z pytaniem: "Czy ten workflow działa na mojej stronie z 2014 roku w PHP bez frameworka?"

kursybp.pl to:

Pytanie: czy per-issue prompts Selpio + Claude Code workflow skaluje się? Wynik: tak, z taką samą efektywnością (+27 pkt w 30 minut) co dla nowoczesnych frameworków.

Stan początkowy: 67/100 (needs-improvement)

Raport Selpio hash gJFyNL1JBo. Dimensions:

Co już było OK: canonical, Open Graph, Twitter Card, html lang="pl" — analyzer to wcześniej wykrył w istniejącym head.

Iter 1 (15 min): techniczne fixy przez SSH

Workflow per fix: backup pliku → edycja (heredoc/awk/sed) → curl verify → next. Wszystko z jednej sesji SSH bez intermediate downloads.

Re-crawl iter 1: SCORE 67 → 82 (+15 pkt), classification needs-improvement → good. Schema 0 → 15. technical_seo 10 → 16. structure 16 → 21.

Discovery: bug w .htaccess (lesson learned)

Najciekawszy moment dogfood. Po utworzeniu fizycznego public_html/sitemap.xml request dalej zwracał HTML homepage. Sprawdzenie .htaccess:

RewriteEngine On
RewriteRule ^sitemap.xml$ sitemap.php    # ← linia 61
...
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Linia 61 przekierowywała request sitemap.xml do nieistniejącego sitemap.php. Apache mod_rewrite robił 404 → catch-all wzorzec (linie 174-176) → index.php → homepage HTML. Mimo że fizyczny sitemap.xml istniał na dysku, NIGDY nie był serwowany.

Fix: zakomentowanie linii 61 (# DISABLED: was redirecting to non-existent sitemap.php). Po deploy curl /sitemap.xml zwrócił prawidłowy XML.

Lesson learned dla klientów z legacy stack: static fixes (utworzenie pliku) nie wystarczą — zawsze sprawdź .htaccess / nginx config / express middleware czy nie ma override dla danego URL. Curl HTTP 200 + content-type text/html dla pliku XML = mocny sygnał że jest rewrite issue.

Iter 2 (10 min): grammar fix + FAQ section + FAQPage schema

Po iter 1 zostały warnings copy + critical INCOMPLETE_SENTENCES (gramatycznie błędne zdanie). Iter 2 zaadresował:

Re-crawl iter 2: SCORE 82 → 94 (+12 pkt). Schema 15 → 25 MAX (FAQPage zaadresowało NO_HIGH_VALUE_SCHEMA + NO_QA_STRUCTURE). Structure 21 → 25 MAX (h3 FAQ heading pattern). Semantics 16 → 19 (THIN_CONTENT/SHALLOW_CONTENT znikły). INCOMPLETE_SENTENCES downgrade critical → info.

Iter 3 (15 min): real-world wins z plateau efektem

Po iter 2 (94/100) zostały 4 warnings + 4 info. Iter 3 zaadresowała: FAQ_ANSWER_TOO_LONG (FAQ skrócony 3× — z 60-80 słów na 30-50), MISSING_DEFINITIONS (4 inline definicje terminów branżowych: masaż tkanek głębokich, taping medyczno-sportowy, masaż I/II stopnia, dietetyka kliniczna), AMBIGUOUS_CLAIMS (FAQ cert: "uznawane przez instytucje branżowe" → konkretna podstawa prawna Rozporządzenia MEN 2016), MISSING_ETAG + MISSING_LAST_MODIFIED (HTTP headers w index.php przez filemtime + md5_file), oraz INCOMPLETE_SENTENCES "Kursy ruszające na 100%" → "Kurs potwierdzony — gwarantowany start w wybranym terminie".

Re-crawl iter 3: SCORE 94 → 93 (-1, semantic plateau). Counter-intuitive wynik — rozszerzona treść (definicje terminów) dała analyzer semantyki więcej materiału do oceny, co odpaliło JARGON_HEAVY warning (catch-22: bez definicji = MISSING_DEFINITIONS, z definicjami = JARGON_HEAVY). Dimensions stabilne (5 z 7 max + technical_seo + semantics nietknięte), tylko semantics 19 → 18.

Lekcja: Selpio score ≠ jedyna metryka wartości

Iter 3 jest najważniejszy edukacyjnie ze wszystkich 4 case studies: pokazuje że score regression może być conscious trade-off, nie failure.

Konkretne real-world wins z iter 3 — niezależnie od Selpio score:

Realistyczny ceiling dla SaaS/marketing landing: 95-97/100. Wyższe score wymaga albo: (a) przepisania copy w stylu academic prose (sprzeczność z marketing punch), (b) backend Selpio improvements (np. dodanie EducationalOrganization do whitelist wyeliminuje UNRECOGNIZED_SCHEMA_TYPE false positive), (c) usunięcia definicji terminów (regresja edukacyjna wartości za 1 pkt score).

Decyzja klienta: zostawić 93/100 z iter 3 wins (UX, PageSpeed, cytowalność) zamiast revert do 94 ze starszą wersją treści. Backupy serwera (*.bak-iter3) zachowane na wypadek gdyby klient zmienił zdanie.

Porównanie dimensions baseline → 3 iteracje

Wymiar Baseline Iter 1 Iter 2 Iter 3 Δ Max
structure 16 21 25 25 MAX ✓ +9 25
schema 0 15 25 25 MAX ✓ +25 +25 25
semantics 14 16 19 18 +4 25
llm_access 25 25 25 25 MAX ✓ 0 25
seo 17 17 17 17 0 20
authority 25 25 25 25 MAX ✓ 0 25
technical_seo 10 16 16 16 +6 20
TOTAL 67 82 94 93 +26 100

Workflow dla legacy PHP — bez build, bez deploy automation

Klient nie miał lokalnego repo ani CI/CD. Pełen flow z jednej sesji ssh <client-host>:

  1. SSH config check~/.ssh/config miał Host alias z User+IdentityFile dla hosta klienta (key auth, bez hasła w plaintext)
  2. Explore structurels domains/kursybp.pl/, cat composer.json dla stack detection ("ckks-admin2"), grep -rn "<head>" dla template location
  3. Backup pliku przed edycjącp index.php index.php.bak-2026-05-24
  4. Insert JSON-LD przez awkawk '/<\/head>/ { insert ... }' index.php > /tmp/new.php && cp /tmp/new.php index.php
  5. Create static filescat > robots.txt <<EOF ... EOF dla robots/sitemap/llms
  6. Fix .htaccess — sed comment out linii 61
  7. Curl verify — od razu po każdym fixie sprawdzasz response
  8. Re-crawl Selpio — POST /api/analyses → nowy score

Cały proces wykonalny przez agency-tier konsultanta z dostępem SSH klienta. Nie wymaga lokalnego dev environment, nie wymaga zmian w `package.json`, nie wymaga restartowania serwera (mod_rewrite re-reads .htaccess on each request).

Co zostało po 2 iteracjach

Realistyczny ceiling z iter 3 (copy refinement + krótsze FAQ answers + HTTP headers): 96-98/100.

Lekcje dla klientów agency

🚀 Wygeneruj raport dla swojej strony Zobacz pozostałe case studies