crop-monitoring-sar-fused

unverified
v0.1 AOI: San Joaquin Valley cropland block — Fresno County · bbox -120.05, 36.55, -119.85, 36.72

Cloud-gap-resilient crop monitoring by fusing Sentinel-1 SAR (VV/VH) with the Sentinel-2 NDVI time series. SAR backscatter is weather-independent: where optical scenes are cloud-contaminated, S1 VH temporal features (mean, std, p10/p90) and the VH/VV ratio carry canopy-structure and canopy-moisture signal that tracks crop growth stages independently of cloud cover. The fusion is honest gap-filling: on dates where S2 passes a cloud gate the NDVI observation anchors the harmonic_fit; on cloudy dates the SAR-derived canopy proxy fills the temporal slot so the season is not truncated. Per-field zonal_stats then aggregate the fused phenology signal to one row per field — the same crop-monitoring product table as the optical-only recipe, but with continuous temporal coverage through cloudy periods (Central Valley foggiest months: November–February). This is the reliability upgrade that commercial crop-monitoring products use (Indigo Ag, Granular, Proagrica). The SAR leg does not require a trained model — VH mean and VH/VV ratio are direct empirical proxies (Veloso 2017). The recipe deliberately keeps the fusion simple enough to inspect: every input to every merged date is recorded in the provenance block.

Primary outputs
compute/field_stats
Show your work
compute/ndvi compute/s1-ndvi-proxy compute/ndvi-fused compute/phenology compute/s1-temporal
Provenance
source_scene_ids
License
recipe
Apache-2.0
outputs
CC-BY-4.0
Map preview and live runs are available in the workbench.

The contract

legacy dialectcandidate

Read from this recipe's own declarations — parameters:, outputs:, requires:, and the ops its layers name. Not from its style blocks and not from any benchmark: a colour ramp is not a contract, and a measured run is evidence about one AOI rather than a domain.

Parameters

The legacy dialect has no typed parameter schema. Read the folia.yaml for what this recipe takes; nothing here can type-check it.

Outputs

outputkindlayerwhat it is
primary not declared ['compute/field_stats']
show_your_work not declared ['compute/ndvi', 'compute/s1-ndvi-proxy', 'compute/ndvi-fused', 'compute/phenology', 'compute/s1-temporal']
provenance not declared ['source_scene_ids']

Capabilities it requires

The legacy dialect has no requires: block.

Where it runs

  • Browser preview does not run here compute/field_stats: carries an unsubstituted ${...} template; compute/ndvi: layer type "raster_timeseries" is not one folia-view parses; compute/ndvi-fused: layer type "raster_timeseries" is not one folia-view parses; and 7 more
  • Local CLI (folia run) runs here runs locally through the legacy (no spec_version) parser
  • Operated fleet (POST /plan, /run) runs here legacy dialect: a lock binds by the cut's layer names, not by digest
open in Workbench from registry/recipes/crop-monitoring-sar-fused/folia.yaml