Rozszerz analizę warstwy logicznej: gotowce, licencje, złożoność + LOG-25

- docs/przeglad-bibliotek-i-licencji.md: przegląd istniejących bibliotek/
  programów z komentarzem licencyjnym i oceną ryzyka praw autorskich;
  rekomendacja ścieżki A (Skyfield/Moshier permisywne) + nota o prawach do
  treści baz.
- docs/warstwa-logiczna-analiza.md: rozwinięcie 24 wymagań LOG, przypisanie
  permisywnych gotowców, ocena złożoności implementacji od zera, rola B/C
  jako wyroczni walidacyjnej; kolejność budowy.
- astrololo_wymagania.xlsx: w arkuszu "Warstwa logiczna" 4 nowe kolumny
  (gotowe rozwiązanie / licencja / złożoność od zera / rola B/C) oraz nowy
  wiersz LOG-25 (harness walidacyjny). Licznik w Przeglądzie zaktualizowany.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-27 12:31:37 +02:00
parent 7bda39ab46
commit 3655b39acf
3 changed files with 284 additions and 0 deletions
+174
View File
@@ -0,0 +1,174 @@
# Warstwa logiczna — analiza, rozwinięcie wymagań i przypisanie rozwiązań
Dokument roboczy. Rozwinięcie 24 wymagań warstwy logicznej (LOG01…LOG24 z `astrololo_wymagania.xlsx`) wraz z: przypisaniem gotowych **permisywnych** rozwiązań, oceną złożoności implementacji **od zera** (bo idziemy **ścieżką A**) oraz wskazaniem, gdzie narzędzia AGPL/komercyjne (B/C) służą jako **referencja i walidacja**. Stan: czerwiec 2026.
---
## 0. Założenia ścieżki A
**Fundament permisywny (co dostajemy „za darmo"):**
- **Skyfield** (MIT) + dane **NASA JPL DE440/DE441** (public domain) → geocentryczne pozycje planet i Księżyca, RA/Dec, długość/szerokość ekliptyczna, prędkości, wschody/zachody, wyszukiwanie zdarzeń (stacje, powroty, syzygia).
- **pyerfa / ERFA** (BSD; pochodna IAU SOFA) → precesja, nutacja, czas gwiazdowy (LST), nachylenie ekliptyki (obliquity) — prymitywy potrzebne do osi (Asc/MC) i ayanams.
- **Katalog Hipparcos** (ESA, swobodnie dostępny; ładuje go Skyfield) → gwiazdy stałe.
- **Lark / pyparsing** (MIT) → infrastruktura parsera składni sygnifikatorów.
- **numpy / pandas** (BSD) → cała matematyka i tabele.
Wniosek: **~7080% astronomicznego fundamentu jest pokryte permisywnie**. Sami budujemy **warstwę astrologiczną** (domy, dyrekcje, techniki, parser, dopasowanie) — a jej algorytmy/wzory są **wiedzą publiczną** (opisane w literaturze astronomicznej i astrologicznej), więc **nie podlegają prawu autorskiemu** — chronione są tylko konkretne implementacje kodu. Czytamy więc Astrolog/Morinus/dokumentację Swiss Ephemeris, by **zrozumieć metodę**, a piszemy **własny** kod permisywny.
**Rola ścieżek B/C (Swiss Ephemeris, Morinus, astro.com):**
1. **Wyrocznia walidacyjna** — nasz silnik porównujemy liczbowo (do łuku sekundy) z SE/astro.com. Użycie pyswisseph **w samych testach/CI** (nie dystrybuowane, nie wystawiane użytkownikom przez sieć) **nie uruchamia obowiązków AGPL** — to legalne i bardzo przydatne.
2. **Dane referencyjne** — tabele kontrolne (np. dla profekcji, primary directions) do testów regresyjnych.
3. **Porównanie funkcjonalne** — które warianty technik liczy „konkurencja".
Skala złożoności (implementacja od zera): **Trywialna · Niska · Średnia · Wysoka · Bardzo wysoka (XL)**.
---
## 1. Macierz zbiorcza
| ID | Wymaganie | Gotowe permisywne (ścieżka A) | Złożoność od zera | Rola B/C |
|----|-----------|-------------------------------|-------------------|----------|
| LOG01 | Pozycje obiektów | **Skyfield** (komplet) | Niska | walidacja pozycji |
| LOG02 | Taksonomia obiektów | Skyfield (planety, Księżyc), Hipparcos (gwiazdy) | **Wysoka** (true Node/Lilith, gwiazdy) | walidacja węzłów/Lilith |
| LOG03 | Kierunek i stacje | Skyfield (find_discrete) | Średnia | walidacja dat stacji |
| LOG04 | Systemy zodiaku / ayanamsy | Skyfield (tropikalny, RA), pyerfa (precesja) | Średnia | walidacja ayanams |
| LOG05 | Systemy domów (wiele) | pyerfa (LST, obliquity); reszta własna | **Wysoka** | walidacja cusps (kluczowa) |
| LOG06 | Aspekty + orby | własne (czysta matematyka) | Niska | walidacja list aspektów |
| LOG07 | Aspekty pozazodiakalne | Skyfield (deklinacja) | Niska | walidacja |
| LOG08 | Lots | własne (arytmetyka + DSL formuł) | Niska–Średnia | porównanie wartości |
| LOG09 | **Primary Directions** | brak permisywnego | **Bardzo wysoka (XL)** | **krytyczna** (Morinus) |
| LOG10 | Profekcje | własne (arytmetyka + tabele władców) | Niska–Średnia | tabela kontrolna |
| LOG11 | Zod. Releasing / Firdaria / Decennials | brak permisywnego | Średnia (tabledriven) | walidacja sekwencji |
| LOG12 | Returns (Solar/Lunar) | Skyfield (rootfinding) | Niska–Średnia | walidacja czasu powrotu |
| LOG13 | Ascensional Times | pyerfa/własne (oblique ascension) | Średnia | tabela kontrolna |
| LOG14 | Zbiorcza tabela dat | własne (orkiestracja) | Średnia | — |
| LOG15 | **Parser sygnifikatorów** | Lark/pyparsing (infrastruktura) | **Wysoka** (unikalne IP) | brak referencji |
| LOG16 | Precompute „atomów" | własne | Średnia | — |
| LOG17 | Interpretacja „asp"/„asp±" | własne (config + LOG06) | Niska–Średnia | — |
| LOG18 | Warstwy 1A/1B | własne (orkiestracja ↔ warstwa danych) | Średnia | — |
| LOG19 | Wypis interpretacji 2B | własne (↔ DataProvider) | Średnia | — |
| LOG20 | Kolumny sygnif. + „no of hits" | własne | Niska–Średnia | — |
| LOG21 | Scoring siły efektu | własne (rule/datadriven) | Średnia | — |
| LOG22 | Konwersja tekst ↔ symbol | własne (tablice z notes3) | Niska | — |
| LOG23 | Pozostałe wyliczenia | Skyfield (zdarzenia) | Niska | walidacja |
| LOG24 | Abstrakcja silnika efemeryd | architektura | Niska | — |
**Tylko 3 pozycje są naprawdę trudne:** LOG09 (primary directions, XL), LOG05 (pełny zestaw domów, Wysoka), LOG15 (parser — Wysoka, ale to nasze unikalne IP, więc gotowca i tak nie ma). Reszta jest Niska/Średnia, w dużej części pokryta przez Skyfield.
---
## 2. Rozwinięcia pogrupowane
### Grupa A — Fundament astronomiczny (LOG01, 02, 03, 24)
**LOG01 · Pozycje obiektów.**
*Rozwinięcie:* długość i szerokość ekliptyczna (ofdate), prędkość (różniczkowanie pozycji), kierunek; formaty: DMS w znaku (Tau 28°12'57''), absolutne 0360°, dziesiętne. *Ścieżka A:* Skyfield daje to wprost (`ecliptic_latlon`, prędkość z dwóch chwil). Formatowanie/podział na znaki = trywialne. *Złożoność: Niska.* *B/C:* porównać długości z astro.com do ~0,1″.
**LOG02 · Taksonomia obiektów.**
*Rozwinięcie:* światła+planety (Skyfield 🟢), planety nowożytne (🟢), gwiazdy stałe (precesja+ruch własny — Hipparcos w Skyfield, 🟢 średnia), obiekty wirtualne:
- **Węzły księżycowe** — *mean* (wzór analityczny, Niska) i *true/osculating* (z wektora stanu Księżyca → elementy oskulacyjne → węzeł wstępujący; **ŚredniaWysoka**).
- **Lilith (Black Moon = apogeum Księżyca)** — *mean* (Niska–Średnia) i *true* (oskulacyjne apogeum; **Wysoka** — tu implementacje notorycznie się różnią, walidacja względem SE obowiązkowa).
- **Osie (Asc/MC → Dsc/IC)** — patrz LOG05.
*Złożoność całości: Wysoka* (przez gwiazdy + true Node/Lilith; reszta Niska). *B/C:* SE jako wzorzec dla true Node/Lilith (różne definicje!).
**LOG03 · Kierunek i stacje.**
*Rozwinięcie:* znak prędkości → D/Rx; stacja = przejście prędkości przez 0 (SD vs SR z przyspieszenia); „dni od stacji ścisłej" + flaga <7 dni; „stacja umowna" jako konfigurowalny próg % ruchu typowego. *Ścieżka A:* Skyfield `find_discrete`/`find_maxima` znajduje momenty stacji; średnie prędkości precompute. *Złożoność: Średnia.* *B/C:* daty stacji z SE.
**LOG24 · Abstrakcja silnika.**
*Rozwinięcie:* interfejs `EphemerisEngine` z implementacjami `SkyfieldEngine` (główna, MIT+JPL), `MoshierEngine` (fallback w pełni publicdomain, bez plików danych) oraz — opcjonalnie po decyzji — `SwissEphCommercialEngine`. *Złożoność: Niska* (architektura, analogicznie do `DataProvider`). To wymaganie **spina ścieżki A/B** bez przepisywania logiki.
### Grupa B — Układy odniesienia (LOG04, 05)
**LOG04 · Systemy zodiaku / ayanamsy.**
*Rozwinięcie:* tropikalny (domyślny, 🟢), syderyczny = tropikalny ayanamsa(t) (Lahiri, FaganBradley… ~40 w SE; my zaczynamy od kilku + tabela rozszerzalna), draconic = tropikalny długość NN (🟢 po LOG02), RA (Skyfield daje wprost). *Ścieżka A:* precesja z pyerfa; ayanamsy to znane stałe odniesienia + tempo precesji. *Złożoność: Średnia* (głównie tabela ayanams). *B/C:* wartości ayanams z SE.
**LOG05 · Systemy domów (wiele, równolegle).** ⚠️ najcięższa matematyka astronomiczna.
*Rozwinięcie:*
- Whole Sign / Equal (Asc/MC) / Porphyry → **Niska** (trywialne podziały).
- Placidus, Koch, Regiomontanus, Campanus, Topocentric, Alcabitus, Meridian, Morinus, Vehlow → znane wzory trygonometrii sferycznej, każdy **Średnia**, w komplecie **Wysoka** (przypadki brzegowe na wysokich szerokościach — Placidus/Koch nieokreślone za kołem podbiegunowym).
*Ścieżka A:* Asc/MC z LST (pyerfa) + obliquity + szerokość geo (standardowe wzory). `libephemeris` (AGPL) dowodzi, że pełny zestaw 25 systemów **da się** policzyć na Skyfieldzie — czytamy go jako dowód wykonalności, ale piszemy własny kod. *Złożoność: Wysoka.* *B/C:* **walidacja cusps krytyczna** — tu kryją się błędy, szczególnie na dużych szerokościach.
### Grupa C — Aspekty (LOG06, 07)
**LOG06 · Aspekty + orby.**
*Rozwinięcie:* separacja kątowa vs kąt aspektu ± orb; aplikacja/separacja z różnicy prędkości; schematy orbów (domyślne, bonus dla luminarzy, fixed, ±%, perplaneta/szkoła); aspekt „przez znak" vs „przez stopień"; major/minor/harmonic. *Ścieżka A:* czysta matematyka na policzonych długościach — **żadna biblioteka nie jest potrzebna**. *Złożoność: Niska–Średnia* (szerokość konfiguracji, nie trudność algorytmu). *B/C:* listy aspektów z astro.com do testów.
**LOG07 · Aspekty pozazodiakalne.**
*Rozwinięcie:* parallel/contraparallel (po deklinacji — Skyfield 🟢), antiscia/contraantiscia (lustro względem osi przesileń — arytmetyka). *Złożoność: Niska.*
### Grupa D — Lots (LOG08)
**LOG08 · Lots.**
*Rozwinięcie:* silnik formuł `Lot = C + A B` z odwracaniem dzień/noc (sekta); By Degree (domyślnie) i By Sign; 7 Hermetic Lots; cały znak działa jak Lot. *Ścieżka A:* mały DSL/parser formuł + ewaluacja na policzonych pozycjach. *Złożoność: Niska–Średnia* (logika sekty prosta; trudność tkwi w **tożsamości/wariantach** Lots — to kuracja danych, nie obliczenia; patrz Q03). *B/C:* porównanie wartości stopni.
### Grupa E — Techniki predykcyjne (LOG09…14)
**LOG09 · Primary Directions.** ⚠️ **najtrudniejsze (XL).**
*Rozwinięcie:* łuk dyrekcji (semiarc/Placidean, Regiomontanus, …) między sygnifikatorem a promisorem w ruchu dobowym; klucz łuk→czas (Ptolemeusz/Naibod/Cardan/Solar arc); direct/converse; mundo/zodiacal; z szerokością/bez. ~160 wariantów — robimy 58 (Q02), framework rozszerzalny. *Ścieżka A:* brak gotowca permisywnego — **w całości własna trygonometria sferyczna** + obsługa wariantów. *Złożoność: Bardzo wysoka.* *B/C:* **Morinus (GPL) słynie z dokładnych primary directions** — kluczowa wyrocznia; uwaga: nawet komercyjne programy różnią się w wariantach (do udokumentowania, który wariant odwzorowujemy).
**LOG10 · Profekcje.**
*Rozwinięcie:* annual (Asc +1 znak/rok, mod 12), monthly/daily, continuous (klucz, domyślnie 30°/rok), Lord of Year, Lord of Orb (kolejność chaldejska, mod 84/12). *Ścieżka A:* arytmetyka dat + tabele władców domicilnych — **bez bibliotek**. *Złożoność: Niska* (annual) * Średnia* (continuous + Lord of Orb). *B/C:* tabela kontrolna (jak ta w notes3).
**LOG11 · Zodiacal Releasing / Firdaria / Decennials.**
*Rozwinięcie:* deterministyczne sekwencje okresów z tabel hellenistycznych/perskich (ZR: długości okresów Valensa + „loosing of the bond"; Firdaria: stałe sekwencje diurnal/nocturnal z podokresami; Decennials: kolejność planetarna). *Ścieżka A:* logika sekwencjonowania na tabelach — algorytmy publiczne, niepodlegające prawu autorskiemu. *Złożoność: Średnia.* *B/C:* walidacja sekwencji z SE/Astrolog.
**LOG12 · Returns (Solar/Lunar).**
*Rozwinięcie:* rootfinding momentu powrotu Słońca/Księżyca do długości natalnej; 2 warianty (osobny horoskop vs tranzyt do natalu); monthly revolutions (Słońce + n×30°). *Ścieżka A:* Skyfield znajduje moment (🟢), reszta = ponowne użycie LOG01…06. *Złożoność: Niska–Średnia.* *B/C:* czas powrotu z astro.com.
**LOG13 · Ascensional Times.**
*Rozwinięcie:* oblique ascension znaków wg szerokości (różnica ascensjonalna z RA) → lata życia; sumy i ułamki dla dodatkowych dat. Częściowo datadriven (tabela DAN07). *Ścieżka A:* wzory powiązane z LOG05 (trygonometria sferyczna) + pyerfa. *Złożoność: Średnia.*
**LOG14 · Zbiorcza tabela dat z technik.**
*Rozwinięcie:* uruchom wszystkie techniki w zakresie czasu → jedna datowana tabela (`technique | significator | start | exact | end`), sortowanie, deduplikacja, daty dokładne (wspólny rootfinding z LOG12). *Ścieżka A:* orkiestracja/glue. *Złożoność: Średnia.*
### Grupa F — Parser sygnifikatorów i dopasowanie (LOG15…20) — **rdzeń unikalnego IP**
**LOG15 · Parser składni „Significator".** ⚠️ **Wysoka — i tak nie ma gotowca.**
*Rozwinięcie:* gramatyka skrótów (obiekty, znaki, żywioły, jakości, domy, aspekty+cel, retro/combust/waxing/heliacal, opcje A/B, warunki, „rAsc", whole sign+orb); 7 poziomów złożoności — od poziomu „obiekt" po sygnifikatory opisowe/niejasne (poziomy 57 mogą wymagać fallbacku człowiek/AI). *Ścieżka A:* tokenizer + gramatyka PEG (Lark, MIT) + słownik SIGNIFICATORS KEY (warstwa danych) jako mapa znaczeń tokenów. *Złożoność: Wysoka* — tu idzie najwięcej oryginalnej inżynierii; to **wartość intelektualna projektu**. *B/C:* brak — nie istnieje zewnętrzny parser tej składni.
**LOG16 · Precompute „atomów" obecnych w horoskopie.**
*Rozwinięcie:* wygeneruj zbiór wszystkich cząstek prawdziwych dla danego horoskopu (Ma Ari, Ma fire, Ma h2, Ma opp Sa, rAsc Ari…); dopasowanie rekordu bazy = przynależność do zbioru. Zależy od LOG01…08 (policzony horoskop) + LOG15 (słownik). *Złożoność: Średnia* (generacja kombinatoryczna + indeks; wrażliwe wydajnościowo — łączy się z DAN22).
**LOG17 · Interpretacja „asp"/„asp+"/„asp"/„asp malefic".**
*Rozwinięcie:* rozwinięcie wg konfigurowalnej tabeli pomocniczej (jakie aspekty, orby, active) + LOG06. *Złożoność: Niska–Średnia.*
**LOG18/19/20 · Dopasowanie i wypis.**
*Rozwinięcie:* silnik dopasowania: atomy → zapytanie do **warstwy danych (nasz DataProvider!)** → złożenie outputu: 1A (natal, unikalny), 1B (predykcyjne z datami), 2B (wypis interpretacji tylko dla obecnych rekordów), 2 kolumny sygnifikatora (z bazy / asisinchart), „no of hits" (1/2/3/…/?/2+?). To **styk warstwy logicznej z danych** — pasuje do istniejącej architektury. *Złożoność: Średnia.*
### Grupa G — Scoring, symbole, pozostałe (LOG21, 22, 23)
**LOG21 · Scoring siły efektu.**
*Rozwinięcie:* punktacja wg tabel relacyjnych (np. „no air" poziomy */**/***), punkty za domniemaną prawdziwość w syntezie; logika indywidualna (nie zawsze rzadkość = siła). *Ścieżka A:* silnik reguł na danych (tabele relacyjne — warstwa danych). *Złożoność: Średnia*, otwarte (autor przygotuje punktację indywidualnie).
**LOG22 · Konwersja tekst ↔ symbol.**
*Rozwinięcie:* dwukierunkowe mapowanie z tablic Unicode (kompletne w notes3); przechowywanie tekstem, wyświetlanie symbolami; tylko „text" Unicode, nigdy emoji; ℞ dla retro. *Złożoność: Niska* (tablice lookup). Ligatury vs 2 kolumny — patrz Q05 (prezentacja).
**LOG23 · Pozostałe wyliczenia.**
*Rozwinięcie:* tally żywiołów/jakości (trywialne), planetary day & hours (wschód/zachód ze Skyfielda + podział na 12 godzin dnia/nocy + władcy chaldejscy), stopnie krytyczne/wrażliwe (lookup), faza Księżyca (elongacja SuMo), syzygia prenatalna (rootfind ostatniej pełni/nowiu przed urodzeniem), divisional (12th/9th parts — arytmetyka). *Ścieżka A:* Skyfield obsługuje zdarzenia astronomiczne. *Złożoność: Niska* (lokalnie Niska–Średnia).
---
## 3. Proponowana kolejność budowy (fazy)
1. **Fundament (MVP silnika):** LOG24 (interfejs) → LOG01 → LOG02 (bez gwiazd/trueLilith) → LOG04 (tropikalny+RA) → LOG06/07 → LOG05 (Whole/Equal/Porphyry+Placidus) → LOG23 (podstawy). *Tu Skyfield daje ogromny skok.*
2. **Astrologia rdzenia:** LOG08 (Lots) → LOG15 (parser) → LOG16 → LOG18/19/20 (dopasowanie ↔ warstwa danych). *Tu powstaje unikalna wartość i pełny przepływ „horoskop → interpretacje".*
3. **Predykcja prosta:** LOG10 (profekcje) → LOG12 (returns) → LOG14 (agregacja) → LOG11 (timelordy) → LOG13.
4. **Predykcja trudna i dopieszczenie:** LOG09 (primary directions, XL) → LOG02 dokończenie (gwiazdy, true Node/Lilith) → LOG04 (ayanamsy) → LOG21 (scoring) → LOG05 (pełny zestaw domów).
Logika: najpierw to, co Skyfield daje tanio i co odblokowuje przepływ endtoend; najtrudniejsze (primary directions, pełne domy) na koniec, gdy mamy już solidną wyrocznię walidacyjną.
---
## 4. Stos technologiczny (permisywny) i walidacja
**Produkcyjne (ścieżka A):** Skyfield (MIT), pyerfa (BSD), dane JPL DE440 (PD) lub Moshier (PD), Lark (MIT), numpy/pandas (BSD). Zero copyleft → produkt może być zamknięty i hostowany.
**Tylko dev/test (B/C jako wyrocznia — NIE w produkcie, NIE wystawiane przez sieć):** pyswisseph (AGPL) i Morinus (GPL) do porównań liczbowych w testach regresyjnych. To legalne, bo nie dystrybuujemy ich i nie udostępniamy użytkownikom — AGPL/GPL nie zostają uruchomione.
**Wymaganie pochodne (do dopisania w arkuszu):** **LOG25 — harness walidacyjny**: zestaw testów porównujących nasz silnik z SE/astro.com/Morinus na bazie znanych horoskopów (np. przykład z notes3: 30.04.1984, Warszawa), z progami tolerancji per wielkość. To nasza polisa ubezpieczeniowa przy budowie od zera.
---
## 5. Wniosek
Ścieżka A jest **w pełni wykonalna**. Skyfield + pyerfa + JPL/Moshier zdejmują z nas całą trudną astronomię (pozycje, zdarzenia, czas gwiazdowy, precesja). Realny ciężar własnej implementacji to **trzy obszary**: primary directions (XL), pełny zestaw domów (Wysoka) i parser sygnifikatorów (Wysoka — ale unikalny, gotowca i tak nie ma). Wszystkie pozostałe wymagania są Niskie/Średnie. Narzędzia AGPL/komercyjne zostają jako **wyrocznia walidacyjna i dane referencyjne** — używane legalnie poza produktem.