Plan 2026: report card domeny na stronie host
Widok hosta (/hosts/:hostname) pokazuje dziś mniej użytecznych informacji, niż pozwala baza — kod już zawiera dane, których nie renderujemy: dns.*/tls.* na hoście, historię errors, protocol, cf_block, quality_score, content_length + text_len (baza pod complexity i carbon), health.
Cel: przekształcić stronę domeny w publiczny report card — Błędy / Security / Tekst-SEO / Complexity / Carbon z ocenami A–E i listą rekomendacji. Właściciel strony ma z jednego widoku dowiedzieć się, co poprawić. To realizuje kierunki z Co jeszcze możemy wdrożyć (internet health observatory, crawl cost accounting, oszczędzanie energii) oraz SEO na podstawie crawlingu.
Value / Effort
| # | Usprawnienie | Value | Effort | Nowe dane? |
|---|---|---|---|---|
| 1 | Panel Security (DNS/TLS z targetu) | wysoki — parytet z widokiem targets | niski — reużycie partiala | nie |
| 2 | Panel Błędy (kolekcja errors + last_error) | wysoki — diagnoza "czemu nie działa" | niski | nie |
| 3 | Panel Carbon z zapisanych danych | średni — mierzalna emisja bez live fetch | niski | nie |
| 4 | Rekomendacje Tekst/SEO (regułowe) | wysoki — akcjonowalne "co poprawić" | średni | nie |
| 5 | Complexity score v1 | średni — narzut markupu, redirecty, protokół | niski | nie |
| 6 | Report card A–E (5 badge) | wysoki — czytelne podsumowanie | niski | nie |
| 7 | Rozszerzenie pól publicznych | średni — value dla nie-adminów | minimalny | nie |
| 8 | Security headers przy crawlu | wysoki — HSTS/CSP/XFO dla całego korpusu | średni | tak (re-crawl) |
| 9 | Metryki SEO/complexity przy crawlu | średni — jedna definicja metryk, trendy | średni | tak (re-crawl) |
| 10 | Carbon per crawl w crawls | średni — koszt crawla per root domain | niski | tak |
| 11 | Agregaty na dashboardzie (HTTPS/HSTS/h2/CO2e) | wysoki — publiczne metryki stanu sieci | średni | nie (po 8–10) |
Fazy i poprawki do wprowadzenia
Faza 1 — tylko UI, dane już w bazie
- Panel Security: kontroler domeny już wyszukuje target (
MongoStore.find_by_url("targets", url)w_index_item.html.erb). Przekazać znaleziony dokument docollections/_next_security— partial jest generyczny (czytadoc["dns"],doc["tls"]), więc działa bez zmian. - Panel Błędy: zapytanie do kolekcji
errorspourl/hostname(ostatnie N wpisów: reason, status, redirect_chain, created_at) +last_error/attemptsz targetu; link do/errors?url=.... - Panel Carbon: liczyć z zapisanego
content_lengthtym samym wzorem coUrlInspector#carbon_estimate— wydzielić do wspólnego helpera. Zaktualizować współczynniki do Sustainable Web Design v4 (0.81 kWh/GB to przestarzały model; v4 rozdziela datacenter / sieć / urządzenie i daje ~0.36 kWh/GB części sieciowej). Podawać zawszebasis, żeby liczby były porównywalne w czasie. - Rekomendacje Tekst/SEO — czysta funkcja
doc → [rekomendacje]na polach już zapisanych:
| Reguła | Warunek | Komunikat |
|---|---|---|
| title | brak / <15 / >65 znaków | uzupełnij / wydłuż / skróć title |
| meta_description | brak / <50 / >160 | kontrola snippetu w SERP |
| h1 | brak | dodaj nagłówek H1 |
| thin content | text_len < 300 przy http_status = 200 | wzbogać treść albo noindex |
| canonical | brak canonical_url | wskaż kanon (warianty www/apex) |
| redirects | > 1 | spłaszcz łańcuch przekierowań |
| https | false | wymuś HTTPS |
| lang | brak | ustaw <html lang> (baza pod hreflang) |
Sekcja zastępuje statyczny akapit "Research analysis" (auto-generowany duplicate content — zgłoszony już w dokumencie SEO).
- Complexity score v1 z istniejących pól: stosunek
text_len / content_length(narzut markupu),redirects,protocol(HTTP/1.1 vs h2/h3),latency_ms,cf_block. - Report card: pasek 5 badge'ów A–E na górze strony (Errors / Security / SEO / Complexity / Carbon), każdy linkuje kotwicą do swojego panelu.
- Pola publiczne: dodać do
PUBLIC_INDEX_FIELDS(application_helper.rb):quality_score,lang,canonical_url,indexed_at,protocol.
Faza 2 — crawler zapisuje nowe sygnały (wymaga re-crawla)
- Security headers: w
crawler/parsing.py → build_itemsub-dokumentsecurityz nagłówków odpowiedzi:hsts,csp,x_content_type_options,x_frame_options,referrer_policy,permissions_policy(bool/str, proste typy). - SEO/complexity przy crawlu:
h2_count,links_int/links_ext,images_missing_alt,json_ld_count, liczba i ciężar<script>/<style>. Przenieść definicje metryk z live-onlyUrlInspector#seo_datatak, aby crawl i live inspection liczyły to samo. - Carbon per crawl: pole
carbon_gna dokumencie + suma wcrawls— punkt "mierzyć koszt crawla per root domain" z roadmapy. Optymalizacja
- Warunkowy parsing (Early Exit): Pomijaj ekstrakcję metryk SEO/Complexity dla statusów innych niż
200 OK, ...oraz dla typów MIME innych niżtext/html. - Kompresja schematu BSON: Przy wielomilionowym korpusie używaj skróconych kluczy w poddokumentach MongoDB (np.
seo,sec,carb), aby zminimalizować narzut indeksów i zużycie RAM. - Jedna biblioteka parsująca (DRY): Jeśli
UrlInspector(Ruby) i Crawler (Python) mają liczyć to samo, przenieś logikę liczenia wag i tagów HTML do Crawlera. Live inspection może wywoływać Crawlera asynchronicznie przez mikro-API lub kolejkę, eliminując potrzebę przepisywania logiki na dwa języki.
Faza 3 — obserwatorium 2026
- Dashboard agregaty: adopcja HTTPS / HSTS / h2+h3 / IPv6 per region i suffix, suma CO2e korpusu, mediana wagi strony — publiczne metryki "stanu internetu".
- AI-readiness:
/llms.txt, polityka robots dla botów AI (punkt 1 roadmapy). - Trendy: historia ocen domeny w czasie (po wdrożeniu statystyk okresowych).
Implementacja techniczna
Architektura (DDD)
- Nowe value objects w warstwie UI (
ui/app/services/), czyste funkcje bez stanu: DomainReportCard— wejście: dokumenthosts(+ opcjonalnie sparowany target), wyjście: hash{errors:, security:, seo:, complexity:, carbon:}z ocenąa..ei listą rekomendacji per sekcja;CarbonEstimate— jeden wzór dlaUrlInspectori report card (usuwa duplikację).- Zero nowych kolekcji w fazie 1 — wyłącznie prezentacja danych już zapisanych; ocena liczona przy renderze (dokumenty są małe, brak potrzeby cache).
- Faza 2 rozszerza agregat
hostso sub-dokumentysecurityiseo— spójnie z istniejącym wzorcemdns/tlsnahosts. Ubiquitous language:sec,seo,carbon_g— te same nazwy w Pythonie, Mongo i Rails. - Kontroler: akcja
showdomeny dokłada@target(już wyszukiwany) i@errors(jedno zapytanie z limitem); brak dodatkowych round-tripów przy braku danych. - Pre-agregacja dashboardu (Materialized Views): Całkowicie zrezygnuj z agregacji
on-the-flyna kolekcji produkcyjnej. Uruchamiaj dobowy skrypt map-reduce lub agregację w tle, zapisując wyniki do dedykowanej, płaskiej kolekcjiglobal_network_stats. - Ograniczona tablica trendów (Capped History): Zamiast tworzyć nową kolekcję dla historii ocen, przechowuj historię wewnątrz dokumentu domeny jako tablicę obiektów o stałym limicie wielkości (np. ostatnie 12 miesięcy).
# MongoDB update via Mongoid / Ruby driver
RootDomain.where(id: domain_id).to_adapter.update_attributes(
'$push' => {
trends: {
'$each' => [{ date: '2026-07', scores: 'AABCE' }],
'$slice' => -12 # Keeps only the last 12 snapshots
}
}
)
- Heurystyka AI-Readiness: Rozszerz sprawdzanie
/llms.txto automatyczny skan plikurobots.txtpod kątem dyrektywdisallowdla znanych User-Agentów botów AI (GPTBot,ClaudeBot,PerplexityBot). Pozwoli to na stworzenie unikalnego wskaźnika "AI Resistance Score" w dashboardzie agregatów.
Czy progi ocen A–E dla wskaźnika Carbon powinny uwzględniać podział na strony mobilne i desktopowe, czy zachowujemy jeden globalny standard Sustainable Web Design v4?
Design widoku /hosts/:hostname
[ URL + linki targets/WWW ]
[ A Security ][ B SEO ][ C Errors ][ B Complexity ][ A Carbon ] <- report card, badge A–E
[ Content ] [ Rekomendacje (lista "co poprawić") ]
[ Technical ] [ Quality ]
[ Security: DNS | TLS ] [ Errors: ostatnie wpisy + last_error ]
[ Complexity: ratio, protokół ] [ Carbon: bytes, kWh, gCO2e, basis ]
[ Admin / Live URL inspection ] <- bez zmian, tylko admin
- Badge: istniejące klasy Bootstrap (
text-bg-success/warning/danger), konwencja kolorów jak przy ratingu TLS cipher w widoku targets. - Panele to karty w istniejącej siatce
row g-3; każda sekcja ma kotwicę (#security,#seo, ...). - Wersja publiczna pokazuje report card i rekomendacje (bez sekcji Admin) — to jest główne "value dla internetu": darmowy audyt domeny, analogicznie do oferty monitoringu DNS/TLS.
Ocena A–E (progi startowe)
| Sekcja | A | E |
|---|---|---|
| Errors | brak wpisów, attempts = 0 | powtarzalne błędy DNS/TLS/HTTP |
| Security | TLS 1.3 + poprawny DNS (+ w F2: HSTS i CSP) | błąd TLS albo martwy DNS |
| SEO | 0 rekomendacji | ≥4 rekomendacje albo brak title |
| Complexity | ratio > 0.25, h2/h3, 0 redirectów | ratio < 0.05 albo >2 redirecty |
| Carbon | < 0.2 g CO2e / widok | > 1.0 g CO2e / widok |
Progi trzymane w jednym miejscu (DomainReportCard), do kalibracji po pierwszych agregatach.
Kolejność wdrożenia
- Faza 1 w całości (punkty 1–7) — sam UI, efekt natychmiastowy dla całego korpusu.
- Punkty 8–10 + re-crawl próbki, kalibracja progów.
- Faza 3 po zebraniu danych z fazy 2.
Powiązane: Co jeszcze możemy wdrożyć · SEO na podstawie crawlingu