2e9d3706ec
Testy / Testy warstwy logicznej (silnik) (push) Failing after 4m50s
Testy / Testy warstwy prezentacji (dostęp do baz) (push) Successful in 9m28s
Testy / Testy warstwy bazodanowej (ochrona baz) (push) Successful in 9m25s
Testy / Testy astrodemo (push) Successful in 9m25s
Testy / Build obrazu silnika B (swisseph) (push) Successful in 8s
Testy / Kontrola składni wszystkich warstw (push) Successful in 5s
Testy / Testy warstwy logicznej (silnik) (pull_request) Failing after 4m43s
Testy / Testy warstwy prezentacji (dostęp do baz) (pull_request) Successful in 9m28s
Testy / Testy warstwy bazodanowej (ochrona baz) (pull_request) Successful in 9m25s
Testy / Testy astrodemo (pull_request) Successful in 9m25s
Testy / Build obrazu silnika B (swisseph) (pull_request) Successful in 6s
Testy / Kontrola składni wszystkich warstw (pull_request) Successful in 4s
Pierwszy z pięciu kroków budowy trzech produktów: astrodemo (dwie funkcje) → astroklient (pełne astro bez AI) → astrololo (wszystko). Nazwa „astroklient" zostaje zwolniona dla warstwy pośredniej, więc dotychczasowe astroklient-demo nazywa się teraz astrodemo. REBASE. Cztery commity demo przeniesione na aktualnego mastera. Konflikt był jeden — rejestr wymagań (xlsx, binarny, git go nie scali). Master dodał LOG-34, gałąź demo PRE-28 i PRE-29; żaden wspólny wiersz się nie różnił, więc scalone ręcznie: 148 pozycji, wszystkie trzy obecne. ZMIANA NAZWY. Katalog, ciasteczko sesji (astrodemo_sesja), zmienne ASTRODEMO_USERS/USER/PASSWORD, CI, README, docstringi. Ponieważ PR z demo nigdy nie został zmergowany, usługa nie jest nigdzie wdrożona — zmiana nazw niczego nie migruje i nikogo nie wylogowuje. WYCIEKI. astrodemo powstało przed audytem z PRE-27, więc miało komplet tych samych dziur: - /static omijało bramkę (PUBLIC_PREFIXES), a pierwszy komentarz w styles.css brzmiał „Nie kopiujemy stylów pełnej aplikacji" — czyli anonimowy curl dowiadywał się, że istnieje pełna aplikacja. Zasoby idą teraz trasą z jawną listą, komentarze są zdejmowane przy serwowaniu. - Komunikat awarii wypisywał na ekran treść wyjątku httpx, z nazwą usługi i portem. Teraz jedno neutralne zdanie, szczegóły do dziennika. - /health oddawał nazwę warstwy. Teraz samo „ok". - Dziesięć komentarzy i docstringów tłumaczyło decyzje przez porównanie z „pełną aplikacją". Obraz tej usługi się KOMUŚ ODDAJE, więc kto go dostanie, przeczyta też komentarze. Przepisane tak, żeby opisywały tę usługę samą w sobie. - Nagłówek main.py twierdził, że demo dzieli pulę plików z produkcją. To nieprawda od PRE-29 (pule per konto) — opis poprawiony. ZAPORA SŁOWNIKOWA, dwupoziomowa. Poziom „wszędzie" (także w kodzie serwera, bo obraz się oddaje) obejmuje wzmianki o większym rodzeństwie, o modelu językowym i o funkcjach, których tu nie ma. Poziom „do przeglądarki" dokłada słownictwo mechanizmów. Test sprawdza odpowiedzi ORAZ drzewo plików. Jeden wyjątek jest jawny i opisany: stałe protokołu łącza (X-Astrololo-Token, X-Astrololo-Enc, typ treści, etykieta HKDF) niosą nazwę rodziny produktów. Są wspólne z warstwą logiczną, więc zmiana wymaga jednoczesnej podmiany we wszystkich usługach i rotacji — osobna decyzja. Osobny test pilnuje warunku, pod jakim to zostaje: że nie docierają do przeglądarki. Wcześniej przechodziły tylko dlatego, że regex nie dopasowywał po myślniku — przypadek, nie decyzja. Przy okazji: komunikat „ramka bez znacznika astrololo" zmieniony na neutralny we WSZYSTKICH PIĘCIU kopiach link_crypto.py (presentation, astrodemo, logic, data, render), żeby nie rozjechały się przed scaleniem w rdzeń. Te kopie to 2625 linii tego samego kodu. Testy: astrodemo 27, presentation 358, logic 342, data 42, render 41. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
64 lines
2.8 KiB
CSS
64 lines
2.8 KiB
CSS
/* Arkusz CELOWO minimalny: dwa formularze i tabela wyników. Każda klasa ponad to
|
|
niosłaby nazwę funkcji, której tu nie ma. */
|
|
:root {
|
|
--bg: #11121b; --panel: #191b26; --line: #2b2e3d;
|
|
--fg: #e8e9f0; --muted: #9aa0b4; --accent: #8ab4ff;
|
|
}
|
|
* { box-sizing: border-box; }
|
|
body {
|
|
margin: 0; background: var(--bg); color: var(--fg);
|
|
font: 15px/1.5 system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
|
|
}
|
|
main { max-width: 880px; margin: 0 auto; padding: 1.5rem 1rem 3rem; }
|
|
.topbar { padding: .5rem 0 1rem; border-bottom: 1px solid var(--line);
|
|
display: flex; align-items: baseline; justify-content: space-between; gap: 1rem; }
|
|
.kto { display: flex; align-items: center; gap: .5rem; }
|
|
.whoami { color: var(--muted); font-size: .85rem; }
|
|
.wyloguj-form { display: inline; margin: 0; }
|
|
button.wyloguj {
|
|
background: none; border: 1px solid var(--line); color: var(--muted);
|
|
font: inherit; font-weight: 400; padding: .35rem .8rem; border-radius: 8px; cursor: pointer;
|
|
}
|
|
button.wyloguj:hover { color: var(--fg); }
|
|
|
|
/* Ekran logowania — wąski, bez niczego poza formularzem. */
|
|
.login-card label { display: block; margin-top: .75rem; }
|
|
.login-card input { width: 100%; }
|
|
h1 { margin: 0; font-size: 1.4rem; letter-spacing: .5px; }
|
|
h2 { margin: 0 0 .3rem; font-size: 1.05rem; }
|
|
h3 { margin: 0 0 .5rem; font-size: 1rem; }
|
|
|
|
.card {
|
|
margin-top: 1.25rem; padding: 1rem 1.25rem;
|
|
background: var(--panel); border: 1px solid var(--line); border-radius: 12px;
|
|
}
|
|
.row { display: flex; gap: .75rem; flex-wrap: wrap; align-items: flex-end; margin-top: .6rem; }
|
|
label { display: flex; flex-direction: column; gap: .25rem; color: var(--muted); font-size: .85rem; flex: 1; min-width: 10rem; }
|
|
input {
|
|
width: 100%; padding: .45rem .6rem; background: #0e0f18; color: var(--fg);
|
|
border: 1px solid var(--line); border-radius: 8px; font: inherit;
|
|
}
|
|
button {
|
|
padding: .5rem 1.25rem; background: var(--accent); color: #10121a;
|
|
border: none; border-radius: 8px; font: inherit; font-weight: 600; cursor: pointer;
|
|
}
|
|
|
|
table { width: 100%; border-collapse: collapse; margin-top: .3rem; }
|
|
td { padding: .35rem .5rem; border-bottom: 1px solid var(--line); vertical-align: top; font-size: .92rem; }
|
|
td.key { color: var(--accent); white-space: nowrap; padding-right: 1rem; }
|
|
tr:last-child td { border-bottom: none; }
|
|
|
|
.sig { margin-top: .75rem; }
|
|
.sig-head { color: var(--muted); font-size: .85rem; }
|
|
.meta { color: var(--muted); margin: 1.5rem 0 .5rem; font-size: .9rem; }
|
|
.muted { color: var(--muted); }
|
|
.small { font-size: .85rem; }
|
|
.foot { margin-top: 2.5rem; color: var(--muted); font-size: .8rem; }
|
|
|
|
.alert, .ok {
|
|
margin: 1rem 0; padding: .6rem .9rem; border-radius: 8px; font-size: .92rem;
|
|
border: 1px solid var(--line); border-left-width: 4px;
|
|
}
|
|
.alert { border-left-color: #b8860b; background: rgba(184, 134, 11, .1); }
|
|
.ok { border-left-color: var(--accent); background: rgba(138, 180, 255, .08); }
|