FA-91911 / PLC ladder logic scan cycles / Open access
RES also clears the RTO enable edge memory · case 01
After a reset issued while the timer stays enabled, the next scan is not credited and completion is late.
ROOT CAUSE
The reset writes the edge memory as if the rung had been false.
VERIFIED REPAIR
RES clears only ACC and DN; the enable edge memory tracks the rung alone.
Unsuccessful approach: Clearing the edge memory only when resetting a done timer still loses a scan in that case.
Case contract
Retentive timer (RTO) on rung 1 and its reset (RES) on a later rung, evaluated per scan; scans is a list of [enable, reset, elapsed_ms]. An enabled scan whose previous scan was also enabled adds the elapsed time (clamped at preset); DN sets when ACC >= preset while enabled. A disabled rung retains ACC and DN. Because RES is a later rung, a reset in a scan clears ACC and DN after the RTO has run; the enable edge memory is not touched by RES. Return [DN, 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 = 0
dn = False
prev = False
out = []
for en, res, dt in scans:
en = bool(en)
if en:
if prev:
acc = min(preset, acc + dt)
if acc >= preset:
dn = True
prev = en
if res:
acc = 0
dn = False
prev = False
out.append([dn, acc])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: reset while enabled',
[100, [[True, False, 30], [True, False, 60], [True, True, 30], [True, False, 30], [True, False, 30]]],
[[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]]],
['regression: reset done timer while enabled',
[50,
[[True, False, 30],
[True, False, 60],
[True, False, 10],
[True, True, 10],
[True, False, 25],
[True, False, 25]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]]],
['control: interrupted timing retained',
[100,
[[True, False, 30],
[True, False, 40],
[False, False, 40],
[True, False, 40],
[True, False, 40],
[True, False, 40]]],
[[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]]],
['control: reset done timer while disabled',
[50, [[True, False, 30], [True, False, 60], [False, False, 10], [False, True, 10], [False, False, 10]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]]],
['control: scenario 1',
[100,
[[False, False, 10],
[False, False, 50],
[False, False, 40],
[True, True, 20],
[False, False, 40],
[True, False, 40],
[True, False, 20],
[False, False, 40]]],
[[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 20], [False, 20]]],
['control: scenario 2',
[50,
[[False, False, 30],
[False, False, 30],
[True, False, 50],
[False, False, 50],
[False, False, 10],
[True, False, 30],
[False, False, 50],
[True, False, 30],
[True, False, 40]]],
[[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 40]]],
['regression: scenario 3',
[100,
[[False, False, 50],
[False, False, 20],
[True, False, 50],
[True, False, 10],
[True, False, 20],
[True, False, 20],
[True, False, 50],
[True, False, 50],
[True, True, 10],
[True, False, 50]]],
[[False, 0],
[False, 0],
[False, 0],
[False, 10],
[False, 30],
[False, 50],
[True, 100],
[True, 100],
[False, 0],
[False, 50]]],
['control: scenario 4',
[100,
[[True, False, 20],
[True, False, 10],
[False, False, 20],
[True, False, 30],
[False, False, 20],
[False, False, 30]]],
[[False, 0], [False, 10], [False, 10], [False, 10], [False, 10], [False, 10]]]],
[['regression: reset done timer while enabled',
[50,
[[True, False, 30],
[True, False, 60],
[True, False, 10],
[True, True, 10],
[True, False, 25],
[True, False, 25]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]]],
['regression: scenario 16',
[50,
[[True, True, 20],
[True, True, 20],
[True, False, 30],
[True, False, 40],
[True, True, 20],
[True, False, 20],
[True, True, 30],
[False, False, 10],
[True, False, 10],
[True, False, 30],
[True, False, 30],
[True, False, 20],
[False, False, 50]]],
[[False, 0],
[False, 0],
[False, 30],
[True, 50],
[False, 0],
[False, 20],
[False, 0],
[False, 0],
[False, 0],
[False, 30],
[True, 50],
[True, 50],
[True, 50]]],
['control: interrupted timing retained',
[100,
[[True, False, 30],
[True, False, 40],
[False, False, 40],
[True, False, 40],
[True, False, 40],
[True, False, 40]]],
[[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]]],
['regression: reset while enabled',
[100, [[True, False, 30], [True, False, 60], [True, True, 30], [True, False, 30], [True, False, 30]]],
[[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]]],
['control: reset done timer while disabled',
[50, [[True, False, 30], [True, False, 60], [False, False, 10], [False, True, 10], [False, False, 10]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]]],
['regression: scenario 1',
[80,
[[False, False, 10],
[True, False, 30],
[True, False, 10],
[True, True, 40],
[True, False, 50],
[False, False, 40],
[False, False, 50],
[False, False, 40]]],
[[False, 0], [False, 0], [False, 10], [False, 0], [False, 50], [False, 50], [False, 50], [False, 50]]],
['control: scenario 2',
[0,
[[True, False, 10],
[False, False, 30],
[True, False, 20],
[True, False, 30],
[True, False, 50],
[True, False, 50],
[True, True, 20],
[True, False, 20],
[False, False, 40]]],
[[True, 0], [True, 0], [True, 0], [True, 0], [True, 0], [True, 0], [False, 0], [True, 0], [True, 0]]],
['regression: scenario 3',
[50,
[[True, True, 10],
[True, False, 20],
[True, False, 10],
[True, False, 20],
[True, False, 40],
[True, False, 50],
[True, False, 30],
[False, False, 20],
[True, False, 40],
[False, True, 20]]],
[[False, 0],
[False, 20],
[False, 30],
[True, 50],
[True, 50],
[True, 50],
[True, 50],
[True, 50],
[True, 50],
[False, 0]]]],
[['regression: scenario 4',
[150,
[[True, False, 20],
[True, False, 20],
[True, False, 40],
[True, False, 30],
[True, False, 20],
[False, True, 20],
[True, True, 10],
[True, True, 40],
[True, False, 40],
[False, False, 10],
[False, False, 10],
[False, False, 20]]],
[[False, 0],
[False, 20],
[False, 60],
[False, 90],
[False, 110],
[False, 0],
[False, 0],
[False, 0],
[False, 40],
[False, 40],
[False, 40],
[False, 40]]],
['regression: scenario 52',
[100,
[[False, False, 40],
[True, False, 40],
[True, False, 30],
[True, False, 50],
[False, False, 10],
[False, False, 10],
[False, True, 30],
[False, False, 10],
[True, True, 40],
[True, True, 20],
[True, False, 40],
[True, False, 20],
[True, True, 50],
[True, False, 10]]],
[[False, 0],
[False, 0],
[False, 30],
[False, 80],
[False, 80],
[False, 80],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 40],
[False, 60],
[False, 0],
[False, 10]]],
['control: interrupted timing retained',
[100,
[[True, False, 30],
[True, False, 40],
[False, False, 40],
[True, False, 40],
[True, False, 40],
[True, False, 40]]],
[[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]]],
['regression: reset while enabled',
[100, [[True, False, 30], [True, False, 60], [True, True, 30], [True, False, 30], [True, False, 30]]],
[[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]]],
['regression: reset done timer while enabled',
[50,
[[True, False, 30],
[True, False, 60],
[True, False, 10],
[True, True, 10],
[True, False, 25],
[True, False, 25]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]]],
['control: reset done timer while disabled',
[50, [[True, False, 30], [True, False, 60], [False, False, 10], [False, True, 10], [False, False, 10]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]]],
['control: scenario 1',
[0,
[[False, False, 40],
[False, True, 30],
[True, False, 10],
[True, False, 30],
[True, False, 20],
[False, True, 30],
[True, False, 40],
[True, False, 30],
[True, False, 30],
[False, False, 20],
[False, False, 10],
[True, False, 30],
[True, False, 50],
[False, False, 10]]],
[[False, 0],
[False, 0],
[True, 0],
[True, 0],
[True, 0],
[False, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0]]],
['control: scenario 2',
[50,
[[True, False, 10],
[True, False, 20],
[True, False, 50],
[True, False, 20],
[True, False, 20],
[False, False, 50],
[False, False, 40],
[False, True, 10],
[False, False, 10]]],
[[False, 0],
[False, 20],
[True, 50],
[True, 50],
[True, 50],
[True, 50],
[True, 50],
[False, 0],
[False, 0]]]],
[['regression: scenario 3',
[100,
[[False, False, 10],
[True, False, 20],
[True, False, 10],
[True, True, 50],
[True, False, 40],
[True, False, 50],
[False, True, 50],
[False, False, 10],
[True, False, 30]]],
[[False, 0],
[False, 0],
[False, 10],
[False, 0],
[False, 40],
[False, 90],
[False, 0],
[False, 0],
[False, 0]]],
['regression: reset done timer while enabled',
[50,
[[True, False, 30],
[True, False, 60],
[True, False, 10],
[True, True, 10],
[True, False, 25],
[True, False, 25]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]]],
['control: interrupted timing retained',
[100,
[[True, False, 30],
[True, False, 40],
[False, False, 40],
[True, False, 40],
[True, False, 40],
[True, False, 40]]],
[[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]]],
['regression: reset while enabled',
[100, [[True, False, 30], [True, False, 60], [True, True, 30], [True, False, 30], [True, False, 30]]],
[[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]]],
['control: reset done timer while disabled',
[50, [[True, False, 30], [True, False, 60], [False, False, 10], [False, True, 10], [False, False, 10]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]]],
['control: scenario 1',
[0,
[[False, False, 50],
[False, False, 20],
[False, False, 30],
[True, True, 40],
[False, True, 10],
[True, False, 10],
[False, False, 30]]],
[[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [True, 0], [True, 0]]],
['regression: scenario 2',
[100,
[[True, False, 20],
[True, False, 30],
[True, False, 10],
[True, True, 10],
[True, False, 10],
[True, False, 20],
[False, False, 50],
[False, True, 40],
[False, False, 30],
[False, False, 40],
[True, False, 10],
[True, False, 50]]],
[[False, 0],
[False, 30],
[False, 40],
[False, 0],
[False, 10],
[False, 30],
[False, 30],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 50]]],
['control: scenario 4',
[50,
[[False, False, 30],
[True, False, 10],
[False, False, 40],
[False, False, 40],
[True, False, 50],
[True, False, 40],
[True, False, 50],
[True, True, 10],
[False, False, 10],
[False, False, 20],
[False, True, 40],
[True, False, 30]]],
[[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 40],
[True, 50],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 0]]]],
[['regression: scenario 8',
[150,
[[True, False, 30],
[True, True, 50],
[True, False, 30],
[True, False, 40],
[True, False, 10],
[True, False, 30],
[True, True, 10],
[True, False, 30],
[True, False, 40],
[True, False, 40],
[False, True, 50],
[True, False, 50],
[True, False, 10]]],
[[False, 0],
[False, 0],
[False, 30],
[False, 70],
[False, 80],
[False, 110],
[False, 0],
[False, 30],
[False, 70],
[False, 110],
[False, 0],
[False, 0],
[False, 10]]],
['regression: scenario 17',
[50,
[[False, False, 10],
[True, False, 40],
[True, False, 50],
[True, False, 30],
[True, True, 40],
[True, False, 30],
[True, True, 50]]],
[[False, 0], [False, 0], [True, 50], [True, 50], [False, 0], [False, 30], [False, 0]]],
['control: interrupted timing retained',
[100,
[[True, False, 30],
[True, False, 40],
[False, False, 40],
[True, False, 40],
[True, False, 40],
[True, False, 40]]],
[[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]]],
['regression: reset while enabled',
[100, [[True, False, 30], [True, False, 60], [True, True, 30], [True, False, 30], [True, False, 30]]],
[[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]]],
['regression: reset done timer while enabled',
[50,
[[True, False, 30],
[True, False, 60],
[True, False, 10],
[True, True, 10],
[True, False, 25],
[True, False, 25]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]]],
['control: reset done timer while disabled',
[50, [[True, False, 30], [True, False, 60], [False, False, 10], [False, True, 10], [False, False, 10]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]]],
['control: scenario 1',
[0,
[[True, False, 30],
[True, False, 10],
[True, False, 10],
[True, False, 40],
[False, False, 30],
[False, False, 50],
[False, True, 40],
[True, False, 10],
[True, False, 30],
[True, False, 50],
[False, False, 20],
[False, False, 30],
[False, False, 40],
[False, False, 50]]],
[[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[False, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0]]],
['control: scenario 2',
[50,
[[True, True, 50],
[False, False, 10],
[True, False, 50],
[False, True, 50],
[False, False, 20],
[True, False, 20]]],
[[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [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: reset while enabled | [[False, 0], [False, 60], [False, 0], [False, 0], [False, 30]] | [[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]] | Failed |
| regression: reset done timer while enabled | [[False, 0], [True, 50], [True, 50], [False, 0], [False, 0], [False, 25]] | [[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]] | Failed |
| control: interrupted timing retained | [[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]] | [[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]] | Passed |
| control: reset done timer while disabled | [[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]] | [[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]] | Passed |
| control: scenario 1 | [[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 20], [False, 20]] | [[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 20], [False, 20]] | Passed |
| control: scenario 2 | [[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 40]] | [[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 40]] | Passed |
| regression: scenario 3 | [[False, 0], [False, 0], [False, 0], [False, 10], [False, 30], [False, 50], [True, 100], [True, 100], [False, 0], [False, 0]] | [[False, 0], [False, 0], [False, 0], [False, 10], [False, 30], [False, 50], [True, 100], [True, 100], [False, 0], [False, 50]] | Failed |
| control: scenario 4 | [[False, 0], [False, 10], [False, 10], [False, 10], [False, 10], [False, 10]] | [[False, 0], [False, 10], [False, 10], [False, 10], [False, 10], [False, 10]] | Passed |
SHA-256 / bea88db07dc4562345e61e1fbd6f7febc6435a848d1ba5d6624ee2e40803f492
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(preset, scans):
acc = 0
dn = False
prev = False
out = []
for en, res, dt in scans:
en = bool(en)
if en:
if prev:
acc = min(preset, acc + dt)
if acc >= preset:
dn = True
prev = en
if res:
if dn:
prev = False
acc = 0
dn = False
out.append([dn, acc])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: reset while enabled',
[100, [[True, False, 30], [True, False, 60], [True, True, 30], [True, False, 30], [True, False, 30]]],
[[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]]],
['regression: reset done timer while enabled',
[50,
[[True, False, 30],
[True, False, 60],
[True, False, 10],
[True, True, 10],
[True, False, 25],
[True, False, 25]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]]],
['control: interrupted timing retained',
[100,
[[True, False, 30],
[True, False, 40],
[False, False, 40],
[True, False, 40],
[True, False, 40],
[True, False, 40]]],
[[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]]],
['control: reset done timer while disabled',
[50, [[True, False, 30], [True, False, 60], [False, False, 10], [False, True, 10], [False, False, 10]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]]],
['control: scenario 1',
[100,
[[False, False, 10],
[False, False, 50],
[False, False, 40],
[True, True, 20],
[False, False, 40],
[True, False, 40],
[True, False, 20],
[False, False, 40]]],
[[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 20], [False, 20]]],
['control: scenario 2',
[50,
[[False, False, 30],
[False, False, 30],
[True, False, 50],
[False, False, 50],
[False, False, 10],
[True, False, 30],
[False, False, 50],
[True, False, 30],
[True, False, 40]]],
[[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 40]]],
['regression: scenario 3',
[100,
[[False, False, 50],
[False, False, 20],
[True, False, 50],
[True, False, 10],
[True, False, 20],
[True, False, 20],
[True, False, 50],
[True, False, 50],
[True, True, 10],
[True, False, 50]]],
[[False, 0],
[False, 0],
[False, 0],
[False, 10],
[False, 30],
[False, 50],
[True, 100],
[True, 100],
[False, 0],
[False, 50]]],
['control: scenario 4',
[100,
[[True, False, 20],
[True, False, 10],
[False, False, 20],
[True, False, 30],
[False, False, 20],
[False, False, 30]]],
[[False, 0], [False, 10], [False, 10], [False, 10], [False, 10], [False, 10]]]],
[['regression: reset done timer while enabled',
[50,
[[True, False, 30],
[True, False, 60],
[True, False, 10],
[True, True, 10],
[True, False, 25],
[True, False, 25]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]]],
['regression: scenario 16',
[50,
[[True, True, 20],
[True, True, 20],
[True, False, 30],
[True, False, 40],
[True, True, 20],
[True, False, 20],
[True, True, 30],
[False, False, 10],
[True, False, 10],
[True, False, 30],
[True, False, 30],
[True, False, 20],
[False, False, 50]]],
[[False, 0],
[False, 0],
[False, 30],
[True, 50],
[False, 0],
[False, 20],
[False, 0],
[False, 0],
[False, 0],
[False, 30],
[True, 50],
[True, 50],
[True, 50]]],
['control: interrupted timing retained',
[100,
[[True, False, 30],
[True, False, 40],
[False, False, 40],
[True, False, 40],
[True, False, 40],
[True, False, 40]]],
[[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]]],
['regression: reset while enabled',
[100, [[True, False, 30], [True, False, 60], [True, True, 30], [True, False, 30], [True, False, 30]]],
[[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]]],
['control: reset done timer while disabled',
[50, [[True, False, 30], [True, False, 60], [False, False, 10], [False, True, 10], [False, False, 10]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]]],
['regression: scenario 1',
[80,
[[False, False, 10],
[True, False, 30],
[True, False, 10],
[True, True, 40],
[True, False, 50],
[False, False, 40],
[False, False, 50],
[False, False, 40]]],
[[False, 0], [False, 0], [False, 10], [False, 0], [False, 50], [False, 50], [False, 50], [False, 50]]],
['control: scenario 2',
[0,
[[True, False, 10],
[False, False, 30],
[True, False, 20],
[True, False, 30],
[True, False, 50],
[True, False, 50],
[True, True, 20],
[True, False, 20],
[False, False, 40]]],
[[True, 0], [True, 0], [True, 0], [True, 0], [True, 0], [True, 0], [False, 0], [True, 0], [True, 0]]],
['regression: scenario 3',
[50,
[[True, True, 10],
[True, False, 20],
[True, False, 10],
[True, False, 20],
[True, False, 40],
[True, False, 50],
[True, False, 30],
[False, False, 20],
[True, False, 40],
[False, True, 20]]],
[[False, 0],
[False, 20],
[False, 30],
[True, 50],
[True, 50],
[True, 50],
[True, 50],
[True, 50],
[True, 50],
[False, 0]]]],
[['regression: scenario 4',
[150,
[[True, False, 20],
[True, False, 20],
[True, False, 40],
[True, False, 30],
[True, False, 20],
[False, True, 20],
[True, True, 10],
[True, True, 40],
[True, False, 40],
[False, False, 10],
[False, False, 10],
[False, False, 20]]],
[[False, 0],
[False, 20],
[False, 60],
[False, 90],
[False, 110],
[False, 0],
[False, 0],
[False, 0],
[False, 40],
[False, 40],
[False, 40],
[False, 40]]],
['regression: scenario 52',
[100,
[[False, False, 40],
[True, False, 40],
[True, False, 30],
[True, False, 50],
[False, False, 10],
[False, False, 10],
[False, True, 30],
[False, False, 10],
[True, True, 40],
[True, True, 20],
[True, False, 40],
[True, False, 20],
[True, True, 50],
[True, False, 10]]],
[[False, 0],
[False, 0],
[False, 30],
[False, 80],
[False, 80],
[False, 80],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 40],
[False, 60],
[False, 0],
[False, 10]]],
['control: interrupted timing retained',
[100,
[[True, False, 30],
[True, False, 40],
[False, False, 40],
[True, False, 40],
[True, False, 40],
[True, False, 40]]],
[[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]]],
['regression: reset while enabled',
[100, [[True, False, 30], [True, False, 60], [True, True, 30], [True, False, 30], [True, False, 30]]],
[[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]]],
['regression: reset done timer while enabled',
[50,
[[True, False, 30],
[True, False, 60],
[True, False, 10],
[True, True, 10],
[True, False, 25],
[True, False, 25]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]]],
['control: reset done timer while disabled',
[50, [[True, False, 30], [True, False, 60], [False, False, 10], [False, True, 10], [False, False, 10]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]]],
['control: scenario 1',
[0,
[[False, False, 40],
[False, True, 30],
[True, False, 10],
[True, False, 30],
[True, False, 20],
[False, True, 30],
[True, False, 40],
[True, False, 30],
[True, False, 30],
[False, False, 20],
[False, False, 10],
[True, False, 30],
[True, False, 50],
[False, False, 10]]],
[[False, 0],
[False, 0],
[True, 0],
[True, 0],
[True, 0],
[False, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0]]],
['control: scenario 2',
[50,
[[True, False, 10],
[True, False, 20],
[True, False, 50],
[True, False, 20],
[True, False, 20],
[False, False, 50],
[False, False, 40],
[False, True, 10],
[False, False, 10]]],
[[False, 0],
[False, 20],
[True, 50],
[True, 50],
[True, 50],
[True, 50],
[True, 50],
[False, 0],
[False, 0]]]],
[['regression: scenario 3',
[100,
[[False, False, 10],
[True, False, 20],
[True, False, 10],
[True, True, 50],
[True, False, 40],
[True, False, 50],
[False, True, 50],
[False, False, 10],
[True, False, 30]]],
[[False, 0],
[False, 0],
[False, 10],
[False, 0],
[False, 40],
[False, 90],
[False, 0],
[False, 0],
[False, 0]]],
['regression: reset done timer while enabled',
[50,
[[True, False, 30],
[True, False, 60],
[True, False, 10],
[True, True, 10],
[True, False, 25],
[True, False, 25]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]]],
['control: interrupted timing retained',
[100,
[[True, False, 30],
[True, False, 40],
[False, False, 40],
[True, False, 40],
[True, False, 40],
[True, False, 40]]],
[[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]]],
['regression: reset while enabled',
[100, [[True, False, 30], [True, False, 60], [True, True, 30], [True, False, 30], [True, False, 30]]],
[[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]]],
['control: reset done timer while disabled',
[50, [[True, False, 30], [True, False, 60], [False, False, 10], [False, True, 10], [False, False, 10]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]]],
['control: scenario 1',
[0,
[[False, False, 50],
[False, False, 20],
[False, False, 30],
[True, True, 40],
[False, True, 10],
[True, False, 10],
[False, False, 30]]],
[[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [True, 0], [True, 0]]],
['regression: scenario 2',
[100,
[[True, False, 20],
[True, False, 30],
[True, False, 10],
[True, True, 10],
[True, False, 10],
[True, False, 20],
[False, False, 50],
[False, True, 40],
[False, False, 30],
[False, False, 40],
[True, False, 10],
[True, False, 50]]],
[[False, 0],
[False, 30],
[False, 40],
[False, 0],
[False, 10],
[False, 30],
[False, 30],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 50]]],
['control: scenario 4',
[50,
[[False, False, 30],
[True, False, 10],
[False, False, 40],
[False, False, 40],
[True, False, 50],
[True, False, 40],
[True, False, 50],
[True, True, 10],
[False, False, 10],
[False, False, 20],
[False, True, 40],
[True, False, 30]]],
[[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 40],
[True, 50],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 0]]]],
[['regression: scenario 8',
[150,
[[True, False, 30],
[True, True, 50],
[True, False, 30],
[True, False, 40],
[True, False, 10],
[True, False, 30],
[True, True, 10],
[True, False, 30],
[True, False, 40],
[True, False, 40],
[False, True, 50],
[True, False, 50],
[True, False, 10]]],
[[False, 0],
[False, 0],
[False, 30],
[False, 70],
[False, 80],
[False, 110],
[False, 0],
[False, 30],
[False, 70],
[False, 110],
[False, 0],
[False, 0],
[False, 10]]],
['regression: scenario 17',
[50,
[[False, False, 10],
[True, False, 40],
[True, False, 50],
[True, False, 30],
[True, True, 40],
[True, False, 30],
[True, True, 50]]],
[[False, 0], [False, 0], [True, 50], [True, 50], [False, 0], [False, 30], [False, 0]]],
['control: interrupted timing retained',
[100,
[[True, False, 30],
[True, False, 40],
[False, False, 40],
[True, False, 40],
[True, False, 40],
[True, False, 40]]],
[[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]]],
['regression: reset while enabled',
[100, [[True, False, 30], [True, False, 60], [True, True, 30], [True, False, 30], [True, False, 30]]],
[[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]]],
['regression: reset done timer while enabled',
[50,
[[True, False, 30],
[True, False, 60],
[True, False, 10],
[True, True, 10],
[True, False, 25],
[True, False, 25]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]]],
['control: reset done timer while disabled',
[50, [[True, False, 30], [True, False, 60], [False, False, 10], [False, True, 10], [False, False, 10]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]]],
['control: scenario 1',
[0,
[[True, False, 30],
[True, False, 10],
[True, False, 10],
[True, False, 40],
[False, False, 30],
[False, False, 50],
[False, True, 40],
[True, False, 10],
[True, False, 30],
[True, False, 50],
[False, False, 20],
[False, False, 30],
[False, False, 40],
[False, False, 50]]],
[[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[False, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0]]],
['control: scenario 2',
[50,
[[True, True, 50],
[False, False, 10],
[True, False, 50],
[False, True, 50],
[False, False, 20],
[True, False, 20]]],
[[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [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: reset while enabled | [[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]] | [[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]] | Passed |
| regression: reset done timer while enabled | [[False, 0], [True, 50], [True, 50], [False, 0], [False, 0], [False, 25]] | [[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]] | Failed |
| control: interrupted timing retained | [[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]] | [[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]] | Passed |
| control: reset done timer while disabled | [[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]] | [[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]] | Passed |
| control: scenario 1 | [[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 20], [False, 20]] | [[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 20], [False, 20]] | Passed |
| control: scenario 2 | [[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 40]] | [[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 40]] | Passed |
| regression: scenario 3 | [[False, 0], [False, 0], [False, 0], [False, 10], [False, 30], [False, 50], [True, 100], [True, 100], [False, 0], [False, 0]] | [[False, 0], [False, 0], [False, 0], [False, 10], [False, 30], [False, 50], [True, 100], [True, 100], [False, 0], [False, 50]] | Failed |
| control: scenario 4 | [[False, 0], [False, 10], [False, 10], [False, 10], [False, 10], [False, 10]] | [[False, 0], [False, 10], [False, 10], [False, 10], [False, 10], [False, 10]] | Passed |
SHA-256 / 19e525088dd30d24fd42121dab5fb802c7b97e422873f5e55427b36e6526eaa5
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(preset, scans):
acc = 0
dn = False
prev = False
out = []
for en, res, dt in scans:
en = bool(en)
if en:
if prev:
acc = min(preset, acc + dt)
if acc >= preset:
dn = True
prev = en
if res:
acc = 0
dn = False
out.append([dn, acc])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: reset while enabled',
[100, [[True, False, 30], [True, False, 60], [True, True, 30], [True, False, 30], [True, False, 30]]],
[[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]]],
['regression: reset done timer while enabled',
[50,
[[True, False, 30],
[True, False, 60],
[True, False, 10],
[True, True, 10],
[True, False, 25],
[True, False, 25]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]]],
['control: interrupted timing retained',
[100,
[[True, False, 30],
[True, False, 40],
[False, False, 40],
[True, False, 40],
[True, False, 40],
[True, False, 40]]],
[[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]]],
['control: reset done timer while disabled',
[50, [[True, False, 30], [True, False, 60], [False, False, 10], [False, True, 10], [False, False, 10]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]]],
['control: scenario 1',
[100,
[[False, False, 10],
[False, False, 50],
[False, False, 40],
[True, True, 20],
[False, False, 40],
[True, False, 40],
[True, False, 20],
[False, False, 40]]],
[[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 20], [False, 20]]],
['control: scenario 2',
[50,
[[False, False, 30],
[False, False, 30],
[True, False, 50],
[False, False, 50],
[False, False, 10],
[True, False, 30],
[False, False, 50],
[True, False, 30],
[True, False, 40]]],
[[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 40]]],
['regression: scenario 3',
[100,
[[False, False, 50],
[False, False, 20],
[True, False, 50],
[True, False, 10],
[True, False, 20],
[True, False, 20],
[True, False, 50],
[True, False, 50],
[True, True, 10],
[True, False, 50]]],
[[False, 0],
[False, 0],
[False, 0],
[False, 10],
[False, 30],
[False, 50],
[True, 100],
[True, 100],
[False, 0],
[False, 50]]],
['control: scenario 4',
[100,
[[True, False, 20],
[True, False, 10],
[False, False, 20],
[True, False, 30],
[False, False, 20],
[False, False, 30]]],
[[False, 0], [False, 10], [False, 10], [False, 10], [False, 10], [False, 10]]]],
[['regression: reset done timer while enabled',
[50,
[[True, False, 30],
[True, False, 60],
[True, False, 10],
[True, True, 10],
[True, False, 25],
[True, False, 25]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]]],
['regression: scenario 16',
[50,
[[True, True, 20],
[True, True, 20],
[True, False, 30],
[True, False, 40],
[True, True, 20],
[True, False, 20],
[True, True, 30],
[False, False, 10],
[True, False, 10],
[True, False, 30],
[True, False, 30],
[True, False, 20],
[False, False, 50]]],
[[False, 0],
[False, 0],
[False, 30],
[True, 50],
[False, 0],
[False, 20],
[False, 0],
[False, 0],
[False, 0],
[False, 30],
[True, 50],
[True, 50],
[True, 50]]],
['control: interrupted timing retained',
[100,
[[True, False, 30],
[True, False, 40],
[False, False, 40],
[True, False, 40],
[True, False, 40],
[True, False, 40]]],
[[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]]],
['regression: reset while enabled',
[100, [[True, False, 30], [True, False, 60], [True, True, 30], [True, False, 30], [True, False, 30]]],
[[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]]],
['control: reset done timer while disabled',
[50, [[True, False, 30], [True, False, 60], [False, False, 10], [False, True, 10], [False, False, 10]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]]],
['regression: scenario 1',
[80,
[[False, False, 10],
[True, False, 30],
[True, False, 10],
[True, True, 40],
[True, False, 50],
[False, False, 40],
[False, False, 50],
[False, False, 40]]],
[[False, 0], [False, 0], [False, 10], [False, 0], [False, 50], [False, 50], [False, 50], [False, 50]]],
['control: scenario 2',
[0,
[[True, False, 10],
[False, False, 30],
[True, False, 20],
[True, False, 30],
[True, False, 50],
[True, False, 50],
[True, True, 20],
[True, False, 20],
[False, False, 40]]],
[[True, 0], [True, 0], [True, 0], [True, 0], [True, 0], [True, 0], [False, 0], [True, 0], [True, 0]]],
['regression: scenario 3',
[50,
[[True, True, 10],
[True, False, 20],
[True, False, 10],
[True, False, 20],
[True, False, 40],
[True, False, 50],
[True, False, 30],
[False, False, 20],
[True, False, 40],
[False, True, 20]]],
[[False, 0],
[False, 20],
[False, 30],
[True, 50],
[True, 50],
[True, 50],
[True, 50],
[True, 50],
[True, 50],
[False, 0]]]],
[['regression: scenario 4',
[150,
[[True, False, 20],
[True, False, 20],
[True, False, 40],
[True, False, 30],
[True, False, 20],
[False, True, 20],
[True, True, 10],
[True, True, 40],
[True, False, 40],
[False, False, 10],
[False, False, 10],
[False, False, 20]]],
[[False, 0],
[False, 20],
[False, 60],
[False, 90],
[False, 110],
[False, 0],
[False, 0],
[False, 0],
[False, 40],
[False, 40],
[False, 40],
[False, 40]]],
['regression: scenario 52',
[100,
[[False, False, 40],
[True, False, 40],
[True, False, 30],
[True, False, 50],
[False, False, 10],
[False, False, 10],
[False, True, 30],
[False, False, 10],
[True, True, 40],
[True, True, 20],
[True, False, 40],
[True, False, 20],
[True, True, 50],
[True, False, 10]]],
[[False, 0],
[False, 0],
[False, 30],
[False, 80],
[False, 80],
[False, 80],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 40],
[False, 60],
[False, 0],
[False, 10]]],
['control: interrupted timing retained',
[100,
[[True, False, 30],
[True, False, 40],
[False, False, 40],
[True, False, 40],
[True, False, 40],
[True, False, 40]]],
[[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]]],
['regression: reset while enabled',
[100, [[True, False, 30], [True, False, 60], [True, True, 30], [True, False, 30], [True, False, 30]]],
[[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]]],
['regression: reset done timer while enabled',
[50,
[[True, False, 30],
[True, False, 60],
[True, False, 10],
[True, True, 10],
[True, False, 25],
[True, False, 25]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]]],
['control: reset done timer while disabled',
[50, [[True, False, 30], [True, False, 60], [False, False, 10], [False, True, 10], [False, False, 10]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]]],
['control: scenario 1',
[0,
[[False, False, 40],
[False, True, 30],
[True, False, 10],
[True, False, 30],
[True, False, 20],
[False, True, 30],
[True, False, 40],
[True, False, 30],
[True, False, 30],
[False, False, 20],
[False, False, 10],
[True, False, 30],
[True, False, 50],
[False, False, 10]]],
[[False, 0],
[False, 0],
[True, 0],
[True, 0],
[True, 0],
[False, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0]]],
['control: scenario 2',
[50,
[[True, False, 10],
[True, False, 20],
[True, False, 50],
[True, False, 20],
[True, False, 20],
[False, False, 50],
[False, False, 40],
[False, True, 10],
[False, False, 10]]],
[[False, 0],
[False, 20],
[True, 50],
[True, 50],
[True, 50],
[True, 50],
[True, 50],
[False, 0],
[False, 0]]]],
[['regression: scenario 3',
[100,
[[False, False, 10],
[True, False, 20],
[True, False, 10],
[True, True, 50],
[True, False, 40],
[True, False, 50],
[False, True, 50],
[False, False, 10],
[True, False, 30]]],
[[False, 0],
[False, 0],
[False, 10],
[False, 0],
[False, 40],
[False, 90],
[False, 0],
[False, 0],
[False, 0]]],
['regression: reset done timer while enabled',
[50,
[[True, False, 30],
[True, False, 60],
[True, False, 10],
[True, True, 10],
[True, False, 25],
[True, False, 25]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]]],
['control: interrupted timing retained',
[100,
[[True, False, 30],
[True, False, 40],
[False, False, 40],
[True, False, 40],
[True, False, 40],
[True, False, 40]]],
[[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]]],
['regression: reset while enabled',
[100, [[True, False, 30], [True, False, 60], [True, True, 30], [True, False, 30], [True, False, 30]]],
[[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]]],
['control: reset done timer while disabled',
[50, [[True, False, 30], [True, False, 60], [False, False, 10], [False, True, 10], [False, False, 10]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]]],
['control: scenario 1',
[0,
[[False, False, 50],
[False, False, 20],
[False, False, 30],
[True, True, 40],
[False, True, 10],
[True, False, 10],
[False, False, 30]]],
[[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [True, 0], [True, 0]]],
['regression: scenario 2',
[100,
[[True, False, 20],
[True, False, 30],
[True, False, 10],
[True, True, 10],
[True, False, 10],
[True, False, 20],
[False, False, 50],
[False, True, 40],
[False, False, 30],
[False, False, 40],
[True, False, 10],
[True, False, 50]]],
[[False, 0],
[False, 30],
[False, 40],
[False, 0],
[False, 10],
[False, 30],
[False, 30],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 50]]],
['control: scenario 4',
[50,
[[False, False, 30],
[True, False, 10],
[False, False, 40],
[False, False, 40],
[True, False, 50],
[True, False, 40],
[True, False, 50],
[True, True, 10],
[False, False, 10],
[False, False, 20],
[False, True, 40],
[True, False, 30]]],
[[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 40],
[True, 50],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 0]]]],
[['regression: scenario 8',
[150,
[[True, False, 30],
[True, True, 50],
[True, False, 30],
[True, False, 40],
[True, False, 10],
[True, False, 30],
[True, True, 10],
[True, False, 30],
[True, False, 40],
[True, False, 40],
[False, True, 50],
[True, False, 50],
[True, False, 10]]],
[[False, 0],
[False, 0],
[False, 30],
[False, 70],
[False, 80],
[False, 110],
[False, 0],
[False, 30],
[False, 70],
[False, 110],
[False, 0],
[False, 0],
[False, 10]]],
['regression: scenario 17',
[50,
[[False, False, 10],
[True, False, 40],
[True, False, 50],
[True, False, 30],
[True, True, 40],
[True, False, 30],
[True, True, 50]]],
[[False, 0], [False, 0], [True, 50], [True, 50], [False, 0], [False, 30], [False, 0]]],
['control: interrupted timing retained',
[100,
[[True, False, 30],
[True, False, 40],
[False, False, 40],
[True, False, 40],
[True, False, 40],
[True, False, 40]]],
[[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]]],
['regression: reset while enabled',
[100, [[True, False, 30], [True, False, 60], [True, True, 30], [True, False, 30], [True, False, 30]]],
[[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]]],
['regression: reset done timer while enabled',
[50,
[[True, False, 30],
[True, False, 60],
[True, False, 10],
[True, True, 10],
[True, False, 25],
[True, False, 25]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]]],
['control: reset done timer while disabled',
[50, [[True, False, 30], [True, False, 60], [False, False, 10], [False, True, 10], [False, False, 10]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]]],
['control: scenario 1',
[0,
[[True, False, 30],
[True, False, 10],
[True, False, 10],
[True, False, 40],
[False, False, 30],
[False, False, 50],
[False, True, 40],
[True, False, 10],
[True, False, 30],
[True, False, 50],
[False, False, 20],
[False, False, 30],
[False, False, 40],
[False, False, 50]]],
[[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[False, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0]]],
['control: scenario 2',
[50,
[[True, True, 50],
[False, False, 10],
[True, False, 50],
[False, True, 50],
[False, False, 20],
[True, False, 20]]],
[[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [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: reset while enabled | [[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]] | [[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]] | Passed |
| regression: reset done timer while enabled | [[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]] | [[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]] | Passed |
| control: interrupted timing retained | [[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]] | [[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]] | Passed |
| control: reset done timer while disabled | [[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]] | [[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]] | Passed |
| control: scenario 1 | [[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 20], [False, 20]] | [[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 20], [False, 20]] | Passed |
| control: scenario 2 | [[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 40]] | [[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 40]] | Passed |
| regression: scenario 3 | [[False, 0], [False, 0], [False, 0], [False, 10], [False, 30], [False, 50], [True, 100], [True, 100], [False, 0], [False, 50]] | [[False, 0], [False, 0], [False, 0], [False, 10], [False, 30], [False, 50], [True, 100], [True, 100], [False, 0], [False, 50]] | Passed |
| control: scenario 4 | [[False, 0], [False, 10], [False, 10], [False, 10], [False, 10], [False, 10]] | [[False, 0], [False, 10], [False, 10], [False, 10], [False, 10], [False, 10]] | Passed |
SHA-256 / 5cbb1d92c96009709dc74bcca0ca7340b27a0c8d7fa800b74266e71b7df20e66
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.492485+00:00.
Case digest / f7e41987c3cebb17590e377541bb1b618bfcddb05891f682dd4d3c419c5a7476