← Back to Home

Arkansas Creek Monitor — Changelog

Version 2026.7.17.1 — July 17, 2026

The Buffalo wave tracker learned from its first real test — and now grades itself.

Not user-facing, recorded for completeness: trib reach models refit on real zone QPE with a 48h outcome window (richland_to_st_joe adds a volume/spikiness feature, both trib reaches add a rain-distribution ratio); wave_router gains volume tracking, a QPE-outage ratio guard, and low-base-flow expiry margins; new prediction_eval/wave_eval.py closes the wave record→settle→score loop; simulator engine/bundle rebuilt and golden-gated (1800/0).

Version 2026.7.14.1 — July 14, 2026

The Cossatot gets its own Neural Net Predictions page.

Not user-facing, recorded for completeness: the model is a port of the Buffalo pixel-net architecture (CNN + GRU over a 48×96 1-km window, three gauges multi-task); crossing probabilities come from a companion gradient-boosted ensemble validated at 90.7% recall / 88.0% precision (floatable tier, bootstrap-confirmed) — the full experiment log lives in the operator harness (COSSATOT_NEURAL_PLAN.md).

Version 2026.7.13.3 — July 13, 2026

Easier-to-read text on the Buffalo, Mulberry, and Big Piney cards.

Version 2026.7.13.1 — July 13, 2026

Tune-up after the radar feature's first storm.

Not user-facing, recorded for completeness: the card's AI calls now wait longer before giving up when the inference server is busy with the nightly Buffalo study analysis (the cause of a few carried-over narratives at midnight).

Version 2026.7.11.2 — July 11, 2026

The Ponca AI analysis now tells a continuous story instead of a series of hot takes.

Version 2026.7.11.1 — July 11, 2026

The Ponca AI rain analysis now watches live radar while it's raining.

Not user-facing, recorded for completeness: new ponca_radar_context.py cron on ScriptPi reading MRMS PrecipRate (2-minute radar rain-rate mosaics); radar context logged alongside each analysis for later self-grading on the scorecard pipeline; zero downloads in dry weather.

Version 2026.7.10.4 — July 10, 2026

New "Understand the Math" page: how the neural net actually works.

Version 2026.7.10.3 — July 10, 2026

The Neural Net Predictions now grade themselves on the public scorecard.

Version 2026.7.10.2 — July 10, 2026

The Neural Net Predictions page is now linked from the Buffalo River dashboard.

Version 2026.7.10.1 — July 10, 2026

New (experimental): hour-by-hour Neural Net Predictions for Ponca and Boxley.

Not user-facing, recorded for completeness: the model (pixel-v5) trains on a dedicated GPU machine but serves from the existing prediction Pi as a 530 KB pure-numpy engine, parity-tested against the trained network; hourly cron, isolated from all other site systems; honest "stale/degraded/offline" banners when inputs are missing.

Version 2026.7.9.1 — July 9, 2026

New: Buffalo TV — a full-screen, self-updating view of the whole river.

Not user-facing, recorded for completeness: the long-soft-launched /buffalo/tv/ kiosk page (disk-read, no restart) is now linked from the Buffalo header via an inline-styled pill button in dashboard.py. The /buffalo/simulator/ page was renamed "Buffalo National River Simulator" (test-tube icon removed, EXPERIMENTAL WHAT-IF TOOL banner kept) but remains unlinked and noindex — staged for a later launch.

Version 2026.7.7.4 — July 7, 2026

Ground-dryness alerting extended to 13 more drainages.

Not user-facing, recorded for completeness: q_ref: {parent, multiplier} blocks on 13 drainages in drainages.yaml; assembler scales the parent's Q-bucket threshold and keeps each drainage's own rolling rain window; per-cycle legacy fallback; Tier-2 decisions dual-logged with tier: 2; multipliers = Dave's May 2026 numbers for six creeks, pattern-derived (confirmed) for seven.

Version 2026.7.7.3 — July 7, 2026

Watershed alerts now know how dry the ground is — using the creek itself as the moisture gauge.

Not user-facing, recorded for completeness: v2 Q-bucket engine (qbucket_shadow.py, hardcoded calibration) promoted from a clean 12-day shadow run to authoritative in assemble_and_push.py with per-cycle legacy fallback; legacy status still computed and dual-logged to logs/qbucket_shadow.log; suppress-while-already-running maps to NO_ALERT; post-promotion checkup reminder 2026-07-25; research in research/q_bucket_triggers/ and research/q_bucket_recent_backtest/.

Version 2026.7.5.5 — July 5, 2026

Smarter Buffalo flood warnings: creek-driven floods, cloudburst detection, and all-time-record context.

Not user-facing, recorded for completeness: trib-launch reach models (Richland→St. Joe, Bear Creek→Harriet; LOYO-banded, fit on 268/300 paired events) added to the wave router as pure data — no router code changed; per-zone max-HUC12 rainfall stats added to the data feed; the Buffalo Simulator engine/bundle updated in lockstep (golden gate 1,800/1,800); research in research/buffalo_sim/envelope/ and research/trib_launch_waves/.

Version 2026.7.2.10 — July 2, 2026

Buffalo page: recession countdowns now know what season it is.

Not user-facing, recorded for completeness: monthly p15 floors (circularly smoothed) for Pruitt/St. Joe/Harriet in config recession_floor_monthly (Boxley/Ponca floors never bind their thresholds); seasonal rate multipliers fit and backtested in two variants (result-scaling and anchor-recentering), both regressed vs the live k_now anchor — not shipped; full analysis in research/buffalo_replay outputs/RECESSION_SEASONALITY_REPORT.md.

Version 2026.7.2.9 — July 2, 2026

Buffalo page: the Ponca AI card explained, and recession math corrections.

Not user-facing, recorded for completeness: recession page now imports the deployed curve module directly for lookups (raw-Q bands, edge fallback) so it cannot mis-render again. Separately measured this session, pending review before any model change: paddler folklore confirmed — summer recessions run 1.2–2.3× faster than winter in matched flow bands (evapotranspiration), and lower-gauge baseflow swings seasonally (~600 cfs March vs ~50 September at St. Joe against a flat 76 in config); plan at RECESSION_SEASONALITY_PLAN.md.

Version 2026.7.2.8 — July 2, 2026

Buffalo page: the full math behind every prediction, published.

Not user-facing, recorded for completeness: pages generated from deployed model artifacts by build_math_pages.py (they cannot drift from the running code; rebuild + scp on model changes, no restart); confidence labels read from the live CONFIDENCE_TABLE; horizons page corrected same-day to baseline v6 + baseflow ground-wetness copy after an accuracy audit.

Version 2026.7.2.7 — July 2, 2026

New page: "How far ahead can this system see?" — the honest math behind Buffalo predictions.

Not user-facing, recorded for completeness: page content generated from the replay baseline artifacts by build_horizon_page.py (regenerated on model changes; the route serves a static fragment — scp updates, no restart); buffalo_horizons.json published alongside as machine-readable model facts (groundwork for a future what-if simulator). Lead metrics use causal-run semantics (the unbroken prediction streak into the crossing) after operator review caught the prior-pulse inflation in the draft.

Version 2026.7.2.6 — July 2, 2026

Buffalo page: the river itself now tells the system how wet the ground is.

Not user-facing, recorded for completeness: soil-moisture ladder rung 1 (pre-storm baseflow percentile, month-conditioned, 6–12h lagged against self-wetting; rain-antecedent remains the fallback); NLDAS-2/SPoRT-LIS rungs skipped (no data access, and the river signal may well be the better sensor anyway); replay baseline promoted to v6.

Version 2026.7.2.5 — July 2, 2026

Buffalo page: recession countdowns stay on screen unless a rise is genuinely imminent.

Not user-facing, recorded for completeness: post-audit follow-on — arrival-aware suppression gate (rise_imminent_at) replacing has_upstream_rise; measured on the full replay before deployment (~104 restored countdown-hours/yr, bad-shows +2/yr all during hours the system had no signal anyway).

Version 2026.7.2.4 — July 2, 2026

Buffalo page: steadier behavior during radar and data outages.

Not user-facing, recorded for completeness: fix package F6 (audit finding #14 + #15a) — wall-clock QPE windows, snapshot backfill, staleness surfaced to consumers, MRMS sentinel counter, clock-skew guards, fsync on state files, flood-threshold boundary classification; 19 synthetic outage/gap/skew tests. This completes the 2026-07-01 fresh-eyes audit: all six fix packages (F1–F6) are now live.

Version 2026.7.2.3 — July 2, 2026

Buffalo page: smarter local rain triggers, honest timing windows, and Bear Creek finally counts.

Not user-facing, recorded for completeness: fix package F5 complete (findings #5, #8, #10 from the 2026-07-01 audit) — per-gauge intensity/accumulation trigger ladders (leave-one-year-out fit), measured first-fire→peak windows frozen at event anchor, tributary-zone blending, router-jurisdiction handoff, scale-aware fizzle cuts, recalibrated confidence table; five candidate iterations against the replay gate before deployment; replay baseline promoted to v5. Remaining audit package: F6 (robustness).

Version 2026.7.2.2 — July 2, 2026

Buffalo page: rise predictions now stand down once the rise they predicted has happened.

Not user-facing, recorded for completeness: fix package F5.1 from the 2026-07-01 audit (prediction-consumed event state in local_rain_state; post-peak prediction-hours −88% in replay, flood POD byte-identical); gated on a full 2014–2026 replay before deployment; replay baseline promoted to v4. F5.2–.4 (intensity/accumulation split, measured windows, tributary zones) pending.

Version 2026.7.2.1 — July 2, 2026

Buffalo page: the river now tracks flood waves as they travel downstream — with predicted size and arrival time.

Not user-facing, recorded for completeness: fix package F4 from the 2026-07-01 audit — per-reach crest and travel-time models fit on an 11.6-year event library (leave-one-year-out validated), a stateful wave tracker replacing the trend-gated single-hop mechanism, target-anchored alert tiers tuned on the full replay (all deploy gates passed vs baseline v3), Richland/Bear Creek gauges now feed the lower-reach predictions. Packages F5–F6 pending.

Version 2026.7.1.9 — July 1, 2026

Buffalo page: rise predictions now judge storms against how wet the ground was before the rain.

Not user-facing, recorded for completeness: fix package F3 from the 2026-07-01 audit (pre-storm antecedent, precip_7day_total_in preserved for the propagation model's fitted definition, all 8 zones exported incl. Richland); gated on a full 2014–2026 replay before deployment (St. Joe flood detection unchanged, no Boxley/Ponca regression); replay-rig baseline promoted to v3. Packages F4–F6 pending.

Version 2026.7.1.8 — July 1, 2026

Buffalo page: the downstream "river rise" card now stays up until the wave actually arrives — and won't inflate its numbers late in an event.

Not user-facing, recorded for completeness: this is fix package F2 from the 2026-07-01 fresh-eyes audit (event-frozen SJ_MODEL features + pre-storm antecedent + wave-in-transit hold + fit-domain gate); validated over 173 historical Ponca events (antecedent error vs fit: +1.63″ → +0.17″ median on big events; late-event regime flips 38% → 3.5%) plus a live end-to-end synthetic flood test. Packages F3–F6 pending.

Version 2026.7.1.7 — July 1, 2026

Buffalo page: an earlier flood-risk banner, and confidence labels you can take at face value.

Not user-facing, recorded for completeness: rise predictions are now graded against the timing window of the driver that set the category (grader + replay-rig change, removes ~6 pts of unearned timing credit from the accuracy baseline); antecedent tier boundaries are read from config instead of being hardcoded; this ships fix package F1 from the 2026-07-01 fresh-eyes audit of the Buffalo prediction chain (research/buffalo_replay/outputs/FRESH_EYES_AUDIT.md) — packages F2–F6 pending.

Version 2026.7.1.4 — July 1, 2026

The site is faster, and the Illinois River forecast card is now complete.

Not user-facing, recorded for completeness: USGS gauge fetching was consolidated into batched requests (~93% fewer API calls per 15-min cycle, with per-site retry fallback preserved); the per-basin script clones for Mulberry, Big Piney, Cossatot, and Richland now run through one shared library (/home/dave/basinlib/ shims — equivalence-verified before deploy) with a retry hardening all four inherit; a git baseline of both Pis' code/config now lives on the operator harness (creekintelligence/mirrors/); the dashboard gained an mtime-keyed file cache, explicit Cache-Control headers, and a threaded gunicorn worker (-w 1 --threads 4). See ARCHITECTURE 2026.7.1.4.

Version 2026.7.1.2 — July 1, 2026

The Buffalo River Watershed Study has wrapped up after 122 days — a month longer than planned — and its page is now a finished, browsable archive.

Not user-facing, recorded for completeness: the study's nightly Claude Opus narrative stream was retired on 2026-07-01 (cron study_daily_analysis.py --no-opus), ending the project's only per-night external API cost; the local qwen3.6:27b stream continues a no-cost nightly pulse on ScriptPi for periodic hand-review. /study/ pages are frozen at Day 122 (June 30, 2026); the concluded banner + per-page frozen-archive notes are served from dashboard.py (study_index/study_hypothesis/study_daily). See ARCHITECTURE §4.7 + §16 item 16 (version 2026.7.1.2).

Version 2026.7.1.1 — July 1, 2026

Arkansas Creek Intelligence has its own web address now: arcreekintel.com.

Version 2026.6.30.1 — June 30, 2026

New page: the Illinois River and the Upper Illinois Water Trail.

Not user-facing, recorded for completeness: new ScriptPi basin /home/dave/illinois/ (config + assembler + multi-gauge fetch / read-qpe / weather+QPF, cloned from Big Piney with Buffalo's signal_for multi-gauge pattern grafted on), cron every 15 min → illinois_output.json. Full history collected to the harness research/illinois_*: 8 USGS gauges' complete records + hourly MRMS per-HUC12 QPE 2014→present over the 21 HUC12s above Watts. Empirical illinois_below block trained on the above-Hwy-16 basin (calibrated_table.json + lookup index + empirical_config.yaml). Upstream→Hwy-16 propagation lags from storm-pulse cross-correlation (Savoy 6–8 h, Osage 8–13 h, Mud 11–16 h; Watts +3–5 h downstream). New DMZPi routes /illinois/ + /illinois/historical/. See ARCHITECTURE §4.9c (version 2026.6.30.1).

Version 2026.6.29.7 — June 29, 2026

The rainfall forecast on the five creek pages now gives you an honest percentage instead of a vague "rise likely."

When the new forecast says a percentage, the creek rose that often: said under-10% rose 4%, 10-25% rose 17%, 25-50% rose 49%, over-50% rose 80%

Not user-facing, recorded for completeness: new calibrated engine (empirical_forecast/calibrated.py + calibrated_table.json — denominator-corrected P(rise | rain, soil) over the full 2014-2026 MRMS+USGS record) feeds the headline in empirical_predict.py, with a per-basin warm rolling factor off the local settled archives. Boxley (no page) unchanged; empirical stays off Facebook per standing choice (Watersheds only). Full research + validation in the harness research/empirical_recalibration/ (REPORT.md). ARCHITECTURE §4.13/§16-11 updated.

Version 2026.6.29.6 — June 29, 2026

Added a privacy policy page.

Version 2026.6.29.5 — June 29, 2026

Our forecast "report card" got clearer and more honest, and a couple of predictions were tuned based on what it's been telling us.

Not user-facing, recorded for completeness: this came out of the weekly scorecard / Signal-digest review. score_all.py now emits a per-predictor median error, min-n-gates the recession rows (MIN_RECESSION_GRADED), and adds a recession timing-bias flag; ponca_analog.py decays the dominant-driver flood-floor toward the raw k-NN once Ponca is past crest (raw values still logged for backtest); big_piney_assemble.py had recession_baseline support restored to its ported compute_recession (the port had dropped it) and above_longpool was given recession_baseline: 2.0. The empirical engine's over-warning (also visible on the scorecard) is a deeper rebuild blocked on an offline tool — tracked, not yet changed. See ARCHITECTURE §4.13 / §16-11 (version 2026.6.29.5).

Version 2026.6.29.4 — June 29, 2026

Creek Intelligence is now on Facebook — follow Arkansas Creek Intelligence for automatic creek alerts and a weekend forecast.

Not user-facing, recorded for completeness: new creek-social toolset on the harness server — creek_social.py mirrors the watershed alerts to Facebook (fully decoupled from ScriptPi: it reads the same predictor_output.json the dashboard already produces, replays the alert engine's new/escalation logic against its own state, and posts via the Facebook Graph API), weekend_forecast.py (Friday cron; recession-based "holds through the weekend" filter), and announce.py (auto-posts a short feature announcement to the page whenever we ship a user-facing change — a new shipping convention now in CLAUDE.md §8 + ARCHITECTURE §4.2). Posts are deliberately link-free and bot-signed.

Version 2026.6.29.2 — June 29, 2026

The Buffalo Study pages now correctly report the June 22 flash flood — it had been mistakenly logged as a "data gap"

Not user-facing, recorded for completeness: two fixes to the nightly Buffalo Study analyzer (study_daily_analysis.py) plus a data backfill. (1) The transfer-ratio validator was QPE-gated — its 2,000 cfs/in cap had unconditionally false-rejected the model's correct 06-22 headwater numbers (Ponca 2,756 cfs/in matched the deterministic truth card), silently dropping that night's calibration; the cap now applies only on low-rainfall days, where the frame-override artifact it guards against actually occurs. (2) The Opus output cap was raised 40000→56000 after the daily+thinking+hypothesis rewrite pinned at the cap for five straight nights (06-21..06-25, incl. the flood), freezing the rolling hypothesis. (3) The 06-22 study-record flood was backfilled into both the qwen knowledge.md calibration tables and the Opus hypothesis.md (now live on /study/), from the truth card + the existing night-of Opus daily; logged in analysis/curation_audit.md. The qwen-only (--no-opus) cutover stays deferred — even post-fix, qwen still drops a gauge on the complex flood night. See ARCHITECTURE §4.7 + §16 item 16.

Version 2026.6.29.1 — June 29, 2026

More accurate downstream forecasts: the St. Joe / Grinder Ferry propagation card no longer overshoots when the rain falls up high

Not user-facing, recorded for completeness: the St. Joe magnitude in ponca_analog.py build_propagation() was a fixed basin-wide amplification (≈2.9× Ponca) applied unconditionally; on an upper-concentrated event the wave routes through the dry 1,342 km² intervening basin and attenuates (~0.9×), so the constant over-predicted 2–4× (6-22: card 19–33k, actual 7.9k). Recalibrated against 152 historical Ponca events (2014–2026) from the local buffalo_huc_qpe + buffalo_gauges archives (research/buffalo_propagation_calibration/, with REPORT.md + figures). St. Joe is now a rainfall-distribution + antecedent conditioned log-linear model (SJ_MODEL) reading the upper-vs-intervening qpe_24hr ratio and the intervening 7-day antecedent — all already in buffalo_output.json — with a crest band floored at the routed wave (0.85×) and the reach's current flow. Leave-one-out CV cut the upper-concentrated bias from +46% to ≈0; out-of-sample on 6-22 it predicts St. Joe 8.5k–11.9k–16.9k (lower bound ≈ actual). Pruitt kept at ~1.13× (rain-insensitive, 11-yr confirmed); peak-to-peak lags re-derived. ScriptPi-only — render_propagation_card() reads only the kept crest-band fields, so no DMZPi change. See ARCHITECTURE §4.6 + §16 item 15.


Version 2026.6.24.8 — June 24, 2026

New: a 24-hour gauge chart on the Cossatot, Richland, and Hailstone pages

Not user-facing, recorded for completeness: each physics-basin assembler now emits gauge.readings_24h (a [[epoch, value], …] array of the last 24 h, ~96 pts at 15-min) via a build_readings_24h() helper — Cossatot/Richland stitch yesterday+today's daily height files to span midnight, Hailstone uses its already-rolling cfs buffer from creeks/gauge_data.json. dashboard.py gained render_hydrograph(), an inline-SVG renderer (tier bands + line + peak + "now" dot, fully self-contained, no chart library), placed under the gauge card on all three pages. Display-only, no DMZPi compute (same contract as the HTML tables and Leaflet maps). See ARCHITECTURE §5.4.


Version 2026.6.24.7 — June 24, 2026

The Scorecard now flags what needs attention — and reports its own drift weekly

Not user-facing, recorded for completeness: score_all.py now computes a flags array (min-n-guarded: empirical over-warn ≥70% no-rise at n≥20, band inversion above_p75 vs. p50_to_p75, physics within-±20% <50% at n≥15, Ponca override-vs-raw flood-Brier gap, recession never-reached ≥60% once graded) into scorecard.json; /scorecard renders the "Needs attention" box from it. New prediction_eval/scorecard_digest.py (weekly cron Mon 07:30 Central) reads the scorecard, formats a per-family accuracy snapshot + the flags, and sends a Signal DM via the existing signal_config.yaml (same signal-cli plumbing as scp_alert / data_age_alert). This is Phase 3 of the prediction-logging initiative — the self-checking / feedback half. The harness-consolidation refactor was deliberately deferred (a risky change to working cron code with no user benefit). See ARCHITECTURE §4.13 + §16-14 + §7.2.


Version 2026.6.24.6 — June 24, 2026

Scorecard now also tracks the downstream-propagation forecast (recording started)

Not user-facing, recorded for completeness: ponca_analog.py now folds the per-reach propagation block (lag window, crest band, bump/no-bump flag, current flow) into each ponca_analog_history.jsonl record — the record step the predictions had been missing. New prediction_eval/propagation_eval.py settles each matured event two-stage: it finds Ponca's actual peak from buffalo_study/data/gauges, then for Pruitt (07055680) and St. Joe (07056000) grades the bump/no-bump call (crest ≥ 1.25× baseline & +50 cfs), the magnitude-band hit, and the timing window relative to Ponca's peak — using the cycle nearest Ponca's peak as the representative prediction. A --selftest (10 checks) validates the logic. score_all.py folds the settle in and adds a propagation block; /scorecard renders it; Coverage flips the propagation forecast to "graded." This completes Phase 2 of the prediction-logging initiative — every live predictor family is now recorded and graded. See ARCHITECTURE §4.13 + §16-14.


Version 2026.6.24.5 — June 24, 2026

The Ponca "AI Analysis" cards now read like a person — and the numbers make sense

Not user-facing, recorded for completeness: in buffalo_dashboard/ponca_analog.py, both qwen system prompts were slimmed and rewritten for a casual-paddler audience (no jargon, fact-fed, model reasons rather than recites) with one hard rule — never state a peak/crest at or below the current flow. build_propagation() now models est_crest = reach_current + (Ponca rise above baseline) × amplification, floored at the reach's current value (was Ponca_flow × amp absolute, which fell below a downstream gauge's own flow whenever Ponca was small relative to that reach's drainage), plus a significant / added_bump_cfs gate so small pulses read "minor bump, no noticeable change." A qualitative 6-hour trend word (holding steady / creeping up / rising steadily / rising fast / easing down / dropping fast) keeps the model from overstating a slow creep. The deterministic override floors (upstream Boxley wave, heavy-rain, watershed-feeder alerts) are unchanged — only their narration. See ARCHITECTURE §4.6.


Version 2026.6.24.4 — June 24, 2026

Scorecard now tracks the Buffalo rise engine (recording started)

Not user-facing, recorded for completeness: new prediction_eval/buffalo_predictions_archive.py (modeled on recession_archive.py) — --record on a 15-min cron (:09,:24,:39,:54, debounced) logs each active predictions[gauge].combined_category from buffalo_output.json (with timing window + current value) to buffalo_ledger/<date>.jsonl; --settle grades vs. the gauge's actual discharge rise over [generated_at, timing_high + 18 h] (rose if peak ≥ 1.25× start AND ≥ +30 cfs → records rise magnitude, hours-to-peak, timing-in-window; else no_rise / censored); --score aggregates. A --selftest (14 synthetic checks) validates the logic since production is dry. score_all.py folds the settle in and adds a buffalo_rise block; /scorecard renders it; Coverage splits Buffalo into "rise predictions: graded" and "flood_risk + propagation_alerts: not yet logged." Magnitude is captured per category (categories derive from rainfall, not gauge rise) so the rainfall→rise mapping calibrates over time. ARCHITECTURE §4.13 + §16-14 + §7.1.


Version 2026.6.24.3 — June 24, 2026

Scorecard now grades the Ponca "AI Rainfall Event Analysis"

Not user-facing, recorded for completeness: new prediction_eval/ponca_analog_eval.py reads the producer's append-only ponca_analog_history.jsonl (read-only) and grades each armed call against Ponca 07055660's max discharge over a forward 36 h window (from buffalo_study/data/gauges), writing ponca_analog_settled.jsonl (idempotent, keyed by generated_at). It grades the k-NN class/peak (modal vs. actual class, median_peak_cfs MAE, p25–p75 band hit) and the flood Brier for flood_risk_pct (override-floored) vs. raw_flood_risk_pct (raw k-NN, on the common sample). score_all.py calls settle() inline (no extra cron) and adds a ponca_analog block to scorecard.json; the /scorecard route renders it; the Coverage table flips Ponca from "logged, not graded" → "graded." See ARCHITECTURE §4.13 + §16-14.


Version 2026.6.24.2 — June 24, 2026

Retired the experimental neural-net (LSTM) predictor

Not user-facing, recorded for completeness: the :14 nn_predict.py inference cron was commented out, the dead nn_prediction read/embed was removed from cossatot_assemble.py + richland_assemble.py (the key no longer appears in their output JSON), the stale "LSTM forecast" wording was dropped from the Richland page's social/meta description, and all LSTM-only artifacts (nn_predict.py, nn_predict_debug.py, nn_alert.py, nn_alert_state.json, nn_output.json, both model_epoch100.pt weight files) were moved to /home/dave/creeks/retired_lstm/ (reversible — a README there documents how to resurrect). The HUC12 masks under /home/dave/models/ were kept — they are read by the live Richland physics QPE reader and the map-polygon builder, not just the LSTM. Full record in ARCHITECTURE.md §4.10 + §14 Gotcha #10. Side benefit: one less hourly job on the 2 GB ScriptPi.


Version 2026.6.24.1 — June 24, 2026

New: a Prediction Scorecard page — see how accurate the site's forecasts have actually been

Not user-facing, recorded for completeness: a new ScriptPi subsystem /home/dave/prediction_eval/ (score_all.py, cron 01:30 daily) reads the settled prediction archives for three already-self-recording families — physics (<basin>/predictions/), empirical (<gauge>_empirical_predictions/), and recession (recession_eval/ledger/) — and writes one display-ready scorecard.json, SCP'd to DMZPi. Physics is scored on peak MAE / bias / within-±20%; empirical on hit-rate (rose to ≥ called tier = verified + missed_higher) vs. no-rise rate (no_change), broken out by basin, confidence, and rainfall percentile band (which surfaces the known selection bias — the above_p75 band currently shows a higher no-rise rate than p50_to_p75); recession reuses recession_archive.score(). The DMZPi /scorecard route renders the JSON read-only (no compute on DMZPi; validated via the venv test_client before the gunicorn restart). This is Phase 1 of a system-wide "log every prediction, grade it later" initiative — audit + plan in creekintelligence/research/prediction_audit/. The still-ungraded predictors (Ponca analog, downstream propagation, the Buffalo per-gauge rise engine, the retired LSTM) are listed as not-yet-graded in the page's Coverage table and are Phase 2.


Version 2026.6.23.1 — June 23, 2026

Recession countdowns are now realistic — and honest about how sure we are

Not user-facing, recorded for completeness: the timing model is a per-gauge master recession curve — a flow-dependent decay rate k(Q) learned from USGS history, integrated to a transit time and event-anchored to the current observed rate (clamped 0.5–2×) — in /home/dave/recession_eval/recession_curve.py + recession_curves.json (9 gauge curves), imported by every *_assemble.py compute_recession() with the old single-exponential kept as a fallback. The St. Joe/Harriet suppression uses a config recession_baseline (empirical floor, ~p10) as the decay asymptote so any threshold below it returns no countdown. Confidence is now derived from each prediction's relative spread + horizon (recession_curve.confidence_level). A prediction-evaluation framework (recession_archive.py, on cron) now records every recession countdown to a ledger and settles it against actuals to score accuracy over time. Threshold keys were standardized to too_low/low_floatable/optimal across all configs/assemblers. Full design, history pulls, and analysis live in creekintelligence/research/recession_eval/.


Version 2026.6.22.2 — June 22, 2026

Clearer recession countdowns + gauges stop briefly greying out

Not user-facing, recorded for completeness: the three height/CFS recession cards were consolidated into one shared render_recession_card() helper in dashboard.py (they had drifted into near-duplicate blocks edited in parallel). Hailstone's recession model now also emits hours_to_high (time to fall to the 2000-cfs Above-Recommended boundary) in hailstone_output.json. The gauge-fetch resilience lives in creeks/fetch_gauges.py: fetch_stream_readings() retries transient empty USGS responses, and main() carries forward the previous good reading (new carried_forward flag, 90-minute cap) so one failed pull no longer greys a gauge.


Version 2026.6.22.1 — June 22, 2026

Ponca rainfall card now leads with the trusted signals + new downstream propagation card

Not user-facing, recorded for completeness: the rainfall card now reads the live creek-alert state (read-only) and the Buffalo physics propagation/flood signals already in buffalo_output.json; the propagation card's lag/amplification constants come from the 12-year USGS archive cross-checked against the Buffalo Study's calibrated 2026 event log, and are antecedent-conditional. Both narratives are produced by the local qwen3.6:27b model — the propagation one is a separate focused prompt embedded in ponca_outlook.json.


Version 2026.5.24.1 — May 24, 2026

Ponca Gauge historical event reporting + experimental AI rainfall event analysis

Not user-facing, recorded for completeness: built a local archive of MRMS radar rainfall for all 37 Buffalo HUC12 sub-watersheds (2014→present, two source archives) plus full USGS history for all 7 Buffalo gauges, which back the historical report and the analog evaluator. The evaluator (buffalo_dashboard/ponca_analog.py, hourly cron :20, flock) runs a numpy k-NN match against a shipped analog library and calls the local model only when its call changes (~10 inferences per event), writing ponca_outlook.json for the dashboard to render.


Version 2026.5.21.1 — May 21, 2026

PayPal-based donation support


Version 2026.5.20.1 — May 20, 2026

Hailstone reaches feature parity + nightly AI analysis moves to local inference

Underlying schema, infrastructure, and unit-bug cleanups (not user-facing but recorded for completeness): new hailstone_predict.py + hailstone_calibration.json + hailstone_predictions_archive.py, three new cron entries (:17 Hailstone QPE consumer, :21 Hailstone physics predictor, 23:55 Hailstone nightly analyzer), fixed a 25.4× unit error in the new Hailstone QPE consumer (had been treating already-in-inches shared QPE values as mm and dividing again — antecedent moisture was reading DRY when the basin was actually NORMAL/WET), exposed recession_k/recession_h_base on Richland's gauge output (latent gap that left the physics predictor falling back to a flat baseline instead of an exponential decay), and added a per-supplement file-naming convention (YYYY-MM-DD-suffix.md) for retrospective analyses written outside the nightly cadence.


Version 2026.5.15.1 — May 15, 2026

Stale-Data Warning Banners Across All Mobile Dashboards


Version 2026.4.21.1 — April 21, 2026

Creek Page Title & Buffalo Card Standardization


Version 2026.4.15.1 — April 15, 2026

Buffalo River Dashboard


Version 2026.4.7.1 — April 7, 2026

Richland Creek Dashboard & Neural Net Predictors


Version 2026.3.10.1 — March 10, 2026

Landing Page & Route Restructure - New landing page at / — mobile-first dark theme with site title, orientation blurb, live status summary, and dynamic creek condition cards - Creek cards show all Optimal gauges (green) or, if none, all Low but Floatable gauges (yellow); "All Quiet" message when no creeks are runnable - Status summary line shows gauge and watershed condition counts with color-coded text - Tool navigation grid — four main buttons (Gauges, Watersheds, Cossatot Predictor, Buffalo Study) plus secondary links (Guide, Changelog, Suggest a Creek) - Gauge table moved from / to /gauges/ — all table logic unchanged - Temporary legacy link on landing page points to /gauges/ for returning users - New /guide/ placeholder page — "Coming Soon" with back link to home - Back link audit — watersheds, changelog, study, and suggest pages link back to /gauges/; error pages and Cossatot nav link to / (landing) - Last updated timestamp on landing page converted from UTC to Central time


Version 2026.3.9.1 — March 9, 2026

Four-Color Unification - Unified color language across creek levels, prediction status, and recent rain: Red (nothing) / Yellow (maybe) / Green (go) / Blue (lots) - Prediction status expanded to four tiers: No Alert (red), Watch (yellow), Warning (green), Flood (blue) - Recent Rain column now shows 7-day precipitation total in inches with color-coded background, replacing category labels (MOIST/SEMI-DRY/DROUGHT) - Recent Rain multipliers updated: <0.25" = 1.4x trigger, <0.75" = 1.2x, <1.50" = 1.0x, ≥1.50" = 0.9x - FLOOD status triggers at 200% of effective trigger threshold — indicates exceptional rainfall - Micro-creek lag display: Drainages with 0-1 hour lag now show "NOW" instead of numeric range - Signal alerts updated with lag-aware messaging (micro-creeks show "NOW", mainstem rivers show hours)


Version 2026.3.6.1 — March 6, 2026

Drainage Trigger & Timing Calibration - Adkins: 2.0" / 4hr → 2.5" / 6hr - Boen Gulf: 2.0" / 4hr → 2.5" / 6hr - Upper Buffalo: window 6hr → 12hr, lag 4-6hr → 6-8hr - Beech Creek: 1.5" → 2.0" - Upper Kings: 1.5" → 2.0" - Osage: 1.5" / 4hr → 2.5" / 6hr - Richland Main: window 6hr → 12hr - Falling Water: 1.5" / 6hr → 1.75" / 12hr - Upper Cossatot: window 6hr → 12hr - Upper Big Piney: window 6hr → 24hr, lag 10-12hr → 12-16hr - EFLB: 1.5" → 2.0" - Pine Creek OK: window 6hr → 12hr


Version 2026.3.5.3 — March 5, 2026

Cosmetic Updates - Renamed "DRY" status to "QUIET" on the Watersheds page and in alert bar logic (same red styling, new CSS class .st-quiet). - Renamed "Conditions" column to "Recent Rain" and changed from styled badge spans to full-cell background coloring (matching the Status column style). - Updated status_colors/status_text_colors dicts to use "QUIET" key.


Version 2026.3.5.2 — March 5, 2026

Sticky Status Hold - WATCH and WARNING statuses now hold for the duration of a drainage's lag time plus a 2-hour buffer before clearing, preventing premature status downgrade before water reaches the gauge.

Antecedent Dryness System - New "Conditions" column on Watersheds page showing MOIST, SEMI-DRY, or DROUGHT based on recent rainfall history. - Trigger thresholds automatically increase during dry conditions: +15% for SEMI-DRY, +30% for DROUGHT. - Dryness is computed from rolling 7-day and 30-day precipitation totals per drainage. - Trigger column on Watersheds page now shows the effective (adjusted) trigger value.

Cossatot Drainage Update - Upper Cossatot trigger raised from 1.00" to 1.25" in 6 hours. - Upper Cossatot lag time updated from 3-6 hours to 8-10 hours based on observed March 5 event.

YAML Sync - Creek and drainage definitions now automatically sync from ScriptPi to DMZPi every 15 minutes, ensuring single source of truth.

Changelog - Added this changelog page, accessible from the footer of both dashboard pages.


Version 2026.3.5.1 — March 5, 2026

Baseline version. All prior changes consolidated.

WATCH / WARNING Terminology - Renamed "TRIGGER" status to "WARNING" to align with NWS conventions. - WATCH threshold raised from 50% to 75% of trigger value to reduce false positives.

Color Scheme Standardization - Watersheds page: RED = DRY (no go), YELLOW = WATCH (maybe), GREEN = WARNING (go time). - Main creek page: Watershed radar column and alert bar colors match the same scheme. - Alert bar is now green for WARNING, yellow for WATCH-only.

Drainage Trigger Updates - Bobtail Creek: 1.5" → 2.0" in 6hr - Long Devils Fork: 1.5" / 4hr → 2.5" / 6hr - Big Devils Fork: 1.5" / 4hr → 2.5" / 6hr - West Fork Shop Creek: 2.0" / 4hr → 2.5" / 6hr - Thomas Creek: 2.0" / 4hr → 2.5" / 6hr