How it works · FAQ
How Riffle decides
if it’s worth the trip.
Riffle reads live conditions on Pacific Northwest salmon and steelhead rivers and turns them into one honest number: is it worth fishing today? Here’s exactly how that number is built and weighted.
How a score is built
4 stepsGather
Source agents fan out in parallel — dam & hatchery fish counts, USGS river flow and water temperature, weather and pressure, and recent angler reports. Any source that is down is simply skipped.
Score
A pure function combines the readings into a 0–100 score using the active model’s weights and curves. No clock, no network, no randomness — the same inputs always produce the same number.
Explain
An AI layer writes the plain-language briefing about that score. It can describe the number but is never allowed to change it.
Record
Every score is snapshotted with the exact readings that drove it and a fingerprint hash, so any recommendation can be reproduced and audited later.
How it’s weighted
Heuristic BaselineThe active model blends five factors. Each gets a weight; the river’s reading for that factor is scored against a curve, and the weighted average becomes the headline number. These are the live weights from config/scoring-models/ — tuning the engine means editing config, never code.
Factor weights
Common questions
6 answersWhat does Riffle actually tell me?
Whether it’s worth making the trip. Each river gets a single 0–100 score and a plain rating — Excellent, Good, Fair or Poor — for its target salmon or steelhead run right now, plus a confidence level so you know how much data is behind it.
Which rivers and fish does it cover?
Salmon and steelhead water across the Pacific Northwest — Washington’s Puget Sound, Olympic and Columbia rivers, Oregon’s coast and Willamette system, and the Columbia/Snake mainstem. Each spot is tied to a specific run: Chinook, Coho, Sockeye and Pink salmon, plus summer and winter steelhead.
Does the AI decide the score?
No. The score, confidence and every per-factor contribution come from a deterministic function. The AI only writes the human-readable briefing about that result — it can never move a number. That separation is the core design rule of the whole engine.
What happens when a data source is down?
The score is computed from whatever reported in, and the missing source lowers confidence rather than breaking the result. A river with no live gauge still scores from weather, fish counts and angler reports — you just see a lower confidence figure and a note about what was unavailable.
Why “deterministic and reproducible”?
So the recommendation is trustworthy and auditable. Every score is stored with its raw inputs and a hash; re-running the engine over those stored inputs reproduces the exact same number. The spot page shows that check live.
Can I change how it’s weighted?
The weights live in versioned JSON config, not in code, and several versions can be scored side-by-side against real angler feedback. Browse the live weights and how each version is performing on the Models page.
Ready to check conditions?
See today’s score for every river.