Dokładność to to, czym użytkownik nieświadomie sprawdza Ciebie na Astrodienst. Jeśli naturalna mapa rozprzestrzeniła się na kątową minutę, skarga przyjdzie szybko. I najgorsze w tym, że dokładność łatwo niszczyć nieświadomie: jeden refaktoring w kodzie ephemerid, i połowa endpointów cicho odjechała na sekundy długości.
Oto jak nie pozwalamy temu się stać.
Jedno jądro na dwa środowiska
Dział zatytułowany „Jedno jądro na dwa środowiska”Pozycje planetarne liczy Swiss Ephemeris, skompilowany w WASM. Kluczowe: to samo jądro i w przeglądarce naszego aplikacji, i na serwerze API. Jedna bazę kodu core/, podciągnięta w tylnej części przez cross-repo alias i wkomponowana w pakiet na budowie. Nie ma „przeglądarczej” i „serwerowej” implementacji, które mogą się rozbiec - rozchodzą się niczym.
Dla dat poza głównym zakresie ephemerid jest fallback analityczny (Moshier), trochę grubiejszy, ale bez przerwań na granicach. Świadoma szczerość: konkretną wersję silnika nie deklarujemy publicznie, bo rzeczywista wersja jądra jest niższa niż najnowszy upstream, i pisać głośną cyfrą byłoby kłamstwem.
Zamrożone snyapshoty
Dział zatytułowany „Zamrożone snyapshoty”Każdy obliczeniowy endpoint ma zestaw zamrożonych snyapshotów - 873 JSON-fikstur w momencie tego buildu. Ranner uruchamia endpoint na kartach etalonowych i pobajtowo (w granicach tolerancji) porównuje z fiktura. Cokolwiek odchylenie pozycji planetarnej większe niż 5e-5° (0,18”) wywaluje test.
Karty etalonowe wybrane tak, aby bijały na krawędziach, a nie tylko na „przyjaznym” centrum:
- Monroe, Diana, Einstein, Bowie - historyczne karty z znanymi danymi urodzenia
- północna szerokość - gdzie systemy domów wyrastają
- ekwatorialna - gdzie się zachowują inaczej
- południowa półkula - sprawdzanie odbicia
Przypadki graniczne łapią właśnie te regresje, które nie są widoczne na mapie kłamczego chłopa.
Trójkątna przeciwko zewnętrznym źródłom
Dział zatytułowany „Trójkątna przeciwko zewnętrznym źródłom”Snyapshoty łapią regresje w stosunku do samego siebie. Aby sprawdzić absolutną prawdę, każdy rys zawiązuje się z niezależnymi źródłami:
| Przeciwko czemu | Co sprawdza | Rozchodzenia |
|---|---|---|
| swetest CGI (Astrodienst) | pozycje planetarne, kuśpidy domów | 0.000" |
| Kerykeion (Python, pyswisseph) | niezależna implementacja SwEph | < 0,2" |
| Prokerala (sidereal Lahiri) | pozycje siedzące | 8-17", systemowa różnica formuły Ayanamsha, nie silnik |
| NASA 5-Millennium Eclipse Catalog | czas i typ zacienień | < 1 min |
Rozchodzenia z Prokerala - nie jest to błąd: to różne implementacje formuły Lahiri, i dokumentujemy to otwarcie, a nie ukrywamy. Z swetest, który jest etalonem branży, drętw nulowy.
Astronomiczne linie mapy są osobno sprawdzane geometrycznie - dokładność na ekwatorze lepsza niż 1,5 km.
Co goni się na każdym PR
Dział zatytułowany „Co goni się na każdym PR”Dokładność to CI-gate, a nie jednorazowa sprawdzenie:
api-accuracy.yml- na każdym PR w kodzie tylnej części uruchamia się cały zestaw snyapshotów + trójkątna. Czerwony test blokuje merge.check-eclipse-accuracy.yml- raz na rok sprawdza zacienienia z katalogiem NASA; rozchodzenia powyżej progu automatycznie uruchamia issue.check-sweph-updates.yml- co tydzień sprawdza upstream Swiss Ephemeris i pakiet WASM; nowa wersja - issue na reviu, bez automerżu (aktualizacja silnika ephemerid - zbyt wrażliwa rzecz na autoaktualizację).
Co to daje integratorowi
Dział zatytułowany „Co to daje integratorowi”Gwarancja prosta: pozycje planetarne w granicach < 0,1 kątowej sekundy od etalonowego Swiss Ephemeris, i ta granica chroniona jest automatycznie, a nie obietnicą w README. Jeśli kiedykolwiek pojawi się regresja, ona wpadnie w nasz CI, a nie w skargę twojego użytkownika.
Publiczna wersja tych cyfr, z tabelą rozchodzeń na konkretnych kartach, żyje na stronie Dokładność.
Ten sam Swiss Ephemeris, co w Solar Fire - w 4 liniach kodu.
Darmowy klucz bez karty. 5 000 wywołań miesięcznie do pierwszej płatności.