FAILURE MAP
← Case archive

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

CTU overflow bit clears on the next up count · case 01

OV disappears after one more count even though no reset occurred.

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

ROOT CAUSE

The up-count branch clears OV before testing for a new overflow.

VERIFIED REPAIR

OV is latched until the RES rung clears it.

Unsuccessful approach: Clearing OV on a down count instead still loses the latched overflow.

Case contract

Up/down counter pair sharing one 16-bit signed accumulator, evaluated per scan; scans is a list of [cu, cd, res]. CU counts on its rising edge and CD on its own rising edge (both in one scan cancel). Incrementing 32767 wraps to -32768 and latches OV; decrementing -32768 wraps to 32767 and latches UN. A later RES rung clears ACC, OV and UN but not the edge memories. DN is ACC >= preset. Return [ACC, DN, OV, UN] per scan.

Why this case matters

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

1 / The failure

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

N = 1
observations = []
def solve(preset, start, scans):
    acc = start
    ov = False
    un = False
    pcu = False
    pcd = False
    out = []
    for cu, cd, res in scans:
        cu = bool(cu)
        cd = bool(cd)
        if cu and not pcu:
            acc += 1
            ov = False
            if acc > 32767:
                acc = -32768
                ov = True
        if cd and not pcd:
            acc -= 1
            if acc < -32768:
                acc = 32767
                un = True
        pcu = cu
        pcd = cd
        if res:
            acc = 0
            ov = False
            un = False
        out.append([acc, acc >= preset, ov, un])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: overflow wrap',
   [0,
    32766,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False]]],
   [[32767, True, False, False],
    [32767, True, False, False],
    [-32768, False, True, False],
    [-32768, False, True, False],
    [-32767, False, True, False]]],
  ['regression: scenario 5',
   [5,
    32766,
    [[False, False, False],
     [False, False, False],
     [True, False, False],
     [False, True, False],
     [True, True, False],
     [True, False, False],
     [True, False, False],
     [False, False, False],
     [False, False, False],
     [True, True, False],
     [False, False, False],
     [False, False, False],
     [False, True, False]]],
   [[32766, True, False, False],
    [32766, True, False, False],
    [32767, True, False, False],
    [32766, True, False, False],
    [32767, True, False, False],
    [32767, True, False, False],
    [32767, True, False, False],
    [32767, True, False, False],
    [32767, True, False, False],
    [32767, True, True, True],
    [32767, True, True, True],
    [32767, True, True, True],
    [32766, True, True, True]]],
  ['control: held count input',
   [3, 0, [[True, False, False], [True, False, False], [False, False, False], [True, False, False]]],
   [[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]]],
  ['control: underflow then reset',
   [0,
    -32767,
    [[False, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [False, False, False]]],
   [[-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [0, True, False, False],
    [0, True, False, False]]],
  ['control: simultaneous edges',
   [1,
    0,
    [[True, True, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [False, True, False]]],
   [[0, False, False, False],
    [0, False, False, False],
    [1, True, False, False],
    [0, False, False, False],
    [0, False, False, False]]],
  ['control: count down while up held',
   [0, 5, [[True, False, False], [True, True, False], [True, False, False], [True, True, False]]],
   [[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]]],
  ['control: scenario 1',
   [0,
    1,
    [[True, False, False],
     [True, False, False],
     [True, False, False],
     [False, True, True],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [False, False, False],
     [False, False, False]]],
   [[2, True, False, False],
    [2, True, False, False],
    [2, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [1, True, False, False]]],
  ['control: scenario 2',
   [3,
    32766,
    [[True, True, False],
     [False, False, False],
     [True, True, False],
     [False, False, True],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, True, False],
     [False, False, False],
     [True, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, False]]],
   [[32766, True, False, False],
    [32766, True, False, False],
    [32766, True, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [0, False, False, False],
    [0, False, False, False]]]],
 [['regression: scenario 7',
   [32767,
    -32768,
    [[True, True, False],
     [True, False, False],
     [False, True, False],
     [False, True, 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],
     [False, False, False]]],
   [[-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [32767, True, False, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32767, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True]]],
  ['regression: scenario 20',
   [5,
    32767,
    [[True, True, False],
     [False, True, False],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [False, False, False],
     [False, False, False],
     [True, True, False],
     [False, False, False],
     [False, True, False]]],
   [[32767, True, True, True],
    [32767, True, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [32767, True, True, True]]],
  ['control: held count input',
   [3, 0, [[True, False, False], [True, False, False], [False, False, False], [True, False, False]]],
   [[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]]],
  ['regression: overflow wrap',
   [0,
    32766,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False]]],
   [[32767, True, False, False],
    [32767, True, False, False],
    [-32768, False, True, False],
    [-32768, False, True, False],
    [-32767, False, True, False]]],
  ['control: underflow then reset',
   [0,
    -32767,
    [[False, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [False, False, False]]],
   [[-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [0, True, False, False],
    [0, True, False, False]]],
  ['control: simultaneous edges',
   [1,
    0,
    [[True, True, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [False, True, False]]],
   [[0, False, False, False],
    [0, False, False, False],
    [1, True, False, False],
    [0, False, False, False],
    [0, False, False, False]]],
  ['control: count down while up held',
   [0, 5, [[True, False, False], [True, True, False], [True, False, False], [True, True, False]]],
   [[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]]],
  ['control: scenario 1',
   [2,
    -32767,
    [[True, False, False],
     [True, False, False],
     [False, False, False],
     [False, False, False],
     [False, True, False],
     [False, False, False],
     [True, False, False],
     [True, False, False]]],
   [[-32766, False, False, False],
    [-32766, False, False, False],
    [-32766, False, False, False],
    [-32766, False, False, False],
    [-32767, False, False, False],
    [-32767, False, False, False],
    [-32766, False, False, False],
    [-32766, False, False, False]]]],
 [['regression: overflow wrap',
   [0,
    32766,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False]]],
   [[32767, True, False, False],
    [32767, True, False, False],
    [-32768, False, True, False],
    [-32768, False, True, False],
    [-32767, False, True, False]]],
  ['regression: scenario 9',
   [-32768,
    32767,
    [[False, False, False],
     [False, False, False],
     [False, False, False],
     [True, True, False],
     [True, True, False],
     [False, True, False],
     [True, False, False],
     [False, True, False],
     [True, True, False],
     [True, True, False],
     [True, False, False]]],
   [[32767, True, False, False],
    [32767, True, False, False],
    [32767, True, False, False],
    [32767, True, True, True],
    [32767, True, True, True],
    [32767, True, True, True],
    [-32768, True, True, True],
    [32767, True, True, True],
    [-32768, True, True, True],
    [-32768, True, True, True],
    [-32768, True, True, True]]],
  ['control: held count input',
   [3, 0, [[True, False, False], [True, False, False], [False, False, False], [True, False, False]]],
   [[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]]],
  ['control: underflow then reset',
   [0,
    -32767,
    [[False, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [False, False, False]]],
   [[-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [0, True, False, False],
    [0, True, False, False]]],
  ['control: simultaneous edges',
   [1,
    0,
    [[True, True, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [False, True, False]]],
   [[0, False, False, False],
    [0, False, False, False],
    [1, True, False, False],
    [0, False, False, False],
    [0, False, False, False]]],
  ['control: count down while up held',
   [0, 5, [[True, False, False], [True, True, False], [True, False, False], [True, True, False]]],
   [[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]]],
  ['control: scenario 1',
   [3,
    32765,
    [[True, False, True],
     [True, False, False],
     [True, False, True],
     [False, True, False],
     [True, False, False],
     [True, True, True],
     [False, True, False],
     [False, False, False],
     [True, True, False],
     [False, True, False],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [False, True, False]]],
   [[0, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [-1, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [2, False, False, False],
    [1, False, False, False]]],
  ['control: scenario 2',
   [0,
    32765,
    [[False, False, False],
     [False, True, True],
     [True, False, False],
     [True, True, False],
     [False, False, False],
     [False, True, False],
     [True, False, False],
     [True, False, True],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [True, True, False],
     [True, False, False]]],
   [[32765, True, False, False],
    [0, True, False, False],
    [1, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [-1, False, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [-1, False, False, False],
    [-1, False, False, False]]]],
 [['regression: scenario 19',
   [3,
    -32768,
    [[True, False, False],
     [False, True, False],
     [False, False, False],
     [False, True, False],
     [True, True, False],
     [True, False, False],
     [False, False, False],
     [False, True, False],
     [True, True, False],
     [False, True, False],
     [True, False, False],
     [False, True, False]]],
   [[-32767, False, False, False],
    [-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [32767, True, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32767, False, True, True],
    [-32768, False, True, True]]],
  ['regression: scenario 11',
   [3,
    32767,
    [[True, True, False],
     [False, True, False],
     [False, False, False],
     [True, True, False],
     [True, True, False],
     [True, False, False],
     [False, False, False],
     [False, True, False],
     [True, False, False],
     [True, True, False],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [False, False, False]]],
   [[32767, True, True, True],
    [32767, True, True, True],
    [32767, True, True, True],
    [32767, True, True, True],
    [32767, True, True, True],
    [32767, True, True, True],
    [32767, True, True, True],
    [32766, True, True, True],
    [32767, True, True, True],
    [32766, True, True, True],
    [32766, True, True, True],
    [32766, True, True, True],
    [32766, True, True, True],
    [32766, True, True, True]]],
  ['control: held count input',
   [3, 0, [[True, False, False], [True, False, False], [False, False, False], [True, False, False]]],
   [[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]]],
  ['regression: overflow wrap',
   [0,
    32766,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False]]],
   [[32767, True, False, False],
    [32767, True, False, False],
    [-32768, False, True, False],
    [-32768, False, True, False],
    [-32767, False, True, False]]],
  ['control: underflow then reset',
   [0,
    -32767,
    [[False, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [False, False, False]]],
   [[-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [0, True, False, False],
    [0, True, False, False]]],
  ['control: simultaneous edges',
   [1,
    0,
    [[True, True, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [False, True, False]]],
   [[0, False, False, False],
    [0, False, False, False],
    [1, True, False, False],
    [0, False, False, False],
    [0, False, False, False]]],
  ['control: count down while up held',
   [0, 5, [[True, False, False], [True, True, False], [True, False, False], [True, True, False]]],
   [[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]]],
  ['control: scenario 1',
   [32767,
    32766,
    [[False, False, False],
     [True, True, False],
     [False, True, True],
     [True, True, False],
     [False, True, False],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [False, True, True],
     [True, False, False],
     [False, False, False],
     [False, False, False]]],
   [[32766, False, False, False],
    [32766, False, False, False],
    [0, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [2, False, False, False],
    [2, False, False, False],
    [2, False, False, False],
    [0, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [1, False, False, False]]]],
 [['regression: scenario 58',
   [5,
    -32768,
    [[False, True, False],
     [False, True, False],
     [True, False, False],
     [False, True, False],
     [False, True, False],
     [True, True, False],
     [True, True, False],
     [False, True, False],
     [True, True, False],
     [False, False, False],
     [False, True, False],
     [False, True, False],
     [False, False, False]]],
   [[32767, True, False, True],
    [32767, True, False, True],
    [-32768, False, True, True],
    [32767, True, True, True],
    [32767, True, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32767, False, True, True],
    [-32767, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True]]],
  ['regression: scenario 43',
   [32767,
    32767,
    [[True, True, False],
     [True, True, False],
     [True, False, False],
     [True, False, False],
     [False, True, False],
     [True, False, True],
     [False, False, False]]],
   [[32767, True, True, True],
    [32767, True, True, True],
    [32767, True, True, True],
    [32767, True, True, True],
    [32766, False, True, True],
    [0, False, False, False],
    [0, False, False, False]]],
  ['control: held count input',
   [3, 0, [[True, False, False], [True, False, False], [False, False, False], [True, False, False]]],
   [[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]]],
  ['regression: overflow wrap',
   [0,
    32766,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False]]],
   [[32767, True, False, False],
    [32767, True, False, False],
    [-32768, False, True, False],
    [-32768, False, True, False],
    [-32767, False, True, False]]],
  ['control: underflow then reset',
   [0,
    -32767,
    [[False, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [False, False, False]]],
   [[-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [0, True, False, False],
    [0, True, False, False]]],
  ['control: simultaneous edges',
   [1,
    0,
    [[True, True, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [False, True, False]]],
   [[0, False, False, False],
    [0, False, False, False],
    [1, True, False, False],
    [0, False, False, False],
    [0, False, False, False]]],
  ['control: count down while up held',
   [0, 5, [[True, False, False], [True, True, False], [True, False, False], [True, True, False]]],
   [[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]]],
  ['control: scenario 1',
   [0,
    -2,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [True, False, False],
     [False, False, True],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [False, True, False],
     [False, False, False],
     [True, False, False]]],
   [[-1, False, False, False],
    [-1, False, False, False],
    [0, True, False, False],
    [-1, False, False, False],
    [-1, False, False, False],
    [0, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [1, True, False, 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: overflow wrap[[32767, True, False, False], [32767, True, False, False], [-32768, False, True, False], [-32768, False, True, False], [-32767, False, False, False]][[32767, True, False, False], [32767, True, False, False], [-32768, False, True, False], [-32768, False, True, False], [-32767, False, True, False]]Failed
regression: scenario 5[[32766, True, False, False], [32766, True, False, False], [32767, True, False, False], [32766, True, False, False], [32767, True, False, False], [32767, True, False, False], [32767, True, False, False], [32767, True, False, False], [32767, True, False, False], [32767, True, True, True], [32767, True, True, True], [32767, True, True, True], [32766, True, True, True]][[32766, True, False, False], [32766, True, False, False], [32767, True, False, False], [32766, True, False, False], [32767, True, False, False], [32767, True, False, False], [32767, True, False, False], [32767, True, False, False], [32767, True, False, False], [32767, True, True, True], [32767, True, True, True], [32767, True, True, True], [32766, True, True, True]]Passed
control: held count input[[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]][[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]]Passed
control: underflow then reset[[-32768, False, False, False], [-32768, False, False, False], [32767, True, False, True], [0, True, False, False], [0, True, False, False]][[-32768, False, False, False], [-32768, False, False, False], [32767, True, False, True], [0, True, False, False], [0, True, False, False]]Passed
control: simultaneous edges[[0, False, False, False], [0, False, False, False], [1, True, False, False], [0, False, False, False], [0, False, False, False]][[0, False, False, False], [0, False, False, False], [1, True, False, False], [0, False, False, False], [0, False, False, False]]Passed
control: count down while up held[[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]][[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]]Passed
control: scenario 1[[2, True, False, False], [2, True, False, False], [2, True, False, False], [0, True, False, False], [0, True, False, False], [1, True, False, False], [1, True, False, False], [1, True, False, False], [1, True, False, False]][[2, True, False, False], [2, True, False, False], [2, True, False, False], [0, True, False, False], [0, True, False, False], [1, True, False, False], [1, True, False, False], [1, True, False, False], [1, True, False, False]]Passed
control: scenario 2[[32766, True, False, False], [32766, True, False, False], [32766, True, False, False], [0, False, False, False], [0, False, False, False], [1, False, False, False], [1, False, False, False], [1, False, False, False], [1, False, False, False], [1, False, False, False], [1, False, False, False], [0, False, False, False], [0, False, False, False]][[32766, True, False, False], [32766, True, False, False], [32766, True, False, False], [0, False, False, False], [0, False, False, False], [1, False, False, False], [1, False, False, False], [1, False, False, False], [1, False, False, False], [1, False, False, False], [1, False, False, False], [0, False, False, False], [0, False, False, False]]Passed

SHA-256 / 7483edf65e1c247b953bb2d9f9f2674bd5e0ee7fc004cac7c9c743cae1b4f5b6

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(preset, start, scans):
    acc = start
    ov = False
    un = False
    pcu = False
    pcd = False
    out = []
    for cu, cd, res in scans:
        cu = bool(cu)
        cd = bool(cd)
        if cu and not pcu:
            acc += 1
            if acc > 32767:
                acc = -32768
                ov = True
        if cd and not pcd:
            acc -= 1
            ov = False
            if acc < -32768:
                acc = 32767
                un = True
        pcu = cu
        pcd = cd
        if res:
            acc = 0
            ov = False
            un = False
        out.append([acc, acc >= preset, ov, un])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: overflow wrap',
   [0,
    32766,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False]]],
   [[32767, True, False, False],
    [32767, True, False, False],
    [-32768, False, True, False],
    [-32768, False, True, False],
    [-32767, False, True, False]]],
  ['regression: scenario 5',
   [5,
    32766,
    [[False, False, False],
     [False, False, False],
     [True, False, False],
     [False, True, False],
     [True, True, False],
     [True, False, False],
     [True, False, False],
     [False, False, False],
     [False, False, False],
     [True, True, False],
     [False, False, False],
     [False, False, False],
     [False, True, False]]],
   [[32766, True, False, False],
    [32766, True, False, False],
    [32767, True, False, False],
    [32766, True, False, False],
    [32767, True, False, False],
    [32767, True, False, False],
    [32767, True, False, False],
    [32767, True, False, False],
    [32767, True, False, False],
    [32767, True, True, True],
    [32767, True, True, True],
    [32767, True, True, True],
    [32766, True, True, True]]],
  ['control: held count input',
   [3, 0, [[True, False, False], [True, False, False], [False, False, False], [True, False, False]]],
   [[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]]],
  ['control: underflow then reset',
   [0,
    -32767,
    [[False, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [False, False, False]]],
   [[-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [0, True, False, False],
    [0, True, False, False]]],
  ['control: simultaneous edges',
   [1,
    0,
    [[True, True, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [False, True, False]]],
   [[0, False, False, False],
    [0, False, False, False],
    [1, True, False, False],
    [0, False, False, False],
    [0, False, False, False]]],
  ['control: count down while up held',
   [0, 5, [[True, False, False], [True, True, False], [True, False, False], [True, True, False]]],
   [[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]]],
  ['control: scenario 1',
   [0,
    1,
    [[True, False, False],
     [True, False, False],
     [True, False, False],
     [False, True, True],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [False, False, False],
     [False, False, False]]],
   [[2, True, False, False],
    [2, True, False, False],
    [2, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [1, True, False, False]]],
  ['control: scenario 2',
   [3,
    32766,
    [[True, True, False],
     [False, False, False],
     [True, True, False],
     [False, False, True],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, True, False],
     [False, False, False],
     [True, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, False]]],
   [[32766, True, False, False],
    [32766, True, False, False],
    [32766, True, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [0, False, False, False],
    [0, False, False, False]]]],
 [['regression: scenario 7',
   [32767,
    -32768,
    [[True, True, False],
     [True, False, False],
     [False, True, False],
     [False, True, 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],
     [False, False, False]]],
   [[-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [32767, True, False, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32767, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True]]],
  ['regression: scenario 20',
   [5,
    32767,
    [[True, True, False],
     [False, True, False],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [False, False, False],
     [False, False, False],
     [True, True, False],
     [False, False, False],
     [False, True, False]]],
   [[32767, True, True, True],
    [32767, True, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [32767, True, True, True]]],
  ['control: held count input',
   [3, 0, [[True, False, False], [True, False, False], [False, False, False], [True, False, False]]],
   [[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]]],
  ['regression: overflow wrap',
   [0,
    32766,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False]]],
   [[32767, True, False, False],
    [32767, True, False, False],
    [-32768, False, True, False],
    [-32768, False, True, False],
    [-32767, False, True, False]]],
  ['control: underflow then reset',
   [0,
    -32767,
    [[False, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [False, False, False]]],
   [[-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [0, True, False, False],
    [0, True, False, False]]],
  ['control: simultaneous edges',
   [1,
    0,
    [[True, True, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [False, True, False]]],
   [[0, False, False, False],
    [0, False, False, False],
    [1, True, False, False],
    [0, False, False, False],
    [0, False, False, False]]],
  ['control: count down while up held',
   [0, 5, [[True, False, False], [True, True, False], [True, False, False], [True, True, False]]],
   [[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]]],
  ['control: scenario 1',
   [2,
    -32767,
    [[True, False, False],
     [True, False, False],
     [False, False, False],
     [False, False, False],
     [False, True, False],
     [False, False, False],
     [True, False, False],
     [True, False, False]]],
   [[-32766, False, False, False],
    [-32766, False, False, False],
    [-32766, False, False, False],
    [-32766, False, False, False],
    [-32767, False, False, False],
    [-32767, False, False, False],
    [-32766, False, False, False],
    [-32766, False, False, False]]]],
 [['regression: overflow wrap',
   [0,
    32766,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False]]],
   [[32767, True, False, False],
    [32767, True, False, False],
    [-32768, False, True, False],
    [-32768, False, True, False],
    [-32767, False, True, False]]],
  ['regression: scenario 9',
   [-32768,
    32767,
    [[False, False, False],
     [False, False, False],
     [False, False, False],
     [True, True, False],
     [True, True, False],
     [False, True, False],
     [True, False, False],
     [False, True, False],
     [True, True, False],
     [True, True, False],
     [True, False, False]]],
   [[32767, True, False, False],
    [32767, True, False, False],
    [32767, True, False, False],
    [32767, True, True, True],
    [32767, True, True, True],
    [32767, True, True, True],
    [-32768, True, True, True],
    [32767, True, True, True],
    [-32768, True, True, True],
    [-32768, True, True, True],
    [-32768, True, True, True]]],
  ['control: held count input',
   [3, 0, [[True, False, False], [True, False, False], [False, False, False], [True, False, False]]],
   [[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]]],
  ['control: underflow then reset',
   [0,
    -32767,
    [[False, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [False, False, False]]],
   [[-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [0, True, False, False],
    [0, True, False, False]]],
  ['control: simultaneous edges',
   [1,
    0,
    [[True, True, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [False, True, False]]],
   [[0, False, False, False],
    [0, False, False, False],
    [1, True, False, False],
    [0, False, False, False],
    [0, False, False, False]]],
  ['control: count down while up held',
   [0, 5, [[True, False, False], [True, True, False], [True, False, False], [True, True, False]]],
   [[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]]],
  ['control: scenario 1',
   [3,
    32765,
    [[True, False, True],
     [True, False, False],
     [True, False, True],
     [False, True, False],
     [True, False, False],
     [True, True, True],
     [False, True, False],
     [False, False, False],
     [True, True, False],
     [False, True, False],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [False, True, False]]],
   [[0, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [-1, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [2, False, False, False],
    [1, False, False, False]]],
  ['control: scenario 2',
   [0,
    32765,
    [[False, False, False],
     [False, True, True],
     [True, False, False],
     [True, True, False],
     [False, False, False],
     [False, True, False],
     [True, False, False],
     [True, False, True],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [True, True, False],
     [True, False, False]]],
   [[32765, True, False, False],
    [0, True, False, False],
    [1, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [-1, False, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [-1, False, False, False],
    [-1, False, False, False]]]],
 [['regression: scenario 19',
   [3,
    -32768,
    [[True, False, False],
     [False, True, False],
     [False, False, False],
     [False, True, False],
     [True, True, False],
     [True, False, False],
     [False, False, False],
     [False, True, False],
     [True, True, False],
     [False, True, False],
     [True, False, False],
     [False, True, False]]],
   [[-32767, False, False, False],
    [-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [32767, True, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32767, False, True, True],
    [-32768, False, True, True]]],
  ['regression: scenario 11',
   [3,
    32767,
    [[True, True, False],
     [False, True, False],
     [False, False, False],
     [True, True, False],
     [True, True, False],
     [True, False, False],
     [False, False, False],
     [False, True, False],
     [True, False, False],
     [True, True, False],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [False, False, False]]],
   [[32767, True, True, True],
    [32767, True, True, True],
    [32767, True, True, True],
    [32767, True, True, True],
    [32767, True, True, True],
    [32767, True, True, True],
    [32767, True, True, True],
    [32766, True, True, True],
    [32767, True, True, True],
    [32766, True, True, True],
    [32766, True, True, True],
    [32766, True, True, True],
    [32766, True, True, True],
    [32766, True, True, True]]],
  ['control: held count input',
   [3, 0, [[True, False, False], [True, False, False], [False, False, False], [True, False, False]]],
   [[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]]],
  ['regression: overflow wrap',
   [0,
    32766,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False]]],
   [[32767, True, False, False],
    [32767, True, False, False],
    [-32768, False, True, False],
    [-32768, False, True, False],
    [-32767, False, True, False]]],
  ['control: underflow then reset',
   [0,
    -32767,
    [[False, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [False, False, False]]],
   [[-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [0, True, False, False],
    [0, True, False, False]]],
  ['control: simultaneous edges',
   [1,
    0,
    [[True, True, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [False, True, False]]],
   [[0, False, False, False],
    [0, False, False, False],
    [1, True, False, False],
    [0, False, False, False],
    [0, False, False, False]]],
  ['control: count down while up held',
   [0, 5, [[True, False, False], [True, True, False], [True, False, False], [True, True, False]]],
   [[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]]],
  ['control: scenario 1',
   [32767,
    32766,
    [[False, False, False],
     [True, True, False],
     [False, True, True],
     [True, True, False],
     [False, True, False],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [False, True, True],
     [True, False, False],
     [False, False, False],
     [False, False, False]]],
   [[32766, False, False, False],
    [32766, False, False, False],
    [0, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [2, False, False, False],
    [2, False, False, False],
    [2, False, False, False],
    [0, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [1, False, False, False]]]],
 [['regression: scenario 58',
   [5,
    -32768,
    [[False, True, False],
     [False, True, False],
     [True, False, False],
     [False, True, False],
     [False, True, False],
     [True, True, False],
     [True, True, False],
     [False, True, False],
     [True, True, False],
     [False, False, False],
     [False, True, False],
     [False, True, False],
     [False, False, False]]],
   [[32767, True, False, True],
    [32767, True, False, True],
    [-32768, False, True, True],
    [32767, True, True, True],
    [32767, True, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32767, False, True, True],
    [-32767, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True]]],
  ['regression: scenario 43',
   [32767,
    32767,
    [[True, True, False],
     [True, True, False],
     [True, False, False],
     [True, False, False],
     [False, True, False],
     [True, False, True],
     [False, False, False]]],
   [[32767, True, True, True],
    [32767, True, True, True],
    [32767, True, True, True],
    [32767, True, True, True],
    [32766, False, True, True],
    [0, False, False, False],
    [0, False, False, False]]],
  ['control: held count input',
   [3, 0, [[True, False, False], [True, False, False], [False, False, False], [True, False, False]]],
   [[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]]],
  ['regression: overflow wrap',
   [0,
    32766,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False]]],
   [[32767, True, False, False],
    [32767, True, False, False],
    [-32768, False, True, False],
    [-32768, False, True, False],
    [-32767, False, True, False]]],
  ['control: underflow then reset',
   [0,
    -32767,
    [[False, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [False, False, False]]],
   [[-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [0, True, False, False],
    [0, True, False, False]]],
  ['control: simultaneous edges',
   [1,
    0,
    [[True, True, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [False, True, False]]],
   [[0, False, False, False],
    [0, False, False, False],
    [1, True, False, False],
    [0, False, False, False],
    [0, False, False, False]]],
  ['control: count down while up held',
   [0, 5, [[True, False, False], [True, True, False], [True, False, False], [True, True, False]]],
   [[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]]],
  ['control: scenario 1',
   [0,
    -2,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [True, False, False],
     [False, False, True],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [False, True, False],
     [False, False, False],
     [True, False, False]]],
   [[-1, False, False, False],
    [-1, False, False, False],
    [0, True, False, False],
    [-1, False, False, False],
    [-1, False, False, False],
    [0, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [1, True, False, 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: overflow wrap[[32767, True, False, False], [32767, True, False, False], [-32768, False, True, False], [-32768, False, True, False], [-32767, False, True, False]][[32767, True, False, False], [32767, True, False, False], [-32768, False, True, False], [-32768, False, True, False], [-32767, False, True, False]]Passed
regression: scenario 5[[32766, True, False, False], [32766, True, False, False], [32767, True, False, False], [32766, True, False, False], [32767, True, False, False], [32767, True, False, False], [32767, True, False, False], [32767, True, False, False], [32767, True, False, False], [32767, True, False, True], [32767, True, False, True], [32767, True, False, True], [32766, True, False, True]][[32766, True, False, False], [32766, True, False, False], [32767, True, False, False], [32766, True, False, False], [32767, True, False, False], [32767, True, False, False], [32767, True, False, False], [32767, True, False, False], [32767, True, False, False], [32767, True, True, True], [32767, True, True, True], [32767, True, True, True], [32766, True, True, True]]Failed
control: held count input[[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]][[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]]Passed
control: underflow then reset[[-32768, False, False, False], [-32768, False, False, False], [32767, True, False, True], [0, True, False, False], [0, True, False, False]][[-32768, False, False, False], [-32768, False, False, False], [32767, True, False, True], [0, True, False, False], [0, True, False, False]]Passed
control: simultaneous edges[[0, False, False, False], [0, False, False, False], [1, True, False, False], [0, False, False, False], [0, False, False, False]][[0, False, False, False], [0, False, False, False], [1, True, False, False], [0, False, False, False], [0, False, False, False]]Passed
control: count down while up held[[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]][[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]]Passed
control: scenario 1[[2, True, False, False], [2, True, False, False], [2, True, False, False], [0, True, False, False], [0, True, False, False], [1, True, False, False], [1, True, False, False], [1, True, False, False], [1, True, False, False]][[2, True, False, False], [2, True, False, False], [2, True, False, False], [0, True, False, False], [0, True, False, False], [1, True, False, False], [1, True, False, False], [1, True, False, False], [1, True, False, False]]Passed
control: scenario 2[[32766, True, False, False], [32766, True, False, False], [32766, True, False, False], [0, False, False, False], [0, False, False, False], [1, False, False, False], [1, False, False, False], [1, False, False, False], [1, False, False, False], [1, False, False, False], [1, False, False, False], [0, False, False, False], [0, False, False, False]][[32766, True, False, False], [32766, True, False, False], [32766, True, False, False], [0, False, False, False], [0, False, False, False], [1, False, False, False], [1, False, False, False], [1, False, False, False], [1, False, False, False], [1, False, False, False], [1, False, False, False], [0, False, False, False], [0, False, False, False]]Passed

SHA-256 / 05fdb5e25b001d14f9a75a22536570b5605e7e2deee25408c2b46ba48cf1024d

3 / The verified repair

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

N = 1
observations = []
def solve(preset, start, scans):
    acc = start
    ov = False
    un = False
    pcu = False
    pcd = False
    out = []
    for cu, cd, res in scans:
        cu = bool(cu)
        cd = bool(cd)
        if cu and not pcu:
            acc += 1
            if acc > 32767:
                acc = -32768
                ov = True
        if cd and not pcd:
            acc -= 1
            if acc < -32768:
                acc = 32767
                un = True
        pcu = cu
        pcd = cd
        if res:
            acc = 0
            ov = False
            un = False
        out.append([acc, acc >= preset, ov, un])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: overflow wrap',
   [0,
    32766,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False]]],
   [[32767, True, False, False],
    [32767, True, False, False],
    [-32768, False, True, False],
    [-32768, False, True, False],
    [-32767, False, True, False]]],
  ['regression: scenario 5',
   [5,
    32766,
    [[False, False, False],
     [False, False, False],
     [True, False, False],
     [False, True, False],
     [True, True, False],
     [True, False, False],
     [True, False, False],
     [False, False, False],
     [False, False, False],
     [True, True, False],
     [False, False, False],
     [False, False, False],
     [False, True, False]]],
   [[32766, True, False, False],
    [32766, True, False, False],
    [32767, True, False, False],
    [32766, True, False, False],
    [32767, True, False, False],
    [32767, True, False, False],
    [32767, True, False, False],
    [32767, True, False, False],
    [32767, True, False, False],
    [32767, True, True, True],
    [32767, True, True, True],
    [32767, True, True, True],
    [32766, True, True, True]]],
  ['control: held count input',
   [3, 0, [[True, False, False], [True, False, False], [False, False, False], [True, False, False]]],
   [[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]]],
  ['control: underflow then reset',
   [0,
    -32767,
    [[False, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [False, False, False]]],
   [[-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [0, True, False, False],
    [0, True, False, False]]],
  ['control: simultaneous edges',
   [1,
    0,
    [[True, True, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [False, True, False]]],
   [[0, False, False, False],
    [0, False, False, False],
    [1, True, False, False],
    [0, False, False, False],
    [0, False, False, False]]],
  ['control: count down while up held',
   [0, 5, [[True, False, False], [True, True, False], [True, False, False], [True, True, False]]],
   [[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]]],
  ['control: scenario 1',
   [0,
    1,
    [[True, False, False],
     [True, False, False],
     [True, False, False],
     [False, True, True],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [False, False, False],
     [False, False, False]]],
   [[2, True, False, False],
    [2, True, False, False],
    [2, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [1, True, False, False]]],
  ['control: scenario 2',
   [3,
    32766,
    [[True, True, False],
     [False, False, False],
     [True, True, False],
     [False, False, True],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, True, False],
     [False, False, False],
     [True, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, False]]],
   [[32766, True, False, False],
    [32766, True, False, False],
    [32766, True, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [0, False, False, False],
    [0, False, False, False]]]],
 [['regression: scenario 7',
   [32767,
    -32768,
    [[True, True, False],
     [True, False, False],
     [False, True, False],
     [False, True, 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],
     [False, False, False]]],
   [[-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [32767, True, False, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32767, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True]]],
  ['regression: scenario 20',
   [5,
    32767,
    [[True, True, False],
     [False, True, False],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [False, False, False],
     [False, False, False],
     [True, True, False],
     [False, False, False],
     [False, True, False]]],
   [[32767, True, True, True],
    [32767, True, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [32767, True, True, True]]],
  ['control: held count input',
   [3, 0, [[True, False, False], [True, False, False], [False, False, False], [True, False, False]]],
   [[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]]],
  ['regression: overflow wrap',
   [0,
    32766,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False]]],
   [[32767, True, False, False],
    [32767, True, False, False],
    [-32768, False, True, False],
    [-32768, False, True, False],
    [-32767, False, True, False]]],
  ['control: underflow then reset',
   [0,
    -32767,
    [[False, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [False, False, False]]],
   [[-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [0, True, False, False],
    [0, True, False, False]]],
  ['control: simultaneous edges',
   [1,
    0,
    [[True, True, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [False, True, False]]],
   [[0, False, False, False],
    [0, False, False, False],
    [1, True, False, False],
    [0, False, False, False],
    [0, False, False, False]]],
  ['control: count down while up held',
   [0, 5, [[True, False, False], [True, True, False], [True, False, False], [True, True, False]]],
   [[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]]],
  ['control: scenario 1',
   [2,
    -32767,
    [[True, False, False],
     [True, False, False],
     [False, False, False],
     [False, False, False],
     [False, True, False],
     [False, False, False],
     [True, False, False],
     [True, False, False]]],
   [[-32766, False, False, False],
    [-32766, False, False, False],
    [-32766, False, False, False],
    [-32766, False, False, False],
    [-32767, False, False, False],
    [-32767, False, False, False],
    [-32766, False, False, False],
    [-32766, False, False, False]]]],
 [['regression: overflow wrap',
   [0,
    32766,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False]]],
   [[32767, True, False, False],
    [32767, True, False, False],
    [-32768, False, True, False],
    [-32768, False, True, False],
    [-32767, False, True, False]]],
  ['regression: scenario 9',
   [-32768,
    32767,
    [[False, False, False],
     [False, False, False],
     [False, False, False],
     [True, True, False],
     [True, True, False],
     [False, True, False],
     [True, False, False],
     [False, True, False],
     [True, True, False],
     [True, True, False],
     [True, False, False]]],
   [[32767, True, False, False],
    [32767, True, False, False],
    [32767, True, False, False],
    [32767, True, True, True],
    [32767, True, True, True],
    [32767, True, True, True],
    [-32768, True, True, True],
    [32767, True, True, True],
    [-32768, True, True, True],
    [-32768, True, True, True],
    [-32768, True, True, True]]],
  ['control: held count input',
   [3, 0, [[True, False, False], [True, False, False], [False, False, False], [True, False, False]]],
   [[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]]],
  ['control: underflow then reset',
   [0,
    -32767,
    [[False, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [False, False, False]]],
   [[-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [0, True, False, False],
    [0, True, False, False]]],
  ['control: simultaneous edges',
   [1,
    0,
    [[True, True, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [False, True, False]]],
   [[0, False, False, False],
    [0, False, False, False],
    [1, True, False, False],
    [0, False, False, False],
    [0, False, False, False]]],
  ['control: count down while up held',
   [0, 5, [[True, False, False], [True, True, False], [True, False, False], [True, True, False]]],
   [[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]]],
  ['control: scenario 1',
   [3,
    32765,
    [[True, False, True],
     [True, False, False],
     [True, False, True],
     [False, True, False],
     [True, False, False],
     [True, True, True],
     [False, True, False],
     [False, False, False],
     [True, True, False],
     [False, True, False],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [False, True, False]]],
   [[0, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [-1, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [2, False, False, False],
    [1, False, False, False]]],
  ['control: scenario 2',
   [0,
    32765,
    [[False, False, False],
     [False, True, True],
     [True, False, False],
     [True, True, False],
     [False, False, False],
     [False, True, False],
     [True, False, False],
     [True, False, True],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [True, True, False],
     [True, False, False]]],
   [[32765, True, False, False],
    [0, True, False, False],
    [1, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [-1, False, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [-1, False, False, False],
    [-1, False, False, False]]]],
 [['regression: scenario 19',
   [3,
    -32768,
    [[True, False, False],
     [False, True, False],
     [False, False, False],
     [False, True, False],
     [True, True, False],
     [True, False, False],
     [False, False, False],
     [False, True, False],
     [True, True, False],
     [False, True, False],
     [True, False, False],
     [False, True, False]]],
   [[-32767, False, False, False],
    [-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [32767, True, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32767, False, True, True],
    [-32768, False, True, True]]],
  ['regression: scenario 11',
   [3,
    32767,
    [[True, True, False],
     [False, True, False],
     [False, False, False],
     [True, True, False],
     [True, True, False],
     [True, False, False],
     [False, False, False],
     [False, True, False],
     [True, False, False],
     [True, True, False],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [False, False, False]]],
   [[32767, True, True, True],
    [32767, True, True, True],
    [32767, True, True, True],
    [32767, True, True, True],
    [32767, True, True, True],
    [32767, True, True, True],
    [32767, True, True, True],
    [32766, True, True, True],
    [32767, True, True, True],
    [32766, True, True, True],
    [32766, True, True, True],
    [32766, True, True, True],
    [32766, True, True, True],
    [32766, True, True, True]]],
  ['control: held count input',
   [3, 0, [[True, False, False], [True, False, False], [False, False, False], [True, False, False]]],
   [[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]]],
  ['regression: overflow wrap',
   [0,
    32766,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False]]],
   [[32767, True, False, False],
    [32767, True, False, False],
    [-32768, False, True, False],
    [-32768, False, True, False],
    [-32767, False, True, False]]],
  ['control: underflow then reset',
   [0,
    -32767,
    [[False, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [False, False, False]]],
   [[-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [0, True, False, False],
    [0, True, False, False]]],
  ['control: simultaneous edges',
   [1,
    0,
    [[True, True, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [False, True, False]]],
   [[0, False, False, False],
    [0, False, False, False],
    [1, True, False, False],
    [0, False, False, False],
    [0, False, False, False]]],
  ['control: count down while up held',
   [0, 5, [[True, False, False], [True, True, False], [True, False, False], [True, True, False]]],
   [[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]]],
  ['control: scenario 1',
   [32767,
    32766,
    [[False, False, False],
     [True, True, False],
     [False, True, True],
     [True, True, False],
     [False, True, False],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [False, True, True],
     [True, False, False],
     [False, False, False],
     [False, False, False]]],
   [[32766, False, False, False],
    [32766, False, False, False],
    [0, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [2, False, False, False],
    [2, False, False, False],
    [2, False, False, False],
    [0, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [1, False, False, False]]]],
 [['regression: scenario 58',
   [5,
    -32768,
    [[False, True, False],
     [False, True, False],
     [True, False, False],
     [False, True, False],
     [False, True, False],
     [True, True, False],
     [True, True, False],
     [False, True, False],
     [True, True, False],
     [False, False, False],
     [False, True, False],
     [False, True, False],
     [False, False, False]]],
   [[32767, True, False, True],
    [32767, True, False, True],
    [-32768, False, True, True],
    [32767, True, True, True],
    [32767, True, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32767, False, True, True],
    [-32767, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True],
    [-32768, False, True, True]]],
  ['regression: scenario 43',
   [32767,
    32767,
    [[True, True, False],
     [True, True, False],
     [True, False, False],
     [True, False, False],
     [False, True, False],
     [True, False, True],
     [False, False, False]]],
   [[32767, True, True, True],
    [32767, True, True, True],
    [32767, True, True, True],
    [32767, True, True, True],
    [32766, False, True, True],
    [0, False, False, False],
    [0, False, False, False]]],
  ['control: held count input',
   [3, 0, [[True, False, False], [True, False, False], [False, False, False], [True, False, False]]],
   [[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]]],
  ['regression: overflow wrap',
   [0,
    32766,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False]]],
   [[32767, True, False, False],
    [32767, True, False, False],
    [-32768, False, True, False],
    [-32768, False, True, False],
    [-32767, False, True, False]]],
  ['control: underflow then reset',
   [0,
    -32767,
    [[False, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [False, False, False]]],
   [[-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [0, True, False, False],
    [0, True, False, False]]],
  ['control: simultaneous edges',
   [1,
    0,
    [[True, True, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [False, True, False]]],
   [[0, False, False, False],
    [0, False, False, False],
    [1, True, False, False],
    [0, False, False, False],
    [0, False, False, False]]],
  ['control: count down while up held',
   [0, 5, [[True, False, False], [True, True, False], [True, False, False], [True, True, False]]],
   [[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]]],
  ['control: scenario 1',
   [0,
    -2,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [True, False, False],
     [False, False, True],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [False, True, False],
     [False, False, False],
     [True, False, False]]],
   [[-1, False, False, False],
    [-1, False, False, False],
    [0, True, False, False],
    [-1, False, False, False],
    [-1, False, False, False],
    [0, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [1, True, False, 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: overflow wrap[[32767, True, False, False], [32767, True, False, False], [-32768, False, True, False], [-32768, False, True, False], [-32767, False, True, False]][[32767, True, False, False], [32767, True, False, False], [-32768, False, True, False], [-32768, False, True, False], [-32767, False, True, False]]Passed
regression: scenario 5[[32766, True, False, False], [32766, True, False, False], [32767, True, False, False], [32766, True, False, False], [32767, True, False, False], [32767, True, False, False], [32767, True, False, False], [32767, True, False, False], [32767, True, False, False], [32767, True, True, True], [32767, True, True, True], [32767, True, True, True], [32766, True, True, True]][[32766, True, False, False], [32766, True, False, False], [32767, True, False, False], [32766, True, False, False], [32767, True, False, False], [32767, True, False, False], [32767, True, False, False], [32767, True, False, False], [32767, True, False, False], [32767, True, True, True], [32767, True, True, True], [32767, True, True, True], [32766, True, True, True]]Passed
control: held count input[[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]][[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]]Passed
control: underflow then reset[[-32768, False, False, False], [-32768, False, False, False], [32767, True, False, True], [0, True, False, False], [0, True, False, False]][[-32768, False, False, False], [-32768, False, False, False], [32767, True, False, True], [0, True, False, False], [0, True, False, False]]Passed
control: simultaneous edges[[0, False, False, False], [0, False, False, False], [1, True, False, False], [0, False, False, False], [0, False, False, False]][[0, False, False, False], [0, False, False, False], [1, True, False, False], [0, False, False, False], [0, False, False, False]]Passed
control: count down while up held[[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]][[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]]Passed
control: scenario 1[[2, True, False, False], [2, True, False, False], [2, True, False, False], [0, True, False, False], [0, True, False, False], [1, True, False, False], [1, True, False, False], [1, True, False, False], [1, True, False, False]][[2, True, False, False], [2, True, False, False], [2, True, False, False], [0, True, False, False], [0, True, False, False], [1, True, False, False], [1, True, False, False], [1, True, False, False], [1, True, False, False]]Passed
control: scenario 2[[32766, True, False, False], [32766, True, False, False], [32766, True, False, False], [0, False, False, False], [0, False, False, False], [1, False, False, False], [1, False, False, False], [1, False, False, False], [1, False, False, False], [1, False, False, False], [1, False, False, False], [0, False, False, False], [0, False, False, False]][[32766, True, False, False], [32766, True, False, False], [32766, True, False, False], [0, False, False, False], [0, False, False, False], [1, False, False, False], [1, False, False, False], [1, False, False, False], [1, False, False, False], [1, False, False, False], [1, False, False, False], [0, False, False, False], [0, False, False, False]]Passed

SHA-256 / a857b6619d0a92899ff2c59c57dabbf04407eccf4687044ca7d530880f4fa596

Verification & scope

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

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

Case digest / f0b6730654187af31a5bf67535726aa7746540e8b38851887d04d4d52f90a14c