From 21442b35b97a3dc96c340c445b0341d8d86440fe Mon Sep 17 00:00:00 2001 From: migatu Date: Sat, 27 Jun 2026 16:50:56 +0200 Subject: [PATCH] =?UTF-8?q?Wymagania:=20dwa=20silniki=20w=20warstwie=20log?= =?UTF-8?q?icznej=20(w=C5=82asny=20+=20AGPL)=20do=20por=C3=B3wna=C5=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Decyzja: warstwa logiczna ma dwie wymienne implementacje silnika obliczeń — własną/permisywną (ścieżka A) i AGPL (Swiss Ephemeris) — dla wbudowanego frameworku porównań i walidacji. Prezentacja i dane pozostają wspólne. - docs/architektura-dwoch-silnikow.md: schemat, izolacja licencyjna silnika AGPL jako osobnej usługi (engine-swisseph), mechanizm dual-run, mapowanie na wymagania, profile wdrożeniowe. - astrololo_wymagania.xlsx (Warstwa logiczna): rewizja LOG-24 (EngineProvider z dwoma backendami) i LOG-25 (framework porównawczy); nowe LOG-26 (dual-run + raport różnic), LOG-27 (izolacja licencyjna silnika AGPL), LOG-28 (kontrakt parzystości silników). Licznik w Przeglądzie: 28. Co-Authored-By: Claude Opus 4.8 --- docs/architektura-dwoch-silnikow.md | 84 ++++++++++++++++++++++++++++ docs/astrololo_wymagania.xlsx | Bin 22769 -> 23616 bytes 2 files changed, 84 insertions(+) create mode 100644 docs/architektura-dwoch-silnikow.md diff --git a/docs/architektura-dwoch-silnikow.md b/docs/architektura-dwoch-silnikow.md new file mode 100644 index 0000000..f376392 --- /dev/null +++ b/docs/architektura-dwoch-silnikow.md @@ -0,0 +1,84 @@ +# Architektura dwóch silników (warstwa logiczna) + +Dokument roboczy. Decyzja: warstwa logiczna ma **dwie wymienne implementacje silnika obliczeń** — jedną **własną/permisywną** (ścieżka A) i jedną **opartą o AGPL** (ścieżka C, Swiss Ephemeris) — żeby od pierwszego dnia mieć **wbudowany framework porównań i walidacji**. Warstwy **prezentacji i danych pozostają wspólne i pojedyncze**; rozdwaja się wyłącznie silnik wewnątrz warstwy logicznej. + +--- + +## 1. Schemat + +``` + (jedna) (jedna, ale 2 silniki) (jedna) +┌──────────────────────┐ ┌─────────────────────────────────────┐ ┌──────────────────────┐ +│ PREZENTACJA │ ─────▶ │ LOGIKA │ ─────▶ │ DANE │ +│ (bez zmian) │ ◀───── │ EngineProvider (interfejs) │ ◀───── │ (bez zmian) │ +└──────────────────────┘ │ ├── EngineA: własny (permisywny)│ └──────────────────────┘ + │ │ Skyfield/Moshier — in-proc │ + │ └── EngineB: swisseph (AGPL) │ + │ ⇢ OSOBNY proces/usługa │ + │ Komparator (dual-run + raport) │ + └─────────────────────────────────────┘ + │ + ⇢ (granica sieciowa/IPC) + ┌─────────────────────────────────┐ + │ engine-swisseph (AGPL, OSOBNO) │ + │ pyswisseph / Swiss Ephemeris │ + └─────────────────────────────────┘ +``` + +Prezentacja i dane „widzą" tylko interfejs `EngineProvider` — **nie wiedzą, który silnik liczy** (engine‑agnostic). To ta sama zasada modułowości co `DataProvider` w warstwie danych. + +--- + +## 2. Po co dwa silniki + +1. **Wyrocznia walidacyjna od dnia zero.** Każdy wynik EngineA możemy natychmiast porównać z EngineB (Swiss Ephemeris = de‑facto standard). Bezcenne przy budowie własnego silnika od zera (primary directions, domy, węzły/Lilith). +2. **Framework porównań.** Tryb „policz oboma i pokaż różnice" — do testów regresyjnych (CI) i do podglądu side‑by‑side w UI. +3. **Bezpieczeństwo decyzji.** Gdyby własny silnik gdzieś odstawał, widać to od razu, a nie po miesiącach. + +--- + +## 3. Izolacja licencyjna (warunek konieczny) ⚠️ + +EngineB jest **AGPL**, więc nie może być wlinkowany w permisywny produkt. Rozwiązanie zgodne z naszą architekturą (osobne usługi jak warstwa danych): + +- **EngineB = osobny proces/usługa `engine-swisseph`**, wołany przez **granicę sieciową/IPC** (HTTP). Brak linkowania = brak „zarażenia" copyleftem reszty. +- **Produkt zamknięty (dystrybucja/hosting):** prezentacja + logika(**EngineA**) + dane. **Bez** EngineB. Zero AGPL. +- **Profil porównawczy/dev/CI:** dodatkowo uruchamiamy usługę `engine-swisseph` (AGPL, sama w sobie zgodna z AGPL — to w zasadzie cienkie API na pyswisseph). Używana wewnętrznie do porównań, nie wystawiana użytkownikom produktu. +- **Konfiguracja** decyduje, czy EngineB jest w ogóle dostępny (`ENGINE_B_URL` ustawione lub nie). + +Efekt: pełny framework porównań **bez** narażania kodu i danych produktu na obowiązki AGPL (patrz `przeglad-bibliotek-i-licencji.md` oraz analiza zakresu AGPL względem baz danych). + +--- + +## 4. Jak działa porównanie (dual‑run) + +1. To samo wejście (dane horoskopu + ustawienia) trafia do EngineA i EngineB. +2. Komparator zestawia wyniki: pozycje obiektów, cusps domów, aspekty, daty technik. +3. Różnice liczone z **progami tolerancji per wielkość** (np. długość ekliptyczna ≤ 1″, cusp ≤ 1″, data zdarzenia ≤ 1 min); przekroczenia oflagowane. +4. Raport: (a) jako asercje w **CI** (regresja), (b) jako **podgląd side‑by‑side** w prezentacji na żądanie. + +--- + +## 5. Wpływ na warstwy i mapowanie na wymagania + +| Warstwa | Zmiana | +|---|---| +| Prezentacja | brak (opcjonalnie: widok porównawczy side‑by‑side) | +| Dane | brak | +| **Logika** | `EngineProvider` + 2 backendy (EngineA in‑proc, EngineB jako klient usługi AGPL) + komparator | +| **Nowa usługa** | `engine-swisseph` (AGPL, osobno, opcjonalna) | + +Wymagania (arkusz „Warstwa logiczna"): +- **LOG‑24** — interfejs `EngineProvider` z **dwoma** backendami (zrewidowane). +- **LOG‑25** — framework walidacyjno‑porównawczy (zrewidowane). +- **LOG‑26** — tryb dual‑run + raport różnic (nowe). +- **LOG‑27** — izolacja licencyjna silnika AGPL jako osobnej usługi (nowe). +- **LOG‑28** — kontrakt parzystości silników: identyczny interfejs, te same testy (nowe). + +--- + +## 6. Implikacje wdrożeniowe + +- **Dwa profile `docker-compose`:** `proprietary` (prezentacja+logika+dane, EngineA) i `comparison` (dodaje `engine-swisseph`). +- **Testy kontraktowe** uruchamiane na obu silnikach (ten sam zestaw → gwarancja parzystości interfejsu). +- **Decyzja A vs B na produkcji** pozostaje po stronie A; B nigdy nie trafia do dystrybucji zamkniętej — służy jako wzorzec i narzędzie QA. diff --git a/docs/astrololo_wymagania.xlsx b/docs/astrololo_wymagania.xlsx index 9e6073fedc91c3538d38847fda81fc913de23d0a..12501a9e00b3f72a35b15e9be576b580790c94ef 100644 GIT binary patch delta 18905 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 UUa#PLPa2KyFcW3GZ?*^j7c6S2F#rGn delta 18059 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