What a row says
1 row per station, threat and hour. Risk percent and level are the headline figures. Conducive hours count how many hours in the model’s own window met the threat’s conditions; the disease severity value is the running accumulator behind the fungal models specifically. Data completeness is simply the share of the window’s hours that had the readings the model needed in the first place. A threat score and a prioritised flag together decide which 2 threats a notification names, and model detail, the thresholds in force and the crop stage assumed, travels along in its own metadata field.
Read data completeness first
A risk computed off a third of the hours is a watch item, not a verdict, and the potato station at Naivasha makes the point cleanly: aphid risk reads 25 % with 0 % completeness, because the aphid model needs wind and the station has no anemometer, so that percentage is simply carried over from the last complete cycle. Bacterial wilt, by contrast, reads 100 % with 100 % completeness off a week-long multiplication run in warm, wet soil. The second row is a genuine warning; the first is a model running without its inputs, and the dataset says exactly that in the row itself rather than hiding it.
Which models run
The station’s crop decides the set. Potato runs 11 threats: late blight, early blight, bacterial wilt, blackleg and soft rot, common scab, rhizoctonia, potato tuber moth, aphid risk, whitefly, and 2 separate virus risks. Potato is also the calibrated set, built at 1,900 m in Naivasha, using event-based triggers and phenology gates pulled from sensor settings; models shipped only with temperate thresholds instead fire continuously as a fallback baseline. Onion runs 6 threats, coffee 5. The kind tag groups all of them: fungal severity accumulators, bacterial multiplication runs, soil temperature and moisture windows, insect phenology on degree-days, and vector flights tracked on wind and temperature.
Prioritisation
Every cycle, each threat gets scored on its risk tier, the economic severity of the threat itself, whether an action is available, and how recently it was last alerted. Low-tier threats never score at all. The top 2 get marked prioritised, a notification names exactly those, and everything else drops to a watch list instead.
History
The 30-day charts read this same dataset at its daily maximum. Late blight sat at 0 through a dry August; bacterial wilt held at 100 off a soil that never dried below its own run threshold. What triggers an advisory is a transition upward between 2 cycles, and every single transition gets written to the advisory history, whether it was sent or simply held.