The species is not turned into a profile to be compared against. It sets the water-temperature thresholds (what counts as cold/optimal/hot for that fish) and limits the candidate lures to its own list. In other words, it sets the frame before any scoring happens.
Each weather axis adds desired properties to the profile, in descending order of reliability (temperature and clarity carry the main weight, light and wind are modifiers, pressure is minimal). The output: target speed, size, depth, color priority, and wanted vs. unwanted properties.
First the hard filter: a lure outside the water-temperature range is dropped immediately. Survivors earn points for matching the profile: speed (exact +2, adjacent +1), size (+1.5 minus the difference), depth (+1.5 / −1.5), wanted properties (+1.5), unwanted (−2.5), color (by priority). The weights are expert judgement about axis importance — they are not calibrated against real catch data.
Fixed mechanics (math): the scoring arithmetic, the temperature filter, sorting, and the distance calculation to spots. Tunable judgement: weights, thresholds, the lure database, tags and colors, and the reasoning texts — that is where anyone improving the system should look. Important: the code is covered by tests (it does what it is meant to do), but it is not proven that the advice catches more fish — that requires real catch data.