FAILURE MAP
← Case archive

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

Motor starter drops out when the start button is released · case 01

The motor only runs while start is held, like a jog circuit.

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

ROOT CAUSE

The seal-in branch around the start button is missing.

THE FAILURE

The seal-in branch around the start button is missing.

Unsuccessful approach: Breaking the seal-in on a reset press still drops a healthy running motor.

Case contract

Three-wire motor starter rung evaluated per scan. Each scan is a dict with optional keys start (pushbutton, default false), stop_nc (normally-closed stop contact: true means not pressed, default true), ol_nc (normally-closed overload contact, default true), reset (default false) and power (default true). An open overload contact latches a trip (retentive); reset clears it only on a scan where the overload contact is closed. The motor runs on start or its own seal-in, and only while stop_nc is closed and no trip is latched; stop and trip dominate start. A power-loss scan drops the motor and requires the start button to be seen released before it can start again. Return [motor, tripped] 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(scans):
    motor = False
    tripped = False
    need_release = False
    out = []
    for s in scans:
        if not s.get('power', True):
            motor = False
            need_release = True
            out.append([False, tripped])
            continue
        start = s.get('start', False)
        if not start:
            need_release = False
        if not s.get('ol_nc', True):
            tripped = True
        elif s.get('reset', False):
            tripped = False
        run_cmd = start and not need_release
        motor = run_cmd and s.get('stop_nc', True) and not tripped
        out.append([motor, tripped])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: start seal stop',
   [[{'start': True}, {}, {'stop_nc': False}, {}, {'start': True}]],
   [[True, False], [True, False], [False, False], [False, False], [True, False]]],
  ['regression: reset while running',
   [[{'start': True}, {}, {'reset': True}, {}]],
   [[True, False], [True, False], [True, False], [True, False]]],
  ['control: power loss with start held',
   [[{'start': True}, {'power': False}, {'start': True}, {}, {'start': True}]],
   [[True, False], [False, False], [False, False], [False, False], [True, False]]],
  ['control: overload trip and reset',
   [[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {'reset': True}, {'start': True}]],
   [[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]]],
  ['control: reset while overload open',
   [[{'start': True}, {'ol_nc': False, 'reset': True}, {'start': True}]],
   [[True, False], [False, True], [False, True]]],
  ['control: stop and start together',
   [[{'start': True, 'stop_nc': False}, {'start': True}, {'start': True, 'stop_nc': False}]],
   [[False, False], [True, False], [False, False]]],
  ['control: trip across power loss',
   [[{'start': True}, {'ol_nc': False}, {'power': False}, {}, {'start': True}]],
   [[True, False], [False, True], [False, True], [False, True], [False, True]]],
  ['control: start after overload recovers',
   [[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {}]],
   [[True, False], [False, True], [False, True], [False, True], [False, True]]]],
 [['regression: reset while running',
   [[{'start': True}, {}, {'reset': True}, {}]],
   [[True, False], [True, False], [True, False], [True, False]]],
  ['regression: scenario 29',
   [[{},
     {'stop_nc': True},
     {'start': True, 'ol_nc': True, 'power': False},
     {'start': True},
     {'start': False},
     {'start': True, 'ol_nc': False},
     {},
     {'start': False, 'ol_nc': True},
     {'start': True},
     {'stop_nc': True},
     {'stop_nc': False},
     {'stop_nc': False, 'ol_nc': True},
     {'start': True, 'reset': True},
     {'stop_nc': True, 'ol_nc': True, 'reset': True}]],
   [[False, False],
    [False, False],
    [False, False],
    [False, False],
    [False, False],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [True, False],
    [True, False]]],
  ['regression: start seal stop',
   [[{'start': True}, {}, {'stop_nc': False}, {}, {'start': True}]],
   [[True, False], [True, False], [False, False], [False, False], [True, False]]],
  ['control: power loss with start held',
   [[{'start': True}, {'power': False}, {'start': True}, {}, {'start': True}]],
   [[True, False], [False, False], [False, False], [False, False], [True, False]]],
  ['control: overload trip and reset',
   [[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {'reset': True}, {'start': True}]],
   [[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]]],
  ['control: reset while overload open',
   [[{'start': True}, {'ol_nc': False, 'reset': True}, {'start': True}]],
   [[True, False], [False, True], [False, True]]],
  ['control: stop and start together',
   [[{'start': True, 'stop_nc': False}, {'start': True}, {'start': True, 'stop_nc': False}]],
   [[False, False], [True, False], [False, False]]],
  ['control: trip across power loss',
   [[{'start': True}, {'ol_nc': False}, {'power': False}, {}, {'start': True}]],
   [[True, False], [False, True], [False, True], [False, True], [False, True]]]],
 [['regression: scenario 1',
   [[{'stop_nc': True},
     {'start': True},
     {'stop_nc': True},
     {'reset': True},
     {'start': True, 'stop_nc': True, 'ol_nc': False, 'power': False},
     {'stop_nc': False},
     {'start': True},
     {'start': True, 'stop_nc': False},
     {'start': True, 'stop_nc': True, 'reset': True}]],
   [[False, False],
    [True, False],
    [True, False],
    [True, False],
    [False, False],
    [False, False],
    [True, False],
    [False, False],
    [True, False]]],
  ['regression: scenario 9',
   [[{'start': True, 'ol_nc': True, 'reset': True},
     {'power': False},
     {},
     {'start': True, 'stop_nc': True, 'ol_nc': True, 'reset': True},
     {'ol_nc': True},
     {},
     {'reset': True}]],
   [[True, False],
    [False, False],
    [False, False],
    [True, False],
    [True, False],
    [True, False],
    [True, False]]],
  ['regression: start seal stop',
   [[{'start': True}, {}, {'stop_nc': False}, {}, {'start': True}]],
   [[True, False], [True, False], [False, False], [False, False], [True, False]]],
  ['control: power loss with start held',
   [[{'start': True}, {'power': False}, {'start': True}, {}, {'start': True}]],
   [[True, False], [False, False], [False, False], [False, False], [True, False]]],
  ['control: overload trip and reset',
   [[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {'reset': True}, {'start': True}]],
   [[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]]],
  ['control: reset while overload open',
   [[{'start': True}, {'ol_nc': False, 'reset': True}, {'start': True}]],
   [[True, False], [False, True], [False, True]]],
  ['control: stop and start together',
   [[{'start': True, 'stop_nc': False}, {'start': True}, {'start': True, 'stop_nc': False}]],
   [[False, False], [True, False], [False, False]]],
  ['control: trip across power loss',
   [[{'start': True}, {'ol_nc': False}, {'power': False}, {}, {'start': True}]],
   [[True, False], [False, True], [False, True], [False, True], [False, True]]]],
 [['regression: scenario 3',
   [[{'stop_nc': True},
     {'stop_nc': False},
     {'stop_nc': False},
     {'start': True},
     {'start': True},
     {'start': False},
     {'stop_nc': False, 'reset': True},
     {'start': False},
     {'ol_nc': True, 'reset': True},
     {},
     {'start': False}]],
   [[False, False],
    [False, False],
    [False, False],
    [True, False],
    [True, False],
    [True, False],
    [False, False],
    [False, False],
    [False, False],
    [False, False],
    [False, False]]],
  ['regression: scenario 14',
   [[{'start': False, 'ol_nc': True},
     {'stop_nc': False},
     {},
     {'start': True},
     {'stop_nc': True},
     {'start': True},
     {},
     {'ol_nc': True, 'reset': True},
     {'ol_nc': False},
     {'stop_nc': False, 'ol_nc': False, 'reset': True},
     {'power': False}]],
   [[False, False],
    [False, False],
    [False, False],
    [True, False],
    [True, False],
    [True, False],
    [True, False],
    [True, False],
    [False, True],
    [False, True],
    [False, True]]],
  ['regression: start seal stop',
   [[{'start': True}, {}, {'stop_nc': False}, {}, {'start': True}]],
   [[True, False], [True, False], [False, False], [False, False], [True, False]]],
  ['control: power loss with start held',
   [[{'start': True}, {'power': False}, {'start': True}, {}, {'start': True}]],
   [[True, False], [False, False], [False, False], [False, False], [True, False]]],
  ['control: overload trip and reset',
   [[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {'reset': True}, {'start': True}]],
   [[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]]],
  ['control: reset while overload open',
   [[{'start': True}, {'ol_nc': False, 'reset': True}, {'start': True}]],
   [[True, False], [False, True], [False, True]]],
  ['control: stop and start together',
   [[{'start': True, 'stop_nc': False}, {'start': True}, {'start': True, 'stop_nc': False}]],
   [[False, False], [True, False], [False, False]]],
  ['control: trip across power loss',
   [[{'start': True}, {'ol_nc': False}, {'power': False}, {}, {'start': True}]],
   [[True, False], [False, True], [False, True], [False, True], [False, True]]]],
 [['regression: scenario 4',
   [[{'start': True, 'stop_nc': True, 'reset': True},
     {'start': True, 'stop_nc': True},
     {'power': False},
     {},
     {'start': False, 'stop_nc': True, 'ol_nc': True},
     {'reset': True},
     {'ol_nc': True},
     {'start': True, 'stop_nc': False, 'ol_nc': True},
     {'start': True},
     {'ol_nc': True},
     {'start': True},
     {'start': True, 'stop_nc': False},
     {'stop_nc': False}]],
   [[True, False],
    [True, False],
    [False, False],
    [False, False],
    [False, False],
    [False, False],
    [False, False],
    [False, False],
    [True, False],
    [True, False],
    [True, False],
    [False, False],
    [False, False]]],
  ['regression: scenario 14',
   [[{'start': True, 'stop_nc': True},
     {'start': True},
     {'reset': True},
     {},
     {'start': True},
     {'stop_nc': True},
     {'stop_nc': False, 'ol_nc': False, 'reset': True},
     {'stop_nc': False},
     {'reset': True, 'power': False},
     {'start': False},
     {'start': False, 'stop_nc': True, 'reset': True}]],
   [[True, False],
    [True, False],
    [True, False],
    [True, False],
    [True, False],
    [True, False],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, False]]],
  ['regression: start seal stop',
   [[{'start': True}, {}, {'stop_nc': False}, {}, {'start': True}]],
   [[True, False], [True, False], [False, False], [False, False], [True, False]]],
  ['control: power loss with start held',
   [[{'start': True}, {'power': False}, {'start': True}, {}, {'start': True}]],
   [[True, False], [False, False], [False, False], [False, False], [True, False]]],
  ['control: overload trip and reset',
   [[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {'reset': True}, {'start': True}]],
   [[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]]],
  ['control: reset while overload open',
   [[{'start': True}, {'ol_nc': False, 'reset': True}, {'start': True}]],
   [[True, False], [False, True], [False, True]]],
  ['control: stop and start together',
   [[{'start': True, 'stop_nc': False}, {'start': True}, {'start': True, 'stop_nc': False}]],
   [[False, False], [True, False], [False, False]]],
  ['control: trip across power loss',
   [[{'start': True}, {'ol_nc': False}, {'power': False}, {}, {'start': True}]],
   [[True, False], [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: start seal stop[[True, False], [False, False], [False, False], [False, False], [True, False]][[True, False], [True, False], [False, False], [False, False], [True, False]]Failed
regression: reset while running[[True, False], [False, False], [False, False], [False, False]][[True, False], [True, False], [True, False], [True, False]]Failed
control: power loss with start held[[True, False], [False, False], [False, False], [False, False], [True, False]][[True, False], [False, False], [False, False], [False, False], [True, False]]Passed
control: overload trip and reset[[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]][[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]]Passed
control: reset while overload open[[True, False], [False, True], [False, True]][[True, False], [False, True], [False, True]]Passed
control: stop and start together[[False, False], [True, False], [False, False]][[False, False], [True, False], [False, False]]Passed
control: trip across power loss[[True, False], [False, True], [False, True], [False, True], [False, True]][[True, False], [False, True], [False, True], [False, True], [False, True]]Passed
control: start after overload recovers[[True, False], [False, True], [False, True], [False, True], [False, True]][[True, False], [False, True], [False, True], [False, True], [False, True]]Passed

SHA-256 / 458fbec6dfb9ec6a01aa7e4465b4624dbf5f17724a4f241d1a6a255d95d62660

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(scans):
    motor = False
    tripped = False
    need_release = False
    out = []
    for s in scans:
        if not s.get('power', True):
            motor = False
            need_release = True
            out.append([False, tripped])
            continue
        start = s.get('start', False)
        if not start:
            need_release = False
        if not s.get('ol_nc', True):
            tripped = True
        elif s.get('reset', False):
            tripped = False
        run_cmd = (start and not need_release) or (motor and not s.get('reset', False))
        motor = run_cmd and s.get('stop_nc', True) and not tripped
        out.append([motor, tripped])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: start seal stop',
   [[{'start': True}, {}, {'stop_nc': False}, {}, {'start': True}]],
   [[True, False], [True, False], [False, False], [False, False], [True, False]]],
  ['regression: reset while running',
   [[{'start': True}, {}, {'reset': True}, {}]],
   [[True, False], [True, False], [True, False], [True, False]]],
  ['control: power loss with start held',
   [[{'start': True}, {'power': False}, {'start': True}, {}, {'start': True}]],
   [[True, False], [False, False], [False, False], [False, False], [True, False]]],
  ['control: overload trip and reset',
   [[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {'reset': True}, {'start': True}]],
   [[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]]],
  ['control: reset while overload open',
   [[{'start': True}, {'ol_nc': False, 'reset': True}, {'start': True}]],
   [[True, False], [False, True], [False, True]]],
  ['control: stop and start together',
   [[{'start': True, 'stop_nc': False}, {'start': True}, {'start': True, 'stop_nc': False}]],
   [[False, False], [True, False], [False, False]]],
  ['control: trip across power loss',
   [[{'start': True}, {'ol_nc': False}, {'power': False}, {}, {'start': True}]],
   [[True, False], [False, True], [False, True], [False, True], [False, True]]],
  ['control: start after overload recovers',
   [[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {}]],
   [[True, False], [False, True], [False, True], [False, True], [False, True]]]],
 [['regression: reset while running',
   [[{'start': True}, {}, {'reset': True}, {}]],
   [[True, False], [True, False], [True, False], [True, False]]],
  ['regression: scenario 29',
   [[{},
     {'stop_nc': True},
     {'start': True, 'ol_nc': True, 'power': False},
     {'start': True},
     {'start': False},
     {'start': True, 'ol_nc': False},
     {},
     {'start': False, 'ol_nc': True},
     {'start': True},
     {'stop_nc': True},
     {'stop_nc': False},
     {'stop_nc': False, 'ol_nc': True},
     {'start': True, 'reset': True},
     {'stop_nc': True, 'ol_nc': True, 'reset': True}]],
   [[False, False],
    [False, False],
    [False, False],
    [False, False],
    [False, False],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [True, False],
    [True, False]]],
  ['regression: start seal stop',
   [[{'start': True}, {}, {'stop_nc': False}, {}, {'start': True}]],
   [[True, False], [True, False], [False, False], [False, False], [True, False]]],
  ['control: power loss with start held',
   [[{'start': True}, {'power': False}, {'start': True}, {}, {'start': True}]],
   [[True, False], [False, False], [False, False], [False, False], [True, False]]],
  ['control: overload trip and reset',
   [[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {'reset': True}, {'start': True}]],
   [[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]]],
  ['control: reset while overload open',
   [[{'start': True}, {'ol_nc': False, 'reset': True}, {'start': True}]],
   [[True, False], [False, True], [False, True]]],
  ['control: stop and start together',
   [[{'start': True, 'stop_nc': False}, {'start': True}, {'start': True, 'stop_nc': False}]],
   [[False, False], [True, False], [False, False]]],
  ['control: trip across power loss',
   [[{'start': True}, {'ol_nc': False}, {'power': False}, {}, {'start': True}]],
   [[True, False], [False, True], [False, True], [False, True], [False, True]]]],
 [['regression: scenario 1',
   [[{'stop_nc': True},
     {'start': True},
     {'stop_nc': True},
     {'reset': True},
     {'start': True, 'stop_nc': True, 'ol_nc': False, 'power': False},
     {'stop_nc': False},
     {'start': True},
     {'start': True, 'stop_nc': False},
     {'start': True, 'stop_nc': True, 'reset': True}]],
   [[False, False],
    [True, False],
    [True, False],
    [True, False],
    [False, False],
    [False, False],
    [True, False],
    [False, False],
    [True, False]]],
  ['regression: scenario 9',
   [[{'start': True, 'ol_nc': True, 'reset': True},
     {'power': False},
     {},
     {'start': True, 'stop_nc': True, 'ol_nc': True, 'reset': True},
     {'ol_nc': True},
     {},
     {'reset': True}]],
   [[True, False],
    [False, False],
    [False, False],
    [True, False],
    [True, False],
    [True, False],
    [True, False]]],
  ['regression: start seal stop',
   [[{'start': True}, {}, {'stop_nc': False}, {}, {'start': True}]],
   [[True, False], [True, False], [False, False], [False, False], [True, False]]],
  ['control: power loss with start held',
   [[{'start': True}, {'power': False}, {'start': True}, {}, {'start': True}]],
   [[True, False], [False, False], [False, False], [False, False], [True, False]]],
  ['control: overload trip and reset',
   [[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {'reset': True}, {'start': True}]],
   [[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]]],
  ['control: reset while overload open',
   [[{'start': True}, {'ol_nc': False, 'reset': True}, {'start': True}]],
   [[True, False], [False, True], [False, True]]],
  ['control: stop and start together',
   [[{'start': True, 'stop_nc': False}, {'start': True}, {'start': True, 'stop_nc': False}]],
   [[False, False], [True, False], [False, False]]],
  ['control: trip across power loss',
   [[{'start': True}, {'ol_nc': False}, {'power': False}, {}, {'start': True}]],
   [[True, False], [False, True], [False, True], [False, True], [False, True]]]],
 [['regression: scenario 3',
   [[{'stop_nc': True},
     {'stop_nc': False},
     {'stop_nc': False},
     {'start': True},
     {'start': True},
     {'start': False},
     {'stop_nc': False, 'reset': True},
     {'start': False},
     {'ol_nc': True, 'reset': True},
     {},
     {'start': False}]],
   [[False, False],
    [False, False],
    [False, False],
    [True, False],
    [True, False],
    [True, False],
    [False, False],
    [False, False],
    [False, False],
    [False, False],
    [False, False]]],
  ['regression: scenario 14',
   [[{'start': False, 'ol_nc': True},
     {'stop_nc': False},
     {},
     {'start': True},
     {'stop_nc': True},
     {'start': True},
     {},
     {'ol_nc': True, 'reset': True},
     {'ol_nc': False},
     {'stop_nc': False, 'ol_nc': False, 'reset': True},
     {'power': False}]],
   [[False, False],
    [False, False],
    [False, False],
    [True, False],
    [True, False],
    [True, False],
    [True, False],
    [True, False],
    [False, True],
    [False, True],
    [False, True]]],
  ['regression: start seal stop',
   [[{'start': True}, {}, {'stop_nc': False}, {}, {'start': True}]],
   [[True, False], [True, False], [False, False], [False, False], [True, False]]],
  ['control: power loss with start held',
   [[{'start': True}, {'power': False}, {'start': True}, {}, {'start': True}]],
   [[True, False], [False, False], [False, False], [False, False], [True, False]]],
  ['control: overload trip and reset',
   [[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {'reset': True}, {'start': True}]],
   [[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]]],
  ['control: reset while overload open',
   [[{'start': True}, {'ol_nc': False, 'reset': True}, {'start': True}]],
   [[True, False], [False, True], [False, True]]],
  ['control: stop and start together',
   [[{'start': True, 'stop_nc': False}, {'start': True}, {'start': True, 'stop_nc': False}]],
   [[False, False], [True, False], [False, False]]],
  ['control: trip across power loss',
   [[{'start': True}, {'ol_nc': False}, {'power': False}, {}, {'start': True}]],
   [[True, False], [False, True], [False, True], [False, True], [False, True]]]],
 [['regression: scenario 4',
   [[{'start': True, 'stop_nc': True, 'reset': True},
     {'start': True, 'stop_nc': True},
     {'power': False},
     {},
     {'start': False, 'stop_nc': True, 'ol_nc': True},
     {'reset': True},
     {'ol_nc': True},
     {'start': True, 'stop_nc': False, 'ol_nc': True},
     {'start': True},
     {'ol_nc': True},
     {'start': True},
     {'start': True, 'stop_nc': False},
     {'stop_nc': False}]],
   [[True, False],
    [True, False],
    [False, False],
    [False, False],
    [False, False],
    [False, False],
    [False, False],
    [False, False],
    [True, False],
    [True, False],
    [True, False],
    [False, False],
    [False, False]]],
  ['regression: scenario 14',
   [[{'start': True, 'stop_nc': True},
     {'start': True},
     {'reset': True},
     {},
     {'start': True},
     {'stop_nc': True},
     {'stop_nc': False, 'ol_nc': False, 'reset': True},
     {'stop_nc': False},
     {'reset': True, 'power': False},
     {'start': False},
     {'start': False, 'stop_nc': True, 'reset': True}]],
   [[True, False],
    [True, False],
    [True, False],
    [True, False],
    [True, False],
    [True, False],
    [False, True],
    [False, True],
    [False, True],
    [False, True],
    [False, False]]],
  ['regression: start seal stop',
   [[{'start': True}, {}, {'stop_nc': False}, {}, {'start': True}]],
   [[True, False], [True, False], [False, False], [False, False], [True, False]]],
  ['control: power loss with start held',
   [[{'start': True}, {'power': False}, {'start': True}, {}, {'start': True}]],
   [[True, False], [False, False], [False, False], [False, False], [True, False]]],
  ['control: overload trip and reset',
   [[{'start': True}, {'ol_nc': False}, {}, {'start': True}, {'reset': True}, {'start': True}]],
   [[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]]],
  ['control: reset while overload open',
   [[{'start': True}, {'ol_nc': False, 'reset': True}, {'start': True}]],
   [[True, False], [False, True], [False, True]]],
  ['control: stop and start together',
   [[{'start': True, 'stop_nc': False}, {'start': True}, {'start': True, 'stop_nc': False}]],
   [[False, False], [True, False], [False, False]]],
  ['control: trip across power loss',
   [[{'start': True}, {'ol_nc': False}, {'power': False}, {}, {'start': True}]],
   [[True, False], [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: start seal stop[[True, False], [True, False], [False, False], [False, False], [True, False]][[True, False], [True, False], [False, False], [False, False], [True, False]]Passed
regression: reset while running[[True, False], [True, False], [False, False], [False, False]][[True, False], [True, False], [True, False], [True, False]]Failed
control: power loss with start held[[True, False], [False, False], [False, False], [False, False], [True, False]][[True, False], [False, False], [False, False], [False, False], [True, False]]Passed
control: overload trip and reset[[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]][[True, False], [False, True], [False, True], [False, True], [False, False], [True, False]]Passed
control: reset while overload open[[True, False], [False, True], [False, True]][[True, False], [False, True], [False, True]]Passed
control: stop and start together[[False, False], [True, False], [False, False]][[False, False], [True, False], [False, False]]Passed
control: trip across power loss[[True, False], [False, True], [False, True], [False, True], [False, True]][[True, False], [False, True], [False, True], [False, True], [False, True]]Passed
control: start after overload recovers[[True, False], [False, True], [False, True], [False, True], [False, True]][[True, False], [False, True], [False, True], [False, True], [False, True]]Passed

SHA-256 / 4193417e0084e020a7be016c89fb4dbab2b0d364c9f4ca6a569face737164e9d

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

Case digest / 43db3938e83e6f448c9c6e310ab7c94fd511bfb295568d7c386a43949a9ee2c1