Follow-up from #50. Filed to make the collapse a recorded decision rather than a side effect.
After 0.7.0, relay_behavior is still validated (manifest_physics.py:428-434) and still stored on CircuitPhysics, but it no longer drives anything except through relay_locked: both former call sites in emitter.py now read not cphys.always_on. So non-controllable and always-on are behaviourally identical, and the three-value enum has two outcomes.
The consequence is that a producer cannot model a circuit that is locked open: a spare, a tagged-out branch, a circuit commissioned off. Every locked circuit resolves permanently CLOSED with requester CONFIGURATION.
Nothing in the specification contradicts the current behaviour. capabilities/switch.md defines relay-controllable: false as "locked (for example a circuit commissioned as permanently on)", which is worded as an example rather than the only case, so locked-open is left open rather than ruled out. And main documented no meaning for non-controllable at all, so 0.7.0 filled a vacuum rather than overturning a contract.
Two ways to close this, and the choice is a scope call:
- Record it. State in DESIGN.md that
relay-behavior distinguishes the operator's intent only, and that both non-controllable spellings mean locked-closed. Cheapest, and honest.
- Keep the seam. Have a locked circuit resolve to a declared resting state rather than an implied CLOSED, so
non-controllable can later mean locked-at-its-commissioned-state without another wire break.
Worth deciding before someone needs locked-open, because relay-behavior is where it would have lived.
Follow-up from #50. Filed to make the collapse a recorded decision rather than a side effect.
After 0.7.0,
relay_behavioris still validated (manifest_physics.py:428-434) and still stored onCircuitPhysics, but it no longer drives anything except throughrelay_locked: both former call sites inemitter.pynow readnot cphys.always_on. Sonon-controllableandalways-onare behaviourally identical, and the three-value enum has two outcomes.The consequence is that a producer cannot model a circuit that is locked open: a spare, a tagged-out branch, a circuit commissioned off. Every locked circuit resolves permanently CLOSED with requester
CONFIGURATION.Nothing in the specification contradicts the current behaviour.
capabilities/switch.mddefinesrelay-controllable: falseas "locked (for example a circuit commissioned as permanently on)", which is worded as an example rather than the only case, so locked-open is left open rather than ruled out. Andmaindocumented no meaning fornon-controllableat all, so 0.7.0 filled a vacuum rather than overturning a contract.Two ways to close this, and the choice is a scope call:
relay-behaviordistinguishes the operator's intent only, and that both non-controllable spellings mean locked-closed. Cheapest, and honest.non-controllablecan later mean locked-at-its-commissioned-state without another wire break.Worth deciding before someone needs locked-open, because
relay-behavioris where it would have lived.