Previously the dispatch loop only fired flowmovement for pumps in 'operational' or transitioned 'idle' pumps via execsequence-startup-then-flowmovement. Pumps mid-startup (starting/warmingup) were silently skipped. With PS sending demand every tick, intermediate setpoints during the startup window never reached the pump — it locked onto the very first snapshot's flowmovement and froze there. Now flowmovement is sent regardless of state and rotatingMachine's state.moveTo handles the queueing (delayedMove for transients, unpark for residue, immediate for operational). Crucially, flowmovement runs BEFORE execsequence-startup so the FIRST call's stale setpoint can't land on an already-operational pump and overwrite the latest delayedMove that fires at end of startup. Adds three integration tests: - demand-cycle-walkthrough: 0..100% sweep with clean per-step table - idle-startup-deadlock: four scenarios that pin the dispatch behaviour including the regression guard for varying-demand-during-startup - optimizer-combination-choice: physical-validity invariants Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
8.0 KiB
8.0 KiB