FAILURE MAP
← Case archive

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

Alarm activates one scan after its minimum duration · case 01

Every alarm is announced one scan late.

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

ROOT CAUSE

The activation test uses count > min_scans.

THE FAILURE

The activation test uses count > min_scans.

Unsuccessful approach: Comparing against min_scans - 1 activates one scan early.

Case contract

Digital alarm instruction evaluated per scan; scans is a list of [condition, ack, reset], min_scans >= 1. The alarm activates when the condition has been true for min_scans consecutive scans; activation clears the acknowledged flag. A non-latched alarm clears when the condition goes false; a latched alarm clears only on a reset while the condition is false. ack sets acknowledged. Return [in_alarm, acknowledged] per scan.

Why this case matters

Ladder programs are executed as repeated scans; each defect here changes what a rung, timer, counter or data-table instruction reports on a particular scan, which is how commissioning and field faults are actually observed.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(min_scans, latched, scans):
    in_alarm = False
    acked = True
    count = 0
    out = []
    for cond, ack, reset in scans:
        count = count + 1 if cond else 0
        if count > min_scans and cond and not in_alarm:
            in_alarm = True
            acked = False
        elif in_alarm and not cond and (not latched or reset):
            in_alarm = False
        if ack and not acked:
            acked = True
        out.append([in_alarm, acked])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: latched with ack and reset',
   [2,
    True,
    [[True, False, False],
     [True, False, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [True, False, False]]],
   [[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
  ['regression: chattering condition',
   [3,
    False,
    [[True, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [True, False, False],
     [True, False, False]]],
   [[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
  ['regression: realarm after ack',
   [1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
   [[True, False], [True, True], [False, True], [True, False]]],
  ['regression: reset while condition true',
   [1, False, [[True, False, False], [True, False, True], [True, False, False]]],
   [[True, False], [True, False], [True, False]]],
  ['regression: ack on latched alarm',
   [1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
   [[True, False], [True, True], [True, True], [False, True]]],
  ['regression: scenario 1',
   [1,
    False,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, True, False],
     [True, False, False],
     [True, False, False],
     [False, False, False],
     [False, False, False],
     [True, False, False]]],
   [[True, False],
    [False, False],
    [True, False],
    [False, False],
    [True, True],
    [True, True],
    [True, True],
    [False, True],
    [False, True],
    [True, False]]],
  ['regression: scenario 2',
   [1,
    True,
    [[False, False, False],
     [True, False, False],
     [True, False, False],
     [False, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [False, False, True],
     [False, False, False],
     [False, True, False],
     [True, False, False],
     [False, False, False]]],
   [[False, True],
    [True, False],
    [True, False],
    [True, False],
    [True, False],
    [True, False],
    [True, False],
    [False, False],
    [False, False],
    [False, True],
    [True, False],
    [True, False]]],
  ['regression: scenario 3',
   [3,
    False,
    [[True, False, False],
     [True, False, True],
     [False, False, False],
     [False, False, False],
     [False, False, True],
     [True, False, False],
     [True, True, False],
     [False, True, False],
     [False, False, False],
     [True, False, False],
     [True, False, False],
     [True, False, False]]],
   [[False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [True, False]]]],
 [['regression: chattering condition',
   [3,
    False,
    [[True, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [True, False, False],
     [True, False, False]]],
   [[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
  ['regression: scenario 2',
   [3,
    False,
    [[False, False, False],
     [True, False, False],
     [False, False, False],
     [False, False, False],
     [False, False, True],
     [False, True, False],
     [True, False, False],
     [False, False, False],
     [True, True, False],
     [True, False, False],
     [True, False, False]]],
   [[False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [True, False]]],
  ['regression: latched with ack and reset',
   [2,
    True,
    [[True, False, False],
     [True, False, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [True, False, False]]],
   [[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
  ['regression: realarm after ack',
   [1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
   [[True, False], [True, True], [False, True], [True, False]]],
  ['regression: reset while condition true',
   [1, False, [[True, False, False], [True, False, True], [True, False, False]]],
   [[True, False], [True, False], [True, False]]],
  ['regression: ack on latched alarm',
   [1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
   [[True, False], [True, True], [True, True], [False, True]]],
  ['regression: scenario 1',
   [1,
    False,
    [[False, False, False],
     [False, False, True],
     [False, False, False],
     [True, True, False],
     [False, False, False],
     [True, True, False],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [False, False, True],
     [True, False, False]]],
   [[False, True],
    [False, True],
    [False, True],
    [True, True],
    [False, True],
    [True, True],
    [True, True],
    [True, True],
    [True, True],
    [False, True],
    [True, False]]],
  ['regression: scenario 3',
   [2,
    False,
    [[True, False, False],
     [True, False, True],
     [False, True, True],
     [False, False, False],
     [False, False, True],
     [True, False, False],
     [True, False, False],
     [True, True, False],
     [True, False, False],
     [True, False, True],
     [False, False, False],
     [False, False, False]]],
   [[False, True],
    [True, False],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [True, False],
    [True, True],
    [True, True],
    [True, True],
    [False, True],
    [False, True]]]],
 [['regression: realarm after ack',
   [1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
   [[True, False], [True, True], [False, True], [True, False]]],
  ['regression: scenario 1',
   [3,
    False,
    [[True, False, False],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [False, False, True],
     [False, False, True]]],
   [[False, True],
    [False, True],
    [True, False],
    [True, False],
    [False, False],
    [False, False],
    [False, False],
    [True, False],
    [False, False],
    [False, False]]],
  ['regression: latched with ack and reset',
   [2,
    True,
    [[True, False, False],
     [True, False, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [True, False, False]]],
   [[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
  ['regression: chattering condition',
   [3,
    False,
    [[True, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [True, False, False],
     [True, False, False]]],
   [[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
  ['regression: reset while condition true',
   [1, False, [[True, False, False], [True, False, True], [True, False, False]]],
   [[True, False], [True, False], [True, False]]],
  ['regression: ack on latched alarm',
   [1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
   [[True, False], [True, True], [True, True], [False, True]]],
  ['regression: scenario 2',
   [2,
    True,
    [[False, True, False],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, True],
     [True, False, False],
     [False, False, False],
     [False, True, False],
     [True, False, False],
     [False, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [True, True, True]]],
   [[False, True],
    [False, True],
    [True, False],
    [True, False],
    [True, False],
    [True, False],
    [True, False],
    [True, False],
    [True, True],
    [True, True],
    [True, True],
    [True, True],
    [True, True],
    [True, True],
    [True, True],
    [True, True]]],
  ['regression: scenario 3',
   [3,
    True,
    [[True, False, False],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [True, False, True],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [False, True, False],
     [False, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False]]],
   [[False, True],
    [False, True],
    [True, False],
    [True, False],
    [True, False],
    [True, False],
    [True, False],
    [True, False],
    [True, True],
    [True, True],
    [True, True],
    [True, True],
    [True, True]]]],
 [['regression: reset while condition true',
   [1, False, [[True, False, False], [True, False, True], [True, False, False]]],
   [[True, False], [True, False], [True, False]]],
  ['regression: scenario 2',
   [2,
    False,
    [[False, True, False],
     [True, False, False],
     [True, True, False],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [True, False, True],
     [False, False, False],
     [True, False, True],
     [True, True, False],
     [True, False, False]]],
   [[False, True],
    [False, True],
    [True, True],
    [True, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [True, True],
    [True, True],
    [False, True],
    [False, True],
    [True, True],
    [True, True]]],
  ['regression: latched with ack and reset',
   [2,
    True,
    [[True, False, False],
     [True, False, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [True, False, False]]],
   [[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
  ['regression: chattering condition',
   [3,
    False,
    [[True, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [True, False, False],
     [True, False, False]]],
   [[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
  ['regression: realarm after ack',
   [1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
   [[True, False], [True, True], [False, True], [True, False]]],
  ['regression: ack on latched alarm',
   [1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
   [[True, False], [True, True], [True, True], [False, True]]],
  ['regression: scenario 1',
   [2,
    True,
    [[False, True, False],
     [True, False, False],
     [False, False, False],
     [False, False, True],
     [False, False, True],
     [True, False, True],
     [True, True, False],
     [True, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [True, False, False]]],
   [[False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [True, True],
    [True, True],
    [True, True],
    [True, True],
    [True, True],
    [True, True],
    [True, True]]],
  ['regression: scenario 3',
   [1,
    True,
    [[False, False, False],
     [False, False, False],
     [False, False, True],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, True],
     [True, False, False],
     [True, True, False],
     [True, False, True],
     [True, False, True],
     [True, True, True]]],
   [[False, True],
    [False, True],
    [False, True],
    [False, True],
    [True, False],
    [True, False],
    [True, False],
    [True, False],
    [True, True],
    [True, True],
    [True, True],
    [True, True]]]],
 [['regression: ack on latched alarm',
   [1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
   [[True, False], [True, True], [True, True], [False, True]]],
  ['regression: scenario 4',
   [3,
    False,
    [[True, False, False],
     [True, False, True],
     [True, False, True],
     [True, False, True],
     [False, False, False],
     [True, False, True],
     [False, False, False],
     [False, False, False],
     [False, False, False],
     [False, False, True]]],
   [[False, True],
    [False, True],
    [True, False],
    [True, False],
    [False, False],
    [False, False],
    [False, False],
    [False, False],
    [False, False],
    [False, False]]],
  ['regression: latched with ack and reset',
   [2,
    True,
    [[True, False, False],
     [True, False, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [True, False, False]]],
   [[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
  ['regression: chattering condition',
   [3,
    False,
    [[True, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [True, False, False],
     [True, False, False]]],
   [[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
  ['regression: realarm after ack',
   [1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
   [[True, False], [True, True], [False, True], [True, False]]],
  ['regression: reset while condition true',
   [1, False, [[True, False, False], [True, False, True], [True, False, False]]],
   [[True, False], [True, False], [True, False]]],
  ['regression: scenario 1',
   [2,
    False,
    [[False, False, False],
     [True, True, False],
     [True, True, False],
     [False, False, True],
     [False, False, True],
     [True, True, False],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [True, False, True]]],
   [[False, True],
    [False, True],
    [True, True],
    [False, True],
    [False, True],
    [False, True],
    [True, False],
    [False, False],
    [False, False],
    [True, False]]],
  ['regression: scenario 2',
   [2,
    False,
    [[False, True, False],
     [True, True, True],
     [False, False, False],
     [False, True, True],
     [True, False, False],
     [False, False, False],
     [True, False, True],
     [False, False, False],
     [True, False, False],
     [False, True, False],
     [False, True, False]]],
   [[False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True]]]]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
regression: latched with ack and reset[[False, True], [False, True], [False, True], [False, True], [False, True], [False, True]][[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]Failed
regression: chattering condition[[False, True], [False, True], [False, True], [False, True], [False, True], [False, True]][[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]Failed
regression: realarm after ack[[False, True], [True, True], [False, True], [False, True]][[True, False], [True, True], [False, True], [True, False]]Failed
regression: reset while condition true[[False, True], [True, False], [True, False]][[True, False], [True, False], [True, False]]Failed
regression: ack on latched alarm[[False, True], [False, True], [False, True], [False, True]][[True, False], [True, True], [True, True], [False, True]]Failed
regression: scenario 1[[False, True], [False, True], [False, True], [False, True], [False, True], [True, False], [True, False], [False, False], [False, False], [False, False]][[True, False], [False, False], [True, False], [False, False], [True, True], [True, True], [True, True], [False, True], [False, True], [True, False]]Failed
regression: scenario 2[[False, True], [False, True], [True, False], [True, False], [True, False], [True, False], [True, False], [False, False], [False, False], [False, True], [False, True], [False, True]][[False, True], [True, False], [True, False], [True, False], [True, False], [True, False], [True, False], [False, False], [False, False], [False, True], [True, False], [True, False]]Failed
regression: scenario 3[[False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True]][[False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]Failed

SHA-256 / b70615e360e93627067369df83e2e1fbf909de7ebaccaf3b7d8b4e56b67bd056

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(min_scans, latched, scans):
    in_alarm = False
    acked = True
    count = 0
    out = []
    for cond, ack, reset in scans:
        count = count + 1 if cond else 0
        if count >= min_scans - 1 and cond and not in_alarm:
            in_alarm = True
            acked = False
        elif in_alarm and not cond and (not latched or reset):
            in_alarm = False
        if ack and not acked:
            acked = True
        out.append([in_alarm, acked])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: latched with ack and reset',
   [2,
    True,
    [[True, False, False],
     [True, False, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [True, False, False]]],
   [[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
  ['regression: chattering condition',
   [3,
    False,
    [[True, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [True, False, False],
     [True, False, False]]],
   [[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
  ['regression: realarm after ack',
   [1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
   [[True, False], [True, True], [False, True], [True, False]]],
  ['regression: reset while condition true',
   [1, False, [[True, False, False], [True, False, True], [True, False, False]]],
   [[True, False], [True, False], [True, False]]],
  ['regression: ack on latched alarm',
   [1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
   [[True, False], [True, True], [True, True], [False, True]]],
  ['regression: scenario 1',
   [1,
    False,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, True, False],
     [True, False, False],
     [True, False, False],
     [False, False, False],
     [False, False, False],
     [True, False, False]]],
   [[True, False],
    [False, False],
    [True, False],
    [False, False],
    [True, True],
    [True, True],
    [True, True],
    [False, True],
    [False, True],
    [True, False]]],
  ['regression: scenario 2',
   [1,
    True,
    [[False, False, False],
     [True, False, False],
     [True, False, False],
     [False, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [False, False, True],
     [False, False, False],
     [False, True, False],
     [True, False, False],
     [False, False, False]]],
   [[False, True],
    [True, False],
    [True, False],
    [True, False],
    [True, False],
    [True, False],
    [True, False],
    [False, False],
    [False, False],
    [False, True],
    [True, False],
    [True, False]]],
  ['regression: scenario 3',
   [3,
    False,
    [[True, False, False],
     [True, False, True],
     [False, False, False],
     [False, False, False],
     [False, False, True],
     [True, False, False],
     [True, True, False],
     [False, True, False],
     [False, False, False],
     [True, False, False],
     [True, False, False],
     [True, False, False]]],
   [[False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [True, False]]]],
 [['regression: chattering condition',
   [3,
    False,
    [[True, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [True, False, False],
     [True, False, False]]],
   [[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
  ['regression: scenario 2',
   [3,
    False,
    [[False, False, False],
     [True, False, False],
     [False, False, False],
     [False, False, False],
     [False, False, True],
     [False, True, False],
     [True, False, False],
     [False, False, False],
     [True, True, False],
     [True, False, False],
     [True, False, False]]],
   [[False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [True, False]]],
  ['regression: latched with ack and reset',
   [2,
    True,
    [[True, False, False],
     [True, False, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [True, False, False]]],
   [[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
  ['regression: realarm after ack',
   [1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
   [[True, False], [True, True], [False, True], [True, False]]],
  ['regression: reset while condition true',
   [1, False, [[True, False, False], [True, False, True], [True, False, False]]],
   [[True, False], [True, False], [True, False]]],
  ['regression: ack on latched alarm',
   [1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
   [[True, False], [True, True], [True, True], [False, True]]],
  ['regression: scenario 1',
   [1,
    False,
    [[False, False, False],
     [False, False, True],
     [False, False, False],
     [True, True, False],
     [False, False, False],
     [True, True, False],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [False, False, True],
     [True, False, False]]],
   [[False, True],
    [False, True],
    [False, True],
    [True, True],
    [False, True],
    [True, True],
    [True, True],
    [True, True],
    [True, True],
    [False, True],
    [True, False]]],
  ['regression: scenario 3',
   [2,
    False,
    [[True, False, False],
     [True, False, True],
     [False, True, True],
     [False, False, False],
     [False, False, True],
     [True, False, False],
     [True, False, False],
     [True, True, False],
     [True, False, False],
     [True, False, True],
     [False, False, False],
     [False, False, False]]],
   [[False, True],
    [True, False],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [True, False],
    [True, True],
    [True, True],
    [True, True],
    [False, True],
    [False, True]]]],
 [['regression: realarm after ack',
   [1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
   [[True, False], [True, True], [False, True], [True, False]]],
  ['regression: scenario 1',
   [3,
    False,
    [[True, False, False],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [False, False, True],
     [False, False, True]]],
   [[False, True],
    [False, True],
    [True, False],
    [True, False],
    [False, False],
    [False, False],
    [False, False],
    [True, False],
    [False, False],
    [False, False]]],
  ['regression: latched with ack and reset',
   [2,
    True,
    [[True, False, False],
     [True, False, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [True, False, False]]],
   [[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
  ['regression: chattering condition',
   [3,
    False,
    [[True, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [True, False, False],
     [True, False, False]]],
   [[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
  ['regression: reset while condition true',
   [1, False, [[True, False, False], [True, False, True], [True, False, False]]],
   [[True, False], [True, False], [True, False]]],
  ['regression: ack on latched alarm',
   [1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
   [[True, False], [True, True], [True, True], [False, True]]],
  ['regression: scenario 2',
   [2,
    True,
    [[False, True, False],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, True],
     [True, False, False],
     [False, False, False],
     [False, True, False],
     [True, False, False],
     [False, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [True, True, True]]],
   [[False, True],
    [False, True],
    [True, False],
    [True, False],
    [True, False],
    [True, False],
    [True, False],
    [True, False],
    [True, True],
    [True, True],
    [True, True],
    [True, True],
    [True, True],
    [True, True],
    [True, True],
    [True, True]]],
  ['regression: scenario 3',
   [3,
    True,
    [[True, False, False],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [True, False, True],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [False, True, False],
     [False, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False]]],
   [[False, True],
    [False, True],
    [True, False],
    [True, False],
    [True, False],
    [True, False],
    [True, False],
    [True, False],
    [True, True],
    [True, True],
    [True, True],
    [True, True],
    [True, True]]]],
 [['regression: reset while condition true',
   [1, False, [[True, False, False], [True, False, True], [True, False, False]]],
   [[True, False], [True, False], [True, False]]],
  ['regression: scenario 2',
   [2,
    False,
    [[False, True, False],
     [True, False, False],
     [True, True, False],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [True, False, True],
     [False, False, False],
     [True, False, True],
     [True, True, False],
     [True, False, False]]],
   [[False, True],
    [False, True],
    [True, True],
    [True, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [True, True],
    [True, True],
    [False, True],
    [False, True],
    [True, True],
    [True, True]]],
  ['regression: latched with ack and reset',
   [2,
    True,
    [[True, False, False],
     [True, False, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [True, False, False]]],
   [[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
  ['regression: chattering condition',
   [3,
    False,
    [[True, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [True, False, False],
     [True, False, False]]],
   [[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
  ['regression: realarm after ack',
   [1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
   [[True, False], [True, True], [False, True], [True, False]]],
  ['regression: ack on latched alarm',
   [1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
   [[True, False], [True, True], [True, True], [False, True]]],
  ['regression: scenario 1',
   [2,
    True,
    [[False, True, False],
     [True, False, False],
     [False, False, False],
     [False, False, True],
     [False, False, True],
     [True, False, True],
     [True, True, False],
     [True, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [True, False, False]]],
   [[False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [True, True],
    [True, True],
    [True, True],
    [True, True],
    [True, True],
    [True, True],
    [True, True]]],
  ['regression: scenario 3',
   [1,
    True,
    [[False, False, False],
     [False, False, False],
     [False, False, True],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, True],
     [True, False, False],
     [True, True, False],
     [True, False, True],
     [True, False, True],
     [True, True, True]]],
   [[False, True],
    [False, True],
    [False, True],
    [False, True],
    [True, False],
    [True, False],
    [True, False],
    [True, False],
    [True, True],
    [True, True],
    [True, True],
    [True, True]]]],
 [['regression: ack on latched alarm',
   [1, True, [[True, False, False], [False, True, False], [False, False, False], [False, False, True]]],
   [[True, False], [True, True], [True, True], [False, True]]],
  ['regression: scenario 4',
   [3,
    False,
    [[True, False, False],
     [True, False, True],
     [True, False, True],
     [True, False, True],
     [False, False, False],
     [True, False, True],
     [False, False, False],
     [False, False, False],
     [False, False, False],
     [False, False, True]]],
   [[False, True],
    [False, True],
    [True, False],
    [True, False],
    [False, False],
    [False, False],
    [False, False],
    [False, False],
    [False, False],
    [False, False]]],
  ['regression: latched with ack and reset',
   [2,
    True,
    [[True, False, False],
     [True, False, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [True, False, False]]],
   [[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]],
  ['regression: chattering condition',
   [3,
    False,
    [[True, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [True, False, False],
     [True, False, False]]],
   [[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]],
  ['regression: realarm after ack',
   [1, False, [[True, False, False], [True, True, False], [False, False, False], [True, False, False]]],
   [[True, False], [True, True], [False, True], [True, False]]],
  ['regression: reset while condition true',
   [1, False, [[True, False, False], [True, False, True], [True, False, False]]],
   [[True, False], [True, False], [True, False]]],
  ['regression: scenario 1',
   [2,
    False,
    [[False, False, False],
     [True, True, False],
     [True, True, False],
     [False, False, True],
     [False, False, True],
     [True, True, False],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [True, False, True]]],
   [[False, True],
    [False, True],
    [True, True],
    [False, True],
    [False, True],
    [False, True],
    [True, False],
    [False, False],
    [False, False],
    [True, False]]],
  ['regression: scenario 2',
   [2,
    False,
    [[False, True, False],
     [True, True, True],
     [False, False, False],
     [False, True, True],
     [True, False, False],
     [False, False, False],
     [True, False, True],
     [False, False, False],
     [True, False, False],
     [False, True, False],
     [False, True, False]]],
   [[False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True]]]]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
regression: latched with ack and reset[[True, False], [True, False], [True, False], [True, True], [False, True], [True, False]][[False, True], [True, False], [True, False], [True, True], [False, True], [False, True]]Failed
regression: chattering condition[[False, True], [True, False], [False, False], [False, False], [True, False], [True, False]][[False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]Failed
regression: realarm after ack[[True, False], [True, True], [False, True], [True, False]][[True, False], [True, True], [False, True], [True, False]]Passed
regression: reset while condition true[[True, False], [True, False], [True, False]][[True, False], [True, False], [True, False]]Passed
regression: ack on latched alarm[[True, False], [True, True], [True, True], [False, True]][[True, False], [True, True], [True, True], [False, True]]Passed
regression: scenario 1[[True, False], [False, False], [True, False], [False, False], [True, True], [True, True], [True, True], [False, True], [False, True], [True, False]][[True, False], [False, False], [True, False], [False, False], [True, True], [True, True], [True, True], [False, True], [False, True], [True, False]]Passed
regression: scenario 2[[False, True], [True, False], [True, False], [True, False], [True, False], [True, False], [True, False], [False, False], [False, False], [False, True], [True, False], [True, False]][[False, True], [True, False], [True, False], [True, False], [True, False], [True, False], [True, False], [False, False], [False, False], [False, True], [True, False], [True, False]]Passed
regression: scenario 3[[False, True], [True, False], [False, False], [False, False], [False, False], [False, False], [True, True], [False, True], [False, True], [False, True], [True, False], [True, False]][[False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [False, True], [True, False]]Failed

SHA-256 / 37936ab78458eb9096104972fc6b3ab08bc035d632d4f68fc183630b7e56f3cc

HELD IN THE MEMBER ARCHIVE

The verified repair and its recorded checks are member-only.

This mechanism has 8 recorded checks per implementation. The open-access tier publishes the failure and the unsuccessful fix; the repaired source that passes every check, and the observations that prove it, are available to members.

Every case sharing this mechanism uses the same contract and the same repair, so this one record is held back for all of them.

Member access is invitation-based. Sign in with your invited account to inspect the repair.

Sign in to the archive ↗

Verification & scope

A deterministic bounded teaching model of one PLC instruction or rung pattern evaluated scan by scan. The stated contract is a stipulated toy convention, not a claim of conformance to any vendor controller or IEC 61131-3 runtime. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.

Observations recorded using Python 3.12.14 at 2026-09-29T14:51:43.357003+00:00.

Case digest / f6fdb9e6e7525afd5b3b0948f8476ff51e7e9eb257c63a67068e0e69836caef8