01 Moduły · desktop 1440×1280 · jasny · persona: klient owner · stan: zmieniony slot article → article-wide (niezapisany), DiffPanel po prawej pokazuje +1/−1 · hub read-only · commerce zablokowany kill-gate

Moduły

modules.json · zmiana 02:31 przez operatora (aios-images: off → on) · 5 on, 1 blocked · LIVE · 03:07

Historia zmian

Tryb sieci

mode
aion — hub liczy usage i quotę, klucz AION_TENANT_KEY w env, Chaos seed dostępny operatorowi. Przełączenie na standalone wymusi tenant_id: null i wymaga przejścia Exit.

Pluginy

plugins[] · 5 on · 1 blockedLIVE · 03:07
aios-seoGate runSeoGate, surface (meta, OG, JSON-LD Article/Person/Organization), sitemap, llms.txtwymaga: aios-articles 0.4.2gate 02:55
aios-articlesKolekcja articles, autorzy, cluster, LinkGraph, redirectsbaza dla: aios-seo aios-webmcp 0.6.04 rekordy
aios-imagesIngest tor A (warianty) · B (micro noise, flaga) · C (img2img, provider) · stock BYOK PEXELS PIXABAY UNSPLASHwłączony 02:31 przez operatora · tor B/C off 0.3.1ingest 01:58
aios-webmcpRegistry narzędzi, packs site-nav contact content-credentials, tiery R/W/C, endpoint /api/webmcp, bridge w HTMLwymaga: aios-articles · pack commerce blocked 0.5.0200 · 02:55
aios-trackingConsent Mode v2 (default deny), identyfikatory w tracking_config, /api/track + CAPI, guard ci:no-hardcode-analytics brak GA4 ID 0.2.4track 01:40
aios-commerce Medusa admin (center.aionflow.pl), Stripe, pack WebMCP commerce
Zablokowany kill-gate Discovery. Włączenie wymaga profiles: ["commerce"], a profil dodaje tylko operator po werdykcie: katalog + inventory + fulfillment. werdykt Discovery (plan 59)
blockedprofiles: []

Profile

profiles[] · 0
Brak profili — tenant standardowy (treść + SEO + tracking). commerce · tylko operator

Sloty

slots · 3
SlotKomponent Astro (starter)
headersite-header
footersite-footer
articlearticle-wide było article-default

Kolekcje

collections · 3
DirectusŚcieżka publiczna
articles/wpisy
projects/realizacje
jobs/praktyki

Hub

hub tylko do odczytu w trybie klienta
usage_url
https://hub.aionflow.pl/api/usage
sites[]
aion-marketing.pl · dev.aion-marketing.pl
tenant_id
aion-marketing
klucz
••••••••••••
02 Moduły · desktop 1440×1280 · data-theme="operator" · persona: operator · stan: przełączono na standalone (niezapisane) → ostrzeżenie „uruchom Exit”, diff mode/tenant_id/hub · „Zasil z blueprintu Chaos” i „+ commerce” widoczne tylko tu

Moduły

modules.json · zmiana 02:31 przez operatora (aios-images: off → on) · 5 on, 1 blocked · LIVE · 03:07

Historia zmian

Tryb sieci

mode
standalone (niezapisane) — wymusza tenant_id: null i hub: null. UsageMeter przechodzi na lokalny sink, quota hub znika. Przed zapisem uruchom Exit — ExitHarness dla bieżącego dist/ jest UNVERIFIED.
uruchom Exit

Pluginy

plugins[] · 5 on · 1 blockedLIVE · 03:07
aios-seoGate runSeoGate, surface (meta, OG, JSON-LD Article/Person/Organization), sitemap, llms.txtwymaga: aios-articles 0.4.2gate 02:55
aios-articlesKolekcja articles, autorzy, cluster, LinkGraph, redirectsbaza dla: aios-seo aios-webmcp 0.6.04 rekordy
aios-imagesIngest tor A (warianty) · B (micro noise, flaga) · C (img2img, provider) · stock BYOK PEXELS PIXABAY UNSPLASHwłączony 02:31 przez operatora · tor B/C off 0.3.1ingest 01:58
aios-webmcpRegistry narzędzi, packs site-nav contact content-credentials, tiery R/W/C, endpoint /api/webmcp, bridge w HTMLwymaga: aios-articles · pack commerce blocked 0.5.0200 · 02:55
aios-trackingConsent Mode v2 (default deny), identyfikatory w tracking_config, /api/track + CAPI, guard ci:no-hardcode-analytics brak GA4 ID 0.2.4track 01:40
aios-commerce Medusa admin (center.aionflow.pl), Stripe, pack WebMCP commerce
Zablokowany kill-gate Discovery. Włączenie wymaga profiles: ["commerce"], a profil dodaje tylko operator po werdykcie: katalog + inventory + fulfillment. werdykt Discovery (plan 59)
blockedprofiles: []

Profile

profiles[] · 0
Brak profili — tenant standardowy (treść + SEO + tracking). commerce wymaga URL werdyktu Discovery w polu profiles_meta.commerce.verdict

Sloty

slots · 3
SlotKomponent Astro (starter)
headersite-header
footersite-footer
articlearticle-default

Kolekcje

collections · 3
DirectusŚcieżka publiczna
articles/wpisy
projects/realizacje
jobs/praktyki

Hub

hub zostanie usunięte w standalone
usage_url
https://hub.aionflow.pl/api/usage
sites[]
aion-marketing.pl · dev.aion-marketing.pl
tenant_id
aion-marketing → null
klucz
••••••••••••
03 Moduły · stany 1440×1040 · loading · empty (brak modules.json → checklist 6 kroków) · error (JSON niepoprawny, linia 14) · blocked (member read-only / zapis LOCAL-GATED) · dolny rząd: podgląd „Zasil z blueprintu Chaos” przed merge (operator)
Loading skeleton listy pluginów
Empty świeży tenant · brak modules.json

Manifest nie istnieje

Edytor utworzy modules.json po pierwszym zapisie. Kolejność pól jak w schemacie @aios/core.

  1. 1Tryb sieci aion | standalonemode
  2. 2Pluginy — minimum aios-articles + aios-seoplugins[]
  3. 3Sloty header / footer / articleslots
  4. 4Kolekcje → ścieżki publicznecollections
  5. 5Hub: usage_url, sites[] (tylko aion)hub
  6. 6Zapisz + pierwszy rebuildbuild
Error manifest nie parsuje się

modules.json · błąd JSON

Ręczna edycja poza panelem. Ostatni poprawny zapis 02:31 (operator). Edytor pokazuje ostatnią dobrą wersję w trybie tylko do odczytu.

SyntaxError: Unexpected token '}' in JSON
  at modules.json:14:3
  13 |   "footer": "site-footer",
  14 |   }
  15 |   "collections": {
podpowiedź: brak przecinka po "slots" lub nadmiarowy nawias
LIVE · 03:07
Blocked member read-only · zapis LOCAL-GATED

Tylko do odczytu

Rola member widzi manifest, nie zapisuje. Toggle i selecty są wyłączone kreskowanym obrysem, DiffPanel ukryty. Zmiany zgłasza owner lub operator.

Rola
member · aion-niemiec
Subject
https://id.aionflow.pl/application/o/hub
Może
Treść, SEO (odczyt ustawień)
Poproś ownera o rolę

Zapis blocked — brak klucza

Tryb aion bez AION_TENANT_KEY: commit manifestu bez rebuildu z meteringiem byłby „partial done”. Zapis wyłączony do czasu uzupełnienia klucza.

UNVERIFIED · brak klucza
Chaos seed · podgląd przed merge tylko operator · seedModulesFromChaosBlueprint("aion-marketing") · nic nie zapisuje bez „Scal do diffu”

Blueprint Chaos → propozycja manifestu LIVE · 03:06

Blueprint proponuje 2 zmiany względem bieżącego manifestu. Profil commerce z blueprintu jest odrzucany automatycznie — kill-gate wygrywa nad seedem.

bieżący modules.json
{
  "plugins": ["aios-seo", "aios-articles", "aios-images",
              "aios-webmcp", "aios-tracking"],
  "profiles": [],
  "collections": { "articles": "wpisy", "projects": "realizacje", "jobs": "praktyki" }
}
propozycja z blueprintu chaos/aion-marketing
{
  "plugins": ["aios-seo", "aios-articles", "aios-images",
              "aios-webmcp", "aios-tracking"],
  "profiles": ["commerce" ← odrzucone: kill-gate Discovery],
  "collections": { "articles": "wpisy", "projects": "realizacje",
                   "jobs": "praktyki", "cases": "case-study" ← nowe }
}
merge trafia do DiffPanel, nie do pliku — zapis nadal wymaga „Zapisz + rebuild”
05 Spec · decyzje projektowe · Moduły · sesja 03.09 · źródło treści docs/admin-ui-views.md §2.2

Cel i hierarchia — edytor manifestu bez ręcznego JSON-a, ale z JSON-em w zasięgu wzroku

Lewa kolumna to formularz w kolejności pól schematu: tryb → pluginy → profile → sloty + kolekcje → hub. Prawa kolumna (392 px) to stale widoczny DiffPanel: każde kliknięcie po lewej natychmiast pokazuje, które linie JSON się zmienią. Operator nie musi ufać formularzowi — widzi diff, zanim kliknie „Zapisz + rebuild”. Nad zgięciem (810) mieści się tryb, cała lista pluginów i pierwsze linie diffu.

Zapis jest jedną akcją z rebuildem, bo manifest bez builda nie ma skutku. Stopka DiffPanel niesie szacunek czasu („rebuild ≈ 40 s”), a w trybie operatora — link do Exit, gdy diff dotyka mode.

KillGateLock — jak wygląda zablokowany toggle

  • Toggle .switch--locked: bez wypełnienia, kreskowany obrys, gałka kreskowana. Nie jest to „off” (off ma pełny obrys i jasną gałkę) — czytelne bez koloru.
  • Wiersz .plugin--locked: tło surface-2 (60%), nazwa w --muted z kłódką 16 px obok. Bez opacity, bez przekreślenia.
  • Powód .kill-lock pod opisem: kreskowana karta z kłódką, zdanie „Zablokowany kill-gate Discovery”, warunek (profiles: ["commerce"]), kto odblokowuje (operator) i link do werdyktu (plan 59). Zawsze tekst, nigdy sam tooltip.
  • Badge „blocked” neutralny (muted na surface-2) + profiles: [] zamiast czasu — blokada nie jest pomiarem, więc nie ma LIVE.
  • Ta sama grafika kłódki w menu systemu (Commerce) i w GateTable Pulsu — jeden język dla kill-gate w całym adminie.

Tryb aion | standalone

  • Segmented control mono (to wartości pola, nie etykiety). Ikony: chmura (aion) / dysk (standalone).
  • Przełączenie na standalone nie zapisuje. Skutki natychmiast w trzech miejscach: tekst obok segmented („wymusza tenant_id: null”), badge warn „uruchom Exit” w wierszu trybu, baner warn w DiffPanel. Diff pokazuje −6/+3: mode, tenant_id, hub → null.
  • Sekcja Hub dostaje badge „zostanie usunięte w standalone”; tenant_id renderuje przekreślenie + „→ null”.
  • Przycisk zapisu pozostaje aktywny — Exit to rekomendacja z dowodem UNVERIFIED, nie twarda blokada. Twardą blokadą jest brak klucza (stan Blocked).
  • ModeBadge w stopce menu pokazuje stan zapisany (aion), nie edytowany — inaczej shell kłamałby o produkcji.

Persony — co widzi klient, co operator

ElementOwner (01)Operator (02)
Tryb sieciedycjaedycja + Exit link
Pluginytoggle 5, commerce locktoggle 5, commerce lock (ten sam)
Profilechip „commerce · tylko operator” (ghost, kłódka)chip „+ commerce” + wymóg URL werdyktu
Hubtylko odczyt (etykieta z kłódką)edycja, „rotuj” klucz
Chaos seedbrakprzycisk w nagłówku + podgląd (03)
Memberread-only: kreskowane kontrolki, brak DiffPanel (stan Blocked)

Zasada: ta sama IA i te same komponenty, różni się tylko dostępność akcji. Nic nie znika bez śladu — zamiast ukrywać, pokazujemy kreskowany ghost z powodem.

DiffPanel

  • Unified diff z numerami linii, znak −/+ w osobnej kolumnie, tinty 11–13% na --critical/--ok — jedyne miejsce, gdzie ok/critical nie oznaczają stanu systemu, tylko kierunek zmiany. Spec akceptuje ten wyjątek, bo konwencja diffu jest silniejsza niż lokalna semantyka.
  • Pasek podsumowania +n −m · pola w mono nad diffem — operator widzi zakres zmiany bez czytania.
  • Przełącznik „unified | obok siebie” w nagłówku (obok siebie = 2 kolumny before/after, wariant do 03 nie rysowany).
  • Diff pokazuje pełny plik (23 linie), nie tylko hunk — manifest jest krótki, kontekst jest tańszy niż domysły.

Chaos seed — podgląd przed merge

  • Wywołanie seedModulesFromChaosBlueprint otwiera porównanie „bieżący | propozycja” w dwóch blokach kodu; różnice oznaczone komentarzem w --muted (← nowe / ← odrzucone).
  • Kill-gate wygrywa nad seedem: profil commerce z blueprintu jest odrzucany automatycznie i pokazany jako odrzucony — nie znika po cichu.
  • „Scal do diffu” zasila DiffPanel, nie plik. Zapis nadal wymaga „Zapisz + rebuild” — jedna ścieżka zapisu w całym widoku.
  • Etykieta LIVE dotyczy pobrania blueprintu (endpoint Chaos), nie jego trafności — trafność jest proposal.

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

.mode-badge · .kill-lock · .diff-panel · .conceal (klucz hub: kropki + „pokaż 5 s” + „rotuj” dla operatora) · .skeleton · .empty-checklist · .blocked-banner · .status-tile nieużyty (Moduły nie mierzą, tylko konfigurują) · dodatkowo lokalne: .plugin, .segmented, .switch, .slot-select, .chaos.

Dane z repo: pluginy aios-seo aios-articles aios-images aios-webmcp aios-tracking on, aios-commerce lock, profiles: [], sloty header→site-header footer→site-footer article→article-default, kolekcje articles→wpisy projects→realizacje jobs→praktyki, hub https://hub.aionflow.pl/api/usage, sites aion-marketing.pl dev.aion-marketing.pl. Wersje pluginów i propozycja „cases” z blueprintu — proposal.

Kolor stanu tylko na: badge warn (brak GA4 ID w wierszu aios-tracking, „uruchom Exit”, „zostanie usunięte”), tinty diffu, lewej krawędzi ErrorPanel. Zmieniony select (.slot-select--changed) używa akcentu, nie warn — zmiana to nie problem. Akcent: --accent-cl miedź (01), --accent-op stal (02); żaden nie dzieli wartości z warn/critical/ok/teal.