docs: refresh windup writeup to past tense, link architecture diagram

overshoot_hold_windup.md read like a live plan ("not yet implemented")
even though the fix had already shipped; reworks it into a past-tense
record with corrected line numbers and test descriptions matching what
was actually built. Fixes a stale pid_heat reference in
temp_control_calibration.md.

TODO.md's windup item still claimed test coverage was "outstanding"
from before the test suite was added; corrects that and the "No
automated tests" item above it to reflect current coverage. Both docs
now link docs/fsm_states.png (durable) and the Claude Artifact URL
(session-scoped) for the cascade architecture diagram.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DGQhVQ2Y3yXAQTXhrxVd5u
This commit is contained in:
2026-07-05 22:08:19 +02:00
co-authored by Claude Sonnet 5
parent acfb98e186
commit 11c3d92f25
3 changed files with 119 additions and 90 deletions
+23 -11
View File
@@ -32,13 +32,17 @@ git history for `temp_controller.py`/`temp_controller_smith.py`).
hold_scale)` — the overshoot-compensation scheduling logic now lives
entirely in the temp controller, not the generic `Pid` block.
- [ ] **No automated tests.** `tests/components/pid/` was added once
- [ ] **No automated tests for the heat-rate filtering or Smith
correction specifically.** An earlier `tests/components/pid/` suite
(stdlib `unittest`, no pytest) covering FSM transitions, anti-windup
clamping, and Kalman convergence, but was removed again before the
Kalman-filter removal/Smith rewrite, so none of the current
`temp_controller*.py` behavior (backward-difference + low-pass
filtered heat rate, the two-model Smith correction) has test
coverage. This drives a physical heater — worth re-adding.
clamping, and Kalman convergence was removed before the Kalman-filter
removal/Smith rewrite. A new `tests/components/pid/` suite was added
alongside the HOLD-windup fix below (`test_pid.py`,
`test_temp_controller_closed_loop.py`) covering the `yi_max` clamp and
closed-loop disturbance/ramp/transition behavior, but
`_compute_heatrate()`'s backward-difference + low-pass filtering and
the two-model Smith correction itself still have no dedicated
coverage. This drives a physical heater — worth extending.
- [ ] **`set_model_power` isn't defined on every controller, but
`brewpi.py` wires it unconditionally.** `brewpi.py` always does
@@ -81,11 +85,19 @@ git history for `temp_controller.py`/`temp_controller_smith.py`).
`Inner.Cool` so the *same* PID instance gets a tight `yi_max` only while
`HOLD` is driving it and stays unclamped for real `HEAT` ramps — no
freeze/thaw, bumpless transfer preserved for free. See
`docs/overshoot_hold_windup.md` for the full writeup. This was also a
breaking config change (`Hold`/`Heat`/`Cool``Outer`/`Inner.*`) —
`config.json`, the templates, and the demo scripts were all migrated.
Test coverage for this (closed-loop disturbance/ramp/transition cases)
is still outstanding — see the "No automated tests" item above.
`docs/overshoot_hold_windup.md` for the full writeup, and
`docs/fsm_states.png` for a static screenshot of the FSM-states panel
of the cascade architecture diagram (states/thresholds, and the
HOLD→HEAT no-reset note). The full interactive diagram (signal-flow
cascade + FSM inset + config-mapping table) is a Claude Artifact,
not a repo file: https://claude.ai/code/artifact/a32e4752-b4a6-4153-b344-eb2423eb6512
— only reachable by whoever has access to the Claude account/session
that created it, not a durable link for the team; `docs/fsm_states.png`
is the durable copy. This was also a breaking config change (`Hold`/`Heat`/`Cool`
`Outer`/`Inner.*`) — `config.json`, the templates, and the demo scripts
were all migrated. Test coverage (closed-loop disturbance/ramp/transition
cases) was added under `tests/components/pid/` — see the "No automated
tests" item above.
- [ ] **`kalman.py` is now dead code in production.** Neither
`temp_controller.py` nor `temp_controller_smith.py` uses `Kalman`