{"abstract":"A timer with a zero preset shows DN set on scans where its rung is false.","category":"PLC ladder logic scan cycles","checks":8,"contract":"On-delay timer (TON) evaluated once per scan. scans is a list of [rung_in, elapsed_ms since the previous scan]. The accumulator starts on the false-to-true scan without crediting that scan's elapsed time, then adds each later true scan's elapsed time, clamped at preset. A false rung resets the accumulator. DN is rung_in and acc >= preset; TT is rung_in and not DN. Return [DN, TT, ACC] per scan.","evaluation_group":"w2-plc-ladder-logic-scan-cycles-ton-on-delay","failed_approach":"Qualifying DN with the previous scan rung state leaves DN true on the scan the rung drops.","family":"w2-plc-ladder-logic-scan-cycles-ton-on-delay-done-without-rung","id":"FA-91866","implementations":{"attempt":{"sha256":"990947dedccf8d980ae529e893b3f3c3345796c686acceb896876fbc89c8e9ea","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(preset, scans):\n    acc = 0\n    prev = False\n    out = []\n    for rung_in, dt in scans:\n        rung_in = bool(rung_in)\n        if rung_in and prev:\n            acc = min(preset, acc + dt)\n        elif not rung_in:\n            acc = 0\n        dn = (rung_in or prev) and acc >= preset\n        tt = rung_in and not dn\n        prev = rung_in\n        out.append([dn, tt, acc])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: zero preset',\n   [0, [[False, 10], [True, 10], [False, 5], [True, 40]]],\n   [[False, False, 0], [True, False, 0], [False, False, 0], [True, False, 0]]],\n  ['regression: scenario 4',\n   [0,\n    [[True, 10],\n     [False, 25],\n     [True, 25],\n     [True, 20],\n     [True, 40],\n     [True, 20],\n     [True, 75],\n     [True, 0],\n     [True, 10]]],\n   [[True, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0]]],\n  ['control: preset reached exactly',\n   [100, [[True, 30], [True, 50], [True, 50], [True, 10]]],\n   [[False, True, 0], [False, True, 50], [True, False, 100], [True, False, 100]]],\n  ['control: interrupted timing restarts',\n   [60, [[True, 40], [True, 40], [False, 40], [True, 40], [True, 40], [True, 40]]],\n   [[False, True, 0],\n    [False, True, 40],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 40],\n    [True, False, 60]]],\n  ['control: long hold after done',\n   [50, [[True, 30], [True, 30], [True, 30], [True, 30], [False, 30]]],\n   [[False, True, 0], [False, True, 30], [True, False, 50], [True, False, 50], [False, False, 0]]],\n  ['control: scenario 1',\n   [30, [[True, 40], [False, 75], [True, 60], [False, 25], [False, 10], [True, 60], [True, 25], [True, 40]]],\n   [[False, True, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, False, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 25],\n    [True, False, 30]]],\n  ['control: scenario 2',\n   [30, [[False, 25], [True, 50], [True, 0], [True, 0], [True, 25], [True, 75], [True, 75]]],\n   [[False, False, 0],\n    [False, True, 0],\n    [False, True, 0],\n    [False, True, 0],\n    [False, True, 25],\n    [True, False, 30],\n    [True, False, 30]]],\n  ['control: scenario 3',\n   [120, [[True, 25], [True, 20], [False, 75], [True, 75], [True, 0], [False, 10], [True, 25]]],\n   [[False, True, 0],\n    [False, True, 20],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 0],\n    [False, False, 0],\n    [False, True, 0]]]],\n [['regression: scenario 1',\n   [0,\n    [[True, 40],\n     [True, 10],\n     [True, 10],\n     [False, 10],\n     [True, 20],\n     [True, 25],\n     [True, 20],\n     [False, 25],\n     [True, 20]]],\n   [[True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [True, False, 0]]],\n  ['regression: scenario 32',\n   [0,\n    [[True, 20],\n     [False, 75],\n     [True, 50],\n     [True, 50],\n     [False, 0],\n     [False, 0],\n     [True, 20],\n     [True, 10],\n     [False, 40],\n     [True, 25],\n     [True, 75],\n     [True, 10],\n     [True, 0],\n     [True, 60]]],\n   [[True, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0]]],\n  ['control: preset reached exactly',\n   [100, [[True, 30], [True, 50], [True, 50], [True, 10]]],\n   [[False, True, 0], [False, True, 50], [True, False, 100], [True, False, 100]]],\n  ['regression: zero preset',\n   [0, [[False, 10], [True, 10], [False, 5], [True, 40]]],\n   [[False, False, 0], [True, False, 0], [False, False, 0], [True, False, 0]]],\n  ['control: interrupted timing restarts',\n   [60, [[True, 40], [True, 40], [False, 40], [True, 40], [True, 40], [True, 40]]],\n   [[False, True, 0],\n    [False, True, 40],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 40],\n    [True, False, 60]]],\n  ['control: long hold after done',\n   [50, [[True, 30], [True, 30], [True, 30], [True, 30], [False, 30]]],\n   [[False, True, 0], [False, True, 30], [True, False, 50], [True, False, 50], [False, False, 0]]],\n  ['control: scenario 2',\n   [150,\n    [[True, 60],\n     [True, 10],\n     [False, 20],\n     [False, 40],\n     [True, 50],\n     [True, 25],\n     [False, 25],\n     [False, 75],\n     [True, 25],\n     [False, 0],\n     [True, 60],\n     [False, 10]]],\n   [[False, True, 0],\n    [False, True, 10],\n    [False, False, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 25],\n    [False, False, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, False, 0]]],\n  ['control: scenario 3',\n   [50,\n    [[False, 50],\n     [True, 75],\n     [True, 75],\n     [True, 20],\n     [True, 75],\n     [True, 0],\n     [False, 60],\n     [True, 25],\n     [False, 10]]],\n   [[False, False, 0],\n    [False, True, 0],\n    [True, False, 50],\n    [True, False, 50],\n    [True, False, 50],\n    [True, False, 50],\n    [False, False, 0],\n    [False, True, 0],\n    [False, False, 0]]]],\n [['regression: scenario 34',\n   [0, [[True, 10], [True, 20], [True, 60], [True, 25], [True, 50], [False, 50], [False, 25], [True, 40]]],\n   [[True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [False, False, 0],\n    [True, False, 0]]],\n  ['regression: scenario 57',\n   [0,\n    [[True, 75],\n     [False, 10],\n     [True, 50],\n     [True, 40],\n     [True, 60],\n     [True, 0],\n     [False, 20],\n     [False, 0],\n     [True, 50]]],\n   [[True, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [False, False, 0],\n    [True, False, 0]]],\n  ['control: preset reached exactly',\n   [100, [[True, 30], [True, 50], [True, 50], [True, 10]]],\n   [[False, True, 0], [False, True, 50], [True, False, 100], [True, False, 100]]],\n  ['regression: zero preset',\n   [0, [[False, 10], [True, 10], [False, 5], [True, 40]]],\n   [[False, False, 0], [True, False, 0], [False, False, 0], [True, False, 0]]],\n  ['control: interrupted timing restarts',\n   [60, [[True, 40], [True, 40], [False, 40], [True, 40], [True, 40], [True, 40]]],\n   [[False, True, 0],\n    [False, True, 40],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 40],\n    [True, False, 60]]],\n  ['control: long hold after done',\n   [50, [[True, 30], [True, 30], [True, 30], [True, 30], [False, 30]]],\n   [[False, True, 0], [False, True, 30], [True, False, 50], [True, False, 50], [False, False, 0]]],\n  ['control: scenario 1',\n   [50,\n    [[True, 75],\n     [True, 40],\n     [True, 60],\n     [True, 0],\n     [True, 25],\n     [False, 50],\n     [False, 75],\n     [True, 60],\n     [True, 20],\n     [True, 60],\n     [False, 60],\n     [True, 75]]],\n   [[False, True, 0],\n    [False, True, 40],\n    [True, False, 50],\n    [True, False, 50],\n    [True, False, 50],\n    [False, False, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 20],\n    [True, False, 50],\n    [False, False, 0],\n    [False, True, 0]]],\n  ['control: scenario 2',\n   [120, [[False, 0], [False, 75], [True, 75], [True, 0], [True, 0], [False, 75], [True, 60], [True, 40]]],\n   [[False, False, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 0],\n    [False, True, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 40]]]],\n [['regression: scenario 9',\n   [0,\n    [[True, 20],\n     [True, 40],\n     [True, 50],\n     [True, 20],\n     [True, 25],\n     [True, 10],\n     [False, 60],\n     [True, 75],\n     [True, 40],\n     [True, 10],\n     [True, 60],\n     [False, 10],\n     [True, 10],\n     [True, 40]]],\n   [[True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0]]],\n  ['regression: scenario 25',\n   [0,\n    [[True, 25],\n     [False, 75],\n     [False, 10],\n     [True, 75],\n     [True, 50],\n     [True, 40],\n     [True, 60],\n     [True, 60],\n     [True, 0],\n     [True, 75],\n     [True, 0]]],\n   [[True, False, 0],\n    [False, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0]]],\n  ['control: preset reached exactly',\n   [100, [[True, 30], [True, 50], [True, 50], [True, 10]]],\n   [[False, True, 0], [False, True, 50], [True, False, 100], [True, False, 100]]],\n  ['regression: zero preset',\n   [0, [[False, 10], [True, 10], [False, 5], [True, 40]]],\n   [[False, False, 0], [True, False, 0], [False, False, 0], [True, False, 0]]],\n  ['control: interrupted timing restarts',\n   [60, [[True, 40], [True, 40], [False, 40], [True, 40], [True, 40], [True, 40]]],\n   [[False, True, 0],\n    [False, True, 40],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 40],\n    [True, False, 60]]],\n  ['control: long hold after done',\n   [50, [[True, 30], [True, 30], [True, 30], [True, 30], [False, 30]]],\n   [[False, True, 0], [False, True, 30], [True, False, 50], [True, False, 50], [False, False, 0]]],\n  ['regression: scenario 1',\n   [0,\n    [[True, 10],\n     [True, 0],\n     [False, 50],\n     [True, 40],\n     [False, 20],\n     [False, 25],\n     [True, 50],\n     [True, 60],\n     [True, 40]]],\n   [[True, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0]]],\n  ['control: scenario 2',\n   [100, [[False, 50], [True, 50], [True, 20], [False, 50], [True, 40], [True, 10], [False, 10]]],\n   [[False, False, 0],\n    [False, True, 0],\n    [False, True, 20],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 10],\n    [False, False, 0]]]],\n [['regression: scenario 40',\n   [0,\n    [[True, 10],\n     [True, 25],\n     [True, 50],\n     [False, 60],\n     [False, 20],\n     [True, 50],\n     [True, 0],\n     [True, 60],\n     [False, 60]]],\n   [[True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [False, False, 0]]],\n  ['regression: zero preset',\n   [0, [[False, 10], [True, 10], [False, 5], [True, 40]]],\n   [[False, False, 0], [True, False, 0], [False, False, 0], [True, False, 0]]],\n  ['control: preset reached exactly',\n   [100, [[True, 30], [True, 50], [True, 50], [True, 10]]],\n   [[False, True, 0], [False, True, 50], [True, False, 100], [True, False, 100]]],\n  ['control: interrupted timing restarts',\n   [60, [[True, 40], [True, 40], [False, 40], [True, 40], [True, 40], [True, 40]]],\n   [[False, True, 0],\n    [False, True, 40],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 40],\n    [True, False, 60]]],\n  ['control: long hold after done',\n   [50, [[True, 30], [True, 30], [True, 30], [True, 30], [False, 30]]],\n   [[False, True, 0], [False, True, 30], [True, False, 50], [True, False, 50], [False, False, 0]]],\n  ['control: scenario 1',\n   [120,\n    [[True, 0],\n     [True, 50],\n     [True, 50],\n     [True, 75],\n     [True, 75],\n     [False, 40],\n     [True, 25],\n     [False, 0],\n     [False, 10],\n     [True, 25],\n     [False, 0]]],\n   [[False, True, 0],\n    [False, True, 50],\n    [False, True, 100],\n    [True, False, 120],\n    [True, False, 120],\n    [False, False, 0],\n    [False, True, 0],\n    [False, False, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, False, 0]]],\n  ['control: scenario 2',\n   [150, [[True, 50], [False, 40], [True, 20], [True, 20], [True, 10], [True, 40], [False, 50]]],\n   [[False, True, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 20],\n    [False, True, 30],\n    [False, True, 70],\n    [False, False, 0]]],\n  ['control: scenario 3',\n   [200,\n    [[False, 20],\n     [False, 50],\n     [True, 75],\n     [False, 60],\n     [False, 50],\n     [True, 0],\n     [True, 25],\n     [True, 20],\n     [True, 40],\n     [True, 25],\n     [True, 25],\n     [True, 60]]],\n   [[False, False, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, False, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 25],\n    [False, True, 45],\n    [False, True, 85],\n    [False, True, 110],\n    [False, True, 135],\n    [False, True, 195]]]]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"84c1f62855f4db4f96018d49e91ecc76bb1e4fe7ac3250aa86c677f703ec900f","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(preset, scans):\n    acc = 0\n    prev = False\n    out = []\n    for rung_in, dt in scans:\n        rung_in = bool(rung_in)\n        if rung_in and prev:\n            acc = min(preset, acc + dt)\n        elif not rung_in:\n            acc = 0\n        dn = acc >= preset\n        tt = rung_in and not dn\n        prev = rung_in\n        out.append([dn, tt, acc])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: zero preset',\n   [0, [[False, 10], [True, 10], [False, 5], [True, 40]]],\n   [[False, False, 0], [True, False, 0], [False, False, 0], [True, False, 0]]],\n  ['regression: scenario 4',\n   [0,\n    [[True, 10],\n     [False, 25],\n     [True, 25],\n     [True, 20],\n     [True, 40],\n     [True, 20],\n     [True, 75],\n     [True, 0],\n     [True, 10]]],\n   [[True, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0]]],\n  ['control: preset reached exactly',\n   [100, [[True, 30], [True, 50], [True, 50], [True, 10]]],\n   [[False, True, 0], [False, True, 50], [True, False, 100], [True, False, 100]]],\n  ['control: interrupted timing restarts',\n   [60, [[True, 40], [True, 40], [False, 40], [True, 40], [True, 40], [True, 40]]],\n   [[False, True, 0],\n    [False, True, 40],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 40],\n    [True, False, 60]]],\n  ['control: long hold after done',\n   [50, [[True, 30], [True, 30], [True, 30], [True, 30], [False, 30]]],\n   [[False, True, 0], [False, True, 30], [True, False, 50], [True, False, 50], [False, False, 0]]],\n  ['control: scenario 1',\n   [30, [[True, 40], [False, 75], [True, 60], [False, 25], [False, 10], [True, 60], [True, 25], [True, 40]]],\n   [[False, True, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, False, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 25],\n    [True, False, 30]]],\n  ['control: scenario 2',\n   [30, [[False, 25], [True, 50], [True, 0], [True, 0], [True, 25], [True, 75], [True, 75]]],\n   [[False, False, 0],\n    [False, True, 0],\n    [False, True, 0],\n    [False, True, 0],\n    [False, True, 25],\n    [True, False, 30],\n    [True, False, 30]]],\n  ['control: scenario 3',\n   [120, [[True, 25], [True, 20], [False, 75], [True, 75], [True, 0], [False, 10], [True, 25]]],\n   [[False, True, 0],\n    [False, True, 20],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 0],\n    [False, False, 0],\n    [False, True, 0]]]],\n [['regression: scenario 1',\n   [0,\n    [[True, 40],\n     [True, 10],\n     [True, 10],\n     [False, 10],\n     [True, 20],\n     [True, 25],\n     [True, 20],\n     [False, 25],\n     [True, 20]]],\n   [[True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [True, False, 0]]],\n  ['regression: scenario 32',\n   [0,\n    [[True, 20],\n     [False, 75],\n     [True, 50],\n     [True, 50],\n     [False, 0],\n     [False, 0],\n     [True, 20],\n     [True, 10],\n     [False, 40],\n     [True, 25],\n     [True, 75],\n     [True, 10],\n     [True, 0],\n     [True, 60]]],\n   [[True, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0]]],\n  ['control: preset reached exactly',\n   [100, [[True, 30], [True, 50], [True, 50], [True, 10]]],\n   [[False, True, 0], [False, True, 50], [True, False, 100], [True, False, 100]]],\n  ['regression: zero preset',\n   [0, [[False, 10], [True, 10], [False, 5], [True, 40]]],\n   [[False, False, 0], [True, False, 0], [False, False, 0], [True, False, 0]]],\n  ['control: interrupted timing restarts',\n   [60, [[True, 40], [True, 40], [False, 40], [True, 40], [True, 40], [True, 40]]],\n   [[False, True, 0],\n    [False, True, 40],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 40],\n    [True, False, 60]]],\n  ['control: long hold after done',\n   [50, [[True, 30], [True, 30], [True, 30], [True, 30], [False, 30]]],\n   [[False, True, 0], [False, True, 30], [True, False, 50], [True, False, 50], [False, False, 0]]],\n  ['control: scenario 2',\n   [150,\n    [[True, 60],\n     [True, 10],\n     [False, 20],\n     [False, 40],\n     [True, 50],\n     [True, 25],\n     [False, 25],\n     [False, 75],\n     [True, 25],\n     [False, 0],\n     [True, 60],\n     [False, 10]]],\n   [[False, True, 0],\n    [False, True, 10],\n    [False, False, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 25],\n    [False, False, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, False, 0]]],\n  ['control: scenario 3',\n   [50,\n    [[False, 50],\n     [True, 75],\n     [True, 75],\n     [True, 20],\n     [True, 75],\n     [True, 0],\n     [False, 60],\n     [True, 25],\n     [False, 10]]],\n   [[False, False, 0],\n    [False, True, 0],\n    [True, False, 50],\n    [True, False, 50],\n    [True, False, 50],\n    [True, False, 50],\n    [False, False, 0],\n    [False, True, 0],\n    [False, False, 0]]]],\n [['regression: scenario 34',\n   [0, [[True, 10], [True, 20], [True, 60], [True, 25], [True, 50], [False, 50], [False, 25], [True, 40]]],\n   [[True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [False, False, 0],\n    [True, False, 0]]],\n  ['regression: scenario 57',\n   [0,\n    [[True, 75],\n     [False, 10],\n     [True, 50],\n     [True, 40],\n     [True, 60],\n     [True, 0],\n     [False, 20],\n     [False, 0],\n     [True, 50]]],\n   [[True, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [False, False, 0],\n    [True, False, 0]]],\n  ['control: preset reached exactly',\n   [100, [[True, 30], [True, 50], [True, 50], [True, 10]]],\n   [[False, True, 0], [False, True, 50], [True, False, 100], [True, False, 100]]],\n  ['regression: zero preset',\n   [0, [[False, 10], [True, 10], [False, 5], [True, 40]]],\n   [[False, False, 0], [True, False, 0], [False, False, 0], [True, False, 0]]],\n  ['control: interrupted timing restarts',\n   [60, [[True, 40], [True, 40], [False, 40], [True, 40], [True, 40], [True, 40]]],\n   [[False, True, 0],\n    [False, True, 40],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 40],\n    [True, False, 60]]],\n  ['control: long hold after done',\n   [50, [[True, 30], [True, 30], [True, 30], [True, 30], [False, 30]]],\n   [[False, True, 0], [False, True, 30], [True, False, 50], [True, False, 50], [False, False, 0]]],\n  ['control: scenario 1',\n   [50,\n    [[True, 75],\n     [True, 40],\n     [True, 60],\n     [True, 0],\n     [True, 25],\n     [False, 50],\n     [False, 75],\n     [True, 60],\n     [True, 20],\n     [True, 60],\n     [False, 60],\n     [True, 75]]],\n   [[False, True, 0],\n    [False, True, 40],\n    [True, False, 50],\n    [True, False, 50],\n    [True, False, 50],\n    [False, False, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 20],\n    [True, False, 50],\n    [False, False, 0],\n    [False, True, 0]]],\n  ['control: scenario 2',\n   [120, [[False, 0], [False, 75], [True, 75], [True, 0], [True, 0], [False, 75], [True, 60], [True, 40]]],\n   [[False, False, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 0],\n    [False, True, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 40]]]],\n [['regression: scenario 9',\n   [0,\n    [[True, 20],\n     [True, 40],\n     [True, 50],\n     [True, 20],\n     [True, 25],\n     [True, 10],\n     [False, 60],\n     [True, 75],\n     [True, 40],\n     [True, 10],\n     [True, 60],\n     [False, 10],\n     [True, 10],\n     [True, 40]]],\n   [[True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0]]],\n  ['regression: scenario 25',\n   [0,\n    [[True, 25],\n     [False, 75],\n     [False, 10],\n     [True, 75],\n     [True, 50],\n     [True, 40],\n     [True, 60],\n     [True, 60],\n     [True, 0],\n     [True, 75],\n     [True, 0]]],\n   [[True, False, 0],\n    [False, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0]]],\n  ['control: preset reached exactly',\n   [100, [[True, 30], [True, 50], [True, 50], [True, 10]]],\n   [[False, True, 0], [False, True, 50], [True, False, 100], [True, False, 100]]],\n  ['regression: zero preset',\n   [0, [[False, 10], [True, 10], [False, 5], [True, 40]]],\n   [[False, False, 0], [True, False, 0], [False, False, 0], [True, False, 0]]],\n  ['control: interrupted timing restarts',\n   [60, [[True, 40], [True, 40], [False, 40], [True, 40], [True, 40], [True, 40]]],\n   [[False, True, 0],\n    [False, True, 40],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 40],\n    [True, False, 60]]],\n  ['control: long hold after done',\n   [50, [[True, 30], [True, 30], [True, 30], [True, 30], [False, 30]]],\n   [[False, True, 0], [False, True, 30], [True, False, 50], [True, False, 50], [False, False, 0]]],\n  ['regression: scenario 1',\n   [0,\n    [[True, 10],\n     [True, 0],\n     [False, 50],\n     [True, 40],\n     [False, 20],\n     [False, 25],\n     [True, 50],\n     [True, 60],\n     [True, 40]]],\n   [[True, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0]]],\n  ['control: scenario 2',\n   [100, [[False, 50], [True, 50], [True, 20], [False, 50], [True, 40], [True, 10], [False, 10]]],\n   [[False, False, 0],\n    [False, True, 0],\n    [False, True, 20],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 10],\n    [False, False, 0]]]],\n [['regression: scenario 40',\n   [0,\n    [[True, 10],\n     [True, 25],\n     [True, 50],\n     [False, 60],\n     [False, 20],\n     [True, 50],\n     [True, 0],\n     [True, 60],\n     [False, 60]]],\n   [[True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [False, False, 0]]],\n  ['regression: zero preset',\n   [0, [[False, 10], [True, 10], [False, 5], [True, 40]]],\n   [[False, False, 0], [True, False, 0], [False, False, 0], [True, False, 0]]],\n  ['control: preset reached exactly',\n   [100, [[True, 30], [True, 50], [True, 50], [True, 10]]],\n   [[False, True, 0], [False, True, 50], [True, False, 100], [True, False, 100]]],\n  ['control: interrupted timing restarts',\n   [60, [[True, 40], [True, 40], [False, 40], [True, 40], [True, 40], [True, 40]]],\n   [[False, True, 0],\n    [False, True, 40],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 40],\n    [True, False, 60]]],\n  ['control: long hold after done',\n   [50, [[True, 30], [True, 30], [True, 30], [True, 30], [False, 30]]],\n   [[False, True, 0], [False, True, 30], [True, False, 50], [True, False, 50], [False, False, 0]]],\n  ['control: scenario 1',\n   [120,\n    [[True, 0],\n     [True, 50],\n     [True, 50],\n     [True, 75],\n     [True, 75],\n     [False, 40],\n     [True, 25],\n     [False, 0],\n     [False, 10],\n     [True, 25],\n     [False, 0]]],\n   [[False, True, 0],\n    [False, True, 50],\n    [False, True, 100],\n    [True, False, 120],\n    [True, False, 120],\n    [False, False, 0],\n    [False, True, 0],\n    [False, False, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, False, 0]]],\n  ['control: scenario 2',\n   [150, [[True, 50], [False, 40], [True, 20], [True, 20], [True, 10], [True, 40], [False, 50]]],\n   [[False, True, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 20],\n    [False, True, 30],\n    [False, True, 70],\n    [False, False, 0]]],\n  ['control: scenario 3',\n   [200,\n    [[False, 20],\n     [False, 50],\n     [True, 75],\n     [False, 60],\n     [False, 50],\n     [True, 0],\n     [True, 25],\n     [True, 20],\n     [True, 40],\n     [True, 25],\n     [True, 25],\n     [True, 60]]],\n   [[False, False, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, False, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 25],\n    [False, True, 45],\n    [False, True, 85],\n    [False, True, 110],\n    [False, True, 135],\n    [False, True, 195]]]]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"4b767fb2b43245d5adfa004e92ad4725bb20ddbad7e4431536966d8ddcad0657","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(preset, scans):\n    acc = 0\n    prev = False\n    out = []\n    for rung_in, dt in scans:\n        rung_in = bool(rung_in)\n        if rung_in and prev:\n            acc = min(preset, acc + dt)\n        elif not rung_in:\n            acc = 0\n        dn = rung_in and acc >= preset\n        tt = rung_in and not dn\n        prev = rung_in\n        out.append([dn, tt, acc])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: zero preset',\n   [0, [[False, 10], [True, 10], [False, 5], [True, 40]]],\n   [[False, False, 0], [True, False, 0], [False, False, 0], [True, False, 0]]],\n  ['regression: scenario 4',\n   [0,\n    [[True, 10],\n     [False, 25],\n     [True, 25],\n     [True, 20],\n     [True, 40],\n     [True, 20],\n     [True, 75],\n     [True, 0],\n     [True, 10]]],\n   [[True, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0]]],\n  ['control: preset reached exactly',\n   [100, [[True, 30], [True, 50], [True, 50], [True, 10]]],\n   [[False, True, 0], [False, True, 50], [True, False, 100], [True, False, 100]]],\n  ['control: interrupted timing restarts',\n   [60, [[True, 40], [True, 40], [False, 40], [True, 40], [True, 40], [True, 40]]],\n   [[False, True, 0],\n    [False, True, 40],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 40],\n    [True, False, 60]]],\n  ['control: long hold after done',\n   [50, [[True, 30], [True, 30], [True, 30], [True, 30], [False, 30]]],\n   [[False, True, 0], [False, True, 30], [True, False, 50], [True, False, 50], [False, False, 0]]],\n  ['control: scenario 1',\n   [30, [[True, 40], [False, 75], [True, 60], [False, 25], [False, 10], [True, 60], [True, 25], [True, 40]]],\n   [[False, True, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, False, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 25],\n    [True, False, 30]]],\n  ['control: scenario 2',\n   [30, [[False, 25], [True, 50], [True, 0], [True, 0], [True, 25], [True, 75], [True, 75]]],\n   [[False, False, 0],\n    [False, True, 0],\n    [False, True, 0],\n    [False, True, 0],\n    [False, True, 25],\n    [True, False, 30],\n    [True, False, 30]]],\n  ['control: scenario 3',\n   [120, [[True, 25], [True, 20], [False, 75], [True, 75], [True, 0], [False, 10], [True, 25]]],\n   [[False, True, 0],\n    [False, True, 20],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 0],\n    [False, False, 0],\n    [False, True, 0]]]],\n [['regression: scenario 1',\n   [0,\n    [[True, 40],\n     [True, 10],\n     [True, 10],\n     [False, 10],\n     [True, 20],\n     [True, 25],\n     [True, 20],\n     [False, 25],\n     [True, 20]]],\n   [[True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [True, False, 0]]],\n  ['regression: scenario 32',\n   [0,\n    [[True, 20],\n     [False, 75],\n     [True, 50],\n     [True, 50],\n     [False, 0],\n     [False, 0],\n     [True, 20],\n     [True, 10],\n     [False, 40],\n     [True, 25],\n     [True, 75],\n     [True, 10],\n     [True, 0],\n     [True, 60]]],\n   [[True, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0]]],\n  ['control: preset reached exactly',\n   [100, [[True, 30], [True, 50], [True, 50], [True, 10]]],\n   [[False, True, 0], [False, True, 50], [True, False, 100], [True, False, 100]]],\n  ['regression: zero preset',\n   [0, [[False, 10], [True, 10], [False, 5], [True, 40]]],\n   [[False, False, 0], [True, False, 0], [False, False, 0], [True, False, 0]]],\n  ['control: interrupted timing restarts',\n   [60, [[True, 40], [True, 40], [False, 40], [True, 40], [True, 40], [True, 40]]],\n   [[False, True, 0],\n    [False, True, 40],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 40],\n    [True, False, 60]]],\n  ['control: long hold after done',\n   [50, [[True, 30], [True, 30], [True, 30], [True, 30], [False, 30]]],\n   [[False, True, 0], [False, True, 30], [True, False, 50], [True, False, 50], [False, False, 0]]],\n  ['control: scenario 2',\n   [150,\n    [[True, 60],\n     [True, 10],\n     [False, 20],\n     [False, 40],\n     [True, 50],\n     [True, 25],\n     [False, 25],\n     [False, 75],\n     [True, 25],\n     [False, 0],\n     [True, 60],\n     [False, 10]]],\n   [[False, True, 0],\n    [False, True, 10],\n    [False, False, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 25],\n    [False, False, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, False, 0]]],\n  ['control: scenario 3',\n   [50,\n    [[False, 50],\n     [True, 75],\n     [True, 75],\n     [True, 20],\n     [True, 75],\n     [True, 0],\n     [False, 60],\n     [True, 25],\n     [False, 10]]],\n   [[False, False, 0],\n    [False, True, 0],\n    [True, False, 50],\n    [True, False, 50],\n    [True, False, 50],\n    [True, False, 50],\n    [False, False, 0],\n    [False, True, 0],\n    [False, False, 0]]]],\n [['regression: scenario 34',\n   [0, [[True, 10], [True, 20], [True, 60], [True, 25], [True, 50], [False, 50], [False, 25], [True, 40]]],\n   [[True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [False, False, 0],\n    [True, False, 0]]],\n  ['regression: scenario 57',\n   [0,\n    [[True, 75],\n     [False, 10],\n     [True, 50],\n     [True, 40],\n     [True, 60],\n     [True, 0],\n     [False, 20],\n     [False, 0],\n     [True, 50]]],\n   [[True, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [False, False, 0],\n    [True, False, 0]]],\n  ['control: preset reached exactly',\n   [100, [[True, 30], [True, 50], [True, 50], [True, 10]]],\n   [[False, True, 0], [False, True, 50], [True, False, 100], [True, False, 100]]],\n  ['regression: zero preset',\n   [0, [[False, 10], [True, 10], [False, 5], [True, 40]]],\n   [[False, False, 0], [True, False, 0], [False, False, 0], [True, False, 0]]],\n  ['control: interrupted timing restarts',\n   [60, [[True, 40], [True, 40], [False, 40], [True, 40], [True, 40], [True, 40]]],\n   [[False, True, 0],\n    [False, True, 40],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 40],\n    [True, False, 60]]],\n  ['control: long hold after done',\n   [50, [[True, 30], [True, 30], [True, 30], [True, 30], [False, 30]]],\n   [[False, True, 0], [False, True, 30], [True, False, 50], [True, False, 50], [False, False, 0]]],\n  ['control: scenario 1',\n   [50,\n    [[True, 75],\n     [True, 40],\n     [True, 60],\n     [True, 0],\n     [True, 25],\n     [False, 50],\n     [False, 75],\n     [True, 60],\n     [True, 20],\n     [True, 60],\n     [False, 60],\n     [True, 75]]],\n   [[False, True, 0],\n    [False, True, 40],\n    [True, False, 50],\n    [True, False, 50],\n    [True, False, 50],\n    [False, False, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 20],\n    [True, False, 50],\n    [False, False, 0],\n    [False, True, 0]]],\n  ['control: scenario 2',\n   [120, [[False, 0], [False, 75], [True, 75], [True, 0], [True, 0], [False, 75], [True, 60], [True, 40]]],\n   [[False, False, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 0],\n    [False, True, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 40]]]],\n [['regression: scenario 9',\n   [0,\n    [[True, 20],\n     [True, 40],\n     [True, 50],\n     [True, 20],\n     [True, 25],\n     [True, 10],\n     [False, 60],\n     [True, 75],\n     [True, 40],\n     [True, 10],\n     [True, 60],\n     [False, 10],\n     [True, 10],\n     [True, 40]]],\n   [[True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0]]],\n  ['regression: scenario 25',\n   [0,\n    [[True, 25],\n     [False, 75],\n     [False, 10],\n     [True, 75],\n     [True, 50],\n     [True, 40],\n     [True, 60],\n     [True, 60],\n     [True, 0],\n     [True, 75],\n     [True, 0]]],\n   [[True, False, 0],\n    [False, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0]]],\n  ['control: preset reached exactly',\n   [100, [[True, 30], [True, 50], [True, 50], [True, 10]]],\n   [[False, True, 0], [False, True, 50], [True, False, 100], [True, False, 100]]],\n  ['regression: zero preset',\n   [0, [[False, 10], [True, 10], [False, 5], [True, 40]]],\n   [[False, False, 0], [True, False, 0], [False, False, 0], [True, False, 0]]],\n  ['control: interrupted timing restarts',\n   [60, [[True, 40], [True, 40], [False, 40], [True, 40], [True, 40], [True, 40]]],\n   [[False, True, 0],\n    [False, True, 40],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 40],\n    [True, False, 60]]],\n  ['control: long hold after done',\n   [50, [[True, 30], [True, 30], [True, 30], [True, 30], [False, 30]]],\n   [[False, True, 0], [False, True, 30], [True, False, 50], [True, False, 50], [False, False, 0]]],\n  ['regression: scenario 1',\n   [0,\n    [[True, 10],\n     [True, 0],\n     [False, 50],\n     [True, 40],\n     [False, 20],\n     [False, 25],\n     [True, 50],\n     [True, 60],\n     [True, 40]]],\n   [[True, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0]]],\n  ['control: scenario 2',\n   [100, [[False, 50], [True, 50], [True, 20], [False, 50], [True, 40], [True, 10], [False, 10]]],\n   [[False, False, 0],\n    [False, True, 0],\n    [False, True, 20],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 10],\n    [False, False, 0]]]],\n [['regression: scenario 40',\n   [0,\n    [[True, 10],\n     [True, 25],\n     [True, 50],\n     [False, 60],\n     [False, 20],\n     [True, 50],\n     [True, 0],\n     [True, 60],\n     [False, 60]]],\n   [[True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [False, False, 0],\n    [False, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [True, False, 0],\n    [False, False, 0]]],\n  ['regression: zero preset',\n   [0, [[False, 10], [True, 10], [False, 5], [True, 40]]],\n   [[False, False, 0], [True, False, 0], [False, False, 0], [True, False, 0]]],\n  ['control: preset reached exactly',\n   [100, [[True, 30], [True, 50], [True, 50], [True, 10]]],\n   [[False, True, 0], [False, True, 50], [True, False, 100], [True, False, 100]]],\n  ['control: interrupted timing restarts',\n   [60, [[True, 40], [True, 40], [False, 40], [True, 40], [True, 40], [True, 40]]],\n   [[False, True, 0],\n    [False, True, 40],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 40],\n    [True, False, 60]]],\n  ['control: long hold after done',\n   [50, [[True, 30], [True, 30], [True, 30], [True, 30], [False, 30]]],\n   [[False, True, 0], [False, True, 30], [True, False, 50], [True, False, 50], [False, False, 0]]],\n  ['control: scenario 1',\n   [120,\n    [[True, 0],\n     [True, 50],\n     [True, 50],\n     [True, 75],\n     [True, 75],\n     [False, 40],\n     [True, 25],\n     [False, 0],\n     [False, 10],\n     [True, 25],\n     [False, 0]]],\n   [[False, True, 0],\n    [False, True, 50],\n    [False, True, 100],\n    [True, False, 120],\n    [True, False, 120],\n    [False, False, 0],\n    [False, True, 0],\n    [False, False, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, False, 0]]],\n  ['control: scenario 2',\n   [150, [[True, 50], [False, 40], [True, 20], [True, 20], [True, 10], [True, 40], [False, 50]]],\n   [[False, True, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 20],\n    [False, True, 30],\n    [False, True, 70],\n    [False, False, 0]]],\n  ['control: scenario 3',\n   [200,\n    [[False, 20],\n     [False, 50],\n     [True, 75],\n     [False, 60],\n     [False, 50],\n     [True, 0],\n     [True, 25],\n     [True, 20],\n     [True, 40],\n     [True, 25],\n     [True, 25],\n     [True, 60]]],\n   [[False, False, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, False, 0],\n    [False, False, 0],\n    [False, True, 0],\n    [False, True, 25],\n    [False, True, 45],\n    [False, True, 85],\n    [False, True, 110],\n    [False, True, 135],\n    [False, True, 195]]]]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"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.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-plc-ladder-logic-scan-cycles-ton-on-delay-done-without-rung","generated_at":"2026-09-29T14:51:40.195303+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"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.","repair":"Qualify DN with the current rung condition.","root_cause":"DN is evaluated from the accumulator comparison alone, not qualified by the rung condition.","sha256":"3b560c21da27ba471c7e78aeca3e5a3b61799613d94b4dc4cc96f9b7b3f636e3","title":"Zero-preset TON reports done with a false rung · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":82.082,"exit_code":1,"observations":[{"actual":[[false,false,0],[true,false,0],[true,false,0],[true,false,0]],"check":"regression: zero preset","expected":[[false,false,0],[true,false,0],[false,false,0],[true,false,0]],"passed":false},{"actual":[[true,false,0],[true,false,0],[true,false,0],[true,false,0],[true,false,0],[true,false,0],[true,false,0],[true,false,0],[true,false,0]],"check":"regression: scenario 4","expected":[[true,false,0],[false,false,0],[true,false,0],[true,false,0],[true,false,0],[true,false,0],[true,false,0],[true,false,0],[true,false,0]],"passed":false},{"actual":[[false,true,0],[false,true,50],[true,false,100],[true,false,100]],"check":"control: preset reached exactly","expected":[[false,true,0],[false,true,50],[true,false,100],[true,false,100]],"passed":true},{"actual":[[false,true,0],[false,true,40],[false,false,0],[false,true,0],[false,true,40],[true,false,60]],"check":"control: interrupted timing restarts","expected":[[false,true,0],[false,true,40],[false,false,0],[false,true,0],[false,true,40],[true,false,60]],"passed":true},{"actual":[[false,true,0],[false,true,30],[true,false,50],[true,false,50],[false,false,0]],"check":"control: long hold after done","expected":[[false,true,0],[false,true,30],[true,false,50],[true,false,50],[false,false,0]],"passed":true},{"actual":[[false,true,0],[false,false,0],[false,true,0],[false,false,0],[false,false,0],[false,true,0],[false,true,25],[true,false,30]],"check":"control: scenario 1","expected":[[false,true,0],[false,false,0],[false,true,0],[false,false,0],[false,false,0],[false,true,0],[false,true,25],[true,false,30]],"passed":true},{"actual":[[false,false,0],[false,true,0],[false,true,0],[false,true,0],[false,true,25],[true,false,30],[true,false,30]],"check":"control: scenario 2","expected":[[false,false,0],[false,true,0],[false,true,0],[false,true,0],[false,true,25],[true,false,30],[true,false,30]],"passed":true},{"actual":[[false,true,0],[false,true,20],[false,false,0],[false,true,0],[false,true,0],[false,false,0],[false,true,0]],"check":"control: scenario 3","expected":[[false,true,0],[false,true,20],[false,false,0],[false,true,0],[false,true,0],[false,false,0],[false,true,0]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: zero preset\", \"actual\": [[false, false, 0], [true, false, 0], [true, false, 0], [true, false, 0]], \"expected\": [[false, false, 0], [true, false, 0], [false, false, 0], [true, false, 0]], \"passed\": false}, {\"check\": \"regression: scenario 4\", \"actual\": [[true, false, 0], [true, false, 0], [true, false, 0], [true, false, 0], [true, false, 0], [true, false, 0], [true, false, 0], [true, false, 0], [true, false, 0]], \"expected\": [[true, false, 0], [false, false, 0], [true, false, 0], [true, false, 0], [true, false, 0], [true, false, 0], [true, false, 0], [true, false, 0], [true, false, 0]], \"passed\": false}, {\"check\": \"control: preset reached exactly\", \"actual\": [[false, true, 0], [false, true, 50], [true, false, 100], [true, false, 100]], \"expected\": [[false, true, 0], [false, true, 50], [true, false, 100], [true, false, 100]], \"passed\": true}, {\"check\": \"control: interrupted timing restarts\", \"actual\": [[false, true, 0], [false, true, 40], [false, false, 0], [false, true, 0], [false, true, 40], [true, false, 60]], \"expected\": [[false, true, 0], [false, true, 40], [false, false, 0], [false, true, 0], [false, true, 40], [true, false, 60]], \"passed\": true}, {\"check\": \"control: long hold after done\", \"actual\": [[false, true, 0], [false, true, 30], [true, false, 50], [true, false, 50], [false, false, 0]], \"expected\": [[false, true, 0], [false, true, 30], [true, false, 50], [true, false, 50], [false, false, 0]], \"passed\": true}, {\"check\": \"control: scenario 1\", \"actual\": [[false, true, 0], [false, false, 0], [false, true, 0], [false, false, 0], [false, false, 0], [false, true, 0], [false, true, 25], [true, false, 30]], \"expected\": [[false, true, 0], [false, false, 0], [false, true, 0], [false, false, 0], [false, false, 0], [false, true, 0], [false, true, 25], [true, false, 30]], \"passed\": true}, {\"check\": \"control: scenario 2\", \"actual\": [[false, false, 0], [false, true, 0], [false, true, 0], [false, true, 0], [false, true, 25], [true, false, 30], [true, false, 30]], \"expected\": [[false, false, 0], [false, true, 0], [false, true, 0], [false, true, 0], [false, true, 25], [true, false, 30], [true, false, 30]], \"passed\": true}, {\"check\": \"control: scenario 3\", \"actual\": [[false, true, 0], [false, true, 20], [false, false, 0], [false, true, 0], [false, true, 0], [false, false, 0], [false, true, 0]], \"expected\": [[false, true, 0], [false, true, 20], [false, false, 0], [false, true, 0], [false, true, 0], [false, false, 0], [false, true, 0]], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":44.292,"exit_code":1,"observations":[{"actual":[[true,false,0],[true,false,0],[true,false,0],[true,false,0]],"check":"regression: zero preset","expected":[[false,false,0],[true,false,0],[false,false,0],[true,false,0]],"passed":false},{"actual":[[true,false,0],[true,false,0],[true,false,0],[true,false,0],[true,false,0],[true,false,0],[true,false,0],[true,false,0],[true,false,0]],"check":"regression: scenario 4","expected":[[true,false,0],[false,false,0],[true,false,0],[true,false,0],[true,false,0],[true,false,0],[true,false,0],[true,false,0],[true,false,0]],"passed":false},{"actual":[[false,true,0],[false,true,50],[true,false,100],[true,false,100]],"check":"control: preset reached exactly","expected":[[false,true,0],[false,true,50],[true,false,100],[true,false,100]],"passed":true},{"actual":[[false,true,0],[false,true,40],[false,false,0],[false,true,0],[false,true,40],[true,false,60]],"check":"control: interrupted timing restarts","expected":[[false,true,0],[false,true,40],[false,false,0],[false,true,0],[false,true,40],[true,false,60]],"passed":true},{"actual":[[false,true,0],[false,true,30],[true,false,50],[true,false,50],[false,false,0]],"check":"control: long hold after done","expected":[[false,true,0],[false,true,30],[true,false,50],[true,false,50],[false,false,0]],"passed":true},{"actual":[[false,true,0],[false,false,0],[false,true,0],[false,false,0],[false,false,0],[false,true,0],[false,true,25],[true,false,30]],"check":"control: scenario 1","expected":[[false,true,0],[false,false,0],[false,true,0],[false,false,0],[false,false,0],[false,true,0],[false,true,25],[true,false,30]],"passed":true},{"actual":[[false,false,0],[false,true,0],[false,true,0],[false,true,0],[false,true,25],[true,false,30],[true,false,30]],"check":"control: scenario 2","expected":[[false,false,0],[false,true,0],[false,true,0],[false,true,0],[false,true,25],[true,false,30],[true,false,30]],"passed":true},{"actual":[[false,true,0],[false,true,20],[false,false,0],[false,true,0],[false,true,0],[false,false,0],[false,true,0]],"check":"control: scenario 3","expected":[[false,true,0],[false,true,20],[false,false,0],[false,true,0],[false,true,0],[false,false,0],[false,true,0]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: zero preset\", \"actual\": [[true, false, 0], [true, false, 0], [true, false, 0], [true, false, 0]], \"expected\": [[false, false, 0], [true, false, 0], [false, false, 0], [true, false, 0]], \"passed\": false}, {\"check\": \"regression: scenario 4\", \"actual\": [[true, false, 0], [true, false, 0], [true, false, 0], [true, false, 0], [true, false, 0], [true, false, 0], [true, false, 0], [true, false, 0], [true, false, 0]], \"expected\": [[true, false, 0], [false, false, 0], [true, false, 0], [true, false, 0], [true, false, 0], [true, false, 0], [true, false, 0], [true, false, 0], [true, false, 0]], \"passed\": false}, {\"check\": \"control: preset reached exactly\", \"actual\": [[false, true, 0], [false, true, 50], [true, false, 100], [true, false, 100]], \"expected\": [[false, true, 0], [false, true, 50], [true, false, 100], [true, false, 100]], \"passed\": true}, {\"check\": \"control: interrupted timing restarts\", \"actual\": [[false, true, 0], [false, true, 40], [false, false, 0], [false, true, 0], [false, true, 40], [true, false, 60]], \"expected\": [[false, true, 0], [false, true, 40], [false, false, 0], [false, true, 0], [false, true, 40], [true, false, 60]], \"passed\": true}, {\"check\": \"control: long hold after done\", \"actual\": [[false, true, 0], [false, true, 30], [true, false, 50], [true, false, 50], [false, false, 0]], \"expected\": [[false, true, 0], [false, true, 30], [true, false, 50], [true, false, 50], [false, false, 0]], \"passed\": true}, {\"check\": \"control: scenario 1\", \"actual\": [[false, true, 0], [false, false, 0], [false, true, 0], [false, false, 0], [false, false, 0], [false, true, 0], [false, true, 25], [true, false, 30]], \"expected\": [[false, true, 0], [false, false, 0], [false, true, 0], [false, false, 0], [false, false, 0], [false, true, 0], [false, true, 25], [true, false, 30]], \"passed\": true}, {\"check\": \"control: scenario 2\", \"actual\": [[false, false, 0], [false, true, 0], [false, true, 0], [false, true, 0], [false, true, 25], [true, false, 30], [true, false, 30]], \"expected\": [[false, false, 0], [false, true, 0], [false, true, 0], [false, true, 0], [false, true, 25], [true, false, 30], [true, false, 30]], \"passed\": true}, {\"check\": \"control: scenario 3\", \"actual\": [[false, true, 0], [false, true, 20], [false, false, 0], [false, true, 0], [false, true, 0], [false, false, 0], [false, true, 0]], \"expected\": [[false, true, 0], [false, true, 20], [false, false, 0], [false, true, 0], [false, true, 0], [false, false, 0], [false, true, 0]], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":45.939,"exit_code":0,"observations":[{"actual":[[false,false,0],[true,false,0],[false,false,0],[true,false,0]],"check":"regression: zero preset","expected":[[false,false,0],[true,false,0],[false,false,0],[true,false,0]],"passed":true},{"actual":[[true,false,0],[false,false,0],[true,false,0],[true,false,0],[true,false,0],[true,false,0],[true,false,0],[true,false,0],[true,false,0]],"check":"regression: scenario 4","expected":[[true,false,0],[false,false,0],[true,false,0],[true,false,0],[true,false,0],[true,false,0],[true,false,0],[true,false,0],[true,false,0]],"passed":true},{"actual":[[false,true,0],[false,true,50],[true,false,100],[true,false,100]],"check":"control: preset reached exactly","expected":[[false,true,0],[false,true,50],[true,false,100],[true,false,100]],"passed":true},{"actual":[[false,true,0],[false,true,40],[false,false,0],[false,true,0],[false,true,40],[true,false,60]],"check":"control: interrupted timing restarts","expected":[[false,true,0],[false,true,40],[false,false,0],[false,true,0],[false,true,40],[true,false,60]],"passed":true},{"actual":[[false,true,0],[false,true,30],[true,false,50],[true,false,50],[false,false,0]],"check":"control: long hold after done","expected":[[false,true,0],[false,true,30],[true,false,50],[true,false,50],[false,false,0]],"passed":true},{"actual":[[false,true,0],[false,false,0],[false,true,0],[false,false,0],[false,false,0],[false,true,0],[false,true,25],[true,false,30]],"check":"control: scenario 1","expected":[[false,true,0],[false,false,0],[false,true,0],[false,false,0],[false,false,0],[false,true,0],[false,true,25],[true,false,30]],"passed":true},{"actual":[[false,false,0],[false,true,0],[false,true,0],[false,true,0],[false,true,25],[true,false,30],[true,false,30]],"check":"control: scenario 2","expected":[[false,false,0],[false,true,0],[false,true,0],[false,true,0],[false,true,25],[true,false,30],[true,false,30]],"passed":true},{"actual":[[false,true,0],[false,true,20],[false,false,0],[false,true,0],[false,true,0],[false,false,0],[false,true,0]],"check":"control: scenario 3","expected":[[false,true,0],[false,true,20],[false,false,0],[false,true,0],[false,true,0],[false,false,0],[false,true,0]],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: zero preset\", \"actual\": [[false, false, 0], [true, false, 0], [false, false, 0], [true, false, 0]], \"expected\": [[false, false, 0], [true, false, 0], [false, false, 0], [true, false, 0]], \"passed\": true}, {\"check\": \"regression: scenario 4\", \"actual\": [[true, false, 0], [false, false, 0], [true, false, 0], [true, false, 0], [true, false, 0], [true, false, 0], [true, false, 0], [true, false, 0], [true, false, 0]], \"expected\": [[true, false, 0], [false, false, 0], [true, false, 0], [true, false, 0], [true, false, 0], [true, false, 0], [true, false, 0], [true, false, 0], [true, false, 0]], \"passed\": true}, {\"check\": \"control: preset reached exactly\", \"actual\": [[false, true, 0], [false, true, 50], [true, false, 100], [true, false, 100]], \"expected\": [[false, true, 0], [false, true, 50], [true, false, 100], [true, false, 100]], \"passed\": true}, {\"check\": \"control: interrupted timing restarts\", \"actual\": [[false, true, 0], [false, true, 40], [false, false, 0], [false, true, 0], [false, true, 40], [true, false, 60]], \"expected\": [[false, true, 0], [false, true, 40], [false, false, 0], [false, true, 0], [false, true, 40], [true, false, 60]], \"passed\": true}, {\"check\": \"control: long hold after done\", \"actual\": [[false, true, 0], [false, true, 30], [true, false, 50], [true, false, 50], [false, false, 0]], \"expected\": [[false, true, 0], [false, true, 30], [true, false, 50], [true, false, 50], [false, false, 0]], \"passed\": true}, {\"check\": \"control: scenario 1\", \"actual\": [[false, true, 0], [false, false, 0], [false, true, 0], [false, false, 0], [false, false, 0], [false, true, 0], [false, true, 25], [true, false, 30]], \"expected\": [[false, true, 0], [false, false, 0], [false, true, 0], [false, false, 0], [false, false, 0], [false, true, 0], [false, true, 25], [true, false, 30]], \"passed\": true}, {\"check\": \"control: scenario 2\", \"actual\": [[false, false, 0], [false, true, 0], [false, true, 0], [false, true, 0], [false, true, 25], [true, false, 30], [true, false, 30]], \"expected\": [[false, false, 0], [false, true, 0], [false, true, 0], [false, true, 0], [false, true, 25], [true, false, 30], [true, false, 30]], \"passed\": true}, {\"check\": \"control: scenario 3\", \"actual\": [[false, true, 0], [false, true, 20], [false, false, 0], [false, true, 0], [false, true, 0], [false, false, 0], [false, true, 0]], \"expected\": [[false, true, 0], [false, true, 20], [false, false, 0], [false, true, 0], [false, true, 0], [false, false, 0], [false, true, 0]], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}