CastScience

Science Info and Calculations

Scoring

How the app ranks areas: first the hard filters, then a weighted sum of nine factors, out of 100 points.

In plain words

Two steps. First the hard filters remove water you cannot or should not fish today. Then every remaining area gets a score from nine factors. Each factor is a number from 0 to 1 (how well the area fits on that count) times a weight (how much that count matters); the weights add up to 1, so the score runs from 0 to 100 points.

The score ranks areas for the day, the conditions and your setup. It is not the chance of catching fish. The weights and factor values are starting values (SPEC 5.8); the tournament backtest checks them (Validation), and they were frozen on 2026-10-01 after one round of calibration so that the check stays honest.

Hard filters

Checked in this order; the first that applies is the reason the plan gives.

  1. You left the area out in Setup, or chose to leave out Canadian water.
  2. Licence: Canadian areas need an Ontario fishing licence, U.S. areas a Michigan one.
  3. The season for your species is closed in that water (Regulations).
  4. Walpole Island First Nation waters outside the non-member fishing season.
  5. The run is longer than your limit (default 25 mi).
  6. The modeled waves at the area are above your wave limit.
  7. On an open-water crossing: a small craft advisory is in effect.
  8. On an open-water crossing: the over-water wind reaches 15 mph during your hours.
  9. The modeled waves on the run are above your wave limit.

With Override all limits switched on in Setup, filters 2 to 9 do not remove an area: it stays in the plan as a red card that lists the limits it breaks. The schedule and its leave-by times keep the limits.

The decision matrix

Score, points
S=100∑i=19wifiS = 100 \sum_{i=1}^{9} w_i f_i
0≤fi≤1,∑iwi=10 \le f_i \le 1, \qquad \sum_{i} w_i = 1
S=0 if a hard filter appliesS = 0 \text{ if a hard filter applies}
FactorWeightValue f
Depth0.2Share of the area's depth range inside the phase's primary band (counts 1) or only inside the secondary band (counts 0.5).
Shelter from waves0.21 while the modeled Hs at the area is 1.0 ft or less, then falling in a straight line to 0 at your wave limit.
Records0.15Tournament wins here within 21 days of the date's day of year (any year) count 1, other wins in the same phase 0.5, guide or research accounts 0.5; f = the total / 2, at most 1.
Bottom0.1Early and late fall: rock, gravel or current 1, grass edges 0.7, soft or plain sand 0.3. Summer: sand with cabbage or sand grass 1, else 0.5. Other phases 0.5.
Water temperature0.11 inside the phase's preferred lake temperature, falling to 0 at 5 F outside it.
Run distance0.11 minus the run divided by your longest run.
Clarity0.051 minus the clarity index / 3; at least 0.5 the day before and the day of a front (vibration baits).
River current0.051 if the area has river current and the phase is early or late fall, else 0.
Your logbook0.05Your logbook's success rate here in this phase, updated from a prior of 2 good sessions in 4 (Bayesian updating). Paid plans; free plans use the prior alone.

The depth bands, preferred temperatures and phases are on the Fish and temperature page; the wave model on Waves; the clarity index on Water clarity; the logbook factor on Bayesian updating.

After the score

  • Crowds: if you chose to avoid crowds, a known community spot scores ×0.85\times 0.85 on weekends.
  • Ranking: by score, except that within 3 points the area with the shorter run goes first.
  • Part of the day: an area over a limit for some hours is scored on its longest stretch of hours within the limits, if that stretch is at least 2 hours. For a crossing the stretch ends at the latest safe departure: the hour the wind reaches the limit, minus the run back in chop, minus 30 minutes.

Source: SPEC 5.8 and 5.10. Engine: scoreArea, rankAreas and rankAreasForDay in packages/engine/src/scoring.ts.

Worked example

Area CA2, South shore toward the Detroit River (Tecumseh to Puce), on 2026-10-08: early fall, front status stable, lake 61.4 F, 10 mph from the SW, a deep-V with a 2.0 ft wave limit and a 25 mi longest run. This is the engine's own test scenario; the engine scores it 83.5 points:

  • Depth: 10-14 ft against 10-16 ft, secondary 16-21 ft, so f=1.00f = 1.00; 100×0.2×1.00=20.0100 \times 0.2 \times 1.00 = 20.0 points.
  • Shelter from waves: Hs 0.3 ft, limit 2.0 ft, so f=1.00f = 1.00; 100×0.2×1.00=20.0100 \times 0.2 \times 1.00 = 20.0 points.
  • Records: Bassmaster AOY Championship 2019, so f=0.50f = 0.50; 100×0.15×0.50=7.5100 \times 0.15 \times 0.50 = 7.5 points.
  • Bottom: rock, sand, current, so f=1.00f = 1.00; 100×0.1×1.00=10.0100 \times 0.1 \times 1.00 = 10.0 points.
  • Water temperature: 61.4 F against 58-68 F, so f=1.00f = 1.00; 100×0.1×1.00=10.0100 \times 0.1 \times 1.00 = 10.0 points.
  • Run distance: 16.3 mi of 25 mi, so f=0.35f = 0.35; 100×0.1×0.35=3.5100 \times 0.1 \times 0.35 = 3.5 points.
  • Clarity: index 0.0, so f=1.00f = 1.00; 100×0.05×1.00=5.0100 \times 0.05 \times 1.00 = 5.0 points.
  • River current: yes, so f=1.00f = 1.00; 100×0.05×1.00=5.0100 \times 0.05 \times 1.00 = 5.0 points.
  • Your logbook: 0 of 0 sessions, so f=0.50f = 0.50; 100×0.05×0.50=2.5100 \times 0.05 \times 0.50 = 2.5 points.

The records factor, record by record (tournament wins with their season phase on day 1, from the latest backtest run): Bassmaster Elite 2017 (2017-08-24, summer): 0 points; Bassmaster AOY Championship 2019 (2019-09-29, early fall): 1 point. A win counts 1 within 21 days of the date's day of year and 0.5 at other times in the same phase, so f=1.0/2=0.50f = 1.0 / 2 = 0.50. Change any input below to see the score move.

Calculator

Area score, worked example

Runs the app's engine in this browser: scoreArea, evidenceFeature, adjustedBands (packages/engine/src/scoring.ts, season.ts).

CA2: 10-14 ft, flat sand with small rock, current; 1.3 km of fetch from the SW; wave depth 3.66 m; run 16.3 mi from the Metropark. Area data from the trip analysis tables (8 wind directions; the app now uses 36 on a finer shoreline, so its numbers differ a little). The example leaves out the waves on the run and the crossing rule (Waves).

Points = 100 x w x f. The weights can be changed here; the app always uses the engine's.

Factor, fromfWeight wPoints
Depth10-14 ft against 10-16 ft, secondary 16-21 ft1.0020.0
Shelter from wavesHs 0.3 ft, limit 2.0 ft1.0020.0
RecordsBassmaster AOY Championship 20190.507.5
Bottomrock, sand, current1.0010.0
Water temperature61.4 F against 58-68 F1.0010.0
Run distance16.3 mi of 25 mi0.353.5
Clarityindex 0.01.005.0
River currentyes1.005.0
Your logbook0 of 0 sessions0.502.5
Total1.0083.5
Score in the app (engine weights)83.5 of 100
Score with the weights above83.5 of 100
Wave class at the areaCalm

Constants

ConstantValueIn the codeBasis
Weights0.2, 0.2, 0.15, 0.1, 0.1, 0.1, 0.05, 0.05, 0.05WEIGHTSStarting value: SPEC 5.8; frozen 2026-10-01
Secondary band0.5SECONDARY_BAND_WEIGHTStarting value
Full shelter up to1.0 ftSHELTER_FULL_FTStarting value
Record window21 daysEVIDENCE_WINDOW_DAYSStarting value
Record points1, 0.5, 0.5; full at 2EVIDENCE_POINTS, EVIDENCE_FULL_POINTSStarting value
Bottom values1, 0.7, 0.3; 1; 0.5BOTTOM_VALUESStarting value
Temperature margin5 FTEMP_FEATURE_MARGIN_FStarting value
Clarity floor on front days0.5VIBRATION_CLARITY_FLOORStarting value
Logbook prior2 in 4PERSONAL_PRIORStarting value: prior 0.5 with the weight of 4 sessions
Crowd factor0.85CROWD_FACTORStarting value
Tie window3 pointsTIE_POINTSStarting value
Shortest part-day stretch2 hMIN_FISHABLE_HStarting value
Margin after the run back30 minCROSSING_RETURN_MARGIN_MINSPEC 5.5
Crossing wind limit15 mphCROSSING_WIND_LIMIT_MPH (packages/shared)Safety default (SPEC 5.5)

Constants are in packages/engine/src/scoring.ts unless named otherwise.