FA-92196 / PLC ladder logic scan cycles / Open access
Alarm activates one scan after its minimum duration · case 01
Every alarm is announced one scan late.
ROOT CAUSE
The activation test uses count > min_scans.
THE FAILURE
The activation test uses count > min_scans.
Unsuccessful approach: Comparing against min_scans - 1 activates one scan early.
Case contract
Digital alarm instruction evaluated per scan; scans is a list of [condition, ack, reset], min_scans >= 1. The alarm activates when the condition has been true for min_scans consecutive scans; activation clears the acknowledged flag. A non-latched alarm clears when the condition goes false; a latched alarm clears only on a reset while the condition is false. ack sets acknowledged. Return [in_alarm, acknowledged] per scan.
Why this case matters
Ladder programs are executed as repeated scans; each defect here changes what a rung, timer, counter or data-table instruction reports on a particular scan, which is how commissioning and field faults are actually observed.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(min_scans, latched, scans):
in_alarm = False
acked = True
count = 0
out = []
for cond, ack, reset in scans:
count = count + 1 if cond else 0
if count > min_scans and cond and not in_alarm:
in_alarm = True
acked = False
elif in_alarm and not cond and (not latched or reset):
in_alarm = False
if ack and not acked:
acked = True
out.append([in_alarm, acked])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: latched with ack and reset',
[2,
True,
[[True, False, False],
[True, False, False],
[False, False, False],
[False, True, False],
[False, False, True],
[True, False, False]]],
[[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
['regression: chattering condition',
[3,
False,
[[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False]]],
[[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
['regression: realarm after ack',
[1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
[[True, False], [True, True], [False, True], [True, False]]],
['regression: reset while condition true',
[1, False, [[True, False, False], [True, False, True], [True, False, False]]],
[[True, False], [True, False], [True, False]]],
['regression: ack on latched alarm',
[1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
[[True, False], [True, True], [True, True], [False, True]]],
['regression: scenario 1',
[1,
False,
[[True, False, False],
[False, False, False],
[True, False, False],
[False, False, False],
[True, True, False],
[True, False, False],
[True, False, False],
[False, False, False],
[False, False, False],
[True, False, False]]],
[[True, False],
[False, False],
[True, False],
[False, False],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, False]]],
['regression: scenario 2',
[1,
True,
[[False, False, False],
[True, False, False],
[True, False, False],
[False, False, False],
[False, False, False],
[True, False, False],
[False, False, False],
[False, False, True],
[False, False, False],
[False, True, False],
[True, False, False],
[False, False, False]]],
[[False, True],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[False, False],
[False, False],
[False, True],
[True, False],
[True, False]]],
['regression: scenario 3',
[3,
False,
[[True, False, False],
[True, False, True],
[False, False, False],
[False, False, False],
[False, False, True],
[True, False, False],
[True, True, False],
[False, True, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False]]],
[[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, False]]]],
[['regression: chattering condition',
[3,
False,
[[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False]]],
[[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
['regression: scenario 2',
[3,
False,
[[False, False, False],
[True, False, False],
[False, False, False],
[False, False, False],
[False, False, True],
[False, True, False],
[True, False, False],
[False, False, False],
[True, True, False],
[True, False, False],
[True, False, False]]],
[[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, False]]],
['regression: latched with ack and reset',
[2,
True,
[[True, False, False],
[True, False, False],
[False, False, False],
[False, True, False],
[False, False, True],
[True, False, False]]],
[[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
['regression: realarm after ack',
[1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
[[True, False], [True, True], [False, True], [True, False]]],
['regression: reset while condition true',
[1, False, [[True, False, False], [True, False, True], [True, False, False]]],
[[True, False], [True, False], [True, False]]],
['regression: ack on latched alarm',
[1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
[[True, False], [True, True], [True, True], [False, True]]],
['regression: scenario 1',
[1,
False,
[[False, False, False],
[False, False, True],
[False, False, False],
[True, True, False],
[False, False, False],
[True, True, False],
[True, False, False],
[True, False, False],
[True, False, False],
[False, False, True],
[True, False, False]]],
[[False, True],
[False, True],
[False, True],
[True, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[True, False]]],
['regression: scenario 3',
[2,
False,
[[True, False, False],
[True, False, True],
[False, True, True],
[False, False, False],
[False, False, True],
[True, False, False],
[True, False, False],
[True, True, False],
[True, False, False],
[True, False, True],
[False, False, False],
[False, False, False]]],
[[False, True],
[True, False],
[False, True],
[False, True],
[False, True],
[False, True],
[True, False],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True]]]],
[['regression: realarm after ack',
[1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
[[True, False], [True, True], [False, True], [True, False]]],
['regression: scenario 1',
[3,
False,
[[True, False, False],
[True, False, False],
[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False],
[False, False, True],
[False, False, True]]],
[[False, True],
[False, True],
[True, False],
[True, False],
[False, False],
[False, False],
[False, False],
[True, False],
[False, False],
[False, False]]],
['regression: latched with ack and reset',
[2,
True,
[[True, False, False],
[True, False, False],
[False, False, False],
[False, True, False],
[False, False, True],
[True, False, False]]],
[[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
['regression: chattering condition',
[3,
False,
[[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False]]],
[[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
['regression: reset while condition true',
[1, False, [[True, False, False], [True, False, True], [True, False, False]]],
[[True, False], [True, False], [True, False]]],
['regression: ack on latched alarm',
[1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
[[True, False], [True, True], [True, True], [False, True]]],
['regression: scenario 2',
[2,
True,
[[False, True, False],
[True, False, False],
[True, False, False],
[True, False, False],
[False, False, False],
[True, False, True],
[True, False, False],
[False, False, False],
[False, True, False],
[True, False, False],
[False, False, False],
[False, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, True, True]]],
[[False, True],
[False, True],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True]]],
['regression: scenario 3',
[3,
True,
[[True, False, False],
[True, False, False],
[True, False, False],
[True, False, False],
[True, False, True],
[True, False, False],
[False, False, False],
[True, False, False],
[False, True, False],
[False, False, False],
[False, False, False],
[True, False, False],
[False, False, False]]],
[[False, True],
[False, True],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True]]]],
[['regression: reset while condition true',
[1, False, [[True, False, False], [True, False, True], [True, False, False]]],
[[True, False], [True, False], [True, False]]],
['regression: scenario 2',
[2,
False,
[[False, True, False],
[True, False, False],
[True, True, False],
[True, False, False],
[False, False, False],
[True, False, False],
[False, False, False],
[False, False, False],
[True, False, False],
[True, True, False],
[True, False, True],
[False, False, False],
[True, False, True],
[True, True, False],
[True, False, False]]],
[[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True]]],
['regression: latched with ack and reset',
[2,
True,
[[True, False, False],
[True, False, False],
[False, False, False],
[False, True, False],
[False, False, True],
[True, False, False]]],
[[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
['regression: chattering condition',
[3,
False,
[[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False]]],
[[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
['regression: realarm after ack',
[1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
[[True, False], [True, True], [False, True], [True, False]]],
['regression: ack on latched alarm',
[1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
[[True, False], [True, True], [True, True], [False, True]]],
['regression: scenario 1',
[2,
True,
[[False, True, False],
[True, False, False],
[False, False, False],
[False, False, True],
[False, False, True],
[True, False, True],
[True, True, False],
[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, True, False],
[True, False, False]]],
[[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True]]],
['regression: scenario 3',
[1,
True,
[[False, False, False],
[False, False, False],
[False, False, True],
[False, False, False],
[True, False, False],
[False, False, False],
[True, False, True],
[True, False, False],
[True, True, False],
[True, False, True],
[True, False, True],
[True, True, True]]],
[[False, True],
[False, True],
[False, True],
[False, True],
[True, False],
[True, False],
[True, False],
[True, False],
[True, True],
[True, True],
[True, True],
[True, True]]]],
[['regression: ack on latched alarm',
[1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
[[True, False], [True, True], [True, True], [False, True]]],
['regression: scenario 4',
[3,
False,
[[True, False, False],
[True, False, True],
[True, False, True],
[True, False, True],
[False, False, False],
[True, False, True],
[False, False, False],
[False, False, False],
[False, False, False],
[False, False, True]]],
[[False, True],
[False, True],
[True, False],
[True, False],
[False, False],
[False, False],
[False, False],
[False, False],
[False, False],
[False, False]]],
['regression: latched with ack and reset',
[2,
True,
[[True, False, False],
[True, False, False],
[False, False, False],
[False, True, False],
[False, False, True],
[True, False, False]]],
[[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
['regression: chattering condition',
[3,
False,
[[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False]]],
[[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
['regression: realarm after ack',
[1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
[[True, False], [True, True], [False, True], [True, False]]],
['regression: reset while condition true',
[1, False, [[True, False, False], [True, False, True], [True, False, False]]],
[[True, False], [True, False], [True, False]]],
['regression: scenario 1',
[2,
False,
[[False, False, False],
[True, True, False],
[True, True, False],
[False, False, True],
[False, False, True],
[True, True, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, True]]],
[[False, True],
[False, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, False],
[False, False],
[False, False],
[True, False]]],
['regression: scenario 2',
[2,
False,
[[False, True, False],
[True, True, True],
[False, False, False],
[False, True, True],
[True, False, False],
[False, False, False],
[True, False, True],
[False, False, False],
[True, False, False],
[False, True, False],
[False, True, False]]],
[[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True]]]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: latched with ack and reset | [[False, True], [False, True], [False, True], [False, True], [False, True], [False, True]] | [[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]] | Failed |
| regression: chattering condition | [[False, True], [False, True], [False, True], [False, True], [False, True], [False, True]] | [[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]] | Failed |
| regression: realarm after ack | [[False, True], [True, True], [False, True], [False, True]] | [[True, False], [True, True], [False, True], [True, False]] | Failed |
| regression: reset while condition true | [[False, True], [True, False], [True, False]] | [[True, False], [True, False], [True, False]] | Failed |
| regression: ack on latched alarm | [[False, True], [False, True], [False, True], [False, True]] | [[True, False], [True, True], [True, True], [False, True]] | Failed |
| regression: scenario 1 | [[False, True], [False, True], [False, True], [False, True], [False, True], [True, False], [True, False], [False, False], [False, False], [False, False]] | [[True, False], [False, False], [True, False], [False, False], [True, True], [True, True], [True, True], [False, True], [False, True], [True, False]] | Failed |
| regression: scenario 2 | [[False, True], [False, True], [True, False], [True, False], [True, False], [True, False], [True, False], [False, False], [False, False], [False, True], [False, True], [False, True]] | [[False, True], [True, False], [True, False], [True, False], [True, False], [True, False], [True, False], [False, False], [False, False], [False, True], [True, False], [True, False]] | Failed |
| regression: scenario 3 | [[False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True]] | [[False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [True, False]] | Failed |
SHA-256 / b70615e360e93627067369df83e2e1fbf909de7ebaccaf3b7d8b4e56b67bd056
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(min_scans, latched, scans):
in_alarm = False
acked = True
count = 0
out = []
for cond, ack, reset in scans:
count = count + 1 if cond else 0
if count >= min_scans - 1 and cond and not in_alarm:
in_alarm = True
acked = False
elif in_alarm and not cond and (not latched or reset):
in_alarm = False
if ack and not acked:
acked = True
out.append([in_alarm, acked])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: latched with ack and reset',
[2,
True,
[[True, False, False],
[True, False, False],
[False, False, False],
[False, True, False],
[False, False, True],
[True, False, False]]],
[[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
['regression: chattering condition',
[3,
False,
[[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False]]],
[[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
['regression: realarm after ack',
[1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
[[True, False], [True, True], [False, True], [True, False]]],
['regression: reset while condition true',
[1, False, [[True, False, False], [True, False, True], [True, False, False]]],
[[True, False], [True, False], [True, False]]],
['regression: ack on latched alarm',
[1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
[[True, False], [True, True], [True, True], [False, True]]],
['regression: scenario 1',
[1,
False,
[[True, False, False],
[False, False, False],
[True, False, False],
[False, False, False],
[True, True, False],
[True, False, False],
[True, False, False],
[False, False, False],
[False, False, False],
[True, False, False]]],
[[True, False],
[False, False],
[True, False],
[False, False],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, False]]],
['regression: scenario 2',
[1,
True,
[[False, False, False],
[True, False, False],
[True, False, False],
[False, False, False],
[False, False, False],
[True, False, False],
[False, False, False],
[False, False, True],
[False, False, False],
[False, True, False],
[True, False, False],
[False, False, False]]],
[[False, True],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[False, False],
[False, False],
[False, True],
[True, False],
[True, False]]],
['regression: scenario 3',
[3,
False,
[[True, False, False],
[True, False, True],
[False, False, False],
[False, False, False],
[False, False, True],
[True, False, False],
[True, True, False],
[False, True, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False]]],
[[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, False]]]],
[['regression: chattering condition',
[3,
False,
[[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False]]],
[[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
['regression: scenario 2',
[3,
False,
[[False, False, False],
[True, False, False],
[False, False, False],
[False, False, False],
[False, False, True],
[False, True, False],
[True, False, False],
[False, False, False],
[True, True, False],
[True, False, False],
[True, False, False]]],
[[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, False]]],
['regression: latched with ack and reset',
[2,
True,
[[True, False, False],
[True, False, False],
[False, False, False],
[False, True, False],
[False, False, True],
[True, False, False]]],
[[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
['regression: realarm after ack',
[1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
[[True, False], [True, True], [False, True], [True, False]]],
['regression: reset while condition true',
[1, False, [[True, False, False], [True, False, True], [True, False, False]]],
[[True, False], [True, False], [True, False]]],
['regression: ack on latched alarm',
[1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
[[True, False], [True, True], [True, True], [False, True]]],
['regression: scenario 1',
[1,
False,
[[False, False, False],
[False, False, True],
[False, False, False],
[True, True, False],
[False, False, False],
[True, True, False],
[True, False, False],
[True, False, False],
[True, False, False],
[False, False, True],
[True, False, False]]],
[[False, True],
[False, True],
[False, True],
[True, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[True, False]]],
['regression: scenario 3',
[2,
False,
[[True, False, False],
[True, False, True],
[False, True, True],
[False, False, False],
[False, False, True],
[True, False, False],
[True, False, False],
[True, True, False],
[True, False, False],
[True, False, True],
[False, False, False],
[False, False, False]]],
[[False, True],
[True, False],
[False, True],
[False, True],
[False, True],
[False, True],
[True, False],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True]]]],
[['regression: realarm after ack',
[1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
[[True, False], [True, True], [False, True], [True, False]]],
['regression: scenario 1',
[3,
False,
[[True, False, False],
[True, False, False],
[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False],
[False, False, True],
[False, False, True]]],
[[False, True],
[False, True],
[True, False],
[True, False],
[False, False],
[False, False],
[False, False],
[True, False],
[False, False],
[False, False]]],
['regression: latched with ack and reset',
[2,
True,
[[True, False, False],
[True, False, False],
[False, False, False],
[False, True, False],
[False, False, True],
[True, False, False]]],
[[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
['regression: chattering condition',
[3,
False,
[[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False]]],
[[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
['regression: reset while condition true',
[1, False, [[True, False, False], [True, False, True], [True, False, False]]],
[[True, False], [True, False], [True, False]]],
['regression: ack on latched alarm',
[1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
[[True, False], [True, True], [True, True], [False, True]]],
['regression: scenario 2',
[2,
True,
[[False, True, False],
[True, False, False],
[True, False, False],
[True, False, False],
[False, False, False],
[True, False, True],
[True, False, False],
[False, False, False],
[False, True, False],
[True, False, False],
[False, False, False],
[False, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, True, True]]],
[[False, True],
[False, True],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True]]],
['regression: scenario 3',
[3,
True,
[[True, False, False],
[True, False, False],
[True, False, False],
[True, False, False],
[True, False, True],
[True, False, False],
[False, False, False],
[True, False, False],
[False, True, False],
[False, False, False],
[False, False, False],
[True, False, False],
[False, False, False]]],
[[False, True],
[False, True],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True]]]],
[['regression: reset while condition true',
[1, False, [[True, False, False], [True, False, True], [True, False, False]]],
[[True, False], [True, False], [True, False]]],
['regression: scenario 2',
[2,
False,
[[False, True, False],
[True, False, False],
[True, True, False],
[True, False, False],
[False, False, False],
[True, False, False],
[False, False, False],
[False, False, False],
[True, False, False],
[True, True, False],
[True, False, True],
[False, False, False],
[True, False, True],
[True, True, False],
[True, False, False]]],
[[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True]]],
['regression: latched with ack and reset',
[2,
True,
[[True, False, False],
[True, False, False],
[False, False, False],
[False, True, False],
[False, False, True],
[True, False, False]]],
[[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
['regression: chattering condition',
[3,
False,
[[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False]]],
[[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
['regression: realarm after ack',
[1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
[[True, False], [True, True], [False, True], [True, False]]],
['regression: ack on latched alarm',
[1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
[[True, False], [True, True], [True, True], [False, True]]],
['regression: scenario 1',
[2,
True,
[[False, True, False],
[True, False, False],
[False, False, False],
[False, False, True],
[False, False, True],
[True, False, True],
[True, True, False],
[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, True, False],
[True, False, False]]],
[[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True]]],
['regression: scenario 3',
[1,
True,
[[False, False, False],
[False, False, False],
[False, False, True],
[False, False, False],
[True, False, False],
[False, False, False],
[True, False, True],
[True, False, False],
[True, True, False],
[True, False, True],
[True, False, True],
[True, True, True]]],
[[False, True],
[False, True],
[False, True],
[False, True],
[True, False],
[True, False],
[True, False],
[True, False],
[True, True],
[True, True],
[True, True],
[True, True]]]],
[['regression: ack on latched alarm',
[1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
[[True, False], [True, True], [True, True], [False, True]]],
['regression: scenario 4',
[3,
False,
[[True, False, False],
[True, False, True],
[True, False, True],
[True, False, True],
[False, False, False],
[True, False, True],
[False, False, False],
[False, False, False],
[False, False, False],
[False, False, True]]],
[[False, True],
[False, True],
[True, False],
[True, False],
[False, False],
[False, False],
[False, False],
[False, False],
[False, False],
[False, False]]],
['regression: latched with ack and reset',
[2,
True,
[[True, False, False],
[True, False, False],
[False, False, False],
[False, True, False],
[False, False, True],
[True, False, False]]],
[[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
['regression: chattering condition',
[3,
False,
[[True, False, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, False],
[True, False, False]]],
[[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
['regression: realarm after ack',
[1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
[[True, False], [True, True], [False, True], [True, False]]],
['regression: reset while condition true',
[1, False, [[True, False, False], [True, False, True], [True, False, False]]],
[[True, False], [True, False], [True, False]]],
['regression: scenario 1',
[2,
False,
[[False, False, False],
[True, True, False],
[True, True, False],
[False, False, True],
[False, False, True],
[True, True, False],
[True, False, False],
[False, False, False],
[True, False, False],
[True, False, True]]],
[[False, True],
[False, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, False],
[False, False],
[False, False],
[True, False]]],
['regression: scenario 2',
[2,
False,
[[False, True, False],
[True, True, True],
[False, False, False],
[False, True, True],
[True, False, False],
[False, False, False],
[True, False, True],
[False, False, False],
[True, False, False],
[False, True, False],
[False, True, False]]],
[[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True]]]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: latched with ack and reset | [[True, False], [True, False], [True, False], [True, True], [False, True], [True, False]] | [[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]] | Failed |
| regression: chattering condition | [[False, True], [True, False], [False, False], [False, False], [True, False], [True, False]] | [[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]] | Failed |
| regression: realarm after ack | [[True, False], [True, True], [False, True], [True, False]] | [[True, False], [True, True], [False, True], [True, False]] | Passed |
| regression: reset while condition true | [[True, False], [True, False], [True, False]] | [[True, False], [True, False], [True, False]] | Passed |
| regression: ack on latched alarm | [[True, False], [True, True], [True, True], [False, True]] | [[True, False], [True, True], [True, True], [False, True]] | Passed |
| regression: scenario 1 | [[True, False], [False, False], [True, False], [False, False], [True, True], [True, True], [True, True], [False, True], [False, True], [True, False]] | [[True, False], [False, False], [True, False], [False, False], [True, True], [True, True], [True, True], [False, True], [False, True], [True, False]] | Passed |
| regression: scenario 2 | [[False, True], [True, False], [True, False], [True, False], [True, False], [True, False], [True, False], [False, False], [False, False], [False, True], [True, False], [True, False]] | [[False, True], [True, False], [True, False], [True, False], [True, False], [True, False], [True, False], [False, False], [False, False], [False, True], [True, False], [True, False]] | Passed |
| regression: scenario 3 | [[False, True], [True, False], [False, False], [False, False], [False, False], [False, False], [True, True], [False, True], [False, True], [False, True], [True, False], [True, False]] | [[False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [True, False]] | Failed |
SHA-256 / 37936ab78458eb9096104972fc6b3ab08bc035d632d4f68fc183630b7e56f3cc
HELD IN THE MEMBER ARCHIVE
The verified repair and its recorded checks are member-only.
This mechanism has 8 recorded checks per implementation. The open-access tier publishes the failure and the unsuccessful fix; the repaired source that passes every check, and the observations that prove it, are available to members.
Every case sharing this mechanism uses the same contract and the same repair, so this one record is held back for all of them.
Member access is invitation-based. Sign in with your invited account to inspect the repair.
Sign in to the archive ↗Verification & scope
A deterministic bounded teaching model of one PLC instruction or rung pattern evaluated scan by scan. The stated contract is a stipulated toy convention, not a claim of conformance to any vendor controller or IEC 61131-3 runtime. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:51:43.357003+00:00.
Case digest / f6fdb9e6e7525afd5b3b0948f8476ff51e7e9eb257c63a67068e0e69836caef8