FA-92091 / PLC ladder logic scan cycles / Open access
Sequencer write clobbers destination bits outside the mask · case 01
Outputs that other rungs control on the same word are cleared on every sequencer step.
ROOT CAUSE
The destination is overwritten with the masked word.
VERIFIED REPAIR
Preserve unmasked destination bits and replace only masked bits.
Unsuccessful approach: ORing the masked word in never clears masked bits from the previous step.
Case contract
Sequencer output (SQO). words is the sequencer file whose element 0 is the home step; position starts at 0. On each rising edge of enable the position advances; past the last element it wraps to 1 (not 0). Each advance writes dest = (dest AND NOT mask) OR (word AND mask) in 16 bits. A reset input returns position to 0 without writing dest and has priority over a coincident advance; the enable edge memory is always updated. steps is a list of [enable, reset]; return [position, dest] 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(words, mask, start_dest, steps):
pos = 0
dest = start_dest
prev = False
length = len(words) - 1
out = []
for en, res in steps:
en = bool(en)
if res:
pos = 0
elif en and not prev:
pos += 1
if pos > length:
pos = 1
dest = words[pos] & mask
prev = en
out.append([pos, dest])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: wrap past last step',
[[0, 17, 34],
255,
43776,
[[True, False], [False, False], [True, False], [False, False], [True, False], [True, False]]],
[[1, 43793], [1, 43793], [2, 43810], [2, 43810], [1, 43793], [1, 43793]]],
['regression: scenario 1',
[[26918, 50611, 8879, 59828],
65535,
52597,
[[False, False],
[False, False],
[False, False],
[True, True],
[False, False],
[False, False],
[False, False],
[True, False],
[True, False],
[False, False]]],
[[0, 52597],
[0, 52597],
[0, 52597],
[0, 52597],
[0, 52597],
[0, 52597],
[0, 52597],
[1, 50611],
[1, 50611],
[1, 50611]]],
['control: two element file',
[[5, 9], 65535, 0, [[True, False], [False, False], [True, False], [False, False], [True, False]]],
[[1, 9], [1, 9], [1, 9], [1, 9], [1, 9]]],
['regression: reset while enabled',
[[0, 3, 12], 15, 65520, [[True, False], [True, True], [False, False], [True, False]]],
[[1, 65523], [0, 65523], [0, 65523], [1, 65523]]],
['regression: reset with advance',
[[0, 256, 512], 65280, 170, [[False, False], [True, True], [False, False], [True, False]]],
[[0, 170], [0, 170], [0, 170], [1, 426]]],
['regression: scenario 2',
[[42968, 29173, 43546],
255,
5794,
[[True, False],
[False, False],
[False, False],
[False, False],
[True, False],
[False, False],
[False, False],
[False, False],
[True, True],
[False, False]]],
[[1, 5877],
[1, 5877],
[1, 5877],
[1, 5877],
[2, 5658],
[2, 5658],
[2, 5658],
[2, 5658],
[0, 5658],
[0, 5658]]],
['regression: scenario 3',
[[16785, 47110, 21847, 45361],
61440,
41889,
[[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[False, False],
[False, False]]],
[[1, 45985], [1, 45985], [1, 45985], [1, 45985], [1, 45985], [1, 45985], [1, 45985]]],
['regression: scenario 4',
[[26660, 61415, 54040],
65535,
45106,
[[True, False], [True, False], [True, False], [False, False], [False, False], [True, False]]],
[[1, 61415], [1, 61415], [1, 61415], [1, 61415], [1, 61415], [2, 54040]]]],
[['regression: reset while enabled',
[[0, 3, 12], 15, 65520, [[True, False], [True, True], [False, False], [True, False]]],
[[1, 65523], [0, 65523], [0, 65523], [1, 65523]]],
['regression: scenario 1',
[[8488, 43469, 38296, 4034],
255,
44563,
[[False, False],
[True, False],
[True, False],
[True, False],
[False, False],
[True, False],
[False, False],
[True, False],
[False, False],
[True, False],
[False, False],
[True, False]]],
[[0, 44563],
[1, 44749],
[1, 44749],
[1, 44749],
[1, 44749],
[2, 44696],
[2, 44696],
[3, 44738],
[3, 44738],
[1, 44749],
[1, 44749],
[2, 44696]]],
['regression: wrap past last step',
[[0, 17, 34],
255,
43776,
[[True, False], [False, False], [True, False], [False, False], [True, False], [True, False]]],
[[1, 43793], [1, 43793], [2, 43810], [2, 43810], [1, 43793], [1, 43793]]],
['control: two element file',
[[5, 9], 65535, 0, [[True, False], [False, False], [True, False], [False, False], [True, False]]],
[[1, 9], [1, 9], [1, 9], [1, 9], [1, 9]]],
['regression: reset with advance',
[[0, 256, 512], 65280, 170, [[False, False], [True, True], [False, False], [True, False]]],
[[0, 170], [0, 170], [0, 170], [1, 426]]],
['regression: scenario 2',
[[43079, 20640, 23622, 26553],
255,
15109,
[[False, False],
[False, False],
[True, False],
[True, False],
[False, False],
[False, False],
[True, False],
[True, False],
[False, False],
[False, False],
[True, False],
[False, True]]],
[[0, 15109],
[0, 15109],
[1, 15264],
[1, 15264],
[1, 15264],
[1, 15264],
[2, 15174],
[2, 15174],
[2, 15174],
[2, 15174],
[3, 15289],
[0, 15289]]],
['regression: scenario 3',
[[16618, 36272, 41924, 55813],
3855,
48911,
[[True, False],
[True, False],
[True, False],
[False, False],
[False, False],
[True, False],
[False, False]]],
[[1, 48384], [1, 48384], [1, 48384], [1, 48384], [1, 48384], [2, 45828], [2, 45828]]],
['regression: scenario 4',
[[45574, 2941],
255,
15355,
[[False, False],
[False, False],
[True, False],
[False, False],
[False, False],
[False, False],
[True, False],
[True, False],
[True, False],
[True, False],
[False, False],
[True, False],
[True, False]]],
[[0, 15355],
[0, 15355],
[1, 15229],
[1, 15229],
[1, 15229],
[1, 15229],
[1, 15229],
[1, 15229],
[1, 15229],
[1, 15229],
[1, 15229],
[1, 15229],
[1, 15229]]]],
[['regression: reset with advance',
[[0, 256, 512], 65280, 170, [[False, False], [True, True], [False, False], [True, False]]],
[[0, 170], [0, 170], [0, 170], [1, 426]]],
['regression: scenario 2',
[[36741, 30504],
65535,
26589,
[[True, False],
[False, False],
[False, False],
[True, False],
[True, False],
[False, False],
[False, False],
[False, False],
[True, True],
[True, False],
[False, False]]],
[[1, 30504],
[1, 30504],
[1, 30504],
[1, 30504],
[1, 30504],
[1, 30504],
[1, 30504],
[1, 30504],
[0, 30504],
[0, 30504],
[0, 30504]]],
['regression: wrap past last step',
[[0, 17, 34],
255,
43776,
[[True, False], [False, False], [True, False], [False, False], [True, False], [True, False]]],
[[1, 43793], [1, 43793], [2, 43810], [2, 43810], [1, 43793], [1, 43793]]],
['control: two element file',
[[5, 9], 65535, 0, [[True, False], [False, False], [True, False], [False, False], [True, False]]],
[[1, 9], [1, 9], [1, 9], [1, 9], [1, 9]]],
['regression: reset while enabled',
[[0, 3, 12], 15, 65520, [[True, False], [True, True], [False, False], [True, False]]],
[[1, 65523], [0, 65523], [0, 65523], [1, 65523]]],
['regression: scenario 1',
[[38610, 2229],
65535,
14704,
[[False, False],
[False, False],
[False, False],
[False, False],
[False, False],
[True, False],
[True, False],
[False, True],
[False, False]]],
[[0, 14704], [0, 14704], [0, 14704], [0, 14704], [0, 14704], [1, 2229], [1, 2229], [0, 2229], [0, 2229]]],
['regression: scenario 3',
[[45414, 65173, 31151, 4829],
3855,
46402,
[[False, True],
[False, False],
[True, True],
[False, False],
[False, False],
[False, False],
[True, False],
[True, False],
[True, False]]],
[[0, 46402],
[0, 46402],
[0, 46402],
[0, 46402],
[0, 46402],
[0, 46402],
[1, 48709],
[1, 48709],
[1, 48709]]],
['regression: scenario 4',
[[29784, 63854],
255,
25258,
[[False, False],
[True, False],
[True, False],
[False, False],
[True, True],
[False, False],
[False, False],
[True, False],
[False, False],
[False, True],
[False, False],
[False, False],
[True, False],
[True, True]]],
[[0, 25258],
[1, 25198],
[1, 25198],
[1, 25198],
[0, 25198],
[0, 25198],
[0, 25198],
[1, 25198],
[1, 25198],
[0, 25198],
[0, 25198],
[0, 25198],
[1, 25198],
[0, 25198]]]],
[['regression: scenario 1',
[[61786, 58708],
255,
45362,
[[False, False],
[False, False],
[False, False],
[True, False],
[False, False],
[False, False],
[True, False]]],
[[0, 45362], [0, 45362], [0, 45362], [1, 45396], [1, 45396], [1, 45396], [1, 45396]]],
['regression: scenario 5',
[[47154, 32327, 23912, 32399],
3855,
21368,
[[False, True],
[False, False],
[False, False],
[True, False],
[True, False],
[False, False],
[True, False],
[True, False],
[False, False],
[True, False],
[True, True]]],
[[0, 21368],
[0, 21368],
[0, 21368],
[1, 24183],
[1, 24183],
[1, 24183],
[2, 23928],
[2, 23928],
[2, 23928],
[3, 24191],
[0, 24191]]],
['regression: wrap past last step',
[[0, 17, 34],
255,
43776,
[[True, False], [False, False], [True, False], [False, False], [True, False], [True, False]]],
[[1, 43793], [1, 43793], [2, 43810], [2, 43810], [1, 43793], [1, 43793]]],
['control: two element file',
[[5, 9], 65535, 0, [[True, False], [False, False], [True, False], [False, False], [True, False]]],
[[1, 9], [1, 9], [1, 9], [1, 9], [1, 9]]],
['regression: reset while enabled',
[[0, 3, 12], 15, 65520, [[True, False], [True, True], [False, False], [True, False]]],
[[1, 65523], [0, 65523], [0, 65523], [1, 65523]]],
['regression: reset with advance',
[[0, 256, 512], 65280, 170, [[False, False], [True, True], [False, False], [True, False]]],
[[0, 170], [0, 170], [0, 170], [1, 426]]],
['regression: scenario 2',
[[57902, 51779],
61440,
26811,
[[True, False],
[True, False],
[True, False],
[False, False],
[True, False],
[False, False],
[False, False],
[True, False]]],
[[1, 51387], [1, 51387], [1, 51387], [1, 51387], [1, 51387], [1, 51387], [1, 51387], [1, 51387]]],
['regression: scenario 3',
[[35305, 48952, 41314, 29239, 28773],
65535,
11028,
[[False, False],
[False, False],
[True, False],
[True, False],
[True, False],
[False, False],
[True, False],
[True, False],
[True, False],
[True, False],
[False, False],
[True, True]]],
[[0, 11028],
[0, 11028],
[1, 48952],
[1, 48952],
[1, 48952],
[1, 48952],
[2, 41314],
[2, 41314],
[2, 41314],
[2, 41314],
[2, 41314],
[0, 41314]]]],
[['regression: scenario 2',
[[43067, 57880, 6921, 33106, 51712],
255,
13830,
[[True, False],
[False, False],
[False, False],
[True, False],
[True, False],
[False, False],
[True, False],
[False, False],
[True, True],
[True, True],
[False, False],
[True, False],
[False, False]]],
[[1, 13848],
[1, 13848],
[1, 13848],
[2, 13833],
[2, 13833],
[2, 13833],
[3, 13906],
[3, 13906],
[0, 13906],
[0, 13906],
[0, 13906],
[1, 13848],
[1, 13848]]],
['regression: scenario 6',
[[49875, 17863, 34135],
3855,
57202,
[[False, False], [True, False], [True, False], [True, True], [False, False], [False, False]]],
[[0, 57202], [1, 54647], [1, 54647], [0, 54647], [0, 54647], [0, 54647]]],
['regression: wrap past last step',
[[0, 17, 34],
255,
43776,
[[True, False], [False, False], [True, False], [False, False], [True, False], [True, False]]],
[[1, 43793], [1, 43793], [2, 43810], [2, 43810], [1, 43793], [1, 43793]]],
['control: two element file',
[[5, 9], 65535, 0, [[True, False], [False, False], [True, False], [False, False], [True, False]]],
[[1, 9], [1, 9], [1, 9], [1, 9], [1, 9]]],
['regression: reset while enabled',
[[0, 3, 12], 15, 65520, [[True, False], [True, True], [False, False], [True, False]]],
[[1, 65523], [0, 65523], [0, 65523], [1, 65523]]],
['regression: reset with advance',
[[0, 256, 512], 65280, 170, [[False, False], [True, True], [False, False], [True, False]]],
[[0, 170], [0, 170], [0, 170], [1, 426]]],
['regression: scenario 1',
[[39974, 26951],
3855,
4546,
[[False, False],
[False, False],
[True, False],
[False, False],
[True, False],
[True, False],
[False, False],
[False, False],
[True, False],
[True, True]]],
[[0, 4546],
[0, 4546],
[1, 6599],
[1, 6599],
[1, 6599],
[1, 6599],
[1, 6599],
[1, 6599],
[1, 6599],
[0, 6599]]],
['regression: scenario 3',
[[62662, 46394, 25376, 46313],
3855,
7057,
[[False, False],
[False, False],
[False, False],
[False, False],
[False, False],
[True, False],
[False, False],
[True, False],
[True, False],
[True, False],
[False, False],
[True, False],
[False, False]]],
[[0, 7057],
[0, 7057],
[0, 7057],
[0, 7057],
[0, 7057],
[1, 5530],
[1, 5530],
[2, 5008],
[2, 5008],
[2, 5008],
[2, 5008],
[3, 5273],
[3, 5273]]]]]
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: wrap past last step | [[1, 17], [1, 17], [2, 34], [2, 34], [1, 17], [1, 17]] | [[1, 43793], [1, 43793], [2, 43810], [2, 43810], [1, 43793], [1, 43793]] | Failed |
| regression: scenario 1 | [[0, 52597], [0, 52597], [0, 52597], [0, 52597], [0, 52597], [0, 52597], [0, 52597], [1, 50611], [1, 50611], [1, 50611]] | [[0, 52597], [0, 52597], [0, 52597], [0, 52597], [0, 52597], [0, 52597], [0, 52597], [1, 50611], [1, 50611], [1, 50611]] | Passed |
| control: two element file | [[1, 9], [1, 9], [1, 9], [1, 9], [1, 9]] | [[1, 9], [1, 9], [1, 9], [1, 9], [1, 9]] | Passed |
| regression: reset while enabled | [[1, 3], [0, 3], [0, 3], [1, 3]] | [[1, 65523], [0, 65523], [0, 65523], [1, 65523]] | Failed |
| regression: reset with advance | [[0, 170], [0, 170], [0, 170], [1, 256]] | [[0, 170], [0, 170], [0, 170], [1, 426]] | Failed |
| regression: scenario 2 | [[1, 245], [1, 245], [1, 245], [1, 245], [2, 26], [2, 26], [2, 26], [2, 26], [0, 26], [0, 26]] | [[1, 5877], [1, 5877], [1, 5877], [1, 5877], [2, 5658], [2, 5658], [2, 5658], [2, 5658], [0, 5658], [0, 5658]] | Failed |
| regression: scenario 3 | [[1, 45056], [1, 45056], [1, 45056], [1, 45056], [1, 45056], [1, 45056], [1, 45056]] | [[1, 45985], [1, 45985], [1, 45985], [1, 45985], [1, 45985], [1, 45985], [1, 45985]] | Failed |
| regression: scenario 4 | [[1, 61415], [1, 61415], [1, 61415], [1, 61415], [1, 61415], [2, 54040]] | [[1, 61415], [1, 61415], [1, 61415], [1, 61415], [1, 61415], [2, 54040]] | Passed |
SHA-256 / 868c6135d8fb3a2ee0222ff155a3d30dd835849b380f2bd469c0fcdb00869d1b
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(words, mask, start_dest, steps):
pos = 0
dest = start_dest
prev = False
length = len(words) - 1
out = []
for en, res in steps:
en = bool(en)
if res:
pos = 0
elif en and not prev:
pos += 1
if pos > length:
pos = 1
dest = dest | (words[pos] & mask)
prev = en
out.append([pos, dest])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: wrap past last step',
[[0, 17, 34],
255,
43776,
[[True, False], [False, False], [True, False], [False, False], [True, False], [True, False]]],
[[1, 43793], [1, 43793], [2, 43810], [2, 43810], [1, 43793], [1, 43793]]],
['regression: scenario 1',
[[26918, 50611, 8879, 59828],
65535,
52597,
[[False, False],
[False, False],
[False, False],
[True, True],
[False, False],
[False, False],
[False, False],
[True, False],
[True, False],
[False, False]]],
[[0, 52597],
[0, 52597],
[0, 52597],
[0, 52597],
[0, 52597],
[0, 52597],
[0, 52597],
[1, 50611],
[1, 50611],
[1, 50611]]],
['control: two element file',
[[5, 9], 65535, 0, [[True, False], [False, False], [True, False], [False, False], [True, False]]],
[[1, 9], [1, 9], [1, 9], [1, 9], [1, 9]]],
['regression: reset while enabled',
[[0, 3, 12], 15, 65520, [[True, False], [True, True], [False, False], [True, False]]],
[[1, 65523], [0, 65523], [0, 65523], [1, 65523]]],
['regression: reset with advance',
[[0, 256, 512], 65280, 170, [[False, False], [True, True], [False, False], [True, False]]],
[[0, 170], [0, 170], [0, 170], [1, 426]]],
['regression: scenario 2',
[[42968, 29173, 43546],
255,
5794,
[[True, False],
[False, False],
[False, False],
[False, False],
[True, False],
[False, False],
[False, False],
[False, False],
[True, True],
[False, False]]],
[[1, 5877],
[1, 5877],
[1, 5877],
[1, 5877],
[2, 5658],
[2, 5658],
[2, 5658],
[2, 5658],
[0, 5658],
[0, 5658]]],
['regression: scenario 3',
[[16785, 47110, 21847, 45361],
61440,
41889,
[[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[False, False],
[False, False]]],
[[1, 45985], [1, 45985], [1, 45985], [1, 45985], [1, 45985], [1, 45985], [1, 45985]]],
['regression: scenario 4',
[[26660, 61415, 54040],
65535,
45106,
[[True, False], [True, False], [True, False], [False, False], [False, False], [True, False]]],
[[1, 61415], [1, 61415], [1, 61415], [1, 61415], [1, 61415], [2, 54040]]]],
[['regression: reset while enabled',
[[0, 3, 12], 15, 65520, [[True, False], [True, True], [False, False], [True, False]]],
[[1, 65523], [0, 65523], [0, 65523], [1, 65523]]],
['regression: scenario 1',
[[8488, 43469, 38296, 4034],
255,
44563,
[[False, False],
[True, False],
[True, False],
[True, False],
[False, False],
[True, False],
[False, False],
[True, False],
[False, False],
[True, False],
[False, False],
[True, False]]],
[[0, 44563],
[1, 44749],
[1, 44749],
[1, 44749],
[1, 44749],
[2, 44696],
[2, 44696],
[3, 44738],
[3, 44738],
[1, 44749],
[1, 44749],
[2, 44696]]],
['regression: wrap past last step',
[[0, 17, 34],
255,
43776,
[[True, False], [False, False], [True, False], [False, False], [True, False], [True, False]]],
[[1, 43793], [1, 43793], [2, 43810], [2, 43810], [1, 43793], [1, 43793]]],
['control: two element file',
[[5, 9], 65535, 0, [[True, False], [False, False], [True, False], [False, False], [True, False]]],
[[1, 9], [1, 9], [1, 9], [1, 9], [1, 9]]],
['regression: reset with advance',
[[0, 256, 512], 65280, 170, [[False, False], [True, True], [False, False], [True, False]]],
[[0, 170], [0, 170], [0, 170], [1, 426]]],
['regression: scenario 2',
[[43079, 20640, 23622, 26553],
255,
15109,
[[False, False],
[False, False],
[True, False],
[True, False],
[False, False],
[False, False],
[True, False],
[True, False],
[False, False],
[False, False],
[True, False],
[False, True]]],
[[0, 15109],
[0, 15109],
[1, 15264],
[1, 15264],
[1, 15264],
[1, 15264],
[2, 15174],
[2, 15174],
[2, 15174],
[2, 15174],
[3, 15289],
[0, 15289]]],
['regression: scenario 3',
[[16618, 36272, 41924, 55813],
3855,
48911,
[[True, False],
[True, False],
[True, False],
[False, False],
[False, False],
[True, False],
[False, False]]],
[[1, 48384], [1, 48384], [1, 48384], [1, 48384], [1, 48384], [2, 45828], [2, 45828]]],
['regression: scenario 4',
[[45574, 2941],
255,
15355,
[[False, False],
[False, False],
[True, False],
[False, False],
[False, False],
[False, False],
[True, False],
[True, False],
[True, False],
[True, False],
[False, False],
[True, False],
[True, False]]],
[[0, 15355],
[0, 15355],
[1, 15229],
[1, 15229],
[1, 15229],
[1, 15229],
[1, 15229],
[1, 15229],
[1, 15229],
[1, 15229],
[1, 15229],
[1, 15229],
[1, 15229]]]],
[['regression: reset with advance',
[[0, 256, 512], 65280, 170, [[False, False], [True, True], [False, False], [True, False]]],
[[0, 170], [0, 170], [0, 170], [1, 426]]],
['regression: scenario 2',
[[36741, 30504],
65535,
26589,
[[True, False],
[False, False],
[False, False],
[True, False],
[True, False],
[False, False],
[False, False],
[False, False],
[True, True],
[True, False],
[False, False]]],
[[1, 30504],
[1, 30504],
[1, 30504],
[1, 30504],
[1, 30504],
[1, 30504],
[1, 30504],
[1, 30504],
[0, 30504],
[0, 30504],
[0, 30504]]],
['regression: wrap past last step',
[[0, 17, 34],
255,
43776,
[[True, False], [False, False], [True, False], [False, False], [True, False], [True, False]]],
[[1, 43793], [1, 43793], [2, 43810], [2, 43810], [1, 43793], [1, 43793]]],
['control: two element file',
[[5, 9], 65535, 0, [[True, False], [False, False], [True, False], [False, False], [True, False]]],
[[1, 9], [1, 9], [1, 9], [1, 9], [1, 9]]],
['regression: reset while enabled',
[[0, 3, 12], 15, 65520, [[True, False], [True, True], [False, False], [True, False]]],
[[1, 65523], [0, 65523], [0, 65523], [1, 65523]]],
['regression: scenario 1',
[[38610, 2229],
65535,
14704,
[[False, False],
[False, False],
[False, False],
[False, False],
[False, False],
[True, False],
[True, False],
[False, True],
[False, False]]],
[[0, 14704], [0, 14704], [0, 14704], [0, 14704], [0, 14704], [1, 2229], [1, 2229], [0, 2229], [0, 2229]]],
['regression: scenario 3',
[[45414, 65173, 31151, 4829],
3855,
46402,
[[False, True],
[False, False],
[True, True],
[False, False],
[False, False],
[False, False],
[True, False],
[True, False],
[True, False]]],
[[0, 46402],
[0, 46402],
[0, 46402],
[0, 46402],
[0, 46402],
[0, 46402],
[1, 48709],
[1, 48709],
[1, 48709]]],
['regression: scenario 4',
[[29784, 63854],
255,
25258,
[[False, False],
[True, False],
[True, False],
[False, False],
[True, True],
[False, False],
[False, False],
[True, False],
[False, False],
[False, True],
[False, False],
[False, False],
[True, False],
[True, True]]],
[[0, 25258],
[1, 25198],
[1, 25198],
[1, 25198],
[0, 25198],
[0, 25198],
[0, 25198],
[1, 25198],
[1, 25198],
[0, 25198],
[0, 25198],
[0, 25198],
[1, 25198],
[0, 25198]]]],
[['regression: scenario 1',
[[61786, 58708],
255,
45362,
[[False, False],
[False, False],
[False, False],
[True, False],
[False, False],
[False, False],
[True, False]]],
[[0, 45362], [0, 45362], [0, 45362], [1, 45396], [1, 45396], [1, 45396], [1, 45396]]],
['regression: scenario 5',
[[47154, 32327, 23912, 32399],
3855,
21368,
[[False, True],
[False, False],
[False, False],
[True, False],
[True, False],
[False, False],
[True, False],
[True, False],
[False, False],
[True, False],
[True, True]]],
[[0, 21368],
[0, 21368],
[0, 21368],
[1, 24183],
[1, 24183],
[1, 24183],
[2, 23928],
[2, 23928],
[2, 23928],
[3, 24191],
[0, 24191]]],
['regression: wrap past last step',
[[0, 17, 34],
255,
43776,
[[True, False], [False, False], [True, False], [False, False], [True, False], [True, False]]],
[[1, 43793], [1, 43793], [2, 43810], [2, 43810], [1, 43793], [1, 43793]]],
['control: two element file',
[[5, 9], 65535, 0, [[True, False], [False, False], [True, False], [False, False], [True, False]]],
[[1, 9], [1, 9], [1, 9], [1, 9], [1, 9]]],
['regression: reset while enabled',
[[0, 3, 12], 15, 65520, [[True, False], [True, True], [False, False], [True, False]]],
[[1, 65523], [0, 65523], [0, 65523], [1, 65523]]],
['regression: reset with advance',
[[0, 256, 512], 65280, 170, [[False, False], [True, True], [False, False], [True, False]]],
[[0, 170], [0, 170], [0, 170], [1, 426]]],
['regression: scenario 2',
[[57902, 51779],
61440,
26811,
[[True, False],
[True, False],
[True, False],
[False, False],
[True, False],
[False, False],
[False, False],
[True, False]]],
[[1, 51387], [1, 51387], [1, 51387], [1, 51387], [1, 51387], [1, 51387], [1, 51387], [1, 51387]]],
['regression: scenario 3',
[[35305, 48952, 41314, 29239, 28773],
65535,
11028,
[[False, False],
[False, False],
[True, False],
[True, False],
[True, False],
[False, False],
[True, False],
[True, False],
[True, False],
[True, False],
[False, False],
[True, True]]],
[[0, 11028],
[0, 11028],
[1, 48952],
[1, 48952],
[1, 48952],
[1, 48952],
[2, 41314],
[2, 41314],
[2, 41314],
[2, 41314],
[2, 41314],
[0, 41314]]]],
[['regression: scenario 2',
[[43067, 57880, 6921, 33106, 51712],
255,
13830,
[[True, False],
[False, False],
[False, False],
[True, False],
[True, False],
[False, False],
[True, False],
[False, False],
[True, True],
[True, True],
[False, False],
[True, False],
[False, False]]],
[[1, 13848],
[1, 13848],
[1, 13848],
[2, 13833],
[2, 13833],
[2, 13833],
[3, 13906],
[3, 13906],
[0, 13906],
[0, 13906],
[0, 13906],
[1, 13848],
[1, 13848]]],
['regression: scenario 6',
[[49875, 17863, 34135],
3855,
57202,
[[False, False], [True, False], [True, False], [True, True], [False, False], [False, False]]],
[[0, 57202], [1, 54647], [1, 54647], [0, 54647], [0, 54647], [0, 54647]]],
['regression: wrap past last step',
[[0, 17, 34],
255,
43776,
[[True, False], [False, False], [True, False], [False, False], [True, False], [True, False]]],
[[1, 43793], [1, 43793], [2, 43810], [2, 43810], [1, 43793], [1, 43793]]],
['control: two element file',
[[5, 9], 65535, 0, [[True, False], [False, False], [True, False], [False, False], [True, False]]],
[[1, 9], [1, 9], [1, 9], [1, 9], [1, 9]]],
['regression: reset while enabled',
[[0, 3, 12], 15, 65520, [[True, False], [True, True], [False, False], [True, False]]],
[[1, 65523], [0, 65523], [0, 65523], [1, 65523]]],
['regression: reset with advance',
[[0, 256, 512], 65280, 170, [[False, False], [True, True], [False, False], [True, False]]],
[[0, 170], [0, 170], [0, 170], [1, 426]]],
['regression: scenario 1',
[[39974, 26951],
3855,
4546,
[[False, False],
[False, False],
[True, False],
[False, False],
[True, False],
[True, False],
[False, False],
[False, False],
[True, False],
[True, True]]],
[[0, 4546],
[0, 4546],
[1, 6599],
[1, 6599],
[1, 6599],
[1, 6599],
[1, 6599],
[1, 6599],
[1, 6599],
[0, 6599]]],
['regression: scenario 3',
[[62662, 46394, 25376, 46313],
3855,
7057,
[[False, False],
[False, False],
[False, False],
[False, False],
[False, False],
[True, False],
[False, False],
[True, False],
[True, False],
[True, False],
[False, False],
[True, False],
[False, False]]],
[[0, 7057],
[0, 7057],
[0, 7057],
[0, 7057],
[0, 7057],
[1, 5530],
[1, 5530],
[2, 5008],
[2, 5008],
[2, 5008],
[2, 5008],
[3, 5273],
[3, 5273]]]]]
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: wrap past last step | [[1, 43793], [1, 43793], [2, 43827], [2, 43827], [1, 43827], [1, 43827]] | [[1, 43793], [1, 43793], [2, 43810], [2, 43810], [1, 43793], [1, 43793]] | Failed |
| regression: scenario 1 | [[0, 52597], [0, 52597], [0, 52597], [0, 52597], [0, 52597], [0, 52597], [0, 52597], [1, 52727], [1, 52727], [1, 52727]] | [[0, 52597], [0, 52597], [0, 52597], [0, 52597], [0, 52597], [0, 52597], [0, 52597], [1, 50611], [1, 50611], [1, 50611]] | Failed |
| control: two element file | [[1, 9], [1, 9], [1, 9], [1, 9], [1, 9]] | [[1, 9], [1, 9], [1, 9], [1, 9], [1, 9]] | Passed |
| regression: reset while enabled | [[1, 65523], [0, 65523], [0, 65523], [1, 65523]] | [[1, 65523], [0, 65523], [0, 65523], [1, 65523]] | Passed |
| regression: reset with advance | [[0, 170], [0, 170], [0, 170], [1, 426]] | [[0, 170], [0, 170], [0, 170], [1, 426]] | Passed |
| regression: scenario 2 | [[1, 5879], [1, 5879], [1, 5879], [1, 5879], [2, 5887], [2, 5887], [2, 5887], [2, 5887], [0, 5887], [0, 5887]] | [[1, 5877], [1, 5877], [1, 5877], [1, 5877], [2, 5658], [2, 5658], [2, 5658], [2, 5658], [0, 5658], [0, 5658]] | Failed |
| regression: scenario 3 | [[1, 45985], [1, 45985], [1, 45985], [1, 45985], [1, 45985], [1, 45985], [1, 45985]] | [[1, 45985], [1, 45985], [1, 45985], [1, 45985], [1, 45985], [1, 45985], [1, 45985]] | Passed |
| regression: scenario 4 | [[1, 65527], [1, 65527], [1, 65527], [1, 65527], [1, 65527], [2, 65535]] | [[1, 61415], [1, 61415], [1, 61415], [1, 61415], [1, 61415], [2, 54040]] | Failed |
SHA-256 / a359800df538eb6914f8b8d8f1c8c45ca0976f3b275472273740261d74f6c944
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(words, mask, start_dest, steps):
pos = 0
dest = start_dest
prev = False
length = len(words) - 1
out = []
for en, res in steps:
en = bool(en)
if res:
pos = 0
elif en and not prev:
pos += 1
if pos > length:
pos = 1
dest = (dest & ~mask & 0xFFFF) | (words[pos] & mask)
prev = en
out.append([pos, dest])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: wrap past last step',
[[0, 17, 34],
255,
43776,
[[True, False], [False, False], [True, False], [False, False], [True, False], [True, False]]],
[[1, 43793], [1, 43793], [2, 43810], [2, 43810], [1, 43793], [1, 43793]]],
['regression: scenario 1',
[[26918, 50611, 8879, 59828],
65535,
52597,
[[False, False],
[False, False],
[False, False],
[True, True],
[False, False],
[False, False],
[False, False],
[True, False],
[True, False],
[False, False]]],
[[0, 52597],
[0, 52597],
[0, 52597],
[0, 52597],
[0, 52597],
[0, 52597],
[0, 52597],
[1, 50611],
[1, 50611],
[1, 50611]]],
['control: two element file',
[[5, 9], 65535, 0, [[True, False], [False, False], [True, False], [False, False], [True, False]]],
[[1, 9], [1, 9], [1, 9], [1, 9], [1, 9]]],
['regression: reset while enabled',
[[0, 3, 12], 15, 65520, [[True, False], [True, True], [False, False], [True, False]]],
[[1, 65523], [0, 65523], [0, 65523], [1, 65523]]],
['regression: reset with advance',
[[0, 256, 512], 65280, 170, [[False, False], [True, True], [False, False], [True, False]]],
[[0, 170], [0, 170], [0, 170], [1, 426]]],
['regression: scenario 2',
[[42968, 29173, 43546],
255,
5794,
[[True, False],
[False, False],
[False, False],
[False, False],
[True, False],
[False, False],
[False, False],
[False, False],
[True, True],
[False, False]]],
[[1, 5877],
[1, 5877],
[1, 5877],
[1, 5877],
[2, 5658],
[2, 5658],
[2, 5658],
[2, 5658],
[0, 5658],
[0, 5658]]],
['regression: scenario 3',
[[16785, 47110, 21847, 45361],
61440,
41889,
[[True, False],
[True, False],
[True, False],
[True, False],
[True, False],
[False, False],
[False, False]]],
[[1, 45985], [1, 45985], [1, 45985], [1, 45985], [1, 45985], [1, 45985], [1, 45985]]],
['regression: scenario 4',
[[26660, 61415, 54040],
65535,
45106,
[[True, False], [True, False], [True, False], [False, False], [False, False], [True, False]]],
[[1, 61415], [1, 61415], [1, 61415], [1, 61415], [1, 61415], [2, 54040]]]],
[['regression: reset while enabled',
[[0, 3, 12], 15, 65520, [[True, False], [True, True], [False, False], [True, False]]],
[[1, 65523], [0, 65523], [0, 65523], [1, 65523]]],
['regression: scenario 1',
[[8488, 43469, 38296, 4034],
255,
44563,
[[False, False],
[True, False],
[True, False],
[True, False],
[False, False],
[True, False],
[False, False],
[True, False],
[False, False],
[True, False],
[False, False],
[True, False]]],
[[0, 44563],
[1, 44749],
[1, 44749],
[1, 44749],
[1, 44749],
[2, 44696],
[2, 44696],
[3, 44738],
[3, 44738],
[1, 44749],
[1, 44749],
[2, 44696]]],
['regression: wrap past last step',
[[0, 17, 34],
255,
43776,
[[True, False], [False, False], [True, False], [False, False], [True, False], [True, False]]],
[[1, 43793], [1, 43793], [2, 43810], [2, 43810], [1, 43793], [1, 43793]]],
['control: two element file',
[[5, 9], 65535, 0, [[True, False], [False, False], [True, False], [False, False], [True, False]]],
[[1, 9], [1, 9], [1, 9], [1, 9], [1, 9]]],
['regression: reset with advance',
[[0, 256, 512], 65280, 170, [[False, False], [True, True], [False, False], [True, False]]],
[[0, 170], [0, 170], [0, 170], [1, 426]]],
['regression: scenario 2',
[[43079, 20640, 23622, 26553],
255,
15109,
[[False, False],
[False, False],
[True, False],
[True, False],
[False, False],
[False, False],
[True, False],
[True, False],
[False, False],
[False, False],
[True, False],
[False, True]]],
[[0, 15109],
[0, 15109],
[1, 15264],
[1, 15264],
[1, 15264],
[1, 15264],
[2, 15174],
[2, 15174],
[2, 15174],
[2, 15174],
[3, 15289],
[0, 15289]]],
['regression: scenario 3',
[[16618, 36272, 41924, 55813],
3855,
48911,
[[True, False],
[True, False],
[True, False],
[False, False],
[False, False],
[True, False],
[False, False]]],
[[1, 48384], [1, 48384], [1, 48384], [1, 48384], [1, 48384], [2, 45828], [2, 45828]]],
['regression: scenario 4',
[[45574, 2941],
255,
15355,
[[False, False],
[False, False],
[True, False],
[False, False],
[False, False],
[False, False],
[True, False],
[True, False],
[True, False],
[True, False],
[False, False],
[True, False],
[True, False]]],
[[0, 15355],
[0, 15355],
[1, 15229],
[1, 15229],
[1, 15229],
[1, 15229],
[1, 15229],
[1, 15229],
[1, 15229],
[1, 15229],
[1, 15229],
[1, 15229],
[1, 15229]]]],
[['regression: reset with advance',
[[0, 256, 512], 65280, 170, [[False, False], [True, True], [False, False], [True, False]]],
[[0, 170], [0, 170], [0, 170], [1, 426]]],
['regression: scenario 2',
[[36741, 30504],
65535,
26589,
[[True, False],
[False, False],
[False, False],
[True, False],
[True, False],
[False, False],
[False, False],
[False, False],
[True, True],
[True, False],
[False, False]]],
[[1, 30504],
[1, 30504],
[1, 30504],
[1, 30504],
[1, 30504],
[1, 30504],
[1, 30504],
[1, 30504],
[0, 30504],
[0, 30504],
[0, 30504]]],
['regression: wrap past last step',
[[0, 17, 34],
255,
43776,
[[True, False], [False, False], [True, False], [False, False], [True, False], [True, False]]],
[[1, 43793], [1, 43793], [2, 43810], [2, 43810], [1, 43793], [1, 43793]]],
['control: two element file',
[[5, 9], 65535, 0, [[True, False], [False, False], [True, False], [False, False], [True, False]]],
[[1, 9], [1, 9], [1, 9], [1, 9], [1, 9]]],
['regression: reset while enabled',
[[0, 3, 12], 15, 65520, [[True, False], [True, True], [False, False], [True, False]]],
[[1, 65523], [0, 65523], [0, 65523], [1, 65523]]],
['regression: scenario 1',
[[38610, 2229],
65535,
14704,
[[False, False],
[False, False],
[False, False],
[False, False],
[False, False],
[True, False],
[True, False],
[False, True],
[False, False]]],
[[0, 14704], [0, 14704], [0, 14704], [0, 14704], [0, 14704], [1, 2229], [1, 2229], [0, 2229], [0, 2229]]],
['regression: scenario 3',
[[45414, 65173, 31151, 4829],
3855,
46402,
[[False, True],
[False, False],
[True, True],
[False, False],
[False, False],
[False, False],
[True, False],
[True, False],
[True, False]]],
[[0, 46402],
[0, 46402],
[0, 46402],
[0, 46402],
[0, 46402],
[0, 46402],
[1, 48709],
[1, 48709],
[1, 48709]]],
['regression: scenario 4',
[[29784, 63854],
255,
25258,
[[False, False],
[True, False],
[True, False],
[False, False],
[True, True],
[False, False],
[False, False],
[True, False],
[False, False],
[False, True],
[False, False],
[False, False],
[True, False],
[True, True]]],
[[0, 25258],
[1, 25198],
[1, 25198],
[1, 25198],
[0, 25198],
[0, 25198],
[0, 25198],
[1, 25198],
[1, 25198],
[0, 25198],
[0, 25198],
[0, 25198],
[1, 25198],
[0, 25198]]]],
[['regression: scenario 1',
[[61786, 58708],
255,
45362,
[[False, False],
[False, False],
[False, False],
[True, False],
[False, False],
[False, False],
[True, False]]],
[[0, 45362], [0, 45362], [0, 45362], [1, 45396], [1, 45396], [1, 45396], [1, 45396]]],
['regression: scenario 5',
[[47154, 32327, 23912, 32399],
3855,
21368,
[[False, True],
[False, False],
[False, False],
[True, False],
[True, False],
[False, False],
[True, False],
[True, False],
[False, False],
[True, False],
[True, True]]],
[[0, 21368],
[0, 21368],
[0, 21368],
[1, 24183],
[1, 24183],
[1, 24183],
[2, 23928],
[2, 23928],
[2, 23928],
[3, 24191],
[0, 24191]]],
['regression: wrap past last step',
[[0, 17, 34],
255,
43776,
[[True, False], [False, False], [True, False], [False, False], [True, False], [True, False]]],
[[1, 43793], [1, 43793], [2, 43810], [2, 43810], [1, 43793], [1, 43793]]],
['control: two element file',
[[5, 9], 65535, 0, [[True, False], [False, False], [True, False], [False, False], [True, False]]],
[[1, 9], [1, 9], [1, 9], [1, 9], [1, 9]]],
['regression: reset while enabled',
[[0, 3, 12], 15, 65520, [[True, False], [True, True], [False, False], [True, False]]],
[[1, 65523], [0, 65523], [0, 65523], [1, 65523]]],
['regression: reset with advance',
[[0, 256, 512], 65280, 170, [[False, False], [True, True], [False, False], [True, False]]],
[[0, 170], [0, 170], [0, 170], [1, 426]]],
['regression: scenario 2',
[[57902, 51779],
61440,
26811,
[[True, False],
[True, False],
[True, False],
[False, False],
[True, False],
[False, False],
[False, False],
[True, False]]],
[[1, 51387], [1, 51387], [1, 51387], [1, 51387], [1, 51387], [1, 51387], [1, 51387], [1, 51387]]],
['regression: scenario 3',
[[35305, 48952, 41314, 29239, 28773],
65535,
11028,
[[False, False],
[False, False],
[True, False],
[True, False],
[True, False],
[False, False],
[True, False],
[True, False],
[True, False],
[True, False],
[False, False],
[True, True]]],
[[0, 11028],
[0, 11028],
[1, 48952],
[1, 48952],
[1, 48952],
[1, 48952],
[2, 41314],
[2, 41314],
[2, 41314],
[2, 41314],
[2, 41314],
[0, 41314]]]],
[['regression: scenario 2',
[[43067, 57880, 6921, 33106, 51712],
255,
13830,
[[True, False],
[False, False],
[False, False],
[True, False],
[True, False],
[False, False],
[True, False],
[False, False],
[True, True],
[True, True],
[False, False],
[True, False],
[False, False]]],
[[1, 13848],
[1, 13848],
[1, 13848],
[2, 13833],
[2, 13833],
[2, 13833],
[3, 13906],
[3, 13906],
[0, 13906],
[0, 13906],
[0, 13906],
[1, 13848],
[1, 13848]]],
['regression: scenario 6',
[[49875, 17863, 34135],
3855,
57202,
[[False, False], [True, False], [True, False], [True, True], [False, False], [False, False]]],
[[0, 57202], [1, 54647], [1, 54647], [0, 54647], [0, 54647], [0, 54647]]],
['regression: wrap past last step',
[[0, 17, 34],
255,
43776,
[[True, False], [False, False], [True, False], [False, False], [True, False], [True, False]]],
[[1, 43793], [1, 43793], [2, 43810], [2, 43810], [1, 43793], [1, 43793]]],
['control: two element file',
[[5, 9], 65535, 0, [[True, False], [False, False], [True, False], [False, False], [True, False]]],
[[1, 9], [1, 9], [1, 9], [1, 9], [1, 9]]],
['regression: reset while enabled',
[[0, 3, 12], 15, 65520, [[True, False], [True, True], [False, False], [True, False]]],
[[1, 65523], [0, 65523], [0, 65523], [1, 65523]]],
['regression: reset with advance',
[[0, 256, 512], 65280, 170, [[False, False], [True, True], [False, False], [True, False]]],
[[0, 170], [0, 170], [0, 170], [1, 426]]],
['regression: scenario 1',
[[39974, 26951],
3855,
4546,
[[False, False],
[False, False],
[True, False],
[False, False],
[True, False],
[True, False],
[False, False],
[False, False],
[True, False],
[True, True]]],
[[0, 4546],
[0, 4546],
[1, 6599],
[1, 6599],
[1, 6599],
[1, 6599],
[1, 6599],
[1, 6599],
[1, 6599],
[0, 6599]]],
['regression: scenario 3',
[[62662, 46394, 25376, 46313],
3855,
7057,
[[False, False],
[False, False],
[False, False],
[False, False],
[False, False],
[True, False],
[False, False],
[True, False],
[True, False],
[True, False],
[False, False],
[True, False],
[False, False]]],
[[0, 7057],
[0, 7057],
[0, 7057],
[0, 7057],
[0, 7057],
[1, 5530],
[1, 5530],
[2, 5008],
[2, 5008],
[2, 5008],
[2, 5008],
[3, 5273],
[3, 5273]]]]]
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: wrap past last step | [[1, 43793], [1, 43793], [2, 43810], [2, 43810], [1, 43793], [1, 43793]] | [[1, 43793], [1, 43793], [2, 43810], [2, 43810], [1, 43793], [1, 43793]] | Passed |
| regression: scenario 1 | [[0, 52597], [0, 52597], [0, 52597], [0, 52597], [0, 52597], [0, 52597], [0, 52597], [1, 50611], [1, 50611], [1, 50611]] | [[0, 52597], [0, 52597], [0, 52597], [0, 52597], [0, 52597], [0, 52597], [0, 52597], [1, 50611], [1, 50611], [1, 50611]] | Passed |
| control: two element file | [[1, 9], [1, 9], [1, 9], [1, 9], [1, 9]] | [[1, 9], [1, 9], [1, 9], [1, 9], [1, 9]] | Passed |
| regression: reset while enabled | [[1, 65523], [0, 65523], [0, 65523], [1, 65523]] | [[1, 65523], [0, 65523], [0, 65523], [1, 65523]] | Passed |
| regression: reset with advance | [[0, 170], [0, 170], [0, 170], [1, 426]] | [[0, 170], [0, 170], [0, 170], [1, 426]] | Passed |
| regression: scenario 2 | [[1, 5877], [1, 5877], [1, 5877], [1, 5877], [2, 5658], [2, 5658], [2, 5658], [2, 5658], [0, 5658], [0, 5658]] | [[1, 5877], [1, 5877], [1, 5877], [1, 5877], [2, 5658], [2, 5658], [2, 5658], [2, 5658], [0, 5658], [0, 5658]] | Passed |
| regression: scenario 3 | [[1, 45985], [1, 45985], [1, 45985], [1, 45985], [1, 45985], [1, 45985], [1, 45985]] | [[1, 45985], [1, 45985], [1, 45985], [1, 45985], [1, 45985], [1, 45985], [1, 45985]] | Passed |
| regression: scenario 4 | [[1, 61415], [1, 61415], [1, 61415], [1, 61415], [1, 61415], [2, 54040]] | [[1, 61415], [1, 61415], [1, 61415], [1, 61415], [1, 61415], [2, 54040]] | Passed |
SHA-256 / 3d29531f8e01b476051aebffb8f672221f785b3688d14e3c7ef26c281fed43b8
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:42.448326+00:00.
Case digest / bd58eee7cf8ad042001493193c0275d5ffc0d0290737ba84afad09bfa3f0781d