{"abstract":"Once silenced, later alarms never sound the horn.","category":"PLC ladder logic scan cycles","checks":8,"contract":"Stack light and horn logic. alarms is a list of [name, high|low]; each scan gives the active alarm names plus optional ack and silence buttons. An alarm becomes unacknowledged on its inactive-to-active transition and stops being unacknowledged when it clears or ack is pressed. Any new activation cancels silence; silence (pressed after that) mutes the horn. The lamp is red if any high alarm is active, else amber if any alarm is active, else off; it flashes if an unacknowledged alarm of the displayed level exists. The horn sounds while any unacknowledged alarm exists and not silenced. Return [color, flashing, horn] per scan.","evaluation_group":"w2-plc-ladder-logic-scan-cycles-stack-light-horn","failed_approach":"Cancelling silence only for high alarms keeps new low alarms silent.","family":"w2-plc-ladder-logic-scan-cycles-stack-light-horn-silence-rearm","id":"FA-92301","implementations":{"attempt":{"sha256":"5d2cb0f0a7d82a973eddc65b95f3332fedab7a8fe5bfbadcb6ca600ecfae3fe7","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(alarms, scans):\n    level = dict(alarms)\n    prev = set()\n    unacked = set()\n    silenced = False\n    out = []\n    for s in scans:\n        active = set(s.get('active', []))\n        new = active - prev\n        if any(level[a] == 'high' for a in new):\n            silenced = False\n        unacked = (unacked | new) & active\n        if s.get('ack'):\n            unacked = set()\n        if s.get('silence'):\n            silenced = True\n        if any(level[a] == 'high' for a in active):\n            shown = 'high'\n        elif active:\n            shown = 'low'\n        else:\n            shown = None\n        color = {'high': 'red', 'low': 'amber', None: 'off'}[shown]\n        flashing = any(level[a] == shown for a in unacked)\n        horn = bool(unacked) and not silenced\n        prev = active\n        out.append([color, flashing, horn])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: escalation sequence',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['B']},\n     {'active': ['B'], 'silence': True},\n     {'active': ['A', 'B']},\n     {'active': ['A', 'B'], 'ack': True},\n     {'active': ['B']},\n     {}]],\n   [['amber', True, True],\n    ['amber', True, False],\n    ['red', True, True],\n    ['red', False, False],\n    ['amber', False, False],\n    ['off', False, False]]],\n  ['regression: silence then new low alarm',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['A']}, {'active': ['A'], 'silence': True}, {'active': ['A', 'B']}]],\n   [['red', True, True], ['red', True, False], ['red', True, True]]],\n  ['control: alarm clears unacknowledged',\n   [[['A', 'high'], ['B', 'low']], [{'active': ['A']}, {}, {'active': ['B']}]],\n   [['red', True, True], ['off', False, False], ['amber', True, True]]],\n  ['control: low alarm while high acked',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['A'], 'ack': True},\n     {'active': ['A', 'B']},\n     {'active': ['A', 'B'], 'silence': True},\n     {'active': ['A', 'B']}]],\n   [['red', False, False], ['red', False, True], ['red', False, False], ['red', False, False]]],\n  ['control: alarm present at first scan',\n   [[['A', 'high'], ['B', 'low']], [{'active': ['A']}, {'active': ['A']}]],\n   [['red', True, True], ['red', True, True]]],\n  ['regression: scenario 1',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': ['TT300'], 'ack': True},\n     {'active': ['TT300']},\n     {'active': ['ZS400'], 'ack': True, 'silence': True},\n     {'active': []},\n     {'active': ['ZS400'], 'silence': True},\n     {'active': ['TT300', 'ZS400']},\n     {'active': ['LT200', 'TT300', 'ZS400']},\n     {'active': ['LT200', 'TT300', 'ZS400']},\n     {'active': ['LT200', 'ZS400'], 'ack': True}]],\n   [['amber', False, False],\n    ['amber', False, False],\n    ['red', False, False],\n    ['off', False, False],\n    ['red', True, False],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', False, False]]],\n  ['regression: scenario 2',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': ['TT300'], 'silence': True},\n     {'active': ['ZS400']},\n     {'active': ['LT200', 'TT300']},\n     {'active': ['LT200', 'PT101', 'TT300', 'ZS400']},\n     {'active': ['LT200', 'PT101', 'TT300'], 'silence': True},\n     {'active': ['LT200', 'PT101', 'TT300'], 'silence': True}]],\n   [['amber', True, False],\n    ['red', True, True],\n    ['amber', True, True],\n    ['red', True, True],\n    ['red', True, False],\n    ['red', True, False]]],\n  ['control: scenario 3',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': [], 'ack': True},\n     {'active': []},\n     {'active': ['ZS400']},\n     {'active': ['ZS400']},\n     {'active': ['LT200', 'PT101', 'ZS400'], 'silence': True},\n     {'active': ['LT200', 'PT101'], 'ack': True}]],\n   [['off', False, False],\n    ['off', False, False],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, False],\n    ['red', False, False]]]],\n [['regression: silence then new low alarm',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['A']}, {'active': ['A'], 'silence': True}, {'active': ['A', 'B']}]],\n   [['red', True, True], ['red', True, False], ['red', True, True]]],\n  ['regression: scenario 5',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': [], 'silence': True},\n     {'active': ['LT200', 'TT300']},\n     {'active': ['LT200', 'PT101', 'ZS400']},\n     {'active': ['LT200', 'PT101', 'ZS400'], 'ack': True},\n     {'active': ['LT200', 'PT101', 'ZS400']},\n     {'active': ['LT200', 'PT101', 'ZS400'], 'silence': True},\n     {'active': ['LT200', 'PT101', 'ZS400']},\n     {'active': ['PT101']},\n     {'active': ['PT101', 'TT300'], 'ack': True},\n     {'active': []}]],\n   [['off', False, False],\n    ['amber', True, True],\n    ['red', True, True],\n    ['red', False, False],\n    ['red', False, False],\n    ['red', False, False],\n    ['red', False, False],\n    ['red', False, False],\n    ['red', False, False],\n    ['off', False, False]]],\n  ['regression: escalation sequence',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['B']},\n     {'active': ['B'], 'silence': True},\n     {'active': ['A', 'B']},\n     {'active': ['A', 'B'], 'ack': True},\n     {'active': ['B']},\n     {}]],\n   [['amber', True, True],\n    ['amber', True, False],\n    ['red', True, True],\n    ['red', False, False],\n    ['amber', False, False],\n    ['off', False, False]]],\n  ['control: alarm clears unacknowledged',\n   [[['A', 'high'], ['B', 'low']], [{'active': ['A']}, {}, {'active': ['B']}]],\n   [['red', True, True], ['off', False, False], ['amber', True, True]]],\n  ['control: low alarm while high acked',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['A'], 'ack': True},\n     {'active': ['A', 'B']},\n     {'active': ['A', 'B'], 'silence': True},\n     {'active': ['A', 'B']}]],\n   [['red', False, False], ['red', False, True], ['red', False, False], ['red', False, False]]],\n  ['control: alarm present at first scan',\n   [[['A', 'high'], ['B', 'low']], [{'active': ['A']}, {'active': ['A']}]],\n   [['red', True, True], ['red', True, True]]],\n  ['regression: scenario 1',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': ['ZS400'], 'silence': True},\n     {'active': ['LT200', 'ZS400']},\n     {'active': ['LT200', 'ZS400']},\n     {'active': ['LT200', 'ZS400']},\n     {'active': ['LT200', 'ZS400']},\n     {'active': ['LT200']}]],\n   [['red', True, False],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['amber', True, True]]],\n  ['control: scenario 2',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': ['PT101']},\n     {'active': ['ZS400'], 'ack': True},\n     {'active': ['TT300']},\n     {'active': ['TT300']},\n     {'active': ['PT101', 'TT300']},\n     {'active': ['PT101']},\n     {'active': ['LT200', 'ZS400']},\n     {'active': ['LT200', 'PT101', 'TT300', 'ZS400']},\n     {'active': ['LT200', 'TT300', 'ZS400']},\n     {'active': ['LT200', 'PT101', 'TT300', 'ZS400']},\n     {'active': ['LT200', 'TT300'], 'ack': True},\n     {'active': ['LT200', 'TT300']}]],\n   [['red', True, True],\n    ['red', False, False],\n    ['amber', True, True],\n    ['amber', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['amber', False, False],\n    ['amber', False, False]]]],\n [['regression: scenario 1',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': ['PT101']},\n     {'active': ['LT200', 'PT101']},\n     {'active': ['LT200', 'PT101']},\n     {'active': ['LT200', 'PT101'], 'silence': True},\n     {'active': ['LT200', 'PT101']},\n     {'active': []},\n     {'active': []},\n     {'active': []},\n     {'active': [], 'ack': True},\n     {'active': ['LT200']},\n     {'active': ['LT200', 'TT300']}]],\n   [['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, False],\n    ['red', True, False],\n    ['off', False, False],\n    ['off', False, False],\n    ['off', False, False],\n    ['off', False, False],\n    ['amber', True, True],\n    ['amber', True, True]]],\n  ['regression: scenario 12',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': ['LT200', 'PT101']},\n     {'active': ['PT101', 'TT300'], 'ack': True},\n     {'active': ['ZS400'], 'silence': True},\n     {'active': ['PT101']},\n     {'active': ['LT200', 'PT101']},\n     {'active': [], 'silence': True},\n     {'active': ['LT200']},\n     {'active': ['LT200']},\n     {'active': ['LT200', 'PT101']},\n     {'active': ['LT200', 'PT101', 'ZS400']},\n     {'active': ['LT200', 'PT101', 'ZS400']},\n     {'active': ['LT200', 'PT101', 'TT300', 'ZS400'], 'silence': True}]],\n   [['red', True, True],\n    ['red', False, False],\n    ['red', True, False],\n    ['red', True, True],\n    ['red', True, True],\n    ['off', False, False],\n    ['amber', True, True],\n    ['amber', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, False]]],\n  ['regression: escalation sequence',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['B']},\n     {'active': ['B'], 'silence': True},\n     {'active': ['A', 'B']},\n     {'active': ['A', 'B'], 'ack': True},\n     {'active': ['B']},\n     {}]],\n   [['amber', True, True],\n    ['amber', True, False],\n    ['red', True, True],\n    ['red', False, False],\n    ['amber', False, False],\n    ['off', False, False]]],\n  ['control: alarm clears unacknowledged',\n   [[['A', 'high'], ['B', 'low']], [{'active': ['A']}, {}, {'active': ['B']}]],\n   [['red', True, True], ['off', False, False], ['amber', True, True]]],\n  ['control: low alarm while high acked',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['A'], 'ack': True},\n     {'active': ['A', 'B']},\n     {'active': ['A', 'B'], 'silence': True},\n     {'active': ['A', 'B']}]],\n   [['red', False, False], ['red', False, True], ['red', False, False], ['red', False, False]]],\n  ['control: alarm present at first scan',\n   [[['A', 'high'], ['B', 'low']], [{'active': ['A']}, {'active': ['A']}]],\n   [['red', True, True], ['red', True, True]]],\n  ['regression: silence then new low alarm',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['A']}, {'active': ['A'], 'silence': True}, {'active': ['A', 'B']}]],\n   [['red', True, True], ['red', True, False], ['red', True, True]]],\n  ['regression: scenario 2',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': []},\n     {'active': ['ZS400']},\n     {'active': ['ZS400']},\n     {'active': ['ZS400'], 'silence': True},\n     {'active': ['ZS400']},\n     {'active': []},\n     {'active': ['LT200', 'ZS400']},\n     {'active': ['LT200', 'PT101', 'ZS400']},\n     {'active': ['PT101', 'TT300', 'ZS400']}]],\n   [['off', False, False],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, False],\n    ['red', True, False],\n    ['off', False, False],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True]]]],\n [['regression: scenario 4',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': ['LT200'], 'silence': True},\n     {'active': ['PT101', 'TT300']},\n     {'active': ['PT101', 'TT300', 'ZS400']},\n     {'active': ['ZS400']},\n     {'active': ['PT101']},\n     {'active': ['LT200', 'PT101', 'TT300']}]],\n   [['amber', True, False],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True]]],\n  ['regression: scenario 21',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': ['PT101', 'ZS400']},\n     {'active': ['LT200', 'PT101', 'ZS400'], 'silence': True},\n     {'active': ['LT200', 'PT101', 'TT300', 'ZS400']},\n     {'active': ['LT200', 'ZS400']},\n     {'active': ['LT200', 'ZS400']},\n     {'active': ['LT200', 'TT300', 'ZS400'], 'silence': True}]],\n   [['red', True, True],\n    ['red', True, False],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, False]]],\n  ['regression: escalation sequence',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['B']},\n     {'active': ['B'], 'silence': True},\n     {'active': ['A', 'B']},\n     {'active': ['A', 'B'], 'ack': True},\n     {'active': ['B']},\n     {}]],\n   [['amber', True, True],\n    ['amber', True, False],\n    ['red', True, True],\n    ['red', False, False],\n    ['amber', False, False],\n    ['off', False, False]]],\n  ['control: alarm clears unacknowledged',\n   [[['A', 'high'], ['B', 'low']], [{'active': ['A']}, {}, {'active': ['B']}]],\n   [['red', True, True], ['off', False, False], ['amber', True, True]]],\n  ['control: low alarm while high acked',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['A'], 'ack': True},\n     {'active': ['A', 'B']},\n     {'active': ['A', 'B'], 'silence': True},\n     {'active': ['A', 'B']}]],\n   [['red', False, False], ['red', False, True], ['red', False, False], ['red', False, False]]],\n  ['control: alarm present at first scan',\n   [[['A', 'high'], ['B', 'low']], [{'active': ['A']}, {'active': ['A']}]],\n   [['red', True, True], ['red', True, True]]],\n  ['regression: silence then new low alarm',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['A']}, {'active': ['A'], 'silence': True}, {'active': ['A', 'B']}]],\n   [['red', True, True], ['red', True, False], ['red', True, True]]],\n  ['control: scenario 1',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': ['PT101'], 'ack': True},\n     {'active': ['PT101']},\n     {'active': ['PT101'], 'ack': True},\n     {'active': ['PT101']},\n     {'active': ['PT101']},\n     {'active': ['LT200', 'PT101', 'TT300']},\n     {'active': ['LT200', 'PT101', 'TT300'], 'ack': True},\n     {'active': ['LT200', 'TT300']}]],\n   [['red', False, False],\n    ['red', False, False],\n    ['red', False, False],\n    ['red', False, False],\n    ['red', False, False],\n    ['red', False, True],\n    ['red', False, False],\n    ['amber', False, False]]]],\n [['regression: scenario 5',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': ['TT300', 'ZS400']},\n     {'active': ['ZS400']},\n     {'active': ['ZS400']},\n     {'active': ['LT200', 'PT101']},\n     {'active': ['PT101', 'TT300'], 'ack': True, 'silence': True},\n     {'active': []},\n     {'active': ['PT101']},\n     {'active': ['PT101'], 'silence': True},\n     {'active': ['TT300'], 'ack': True, 'silence': True},\n     {'active': [], 'silence': True},\n     {'active': []},\n     {'active': [], 'ack': True}]],\n   [['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', False, False],\n    ['off', False, False],\n    ['red', True, True],\n    ['red', True, False],\n    ['amber', False, False],\n    ['off', False, False],\n    ['off', False, False],\n    ['off', False, False]]],\n  ['regression: scenario 23',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': []},\n     {'active': ['TT300']},\n     {'active': ['TT300'], 'silence': True},\n     {'active': []},\n     {'active': ['PT101']},\n     {'active': ['ZS400']},\n     {'active': ['LT200', 'ZS400'], 'silence': True},\n     {'active': ['LT200', 'TT300', 'ZS400']},\n     {'active': ['LT200', 'PT101', 'ZS400']}]],\n   [['off', False, False],\n    ['amber', True, True],\n    ['amber', True, False],\n    ['off', False, False],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, False],\n    ['red', True, True],\n    ['red', True, True]]],\n  ['regression: escalation sequence',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['B']},\n     {'active': ['B'], 'silence': True},\n     {'active': ['A', 'B']},\n     {'active': ['A', 'B'], 'ack': True},\n     {'active': ['B']},\n     {}]],\n   [['amber', True, True],\n    ['amber', True, False],\n    ['red', True, True],\n    ['red', False, False],\n    ['amber', False, False],\n    ['off', False, False]]],\n  ['control: alarm clears unacknowledged',\n   [[['A', 'high'], ['B', 'low']], [{'active': ['A']}, {}, {'active': ['B']}]],\n   [['red', True, True], ['off', False, False], ['amber', True, True]]],\n  ['control: low alarm while high acked',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['A'], 'ack': True},\n     {'active': ['A', 'B']},\n     {'active': ['A', 'B'], 'silence': True},\n     {'active': ['A', 'B']}]],\n   [['red', False, False], ['red', False, True], ['red', False, False], ['red', False, False]]],\n  ['control: alarm present at first scan',\n   [[['A', 'high'], ['B', 'low']], [{'active': ['A']}, {'active': ['A']}]],\n   [['red', True, True], ['red', True, True]]],\n  ['regression: silence then new low alarm',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['A']}, {'active': ['A'], 'silence': True}, {'active': ['A', 'B']}]],\n   [['red', True, True], ['red', True, False], ['red', True, True]]],\n  ['regression: scenario 1',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': [], 'silence': True},\n     {'active': [], 'silence': True},\n     {'active': [], 'silence': True},\n     {'active': []},\n     {'active': ['ZS400']},\n     {'active': ['ZS400'], 'ack': True},\n     {'active': ['TT300']},\n     {'active': ['PT101', 'TT300'], 'ack': True},\n     {'active': ['PT101', 'TT300']},\n     {'active': ['PT101', 'TT300'], 'silence': True},\n     {'active': ['LT200', 'PT101', 'TT300'], 'silence': True},\n     {'active': ['LT200', 'PT101', 'TT300']}]],\n   [['off', False, False],\n    ['off', False, False],\n    ['off', False, False],\n    ['off', False, False],\n    ['red', True, True],\n    ['red', False, False],\n    ['amber', True, True],\n    ['red', False, False],\n    ['red', False, False],\n    ['red', False, False],\n    ['red', False, False],\n    ['red', False, False]]]]]\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":"8165f35001fc9ff0f1075917e4957c57213eb80e9ecfb4f9867c49c69e57562f","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(alarms, scans):\n    level = dict(alarms)\n    prev = set()\n    unacked = set()\n    silenced = False\n    out = []\n    for s in scans:\n        active = set(s.get('active', []))\n        new = active - prev\n        unacked = (unacked | new) & active\n        if s.get('ack'):\n            unacked = set()\n        if s.get('silence'):\n            silenced = True\n        if any(level[a] == 'high' for a in active):\n            shown = 'high'\n        elif active:\n            shown = 'low'\n        else:\n            shown = None\n        color = {'high': 'red', 'low': 'amber', None: 'off'}[shown]\n        flashing = any(level[a] == shown for a in unacked)\n        horn = bool(unacked) and not silenced\n        prev = active\n        out.append([color, flashing, horn])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: escalation sequence',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['B']},\n     {'active': ['B'], 'silence': True},\n     {'active': ['A', 'B']},\n     {'active': ['A', 'B'], 'ack': True},\n     {'active': ['B']},\n     {}]],\n   [['amber', True, True],\n    ['amber', True, False],\n    ['red', True, True],\n    ['red', False, False],\n    ['amber', False, False],\n    ['off', False, False]]],\n  ['regression: silence then new low alarm',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['A']}, {'active': ['A'], 'silence': True}, {'active': ['A', 'B']}]],\n   [['red', True, True], ['red', True, False], ['red', True, True]]],\n  ['control: alarm clears unacknowledged',\n   [[['A', 'high'], ['B', 'low']], [{'active': ['A']}, {}, {'active': ['B']}]],\n   [['red', True, True], ['off', False, False], ['amber', True, True]]],\n  ['control: low alarm while high acked',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['A'], 'ack': True},\n     {'active': ['A', 'B']},\n     {'active': ['A', 'B'], 'silence': True},\n     {'active': ['A', 'B']}]],\n   [['red', False, False], ['red', False, True], ['red', False, False], ['red', False, False]]],\n  ['control: alarm present at first scan',\n   [[['A', 'high'], ['B', 'low']], [{'active': ['A']}, {'active': ['A']}]],\n   [['red', True, True], ['red', True, True]]],\n  ['regression: scenario 1',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': ['TT300'], 'ack': True},\n     {'active': ['TT300']},\n     {'active': ['ZS400'], 'ack': True, 'silence': True},\n     {'active': []},\n     {'active': ['ZS400'], 'silence': True},\n     {'active': ['TT300', 'ZS400']},\n     {'active': ['LT200', 'TT300', 'ZS400']},\n     {'active': ['LT200', 'TT300', 'ZS400']},\n     {'active': ['LT200', 'ZS400'], 'ack': True}]],\n   [['amber', False, False],\n    ['amber', False, False],\n    ['red', False, False],\n    ['off', False, False],\n    ['red', True, False],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', False, False]]],\n  ['regression: scenario 2',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': ['TT300'], 'silence': True},\n     {'active': ['ZS400']},\n     {'active': ['LT200', 'TT300']},\n     {'active': ['LT200', 'PT101', 'TT300', 'ZS400']},\n     {'active': ['LT200', 'PT101', 'TT300'], 'silence': True},\n     {'active': ['LT200', 'PT101', 'TT300'], 'silence': True}]],\n   [['amber', True, False],\n    ['red', True, True],\n    ['amber', True, True],\n    ['red', True, True],\n    ['red', True, False],\n    ['red', True, False]]],\n  ['control: scenario 3',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': [], 'ack': True},\n     {'active': []},\n     {'active': ['ZS400']},\n     {'active': ['ZS400']},\n     {'active': ['LT200', 'PT101', 'ZS400'], 'silence': True},\n     {'active': ['LT200', 'PT101'], 'ack': True}]],\n   [['off', False, False],\n    ['off', False, False],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, False],\n    ['red', False, False]]]],\n [['regression: silence then new low alarm',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['A']}, {'active': ['A'], 'silence': True}, {'active': ['A', 'B']}]],\n   [['red', True, True], ['red', True, False], ['red', True, True]]],\n  ['regression: scenario 5',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': [], 'silence': True},\n     {'active': ['LT200', 'TT300']},\n     {'active': ['LT200', 'PT101', 'ZS400']},\n     {'active': ['LT200', 'PT101', 'ZS400'], 'ack': True},\n     {'active': ['LT200', 'PT101', 'ZS400']},\n     {'active': ['LT200', 'PT101', 'ZS400'], 'silence': True},\n     {'active': ['LT200', 'PT101', 'ZS400']},\n     {'active': ['PT101']},\n     {'active': ['PT101', 'TT300'], 'ack': True},\n     {'active': []}]],\n   [['off', False, False],\n    ['amber', True, True],\n    ['red', True, True],\n    ['red', False, False],\n    ['red', False, False],\n    ['red', False, False],\n    ['red', False, False],\n    ['red', False, False],\n    ['red', False, False],\n    ['off', False, False]]],\n  ['regression: escalation sequence',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['B']},\n     {'active': ['B'], 'silence': True},\n     {'active': ['A', 'B']},\n     {'active': ['A', 'B'], 'ack': True},\n     {'active': ['B']},\n     {}]],\n   [['amber', True, True],\n    ['amber', True, False],\n    ['red', True, True],\n    ['red', False, False],\n    ['amber', False, False],\n    ['off', False, False]]],\n  ['control: alarm clears unacknowledged',\n   [[['A', 'high'], ['B', 'low']], [{'active': ['A']}, {}, {'active': ['B']}]],\n   [['red', True, True], ['off', False, False], ['amber', True, True]]],\n  ['control: low alarm while high acked',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['A'], 'ack': True},\n     {'active': ['A', 'B']},\n     {'active': ['A', 'B'], 'silence': True},\n     {'active': ['A', 'B']}]],\n   [['red', False, False], ['red', False, True], ['red', False, False], ['red', False, False]]],\n  ['control: alarm present at first scan',\n   [[['A', 'high'], ['B', 'low']], [{'active': ['A']}, {'active': ['A']}]],\n   [['red', True, True], ['red', True, True]]],\n  ['regression: scenario 1',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': ['ZS400'], 'silence': True},\n     {'active': ['LT200', 'ZS400']},\n     {'active': ['LT200', 'ZS400']},\n     {'active': ['LT200', 'ZS400']},\n     {'active': ['LT200', 'ZS400']},\n     {'active': ['LT200']}]],\n   [['red', True, False],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['amber', True, True]]],\n  ['control: scenario 2',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': ['PT101']},\n     {'active': ['ZS400'], 'ack': True},\n     {'active': ['TT300']},\n     {'active': ['TT300']},\n     {'active': ['PT101', 'TT300']},\n     {'active': ['PT101']},\n     {'active': ['LT200', 'ZS400']},\n     {'active': ['LT200', 'PT101', 'TT300', 'ZS400']},\n     {'active': ['LT200', 'TT300', 'ZS400']},\n     {'active': ['LT200', 'PT101', 'TT300', 'ZS400']},\n     {'active': ['LT200', 'TT300'], 'ack': True},\n     {'active': ['LT200', 'TT300']}]],\n   [['red', True, True],\n    ['red', False, False],\n    ['amber', True, True],\n    ['amber', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['amber', False, False],\n    ['amber', False, False]]]],\n [['regression: scenario 1',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': ['PT101']},\n     {'active': ['LT200', 'PT101']},\n     {'active': ['LT200', 'PT101']},\n     {'active': ['LT200', 'PT101'], 'silence': True},\n     {'active': ['LT200', 'PT101']},\n     {'active': []},\n     {'active': []},\n     {'active': []},\n     {'active': [], 'ack': True},\n     {'active': ['LT200']},\n     {'active': ['LT200', 'TT300']}]],\n   [['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, False],\n    ['red', True, False],\n    ['off', False, False],\n    ['off', False, False],\n    ['off', False, False],\n    ['off', False, False],\n    ['amber', True, True],\n    ['amber', True, True]]],\n  ['regression: scenario 12',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': ['LT200', 'PT101']},\n     {'active': ['PT101', 'TT300'], 'ack': True},\n     {'active': ['ZS400'], 'silence': True},\n     {'active': ['PT101']},\n     {'active': ['LT200', 'PT101']},\n     {'active': [], 'silence': True},\n     {'active': ['LT200']},\n     {'active': ['LT200']},\n     {'active': ['LT200', 'PT101']},\n     {'active': ['LT200', 'PT101', 'ZS400']},\n     {'active': ['LT200', 'PT101', 'ZS400']},\n     {'active': ['LT200', 'PT101', 'TT300', 'ZS400'], 'silence': True}]],\n   [['red', True, True],\n    ['red', False, False],\n    ['red', True, False],\n    ['red', True, True],\n    ['red', True, True],\n    ['off', False, False],\n    ['amber', True, True],\n    ['amber', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, False]]],\n  ['regression: escalation sequence',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['B']},\n     {'active': ['B'], 'silence': True},\n     {'active': ['A', 'B']},\n     {'active': ['A', 'B'], 'ack': True},\n     {'active': ['B']},\n     {}]],\n   [['amber', True, True],\n    ['amber', True, False],\n    ['red', True, True],\n    ['red', False, False],\n    ['amber', False, False],\n    ['off', False, False]]],\n  ['control: alarm clears unacknowledged',\n   [[['A', 'high'], ['B', 'low']], [{'active': ['A']}, {}, {'active': ['B']}]],\n   [['red', True, True], ['off', False, False], ['amber', True, True]]],\n  ['control: low alarm while high acked',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['A'], 'ack': True},\n     {'active': ['A', 'B']},\n     {'active': ['A', 'B'], 'silence': True},\n     {'active': ['A', 'B']}]],\n   [['red', False, False], ['red', False, True], ['red', False, False], ['red', False, False]]],\n  ['control: alarm present at first scan',\n   [[['A', 'high'], ['B', 'low']], [{'active': ['A']}, {'active': ['A']}]],\n   [['red', True, True], ['red', True, True]]],\n  ['regression: silence then new low alarm',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['A']}, {'active': ['A'], 'silence': True}, {'active': ['A', 'B']}]],\n   [['red', True, True], ['red', True, False], ['red', True, True]]],\n  ['regression: scenario 2',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': []},\n     {'active': ['ZS400']},\n     {'active': ['ZS400']},\n     {'active': ['ZS400'], 'silence': True},\n     {'active': ['ZS400']},\n     {'active': []},\n     {'active': ['LT200', 'ZS400']},\n     {'active': ['LT200', 'PT101', 'ZS400']},\n     {'active': ['PT101', 'TT300', 'ZS400']}]],\n   [['off', False, False],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, False],\n    ['red', True, False],\n    ['off', False, False],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True]]]],\n [['regression: scenario 4',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': ['LT200'], 'silence': True},\n     {'active': ['PT101', 'TT300']},\n     {'active': ['PT101', 'TT300', 'ZS400']},\n     {'active': ['ZS400']},\n     {'active': ['PT101']},\n     {'active': ['LT200', 'PT101', 'TT300']}]],\n   [['amber', True, False],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True]]],\n  ['regression: scenario 21',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': ['PT101', 'ZS400']},\n     {'active': ['LT200', 'PT101', 'ZS400'], 'silence': True},\n     {'active': ['LT200', 'PT101', 'TT300', 'ZS400']},\n     {'active': ['LT200', 'ZS400']},\n     {'active': ['LT200', 'ZS400']},\n     {'active': ['LT200', 'TT300', 'ZS400'], 'silence': True}]],\n   [['red', True, True],\n    ['red', True, False],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, False]]],\n  ['regression: escalation sequence',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['B']},\n     {'active': ['B'], 'silence': True},\n     {'active': ['A', 'B']},\n     {'active': ['A', 'B'], 'ack': True},\n     {'active': ['B']},\n     {}]],\n   [['amber', True, True],\n    ['amber', True, False],\n    ['red', True, True],\n    ['red', False, False],\n    ['amber', False, False],\n    ['off', False, False]]],\n  ['control: alarm clears unacknowledged',\n   [[['A', 'high'], ['B', 'low']], [{'active': ['A']}, {}, {'active': ['B']}]],\n   [['red', True, True], ['off', False, False], ['amber', True, True]]],\n  ['control: low alarm while high acked',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['A'], 'ack': True},\n     {'active': ['A', 'B']},\n     {'active': ['A', 'B'], 'silence': True},\n     {'active': ['A', 'B']}]],\n   [['red', False, False], ['red', False, True], ['red', False, False], ['red', False, False]]],\n  ['control: alarm present at first scan',\n   [[['A', 'high'], ['B', 'low']], [{'active': ['A']}, {'active': ['A']}]],\n   [['red', True, True], ['red', True, True]]],\n  ['regression: silence then new low alarm',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['A']}, {'active': ['A'], 'silence': True}, {'active': ['A', 'B']}]],\n   [['red', True, True], ['red', True, False], ['red', True, True]]],\n  ['control: scenario 1',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': ['PT101'], 'ack': True},\n     {'active': ['PT101']},\n     {'active': ['PT101'], 'ack': True},\n     {'active': ['PT101']},\n     {'active': ['PT101']},\n     {'active': ['LT200', 'PT101', 'TT300']},\n     {'active': ['LT200', 'PT101', 'TT300'], 'ack': True},\n     {'active': ['LT200', 'TT300']}]],\n   [['red', False, False],\n    ['red', False, False],\n    ['red', False, False],\n    ['red', False, False],\n    ['red', False, False],\n    ['red', False, True],\n    ['red', False, False],\n    ['amber', False, False]]]],\n [['regression: scenario 5',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': ['TT300', 'ZS400']},\n     {'active': ['ZS400']},\n     {'active': ['ZS400']},\n     {'active': ['LT200', 'PT101']},\n     {'active': ['PT101', 'TT300'], 'ack': True, 'silence': True},\n     {'active': []},\n     {'active': ['PT101']},\n     {'active': ['PT101'], 'silence': True},\n     {'active': ['TT300'], 'ack': True, 'silence': True},\n     {'active': [], 'silence': True},\n     {'active': []},\n     {'active': [], 'ack': True}]],\n   [['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', False, False],\n    ['off', False, False],\n    ['red', True, True],\n    ['red', True, False],\n    ['amber', False, False],\n    ['off', False, False],\n    ['off', False, False],\n    ['off', False, False]]],\n  ['regression: scenario 23',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': []},\n     {'active': ['TT300']},\n     {'active': ['TT300'], 'silence': True},\n     {'active': []},\n     {'active': ['PT101']},\n     {'active': ['ZS400']},\n     {'active': ['LT200', 'ZS400'], 'silence': True},\n     {'active': ['LT200', 'TT300', 'ZS400']},\n     {'active': ['LT200', 'PT101', 'ZS400']}]],\n   [['off', False, False],\n    ['amber', True, True],\n    ['amber', True, False],\n    ['off', False, False],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, False],\n    ['red', True, True],\n    ['red', True, True]]],\n  ['regression: escalation sequence',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['B']},\n     {'active': ['B'], 'silence': True},\n     {'active': ['A', 'B']},\n     {'active': ['A', 'B'], 'ack': True},\n     {'active': ['B']},\n     {}]],\n   [['amber', True, True],\n    ['amber', True, False],\n    ['red', True, True],\n    ['red', False, False],\n    ['amber', False, False],\n    ['off', False, False]]],\n  ['control: alarm clears unacknowledged',\n   [[['A', 'high'], ['B', 'low']], [{'active': ['A']}, {}, {'active': ['B']}]],\n   [['red', True, True], ['off', False, False], ['amber', True, True]]],\n  ['control: low alarm while high acked',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['A'], 'ack': True},\n     {'active': ['A', 'B']},\n     {'active': ['A', 'B'], 'silence': True},\n     {'active': ['A', 'B']}]],\n   [['red', False, False], ['red', False, True], ['red', False, False], ['red', False, False]]],\n  ['control: alarm present at first scan',\n   [[['A', 'high'], ['B', 'low']], [{'active': ['A']}, {'active': ['A']}]],\n   [['red', True, True], ['red', True, True]]],\n  ['regression: silence then new low alarm',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['A']}, {'active': ['A'], 'silence': True}, {'active': ['A', 'B']}]],\n   [['red', True, True], ['red', True, False], ['red', True, True]]],\n  ['regression: scenario 1',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': [], 'silence': True},\n     {'active': [], 'silence': True},\n     {'active': [], 'silence': True},\n     {'active': []},\n     {'active': ['ZS400']},\n     {'active': ['ZS400'], 'ack': True},\n     {'active': ['TT300']},\n     {'active': ['PT101', 'TT300'], 'ack': True},\n     {'active': ['PT101', 'TT300']},\n     {'active': ['PT101', 'TT300'], 'silence': True},\n     {'active': ['LT200', 'PT101', 'TT300'], 'silence': True},\n     {'active': ['LT200', 'PT101', 'TT300']}]],\n   [['off', False, False],\n    ['off', False, False],\n    ['off', False, False],\n    ['off', False, False],\n    ['red', True, True],\n    ['red', False, False],\n    ['amber', True, True],\n    ['red', False, False],\n    ['red', False, False],\n    ['red', False, False],\n    ['red', False, False],\n    ['red', False, False]]]]]\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":"e71edd5d7a10473eaa36d4b737b23bc308216eec834cadb2e9ece83b061ad95c","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(alarms, scans):\n    level = dict(alarms)\n    prev = set()\n    unacked = set()\n    silenced = False\n    out = []\n    for s in scans:\n        active = set(s.get('active', []))\n        new = active - prev\n        if new:\n            silenced = False\n        unacked = (unacked | new) & active\n        if s.get('ack'):\n            unacked = set()\n        if s.get('silence'):\n            silenced = True\n        if any(level[a] == 'high' for a in active):\n            shown = 'high'\n        elif active:\n            shown = 'low'\n        else:\n            shown = None\n        color = {'high': 'red', 'low': 'amber', None: 'off'}[shown]\n        flashing = any(level[a] == shown for a in unacked)\n        horn = bool(unacked) and not silenced\n        prev = active\n        out.append([color, flashing, horn])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: escalation sequence',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['B']},\n     {'active': ['B'], 'silence': True},\n     {'active': ['A', 'B']},\n     {'active': ['A', 'B'], 'ack': True},\n     {'active': ['B']},\n     {}]],\n   [['amber', True, True],\n    ['amber', True, False],\n    ['red', True, True],\n    ['red', False, False],\n    ['amber', False, False],\n    ['off', False, False]]],\n  ['regression: silence then new low alarm',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['A']}, {'active': ['A'], 'silence': True}, {'active': ['A', 'B']}]],\n   [['red', True, True], ['red', True, False], ['red', True, True]]],\n  ['control: alarm clears unacknowledged',\n   [[['A', 'high'], ['B', 'low']], [{'active': ['A']}, {}, {'active': ['B']}]],\n   [['red', True, True], ['off', False, False], ['amber', True, True]]],\n  ['control: low alarm while high acked',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['A'], 'ack': True},\n     {'active': ['A', 'B']},\n     {'active': ['A', 'B'], 'silence': True},\n     {'active': ['A', 'B']}]],\n   [['red', False, False], ['red', False, True], ['red', False, False], ['red', False, False]]],\n  ['control: alarm present at first scan',\n   [[['A', 'high'], ['B', 'low']], [{'active': ['A']}, {'active': ['A']}]],\n   [['red', True, True], ['red', True, True]]],\n  ['regression: scenario 1',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': ['TT300'], 'ack': True},\n     {'active': ['TT300']},\n     {'active': ['ZS400'], 'ack': True, 'silence': True},\n     {'active': []},\n     {'active': ['ZS400'], 'silence': True},\n     {'active': ['TT300', 'ZS400']},\n     {'active': ['LT200', 'TT300', 'ZS400']},\n     {'active': ['LT200', 'TT300', 'ZS400']},\n     {'active': ['LT200', 'ZS400'], 'ack': True}]],\n   [['amber', False, False],\n    ['amber', False, False],\n    ['red', False, False],\n    ['off', False, False],\n    ['red', True, False],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', False, False]]],\n  ['regression: scenario 2',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': ['TT300'], 'silence': True},\n     {'active': ['ZS400']},\n     {'active': ['LT200', 'TT300']},\n     {'active': ['LT200', 'PT101', 'TT300', 'ZS400']},\n     {'active': ['LT200', 'PT101', 'TT300'], 'silence': True},\n     {'active': ['LT200', 'PT101', 'TT300'], 'silence': True}]],\n   [['amber', True, False],\n    ['red', True, True],\n    ['amber', True, True],\n    ['red', True, True],\n    ['red', True, False],\n    ['red', True, False]]],\n  ['control: scenario 3',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': [], 'ack': True},\n     {'active': []},\n     {'active': ['ZS400']},\n     {'active': ['ZS400']},\n     {'active': ['LT200', 'PT101', 'ZS400'], 'silence': True},\n     {'active': ['LT200', 'PT101'], 'ack': True}]],\n   [['off', False, False],\n    ['off', False, False],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, False],\n    ['red', False, False]]]],\n [['regression: silence then new low alarm',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['A']}, {'active': ['A'], 'silence': True}, {'active': ['A', 'B']}]],\n   [['red', True, True], ['red', True, False], ['red', True, True]]],\n  ['regression: scenario 5',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': [], 'silence': True},\n     {'active': ['LT200', 'TT300']},\n     {'active': ['LT200', 'PT101', 'ZS400']},\n     {'active': ['LT200', 'PT101', 'ZS400'], 'ack': True},\n     {'active': ['LT200', 'PT101', 'ZS400']},\n     {'active': ['LT200', 'PT101', 'ZS400'], 'silence': True},\n     {'active': ['LT200', 'PT101', 'ZS400']},\n     {'active': ['PT101']},\n     {'active': ['PT101', 'TT300'], 'ack': True},\n     {'active': []}]],\n   [['off', False, False],\n    ['amber', True, True],\n    ['red', True, True],\n    ['red', False, False],\n    ['red', False, False],\n    ['red', False, False],\n    ['red', False, False],\n    ['red', False, False],\n    ['red', False, False],\n    ['off', False, False]]],\n  ['regression: escalation sequence',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['B']},\n     {'active': ['B'], 'silence': True},\n     {'active': ['A', 'B']},\n     {'active': ['A', 'B'], 'ack': True},\n     {'active': ['B']},\n     {}]],\n   [['amber', True, True],\n    ['amber', True, False],\n    ['red', True, True],\n    ['red', False, False],\n    ['amber', False, False],\n    ['off', False, False]]],\n  ['control: alarm clears unacknowledged',\n   [[['A', 'high'], ['B', 'low']], [{'active': ['A']}, {}, {'active': ['B']}]],\n   [['red', True, True], ['off', False, False], ['amber', True, True]]],\n  ['control: low alarm while high acked',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['A'], 'ack': True},\n     {'active': ['A', 'B']},\n     {'active': ['A', 'B'], 'silence': True},\n     {'active': ['A', 'B']}]],\n   [['red', False, False], ['red', False, True], ['red', False, False], ['red', False, False]]],\n  ['control: alarm present at first scan',\n   [[['A', 'high'], ['B', 'low']], [{'active': ['A']}, {'active': ['A']}]],\n   [['red', True, True], ['red', True, True]]],\n  ['regression: scenario 1',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': ['ZS400'], 'silence': True},\n     {'active': ['LT200', 'ZS400']},\n     {'active': ['LT200', 'ZS400']},\n     {'active': ['LT200', 'ZS400']},\n     {'active': ['LT200', 'ZS400']},\n     {'active': ['LT200']}]],\n   [['red', True, False],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['amber', True, True]]],\n  ['control: scenario 2',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': ['PT101']},\n     {'active': ['ZS400'], 'ack': True},\n     {'active': ['TT300']},\n     {'active': ['TT300']},\n     {'active': ['PT101', 'TT300']},\n     {'active': ['PT101']},\n     {'active': ['LT200', 'ZS400']},\n     {'active': ['LT200', 'PT101', 'TT300', 'ZS400']},\n     {'active': ['LT200', 'TT300', 'ZS400']},\n     {'active': ['LT200', 'PT101', 'TT300', 'ZS400']},\n     {'active': ['LT200', 'TT300'], 'ack': True},\n     {'active': ['LT200', 'TT300']}]],\n   [['red', True, True],\n    ['red', False, False],\n    ['amber', True, True],\n    ['amber', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['amber', False, False],\n    ['amber', False, False]]]],\n [['regression: scenario 1',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': ['PT101']},\n     {'active': ['LT200', 'PT101']},\n     {'active': ['LT200', 'PT101']},\n     {'active': ['LT200', 'PT101'], 'silence': True},\n     {'active': ['LT200', 'PT101']},\n     {'active': []},\n     {'active': []},\n     {'active': []},\n     {'active': [], 'ack': True},\n     {'active': ['LT200']},\n     {'active': ['LT200', 'TT300']}]],\n   [['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, False],\n    ['red', True, False],\n    ['off', False, False],\n    ['off', False, False],\n    ['off', False, False],\n    ['off', False, False],\n    ['amber', True, True],\n    ['amber', True, True]]],\n  ['regression: scenario 12',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': ['LT200', 'PT101']},\n     {'active': ['PT101', 'TT300'], 'ack': True},\n     {'active': ['ZS400'], 'silence': True},\n     {'active': ['PT101']},\n     {'active': ['LT200', 'PT101']},\n     {'active': [], 'silence': True},\n     {'active': ['LT200']},\n     {'active': ['LT200']},\n     {'active': ['LT200', 'PT101']},\n     {'active': ['LT200', 'PT101', 'ZS400']},\n     {'active': ['LT200', 'PT101', 'ZS400']},\n     {'active': ['LT200', 'PT101', 'TT300', 'ZS400'], 'silence': True}]],\n   [['red', True, True],\n    ['red', False, False],\n    ['red', True, False],\n    ['red', True, True],\n    ['red', True, True],\n    ['off', False, False],\n    ['amber', True, True],\n    ['amber', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, False]]],\n  ['regression: escalation sequence',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['B']},\n     {'active': ['B'], 'silence': True},\n     {'active': ['A', 'B']},\n     {'active': ['A', 'B'], 'ack': True},\n     {'active': ['B']},\n     {}]],\n   [['amber', True, True],\n    ['amber', True, False],\n    ['red', True, True],\n    ['red', False, False],\n    ['amber', False, False],\n    ['off', False, False]]],\n  ['control: alarm clears unacknowledged',\n   [[['A', 'high'], ['B', 'low']], [{'active': ['A']}, {}, {'active': ['B']}]],\n   [['red', True, True], ['off', False, False], ['amber', True, True]]],\n  ['control: low alarm while high acked',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['A'], 'ack': True},\n     {'active': ['A', 'B']},\n     {'active': ['A', 'B'], 'silence': True},\n     {'active': ['A', 'B']}]],\n   [['red', False, False], ['red', False, True], ['red', False, False], ['red', False, False]]],\n  ['control: alarm present at first scan',\n   [[['A', 'high'], ['B', 'low']], [{'active': ['A']}, {'active': ['A']}]],\n   [['red', True, True], ['red', True, True]]],\n  ['regression: silence then new low alarm',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['A']}, {'active': ['A'], 'silence': True}, {'active': ['A', 'B']}]],\n   [['red', True, True], ['red', True, False], ['red', True, True]]],\n  ['regression: scenario 2',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': []},\n     {'active': ['ZS400']},\n     {'active': ['ZS400']},\n     {'active': ['ZS400'], 'silence': True},\n     {'active': ['ZS400']},\n     {'active': []},\n     {'active': ['LT200', 'ZS400']},\n     {'active': ['LT200', 'PT101', 'ZS400']},\n     {'active': ['PT101', 'TT300', 'ZS400']}]],\n   [['off', False, False],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, False],\n    ['red', True, False],\n    ['off', False, False],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True]]]],\n [['regression: scenario 4',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': ['LT200'], 'silence': True},\n     {'active': ['PT101', 'TT300']},\n     {'active': ['PT101', 'TT300', 'ZS400']},\n     {'active': ['ZS400']},\n     {'active': ['PT101']},\n     {'active': ['LT200', 'PT101', 'TT300']}]],\n   [['amber', True, False],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True]]],\n  ['regression: scenario 21',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': ['PT101', 'ZS400']},\n     {'active': ['LT200', 'PT101', 'ZS400'], 'silence': True},\n     {'active': ['LT200', 'PT101', 'TT300', 'ZS400']},\n     {'active': ['LT200', 'ZS400']},\n     {'active': ['LT200', 'ZS400']},\n     {'active': ['LT200', 'TT300', 'ZS400'], 'silence': True}]],\n   [['red', True, True],\n    ['red', True, False],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, False]]],\n  ['regression: escalation sequence',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['B']},\n     {'active': ['B'], 'silence': True},\n     {'active': ['A', 'B']},\n     {'active': ['A', 'B'], 'ack': True},\n     {'active': ['B']},\n     {}]],\n   [['amber', True, True],\n    ['amber', True, False],\n    ['red', True, True],\n    ['red', False, False],\n    ['amber', False, False],\n    ['off', False, False]]],\n  ['control: alarm clears unacknowledged',\n   [[['A', 'high'], ['B', 'low']], [{'active': ['A']}, {}, {'active': ['B']}]],\n   [['red', True, True], ['off', False, False], ['amber', True, True]]],\n  ['control: low alarm while high acked',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['A'], 'ack': True},\n     {'active': ['A', 'B']},\n     {'active': ['A', 'B'], 'silence': True},\n     {'active': ['A', 'B']}]],\n   [['red', False, False], ['red', False, True], ['red', False, False], ['red', False, False]]],\n  ['control: alarm present at first scan',\n   [[['A', 'high'], ['B', 'low']], [{'active': ['A']}, {'active': ['A']}]],\n   [['red', True, True], ['red', True, True]]],\n  ['regression: silence then new low alarm',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['A']}, {'active': ['A'], 'silence': True}, {'active': ['A', 'B']}]],\n   [['red', True, True], ['red', True, False], ['red', True, True]]],\n  ['control: scenario 1',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': ['PT101'], 'ack': True},\n     {'active': ['PT101']},\n     {'active': ['PT101'], 'ack': True},\n     {'active': ['PT101']},\n     {'active': ['PT101']},\n     {'active': ['LT200', 'PT101', 'TT300']},\n     {'active': ['LT200', 'PT101', 'TT300'], 'ack': True},\n     {'active': ['LT200', 'TT300']}]],\n   [['red', False, False],\n    ['red', False, False],\n    ['red', False, False],\n    ['red', False, False],\n    ['red', False, False],\n    ['red', False, True],\n    ['red', False, False],\n    ['amber', False, False]]]],\n [['regression: scenario 5',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': ['TT300', 'ZS400']},\n     {'active': ['ZS400']},\n     {'active': ['ZS400']},\n     {'active': ['LT200', 'PT101']},\n     {'active': ['PT101', 'TT300'], 'ack': True, 'silence': True},\n     {'active': []},\n     {'active': ['PT101']},\n     {'active': ['PT101'], 'silence': True},\n     {'active': ['TT300'], 'ack': True, 'silence': True},\n     {'active': [], 'silence': True},\n     {'active': []},\n     {'active': [], 'ack': True}]],\n   [['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', False, False],\n    ['off', False, False],\n    ['red', True, True],\n    ['red', True, False],\n    ['amber', False, False],\n    ['off', False, False],\n    ['off', False, False],\n    ['off', False, False]]],\n  ['regression: scenario 23',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': []},\n     {'active': ['TT300']},\n     {'active': ['TT300'], 'silence': True},\n     {'active': []},\n     {'active': ['PT101']},\n     {'active': ['ZS400']},\n     {'active': ['LT200', 'ZS400'], 'silence': True},\n     {'active': ['LT200', 'TT300', 'ZS400']},\n     {'active': ['LT200', 'PT101', 'ZS400']}]],\n   [['off', False, False],\n    ['amber', True, True],\n    ['amber', True, False],\n    ['off', False, False],\n    ['red', True, True],\n    ['red', True, True],\n    ['red', True, False],\n    ['red', True, True],\n    ['red', True, True]]],\n  ['regression: escalation sequence',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['B']},\n     {'active': ['B'], 'silence': True},\n     {'active': ['A', 'B']},\n     {'active': ['A', 'B'], 'ack': True},\n     {'active': ['B']},\n     {}]],\n   [['amber', True, True],\n    ['amber', True, False],\n    ['red', True, True],\n    ['red', False, False],\n    ['amber', False, False],\n    ['off', False, False]]],\n  ['control: alarm clears unacknowledged',\n   [[['A', 'high'], ['B', 'low']], [{'active': ['A']}, {}, {'active': ['B']}]],\n   [['red', True, True], ['off', False, False], ['amber', True, True]]],\n  ['control: low alarm while high acked',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['A'], 'ack': True},\n     {'active': ['A', 'B']},\n     {'active': ['A', 'B'], 'silence': True},\n     {'active': ['A', 'B']}]],\n   [['red', False, False], ['red', False, True], ['red', False, False], ['red', False, False]]],\n  ['control: alarm present at first scan',\n   [[['A', 'high'], ['B', 'low']], [{'active': ['A']}, {'active': ['A']}]],\n   [['red', True, True], ['red', True, True]]],\n  ['regression: silence then new low alarm',\n   [[['A', 'high'], ['B', 'low']],\n    [{'active': ['A']}, {'active': ['A'], 'silence': True}, {'active': ['A', 'B']}]],\n   [['red', True, True], ['red', True, False], ['red', True, True]]],\n  ['regression: scenario 1',\n   [[['PT101', 'high'], ['LT200', 'low'], ['TT300', 'low'], ['ZS400', 'high']],\n    [{'active': [], 'silence': True},\n     {'active': [], 'silence': True},\n     {'active': [], 'silence': True},\n     {'active': []},\n     {'active': ['ZS400']},\n     {'active': ['ZS400'], 'ack': True},\n     {'active': ['TT300']},\n     {'active': ['PT101', 'TT300'], 'ack': True},\n     {'active': ['PT101', 'TT300']},\n     {'active': ['PT101', 'TT300'], 'silence': True},\n     {'active': ['LT200', 'PT101', 'TT300'], 'silence': True},\n     {'active': ['LT200', 'PT101', 'TT300']}]],\n   [['off', False, False],\n    ['off', False, False],\n    ['off', False, False],\n    ['off', False, False],\n    ['red', True, True],\n    ['red', False, False],\n    ['amber', True, True],\n    ['red', False, False],\n    ['red', False, False],\n    ['red', False, False],\n    ['red', False, False],\n    ['red', False, False]]]]]\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-stack-light-horn-silence-rearm","generated_at":"2026-09-29T14:51:44.470158+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":"Any new activation cancels silence.","root_cause":"Nothing clears the silenced flag on a new activation.","sha256":"8df23a7084a59494442a775e671b63bbab58b32022defbd12e2f4d98c6326d1c","title":"Horn silence is not cancelled by a new alarm · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":42.707,"exit_code":1,"observations":[{"actual":[["amber",true,true],["amber",true,false],["red",true,true],["red",false,false],["amber",false,false],["off",false,false]],"check":"regression: escalation sequence","expected":[["amber",true,true],["amber",true,false],["red",true,true],["red",false,false],["amber",false,false],["off",false,false]],"passed":true},{"actual":[["red",true,true],["red",true,false],["red",true,false]],"check":"regression: silence then new low alarm","expected":[["red",true,true],["red",true,false],["red",true,true]],"passed":false},{"actual":[["red",true,true],["off",false,false],["amber",true,true]],"check":"control: alarm clears unacknowledged","expected":[["red",true,true],["off",false,false],["amber",true,true]],"passed":true},{"actual":[["red",false,false],["red",false,true],["red",false,false],["red",false,false]],"check":"control: low alarm while high acked","expected":[["red",false,false],["red",false,true],["red",false,false],["red",false,false]],"passed":true},{"actual":[["red",true,true],["red",true,true]],"check":"control: alarm present at first scan","expected":[["red",true,true],["red",true,true]],"passed":true},{"actual":[["amber",false,false],["amber",false,false],["red",false,false],["off",false,false],["red",true,false],["red",true,false],["red",true,false],["red",true,false],["red",false,false]],"check":"regression: scenario 1","expected":[["amber",false,false],["amber",false,false],["red",false,false],["off",false,false],["red",true,false],["red",true,true],["red",true,true],["red",true,true],["red",false,false]],"passed":false},{"actual":[["amber",true,false],["red",true,true],["amber",true,true],["red",true,true],["red",true,false],["red",true,false]],"check":"regression: scenario 2","expected":[["amber",true,false],["red",true,true],["amber",true,true],["red",true,true],["red",true,false],["red",true,false]],"passed":true},{"actual":[["off",false,false],["off",false,false],["red",true,true],["red",true,true],["red",true,false],["red",false,false]],"check":"control: scenario 3","expected":[["off",false,false],["off",false,false],["red",true,true],["red",true,true],["red",true,false],["red",false,false]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: escalation sequence\", \"actual\": [[\"amber\", true, true], [\"amber\", true, false], [\"red\", true, true], [\"red\", false, false], [\"amber\", false, false], [\"off\", false, false]], \"expected\": [[\"amber\", true, true], [\"amber\", true, false], [\"red\", true, true], [\"red\", false, false], [\"amber\", false, false], [\"off\", false, false]], \"passed\": true}, {\"check\": \"regression: silence then new low alarm\", \"actual\": [[\"red\", true, true], [\"red\", true, false], [\"red\", true, false]], \"expected\": [[\"red\", true, true], [\"red\", true, false], [\"red\", true, true]], \"passed\": false}, {\"check\": \"control: alarm clears unacknowledged\", \"actual\": [[\"red\", true, true], [\"off\", false, false], [\"amber\", true, true]], \"expected\": [[\"red\", true, true], [\"off\", false, false], [\"amber\", true, true]], \"passed\": true}, {\"check\": \"control: low alarm while high acked\", \"actual\": [[\"red\", false, false], [\"red\", false, true], [\"red\", false, false], [\"red\", false, false]], \"expected\": [[\"red\", false, false], [\"red\", false, true], [\"red\", false, false], [\"red\", false, false]], \"passed\": true}, {\"check\": \"control: alarm present at first scan\", \"actual\": [[\"red\", true, true], [\"red\", true, true]], \"expected\": [[\"red\", true, true], [\"red\", true, true]], \"passed\": true}, {\"check\": \"regression: scenario 1\", \"actual\": [[\"amber\", false, false], [\"amber\", false, false], [\"red\", false, false], [\"off\", false, false], [\"red\", true, false], [\"red\", true, false], [\"red\", true, false], [\"red\", true, false], [\"red\", false, false]], \"expected\": [[\"amber\", false, false], [\"amber\", false, false], [\"red\", false, false], [\"off\", false, false], [\"red\", true, false], [\"red\", true, true], [\"red\", true, true], [\"red\", true, true], [\"red\", false, false]], \"passed\": false}, {\"check\": \"regression: scenario 2\", \"actual\": [[\"amber\", true, false], [\"red\", true, true], [\"amber\", true, true], [\"red\", true, true], [\"red\", true, false], [\"red\", true, false]], \"expected\": [[\"amber\", true, false], [\"red\", true, true], [\"amber\", true, true], [\"red\", true, true], [\"red\", true, false], [\"red\", true, false]], \"passed\": true}, {\"check\": \"control: scenario 3\", \"actual\": [[\"off\", false, false], [\"off\", false, false], [\"red\", true, true], [\"red\", true, true], [\"red\", true, false], [\"red\", false, false]], \"expected\": [[\"off\", false, false], [\"off\", false, false], [\"red\", true, true], [\"red\", true, true], [\"red\", true, false], [\"red\", false, false]], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.734,"exit_code":1,"observations":[{"actual":[["amber",true,true],["amber",true,false],["red",true,false],["red",false,false],["amber",false,false],["off",false,false]],"check":"regression: escalation sequence","expected":[["amber",true,true],["amber",true,false],["red",true,true],["red",false,false],["amber",false,false],["off",false,false]],"passed":false},{"actual":[["red",true,true],["red",true,false],["red",true,false]],"check":"regression: silence then new low alarm","expected":[["red",true,true],["red",true,false],["red",true,true]],"passed":false},{"actual":[["red",true,true],["off",false,false],["amber",true,true]],"check":"control: alarm clears unacknowledged","expected":[["red",true,true],["off",false,false],["amber",true,true]],"passed":true},{"actual":[["red",false,false],["red",false,true],["red",false,false],["red",false,false]],"check":"control: low alarm while high acked","expected":[["red",false,false],["red",false,true],["red",false,false],["red",false,false]],"passed":true},{"actual":[["red",true,true],["red",true,true]],"check":"control: alarm present at first scan","expected":[["red",true,true],["red",true,true]],"passed":true},{"actual":[["amber",false,false],["amber",false,false],["red",false,false],["off",false,false],["red",true,false],["red",true,false],["red",true,false],["red",true,false],["red",false,false]],"check":"regression: scenario 1","expected":[["amber",false,false],["amber",false,false],["red",false,false],["off",false,false],["red",true,false],["red",true,true],["red",true,true],["red",true,true],["red",false,false]],"passed":false},{"actual":[["amber",true,false],["red",true,false],["amber",true,false],["red",true,false],["red",true,false],["red",true,false]],"check":"regression: scenario 2","expected":[["amber",true,false],["red",true,true],["amber",true,true],["red",true,true],["red",true,false],["red",true,false]],"passed":false},{"actual":[["off",false,false],["off",false,false],["red",true,true],["red",true,true],["red",true,false],["red",false,false]],"check":"control: scenario 3","expected":[["off",false,false],["off",false,false],["red",true,true],["red",true,true],["red",true,false],["red",false,false]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: escalation sequence\", \"actual\": [[\"amber\", true, true], [\"amber\", true, false], [\"red\", true, false], [\"red\", false, false], [\"amber\", false, false], [\"off\", false, false]], \"expected\": [[\"amber\", true, true], [\"amber\", true, false], [\"red\", true, true], [\"red\", false, false], [\"amber\", false, false], [\"off\", false, false]], \"passed\": false}, {\"check\": \"regression: silence then new low alarm\", \"actual\": [[\"red\", true, true], [\"red\", true, false], [\"red\", true, false]], \"expected\": [[\"red\", true, true], [\"red\", true, false], [\"red\", true, true]], \"passed\": false}, {\"check\": \"control: alarm clears unacknowledged\", \"actual\": [[\"red\", true, true], [\"off\", false, false], [\"amber\", true, true]], \"expected\": [[\"red\", true, true], [\"off\", false, false], [\"amber\", true, true]], \"passed\": true}, {\"check\": \"control: low alarm while high acked\", \"actual\": [[\"red\", false, false], [\"red\", false, true], [\"red\", false, false], [\"red\", false, false]], \"expected\": [[\"red\", false, false], [\"red\", false, true], [\"red\", false, false], [\"red\", false, false]], \"passed\": true}, {\"check\": \"control: alarm present at first scan\", \"actual\": [[\"red\", true, true], [\"red\", true, true]], \"expected\": [[\"red\", true, true], [\"red\", true, true]], \"passed\": true}, {\"check\": \"regression: scenario 1\", \"actual\": [[\"amber\", false, false], [\"amber\", false, false], [\"red\", false, false], [\"off\", false, false], [\"red\", true, false], [\"red\", true, false], [\"red\", true, false], [\"red\", true, false], [\"red\", false, false]], \"expected\": [[\"amber\", false, false], [\"amber\", false, false], [\"red\", false, false], [\"off\", false, false], [\"red\", true, false], [\"red\", true, true], [\"red\", true, true], [\"red\", true, true], [\"red\", false, false]], \"passed\": false}, {\"check\": \"regression: scenario 2\", \"actual\": [[\"amber\", true, false], [\"red\", true, false], [\"amber\", true, false], [\"red\", true, false], [\"red\", true, false], [\"red\", true, false]], \"expected\": [[\"amber\", true, false], [\"red\", true, true], [\"amber\", true, true], [\"red\", true, true], [\"red\", true, false], [\"red\", true, false]], \"passed\": false}, {\"check\": \"control: scenario 3\", \"actual\": [[\"off\", false, false], [\"off\", false, false], [\"red\", true, true], [\"red\", true, true], [\"red\", true, false], [\"red\", false, false]], \"expected\": [[\"off\", false, false], [\"off\", false, false], [\"red\", true, true], [\"red\", true, true], [\"red\", true, false], [\"red\", false, false]], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":42.548,"exit_code":0,"observations":[{"actual":[["amber",true,true],["amber",true,false],["red",true,true],["red",false,false],["amber",false,false],["off",false,false]],"check":"regression: escalation sequence","expected":[["amber",true,true],["amber",true,false],["red",true,true],["red",false,false],["amber",false,false],["off",false,false]],"passed":true},{"actual":[["red",true,true],["red",true,false],["red",true,true]],"check":"regression: silence then new low alarm","expected":[["red",true,true],["red",true,false],["red",true,true]],"passed":true},{"actual":[["red",true,true],["off",false,false],["amber",true,true]],"check":"control: alarm clears unacknowledged","expected":[["red",true,true],["off",false,false],["amber",true,true]],"passed":true},{"actual":[["red",false,false],["red",false,true],["red",false,false],["red",false,false]],"check":"control: low alarm while high acked","expected":[["red",false,false],["red",false,true],["red",false,false],["red",false,false]],"passed":true},{"actual":[["red",true,true],["red",true,true]],"check":"control: alarm present at first scan","expected":[["red",true,true],["red",true,true]],"passed":true},{"actual":[["amber",false,false],["amber",false,false],["red",false,false],["off",false,false],["red",true,false],["red",true,true],["red",true,true],["red",true,true],["red",false,false]],"check":"regression: scenario 1","expected":[["amber",false,false],["amber",false,false],["red",false,false],["off",false,false],["red",true,false],["red",true,true],["red",true,true],["red",true,true],["red",false,false]],"passed":true},{"actual":[["amber",true,false],["red",true,true],["amber",true,true],["red",true,true],["red",true,false],["red",true,false]],"check":"regression: scenario 2","expected":[["amber",true,false],["red",true,true],["amber",true,true],["red",true,true],["red",true,false],["red",true,false]],"passed":true},{"actual":[["off",false,false],["off",false,false],["red",true,true],["red",true,true],["red",true,false],["red",false,false]],"check":"control: scenario 3","expected":[["off",false,false],["off",false,false],["red",true,true],["red",true,true],["red",true,false],["red",false,false]],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: escalation sequence\", \"actual\": [[\"amber\", true, true], [\"amber\", true, false], [\"red\", true, true], [\"red\", false, false], [\"amber\", false, false], [\"off\", false, false]], \"expected\": [[\"amber\", true, true], [\"amber\", true, false], [\"red\", true, true], [\"red\", false, false], [\"amber\", false, false], [\"off\", false, false]], \"passed\": true}, {\"check\": \"regression: silence then new low alarm\", \"actual\": [[\"red\", true, true], [\"red\", true, false], [\"red\", true, true]], \"expected\": [[\"red\", true, true], [\"red\", true, false], [\"red\", true, true]], \"passed\": true}, {\"check\": \"control: alarm clears unacknowledged\", \"actual\": [[\"red\", true, true], [\"off\", false, false], [\"amber\", true, true]], \"expected\": [[\"red\", true, true], [\"off\", false, false], [\"amber\", true, true]], \"passed\": true}, {\"check\": \"control: low alarm while high acked\", \"actual\": [[\"red\", false, false], [\"red\", false, true], [\"red\", false, false], [\"red\", false, false]], \"expected\": [[\"red\", false, false], [\"red\", false, true], [\"red\", false, false], [\"red\", false, false]], \"passed\": true}, {\"check\": \"control: alarm present at first scan\", \"actual\": [[\"red\", true, true], [\"red\", true, true]], \"expected\": [[\"red\", true, true], [\"red\", true, true]], \"passed\": true}, {\"check\": \"regression: scenario 1\", \"actual\": [[\"amber\", false, false], [\"amber\", false, false], [\"red\", false, false], [\"off\", false, false], [\"red\", true, false], [\"red\", true, true], [\"red\", true, true], [\"red\", true, true], [\"red\", false, false]], \"expected\": [[\"amber\", false, false], [\"amber\", false, false], [\"red\", false, false], [\"off\", false, false], [\"red\", true, false], [\"red\", true, true], [\"red\", true, true], [\"red\", true, true], [\"red\", false, false]], \"passed\": true}, {\"check\": \"regression: scenario 2\", \"actual\": [[\"amber\", true, false], [\"red\", true, true], [\"amber\", true, true], [\"red\", true, true], [\"red\", true, false], [\"red\", true, false]], \"expected\": [[\"amber\", true, false], [\"red\", true, true], [\"amber\", true, true], [\"red\", true, true], [\"red\", true, false], [\"red\", true, false]], \"passed\": true}, {\"check\": \"control: scenario 3\", \"actual\": [[\"off\", false, false], [\"off\", false, false], [\"red\", true, true], [\"red\", true, true], [\"red\", true, false], [\"red\", false, false]], \"expected\": [[\"off\", false, false], [\"off\", false, false], [\"red\", true, true], [\"red\", true, true], [\"red\", true, false], [\"red\", false, false]], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}