01 Treść · desktop 1440×1280 · jasny · persona: klient owner · zakładka articles, filtr „tylko z blockerami” wyłączony, zaznaczony lejek-dwustopniowy · drawer LinkGraph z osieroconym koszt-pozyskania-klienta-cac · edycja rekordu → Directus (nowa karta)

Treść

Kolekcje Directusa z nakładką AIOS: gate, linki, cluster · edycja rekordu otwiera Directus · 4 artykuły, 2 autorów, 6 stron · LIVE · 03:07

Szukaj po tytule lub slugu… tylko z blockerami 3 cluster wszystkie autor wszyscy gate z builda · LIVE · 02:55
Tytuł · slugAutor · clusterGatein → outData
Lejek dwustopniowy — jak sprzedawać usługi bez presjilejek-dwustopniowy Andrzej Niemiecsprzedaz-b2b 1 · description 3 5 28.0814:20
Intencja, nie keyword — jak czytać zapytania klientów B2Bintencja-nie-keyword Andrzej Niemiecseo-intencja 1 · description 2 4 30.0809:12
Nie sprzedajemy pakietów — dlaczego wycena zaczyna się od problemunie-sprzedajemy-pakietow Aion Niemiecsprzedaz-b2b 2 · description, sources 1 3 01.0918:45
Koszt pozyskania klienta (CAC) — jak go liczyć w usługachkoszt-pozyskania-klienta-cac osierocony · 0 wejść Andrzej Niemiecfinanse-marketingu przechodzi 0 2 02.0921:03
4 artykuły · 3 z blockerami · 1 osierocony · sortowanie: data ↓gate LIVE · 02:55 · linki z builda

lejek-dwustopniowy

articles · id 12 · cluster sprzedaz-b2b · published Edytuj w Directus

Gate 1 blocker · 02:55

  • missing descriptionpole →
  • title58 zn.
  • canonical/wpisy/lejek-dwustopniowy
  • author · Article JSON-LD · sources3 źródła

Linki wejściowe 3

  • intencja-nie-keywordarticle
  • nie-sprzedajemy-pakietowarticle
  • /wpisypage · lista

Linki wyjściowe 5

  • intencja-nie-keywordarticle
  • nie-sprzedajemy-pakietowarticle
  • andrzej-niemiecauthor
  • /kontakt · /realizacjepage ×2
02 Treść · desktop 1440×1280 · data-theme="operator" · persona: operator · zakładka redirects: tabela from → to · kod · test kolizji z istniejącą trasą · wiersz dodawania z „Testuj trasę” · drawer z wynikiem testu dla /uslugi

Treść

Kolekcje Directusa z nakładką AIOS · redirects: 4 reguły, 1 kolizja · reguły trafiają do middleware Astro w kroku data builda · LIVE · 03:07

Nowy w Directus
Szukaj po ścieżce… tylko kolizje 1 kod wszystkie test tras przeciw buildowi 02:55
fromtoKodTest „nadpisuje trasę?”30 dDodano
/blog/lejek/wpisy/lejek-dwustopniowy 301 nie koliduje 21202.0923:30
/uslugi/oferta 301 nadpisuje pages/uslugi 03.0902:58
/kontakt-old/kontakt 302 nie koliduje 1821.0811:05
/wpisy/cac/wpisy/koszt-pozyskania-klienta-cac 301 nie koliduje 402.0921:10
/stara…/nowa… 301 test przed zapisem
4 reguły · 1 kolizja · trafienia z logu nginx (30 d)LIVE · 03:07

Jak działa test kolizji

runbook · redirects
Źródło tras
pages (published) + sitemap-urls z ostatniego builda + ścieżki kolekcji (/wpisy /realizacje /praktyki)
Kolizja
from równe istniejącej trasie → redirect wygra w middleware, strona stanie się nieosiągalna. Badge warn, zapis dozwolony, ale build wypisze ostrzeżenie w kroku data.
301 vs 302
301 = trwałe (przeniesienie treści, SEO przenosi sygnał) · 302 = tymczasowe (kampania, test). Domyślnie 301.
Pętle
Test wykrywa też łańcuchy a → b → a i redirect na samego siebie — badge critical (brak w bieżących danych).
02b Treść · desktop 1440×900 · data-theme="operator" · zakładka globals: siteName, description, organization z Directus po lewej · po prawej podgląd, jak wchodzą do JSON-LD (Organization + WebSite w @graph) · edycja w Directus

Treść

Kolekcje Directusa z nakładką AIOS · globals (singleton) · wartości wchodzą do Organization i WebSite w JSON-LD każdej strony · LIVE · 03:07

Wartości z Directus

globals · singleton sameAs puste
siteName
Aion Marketing
description
Marketing B2B bez presji — lejek dwustopniowy, intencja zamiast keywordów, wycena od problemu.
locale
pl-PL
organization.name
Aion Marketing
organization.url
https://aion-marketing.pl
organization.logo
/logo.svg istnieje w dist/
organization.email
kontakt@aion-marketing.pl
organization.sameAs[]
puste — Organization bez profili społecznościowych
defaultAuthor
andrzej-niemiec
updated
28.08 · 16:40 · owner
Pola edytujesz w Directus. AIOS pokazuje tylko to, co z nich wynika: kształt JSON-LD i braki, które osłabiają wynik (sameAs nie jest blockerem gate — to ostrzeżenie).

Jak wejdą do JSON-LD

@graph · każda stronaLIVE · 02:55
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "Organization",
      "@id": "https://aion-marketing.pl/#organization",
      "name": "Aion Marketing",
      "url": "https://aion-marketing.pl",
      "logo": { "@type": "ImageObject", "url": "https://aion-marketing.pl/logo.svg" },
      "email": "kontakt@aion-marketing.pl",
      "sameAs": []                                   ← puste (ostrzeżenie)
    },
    {
      "@type": "WebSite",
      "@id": "https://aion-marketing.pl/#website",
      "name": "Aion Marketing",
      "description": "Marketing B2B bez presji — lejek dwustopniowy, …",
      "inLanguage": "pl-PL",
      "publisher": { "@id": "https://aion-marketing.pl/#organization" }
    }
    // Article · Person · BreadcrumbList dokładane per rekord — patrz SEO › Surface
  ]
}
Walidacja schematu: poprawna (2 węzły, 0 błędów) · Organization i WebSite są referencjonowane przez @id z każdego Article.LIVE · 02:55
03 Treść · stany 1440×760 · loading (skeleton tabeli + grafu) · empty (0 artykułów → checklist: autor, artykuł, gate, linki) · error (Directus 401 — token wygasł) · blocked (plugin aios-articles wyłączony → zakładki articles/authors bez danych)
Loading tabela 4 wiersze + graf
Empty 0 artykułów · świeży tenant

Brak artykułów w articles

Gate i graf linków zaczną działać po pierwszym rekordzie i buildzie. Kolejność z runbooka §4 (seed treści).

  1. 1Autor w authors (Person JSON-LD)andrzej-niemiec
  2. 2globals · siteName, organization28.08
  3. 3Pierwszy artykuł w Directus · title, description, sourcesDirectus
  4. 4Uruchom gate · runSeoGategate
  5. 5Build → graf linków z dist/build
Error Directus 401 · token wygasł

Directus odrzucił żądanie · 401

Token statyczny DIRECTUS_TOKEN wygasł lub został zrotowany. Tabela pokazuje ostatnią odpowiedź z cache (03:02) jako stale.

GET /items/articles?fields=title,slug,author.slug,cluster,date_updated
401 Unauthorized · {"errors":[{"message":"Invalid user credentials.","extensions":{"code":"INVALID_CREDENTIALS"}}]}
token: DIRECTUS_TOKEN (env) · ostatni OK 03:02 · rotacja? patrz Ustawienia › Klucze
Klucze LIVE · 03:07
Blocked plugin aios-articles wyłączony

Zakładki articles i authors nieaktywne

W modules.json plugin aios-articles jest off. Treść pokazuje tylko pages, redirects i globals. Gate, LinkGraph i cluster nie mają źródła — to blocked, nie „0 artykułów”.

Wymaga
plugins[] ∋ "aios-articles"
Zależne
aios-seo (gate) · aios-webmcp (R-tier payload)
Kto
owner lub operator w Moduły
Włącz w Modułymodules.json · LIVE · 02:31
05 Spec · decyzje projektowe · Treść · sesja 03.09 · źródło treści docs/admin-ui-views.md §2.3

Cel i hierarchia — przegląd z nakładką, nie drugi CMS

Directus zostaje edytorem: każdy wiersz i każdy nagłówek szczegółów ma jeden przycisk „Edytuj w Directus” (nowa karta, ikona external). AIOS nie rysuje formularzy rekordów — pokazuje to, czego Directus nie widzi: gate (kolumna Gate), linki (in → out + graf), cluster. Hierarchia tabeli: tytuł + slug w jednej komórce (tytuł 600, slug mono muted), Gate jako jedyna kolumna z kolorem, linki mono z strzałką, data mono.

Zakładki to kolekcje (mono, bo to nazwy techniczne), z licznikami tylko tam, gdzie kolekcja ma rekordy. Nad zgięciem 810 mieszczą się zakładki, filtry, cała tabela 4 rekordów i początek grafu — szczegóły zaznaczonego rekordu zaczynają się pod linią.

Gate w tabeli — co jest badge'em, co ciszą

  • Rekord z blockerami: badge warn n · pola (np. „2 · description, sources”). Liczba pierwsza, pola po kropce, żeby wzrok liczył bez czytania.
  • Rekord czysty: brak badge'a — .quiet „przechodzi” z checkiem w --ok, tooltip z komendą i czasem gate. Zielony ma dowód.
  • Osierocony (0 linków wejściowych) to nie blocker gate, więc badge --stale (warn kreskowany) z ikoną linku obok liczby „0 → 2”. W grafie: węzeł kreskowany warn + etykieta „0 wejść”.
  • Filtr „tylko z blockerami” to checkbox z licznikiem (3) — nie chip, nie segmented; jeden klik, jedno znaczenie.
  • Zaznaczony wiersz używa akcentu (tint 10% + krawędź inset), nigdy koloru stanu.

LinkGraph — drawer, nie osobny widok

  • Graf jest statycznym SVG w drawerze 392 px: 3 kształty (kwadrat = strona, koło z obrysem tekstu = artykuł, koło teal = autor), krawędzie --line, krawędzie zaznaczonego rekordu w akcencie. Bez fizyki, bez JS — układ ręczny na 344×296.
  • Osierocony węzeł: kreskowany obrys warn + podpis „0 wejść”. Pod grafem lista „Osierocone” z linkiem do rekordu i podpowiedzią, skąd dolinkować (najbliższy cluster).
  • Etykieta LIVE grafu = czas builda, bo krawędzie liczone z dist/, nie z Directus. Tabela ma dwie etykiety: kolekcje 03:07 (Directus) i gate 02:55 (build) — świadomie osobno.
  • Pełny, interaktywny graf mieszka w SEO — drawer ma przycisk „Pełny graf w SEO”.

Redirects — test kolizji jako pierwszorzędna kolumna

  • Kolumna „Test »nadpisuje istniejącą trasę?«” stoi zaraz za kodem; wynik: cisza „nie koliduje” albo badge warn z nazwą kolidującej trasy (pages/uslugi (published)).
  • Wiersz dodawania na końcu tabeli (tło surface-2): from, to, kod, „Testuj trasę” — test przed zapisem, zapis w Directus.
  • Drawer „Test trasy” tłumaczy skutek zwykłym zdaniem, listuje sprawdzone trasy i daje 3 zalecenia z CTA do kolidującej strony. Pętle i łańcuchy = critical (brak w danych, opisane w karcie „Jak działa test”).
  • Trafienia 30 d z logu nginx — mono, wyrównane do prawej; nowa reguła ma „—”.

Globals → JSON-LD

  • Dwie kolumny: wartości z Directus (kv, read-only) i blok kodu z @graph (Organization + WebSite). Komentarze w --muted wskazują braki inline („← puste”).
  • Puste sameAs = badge warn w nagłówku sekcji i przy polu, ale nota tłumaczy: to ostrzeżenie, nie blocker gate — kolor zgodny z wagą.
  • Walidacja schematu w stopce bloku kodu z LIVE czasu builda; Article/Person/Breadcrumb odsyłamy do SEO › Surface, żeby nie duplikować.

Stany

  • Loading: skeleton wierszy tabeli w rytmie kolumn + prostokąt grafu; pulsowanie koloru tła, bez gradientu i opacity.
  • Empty: 5 kroków seedu treści (2 odhaczone), CTA prowadzą do Directus / gate / build.
  • Error: 401 z Directus — panel z logiem i linkiem do Kluczy; tabela zostaje z cache oznaczonym badge „stale” (warn kreskowany) i czasem cache.
  • Blocked: plugin aios-articles off → zakładki articles/authors z kłódką i kreskowaną kreską, panel wyjaśnia zależności i kieruje do Moduły. To blocked, nie empty — brak źródła ≠ brak rekordów.

Komponenty użyte (BRIEF §5), dane, kolor

.tabs · .gate-table (w formie kolumny Gate + listy w szczegółach) · .drawer (LinkGraph, Test trasy) · .skeleton · .empty-checklist · .blocked-banner · .badge + .quiet + .verify · lokalne: .graph, .detail, .route-test, .globals. Nieużyte: .status-tile .conceal .kill-lock .diff-panel .chart-bars.

Dane z repo: artykuły lejek-dwustopniowy intencja-nie-keyword nie-sprzedajemy-pakietow koszt-pozyskania-klienta-cac, autorzy andrzej-niemiec aion-niemiec, kolekcje articles→wpisy projects→realizacje jobs→praktyki, blockery gate missing description | sources zgodne z Pulsem (3 + 1). Tytuły artykułów, clustery, redirecty i wartości globals — proposal do podmiany na live.

Kolor stanu tylko na: badge warn (gate, kolizja, sameAs), badge stale (osierocony, cache), krawędź ErrorPanel, węzeł osierocony w grafie. Teal wyłącznie jako obrys węzła autora (rodzaj, nie stan). Akcent: zaznaczony wiersz, aktywna zakładka, krawędzie zaznaczonego węzła, primary CTA — --accent-cl miedź (01), --accent-op stal (02, 02b).