sud.start() synchronously fires the first step's on_step_changed callback before it even returns (assigning Sud.step triggers callbacks immediately), which sets M/C/L/Td from this doc's own derive_plant_params() before any pot.process()/tc.process() tick ever runs - so the constructor's plant_params was being set, then immediately discarded, unused. theta_amb stays, since it's not part of the Sud doc at all. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DkkuG48uHFCGKe6dPSERFk