Walleye — Full Transparency (v1)
Last updated: 2026-01-30
This page is designed to leave nothing out: the exact equations, every variable we use, the open-access URLs behind each driver, verbatim quotes (with page pointers where available), and a plain-English explanation of what is research-backed vs what is calibrated.
The exact math (Walleye v1)
Walleye (v1) is a freshwater Major-window rating: each Major solunar window (moon overhead / underfoot) gets a 1.0–5.0 score, and the day score is the duration-weighted average of the Major-window scores.
// Lift-to-rating map (global)
L_total_clamped = clamp(L_total, 0, L_REF) // where L_REF = 0.28
raw_rating = 1 + 4 × (L_total_clamped / L_REF) // then clamped to [1.0, 5.0]
// Walleye window lift (per Major window; Walleye v1 uses Majors only)
L_total_raw = L_base + L_phase + L_overlap + L_time // (wind/precip/pressure disabled for Walleye v1)
// Seasonality multiplier (capped)
L_total = clamp(L_total_raw × seasonMult, 0, L_REF) // seasonMult capped to 1.15
// Percentile-mapped display rating (commercial/UI mapping)
// We map seasonal lift percentiles → 1.0–5.0 so 1.0 and 5.0 are equally rare.
display_rating = percentileMap(L_total)
Key idea: research chooses the drivers (what matters), then we calibrate the exact sizes and caps so the output is stable, explainable, and consistently mapped into 1.0–5.0.
Calculation methodology
This is the “how it’s calculated” reference for Walleye v1.
Step 1) Base lift (Majors only)
L_base = 0.10 for Major (moon overhead/underfoot)
Step 2) Moon phase lift
phaseBoostValue = moonPhaseBoostWalleyeGibbous(moonPhasePosition)
L_phase = (phaseBoostValue × phaseWeight / 2.0) × 0.05 // phaseWeight = 2.0 (calibrated)
Step 3) Dawn/dusk overlap lift (civil twilight overlap)
overlap_fraction = overlap(period, civil_twilight_window) // 0.0..1.0
L_overlap = 0.07 × overlap_fraction // 0..0.07 (calibrated ceiling)
Step 4) Time lift (low-light + cloud-cover proxy)
// Low-light factor is step-like within ±30 minutes (Vasquez 2024 definition)
dawnFactor = lowLightFactorToTime(center, sunrise, 30, 30) // ~1 inside 30 min; ~0 outside
duskFactor = lowLightFactorToTime(center, sunset, 30, 30)
ll = max(dawnFactor, duskFactor × duskLowLightMultiplier) // dusk slightly weighted (calibrated)
// Cloud cover is used as a proxy for mean daily solar radiation (Shaw 2021):
// we use daytime-average cloud cover (≈9am–3pm local) when available.
timeBias = (ll × lowLightBias) + (cloudCover/100 × cloudCoverBias)
L_time = (timeBias / 0.40) × 0.03 // small by design
Step 5) Apply seasonal multiplier
L_total = clamp((L_base + L_phase + L_overlap + L_time) × seasonMult, 0, L_REF)
Step 6) Lift → raw rating (lift-based)
raw_rating = 1 + 4 × (L_total / 0.28)
Step 7) Raw lift → percentile-mapped display rating (commercial/UI)
display_rating = piecewiseLinearMap(L_total; p01→1.0, p05→1.3, p50→2.5, p95→4.7, p99→5.0)
Percentile mapping (why Walleye windows can reach 1.0 and 5.0)
The Walleye model drivers are research-backed (Shaw 2021 + supporting definitions). However, the research does not support a “nearly impossible” biological floor for Walleye. Because this is a commercial app and users expect a true 1–5 scale, we apply a transparent percentile mapping for Major-window display ratings.
Important: in PrimeBite Walleye, 1.0 means “worst predicted conditions relative to the benchmark population,” not “you will catch nothing.”
Benchmark population used: all freshwater benchmark locations in docs/benchmark/locations.json, full year 2026, daily sampling, no weather injected.
Seasonal lift percentiles (L_total after seasonality):
p01 = 0.095000
p05 = 0.100000
p50 = 0.123638
p95 = 0.158084
p99 = 0.170993
Variables (what’s research-backed vs calibrated)
Research-backed means the driver/pattern/mechanism is supported by open-access sources. Calibrated means we chose the exact thresholds/weights/caps to make a stable 1–5 score and to avoid dominance/double-counting.
Moon position (Majors only) (L_base)
Research-backed: Walleye trip success is ~10–12% higher when the moon is overhead/underfoot.
Calibrated: mapping “~10–12%” into a lift constant (0.10 for Majors).
Source (open access): Shaw et al. 2021 — PLOS ONE
“Anglers were observed to be about 10–12% more likely to be successful when the moon was overhead or underfoot…”
(PDF p.13)
Moon phase (L_phase)
Research-backed: gibbous phases highest; quarter phases lowest (ordering used).
Calibrated: exact curve shape and phaseWeight magnitude (2.0).
Source (open access): Shaw et al. 2021 — PDF (printable)
“The odds of a successful trip were highest during the gibbous phases… and lowest during the quarter phases…”
(PDF p.13)
Low-light / crepuscular timing (L_time)
Research-backed: dusk and dawn are better than day; lower light improves success.
Calibrated: the maximum lift size and the exact dawn/dusk window used for scoring (see verification section for the window definition source).
Source (open access): Shaw et al. 2021 — PDF (printable)
“…The predicted odds of a successful trip was highest at dusk … followed by dawn … and then day …”
(PDF p.8)
“…increased as light conditions decreased (i.e., decreasing solar radiation and the diel periods of dawn or dusk relative to daytime).”
(PDF p.25)
Cloud cover (proxy for solar radiation) (part of L_time)
Research-backed: mean daily solar radiation negatively affects trip success; authors treat solar radiation as influenced by cloud cover.
Calibrated: mapping cloud cover % to a small lift (we keep it conservative).
Implementation note: PrimeBite uses Open‑Meteo cloud cover (%) as a proxy for light intensity, using a daytime average (≈9am–3pm local) when available.
Source (open access): Shaw et al. 2021 — PDF (printable)
“Mean daily solar radiation had a negative effect on walleye trip success… The observed percent of successful trips tended to increase with decreasing solar intensity …”
(PDF p.11)
“Solar radiation is influenced by solar altitude as well as cloud cover… Thus, mean daily solar radiation was assumed to represent cloud cover as well as seasonal or diel differences in solar intensity…”
(PDF p.5)
Dawn/dusk overlap with bite windows (L_overlap)
Research-backed: low-light periods improve success (Shaw 2021), so overlap with dawn/dusk is meaningful.
Calibrated: how overlap maps into points (ceiling 0.07) and the overlap mapping ceiling in the profile.
Verification source: civil twilight definition (NOAA/NWS) is used so “dawn/dusk overlap” is a standard astronomical window.
Seasonality multiplier (seasonMult)
Research-backed: Walleye vulnerability/effort/catch commonly peak in spring and shift through the year in open-access regional sources.
Calibrated: monthly multipliers and the global cap (1.15) used to keep seasonality meaningful but not dominant.
Sources (open PDFs):
Weather (wind/precip/pressure)
Research-backed (decision to exclude): Shaw 2021 highlights wind direction (not wind speed) as highly weighted; precip/pressure were not highly weighted.
Calibrated/product choice: Walleye v1 does not apply wind/precip/pressure adjustments globally until effect sizes and generality are better supported.
Key definitions & verification sources
Some items are not “Walleye biology claims” — they are definitions needed for correct implementation.
Moon phase vs illuminated fraction
Why it matters: quarter phases can have similar illumination but different phase position; the Walleye phase model is based on phase position.
Source (open access): SunCalc docs (phase definition)
“Moon phase value should be interpreted like this: … 0 | New Moon … 0.25 | First Quarter … 0.5 | Full Moon … 0.75 | Last Quarter …”
Dawn/dusk window definition (±30 minutes)
Used for: the low-light window used by Walleye v1.
Source (open access): Vasquez 2024 — UWSP thesis
“Observations 30 mins before and after sunrise were classified as dawn and observations 30 mins before and after sunset were classified as dusk.”
(printed p.30)
Civil twilight definition (sun altitude −6°)
Used for: computing overlap_fraction for the overlap lift.
Source (open access): NWS/NOAA — Twilight definitions
“Morning civil twilight begins when the geometric center of the sun is 6 degrees below the horizon, and ends at sunrise. Evening civil twilight begins at sunset, and ends when the geometric center of the sun is 6 degrees below the horizon.”
Worked example (inputs → lifts → rating)
This is a “math-complete” example showing how the model reaches a high rating under strong conditions. Real outputs depend on the actual window timings and local sunrise/sunset.
Example: strong Major window (can approach 5.0/5)
- Major window: L_base = 0.10
- Peak gibbous phase: L_phase ≈ 0.05 (calibrated magnitude)
- Full civil twilight overlap: overlap_fraction = 1.0 → L_overlap = 0.07
- Max low-light: L_time_lowlight = (0.20 / 0.40) × 0.03 = 0.015
- Cloud cover = 100%: L_time_clouds = (0.05 / 0.40) × 0.03 ≈ 0.004
- Sum: L_total_raw ≈ 0.10 + 0.05 + 0.07 + 0.015 + 0.004 = 0.239
- Season: May seasonMult = 1.15 → L_total ≈ 0.239 × 1.15 = 0.275
- Rating: 1 + 4 × (0.275 / 0.28) ≈ 4.9/5
Model changelog (Walleye)
- 2026-01: Published Walleye full transparency page (this page) and linked it from the app.
- 2026-01: Implemented civil-twilight overlap (definition-based dawn/dusk overlap, not arbitrary minutes) when lat/lon are available.
- 2026-01: Added a small dusk-over-dawn weighting and a conservative cloud-cover proxy term (direction research-backed; mapping calibrated).
- 2026-01-23: Research decision: Walleye uses Majors only (moon overhead/underfoot). Minor (moonrise/moonset) windows are not modeled.
- 2026-01-23: Commercial/UI: added percentile mapping for Major-window display ratings so 1.0 and 5.0 are equally rare (raw-model math remains visible).
- 2026-01-23: UI: redesigned Walleye “Why this rating” to be window-first (each Major window has its own raw-model breakdown + mapping).
Canonical doc source
The canonical version of this content lives in the PrimeBite app repository docs (and is mirrored here for public transparency):
docs/WALLEYE_CALCULATIONS.mddocs/WALLEYE_VARIABLES_FACTCHECK.md