Files
gitea e69c0714b9 Silnik efemeryd: EngineProvider + SkyfieldEngine + harness porównawczy
Pierwszy increment implementacji warstwy logicznej (ścieżka A).

LOG-24: interfejs EphemerisEngine z dwoma backendami — SkyfieldEngine
  (własny, permisywny: Skyfield MIT + dane JPL public domain) oraz
  RemoteEngine (klient izolowanej usługi swisseph). Fabryka + leniwa
  inicjalizacja; endpointy /chart/positions i /chart/compare.
LOG-01: pozycje obiektów (długość/szerokość ekliptyczna, prędkość,
  kierunek, formaty: w znaku / absolutny / dziesiętny).
LOG-25/28: harness porównawczy (compare.py) z progami tolerancji oraz
  wspólny kontrakt parzystości; pełen zestaw testów.
LOG-27: services/engine-swisseph — osobna, opcjonalna usługa AGPL
  (pyswisseph, tryb Moshiera), licencjonowana osobno, w compose pod
  profilem "comparison"; nie wchodzi do zamkniętego produktu.

Walidacja: SkyfieldEngine zgadza się ze Swiss Ephemeris co do ~1" dla
wszystkich 10 obiektów na horoskopie referencyjnym (30.04.1984, Warszawa);
12 testów przechodzi (silnik B pomijany gdy nieskonfigurowany).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 19:48:31 +02:00
..

engine-swisseph (silnik B — AGPL, izolowany)

Osobna, opcjonalna usługa będąca drugim silnikiem efemeryd (LOG27). Liczy pozycje przez pyswisseph / Swiss Ephemeris i służy jako wyrocznia walidacyjna / tryb porównawczy (LOG25/26) dla naszego silnika własnego.

⚠️ Licencja

Ten komponent jest AGPL3.0 (bo linkuje Swiss Ephemeris) — patrz LICENSE. Jest wydzielony jako osobny proces i wołany przez HTTP, więc nie „zaraża" permisywnej reszty systemu. Nie wchodzi do dystrybucji zamkniętego produktu.

API

  • POST /positions{when_utc, lat, lon, objects?} → pozycje (ten sam kształt co silnik własny)
  • GET /health

Tryb Moshiera (FLG_MOSEPH) — bez plików efemeryd, zero konfiguracji.

Uruchomienie (tylko profil porównawczy / dev / CI)

pip install -r requirements.txt
uvicorn app.main:app --port 8003

Następnie w warstwie logicznej ustaw ENGINE_SWISSEPH_URL=http://localhost:8003, aby włączyć silnik B (tryb dual-run i testy kontraktowe silnika B).