@@ -694,11 +694,24 @@ CONFIRMED by two independent lines of disassembly (control-flow + offset math, a
694694fault-name strings). What remains unproven is purely *semantic*: whether a genuinely faulted unit
695695asserts these bits on the wire. That is the one gate left, and it needs hardware. See §7.6.
696696
697- ### 7.6 Remaining gate: hardware fault-injection runbook
697+ ### 7.6 Hardware validation [CONFIRMED 2026-07-22] and the fault-injection runbook
698698
699- Static RE cannot go further: a healthy unit reads all-clear, so "no faults" proves nothing about
700- whether a real fault sets its predicted bit. Confirm one bit end-to-end on a debug-flavour unit
701- (so the `:2323` console is reachable), cheapest step first:
699+ **Validated on real hardware, 2026-07-22** (office AmebaZ2, v1.3.19). Two faults were induced; each
700+ set exactly its predicted bit, named it correctly, stayed isolated to the affected unit, and cleared
701+ on undo:
702+
703+ | fault | induced by | observed |
704+ |---|---|---|
705+ | `f_e_incom` | cut the indoor-to-outdoor comms line | byte 39 -> `0x01` (bit 0), `com=1`; back to `0x00` on reconnect |
706+ | `f_e_intemp` | unplug the indoor temp thermistor | byte 39 -> `0x80` (bit 7), `temp=1`; back to `0x00` on reconnect |
707+
708+ The kitchen unit read all-clear the whole time (no false positive). Bit 0 and bit 7 are the two ends
709+ of byte 39, so both the byte offset and the within-byte bit decode are confirmed against live faults.
710+ That closes #38. Bytes 40/64/66 rest on the same extractor + compiled-name-string evidence (§7.5) but
711+ have not each been seen firing; the runbook below drives that if wanted.
712+
713+ Confirm a bit end-to-end on a debug-flavour unit (so the `:2323` console is reachable), cheapest step
714+ first:
702715
7037161. **Baseline (captured live 2026-07-22).** `nc <unit> 2323`, then `faults` (expect `no faults`)
704717 and `raw` (hexdump). On a normal healthy unit bytes 39/40/64/66 read `00 00 00 00` (confirmed on
0 commit comments