From 7bda39ab4627bfe236efb52f18551cc31a094a4d Mon Sep 17 00:00:00 2001 From: migatu Date: Fri, 26 Jun 2026 18:18:46 +0200 Subject: [PATCH 1/2] =?UTF-8?q?Dodaj=20arkusz=20wymaga=C5=84=20projektu=20?= =?UTF-8?q?(model=20tr=C3=B3jwarstwowy)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit docs/astrololo_wymagania.xlsx — spójna lista wymagań zsyntetyzowana z dokumentów astroparser_notes2, astroparser notes3 i astro19 version2026. Sześć arkuszy: Przegląd, Warstwa danych (24), Warstwa logiczna (24), Warstwa prezentacji (13), Pytania otwarte (11), Słownik (25). Każde wymaganie: ID, kategoria, opis, szczegóły, priorytet (MoSCoW), status, źródło. Dokument roboczy do iteracyjnego przeglądu przed implementacją. Co-Authored-By: Claude Opus 4.8 --- docs/astrololo_wymagania.xlsx | Bin 0 -> 21118 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/astrololo_wymagania.xlsx diff --git a/docs/astrololo_wymagania.xlsx b/docs/astrololo_wymagania.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..1254b54427f298765b685a19e45846b44c7b00c4 GIT binary patch literal 21118 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 EFLRkdRsaA1 literal 0 HcmV?d00001 From 3655b39acf6dee6a8f47275fde3f068fd7105cc4 Mon Sep 17 00:00:00 2001 From: migatu Date: Sat, 27 Jun 2026 12:31:37 +0200 Subject: [PATCH 2/2] =?UTF-8?q?Rozszerz=20analiz=C4=99=20warstwy=20logiczn?= =?UTF-8?q?ej:=20gotowce,=20licencje,=20z=C5=82o=C5=BCono=C5=9B=C4=87=20+?= =?UTF-8?q?=20LOG-25?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- docs/astrololo_wymagania.xlsx | Bin 21118 -> 22769 bytes docs/przeglad-bibliotek-i-licencji.md | 110 ++++++++++++++++ docs/warstwa-logiczna-analiza.md | 174 ++++++++++++++++++++++++++ 3 files changed, 284 insertions(+) create mode 100644 docs/przeglad-bibliotek-i-licencji.md create mode 100644 docs/warstwa-logiczna-analiza.md diff --git a/docs/astrololo_wymagania.xlsx b/docs/astrololo_wymagania.xlsx index 1254b54427f298765b685a19e45846b44c7b00c4..9e6073fedc91c3538d38847fda81fc913de23d0a 100644 GIT binary patch delta 9129 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 MeS ⚠️ **Najważniejszy wniosek (TL;DR).** Branżowy standard obliczeń — **Swiss Ephemeris** — oraz **wszystkie** popularne biblioteki astrologiczne, które na nim bazują (pyswisseph, kerykeion, immanuel, flatlib, swisseph-wasm), są objęte licencją **AGPL‑3.0 albo płatną licencją komercyjną**. AGPL wymusza udostępnienie **całego kodu źródłowego aplikacji** — i to także wtedy, gdy aplikacja jest tylko udostępniana przez sieć (SaaS / API / hosting online, o którym mowa w notatkach). Dla produktu zamkniętego z unikalnymi bazami kolaboratora oznacza to albo (a) zakup licencji komercyjnej Swiss Ephemeris, albo (b) zbudowanie warstwy obliczeń na permisywnym fundamencie (Skyfield MIT + dane NASA JPL = public domain) i samodzielną implementację części astrologicznej. Szczegóły i rekomendacja: sekcja 6. + +Legenda ryzyka: 🟢 permisywne (MIT/BSD/PD) · 🟡 wymaga uwagi/atrybucji · 🔴 copyleft/AGPL — ryzykowne dla produktu zamkniętego. + +--- + +## 1. Silniki efemeryd / obliczenia astronomiczne (fundament warstwy logicznej) + +| Rozwiązanie | Co robi | Licencja | Komentarz / ryzyko | +|---|---|---|---| +| **Swiss Ephemeris** (C, Astrodienst — `aloistr/swisseph`) | De‑facto standard: pozycje obiektów, domy, aspekty, gwiazdy stałe, lots — pełna astrologia, najwyższa dokładność | **Dual: AGPL‑3.0 LUB komercyjna** (CHF 750 za pierwszą licencję + CHF 400 za każdą kolejną; ważna 99 lat) | 🔴 AGPL: użycie w usłudze sieciowej = obowiązek otwarcia całego kodu. Licencja komercyjna zdejmuje copyleft z **silnika**, ale wrappery językowe (poniżej) mają **własne** licencje — trzeba je sprawdzić osobno. Decyzję trzeba podjąć **przed** dystrybucją/uruchomieniem usługi. | +| **pyswisseph** (`astrorigin/pyswisseph`) | Wrapper Pythona do Swiss Ephemeris | **AGPL‑3.0** | 🔴 To prawdopodobnie „kalkulator z GitHuba", o którym wiesz. Sam wrapper jest AGPL niezależnie od licencji silnika. | +| **swisseph‑wasm** (`prolaxu/swisseph-wasm`) | Swiss Ephemeris skompilowany do WebAssembly (JS) | dziedziczy po Swiss Ephemeris (**AGPL/komercyjna**) | 🔴 Ta sama pułapka AGPL, tyle że w przeglądarce. | +| **Skyfield** (`skyfielders/python-skyfield`) | Czysto astronomiczne pozycje planet (research‑grade), oparte o dane NASA JPL | **MIT** | 🟢 Permisywne, idealne dla produktu zamkniętego. **ALE**: tylko astronomia — **nie liczy domów, aspektów, lots ani technik**. Warstwę astrologiczną trzeba dopisać samemu. | +| **Dane NASA JPL DE440 / DE441** | Współrzędne efemeryd (Chebyshev), źródło dla Skyfielda | Dane rządu USA — **faktycznie public domain**, swobodnie dystrybuowane | 🟢 Permisywny fundament danych. DE440: lata 1550–2650; DE441: −13200 do +17191. | +| **Moshier ephemeris** (Steve Moshier, `moshier.net`) | Semi‑analityczna teoria, ~0,1″ dokładności, bez plików danych | **Public domain** | 🟢 Wolny od jakichkolwiek zobowiązań. Mniej dokładny niż JPL, ale dla astrologii w zupełności wystarcza. Istnieje też reimplementacja JS (`0xStarcat/Moshier-Ephemeris-JS`, MIT). | +| **Astropy** | Astronomia ogólna (układy współrzędnych, czas) | **BSD‑3** | 🟢 Permisywne; pomocnicze (czas, transformacje), nie astrologia. | + +--- + +## 2. Biblioteki astrologiczne wyższego poziomu (domy, aspekty, lots, techniki) + +| Rozwiązanie | Co robi | Licencja | Komentarz / ryzyko | +|---|---|---|---| +| **kerykeion** (`g-battaglia/kerykeion`) | Nowoczesna, utrzymywana: pozycje, domy, aspekty, wykresy SVG, synastria/tranzyty/composite | **AGPL‑3.0** | 🔴 Wymaga otwarcia projektu. Autor oferuje hostowane **Astrologer API** (REST) — korzystanie z niego **nie** narzuca copyleft na Twój kod (ale to usługa zewnętrzna, płatna, wysyłasz dane na zewnątrz). | +| **immanuel** (`theriftlab/immanuel-python`) | Dane czytelne dla człowieka + JSON, wzorowane na astro.com / Astro Gold; na pyswisseph | **GPL‑3.0+** | 🔴 GPL (sieciowo łagodniejsze niż AGPL, ale wciąż copyleft); ciągnie AGPL‑owy pyswisseph. | +| **flatlib** (`flatangle/flatlib`) | Astrologia tradycyjna (domy, aspekty, godności) | **kod własny: MIT** 🟢, ale **zależy od Swiss Ephemeris** 🔴 | 🟡→🔴 Sam kod flatlib jest permisywny (MIT), lecz obliczenia robi Swiss Ephemeris — więc realnie obowiązuje Cię AGPL/komercyjna SE. Słabo utrzymywane. Dobra **referencja** projektowa. | +| **libephemeris** (`g-battaglia/libephemeris`) | API zgodne z pyswisseph, ale liczy Skyfieldem (NASA); 25 systemów domów, weryfikowane względem pyswisseph | **AGPL‑3.0** | 🔴 Ciekawe technicznie (permisywny fundament: Skyfield+JPL), ale autor wybrał AGPL → i tak copyleft. Można potraktować jako **wzorzec**, jak dołożyć domy do Skyfielda. | + +--- + +## 3. JavaScript / front‑end (jeśli warstwa prezentacji będzie webowa) + +| Rozwiązanie | Co robi | Licencja | Komentarz / ryzyko | +|---|---|---|---| +| **CircularNatalHoroscopeJS** (`0xStarcat/...`) | Liczy natalny wykres (Asc/MC, domy, tropikalny/syderyczny) — **na Moshierze, bez Swiss Ephemeris** | **MIT** | 🟢 Rzadki przypadek: obliczenia astrologiczne bez „skażenia" AGPL. Dobry wzorzec/komponent dla JS. | +| **AstroChart** (`Kibo/AstroChart`) | Renderowanie kosmogramu (SVG) — tylko rysowanie, bez efemeryd | open‑source (zweryfikować plik LICENSE) | 🟡 Brak obliczeń = brak ryzyka efemeryd. Sprawdzić dokładnie licencję przed użyciem. | +| **swisseph‑wasm** | (jak w sekcji 1) | AGPL/komercyjna | 🔴 | + +--- + +## 4. Geolokalizacja i strefy czasowe (dla pola „miejscowość → timezone → Asc/MC") + +Notatki opisują obliczenie strefy czasowej z większej miejscowości, potem przeliczenie dla dokładnej lokalizacji. Przydatne: + +| Rozwiązanie | Co robi | Licencja | Komentarz / ryzyko | +|---|---|---|---| +| **timezonefinder** (`jannikmi/timezonefinder`) | Strefa czasowa z lat/long, offline | **kod: MIT** 🟢 / **dane: ODbL** 🟡 | 🟡 Dane (timezone‑boundary‑builder, ODbL) — przy dystrybucji bazy wymagana atrybucja i klauzula share‑alike **dla samej bazy** (nie dla Twojego kodu). | +| **GeoNames** (baza miejscowości) | Miejscowości + współrzędne + strefy (do dropdowna lokalizacji) | **CC‑BY 4.0** | 🟡 Wolne, ale **wymaga atrybucji** „GeoNames". Idealne do tabeli miejscowości z notatek. | +| **IANA tz database (tzdata)** | Reguły stref i czasu letniego (DST) | **Public domain** | 🟢 W Pythonie przez `zoneinfo` (stdlib) — bez zależności. | + +--- + +## 5. Pełne programy referencyjne (do nauki algorytmów, nie do kopiowania kodu) + +| Program | Licencja | Komentarz / ryzyko | +|---|---|---| +| **Astrolog** (Walter Pullen, `astrolog.org`) | **GPL‑2.0+** (od wersji 6.00) | 🔴 do kopiowania kodu (GPL), ale **bezcenny jako referencja** algorytmów (domy, dyrekcje, techniki). Opcjonalnie używa Swiss Ephemeris. Można czytać i uczyć się metod, nie wklejać kodu do produktu zamkniętego. | +| **Maitreya / Morinus** (open‑source) | GPL (zweryfikować) | 🟡 Jw. — referencja, nie źródło kodu do zamkniętego produktu. | + +--- + +## 6. Strategia licencyjna — trzy ścieżki (z rekomendacją) + +Wybór zależy od jednej decyzji z arkusza wymagań (**Q‑01**: produkt zamknięty/hostowany czy nie) i **Q‑07** (SQL/architektura). Przy założeniu **produktu zamkniętego z prywatnymi bazami** (co wynika z notatek — hosting online, własność kolaboratora): + +**Ścieżka A — permisywna, „zbuduj sam" 🟢 (rekomendowana long‑term)** +Skyfield (MIT) + dane JPL DE440 (public domain) lub Moshier (PD) do pozycji; domy/aspekty/lots/dyrekcje implementujemy sami (wzorując się na Astrologu i libephemeris — czytając, nie kopiując). +- ➕ Pełna swoboda licencyjna, produkt może być zamknięty i hostowany. +- ➖ Najwięcej pracy w warstwie logicznej (ale dokładnie tę warstwę i tak projektujemy modułowo). + +**Ścieżka B — Swiss Ephemeris na licencji komercyjnej 🟡 (najszybsza „pełna dokładność")** +Kupujemy licencję komercyjną SE (CHF 750) i wołamy silnik C bezpośrednio (z cienkim własnym wrapperem, by ominąć AGPL‑owy pyswisseph). +- ➕ Od razu komplet funkcji i najwyższa dokładność; produkt zamknięty OK. +- ➖ Koszt + formalności licencyjne; trzeba uważać, żeby nie wciągnąć AGPL‑owych wrapperów. + +**Ścieżka C — AGPL „na całość" 🔴 (tylko jeśli produkt może być otwarty)** +kerykeion/immanuel/flatlib+pyswisseph — najszybszy development. +- ➕ Gotowiec, mało kodu. +- ➖ Wymusza **otwarcie całej aplikacji** (w tym kodu obsługującego prywatne bazy). Przy hostingu online (AGPL!) praktycznie wykluczone dla tego projektu. + +**Ścieżka D — hostowane API (np. Astrologer API)** jako uzupełnienie: korzystanie z REST nie narzuca copyleft, ale to zależność zewnętrzna, koszt, prywatność danych urodzeniowych i może nie pokrywać egzotycznych technik (firdaria, zodiacal releasing, warianty primary directions). + +> **Rekomendacja:** zarezerwować w architekturze warstwy logicznej **interfejs silnika efemeryd** (jak `DataProvider` w warstwie danych), tak by dało się podmienić backend: `MoshierEngine` / `SkyfieldEngine` (ścieżka A) ↔ `SwissEphCommercialEngine` (ścieżka B). Wtedy decyzję A vs B można podjąć później bez przepisywania logiki. + +--- + +## 7. Osobna kwestia: prawa autorskie do TREŚCI baz (to NIE są licencje software!) + +To dotyczy zawartości baz interpretacji, nie kodu — i jest tu realne ryzyko do rozważenia: + +- **Bazy kolaboratora.** Jeśli to **oryginalna twórczość** współpracownika, to on jest dysponentem praw — potrzebne jasne ustalenie (umowa/licencja) na wykorzystanie ich w produkcie. To załatwia sprawę po stronie tych danych. +- **Źródła z opublikowanych książek.** Przykładowy plik „The Encyclopaedia of Medical Astrology" to **wydana książka** (H. L. Cornell, 1933). Cyfrowy przedruk obszernych opisów interpretacyjnych z chronionego dzieła = **ryzyko naruszenia praw autorskich**, niezależnie od licencji oprogramowania. Status zależy od jurysdykcji i daty (część dawnych dzieł może być już w domenie publicznej — wymaga sprawdzenia per tytuł). +- **Fakt vs. twórczość.** Krótkie formuły sygnifikatorów (np. „Ma Ari = …") to raczej **fakty/metoda** — trudniej objąć je prawem autorskim. Natomiast rozbudowana **proza interpretacyjna** (kolumna Effect) jest chroniona jako utwór. +- **Zalecenie:** dla każdej bazy odnotować **proweniencję** (autor/źródło/status praw) — najlepiej jako kolumnę/metadane w warstwie danych (pasuje do `book-#per-txt`, `author`, `lang` z notatek). Oddzielić materiał: własny kolaboratora / public domain / cytowany za zgodą / wymagający usunięcia. + +--- + +## Źródła +- [Swiss Ephemeris — licencja (astro.com)](https://www.astro.com/swisseph/swephinfo_e.htm) · [LICENSE](https://www.astro.com/ftp/swisseph/LICENSE) · [repo `aloistr/swisseph`](https://github.com/aloistr/swisseph) +- [pyswisseph (`astrorigin/pyswisseph`)](https://github.com/astrorigin/pyswisseph) +- [kerykeion (PyPI)](https://pypi.org/project/kerykeion/) · [immanuel (PyPI)](https://pypi.org/project/immanuel/) · [flatlib LICENSE (MIT)](https://raw.githubusercontent.com/flatangle/flatlib/master/LICENSE) +- [Skyfield (PyPI, MIT)](https://pypi.org/project/skyfield/) · [libephemeris (`g-battaglia/libephemeris`)](https://github.com/g-battaglia/libephemeris) +- [NASA JPL DE440/DE441](https://ssd.jpl.nasa.gov/doc/de440_de441.html) · [Moshier ephemeris](http://www.moshier.net/) · [Moshier‑Ephemeris‑JS](https://github.com/0xStarcat/Moshier-Ephemeris-JS) +- [CircularNatalHoroscopeJS](https://github.com/0xStarcat/CircularNatalHoroscopeJS) · [AstroChart (`Kibo/AstroChart`)](https://github.com/Kibo/AstroChart) · [swisseph‑wasm](https://github.com/prolaxu/swisseph-wasm) +- [timezonefinder (PyPI, MIT)](https://pypi.org/project/timezonefinder/) · [Astrolog (Wikipedia)](https://en.wikipedia.org/wiki/Astrolog) diff --git a/docs/warstwa-logiczna-analiza.md b/docs/warstwa-logiczna-analiza.md new file mode 100644 index 0000000..39c5974 --- /dev/null +++ b/docs/warstwa-logiczna-analiza.md @@ -0,0 +1,174 @@ +# Warstwa logiczna — analiza, rozwinięcie wymagań i przypisanie rozwiązań + +Dokument roboczy. Rozwinięcie 24 wymagań warstwy logicznej (LOG‑01…LOG‑24 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: **~70–80% 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 | +|----|-----------|-------------------------------|-------------------|----------| +| LOG‑01 | Pozycje obiektów | **Skyfield** (komplet) | Niska | walidacja pozycji | +| LOG‑02 | Taksonomia obiektów | Skyfield (planety, Księżyc), Hipparcos (gwiazdy) | **Wysoka** (true Node/Lilith, gwiazdy) | walidacja węzłów/Lilith | +| LOG‑03 | Kierunek i stacje | Skyfield (find_discrete) | Średnia | walidacja dat stacji | +| LOG‑04 | Systemy zodiaku / ayanamsy | Skyfield (tropikalny, RA), pyerfa (precesja) | Średnia | walidacja ayanams | +| LOG‑05 | Systemy domów (wiele) | pyerfa (LST, obliquity); reszta własna | **Wysoka** | walidacja cusps (kluczowa) | +| LOG‑06 | Aspekty + orby | własne (czysta matematyka) | Niska | walidacja list aspektów | +| LOG‑07 | Aspekty pozazodiakalne | Skyfield (deklinacja) | Niska | walidacja | +| LOG‑08 | Lots | własne (arytmetyka + DSL formuł) | Niska–Średnia | porównanie wartości | +| LOG‑09 | **Primary Directions** | brak permisywnego | **Bardzo wysoka (XL)** | **krytyczna** (Morinus) | +| LOG‑10 | Profekcje | własne (arytmetyka + tabele władców) | Niska–Średnia | tabela kontrolna | +| LOG‑11 | Zod. Releasing / Firdaria / Decennials | brak permisywnego | Średnia (table‑driven) | walidacja sekwencji | +| LOG‑12 | Returns (Solar/Lunar) | Skyfield (root‑finding) | Niska–Średnia | walidacja czasu powrotu | +| LOG‑13 | Ascensional Times | pyerfa/własne (oblique ascension) | Średnia | tabela kontrolna | +| LOG‑14 | Zbiorcza tabela dat | własne (orkiestracja) | Średnia | — | +| LOG‑15 | **Parser sygnifikatorów** | Lark/pyparsing (infrastruktura) | **Wysoka** (unikalne IP) | brak referencji | +| LOG‑16 | Precompute „atomów" | własne | Średnia | — | +| LOG‑17 | Interpretacja „asp"/„asp±" | własne (config + LOG‑06) | Niska–Średnia | — | +| LOG‑18 | Warstwy 1A/1B | własne (orkiestracja ↔ warstwa danych) | Średnia | — | +| LOG‑19 | Wypis interpretacji 2B | własne (↔ DataProvider) | Średnia | — | +| LOG‑20 | Kolumny sygnif. + „no of hits" | własne | Niska–Średnia | — | +| LOG‑21 | Scoring siły efektu | własne (rule/data‑driven) | Średnia | — | +| LOG‑22 | Konwersja tekst ↔ symbol | własne (tablice z notes3) | Niska | — | +| LOG‑23 | Pozostałe wyliczenia | Skyfield (zdarzenia) | Niska | walidacja | +| LOG‑24 | Abstrakcja silnika efemeryd | architektura | Niska | — | + +**Tylko 3 pozycje są naprawdę trudne:** LOG‑09 (primary directions, XL), LOG‑05 (pełny zestaw domów, Wysoka), LOG‑15 (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 (LOG‑01, 02, 03, 24) + +**LOG‑01 · Pozycje obiektów.** +*Rozwinięcie:* długość i szerokość ekliptyczna (of‑date), prędkość (różniczkowanie pozycji), kierunek; formaty: DMS w znaku (Tau 28°12'57''), absolutne 0–360°, 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″. + +**LOG‑02 · 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; **Średnia–Wysoka**). +- **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 LOG‑05. +*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!). + +**LOG‑03 · 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. + +**LOG‑24 · Abstrakcja silnika.** +*Rozwinięcie:* interfejs `EphemerisEngine` z implementacjami `SkyfieldEngine` (główna, MIT+JPL), `MoshierEngine` (fallback w pełni public‑domain, 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 (LOG‑04, 05) + +**LOG‑04 · Systemy zodiaku / ayanamsy.** +*Rozwinięcie:* tropikalny (domyślny, 🟢), syderyczny = tropikalny − ayanamsa(t) (Lahiri, Fagan‑Bradley… ~40 w SE; my zaczynamy od kilku + tabela rozszerzalna), draconic = tropikalny − długość NN (🟢 po LOG‑02), 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. + +**LOG‑05 · 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 (LOG‑06, 07) + +**LOG‑06 · 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, ±%, per‑planeta/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. + +**LOG‑07 · Aspekty pozazodiakalne.** +*Rozwinięcie:* parallel/contraparallel (po deklinacji — Skyfield 🟢), antiscia/contra‑antiscia (lustro względem osi przesileń — arytmetyka). *Złożoność: Niska.* + +### Grupa D — Lots (LOG‑08) + +**LOG‑08 · 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 Q‑03). *B/C:* porównanie wartości stopni. + +### Grupa E — Techniki predykcyjne (LOG‑09…14) + +**LOG‑09 · Primary Directions.** ⚠️ **najtrudniejsze (XL).** +*Rozwinięcie:* łuk dyrekcji (semi‑arc/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 5–8 (Q‑02), 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). + +**LOG‑10 · 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). + +**LOG‑11 · 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. + +**LOG‑12 · Returns (Solar/Lunar).** +*Rozwinięcie:* root‑finding 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 LOG‑01…06. *Złożoność: Niska–Średnia.* *B/C:* czas powrotu z astro.com. + +**LOG‑13 · 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 data‑driven (tabela DAN‑07). *Ścieżka A:* wzory powiązane z LOG‑05 (trygonometria sferyczna) + pyerfa. *Złożoność: Średnia.* + +**LOG‑14 · 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 root‑finding z LOG‑12). *Ścieżka A:* orkiestracja/glue. *Złożoność: Średnia.* + +### Grupa F — Parser sygnifikatorów i dopasowanie (LOG‑15…20) — **rdzeń unikalnego IP** + +**LOG‑15 · 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, „r‑Asc", whole sign+orb); 7 poziomów złożoności — od poziomu „obiekt" po sygnifikatory opisowe/niejasne (poziomy 5–7 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. + +**LOG‑16 · 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, r‑Asc Ari…); dopasowanie rekordu bazy = przynależność do zbioru. Zależy od LOG‑01…08 (policzony horoskop) + LOG‑15 (słownik). *Złożoność: Średnia* (generacja kombinatoryczna + indeks; wrażliwe wydajnościowo — łączy się z DAN‑22). + +**LOG‑17 · Interpretacja „asp"/„asp+"/„asp‑"/„asp malefic".** +*Rozwinięcie:* rozwinięcie wg konfigurowalnej tabeli pomocniczej (jakie aspekty, orby, active) + LOG‑06. *Złożoność: Niska–Średnia.* + +**LOG‑18/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 / as‑is‑in‑chart), „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 (LOG‑21, 22, 23) + +**LOG‑21 · 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). + +**LOG‑22 · 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 Q‑05 (prezentacja). + +**LOG‑23 · 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 Su‑Mo), syzygia prenatalna (root‑find 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):** LOG‑24 (interfejs) → LOG‑01 → LOG‑02 (bez gwiazd/true‑Lilith) → LOG‑04 (tropikalny+RA) → LOG‑06/07 → LOG‑05 (Whole/Equal/Porphyry+Placidus) → LOG‑23 (podstawy). *Tu Skyfield daje ogromny skok.* +2. **Astrologia rdzenia:** LOG‑08 (Lots) → LOG‑15 (parser) → LOG‑16 → LOG‑18/19/20 (dopasowanie ↔ warstwa danych). *Tu powstaje unikalna wartość i pełny przepływ „horoskop → interpretacje".* +3. **Predykcja prosta:** LOG‑10 (profekcje) → LOG‑12 (returns) → LOG‑14 (agregacja) → LOG‑11 (time‑lordy) → LOG‑13. +4. **Predykcja trudna i dopieszczenie:** LOG‑09 (primary directions, XL) → LOG‑02 dokończenie (gwiazdy, true Node/Lilith) → LOG‑04 (ayanamsy) → LOG‑21 (scoring) → LOG‑05 (pełny zestaw domów). + +Logika: najpierw to, co Skyfield daje tanio i co odblokowuje przepływ end‑to‑end; 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):** **LOG‑25 — 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.