4cee05c2f8
Compared every R_RI decoder we use (22-28, 30-34, 51) byte-for-byte with pyLSV2 (MIT, 97a3d691) and ran the captured iTNC 530 replies through pyLSV2 itself: no decode disagreement, so no published value changes. - Additive read-only String leaves Status/ExecutionStateName, Status/ProgramStateName and Tool/AxisName (pyLSV2 ExecState / PgmState / decode_tool_info names; out-of-table code = "Unknown"). They ride the raw leaf's feature, so no extra wire read; raw Int32 leaves unchanged. - Refusals: 52/72 -> BadOutOfRange, 58 -> BadTimeout, 56 -> BadInvalidState, 57 (outside the alarm walk) -> BadNoData. IsStable and the 57-only alarm-walk end are unchanged. Lsv2RefusalCodes names every code (pyLSV2 LSV2StatusCode) in exception/log/probe text. - Timers 30-34 documented as uint32be seconds (lifetime counters) per pyLSV2, hardware-unproven; TimersEnabled stays false. Axis/tool units: none on the wire, none assumed. - Lsv2ReadOnlyPolicy untouched (pinned by a test); R_RI 20/21 left out. Claude-Session: https://claude.ai/code/session_01GT67AD99zQQqpLCVm3p7xk