FAILURE MAP
← Case archive

FA-92191 / PLC ladder logic scan cycles / Open access

Alarm on-delay counts non-consecutive true scans · case 01

A chattering signal raises the alarm although it was never true for the required consecutive scans.

Verified by executionVariant 1 · 8 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

The duration counter holds its value on false scans instead of restarting.

VERIFIED REPAIR

Reset the duration counter whenever the condition is false.

Unsuccessful approach: Decrementing the counter on false scans still accumulates a chattering signal.

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 count
        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]]],
  ['control: 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]]],
  ['control: reset while condition true',
   [1, False, [[True, False, False], [True, False, True], [True, False, False]]],
   [[True, False], [True, False], [True, False]]],
  ['control: 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]]],
  ['control: 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]]],
  ['control: 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 12',
   [2,
    False,
    [[False, False, True],
     [False, False, False],
     [False, False, False],
     [True, False, False],
     [True, True, True],
     [True, False, True],
     [False, False, True],
     [False, False, False],
     [True, False, False],
     [True, False, False],
     [True, True, False]]],
   [[False, True],
    [False, True],
    [False, True],
    [False, True],
    [True, True],
    [True, True],
    [False, True],
    [False, True],
    [False, True],
    [True, False],
    [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]]],
  ['control: 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]]],
  ['control: reset while condition true',
   [1, False, [[True, False, False], [True, False, True], [True, False, False]]],
   [[True, False], [True, False], [True, False]]],
  ['control: 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]]],
  ['control: 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 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: 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: scenario 8',
   [2,
    False,
    [[True, False, False],
     [True, False, False],
     [False, False, False],
     [False, False, False],
     [False, False, False],
     [False, False, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [True, False, False]]],
   [[False, True],
    [True, False],
    [False, False],
    [False, False],
    [False, False],
    [False, False],
    [False, False],
    [False, False],
    [True, True],
    [True, 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: 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]]],
  ['control: 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]]],
  ['control: reset while condition true',
   [1, False, [[True, False, False], [True, False, True], [True, False, False]]],
   [[True, False], [True, False], [True, False]]],
  ['control: 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]]],
  ['control: 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 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: scenario 10',
   [2,
    False,
    [[True, False, False],
     [False, False, True],
     [False, False, False],
     [True, False, False],
     [True, True, True],
     [True, False, False],
     [False, False, False],
     [False, False, True],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [True, False, False],
     [False, True, False],
     [False, False, True],
     [True, False, False]]],
   [[False, True],
    [False, True],
    [False, True],
    [False, True],
    [True, True],
    [True, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [True, False],
    [False, True],
    [False, True],
    [False, 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]]],
  ['control: 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]]],
  ['control: reset while condition true',
   [1, False, [[True, False, False], [True, False, True], [True, False, False]]],
   [[True, False], [True, False], [True, False]]],
  ['control: 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 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: scenario 13',
   [2,
    False,
    [[True, True, False],
     [True, True, False],
     [True, False, False],
     [False, True, False],
     [False, False, False],
     [False, False, False],
     [True, True, False],
     [True, False, True],
     [True, False, False],
     [True, False, True],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, True, False]]],
   [[False, True],
    [True, True],
    [True, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [True, False],
    [True, False],
    [True, False],
    [False, False],
    [False, False],
    [False, False],
    [False, 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]]],
  ['control: 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]]],
  ['control: reset while condition true',
   [1, False, [[True, False, False], [True, False, True], [True, False, False]]],
   [[True, False], [True, False], [True, False]]],
  ['control: 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,
    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]]]]]
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 fixtureActualExpectedOutcome
regression: latched with ack and reset[[False, True], [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], [False, True], [False, True], [True, False], [True, False], [True, False]][[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]Failed
control: realarm after ack[[True, False], [True, True], [False, True], [True, False]][[True, False], [True, True], [False, True], [True, False]]Passed
control: reset while condition true[[True, False], [True, False], [True, False]][[True, False], [True, False], [True, False]]Passed
control: ack on latched alarm[[True, False], [True, True], [True, True], [False, True]][[True, False], [True, True], [True, True], [False, True]]Passed
control: 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
control: 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], [False, True], [False, True], [False, True], [False, True], [True, False], [True, True], [False, True], [False, True], [True, False], [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 / 48717b1574591dcd58da8094f0e2b295a582546aa46b1727ee353adaa8d608ca

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 max(count - 1, 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]]],
  ['control: 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]]],
  ['control: reset while condition true',
   [1, False, [[True, False, False], [True, False, True], [True, False, False]]],
   [[True, False], [True, False], [True, False]]],
  ['control: 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]]],
  ['control: 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]]],
  ['control: 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 12',
   [2,
    False,
    [[False, False, True],
     [False, False, False],
     [False, False, False],
     [True, False, False],
     [True, True, True],
     [True, False, True],
     [False, False, True],
     [False, False, False],
     [True, False, False],
     [True, False, False],
     [True, True, False]]],
   [[False, True],
    [False, True],
    [False, True],
    [False, True],
    [True, True],
    [True, True],
    [False, True],
    [False, True],
    [False, True],
    [True, False],
    [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]]],
  ['control: 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]]],
  ['control: reset while condition true',
   [1, False, [[True, False, False], [True, False, True], [True, False, False]]],
   [[True, False], [True, False], [True, False]]],
  ['control: 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]]],
  ['control: 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 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: 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: scenario 8',
   [2,
    False,
    [[True, False, False],
     [True, False, False],
     [False, False, False],
     [False, False, False],
     [False, False, False],
     [False, False, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [True, False, False]]],
   [[False, True],
    [True, False],
    [False, False],
    [False, False],
    [False, False],
    [False, False],
    [False, False],
    [False, False],
    [True, True],
    [True, 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: 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]]],
  ['control: 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]]],
  ['control: reset while condition true',
   [1, False, [[True, False, False], [True, False, True], [True, False, False]]],
   [[True, False], [True, False], [True, False]]],
  ['control: 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]]],
  ['control: 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 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: scenario 10',
   [2,
    False,
    [[True, False, False],
     [False, False, True],
     [False, False, False],
     [True, False, False],
     [True, True, True],
     [True, False, False],
     [False, False, False],
     [False, False, True],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [True, False, False],
     [False, True, False],
     [False, False, True],
     [True, False, False]]],
   [[False, True],
    [False, True],
    [False, True],
    [False, True],
    [True, True],
    [True, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [True, False],
    [False, True],
    [False, True],
    [False, 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]]],
  ['control: 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]]],
  ['control: reset while condition true',
   [1, False, [[True, False, False], [True, False, True], [True, False, False]]],
   [[True, False], [True, False], [True, False]]],
  ['control: 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 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: scenario 13',
   [2,
    False,
    [[True, True, False],
     [True, True, False],
     [True, False, False],
     [False, True, False],
     [False, False, False],
     [False, False, False],
     [True, True, False],
     [True, False, True],
     [True, False, False],
     [True, False, True],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, True, False]]],
   [[False, True],
    [True, True],
    [True, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [True, False],
    [True, False],
    [True, False],
    [False, False],
    [False, False],
    [False, False],
    [False, 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]]],
  ['control: 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]]],
  ['control: reset while condition true',
   [1, False, [[True, False, False], [True, False, True], [True, False, False]]],
   [[True, False], [True, False], [True, False]]],
  ['control: 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,
    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]]]]]
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 fixtureActualExpectedOutcome
regression: latched with ack and reset[[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]][[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]Passed
regression: chattering condition[[False, True], [False, True], [False, True], [False, True], [True, False], [True, False]][[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]Failed
control: realarm after ack[[True, False], [True, True], [False, True], [True, False]][[True, False], [True, True], [False, True], [True, False]]Passed
control: reset while condition true[[True, False], [True, False], [True, False]][[True, False], [True, False], [True, False]]Passed
control: ack on latched alarm[[True, False], [True, True], [True, True], [False, True]][[True, False], [True, True], [True, True], [False, True]]Passed
control: 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
control: 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], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [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]]Passed

SHA-256 / 7a4b7d255d41ef357e83a2a1cd40b89a0d15eda3790fb3cef26d82e1527ece7e

3 / The verified repair

Exit 0
"""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]]],
  ['control: 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]]],
  ['control: reset while condition true',
   [1, False, [[True, False, False], [True, False, True], [True, False, False]]],
   [[True, False], [True, False], [True, False]]],
  ['control: 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]]],
  ['control: 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]]],
  ['control: 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 12',
   [2,
    False,
    [[False, False, True],
     [False, False, False],
     [False, False, False],
     [True, False, False],
     [True, True, True],
     [True, False, True],
     [False, False, True],
     [False, False, False],
     [True, False, False],
     [True, False, False],
     [True, True, False]]],
   [[False, True],
    [False, True],
    [False, True],
    [False, True],
    [True, True],
    [True, True],
    [False, True],
    [False, True],
    [False, True],
    [True, False],
    [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]]],
  ['control: 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]]],
  ['control: reset while condition true',
   [1, False, [[True, False, False], [True, False, True], [True, False, False]]],
   [[True, False], [True, False], [True, False]]],
  ['control: 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]]],
  ['control: 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 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: 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: scenario 8',
   [2,
    False,
    [[True, False, False],
     [True, False, False],
     [False, False, False],
     [False, False, False],
     [False, False, False],
     [False, False, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [True, False, False]]],
   [[False, True],
    [True, False],
    [False, False],
    [False, False],
    [False, False],
    [False, False],
    [False, False],
    [False, False],
    [True, True],
    [True, 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: 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]]],
  ['control: 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]]],
  ['control: reset while condition true',
   [1, False, [[True, False, False], [True, False, True], [True, False, False]]],
   [[True, False], [True, False], [True, False]]],
  ['control: 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]]],
  ['control: 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 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: scenario 10',
   [2,
    False,
    [[True, False, False],
     [False, False, True],
     [False, False, False],
     [True, False, False],
     [True, True, True],
     [True, False, False],
     [False, False, False],
     [False, False, True],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [True, False, False],
     [False, True, False],
     [False, False, True],
     [True, False, False]]],
   [[False, True],
    [False, True],
    [False, True],
    [False, True],
    [True, True],
    [True, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [True, False],
    [False, True],
    [False, True],
    [False, 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]]],
  ['control: 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]]],
  ['control: reset while condition true',
   [1, False, [[True, False, False], [True, False, True], [True, False, False]]],
   [[True, False], [True, False], [True, False]]],
  ['control: 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 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: scenario 13',
   [2,
    False,
    [[True, True, False],
     [True, True, False],
     [True, False, False],
     [False, True, False],
     [False, False, False],
     [False, False, False],
     [True, True, False],
     [True, False, True],
     [True, False, False],
     [True, False, True],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, True, False]]],
   [[False, True],
    [True, True],
    [True, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [True, False],
    [True, False],
    [True, False],
    [False, False],
    [False, False],
    [False, False],
    [False, 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]]],
  ['control: 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]]],
  ['control: reset while condition true',
   [1, False, [[True, False, False], [True, False, True], [True, False, False]]],
   [[True, False], [True, False], [True, False]]],
  ['control: 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,
    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]]]]]
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 fixtureActualExpectedOutcome
regression: latched with ack and reset[[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]][[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]Passed
regression: chattering condition[[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]][[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]Passed
control: realarm after ack[[True, False], [True, True], [False, True], [True, False]][[True, False], [True, True], [False, True], [True, False]]Passed
control: reset while condition true[[True, False], [True, False], [True, False]][[True, False], [True, False], [True, False]]Passed
control: ack on latched alarm[[True, False], [True, True], [True, True], [False, True]][[True, False], [True, True], [True, True], [False, True]]Passed
control: 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
control: 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], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [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]]Passed

SHA-256 / 2d6cfc25b894fcd4c31e619b277b5cd9c462b3721769e041e8ed9f8e27217a2c

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.260773+00:00.

Case digest / e0efd57631b355192d2f3a3341a55981272f4e94c0ad726b49722ba0af2043e4