decision_simulation
Alur pipeline interaktif on-demand pemodelan skenario krisis (What-If Policy Sandbox), penautan bukti empiris media monitoring (BM25 Elasticsearch), penalaran kausalitas AI (POST /ai/simulate), dan persistensi PostgreSQL (simulation_runs).
Pipeline Data: decision_simulation (What-If Crisis Sandbox)
Pipeline decision_simulation adalah subsistem pengujian kebijakan dan simulasi disrupsi interaktif (What-If Analysis Sandbox) yang dirancang untuk membantu pengambil keputusan strategis memproyeksikan deviasi indikator nasional, efek domino berjenjang (Cascading Impact), serta sebaran risiko geospasial ke 38 provinsi di Indonesia sebelum suatu krisis memuncak atau sebelum suatu intervensi kebijakan dieksekusi.
Karakteristik Pipeline: Interactive On-Demand (Bukan Batch Harian)
Berbeda dari pipeline batch reguler yang berjalan terjadwal tiap dini hari (seperti decision_intelligence pada pukul 03:00 WIB), pipeline decision_simulation bekerja secara interaktif on-demand: dipicu langsung saat analis mengklik tombol "Jalankan Simulasi" di antarmuka web, melakukan pencarian bukti empiris ke Elasticsearch articles, memanggil mesin inferensi kausalitas AI (POST /ai/simulate), dan mencatat riwayat sesi ke tabel PostgreSQL simulation_runs.
1. Fungsi Utama Decision Simulation
Modul ini memiliki fungsi strategis inti:
- Jangkar Bukti Empiris (Evidence Grounding): Simulasi tidak menghasilkan angka karangan/halusinasi bebas, melainkan berpijak pada artikel berita nyata terkini di database Media Monitoring yang dipilih analis sebagai asumsi riil.
- Proyeksi Deviasi Indikator Numerik: Memproyeksikan deviasi kuantitatif indikator makro (inflasi pangan, kelancaran logistik, stabilitas kamtibmas, ketersediaan energi, kapasitas faskes) dalam format Before vs After.
- Pemodelan Rantai Efek Domino (Cascading Impact): Menelusuri rambatan gangguan dari satu sektor ke sektor hilir (From ➔ To ➔ Effect), misalnya: kelangkaan solar ➔ kemacetan jalur lintas ➔ keterlambatan bahan pokok ➔ kenaikan harga eceran di pasar induk.
- Pemetaan Risiko Geospasial 38 Provinsi: Menghitung skor kerentanan wilayah secara meluruh (spatial decay), memetakan episentrum krisis hingga provinsi penyangga (buffer zones).
- Rekomendasi Roadmap Mitigasi Taktis: Merumuskan langkah-langkah mitigasi konkret terkoordinasi lintas kementerian/lembaga untuk memutus rantai eskalasi krisis.
2. Arsitektur Alur Pipeline End-to-End
[Pengguna Menentukan Skenario, Intensitas, Wilayah & Durasi]
│
▼
┌─────────────────────────────────────────────────────────────────────────────────────────┐
│ TAHAP 1: GROUNDING BUKTI BERITA EMPIRIS (SCENARIO EVENT GROUNDING) │
│ │
│ Frontend Request: GET /scrape/scenario-events?scenario={key}®ion={region} │
│ │ │
│ ▼ │
│ [Elasticsearch Service: Multi-Match BM25 Query] │
│ • Indeks: articles (filter published_at: now-30d/d) │
│ • Pencocokan: Kata kunci taksonomi skenario & nama wilayah │
│ • Urutan: Skor relevansi (_score DESC) & kebaruan waktu │
│ │ │
│ ▼ │
│ [Daftar Berita Nyata Disajikan di Antarmuka Analis] │
│ (Analis mencentang 1 atau beberapa peristiwa kunci sebagai basis) │
└───────────────────────────────────────────┬─────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────────────────────┐
│ TAHAP 2: EKSEKUSI PENALARAN KAUSALITAS AI (CAUSAL INFERENCE ENGINE) │
│ │
│ Frontend Request: POST /ai/simulate │
│ Payload: scenario, severity_level, region, duration, detail_note, basis_events │
│ │ │
│ ▼ │
│ [Retrieval Baseline Indikator Makro dari PostgreSQL] │
│ • Tabel: fact_indicator (IPH, PDRB, Rasio Faskes, dsb.) │
│ │ │
│ ▼ │
│ [AI Causal Engine via AIOS / AI-Middleware (Gemini 1.5 Pro / Flash)] │
│ • Penalaran Berjenjang (Multi-Step Reasoning): │
│ 1. Causal Chain Modeling (Pemicu ➔ Dampak Primer ➔ Sekunder) │
│ 2. Indicator Deviation (Angka Before vs After & Delta) │
│ 3. Cascading Impact Matrix (A ➔ B ➔ Efek Nyata) │
│ 4. Geospatial Scoring (Skor Dampak 38 Provinsi) │
│ 5. Actionable Mitigation Roadmap (Langkah Taktis Terkoordinasi) │
└───────────────────────────────────────────┬─────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────────────────────┐
│ TAHAP 3: PERSISTENSI HASIL & VISUALISASI INTERAKTIF │
│ │
│ 1. Simpan Snapshot Sesi ke PostgreSQL: simulation_runs │
│ 2. Render Dashboard Interaktif di Frontend: │
│ • KPI Delta Indikator Nasional (Trending Up / Trending Down) │
│ • Diagram Efek Domino Horizontal (Rantai Dampak Berjenjang) │
│ • Peta Interaktif Leaflet (Circle Marker & Skala Warna Keparahan) │
│ • Tabel Pemetaan Peringkat Provinsi Terdampak │
└─────────────────────────────────────────────────────────────────────────────────────────┘3. Matriks Sumber Data Masukan (Input Evidence Matrix)
Pipeline mengombinasikan tiga lapis data untuk memastikan simulasi akurat dan realistis:
| Sumber Masukan | Tipe Penyimpanan | Peran dalam Simulasi | Field / Parameter Kunci |
|---|---|---|---|
articles | Elasticsearch Index | Bukti empiris peristiwa nyata pendukung skenario | title, content, summary, published_at, location_province |
fact_indicator | PostgreSQL Table | Nilai acuan awal sebelum terjadi gangguan | indicator_type, value, region_id, recorded_at |
| User Parameters | HTTP Payload | Definisi batas asumsi simulasi oleh analis | scenario, severity_level, region, duration, detail_note, basis_events |
4. Guardrail & Logika Penalaran Causal Engine
Model kecerdasan buatan dibekali guardrail penalaran ketat (Prompt Engineering & Safety Constraints):
- Aturan Konsistensi Numerik:
Perubahan indikator (
after - before) wajib sebanding secara matematis dengan kombinasiseverity_level(Ringan s.d. Kritis) danduration(6 jam s.d. 1 bulan). - Efek Domino Logis (Cascading Impact): Setiap simpul dalam rantai dampak wajib merefleksikan hubungan kausalitas riil (misal: Sektor Energi/BBM ➔ Sektor Transportasi Logistik ➔ Sektor Pangan Eceran ➔ Kamtibmas).
- Penyebaran Geospasial (Spatial Decay): Dampak krisis tidak boleh terkunci hanya di satu provinsi target, melainkan harus merambat ke provinsi penyangga (buffer provinces) dengan intensitas yang meluruh sesuai jarak logistik dan geografis.
- Validasi Skema Output (JSON Schema Validator): Mencegah respons terputus (malformed JSON) dengan schema enforcement terstruktur sebelum data dikembalikan ke klien.
5. Spesifikasi Kontrak Payload AIOS (POST /ai/simulate)
Komunikasi antara gateway backend/frontend dan mesin inferensi AIOS (ai-middleware) diikat melalui kontrak schema JSON ketat (Strict JSON Schema).
A. Format Request Payload (POST /ai/simulate)
POST /ai/simulate HTTP/1.1
Host: api.ai.dev.app-nexa.com
Content-Type: application/json
Authorization: Bearer sk-nexa-tenant-...
X-User-ID: 3fa85f64-5717-4562-b3fc-2c963f66afa6
{
"scenario": "bbm",
"scenario_label": "Kelangkaan BBM",
"scenario_desc": "Kekurangan bahan bakar yang mengganggu logistik dan transportasi.",
"severity_level": "Berat",
"region": "Sumatera Selatan",
"duration": "1 minggu",
"custom_entities": null,
"detail_note": "Asumsikan antrean armada logistik sembako tertahan lebih dari 48 jam di jalur lintas timur Sumatera.",
"basis_events": [
{
"title": "Antrean Truk di SPBU Jalur Lintas Palembang Mengular Hingga 2 Km",
"source": "Tribun Sumsel",
"date": "2026-10-05T08:00:00Z"
},
{
"title": "Stok Solar Langka, Puluhan Sopir Ekspedisi Menginap di Jalur Betung",
"source": "Kompas Regional",
"date": "2026-10-06T14:30:00Z"
}
]
}Rincian Parameter Request:
scenario(string, required): Kunci pengenal skenario (banjir,gempa,bbm,siber,listrik,kustom, dll.).scenario_label(string, required): Label judul skenario yang ditampilkan di UI.scenario_desc(string, required): Definisi cakupan disrupsi skenario.severity_level(enum, required): Skala intensitas asumsi (Ringan|Sedang|Berat|Kritis).region(string, required): Fokus wilayah simulasi (Nasionalatau salah satu dari 38 nama provinsi).duration(string, required): Estimasi rentang durasi disrupsi (misal:6 jam,3 hari,1 minggu,1 bulan).custom_entities(string | null): Wajib diisi jikascenario = "kustom", berisi entitas gabungan yang dimodelkan.detail_note(string | null): Catatan asumsi khusus dari analis untuk mempersempit fokus inferensi.basis_events(array of objects): Bukti empiris artikel berita nyata hasil seleksi Tahap 1 dari Elasticsearch.
B. Format Response Payload (POST /ai/simulate)
AIOS mengembalikan payload terstruktur yang telah divalidasi oleh JSON Schema Enforcement Guardrail:
{
"status": "success",
"simulation_id": "SIM-20261016-8942",
"result": {
"summary": "Gangguan pasokan solar subsidi selama 1 minggu di Sumatera Selatan berpotensi menahan 42% armada angkutan pangan regional, memicu deviasi inflasi pangan lokal hingga +1.4% dan risiko antrean kamtibmas di 8 titik lintas timur.",
"timeline_note": "Eskalasi tertinggi diproyeksikan pada hari ke-3 hingga ke-5 sebelum pasokan cadangan penyangga tiba.",
"confidence": 88,
"indicators": [
{
"name": "Kelancaran Distribusi Logistik",
"before": 85.0,
"after": 48.5,
"unit": "skor",
"direction": "bad"
},
{
"name": "Indeks Harga Pangan Pokok",
"before": 102.3,
"after": 114.7,
"unit": "poin",
"direction": "bad"
},
{
"name": "Indeks Stabilitas Kamtibmas",
"before": 90.0,
"after": 72.0,
"unit": "skor",
"direction": "bad"
}
],
"risiko_utama": [
"Keterlambatan pasokan komoditas sayur dan telur ke pasar induk Palembang dan sekitarnya.",
"Potensi gesekan fisik antrean pengemudi truk di simpul SPBU lintas batas provinsi.",
"Aksi penimbunan solar bersubsidi oleh oknum spekulan daerah."
],
"mitigasi": [
"Instruksikan Pertamina Patra Niaga menambah alokasi harian solar mobile storage sebesar 35% di 12 SPBU kantong.",
"Kerahkan personel kepolisian untuk pengamanan antrean dan pengaturan jalur prioritas truk sembako.",
"Buka posko koordinasi terpadu pemda bersama asosiasi logistik untuk pemantauan ketersediaan pangan 24 jam."
],
"cascade": [
{
"from": "Kelangkaan BBM Solar",
"to": "Kemacetan Jalur Lintas",
"effect": "Truk ekspedisi tertahan di bahu jalan lintas timur"
},
{
"from": "Kemacetan Jalur Lintas",
"to": "Keterlambatan Bahan Pangan",
"effect": "Kerusakan komoditas sayuran segar & penurunan mutu pangan"
},
{
"from": "Keterlambatan Bahan Pangan",
"to": "Kenaikan Harga Pasar",
"effect": "Pedagang menaikkan harga eceran hingga 15-20%"
}
],
"regional": [
{
"province": "Sumatera Selatan",
"score": -78,
"note": "Episentrum krisis; antrean kritis di jalur lintas Palembang-Betung"
},
{
"province": "Lampung",
"score": -52,
"note": "Dampak imbas antrean penyeberangan Bakauheni dan pasokan balik"
},
{
"province": "Jambi",
"score": -44,
"note": "Keterlambatan pasokan sembako yang melintasi jalur Sumatera Bagian Selatan"
},
{
"province": "Bengkulu",
"score": -31,
"note": "Hambatan jalur distribusi logistik lintas pegunungan tengah"
},
{
"province": "DKI Jakarta",
"score": -18,
"note": "Keterlambatan minor pasokan hortikultura asal Sumatera"
}
]
}
}Penjelasan Elemen Response:
simulation_id: Pengenal unik sesi simulasi (digunakan sebagai ID saat disimpan ke PostgreSQLsimulation_runs).result.summary: Narasi ringkasan eksekutif untuk pengambil keputusan.result.timeline_note: Proyeksi waktu puncak krisis (peak crisis timeline).result.confidence: Skor keyakinan model kausalitas (0–100%).result.indicators: Deviasi numerik indikator makro sebelum vs sesudah krisis (before,after,unit,direction: "good" | "bad").result.risiko_utama: Daftar ancaman risiko terberat yang diidentifikasi model.result.mitigasi: Langkah aksi taktis terkoordinasi berurutan (ordered mitigation roadmap).result.cascade: Array relasi graf berjenjang (from➔to➔effect) untuk visualisasi diagram efek domino.result.regional: Sebaran dampak per provinsi (province,scorebertanda negatif untuk tingkat keparahan,notespesifik daerah) untuk di-plot pada peta interaktif Leaflet.
6. Skema Penyimpanan Hasil (simulation_runs)
Setiap pengujian skenario dicatat secara permanen ke tabel relasional PostgreSQL simulation_runs untuk keperluan perbandingan skenario (what-if comparison) dan riwayat audit:
CREATE TABLE IF NOT EXISTS simulation_runs (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
user_id uuid REFERENCES users(id) ON DELETE SET NULL,
scenario varchar(100) NOT NULL, -- misal: 'bbm', 'banjir', 'siber'
scenario_label varchar(200), -- 'Kelangkaan BBM'
severity_level varchar(50) NOT NULL, -- 'Ringan', 'Sedang', 'Berat', 'Kritis'
region varchar(100) NOT NULL, -- 'Nasional' atau nama provinsi
duration varchar(50) NOT NULL, -- '3 hari', '1 minggu'
detail_note text, -- Asumsi tambahan analis
basis_events jsonb DEFAULT '[]'::jsonb, -- Cuplikan berita nyata jangkar simulasi
result_json jsonb NOT NULL, -- Full payload hasil inferensi AI
confidence real NOT NULL, -- Tingkat keyakinan model (0-100%)
executed_at timestamptz DEFAULT now(),
created_at timestamptz DEFAULT now()
);
CREATE INDEX IF NOT EXISTS sim_scenario_idx ON simulation_runs (scenario);
CREATE INDEX IF NOT EXISTS sim_region_idx ON simulation_runs (region);
CREATE INDEX IF NOT EXISTS sim_executed_at_idx ON simulation_runs (executed_at);7. Integrasi Antarmuka & Endpoint API
| Aksi Pengguna di UI | Metode & Endpoint | Tujuan Layanan | Payload / Query Param |
|---|---|---|---|
| Pilih Skenario & Wilayah | GET /scrape/scenario-events | Mengambil 10–15 berita relevan dari Elasticsearch | ?scenario={key}®ion={region} |
| Klik "Jalankan Simulasi" | POST /ai/simulate | Menjalankan penalaran kausalitas AI komprehensif | { scenario, severity_level, region, duration, detail_note, basis_events } |
| Buka Riwayat Simulasi | GET /ai/simulations/history | Mengambil daftar riwayat sesi pengujian lampau | ?limit=20&page=1 |
| Detail Sesi Lampau | GET /ai/simulations/:id | Memuat ulang visualisasi hasil simulasi tertentu | params: { id } |
decision_intelligence
Alur penalaran strategis AI per isu nasional & perumusan rekomendasi mitigasi pimpinan (03:00 WIB) ke dalam indeks Elasticsearch decision_intelligence.
pillar_intelligence
Alur sintesis penalaran LLM batch harian (03:00 WIB) untuk menghasilkan rekomendasi mitigasi pimpinan ke dalam indeks Elasticsearch pillar_intelligence.