Andronikos Weather Intelligence

Fullstack documentation untuk engine weather intelligence Indonesia: GraphCast, Open-Meteo, ERA5, GFS, GEFS, AIGFS, AIGEFS, HGEFS, BMKG, dan multi-source fusion dengan pola pembobotan enterprise.

ArchitecturePrototype Ready
Tests141 lulus
Clippy0 warnings
1-Minute≤10.000 cell

Asal-Usul: Menara Angin dan Nalar Andronikos

Setiap sistem prakiraan pada akhirnya menjawab pertanyaan yang lebih tua daripada komputasi: bagaimana manusia menempatkan diri di antara langit dan tanah. Menara Angin di Athena adalah jawaban paling awal yang masih berdiri; Andronikos adalah upaya menuliskan kembali jawaban itu dengan mesin hari ini.

Sebuah Bangunan yang Menolak Punah

Di Agora Romawi, Athena, berdiri menara segi delapan dari marmer Pentelik: tingginya sekitar 12 meter, garis tengahnya sekitar 8 meter, dan di sekeliling puncaknya terpahat delapan relief dewa angin. Penanggalannya tidak pasti. Ia selesai paling lambat sekitar 50 SM, sebab Varro sudah menyebutnya sekitar 37 SM, dan perancangnya lazim disebut astronom Andronikos dari Kyrrhos, sosok yang nyaris tak meninggalkan biografi. Menara ini termasuk segelintir bangunan klasik yang nyaris utuh hingga kini, dan sebabnya paradoksal: ia tidak dibekukan menjadi monumen, melainkan terus dipakai untuk fungsi yang berganti-ganti. Salah satu sebutan lamanya, Jam Andronikos, adalah asal nama platform ini.

Satu Bangunan, Empat Instrumen

Yang istimewa dari menara ini bukan marmernya, melainkan integrasinya. Dalam satu badan ia menghimpun relief delapan angin, baling-baling perunggu berbentuk Triton di puncak (menurut Vitruvius; kini hilang), delapan jam matahari pada sisi luar, dan jam air di dalam yang dialiri dari mata air di Akropolis. Arsitektur, pahatan, dan sains baru dileburkan agar warga dapat mengorientasikan diri dalam ruang dan waktu. Kata kuncinya orientasi, bukan ramalan: menara tidak memutuskan apa yang harus dilakukan orang Athena, ia memberi mereka bahasa bersama untuk membaca langit.

AndronikosHorologion Boreas · Udingin, badai Kaikias · TLmendung, dingin, hujan es Apeliotes · Thujan lembut, menyuburkan Eurus · TGgerah, mendung, hujan Notus · Sgerah, sangat basah Libs · BDpelayaran: karam atau lancar Zephyrus · Bhangat, berbunga Skiron · BLkering, abu dan bara
Delapan anemoi pada friz menara, dibaca ulang sebagai peta ringkas bahaya. Arah menunjukkan asal angin: U utara, TL timur laut, T timur, TG tenggara, S selatan, BD barat daya, B barat, BL barat laut. Ciri mengikuti pemerian Stuart dan Revett (1762) sebagaimana dirangkum Wikipedia.

Peta Gagasan: dari Menara ke Mesin

Tabel berikut memetakan bukti tentang menara ke keputusan desain yang dapat ditelusuri di dokumentasi ini. Pemetaannya argumen analogis, bukan klaim silsilah.

Bukti dari menaraGagasanWujud di Andronikos
Delapan relief angin, masing-masing dicirikan lewat atribut: hujan, dingin, kering, suburBahaya diberi nama dan wajah sebelum diukurKatalog 17 WeatherVariable dan modul risiko longsor, banjir, asap. Skiron, pembawa abu dan bara yang mungkin merujuk kebakaran hutan, menjadi pendahulu simbolik modul asap dan titik panas (fire.firms, fire.sipongi)
Baling-baling Triton di puncakPengamatan mendahului prediksiobs.bmkg_stn dan obs.isd (setelah QC) menjadi acuan verifikasi; ref.era5 tidak
Delapan jam matahari, masing-masing disetel menurut lamanya sisi itu disinari (timur dan barat hanya empat garis jam, selatan delapan)Kalibrasi lokal: satu prinsip, banyak sisiKoreksi bias per variabel, lead, siklus, dan stasiun; semua anggota ensemble memakai b yang sama
Jam air yang mekanismenya hilang; rekonstruksinya tetap tak pastiKejujuran epistemik: yang tak diketahui tidak ditambal tebakanWIError::BelumDiputuskan, daftar “Undecided (JANGAN diisi tebakan)”, bobot fusi dan ambang siaga yang sengaja belum ditetapkan
Menara dibuat tinggi agar jam matahari dan baling-baling terlihat dari Agora; belum jelas bagaimana bacaan jam air di dalam sampai ke orang di luarInformasi harus tiba di tempat keputusan diambil, dengan takaran yang jujurPeta Leptos + MapLibre, panel risiko, endpoint keputusan CoalForge; label_istilah, atribusi, dan bahasa probabilitas tanpa klaim “memprediksi pasti”
Atap batu asli dari 24 lempeng trapesium yang dikunci satu batu kunci melingkarKekokohan lahir dari sambungan yang saling mengunciDelapan crate dengan batas tanggung jawab jelas; tanpa unwrap() atau panic! di kode non-test
Berganti fungsi berabad-abad, sempat terkubur separuh tinggi, digali pada abad ke-19, dipugar 2014–2016Ketahanan lewat kemampuan beralih gunaSingle VPS ke Three VPS; jalur ganda Burn GraphCast dan ONNX; “Python melatih, Rust menyajikan”
Gambar ukur Stuart dan Revett (1762) yang “merapikan” relief ausDokumentasi berisiko mengidealkan yang didokumentasikanStatus apa adanya: Skeleton, Perlu GPU, persentase kematangan per crate. Dokumen ini tidak merapikan yang belum rapi
Bab tata kota Vitruvius: orientasi jalan untuk memaksimalkan manfaat dan meminimalkan bahaya anginPengetahuan angin sebagai alat tata ruangunit_id (sub-DAS, unit lereng, kelurahan): informasi risiko turun hingga unit yang dapat diputuskan

Mengapa Nusantara, Mengapa Sekarang

Indonesia adalah kepulauan tropis yang bentang petanya, sebagaimana dikunci pada antarmuka ini, membentang sekitar 11,15°LS hingga 6,25°LU dan 94,95°BT hingga 141,25°BT, dengan hujan dan angin muson yang membentuk risiko longsor, banjir, dan asap. Persoalan hari ini bukan kelangkaan data: tujuh adapter ingesti, beberapa model global, dan jaringan pengamatan sudah tersedia. Yang langka adalah orientasi, yakni cara menggabungkan banyak sumber tanpa menghitung satu sensor dua kali, tanpa menyembunyikan ketidakpastian, dan tanpa mengaku memiliki otoritas yang bukan miliknya.

Menara itu sendiri lahir dalam suasana pemulihan. Jika penanggalan lazim benar, ia bagian dari pembangunan kembali Athena setelah kota itu hampir rata akibat legiun Sulla pada 86 SM: pengetahuan tentang angin dan waktu dijadikan infrastruktur sipil, bukan rahasia segelintir orang. Andronikos mengambil sikap serupa dengan satu penegasan modern. Ia menyebut dirinya penyedia “informasi risiko” dan “analisis pendukung”, bukan peringatan resmi, karena UU 31/2009 menempatkan informasi meteorologi pada BMKG. Menara boleh mengorientasikan; yang berwenang memerintahkan tetaplah otoritas.

Lima Prinsip Menara

Orientasi, bukan ramalan

Probabilitas adalah proporsi anggota ensemble yang melewati ambang, bukan kepastian.

Kalibrasi per sisi

Bias dikoreksi menurut variabel, lead, siklus, dan stasiun, dengan pengamatan sebagai acuan.

Kejujuran epistemik

Yang belum diputuskan ditandai terang-terangan, tidak diisi tebakan.

Terlihat di tempat keputusan

Peta, tingkat siaga, atribusi, dan unit keputusan dirancang untuk dibaca, bukan sekadar disimpan.

Hidup lewat beralih guna

Modular: delapan crate, dua topologi deployment, dua jalur ML, siap berganti fungsi.

Batas analogi

Menara adalah analogi disiplin, bukan klaim genealogi. Penanggalannya sendiri diperdebatkan (ada dugaan lebih awal, terkait kedermawanan Attalus III dari Pergamon), asal Andronikos dari Kyrrhos di Makedonia atau di tepi Efrat tidak pasti, dan cara kerja persis jam airnya belum terpulihkan.

Rujukan

  1. Wikipedia, “Tower of the Winds”: sumber utama narasi ini.
  2. Noble, J. V. dan de Solla Price, D. J. (1968). “The Water Clock in the Tower of the Winds”, American Journal of Archaeology 72(4): 345–355. doi:10.2307/503828
  3. Webb, P. A. (2017). The Tower of the Winds in Athens: Greeks, Romans, Christians, and Muslims. Memoirs of the American Philosophical Society 270.
  4. Lawrence, A. W. (1957). Greek Architecture. Pelican History of Art, Penguin.
  5. Wallace-Hadrill, A. (2022), dalam Rome and the Colonial City: Rethinking the Grid. Oxbow Books.

Butir 2–5 dirujuk sebagaimana dikutip artikel Wikipedia tersebut, bukan dibaca langsung.

Engine 1-Minuten Capability

OperasiWaktu1 Menit?Catatan
predict_point (1 titik)10-50 msYaSingle cell batch forward
predict_grid (≤10.000 cell)< 10 msYaBatch inference dalam satu forward() call
predict_grid_batch (multi-area)< 1 menitYaBanyak area, spatial tiling otomatis
infer_area_distributed (38,9M cell)< 1 menit*Ya*Dengan GPU + spatial tiling + multiple concurrent tile requests
predict_grid 0.5km penuh (38,9M cell)> 1 menitPerlu GPUPerlu multi-request via tiling
ONNX downscale (1 titik)< 5 msYa4 intra-threads, Level3

Re-arsitektur yang Diimplementasi

Batch Inference

create_batch_input() membangun tensor [N, features] untuk N cell sekaligus, satu forward() call untuk semua cell. Tidak lagi per-cell sequential.

Mesh Graph

build_mesh_edges() membangun edge_index [2, E] dengan 4-connectivity untuk GNN message passing.

Spatial Tiling

TilingManager::split_area_into_tiles() bagi area besar menjadi tile (default 2,5M cell/tile) dengan overlap untuk konsistensi GNN di batas tile.

Multi-Area Coordinator

TileCoordinator::infer_area_distributed() otomatis split ke tiles, process secara concurrent via futures::future::join_all.

Device Selection

DeviceType (CPU/CUDA/WGPU/Metal) via create_burn_device().

Lead Time Cap

MAX_LEAD_SECONDS = 168 * 3600 enforced di semua entry point.

No unwrap/panic/race

Semua operasi via Result, tidak ada unwrap()/expect()/panic! di non-test code.

Rust
// predict_grid_batch untuk banyak area
let areas = vec![
    AreaPredictRequest {
        area_id: "jakarta".to_string(),
        bbox: Bbox::new(106.5, -6.5, 107.0, -6.0),
        resolution: 0, // 0.5km
        lead_seconds: 3600,
        variables: WeatherVariable::surface_variables(),
        max_cells: Some(5000),
    },
];

let request = BatchGridPredictRequest::new(areas)
    .with_device(DeviceType::Cpu)
    .with_max_total_cells(10_000);

let output = forecaster.predict_grid_batch(request).await?;
          
Rust
// Distributed Inference untuk Area Besar (38.9M cell)
let result = coordinator.infer_area_distributed(
    "indonesia_full",
    &Bbox::new(95.0, -11.0, 141.1, 6.1),
    0,
    3600,
    &WeatherVariable::surface_variables(),
).await?;
// result.total_cells = 38.900.000
// result.total_inference_ms < 60.000 (dengan GPU + tiling)
// result.completed_within_target = true
          

Data Fusion (Anti-Double Counting)

SourceRegistry mencegah double-counting saat runtime:

SumberRoleDependency GroupEligible?Alasan
met.gfsBasePhysicsIndependentYaDasar fisika deterministik
met.gefsBaseEnsembleNoaaGefsFamilyYaDasar ensemble probabilistik
met.aigfsAiMemberNoaaGefsFamilyYaAnggota AI tambahan
met.aigefsAiMemberNoaaGefsFamilyYaAnggota ensemble AI
met.hgefsExcludedNoaaGefsFamilyTidakGabungan AIGEFS+GEFSv12, tidak independen
met.bmkg_fcLocalMemberIndependentYaAnggota gabungan lokal
met.graphcastExcludedGraphCastNonCommercialTidakCC BY-NC-SA, tidak komersial
met.openmeteoComparatorOnlyOpenMeteoAggregatorTidakAgregasi, tidak independen
ref.era5TrainingOnlyEra5ReanalysisTidakTraining + bias correction only
fire.firmsModuleSpecificFireHotspotFamilyYaTitik panas
fire.sipongiModuleSpecificFireHotspotFamilyYaSensor sama dengan FIRMS, hitung sekali
Atur Aturan Double-Counting:
  • met.hgefs tidak dapat bobot terpisah dari met.gefs+met.aigefs (dependensi NoaaGefsFamily)
  • met.openmeteo = bobot 0 dalam fusion (hanya pembanding)
  • ref.era5 = bobot 0 real-time (training only)
  • fire.firms + fire.sipongi = satu sensor, hitung sekali
  • can_have_separate_weight() mencegah dua sumber dalam group yang sama sama-sama menerima bobot non-nol

Alur Penggabungan (5 Langkah)

  1. Ingest mentah dengan metadata: sumber, lisensi, waktu terbit, waktu berlaku.
  2. Selaraskan grid, satuan, zona waktu (UTC), nama variabel.
  3. Saring pengamatan (QC): rentang nilai, konsistensi antar stasiun, data ganda.
  4. Gabungkan: fisika (GFS/GEFS) sebagai dasar, AI (AIGFS/AIGEFS/BMKG_fc) sebagai anggota tambahan. Bobot dipelajari dari data historis.
  5. Verifikasi terhadap pengamatan, bukan ERA5.

Pola Pembobotan (Weighting Pattern)

A. Bias Correction (Additive)

x_koreksi = x_prakiraan - b
b_baru = (1 - α) * b_lama + α * (prakiraan - pengamatan)
  • α dan panjang jendela BELUM DIPUTUSKAN → WIError::BelumDiputuskan
  • Variabel aditif: suhu 2m, tekanan permukaan laut, angin (u,v), kelembapan (clamp 0-100%)
  • Hujan: BUKAN aditif — pakai rasio, clamp ≥ 0
  • Semua anggota ensemble pakai b yang sama
  • Acuan: obs.bmkg_stn, obs.isd (setelah QC), BUKAN ref.era5

B. Ensemble Probability

p = (1/M) * Σ(1[x_m > T])
  • Hazard function dijalankan pada SETIAP anggota ensemble, baru proporsi dihitung
  • M kecil → probabilitas kasar (0 atau 1)

C. Fusion Weight (constraint: Σw = 1, w ≥ 0)

Fusion = w_physics * Base(GFS, GEFS)
       + w_ai * Σ(w_member_i * Member_i)   [AIGFS, AIGEFS, BMKG_fc]
       + BiasCorrection(...)
       → Calibrated Probability via Ensemble CDF
  • Σ w = 1, w ≥ 0, divalidasi oleh FusionEngine::validate_weights()
  • Nilai konkret bobot belum ditetapkan — harus diturunkan dari verifikasi historis
  • Fisika (GFS, GEFS) = baseline weight tinggi
  • AI members (AIGFS, AIGEFS) = weight tambahan, bukan pengganti fisika

API REST + gRPC

EndpointMethodDeskripsiStatus
GET /healthGETHealth checkWorking
POST /v1/predictPOSTPrediksi titik tunggal → FusionOutputWorking
POST /v1/predict/gridPOSTPrediksi grid tunggalWorking
POST /v1/predict/grid/batchPOSTPrediksi grid batch multi-areaWorking
POST /v1/predict/grid/distributedPOSTPrediksi distributed 38.9M cellWorking
GET /v1/model/infoGETModel metadataWorking
GET /v1/variablesGETList 17 WeatherVariableWorking

gRPC Services

ServiceTypeDeskripsiStatus
PredictUnaryPrediksi titik tunggalWorking
PredictGridUnaryPrediksi grid tunggalWorking
StreamPredictServer StreamingStream prediksi multi-leadWorking

Request/Response Schema

// POST /v1/predict Request
{
  "latitude": -6.595,
  "longitude": 106.806,
  "lead_seconds": 3600,
  "variables": ["Temperature", "RelativeHumidity", "Precipitation"]
}

// POST /v1/predict Response (FusionOutput)
{
  "unit_id": null,
  "jenis_unit": null,
  "modul": "cuaca",
  "terbit": "2026-10-17T00:00:00Z",
  "berlaku_dari": "2026-10-17T01:00:00Z",
  "berlaku_sampai": "2026-10-17T02:00:00Z",
  "lead_seconds": 3600,
  "probabilitas": null,
  "tingkat_siaga": null,
  "anggota": 1,
  "versi_model": "GraphCast-1.0.0",
  "koreksi_bias": false,
  "sumber_id": ["met.graphcast"],
  "atribusi": ["DeepMind GraphCast (lokal, dilatih sendiri)"],
  "label_istilah": "analisis pendukung",
  "klaim": [],
  "variables": {
    "Temperature": { "weighted_mean": 298.15, "exceedance_probability": null, "member_count": 1, "bias_applied": false }
  }
}
          

Middleware

  • JWT RS256 Authentication - scope-based authorization
  • Rate Limiting - sliding window, Redis-backed
  • CORS - configurable origins
  • Request Validation - lat/lon bounds, lead time max (168h), variable names
  • Redis Cache - TTL (1hr point, 30min grid), pattern invalidation
  • Tracing - structured JSON with cell, model_run, latency

CLI Commands

CommandDeskripsiStatus
wi sync --hours 24Real data sync dengan ParquetSyncEngineWorking
wi trainGraphCast model initialization + Python training pipelineWorking
wi predict --latitude -6.595 --longitude 106.806 --lead-seconds 3600Real inference dengan GraphCastForecasterWorking
wi serve --host 0.0.0.0 --port 8080API server dengan axum, rate limiting, CORSWorking
wi verify --model model.bin --data test.parquetDashboard generation + Python verification pipelineWorking
wi export --model model.bin --format onnx --output model.onnxExport guidance ONNX, TorchScript, TensorRTWorking
wi infoModel architecture infoWorking
wi ingestSource registry listingWorking

Frontend UI (Leptos + MapLibre)

Frontend dibuat di folder andronikos/:

MapLibre GL JS

Bounds dibatasi ke wilayah Indonesia: lat -11.15° to 6.25°, lon 94.95° to 141.25°. maxBounds mencegah panning keluar. maxZoom 10, minZoom 4.

Panel Kiri

Prakiraan cuaca (suhu, kelembapan, curah hujan, angin, tekanan) + Risiko Dampak (longsor/banjir/asap dengan tingkat siaga + probabilitas).

Badge Atribusi

BMKG (terverifikasi), NOAA (terverifikasi), ERA5 (training only), Open-Meteo (dikecualikan dari fusion).

Istilah Baku

"Informasi risiko" / "analisis pendukung", bukan "peringatan resmi" (compliance gate UU 31/2009).

cargo install trunk
cd andronikos/leptos
trunk serve
# Buka http://127.0.0.1:8080

Arsitektur Lengkap (8 Crates)

CrateDeskripsiStatusKey Tech
wi-coreTypes, errors, units, config, DeviceType, SourceRegistry95%thiserror, serde, chrono
wi-gridGeospatial (H3 + FixedGrid 0.5km)95%h3o, geo
wi-ingestData ingestion (7 adapters + bias_correction)85%reqwest, quick-xml, parquet
wi-storageStorage (Parquet, PostgreSQL/PostGIS, Redis, .atd)80%sqlx, redis, arrow
wi-modelML Inference — DUAL PATH (Burn GraphCast + ONNX + Tiling)65%burn 0.22, ort, rayon
wi-verifyVerification metrics (MAE, RMSE, Brier, CRPS)95%statrs, ndarray
wi-apiREST + gRPC (axum + tonic), Redis cache, JWT auth75%axum, tonic, tower-http
wi-cliCLI commands (sync, train, predict, serve, verify, export, info)80%clap, tokio

Data Flow Architecture

SOURCES (7 APIs)
    → wi-ingest (SyncEngine + validation + gap fill)
    → wi-storage (Parquet + PostgreSQL + Redis + .atd)
    → wi-model (Burn GraphCast global + ONNX downscaler + Tiling Coordinator)
    → wi-verify (metrics + baselines)
    → wi-api (REST + gRPC + Redis cache)
           │
           ▼
    CONSUMERS: wi-cli, wi-ui (Leptos+Deck.gl), CoalForge (REST+Kafka), External APIs

ML Pipeline — Dual Path

Path 1: Global Model (Burn GraphCast)

12 GNN layers, 8 heads, hidden_dim=256, ~40-60M params. SwiGLU MLP, O(N) Linear Attention (Performer). 17 output heads.

Path 2: Regional Downscaler (ONNX)

Input 14 features → Output 6 vars × 4 quantiles = 24 outputs. ort crate Level3, 4 intra-threads.

Training

Python melatih, Rust menyajikan. PyTorch/Lightning → ONNX/Burn → serve in Rust.

Ingestion Adapters (7 Sources)

AdapterStatusRate LimitNotes
Open-MeteoComplete10 req/sArsip + Forecast
NOAA (ISD/GHCN)Complete5 req/sToken bucket
BMKGComplete60 req/minUU 31/2009 attribution
ERA5Complete1 req/sCDS API, NetCDF
GFSComplete120 req/minNOMADS, GRIB2
HimawariComplete30 req/minJAXA/AWS, NetCDF
WeatherNextComplete10 req/minDeepMind allowlist

Storage Backends (4)

BackendStatusNotes
ParquetComplete + WiredHive partitioning, ZSTD
PostgreSQL/PostGISCompleteFull schema, spatial queries
ATD (custom binary)Skeletonbincode+zstd
RedisSkeletonmoka + redis, TTL

Verification Metrics

CategoryMetricsBaseline
DeterministicMAE, RMSE, Bias, CorrelationPersistence, Climatology, Raw Model
ProbabilisticBrier Score, Reliability Diagram, ROC AUC—
EnsembleCRPS (fair), Spread, Spread-Skill Ratio—
SplitsTemporal, Spatial, Cross-Validation—

Grid Systems

Grid TypeResolutionCells (Indonesia)Status
H3 res 71.22 km / 5.16 km²~7,500Siap
H3 res 8454 m / 0.74 km²~52,000Siap
FixedGrid 0.0045°500 m / 0.25 km²38.9MVERIFIED

Output Contract (16 Field: 15 Wajib, 1 Opsional)

BidangIsi
unit_id, jenis_unitSub-DAS, unit lereng, atau kelurahan
modullongsor, banjir, atau asap
terbit, berlaku_dari, berlaku_sampaiWaktu UTC
leadJangka waktu prakiraan
probabilitasProporsi anggota ensemble yang melewati ambang
tingkat_siagaHasil gabungan ambang hujan dan kelas kerentanan
anggotaJumlah anggota ensemble
versi_modelVersi model per sumber
koreksi_biasApakah koreksi dipakai atau dikembalikan ke mentah
sumber_idDaftar ID dari katalog variabel
atribusiTeks atribusi yang wajib
label_istilah"Informasi risiko" atau "analisis pendukung"
klaimDaftar kode pembeda (D1-D4) yang lulus verifikasi opsional

Compliance (Wajib)

  • UU 31/2009 Pasal 36 ayat 1 + PP 11/2016 Pasal 4: Info meteorologi hanya oleh BMKG, kecuali UU lain.
  • Istilah: "informasi risiko" atau "analisis pendukung", bukan "peringatan dini" sebelum izin BMKG.
  • Atribusi: BMKG wajib, FIRMS acknowledgment, Copernicus/Open-Meteo atribusi, NOAA tidak boleh disiratkan didukung NOAA.
  • Open-Meteo: gratis hanya non-komersial, <10.000 panggilan/hari.
  • BMKG: 60 req/min/IP, izin tertulis untuk komersial.
  • NOMADS: ~120 hit/min/user, pusatkan unduhan pada satu node dengan rate limiter.
  • GraphCast/GenCast bobot: CC BY-NC-SA 4.0 → dikecualikan untuk produk komersial.

Gerbang Sebelum Penyajian

  1. Istilah keluaran sesuai dan tidak menyebut "peringatan dini" tanpa izin.
  2. Atribusi lengkap: BMKG wajib, FIRMS acknowledgment, Copernicus/Open-Meteo atribusi.
  3. Tidak ada sumber berstatus belum dan tidak ada sumber tidak independen yang terhitung dua kali.
  4. Bahasa probabilitas dan tingkat risiko, tanpa klaim "memprediksi pasti".
  5. Skor verifikasi pilot sudah melewati ambang kelulusan.

Undecided (JANGAN diisi tebakan)

  • α dan panjang jendela koreksi bias → BelumDiputuskan error
  • Ambang tingkat siaga (longsor/banjir/asap)
  • Model sebaran asap
  • Indeks kekeringan
  • Sumber sungai, tanah, tutupan lahan, drainase, dll.
  • BMKG PNBP tariff, PVMBG download rights, GPM/GSMaP licenses
  • Commercial product decision

Arsitektur Deployment — Three VPS Topology

Engine didesain untuk berjalan dalam tiga VPS terpisah untuk memisahkan tanggung jawab ingestion, inference, dan API. Untuk development/prototype, semua dapat dijalankan dalam satu VPS.

VPS-1: Data Pipeline

Tugas: Ingest, validasi, penyimpanan, koreksi bias

  • wi-ingest (7 adapters)
  • wi-storage (Parquet, PostGIS, Redis)
  • BiasCorrectionEngine
  • Checkpoint sync (SHA256)

VPS-2: ML Engine (GPU)

Tugas: Inferensi GraphCast, tiling, distributed

  • wi-model (Burn, ONNX)
  • TilingManager + TileCoordinator
  • CUDA/WGPU device
  • 38.9M cell inference

VPS-3: API + Frontend

Tugas: API gateway, UI, CoalForge integration

  • wi-api (REST + gRPC)
  • JWT auth, rate limiting
  • Leptos + MapLibre UI
  • CoalForge decision endpoints
VPS-1 (Data Pipeline) ──┬──────────────┐
                        │              ▼
                        └──► [Kafka/Avro Events] ──► VPS-2 (ML Engine GPU) ──► [Kafka] ──► VPS-3 (API + UI)
                                                   │                     │                    │
                                                   ▼                    ▼                    ▼
                                              [GraphCast Burn]  [ONNX Downscaler]    [REST + gRPC + Leptos UI]
                                                   │                     │                    │
                                                   ▼                    ▼                    ▼
                                              [Parquet Storage]   [Redis Cache]     [CoalForge Events]
          

Single VPS vs Distributed (Three VPS)

AspekSingle VPS (Development)Three VPS (Production)
IngestionLokal, satu prosesVPS-1 dedicated, 7 adapters parallel
Model InferenceCPU only, batch kecilVPS-2 GPU (CUDA/WGPU), tiling 38.9M cell
API LayerLokal, axum + tonicVPS-3 dedicated, JWT + rate limit
StorageLokal diskVPS-1 Parquet + PostgreSQL/PostGIS
KomunikasiIn-memory function callKafka/Avro event streaming
FrontendTrunk serve lokalVPS-3, built static + API proxy
Perintah jalan per VPS:
# VPS-1: Data Pipeline (Ingestion + Storage)
cargo run --bin wi -- sync --hours 24
cargo run --bin wi -- ingest

# VPS-2: ML Engine (dengan GPU support)
cargo run --bin wi-serve --features cuda -- --port 8081

# VPS-3: API + Frontend
cargo run --bin wi-serve -- --port 8080
# Frontend: trunk serve --public-url https://api.andronikos.id
Catatan: Untuk 38.9M cell Indonesia 0.5km dalam 1 menit, VPS-2 membutuhkan GPU (CUDA/WGPU) dengan spatial tiling otomatis. Single VPS CPU hanya cocok untuk development dengan area pilot kecil (≤10.000 cell).

Diagram Arsitektur

Semua diagram ditulis sebagai teks monospace, jadi tampil identik di setiap browser dan bisa disalin ke dokumen lain.

Data Flow Architecture
ML Pipeline — Dual Path
Three VPS Deployment Topology
Anti-Double Counting — Source Registry
Bias Correction & Ensemble Probability
Output Contract — 16 Fields
RealtimeAndronikos Weather Intelligence — Weather Intelligence Engine untuk IndonesiaInformasi risiko, bukan peringatan resmi · Lihat BMKG untuk peringatan dini.LokalUTC