crop-stress-multiindex

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

Per-field crop stress diagnosis from a Sentinel-2 multi-index time series: EVI (canopy structure, saturation-resistant), NDRE (red-edge chlorophyll and nitrogen status), and NDMI (SWIR canopy moisture / water stress). Together the three indices separate stress TYPE that NDVI alone cannot resolve — a field with low NDRE is nitrogen-deficient; low NDMI flags water stress; both falling simultaneously indicates compound stress. For each clear S2 pass the recipe computes EVI, NDRE, and NDMI at field resolution, derives seasonal means per index, and flags per-field stress using a combined stress index (CSI = mean of z-scored deficits across the three indices). The per-field table is the deliverable; the index stacks and seasonal mean rasters are the "show your work" layers. The recipe extends crop-monitoring (NDVI harmonic phenology) by adding two diagnostic axes — chlorophyll/N (NDRE) and water (NDMI) — alongside a saturation-resistant canopy index (EVI). Together they allow a field scout to ask: "is this field stressed, and WHY?" Index formulas (Sentinel-2 band names, baseline >= 04.00 BOA reflectance): EVI = 2.5 * (B08 - B04) / (B08 + 6*B04 - 7.5*B02 + 1) [Huete 2002] NDRE = (B08 - B05) / (B08 + B05) red-edge NIR vs red-edge 705 nm [Gitelson 2003] NDMI = (B08 - B11) / (B08 + B11) NIR vs SWIR-1 1610 nm [Gao 1996]

Primary outputs
compute/field-stress
Show your work
compute/evi-mean compute/ndre-mean compute/ndmi-mean compute/stress-index compute/stress-flag compute/evi compute/ndre compute/ndmi
Provenance
source_scene_ids scenes_checked scenes_kept
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-stress']
show_your_work not declared ['compute/evi-mean', 'compute/ndre-mean', 'compute/ndmi-mean', 'compute/stress-index', 'compute/stress-flag', 'compute/evi', 'compute/ndre', 'compute/ndmi']
provenance not declared ['source_scene_ids', 'scenes_checked', 'scenes_kept']

Capabilities it requires

The legacy dialect has no requires: block.

Where it runs

  • Browser preview does not run here compute/evi: layer type "raster_timeseries" is not one folia-view parses; compute/evi-mean: depends on layer "compute/evi", which cannot run here; compute/field-stress: carries an unsubstituted ${...} template; and 8 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-stress-multiindex/folia.yaml