01 Exit — desktop jasny · owner · tryb aion · harness FAIL · eject krok 3 z 6

Wynik skanu dist/

FAIL · 3 wystąpienia · exit-harness.mjs
filematch · skąd
_astro/hoisted.ab12cd.jshttps://hub.aionflow.pl/api/usageUsageMeter — hub sink z modules.json.hub.usage_urlplik
index.htmlhttps://bot.aionflow.pl/stockBOT_STOCK_URL w stopce obrazów (tor A)plik
wpisy/lejek-dwustopniowy/index.htmlhttps://id.aionflow.pl/application/o/hublink „zaloguj” w komponencie site-headerplik
allowlist dirs
_pagefind/fixtures/dump/

Harness skanuje dist/ pod kątem http(s)://*.aionflow.pl. W standalone wynik musi być PASS; w aion tenant zostaje w sieci, ale skan i tak wskazuje wycieki wg polityki projektu (runbook §5).

412 plików · 2 z wyciekiem · LIVE · · czas skanu

Historia skanów i kroków

3audit log
ExitHarness FAIL · 3 wystąpienia w 2 plikachowner
tryb sieci aion → standalone · tenant_id: nulloperator
ExitHarness FAIL · 7 wystąpień · pierwszy skan tenantaowner

Eject wizard

runbook §6 · 6 krokówrunbook-montaz.md
1
Tryb sieci → standaloneoperator · owner
modules.json: "mode": "standalone", "tenant_id": null; znikają sekcje hub.
LIVE · cat modules.json
2
Usuń tenant keyoperator
Usuń AION_TENANT_KEY z .env, wyłącz callouty do hub; klucz unieważniony.
LIVE · grep -c AION_TENANT_KEY .env → 0
3
UsageMeter → lokalny sinkoperator
Metryki do Directus usage_log (lub plik); brak quoty hub.
usage-meter --sink directus:usage_log
4
Stock BYOKowner
PEXELS_API_KEY / PIXABAY_API_KEY / UNSPLASH_ACCESS_KEY zamiast BOT_STOCK_URL; wystarczy jeden.
env | grep -c _API_KEYbrak pomiaru
5
ExitHarness PASSoperator · owner
Rebuild + skan dist/: zero URL *.aionflow.pl; bez PASS paczka zablokowana.
LIVE · npm run exit-harness -- apps/starter/distFAIL
6
Odłącz huboperator
Usuń symlink / wpis w hub clients.json; historia usage może zostać w paczce.
hub /api/tenants/aion-marketing → 404po kroku 5

Paczka klienta

EXIT.md
aktywne po ExitHarness PASS (krok 5)
Zachowaj historię usage w paczce· fixtures/dump/usage_log.json · 3 412 rekordów
Zawartość: modules.json (standalone) · packages/* src · apps/starter · schema/schema.snapshot.json · docker-compose.yml · scripts/exit-harness.mjs · EXIT.md z checklistą BYOK. Bez node_modules, bez dist, bez kluczy.
02 Exit — desktop ciemny · operator · data-theme=operator · tryb standalone · PASS · paczka aktywna

Wynik skanu dist/

PASSexit-harness.mjs
Brak URL *.aionflow.pl w 412 plikach
ExitHarness PASS: no aionflow.pl URLs in apps/starter/dist · poprzedni skan miał 3 wystąpienia
LIVE ·
allowlist dirs
_pagefind/fixtures/dump/

Harness skanuje dist/ pod kątem http(s)://*.aionflow.pl. W standalone wynik musi być PASS; w aion tenant zostaje w sieci, ale skan i tak wskazuje wycieki wg polityki projektu (runbook §5).

412 plików · 0 z wyciekiem · czas skanu · wynik zapisany w EXIT.md

Historia skanów i kroków

6audit log
ExitHarness PASS · 412 plików · apps/starter/distoperator
rebuild po zmianie modules.json · 39 spipeline
usunięto AION_TENANT_KEY z .env · hub callout wyłączonyoperator
ExitHarness FAIL · 3 wystąpienia w 2 plikachowner
tryb sieci aion → standalone · tenant_id: nulloperator
ExitHarness FAIL · 7 wystąpień · pierwszy skan tenantaowner

Eject wizard

runbook §6 · 6 krokówrunbook-montaz.md
1
Tryb sieci → standaloneoperator · owner
modules.json: "mode": "standalone", "tenant_id": null; znikają sekcje hub.
LIVE · cat modules.json
2
Usuń tenant keyoperator
Usuń AION_TENANT_KEY z .env, wyłącz callouty do hub; klucz unieważniony.
LIVE · grep -c AION_TENANT_KEY .env → 0
3
UsageMeter → lokalny sinkoperator
Metryki do Directus usage_log (lub plik); brak quoty hub.
LIVE · usage-meter --sink directus:usage_log
4
Stock BYOKowner
PEXELS_API_KEY / PIXABAY_API_KEY / UNSPLASH_ACCESS_KEY zamiast BOT_STOCK_URL; wystarczy jeden.
LIVE · env | grep -c _API_KEYPEXELS_API_KEY ustawiony
5
ExitHarness PASSoperator · owner
Rebuild + skan dist/: zero URL *.aionflow.pl; bez PASS paczka zablokowana.
LIVE · npm run exit-harness -- apps/starter/dist
6
Odłącz huboperator
Usuń symlink / wpis w hub clients.json; historia usage może zostać w paczce.
LIVE · hub /api/tenants/aion-marketing → 404

Paczka klienta

EXIT.md
odblokowane po PASS
Zachowaj historię usage w paczce· fixtures/dump/usage_log.json · 3 412 rekordów
Zawartość: modules.json (standalone) · packages/* src · apps/starter · schema/schema.snapshot.json · docker-compose.yml · scripts/exit-harness.mjs · EXIT.md z checklistą BYOK. Bez node_modules, bez dist, bez kluczy.
03 Exit — stany · loading · empty · error · blocked (member / LOCAL-GATED)

Loading · skeleton, układ 1:1 z widokiem

skanuję dist/… 412 plików · ≤ 3 s · przycisk „Uruchom skan” w stanie loading

Empty · świeży tenant, brak dist/

Brak wyniku skanu — nie ma jeszcze dist/

ExitHarness czyta artefakty builda Astro. Po pierwszym buildzie wynik pojawi się tu z czasem weryfikacji, a wizard odblokuje krok 5.

  1. Scaffold i rejestr hubrunbook §1–2
  2. Directus + danehealth 200
  3. Zbuduj stronęnpm run build
  4. Uruchom skannpm run exit-harness -- apps/starter/dist
Build & Deploy → pipeline

Error · skan przerwany, retry + log

Skan nie zakończył się

ExitHarness nie znalazł zbudowanego pakietu @aios/core. Ostatni poprawny wynik: FAIL · 3 wystąpienia · — pokazujemy go poniżej jako STALE, nie jako aktualny.

ExitHarness skipped (build @aios/core first):
Cannot find module '/var/www/aios-core/packages/core/dist/index.js'
  at node scripts/aios-eject.mjs:209 · 03:12:44
ostatni wynik ·

Blocked · rola member · LOCAL-GATED

Eject wymaga roli owner lub operatora BLOCKED
Zalogowano jako member (redakcja@aion-marketing.pl). Wynik skanu widoczny, kroki wizardu tylko do odczytu.
Skan dist/ niedostępny z panelu LOCAL-GATED
Build żyje na hoście tenanta. Uruchom lokalnie npm run exit-harness -- dist --json i wgraj wynik — panel nie udaje, że zeskanował.
1
Tryb sieci → standaloneoperator · owner
tylko owner / operator
2
Usuń tenant keyoperator
tylko operator
05 Exit — Spec · decyzje · hierarchia · badge vs cisza · LIVE/UNVERIFIED

Spec — Exit / eject (§2.10)

Hierarchia widoku

  1. Tytuł „Exit / eject” + podtytuł z faktami: tenant, tryb (.mode-badge), czas ostatniego skanu, postęp eject.
  2. Pasek gotowości: 3 StatusTile (ExitHarness, build dist/, hub /api/tenants) + 1 StatCard „Kroki eject n / 6”. Tile ok = cisza + LIVE.
  3. Lewa kolumna 7/12: wynik skanu — tabela file · match · skąd albo karta PASS; allowlist dirs jako chipy; historia skanów (.event-stream).
  4. Prawa 5/12: wizard 6 kroków runbooka §6 (checkbox + weryfikacja + kto może) i karta „Paczka klienta”.
  5. Nad zgięciem 810: tytuł, akcje, pasek gotowości, 3 wiersze tabeli i kroki 1–3.

Co jest badge’em, co ciszą

  • FAIL harnessu = .badge--critical z liczbą wystąpień i czasem; PASS = .state--ok (ikona + „PASS”), bez badge’a.
  • Krok done = wypełniony checkbox + numer w --text; aktywny = krawędź --text + tło surface-2; fail = krawędź --critical; lock = kreskowany + „po kroku 5”.
  • Krok bez pomiaru (Stock BYOK przed sprawdzeniem) = .badge--unknown „brak pomiaru”, nie pusty.
  • Kto może: .who operator / owner / operator · owner przy każdym kroku — decyzja: role z §0 (eject = operator + owner; klucze i hub = operator).

Dane LIVE / UNVERIFIED

PoleŹródłoEtykieta
violations {file, match}ExitHarness.run()packages/core/src/exit-harness.tsLIVE · czas skanu
allowlistDirsopcja ExitHarness({ allowlistDirs })LIVE (konfiguracja)
mode / tenant_idmodules.json tenantaLIVE · czas odczytu
tenant key obecny.env hosta — panel nie czyta wartości, tylko obecnośćLIVE lub LOCAL-GATED
usage sinkUsageMeter configUNVERIFIED do „Sprawdź sink”
hub odłączonyGET hub.aionflow.pl/api/tenants/<id> → 404LIVE
ZIP klientascripts/aios-eject.mjsEXIT.mdaktywny tylko po PASS

Stany i role

  • Loading: skeleton 1:1 z układem (4 kafle + wiersze); przycisk skanu w loading.
  • Empty: brak dist/ → checklist runbooka §1–5 z jedną CTA „Uruchom build”.
  • Error: harness przerwany → .error-panel z logiem, retry, komendą naprawczą; ostatni wynik pokazany jako STALE.
  • Blocked: member → wizard read-only + „Poproś ownera”; skan spoza panelu → LOCAL-GATED + „Wgraj wynik JSON”. Nigdy „partial done”.
  • Standalone (plansza 02): ta sama IA; hub tile pokazuje 404 jako oczekiwany stan (ok), menu traci licznik Exit, paczka aktywna, checkbox historii usage domyślnie zaznaczony.

Komponenty §5 użyte

.status-tile · .stat-card · .gate-table (wariant file · match) · .event-stream · .mode-badge · .empty-checklist · .skeleton · .blocked-banner · .badge / .state / .verify · .wizard / .step / .chk / .who · .btn--disabled + .btn-why · .error-panel. Nie użyto: .conceal (klucz usuwa się, nie pokazuje), .diff-panel (zmiana trybu żyje w Modułach), .drawer, .tabs, .chart-bars.