FA-91876 / PLC ladder logic scan cycles / Open access
TOF keeps stale delay time when its rung returns · case 01
An off-delay that is re-energized mid-delay then expires early on the next drop.
ROOT CAUSE
A true rung sets DN but does not clear the accumulator.
VERIFIED REPAIR
Clear the accumulator on every true-rung scan.
Unsuccessful approach: Clearing ACC only after a completed delay still carries partial delay time across a re-energization.
Case contract
Off-delay timer (TOF) evaluated once per scan; scans is a list of [rung_in, elapsed_ms]. At power-up the timer is expired (ACC = preset, DN false). A true rung clears ACC and sets DN. After the rung drops, ACC accumulates each later false scan's elapsed time (the true-to-false scan itself is not credited), clamped at preset, and DN clears when ACC >= preset. TT is DN and not rung_in. Return [DN, TT, ACC] 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(preset, scans):
acc = preset
dn = False
prev = False
out = []
for rung_in, dt in scans:
rung_in = bool(rung_in)
if rung_in:
dn = True
elif dn:
if not prev:
acc = min(preset, acc + dt)
if acc >= preset:
dn = False
tt = dn and not rung_in
prev = rung_in
out.append([dn, tt, acc])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: power-up with false rung',
[60, [[False, 20], [False, 20], [False, 20], [True, 10]]],
[[False, False, 60], [False, False, 60], [False, False, 60], [True, False, 0]]],
['regression: re-energized mid delay',
[100, [[True, 10], [False, 40], [False, 40], [True, 40], [False, 40], [False, 40], [False, 40]]],
[[True, False, 0],
[True, True, 0],
[True, True, 40],
[True, False, 0],
[True, True, 0],
[True, True, 40],
[True, True, 80]]],
['control: zero preset drop',
[0, [[True, 10], [False, 10], [False, 10]]],
[[True, False, 0], [False, False, 0], [False, False, 0]]],
['regression: exact expiry',
[60, [[True, 10], [False, 30], [False, 30], [False, 30], [False, 30]]],
[[True, False, 0], [True, True, 0], [True, True, 30], [False, False, 60], [False, False, 60]]],
['regression: scenario 1',
[60, [[False, 70], [True, 10], [True, 70], [True, 10], [False, 70], [False, 10], [True, 10], [False, 30]]],
[[False, False, 60],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, True, 10],
[True, False, 0],
[True, True, 0]]],
['regression: scenario 2',
[60, [[False, 30], [True, 50], [True, 20], [True, 30], [True, 70], [False, 50], [False, 50], [False, 70]]],
[[False, False, 60],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, True, 50],
[False, False, 60]]],
['regression: scenario 3',
[40,
[[True, 70],
[True, 0],
[False, 50],
[True, 30],
[False, 0],
[False, 50],
[False, 30],
[False, 50],
[False, 10],
[True, 20]]],
[[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, False, 0],
[True, True, 0],
[False, False, 40],
[False, False, 40],
[False, False, 40],
[False, False, 40],
[True, False, 0]]],
['regression: scenario 4',
[100,
[[False, 30],
[False, 70],
[True, 30],
[False, 30],
[False, 20],
[False, 50],
[False, 70],
[True, 50],
[True, 50],
[False, 20],
[False, 50]]],
[[False, False, 100],
[False, False, 100],
[True, False, 0],
[True, True, 0],
[True, True, 20],
[True, True, 70],
[False, False, 100],
[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, True, 50]]]],
[['regression: re-energized mid delay',
[100, [[True, 10], [False, 40], [False, 40], [True, 40], [False, 40], [False, 40], [False, 40]]],
[[True, False, 0],
[True, True, 0],
[True, True, 40],
[True, False, 0],
[True, True, 0],
[True, True, 40],
[True, True, 80]]],
['regression: scenario 5',
[40, [[False, 50], [False, 70], [True, 70], [False, 10], [False, 30], [True, 70]]],
[[False, False, 40],
[False, False, 40],
[True, False, 0],
[True, True, 0],
[True, True, 30],
[True, False, 0]]],
['regression: power-up with false rung',
[60, [[False, 20], [False, 20], [False, 20], [True, 10]]],
[[False, False, 60], [False, False, 60], [False, False, 60], [True, False, 0]]],
['control: zero preset drop',
[0, [[True, 10], [False, 10], [False, 10]]],
[[True, False, 0], [False, False, 0], [False, False, 0]]],
['regression: exact expiry',
[60, [[True, 10], [False, 30], [False, 30], [False, 30], [False, 30]]],
[[True, False, 0], [True, True, 0], [True, True, 30], [False, False, 60], [False, False, 60]]],
['control: scenario 1',
[0, [[False, 30], [True, 20], [True, 30], [False, 50], [True, 0], [True, 50], [True, 50]]],
[[False, False, 0],
[True, False, 0],
[True, False, 0],
[False, False, 0],
[True, False, 0],
[True, False, 0],
[True, False, 0]]],
['control: scenario 2',
[0, [[False, 10], [True, 0], [True, 70], [False, 0], [True, 70], [False, 20], [False, 10]]],
[[False, False, 0],
[True, False, 0],
[True, False, 0],
[False, False, 0],
[True, False, 0],
[False, False, 0],
[False, False, 0]]],
['regression: scenario 3',
[150,
[[False, 50],
[False, 10],
[False, 0],
[False, 50],
[True, 50],
[False, 70],
[False, 10],
[True, 70],
[False, 50],
[False, 70],
[False, 20],
[True, 50],
[False, 0],
[True, 30]]],
[[False, False, 150],
[False, False, 150],
[False, False, 150],
[False, False, 150],
[True, False, 0],
[True, True, 0],
[True, True, 10],
[True, False, 0],
[True, True, 0],
[True, True, 70],
[True, True, 90],
[True, False, 0],
[True, True, 0],
[True, False, 0]]]],
[['regression: exact expiry',
[60, [[True, 10], [False, 30], [False, 30], [False, 30], [False, 30]]],
[[True, False, 0], [True, True, 0], [True, True, 30], [False, False, 60], [False, False, 60]]],
['regression: scenario 14',
[60,
[[False, 70],
[False, 0],
[True, 0],
[True, 30],
[False, 10],
[False, 20],
[False, 20],
[False, 10],
[True, 0],
[False, 50],
[False, 0],
[False, 20]]],
[[False, False, 60],
[False, False, 60],
[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, True, 20],
[True, True, 40],
[True, True, 50],
[True, False, 0],
[True, True, 0],
[True, True, 0],
[True, True, 20]]],
['regression: power-up with false rung',
[60, [[False, 20], [False, 20], [False, 20], [True, 10]]],
[[False, False, 60], [False, False, 60], [False, False, 60], [True, False, 0]]],
['regression: re-energized mid delay',
[100, [[True, 10], [False, 40], [False, 40], [True, 40], [False, 40], [False, 40], [False, 40]]],
[[True, False, 0],
[True, True, 0],
[True, True, 40],
[True, False, 0],
[True, True, 0],
[True, True, 40],
[True, True, 80]]],
['control: zero preset drop',
[0, [[True, 10], [False, 10], [False, 10]]],
[[True, False, 0], [False, False, 0], [False, False, 0]]],
['control: scenario 1',
[0,
[[False, 50],
[True, 10],
[False, 0],
[True, 20],
[False, 70],
[False, 50],
[True, 70],
[False, 10],
[False, 10],
[False, 20],
[True, 70]]],
[[False, False, 0],
[True, False, 0],
[False, False, 0],
[True, False, 0],
[False, False, 0],
[False, False, 0],
[True, False, 0],
[False, False, 0],
[False, False, 0],
[False, False, 0],
[True, False, 0]]],
['control: scenario 2',
[0,
[[False, 30],
[True, 50],
[False, 50],
[True, 0],
[True, 10],
[True, 10],
[False, 10],
[False, 50],
[False, 10]]],
[[False, False, 0],
[True, False, 0],
[False, False, 0],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[False, False, 0],
[False, False, 0],
[False, False, 0]]],
['control: scenario 3',
[0,
[[False, 10],
[False, 10],
[False, 70],
[False, 30],
[True, 50],
[False, 10],
[False, 0],
[True, 20],
[False, 70],
[True, 10],
[False, 70],
[True, 20],
[False, 70],
[True, 0]]],
[[False, False, 0],
[False, False, 0],
[False, False, 0],
[False, False, 0],
[True, False, 0],
[False, False, 0],
[False, False, 0],
[True, False, 0],
[False, False, 0],
[True, False, 0],
[False, False, 0],
[True, False, 0],
[False, False, 0],
[True, False, 0]]]],
[['regression: scenario 1',
[40, [[True, 70], [True, 20], [True, 20], [False, 30], [False, 30], [False, 0], [False, 70], [False, 20]]],
[[True, False, 0],
[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, True, 30],
[True, True, 30],
[False, False, 40],
[False, False, 40]]],
['regression: scenario 9',
[150,
[[True, 10],
[True, 70],
[True, 50],
[False, 50],
[False, 20],
[False, 50],
[True, 50],
[True, 0],
[True, 70],
[False, 30],
[True, 0],
[False, 20],
[False, 10]]],
[[True, False, 0],
[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, True, 20],
[True, True, 70],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, False, 0],
[True, True, 0],
[True, True, 10]]],
['regression: power-up with false rung',
[60, [[False, 20], [False, 20], [False, 20], [True, 10]]],
[[False, False, 60], [False, False, 60], [False, False, 60], [True, False, 0]]],
['regression: re-energized mid delay',
[100, [[True, 10], [False, 40], [False, 40], [True, 40], [False, 40], [False, 40], [False, 40]]],
[[True, False, 0],
[True, True, 0],
[True, True, 40],
[True, False, 0],
[True, True, 0],
[True, True, 40],
[True, True, 80]]],
['control: zero preset drop',
[0, [[True, 10], [False, 10], [False, 10]]],
[[True, False, 0], [False, False, 0], [False, False, 0]]],
['regression: exact expiry',
[60, [[True, 10], [False, 30], [False, 30], [False, 30], [False, 30]]],
[[True, False, 0], [True, True, 0], [True, True, 30], [False, False, 60], [False, False, 60]]],
['regression: scenario 2',
[100,
[[False, 30],
[False, 20],
[True, 20],
[True, 10],
[True, 70],
[False, 20],
[False, 10],
[True, 20],
[False, 0],
[True, 0],
[True, 0]]],
[[False, False, 100],
[False, False, 100],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, True, 10],
[True, False, 0],
[True, True, 0],
[True, False, 0],
[True, False, 0]]],
['regression: scenario 3',
[60, [[False, 70], [True, 30], [True, 0], [True, 50], [True, 30], [True, 70], [True, 0]]],
[[False, False, 60],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[True, False, 0]]]],
[['regression: scenario 2',
[40,
[[False, 70],
[True, 70],
[False, 50],
[True, 70],
[False, 10],
[False, 30],
[True, 0],
[True, 50],
[False, 0],
[False, 30]]],
[[False, False, 40],
[True, False, 0],
[True, True, 0],
[True, False, 0],
[True, True, 0],
[True, True, 30],
[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, True, 30]]],
['regression: scenario 10',
[150,
[[False, 30],
[True, 70],
[False, 20],
[False, 30],
[False, 20],
[False, 10],
[False, 20],
[False, 30],
[True, 70],
[True, 10],
[False, 70],
[False, 20]]],
[[False, False, 150],
[True, False, 0],
[True, True, 0],
[True, True, 30],
[True, True, 50],
[True, True, 60],
[True, True, 80],
[True, True, 110],
[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, True, 20]]],
['regression: power-up with false rung',
[60, [[False, 20], [False, 20], [False, 20], [True, 10]]],
[[False, False, 60], [False, False, 60], [False, False, 60], [True, False, 0]]],
['regression: re-energized mid delay',
[100, [[True, 10], [False, 40], [False, 40], [True, 40], [False, 40], [False, 40], [False, 40]]],
[[True, False, 0],
[True, True, 0],
[True, True, 40],
[True, False, 0],
[True, True, 0],
[True, True, 40],
[True, True, 80]]],
['control: zero preset drop',
[0, [[True, 10], [False, 10], [False, 10]]],
[[True, False, 0], [False, False, 0], [False, False, 0]]],
['regression: exact expiry',
[60, [[True, 10], [False, 30], [False, 30], [False, 30], [False, 30]]],
[[True, False, 0], [True, True, 0], [True, True, 30], [False, False, 60], [False, False, 60]]],
['regression: scenario 1',
[40,
[[True, 70], [True, 20], [False, 50], [False, 20], [False, 50], [False, 50], [False, 50], [False, 0]]],
[[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, True, 20],
[False, False, 40],
[False, False, 40],
[False, False, 40],
[False, False, 40]]],
['control: scenario 3',
[0,
[[False, 50],
[False, 50],
[False, 20],
[False, 20],
[True, 10],
[True, 50],
[True, 20],
[False, 70],
[False, 30],
[False, 10],
[True, 10],
[True, 70],
[True, 10],
[False, 50]]],
[[False, False, 0],
[False, False, 0],
[False, False, 0],
[False, False, 0],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[False, False, 0],
[False, False, 0],
[False, False, 0],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[False, False, 0]]]]]
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: power-up with false rung | [[False, False, 60], [False, False, 60], [False, False, 60], [True, False, 60]] | [[False, False, 60], [False, False, 60], [False, False, 60], [True, False, 0]] | Failed |
| regression: re-energized mid delay | [[True, False, 100], [False, False, 100], [False, False, 100], [True, False, 100], [False, False, 100], [False, False, 100], [False, False, 100]] | [[True, False, 0], [True, True, 0], [True, True, 40], [True, False, 0], [True, True, 0], [True, True, 40], [True, True, 80]] | Failed |
| control: zero preset drop | [[True, False, 0], [False, False, 0], [False, False, 0]] | [[True, False, 0], [False, False, 0], [False, False, 0]] | Passed |
| regression: exact expiry | [[True, False, 60], [False, False, 60], [False, False, 60], [False, False, 60], [False, False, 60]] | [[True, False, 0], [True, True, 0], [True, True, 30], [False, False, 60], [False, False, 60]] | Failed |
| regression: scenario 1 | [[False, False, 60], [True, False, 60], [True, False, 60], [True, False, 60], [False, False, 60], [False, False, 60], [True, False, 60], [False, False, 60]] | [[False, False, 60], [True, False, 0], [True, False, 0], [True, False, 0], [True, True, 0], [True, True, 10], [True, False, 0], [True, True, 0]] | Failed |
| regression: scenario 2 | [[False, False, 60], [True, False, 60], [True, False, 60], [True, False, 60], [True, False, 60], [False, False, 60], [False, False, 60], [False, False, 60]] | [[False, False, 60], [True, False, 0], [True, False, 0], [True, False, 0], [True, False, 0], [True, True, 0], [True, True, 50], [False, False, 60]] | Failed |
| regression: scenario 3 | [[True, False, 40], [True, False, 40], [False, False, 40], [True, False, 40], [False, False, 40], [False, False, 40], [False, False, 40], [False, False, 40], [False, False, 40], [True, False, 40]] | [[True, False, 0], [True, False, 0], [True, True, 0], [True, False, 0], [True, True, 0], [False, False, 40], [False, False, 40], [False, False, 40], [False, False, 40], [True, False, 0]] | Failed |
| regression: scenario 4 | [[False, False, 100], [False, False, 100], [True, False, 100], [False, False, 100], [False, False, 100], [False, False, 100], [False, False, 100], [True, False, 100], [True, False, 100], [False, False, 100], [False, False, 100]] | [[False, False, 100], [False, False, 100], [True, False, 0], [True, True, 0], [True, True, 20], [True, True, 70], [False, False, 100], [True, False, 0], [True, False, 0], [True, True, 0], [True, True, 50]] | Failed |
SHA-256 / 2f1d68426989b3f6fa1b2526f33029bd649f025efe6eead81508832752e38b4d
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(preset, scans):
acc = preset
dn = False
prev = False
out = []
for rung_in, dt in scans:
rung_in = bool(rung_in)
if rung_in:
if acc >= preset:
acc = 0
dn = True
elif dn:
if not prev:
acc = min(preset, acc + dt)
if acc >= preset:
dn = False
tt = dn and not rung_in
prev = rung_in
out.append([dn, tt, acc])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: power-up with false rung',
[60, [[False, 20], [False, 20], [False, 20], [True, 10]]],
[[False, False, 60], [False, False, 60], [False, False, 60], [True, False, 0]]],
['regression: re-energized mid delay',
[100, [[True, 10], [False, 40], [False, 40], [True, 40], [False, 40], [False, 40], [False, 40]]],
[[True, False, 0],
[True, True, 0],
[True, True, 40],
[True, False, 0],
[True, True, 0],
[True, True, 40],
[True, True, 80]]],
['control: zero preset drop',
[0, [[True, 10], [False, 10], [False, 10]]],
[[True, False, 0], [False, False, 0], [False, False, 0]]],
['regression: exact expiry',
[60, [[True, 10], [False, 30], [False, 30], [False, 30], [False, 30]]],
[[True, False, 0], [True, True, 0], [True, True, 30], [False, False, 60], [False, False, 60]]],
['regression: scenario 1',
[60, [[False, 70], [True, 10], [True, 70], [True, 10], [False, 70], [False, 10], [True, 10], [False, 30]]],
[[False, False, 60],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, True, 10],
[True, False, 0],
[True, True, 0]]],
['regression: scenario 2',
[60, [[False, 30], [True, 50], [True, 20], [True, 30], [True, 70], [False, 50], [False, 50], [False, 70]]],
[[False, False, 60],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, True, 50],
[False, False, 60]]],
['regression: scenario 3',
[40,
[[True, 70],
[True, 0],
[False, 50],
[True, 30],
[False, 0],
[False, 50],
[False, 30],
[False, 50],
[False, 10],
[True, 20]]],
[[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, False, 0],
[True, True, 0],
[False, False, 40],
[False, False, 40],
[False, False, 40],
[False, False, 40],
[True, False, 0]]],
['regression: scenario 4',
[100,
[[False, 30],
[False, 70],
[True, 30],
[False, 30],
[False, 20],
[False, 50],
[False, 70],
[True, 50],
[True, 50],
[False, 20],
[False, 50]]],
[[False, False, 100],
[False, False, 100],
[True, False, 0],
[True, True, 0],
[True, True, 20],
[True, True, 70],
[False, False, 100],
[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, True, 50]]]],
[['regression: re-energized mid delay',
[100, [[True, 10], [False, 40], [False, 40], [True, 40], [False, 40], [False, 40], [False, 40]]],
[[True, False, 0],
[True, True, 0],
[True, True, 40],
[True, False, 0],
[True, True, 0],
[True, True, 40],
[True, True, 80]]],
['regression: scenario 5',
[40, [[False, 50], [False, 70], [True, 70], [False, 10], [False, 30], [True, 70]]],
[[False, False, 40],
[False, False, 40],
[True, False, 0],
[True, True, 0],
[True, True, 30],
[True, False, 0]]],
['regression: power-up with false rung',
[60, [[False, 20], [False, 20], [False, 20], [True, 10]]],
[[False, False, 60], [False, False, 60], [False, False, 60], [True, False, 0]]],
['control: zero preset drop',
[0, [[True, 10], [False, 10], [False, 10]]],
[[True, False, 0], [False, False, 0], [False, False, 0]]],
['regression: exact expiry',
[60, [[True, 10], [False, 30], [False, 30], [False, 30], [False, 30]]],
[[True, False, 0], [True, True, 0], [True, True, 30], [False, False, 60], [False, False, 60]]],
['control: scenario 1',
[0, [[False, 30], [True, 20], [True, 30], [False, 50], [True, 0], [True, 50], [True, 50]]],
[[False, False, 0],
[True, False, 0],
[True, False, 0],
[False, False, 0],
[True, False, 0],
[True, False, 0],
[True, False, 0]]],
['control: scenario 2',
[0, [[False, 10], [True, 0], [True, 70], [False, 0], [True, 70], [False, 20], [False, 10]]],
[[False, False, 0],
[True, False, 0],
[True, False, 0],
[False, False, 0],
[True, False, 0],
[False, False, 0],
[False, False, 0]]],
['regression: scenario 3',
[150,
[[False, 50],
[False, 10],
[False, 0],
[False, 50],
[True, 50],
[False, 70],
[False, 10],
[True, 70],
[False, 50],
[False, 70],
[False, 20],
[True, 50],
[False, 0],
[True, 30]]],
[[False, False, 150],
[False, False, 150],
[False, False, 150],
[False, False, 150],
[True, False, 0],
[True, True, 0],
[True, True, 10],
[True, False, 0],
[True, True, 0],
[True, True, 70],
[True, True, 90],
[True, False, 0],
[True, True, 0],
[True, False, 0]]]],
[['regression: exact expiry',
[60, [[True, 10], [False, 30], [False, 30], [False, 30], [False, 30]]],
[[True, False, 0], [True, True, 0], [True, True, 30], [False, False, 60], [False, False, 60]]],
['regression: scenario 14',
[60,
[[False, 70],
[False, 0],
[True, 0],
[True, 30],
[False, 10],
[False, 20],
[False, 20],
[False, 10],
[True, 0],
[False, 50],
[False, 0],
[False, 20]]],
[[False, False, 60],
[False, False, 60],
[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, True, 20],
[True, True, 40],
[True, True, 50],
[True, False, 0],
[True, True, 0],
[True, True, 0],
[True, True, 20]]],
['regression: power-up with false rung',
[60, [[False, 20], [False, 20], [False, 20], [True, 10]]],
[[False, False, 60], [False, False, 60], [False, False, 60], [True, False, 0]]],
['regression: re-energized mid delay',
[100, [[True, 10], [False, 40], [False, 40], [True, 40], [False, 40], [False, 40], [False, 40]]],
[[True, False, 0],
[True, True, 0],
[True, True, 40],
[True, False, 0],
[True, True, 0],
[True, True, 40],
[True, True, 80]]],
['control: zero preset drop',
[0, [[True, 10], [False, 10], [False, 10]]],
[[True, False, 0], [False, False, 0], [False, False, 0]]],
['control: scenario 1',
[0,
[[False, 50],
[True, 10],
[False, 0],
[True, 20],
[False, 70],
[False, 50],
[True, 70],
[False, 10],
[False, 10],
[False, 20],
[True, 70]]],
[[False, False, 0],
[True, False, 0],
[False, False, 0],
[True, False, 0],
[False, False, 0],
[False, False, 0],
[True, False, 0],
[False, False, 0],
[False, False, 0],
[False, False, 0],
[True, False, 0]]],
['control: scenario 2',
[0,
[[False, 30],
[True, 50],
[False, 50],
[True, 0],
[True, 10],
[True, 10],
[False, 10],
[False, 50],
[False, 10]]],
[[False, False, 0],
[True, False, 0],
[False, False, 0],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[False, False, 0],
[False, False, 0],
[False, False, 0]]],
['control: scenario 3',
[0,
[[False, 10],
[False, 10],
[False, 70],
[False, 30],
[True, 50],
[False, 10],
[False, 0],
[True, 20],
[False, 70],
[True, 10],
[False, 70],
[True, 20],
[False, 70],
[True, 0]]],
[[False, False, 0],
[False, False, 0],
[False, False, 0],
[False, False, 0],
[True, False, 0],
[False, False, 0],
[False, False, 0],
[True, False, 0],
[False, False, 0],
[True, False, 0],
[False, False, 0],
[True, False, 0],
[False, False, 0],
[True, False, 0]]]],
[['regression: scenario 1',
[40, [[True, 70], [True, 20], [True, 20], [False, 30], [False, 30], [False, 0], [False, 70], [False, 20]]],
[[True, False, 0],
[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, True, 30],
[True, True, 30],
[False, False, 40],
[False, False, 40]]],
['regression: scenario 9',
[150,
[[True, 10],
[True, 70],
[True, 50],
[False, 50],
[False, 20],
[False, 50],
[True, 50],
[True, 0],
[True, 70],
[False, 30],
[True, 0],
[False, 20],
[False, 10]]],
[[True, False, 0],
[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, True, 20],
[True, True, 70],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, False, 0],
[True, True, 0],
[True, True, 10]]],
['regression: power-up with false rung',
[60, [[False, 20], [False, 20], [False, 20], [True, 10]]],
[[False, False, 60], [False, False, 60], [False, False, 60], [True, False, 0]]],
['regression: re-energized mid delay',
[100, [[True, 10], [False, 40], [False, 40], [True, 40], [False, 40], [False, 40], [False, 40]]],
[[True, False, 0],
[True, True, 0],
[True, True, 40],
[True, False, 0],
[True, True, 0],
[True, True, 40],
[True, True, 80]]],
['control: zero preset drop',
[0, [[True, 10], [False, 10], [False, 10]]],
[[True, False, 0], [False, False, 0], [False, False, 0]]],
['regression: exact expiry',
[60, [[True, 10], [False, 30], [False, 30], [False, 30], [False, 30]]],
[[True, False, 0], [True, True, 0], [True, True, 30], [False, False, 60], [False, False, 60]]],
['regression: scenario 2',
[100,
[[False, 30],
[False, 20],
[True, 20],
[True, 10],
[True, 70],
[False, 20],
[False, 10],
[True, 20],
[False, 0],
[True, 0],
[True, 0]]],
[[False, False, 100],
[False, False, 100],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, True, 10],
[True, False, 0],
[True, True, 0],
[True, False, 0],
[True, False, 0]]],
['regression: scenario 3',
[60, [[False, 70], [True, 30], [True, 0], [True, 50], [True, 30], [True, 70], [True, 0]]],
[[False, False, 60],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[True, False, 0]]]],
[['regression: scenario 2',
[40,
[[False, 70],
[True, 70],
[False, 50],
[True, 70],
[False, 10],
[False, 30],
[True, 0],
[True, 50],
[False, 0],
[False, 30]]],
[[False, False, 40],
[True, False, 0],
[True, True, 0],
[True, False, 0],
[True, True, 0],
[True, True, 30],
[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, True, 30]]],
['regression: scenario 10',
[150,
[[False, 30],
[True, 70],
[False, 20],
[False, 30],
[False, 20],
[False, 10],
[False, 20],
[False, 30],
[True, 70],
[True, 10],
[False, 70],
[False, 20]]],
[[False, False, 150],
[True, False, 0],
[True, True, 0],
[True, True, 30],
[True, True, 50],
[True, True, 60],
[True, True, 80],
[True, True, 110],
[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, True, 20]]],
['regression: power-up with false rung',
[60, [[False, 20], [False, 20], [False, 20], [True, 10]]],
[[False, False, 60], [False, False, 60], [False, False, 60], [True, False, 0]]],
['regression: re-energized mid delay',
[100, [[True, 10], [False, 40], [False, 40], [True, 40], [False, 40], [False, 40], [False, 40]]],
[[True, False, 0],
[True, True, 0],
[True, True, 40],
[True, False, 0],
[True, True, 0],
[True, True, 40],
[True, True, 80]]],
['control: zero preset drop',
[0, [[True, 10], [False, 10], [False, 10]]],
[[True, False, 0], [False, False, 0], [False, False, 0]]],
['regression: exact expiry',
[60, [[True, 10], [False, 30], [False, 30], [False, 30], [False, 30]]],
[[True, False, 0], [True, True, 0], [True, True, 30], [False, False, 60], [False, False, 60]]],
['regression: scenario 1',
[40,
[[True, 70], [True, 20], [False, 50], [False, 20], [False, 50], [False, 50], [False, 50], [False, 0]]],
[[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, True, 20],
[False, False, 40],
[False, False, 40],
[False, False, 40],
[False, False, 40]]],
['control: scenario 3',
[0,
[[False, 50],
[False, 50],
[False, 20],
[False, 20],
[True, 10],
[True, 50],
[True, 20],
[False, 70],
[False, 30],
[False, 10],
[True, 10],
[True, 70],
[True, 10],
[False, 50]]],
[[False, False, 0],
[False, False, 0],
[False, False, 0],
[False, False, 0],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[False, False, 0],
[False, False, 0],
[False, False, 0],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[False, False, 0]]]]]
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: power-up with false rung | [[False, False, 60], [False, False, 60], [False, False, 60], [True, False, 0]] | [[False, False, 60], [False, False, 60], [False, False, 60], [True, False, 0]] | Passed |
| regression: re-energized mid delay | [[True, False, 0], [True, True, 0], [True, True, 40], [True, False, 40], [True, True, 40], [True, True, 80], [False, False, 100]] | [[True, False, 0], [True, True, 0], [True, True, 40], [True, False, 0], [True, True, 0], [True, True, 40], [True, True, 80]] | Failed |
| control: zero preset drop | [[True, False, 0], [False, False, 0], [False, False, 0]] | [[True, False, 0], [False, False, 0], [False, False, 0]] | Passed |
| regression: exact expiry | [[True, False, 0], [True, True, 0], [True, True, 30], [False, False, 60], [False, False, 60]] | [[True, False, 0], [True, True, 0], [True, True, 30], [False, False, 60], [False, False, 60]] | Passed |
| regression: scenario 1 | [[False, False, 60], [True, False, 0], [True, False, 0], [True, False, 0], [True, True, 0], [True, True, 10], [True, False, 10], [True, True, 10]] | [[False, False, 60], [True, False, 0], [True, False, 0], [True, False, 0], [True, True, 0], [True, True, 10], [True, False, 0], [True, True, 0]] | Failed |
| regression: scenario 2 | [[False, False, 60], [True, False, 0], [True, False, 0], [True, False, 0], [True, False, 0], [True, True, 0], [True, True, 50], [False, False, 60]] | [[False, False, 60], [True, False, 0], [True, False, 0], [True, False, 0], [True, False, 0], [True, True, 0], [True, True, 50], [False, False, 60]] | Passed |
| regression: scenario 3 | [[True, False, 0], [True, False, 0], [True, True, 0], [True, False, 0], [True, True, 0], [False, False, 40], [False, False, 40], [False, False, 40], [False, False, 40], [True, False, 0]] | [[True, False, 0], [True, False, 0], [True, True, 0], [True, False, 0], [True, True, 0], [False, False, 40], [False, False, 40], [False, False, 40], [False, False, 40], [True, False, 0]] | Passed |
| regression: scenario 4 | [[False, False, 100], [False, False, 100], [True, False, 0], [True, True, 0], [True, True, 20], [True, True, 70], [False, False, 100], [True, False, 0], [True, False, 0], [True, True, 0], [True, True, 50]] | [[False, False, 100], [False, False, 100], [True, False, 0], [True, True, 0], [True, True, 20], [True, True, 70], [False, False, 100], [True, False, 0], [True, False, 0], [True, True, 0], [True, True, 50]] | Passed |
SHA-256 / d28f5b488ca3799dfc00c92607234b82ac4b734a446211f356ffb73600253c37
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(preset, scans):
acc = preset
dn = False
prev = False
out = []
for rung_in, dt in scans:
rung_in = bool(rung_in)
if rung_in:
acc = 0
dn = True
elif dn:
if not prev:
acc = min(preset, acc + dt)
if acc >= preset:
dn = False
tt = dn and not rung_in
prev = rung_in
out.append([dn, tt, acc])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: power-up with false rung',
[60, [[False, 20], [False, 20], [False, 20], [True, 10]]],
[[False, False, 60], [False, False, 60], [False, False, 60], [True, False, 0]]],
['regression: re-energized mid delay',
[100, [[True, 10], [False, 40], [False, 40], [True, 40], [False, 40], [False, 40], [False, 40]]],
[[True, False, 0],
[True, True, 0],
[True, True, 40],
[True, False, 0],
[True, True, 0],
[True, True, 40],
[True, True, 80]]],
['control: zero preset drop',
[0, [[True, 10], [False, 10], [False, 10]]],
[[True, False, 0], [False, False, 0], [False, False, 0]]],
['regression: exact expiry',
[60, [[True, 10], [False, 30], [False, 30], [False, 30], [False, 30]]],
[[True, False, 0], [True, True, 0], [True, True, 30], [False, False, 60], [False, False, 60]]],
['regression: scenario 1',
[60, [[False, 70], [True, 10], [True, 70], [True, 10], [False, 70], [False, 10], [True, 10], [False, 30]]],
[[False, False, 60],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, True, 10],
[True, False, 0],
[True, True, 0]]],
['regression: scenario 2',
[60, [[False, 30], [True, 50], [True, 20], [True, 30], [True, 70], [False, 50], [False, 50], [False, 70]]],
[[False, False, 60],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, True, 50],
[False, False, 60]]],
['regression: scenario 3',
[40,
[[True, 70],
[True, 0],
[False, 50],
[True, 30],
[False, 0],
[False, 50],
[False, 30],
[False, 50],
[False, 10],
[True, 20]]],
[[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, False, 0],
[True, True, 0],
[False, False, 40],
[False, False, 40],
[False, False, 40],
[False, False, 40],
[True, False, 0]]],
['regression: scenario 4',
[100,
[[False, 30],
[False, 70],
[True, 30],
[False, 30],
[False, 20],
[False, 50],
[False, 70],
[True, 50],
[True, 50],
[False, 20],
[False, 50]]],
[[False, False, 100],
[False, False, 100],
[True, False, 0],
[True, True, 0],
[True, True, 20],
[True, True, 70],
[False, False, 100],
[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, True, 50]]]],
[['regression: re-energized mid delay',
[100, [[True, 10], [False, 40], [False, 40], [True, 40], [False, 40], [False, 40], [False, 40]]],
[[True, False, 0],
[True, True, 0],
[True, True, 40],
[True, False, 0],
[True, True, 0],
[True, True, 40],
[True, True, 80]]],
['regression: scenario 5',
[40, [[False, 50], [False, 70], [True, 70], [False, 10], [False, 30], [True, 70]]],
[[False, False, 40],
[False, False, 40],
[True, False, 0],
[True, True, 0],
[True, True, 30],
[True, False, 0]]],
['regression: power-up with false rung',
[60, [[False, 20], [False, 20], [False, 20], [True, 10]]],
[[False, False, 60], [False, False, 60], [False, False, 60], [True, False, 0]]],
['control: zero preset drop',
[0, [[True, 10], [False, 10], [False, 10]]],
[[True, False, 0], [False, False, 0], [False, False, 0]]],
['regression: exact expiry',
[60, [[True, 10], [False, 30], [False, 30], [False, 30], [False, 30]]],
[[True, False, 0], [True, True, 0], [True, True, 30], [False, False, 60], [False, False, 60]]],
['control: scenario 1',
[0, [[False, 30], [True, 20], [True, 30], [False, 50], [True, 0], [True, 50], [True, 50]]],
[[False, False, 0],
[True, False, 0],
[True, False, 0],
[False, False, 0],
[True, False, 0],
[True, False, 0],
[True, False, 0]]],
['control: scenario 2',
[0, [[False, 10], [True, 0], [True, 70], [False, 0], [True, 70], [False, 20], [False, 10]]],
[[False, False, 0],
[True, False, 0],
[True, False, 0],
[False, False, 0],
[True, False, 0],
[False, False, 0],
[False, False, 0]]],
['regression: scenario 3',
[150,
[[False, 50],
[False, 10],
[False, 0],
[False, 50],
[True, 50],
[False, 70],
[False, 10],
[True, 70],
[False, 50],
[False, 70],
[False, 20],
[True, 50],
[False, 0],
[True, 30]]],
[[False, False, 150],
[False, False, 150],
[False, False, 150],
[False, False, 150],
[True, False, 0],
[True, True, 0],
[True, True, 10],
[True, False, 0],
[True, True, 0],
[True, True, 70],
[True, True, 90],
[True, False, 0],
[True, True, 0],
[True, False, 0]]]],
[['regression: exact expiry',
[60, [[True, 10], [False, 30], [False, 30], [False, 30], [False, 30]]],
[[True, False, 0], [True, True, 0], [True, True, 30], [False, False, 60], [False, False, 60]]],
['regression: scenario 14',
[60,
[[False, 70],
[False, 0],
[True, 0],
[True, 30],
[False, 10],
[False, 20],
[False, 20],
[False, 10],
[True, 0],
[False, 50],
[False, 0],
[False, 20]]],
[[False, False, 60],
[False, False, 60],
[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, True, 20],
[True, True, 40],
[True, True, 50],
[True, False, 0],
[True, True, 0],
[True, True, 0],
[True, True, 20]]],
['regression: power-up with false rung',
[60, [[False, 20], [False, 20], [False, 20], [True, 10]]],
[[False, False, 60], [False, False, 60], [False, False, 60], [True, False, 0]]],
['regression: re-energized mid delay',
[100, [[True, 10], [False, 40], [False, 40], [True, 40], [False, 40], [False, 40], [False, 40]]],
[[True, False, 0],
[True, True, 0],
[True, True, 40],
[True, False, 0],
[True, True, 0],
[True, True, 40],
[True, True, 80]]],
['control: zero preset drop',
[0, [[True, 10], [False, 10], [False, 10]]],
[[True, False, 0], [False, False, 0], [False, False, 0]]],
['control: scenario 1',
[0,
[[False, 50],
[True, 10],
[False, 0],
[True, 20],
[False, 70],
[False, 50],
[True, 70],
[False, 10],
[False, 10],
[False, 20],
[True, 70]]],
[[False, False, 0],
[True, False, 0],
[False, False, 0],
[True, False, 0],
[False, False, 0],
[False, False, 0],
[True, False, 0],
[False, False, 0],
[False, False, 0],
[False, False, 0],
[True, False, 0]]],
['control: scenario 2',
[0,
[[False, 30],
[True, 50],
[False, 50],
[True, 0],
[True, 10],
[True, 10],
[False, 10],
[False, 50],
[False, 10]]],
[[False, False, 0],
[True, False, 0],
[False, False, 0],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[False, False, 0],
[False, False, 0],
[False, False, 0]]],
['control: scenario 3',
[0,
[[False, 10],
[False, 10],
[False, 70],
[False, 30],
[True, 50],
[False, 10],
[False, 0],
[True, 20],
[False, 70],
[True, 10],
[False, 70],
[True, 20],
[False, 70],
[True, 0]]],
[[False, False, 0],
[False, False, 0],
[False, False, 0],
[False, False, 0],
[True, False, 0],
[False, False, 0],
[False, False, 0],
[True, False, 0],
[False, False, 0],
[True, False, 0],
[False, False, 0],
[True, False, 0],
[False, False, 0],
[True, False, 0]]]],
[['regression: scenario 1',
[40, [[True, 70], [True, 20], [True, 20], [False, 30], [False, 30], [False, 0], [False, 70], [False, 20]]],
[[True, False, 0],
[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, True, 30],
[True, True, 30],
[False, False, 40],
[False, False, 40]]],
['regression: scenario 9',
[150,
[[True, 10],
[True, 70],
[True, 50],
[False, 50],
[False, 20],
[False, 50],
[True, 50],
[True, 0],
[True, 70],
[False, 30],
[True, 0],
[False, 20],
[False, 10]]],
[[True, False, 0],
[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, True, 20],
[True, True, 70],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, False, 0],
[True, True, 0],
[True, True, 10]]],
['regression: power-up with false rung',
[60, [[False, 20], [False, 20], [False, 20], [True, 10]]],
[[False, False, 60], [False, False, 60], [False, False, 60], [True, False, 0]]],
['regression: re-energized mid delay',
[100, [[True, 10], [False, 40], [False, 40], [True, 40], [False, 40], [False, 40], [False, 40]]],
[[True, False, 0],
[True, True, 0],
[True, True, 40],
[True, False, 0],
[True, True, 0],
[True, True, 40],
[True, True, 80]]],
['control: zero preset drop',
[0, [[True, 10], [False, 10], [False, 10]]],
[[True, False, 0], [False, False, 0], [False, False, 0]]],
['regression: exact expiry',
[60, [[True, 10], [False, 30], [False, 30], [False, 30], [False, 30]]],
[[True, False, 0], [True, True, 0], [True, True, 30], [False, False, 60], [False, False, 60]]],
['regression: scenario 2',
[100,
[[False, 30],
[False, 20],
[True, 20],
[True, 10],
[True, 70],
[False, 20],
[False, 10],
[True, 20],
[False, 0],
[True, 0],
[True, 0]]],
[[False, False, 100],
[False, False, 100],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, True, 10],
[True, False, 0],
[True, True, 0],
[True, False, 0],
[True, False, 0]]],
['regression: scenario 3',
[60, [[False, 70], [True, 30], [True, 0], [True, 50], [True, 30], [True, 70], [True, 0]]],
[[False, False, 60],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[True, False, 0]]]],
[['regression: scenario 2',
[40,
[[False, 70],
[True, 70],
[False, 50],
[True, 70],
[False, 10],
[False, 30],
[True, 0],
[True, 50],
[False, 0],
[False, 30]]],
[[False, False, 40],
[True, False, 0],
[True, True, 0],
[True, False, 0],
[True, True, 0],
[True, True, 30],
[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, True, 30]]],
['regression: scenario 10',
[150,
[[False, 30],
[True, 70],
[False, 20],
[False, 30],
[False, 20],
[False, 10],
[False, 20],
[False, 30],
[True, 70],
[True, 10],
[False, 70],
[False, 20]]],
[[False, False, 150],
[True, False, 0],
[True, True, 0],
[True, True, 30],
[True, True, 50],
[True, True, 60],
[True, True, 80],
[True, True, 110],
[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, True, 20]]],
['regression: power-up with false rung',
[60, [[False, 20], [False, 20], [False, 20], [True, 10]]],
[[False, False, 60], [False, False, 60], [False, False, 60], [True, False, 0]]],
['regression: re-energized mid delay',
[100, [[True, 10], [False, 40], [False, 40], [True, 40], [False, 40], [False, 40], [False, 40]]],
[[True, False, 0],
[True, True, 0],
[True, True, 40],
[True, False, 0],
[True, True, 0],
[True, True, 40],
[True, True, 80]]],
['control: zero preset drop',
[0, [[True, 10], [False, 10], [False, 10]]],
[[True, False, 0], [False, False, 0], [False, False, 0]]],
['regression: exact expiry',
[60, [[True, 10], [False, 30], [False, 30], [False, 30], [False, 30]]],
[[True, False, 0], [True, True, 0], [True, True, 30], [False, False, 60], [False, False, 60]]],
['regression: scenario 1',
[40,
[[True, 70], [True, 20], [False, 50], [False, 20], [False, 50], [False, 50], [False, 50], [False, 0]]],
[[True, False, 0],
[True, False, 0],
[True, True, 0],
[True, True, 20],
[False, False, 40],
[False, False, 40],
[False, False, 40],
[False, False, 40]]],
['control: scenario 3',
[0,
[[False, 50],
[False, 50],
[False, 20],
[False, 20],
[True, 10],
[True, 50],
[True, 20],
[False, 70],
[False, 30],
[False, 10],
[True, 10],
[True, 70],
[True, 10],
[False, 50]]],
[[False, False, 0],
[False, False, 0],
[False, False, 0],
[False, False, 0],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[False, False, 0],
[False, False, 0],
[False, False, 0],
[True, False, 0],
[True, False, 0],
[True, False, 0],
[False, False, 0]]]]]
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: power-up with false rung | [[False, False, 60], [False, False, 60], [False, False, 60], [True, False, 0]] | [[False, False, 60], [False, False, 60], [False, False, 60], [True, False, 0]] | Passed |
| regression: re-energized mid delay | [[True, False, 0], [True, True, 0], [True, True, 40], [True, False, 0], [True, True, 0], [True, True, 40], [True, True, 80]] | [[True, False, 0], [True, True, 0], [True, True, 40], [True, False, 0], [True, True, 0], [True, True, 40], [True, True, 80]] | Passed |
| control: zero preset drop | [[True, False, 0], [False, False, 0], [False, False, 0]] | [[True, False, 0], [False, False, 0], [False, False, 0]] | Passed |
| regression: exact expiry | [[True, False, 0], [True, True, 0], [True, True, 30], [False, False, 60], [False, False, 60]] | [[True, False, 0], [True, True, 0], [True, True, 30], [False, False, 60], [False, False, 60]] | Passed |
| regression: scenario 1 | [[False, False, 60], [True, False, 0], [True, False, 0], [True, False, 0], [True, True, 0], [True, True, 10], [True, False, 0], [True, True, 0]] | [[False, False, 60], [True, False, 0], [True, False, 0], [True, False, 0], [True, True, 0], [True, True, 10], [True, False, 0], [True, True, 0]] | Passed |
| regression: scenario 2 | [[False, False, 60], [True, False, 0], [True, False, 0], [True, False, 0], [True, False, 0], [True, True, 0], [True, True, 50], [False, False, 60]] | [[False, False, 60], [True, False, 0], [True, False, 0], [True, False, 0], [True, False, 0], [True, True, 0], [True, True, 50], [False, False, 60]] | Passed |
| regression: scenario 3 | [[True, False, 0], [True, False, 0], [True, True, 0], [True, False, 0], [True, True, 0], [False, False, 40], [False, False, 40], [False, False, 40], [False, False, 40], [True, False, 0]] | [[True, False, 0], [True, False, 0], [True, True, 0], [True, False, 0], [True, True, 0], [False, False, 40], [False, False, 40], [False, False, 40], [False, False, 40], [True, False, 0]] | Passed |
| regression: scenario 4 | [[False, False, 100], [False, False, 100], [True, False, 0], [True, True, 0], [True, True, 20], [True, True, 70], [False, False, 100], [True, False, 0], [True, False, 0], [True, True, 0], [True, True, 50]] | [[False, False, 100], [False, False, 100], [True, False, 0], [True, True, 0], [True, True, 20], [True, True, 70], [False, False, 100], [True, False, 0], [True, False, 0], [True, True, 0], [True, True, 50]] | Passed |
SHA-256 / 7c69038e71529eb2a5da00f5d498b33a3371ee4841a188c3001f5f3c5ff4393e
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:40.261841+00:00.
Case digest / da712716c6c4cf61694bdd50593df48f888327d06ba5a52051fd89c12bd08f6f