Genius Level
Every input, formula, threshold, and applied calculation in SHA's river/weather/forecast/run intelligence stack. One scroll, no clicks, no caches. Designed to be diagnostic-first, educational-second.
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.
"Dropping nicely at 471 CFS, water is clear, 75°F — prime summer feeding temp. The river is giving you a chance today. Flow is coming down — the sweet spot is approaching. Legend Has It, He's Still Mending."
Per-component contribution
| Component | Points | Why |
|---|---|---|
| flow | 4 | |
| temp | 1 | |
| clarity | 3 | |
| weather | -0.05 | |
| pressure | 0 | |
| flow_value | 471 | |
| temp_value | 75.4 | |
| 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 | 316 |
| pp10 | 332 |
| pp25 | 371 |
| pp50 | 467 |
| pp75 | 687 |
| pp90 | 1,049 |
| pp95 | 1,333 |
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 471 cfs sits at the p75 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 |
|---|---|---|---|
| Today | 81°F | 2 to 6 mph NE | Sunny |
| Tonight | 62°F | 6 mph E | Partly Cloudy |
| Saturday | 83°F | 5 to 8 mph S | Chance Rain Showers |
| Saturday Night | 66°F | 6 mph SW | Chance Showers And Thunderstorms then Mostly Cloudy |
| Sunday | 83°F | 3 to 9 mph W | Mostly Sunny then Slight Chance Showers And Thunderstorms |
| Sunday Night | 62°F | 3 to 7 mph N | Slight Chance Showers And Thunderstorms |
| Monday | 78°F | 7 mph NE | Slight Chance Rain Showers then Partly Sunny |
5 · Run indicator (alley-wide)
Latest 24h average lake-surface temp from NDBC buoys + C-MAN stations, compared against 7-day delta and 55°F threshold crossing detection. State changes drive copy on every river page.
Lake Erie
| NDBC-45142 | 73.8°F | Sep 11 3:00pm |
| NDBC-MRHO1 | 76.3°F | Sep 11 2:48pm |
| NDBC-FAIO1 | 75.2°F | Sep 11 2:48pm |
| NDBC-CNDO1 | 74.3°F | Sep 11 2:48pm |
| NDBC-MRHO1 | 76.3°F | Sep 11 2:42pm |
| NDBC-FAIO1 | 75.2°F | Sep 11 2:42pm |
Lake Ontario
| NDBC-45139 | 71.4°F | Sep 11 3:00pm |
| NDBC-45012 | 71.2°F | Sep 11 2:50pm |
| NDBC-45012 | 71.4°F | Sep 11 2:40pm |
| NDBC-45012 | 71.2°F | Sep 11 2:30pm |
| NDBC-45012 | 71.2°F | Sep 11 2:20pm |
| NDBC-45012 | 71.2°F | Sep 11 2:10pm |
Seven-state classifier
- pre_run_fall
- Fish staging in lake; tribs empty.
- 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
Storm lifecycle state transitions
Storm Lifecycle State Matrix
| River | State | Severity | Signals | Confidence | Headline |
|---|---|---|---|---|---|
| Ashtabula River | quiet | - | - | 90% | - |
| Black River | quiet | - | - | 90% | - |
| Black River (Watertown) | quiet | - | - | 90% | - |
| Brandy Run near Girard | quiet | - | - | 90% | - |
| Buffalo Creek | quiet | - | - | 90% | - |
| Canadaway Creek | quiet | - | - | 90% | - |
| Cattaraugus Creek | recovering | severe | recent_pulse_unreturned | 82% | Storm ended 46h ago; peak was 2,190 cfs; now at 186% of baseline. |
| Cazenovia Creek | quiet | - | - | 90% | - |
| Chagrin River @ Willoughby | quiet | - | - | 90% | - |
| Chautauqua Creek | quiet | - | - | 90% | - |
| Conneaut Creek | quiet | - | - | 90% | - |
| Crooked Creek | quiet | - | - | 90% | - |
| Cuyahoga River @ Independence | quiet | - | - | 90% | - |
| Eighteen Mile Creek | quiet | - | - | 90% | - |
| Eighteenmile Creek (Niagara) | quiet | - | - | 90% | - |
| Elk Creek | quiet | - | - | 90% | - |
| Euclid Creek | quiet | - | - | 90% | - |
| Genesee River | recovering | moderate | recent_pulse_unreturned | 82% | Storm ended 52h ago; peak was 1,690 cfs; now at 146% of baseline. |
| Grand River near Painesville | quiet | - | - | 90% | - |
| Huron River | quiet | - | - | 90% | - |
| Irondequoit Creek | recovering | moderate | recent_pulse_unreturned | 82% | Storm ended 52h ago; peak was 275 cfs; now at 120% of baseline. |
| Johnson Creek | recovering | moderate | recent_pulse_unreturned | 82% | Storm ended 46h ago; peak was 173 cfs; now at 133% of baseline. |
| Oak Orchard Creek | quiet | - | - | 90% | - |
| Rocky River near Berea | quiet | - | - | 90% | - |
| Salmon River | quiet | - | - | 90% | - |
| Sandy Creek (Adams) | recovering | moderate | recent_pulse_unreturned | 82% | Storm ended 45h ago; peak was 151 cfs; now at 195% of baseline. |
| Sandy Creek (Hamlin) | quiet | - | - | 90% | - |
| Silver Creek | quiet | - | - | 90% | - |
| Twenty Mile Creek | quiet | - | - | 90% | - |
| Vermilion River @ Vermilion | recovering | severe | recent_pulse_unreturned | 82% | Storm ended 49h ago; peak was 40 cfs; now at 197% of baseline. |
| 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.
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-09-17 | Ashtabula River | 77°/— · 59% POP · 14 mph N | (future — not yet verifiable) | |
| 2026-09-17 | Black River | 80°/— · 64% POP · 13 mph N | (future — not yet verifiable) | |
| 2026-09-17 | Black River (Watertown) | 73°/— · 49% POP · 8 mph N | (future — not yet verifiable) | |
| 2026-09-17 | Brandy Run near Girard | 76°/— · 60% POP · 10 mph N | (future — not yet verifiable) | |
| 2026-09-17 | Buffalo Creek | 75°/— · 54% POP · 7 mph SW | (future — not yet verifiable) | |
| 2026-09-17 | Canadaway Creek | 76°/— · 57% POP · 12 mph SW | (future — not yet verifiable) | |
| 2026-09-17 | Cattaraugus Creek | 77°/— · 60% POP · 7 mph SW | (future — not yet verifiable) | |
| 2026-09-17 | Cazenovia Creek | 76°/— · 55% POP · 7 mph SW | (future — not yet verifiable) | |
| 2026-09-17 | Chagrin River @ Willoughby | 80°/— · 60% POP · 12 mph N | (future — not yet verifiable) | |
| 2026-09-17 | Chautauqua Creek | 75°/— · 58% POP · 13 mph N | (future — not yet verifiable) | |
| 2026-09-17 | Conneaut Creek | 76°/— · 57% POP · 12 mph N | (future — not yet verifiable) | |
| 2026-09-17 | Crooked Creek | 77°/— · 59% POP · 9 mph NE | (future — not yet verifiable) | |
| 2026-09-17 | Cuyahoga River @ Independence | 82°/— · 62% POP · 12 mph N | (future — not yet verifiable) | |
| 2026-09-17 | Eighteen Mile Creek | 75°/— · 56% POP · 7 mph SW | (future — not yet verifiable) | |
| 2026-09-17 | Eighteenmile Creek (Niagara) | 75°/— · 51% POP · 10 mph N | (future — not yet verifiable) | |
| 2026-09-17 | Elk Creek | 76°/— · 59% POP · 10 mph N | (future — not yet verifiable) | |
| 2026-09-17 | Euclid Creek | 79°/— · 61% POP · 12 mph N | (future — not yet verifiable) | |
| 2026-09-17 | Genesee River | 75°/— · 56% POP · 9 mph N | (future — not yet verifiable) | |
| 2026-09-17 | Grand River near Painesville | 79°/— · 61% POP · 13 mph N | (future — not yet verifiable) | |
| 2026-09-17 | Huron River | 80°/— · 64% POP · 12 mph N | (future — not yet verifiable) | |
| 2026-09-17 | Irondequoit Creek | 76°/— · 57% POP · 9 mph NW | (future — not yet verifiable) | |
| 2026-09-17 | Johnson Creek | 72°/— · 52% POP · 10 mph N | (future — not yet verifiable) | |
| 2026-09-17 | Oak Orchard Creek | 74°/— · 52% POP · 10 mph N | (future — not yet verifiable) | |
| 2026-09-17 | Rocky River near Berea | 80°/— · 63% POP · 15 mph N | (future — not yet verifiable) | |
| 2026-09-17 | Salmon River | 74°/— · 55% POP · 7 mph S | (future — not yet verifiable) | |
| 2026-09-17 | Sandy Creek (Adams) | 73°/— · 50% POP · 8 mph N | (future — not yet verifiable) | |
| 2026-09-17 | Sandy Creek (Hamlin) | 74°/— · 52% POP · 10 mph N | (future — not yet verifiable) | |
| 2026-09-17 | Silver Creek | 75°/— · 56% POP · 10 mph SW | (future — not yet verifiable) | |
| 2026-09-17 | Twenty Mile Creek | 75°/— · 58% POP · 12 mph N | (future — not yet verifiable) | |
| 2026-09-17 | Vermilion River @ Vermilion | 79°/— · 64% POP · 13 mph N | (future — not yet verifiable) | |
| 2026-09-17 | Walnut Creek | 76°/— · 59% POP · 13 mph N | (future — not yet verifiable) | |
| 2026-09-16 | Ashtabula River | 76°/65° · 55% POP · 14 mph NE | (future — not yet verifiable) | |
| 2026-09-16 | Black River | 80°/64° · 51% POP · 9 mph NE | (future — not yet verifiable) | |
| 2026-09-16 | Black River (Watertown) | 73°/55° · 27% POP · 7 mph NE | (future — not yet verifiable) | |
| 2026-09-16 | Brandy Run near Girard | 76°/62° · 55% POP · 8 mph NE | (future — not yet verifiable) | |
| 2026-09-16 | Buffalo Creek | 75°/59° · 46% POP · 5 mph NE | (future — not yet verifiable) | |
| 2026-09-16 | Canadaway Creek | 74°/60° · 54% POP · 9 mph NE | (future — not yet verifiable) | |
| 2026-09-16 | Cattaraugus Creek | 76°/60° · 55% POP · 5 mph NE | (future — not yet verifiable) | |
| 2026-09-16 | Cazenovia Creek | 75°/59° · 47% POP · 5 mph NE | (future — not yet verifiable) | |
| 2026-09-16 | Chagrin River @ Willoughby | 80°/64° · 51% POP · 8 mph NE | (future — not yet verifiable) | |
| 2026-09-16 | Chautauqua Creek | 74°/63° · 54% POP · 9 mph NE | (future — not yet verifiable) | |
| 2026-09-16 | Conneaut Creek | 76°/65° · 55% POP · 9 mph NE | (future — not yet verifiable) | |
| 2026-09-16 | Crooked Creek | 76°/63° · 55% POP · 8 mph NE | (future — not yet verifiable) | |
| 2026-09-16 | Cuyahoga River @ Independence | 82°/66° · 50% POP · 8 mph NE | (future — not yet verifiable) | |
| 2026-09-16 | Eighteen Mile Creek | 74°/59° · 51% POP · 5 mph NE | (future — not yet verifiable) | |
| 2026-09-16 | Eighteenmile Creek (Niagara) | 74°/58° · 42% POP · 8 mph NE | (future — not yet verifiable) | |
| 2026-09-16 | Elk Creek | 75°/64° · 54% POP · 9 mph NE | (future — not yet verifiable) | |
| 2026-09-16 | Euclid Creek | 79°/66° · 51% POP · 9 mph NE | (future — not yet verifiable) | |
| 2026-09-16 | Genesee River | 73°/59° · 36% POP · 8 mph NE | (future — not yet verifiable) | |
| 2026-09-16 | Grand River near Painesville | 78°/62° · 53% POP · 9 mph NE | (future — not yet verifiable) | |
| 2026-09-16 | Huron River | 80°/65° · 49% POP · 9 mph NE | (future — not yet verifiable) | |
| 2026-09-16 | Irondequoit Creek | 74°/59° · 36% POP · 7 mph NE | (future — not yet verifiable) | |
| 2026-09-16 | Johnson Creek | 71°/60° · 36% POP · 8 mph NE | (future — not yet verifiable) | |
| 2026-09-16 | Oak Orchard Creek | 72°/59° · 36% POP · 8 mph NE | (future — not yet verifiable) | |
| 2026-09-16 | Rocky River near Berea | 80°/65° · 51% POP · 12 mph NE | (future — not yet verifiable) | |
| 2026-09-16 | Salmon River | 74°/55° · 35% POP · 5 mph NE | (future — not yet verifiable) | |
| 2026-09-16 | Sandy Creek (Adams) | 72°/55° · 29% POP · 8 mph NE | (future — not yet verifiable) | |
| 2026-09-16 | Sandy Creek (Hamlin) | 73°/58° · 36% POP · 8 mph NE | (future — not yet verifiable) | |
| 2026-09-16 | Silver Creek | 74°/60° · 54% POP · 7 mph NE | (future — not yet verifiable) | |
| 2026-09-16 | Twenty Mile Creek | 74°/65° · 55% POP · 9 mph NE | (future — not yet verifiable) | |
| 2026-09-16 | Vermilion River @ Vermilion | 78°/64° · 52% POP · 9 mph NE | (future — not yet verifiable) | |
| 2026-09-16 | Walnut Creek | 75°/65° · 54% POP · 13 mph NE | (future — not yet verifiable) | |
| 2026-09-15 | Ashtabula River | 82°/66° · 61% POP · 18 mph W | (future — not yet verifiable) | |
| 2026-09-15 | Black River | 86°/66° · 47% POP · 16 mph W | (future — not yet verifiable) | |
| 2026-09-15 | Black River (Watertown) | 77°/60° · 63% POP · 18 mph SW | (future — not yet verifiable) | |
| 2026-09-15 | Brandy Run near Girard | 82°/63° · 65% POP · 14 mph SW | (future — not yet verifiable) | |
| 2026-09-15 | Buffalo Creek | 82°/62° · 65% POP · 13 mph SW | (future — not yet verifiable) | |
| 2026-09-15 | Canadaway Creek | 81°/62° · 65% POP · 17 mph SW | (future — not yet verifiable) | |
| 2026-09-15 | Cattaraugus Creek | 82°/62° · 65% POP · 12 mph SW | (future — not yet verifiable) | |
| 2026-09-15 | Cazenovia Creek | 82°/62° · 65% POP · 13 mph SW | (future — not yet verifiable) | |
| 2026-09-15 | Chagrin River @ Willoughby | 87°/66° · 56% POP · 14 mph W | (future — not yet verifiable) | |
| 2026-09-15 | Chautauqua Creek | 80°/64° · 65% POP · 18 mph SW | (future — not yet verifiable) | |
| 2026-09-15 | Conneaut Creek | 82°/66° · 63% POP · 17 mph SW | (future — not yet verifiable) | |
| 2026-09-15 | Crooked Creek | 83°/64° · 64% POP · 14 mph SW | (future — not yet verifiable) | |
| 2026-09-15 | Cuyahoga River @ Independence | 88°/67° · 48% POP · 14 mph W | (future — not yet verifiable) | |
| 2026-09-15 | Eighteen Mile Creek | 81°/62° · 66% POP · 12 mph SW | (future — not yet verifiable) | |
| 2026-09-15 | Eighteenmile Creek (Niagara) | 82°/61° · 64% POP · 20 mph W | (future — not yet verifiable) | |
| 2026-09-15 | Elk Creek | 82°/65° · 64% POP · 16 mph SW | (future — not yet verifiable) | |
| 2026-09-15 | Euclid Creek | 85°/67° · 55% POP · 14 mph W | (future — not yet verifiable) | |
| 2026-09-15 | Genesee River | 83°/62° · 65% POP · 16 mph SW | (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 | 492,808 |
| gauge_readings | 983,289 |
| lake_temp_snapshots | 64,419 |
| precip_observations | 21,854 |
| ahps_forecasts | 3,699 |
| alley_index_snapshots | 228 |
| spc_outlooks | 35 |
| nws_alerts | 1,022 |
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 | Sep 11 3:30pm | 983,289 |
| OpenWeather current | 15 min | rivers:update | Sep 11 3:30pm | 492,808 |
| NWS 7-day + hourly forecast | 3 hours | forecasts:fetch | Sep 11 2:01pm | 32 |
| NWS AHPS predicted flow | 6 hours | ahps:fetch | Sep 11 11:16am | 3,699 |
| NWS active alerts | 15 min | alerts:fetch-nws | Sep 9 8:03pm | 1,022 |
| SPC convective outlooks | 3 hours | spc:fetch-outlook | Sep 11 2:15pm | 35 |
| NDBC + C-MAN lake temps | 1 hour | noaa:fetch-buoys | Sep 11 3:00pm | 64,419 |
| River precip (USGS / NWS / MRMS-Lite) | 5–60 min | rivers:update + precip:fetch-nws + local Open-Meteo worker | Sep 11 2:00pm | 21,854 |
| Alley Index snapshot | hourly + daily 04:50 ET | index:compute | Sep 11 3:42pm | 228 |
| Run state classifier | daily 06:30 ET | run-state:compute | Sep 10 | 232 |
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 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 |
| 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 |