Genius Level
Every input, formula, threshold, and applied calculation in SHA's river/weather/forecast/run intelligence stack. Explore the charts and live diagnostics in one place. Designed to be diagnostic-first, educational-second.
The river is our mirror.
These are the selected forecasts saved before each outcome. Historical NWS and Almanac groups cover different rivers; their averages do not establish which source is better for the same river and target. New paired comparisons are being collected separately. Rainfall is context, not proof of what caused an error. Repeated forecasts and neighboring rivers are correlated.
Latest 1,000 scored forecasts within 90 days · refreshes on page reload (up to 5 minutes cached). Percentage error uses measured flow; zero-flow outcomes have no percentage. Zero values appear in river close-ups, but cannot appear on the all-river logarithmic scale. Artwork is decorative history, not measured conditions. History artwork · study 11
1 · Live snapshot — Cuyahoga River @ Independence
The single most recent river_conditions row for this river.
Fed every 15 min by the rivers:update command which combines USGS
instantaneous values (flow, gauge height, water temp, parameter 00045 for rain bucket) with
OpenWeather current conditions (air temp, weather, wind, humidity, barometric pressure).
2 · Recommendation breakdown
The fishing rating shown on each river page comes from
FishingRecommendationService::getRecommendation(). Four
independently scored components plus a barometric-pressure modifier produce a 0–11 raw score, which is
clamped and cut into Excellent / Good / Fair / Poor. Below is the live decomposition for this river.
"Low flow at 252 CFS. Estimated clarity is clear. Water temperature 61.3°F. Water assessment: fair."
Per-component contribution
| Component | Points | Why |
|---|---|---|
| flow | 1 | |
| temp | 1 | |
| clarity | 2 | |
| weather | 0.05 | |
| pressure | 0 | |
| flow_value | 252 | |
| temp_value | 61.3 | |
| clarity_value | Clear |
Barometric pressure analyzer
Scoring rules
- flow
- In optimal zone = 4 · within 30% = 3 · within 60% = 2 · outside = 1 · above p95×1.5 = 0 (blown).
- temp
- 38–55°F = 3 (prime: covers winter holdover + spring run) · 33–58°F = 2 · 30–62°F = 1 · outside = 0.
- clarity
- Stained = 3 (steelhead green) · Clear = 2 · Muddy = 0.
- weather
- Cloudy/Overcast = 1 · else = 0.
- pressure
- Rapidly falling = +2 · falling = +1 · stable = 0 · rising = -1 · rapidly rising = -1.
- rating_cuts
- Excellent ≥ 9 · Good ≥ 6 · Fair ≥ 3 · Poor < 3 (max 11 after clamp).
3 · Statistics engine
Cached in river_flow_stats, regenerated nightly at 03:00 ET by
flow:compute-stats. The pipeline pulls a 3-year window of hourly-
downsampled USGS flow, removes Tukey outliers at 3× IQR on log-flow, then computes percentiles, a
20-bin log-space histogram, Q-Q quantiles vs. a fitted normal, and (if ≥ 20 historical "Good" reports
exist) promotes the optimal zone from a heuristic p15–p30 to the empirical p10–p90 of those reports.
Percentile distribution
| P | cfs |
|---|---|
| pp5 | 260 |
| pp10 | 269 |
| pp25 | 304 |
| pp50 | 391 |
| pp75 | 558 |
| pp90 | 782 |
| pp95 | 1,090 |
Flow distribution histogram (log-space, 3 yr)
Green bars overlap the optimal zone. Bars are equal-width in log-flow space.
Today's flow placement
Current flow 252 cfs sits at the p5 of the 3-year record. Green band = optimal zone.
4 · Weather integration
Three independent feeds power the per-river weather story. NWS gridpoint forecasts (refreshed every 3 hours) supply 7-day periods + 48 hours of hourly data. AHPS stage forecasts give 5-day predicted flow / gauge height. SPC convective outlooks tier the river's lat/lon by tornado / wind / hail risk for days 1–3. Active alerts are de-duplicated against expired headlines.
NWS 7-day forecast
| Period | Temp | Wind | Forecast |
|---|---|---|---|
| Tonight | 62°F | 7 to 12 mph SE | Partly Cloudy |
| Wednesday | 72°F | 12 to 17 mph S | Light Rain |
| Wednesday Night | 55°F | 6 to 17 mph S | Light Rain Likely |
| Thursday | 67°F | 6 to 13 mph SW | Mostly Sunny |
| Thursday Night | 48°F | 2 to 7 mph SW | Mostly Cloudy |
| Friday | 61°F | 2 to 7 mph W | Mostly Cloudy then Chance Light Rain |
| Friday Night | 43°F | 5 to 8 mph NW | Chance Light Rain |
5 · Run indicator (alley-wide)
Lake-surface temp from NDBC buoys + C-MAN stations, every station counting once (the mean of the station means), compared against 7-day delta and 55°F threshold crossing detection. State changes drive copy on every river page.
Lake Erie
| NDBC-45142 | 59.4°F | Nov 3 10:00pm |
| NDBC-MRHO1 | 59.9°F | Nov 3 9:48pm |
| NDBC-FAIO1 | 60.8°F | Nov 3 9:48pm |
| NDBC-CNDO1 | 61.5°F | Nov 3 9:48pm |
| NDBC-MRHO1 | 59.9°F | Nov 3 9:42pm |
| NDBC-FAIO1 | 60.8°F | Nov 3 9:42pm |
Lake Ontario
| NDBC-45139 | 55.8°F | Nov 3 10:00pm |
| NDBC-45012 | 55.2°F | Nov 3 10:00pm |
| NDBC-45012 | 55.2°F | Nov 3 9:50pm |
| NDBC-45012 | 55.2°F | Nov 3 9:40pm |
| NDBC-45012 | 55.2°F | Nov 3 9:30pm |
| NDBC-45012 | 55.2°F | Nov 3 9:20pm |
Station health
Dark: no water temperature stored for 24 hours while the station is still on the air. Stuck: one identical value for 48 hours. Off air: a seasonal buoy out of the water. A station is reported here and in the error log, never dropped from the average.
| erie | NDBC-CNDO1 | Cleveland Harbor (central Erie south shore) | ok | 61.5°F | Nov 3 9:48pm |
| erie | NDBC-FAIO1 | Fairport Harbor (central Erie south) | ok | 60.8°F | Nov 3 9:48pm |
| erie | NDBC-MRHO1 | Marblehead (western Erie) | ok | 59.9°F | Nov 3 9:48pm |
| erie | NDBC-45005 | Lake Erie (western mid-lake) | dark | 74.7°F | Sep 18 12:00am |
| erie | NDBC-45142 | Lake Erie (eastern offshore, Port Colborne) | ok | 59.4°F | Nov 3 10:00pm |
| ontario | NDBC-45012 | Lake Ontario (mid-lake) | ok | 55.2°F | Nov 3 10:00pm |
| ontario | NDBC-45139 | Lake Ontario (west end, off Grimsby) | ok | 55.8°F | Nov 3 10:00pm |
Seven-state classifier
- pre_run_fall
- Lake Above Fall Temperature Band. River temperatures may already be favorable; fish may already be in tributaries.
- run_starting_fall
- First fish entering tribs (fall pulse).
- run_active_fall
- Active fall run.
- holdover
- Fish wintering in tribs between fall + spring.
- run_starting_spring
- Spring run starting (post-holdover surge).
- run_active_spring
- Active spring run.
- run_ending
- Drop-back; spawned fish leaving for the lake.
- off_season
- Lake-bound; tribs warm; warmwater season.
6 · Storm detection (alley-wide)
ActiveStormDetector fires four parallel triggers against
river_precip_observations, NWS active alerts, and 6-hour flow deltas.
Any single trigger flips the storm card to active; severity is then classified by the most aggressive
signal across all 31 rivers. Precip readings flow from a 4-source priority chain — fresher, more
accurate sources override stale ones.
Selected river lifecycle
"0.5" rain expected by 1 pm. Gauges still calm."
Storm lifecycle state transitions
Storm Lifecycle State Matrix
| River | State | Severity | Signals | Confidence | Headline |
|---|---|---|---|---|---|
| Ashtabula River | watching | - | forecast_precip_0_3 | 67% | 0.4" rain expected by 4 pm. Gauges still calm. |
| Black River | watching | - | forecast_precip_0_3 | 67% | 0.4" rain expected by 12 pm. Gauges still calm. |
| Black River (Watertown) | quiet | - | - | 90% | - |
| Brandy Run near Girard | quiet | - | - | 90% | - |
| Buffalo Creek | quiet | - | - | 90% | - |
| Canadaway Creek | quiet | - | - | 90% | - |
| Cattaraugus Creek | quiet | - | - | 90% | - |
| Cazenovia Creek | quiet | - | - | 90% | - |
| Chagrin River @ Willoughby | watching | - | forecast_precip_0_3 | 67% | 0.4" rain expected by 2 pm. Gauges still calm. |
| Chautauqua Creek | quiet | - | - | 90% | - |
| Conneaut Creek | quiet | - | - | 90% | - |
| Crooked Creek | quiet | - | - | 90% | - |
| Cuyahoga River @ Independence | watching | - | forecast_precip_0_3 | 67% | 0.5" rain expected by 1 pm. Gauges still calm. |
| Eighteen Mile Creek | quiet | - | - | 90% | - |
| Eighteenmile Creek (Niagara) | quiet | - | - | 90% | - |
| Elk Creek | quiet | - | - | 90% | - |
| Euclid Creek | watching | - | forecast_precip_0_3 | 67% | 0.4" rain expected by 1 pm. Gauges still calm. |
| Genesee River | quiet | - | - | 90% | - |
| Grand River near Painesville | watching | - | forecast_precip_0_3 | 67% | 0.4" rain expected by 3 pm. Gauges still calm. |
| Huron River | watching | - | forecast_precip_0_3 | 67% | 0.5" rain expected by 10 am. Gauges still calm. |
| Irondequoit Creek | quiet | - | - | 90% | - |
| Johnson Creek | quiet | - | - | 90% | - |
| Oak Orchard Creek | quiet | - | - | 90% | - |
| Rocky River near Berea | watching | - | forecast_precip_0_3 | 67% | 0.4" rain expected by 1 pm. Gauges still calm. |
| Salmon River | quiet | - | - | 90% | - |
| Sandy Creek (Adams) | quiet | - | - | 90% | - |
| Sandy Creek (Hamlin) | quiet | - | - | 90% | - |
| Silver Creek | quiet | - | - | 90% | - |
| Twenty Mile Creek | quiet | - | - | 90% | - |
| Vermilion River @ Vermilion | watching | - | forecast_precip_0_3 | 67% | 0.5" rain expected by 11 am. Gauges still calm. |
| Walnut Creek | quiet | - | - | 90% | - |
Precipitation rate — last 24 hours (NWS publishes in 6h intervals; USGS hourly where available)
Y axis is in/hr precipitation, auto-scaled but always includes the broad-rain trigger so quiet days still have context. The cyan line is the alley-wide average; gray ticks above each cyan dot show how high the single wettest river was running at that observation. When cyan crosses amber → broad-front rain. When a gray tick crosses red → one river is in a heavy cell. Sparse points are real — NWS gridpoint QPE only updates every 6 hours per river; the hourly USGS rows fill in for the handful of rivers whose gauges publish precipitation.
Triggers
- Trigger 1A — Heavy MRMS rate
- ≥ 1 river over 0.5 in/hr in last 30 min.
- Trigger 1B — Broad rain
- ≥ 3 rivers with precipitation_1h > 0.10".
- Trigger 2 — NWS alert
- ≥ 1 active alert covering any river.
- Trigger 3 — Flow rise
- ≥ 1 river with current flow ≥ 1.5× flow 6 hours ago, where its region has had rain in the last 24 hours (0.10" in an hour, 0.25" in a day, or an NWS alert). Dam-controlled rivers (Oak Orchard) never count.
Severity classifier
- severe
- NWS Extreme/Severe alert · MRMS ≥ 1.0 in/hr · ≥ 5 rivers rising · ≥ 8 raining · ≥ 3 heavy MRMS rivers
- moderate
- Any active alert · MRMS ≥ 0.5 in/hr · ≥ 1 rising · ≥ 5 raining
- light
- Default when active but none of the above
Precipitation source priority
- mrms — Open-Meteo Lite (15-min observations) — 10 min staleness window
- usgs — USGS parameter 00045 from gauges with rain buckets — 30 min
- nws_obs — NWS gridpoint quantitativePrecipitation past intervals — 90 min
- nws_fcst — NWS gridpoint forecast (final fallback) — 240 min
7 · Alley Index (alley-wide)
Percentile rank of today's underlying conditions composite (mean of per-river fishing scores 0–100) against the historical record on this calendar window (±15 days, all years). Below 10 comparable days in the window the Index falls back to the raw underlying score so the page always shows a meaningful number.
Band cuts
| Band | Cut | Meaning |
|---|---|---|
| Excellent | ≥ 90 | Top 10% of comparable days ever recorded. |
| Good | ≥ 70 | Top 30%. |
| Average | ≥ 30 | Middle 40%. |
| Poor | ≥ 10 | Bottom 30%. |
| Blown | ≥ 0 | Bottom 10%. |
Last 30 days
Older → newer left to right. Color follows band cuts.
8 · Forecast verification (alley-wide)
Most-recent NWS prediction for each (river, date) in the last 14 days, sorted past→future. The verifier joins each prediction to MAX/MIN(air_temp_f) + MAX(precipitation_1h) from river_conditions on that date. Δ column compares observed vs predicted. Known upstream gap: predicted precipitation inches are unreliable (NWS forecast text rarely includes a clean inches value, so the snapshotter falls back to 0). Use precip probability as the better forecast signal.
| Date | River | Predicted (hi/lo · precip) | Observed (hi/lo · max 1h) | Δ vs predicted |
|---|---|---|---|---|
| 2026-11-09 | Ashtabula River | 55°/— · 46% POP · 18 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Black River | 55°/— · 28% POP · 13 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Black River (Watertown) | 51°/— · 37% POP · 7 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Brandy Run near Girard | 54°/— · 48% POP · 12 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Buffalo Creek | 54°/— · 35% POP · 8 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Canadaway Creek | 53°/— · 46% POP · 13 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Cattaraugus Creek | 53°/— · 46% POP · 8 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Cazenovia Creek | 54°/— · 36% POP · 8 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Chagrin River @ Willoughby | 56°/— · 40% POP · 13 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Chautauqua Creek | 53°/— · 46% POP · 13 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Conneaut Creek | 55°/— · 46% POP · 14 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Crooked Creek | 54°/— · 47% POP · 12 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Cuyahoga River @ Independence | 56°/— · 35% POP · 12 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Eighteen Mile Creek | 53°/— · 40% POP · 7 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Eighteenmile Creek (Niagara) | 54°/— · 31% POP · 10 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Elk Creek | 54°/— · 48% POP · 13 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Euclid Creek | 55°/— · 38% POP · 13 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Genesee River | 54°/— · 35% POP · 10 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Grand River near Painesville | 55°/— · 43% POP · 14 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Huron River | 56°/— · 22% POP · 10 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Irondequoit Creek | 54°/— · 35% POP · 10 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Johnson Creek | 53°/— · 34% POP · 13 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Oak Orchard Creek | 54°/— · 34% POP · 13 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Rocky River near Berea | 55°/— · 32% POP · 14 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Salmon River | 51°/— · 45% POP · 7 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Sandy Creek (Adams) | 51°/— · 40% POP · 7 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Sandy Creek (Hamlin) | 54°/— · 35% POP · 13 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Silver Creek | 52°/— · 44% POP · 12 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Tuscarawas River | 54°/— · 25% POP · 12 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Twenty Mile Creek | 53°/— · 46% POP · 13 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Vermilion River @ Vermilion | 55°/— · 27% POP · 13 mph W | (future — not yet verifiable) | |
| 2026-11-09 | Walnut Creek | 53°/— · 48% POP · 17 mph W | (future — not yet verifiable) | |
| 2026-11-08 | Ashtabula River | 55°/42° · 46% POP · 15 mph W | (future — not yet verifiable) | |
| 2026-11-08 | Black River | 56°/38° · 23% POP · 10 mph W | (future — not yet verifiable) | |
| 2026-11-08 | Black River (Watertown) | 53°/36° · 37% POP · 8 mph SW | (future — not yet verifiable) | |
| 2026-11-08 | Brandy Run near Girard | 53°/38° · 45% POP · 8 mph SW | (future — not yet verifiable) | |
| 2026-11-08 | Buffalo Creek | 55°/38° · 34% POP · 7 mph SW | (future — not yet verifiable) | |
| 2026-11-08 | Canadaway Creek | 53°/38° · 46% POP · 10 mph W | (future — not yet verifiable) | |
| 2026-11-08 | Cattaraugus Creek | 54°/37° · 42% POP · 6 mph SW | (future — not yet verifiable) | |
| 2026-11-08 | Cazenovia Creek | 55°/38° · 35% POP · 7 mph SW | (future — not yet verifiable) | |
| 2026-11-08 | Chagrin River @ Willoughby | 57°/39° · 40% POP · 9 mph W | (future — not yet verifiable) | |
| 2026-11-08 | Chautauqua Creek | 52°/42° · 46% POP · 10 mph SW | (future — not yet verifiable) | |
| 2026-11-08 | Conneaut Creek | 55°/41° · 44% POP · 12 mph W | (future — not yet verifiable) | |
| 2026-11-08 | Crooked Creek | 54°/38° · 45% POP · 9 mph SW | (future — not yet verifiable) | |
| 2026-11-08 | Cuyahoga River @ Independence | 57°/39° · 29% POP · 9 mph SW | (future — not yet verifiable) | |
| 2026-11-08 | Eighteen Mile Creek | 54°/38° · 39% POP · 6 mph SW | (future — not yet verifiable) | |
| 2026-11-08 | Eighteenmile Creek (Niagara) | 56°/38° · 26% POP · 9 mph SW | (future — not yet verifiable) | |
| 2026-11-08 | Elk Creek | 54°/40° · 45% POP · 9 mph SW | (future — not yet verifiable) | |
| 2026-11-08 | Euclid Creek | 56°/42° · 37% POP · 10 mph W | (future — not yet verifiable) | |
| 2026-11-08 | Genesee River | 56°/40° · 25% POP · 8 mph W | (future — not yet verifiable) | |
| 2026-11-08 | Grand River near Painesville | 56°/38° · 43% POP · 10 mph W | (future — not yet verifiable) | |
| 2026-11-08 | Huron River | 56°/37° · 16% POP · 9 mph W | (future — not yet verifiable) | |
| 2026-11-08 | Irondequoit Creek | 56°/38° · 25% POP · 8 mph W | (future — not yet verifiable) | |
| 2026-11-08 | Johnson Creek | 54°/42° · 29% POP · 10 mph W | (future — not yet verifiable) | |
| 2026-11-08 | Oak Orchard Creek | 54°/40° · 29% POP · 10 mph SW | (future — not yet verifiable) | |
| 2026-11-08 | Rocky River near Berea | 56°/38° · 26% POP · 12 mph W | (future — not yet verifiable) | |
| 2026-11-08 | Salmon River | 54°/36° · 39% POP · 7 mph W | (future — not yet verifiable) | |
| 2026-11-08 | Sandy Creek (Adams) | 53°/38° · 40% POP · 8 mph SW | (future — not yet verifiable) | |
| 2026-11-08 | Sandy Creek (Hamlin) | 54°/39° · 29% POP · 9 mph W | (future — not yet verifiable) | |
| 2026-11-08 | Silver Creek | 53°/39° · 44% POP · 9 mph W | (future — not yet verifiable) | |
| 2026-11-08 | Tuscarawas River | 56°/36° · 20% POP · 8 mph W | (future — not yet verifiable) | |
| 2026-11-08 | Twenty Mile Creek | 53°/44° · 46% POP · 9 mph SW | (future — not yet verifiable) | |
| 2026-11-08 | Vermilion River @ Vermilion | 56°/36° · 22% POP · 10 mph W | (future — not yet verifiable) | |
| 2026-11-08 | Walnut Creek | 53°/43° · 48% POP · 12 mph SW | (future — not yet verifiable) | |
| 2026-11-07 | Ashtabula River | 55°/42° · 49% POP · 15 mph NW | (future — not yet verifiable) | |
| 2026-11-07 | Black River | 56°/40° · 38% POP · 10 mph W | (future — not yet verifiable) | |
| 2026-11-07 | Black River (Watertown) | 56°/38° · 37% POP · 7 mph NW | (future — not yet verifiable) | |
| 2026-11-07 | Brandy Run near Girard | 54°/39° · 48% POP · 9 mph NW | (future — not yet verifiable) | |
| 2026-11-07 | Buffalo Creek | 56°/39° · 48% POP · 6 mph W | (future — not yet verifiable) | |
| 2026-11-07 | Canadaway Creek | 54°/39° · 48% POP · 10 mph NW | (future — not yet verifiable) | |
| 2026-11-07 | Cattaraugus Creek | 56°/39° · 53% POP · 6 mph W | (future — not yet verifiable) | |
| 2026-11-07 | Cazenovia Creek | 56°/40° · 48% POP · 6 mph W | (future — not yet verifiable) | |
| 2026-11-07 | Chagrin River @ Willoughby | 57°/41° · 52% POP · 10 mph NW | (future — not yet verifiable) | |
| 2026-11-07 | Chautauqua Creek | 53°/43° · 50% POP · 10 mph NW | (future — not yet verifiable) | |
| 2026-11-07 | Conneaut Creek | 55°/42° · 49% POP · 12 mph NW | (future — not yet verifiable) | |
| 2026-11-07 | Crooked Creek | 55°/39° · 47% POP · 9 mph NW | (future — not yet verifiable) | |
| 2026-11-07 | Cuyahoga River @ Independence | 57°/41° · 45% POP · 10 mph W | (future — not yet verifiable) | |
| 2026-11-07 | Eighteen Mile Creek | 55°/40° · 51% POP · 6 mph W | (future — not yet verifiable) | |
| 2026-11-07 | Eighteenmile Creek (Niagara) | 56°/39° · 41% POP · 9 mph NW | (future — not yet verifiable) | |
| 2026-11-07 | Elk Creek | 55°/41° · 48% POP · 10 mph NW | (future — not yet verifiable) |
9 · Conditions archive (alley-wide)
Tiered retention so the database doesn't grow unbounded but the long-history aggregates that power the
Alley Index, forecast verifier, and storm-pulse detector remain intact. Raw river_conditions
prune weekly via rivers:clean; hourly + daily rollups are forever.
Retention policy
- raw river_conditions
- 90 days (pruned weekly via rivers:clean)
- gauge_readings
- 90 days
- lake_temp_snapshots
- forever (small volume)
- precip_observations
- raw 90 days; hourly + daily rollups forever
- ahps_forecasts
- forever
- alley_index_snapshots
- forever
- spc_outlooks
- forever
- nws_alerts
- forever (with ended_at marker)
Row counts (live)
| river_conditions | 500,315 |
| gauge_readings | 1,018,180 |
| lake_temp_snapshots | 93,611 |
| precip_observations | 32,227 |
| ahps_forecasts | 6,288 |
| alley_index_snapshots | 281 |
| spc_outlooks | 41 |
| nws_alerts | 1,048 |
10 · Data sources & cadence (operational)
Every external feed feeding SHA's intelligence stack, with the artisan command that drives it, last-fetch timestamp, and total row count. If a "last_at" is hours behind cadence, that source is stalled.
| Source | Cadence | Driver | Last at | Rows |
|---|---|---|---|---|
| USGS instantaneous values | 15 min | rivers:update | Nov 3 10:45pm | 1,018,180 |
| OpenWeather current | 15 min | rivers:update | Nov 3 10:45pm | 500,315 |
| NWS 7-day + hourly forecast | 3 hours | forecasts:fetch | Nov 3 10:01pm | 32 |
| NWS AHPS predicted flow | 6 hours | ahps:fetch | Nov 3 11:16am | 6,288 |
| NWS active alerts | 15 min | alerts:fetch-nws | Oct 16 6:15pm | 1,048 |
| SPC convective outlooks | 3 hours | spc:fetch-outlook | Nov 3 10:15pm | 41 |
| NDBC + C-MAN lake temps | 1 hour | noaa:fetch-buoys | Nov 3 10:00pm | 93,611 |
| River precip (USGS / NWS / MRMS-Lite) | 5–60 min | rivers:update + precip:fetch-nws + local Open-Meteo worker | Nov 3 10:00pm | 32,227 |
| Alley Index snapshot | hourly + daily 04:50 ET | index:compute | Nov 3 10:00pm | 281 |
| Run state classifier | daily 06:30 ET | run-state:compute | Nov 2 | 338 |
11 · Constants reference (every threshold in one place)
Every magic number that drives a SHA decision, with the file it lives in. Edit the source to change a threshold — this page reflects the live code path. Grouped by subsystem.
| Group | Constant | Value | Where |
|---|---|---|---|
| Flow scoring | In optimal zone | 4 points | IndexCalculatorService::scoreCondition |
| Flow scoring | Within 30% of optimal | 3 points | IndexCalculatorService::scoreCondition |
| Flow scoring | Within 60% of optimal | 2 points | IndexCalculatorService::scoreCondition |
| Flow scoring | Above p95 × 1.5 | Blown (0) | IndexCalculatorService::scoreCondition |
| Temp scoring | Prime band (winter + spring) | 38–55°F = 3 | FishingRecommendationService::analyzeTemperature |
| Temp scoring | Good band | 33–58°F = 2 | FishingRecommendationService::analyzeTemperature |
| Temp scoring | Marginal band | 30–62°F = 1 | FishingRecommendationService::analyzeTemperature |
| Clarity | Clear / Stained ratio | < 1.4× p50 | RiverMonitorService::determineClarity |
| Clarity | Stained / Muddy ratio | < 2.8× p50 | RiverMonitorService::determineClarity |
| Pressure | Rapidly falling | ≤ -1.0 hPa/hr | PressureService |
| Pressure | Falling | ≤ -0.3 hPa/hr | PressureService |
| Pressure | Score modifier (rapidly falling) | +2 points | PressureService |
| Storm card | Heavy-MRMS threshold | 0.5 in/hr | ActiveStormDetector::HEAVY_RATE_INCHES_PER_HOUR |
| Storm card | Heavy-MRMS lookback | 30 min | ActiveStormDetector::HEAVY_RATE_LOOKBACK_MINUTES |
| Storm card | Broad-rain threshold | 0.10"/hr | ActiveStormDetector::RAIN_THRESHOLD_INCHES |
| Storm card | Broad-rain river count | ≥ 3 | ActiveStormDetector::MIN_RAIN_RIVERS |
| Storm card | Flow-rise factor | 1.5× vs 6h ago | ActiveStormDetector::FLOW_RISE_FACTOR |
| Storm card | Rain needed behind a flow rise | 0.10" in an hour or 0.25" in a day, in the region, last 24h | StormRainEvidence |
| Storm lifecycle | Watching forecast precip | ≥ 0.30" in 24h | StormLifecycleService::forecastPrecipSignal |
| Storm lifecycle | Watching AHPS rise | ≥ 2× current flow | StormLifecycleService::watchingSignals |
| Storm lifecycle | Recovery lookback | 72 hours | StormLifecycleService::recoveringSignal |
| Storm lifecycle | Recovery normalized flow | ≤ optimal high × 1.15 | StormLifecycleService::flowIsNormalized |
| Run indicator | Lake threshold | 55°F | RunStateClassifier |
| Run indicator | Lake temperature | mean of station means | LakeTemperature::stationMean |
| Run indicator | Lake above fall temperature band, Sep–Nov | > 56°F | RunStateClassifier::classify |
| Run indicator | Station dark | 24 hours, no water temp | LakeStationHealth::DARK_HOURS |
| Run indicator | Station stuck | 48 hours, one value | LakeStationHealth::STUCK_HOURS |
| Alley Index | Calendar window | ±15 days, all years | IndexPercentileService::WINDOW_DAYS |
| Alley Index | Min pool for percentile | 10 days | IndexPercentileService::MIN_POOL |
| Alley Index | Excellent band | ≥ 90 | IndexPercentileService::descriptorFor |
| Alley Index | Good band | 70–89 | IndexPercentileService::descriptorFor |
| Alley Index | Average band | 30–69 | IndexPercentileService::descriptorFor |
| Alley Index | Poor band | 10–29 | IndexPercentileService::descriptorFor |
| Alley Index | Blown band | 0–9 | IndexPercentileService::descriptorFor |
| Forecast verify | Snapshot time | Daily 05:15 ET | routes/console.php |
| Optimal zone | Empirical promotion threshold | ≥ 20 Good reports | RiverFlowStatistics |
| Stats engine | Window | 3 years | RiverFlowStatistics |
| Stats engine | Outlier removal | 3× IQR on log-flow | RiverFlowStatistics |
| Stats engine | Histogram bins | 20 (log-space) | RiverFlowStatistics |