# SignalReach Mission JSON Params (canonical contract)

## Top-level
- `aoi`: string path to KML polygon
- `grid_spacing_m`: number demand point spacing
- `workers`: int 1-8
- `candidate_min_sep_m`: number
- `out_dir`: string path

## Canonical config blocks
- `dem`
- `topo`
- `los`
- `rf`
- `rf_backhaul`
- `heatmap`
- `backhaul`
- `tiered`
- `validation`
- `progressive`
- `constraints`
- `must_cover`
- `anchors`
- `assets`
- `protocol`
- `protocol_backhaul`

## validation
- `enabled`: bool
- `step_m`: number
- `max_points`: int
- `warn_delta_pct`: number

## progressive
- `enabled`: bool
- `coarse_step_m`: number
- `coarse_max_points`: int
- `fine_top_k`: int|null

## los
- `target_coverage_pct`: number
- `step_m`: number
- `freq_mhz`: number
- `fresnel_k`: number
- `max_points`: int
- `boundary_every_n`: int
- `sampling`: `random` | `stratified`
- `strata_spacing_m`: number

## Compatibility
Legacy top-level keys still load for existing missions and presets:
- `validate_full`, `validate_full_step_m`, `validate_full_max_points`, `validate_warn_delta_pct`
- `progressive_enabled`, `progressive_coarse_step_m`, `progressive_coarse_max_points`, `progressive_fine_top_k`

Prefer the nested `validation` and `progressive` blocks for all new work.
