{
 "model": "gemma-4-31b-it + gemma-4-26b-a4b-it",
 "generated_at": "2026-10-31 14:08 WIB",
 "base_year": 2019,
 "latest_year": 2025,
 "verdicts": {
  "GROWTH_CORRIDOR": "built-up AND activity both rising: realized growth",
  "EARLY_STAGE": "land is being cleared/prepared, structures not finished yet",
  "UNDERBUILT_DEMAND": "activity rising faster than construction: demand ahead of supply",
  "STALLED": "construction rose but activity did not follow",
  "MATURE_STABLE": "already dense, little physical change, activity steady",
  "DECLINING": "activity and/or built signals falling"
 },
 "batam_wide_change": {
  "ndbi": -0.053,
  "ndvi": 0.052,
  "dw_built": 0.369,
  "dw_bare": -0.429,
  "s1_vv": 0.29,
  "lst": 1.604,
  "viirs": 9.2
 },
 "batam_wide_decade_change": {
  "l_ndbi": -0.057,
  "l_ndvi": 0.027,
  "l_lst": -1.543,
  "s1_vv": 0.327,
  "viirs": 26.3,
  "ob_built": 0.637
 },
 "city": {
  "ranking": [
   {
    "id": "sekupang",
    "rank": 1,
    "why": "Robust urban expansion and service-sector growth outperforming the city average."
   },
   {
    "id": "bengkong",
    "rank": 2,
    "why": "Intense urban infill and massive economic activity through densification."
   },
   {
    "id": "nongsa",
    "rank": 3,
    "why": "Steady economic and physical growth driven by premium tourism and residential sectors."
   },
   {
    "id": "batam-kota",
    "rank": 4,
    "why": "Established urban core driving the service economy through intense densification."
   },
   {
    "id": "galang",
    "rank": 5,
    "why": "Massive population and light surges outpacing the current physical footprint."
   },
   {
    "id": "sagulung",
    "rank": 6,
    "why": "Significant residential expansion that is currently outpacing commercial development."
   },
   {
    "id": "batu-ampar",
    "rank": 7,
    "why": "Mature port hub maintaining high economic resilience and steady infill."
   },
   {
    "id": "lubuk-baja",
    "rank": 8,
    "why": "Dense urban core consolidating through retail and service intensification."
   },
   {
    "id": "batu-aji",
    "rank": 9,
    "why": "Mature hub shifting from land expansion to internal densification."
   },
   {
    "id": "sei-beduk",
    "rank": 10,
    "why": "Physical industrial growth is lagging behind actual economic vibrancy."
   },
   {
    "id": "belakang-padang",
    "rank": 11,
    "why": "Economic activity and built-up footprint are decoupling from population growth."
   },
   {
    "id": "bulang",
    "rank": 12,
    "why": "Rural stagnation and failure to transition into an urbanized zone."
   }
  ],
  "city_headline": "Batam's growth is driven by intense service corridors while peripheral islands face economic decoupling.",
  "city_brief": "Batam is experiencing rapid expansion in the Sekupang and Bengkong corridors, where residential and service sectors are densifying. Nongsa also shows strong momentum through premium tourism and residential development. However, industrial zones like Sei Beduk are stalling economically despite physical growth, and peripheral islands like Bulang are failing to urbanize. This divergence is driven by the concentration of economic energy in central and northern urban hubs.",
  "city_decade_story": "From 2016 to 2025, Batam transitioned from a developing landscape into a consolidated metropolitan region. The decade was defined by the explosive expansion of Sekupang and the intense urban infill of Bengkong. This period marked a shift from broad land expansion toward high-density urban maturity.",
  "top_opportunity": {
   "id": "galang",
   "text": "The massive surge in population and night lights relative to the physical footprint indicates immense untapped development potential."
  },
  "top_risk": {
   "id": "sei-beduk",
   "text": "The divergence between physical industrial expansion and declining economic radiance suggests a risk of low-value industrial stagnation."
  },
  "method_note": "Satellite-derived metrics like NDBI and VIIRS provide proxy indicators for growth but may not capture informal economic shifts.",
  "_model": "gemma-4-26b-a4b-it"
 },
 "zones": {
  "batam-kota": {
   "id": "batam-kota",
   "name": "Batam Kota",
   "signals": {
    "kecamatan": "Batam Kota",
    "area_km2": 38.76,
    "period": "2019->2025 (satellite), Jan 2024->Oct 2026 (hotels/OSM)",
    "ndbi": {
     "from": 0.0178,
     "to": 0.0096,
     "delta": -0.008
    },
    "ndvi": {
     "from": 0.3148,
     "to": 0.3202,
     "delta": 0.005
    },
    "dynamic_world_built_share_pct": {
     "from": 75.4,
     "to": 65.2,
     "delta_pp": -10.2
    },
    "dynamic_world_bare_share_pct": {
     "from": 4.4,
     "to": 1.0,
     "delta_pp": -3.4
    },
    "dynamic_world_tree_share_delta_pp": -4.9,
    "night_lights_radiance": {
     "from": 22.2764,
     "to": 21.5013,
     "change_pct": -3.5
    },
    "radar_vv_db": {
     "from": -7.3702,
     "to": -6.7065,
     "delta_db": 0.66
    },
    "land_surface_temp_c": {
     "from": 36.4487,
     "to": 40.5916,
     "delta": 4.14
    },
    "open_buildings_cover_pct_2019_2023": {
     "from": 16.76,
     "to": 18.12,
     "delta_pp": 1.36
    },
    "open_buildings_mean_height_m": {
     "from": 6.2397,
     "to": 5.7417
    },
    "coastal_land_gained_km2": null,
    "population_ghsl_modelled": {
     "2020": 336489,
     "2025": 375201,
     "change_pct": 11.5
    },
    "built_share_2028_linear_baseline_pct": 70.6,
    "hotels": {
     "hotels_2024": 61,
     "hotels_2024_still_open": 51,
     "hotels_2024_closed_or_gone": 10,
     "hotel_survival_pct": 83.6,
     "hotel_type_listings_not_in_2024_scrape": 31,
     "hotels_star4plus_2024": 3,
     "hotel_median_price_idr_2024": 235186
    },
    "osm_business_counts": {
     "fnb": {
      "2024": 83,
      "2026": 100,
      "growth_pct": 20.5
     },
     "retail": {
      "2024": 79,
      "2026": 94,
      "growth_pct": 19.0
     },
     "office": {
      "2024": 31,
      "2026": 41,
      "growth_pct": 32.3
     }
    },
    "batam_wide_change": {
     "ndbi": -0.053,
     "ndvi": 0.052,
     "dw_built": 0.369,
     "dw_bare": -0.429,
     "s1_vv": 0.29,
     "lst": 1.604,
     "viirs": 9.2
    },
    "change_relative_to_batam": {
     "ndbi": 0.045,
     "ndvi": -0.047,
     "dw_built": -10.569,
     "dw_bare": -2.971,
     "s1_vv": 0.37,
     "lst": 2.536,
     "viirs": -12.7
    },
    "decade_2016_2025": {
     "landsat_ndbi": {
      "2016": -0.0585,
      "2025": -0.0713,
      "delta": -0.013
     },
     "landsat_ndvi": {
      "2016": 0.3992,
      "2025": 0.4087,
      "delta": 0.01
     },
     "night_lights_radiance": {
      "2016": 17.4384,
      "2025": 21.5013,
      "change_pct": 23.3
     },
     "radar_vv_db": {
      "2016": -7.7684,
      "2025": -6.7065,
      "delta_db": 1.06
     },
     "open_buildings_cover_pct_2016_2023": {
      "2016": 14.98,
      "2023": 18.12,
      "delta_pp": 3.14
     },
     "land_surface_temp_c": {
      "2016": 42.2374,
      "2025": 40.5916,
      "delta": -1.65
     },
     "population_ghsl_modelled": {
      "2015": 276399,
      "2025": 375201,
      "change_pct": 35.7
     },
     "osm_counts_2016_2026": {
      "lodging": {
       "2016": 8,
       "2026": 30
      },
      "fnb": {
       "2016": 28,
       "2026": 100
      },
      "retail": {
       "2016": 20,
       "2026": 94
      },
      "office": {
       "2016": 0,
       "2026": 41
      }
     }
    },
    "decade_relative_to_batam": {
     "l_ndbi": 0.044,
     "l_ndvi": -0.017,
     "l_lst": -0.107,
     "s1_vv": 0.733,
     "viirs": -3.0,
     "ob_built": 2.503
    },
    "batam_wide_decade_change": {
     "l_ndbi": -0.057,
     "l_ndvi": 0.027,
     "l_lst": -1.543,
     "s1_vv": 0.327,
     "viirs": 26.3,
     "ob_built": 0.637
    }
   },
   "series": {
    "2019": {
     "dw_bare": 0.0441,
     "dw_built": 0.7536,
     "dw_crops": 0.0069,
     "dw_trees": 0.1347,
     "dw_water": 0.0374,
     "lst": 36.4487,
     "mndwi": -0.3499,
     "ndbi": 0.0178,
     "ndvi": 0.3148,
     "ob_built": 0.1676,
     "ob_height": 6.2397,
     "s1_vv": -7.3702,
     "viirs": 22.2764
    },
    "2020": {
     "dw_bare": 0.0451,
     "dw_built": 0.7772,
     "dw_crops": 0.0057,
     "dw_trees": 0.1129,
     "dw_water": 0.0333,
     "lst": 39.0495,
     "mndwi": -0.3386,
     "ndbi": 0.0085,
     "ndvi": 0.3147,
     "ob_built": 0.1842,
     "ob_height": 5.9938,
     "s1_vv": -7.0457,
     "viirs": 18.7172
    },
    "2021": {
     "dw_bare": 0.0352,
     "dw_built": 0.777,
     "dw_crops": 0.0052,
     "dw_trees": 0.1278,
     "dw_water": 0.0329,
     "lst": 40.3282,
     "mndwi": -0.3393,
     "ndbi": 0.0049,
     "ndvi": 0.3205,
     "ob_built": 0.19,
     "ob_height": 6.4194,
     "s1_vv": -6.9649,
     "viirs": 18.7638
    },
    "2022": {
     "dw_bare": 0.0185,
     "dw_built": 0.7654,
     "dw_crops": 0.0085,
     "dw_trees": 0.1427,
     "dw_water": 0.0472,
     "lst": 34.9949,
     "mndwi": -0.332,
     "ndbi": -0.0068,
     "ndvi": 0.3239,
     "ob_built": 0.1676,
     "ob_height": 5.9415,
     "s1_vv": -6.8879,
     "viirs": 19.4103
    },
    "2023": {
     "dw_bare": 0.0244,
     "dw_built": 0.799,
     "dw_crops": 0.0048,
     "dw_trees": 0.1201,
     "dw_water": 0.0315,
     "lst": 37.1726,
     "mndwi": -0.3199,
     "ndbi": -0.0059,
     "ndvi": 0.3092,
     "ob_built": 0.1812,
     "ob_height": 5.7417,
     "s1_vv": -6.8593,
     "viirs": 21.4159
    },
    "2024": {
     "dw_bare": 0.0274,
     "dw_built": 0.7941,
     "dw_crops": 0.012,
     "dw_trees": 0.1154,
     "dw_water": 0.0335,
     "lst": 39.5708,
     "mndwi": -0.3153,
     "ndbi": -0.0065,
     "ndvi": 0.3043,
     "s1_vv": -6.6695,
     "viirs": 23.1744
    },
    "2025": {
     "dw_bare": 0.01,
     "dw_built": 0.6521,
     "dw_crops": 0.0002,
     "dw_trees": 0.0859,
     "dw_water": 0.2408,
     "lst": 40.5916,
     "mndwi": -0.3503,
     "ndbi": 0.0096,
     "ndvi": 0.3202,
     "s1_vv": -6.7065,
     "viirs": 21.5013
    },
    "2026": {
     "dw_bare": 0.0258,
     "dw_built": 0.8282,
     "dw_crops": 0.0013,
     "dw_trees": 0.1037,
     "dw_water": 0.0261,
     "lst": 37.8441,
     "mndwi": -0.2973,
     "ndbi": 0.0055,
     "ndvi": 0.2692,
     "s1_vv": -6.8748,
     "viirs": 26.0919
    }
   },
   "gemma": {
    "verdict": "MATURE_STABLE",
    "growth_score": 75,
    "confidence": "high",
    "headline": "Established urban core driving Batam's service economy through intense densification",
    "image_observations": "Images 1 and 2 show a highly consolidated urban fabric with significant industrial and commercial clusters. Image 3 shows dominant grey areas, confirming that most land has been built-up for years.",
    "reasoning": "Batam Kota is a mature center experiencing intensification rather than frontier expansion. While its relative built-up share is lower than Batam's booming outskirts, rising business counts (Office +32%) and population (+35.7% decade) indicate strong economic vitality. The increase in radar VV and Open Buildings confirms this growth is happening through infill and structural densification.",
    "conflicts": "NDBI and built share are down while radar and buildings are up; this is resolved by the distinction between new land conversion (low) and structural intensification (high).",
    "evidence": [
     {
      "signal": "open_buildings_cover_pct_2019_2023",
      "reading": "+1.36 pp",
      "meaning": "Realized structural densification within the existing urban footprint."
     },
     {
      "signal": "osm_business_counts (office)",
      "reading": "+32.3%",
      "meaning": "Strong demand for administrative and commercial services."
     },
     {
      "signal": "population_ghsl_modelled (decade)",
      "reading": "+35.7%",
      "meaning": "Sustained demographic growth and urban concentration."
     },
     {
      "signal": "radar_vv_db",
      "reading": "+0.66 dB",
      "meaning": "Increased structural complexity and building density."
     }
    ],
    "outlook_2028": {
     "trajectory": "steady",
     "built_share_2028_pct": 72.5,
     "rationale": "Growth will focus on redevelopment and infill rather than large-scale land clearing."
    },
    "decade_story": "From 2016 to 2025, Batam Kota transitioned from a dense urban area to a fully consolidated metropolitan core, with population growing 35.7%. Images 4 and 5 show the maturation of the urban fabric as it reached near-maximum density.",
    "recommendation": "Prioritize transit-oriented development and upgrading commercial infrastructure to support the growing service and office sectors.",
    "watch_next": "Office business count growth trends",
    "_model": "gemma-4-26b-a4b-it"
   }
  },
  "batu-aji": {
   "id": "batu-aji",
   "name": "Batu Aji",
   "signals": {
    "kecamatan": "Batu Aji",
    "area_km2": 41.02,
    "period": "2019->2025 (satellite), Jan 2024->Oct 2026 (hotels/OSM)",
    "ndbi": {
     "from": -0.062,
     "to": -0.0817,
     "delta": -0.02
    },
    "ndvi": {
     "from": 0.4038,
     "to": 0.4275,
     "delta": 0.024
    },
    "dynamic_world_built_share_pct": {
     "from": 55.5,
     "to": 54.9,
     "delta_pp": -0.6
    },
    "dynamic_world_bare_share_pct": {
     "from": 6.4,
     "to": 4.3,
     "delta_pp": -2.1
    },
    "dynamic_world_tree_share_delta_pp": -0.4,
    "night_lights_radiance": {
     "from": 15.0853,
     "to": 15.6945,
     "change_pct": 4.0
    },
    "radar_vv_db": {
     "from": -7.71,
     "to": -6.7346,
     "delta_db": 0.98
    },
    "land_surface_temp_c": {
     "from": 35.9899,
     "to": 38.8066,
     "delta": 2.82
    },
    "open_buildings_cover_pct_2019_2023": {
     "from": 9.93,
     "to": 9.83,
     "delta_pp": -0.1
    },
    "open_buildings_mean_height_m": {
     "from": 6.1078,
     "to": 6.0884
    },
    "coastal_land_gained_km2": null,
    "population_ghsl_modelled": {
     "2020": 152824,
     "2025": 172109,
     "change_pct": 12.6
    },
    "built_share_2028_linear_baseline_pct": 57.3,
    "hotels": {
     "hotels_2024": 23,
     "hotels_2024_still_open": 20,
     "hotels_2024_closed_or_gone": 3,
     "hotel_survival_pct": 87.0,
     "hotel_type_listings_not_in_2024_scrape": 31,
     "hotels_star4plus_2024": 0,
     "hotel_median_price_idr_2024": 175500
    },
    "osm_business_counts": {
     "fnb": {
      "2024": 12,
      "2026": 11,
      "growth_pct": -8.3
     },
     "retail": {
      "2024": 17,
      "2026": 19,
      "growth_pct": 11.8
     },
     "office": {
      "2024": 4,
      "2026": 5,
      "growth_pct": 25.0
     }
    },
    "batam_wide_change": {
     "ndbi": -0.053,
     "ndvi": 0.052,
     "dw_built": 0.369,
     "dw_bare": -0.429,
     "s1_vv": 0.29,
     "lst": 1.604,
     "viirs": 9.2
    },
    "change_relative_to_batam": {
     "ndbi": 0.033,
     "ndvi": -0.028,
     "dw_built": -0.969,
     "dw_bare": -1.671,
     "s1_vv": 0.69,
     "lst": 1.216,
     "viirs": -5.2
    },
    "decade_2016_2025": {
     "landsat_ndbi": {
      "2016": -0.128,
      "2025": -0.1515,
      "delta": -0.023
     },
     "landsat_ndvi": {
      "2016": 0.4819,
      "2025": 0.5014,
      "delta": 0.019
     },
     "night_lights_radiance": {
      "2016": 14.5111,
      "2025": 15.6945,
      "change_pct": 8.2
     },
     "radar_vv_db": {
      "2016": -7.7007,
      "2025": -6.7346,
      "delta_db": 0.97
     },
     "open_buildings_cover_pct_2016_2023": {
      "2016": 8.72,
      "2023": 9.83,
      "delta_pp": 1.11
     },
     "land_surface_temp_c": {
      "2016": 39.2829,
      "2025": 38.8066,
      "delta": -0.48
     },
     "population_ghsl_modelled": {
      "2015": 124831,
      "2025": 172109,
      "change_pct": 37.9
     },
     "osm_counts_2016_2026": {
      "lodging": {
       "2016": 0,
       "2026": 3
      },
      "fnb": {
       "2016": 1,
       "2026": 11
      },
      "retail": {
       "2016": 8,
       "2026": 19
      },
      "office": {
       "2016": 0,
       "2026": 5
      }
     }
    },
    "decade_relative_to_batam": {
     "l_ndbi": 0.034,
     "l_ndvi": -0.008,
     "l_lst": 1.063,
     "s1_vv": 0.643,
     "viirs": -18.1,
     "ob_built": 0.473
    },
    "batam_wide_decade_change": {
     "l_ndbi": -0.057,
     "l_ndvi": 0.027,
     "l_lst": -1.543,
     "s1_vv": 0.327,
     "viirs": 26.3,
     "ob_built": 0.637
    }
   },
   "series": {
    "2019": {
     "dw_bare": 0.064,
     "dw_built": 0.5555,
     "dw_crops": 0.006,
     "dw_trees": 0.3278,
     "dw_water": 0.0304,
     "lst": 35.9899,
     "mndwi": -0.3544,
     "ndbi": -0.062,
     "ndvi": 0.4038,
     "ob_built": 0.0993,
     "ob_height": 6.1078,
     "s1_vv": -7.71,
     "viirs": 15.0853
    },
    "2020": {
     "dw_bare": 0.0652,
     "dw_built": 0.5628,
     "dw_crops": 0.0038,
     "dw_trees": 0.321,
     "dw_water": 0.0342,
     "lst": 36.7966,
     "mndwi": -0.3442,
     "ndbi": -0.0703,
     "ndvi": 0.4025,
     "ob_built": 0.1075,
     "ob_height": 6.0324,
     "s1_vv": -7.4487,
     "viirs": 9.7146
    },
    "2021": {
     "dw_bare": 0.0557,
     "dw_built": 0.6267,
     "dw_crops": 0.0115,
     "dw_trees": 0.257,
     "dw_water": 0.0353,
     "lst": 38.4182,
     "mndwi": -0.3518,
     "ndbi": -0.0739,
     "ndvi": 0.4162,
     "ob_built": 0.1096,
     "ob_height": 6.2994,
     "s1_vv": -7.4559,
     "viirs": 11.7357
    },
    "2022": {
     "dw_bare": 0.0458,
     "dw_built": 0.5794,
     "dw_crops": 0.0051,
     "dw_trees": 0.3328,
     "dw_water": 0.0264,
     "lst": 34.2522,
     "mndwi": -0.3234,
     "ndbi": -0.0971,
     "ndvi": 0.4095,
     "ob_built": 0.0951,
     "ob_height": 5.9812,
     "s1_vv": -7.3527,
     "viirs": 13.6831
    },
    "2023": {
     "dw_bare": 0.0376,
     "dw_built": 0.5899,
     "dw_crops": 0.0062,
     "dw_trees": 0.335,
     "dw_water": 0.0233,
     "lst": 35.1278,
     "mndwi": -0.3454,
     "ndbi": -0.0858,
     "ndvi": 0.4184,
     "ob_built": 0.0983,
     "ob_height": 6.0884,
     "s1_vv": -6.9661,
     "viirs": 13.8347
    },
    "2024": {
     "dw_bare": 0.0406,
     "dw_built": 0.5806,
     "dw_crops": 0.0061,
     "dw_trees": 0.3364,
     "dw_water": 0.031,
     "lst": 37.1015,
     "mndwi": -0.3497,
     "ndbi": -0.0916,
     "ndvi": 0.4241,
     "s1_vv": -6.6707,
     "viirs": 15.532
    },
    "2025": {
     "dw_bare": 0.0426,
     "dw_built": 0.5491,
     "dw_crops": 0.0006,
     "dw_trees": 0.3242,
     "dw_water": 0.0794,
     "lst": 38.8066,
     "mndwi": -0.3627,
     "ndbi": -0.0817,
     "ndvi": 0.4275,
     "s1_vv": -6.7346,
     "viirs": 15.6945
    },
    "2026": {
     "dw_bare": 0.0522,
     "dw_built": 0.5827,
     "dw_crops": 0.0013,
     "dw_trees": 0.3284,
     "dw_water": 0.0223,
     "lst": 38.4391,
     "mndwi": -0.3303,
     "ndbi": -0.066,
     "ndvi": 0.3816,
     "s1_vv": -7.1227,
     "viirs": 20.0059
    }
   },
   "gemma": {
    "verdict": "MATURE_STABLE",
    "growth_score": 42,
    "confidence": "high",
    "headline": "Mature residential-industrial hub shifting from land expansion to internal densification",
    "image_observations": "Images 1 and 2 show a very stable, dense urban footprint with no major new estates. Image 3 confirms this, with the vast majority of the kecamatan remaining grey (built in both years) and only scattered, small-scale new construction.",
    "reasoning": "The physical footprint is stagnant, with Dynamic World built share slightly down (-0.6 pp) and Open Buildings cover flat. However, the significant rise in Radar VV (+0.98 dB) combined with population growth (+12.6%) and rising LST (+2.82°C) strongly indicates 'in-filling'—where existing plots are densified with more structures. Economic activity (VIIRS) is growing but lags the city-wide average, typical of a mature residential zone.",
    "conflicts": "Radar VV suggests structural increase while DW Built Share is flat; resolved as internal densification (vertical or plot-filling) rather than horizontal sprawl.",
    "evidence": [
     {
      "signal": "dynamic_world_built_share_pct",
      "reading": "-0.6 pp delta",
      "meaning": "No significant horizontal expansion of the urban footprint."
     },
     {
      "signal": "radar_vv_db",
      "reading": "+0.98 dB",
      "meaning": "Strong signal of increased structural density or material change within existing built areas."
     },
     {
      "signal": "population_ghsl_modelled",
      "reading": "+12.6% (2020-2025)",
      "meaning": "Continued demand for housing in an already dense area."
     },
     {
      "signal": "change_relative_to_batam (viirs)",
      "reading": "-5.2%",
      "meaning": "Economic activity growth is slower than the city average, indicating a plateaued growth phase."
     }
    ],
    "outlook_2028": {
     "trajectory": "steady",
     "built_share_2028_pct": 57.1,
     "rationale": "Growth will remain internal; the urban boundary is effectively locked, with only minor incremental additions."
    },
    "decade_story": "Between 2016 and 2025, Batu Aji evolved into a primary population center with a 37.9% increase in modeled population. Images 4 and 5 show the consolidation of a dense urban fabric, supported by a decade-long Radar VV increase of 0.97 dB.",
    "recommendation": "Shift focus from land acquisition to urban renewal and infrastructure upgrading to support the high population density.",
    "watch_next": "land_surface_temp_c (to monitor urban heat island effects from densification)",
    "_model": "gemma-4-31b-it"
   }
  },
  "batu-ampar": {
   "id": "batu-ampar",
   "name": "Batu Ampar",
   "signals": {
    "kecamatan": "Batu Ampar",
    "area_km2": 11.42,
    "period": "2019->2025 (satellite), Jan 2024->Oct 2026 (hotels/OSM)",
    "ndbi": {
     "from": 0.0546,
     "to": 0.0482,
     "delta": -0.006
    },
    "ndvi": {
     "from": 0.2675,
     "to": 0.2484,
     "delta": -0.019
    },
    "dynamic_world_built_share_pct": {
     "from": 85.7,
     "to": 88.2,
     "delta_pp": 2.5
    },
    "dynamic_world_bare_share_pct": {
     "from": 6.4,
     "to": 3.3,
     "delta_pp": -3.1
    },
    "dynamic_world_tree_share_delta_pp": -0.6,
    "night_lights_radiance": {
     "from": 42.8322,
     "to": 47.9329,
     "change_pct": 11.9
    },
    "radar_vv_db": {
     "from": -6.1305,
     "to": -5.0623,
     "delta_db": 1.07
    },
    "land_surface_temp_c": {
     "from": 37.9655,
     "to": 41.2739,
     "delta": 3.31
    },
    "open_buildings_cover_pct_2019_2023": {
     "from": 15.71,
     "to": 16.78,
     "delta_pp": 1.07
    },
    "open_buildings_mean_height_m": {
     "from": 7.9148,
     "to": 7.3832
    },
    "coastal_land_gained_km2": null,
    "population_ghsl_modelled": {
     "2020": 134189,
     "2025": 148783,
     "change_pct": 10.9
    },
    "built_share_2028_linear_baseline_pct": 92.0,
    "hotels": {
     "hotels_2024": 65,
     "hotels_2024_still_open": 60,
     "hotels_2024_closed_or_gone": 5,
     "hotel_survival_pct": 92.3,
     "hotel_type_listings_not_in_2024_scrape": 42,
     "hotels_star4plus_2024": 6,
     "hotel_median_price_idr_2024": 179180
    },
    "osm_business_counts": {
     "fnb": {
      "2024": 22,
      "2026": 23,
      "growth_pct": 4.5
     },
     "retail": {
      "2024": 33,
      "2026": 34,
      "growth_pct": 3.0
     },
     "office": {
      "2024": 4,
      "2026": 4,
      "growth_pct": 0.0
     }
    },
    "batam_wide_change": {
     "ndbi": -0.053,
     "ndvi": 0.052,
     "dw_built": 0.369,
     "dw_bare": -0.429,
     "s1_vv": 0.29,
     "lst": 1.604,
     "viirs": 9.2
    },
    "change_relative_to_batam": {
     "ndbi": 0.047,
     "ndvi": -0.071,
     "dw_built": 2.131,
     "dw_bare": -2.671,
     "s1_vv": 0.78,
     "lst": 1.706,
     "viirs": 2.7
    },
    "decade_2016_2025": {
     "landsat_ndbi": {
      "2016": -0.0248,
      "2025": -0.0303,
      "delta": -0.006
     },
     "landsat_ndvi": {
      "2016": 0.3423,
      "2025": 0.3386,
      "delta": -0.004
     },
     "night_lights_radiance": {
      "2016": 42.1721,
      "2025": 47.9329,
      "change_pct": 13.7
     },
     "radar_vv_db": {
      "2016": -6.0951,
      "2025": -5.0623,
      "delta_db": 1.03
     },
     "open_buildings_cover_pct_2016_2023": {
      "2016": 15.37,
      "2023": 16.78,
      "delta_pp": 1.41
     },
     "land_surface_temp_c": {
      "2016": 43.6003,
      "2025": 41.2739,
      "delta": -2.33
     },
     "population_ghsl_modelled": {
      "2015": 111454,
      "2025": 148783,
      "change_pct": 33.5
     },
     "osm_counts_2016_2026": {
      "lodging": {
       "2016": 17,
       "2026": 31
      },
      "fnb": {
       "2016": 9,
       "2026": 23
      },
      "retail": {
       "2016": 6,
       "2026": 34
      },
      "office": {
       "2016": 0,
       "2026": 4
      }
     }
    },
    "decade_relative_to_batam": {
     "l_ndbi": 0.051,
     "l_ndvi": -0.031,
     "l_lst": -0.787,
     "s1_vv": 0.703,
     "viirs": -12.6,
     "ob_built": 0.773
    },
    "batam_wide_decade_change": {
     "l_ndbi": -0.057,
     "l_ndvi": 0.027,
     "l_lst": -1.543,
     "s1_vv": 0.327,
     "viirs": 26.3,
     "ob_built": 0.637
    }
   },
   "series": {
    "2019": {
     "dw_bare": 0.0642,
     "dw_built": 0.857,
     "dw_crops": 0.0005,
     "dw_trees": 0.0242,
     "dw_water": 0.0486,
     "lst": 37.9655,
     "mndwi": -0.3321,
     "ndbi": 0.0546,
     "ndvi": 0.2675,
     "ob_built": 0.1571,
     "ob_height": 7.9148,
     "s1_vv": -6.1305,
     "viirs": 42.8322
    },
    "2020": {
     "dw_bare": 0.0603,
     "dw_built": 0.8621,
     "dw_crops": 0.0004,
     "dw_trees": 0.0242,
     "dw_water": 0.0459,
     "lst": 38.9608,
     "mndwi": -0.3223,
     "ndbi": 0.053,
     "ndvi": 0.2592,
     "ob_built": 0.168,
     "ob_height": 7.3107,
     "s1_vv": -5.7504,
     "viirs": 38.8886
    },
    "2021": {
     "dw_bare": 0.05,
     "dw_built": 0.8696,
     "dw_crops": 0.0003,
     "dw_trees": 0.0245,
     "dw_water": 0.0469,
     "lst": 39.938,
     "mndwi": -0.3143,
     "ndbi": 0.0445,
     "ndvi": 0.2627,
     "ob_built": 0.1753,
     "ob_height": 7.6034,
     "s1_vv": -5.8009,
     "viirs": 45.0267
    },
    "2022": {
     "dw_bare": 0.0374,
     "dw_built": 0.8865,
     "dw_crops": 0.0009,
     "dw_trees": 0.0221,
     "dw_water": 0.0447,
     "lst": 38.7456,
     "mndwi": -0.3062,
     "ndbi": 0.0354,
     "ndvi": 0.2601,
     "ob_built": 0.1584,
     "ob_height": 7.2459,
     "s1_vv": -5.6572,
     "viirs": 46.2472
    },
    "2023": {
     "dw_bare": 0.0365,
     "dw_built": 0.8959,
     "dw_crops": 0.0003,
     "dw_trees": 0.0233,
     "dw_water": 0.0436,
     "lst": 37.6001,
     "mndwi": -0.2985,
     "ndbi": 0.0366,
     "ndvi": 0.2476,
     "ob_built": 0.1678,
     "ob_height": 7.3832,
     "s1_vv": -5.3967,
     "viirs": 46.5938
    },
    "2024": {
     "dw_bare": 0.0272,
     "dw_built": 0.9054,
     "dw_crops": 0.0009,
     "dw_trees": 0.0238,
     "dw_water": 0.0427,
     "lst": 40.5438,
     "mndwi": -0.307,
     "ndbi": 0.0375,
     "ndvi": 0.2532,
     "s1_vv": -5.0626,
     "viirs": 49.1021
    },
    "2025": {
     "dw_bare": 0.033,
     "dw_built": 0.8825,
     "dw_crops": 0,
     "dw_trees": 0.0184,
     "dw_water": 0.0659,
     "lst": 41.2739,
     "mndwi": -0.3118,
     "ndbi": 0.0482,
     "ndvi": 0.2484,
     "s1_vv": -5.0623,
     "viirs": 47.9329
    },
    "2026": {
     "dw_bare": 0.0443,
     "dw_built": 0.8977,
     "dw_crops": 0,
     "dw_trees": 0.0169,
     "dw_water": 0.0411,
     "lst": 40.2165,
     "mndwi": -0.2661,
     "ndbi": 0.0467,
     "ndvi": 0.2025,
     "s1_vv": -5.2619,
     "viirs": 58.0396
    }
   },
   "gemma": {
    "verdict": "MATURE_STABLE",
    "growth_score": 45,
    "confidence": "high",
    "headline": "Mature Port Hub with Steady Infill and High Economic Resilience",
    "image_observations": "Images 1 and 2 show a highly dense urban and industrial fabric dominated by port infrastructure on the west coast. Image 3 confirms very little new land clearing, with growth appearing as scattered green infill patches within the existing built-up area.",
    "reasoning": "Batu Ampar is already extremely dense, with a built share of 88.2%. While physical growth is slow (DW built share +2.5 pp), it is real, as confirmed by the strong Radar VV increase (+1.07 dB) and Open Buildings cover gain. Economic activity is stable and resilient, evidenced by a very high hotel survival rate (92.3%) and rising night lights (+11.9%), outperforming the Batam-wide trend in relative terms.",
    "conflicts": "NDBI shows a slight raw decrease, but I resolved this by prioritizing Radar VV and Dynamic World built share, which more accurately capture structural intensification in already dense areas.",
    "evidence": [
     {
      "signal": "dynamic_world_built_share_pct",
      "reading": "85.7% -> 88.2%",
      "meaning": "High baseline density with continued incremental infill growth."
     },
     {
      "signal": "hotel_survival_pct",
      "reading": "92.3%",
      "meaning": "Exceptional economic stability and demand for lodging in the port zone."
     },
     {
      "signal": "radar_vv_db",
      "reading": "+1.07 dB",
      "meaning": "Strong signal for increased structural density and hard surfaces."
     },
     {
      "signal": "night_lights_radiance",
      "reading": "+11.9%",
      "meaning": "Steady increase in economic activity, exceeding the city-wide average relative growth."
     }
    ],
    "outlook_2028": {
     "trajectory": "steady",
     "built_share_2028_pct": 89.5,
     "rationale": "Extremely limited available land means growth will be restricted to small-scale infill and intensification."
    },
    "decade_story": "From 2016 to 2025, Batu Ampar evolved into a consolidated industrial-urban core, with population growing by 33.5%. Images 4 and 5 show the transition from a port-centric area to a fully saturated urban zone, supported by a 1.03 dB increase in Radar VV.",
    "recommendation": "Shift focus from land allocation to urban renewal, traffic management, and upgrading port-related infrastructure to handle higher density.",
    "watch_next": "open_buildings_mean_height_m",
    "_model": "gemma-4-31b-it"
   }
  },
  "belakang-padang": {
   "id": "belakang-padang",
   "name": "Belakang Padang",
   "signals": {
    "kecamatan": "Belakang Padang",
    "area_km2": 68.07,
    "period": "2019->2025 (satellite), Jan 2024->Oct 2026 (hotels/OSM)",
    "ndbi": {
     "from": -0.3406,
     "to": -0.3996,
     "delta": -0.059
    },
    "ndvi": {
     "from": 0.7272,
     "to": 0.7891,
     "delta": 0.062
    },
    "dynamic_world_built_share_pct": {
     "from": 4.7,
     "to": 4.1,
     "delta_pp": -0.6
    },
    "dynamic_world_bare_share_pct": {
     "from": 0.1,
     "to": 0.1,
     "delta_pp": -0.0
    },
    "dynamic_world_tree_share_delta_pp": 4.2,
    "night_lights_radiance": {
     "from": 1.0336,
     "to": 0.8418,
     "change_pct": -18.6
    },
    "radar_vv_db": {
     "from": -8.6951,
     "to": -8.6059,
     "delta_db": 0.09
    },
    "land_surface_temp_c": {
     "from": 32.0383,
     "to": 33.9839,
     "delta": 1.95
    },
    "open_buildings_cover_pct_2019_2023": {
     "from": 0.45,
     "to": 0.5,
     "delta_pp": 0.05
    },
    "open_buildings_mean_height_m": {
     "from": 5.0818,
     "to": 5.3281
    },
    "coastal_land_gained_km2": null,
    "population_ghsl_modelled": {
     "2020": 13380,
     "2025": 15477,
     "change_pct": 15.7
    },
    "built_share_2028_linear_baseline_pct": 4.0,
    "hotels": {
     "hotels_2024": 0,
     "hotels_2024_still_open": 0,
     "hotels_2024_closed_or_gone": 0,
     "hotel_survival_pct": null,
     "hotel_type_listings_not_in_2024_scrape": 15,
     "hotels_star4plus_2024": 0,
     "hotel_median_price_idr_2024": null
    },
    "osm_business_counts": {
     "fnb": {
      "2024": 0,
      "2026": 0,
      "growth_pct": null
     },
     "retail": {
      "2024": 0,
      "2026": 0,
      "growth_pct": null
     },
     "office": {
      "2024": 1,
      "2026": 1,
      "growth_pct": 0.0
     }
    },
    "batam_wide_change": {
     "ndbi": -0.053,
     "ndvi": 0.052,
     "dw_built": 0.369,
     "dw_bare": -0.429,
     "s1_vv": 0.29,
     "lst": 1.604,
     "viirs": 9.2
    },
    "change_relative_to_batam": {
     "ndbi": -0.006,
     "ndvi": 0.01,
     "dw_built": -0.969,
     "dw_bare": 0.429,
     "s1_vv": -0.2,
     "lst": 0.346,
     "viirs": -27.8
    },
    "decade_2016_2025": {
     "landsat_ndbi": {
      "2016": -0.401,
      "2025": -0.4667,
      "delta": -0.066
     },
     "landsat_ndvi": {
      "2016": 0.8128,
      "2025": 0.8451,
      "delta": 0.032
     },
     "night_lights_radiance": {
      "2016": 0.7706,
      "2025": 0.8418,
      "change_pct": 9.2
     },
     "radar_vv_db": {
      "2016": -8.6112,
      "2025": -8.6059,
      "delta_db": 0.01
     },
     "open_buildings_cover_pct_2016_2023": {
      "2016": 0.41,
      "2023": 0.5,
      "delta_pp": 0.09
     },
     "land_surface_temp_c": {
      "2016": 35.4679,
      "2025": 33.9839,
      "delta": -1.48
     },
     "population_ghsl_modelled": {
      "2015": 11011,
      "2025": 15477,
      "change_pct": 40.6
     },
     "osm_counts_2016_2026": {
      "lodging": {
       "2016": 0,
       "2026": 0
      },
      "fnb": {
       "2016": 0,
       "2026": 0
      },
      "retail": {
       "2016": 0,
       "2026": 0
      },
      "office": {
       "2016": 0,
       "2026": 1
      }
     }
    },
    "decade_relative_to_batam": {
     "l_ndbi": -0.009,
     "l_ndvi": 0.005,
     "l_lst": 0.063,
     "s1_vv": -0.317,
     "viirs": -17.1,
     "ob_built": -0.547
    },
    "batam_wide_decade_change": {
     "l_ndbi": -0.057,
     "l_ndvi": 0.027,
     "l_lst": -1.543,
     "s1_vv": 0.327,
     "viirs": 26.3,
     "ob_built": 0.637
    }
   },
   "series": {
    "2019": {
     "dw_bare": 0.0012,
     "dw_built": 0.0466,
     "dw_crops": 0.0005,
     "dw_trees": 0.8176,
     "dw_water": 0.0965,
     "lst": 32.0383,
     "mndwi": -0.3001,
     "ndbi": -0.3406,
     "ndvi": 0.7272,
     "ob_built": 0.0045,
     "ob_height": 5.0818,
     "s1_vv": -8.6951,
     "viirs": 1.0336
    },
    "2020": {
     "dw_bare": 0.0011,
     "dw_built": 0.0485,
     "dw_crops": 0.0007,
     "dw_trees": 0.8075,
     "dw_water": 0.1005,
     "lst": 32.502,
     "mndwi": -0.2827,
     "ndbi": -0.3431,
     "ndvi": 0.7123,
     "ob_built": 0.0043,
     "ob_height": 5.1638,
     "s1_vv": -8.6409,
     "viirs": 0.7988
    },
    "2021": {
     "dw_bare": 0.0006,
     "dw_built": 0.0464,
     "dw_crops": 0.0001,
     "dw_trees": 0.8343,
     "dw_water": 0.0952,
     "lst": 32.3136,
     "mndwi": -0.288,
     "ndbi": -0.3643,
     "ndvi": 0.7364,
     "ob_built": 0.0048,
     "ob_height": 5.1482,
     "s1_vv": -8.6249,
     "viirs": 0.8107
    },
    "2022": {
     "dw_bare": 0.0004,
     "dw_built": 0.0456,
     "dw_crops": 0.0003,
     "dw_trees": 0.8374,
     "dw_water": 0.0994,
     "lst": 28.9332,
     "mndwi": -0.2829,
     "ndbi": -0.3766,
     "ndvi": 0.7428,
     "ob_built": 0.0042,
     "ob_height": 5.2631,
     "s1_vv": -8.558,
     "viirs": 0.906
    },
    "2023": {
     "dw_bare": 0.0003,
     "dw_built": 0.0455,
     "dw_crops": 0.0004,
     "dw_trees": 0.8395,
     "dw_water": 0.0971,
     "lst": 31.0938,
     "mndwi": -0.2932,
     "ndbi": -0.3772,
     "ndvi": 0.7514,
     "ob_built": 0.005,
     "ob_height": 5.3281,
     "s1_vv": -8.4706,
     "viirs": 0.8961
    },
    "2024": {
     "dw_bare": 0.0005,
     "dw_built": 0.0451,
     "dw_crops": 0.0003,
     "dw_trees": 0.8455,
     "dw_water": 0.0919,
     "lst": 32.5949,
     "mndwi": -0.3151,
     "ndbi": -0.3892,
     "ndvi": 0.7719,
     "s1_vv": -8.529,
     "viirs": 0.8558
    },
    "2025": {
     "dw_bare": 0.0008,
     "dw_built": 0.0407,
     "dw_crops": 0.0,
     "dw_trees": 0.86,
     "dw_water": 0.0898,
     "lst": 33.9839,
     "mndwi": -0.3274,
     "ndbi": -0.3996,
     "ndvi": 0.7891,
     "s1_vv": -8.6059,
     "viirs": 0.8418
    },
    "2026": {
     "dw_bare": 0.0009,
     "dw_built": 0.0404,
     "dw_crops": 0.0001,
     "dw_trees": 0.8394,
     "dw_water": 0.1006,
     "lst": 33.2266,
     "mndwi": -0.2702,
     "ndbi": -0.3727,
     "ndvi": 0.7267,
     "s1_vv": -8.788,
     "viirs": 1.1529
    }
   },
   "gemma": {
    "verdict": "DECLINING",
    "growth_score": 15,
    "confidence": "high",
    "headline": "Economic activity and built-up footprint decoupling from population growth",
    "image_observations": "Images 1 and 2 show stable, heavily vegetated islands with minimal urban expansion. Image 3 confirms very little new built-up area, with vegetation remaining the dominant land cover.",
    "reasoning": "Despite a 15.7% population increase, economic signals like night lights (-18.6%) and built-up indices (NDBI, DW built share) are declining. The area is not following Batam's urban trajectory, as evidenced by the significant negative relative change in built-up share and light radiance. This suggests a transition toward low-intensity land use that lacks the economic footprint of the main island.",
    "conflicts": "Population is rising while night lights and NDBI fall; I resolve this by concluding that growth is likely informal or low-intensity residential, lacking industrial or commercial density.",
    "evidence": [
     {
      "signal": "Night Lights (VIIRS) change_pct",
      "reading": "-18.6%",
      "meaning": "Significant drop in economic activity/intensity."
     },
     {
      "signal": "Dynamic World built_share_pct delta_pp",
      "reading": "-0.6",
      "meaning": "Lack of new urban development/expansion."
     },
     {
      "signal": "Population GHSL change_pct",
      "reading": "+15.7%",
      "meaning": "Demographic growth without corresponding economic footprint."
     },
     {
      "signal": "NDBI delta",
      "reading": "-0.059",
      "meaning": "Reduced urban density or change in surface composition."
     }
    ],
    "outlook_2028": {
     "trajectory": "slowing",
     "built_share_2028_pct": 3.8,
     "rationale": "Current trends show a persistent decline in both built-up share and economic activity relative to the city center."
    },
    "decade_story": "From 2016 to 2025, Belakang Padang has remained a green, low-intensity island cluster. While population grew by ~40% over the decade, it has significantly lagged behind Batam's economic and built-up expansion (VIIRS: -17.1% relative).",
    "recommendation": "Prioritize maritime connectivity and small-scale local services rather than large-scale industrial or urban zoning.",
    "watch_next": "Night lights (VIIRS) stability",
    "_model": "gemma-4-26b-a4b-it"
   }
  },
  "bengkong": {
   "id": "bengkong",
   "name": "Bengkong",
   "signals": {
    "kecamatan": "Bengkong",
    "area_km2": 14.34,
    "period": "2019->2025 (satellite), Jan 2024->Oct 2026 (hotels/OSM)",
    "ndbi": {
     "from": 0.0876,
     "to": 0.0796,
     "delta": -0.008
    },
    "ndvi": {
     "from": 0.2327,
     "to": 0.2117,
     "delta": -0.021
    },
    "dynamic_world_built_share_pct": {
     "from": 72.8,
     "to": 78.7,
     "delta_pp": 5.9
    },
    "dynamic_world_bare_share_pct": {
     "from": 15.0,
     "to": 9.7,
     "delta_pp": -5.3
    },
    "dynamic_world_tree_share_delta_pp": -2.5,
    "night_lights_radiance": {
     "from": 15.074,
     "to": 22.9149,
     "change_pct": 52.0
    },
    "radar_vv_db": {
     "from": -8.1043,
     "to": -7.1402,
     "delta_db": 0.96
    },
    "land_surface_temp_c": {
     "from": 37.8845,
     "to": 41.5202,
     "delta": 3.64
    },
    "open_buildings_cover_pct_2019_2023": {
     "from": 16.25,
     "to": 19.07,
     "delta_pp": 2.82
    },
    "open_buildings_mean_height_m": {
     "from": 4.4555,
     "to": 3.9606
    },
    "coastal_land_gained_km2": null,
    "population_ghsl_modelled": {
     "2020": 172733,
     "2025": 191591,
     "change_pct": 10.9
    },
    "built_share_2028_linear_baseline_pct": 83.4,
    "hotels": {
     "hotels_2024": 21,
     "hotels_2024_still_open": 16,
     "hotels_2024_closed_or_gone": 5,
     "hotel_survival_pct": 76.2,
     "hotel_type_listings_not_in_2024_scrape": 22,
     "hotels_star4plus_2024": 2,
     "hotel_median_price_idr_2024": 173683
    },
    "osm_business_counts": {
     "fnb": {
      "2024": 27,
      "2026": 29,
      "growth_pct": 7.4
     },
     "retail": {
      "2024": 25,
      "2026": 26,
      "growth_pct": 4.0
     },
     "office": {
      "2024": 4,
      "2026": 4,
      "growth_pct": 0.0
     }
    },
    "batam_wide_change": {
     "ndbi": -0.053,
     "ndvi": 0.052,
     "dw_built": 0.369,
     "dw_bare": -0.429,
     "s1_vv": 0.29,
     "lst": 1.604,
     "viirs": 9.2
    },
    "change_relative_to_batam": {
     "ndbi": 0.045,
     "ndvi": -0.073,
     "dw_built": 5.531,
     "dw_bare": -4.871,
     "s1_vv": 0.67,
     "lst": 2.036,
     "viirs": 42.8
    },
    "decade_2016_2025": {
     "landsat_ndbi": {
      "2016": -0.0006,
      "2025": -0.0009,
      "delta": -0.0
     },
     "landsat_ndvi": {
      "2016": 0.2977,
      "2025": 0.3027,
      "delta": 0.005
     },
     "night_lights_radiance": {
      "2016": 12.1835,
      "2025": 22.9149,
      "change_pct": 88.1
     },
     "radar_vv_db": {
      "2016": -8.6773,
      "2025": -7.1402,
      "delta_db": 1.54
     },
     "open_buildings_cover_pct_2016_2023": {
      "2016": 14.5,
      "2023": 19.07,
      "delta_pp": 4.57
     },
     "land_surface_temp_c": {
      "2016": 42.5888,
      "2025": 41.5202,
      "delta": -1.07
     },
     "population_ghsl_modelled": {
      "2015": 140061,
      "2025": 191591,
      "change_pct": 36.8
     },
     "osm_counts_2016_2026": {
      "lodging": {
       "2016": 4,
       "2026": 10
      },
      "fnb": {
       "2016": 3,
       "2026": 29
      },
      "retail": {
       "2016": 5,
       "2026": 26
      },
      "office": {
       "2016": 0,
       "2026": 4
      }
     }
    },
    "decade_relative_to_batam": {
     "l_ndbi": 0.057,
     "l_ndvi": -0.022,
     "l_lst": 0.473,
     "s1_vv": 1.213,
     "viirs": 61.8,
     "ob_built": 3.933
    },
    "batam_wide_decade_change": {
     "l_ndbi": -0.057,
     "l_ndvi": 0.027,
     "l_lst": -1.543,
     "s1_vv": 0.327,
     "viirs": 26.3,
     "ob_built": 0.637
    }
   },
   "series": {
    "2019": {
     "dw_bare": 0.15,
     "dw_built": 0.728,
     "dw_crops": 0.0052,
     "dw_trees": 0.0374,
     "dw_water": 0.0649,
     "lst": 37.8845,
     "mndwi": -0.3506,
     "ndbi": 0.0876,
     "ndvi": 0.2327,
     "ob_built": 0.1625,
     "ob_height": 4.4555,
     "s1_vv": -8.1043,
     "viirs": 15.074
    },
    "2020": {
     "dw_bare": 0.1381,
     "dw_built": 0.7461,
     "dw_crops": 0.0018,
     "dw_trees": 0.0382,
     "dw_water": 0.0599,
     "lst": 38.6948,
     "mndwi": -0.3392,
     "ndbi": 0.0769,
     "ndvi": 0.2342,
     "ob_built": 0.1923,
     "ob_height": 4.6747,
     "s1_vv": -7.7668,
     "viirs": 13.3561
    },
    "2021": {
     "dw_bare": 0.128,
     "dw_built": 0.7535,
     "dw_crops": 0.0004,
     "dw_trees": 0.0388,
     "dw_water": 0.0604,
     "lst": 40.3303,
     "mndwi": -0.3397,
     "ndbi": 0.0758,
     "ndvi": 0.2361,
     "ob_built": 0.2025,
     "ob_height": 4.9077,
     "s1_vv": -7.6662,
     "viirs": 14.0191
    },
    "2022": {
     "dw_bare": 0.1214,
     "dw_built": 0.7662,
     "dw_crops": 0.0021,
     "dw_trees": 0.0204,
     "dw_water": 0.0711,
     "lst": 38.1242,
     "mndwi": -0.3244,
     "ndbi": 0.0739,
     "ndvi": 0.2212,
     "ob_built": 0.1705,
     "ob_height": 4.1602,
     "s1_vv": -7.5736,
     "viirs": 15.5613
    },
    "2023": {
     "dw_bare": 0.1067,
     "dw_built": 0.7903,
     "dw_crops": 0.0018,
     "dw_trees": 0.0198,
     "dw_water": 0.0672,
     "lst": 39.1422,
     "mndwi": -0.312,
     "ndbi": 0.0719,
     "ndvi": 0.2078,
     "ob_built": 0.1907,
     "ob_height": 3.9606,
     "s1_vv": -7.4594,
     "viirs": 16.8894
    },
    "2024": {
     "dw_bare": 0.1243,
     "dw_built": 0.7958,
     "dw_crops": 0.0008,
     "dw_trees": 0.0198,
     "dw_water": 0.0512,
     "lst": 40.8402,
     "mndwi": -0.3066,
     "ndbi": 0.0664,
     "ndvi": 0.2021,
     "s1_vv": -7.1958,
     "viirs": 20.964
    },
    "2025": {
     "dw_bare": 0.0968,
     "dw_built": 0.7872,
     "dw_crops": 0.0005,
     "dw_trees": 0.0128,
     "dw_water": 0.1006,
     "lst": 41.5202,
     "mndwi": -0.3303,
     "ndbi": 0.0796,
     "ndvi": 0.2117,
     "s1_vv": -7.1402,
     "viirs": 22.9149
    },
    "2026": {
     "dw_bare": 0.0975,
     "dw_built": 0.8454,
     "dw_crops": 0,
     "dw_trees": 0.0143,
     "dw_water": 0.0387,
     "lst": 40.1834,
     "mndwi": -0.2778,
     "ndbi": 0.0673,
     "ndvi": 0.1735,
     "s1_vv": -7.2321,
     "viirs": 26.91
    }
   },
   "gemma": {
    "verdict": "GROWTH_CORRIDOR",
    "growth_score": 82,
    "confidence": "high",
    "headline": "Intense urban infill and residential densification driving significant economic activity",
    "image_observations": "Images 1 and 2 show the transition from a patchy coastal edge to a continuous, dense built-up fabric. Image 3 confirms this via green 'newly built' pixels filling in gaps within the existing grey urban matrix, with minimal new land clearing (orange) visible.",
    "reasoning": "Bengkong exhibits strong realized growth, evidenced by a 5.9pp increase in built share and a 52% surge in night lights. While raw NDBI is slightly down, its relative performance (+0.045) significantly outperforms the Batam-wide trend, marking it as a growth hotspot. The simultaneous rise in radar VV and Open Buildings cover confirms that land is being successfully converted into permanent structures rather than remaining as bare ground.",
    "conflicts": "Raw NDBI shows a slight decrease while Dynamic World built share increases; this was resolved by looking at the 'change_relative_to_batam' metric, which shows Bengkong is actually outperforming the city-wide trend.",
    "evidence": [
     {
      "signal": "dynamic_world_built_share_pct",
      "reading": "+5.9pp",
      "meaning": "Significant conversion of land to built-up surfaces."
     },
     {
      "signal": "night_lights_radiance",
      "reading": "+52.0%",
      "meaning": "Strong increase in nighttime economic and residential activity."
     },
     {
      "signal": "radar_vv_db",
      "reading": "+0.96 dB",
      "meaning": "Increased physical presence of man-made structures."
     },
     {
      "signal": "change_relative_to_batam (VIIRS)",
      "reading": "+42.8%",
      "meaning": "Bengkong is a primary driver of Batam's lighting growth."
     }
    ],
    "outlook_2028": {
     "trajectory": "steady",
     "built_share_2028_pct": 83.4,
     "rationale": "With built share already at 78.7%, growth will likely transition from rapid expansion to slower, high-density infill."
    },
    "decade_story": "From 2016 to 2025, Bengkong transformed into a major urban hub, with night lights nearly doubling (+88.1%) and population growing by 36.8%. Images 4 and 5 illustrate this massive densification and the expansion of the urban footprint.",
    "recommendation": "Prioritize upgrading utility and transport infrastructure to support the high-density residential load and rising population.",
    "watch_next": "hotel_survival_pct",
    "_model": "gemma-4-26b-a4b-it"
   }
  },
  "bulang": {
   "id": "bulang",
   "name": "Bulang",
   "signals": {
    "kecamatan": "Bulang",
    "area_km2": 158.71,
    "period": "2019->2025 (satellite), Jan 2024->Oct 2026 (hotels/OSM)",
    "ndbi": {
     "from": -0.2829,
     "to": -0.3352,
     "delta": -0.052
    },
    "ndvi": {
     "from": 0.6914,
     "to": 0.7539,
     "delta": 0.062
    },
    "dynamic_world_built_share_pct": {
     "from": 2.9,
     "to": 2.5,
     "delta_pp": -0.4
    },
    "dynamic_world_bare_share_pct": {
     "from": 0.9,
     "to": 1.3,
     "delta_pp": 0.4
    },
    "dynamic_world_tree_share_delta_pp": 4.0,
    "night_lights_radiance": {
     "from": 0.8102,
     "to": 0.8072,
     "change_pct": -0.4
    },
    "radar_vv_db": {
     "from": -8.8254,
     "to": -8.736,
     "delta_db": 0.09
    },
    "land_surface_temp_c": {
     "from": 32.555,
     "to": 34.3074,
     "delta": 1.75
    },
    "open_buildings_cover_pct_2019_2023": {
     "from": 0.31,
     "to": 0.27,
     "delta_pp": -0.04
    },
    "open_buildings_mean_height_m": {
     "from": 4.9025,
     "to": 4.586
    },
    "coastal_land_gained_km2": null,
    "population_ghsl_modelled": {
     "2020": 6031,
     "2025": 7676,
     "change_pct": 27.3
    },
    "built_share_2028_linear_baseline_pct": 2.6,
    "hotels": {
     "hotels_2024": 3,
     "hotels_2024_still_open": 3,
     "hotels_2024_closed_or_gone": 0,
     "hotel_survival_pct": 100.0,
     "hotel_type_listings_not_in_2024_scrape": 2,
     "hotels_star4plus_2024": 0,
     "hotel_median_price_idr_2024": null
    },
    "osm_business_counts": {
     "fnb": {
      "2024": 1,
      "2026": 1,
      "growth_pct": 0.0
     },
     "retail": {
      "2024": 0,
      "2026": 0,
      "growth_pct": null
     },
     "office": {
      "2024": 0,
      "2026": 0,
      "growth_pct": null
     }
    },
    "batam_wide_change": {
     "ndbi": -0.053,
     "ndvi": 0.052,
     "dw_built": 0.369,
     "dw_bare": -0.429,
     "s1_vv": 0.29,
     "lst": 1.604,
     "viirs": 9.2
    },
    "change_relative_to_batam": {
     "ndbi": 0.001,
     "ndvi": 0.01,
     "dw_built": -0.769,
     "dw_bare": 0.829,
     "s1_vv": -0.2,
     "lst": 0.146,
     "viirs": -9.6
    },
    "decade_2016_2025": {
     "landsat_ndbi": {
      "2016": -0.3366,
      "2025": -0.3995,
      "delta": -0.063
     },
     "landsat_ndvi": {
      "2016": 0.7701,
      "2025": 0.807,
      "delta": 0.037
     },
     "night_lights_radiance": {
      "2016": 0.65,
      "2025": 0.8072,
      "change_pct": 24.2
     },
     "radar_vv_db": {
      "2016": -8.7477,
      "2025": -8.736,
      "delta_db": 0.01
     },
     "open_buildings_cover_pct_2016_2023": {
      "2016": 0.27,
      "2023": 0.27,
      "delta_pp": 0.0
     },
     "land_surface_temp_c": {
      "2016": 35.9215,
      "2025": 34.3074,
      "delta": -1.61
     },
     "population_ghsl_modelled": {
      "2015": 4253,
      "2025": 7676,
      "change_pct": 80.5
     },
     "osm_counts_2016_2026": {
      "lodging": {
       "2016": 0,
       "2026": 0
      },
      "fnb": {
       "2016": 0,
       "2026": 1
      },
      "retail": {
       "2016": 0,
       "2026": 0
      },
      "office": {
       "2016": 0,
       "2026": 0
      }
     }
    },
    "decade_relative_to_batam": {
     "l_ndbi": -0.006,
     "l_ndvi": 0.01,
     "l_lst": -0.067,
     "s1_vv": -0.317,
     "viirs": -2.1,
     "ob_built": -0.637
    },
    "batam_wide_decade_change": {
     "l_ndbi": -0.057,
     "l_ndvi": 0.027,
     "l_lst": -1.543,
     "s1_vv": 0.327,
     "viirs": 26.3,
     "ob_built": 0.637
    }
   },
   "series": {
    "2019": {
     "dw_bare": 0.0091,
     "dw_built": 0.0287,
     "dw_crops": 0.0048,
     "dw_trees": 0.8255,
     "dw_water": 0.0649,
     "lst": 32.555,
     "mndwi": -0.3486,
     "ndbi": -0.2829,
     "ndvi": 0.6914,
     "ob_built": 0.0031,
     "ob_height": 4.9025,
     "s1_vv": -8.8254,
     "viirs": 0.8102
    },
    "2020": {
     "dw_bare": 0.0105,
     "dw_built": 0.0289,
     "dw_crops": 0.0026,
     "dw_trees": 0.8272,
     "dw_water": 0.0693,
     "lst": 32.6953,
     "mndwi": -0.3431,
     "ndbi": -0.3,
     "ndvi": 0.7,
     "ob_built": 0.0031,
     "ob_height": 4.9097,
     "s1_vv": -8.7461,
     "viirs": 0.622
    },
    "2021": {
     "dw_bare": 0.0105,
     "dw_built": 0.0297,
     "dw_crops": 0.003,
     "dw_trees": 0.8432,
     "dw_water": 0.0686,
     "lst": 30.6249,
     "mndwi": -0.3362,
     "ndbi": -0.3086,
     "ndvi": 0.7009,
     "ob_built": 0.0031,
     "ob_height": 5.4509,
     "s1_vv": -8.7184,
     "viirs": 0.6663
    },
    "2022": {
     "dw_bare": 0.0083,
     "dw_built": 0.0298,
     "dw_crops": 0.0029,
     "dw_trees": 0.8589,
     "dw_water": 0.071,
     "lst": 29.6593,
     "mndwi": -0.3242,
     "ndbi": -0.3317,
     "ndvi": 0.7069,
     "ob_built": 0.0028,
     "ob_height": 4.5878,
     "s1_vv": -8.6643,
     "viirs": 0.7492
    },
    "2023": {
     "dw_bare": 0.0075,
     "dw_built": 0.0295,
     "dw_crops": 0.0849,
     "dw_trees": 0.7738,
     "dw_water": 0.072,
     "lst": 30.9712,
     "mndwi": -0.3241,
     "ndbi": -0.3322,
     "ndvi": 0.7141,
     "ob_built": 0.0027,
     "ob_height": 4.586,
     "s1_vv": -8.6102,
     "viirs": 0.7916
    },
    "2024": {
     "dw_bare": 0.0088,
     "dw_built": 0.029,
     "dw_crops": 0.0028,
     "dw_trees": 0.8541,
     "dw_water": 0.0693,
     "lst": 32.2682,
     "mndwi": -0.3467,
     "ndbi": -0.3336,
     "ndvi": 0.7294,
     "s1_vv": -8.6313,
     "viirs": 0.7702
    },
    "2025": {
     "dw_bare": 0.0127,
     "dw_built": 0.0251,
     "dw_crops": 0.0016,
     "dw_trees": 0.8652,
     "dw_water": 0.0631,
     "lst": 34.3074,
     "mndwi": -0.3818,
     "ndbi": -0.3352,
     "ndvi": 0.7539,
     "s1_vv": -8.736,
     "viirs": 0.8072
    },
    "2026": {
     "dw_bare": 0.0144,
     "dw_built": 0.0255,
     "dw_crops": 0.0025,
     "dw_trees": 0.8461,
     "dw_water": 0.0675,
     "lst": 33.3584,
     "mndwi": -0.3158,
     "ndbi": -0.2977,
     "ndvi": 0.6793,
     "s1_vv": -8.9768,
     "viirs": 1.2278
    }
   },
   "gemma": {
    "verdict": "DECLINING",
    "growth_score": 12,
    "confidence": "high",
    "headline": "Rural stagnation: Bulang falls behind as Batam's urban core expands",
    "image_observations": "Images 1 and 2 show a landscape dominated by dense forest with almost no visible change in urban footprint. Image 3 confirms a near-total absence of new construction, with only tiny, scattered patches of land clearing.",
    "reasoning": "All physical growth indicators, including NDBI and Dynamic World built share, are flat or slightly negative, significantly underperforming the Batam-wide average. Economic activity, as measured by night lights and business counts, has stagnated since 2019. While GHSL population figures show growth, the lack of corresponding built-up expansion suggests organic growth within existing rural settlements rather than new development.",
    "conflicts": "Population growth (GHSL) contradicts the lack of physical expansion; resolved by attributing this to increased density in existing villages rather than new urban construction.",
    "evidence": [
     {
      "signal": "dynamic_world_built_share_pct",
      "reading": "-0.4 pp change (-0.769 relative to Batam)",
      "meaning": "Failure to keep pace with the city's urban expansion."
     },
     {
      "signal": "night_lights_radiance",
      "reading": "-0.4% change (-9.6% relative to Batam)",
      "meaning": "Economic activity is stagnant while the rest of the city grows."
     },
     {
      "signal": "open_buildings_cover_pct_2019_2023",
      "reading": "-0.04 pp change",
      "meaning": "No new significant structures added to the landscape."
     },
     {
      "signal": "osm_business_counts",
      "reading": "Only 1 F&B business recorded",
      "meaning": "Extreme lack of commercial diversification or economic pull."
     }
    ],
    "outlook_2028": {
     "trajectory": "slowing",
     "built_share_2028_pct": 2.5,
     "rationale": "No evidence of planned industrial projects or commercial demand to reverse the current stagnation."
    },
    "decade_story": "Between 2016 and 2025, Bulang saw significant population growth (+80.5%) and an initial rise in night lights (+24.2%), but this momentum completely stalled after 2019. Images 4 and 5 confirm that the area has remained overwhelmingly forested throughout the decade, failing to transition into an urbanized zone.",
    "recommendation": "Designate the area as a permanent green lung or conservation zone, as there is no organic urban demand for development.",
    "watch_next": "dynamic_world_bare_share_pct",
    "_model": "gemma-4-31b-it"
   }
  },
  "galang": {
   "id": "galang",
   "name": "Galang",
   "signals": {
    "kecamatan": "Galang",
    "area_km2": 350.72,
    "period": "2019->2025 (satellite), Jan 2024->Oct 2026 (hotels/OSM)",
    "ndbi": {
     "from": -0.2162,
     "to": -0.306,
     "delta": -0.09
    },
    "ndvi": {
     "from": 0.6443,
     "to": 0.738,
     "delta": 0.094
    },
    "dynamic_world_built_share_pct": {
     "from": 3.7,
     "to": 2.5,
     "delta_pp": -1.2
    },
    "dynamic_world_bare_share_pct": {
     "from": 1.2,
     "to": 0.9,
     "delta_pp": -0.3
    },
    "dynamic_world_tree_share_delta_pp": 12.3,
    "night_lights_radiance": {
     "from": 0.3255,
     "to": 0.4001,
     "change_pct": 22.9
    },
    "radar_vv_db": {
     "from": -9.1552,
     "to": -9.0064,
     "delta_db": 0.15
    },
    "land_surface_temp_c": {
     "from": 34.3736,
     "to": 34.4569,
     "delta": 0.08
    },
    "open_buildings_cover_pct_2019_2023": {
     "from": 0.08,
     "to": 0.08,
     "delta_pp": 0.0
    },
    "open_buildings_mean_height_m": {
     "from": 4.819,
     "to": 4.0953
    },
    "coastal_land_gained_km2": null,
    "population_ghsl_modelled": {
     "2020": 10258,
     "2025": 12784,
     "change_pct": 24.6
    },
    "built_share_2028_linear_baseline_pct": 2.9,
    "hotels": {
     "hotels_2024": 7,
     "hotels_2024_still_open": 7,
     "hotels_2024_closed_or_gone": 0,
     "hotel_survival_pct": 100.0,
     "hotel_type_listings_not_in_2024_scrape": 12,
     "hotels_star4plus_2024": 0,
     "hotel_median_price_idr_2024": 1395445
    },
    "osm_business_counts": {
     "fnb": {
      "2024": 5,
      "2026": 5,
      "growth_pct": 0.0
     },
     "retail": {
      "2024": 1,
      "2026": 1,
      "growth_pct": 0.0
     },
     "office": {
      "2024": 1,
      "2026": 1,
      "growth_pct": 0.0
     }
    },
    "batam_wide_change": {
     "ndbi": -0.053,
     "ndvi": 0.052,
     "dw_built": 0.369,
     "dw_bare": -0.429,
     "s1_vv": 0.29,
     "lst": 1.604,
     "viirs": 9.2
    },
    "change_relative_to_batam": {
     "ndbi": -0.037,
     "ndvi": 0.042,
     "dw_built": -1.569,
     "dw_bare": 0.129,
     "s1_vv": -0.14,
     "lst": -1.524,
     "viirs": 13.7
    },
    "decade_2016_2025": {
     "landsat_ndbi": {
      "2016": -0.2842,
      "2025": -0.3761,
      "delta": -0.092
     },
     "landsat_ndvi": {
      "2016": 0.7308,
      "2025": 0.7871,
      "delta": 0.056
     },
     "night_lights_radiance": {
      "2016": 0.1367,
      "2025": 0.4001,
      "change_pct": 192.7
     },
     "radar_vv_db": {
      "2016": -9.0929,
      "2025": -9.0064,
      "delta_db": 0.09
     },
     "open_buildings_cover_pct_2016_2023": {
      "2016": 0.06,
      "2023": 0.08,
      "delta_pp": 0.02
     },
     "land_surface_temp_c": {
      "2016": 36.2542,
      "2025": 34.4569,
      "delta": -1.8
     },
     "population_ghsl_modelled": {
      "2015": 7045,
      "2025": 12784,
      "change_pct": 81.5
     },
     "osm_counts_2016_2026": {
      "lodging": {
       "2016": 0,
       "2026": 1
      },
      "fnb": {
       "2016": 2,
       "2026": 5
      },
      "retail": {
       "2016": 0,
       "2026": 1
      },
      "office": {
       "2016": 0,
       "2026": 1
      }
     }
    },
    "decade_relative_to_batam": {
     "l_ndbi": -0.035,
     "l_ndvi": 0.029,
     "l_lst": -0.257,
     "s1_vv": -0.237,
     "viirs": 166.4,
     "ob_built": -0.617
    },
    "batam_wide_decade_change": {
     "l_ndbi": -0.057,
     "l_ndvi": 0.027,
     "l_lst": -1.543,
     "s1_vv": 0.327,
     "viirs": 26.3,
     "ob_built": 0.637
    }
   },
   "series": {
    "2019": {
     "dw_bare": 0.0117,
     "dw_built": 0.0369,
     "dw_crops": 0.01,
     "dw_trees": 0.7312,
     "dw_water": 0.048,
     "lst": 34.3736,
     "mndwi": -0.3846,
     "ndbi": -0.2162,
     "ndvi": 0.6443,
     "ob_built": 0.0008,
     "ob_height": 4.819,
     "s1_vv": -9.1552,
     "viirs": 0.3255
    },
    "2020": {
     "dw_bare": 0.0163,
     "dw_built": 0.0466,
     "dw_crops": 0.0081,
     "dw_trees": 0.711,
     "dw_water": 0.0489,
     "lst": 31.5647,
     "mndwi": -0.3988,
     "ndbi": -0.2081,
     "ndvi": 0.6415,
     "ob_built": 0.0009,
     "ob_height": 4.8358,
     "s1_vv": -9.0824,
     "viirs": 0.3508
    },
    "2021": {
     "dw_bare": 0.0122,
     "dw_built": 0.0479,
     "dw_crops": 0.007,
     "dw_trees": 0.7615,
     "dw_water": 0.0537,
     "lst": 29.7604,
     "mndwi": -0.3884,
     "ndbi": -0.2399,
     "ndvi": 0.6671,
     "ob_built": 0.0009,
     "ob_height": 4.8125,
     "s1_vv": -9.0551,
     "viirs": 0.392
    },
    "2022": {
     "dw_bare": 0.0109,
     "dw_built": 0.0411,
     "dw_crops": 0.0084,
     "dw_trees": 0.8028,
     "dw_water": 0.0587,
     "lst": 29.9673,
     "mndwi": -0.3844,
     "ndbi": -0.2774,
     "ndvi": 0.6939,
     "ob_built": 0.0008,
     "ob_height": 4.0871,
     "s1_vv": -8.9815,
     "viirs": 0.3879
    },
    "2023": {
     "dw_bare": 0.011,
     "dw_built": 0.0425,
     "dw_crops": 0.0084,
     "dw_trees": 0.8168,
     "dw_water": 0.0574,
     "lst": 32.1584,
     "mndwi": -0.3674,
     "ndbi": -0.2861,
     "ndvi": 0.6955,
     "ob_built": 0.0008,
     "ob_height": 4.0953,
     "s1_vv": -8.9475,
     "viirs": 0.4396
    },
    "2024": {
     "dw_bare": 0.0113,
     "dw_built": 0.0415,
     "dw_crops": 0.0184,
     "dw_trees": 0.8055,
     "dw_water": 0.0565,
     "lst": 32.6986,
     "mndwi": -0.3797,
     "ndbi": -0.3023,
     "ndvi": 0.7196,
     "s1_vv": -8.8951,
     "viirs": 0.4077
    },
    "2025": {
     "dw_bare": 0.0088,
     "dw_built": 0.0247,
     "dw_crops": 0.0128,
     "dw_trees": 0.8542,
     "dw_water": 0.0529,
     "lst": 34.4569,
     "mndwi": -0.3926,
     "ndbi": -0.306,
     "ndvi": 0.738,
     "s1_vv": -9.0064,
     "viirs": 0.4001
    },
    "2026": {
     "dw_bare": 0.0093,
     "dw_built": 0.0289,
     "dw_crops": 0.0048,
     "dw_trees": 0.8292,
     "dw_water": 0.0571,
     "lst": 32.4401,
     "mndwi": -0.3488,
     "ndbi": -0.2792,
     "ndvi": 0.6834,
     "s1_vv": -9.2048,
     "viirs": 0.5244
    }
   },
   "gemma": {
    "verdict": "UNDERBUILT_DEMAND",
    "growth_score": 68,
    "confidence": "high",
    "headline": "Population and light surge outpaces physical built-up footprint",
    "image_observations": "Images 1 and 2 show a landscape dominated by dense vegetation with only sparse, isolated settlements. Image 3 shows very little new built-up area, confirming the low physical expansion signal.",
    "reasoning": "There is a stark decoupling between human activity signals and physical construction. While night lights (+22.9%) and population (+24.6%) are growing robustly, the NDBI and built-share are actually declining. This suggests that growth is occurring through low-density residential settlement or that the physical infrastructure is not yet manifesting as high-density concrete structures detectable by the built-up classifier.",
    "conflicts": "NDBI and built-share trend downward while VIIRS and population trend upward; resolved by identifying a lag between human arrival and formal urbanization.",
    "evidence": [
     {
      "signal": "night_lights_radiance (2016-2025)",
      "reading": "+192.7%",
      "meaning": "Massive long-term economic and residential expansion."
     },
     {
      "signal": "population_ghsl_modelled (2015-2025)",
      "reading": "+81.5%",
      "meaning": "Significant demographic surge over the decade."
     },
     {
      "signal": "dynamic_world_built_share_pct (2019-2025)",
      "reading": "-1.2pp",
      "meaning": "Physical built footprint is lagging behind human activity."
     },
     {
      "signal": "hotel_survival_pct",
      "reading": "100.0%",
      "meaning": "High stability in existing hospitality services despite low density."
     }
    ],
    "outlook_2028": {
     "trajectory": "accelerating",
     "built_share_2028_pct": 3.8,
     "rationale": "The massive gap between population/light growth and physical built-up area suggests a significant 'catch-up' phase of construction is imminent."
    },
    "decade_story": "From 2016 to 2025, Galang underwent a massive demographic and economic surge, with population up 81.5% and night lights up 192.7%. However, as seen in Images 4 and 5, the landscape remains predominantly green, indicating that urbanization is significantly trailing human presence.",
    "recommendation": "Prioritize utility and transport infrastructure to support the surging population and light-detected activity.",
    "watch_next": "open_buildings_cover_pct",
    "_model": "gemma-4-26b-a4b-it"
   }
  },
  "lubuk-baja": {
   "id": "lubuk-baja",
   "name": "Lubuk Baja",
   "signals": {
    "kecamatan": "Lubuk Baja",
    "area_km2": 11.24,
    "period": "2019->2025 (satellite), Jan 2024->Oct 2026 (hotels/OSM)",
    "ndbi": {
     "from": 0.0283,
     "to": 0.0076,
     "delta": -0.021
    },
    "ndvi": {
     "from": 0.3225,
     "to": 0.3266,
     "delta": 0.004
    },
    "dynamic_world_built_share_pct": {
     "from": 73.8,
     "to": 69.5,
     "delta_pp": -4.3
    },
    "dynamic_world_bare_share_pct": {
     "from": 1.4,
     "to": 0.0,
     "delta_pp": -1.4
    },
    "dynamic_world_tree_share_delta_pp": -0.7,
    "night_lights_radiance": {
     "from": 28.1061,
     "to": 26.5136,
     "change_pct": -5.7
    },
    "radar_vv_db": {
     "from": -7.2966,
     "to": -6.8741,
     "delta_db": 0.42
    },
    "land_surface_temp_c": {
     "from": 36.5822,
     "to": 40.4253,
     "delta": 3.84
    },
    "open_buildings_cover_pct_2019_2023": {
     "from": 18.92,
     "to": 19.72,
     "delta_pp": 0.8
    },
    "open_buildings_mean_height_m": {
     "from": 7.4501,
     "to": 7.0215
    },
    "coastal_land_gained_km2": null,
    "population_ghsl_modelled": {
     "2020": 146859,
     "2025": 163786,
     "change_pct": 11.5
    },
    "built_share_2028_linear_baseline_pct": 70.3,
    "hotels": {
     "hotels_2024": 152,
     "hotels_2024_still_open": 134,
     "hotels_2024_closed_or_gone": 18,
     "hotel_survival_pct": 88.2,
     "hotel_type_listings_not_in_2024_scrape": 37,
     "hotels_star4plus_2024": 15,
     "hotel_median_price_idr_2024": 246400
    },
    "osm_business_counts": {
     "fnb": {
      "2024": 72,
      "2026": 84,
      "growth_pct": 16.7
     },
     "retail": {
      "2024": 97,
      "2026": 135,
      "growth_pct": 39.2
     },
     "office": {
      "2024": 16,
      "2026": 17,
      "growth_pct": 6.2
     }
    },
    "batam_wide_change": {
     "ndbi": -0.053,
     "ndvi": 0.052,
     "dw_built": 0.369,
     "dw_bare": -0.429,
     "s1_vv": 0.29,
     "lst": 1.604,
     "viirs": 9.2
    },
    "change_relative_to_batam": {
     "ndbi": 0.032,
     "ndvi": -0.048,
     "dw_built": -4.669,
     "dw_bare": -0.971,
     "s1_vv": 0.13,
     "lst": 2.236,
     "viirs": -14.9
    },
    "decade_2016_2025": {
     "landsat_ndbi": {
      "2016": -0.0538,
      "2025": -0.0682,
      "delta": -0.014
     },
     "landsat_ndvi": {
      "2016": 0.4268,
      "2025": 0.4261,
      "delta": -0.001
     },
     "night_lights_radiance": {
      "2016": 21.1531,
      "2025": 26.5136,
      "change_pct": 25.3
     },
     "radar_vv_db": {
      "2016": -7.4548,
      "2025": -6.8741,
      "delta_db": 0.58
     },
     "open_buildings_cover_pct_2016_2023": {
      "2016": 18.58,
      "2023": 19.72,
      "delta_pp": 1.14
     },
     "land_surface_temp_c": {
      "2016": 41.9614,
      "2025": 40.4253,
      "delta": -1.54
     },
     "population_ghsl_modelled": {
      "2015": 122871,
      "2025": 163786,
      "change_pct": 33.3
     },
     "osm_counts_2016_2026": {
      "lodging": {
       "2016": 27,
       "2026": 88
      },
      "fnb": {
       "2016": 24,
       "2026": 84
      },
      "retail": {
       "2016": 35,
       "2026": 135
      },
      "office": {
       "2016": 2,
       "2026": 17
      }
     }
    },
    "decade_relative_to_batam": {
     "l_ndbi": 0.043,
     "l_ndvi": -0.028,
     "l_lst": 0.003,
     "s1_vv": 0.253,
     "viirs": -1.0,
     "ob_built": 0.503
    },
    "batam_wide_decade_change": {
     "l_ndbi": -0.057,
     "l_ndvi": 0.027,
     "l_lst": -1.543,
     "s1_vv": 0.327,
     "viirs": 26.3,
     "ob_built": 0.637
    }
   },
   "series": {
    "2019": {
     "dw_bare": 0.0142,
     "dw_built": 0.7382,
     "dw_crops": 0.0091,
     "dw_trees": 0.131,
     "dw_water": 0.092,
     "lst": 36.5822,
     "mndwi": -0.3229,
     "ndbi": 0.0283,
     "ndvi": 0.3225,
     "ob_built": 0.1892,
     "ob_height": 7.4501,
     "s1_vv": -7.2966,
     "viirs": 28.1061
    },
    "2020": {
     "dw_bare": 0.0155,
     "dw_built": 0.7493,
     "dw_crops": 0.0087,
     "dw_trees": 0.1198,
     "dw_water": 0.0908,
     "lst": 38.7054,
     "mndwi": -0.3123,
     "ndbi": 0.028,
     "ndvi": 0.3114,
     "ob_built": 0.2075,
     "ob_height": 7.0774,
     "s1_vv": -7.0182,
     "viirs": 21.6905
    },
    "2021": {
     "dw_bare": 0.0089,
     "dw_built": 0.7482,
     "dw_crops": 0.0058,
     "dw_trees": 0.1255,
     "dw_water": 0.0949,
     "lst": 41.4965,
     "mndwi": -0.3021,
     "ndbi": 0.0178,
     "ndvi": 0.3145,
     "ob_built": 0.2119,
     "ob_height": 7.5062,
     "s1_vv": -7.086,
     "viirs": 21.0585
    },
    "2022": {
     "dw_bare": 0.0055,
     "dw_built": 0.7492,
     "dw_crops": 0.0052,
     "dw_trees": 0.1392,
     "dw_water": 0.0934,
     "lst": 37.3298,
     "mndwi": -0.293,
     "ndbi": -0.0038,
     "ndvi": 0.3246,
     "ob_built": 0.1875,
     "ob_height": 6.7274,
     "s1_vv": -7.0333,
     "viirs": 22.5888
    },
    "2023": {
     "dw_bare": 0.0038,
     "dw_built": 0.7383,
     "dw_crops": 0.0224,
     "dw_trees": 0.1231,
     "dw_water": 0.101,
     "lst": 35.679,
     "mndwi": -0.2824,
     "ndbi": -0.0046,
     "ndvi": 0.3119,
     "ob_built": 0.1972,
     "ob_height": 7.0215,
     "s1_vv": -6.9496,
     "viirs": 24.1974
    },
    "2024": {
     "dw_bare": 0.0058,
     "dw_built": 0.74,
     "dw_crops": 0.0119,
     "dw_trees": 0.1425,
     "dw_water": 0.0913,
     "lst": 41.5122,
     "mndwi": -0.2961,
     "ndbi": -0.0005,
     "ndvi": 0.3234,
     "s1_vv": -6.798,
     "viirs": 28.5912
    },
    "2025": {
     "dw_bare": 0.0003,
     "dw_built": 0.6951,
     "dw_crops": 0,
     "dw_trees": 0.1239,
     "dw_water": 0.1782,
     "lst": 40.4253,
     "mndwi": -0.3023,
     "ndbi": 0.0076,
     "ndvi": 0.3266,
     "s1_vv": -6.8741,
     "viirs": 26.5136
    },
    "2026": {
     "dw_bare": 0.0122,
     "dw_built": 0.7804,
     "dw_crops": 0.0002,
     "dw_trees": 0.1187,
     "dw_water": 0.0824,
     "lst": 38.6847,
     "mndwi": -0.2531,
     "ndbi": 0.0022,
     "ndvi": 0.2692,
     "s1_vv": -7.005,
     "viirs": 34.3488
    }
   },
   "gemma": {
    "verdict": "MATURE_STABLE",
    "growth_score": 45,
    "confidence": "high",
    "headline": "Dense urban core consolidating through retail and service-sector intensification",
    "image_observations": "Images 1 and 2 reveal a highly saturated urban fabric with almost no vacant land. Image 3 is dominated by grey, confirming that the built environment was largely established prior to 2019.",
    "reasoning": "The decline in NDBI and DW built share is offset by rising Open Buildings and Radar VV, suggesting vertical densification rather than loss of area. Economic activity is shifting toward retail and F&B, as evidenced by strong OSM growth. This indicates a mature district transitioning into a high-intensity service hub.",
    "conflicts": "NDBI/DW built share vs. Open Buildings/Radar. I resolved this by prioritizing structural and economic signals over spectral indices which can be unstable in hyper-dense urban cores.",
    "evidence": [
     {
      "signal": "open_buildings_cover_pct_2019_2023",
      "reading": "+0.8 pp",
      "meaning": "Realized structural densification"
     },
     {
      "signal": "retail_growth_pct",
      "reading": "39.2%",
      "meaning": "Strong service-sector momentum"
     },
     {
      "signal": "radar_vv_db",
      "reading": "+0.42 dB",
      "meaning": "Increased structural complexity"
     },
     {
      "signal": "hotel_survival_pct",
      "reading": "88.2%",
      "meaning": "Stable hospitality sector"
     }
    ],
    "outlook_2028": {
     "trajectory": "steady",
     "built_share_2028_pct": 71.5,
     "rationale": "Densification will continue through infill and verticality, though land-based expansion is exhausted."
    },
    "decade_story": "From 2016 to 2025, Lubuk Baja evolved into a consolidated urban core, with population increasing by 33.3%. Images 4 and 5 show a landscape that has transitioned from rapid expansion to high-density stability.",
    "recommendation": "Prioritize urban management, traffic mitigation, and infrastructure upgrades for the service sector.",
    "watch_next": "retail vacancy rates",
    "_model": "gemma-4-26b-a4b-it"
   }
  },
  "nongsa": {
   "id": "nongsa",
   "name": "Nongsa",
   "signals": {
    "kecamatan": "Nongsa",
    "area_km2": 114.61,
    "period": "2019->2025 (satellite), Jan 2024->Oct 2026 (hotels/OSM)",
    "ndbi": {
     "from": -0.0907,
     "to": -0.1119,
     "delta": -0.021
    },
    "ndvi": {
     "from": 0.4694,
     "to": 0.4606,
     "delta": -0.009
    },
    "dynamic_world_built_share_pct": {
     "from": 21.4,
     "to": 27.2,
     "delta_pp": 5.8
    },
    "dynamic_world_bare_share_pct": {
     "from": 11.9,
     "to": 13.5,
     "delta_pp": 1.6
    },
    "dynamic_world_tree_share_delta_pp": -3.8,
    "night_lights_radiance": {
     "from": 6.5667,
     "to": 8.3335,
     "change_pct": 26.9
    },
    "radar_vv_db": {
     "from": -9.8114,
     "to": -9.3566,
     "delta_db": 0.45
    },
    "land_surface_temp_c": {
     "from": 33.8626,
     "to": 36.6701,
     "delta": 2.81
    },
    "open_buildings_cover_pct_2019_2023": {
     "from": 1.95,
     "to": 2.37,
     "delta_pp": 0.42
    },
    "open_buildings_mean_height_m": {
     "from": 7.7492,
     "to": 7.9165
    },
    "coastal_land_gained_km2": null,
    "population_ghsl_modelled": {
     "2020": 65526,
     "2025": 78106,
     "change_pct": 19.2
    },
    "built_share_2028_linear_baseline_pct": 30.1,
    "hotels": {
     "hotels_2024": 16,
     "hotels_2024_still_open": 14,
     "hotels_2024_closed_or_gone": 2,
     "hotel_survival_pct": 87.5,
     "hotel_type_listings_not_in_2024_scrape": 15,
     "hotels_star4plus_2024": 7,
     "hotel_median_price_idr_2024": 849956
    },
    "osm_business_counts": {
     "fnb": {
      "2024": 17,
      "2026": 17,
      "growth_pct": 0.0
     },
     "retail": {
      "2024": 9,
      "2026": 12,
      "growth_pct": 33.3
     },
     "office": {
      "2024": 6,
      "2026": 7,
      "growth_pct": 16.7
     }
    },
    "batam_wide_change": {
     "ndbi": -0.053,
     "ndvi": 0.052,
     "dw_built": 0.369,
     "dw_bare": -0.429,
     "s1_vv": 0.29,
     "lst": 1.604,
     "viirs": 9.2
    },
    "change_relative_to_batam": {
     "ndbi": 0.032,
     "ndvi": -0.061,
     "dw_built": 5.431,
     "dw_bare": 2.029,
     "s1_vv": 0.16,
     "lst": 1.206,
     "viirs": 17.7
    },
    "decade_2016_2025": {
     "landsat_ndbi": {
      "2016": -0.1568,
      "2025": -0.1868,
      "delta": -0.03
     },
     "landsat_ndvi": {
      "2016": 0.544,
      "2025": 0.5235,
      "delta": -0.021
     },
     "night_lights_radiance": {
      "2016": 7.2738,
      "2025": 8.3335,
      "change_pct": 14.6
     },
     "radar_vv_db": {
      "2016": -10.1577,
      "2025": -9.3566,
      "delta_db": 0.8
     },
     "open_buildings_cover_pct_2016_2023": {
      "2016": 1.46,
      "2023": 2.37,
      "delta_pp": 0.91
     },
     "land_surface_temp_c": {
      "2016": 37.9685,
      "2025": 36.6701,
      "delta": -1.3
     },
     "population_ghsl_modelled": {
      "2015": 52616,
      "2025": 78106,
      "change_pct": 48.4
     },
     "osm_counts_2016_2026": {
      "lodging": {
       "2016": 5,
       "2026": 9
      },
      "fnb": {
       "2016": 4,
       "2026": 17
      },
      "retail": {
       "2016": 0,
       "2026": 12
      },
      "office": {
       "2016": 0,
       "2026": 7
      }
     }
    },
    "decade_relative_to_batam": {
     "l_ndbi": 0.027,
     "l_ndvi": -0.048,
     "l_lst": 0.243,
     "s1_vv": 0.473,
     "viirs": -11.7,
     "ob_built": 0.273
    },
    "batam_wide_decade_change": {
     "l_ndbi": -0.057,
     "l_ndvi": 0.027,
     "l_lst": -1.543,
     "s1_vv": 0.327,
     "viirs": 26.3,
     "ob_built": 0.637
    }
   },
   "series": {
    "2019": {
     "dw_bare": 0.1194,
     "dw_built": 0.2137,
     "dw_crops": 0.0037,
     "dw_trees": 0.4413,
     "dw_water": 0.1153,
     "lst": 33.8626,
     "mndwi": -0.3256,
     "ndbi": -0.0907,
     "ndvi": 0.4694,
     "ob_built": 0.0195,
     "ob_height": 7.7492,
     "s1_vv": -9.8114,
     "viirs": 6.5667
    },
    "2020": {
     "dw_bare": 0.1336,
     "dw_built": 0.2278,
     "dw_crops": 0.0029,
     "dw_trees": 0.4133,
     "dw_water": 0.1108,
     "lst": 33.7114,
     "mndwi": -0.3193,
     "ndbi": -0.0966,
     "ndvi": 0.4577,
     "ob_built": 0.022,
     "ob_height": 7.2271,
     "s1_vv": -9.6389,
     "viirs": 5.0379
    },
    "2021": {
     "dw_bare": 0.1143,
     "dw_built": 0.2353,
     "dw_crops": 0.003,
     "dw_trees": 0.4338,
     "dw_water": 0.1157,
     "lst": 33.5294,
     "mndwi": -0.3193,
     "ndbi": -0.1111,
     "ndvi": 0.4744,
     "ob_built": 0.023,
     "ob_height": 7.7169,
     "s1_vv": -9.5802,
     "viirs": 6.1019
    },
    "2022": {
     "dw_bare": 0.1137,
     "dw_built": 0.2438,
     "dw_crops": 0.0051,
     "dw_trees": 0.4484,
     "dw_water": 0.1115,
     "lst": 31.4447,
     "mndwi": -0.3141,
     "ndbi": -0.1285,
     "ndvi": 0.486,
     "ob_built": 0.0214,
     "ob_height": 7.7453,
     "s1_vv": -9.4342,
     "viirs": 5.6267
    },
    "2023": {
     "dw_bare": 0.1118,
     "dw_built": 0.2566,
     "dw_crops": 0.0053,
     "dw_trees": 0.4383,
     "dw_water": 0.1108,
     "lst": 32.4863,
     "mndwi": -0.3142,
     "ndbi": -0.1272,
     "ndvi": 0.4828,
     "ob_built": 0.0237,
     "ob_height": 7.9165,
     "s1_vv": -9.3117,
     "viirs": 7.1926
    },
    "2024": {
     "dw_bare": 0.1477,
     "dw_built": 0.2621,
     "dw_crops": 0.0051,
     "dw_trees": 0.4161,
     "dw_water": 0.0942,
     "lst": 35.6919,
     "mndwi": -0.3028,
     "ndbi": -0.1248,
     "ndvi": 0.4582,
     "s1_vv": -9.2887,
     "viirs": 7.3296
    },
    "2025": {
     "dw_bare": 0.1352,
     "dw_built": 0.2721,
     "dw_crops": 0.0011,
     "dw_trees": 0.4034,
     "dw_water": 0.1351,
     "lst": 36.6701,
     "mndwi": -0.3227,
     "ndbi": -0.1119,
     "ndvi": 0.4606,
     "s1_vv": -9.3566,
     "viirs": 8.3335
    },
    "2026": {
     "dw_bare": 0.1637,
     "dw_built": 0.2875,
     "dw_crops": 0.0007,
     "dw_trees": 0.3757,
     "dw_water": 0.1097,
     "lst": 33.9589,
     "mndwi": -0.283,
     "ndbi": -0.0762,
     "ndvi": 0.3853,
     "s1_vv": -9.615,
     "viirs": 10.6573
    }
   },
   "gemma": {
    "verdict": "GROWTH_CORRIDOR",
    "growth_score": 75,
    "confidence": "high",
    "headline": "Premium tourism and residential expansion driving steady economic and physical growth in Nongsa",
    "image_observations": "Images 1 and 2 show a transition from lush greenery to more fragmented urban and resort patches. Image 3 highlights significant new land clearing (orange) alongside newly completed structures (green).",
    "reasoning": "Physical construction is well-supported by economic signals like rising night lights (+26.9%) and high hotel survival (87.5%). The increase in built share (+5.8pp) and population (+19.2%) confirms realized growth rather than just speculative clearing. The presence of significant bare land in Image 3 suggests a continuous pipeline of development.",
    "conflicts": "NDBI delta is negative, but relative to Batam it is positive; I resolved this by prioritizing the Dynamic World built share and radar VV, which confirm real structure growth.",
    "evidence": [
     {
      "signal": "Dynamic World Built Share",
      "reading": "+5.8 pp",
      "meaning": "Significant increase in the footprint of permanent structures."
     },
     {
      "signal": "Night Lights (VIIRS)",
      "reading": "+26.9% change",
      "meaning": "Strong upward trend in nighttime economic activity."
     },
     {
      "signal": "Hotel Survival %",
      "reading": "87.5%",
      "meaning": "High stability in the existing hospitality and tourism sector."
     },
     {
      "signal": "Change relative to Batam (Built Share)",
      "reading": "+5.431 pp",
      "meaning": "Nongsa is developing faster than the city-wide average."
     }
    ],
    "outlook_2028": {
     "trajectory": "steady",
     "built_share_2028_pct": 32.5,
     "rationale": "Ongoing land clearing and high hotel stability suggest a consistent development pace."
    },
    "decade_story": "Since 2016, Nongsa has seen a 48.4% population surge and significant built-up expansion. Images 4 and 5 show the transition from a predominantly green landscape to one with more defined urban and resort clusters.",
    "recommendation": "Support high-end tourism and residential infrastructure to capitalize on the premium market profile.",
    "watch_next": "hotel_survival_pct",
    "_model": "gemma-4-26b-a4b-it"
   }
  },
  "sagulung": {
   "id": "sagulung",
   "name": "Sagulung",
   "signals": {
    "kecamatan": "Sagulung",
    "area_km2": 51.96,
    "period": "2019->2025 (satellite), Jan 2024->Oct 2026 (hotels/OSM)",
    "ndbi": {
     "from": -0.0642,
     "to": -0.0805,
     "delta": -0.016
    },
    "ndvi": {
     "from": 0.3972,
     "to": 0.4102,
     "delta": 0.013
    },
    "dynamic_world_built_share_pct": {
     "from": 46.2,
     "to": 51.1,
     "delta_pp": 4.9
    },
    "dynamic_world_bare_share_pct": {
     "from": 9.4,
     "to": 9.4,
     "delta_pp": 0.1
    },
    "dynamic_world_tree_share_delta_pp": -1.5,
    "night_lights_radiance": {
     "from": 9.3069,
     "to": 9.8796,
     "change_pct": 6.2
    },
    "radar_vv_db": {
     "from": -8.2263,
     "to": -7.6589,
     "delta_db": 0.57
    },
    "land_surface_temp_c": {
     "from": 35.6219,
     "to": 38.2399,
     "delta": 2.62
    },
    "open_buildings_cover_pct_2019_2023": {
     "from": 8.82,
     "to": 9.11,
     "delta_pp": 0.29
    },
    "open_buildings_mean_height_m": {
     "from": 4.5968,
     "to": 4.3741
    },
    "coastal_land_gained_km2": null,
    "population_ghsl_modelled": {
     "2020": 171086,
     "2025": 194295,
     "change_pct": 13.6
    },
    "built_share_2028_linear_baseline_pct": 55.9,
    "hotels": {
     "hotels_2024": 14,
     "hotels_2024_still_open": 11,
     "hotels_2024_closed_or_gone": 3,
     "hotel_survival_pct": 78.6,
     "hotel_type_listings_not_in_2024_scrape": 50,
     "hotels_star4plus_2024": 2,
     "hotel_median_price_idr_2024": 282200
    },
    "osm_business_counts": {
     "fnb": {
      "2024": 18,
      "2026": 17,
      "growth_pct": -5.6
     },
     "retail": {
      "2024": 60,
      "2026": 54,
      "growth_pct": -10.0
     },
     "office": {
      "2024": 12,
      "2026": 13,
      "growth_pct": 8.3
     }
    },
    "batam_wide_change": {
     "ndbi": -0.053,
     "ndvi": 0.052,
     "dw_built": 0.369,
     "dw_bare": -0.429,
     "s1_vv": 0.29,
     "lst": 1.604,
     "viirs": 9.2
    },
    "change_relative_to_batam": {
     "ndbi": 0.037,
     "ndvi": -0.039,
     "dw_built": 4.531,
     "dw_bare": 0.529,
     "s1_vv": 0.28,
     "lst": 1.016,
     "viirs": -3.0
    },
    "decade_2016_2025": {
     "landsat_ndbi": {
      "2016": -0.1519,
      "2025": -0.1519,
      "delta": 0.0
     },
     "landsat_ndvi": {
      "2016": 0.515,
      "2025": 0.4818,
      "delta": -0.033
     },
     "night_lights_radiance": {
      "2016": 7.1313,
      "2025": 9.8796,
      "change_pct": 38.5
     },
     "radar_vv_db": {
      "2016": -8.1889,
      "2025": -7.6589,
      "delta_db": 0.53
     },
     "open_buildings_cover_pct_2016_2023": {
      "2016": 7.02,
      "2023": 9.11,
      "delta_pp": 2.09
     },
     "land_surface_temp_c": {
      "2016": 39.1597,
      "2025": 38.2399,
      "delta": -0.92
     },
     "population_ghsl_modelled": {
      "2015": 139764,
      "2025": 194295,
      "change_pct": 39.0
     },
     "osm_counts_2016_2026": {
      "lodging": {
       "2016": 0,
       "2026": 4
      },
      "fnb": {
       "2016": 1,
       "2026": 17
      },
      "retail": {
       "2016": 6,
       "2026": 54
      },
      "office": {
       "2016": 0,
       "2026": 13
      }
     }
    },
    "decade_relative_to_batam": {
     "l_ndbi": 0.057,
     "l_ndvi": -0.06,
     "l_lst": 0.623,
     "s1_vv": 0.203,
     "viirs": 12.2,
     "ob_built": 1.453
    },
    "batam_wide_decade_change": {
     "l_ndbi": -0.057,
     "l_ndvi": 0.027,
     "l_lst": -1.543,
     "s1_vv": 0.327,
     "viirs": 26.3,
     "ob_built": 0.637
    }
   },
   "series": {
    "2019": {
     "dw_bare": 0.0936,
     "dw_built": 0.4623,
     "dw_crops": 0.0126,
     "dw_trees": 0.3296,
     "dw_water": 0.0517,
     "lst": 35.6219,
     "mndwi": -0.3348,
     "ndbi": -0.0642,
     "ndvi": 0.3972,
     "ob_built": 0.0882,
     "ob_height": 4.5968,
     "s1_vv": -8.2263,
     "viirs": 9.3069
    },
    "2020": {
     "dw_bare": 0.0868,
     "dw_built": 0.4588,
     "dw_crops": 0.0117,
     "dw_trees": 0.3293,
     "dw_water": 0.0597,
     "lst": 36.3026,
     "mndwi": -0.3283,
     "ndbi": -0.0814,
     "ndvi": 0.407,
     "ob_built": 0.0968,
     "ob_height": 4.6744,
     "s1_vv": -7.9978,
     "viirs": 7.1422
    },
    "2021": {
     "dw_bare": 0.0727,
     "dw_built": 0.4951,
     "dw_crops": 0.0204,
     "dw_trees": 0.307,
     "dw_water": 0.0578,
     "lst": 36.9736,
     "mndwi": -0.334,
     "ndbi": -0.0858,
     "ndvi": 0.4202,
     "ob_built": 0.0987,
     "ob_height": 4.7563,
     "s1_vv": -7.8717,
     "viirs": 7.4965
    },
    "2022": {
     "dw_bare": 0.0562,
     "dw_built": 0.5159,
     "dw_crops": 0.0127,
     "dw_trees": 0.321,
     "dw_water": 0.0553,
     "lst": 33.8808,
     "mndwi": -0.3156,
     "ndbi": -0.1016,
     "ndvi": 0.4147,
     "ob_built": 0.0855,
     "ob_height": 4.2256,
     "s1_vv": -7.7972,
     "viirs": 8.0444
    },
    "2023": {
     "dw_bare": 0.0725,
     "dw_built": 0.5205,
     "dw_crops": 0.0109,
     "dw_trees": 0.3191,
     "dw_water": 0.0482,
     "lst": 35.4616,
     "mndwi": -0.3267,
     "ndbi": -0.0913,
     "ndvi": 0.4108,
     "ob_built": 0.0911,
     "ob_height": 4.3741,
     "s1_vv": -7.654,
     "viirs": 8.6627
    },
    "2024": {
     "dw_bare": 0.0743,
     "dw_built": 0.5168,
     "dw_crops": 0.0137,
     "dw_trees": 0.3159,
     "dw_water": 0.0431,
     "lst": 36.1039,
     "mndwi": -0.3375,
     "ndbi": -0.0997,
     "ndvi": 0.4214,
     "s1_vv": -7.5237,
     "viirs": 9.8828
    },
    "2025": {
     "dw_bare": 0.0944,
     "dw_built": 0.5108,
     "dw_crops": 0.0035,
     "dw_trees": 0.3144,
     "dw_water": 0.051,
     "lst": 38.2399,
     "mndwi": -0.3521,
     "ndbi": -0.0805,
     "ndvi": 0.4102,
     "s1_vv": -7.6589,
     "viirs": 9.8796
    },
    "2026": {
     "dw_bare": 0.1059,
     "dw_built": 0.5351,
     "dw_crops": 0.004,
     "dw_trees": 0.2911,
     "dw_water": 0.0381,
     "lst": 38.147,
     "mndwi": -0.308,
     "ndbi": -0.0608,
     "ndvi": 0.3564,
     "s1_vv": -7.9744,
     "viirs": 13.2468
    }
   },
   "gemma": {
    "verdict": "STALLED",
    "growth_score": 55,
    "confidence": "high",
    "headline": "Residential expansion outpacing commercial and economic service development",
    "image_observations": "Images 1 and 2 show densification of northern residential clusters. Image 3 shows significant new built areas (green) and existing built-up zones (grey) with minimal new large-scale land clearing.",
    "reasoning": "Physical indicators like DW built share (+4.9pp) and radar VV (+0.57dB) confirm steady construction of new structures. However, economic activity lags, with night lights growth trailing the Batam average and declining OSM retail/F&B counts. This indicates a residential-led expansion where housing is being completed faster than the supporting commercial ecosystem.",
    "conflicts": "NDBI shows a slight decrease while DW built share and radar VV increase; I prioritized DW and radar as more reliable indicators of structural growth.",
    "evidence": [
     {
      "signal": "dynamic_world_built_share_pct",
      "reading": "+4.9pp",
      "meaning": "Significant physical expansion of built-up areas."
     },
     {
      "signal": "radar_vv_db",
      "reading": "+0.57 dB",
      "meaning": "Independent confirmation of increased structural density."
     },
     {
      "signal": "night_lights_relative_to_batam",
      "reading": "-3.0",
      "meaning": "Economic/light activity is underperforming compared to the city average."
     },
     {
      "signal": "osm_business_counts",
      "reading": "retail/fnb declining",
      "meaning": "Lack of commercial maturation to support new residents."
     }
    ],
    "outlook_2028": {
     "trajectory": "steady",
     "built_share_2028_pct": 55.9,
     "rationale": "Physical construction remains steady, but economic drag will prevent rapid acceleration."
    },
    "decade_story": "The decade 2016-2025 saw a massive residential shift, with population growing 39% and building cover increasing by 2.09pp. Images 4 and 5 illustrate the transition from fragmented settlements to a continuous urban fabric.",
    "recommendation": "Prioritize commercial zoning and incentives to attract retail and services to match the growing residential base.",
    "watch_next": "OSM business counts (retail/F&B)",
    "_model": "gemma-4-26b-a4b-it"
   }
  },
  "sei-beduk": {
   "id": "sei-beduk",
   "name": "Sei Beduk",
   "signals": {
    "kecamatan": "Sei Beduk",
    "area_km2": 80.95,
    "period": "2019->2025 (satellite), Jan 2024->Oct 2026 (hotels/OSM)",
    "ndbi": {
     "from": -0.1952,
     "to": -0.2401,
     "delta": -0.045
    },
    "ndvi": {
     "from": 0.6173,
     "to": 0.6629,
     "delta": 0.046
    },
    "dynamic_world_built_share_pct": {
     "from": 18.1,
     "to": 19.4,
     "delta_pp": 1.3
    },
    "dynamic_world_bare_share_pct": {
     "from": 1.3,
     "to": 0.8,
     "delta_pp": -0.5
    },
    "dynamic_world_tree_share_delta_pp": -3.3,
    "night_lights_radiance": {
     "from": 5.3732,
     "to": 5.1425,
     "change_pct": -4.3
    },
    "radar_vv_db": {
     "from": -8.7337,
     "to": -8.6018,
     "delta_db": 0.13
    },
    "land_surface_temp_c": {
     "from": 33.7433,
     "to": 35.35,
     "delta": 1.61
    },
    "open_buildings_cover_pct_2019_2023": {
     "from": 3.3,
     "to": 3.41,
     "delta_pp": 0.11
    },
    "open_buildings_mean_height_m": {
     "from": 6.3169,
     "to": 6.4555
    },
    "coastal_land_gained_km2": null,
    "population_ghsl_modelled": {
     "2020": 79025,
     "2025": 90900,
     "change_pct": 15.0
    },
    "built_share_2028_linear_baseline_pct": 21.1,
    "hotels": {
     "hotels_2024": 6,
     "hotels_2024_still_open": 5,
     "hotels_2024_closed_or_gone": 1,
     "hotel_survival_pct": 83.3,
     "hotel_type_listings_not_in_2024_scrape": 32,
     "hotels_star4plus_2024": 1,
     "hotel_median_price_idr_2024": 1008770
    },
    "osm_business_counts": {
     "fnb": {
      "2024": 11,
      "2026": 11,
      "growth_pct": 0.0
     },
     "retail": {
      "2024": 7,
      "2026": 9,
      "growth_pct": 28.6
     },
     "office": {
      "2024": 42,
      "2026": 43,
      "growth_pct": 2.4
     }
    },
    "batam_wide_change": {
     "ndbi": -0.053,
     "ndvi": 0.052,
     "dw_built": 0.369,
     "dw_bare": -0.429,
     "s1_vv": 0.29,
     "lst": 1.604,
     "viirs": 9.2
    },
    "change_relative_to_batam": {
     "ndbi": 0.008,
     "ndvi": -0.006,
     "dw_built": 0.931,
     "dw_bare": -0.071,
     "s1_vv": -0.16,
     "lst": 0.006,
     "viirs": -13.5
    },
    "decade_2016_2025": {
     "landsat_ndbi": {
      "2016": -0.2459,
      "2025": -0.3045,
      "delta": -0.059
     },
     "landsat_ndvi": {
      "2016": 0.6931,
      "2025": 0.7189,
      "delta": 0.026
     },
     "night_lights_radiance": {
      "2016": 4.3543,
      "2025": 5.1425,
      "change_pct": 18.1
     },
     "radar_vv_db": {
      "2016": -8.765,
      "2025": -8.6018,
      "delta_db": 0.16
     },
     "open_buildings_cover_pct_2016_2023": {
      "2016": 2.85,
      "2023": 3.41,
      "delta_pp": 0.56
     },
     "land_surface_temp_c": {
      "2016": 37.8529,
      "2025": 35.35,
      "delta": -2.5
     },
     "population_ghsl_modelled": {
      "2015": 65329,
      "2025": 90900,
      "change_pct": 39.1
     },
     "osm_counts_2016_2026": {
      "lodging": {
       "2016": 0,
       "2026": 2
      },
      "fnb": {
       "2016": 3,
       "2026": 11
      },
      "retail": {
       "2016": 1,
       "2026": 9
      },
      "office": {
       "2016": 0,
       "2026": 43
      }
     }
    },
    "decade_relative_to_batam": {
     "l_ndbi": -0.002,
     "l_ndvi": -0.001,
     "l_lst": -0.957,
     "s1_vv": -0.167,
     "viirs": -8.2,
     "ob_built": -0.077
    },
    "batam_wide_decade_change": {
     "l_ndbi": -0.057,
     "l_ndvi": 0.027,
     "l_lst": -1.543,
     "s1_vv": 0.327,
     "viirs": 26.3,
     "ob_built": 0.637
    }
   },
   "series": {
    "2019": {
     "dw_bare": 0.0128,
     "dw_built": 0.1813,
     "dw_crops": 0.0098,
     "dw_trees": 0.6484,
     "dw_water": 0.0547,
     "lst": 33.7433,
     "mndwi": -0.3736,
     "ndbi": -0.1952,
     "ndvi": 0.6173,
     "ob_built": 0.033,
     "ob_height": 6.3169,
     "s1_vv": -8.7337,
     "viirs": 5.3732
    },
    "2020": {
     "dw_bare": 0.014,
     "dw_built": 0.1878,
     "dw_crops": 0.0105,
     "dw_trees": 0.6409,
     "dw_water": 0.05,
     "lst": 34.0408,
     "mndwi": -0.3695,
     "ndbi": -0.2021,
     "ndvi": 0.6103,
     "ob_built": 0.0351,
     "ob_height": 6.0666,
     "s1_vv": -8.5805,
     "viirs": 4.2263
    },
    "2021": {
     "dw_bare": 0.0107,
     "dw_built": 0.202,
     "dw_crops": 0.0088,
     "dw_trees": 0.6646,
     "dw_water": 0.047,
     "lst": 34.7394,
     "mndwi": -0.3761,
     "ndbi": -0.2175,
     "ndvi": 0.6365,
     "ob_built": 0.0363,
     "ob_height": 6.2001,
     "s1_vv": -8.4947,
     "viirs": 4.5244
    },
    "2022": {
     "dw_bare": 0.015,
     "dw_built": 0.213,
     "dw_crops": 0.0057,
     "dw_trees": 0.6534,
     "dw_water": 0.0706,
     "lst": 28.1339,
     "mndwi": -0.3623,
     "ndbi": -0.2367,
     "ndvi": 0.6328,
     "ob_built": 0.0322,
     "ob_height": 6.0566,
     "s1_vv": -8.5301,
     "viirs": 4.9334
    },
    "2023": {
     "dw_bare": 0.0175,
     "dw_built": 0.2032,
     "dw_crops": 0.0105,
     "dw_trees": 0.6816,
     "dw_water": 0.0583,
     "lst": 32.4549,
     "mndwi": -0.3497,
     "ndbi": -0.2371,
     "ndvi": 0.6289,
     "ob_built": 0.0341,
     "ob_height": 6.4555,
     "s1_vv": -8.5509,
     "viirs": 5.0794
    },
    "2024": {
     "dw_bare": 0.0166,
     "dw_built": 0.2008,
     "dw_crops": 0.021,
     "dw_trees": 0.6555,
     "dw_water": 0.0731,
     "lst": 34.6859,
     "mndwi": -0.363,
     "ndbi": -0.2435,
     "ndvi": 0.6458,
     "s1_vv": -8.5049,
     "viirs": 5.4855
    },
    "2025": {
     "dw_bare": 0.008,
     "dw_built": 0.1938,
     "dw_crops": 0.0043,
     "dw_trees": 0.6158,
     "dw_water": 0.1527,
     "lst": 35.35,
     "mndwi": -0.39,
     "ndbi": -0.2401,
     "ndvi": 0.6629,
     "s1_vv": -8.6018,
     "viirs": 5.1425
    },
    "2026": {
     "dw_bare": 0.0125,
     "dw_built": 0.2126,
     "dw_crops": 0.0059,
     "dw_trees": 0.6691,
     "dw_water": 0.0587,
     "lst": 33.6659,
     "mndwi": -0.3425,
     "ndbi": -0.2113,
     "ndvi": 0.5983,
     "s1_vv": -8.7656,
     "viirs": 7.5253
    }
   },
   "gemma": {
    "verdict": "STALLED",
    "growth_score": 38,
    "confidence": "high",
    "headline": "Industrial core showing relative physical growth but lagging economic vibrancy",
    "image_observations": "Images 1 and 2 show a stable industrial footprint with minor infill. Image 3 reveals scattered small patches of new construction (green) and minimal clearing (orange), indicating a lack of large-scale new development projects.",
    "reasoning": "While the built-share increase (+1.3 pp) is actually stronger than the Batam-wide average relative to the city (+0.931), the economic signals are contradictory. Night lights are declining (-4.3% raw, -13.5 relative to Batam), and OSM business growth is nearly flat. Population growth is steady, but this appears to be residential densification rather than new economic drivers.",
    "conflicts": "The positive relative built-share (DW) conflicts with the negative relative night lights (VIIRS). I resolved this by concluding that the new construction is likely low-activity residential or low-value industrial infill rather than high-intensity economic growth.",
    "evidence": [
     {
      "signal": "change_relative_to_batam.dw_built",
      "reading": "0.931",
      "meaning": "Physical built-up area is expanding faster than the city average."
     },
     {
      "signal": "change_relative_to_batam.viirs",
      "reading": "-13.5",
      "meaning": "Economic activity (night lights) is significantly underperforming compared to the rest of Batam."
     },
     {
      "signal": "osm_business_counts.fnb.growth_pct",
      "reading": "0.0%",
      "meaning": "Zero growth in food and beverage businesses indicates stagnant local consumer demand."
     },
     {
      "signal": "population_ghsl_modelled.change_pct",
      "reading": "15.0%",
      "meaning": "Steady population growth suggests the area remains a residential hub for workers."
     }
    ],
    "outlook_2028": {
     "trajectory": "slowing",
     "built_share_2028_pct": 21.5,
     "rationale": "Physical growth will likely continue at a slow, linear pace driven by residential infill, but without new industrial catalysts, economic momentum will remain flat."
    },
    "decade_story": "From 2016 to 2025, Sei Beduk saw significant population growth (39.1%), but its economic radiance grew only 18.1%, lagging far behind the city-wide 26.3% increase. Images 4 and 5 confirm that while the industrial zones remained, they did not expand into the massive new estates seen in other parts of Batam.",
    "recommendation": "BP Batam should incentivize the modernization of existing industrial plots to attract higher-value, high-intensity industries that boost night-time activity and service-sector growth.",
    "watch_next": "night_lights_radiance",
    "_model": "gemma-4-31b-it"
   }
  },
  "sekupang": {
   "id": "sekupang",
   "name": "Sekupang",
   "signals": {
    "kecamatan": "Sekupang",
    "area_km2": 68.66,
    "period": "2019->2025 (satellite), Jan 2024->Oct 2026 (hotels/OSM)",
    "ndbi": {
     "from": -0.1198,
     "to": -0.1386,
     "delta": -0.019
    },
    "ndvi": {
     "from": 0.5108,
     "to": 0.5371,
     "delta": 0.026
    },
    "dynamic_world_built_share_pct": {
     "from": 34.1,
     "to": 37.5,
     "delta_pp": 3.3
    },
    "dynamic_world_bare_share_pct": {
     "from": 5.2,
     "to": 2.5,
     "delta_pp": -2.7
    },
    "dynamic_world_tree_share_delta_pp": 0.6,
    "night_lights_radiance": {
     "from": 7.7518,
     "to": 9.0608,
     "change_pct": 16.9
    },
    "radar_vv_db": {
     "from": -8.7408,
     "to": -8.2775,
     "delta_db": 0.46
    },
    "land_surface_temp_c": {
     "from": 33.6742,
     "to": 36.3576,
     "delta": 2.68
    },
    "open_buildings_cover_pct_2019_2023": {
     "from": 4.98,
     "to": 5.94,
     "delta_pp": 0.96
    },
    "open_buildings_mean_height_m": {
     "from": 4.797,
     "to": 4.5032
    },
    "coastal_land_gained_km2": null,
    "population_ghsl_modelled": {
     "2020": 162741,
     "2025": 184339,
     "change_pct": 13.3
    },
    "built_share_2028_linear_baseline_pct": 39.1,
    "hotels": {
     "hotels_2024": 15,
     "hotels_2024_still_open": 12,
     "hotels_2024_closed_or_gone": 3,
     "hotel_survival_pct": 80.0,
     "hotel_type_listings_not_in_2024_scrape": 24,
     "hotels_star4plus_2024": 5,
     "hotel_median_price_idr_2024": 727650
    },
    "osm_business_counts": {
     "fnb": {
      "2024": 23,
      "2026": 30,
      "growth_pct": 30.4
     },
     "retail": {
      "2024": 44,
      "2026": 53,
      "growth_pct": 20.5
     },
     "office": {
      "2024": 16,
      "2026": 12,
      "growth_pct": -25.0
     }
    },
    "batam_wide_change": {
     "ndbi": -0.053,
     "ndvi": 0.052,
     "dw_built": 0.369,
     "dw_bare": -0.429,
     "s1_vv": 0.29,
     "lst": 1.604,
     "viirs": 9.2
    },
    "change_relative_to_batam": {
     "ndbi": 0.034,
     "ndvi": -0.026,
     "dw_built": 2.931,
     "dw_bare": -2.271,
     "s1_vv": 0.17,
     "lst": 1.076,
     "viirs": 7.7
    },
    "decade_2016_2025": {
     "landsat_ndbi": {
      "2016": -0.198,
      "2025": -0.2155,
      "delta": -0.017
     },
     "landsat_ndvi": {
      "2016": 0.5994,
      "2025": 0.6084,
      "delta": 0.009
     },
     "night_lights_radiance": {
      "2016": 6.0724,
      "2025": 9.0608,
      "change_pct": 49.2
     },
     "radar_vv_db": {
      "2016": -8.9176,
      "2025": -8.2775,
      "delta_db": 0.64
     },
     "open_buildings_cover_pct_2016_2023": {
      "2016": 4.33,
      "2023": 5.94,
      "delta_pp": 1.61
     },
     "land_surface_temp_c": {
      "2016": 36.794,
      "2025": 36.3576,
      "delta": -0.44
     },
     "population_ghsl_modelled": {
      "2015": 132670,
      "2025": 184339,
      "change_pct": 38.9
     },
     "osm_counts_2016_2026": {
      "lodging": {
       "2016": 5,
       "2026": 7
      },
      "fnb": {
       "2016": 9,
       "2026": 30
      },
      "retail": {
       "2016": 4,
       "2026": 53
      },
      "office": {
       "2016": 1,
       "2026": 12
      }
     }
    },
    "decade_relative_to_batam": {
     "l_ndbi": 0.04,
     "l_ndvi": -0.018,
     "l_lst": 1.103,
     "s1_vv": 0.313,
     "viirs": 22.9,
     "ob_built": 0.973
    },
    "batam_wide_decade_change": {
     "l_ndbi": -0.057,
     "l_ndvi": 0.027,
     "l_lst": -1.543,
     "s1_vv": 0.327,
     "viirs": 26.3,
     "ob_built": 0.637
    }
   },
   "series": {
    "2019": {
     "dw_bare": 0.0518,
     "dw_built": 0.3413,
     "dw_crops": 0.0047,
     "dw_trees": 0.4895,
     "dw_water": 0.0688,
     "lst": 33.6742,
     "mndwi": -0.3672,
     "ndbi": -0.1198,
     "ndvi": 0.5108,
     "ob_built": 0.0498,
     "ob_height": 4.797,
     "s1_vv": -8.7408,
     "viirs": 7.7518
    },
    "2020": {
     "dw_bare": 0.0494,
     "dw_built": 0.3545,
     "dw_crops": 0.0047,
     "dw_trees": 0.4785,
     "dw_water": 0.071,
     "lst": 35.4044,
     "mndwi": -0.3542,
     "ndbi": -0.1287,
     "ndvi": 0.5092,
     "ob_built": 0.0574,
     "ob_height": 4.8535,
     "s1_vv": -8.5751,
     "viirs": 5.7855
    },
    "2021": {
     "dw_bare": 0.0394,
     "dw_built": 0.3577,
     "dw_crops": 0.0094,
     "dw_trees": 0.4717,
     "dw_water": 0.0807,
     "lst": 36.6741,
     "mndwi": -0.3603,
     "ndbi": -0.131,
     "ndvi": 0.5175,
     "ob_built": 0.0601,
     "ob_height": 4.8528,
     "s1_vv": -8.5852,
     "viirs": 6.5467
    },
    "2022": {
     "dw_bare": 0.0425,
     "dw_built": 0.3705,
     "dw_crops": 0.0058,
     "dw_trees": 0.4738,
     "dw_water": 0.0721,
     "lst": 32.5362,
     "mndwi": -0.3402,
     "ndbi": -0.1517,
     "ndvi": 0.5125,
     "ob_built": 0.0548,
     "ob_height": 4.5071,
     "s1_vv": -8.4797,
     "viirs": 7.3939
    },
    "2023": {
     "dw_bare": 0.0362,
     "dw_built": 0.3444,
     "dw_crops": 0.007,
     "dw_trees": 0.5045,
     "dw_water": 0.0709,
     "lst": 33.0232,
     "mndwi": -0.3529,
     "ndbi": -0.1464,
     "ndvi": 0.5199,
     "ob_built": 0.0594,
     "ob_height": 4.5032,
     "s1_vv": -8.322,
     "viirs": 7.5493
    },
    "2024": {
     "dw_bare": 0.0312,
     "dw_built": 0.3815,
     "dw_crops": 0.0061,
     "dw_trees": 0.4812,
     "dw_water": 0.0661,
     "lst": 35.7271,
     "mndwi": -0.3638,
     "ndbi": -0.1501,
     "ndvi": 0.5305,
     "s1_vv": -8.1908,
     "viirs": 8.7286
    },
    "2025": {
     "dw_bare": 0.0248,
     "dw_built": 0.3747,
     "dw_crops": 0.0005,
     "dw_trees": 0.4959,
     "dw_water": 0.0737,
     "lst": 36.3576,
     "mndwi": -0.3756,
     "ndbi": -0.1386,
     "ndvi": 0.5371,
     "s1_vv": -8.2775,
     "viirs": 9.0608
    },
    "2026": {
     "dw_bare": 0.0282,
     "dw_built": 0.3985,
     "dw_crops": 0.0035,
     "dw_trees": 0.4674,
     "dw_water": 0.0656,
     "lst": 35.7127,
     "mndwi": -0.3354,
     "ndbi": -0.1303,
     "ndvi": 0.4891,
     "s1_vv": -8.5259,
     "viirs": 11.1718
    }
   },
   "gemma": {
    "verdict": "GROWTH_CORRIDOR",
    "growth_score": 85,
    "confidence": "high",
    "headline": "Sekupang: Robust urban expansion and service-sector growth outperforming Batam average.",
    "image_observations": "Images 1 and 2 show significant urban infill and expansion into southern hilly areas. Image 3 confirms this with widespread green (newly built) pixels replacing previous land cover.",
    "reasoning": "Physical signals (VV, Open Buildings, DW built) all show realized growth rather than just land clearing. This is corroborated by rising night lights and strong hotel survival rates. The growth is transitioning from bare land into established built environments, supported by increasing F&B and retail activity.",
    "conflicts": "NDBI shows a raw decrease, but when viewed relative to Batam, it is positive, indicating Sekupang is urbanizing faster than the city average. This resolves the apparent contradiction.",
    "evidence": [
     {
      "signal": "dw_built_share_pct (relative)",
      "reading": "+2.93 pp",
      "meaning": "Urbanization is significantly outpacing the Batam-wide trend."
     },
     {
      "signal": "hotel_survival_pct",
      "reading": "80.0%",
      "meaning": "High economic stability in the hospitality sector."
     },
     {
      "signal": "viirs_change_pct (relative)",
      "reading": "+7.7%",
      "meaning": "Economic activity and electrification are rising faster than the city average."
     },
     {
      "signal": "dw_bare_share_pct (relative)",
      "reading": "-2.27 pp",
      "meaning": "Bare land is being successfully converted into built structures, not just left cleared."
     }
    ],
    "outlook_2028": {
     "trajectory": "steady",
     "built_share_2028_pct": 41.5,
     "rationale": "The momentum of conversion from bare to built land suggests continued expansion of the urban footprint."
    },
    "decade_story": "Over the decade (2016-2025), Sekupang has transformed from a semi-rural area into a major urban hub, with night lights increasing by 49.2%. Images 4 and 5 illustrate a massive expansion of the built-up footprint, particularly in the central and southern sectors.",
    "recommendation": "Prioritize infrastructure for service-oriented businesses (F&B/Retail) and improve connectivity to the expanding southern residential zones.",
    "watch_next": "Office count recovery or further F&B growth to confirm service-sector dominance.",
    "_model": "gemma-4-26b-a4b-it"
   }
  }
 },
 "models_used": {
  "gemma-4-26b-a4b-it": 8,
  "gemma-4-31b-it": 4
 }
}