Tested on plants it had never seen
A level jumps. Was it the rain, a sensor that died, someone changing a setpoint, or someone who should not be in the system? We built an explainer that expects each reading from its own past, its neighbours, the rain gauges and the setpoints, and names a cause with its reasons, or says it cannot tell. No language model decides; one may only put the reasons into words. We tested it on 165 deviations on three public plants it had never seen, chosen and locked before the test: two real wastewater networks, in Austria and England, and an industrial security testbed with recorded attacks.
On the two networks it was right on 56 of 98 deviations and wrong on 2; the checks we already ship were right on 62 and wrong on 8, so overall it did not beat them. The difference is in the costliest mistake, blaming a dead sensor on the rain: our checks did that 7 times, the explainer 1 time. Four small local language models, given the same evidence, were wrong on 32 to 93 of every 100.
On the security testbed it hardly answered. Its export came in several files, and our reader kept only the first one of each reading, so on 63 of 67 deviations it saw too little history and said it could not tell. It said attack once, and was right; that is no test of finding attacks. The reader will be fixed and tested on new locked data, not on this.
P54, written down before the held-out run: PARTIAL. Finding attacks: FALSIFIED.