# Akurasi perhitungan

## TL;DR

API AstroWay menggunakan **Swiss Ephemeris** (kode C resmi dari Astrodienst,
pencipta astro.com) — mesin yang sama yang digunakan oleh para astrolog profesional
selama 30+ tahun di **Solar Fire ($495), Kepler ($995), Astro Gold ($29.99/bulan)**
dan Janus. Kami mengompilasinya ke WebAssembly dan mengeksposnya melalui REST API,
tanpa markup perantara. Setiap endpoint perhitungan dasar dilindungi oleh tes
snapshot regresi; akurasi mesin diverifikasi melalui **triangulasi** dengan tiga
sumber independen + dibandingkan dengan **NASA 5-Millennium Eclipse Catalog**:

- **Posisi planet**: `< 0.1 detik busur` vs swetest CGI resmi Astrodienst
- **Kuspid rumah Placidus**: `0.000"` pencocokan tepat
- **Gerhana**: `< 1 menit` vs NASA Eclipse Catalog
- **Garis ACG**: `< 1.5 km` di ekuator vs swetest
- **Terbit/terbenam Matahari**: `< 10 detik` vs timeanddate.com
- **VOC Bulan, ingress, konjungsi planet**: akurasi hingga pecahan detik

## Mesin

| Komponen | Nilai |
|----------|-------|
| Perpustakaan | Swiss Ephemeris C code (aloistr/swisseph) |
| Versi | upstream Astrodienst C code |
| Bindings | swisseph-wasm (WebAssembly di Node.js) |
| Ephemeris | DE431 JPL ephemeris (melalui file .se1) |
| Fallback | Moshier analitis (untuk tanggal di luar 1800-2399) |
| Pembagian kode | Shared `@/core` dengan app.astroway.info — satu mesin, dua transportasi |

## Metodologi

Akurasi diverifikasi melalui **triangulasi** — perbandingan dengan tiga sumber
independen:

### 1. swetest CGI (referensi)

Implementasi referensi resmi Swiss Ephemeris dari Astrodienst sendiri —
pembuat **Astro.com** dan melayani jutaan astrolog di seluruh dunia. Sumber
publik paling otoritatif. Mesin kami **identik** (0.00–0.07 detik busur drift).

### 2. Kerykeion (Python)

Perpustakaan Python independen yang menggunakan bindings `pyswisseph` alih-alih
WASM kami. Memastikan bahwa lapisan WASM kami tidak mendistorsi data.

### 3. Prokerala API

API Swiss Ephemeris jarak jauh (Lahiri sidereal). Drift sistemik 8–17 detik
busur terkait dengan versi formula Lahiri ayanamsa yang berbeda, **bukan**
akurasi mesin.

## Hasil Triangulasi

| Peta | vs swetest (Astrodienst) | vs Kerykeion (Python) | vs Prokerala API |
|------|---------------------------|------------------------|------------------|
| Monroe 1926   | **0.00"** | 0.19" | 16.95" (sistemik) |
| Diana 1961    | **0.00"** | 0.69" | 8.18" (sistemik)  |
| Einstein 1879 | 0.07"     | Artefak LMT Kerykeion | 14.96" (sistemik) |

## Kumpulan Regresi di Level Endpoint

Setiap endpoint perhitungan dasar dilindungi oleh tes snapshot beku pada 3 peta
referensi (Monroe / Diana / Einstein) = **{siteMeta.snapshotCount} snapshot**.

Kumpulan snapshot menangkap:

- **Kesalahan pemetaan data masukan** — ID planet salah, UT, sistem rumah
- **Pascapemrosesan** — pembulatan, konversi satuan, kehilangan tanda
- **Perbedaan default** — node rata-rata vs benar, geosentris vs topocentris
- **Drift skema** — validasi melewatkan bentuk yang salah
- **Depoy lama** — dist prod tidak sesuai dengan kode

Toleransi: `5e-5°` (≈0.18 detik busur) secara default untuk semua bidang numerik.

## Benchmark Detail

### Posisi Planet (tropis, vs swetest)

| Peta | Tanggal | Drift Maksimum |
|------|---------|----------------|
| Marilyn Monroe  | 1926-06-01 | **0.00"** |
| Princess Diana  | 1961-07-01 | **0.00"** |
| Albert Einstein | 1879-03-14 | 0.07"     |

### Kuspid Rumah Placidus (vs swetest)

| Peta | drift ASC | drift MC | Drift Kuspid Maksimum |
|------|-----------|----------|-----------------------|
| Monroe | 0.000" | 0.000" | 0.000" |
| Diana  | 0.000" | 0.000" | 0.000" |

### Gerhana (vs NASA 5-Millennium Catalog)

| Peristiwa | NASA Maksimum | Kami Maksimum | Drift |
|-----------|---------------|---------------|-------|
| 2025-03-14 Gerhana Bulan Total  | 06:58 UT | 06:58 UT | 0.8 menit |
| 2025-03-29 Gerhana Matahari Sebagian | 10:47 UT | 10:47 UT | 0.5 menit |
| 2025-09-07 Gerhana Bulan Total  | 18:11 UT | 18:11 UT | 0.8 menit |
| 2025-09-21 Gerhana Matahari Sebagian | 19:41 UT | 19:42 UT | 1.0 menit |

### Astrokartografi (vs rumus RA dari swetest)

Semua garis MC/IC/ASC/DSC menggunakan rumus yang benar `longitude = RA − GMST`
(standar Kenneth Bowser). Drift dari standar: **< 1.5 km** di ekuator untuk
semua planet.

### Terbit / Terbenam Matahari (vs timeanddate.com)

| Lokasi | Tanggal | Parameter | Drift |
|--------|---------|-----------|-------|
| London | 2026-04-15 | Terbit Matahari | 0.6 detik |
| London | 2026-04-15 | Terbenam Matahari  | 9 detik   |

**Lokasi kutub** (|lint| > 66.5°) secara otomatis mengembalikan `polarState` +
peringatan bahwa jam planet biasa tidak terdefinisi.

### Orbis Aspek

AstroWay menggunakan **orbis variabel** per-planet (aturan MIN dari dua planet),
seperti di ZET9 dan astro.com. Orbis default (untuk peta natal):

| Aspek | Matahari | Bulan | Dalam | Jupiter | Luar |
|-------|----------|-------|-------|---------|------|
| Konjungsi | 12°  | 10° | 5° | 8° | 5° |
| Sextil     | 6.5° | 6°  | 5° | 5° | 5° |
| Kuadrat    | 10°  | 8°  | 5° | 7° | 5° |
| Trigon     | 12°  | 8°  | 5° | 5° | 5° |
| Oposisi    | 12°  | 10° | 5° | 8° | 5° |

Aspek minor (36°, 40°, 45°, 72°, 108°, 135°, 144°) **dinonaktifkan secara default**.
Diaktifkan secara eksplisit melalui `ALL_ASPECTS`.

## Lintang Kutub

Untuk |lint| > 66.5° sistem Placidus / Koch / Regiomontanus secara matematis tidak
terdefinisi. Dalam kasus ini, Swiss Ephemeris secara otomatis mengembalikan
Porphyry, dan API kami menambahkan peringatan:

```json
{
  "system": "P",
  "warning": "Sistem Placidus tidak terdefinisi untuk lat=68.96° (> 66.5°). Swiss Ephemeris menggantikan dengan Porphyry..."
}
```

## Pemeriksaan Berkelanjutan

Regresi diperiksa **pada setiap PR** melalui CI:

- `api-calc/tests/endpoints/` — {siteMeta.snapshotCount} snapshot terhadap peta referensi (Monroe / Diana / Einstein) + synastry / composite / davison
- `.github/workflows/api-accuracy.yml` — peluncuran otomatis pada PR
- Triangulasi terhadap swetest CGI + Kerykeion — setiap minggu
- Pemantauan Swiss Ephemeris upstream melalui Dependabot

## Batasan yang Diketahui

- **Tanggal di luar rentang** (sebelum 1800 dan setelah 2399): menggunakan Moshier
  analitis, akurasi ~0.1" (vs < 0.01" untuk SWIEPH dengan file DE431)
- **Lilith Benar (id=13) vs Lilith Rata-Rata (id=12)**: perbedaan hingga 12° — secara
  default menggunakan Lilith Rata-Rata (perilaku stabil), Lilith Benar tersedia
  melalui `planetIds: [13]`
- **Toposentris vs Geosentris**: secara default geosentris

## Referensi

- Swiss Ephemeris: https://www.astro.com/swisseph/
- swetest CGI: https://www.astro.com/swisseph/swetest.htm
- Katalog Gerhana NASA: https://eclipse.gsfc.nasa.gov/
- Kerykeion: https://github.com/g-battaglia/kerykeion
- Astrodienst: https://www.astro.com/

## Kontak

Untuk pertanyaan mengenai akurasi: kirim email ke support@astroway.info dengan
data peta dan standar acuan yang diharapkan (astro.com atau sumber otoritatif
lainnya).
