astroklient: warstwa pośrednia — pełne astro, bez generowania i administracji (4/5) #83

Merged
gitea merged 1 commits from feat/astroklient into master 2026-08-27 10:43:32 +00:00
Owner

Trzeci produkt drabiny: astrodemo (dwie funkcje) → astroklientastrololo.

Po trzech poprzednich krokach jest cienki, bo jest złożeniem, a nie kopią: własne main.py z ośmioma importami, a rdzeń — ekrany, szablony, zasoby — bierze z warstwy prezentacji przy budowaniu obrazu. Jedno źródło, dwa produkty; inaczej te same 2500 linii szablonów żyłyby w dwóch egzemplarzach i rozjechały się w ciągu tygodni, po cichu.

Ma: Horoskop, Interpretacje, Kalendarz, Synastria, Sygnifikatory, wgrywanie plików. Wyszukiwarka miejsca i strefa czasowa — zgodnie z ustaleniem.

Nie ma i nie da się włączyć: plików usuniętych wg usun.txt nie ma w obrazie. Nie istnieje uprawnienie, którym dałoby się je odsłonić, bo katalog funkcji składa się ze zgłoszeń ekranów obecnych w obrazie. To dlatego „każde konto dostaje wszystko, co ta usługa umie" jest tu bezpieczne i nie wymaga wypisywania listy — zbiór liczy się z katalogu, więc opisuje ten produkt.

Pule per konto — tu była realna dziura

Warstwa logiczna przenosiła pulę tylko przy raporcie i operacjach na plikach. Kalendarz i Sygnifikatory czytałyby cały udział — jedno konto widziałoby pliki drugiego, mimo że izolacja pul jest całą przesłanką tego produktu.

Domknięte: TimelineRequest i QueryRequest niosą teraz pulę, a QueryService buduje klienta danych na żądanie. Pula jedzie w każdym żądaniu w dół i bierze się z kontekstu ustawianego przy wejściu, nigdy z formularza — test podstawia tenant=ktos-inny w POST i sprawdza, że w dół poszedł login zalogowanego.

Warstwa wspólna rozdzielona od pojęcia administratora

base.html miał wpisany na sztywno can(request, 'admin') i odsyłacz do ekranu kont — czyli w produkcie bez tego ekranu zostawał martwy link i nazwa czegoś, czego nie ma. Rejestr niesie teraz wymagane uprawnienie, a szablon dostaje gotową listę. podstawa.py przestała też importować moduły służące jednemu ekranowi (konta, stany plików).

Zapora słownikowa nad realnym drzewem

Test buduje złożenie tak samo jak Dockerfile i szuka słów o funkcjach, których nie ma — w odpowiedziach oraz w plikach.

Pierwsza wersja znalazła dziesięć trafień, w tym trzy moje własne docstringi wyliczające nieobecne funkcje. Zdanie „nie ma tu generowania tekstu" mówi wprost, że coś takiego istnieje — jest więc takim samym śladem jak przycisk. Po poprawkach: zero. Test ma kontrolę negatywną: podrzucony plik ma go wywrócić.

usun.txt jest danymi, nie tekstem w Dockerfile — czyta go też test pilnujący, żeby zgadzał się ze złożeniem w main.py. Rozjazd znaczyłby albo martwy kod w obrazie, albo błąd dopiero przy uruchomieniu.

CI

astroklient buduje się z korzenia repozytorium (jego Dockerfile sięga po rdzeń), a zmiana w warstwie prezentacji też go przebudowuje — bez tego jego obraz zostawałby ze starymi ekranami, a różnicy nie byłoby widać aż do zgłoszenia użytkownika.

Testy: astroklient 12 · presentation 368 · astrodemo 28 · logic 342 · data 42 · render 41.


Zostaje PR 5: manifesty wdrożeniowe astroklienta (własny host, sekret astrololo-astroklient, udział NFS na pule, wpis w liście obserwowanych obrazów). Dorzucę tam poprawkę listy węzłów NFS — runbooki wymieniają trzy, a klaster ma cztery.

Trzeci produkt drabiny: **astrodemo** (dwie funkcje) → **astroklient** → **astrololo**. Po trzech poprzednich krokach jest cienki, bo jest **złożeniem, a nie kopią**: własne `main.py` z ośmioma importami, a rdzeń — ekrany, szablony, zasoby — bierze z warstwy prezentacji przy budowaniu obrazu. Jedno źródło, dwa produkty; inaczej te same 2500 linii szablonów żyłyby w dwóch egzemplarzach i rozjechały się w ciągu tygodni, po cichu. **Ma:** Horoskop, Interpretacje, Kalendarz, Synastria, Sygnifikatory, wgrywanie plików. Wyszukiwarka miejsca i strefa czasowa — zgodnie z ustaleniem. **Nie ma i nie da się włączyć:** plików usuniętych wg `usun.txt` nie ma w obrazie. Nie istnieje uprawnienie, którym dałoby się je odsłonić, bo katalog funkcji składa się ze **zgłoszeń ekranów obecnych w obrazie**. To dlatego „każde konto dostaje wszystko, co ta usługa umie" jest tu bezpieczne i nie wymaga wypisywania listy — zbiór liczy się z katalogu, więc opisuje ten produkt. ### Pule per konto — tu była realna dziura Warstwa logiczna przenosiła pulę tylko przy raporcie i operacjach na plikach. **Kalendarz i Sygnifikatory czytałyby cały udział** — jedno konto widziałoby pliki drugiego, mimo że izolacja pul jest całą przesłanką tego produktu. Domknięte: `TimelineRequest` i `QueryRequest` niosą teraz pulę, a `QueryService` buduje klienta danych na żądanie. Pula jedzie w każdym żądaniu w dół i bierze się z kontekstu ustawianego przy wejściu, **nigdy z formularza** — test podstawia `tenant=ktos-inny` w POST i sprawdza, że w dół poszedł login zalogowanego. ### Warstwa wspólna rozdzielona od pojęcia administratora `base.html` miał wpisany na sztywno `can(request, 'admin')` i odsyłacz do ekranu kont — czyli w produkcie bez tego ekranu zostawał **martwy link i nazwa czegoś, czego nie ma**. Rejestr niesie teraz wymagane uprawnienie, a szablon dostaje gotową listę. `podstawa.py` przestała też importować moduły służące jednemu ekranowi (konta, stany plików). ### Zapora słownikowa nad realnym drzewem Test buduje złożenie **tak samo jak Dockerfile** i szuka słów o funkcjach, których nie ma — w odpowiedziach oraz w plikach. Pierwsza wersja znalazła dziesięć trafień, w tym **trzy moje własne docstringi wyliczające nieobecne funkcje**. Zdanie „nie ma tu generowania tekstu" mówi wprost, że coś takiego istnieje — jest więc takim samym śladem jak przycisk. Po poprawkach: **zero**. Test ma kontrolę negatywną: podrzucony plik ma go wywrócić. `usun.txt` jest **danymi**, nie tekstem w Dockerfile — czyta go też test pilnujący, żeby zgadzał się ze złożeniem w `main.py`. Rozjazd znaczyłby albo martwy kod w obrazie, albo błąd dopiero przy uruchomieniu. ### CI astroklient buduje się z **korzenia** repozytorium (jego Dockerfile sięga po rdzeń), a **zmiana w warstwie prezentacji też go przebudowuje** — bez tego jego obraz zostawałby ze starymi ekranami, a różnicy nie byłoby widać aż do zgłoszenia użytkownika. **Testy:** astroklient 12 · presentation 368 · astrodemo 28 · logic 342 · data 42 · render 41. --- Zostaje PR 5: manifesty wdrożeniowe astroklienta (własny host, sekret `astrololo-astroklient`, udział NFS na pule, wpis w liście obserwowanych obrazów). Dorzucę tam poprawkę listy węzłów NFS — runbooki wymieniają trzy, a klaster ma cztery.
gitea added 1 commit 2026-08-26 18:41:08 +00:00
astroklient: warstwa pośrednia — pełne astro, bez generowania i administracji (4/5)
Testy / Testy warstwy logicznej (silnik) (pull_request) Successful in 10m19s
Testy / Testy warstwy prezentacji (dostęp do baz) (pull_request) Successful in 9m29s
Testy / Testy warstwy bazodanowej (ochrona baz) (pull_request) Successful in 9m26s
Testy / Testy astrodemo (pull_request) Failing after 0s
Testy / Testy astroklient (pull_request) Successful in 9m29s
Testy / Build obrazu silnika B (swisseph) (pull_request) Successful in 7s
Testy / Kontrola składni wszystkich warstw (pull_request) Successful in 5s
build / build (push) Successful in 19s
Testy / Testy warstwy logicznej (silnik) (push) Successful in 10m25s
Testy / Testy warstwy prezentacji (dostęp do baz) (push) Successful in 9m29s
Testy / Testy warstwy bazodanowej (ochrona baz) (push) Successful in 9m26s
Testy / Testy astrodemo (push) Failing after 0s
Testy / Testy astroklient (push) Successful in 9m29s
Testy / Build obrazu silnika B (swisseph) (push) Successful in 7s
Testy / Kontrola składni wszystkich warstw (push) Successful in 5s
10970c579f
Trzeci produkt drabiny: astrodemo (dwie funkcje) → astroklient → astrololo.
Po trzech poprzednich krokach jest cienki, bo jest ZŁOŻENIEM, a nie kopią:
własne main.py z ośmioma importami, a rdzeń — ekrany, szablony, zasoby — bierze
z warstwy prezentacji przy budowaniu obrazu. Jedno źródło, dwa produkty; inaczej
te same 2500 linii szablonów żyłyby w dwóch egzemplarzach i rozjechały się
w ciągu tygodni, po cichu.

CO MA: Horoskop, Interpretacje, Kalendarz, Synastria, Sygnifikatory, wgrywanie
plików. Wyszukiwarka miejsca i strefa czasowa zgodnie z ustaleniem.

CZEGO NIE MA I DLACZEGO NIE DA SIĘ WŁĄCZYĆ: plików usuniętych wg usun.txt nie ma
w obrazie. Nie istnieje uprawnienie, którym dałoby się je odsłonić, bo katalog
funkcji składa się ze ZGŁOSZEŃ ekranów obecnych w obrazie. To dlatego „każde
konto dostaje wszystko, co ta usługa umie" jest tu bezpieczne i nie wymaga
wypisywania listy: zbiór liczy się z katalogu, więc opisuje ten produkt.

KONTA jak w astrodemo: z konfiguracji środowiska (ASTROKLIENT_USERS), jeden
poziom dostępu, bez pliku kont i bez ekranu ich zakładania. Konta rozdziela się
po to, żeby każde miało własną pulę plików.

PULE PER KONTO — tu była realna dziura. Warstwa logiczna przenosiła pulę tylko
przy raporcie i operacjach na plikach, więc Kalendarz i Sygnifikatory czytałyby
CAŁY udział: jedno konto widziałoby pliki drugiego, mimo obietnicy izolacji.
Domknięte: TimelineRequest i QueryRequest niosą teraz pulę, a QueryService buduje
klienta danych na żądanie.

Pula jedzie w każdym żądaniu w dół i bierze się z kontekstu ustawianego przy
wejściu, nigdy z formularza. Test podstawia `tenant=ktos-inny` w POST i sprawdza,
że w dół poszedł login zalogowanego.

WARSTWA WSPÓLNA ROZDZIELONA OD POJĘCIA ADMINISTRATORA. base.html miał wpisany na
sztywno warunek `can(request, 'admin')` i odsyłacz do ekranu kont — czyli
w produkcie bez tego ekranu zostawał martwy link i nazwa czegoś, czego nie ma.
Rejestr niesie teraz wymagane uprawnienie, a szablon dostaje gotową listę.
Podstawa przestała też importować moduły służące jednemu ekranowi (konta, stany
plików), bo produkt bez tego ekranu wlókł ich zależności.

ZAPORA SŁOWNIKOWA NAD REALNYM DRZEWEM. Test buduje złożenie tak samo jak
Dockerfile i szuka słów o funkcjach, których nie ma — w odpowiedziach ORAZ
w plikach. Pierwsza wersja znalazła dziesięć trafień, w tym trzy moje własne
docstringi WYLICZAJĄCE nieobecne funkcje: zdanie „nie ma tu generowania tekstu"
mówi wprost, że coś takiego istnieje, więc jest takim samym śladem jak przycisk.
Po poprawkach: zero. Test ma kontrolę negatywną — podrzucony plik ma go wywrócić.

usun.txt jest DANYMI, nie tekstem w Dockerfile: czyta go też test pilnujący, żeby
zgadzał się ze złożeniem w main.py. Rozjazd znaczyłby albo martwy kod w obrazie,
albo błąd dopiero przy uruchomieniu.

CI: astroklient buduje się z KORZENIA repozytorium (jego Dockerfile sięga po
rdzeń), a zmiana w warstwie prezentacji też go przebudowuje — bez tego jego obraz
zostawałby ze starymi ekranami, a różnicy nie byłoby widać do zgłoszenia
użytkownika.

Testy: astroklient 12, presentation 368, astrodemo 28, logic 342, data 42,
render 41.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
gitea merged commit 10970c579f into master 2026-08-27 10:43:32 +00:00
gitea deleted branch feat/astroklient 2026-08-27 10:43:32 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: gitea/astrololo#83