5a7f7e1b13
Testy / Testy warstwy logicznej (silnik) (pull_request) Successful in 10m29s
Testy / Testy warstwy prezentacji (dostęp do baz) (pull_request) Failing after 4m55s
Testy / Testy warstwy bazodanowej (ochrona baz) (pull_request) Successful in 9m28s
Testy / Build obrazu silnika B (swisseph) (pull_request) Successful in 17s
Testy / Kontrola składni wszystkich warstw (pull_request) Successful in 8s
Testy / Testy warstwy logicznej (silnik) (push) Successful in 10m37s
Testy / Testy warstwy prezentacji (dostęp do baz) (push) Failing after 4m53s
Testy / Testy warstwy bazodanowej (ochrona baz) (push) Successful in 9m29s
Testy / Build obrazu silnika B (swisseph) (push) Successful in 19s
Testy / Kontrola składni wszystkich warstw (push) Successful in 8s
Ekran „Konta" wywalał się na produkcji błędem 500 bez słowa wyjaśnienia. Odtworzone lokalnie: `_read()` łapał wyłącznie brak pliku i zły JSON, więc każdy inny błąd systemu plików — a na udziale NFS to głównie prawa — leciał na wierzch jako nieobsłużony wyjątek. To jest szczególnie zły sposób na awarię AKURAT TUTAJ: ekran kont jest jedynym miejscem, z którego administrator może taki problem naprawić, a gołe 500 nie mówi mu ani co, ani gdzie. Teraz każdy błąd magazynu ma twarz: osobny wyjątek AccountsUnavailable niosący ŚCIEŻKĘ i powód z systemu operacyjnego, plus podpowiedź najczęstszej przyczyny (prawa katalogu na udziale albo wolumen zamontowany tylko do odczytu). Strona renderuje się normalnie z tym komunikatem u góry. Objęte są wszystkie cztery drogi zapisu, a nie tylko odczyt. W szczególności mkstemp: przy katalogu tylko do odczytu wywala się ONO pierwsze, jeszcze zanim dojdzie do zapisu i podmiany — więc obudowanie samego os.replace nic by nie dało (złapane testem, nie przeglądem kodu). USZKODZONY PLIK NIE JEST NADPISYWANY. Wcześniej niepoprawny JSON dawał pusty zbiór kont, co przy pierwszym zapisie skasowałoby WSZYSTKIE konta bez śladu. Teraz to odmowa z komunikatem — plik zostaje nietknięty, a test tego pilnuje. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Warstwa prezentacji (presentation)
Niezależna usługa serwująca stronę WWW (formularz + tabela wyników). W dół przekazuje dane z formularza do warstwy logicznej i renderuje opracowane wyniki. Brak logiki biznesowej i dostępu do danych.
Trasy
GET /— Horoskop: formularz danych momentu (data, godzina, strefa, opcjonalnie lokalizacja)POST /— liczy pozycje obiektów (woła logic/chart/positions) i renderuje czytelną tabelęGET /significators,POST /significators— wyszukiwarka w bazach interpretacji (warstwa danych)GET /health
Strona „Horoskop" to widok do ręcznego testowania: podstawowe dane wejściowe → to, co policzyła warstwa logiczna (znak, pozycja w znaku, absolutna, kierunek, prędkość). Przycisk „Tu i teraz" uzupełnia bieżącą datę/godzinę i strefę przeglądarki.
Zależności w dół
Zna wyłącznie LOGIC_URL (adres warstwy logicznej) i jej kontrakty /chart/positions
oraz /api/query. Nie wie nic o silniku ani bazach.
Uwaga: pełne liczenie pozycji wymaga warstwy logicznej z silnikiem efemeryd (gałąź
feat/logic-engine). Bez niego strona „Horoskop" pokaże czytelny komunikat.
Uruchomienie
pip install -r requirements.txt
export LOGIC_URL=http://localhost:8001
uvicorn app.main:app --port 8000
# otwórz http://localhost:8000