crop-stress-multiindex
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]
- recipe
- Apache-2.0
- outputs
- CC-BY-4.0
The contract
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
| output | kind | layer | what 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
registry/recipes/crop-stress-multiindex/folia.yaml