PrimeBite Fishing Muskie Full Transparency

Muskie — Full Transparency (v1)

Last updated: 2026-01-26

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 (Muskie v1)

Muskie (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]

// Muskie window lift (per Major window; Muskie v1 uses Majors only)
L_total_raw = L_base + L_phase + L_overlap + L_time + L_weather // (precip/pressure disabled; wind penalty only)

// 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 Muskie v1.

Step 1) Base lift (Majors only)
L_base = 0.10 for Major (moon overhead/underfoot)

Step 2) Moon phase lift
phaseBoostValue = moonPhaseBoostMuskieWaningGibbous(moonPhasePosition)
L_phase = (phaseBoostValue × phaseWeight / 2.0) × 0.05     // phaseWeight = 3.5 (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 + dusk weighting)
// 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 weighted (calibrated)

timeBias = (ll × lowLightBias)
L_time = (timeBias / 0.40) × 0.03                           // small by design

Step 5) Weather adjustment
// Muskie keeps a small wind-speed penalty (direction from Shaw 2021; magnitude calibrated)
weatherAdj = genericWindPenalty(windSpeedMph, windPenalty)  // windPenalty = 0.008 per 5 mph over 10 (calibrated)
L_weather  = (weatherAdj / 0.30) × 0.02                     // lift conversion (matches SPECIES_LIFTS.weather in code)

Step 6) Apply seasonal multiplier
L_total = clamp((L_base + L_phase + L_overlap + L_time + L_weather) × seasonMult, 0, L_REF)

Step 7) Lift → raw rating (lift-based)
raw_rating = 1 + 4 × (L_total / 0.28)

Step 8) 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 Muskie windows can reach 1.0 and 5.0)

The Muskie model drivers are research-backed (Shaw 2021 + supporting definitions). However, the research does not support a “nearly impossible” biological floor. 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 Muskie, 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; match speciesProfiles.ts):

p01 = 0.090000
p05 = 0.100334
p50 = 0.137752
p95 = 0.200841
p99 = 0.217432

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: Muskie trip success increases during moon overhead/underfoot.

Calibrated: mapping the existence of this effect into a lift constant (0.10 for Majors).

Source (open access): Shaw et al. 2021 — PLOS ONE

“Twenty-three percent of observed trips were successful when the moon was either overhead or underfoot… relative to trips that did not encompass either of these lunar transition periods of which 16% were successful.”

(PDF p.17)

Moon phase (L_phase)

Research-backed: new and waning gibbous are highest for Muskie CPUE; quarter phases are lowest (ordering used).

Calibrated: exact curve shape and phaseWeight magnitude (3.5).

Source (open access): Shaw et al. 2021 — PDF (printable)

“Observed mean CPUE for successful trips was lowest during the first quarter phase… and highest for successful trips that occurred during the waning gibbous and new moon phases, 0.21 muskellunge/h and 0.20 muskellunge/h, respectively.”

(PDF p.23)

Low-light / crepuscular timing (L_time)

Research-backed: Muskie CPUE is highest at dusk (dusk >> day > dawn).

Calibrated: lowLightBias magnitude (0.35), duskLowLightMultiplier (1.5), 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)

“Observed mean muskellunge CPUE for successful dawn trips was 0.15 muskellunge/h (95% CI 0.13–0.18), successful day trips 0.19 muskellunge/h (95% CI 0.18–0.20), and successful dusk trips 0.30 muskellunge/h (95% CI 0.20–0.49; Fig 10B).”

(PDF p.21)

Cloud cover (proxy for solar radiation) (not implemented for Muskie v1)

Research-backed: mean daily solar radiation had a negative effect on Muskie trip success.

Calibrated/product choice: Muskie v1 does not apply a cloud-cover proxy; the effect was weaker and only significant for trip success (not CPUE).

Implementation note: PrimeBite uses Open-Meteo cloud cover (%) as a proxy for light intensity for Walleye, but does not use it for Muskie v1.

Source (open access): Shaw et al. 2021 — PDF (printable)

“However, similar to walleye, solar radiation had a negative influence on muskellunge trip success … The predicted odds of a successful trip decreased from a high of 0.17 … at solar radiation < 25 W/m² to a predicted odds of success of 0.11 … at solar radiation > 450 W/m².”

(PDF p.21)

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: Shaw et al. 2021 observed muskellunge CPUE increased with mean daily air temperature and declined only above 29°C (p.23). PrimeBite’s seasonality follows that relationship: summer peak (warmer temps = higher CPUE), lower in cooler months.

Calibrated: monthly multipliers and the global cap (1.15) used to approximate the temperature–CPUE relationship by calendar month.

Source (open access): Shaw et al. 2021 — PDF (printable)

“We hypothesize that air temperature would be negatively related to muskellunge CPUE for successful trips… However, observed muskellunge CPUE for successful trips tended to increase with mean daily air temperature and then began to decline at air temperatures > 29°C (Fig 11B). Predicted CPUE for successful trips ranged from a low of 0.10 muskellunge/h at temperatures ≤ 5°C and increased to 0.14 muskellunge/h at air temperatures ≥ 25°C.”

(PDF p.23 — Results)

Weather (wind/precip/pressure)

Research-backed: wind speed negatively affects Muskie CPUE; precip/pressure were not highly weighted.

Calibrated: exact wind penalty curve magnitude; precip/pressure disabled for Muskie v1.

Source (open access): Shaw et al. 2021 — PDF (printable)

“Predicted mean CPUE for successful trips ranged from 0.15 muskellunge/h … and declined to 0.09 … at the maximum wind speeds observed (≥ 9 m/s).”

(PDF p.23)
“Additionally, large changes in barometric pressure and precipitation are associated with frontal weather and yet these environmental factors were not highly weighted in any analysis.”

(PDF p.27)

Key definitions & verification sources

Some items are not “Muskie 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 Muskie 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 Muskie 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 reach 5.0/5)

Model changelog (Muskie)

Canonical doc source

The canonical version of this content lives in the PrimeBite app repository docs (and is mirrored here for public transparency):