- Bug #1: CalculateExecution now filters product by targetResourceId
instead of blindly taking .First() — fixes multi-product recipes
- Bug #2: Replace visited HashSet with recipeOutput tracker — allows
re-processing when demand increases (double targets on same resource)
- Bug #3: Clamp effectiveSpeed to MinEffectiveSpeed (0.05) floor —
prevents division by zero with heavy productivity module stacks
Also: switch from Stack (DFS) to Queue (BFS) for more predictable
resolution order; add 4 regression tests (24 total, all green)