1. notes_of() could not tell this guard's alarm from anybody else's. It
selected by SERVICE, so against #12's app/ (which adds
goodwe_output_clamp) eight assertions went red, AC1's core check among
them. Blanket id-keying is not the repair and was measured, not
guessed:
selector vs #12's app/ id renamed
by service (as committed) 8 red 1 red
by id alone 3 red 6 red
by id or title (shipped) 3 red 1 red
all_notes_of() is the whole surface; notes_of() is this guard's,
recognised by the id it should carry OR the title it writes - the `or`
is what keeps the one assertion whose subject IS the id able to fail on
its own. The three surface-wide claims stay surface-wide, each with a
comment naming which surface it is about and why the next guard's
author must decide rather than narrow them. They are the three that go
red against #12, which is the correct signal.
2. The ordering comment named the wrong boundary. N3 - moving the call to
immediately before write_setpoint() - is green and correctly so:
self.target is assigned two lines earlier, write_setpoint() clamps only
a local and can skip the write entirely. So the invariant is "after
`self.target = resolution.target_w`", and the detector grades pre-clamp
INTENT, not the wire. Corrected in test_freeze.py and in main.py's own
note above the call (comment-only; I merge second and own the
conflict). N8 - moving the call above the assignment - is RED 4.
3. The schema range's own bounds are now pinned. int(60,3600) ->
int(1,86400) survived green: an operator could set meter_freeze_s:
86400 and the guard is dead with nothing red. Both bounds are
re-derived rather than restated.
4. find_hwsim() crashed the whole suite on a checkout one level below the
root (HERE.parents[1] -> IndexError, reproduced at C:/goodwe_controller).
Guarded. And part 3 now names its transport in the summary: the rig
hwsim and the stub are not equivalent - the rig path failed 1 run in 3
- so a green log has to say which one backed it.
Also: the "revived transport re-rails" check is labelled a PRECONDITION
like its sibling; freeze_rows() records that flipping p1_enabled exercises
the row's content and never its gate; and the note about the deleted
assertion is corrected - it was REDUNDANT, not undecidable. The reviewer
falsified it in one line (move the hass.call above `if not fired: return`,
RED 9). "I could not construct a falsifier, therefore it cannot fail" was
exactly the inference this file exists to distrust.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015VXjA3LWccN1rJsk3okyPC