{"ok":true,"pack":{"pack_version":"evidence-pack-1.0","generated_at":"2026-07-04T22:34:52.617Z","deterministic_content":true,"model":{"name":"ForestGuard SentinelCore","full_name":"ForestGuard SentinelCore — Evidence-Calibrated Wildfire Decision Engine","version":"SentinelCore v1.0","positioning":"NASA FIRMS detects thermal anomalies. SentinelCore decides what they mean locally."},"model_card":{"model_name":"ForestGuard SentinelCore","model_full_name":"ForestGuard SentinelCore — Evidence-Calibrated Wildfire Decision Engine","model_version":"SentinelCore v1.0","positioning":"NASA FIRMS detects thermal anomalies. SentinelCore decides what they mean locally.","model_type":"transparent, deterministic, evidence-calibrated decision engine (original to ForestGuard; proprietary to this project; fully inspectable)","original_to_forestguard":true,"not_ai_detector":true,"composes":["F-GRADE 3.0 (active-episode scoring)","F-CAST V2 (pre-ignition fire-weather forecasting)","Wind-forward attention cone (spread attention)","FG-CIE v1.0 decision core (mode formulas + model trace)"],"decision_modes":["no_fire_weather_risk — usable forecast, no FIRMS evidence, peak-24h F-CAST below the elevated threshold","pre_ignition_risk — usable forecast, no FIRMS evidence, elevated fire-weather; never implies a fire exists","candidate_hotspot — thermal evidence exists but fails the corroboration gate; reports P_true_fire and uncertainty, never a confirmed fire","active_fire_episode — a corroborated episode exists; F-GRADE scores it","spread_attention — secondary mode when an active episode has a downwind attention cone; never an exact spread path","data_insufficient — neither usable weather nor fire evidence; the engine says so instead of guessing"],"evidence_graph":"Every run ships a typed node/edge graph (target, detections, episode, forecast, land cover, regional context, source quality, community feedback, model output) with weighted, reasoned relations: near_target, belongs_to_episode, enriches, increases_risk, decreases_confidence, explains, contradicts, confirms. Risk-edge weights are the formula weights actually used.","state_machine":"A deterministic six-mode state machine with an ordered audit trail, required action families and PROHIBITED CLAIMS per mode (e.g. pre_ignition_risk may never say \"fire detected\"; candidate_hotspot may never say \"confirmed fire\"; spread_attention may never claim an exact spread path).","calibration":"Explicit calibration layer (cal-1.0.0): default_transparent_prior with reliability band \"uncalibrated\" and a widening confidence interval until a real historical-archive backtest is recorded; a recorded backtest switches the method to backtest_adjusted (band \"indicative\") with documented false-alarm damping. Demo fixtures never qualify as calibration input.","counterfactuals":"Threshold-derived counterfactuals computed from current inputs (e.g. RH below 32%, rainfall above 2 mm, corroboration-gate deficits, severity-boundary distances, source-quality gaps) — each with variable, current value, threshold and the documented rule it came from.","input_families":["Target point / area of interest (lat, lon, optional AOI)","NASA FIRMS active-fire evidence (detections, clustered episodes, confidence, FRP)","Open-Meteo forecast weather (0–48h hourly: temperature, humidity, wind, gusts, precipitation, pressure, VPD, soil moisture)","Vietnam regional context packs (fuel profile, peak fire season, agricultural-burning uncertainty)","Land-cover / fuel class (ESA WorldCover mapping; heuristic fallback clearly flagged)","Source quality metadata (provider, valid time, latency, status, uncertainty)","Community feedback tallies (confirmations, false-alarm and agricultural-burn reports)"],"output_families":["Calibrated score (0–100) with raw score, method, reliability band and confidence interval","Primary decision mode + secondary modes + state reason + prohibited claims","Evidence graph (typed nodes, weighted reasoned edges)","Counterfactual explanations (threshold-derived)","Structured recommended actions (label, priority, reason, safety note)","Per-source model effect (supports_evidence / decreases_confidence / increases_uncertainty / unavailable_optional / benchmark_only)","Full model trace (decision core + state transitions + calibration) and machine-readable explanation JSON"],"data_sources":["NASA FIRMS (LANCE) VIIRS/MODIS active-fire products","Open-Meteo forecast model API (no key required)","ESA WorldCover 10m land cover (2021)","ForestGuard Vietnam regional context pack (project-curated)"],"known_limitations":["Satellite active-fire detections are not ground-confirmed; false positives (industrial heat, agricultural burning, sun glint) are possible.","Peat and understory fires can be under-detected; absence of a hotspot does not mean absence of fire.","Weather inputs are forecast model data, not physical sensors; uncertainty grows with horizon.","Spread attention cones are wind-forward geometric zones, not a physical fire-spread simulation.","The default land-cover sampler is a regional heuristic, not a live WorldCover raster lookup (flagged in source quality).","Calibration currently ships as a transparent identity prior (cal-1.0.0); No historical calibration run has been completed for this region yet.","Regional context boundaries are approximate demonstration polygons, not authoritative forest-management boundaries."],"ethical_safeguards":["Not a black-box AI model: every score is a documented, deterministic formula with an inspectable trace.","Not guaranteed fire prediction: outputs are decision-support signals, never certainties.","The engine never claims an active fire without corroborated thermal evidence.","Data gaps are surfaced as explicit source-quality warnings, never silently filled.","Demo data is always labelled demo; the engine never fakes a live feed.","Recommended actions for unverified signals stay at \"monitor / verify safely\", never \"respond to fire\".","Prohibited claims are a machine-checked part of every report, not a style guide.","Calibration status is always explicit: an uncalibrated region says so in the report itself."],"safety_disclaimer":"TerraSentinel is a decision-support tool and does not replace official emergency services, government warnings, or professional environmental management decisions."},"compute_strategy":{"headline":"Vercel serves the product and lightweight inference; Supabase/PostGIS stores geospatial evidence and model outputs; external workers run batch calibration, backtesting, and raster feature extraction when the workload exceeds serverless request limits.","tiers":[{"key":"vercel","name":"Vercel (Next.js App Router)","role":"Product UI, API routes, and single lightweight SentinelCore inference per request.","runs":["UI pages and map surfaces","GET/POST /api/sentinelcore/run — one engine run per request","Per-point Open-Meteo forecast fetch (cached)","Reads of Supabase-processed data (episodes, alerts, scores)","Job enqueue/status API (thin DB reads/writes)"],"never_runs":["Batch backtests or multi-region sweeps","Raster / satellite-imagery processing","Scheduled ingestion (no reliable free-tier scheduler)","Anything that needs more than a few seconds of CPU per request"]},{"key":"supabase_postgis","name":"Supabase Postgres + PostGIS","role":"Geospatial evidence store, caches, job queue, and model-output persistence.","runs":["Detections, episodes, scores, alerts (GIST-indexed geography)","Weather / F-CAST grid caches with expiry","Historical archive tables (replay + backtesting)","sentinel_jobs / sentinel_artifacts / sentinel_calibration_profiles / sentinel_backtest_runs"],"never_runs":["Long-running CPU work inside SQL","External raster processing"]},{"key":"supabase_edge","name":"Supabase Edge Functions (Deno) + pg_cron","role":"Scheduled near-real-time pipeline: ingest → cluster → enrich → score → alert.","runs":["Live FIRMS ingestion (every ~30 min)","Weather enrichment + weather-grid refresh","Episode clustering, impact cones, F-GRADE scoring, alert generation"],"never_runs":["Multi-day backtests (per-invocation CPU/time limits)","Raster sampling beyond point heuristics"]},{"key":"external_worker","name":"External worker (scripts/workers/sentinel-worker.ts)","role":"Optional heavy-compute tier: leases sentinel_jobs from the queue; runs locally, in GitHub Actions, or on Cloud Run. Earth Engine is the optional path for raster/landcover/burn-scar features.","runs":["Historical FIRMS / Open-Meteo archive imports (bounded batches)","Large backtests and regional calibration profiles","Evidence-pack generation as a stored artifact","Landcover / raster sampling and Sentinel-2 NBR burn-scar features (scaffolded; Earth Engine or COG reads)"],"never_runs":["Serving user traffic","Anything requiring Vercel to be up"]},{"key":"demo_local","name":"Demo / local (zero secrets)","role":"Deterministic in-process runs so the whole product works with no credentials.","runs":["Bundled demo scenarios through the full engine","Demo backtest fixture (labelled bundled_demo_fixture, never calibration input)","Safe local jobs: backtest_demo, generate_evidence_pack"],"never_runs":["Anything presented as live or historical data"]}],"budget":[{"key":"sentinelcore_single_run","workload":"Online single SentinelCore run (one target)","tier":"vercel","per_run_budget":"~5–20 ms CPU + 0–2 upstream fetches (Open-Meteo ~0.2–1 s, Supabase read ~50–200 ms)","request_safe":true,"basis":"Pure-TS composition of F-GRADE/F-CAST over ≤48 forecast hours and ≤200 nearby detections."},{"key":"firms_ingestion","workload":"Live FIRMS ingestion (per scheduled tick)","tier":"supabase_edge","per_run_budget":"1 CSV fetch per source (~1–5 s each) + idempotent upsert of 10²–10³ rows","request_safe":false,"basis":"Needs a scheduler and service-role writes; Vercel Hobby has no reliable cron."},{"key":"openmeteo_grid","workload":"Open-Meteo weather grid refresh (bbox)","tier":"supabase_edge","per_run_budget":"≤60 sampled points (hard cap), batched requests, ~1–4 s; cached in weather_grid_cache","request_safe":false,"basis":"FCAST_WEATHER_GRID_MAX_POINTS cap; per-request fetch on Vercel only for single points."},{"key":"fgrade_fcast_scoring","workload":"F-GRADE / F-CAST scoring (per episode / per hour)","tier":"supabase_edge","per_run_budget":"µs–ms of pure arithmetic per item; O(episodes) or O(hours)","request_safe":true,"basis":"Transparent formula engines in src/lib/fgrade + src/lib/fcast; also run per-request on Vercel."},{"key":"backtest_small","workload":"Backtest small (1 region, ≤62 days, ~1.5k hourly rows)","tier":"external_worker","per_run_budget":"2 archive queries (≤5k + ≤20k rows) + ~1.5k F-CAST runs + matching: seconds","request_safe":true,"basis":"Fits one request today via POST /api/backtest/run, but belongs on the worker so growth never breaks the API tier."},{"key":"backtest_large","workload":"Backtest large (multi-region / multi-season / parameter sweeps)","tier":"external_worker","per_run_budget":"10⁵–10⁷ F-CAST runs + matching; minutes–hours, >512 MB working set","request_safe":false,"basis":"Exceeds serverless request/CPU/memory limits by construction; queue via sentinel_jobs."},{"key":"landcover_raster","workload":"Landcover / raster sampling (ESA WorldCover)","tier":"external_worker","per_run_budget":"COG window reads or Earth Engine reduceRegions; 10²–10⁴ points per batch, seconds–minutes","request_safe":false,"basis":"Raster IO and geospatial libs do not belong in a request path; current in-app sampler is a flagged heuristic."},{"key":"sentinel2_nbr","workload":"Sentinel-2 burn scar / NBR differencing","tier":"external_worker","per_run_budget":"Two dated composites + dNBR per episode AOI; GB-scale imagery, minutes per episode (Earth Engine recommended)","request_safe":false,"basis":"Imagery compute must run where the pixels live (Earth Engine / Cloud Run batch), results land in sentinel_artifacts."}],"placement_rules":["Vercel handles UI, API and single-target inference only — nothing scheduled, nothing batch.","Supabase owns persistence, geospatial queries, caches and the sentinel_jobs queue; Edge Functions + pg_cron own the scheduled NRT pipeline.","External workers lease queued jobs for batch backtests, archive imports, calibration and raster features — they never require Vercel.","Earth Engine is the optional raster path (landcover, Sentinel-2 NBR); Cloud Run is the optional always-on worker host.","Demo/local keeps every capability runnable with zero secrets, clearly labelled, and never used for calibration."],"doc_path":"docs/architecture/compute-strategy.md"},"scenario_suite":{"count":6,"all_modes_match_expected":true,"runs":[{"key":"u-minh-peatland","name":"U Minh peatland episode","blurb":"Persistent multi-sensor hotspots over peat-swamp forest — smouldering risk, high ecological exposure.","ok":true,"expected_mode":"active_fire_episode","expected_sentinel_modes":["active_fire_episode"],"mode":"active_fire_episode","mode_label":"Active fire episode","mode_matches_expected":true,"secondary_modes":["spread_attention"],"score":68.6,"severity":"High","confidence":"High","reliability_band":"uncalibrated","state_reason":"Episode episode-1 is corroborated (8 detections, 3 source(s), max FRP 41 MW) — active fire episode. Wind-forward attention is directed NW (attention zone, not an exact spread path).","counterfactuals":5,"evidence_nodes":18,"evidence_edges":27,"summary":"Active fire episode near U Minh Peatland Fire Risk (U Minh Peatland Forests): corroborated episode with combined risk High (score 68.6/100, confidence High). Downwind spread attention is active (attention zone, not an exact path)."},{"key":"central-highlands","name":"Central Highlands dry season","blurb":"Growing dry-season forest fire at the agricultural interface.","ok":true,"expected_mode":"active_fire_episode","expected_sentinel_modes":["active_fire_episode"],"mode":"active_fire_episode","mode_label":"Active fire episode","mode_matches_expected":true,"secondary_modes":["spread_attention"],"score":58.3,"severity":"Watch","confidence":"High","reliability_band":"uncalibrated","state_reason":"Episode episode-1 is corroborated (5 detections, 2 source(s), max FRP 28 MW) — active fire episode. Wind-forward attention is directed W (attention zone, not an exact spread path).","counterfactuals":5,"evidence_nodes":15,"evidence_edges":21,"summary":"Active fire episode near Central Highlands Dry-Season Fire (Central Highlands): corroborated episode with combined risk Watch (score 58.3/100, confidence High). Downwind spread attention is active (attention zone, not an exact path)."},{"key":"north-central-coast","name":"North Central Coast pine / hot dry wind","blurb":"Pine forest under hot dry foehn (Lào) winds — very high spread potential.","ok":true,"expected_mode":"active_fire_episode","expected_sentinel_modes":["active_fire_episode"],"mode":"active_fire_episode","mode_label":"Active fire episode","mode_matches_expected":true,"secondary_modes":["spread_attention"],"score":69.6,"severity":"High","confidence":"High","reliability_band":"uncalibrated","state_reason":"Episode episode-1 is corroborated (4 detections, 2 source(s), max FRP 44 MW) — active fire episode. Wind-forward attention is directed E (attention zone, not an exact spread path).","counterfactuals":4,"evidence_nodes":16,"evidence_edges":21,"summary":"Active fire episode near North Central Coast Pine / Hot Dry Wind (North Central Coast): corroborated episode with combined risk High (score 69.6/100, confidence High). Downwind spread attention is active (attention zone, not an exact path)."},{"key":"northwest-ag-burning","name":"Northwest agricultural burning uncertainty","blurb":"Few short-lived detections over cropland in shifting-cultivation season — likely managed burning.","ok":true,"expected_mode":"candidate_hotspot","expected_sentinel_modes":["candidate_hotspot"],"mode":"candidate_hotspot","mode_label":"Candidate hotspot (unverified)","mode_matches_expected":true,"secondary_modes":[],"score":6.9,"severity":"Low","confidence":"Low","reliability_band":"uncalibrated","state_reason":"Episode episode-1 exists but is not corroborated (2 detection(s), 1 source(s)) — candidate hotspot, never an active-fire claim.","counterfactuals":7,"evidence_nodes":11,"evidence_edges":15,"summary":"Candidate hotspot (unverified) near Northwest Agricultural Burning Uncertainty (Northwest Vietnam): thermal evidence is too thin to confirm an active fire (score 6.9/100, confidence Low). Verify safely — this is not a confirmed fire."},{"key":"no-fire-high-risk-weather","name":"No-fire high-risk weather day","blurb":"Zero detections, but hot / dry / windy forecast conditions — pre-ignition fire-weather risk only.","ok":true,"expected_mode":"pre_ignition_forecast","expected_sentinel_modes":["pre_ignition_risk","no_fire_weather_risk"],"mode":"pre_ignition_risk","mode_label":"Pre-ignition fire-weather risk","mode_matches_expected":true,"secondary_modes":[],"score":93.5,"severity":"Critical","confidence":"Moderate","reliability_band":"uncalibrated","state_reason":"No FIRMS evidence nearby; forecast fire-weather peaks at 93.5/100 within 24h (≥ 35) — elevated pre-ignition conditions, no fire implied.","counterfactuals":3,"evidence_nodes":8,"evidence_edges":8,"summary":"Pre-ignition fire-weather risk near Pine belt — no detections (North Central Coast): Critical fire-weather conditions (score 93.5/100) within the next 24h. This forecasts conditions, not a fire."},{"key":"candidate-low-confidence","name":"Candidate hotspot, low confidence","blurb":"A single low-confidence detection in mild, humid weather — high uncertainty, verify safely.","ok":true,"expected_mode":"candidate_hotspot","expected_sentinel_modes":["candidate_hotspot"],"mode":"candidate_hotspot","mode_label":"Candidate hotspot (unverified)","mode_matches_expected":true,"secondary_modes":[],"score":25.7,"severity":"Low","confidence":"Low","reliability_band":"uncalibrated","state_reason":"Episode episode-1 exists but is not corroborated (1 detection(s), 1 source(s)) — candidate hotspot, never an active-fire claim.","counterfactuals":7,"evidence_nodes":10,"evidence_edges":12,"summary":"Candidate hotspot (unverified) near Single unverified detection (Central Highlands): thermal evidence is too thin to confirm an active fire (score 25.7/100, confidence Low). Verify safely — this is not a confirmed fire."}]},"example_report":{"report_id":"example-sentinelcore-report","model_name":"ForestGuard SentinelCore","model_full_name":"ForestGuard SentinelCore — Evidence-Calibrated Wildfire Decision Engine","model_version":"SentinelCore v1.0","engine_composition":["F-GRADE 3.0 (active-episode scoring)","F-CAST V2 (pre-ignition fire-weather forecasting)","Wind-forward attention cone (spread attention)","FG-CIE v1.0 decision core (mode formulas + model trace)"],"created_at":"2026-03-15T06:00:00.000Z","data_mode":"demo","mode":"active_fire_episode","secondary_modes":["spread_attention"],"score":69.6,"severity":"High","confidence":"High","state_reason":"Episode episode-1 is corroborated (4 detections, 2 source(s), max FRP 44 MW) — active fire episode. Wind-forward attention is directed E (attention zone, not an exact spread path).","state":{"primary_mode":"active_fire_episode","secondary_modes":["spread_attention"],"reason":"Episode episode-1 is corroborated (4 detections, 2 source(s), max FRP 44 MW) — active fire episode. Wind-forward attention is directed E (attention zone, not an exact spread path).","transitions":["R1 data_insufficient: usable forecast=true, FIRMS events=7","R4 candidate gate: episode=episode-1, corroborated=true","R5 active_fire_episode: episode episode-1 passed the corroboration gate","R6 spread_attention: downwind cone=true"],"required_actions":["official_guidance","notify_managers","safe_confirmation","monitor_downwind","no_exact_spread_claims"],"prohibited_claims":["exact fire perimeter","guaranteed containment outcome","official evacuation order","exact spread path","exact spread prediction","physical fire-spread simulation","guaranteed spread direction"]},"evidence_graph":{"nodes":[{"id":"target","type":"target","label":"North Central Coast Pine / Hot Dry Wind","timestamp":"2026-03-15T06:00:00.000Z","provider":"ForestGuard run input","value":"18.600, 105.700","confidence":null,"uncertainty":null,"metadata":{"aoi_id":null}},{"id":"model_output","type":"model_output","label":"SentinelCore active_fire_episode · score 69.6","timestamp":"2026-03-15T06:00:00.000Z","provider":"ForestGuard SentinelCore","value":69.6,"confidence":0.85,"uncertainty":"low","metadata":{"mode":"active_fire_episode","secondary_modes":["spread_attention"],"severity":"High"}},{"id":"firms:north-central-coast-0-VIIRS_SNPP_NRT:18.6000:105.7000:2026-03-15:0200","type":"firms_detection","label":"VIIRS detection (N)","timestamp":"2026-03-15T02:00:00.000Z","provider":"NASA FIRMS","value":"FRP 34 MW","confidence":0.9,"uncertainty":"low","metadata":{"source":"VIIRS_SNPP_NRT","frp":34,"brightness":338,"confidence_raw":"h","distance_km":0}},{"id":"firms:north-central-coast-1-VIIRS_SNPP_NRT:18.6081:105.7051:2026-03-15:0300","type":"firms_detection","label":"VIIRS detection (N)","timestamp":"2026-03-15T03:00:00.000Z","provider":"NASA FIRMS","value":"FRP 38 MW","confidence":0.9,"uncertainty":"low","metadata":{"source":"VIIRS_SNPP_NRT","frp":38,"brightness":341,"confidence_raw":"h","distance_km":1.05}},{"id":"firms:north-central-coast-2-VIIRS_SNPP_NRT:18.6163:105.7102:2026-03-15:0400","type":"firms_detection","label":"VIIRS detection (N)","timestamp":"2026-03-15T04:00:00.000Z","provider":"NASA FIRMS","value":"FRP 42 MW","confidence":0.9,"uncertainty":"low","metadata":{"source":"VIIRS_SNPP_NRT","frp":42,"brightness":344,"confidence_raw":"h","distance_km":2.11}},{"id":"firms:north-central-coast-3-VIIRS_SNPP_NRT:18.6244:105.7154:2026-03-15:0500","type":"firms_detection","label":"VIIRS detection (N)","timestamp":"2026-03-15T05:00:00.000Z","provider":"NASA FIRMS","value":"FRP 46 MW","confidence":0.9,"uncertainty":"low","metadata":{"source":"VIIRS_SNPP_NRT","frp":46,"brightness":347,"confidence_raw":"h","distance_km":3.16}},{"id":"firms:north-central-coast-4-VIIRS_NOAA20_NRT:18.6000:105.7000:2026-03-15:0230","type":"firms_detection","label":"VIIRS detection (1)","timestamp":"2026-03-15T02:30:00.000Z","provider":"NASA FIRMS","value":"FRP 40 MW","confidence":0.9,"uncertainty":"low","metadata":{"source":"VIIRS_NOAA20_NRT","frp":40,"brightness":345,"confidence_raw":"h","distance_km":0}},{"id":"firms:north-central-coast-5-VIIRS_NOAA20_NRT:18.6090:105.7057:2026-03-15:0340","type":"firms_detection","label":"VIIRS detection (1)","timestamp":"2026-03-15T03:40:00.000Z","provider":"NASA FIRMS","value":"FRP 44 MW","confidence":0.9,"uncertainty":"low","metadata":{"source":"VIIRS_NOAA20_NRT","frp":44,"brightness":348,"confidence_raw":"h","distance_km":1.17}},{"id":"firms:north-central-coast-6-VIIRS_NOAA20_NRT:18.6181:105.7114:2026-03-15:0450","type":"firms_detection","label":"VIIRS detection (1)","timestamp":"2026-03-15T04:50:00.000Z","provider":"NASA FIRMS","value":"FRP 48 MW","confidence":0.9,"uncertainty":"low","metadata":{"source":"VIIRS_NOAA20_NRT","frp":48,"brightness":351,"confidence_raw":"h","distance_km":2.34}},{"id":"episode:episode-1","type":"fire_episode","label":"Fire episode (4 detections, 2 source(s))","timestamp":"2026-03-15T03:40:00.000Z","provider":"ForestGuard clustering (NASA FIRMS input)","value":"max FRP 44 MW","confidence":0.9,"uncertainty":"low","metadata":{"episode_id":"episode-1","status":"spreading","first_seen_at":"2026-03-15T02:00:00.000Z","corroborated":true}},{"id":"weather_forecast","type":"weather_forecast","label":"Forecast 49h (demo-forecast-model)","timestamp":"2026-03-15T06:00:00.000Z","provider":"demo-forecast-model","value":"peak 24h F-CAST 93.5","confidence":0.5,"uncertainty":"moderate","metadata":{"hours":49,"peak_horizon":"+1h","synthetic_demo":true}},{"id":"landcover","type":"landcover","label":"Land cover: tree","timestamp":null,"provider":"ESA WorldCover (regional heuristic sampler)","value":"tree","confidence":0.5,"uncertainty":"moderate","metadata":{"sampler":"regional heuristic, not a live raster lookup"}},{"id":"regional_context","type":"regional_context","label":"Context pack: North Central Coast","timestamp":null,"provider":"ForestGuard regional context (project-curated)","value":"pine forest under hot dry foehn winds","confidence":0.6,"uncertainty":"moderate","metadata":{"region_key":"north_central_coast","peak_months":[5,6,7,8],"month":3}},{"id":"source:active_fires","type":"source_quality","label":"NASA FIRMS · demo","timestamp":"2026-03-15T05:00:00.000Z","provider":"NASA FIRMS","value":"demo","confidence":null,"uncertainty":"moderate","metadata":{"layer_key":"active_fires","latency_minutes":null}},{"id":"source:weather_forecast","type":"source_quality","label":"Open-Meteo · demo","timestamp":"2026-03-15T06:00:00.000Z","provider":"Open-Meteo","value":"demo","confidence":null,"uncertainty":"moderate","metadata":{"layer_key":"weather_forecast","latency_minutes":0}},{"id":"source:landcover","type":"source_quality","label":"ESA WorldCover · degraded","timestamp":null,"provider":"ESA WorldCover","value":"degraded","confidence":null,"uncertainty":"moderate","metadata":{"layer_key":"landcover","latency_minutes":null}}],"edges":[{"from":"model_output","to":"target","relation":"explains","weight":1,"reason":"The model output is the decision for this target."},{"from":"firms:north-central-coast-0-VIIRS_SNPP_NRT:18.6000:105.7000:2026-03-15:0200","to":"target","relation":"near_target","weight":1,"reason":"0 km from the target (search radius 30 km)."},{"from":"firms:north-central-coast-0-VIIRS_SNPP_NRT:18.6000:105.7000:2026-03-15:0200","to":"episode:episode-1","relation":"belongs_to_episode","weight":1,"reason":"Clustered into this episode by the sensor-aware spatiotemporal join."},{"from":"firms:north-central-coast-1-VIIRS_SNPP_NRT:18.6081:105.7051:2026-03-15:0300","to":"target","relation":"near_target","weight":0.96,"reason":"1.05 km from the target (search radius 30 km)."},{"from":"firms:north-central-coast-1-VIIRS_SNPP_NRT:18.6081:105.7051:2026-03-15:0300","to":"episode:episode-1","relation":"belongs_to_episode","weight":1,"reason":"Clustered into this episode by the sensor-aware spatiotemporal join."},{"from":"firms:north-central-coast-2-VIIRS_SNPP_NRT:18.6163:105.7102:2026-03-15:0400","to":"target","relation":"near_target","weight":0.93,"reason":"2.11 km from the target (search radius 30 km)."},{"from":"firms:north-central-coast-3-VIIRS_SNPP_NRT:18.6244:105.7154:2026-03-15:0500","to":"target","relation":"near_target","weight":0.89,"reason":"3.16 km from the target (search radius 30 km)."},{"from":"firms:north-central-coast-4-VIIRS_NOAA20_NRT:18.6000:105.7000:2026-03-15:0230","to":"target","relation":"near_target","weight":1,"reason":"0 km from the target (search radius 30 km)."},{"from":"firms:north-central-coast-4-VIIRS_NOAA20_NRT:18.6000:105.7000:2026-03-15:0230","to":"episode:episode-1","relation":"belongs_to_episode","weight":1,"reason":"Clustered into this episode by the sensor-aware spatiotemporal join."},{"from":"firms:north-central-coast-5-VIIRS_NOAA20_NRT:18.6090:105.7057:2026-03-15:0340","to":"target","relation":"near_target","weight":0.96,"reason":"1.17 km from the target (search radius 30 km)."},{"from":"firms:north-central-coast-5-VIIRS_NOAA20_NRT:18.6090:105.7057:2026-03-15:0340","to":"episode:episode-1","relation":"belongs_to_episode","weight":1,"reason":"Clustered into this episode by the sensor-aware spatiotemporal join."},{"from":"firms:north-central-coast-6-VIIRS_NOAA20_NRT:18.6181:105.7114:2026-03-15:0450","to":"target","relation":"near_target","weight":0.92,"reason":"2.34 km from the target (search radius 30 km)."},{"from":"episode:episode-1","to":"model_output","relation":"increases_risk","weight":0.44,"reason":"F-GRADE episode score contributes 44.5 score points (weight 0.72)."},{"from":"weather_forecast","to":"target","relation":"enriches","weight":1,"reason":"Hourly fire-weather forecast at the target point."},{"from":"weather_forecast","to":"model_output","relation":"increases_risk","weight":0.17,"reason":"Peak F-CAST (24h) contributes 16.8 score points (weight 0.18)."},{"from":"weather_forecast","to":"episode:episode-1","relation":"enriches","weight":1,"reason":"Forecast wind/humidity drive the episode spread-attention forecast."},{"from":"landcover","to":"model_output","relation":"enriches","weight":0.5,"reason":"Fuel class scales the F-CAST fuel-context term and spread-cone length."},{"from":"regional_context","to":"model_output","relation":"enriches","weight":0.3,"reason":"Regional fuel/seasonal context informs the exposure term."},{"from":"source:active_fires","to":"model_output","relation":"decreases_confidence","weight":0.3,"reason":"Bundled demo detections — clearly labelled, not current observations."},{"from":"source:weather_forecast","to":"model_output","relation":"decreases_confidence","weight":0.3,"reason":"Deterministic demo forecast synthesized offline — not model output from Open-Meteo."},{"from":"source:landcover","to":"model_output","relation":"decreases_confidence","weight":0.3,"reason":"Land cover \"tree\" from the regional heuristic sampler — an approximation, not a live WorldCover raster lookup."}],"summary":{"node_count":16,"edge_count":21,"detections_truncated":0,"risk_edges":2,"confidence_downgrades":0,"contradictions":0}},"submodel_outputs":{"fgrade":{"fire_episode_id":"episode-1","components":{"p_true_fire":0.9898,"episode_strength":0.4556,"spread_potential":0.9935,"exposure_impact":0.37,"context_modifier":0.65,"uncertainty_penalty":0},"final_score":61.8,"severity":"Watch","confidence_level":"High","reason_codes":[{"code":"PTF_HIGH_CONF","kind":"driver","label":"High satellite detection confidence"},{"code":"PTF_STRONG_FRP","kind":"driver","label":"Strong fire radiative power"},{"code":"PTF_MULTI_SENSOR","kind":"driver","label":"Confirmed by multiple satellites"},{"code":"EPI_MANY_EVENTS","kind":"driver","label":"4 clustered detections"},{"code":"EPI_MULTI_SOURCE","kind":"driver","label":"2 independent data sources"},{"code":"SPR_WIND","kind":"driver","label":"Strong wind (45 km/h)"},{"code":"SPR_GUST","kind":"driver","label":"Gusty conditions aiding spread"},{"code":"SPR_DRY","kind":"driver","label":"Low humidity (12%)"},{"code":"SPR_VPD","kind":"driver","label":"High vapour-pressure deficit (dry air)"},{"code":"SPR_HOT","kind":"driver","label":"High temperature (43°C)"},{"code":"SPR_NORAIN","kind":"driver","label":"No recent rainfall"},{"code":"EXP_VEG","kind":"driver","label":"Burnable land cover (tree)"},{"code":"EXP_PROTECTED","kind":"context","label":"Protected/high-risk context: North Central Coast"},{"code":"CTX_PACK","kind":"context","label":"North Central Coast — pine forest under hot dry foehn winds"},{"code":"UNC_PERSIST","kind":"driver","label":"Multiple detections persist over time"},{"code":"UNC_CONSENSUS","kind":"driver","label":"Multiple satellites agree"},{"code":"UNC_GROWTH","kind":"driver","label":"Episode is actively growing"},{"code":"ACT_0","kind":"action","label":"Keep under observation; await corroborating detections or weather change."},{"code":"ACT_1","kind":"action","label":"Always confirm with official emergency services before acting in the field."}],"explanation":{"summary":"Watch wildfire risk (F-GRADE 61.8/100, high confidence) in North Central Coast. Clustered from 4 satellite detections across 2 sources.","risk_score":61.8,"severity":"Watch","confidence":"High","main_drivers":["High satellite detection confidence","Strong fire radiative power","Confirmed by multiple satellites","4 clustered detections","2 independent data sources","Strong wind (45 km/h)"],"uncertainty_factors":[],"recommended_actions":["Keep under observation; await corroborating detections or weather change.","Always confirm with official emergency services before acting in the field."],"data_sources":["NASA FIRMS (satellite-based active-fire data, near-real-time)","Open-Meteo (weather forecast: thermal, convective, hydrological variables)","Open-Meteo Air Quality / Copernicus CAMS (pollutant concentrations)","Open-Meteo Flood / Copernicus GloFAS (river discharge)","ESA WorldCover 10m (land-cover context)","TerraSentinel Vietnam regional context pack"],"safety_disclaimer":"TerraSentinel is a decision-support tool and does not replace official emergency services, government warnings, or professional environmental management decisions."},"features":{"p_true_fire":{"confidence":0.9,"frpNorm":0.564,"brightnessNorm":0.8,"repeatScore":0.4,"consensusScore":0.667,"landcoverMatch":1,"fixedHotspot":0,"agBurning":0,"feedbackScore":0.5,"z":4.575},"episode_strength":{"eventCountScore":0.529,"sourceCountScore":0.5,"frpScore":0.539,"persistenceScore":0.139,"growthScore":0.467,"persistHours":1.67},"spread_potential":{"windScore":1,"gustScore":0.964,"lowHumidityScore":1,"vpdScore":1,"highTempScore":1,"noRainScore":1,"lowSoilScore":1},"exposure_impact":{"inside_aoi":0,"near_aoi":0,"cone_intersects_aoi":0,"nearest_aoi_km":-1},"context_modifier":{"in_pack":1,"in_season":0,"weight":0.75}}},"fcast":{"horizons":[{"horizon_hours":0,"label":"now","forecast_for_time":"2026-03-15T06:00:00.000Z","forecast_score":93.4,"severity":"Critical","sub_scores":{"dryness_score":0.9,"wind_spread_score":1,"heat_score":1,"no_rain_score":1,"vapour_pressure_deficit_score":1,"fuel_context_score":0.9,"pressure_trend_context":0.3},"main_drivers":["Low humidity (~12%)","Wind 45 km/h, gusts to 68 km/h","High temperature (~44°C)","Little to no forecast rainfall"],"uncertainty_factors":["Forecast model data, not a physical fire sensor"],"recommended_actions":["Pre-position resources and brief crews for the forecast window","Monitor AOIs downwind of any active or newly-detected heat","Cross-check with official warnings before acting"]},{"horizon_hours":1,"label":"+1h","forecast_for_time":"2026-03-15T07:00:00.000Z","forecast_score":93.5,"severity":"Critical","sub_scores":{"dryness_score":0.9,"wind_spread_score":1,"heat_score":1,"no_rain_score":1,"vapour_pressure_deficit_score":1,"fuel_context_score":0.9,"pressure_trend_context":0.3},"main_drivers":["Low humidity (~10%)","Wind 46 km/h, gusts to 69 km/h","High temperature (~44°C)","Little to no forecast rainfall"],"uncertainty_factors":["Forecast model data, not a physical fire sensor"],"recommended_actions":["Pre-position resources and brief crews for the forecast window","Monitor AOIs downwind of any active or newly-detected heat","Cross-check with official warnings before acting"]},{"horizon_hours":3,"label":"+3h","forecast_for_time":"2026-03-15T09:00:00.000Z","forecast_score":93.5,"severity":"Critical","sub_scores":{"dryness_score":0.9,"wind_spread_score":1,"heat_score":1,"no_rain_score":1,"vapour_pressure_deficit_score":1,"fuel_context_score":0.9,"pressure_trend_context":0.3},"main_drivers":["Low humidity (~10%)","Wind 46 km/h, gusts to 69 km/h","High temperature (~44°C)","Little to no forecast rainfall"],"uncertainty_factors":["Forecast model data, not a physical fire sensor"],"recommended_actions":["Pre-position resources and brief crews for the forecast window","Monitor AOIs downwind of any active or newly-detected heat","Cross-check with official warnings before acting"]},{"horizon_hours":6,"label":"+6h","forecast_for_time":"2026-03-15T12:00:00.000Z","forecast_score":93.5,"severity":"Critical","sub_scores":{"dryness_score":0.9,"wind_spread_score":1,"heat_score":1,"no_rain_score":1,"vapour_pressure_deficit_score":1,"fuel_context_score":0.9,"pressure_trend_context":0.3},"main_drivers":["Low humidity (~16%)","Wind 42 km/h, gusts to 64 km/h","High temperature (~43°C)","Little to no forecast rainfall"],"uncertainty_factors":["Forecast model data, not a physical fire sensor"],"recommended_actions":["Pre-position resources and brief crews for the forecast window","Monitor AOIs downwind of any active or newly-detected heat","Cross-check with official warnings before acting"]},{"horizon_hours":12,"label":"+12h","forecast_for_time":"2026-03-15T18:00:00.000Z","forecast_score":82.9,"severity":"High","sub_scores":{"dryness_score":0.8,"wind_spread_score":0.8,"heat_score":0.8,"no_rain_score":0.9,"vapour_pressure_deficit_score":1,"fuel_context_score":0.9,"pressure_trend_context":0.4},"main_drivers":["Low humidity (~32%)","Wind 31 km/h, gusts to 48 km/h","Little to no forecast rainfall","High temperature (~37°C)"],"uncertainty_factors":["Forecast model data, not a physical fire sensor"],"recommended_actions":["Heighten watch over exposed AOIs","Verify forecast against local weather stations"]},{"horizon_hours":24,"label":"+24h","forecast_for_time":"2026-03-16T06:00:00.000Z","forecast_score":93.4,"severity":"Critical","sub_scores":{"dryness_score":0.9,"wind_spread_score":1,"heat_score":1,"no_rain_score":1,"vapour_pressure_deficit_score":1,"fuel_context_score":0.9,"pressure_trend_context":0.3},"main_drivers":["Low humidity (~12%)","Wind 45 km/h, gusts to 68 km/h","High temperature (~44°C)","Little to no forecast rainfall"],"uncertainty_factors":["Forecast model data, not a physical fire sensor"],"recommended_actions":["Pre-position resources and brief crews for the forecast window","Monitor AOIs downwind of any active or newly-detected heat","Cross-check with official warnings before acting"]},{"horizon_hours":48,"label":"+48h","forecast_for_time":"2026-03-17T06:00:00.000Z","forecast_score":93.4,"severity":"Critical","sub_scores":{"dryness_score":0.9,"wind_spread_score":1,"heat_score":1,"no_rain_score":1,"vapour_pressure_deficit_score":1,"fuel_context_score":0.9,"pressure_trend_context":0.3},"main_drivers":["Low humidity (~12%)","Wind 45 km/h, gusts to 68 km/h","High temperature (~44°C)","Little to no forecast rainfall"],"uncertainty_factors":["Forecast model data, not a physical fire sensor"],"recommended_actions":["Pre-position resources and brief crews for the forecast window","Monitor AOIs downwind of any active or newly-detected heat","Cross-check with official warnings before acting"]}],"peak":{"horizon_hours":1,"label":"+1h","forecast_for_time":"2026-03-15T07:00:00.000Z","forecast_score":93.5,"severity":"Critical","sub_scores":{"dryness_score":0.9,"wind_spread_score":1,"heat_score":1,"no_rain_score":1,"vapour_pressure_deficit_score":1,"fuel_context_score":0.9,"pressure_trend_context":0.3},"main_drivers":["Low humidity (~10%)","Wind 46 km/h, gusts to 69 km/h","High temperature (~44°C)","Little to no forecast rainfall"],"uncertainty_factors":["Forecast model data, not a physical fire sensor"],"recommended_actions":["Pre-position resources and brief crews for the forecast window","Monitor AOIs downwind of any active or newly-detected heat","Cross-check with official warnings before acting"]},"peak_24h":{"horizon_hours":1,"label":"+1h","forecast_for_time":"2026-03-15T07:00:00.000Z","forecast_score":93.5,"severity":"Critical","sub_scores":{"dryness_score":0.9,"wind_spread_score":1,"heat_score":1,"no_rain_score":1,"vapour_pressure_deficit_score":1,"fuel_context_score":0.9,"pressure_trend_context":0.3},"main_drivers":["Low humidity (~10%)","Wind 46 km/h, gusts to 69 km/h","High temperature (~44°C)","Little to no forecast rainfall"],"uncertainty_factors":["Forecast model data, not a physical fire sensor"],"recommended_actions":["Pre-position resources and brief crews for the forecast window","Monitor AOIs downwind of any active or newly-detected heat","Cross-check with official warnings before acting"]}},"spread_forecast":{"fire_episode_id":"episode-1","generated_at":"2026-03-15T06:00:00.000Z","weather_source":"forecast_model","direction_of_concern_deg":94,"direction_of_concern_label":"E","peak_wind_gust":69.2,"min_humidity":10,"trend_score":83,"trend_severity":"High","cones":[{"fire_episode_id":"episode-1","horizon_hours":1,"cone":{"type":"Polygon","coordinates":[[[105.7027025,18.604295],[105.81872952118192,18.657875566480453],[105.82321321759275,18.64808777405294],[105.82677905007631,18.637966898488177],[105.82940002842042,18.627590017972718],[105.83105637012841,18.617036146056503],[105.83173564594244,18.60638562913443],[105.83143286905761,18.595719534217235],[105.83015052750886,18.5851190316726],[105.82789855965734,18.574664777641736],[105.82469427313026,18.564436300825147],[105.82056220799416,18.554511398284266],[105.81553394535933,18.544965544823928],[105.80964786300649,18.53587132040526],[105.7027025,18.604295]]]},"centroid":{"lon":105.7027025,"lat":18.604295},"wind_direction":274,"bearing_of_concern":94,"wind_speed":46.1,"wind_gust":69.2,"forecast_score":83,"severity":"High","uncertainty":"High","parameters":{"base_length_km":3,"wind_factor":2,"gust_factor":1.8,"dryness_factor":1.8,"context_factor":1.4,"rain_dampening":1,"horizon_factor":0.5,"cone_length_km":13.6,"cone_angle_deg":60},"forecast_for_time":"2026-03-15T07:00:00.000Z","created_at":"2026-03-15T06:00:00.000Z"},{"fire_episode_id":"episode-1","horizon_hours":3,"cone":{"type":"Polygon","coordinates":[[[105.7027025,18.604295],[105.87169030851442,18.668902731674198],[105.8769832844747,18.65469848910393],[105.88094870922498,18.640111143182583],[105.88355672651994,18.625251795693867],[105.88478783614244,18.610233590623462],[105.884633031671,18.59517085142843],[105.88309385796538,18.580178210232173],[105.88018238827067,18.565369735591208],[105.87592112145398,18.550858065462666],[105.87034280048135,18.536753551934524],[105.86349015382655,18.523163424164522],[105.8554155620593,18.510190975811486],[105.84618065239215,18.497934783034754],[105.7027025,18.604295]]]},"centroid":{"lon":105.7027025,"lat":18.604295},"wind_direction":278,"bearing_of_concern":98,"wind_speed":46.1,"wind_gust":69.2,"forecast_score":83,"severity":"High","uncertainty":"High","parameters":{"base_length_km":3,"wind_factor":2,"gust_factor":1.8,"dryness_factor":1.8,"context_factor":1.4,"rain_dampening":1,"horizon_factor":0.7,"cone_length_km":19.2,"cone_angle_deg":60},"forecast_for_time":"2026-03-15T09:00:00.000Z","created_at":"2026-03-15T06:00:00.000Z"},{"fire_episode_id":"episode-1","horizon_hours":6,"cone":{"type":"Polygon","coordinates":[[[105.7027025,18.604295],[105.911574103779,18.718393422216156],[105.92126677115493,18.70070639456156],[105.9292932182766,18.682286168472825],[105.93559281979492,18.66327314688674],[105.94011816366742,18.64381220292289],[105.94283539561798,18.624051572143543],[105.94372445880617,18.604141720658976],[105.94277922744072,18.584234197799262],[105.94000753390594,18.56448048214335],[105.93543108978702,18.545030829697488],[105.9290853019836,18.52603313294994],[105.92101898586793,18.5076317993988],[105.91129397818872,18.489966657957687],[105.7027025,18.604295]]]},"centroid":{"lon":105.7027025,"lat":18.604295},"wind_direction":270,"bearing_of_concern":90,"wind_speed":42.2,"wind_gust":63.8,"forecast_score":81,"severity":"High","uncertainty":"High","parameters":{"base_length_km":3,"wind_factor":2,"gust_factor":1.8,"dryness_factor":1.7,"context_factor":1.4,"rain_dampening":1,"horizon_factor":1,"cone_length_km":25.4,"cone_angle_deg":60},"forecast_for_time":"2026-03-15T12:00:00.000Z","created_at":"2026-03-15T06:00:00.000Z"},{"fire_episode_id":"episode-1","horizon_hours":12,"cone":{"type":"Polygon","coordinates":[[[105.7027025,18.604295],[105.84328987005597,18.68113469435147],[105.84981884528963,18.66922968502175],[105.85522689971992,18.656830731277875],[105.85947308261666,18.64403229377331],[105.86252531810408,18.6309318548404],[105.86436064191344,18.617629174228597],[105.86496536804998,18.604225528154874],[105.86433518435376,18.590822937507856],[105.86247517648997,18.57752339110815],[105.8593997804569,18.56442806994305],[105.85513266423811,18.551636578263896],[105.8497065397545,18.53924618736092],[105.84316290678555,18.527351097713495],[105.7027025,18.604295]]]},"centroid":{"lon":105.7027025,"lat":18.604295},"wind_direction":270,"bearing_of_concern":90,"wind_speed":30.8,"wind_gust":48,"forecast_score":57,"severity":"Watch","uncertainty":"High","parameters":{"base_length_km":3,"wind_factor":1.5,"gust_factor":1.4,"dryness_factor":1.4,"context_factor":1.4,"rain_dampening":1,"horizon_factor":1.4,"cone_length_km":17.1,"cone_angle_deg":60},"forecast_for_time":"2026-03-15T18:00:00.000Z","created_at":"2026-03-15T06:00:00.000Z"},{"fire_episode_id":"episode-1","horizon_hours":24,"cone":{"type":"Polygon","coordinates":[[[105.7027025,18.604295],[106.14050464262198,18.843007104477078],[106.16076798901861,18.80593690994514],[106.17753287109656,18.767334570615972],[106.19067375181646,18.727494805876475],[106.20009298156083,18.68672156780934],[106.20572146758741,18.645325705918356],[106.20751911955779,18.60362258584778],[106.20547507029141,18.561929680628808],[106.1996076726897,18.52056415297639],[106.18996427547506,18.479840447008048],[106.17662078199362,18.440067907470667],[106.15968099782401,18.40154844415094],[106.13927577431696,18.364574258617647],[105.7027025,18.604295]]]},"centroid":{"lon":105.7027025,"lat":18.604295},"wind_direction":270,"bearing_of_concern":90,"wind_speed":45.2,"wind_gust":68,"forecast_score":83,"severity":"High","uncertainty":"High","parameters":{"base_length_km":3,"wind_factor":2,"gust_factor":1.8,"dryness_factor":1.8,"context_factor":1.4,"rain_dampening":1,"horizon_factor":2,"cone_length_km":53.2,"cone_angle_deg":60},"forecast_for_time":"2026-03-16T06:00:00.000Z","created_at":"2026-03-15T06:00:00.000Z"}],"main_drivers":["Likely direction of concern: E (downwind)","Forecast wind gusts up to 69 km/h","Humidity down to ~10%","Flammable fuel context increases wind-forward reach"],"uncertainty_factors":["Forecast attention zone — not an exact fire-spread prediction"],"safety_note":"F-CAST forecasts fire-weather risk and likely attention zones. It does not guarantee that a fire will occur."},"hotspot":null,"decision_core":{"mode":"active_fire_episode","expression":"overall = 0.72 × F-GRADE final_score + 0.18 × peak F-CAST (24h) + 0.10 × spread_trend_score","components":[{"key":"fgrade","label":"F-GRADE episode score","weight":0.72,"value":61.8,"weighted":44.5,"available":true},{"key":"fcast_peak_24h","label":"Peak F-CAST fire-weather (24h)","weight":0.18,"value":93.5,"weighted":16.8,"available":true},{"key":"spread_trend","label":"Spread trend score","weight":0.1,"value":83,"weighted":8.3,"available":true}],"uncertainty_penalty":0,"mode_selection":["Episode episode-1 is corroborated (4 detections, 2 source(s), max FRP 44 MW, status \"spreading\") → active_fire_episode.","Active-episode formula applied: F-GRADE 61.8 dominates (weight 0.72)."],"notes":[]}},"calibration":{"raw_score":69.6,"calibrated_score":69.6,"calibration_method":"default_transparent_prior","calibration_version":"cal-1.0.0","reliability_band":"uncalibrated","confidence_interval":{"lower":55.6,"upper":83.6,"level":0.8},"adjustments":[{"key":"demo_widening","label":"Demo-data widening","delta":4,"reason":"Inputs are bundled demo data, not live observations."},{"key":"uncalibrated_widening","label":"Uncalibrated-region widening","delta":3,"reason":"No historical calibration run has been completed for this region yet."}],"backtest_reference":null,"notes":["No historical calibration run has been completed for this region yet.","The calibrated score equals the raw score under a transparent identity prior; treat the interval, not the point value, as the model output."]},"counterfactuals":[{"id":"cf-rh-recover","direction":"lowers_risk","statement":"Fire-weather risk would ease if relative humidity recovers above 60% (currently ~12%).","variable":"relative_humidity_2m","current_value":12,"threshold":"> 60%","computed_from":"F-CAST dryness sub-score (RH 85%→0, 20%→1)"},{"id":"cf-rain-relief","direction":"lowers_risk","statement":"Risk would decrease if rainfall exceeds 2 mm (currently 0 mm/h forecast) — 2 mm halves the no-rain term, 4 mm zeroes it.","variable":"precipitation","current_value":0,"threshold":"> 2 mm","computed_from":"F-CAST no-rain sub-score (1 − precip/4)"},{"id":"cf-severity-boundary","direction":"raises_risk","statement":"The severity band would move to Critical if the overall score rises by 15.4 points (currently 69.6, Critical starts at 85).","variable":"overall_score","current_value":69.6,"threshold":"≥ 85","computed_from":"shared severity thresholds (SEVERITY_THRESHOLDS)"},{"id":"cf-community-confirm","direction":"raises_confidence","statement":"Confidence would improve if a community member safely confirms (or disputes) this signal — no community feedback exists for it yet.","variable":"community_feedback","current_value":"none","threshold":"≥ 1 verified report","computed_from":"community-feedback evidence layer"}],"recommended_actions":[{"key":"official_guidance","label":"Check official emergency / fire-authority guidance now","priority":"immediate","reason":"A corroborated active fire episode exists near the target.","safety_note":"ForestGuard is decision support, not an official warning system — follow official emergency guidance first."},{"key":"notify_managers","label":"Notify local forest managers / responsible contacts if appropriate","priority":"immediate","reason":"Local managers can verify exposure and initiate the official response path.","safety_note":"Share the evidence trail (detections, times, confidence), not just the score."},{"key":"monitor_downwind","label":"Monitor downwind areas of interest through the forecast window","priority":"immediate","reason":"The wind-forward attention zone indicates where the episode could be pushed next.","safety_note":"The cone is an attention zone, not an exact spread path or a physical simulation."},{"key":"safe_confirmation","label":"Record ground confirmation ONLY if it can be obtained safely","priority":"routine","reason":"Confirmed episodes improve both this alert and the model’s evaluation record.","safety_note":"Never approach a suspected or active fire to verify it in person."},{"key":"no_exact_spread_claims","label":"Communicate the attention zone as uncertainty, never as a predicted path","priority":"routine","reason":"Overclaiming spread precision causes both over- and under-reaction downwind.","safety_note":"Wording rule enforced by the SentinelCore state machine (prohibited claims)."}],"source_quality":[{"provider":"NASA FIRMS","layer_key":"active_fires","source_type":"active_fire","valid_time":"2026-03-15T05:00:00.000Z","generated_at":null,"ingested_at":null,"latency_minutes":null,"spatial_resolution":"VIIRS 375 m / MODIS 1 km","temporal_resolution":"~2–4 satellite overpasses per day","coverage_status":"unknown","status":"demo","uncertainty_level":"moderate","message":"Bundled demo detections — clearly labelled, not current observations.","attribution":"NASA FIRMS (LANCE), VIIRS/MODIS active-fire products","details":{"events":7},"model_effect":"increases_uncertainty","model_effect_reason":"Demo/synthetic data is clearly labelled and widens the calibration interval.","required":true},{"provider":"Open-Meteo","layer_key":"weather_forecast","source_type":"weather_forecast","valid_time":"2026-03-15T06:00:00.000Z","generated_at":"2026-03-15T06:00:00.000Z","ingested_at":"2026-03-15T06:00:00.000Z","latency_minutes":0,"spatial_resolution":"~11 km (model grid, varies by model)","temporal_resolution":"Hourly","coverage_status":"full","status":"demo","uncertainty_level":"moderate","message":"Deterministic demo forecast synthesized offline — not model output from Open-Meteo.","attribution":"Open-Meteo.com (open weather model data)","details":{"hours":49,"source":"demo-forecast-model"},"model_effect":"increases_uncertainty","model_effect_reason":"Demo/synthetic data is clearly labelled and widens the calibration interval.","required":true},{"provider":"ForestGuard Vietnam context pack","layer_key":"regional_context","source_type":"landcover","valid_time":null,"generated_at":null,"ingested_at":null,"latency_minutes":null,"spatial_resolution":null,"temporal_resolution":"Static (project-curated)","coverage_status":"partial","status":"ok","uncertainty_level":"low","message":"Target is inside the \"North Central Coast\" context pack (pine forest under hot dry foehn winds).","attribution":"ForestGuard project-curated regional context (approximate demonstration boundaries)","details":{"region_key":"north_central_coast","peak_months":[5,6,7,8]},"model_effect":"supports_evidence","model_effect_reason":"Fresh and usable — this input contributes to the decision at full weight.","required":false},{"provider":"ESA WorldCover","layer_key":"landcover","source_type":"landcover","valid_time":null,"generated_at":null,"ingested_at":null,"latency_minutes":null,"spatial_resolution":"10 m (2021 map)","temporal_resolution":"Static (2021)","coverage_status":"partial","status":"degraded","uncertainty_level":"moderate","message":"Land cover \"tree\" from the regional heuristic sampler — an approximation, not a live WorldCover raster lookup.","attribution":"© ESA WorldCover project 2021 / Contains modified Copernicus Sentinel data","details":{"landcover":"tree"},"model_effect":"increases_uncertainty","model_effect_reason":"Aging or approximate data still contributes, but with wider uncertainty.","required":false}],"model_trace":{"run_id":"example-sentinelcore-report","created_at":"2026-03-15T06:00:00.000Z","model_version":"SentinelCore v1.0 (decision core FG-CIE v1.0)","input_summary":{"target":{"lat":18.6,"lon":105.7,"label":"North Central Coast Pine / Hot Dry Wind"},"data_mode":"demo","fire_events_nearby":7,"episode_id":"episode-1","episode_event_count":4,"forecast_source":"demo-forecast-model","forecast_hours":49,"region":"North Central Coast","landcover":"tree","month":3},"source_quality":[{"provider":"NASA FIRMS","layer_key":"active_fires","source_type":"active_fire","valid_time":"2026-03-15T05:00:00.000Z","generated_at":null,"ingested_at":null,"latency_minutes":null,"spatial_resolution":"VIIRS 375 m / MODIS 1 km","temporal_resolution":"~2–4 satellite overpasses per day","coverage_status":"unknown","status":"demo","uncertainty_level":"moderate","message":"Bundled demo detections — clearly labelled, not current observations.","attribution":"NASA FIRMS (LANCE), VIIRS/MODIS active-fire products","details":{"events":7}},{"provider":"Open-Meteo","layer_key":"weather_forecast","source_type":"weather_forecast","valid_time":"2026-03-15T06:00:00.000Z","generated_at":"2026-03-15T06:00:00.000Z","ingested_at":"2026-03-15T06:00:00.000Z","latency_minutes":0,"spatial_resolution":"~11 km (model grid, varies by model)","temporal_resolution":"Hourly","coverage_status":"full","status":"demo","uncertainty_level":"moderate","message":"Deterministic demo forecast synthesized offline — not model output from Open-Meteo.","attribution":"Open-Meteo.com (open weather model data)","details":{"hours":49,"source":"demo-forecast-model"}},{"provider":"ForestGuard Vietnam context pack","layer_key":"regional_context","source_type":"landcover","valid_time":null,"generated_at":null,"ingested_at":null,"latency_minutes":null,"spatial_resolution":null,"temporal_resolution":"Static (project-curated)","coverage_status":"partial","status":"ok","uncertainty_level":"low","message":"Target is inside the \"North Central Coast\" context pack (pine forest under hot dry foehn winds).","attribution":"ForestGuard project-curated regional context (approximate demonstration boundaries)","details":{"region_key":"north_central_coast","peak_months":[5,6,7,8]}},{"provider":"ESA WorldCover","layer_key":"landcover","source_type":"landcover","valid_time":null,"generated_at":null,"ingested_at":null,"latency_minutes":null,"spatial_resolution":"10 m (2021 map)","temporal_resolution":"Static (2021)","coverage_status":"partial","status":"degraded","uncertainty_level":"moderate","message":"Land cover \"tree\" from the regional heuristic sampler — an approximation, not a live WorldCover raster lookup.","attribution":"© ESA WorldCover project 2021 / Contains modified Copernicus Sentinel data","details":{"landcover":"tree"}}],"submodel_outputs":{"fgrade":{"fire_episode_id":"episode-1","components":{"p_true_fire":0.9898,"episode_strength":0.4556,"spread_potential":0.9935,"exposure_impact":0.37,"context_modifier":0.65,"uncertainty_penalty":0},"final_score":61.8,"severity":"Watch","confidence_level":"High","reason_codes":[{"code":"PTF_HIGH_CONF","kind":"driver","label":"High satellite detection confidence"},{"code":"PTF_STRONG_FRP","kind":"driver","label":"Strong fire radiative power"},{"code":"PTF_MULTI_SENSOR","kind":"driver","label":"Confirmed by multiple satellites"},{"code":"EPI_MANY_EVENTS","kind":"driver","label":"4 clustered detections"},{"code":"EPI_MULTI_SOURCE","kind":"driver","label":"2 independent data sources"},{"code":"SPR_WIND","kind":"driver","label":"Strong wind (45 km/h)"},{"code":"SPR_GUST","kind":"driver","label":"Gusty conditions aiding spread"},{"code":"SPR_DRY","kind":"driver","label":"Low humidity (12%)"},{"code":"SPR_VPD","kind":"driver","label":"High vapour-pressure deficit (dry air)"},{"code":"SPR_HOT","kind":"driver","label":"High temperature (43°C)"},{"code":"SPR_NORAIN","kind":"driver","label":"No recent rainfall"},{"code":"EXP_VEG","kind":"driver","label":"Burnable land cover (tree)"},{"code":"EXP_PROTECTED","kind":"context","label":"Protected/high-risk context: North Central Coast"},{"code":"CTX_PACK","kind":"context","label":"North Central Coast — pine forest under hot dry foehn winds"},{"code":"UNC_PERSIST","kind":"driver","label":"Multiple detections persist over time"},{"code":"UNC_CONSENSUS","kind":"driver","label":"Multiple satellites agree"},{"code":"UNC_GROWTH","kind":"driver","label":"Episode is actively growing"},{"code":"ACT_0","kind":"action","label":"Keep under observation; await corroborating detections or weather change."},{"code":"ACT_1","kind":"action","label":"Always confirm with official emergency services before acting in the field."}],"explanation":{"summary":"Watch wildfire risk (F-GRADE 61.8/100, high confidence) in North Central Coast. Clustered from 4 satellite detections across 2 sources.","risk_score":61.8,"severity":"Watch","confidence":"High","main_drivers":["High satellite detection confidence","Strong fire radiative power","Confirmed by multiple satellites","4 clustered detections","2 independent data sources","Strong wind (45 km/h)"],"uncertainty_factors":[],"recommended_actions":["Keep under observation; await corroborating detections or weather change.","Always confirm with official emergency services before acting in the field."],"data_sources":["NASA FIRMS (satellite-based active-fire data, near-real-time)","Open-Meteo (weather forecast: thermal, convective, hydrological variables)","Open-Meteo Air Quality / Copernicus CAMS (pollutant concentrations)","Open-Meteo Flood / Copernicus GloFAS (river discharge)","ESA WorldCover 10m (land-cover context)","TerraSentinel Vietnam regional context pack"],"safety_disclaimer":"TerraSentinel is a decision-support tool and does not replace official emergency services, government warnings, or professional environmental management decisions."},"features":{"p_true_fire":{"confidence":0.9,"frpNorm":0.564,"brightnessNorm":0.8,"repeatScore":0.4,"consensusScore":0.667,"landcoverMatch":1,"fixedHotspot":0,"agBurning":0,"feedbackScore":0.5,"z":4.575},"episode_strength":{"eventCountScore":0.529,"sourceCountScore":0.5,"frpScore":0.539,"persistenceScore":0.139,"growthScore":0.467,"persistHours":1.67},"spread_potential":{"windScore":1,"gustScore":0.964,"lowHumidityScore":1,"vpdScore":1,"highTempScore":1,"noRainScore":1,"lowSoilScore":1},"exposure_impact":{"inside_aoi":0,"near_aoi":0,"cone_intersects_aoi":0,"nearest_aoi_km":-1},"context_modifier":{"in_pack":1,"in_season":0,"weight":0.75}}},"fcast":{"horizons":[{"horizon_hours":0,"label":"now","forecast_for_time":"2026-03-15T06:00:00.000Z","forecast_score":93.4,"severity":"Critical","sub_scores":{"dryness_score":0.9,"wind_spread_score":1,"heat_score":1,"no_rain_score":1,"vapour_pressure_deficit_score":1,"fuel_context_score":0.9,"pressure_trend_context":0.3},"main_drivers":["Low humidity (~12%)","Wind 45 km/h, gusts to 68 km/h","High temperature (~44°C)","Little to no forecast rainfall"],"uncertainty_factors":["Forecast model data, not a physical fire sensor"],"recommended_actions":["Pre-position resources and brief crews for the forecast window","Monitor AOIs downwind of any active or newly-detected heat","Cross-check with official warnings before acting"]},{"horizon_hours":1,"label":"+1h","forecast_for_time":"2026-03-15T07:00:00.000Z","forecast_score":93.5,"severity":"Critical","sub_scores":{"dryness_score":0.9,"wind_spread_score":1,"heat_score":1,"no_rain_score":1,"vapour_pressure_deficit_score":1,"fuel_context_score":0.9,"pressure_trend_context":0.3},"main_drivers":["Low humidity (~10%)","Wind 46 km/h, gusts to 69 km/h","High temperature (~44°C)","Little to no forecast rainfall"],"uncertainty_factors":["Forecast model data, not a physical fire sensor"],"recommended_actions":["Pre-position resources and brief crews for the forecast window","Monitor AOIs downwind of any active or newly-detected heat","Cross-check with official warnings before acting"]},{"horizon_hours":3,"label":"+3h","forecast_for_time":"2026-03-15T09:00:00.000Z","forecast_score":93.5,"severity":"Critical","sub_scores":{"dryness_score":0.9,"wind_spread_score":1,"heat_score":1,"no_rain_score":1,"vapour_pressure_deficit_score":1,"fuel_context_score":0.9,"pressure_trend_context":0.3},"main_drivers":["Low humidity (~10%)","Wind 46 km/h, gusts to 69 km/h","High temperature (~44°C)","Little to no forecast rainfall"],"uncertainty_factors":["Forecast model data, not a physical fire sensor"],"recommended_actions":["Pre-position resources and brief crews for the forecast window","Monitor AOIs downwind of any active or newly-detected heat","Cross-check with official warnings before acting"]},{"horizon_hours":6,"label":"+6h","forecast_for_time":"2026-03-15T12:00:00.000Z","forecast_score":93.5,"severity":"Critical","sub_scores":{"dryness_score":0.9,"wind_spread_score":1,"heat_score":1,"no_rain_score":1,"vapour_pressure_deficit_score":1,"fuel_context_score":0.9,"pressure_trend_context":0.3},"main_drivers":["Low humidity (~16%)","Wind 42 km/h, gusts to 64 km/h","High temperature (~43°C)","Little to no forecast rainfall"],"uncertainty_factors":["Forecast model data, not a physical fire sensor"],"recommended_actions":["Pre-position resources and brief crews for the forecast window","Monitor AOIs downwind of any active or newly-detected heat","Cross-check with official warnings before acting"]},{"horizon_hours":12,"label":"+12h","forecast_for_time":"2026-03-15T18:00:00.000Z","forecast_score":82.9,"severity":"High","sub_scores":{"dryness_score":0.8,"wind_spread_score":0.8,"heat_score":0.8,"no_rain_score":0.9,"vapour_pressure_deficit_score":1,"fuel_context_score":0.9,"pressure_trend_context":0.4},"main_drivers":["Low humidity (~32%)","Wind 31 km/h, gusts to 48 km/h","Little to no forecast rainfall","High temperature (~37°C)"],"uncertainty_factors":["Forecast model data, not a physical fire sensor"],"recommended_actions":["Heighten watch over exposed AOIs","Verify forecast against local weather stations"]},{"horizon_hours":24,"label":"+24h","forecast_for_time":"2026-03-16T06:00:00.000Z","forecast_score":93.4,"severity":"Critical","sub_scores":{"dryness_score":0.9,"wind_spread_score":1,"heat_score":1,"no_rain_score":1,"vapour_pressure_deficit_score":1,"fuel_context_score":0.9,"pressure_trend_context":0.3},"main_drivers":["Low humidity (~12%)","Wind 45 km/h, gusts to 68 km/h","High temperature (~44°C)","Little to no forecast rainfall"],"uncertainty_factors":["Forecast model data, not a physical fire sensor"],"recommended_actions":["Pre-position resources and brief crews for the forecast window","Monitor AOIs downwind of any active or newly-detected heat","Cross-check with official warnings before acting"]},{"horizon_hours":48,"label":"+48h","forecast_for_time":"2026-03-17T06:00:00.000Z","forecast_score":93.4,"severity":"Critical","sub_scores":{"dryness_score":0.9,"wind_spread_score":1,"heat_score":1,"no_rain_score":1,"vapour_pressure_deficit_score":1,"fuel_context_score":0.9,"pressure_trend_context":0.3},"main_drivers":["Low humidity (~12%)","Wind 45 km/h, gusts to 68 km/h","High temperature (~44°C)","Little to no forecast rainfall"],"uncertainty_factors":["Forecast model data, not a physical fire sensor"],"recommended_actions":["Pre-position resources and brief crews for the forecast window","Monitor AOIs downwind of any active or newly-detected heat","Cross-check with official warnings before acting"]}],"peak":{"horizon_hours":1,"label":"+1h","forecast_for_time":"2026-03-15T07:00:00.000Z","forecast_score":93.5,"severity":"Critical","sub_scores":{"dryness_score":0.9,"wind_spread_score":1,"heat_score":1,"no_rain_score":1,"vapour_pressure_deficit_score":1,"fuel_context_score":0.9,"pressure_trend_context":0.3},"main_drivers":["Low humidity (~10%)","Wind 46 km/h, gusts to 69 km/h","High temperature (~44°C)","Little to no forecast rainfall"],"uncertainty_factors":["Forecast model data, not a physical fire sensor"],"recommended_actions":["Pre-position resources and brief crews for the forecast window","Monitor AOIs downwind of any active or newly-detected heat","Cross-check with official warnings before acting"]},"peak_24h":{"horizon_hours":1,"label":"+1h","forecast_for_time":"2026-03-15T07:00:00.000Z","forecast_score":93.5,"severity":"Critical","sub_scores":{"dryness_score":0.9,"wind_spread_score":1,"heat_score":1,"no_rain_score":1,"vapour_pressure_deficit_score":1,"fuel_context_score":0.9,"pressure_trend_context":0.3},"main_drivers":["Low humidity (~10%)","Wind 46 km/h, gusts to 69 km/h","High temperature (~44°C)","Little to no forecast rainfall"],"uncertainty_factors":["Forecast model data, not a physical fire sensor"],"recommended_actions":["Pre-position resources and brief crews for the forecast window","Monitor AOIs downwind of any active or newly-detected heat","Cross-check with official warnings before acting"]}},"spread_forecast":{"fire_episode_id":"episode-1","generated_at":"2026-03-15T06:00:00.000Z","weather_source":"forecast_model","direction_of_concern_deg":94,"direction_of_concern_label":"E","peak_wind_gust":69.2,"min_humidity":10,"trend_score":83,"trend_severity":"High","cones":[{"fire_episode_id":"episode-1","horizon_hours":1,"cone":{"type":"Polygon","coordinates":[[[105.7027025,18.604295],[105.81872952118192,18.657875566480453],[105.82321321759275,18.64808777405294],[105.82677905007631,18.637966898488177],[105.82940002842042,18.627590017972718],[105.83105637012841,18.617036146056503],[105.83173564594244,18.60638562913443],[105.83143286905761,18.595719534217235],[105.83015052750886,18.5851190316726],[105.82789855965734,18.574664777641736],[105.82469427313026,18.564436300825147],[105.82056220799416,18.554511398284266],[105.81553394535933,18.544965544823928],[105.80964786300649,18.53587132040526],[105.7027025,18.604295]]]},"centroid":{"lon":105.7027025,"lat":18.604295},"wind_direction":274,"bearing_of_concern":94,"wind_speed":46.1,"wind_gust":69.2,"forecast_score":83,"severity":"High","uncertainty":"High","parameters":{"base_length_km":3,"wind_factor":2,"gust_factor":1.8,"dryness_factor":1.8,"context_factor":1.4,"rain_dampening":1,"horizon_factor":0.5,"cone_length_km":13.6,"cone_angle_deg":60},"forecast_for_time":"2026-03-15T07:00:00.000Z","created_at":"2026-03-15T06:00:00.000Z"},{"fire_episode_id":"episode-1","horizon_hours":3,"cone":{"type":"Polygon","coordinates":[[[105.7027025,18.604295],[105.87169030851442,18.668902731674198],[105.8769832844747,18.65469848910393],[105.88094870922498,18.640111143182583],[105.88355672651994,18.625251795693867],[105.88478783614244,18.610233590623462],[105.884633031671,18.59517085142843],[105.88309385796538,18.580178210232173],[105.88018238827067,18.565369735591208],[105.87592112145398,18.550858065462666],[105.87034280048135,18.536753551934524],[105.86349015382655,18.523163424164522],[105.8554155620593,18.510190975811486],[105.84618065239215,18.497934783034754],[105.7027025,18.604295]]]},"centroid":{"lon":105.7027025,"lat":18.604295},"wind_direction":278,"bearing_of_concern":98,"wind_speed":46.1,"wind_gust":69.2,"forecast_score":83,"severity":"High","uncertainty":"High","parameters":{"base_length_km":3,"wind_factor":2,"gust_factor":1.8,"dryness_factor":1.8,"context_factor":1.4,"rain_dampening":1,"horizon_factor":0.7,"cone_length_km":19.2,"cone_angle_deg":60},"forecast_for_time":"2026-03-15T09:00:00.000Z","created_at":"2026-03-15T06:00:00.000Z"},{"fire_episode_id":"episode-1","horizon_hours":6,"cone":{"type":"Polygon","coordinates":[[[105.7027025,18.604295],[105.911574103779,18.718393422216156],[105.92126677115493,18.70070639456156],[105.9292932182766,18.682286168472825],[105.93559281979492,18.66327314688674],[105.94011816366742,18.64381220292289],[105.94283539561798,18.624051572143543],[105.94372445880617,18.604141720658976],[105.94277922744072,18.584234197799262],[105.94000753390594,18.56448048214335],[105.93543108978702,18.545030829697488],[105.9290853019836,18.52603313294994],[105.92101898586793,18.5076317993988],[105.91129397818872,18.489966657957687],[105.7027025,18.604295]]]},"centroid":{"lon":105.7027025,"lat":18.604295},"wind_direction":270,"bearing_of_concern":90,"wind_speed":42.2,"wind_gust":63.8,"forecast_score":81,"severity":"High","uncertainty":"High","parameters":{"base_length_km":3,"wind_factor":2,"gust_factor":1.8,"dryness_factor":1.7,"context_factor":1.4,"rain_dampening":1,"horizon_factor":1,"cone_length_km":25.4,"cone_angle_deg":60},"forecast_for_time":"2026-03-15T12:00:00.000Z","created_at":"2026-03-15T06:00:00.000Z"},{"fire_episode_id":"episode-1","horizon_hours":12,"cone":{"type":"Polygon","coordinates":[[[105.7027025,18.604295],[105.84328987005597,18.68113469435147],[105.84981884528963,18.66922968502175],[105.85522689971992,18.656830731277875],[105.85947308261666,18.64403229377331],[105.86252531810408,18.6309318548404],[105.86436064191344,18.617629174228597],[105.86496536804998,18.604225528154874],[105.86433518435376,18.590822937507856],[105.86247517648997,18.57752339110815],[105.8593997804569,18.56442806994305],[105.85513266423811,18.551636578263896],[105.8497065397545,18.53924618736092],[105.84316290678555,18.527351097713495],[105.7027025,18.604295]]]},"centroid":{"lon":105.7027025,"lat":18.604295},"wind_direction":270,"bearing_of_concern":90,"wind_speed":30.8,"wind_gust":48,"forecast_score":57,"severity":"Watch","uncertainty":"High","parameters":{"base_length_km":3,"wind_factor":1.5,"gust_factor":1.4,"dryness_factor":1.4,"context_factor":1.4,"rain_dampening":1,"horizon_factor":1.4,"cone_length_km":17.1,"cone_angle_deg":60},"forecast_for_time":"2026-03-15T18:00:00.000Z","created_at":"2026-03-15T06:00:00.000Z"},{"fire_episode_id":"episode-1","horizon_hours":24,"cone":{"type":"Polygon","coordinates":[[[105.7027025,18.604295],[106.14050464262198,18.843007104477078],[106.16076798901861,18.80593690994514],[106.17753287109656,18.767334570615972],[106.19067375181646,18.727494805876475],[106.20009298156083,18.68672156780934],[106.20572146758741,18.645325705918356],[106.20751911955779,18.60362258584778],[106.20547507029141,18.561929680628808],[106.1996076726897,18.52056415297639],[106.18996427547506,18.479840447008048],[106.17662078199362,18.440067907470667],[106.15968099782401,18.40154844415094],[106.13927577431696,18.364574258617647],[105.7027025,18.604295]]]},"centroid":{"lon":105.7027025,"lat":18.604295},"wind_direction":270,"bearing_of_concern":90,"wind_speed":45.2,"wind_gust":68,"forecast_score":83,"severity":"High","uncertainty":"High","parameters":{"base_length_km":3,"wind_factor":2,"gust_factor":1.8,"dryness_factor":1.8,"context_factor":1.4,"rain_dampening":1,"horizon_factor":2,"cone_length_km":53.2,"cone_angle_deg":60},"forecast_for_time":"2026-03-16T06:00:00.000Z","created_at":"2026-03-15T06:00:00.000Z"}],"main_drivers":["Likely direction of concern: E (downwind)","Forecast wind gusts up to 69 km/h","Humidity down to ~10%","Flammable fuel context increases wind-forward reach"],"uncertainty_factors":["Forecast attention zone — not an exact fire-spread prediction"],"safety_note":"F-CAST forecasts fire-weather risk and likely attention zones. It does not guarantee that a fire will occur."},"hotspot":null},"decision_logic":["F-CAST evaluated 7 horizons; peak within 24h = 93.5 at +1h.","Episode episode-1 is corroborated (4 detections, 2 source(s), max FRP 44 MW, status \"spreading\") → active_fire_episode.","Active-episode formula applied: F-GRADE 61.8 dominates (weight 0.72)."],"score_formula_used":"overall = 0.72 × F-GRADE final_score + 0.18 × peak F-CAST (24h) + 0.10 × spread_trend_score","final_decision":{"mode":"active_fire_episode","overall_score":69.6,"severity":"High","confidence":"High"},"uncertainty":{"factors":["No historical calibration run has been completed for this region yet."],"penalty":0},"safety_notes":["TerraSentinel is a decision-support tool and does not replace official emergency services, government warnings, or professional environmental management decisions.","F-CAST forecasts fire-weather risk and likely attention zones. It does not guarantee that a fire will occur.","Decision mode: Active fire episode."],"sentinel":{"state_transitions":["R1 data_insufficient: usable forecast=true, FIRMS events=7","R4 candidate gate: episode=episode-1, corroborated=true","R5 active_fire_episode: episode episode-1 passed the corroboration gate","R6 spread_attention: downwind cone=true"],"calibration_method":"default_transparent_prior","reliability_band":"uncalibrated","counterfactual_count":4,"evidence_nodes":16,"evidence_edges":21}},"explanation_json":{"summary":"Active fire episode near North Central Coast Pine / Hot Dry Wind (North Central Coast): corroborated episode with combined risk High (score 69.6/100, confidence High). Downwind spread attention is active (attention zone, not an exact path).","risk_score":69.6,"severity":"High","confidence":"High","main_drivers":["High satellite detection confidence","Strong fire radiative power","Confirmed by multiple satellites","4 clustered detections","2 independent data sources"],"uncertainty_factors":["No historical calibration run has been completed for this region yet."],"recommended_actions":["Check official emergency / fire-authority guidance now","Notify local forest managers / responsible contacts if appropriate","Monitor downwind areas of interest through the forecast window","Record ground confirmation ONLY if it can be obtained safely","Communicate the attention zone as uncertainty, never as a predicted path"],"data_sources":["NASA FIRMS (demo)","Open-Meteo (demo)","ForestGuard Vietnam context pack (ok)","ESA WorldCover (degraded)"],"safety_disclaimer":"TerraSentinel is a decision-support tool and does not replace official emergency services, government warnings, or professional environmental management decisions."},"main_drivers":["High satellite detection confidence","Strong fire radiative power","Confirmed by multiple satellites","4 clustered detections","2 independent data sources"],"uncertainty_factors":["No historical calibration run has been completed for this region yet."],"limitations":["Satellite active-fire detections are not ground-confirmed; false positives (industrial heat, agricultural burning, sun glint) are possible.","Peat and understory fires can be under-detected; absence of a hotspot does not mean absence of fire.","Weather inputs are forecast model data, not physical sensors; uncertainty grows with horizon.","Spread attention cones are wind-forward geometric zones, not a physical fire-spread simulation.","The default land-cover sampler is a regional heuristic, not a live WorldCover raster lookup (flagged in source quality).","Calibration currently ships as a transparent identity prior (cal-1.0.0); No historical calibration run has been completed for this region yet.","Regional context boundaries are approximate demonstration polygons, not authoritative forest-management boundaries."],"safety_disclaimer":"TerraSentinel is a decision-support tool and does not replace official emergency services, government warnings, or professional environmental management decisions."},"slide_summary":"ForestGuard SentinelCore — Evidence-Calibrated Wildfire Decision Engine\nRun example-sentinelcore-report · 2026-03-15T06:00:00.000Z · data mode: demo\n\nDecision: Active fire episode (+ Spread attention (downwind))\nScore: 69.6/100 (High) · confidence High · interval 55.6–83.6\nCalibration: default_transparent_prior · reliability uncalibrated\nWhy: Episode episode-1 is corroborated (4 detections, 2 source(s), max FRP 44 MW) — active fire episode. Wind-forward attention is directed E (attention zone, not an exact spread path).\n\nTop drivers:\n  • High satellite detection confidence\n  • Strong fire radiative power\n  • Confirmed by multiple satellites\n  • 4 clustered detections\nWhat would change this decision:\n  • Fire-weather risk would ease if relative humidity recovers above 60% (currently ~12%).\n  • Risk would decrease if rainfall exceeds 2 mm (currently 0 mm/h forecast) — 2 mm halves the no-rain term, 4 mm zeroes it.\n  • The severity band would move to Critical if the overall score rises by 15.4 points (currently 69.6, Critical starts at 85).\nRecommended actions:\n  • [immediate] Check official emergency / fire-authority guidance now\n  • [immediate] Notify local forest managers / responsible contacts if appropriate\n  • [immediate] Monitor downwind areas of interest through the forecast window\n\nEvidence graph: 16 nodes / 21 edges (2 risk, 0 contradiction).\nTerraSentinel is a decision-support tool and does not replace official emergency services, government warnings, or professional environmental management decisions.","backtest_demo":{"ok":true,"status":"success","kind":"bundled_demo_fixture","fixture_key":"pine-belt-foehn-spell","fixture_name":"Pine belt foehn drying spell (bundled demo fixture)","description":"Six deterministic days at a North Central Coast pine-belt site: a benign start, a foehn drying spell with FIRMS-like detections mid-spell, rain relief, and one out-of-spell detection to keep the miss count honest. Demonstration data — not a historical archive.","horizon_hours":24,"high_risk_threshold":65,"summary":{"hit_rate":0.762,"false_alarm_ratio":0.238,"lead_time_hours":7.5,"precision":0.762,"recall":0.75,"high_risk_hours":42,"matched_detection_count":3,"total_predictions":144,"detections_total":4},"metrics":{"total_predictions":144,"high_risk_predictions":42,"fires_total":4,"fires_matched_by_high_risk":3,"hits":32,"misses":1,"false_alarms":10,"recall":0.75,"precision":0.762,"false_alarm_ratio":0.238,"brier_score":0.151,"mean_lead_time_hours":7.5,"high_risk_days":3,"fire_days":3},"disclaimer":"Bundled demo fixture — demonstrates the backtest pipeline end-to-end with deterministic synthetic data. It is not a historical archive, proves no real-world skill, and is never used for calibration."},"calibration_status":{"method":"default_transparent_prior","version":"cal-1.0.0","reliability_band":"uncalibrated","note":"No historical calibration run has been completed for this region yet.","how_to_calibrate":"Import a real historical archive (scripts/import-firms-history.ts + scripts/import-openmeteo-history.ts), run POST /api/backtest/run, then queue a calibrate_region job for the external worker."},"source_quality":[{"provider":"NASA FIRMS","layer_key":"active_fires","source_type":"active_fire","valid_time":"2026-03-15T05:00:00.000Z","generated_at":null,"ingested_at":null,"latency_minutes":null,"spatial_resolution":"VIIRS 375 m / MODIS 1 km","temporal_resolution":"~2–4 satellite overpasses per day","coverage_status":"unknown","status":"demo","uncertainty_level":"moderate","message":"Bundled demo detections — clearly labelled, not current observations.","attribution":"NASA FIRMS (LANCE), VIIRS/MODIS active-fire products","details":{"events":7},"model_effect":"increases_uncertainty","model_effect_reason":"Demo/synthetic data is clearly labelled and widens the calibration interval.","required":true},{"provider":"Open-Meteo","layer_key":"weather_forecast","source_type":"weather_forecast","valid_time":"2026-03-15T06:00:00.000Z","generated_at":"2026-03-15T06:00:00.000Z","ingested_at":"2026-03-15T06:00:00.000Z","latency_minutes":0,"spatial_resolution":"~11 km (model grid, varies by model)","temporal_resolution":"Hourly","coverage_status":"full","status":"demo","uncertainty_level":"moderate","message":"Deterministic demo forecast synthesized offline — not model output from Open-Meteo.","attribution":"Open-Meteo.com (open weather model data)","details":{"hours":49,"source":"demo-forecast-model"},"model_effect":"increases_uncertainty","model_effect_reason":"Demo/synthetic data is clearly labelled and widens the calibration interval.","required":true},{"provider":"ForestGuard Vietnam context pack","layer_key":"regional_context","source_type":"landcover","valid_time":null,"generated_at":null,"ingested_at":null,"latency_minutes":null,"spatial_resolution":null,"temporal_resolution":"Static (project-curated)","coverage_status":"partial","status":"ok","uncertainty_level":"low","message":"Target is inside the \"North Central Coast\" context pack (pine forest under hot dry foehn winds).","attribution":"ForestGuard project-curated regional context (approximate demonstration boundaries)","details":{"region_key":"north_central_coast","peak_months":[5,6,7,8]},"model_effect":"supports_evidence","model_effect_reason":"Fresh and usable — this input contributes to the decision at full weight.","required":false},{"provider":"ESA WorldCover","layer_key":"landcover","source_type":"landcover","valid_time":null,"generated_at":null,"ingested_at":null,"latency_minutes":null,"spatial_resolution":"10 m (2021 map)","temporal_resolution":"Static (2021)","coverage_status":"partial","status":"degraded","uncertainty_level":"moderate","message":"Land cover \"tree\" from the regional heuristic sampler — an approximation, not a live WorldCover raster lookup.","attribution":"© ESA WorldCover project 2021 / Contains modified Copernicus Sentinel data","details":{"landcover":"tree"},"model_effect":"increases_uncertainty","model_effect_reason":"Aging or approximate data still contributes, but with wider uncertainty.","required":false}],"limitations":["Satellite active-fire detections are not ground-confirmed; false positives (industrial heat, agricultural burning, sun glint) are possible.","Peat and understory fires can be under-detected; absence of a hotspot does not mean absence of fire.","Weather inputs are forecast model data, not physical sensors; uncertainty grows with horizon.","Spread attention cones are wind-forward geometric zones, not a physical fire-spread simulation.","The default land-cover sampler is a regional heuristic, not a live WorldCover raster lookup (flagged in source quality).","Calibration currently ships as a transparent identity prior (cal-1.0.0); No historical calibration run has been completed for this region yet.","Regional context boundaries are approximate demonstration polygons, not authoritative forest-management boundaries."],"safety_disclaimer":"TerraSentinel is a decision-support tool and does not replace official emergency services, government warnings, or professional environmental management decisions."},"queue":{"configured":true,"message":"Job queue configured.","recent_jobs":[],"calibration_profiles":[],"backtest_runs":[],"error":null}}