Plan a starter: one step if one is enough, two if not, and never three.
The search tries every combination on the quarter-litre grid up to
maxStepL. That's at most a few hundred, so the plan returned is the one
that uses the least DME to reach the target.
No starter.available ≥ target returns needed: false with no steps.
A calculator that always produces a starter teaches brewers to build ones
they don't need.
One step. The smallest volume on the grid whose yield reaches the
target.
Two steps. All of step one's yield seeds step two, which is what
decanting and pitching the slurry does. Among the pairs that work, the one
using the least DME wins, and the smaller first step breaks ties.
No plan. Three steps is a lab propagation schedule. It means a week of
juggling flasks to save the price of a pack of yeast, so we don't plan
one. The result says how many packs would have made a starter unnecessary
(StarterPlan.suggestedPackMultiplier) instead.
Plan a starter: one step if one is enough, two if not, and never three.
The search tries every combination on the quarter-litre grid up to
maxStepL. That's at most a few hundred, so the plan returned is the one that uses the least DME to reach the target.available ≥ targetreturnsneeded: falsewith no steps. A calculator that always produces a starter teaches brewers to build ones they don't need.