Fire Burn Severity via dNBR (2020 Creek Fire, CA)

change-detection intermediate USGS Landsat 8 Collection 2 Level 2

Ground Truth

36.5
percent
10.0%
Tolerance
3
Runs
3
Passed

Calibrated from GEE execution on 2026-03-29 (actual: 36.47%). The 2020 Creek Fire was a major wildfire in the Sierra National Forest. Cross-platform variation expected from cloud masking, compositing, and scale factor application on Landsat 8 Collection 2 Level 2 surface reflectance.

Run Results

Workflow Model Backend Status Answer Error Cost Latency
exec gold folia-rust PASS 36.432564 0.2% --- 214ms
exec gold gee PASS 36.47226185776869 0.1% $0.000151 2.7s
exec gold qgis PASS 36.432564 0.2% --- 500ms

Requirements

Data Sources
  • USGS Landsat 8 Collection 2 Level 2
Operations
cloud_mask_landsat raster_ndvi raster_calc raster_threshold_mask

Gold Spec (folia.yaml)

Known-correct folia spec for this problem. This is the reference implementation used for backend quality testing.

Interactive map powered by <folia-view>. Requires pre-staged data to render layers.
View Raw Spec
# Platform Comparison: Fire Burn Severity (dNBR) -- Gold Spec
#
# Compute differenced Normalized Burn Ratio from pre/post-fire
# Landsat 8 imagery over the 2020 Creek Fire, California.
# Ground truth: ~35% moderate-to-high severity (dNBR > 0.27).
#
# This spec is designed to run through both the Python backend and
# browser-wasm executor (folia bench exec -b browser-wasm).

name: fire-burn-severity
version: "1.0"
description: >
  Fire burn severity analysis via dNBR (differenced Normalized Burn Ratio).
  Pre-fire (June 2020) and post-fire (Oct 2020) Landsat 8 composites.
  Ground truth: ~36.5% moderate-to-high severity (calibrated from GEE 2026-03-29).

settings:
  default_bbox: [-119.5, 37.0, -119.1, 37.4]
  default_crs: EPSG:4326

layers:

  # ============================================================
  # SOURCE LAYERS
  # ============================================================

  source/pre-fire:
    uri: stac://earth-search/landsat-c2-l2
    type: raster
    description: >
      Landsat 8 Collection 2 Level 2, pre-fire composite (June 2020).
      Creek Fire area, Sierra National Forest, CA.
    params:
      bbox: [-119.5, 37.0, -119.1, 37.4]
      datetime: "2020-06-01/2020-07-15"
      query:
        platform: landsat-8

  source/post-fire:
    uri: stac://earth-search/landsat-c2-l2
    type: raster
    description: >
      Landsat 8 Collection 2 Level 2, post-fire composite (Oct 2020).
      Creek Fire area, Sierra National Forest, CA.
    params:
      bbox: [-119.5, 37.0, -119.1, 37.4]
      datetime: "2020-10-01/2020-11-15"
      query:
        platform: landsat-8

  # ============================================================
  # COMPUTE: CLOUD MASKING + COMPOSITING
  # ============================================================

  compute/pre-masked:
    type: raster
    description: >
      Cloud-masked pre-fire Landsat 8 imagery.
    compute:
      op: cloud_mask_landsat
      inputs:
        data: { layer: source/pre-fire }
      params:
        collection: C02

  compute/post-masked:
    type: raster
    description: >
      Cloud-masked post-fire Landsat 8 imagery.
    compute:
      op: cloud_mask_landsat
      inputs:
        data: { layer: source/post-fire }
      params:
        collection: C02

  compute/pre-composite:
    type: raster
    description: >
      Median composite of pre-fire cloud-masked images.
    compute:
      op: temporal_reduce
      inputs:
        data: { layer: compute/pre-masked }
      params:
        reducer: median

  compute/post-composite:
    type: raster
    description: >
      Median composite of post-fire cloud-masked images.
    compute:
      op: temporal_reduce
      inputs:
        data: { layer: compute/post-masked }
      params:
        reducer: median

  # ============================================================
  # COMPUTE: NBR (same formula as NDVI but with NIR and SWIR2)
  # ============================================================

  compute/pre-nbr:
    type: raster
    description: >
      Pre-fire NBR = (NIR - SWIR2) / (NIR + SWIR2).
      Landsat 8 C2 L2: B5=NIR, B7=SWIR2 (with scale/offset applied).
    compute:
      op: raster_calc
      inputs:
        nir: { layer: compute/pre-composite, band: SR_B5 }
        swir2: { layer: compute/pre-composite, band: SR_B7 }
      params:
        expression: "(nir * 0.0000275 - 0.2 - (swir2 * 0.0000275 - 0.2)) / (nir * 0.0000275 - 0.2 + (swir2 * 0.0000275 - 0.2))"

  compute/post-nbr:
    type: raster
    description: >
      Post-fire NBR = (NIR - SWIR2) / (NIR + SWIR2).
    compute:
      op: raster_calc
      inputs:
        nir: { layer: compute/post-composite, band: SR_B5 }
        swir2: { layer: compute/post-composite, band: SR_B7 }
      params:
        expression: "(nir * 0.0000275 - 0.2 - (swir2 * 0.0000275 - 0.2)) / (nir * 0.0000275 - 0.2 + (swir2 * 0.0000275 - 0.2))"

  # ============================================================
  # COMPUTE: dNBR AND SEVERITY CLASSIFICATION
  # ============================================================

  compute/dnbr:
    type: raster
    description: >
      Differenced NBR: pre_NBR - post_NBR.
      Positive values indicate burn severity.
    compute:
      op: raster_calc
      inputs:
        pre: { layer: compute/pre-nbr }
        post: { layer: compute/post-nbr }
      params:
        expression: "pre - post"

  compute/severe:
    type: raster
    description: >
      Binary mask of moderate-to-high burn severity (dNBR > 0.27).
    compute:
      op: raster_threshold_mask
      inputs:
        data: { layer: compute/dnbr }
      params:
        threshold: 0.27
        operator: gt

  # ============================================================
  # RESULT: SEVERITY PERCENTAGE
  # ============================================================

  result/severity-pct:
    type: table
    description: >
      Percentage of AOI with moderate-to-high burn severity.
      Ground truth: ~36.5%.
    compute:
      op: analysis_zonal_stats
      params:
        stats: [mean]
      inputs:
        raster: { layer: compute/severe }

LLM Prompt

The prompt given to LLMs in single-shot workflow benchmarks.

Problem: Compute fire burn severity using differenced Normalized
Burn Ratio (dNBR) from pre-fire and post-fire Landsat 8 imagery
over the 2020 Creek Fire area in California.

Methodology:
- Pre-fire composite: June 2020 (before ignition Sep 4)
- Post-fire composite: October 2020
- NBR = (NIR - SWIR2) / (NIR + SWIR2)
- dNBR = pre_NBR - post_NBR
- Severity classes: unburned (<0.1), low (0.1-0.27),
  moderate (0.27-0.44), high (>0.44)
- Report percentage of AOI classified as moderate-to-high (dNBR > 0.27)

Study area: -119.5, 37.0, -119.1, 37.4 (Creek Fire, Sierra NF, CA).
Data: Landsat 8 Collection 2 Level 2 Surface Reflectance.
Expected answer: approximately 36.5% moderate-to-high severity.