test: framework porównania domów z wyrocznią + dwa błędy, które od razu wykrył #60

Merged
gitea merged 1 commits from feat/oracle-harness-houses into master 2026-08-04 20:28:48 +00:00
Owner

Etap 0 planu egzotycznych systemów domów. Zanim zaczniemy implementować
Placidusa i spółkę, potrzebujemy narzędzia, które powie, czy wynik jest poprawny —
bo błąd w domach jest cichy: wykres wygląda dobrze, tylko planety siedzą
w złych domach.

Framework (tests/oracle)

Liczenie cuspów jako funkcja (RAMC, ε, φ), Swiss Ephemeris jako wyrocznia.
Trzy decyzje, które okazały się kluczowe:

  • Izolacja jednostki — obu implementacjom podajemy te same wejścia przez
    swe_houses_armc. Porównywanie „naszego horoskopu" z „horoskopem swissepha"
    mieszałoby różnice czasu gwiazdowego i ε z błędami domów; utonęlibyśmy
    w fałszywych alarmach. Czas gwiazdowy i ε mają własny test.
  • Kryterium, nie procent — liczba przypadków powyżej tolerancji (1″), max
    odchylenie i miejsce, histogram. „97% zgodności" nie odróżnia szumu
    zmiennoprzecinkowego od rogu dziedziny, w którym mylimy się o 30°.
  • Granice per data — koło podbiegunowe nie jest stałą 66,56°: zależy od ε,
    które zmienia się z datą (23,75° w 370 p.n.e.), więc przesuwa się o ~0,3°.

🔴 Co znalazł w pierwszym przebiegu — na kodzie uchodzącym za poprawny

1. Ascendent o 180° za kołem podbiegunowym. atan2 wybierał niewłaściwy punkt
przecięcia ekliptyki z horyzontem — zwracaliśmy Descendent. Planety lądowały
w przeciwnych domach dla całej północnej Skandynawii (Tromsø, Rovaniemi,
Murmańsk), na ~11% przypadków przy tych szerokościach. Rozstrzyga położenie
względem MC: punkt wschodzący leży w półkolu (0°,180°) na wschód od MC.

2. Niedeterminizm whole sign na granicy znaku. Ascendent o włos od granicy
(359,999999999976 vs 1e-10 — ta sama wartość, różne strony) przerzucał dom I
o 30°. Ten sam horoskop na innej maszynie dawał inny wynik. Przyciąganie do
granicy przy 1e-9° (3,6 mikrosekundy łuku — poniżej realnej dokładności danych).

Oba mają testy regresji w zwykłej suicie, więc są łapane też bez swissepha.

Wynik po poprawkach

Tryb Porównań > tolerancji Max odchylenie
build (brzegi + wnętrze) 7 980 0 0.000000000°
sweep 20 000 przypadków 760 000 0 0.000000000°

Istniejące suity bez regresji: logika 277 (+3), prezentacja 249.

CI

Krok blokujący w jobie swisseph-image, odpalany wewnątrz obrazu silnika B
z zamontowaną warstwą logiczną — bez klastra, bez HTTP. pyswisseph zostaje
wyłącznie wyrocznią testową: nie wchodzi do zależności produktu, izolacja
z LOG-27 nienaruszona (sprawdzone).

Dodane cusps_for(ramc, eps, lat, system) — kanoniczne wejście, w które Etap 1
będzie tylko dopisywał kolejne systemy.

**Etap 0** planu egzotycznych systemów domów. Zanim zaczniemy implementować Placidusa i spółkę, potrzebujemy narzędzia, które powie, czy wynik jest poprawny — bo błąd w domach jest **cichy**: wykres wygląda dobrze, tylko planety siedzą w złych domach. ## Framework (`tests/oracle`) Liczenie cuspów jako **funkcja** `(RAMC, ε, φ)`, Swiss Ephemeris jako **wyrocznia**. Trzy decyzje, które okazały się kluczowe: - **Izolacja jednostki** — obu implementacjom podajemy **te same wejścia** przez `swe_houses_armc`. Porównywanie „naszego horoskopu" z „horoskopem swissepha" mieszałoby różnice czasu gwiazdowego i ε z błędami domów; utonęlibyśmy w fałszywych alarmach. Czas gwiazdowy i ε mają **własny** test. - **Kryterium, nie procent** — liczba przypadków powyżej tolerancji (1″), max odchylenie **i miejsce**, histogram. „97% zgodności" nie odróżnia szumu zmiennoprzecinkowego od rogu dziedziny, w którym mylimy się o 30°. - **Granice per data** — koło podbiegunowe **nie jest stałą 66,56°**: zależy od ε, które zmienia się z datą (23,75° w 370 p.n.e.), więc przesuwa się o ~0,3°. ## 🔴 Co znalazł w pierwszym przebiegu — na kodzie uchodzącym za poprawny **1. Ascendent o 180° za kołem podbiegunowym.** `atan2` wybierał niewłaściwy punkt przecięcia ekliptyki z horyzontem — zwracaliśmy **Descendent**. Planety lądowały w **przeciwnych domach** dla całej północnej Skandynawii (Tromsø, Rovaniemi, Murmańsk), na **~11%** przypadków przy tych szerokościach. Rozstrzyga położenie względem MC: punkt wschodzący leży w półkolu (0°,180°) na wschód od MC. **2. Niedeterminizm whole sign na granicy znaku.** Ascendent o włos od granicy (`359,999999999976` vs `1e-10` — ta sama wartość, różne strony) przerzucał dom I o **30°**. Ten sam horoskop **na innej maszynie dawał inny wynik**. Przyciąganie do granicy przy 1e-9° (3,6 mikrosekundy łuku — poniżej realnej dokładności danych). Oba mają **testy regresji w zwykłej suicie**, więc są łapane też bez swissepha. ## Wynik po poprawkach | Tryb | Porównań | > tolerancji | Max odchylenie | |---|---|---|---| | build (brzegi + wnętrze) | 7 980 | **0** | **0.000000000°** | | sweep 20 000 przypadków | **760 000** | **0** | **0.000000000°** | Istniejące suity bez regresji: logika **277 (+3)**, prezentacja **249**. ## CI Krok **blokujący** w jobie `swisseph-image`, odpalany **wewnątrz obrazu silnika B** z zamontowaną warstwą logiczną — bez klastra, bez HTTP. `pyswisseph` zostaje **wyłącznie wyrocznią testową**: nie wchodzi do zależności produktu, izolacja z LOG-27 nienaruszona (sprawdzone). Dodane `cusps_for(ramc, eps, lat, system)` — kanoniczne wejście, w które **Etap 1** będzie tylko dopisywał kolejne systemy.
gitea added 1 commit 2026-08-04 16:03:37 +00:00
test: framework porównania domów z wyrocznią + DWA błędy, które od razu wykrył
Testy / Testy warstwy logicznej (silnik) (pull_request) Successful in 10m29s
Testy / Testy warstwy prezentacji (dostęp do baz) (pull_request) Successful in 9m28s
Testy / Testy warstwy bazodanowej (ochrona baz) (pull_request) Successful in 9m28s
Testy / Build obrazu silnika B (swisseph) (pull_request) Failing after 14s
Testy / Kontrola składni wszystkich warstw (pull_request) Successful in 8s
build / build (push) Successful in 19s
Testy / Testy warstwy logicznej (silnik) (push) Successful in 10m29s
Testy / Testy warstwy prezentacji (dostęp do baz) (push) Successful in 9m28s
Testy / Testy warstwy bazodanowej (ochrona baz) (push) Successful in 9m29s
Testy / Build obrazu silnika B (swisseph) (push) Failing after 13s
Testy / Kontrola składni wszystkich warstw (push) Successful in 8s
86a0f16f9e
Etap 0 planu egzotycznych systemów domów: zanim zaczniemy implementować Placidusa
i spółkę, potrzebujemy narzędzia, które powie, czy wynik jest poprawny. Błąd
w domach jest CICHY — wykres wygląda dobrze, tylko planety siedzą w złych domach.

FRAMEWORK (tests/oracle): liczenie cuspów jako funkcja (RAMC, ε, φ), Swiss
Ephemeris jako wyrocznia. Trzy decyzje projektowe, które okazały się kluczowe:
- IZOLACJA: obu implementacjom podajemy TE SAME wejścia przez swe_houses_armc.
  Porównywanie „naszego horoskopu" z „horoskopem swissepha" mieszałoby różnice
  czasu gwiazdowego i ε z błędami domów — utonęlibyśmy w fałszywych alarmach.
  Czas gwiazdowy i ε mają własny test.
- KRYTERIUM to liczba przypadków powyżej tolerancji (1″), max odchylenie I MIEJSCE,
  a nie procent zgodności. Procent ukrywa kształt błędu: „97%" nie odróżnia szumu
  zmiennoprzecinkowego od rogu dziedziny, w którym mylimy się o 30°.
- GRANICE PER DATA: koło podbiegunowe nie jest stałą 66,56° — zależy od ε, które
  zmienia się z datą (23,75° w 370 p.n.e.), więc przesuwa się o ~0,3°.

Uruchomiony na kodzie uchodzącym za poprawny, w PIERWSZYM przebiegu znalazł dwa
realne błędy:

1. ASCENDENT O 180° ZA KOŁEM PODBIEGUNOWYM. `atan2` wybierał niewłaściwy punkt
   przecięcia ekliptyki z horyzontem — zwracaliśmy Descendent. Planety lądowały
   w PRZECIWNYCH domach dla całej północnej Skandynawii (Tromsø, Rovaniemi,
   Murmańsk), na ~11% przypadków przy tych szerokościach. Rozstrzyga położenie
   względem MC: punkt wschodzący leży w półkolu (0°,180°) na wschód od MC.
2. NIEDETERMINIZM WHOLE SIGN NA GRANICY ZNAKU. Ascendent o włos od granicy
   (359,999999999976 vs 1e-10 — ta sama wartość, różne strony) przerzucał dom I
   o 30°. Ten sam horoskop na innej maszynie dawał inny wynik. Przyciąganie do
   granicy przy 1e-9° (3,6 mikrosekundy łuku — poniżej realnej dokładności danych).

Oba mają testy regresji w zwykłej suicie, więc są łapane też bez swissepha.

Po poprawkach: build 0 przekroczeń, sweep 20 000 przypadków = 760 000 porównań,
max odchylenie 0.000000000°. Istniejące suity bez regresji (logika 277+3, prez. 249).

CI: krok BLOKUJĄCY w jobie swisseph-image, odpalany wewnątrz obrazu silnika B
z zamontowaną warstwą logiczną. pyswisseph zostaje wyłącznie wyrocznią testową —
nie wchodzi do zależności produktu, izolacja z LOG-27 nienaruszona.

Dodane `cusps_for(ramc, eps, lat, system)` — kanoniczne wejście, w które Etap 1
będzie tylko dopisywał kolejne systemy.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
gitea merged commit 86a0f16f9e into master 2026-08-04 20:28:48 +00:00
gitea deleted branch feat/oracle-harness-houses 2026-08-04 20:28:49 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: gitea/astrololo#60