{"abstract":"The unit defrosts on schedule in dry mild weather even though the coil never got cold enough to frost.","category":"HVAC thermostat control","checks":8,"contract":"Heat pump time-temperature defrost sampled per minute (degrees F); samples are [compressor_running, coil_temp, outdoor_temp]. Compressor run minutes accumulate only while coil <= 32. When the accumulation reaches interval and outdoor <= 50, defrost starts that minute and the accumulation resets; otherwise the accumulation keeps growing. Defrost ends on the first later minute with coil >= 57 or when it has lasted max_minutes minutes; that minute reports normal operation. Return heat, off or defrost per minute.","evaluation_group":"w2-hvac-thermostat-control-demand-defrost","failed_approach":"Excluding exactly 32 F misses runtime at the freezing point.","family":"w2-hvac-thermostat-control-demand-defrost-frost-accumulation","id":"FA-92436","implementations":{"attempt":{"sha256":"293fed9d02957e516ec1c20a242f299b597043f3f7c030991ae6a4f8966f9faf","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(interval, max_minutes, samples):\n    acc = 0\n    defrost_min = None\n    out = []\n    for running, coil, outdoor in samples:\n        if defrost_min is not None:\n            defrost_min += 1\n            if coil >= 57 or defrost_min >= max_minutes:\n                defrost_min = None\n                out.append('heat' if running else 'off')\n            else:\n                out.append('defrost')\n            continue\n        if running and coil < 32:\n            acc += 1\n        if acc >= interval and outdoor <= 50:\n            acc = 0\n            defrost_min = 0\n            out.append('defrost')\n            continue\n        out.append('heat' if running else 'off')\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: dry coil runtime',\n   [2, 3, [[True, 40, 20], [True, 33, 20], [True, 32, 20], [True, 31, 20], [True, 50, 20]]],\n   ['heat', 'heat', 'heat', 'defrost', 'defrost']],\n  ['regression: two defrosts',\n   [3,\n    4,\n    [[True, 30, 20],\n     [True, 30, 20],\n     [False, 30, 20],\n     [True, 32, 20],\n     [True, 40, 20],\n     [True, 45, 20],\n     [True, 57, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20]]],\n   ['heat',\n    'heat',\n    'off',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat']],\n  ['control: warm outdoor inhibits',\n   [2, 3, [[True, 30, 55], [True, 30, 55], [True, 30, 50], [True, 60, 50], [True, 30, 50]]],\n   ['heat', 'heat', 'defrost', 'heat', 'heat']],\n  ['control: exact termination temperature',\n   [1, 5, [[True, 30, 20], [True, 56, 20], [True, 57, 20], [False, 30, 20], [True, 30, 20]]],\n   ['defrost', 'defrost', 'heat', 'off', 'defrost']],\n  ['regression: scenario 1',\n   [3,\n    3,\n    [[True, 40, 35],\n     [True, 40, 50],\n     [True, 40, 51],\n     [True, 40, 51],\n     [True, 40, 50],\n     [True, 40, 50],\n     [False, 20, 35],\n     [False, 20, 51],\n     [True, 20, 50],\n     [True, 50, 20],\n     [True, 50, 50],\n     [True, 56, 50],\n     [True, 40, 50],\n     [True, 40, 50],\n     [False, 40, 51],\n     [True, 40, 50],\n     [False, 20, 51],\n     [False, 20, 60],\n     [True, 57, 51],\n     [False, 57, 51]]],\n   ['heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'off',\n    'off',\n    'heat',\n    'off']],\n  ['regression: scenario 2',\n   [4,\n    3,\n    [[True, 33, 60],\n     [False, 57, 20],\n     [True, 57, 50],\n     [True, 60, 20],\n     [True, 60, 35],\n     [True, 60, 50],\n     [True, 28, 50],\n     [True, 28, 20],\n     [True, 28, 20],\n     [False, 28, 50],\n     [True, 28, 51],\n     [True, 28, 35],\n     [True, 28, 60],\n     [True, 28, 50],\n     [True, 40, 50],\n     [True, 40, 50],\n     [False, 40, 60]]],\n   ['heat',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'off']],\n  ['control: scenario 3',\n   [5,\n    3,\n    [[True, 20, 20],\n     [True, 20, 50],\n     [True, 20, 50],\n     [True, 20, 50],\n     [True, 20, 35],\n     [True, 40, 50],\n     [False, 40, 20],\n     [True, 40, 50],\n     [True, 40, 50],\n     [True, 33, 60],\n     [False, 33, 60],\n     [True, 60, 50]]],\n   ['heat', 'heat', 'heat', 'heat', 'defrost', 'defrost', 'defrost', 'heat', 'heat', 'heat', 'off', 'heat']],\n  ['regression: scenario 4',\n   [3,\n    4,\n    [[True, 20, 50],\n     [True, 20, 35],\n     [True, 20, 60],\n     [True, 20, 50],\n     [False, 20, 50],\n     [True, 20, 35],\n     [True, 20, 60],\n     [True, 20, 51],\n     [False, 20, 20],\n     [True, 50, 50],\n     [True, 50, 50],\n     [False, 50, 50],\n     [True, 50, 35],\n     [False, 33, 60],\n     [True, 33, 60],\n     [True, 33, 50],\n     [True, 20, 35],\n     [True, 20, 35],\n     [True, 20, 50],\n     [True, 50, 20]]],\n   ['heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost']]],\n [['regression: scenario 1',\n   [3,\n    3,\n    [[True, 28, 20],\n     [True, 28, 50],\n     [True, 32, 50],\n     [False, 32, 35],\n     [True, 60, 20],\n     [True, 60, 35],\n     [True, 60, 50],\n     [True, 60, 50],\n     [True, 57, 50],\n     [True, 57, 50],\n     [True, 60, 60],\n     [False, 60, 50],\n     [True, 60, 35],\n     [True, 33, 50]]],\n   ['heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'heat']],\n  ['regression: dry coil runtime',\n   [2, 3, [[True, 40, 20], [True, 33, 20], [True, 32, 20], [True, 31, 20], [True, 50, 20]]],\n   ['heat', 'heat', 'heat', 'defrost', 'defrost']],\n  ['regression: two defrosts',\n   [3,\n    4,\n    [[True, 30, 20],\n     [True, 30, 20],\n     [False, 30, 20],\n     [True, 32, 20],\n     [True, 40, 20],\n     [True, 45, 20],\n     [True, 57, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20]]],\n   ['heat',\n    'heat',\n    'off',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat']],\n  ['control: warm outdoor inhibits',\n   [2, 3, [[True, 30, 55], [True, 30, 55], [True, 30, 50], [True, 60, 50], [True, 30, 50]]],\n   ['heat', 'heat', 'defrost', 'heat', 'heat']],\n  ['control: exact termination temperature',\n   [1, 5, [[True, 30, 20], [True, 56, 20], [True, 57, 20], [False, 30, 20], [True, 30, 20]]],\n   ['defrost', 'defrost', 'heat', 'off', 'defrost']],\n  ['regression: scenario 2',\n   [4,\n    4,\n    [[True, 40, 50],\n     [True, 40, 35],\n     [True, 40, 60],\n     [False, 56, 60],\n     [True, 56, 35],\n     [True, 50, 50],\n     [True, 32, 35],\n     [True, 32, 51],\n     [True, 32, 20],\n     [True, 32, 51],\n     [True, 32, 60],\n     [True, 57, 35],\n     [True, 32, 50],\n     [True, 32, 35],\n     [True, 20, 35],\n     [True, 50, 35],\n     [True, 57, 35],\n     [True, 57, 51],\n     [False, 57, 50]]],\n   ['heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'off']],\n  ['regression: scenario 3',\n   [3,\n    6,\n    [[False, 56, 51],\n     [True, 56, 35],\n     [False, 56, 35],\n     [True, 56, 35],\n     [True, 56, 35],\n     [True, 33, 50],\n     [True, 33, 20],\n     [True, 33, 50],\n     [False, 33, 60],\n     [True, 33, 35],\n     [True, 33, 35],\n     [True, 33, 50],\n     [True, 33, 60],\n     [True, 33, 35],\n     [True, 33, 35],\n     [True, 20, 50],\n     [True, 20, 51]]],\n   ['off',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat']],\n  ['regression: scenario 4',\n   [4,\n    4,\n    [[False, 40, 50],\n     [True, 40, 50],\n     [True, 40, 35],\n     [True, 40, 50],\n     [True, 40, 50],\n     [True, 28, 50],\n     [True, 28, 50],\n     [False, 28, 60],\n     [False, 28, 20],\n     [True, 28, 60],\n     [True, 28, 50],\n     [False, 28, 60],\n     [True, 28, 50],\n     [True, 28, 35],\n     [False, 28, 50],\n     [True, 28, 20],\n     [True, 28, 51],\n     [True, 33, 20]]],\n   ['off',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'off',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'off',\n    'heat',\n    'heat',\n    'heat']]],\n [['regression: scenario 2',\n   [4,\n    3,\n    [[True, 32, 20],\n     [True, 57, 60],\n     [True, 57, 60],\n     [True, 57, 20],\n     [False, 40, 51],\n     [True, 50, 50],\n     [True, 50, 51],\n     [True, 50, 50],\n     [True, 56, 60],\n     [True, 40, 20],\n     [False, 40, 35],\n     [True, 50, 35],\n     [False, 50, 51],\n     [False, 50, 35],\n     [True, 57, 35],\n     [True, 57, 20],\n     [True, 57, 20],\n     [True, 57, 50],\n     [True, 57, 60]]],\n   ['heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'off',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat']],\n  ['regression: scenario 3',\n   [3,\n    6,\n    [[True, 20, 60],\n     [True, 33, 20],\n     [True, 33, 60],\n     [True, 33, 51],\n     [True, 33, 35],\n     [True, 32, 50],\n     [True, 32, 35],\n     [True, 32, 35],\n     [True, 32, 60],\n     [True, 32, 60],\n     [False, 32, 60],\n     [True, 32, 35],\n     [False, 32, 50],\n     [True, 40, 50]]],\n   ['heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'off',\n    'heat']],\n  ['regression: two defrosts',\n   [3,\n    4,\n    [[True, 30, 20],\n     [True, 30, 20],\n     [False, 30, 20],\n     [True, 32, 20],\n     [True, 40, 20],\n     [True, 45, 20],\n     [True, 57, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20]]],\n   ['heat',\n    'heat',\n    'off',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat']],\n  ['control: warm outdoor inhibits',\n   [2, 3, [[True, 30, 55], [True, 30, 55], [True, 30, 50], [True, 60, 50], [True, 30, 50]]],\n   ['heat', 'heat', 'defrost', 'heat', 'heat']],\n  ['regression: dry coil runtime',\n   [2, 3, [[True, 40, 20], [True, 33, 20], [True, 32, 20], [True, 31, 20], [True, 50, 20]]],\n   ['heat', 'heat', 'heat', 'defrost', 'defrost']],\n  ['control: exact termination temperature',\n   [1, 5, [[True, 30, 20], [True, 56, 20], [True, 57, 20], [False, 30, 20], [True, 30, 20]]],\n   ['defrost', 'defrost', 'heat', 'off', 'defrost']],\n  ['regression: scenario 1',\n   [4,\n    6,\n    [[True, 33, 20],\n     [True, 28, 50],\n     [True, 56, 51],\n     [True, 33, 51],\n     [True, 28, 35],\n     [False, 28, 50],\n     [True, 28, 60],\n     [True, 28, 20],\n     [True, 40, 50],\n     [True, 40, 35],\n     [True, 40, 51],\n     [True, 40, 50],\n     [True, 28, 60],\n     [True, 28, 50],\n     [True, 50, 35],\n     [True, 60, 50],\n     [True, 57, 20],\n     [True, 40, 50]]],\n   ['heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat']],\n  ['regression: scenario 4',\n   [3,\n    3,\n    [[True, 28, 51],\n     [True, 28, 35],\n     [True, 56, 50],\n     [False, 56, 51],\n     [True, 56, 50],\n     [True, 56, 20],\n     [False, 40, 50],\n     [True, 40, 20],\n     [False, 60, 20],\n     [True, 50, 50],\n     [True, 56, 35],\n     [True, 56, 35],\n     [True, 56, 51],\n     [True, 32, 60],\n     [True, 32, 60],\n     [True, 32, 35],\n     [True, 32, 60],\n     [True, 32, 20],\n     [True, 32, 50],\n     [True, 32, 60],\n     [True, 32, 51],\n     [True, 40, 20],\n     [True, 40, 20],\n     [True, 40, 20]]],\n   ['heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat']]],\n [['regression: scenario 4',\n   [4,\n    6,\n    [[True, 28, 50],\n     [True, 28, 35],\n     [True, 28, 50],\n     [True, 50, 35],\n     [True, 40, 50],\n     [True, 40, 51],\n     [False, 40, 35],\n     [True, 20, 50],\n     [True, 20, 35],\n     [True, 28, 50],\n     [True, 32, 51],\n     [True, 32, 51],\n     [True, 28, 51],\n     [False, 28, 50]]],\n   ['heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'off']],\n  ['regression: scenario 13',\n   [4,\n    4,\n    [[True, 20, 51],\n     [True, 20, 50],\n     [True, 32, 20],\n     [True, 56, 35],\n     [True, 56, 50],\n     [True, 56, 51],\n     [True, 56, 50],\n     [True, 56, 20],\n     [True, 32, 20],\n     [True, 32, 51],\n     [True, 32, 60],\n     [True, 33, 51],\n     [True, 28, 60],\n     [True, 28, 50],\n     [True, 28, 50],\n     [True, 28, 51],\n     [True, 28, 50],\n     [True, 28, 51]]],\n   ['heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost']],\n  ['regression: two defrosts',\n   [3,\n    4,\n    [[True, 30, 20],\n     [True, 30, 20],\n     [False, 30, 20],\n     [True, 32, 20],\n     [True, 40, 20],\n     [True, 45, 20],\n     [True, 57, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20]]],\n   ['heat',\n    'heat',\n    'off',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat']],\n  ['control: warm outdoor inhibits',\n   [2, 3, [[True, 30, 55], [True, 30, 55], [True, 30, 50], [True, 60, 50], [True, 30, 50]]],\n   ['heat', 'heat', 'defrost', 'heat', 'heat']],\n  ['regression: dry coil runtime',\n   [2, 3, [[True, 40, 20], [True, 33, 20], [True, 32, 20], [True, 31, 20], [True, 50, 20]]],\n   ['heat', 'heat', 'heat', 'defrost', 'defrost']],\n  ['control: exact termination temperature',\n   [1, 5, [[True, 30, 20], [True, 56, 20], [True, 57, 20], [False, 30, 20], [True, 30, 20]]],\n   ['defrost', 'defrost', 'heat', 'off', 'defrost']],\n  ['regression: scenario 1',\n   [5,\n    4,\n    [[True, 57, 60],\n     [True, 57, 50],\n     [True, 57, 50],\n     [True, 57, 35],\n     [True, 33, 50],\n     [True, 33, 50],\n     [True, 32, 50],\n     [True, 50, 51],\n     [True, 50, 51],\n     [False, 50, 20],\n     [False, 33, 50],\n     [True, 56, 20],\n     [True, 32, 60],\n     [True, 32, 35],\n     [True, 32, 20]]],\n   ['heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat']],\n  ['regression: scenario 2',\n   [4,\n    6,\n    [[False, 28, 50],\n     [True, 28, 51],\n     [True, 28, 35],\n     [True, 28, 50],\n     [True, 57, 50],\n     [True, 57, 20],\n     [True, 57, 50],\n     [True, 57, 50],\n     [True, 56, 50],\n     [True, 56, 35],\n     [True, 56, 51],\n     [True, 56, 50]]],\n   ['off', 'heat', 'heat', 'heat', 'heat', 'heat', 'heat', 'heat', 'heat', 'heat', 'heat', 'heat']]],\n [['regression: scenario 4',\n   [5,\n    4,\n    [[True, 28, 50],\n     [True, 28, 35],\n     [True, 28, 50],\n     [True, 57, 51],\n     [True, 57, 50],\n     [True, 57, 20],\n     [True, 57, 35],\n     [True, 57, 20],\n     [True, 57, 35],\n     [True, 56, 20],\n     [False, 56, 20],\n     [True, 33, 35],\n     [True, 33, 60],\n     [True, 33, 50],\n     [True, 20, 50]]],\n   ['heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat']],\n  ['regression: scenario 6',\n   [4,\n    4,\n    [[True, 40, 51],\n     [True, 40, 20],\n     [False, 40, 35],\n     [True, 28, 51],\n     [True, 28, 20],\n     [True, 28, 60],\n     [False, 28, 51],\n     [False, 28, 51],\n     [False, 32, 60],\n     [True, 32, 35],\n     [True, 20, 51],\n     [True, 20, 35],\n     [True, 20, 50],\n     [True, 20, 20],\n     [False, 20, 35]]],\n   ['heat',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'off',\n    'off',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'off']],\n  ['regression: two defrosts',\n   [3,\n    4,\n    [[True, 30, 20],\n     [True, 30, 20],\n     [False, 30, 20],\n     [True, 32, 20],\n     [True, 40, 20],\n     [True, 45, 20],\n     [True, 57, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20]]],\n   ['heat',\n    'heat',\n    'off',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat']],\n  ['control: warm outdoor inhibits',\n   [2, 3, [[True, 30, 55], [True, 30, 55], [True, 30, 50], [True, 60, 50], [True, 30, 50]]],\n   ['heat', 'heat', 'defrost', 'heat', 'heat']],\n  ['regression: dry coil runtime',\n   [2, 3, [[True, 40, 20], [True, 33, 20], [True, 32, 20], [True, 31, 20], [True, 50, 20]]],\n   ['heat', 'heat', 'heat', 'defrost', 'defrost']],\n  ['control: exact termination temperature',\n   [1, 5, [[True, 30, 20], [True, 56, 20], [True, 57, 20], [False, 30, 20], [True, 30, 20]]],\n   ['defrost', 'defrost', 'heat', 'off', 'defrost']],\n  ['regression: scenario 1',\n   [4,\n    6,\n    [[True, 32, 50],\n     [True, 50, 50],\n     [True, 50, 35],\n     [True, 57, 51],\n     [True, 57, 20],\n     [False, 57, 51],\n     [True, 57, 50],\n     [True, 57, 51],\n     [True, 32, 50],\n     [True, 32, 51],\n     [True, 32, 50],\n     [False, 28, 50]]],\n   ['heat', 'heat', 'heat', 'heat', 'heat', 'off', 'heat', 'heat', 'heat', 'heat', 'defrost', 'defrost']],\n  ['regression: scenario 2',\n   [3,\n    4,\n    [[True, 32, 35],\n     [True, 32, 35],\n     [True, 33, 60],\n     [True, 33, 50],\n     [True, 33, 60],\n     [True, 57, 51],\n     [True, 20, 60],\n     [True, 20, 50],\n     [True, 33, 50],\n     [False, 33, 51],\n     [False, 33, 20],\n     [True, 33, 20],\n     [True, 40, 50],\n     [True, 40, 50],\n     [True, 40, 35],\n     [True, 40, 35],\n     [True, 40, 51],\n     [True, 28, 35],\n     [True, 28, 51],\n     [True, 33, 60],\n     [False, 33, 60],\n     [True, 56, 51],\n     [True, 56, 60],\n     [False, 56, 60]]],\n   ['heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'off']]]]\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":"9eb34145555ed01e2e30c2625d6d5c903e6b27c0f4badfc7b41c28d93c7354b2","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(interval, max_minutes, samples):\n    acc = 0\n    defrost_min = None\n    out = []\n    for running, coil, outdoor in samples:\n        if defrost_min is not None:\n            defrost_min += 1\n            if coil >= 57 or defrost_min >= max_minutes:\n                defrost_min = None\n                out.append('heat' if running else 'off')\n            else:\n                out.append('defrost')\n            continue\n        if running:\n            acc += 1\n        if acc >= interval and outdoor <= 50:\n            acc = 0\n            defrost_min = 0\n            out.append('defrost')\n            continue\n        out.append('heat' if running else 'off')\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: dry coil runtime',\n   [2, 3, [[True, 40, 20], [True, 33, 20], [True, 32, 20], [True, 31, 20], [True, 50, 20]]],\n   ['heat', 'heat', 'heat', 'defrost', 'defrost']],\n  ['regression: two defrosts',\n   [3,\n    4,\n    [[True, 30, 20],\n     [True, 30, 20],\n     [False, 30, 20],\n     [True, 32, 20],\n     [True, 40, 20],\n     [True, 45, 20],\n     [True, 57, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20]]],\n   ['heat',\n    'heat',\n    'off',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat']],\n  ['control: warm outdoor inhibits',\n   [2, 3, [[True, 30, 55], [True, 30, 55], [True, 30, 50], [True, 60, 50], [True, 30, 50]]],\n   ['heat', 'heat', 'defrost', 'heat', 'heat']],\n  ['control: exact termination temperature',\n   [1, 5, [[True, 30, 20], [True, 56, 20], [True, 57, 20], [False, 30, 20], [True, 30, 20]]],\n   ['defrost', 'defrost', 'heat', 'off', 'defrost']],\n  ['regression: scenario 1',\n   [3,\n    3,\n    [[True, 40, 35],\n     [True, 40, 50],\n     [True, 40, 51],\n     [True, 40, 51],\n     [True, 40, 50],\n     [True, 40, 50],\n     [False, 20, 35],\n     [False, 20, 51],\n     [True, 20, 50],\n     [True, 50, 20],\n     [True, 50, 50],\n     [True, 56, 50],\n     [True, 40, 50],\n     [True, 40, 50],\n     [False, 40, 51],\n     [True, 40, 50],\n     [False, 20, 51],\n     [False, 20, 60],\n     [True, 57, 51],\n     [False, 57, 51]]],\n   ['heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'off',\n    'off',\n    'heat',\n    'off']],\n  ['regression: scenario 2',\n   [4,\n    3,\n    [[True, 33, 60],\n     [False, 57, 20],\n     [True, 57, 50],\n     [True, 60, 20],\n     [True, 60, 35],\n     [True, 60, 50],\n     [True, 28, 50],\n     [True, 28, 20],\n     [True, 28, 20],\n     [False, 28, 50],\n     [True, 28, 51],\n     [True, 28, 35],\n     [True, 28, 60],\n     [True, 28, 50],\n     [True, 40, 50],\n     [True, 40, 50],\n     [False, 40, 60]]],\n   ['heat',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'off']],\n  ['control: scenario 3',\n   [5,\n    3,\n    [[True, 20, 20],\n     [True, 20, 50],\n     [True, 20, 50],\n     [True, 20, 50],\n     [True, 20, 35],\n     [True, 40, 50],\n     [False, 40, 20],\n     [True, 40, 50],\n     [True, 40, 50],\n     [True, 33, 60],\n     [False, 33, 60],\n     [True, 60, 50]]],\n   ['heat', 'heat', 'heat', 'heat', 'defrost', 'defrost', 'defrost', 'heat', 'heat', 'heat', 'off', 'heat']],\n  ['regression: scenario 4',\n   [3,\n    4,\n    [[True, 20, 50],\n     [True, 20, 35],\n     [True, 20, 60],\n     [True, 20, 50],\n     [False, 20, 50],\n     [True, 20, 35],\n     [True, 20, 60],\n     [True, 20, 51],\n     [False, 20, 20],\n     [True, 50, 50],\n     [True, 50, 50],\n     [False, 50, 50],\n     [True, 50, 35],\n     [False, 33, 60],\n     [True, 33, 60],\n     [True, 33, 50],\n     [True, 20, 35],\n     [True, 20, 35],\n     [True, 20, 50],\n     [True, 50, 20]]],\n   ['heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost']]],\n [['regression: scenario 1',\n   [3,\n    3,\n    [[True, 28, 20],\n     [True, 28, 50],\n     [True, 32, 50],\n     [False, 32, 35],\n     [True, 60, 20],\n     [True, 60, 35],\n     [True, 60, 50],\n     [True, 60, 50],\n     [True, 57, 50],\n     [True, 57, 50],\n     [True, 60, 60],\n     [False, 60, 50],\n     [True, 60, 35],\n     [True, 33, 50]]],\n   ['heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'heat']],\n  ['regression: dry coil runtime',\n   [2, 3, [[True, 40, 20], [True, 33, 20], [True, 32, 20], [True, 31, 20], [True, 50, 20]]],\n   ['heat', 'heat', 'heat', 'defrost', 'defrost']],\n  ['regression: two defrosts',\n   [3,\n    4,\n    [[True, 30, 20],\n     [True, 30, 20],\n     [False, 30, 20],\n     [True, 32, 20],\n     [True, 40, 20],\n     [True, 45, 20],\n     [True, 57, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20]]],\n   ['heat',\n    'heat',\n    'off',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat']],\n  ['control: warm outdoor inhibits',\n   [2, 3, [[True, 30, 55], [True, 30, 55], [True, 30, 50], [True, 60, 50], [True, 30, 50]]],\n   ['heat', 'heat', 'defrost', 'heat', 'heat']],\n  ['control: exact termination temperature',\n   [1, 5, [[True, 30, 20], [True, 56, 20], [True, 57, 20], [False, 30, 20], [True, 30, 20]]],\n   ['defrost', 'defrost', 'heat', 'off', 'defrost']],\n  ['regression: scenario 2',\n   [4,\n    4,\n    [[True, 40, 50],\n     [True, 40, 35],\n     [True, 40, 60],\n     [False, 56, 60],\n     [True, 56, 35],\n     [True, 50, 50],\n     [True, 32, 35],\n     [True, 32, 51],\n     [True, 32, 20],\n     [True, 32, 51],\n     [True, 32, 60],\n     [True, 57, 35],\n     [True, 32, 50],\n     [True, 32, 35],\n     [True, 20, 35],\n     [True, 50, 35],\n     [True, 57, 35],\n     [True, 57, 51],\n     [False, 57, 50]]],\n   ['heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'off']],\n  ['regression: scenario 3',\n   [3,\n    6,\n    [[False, 56, 51],\n     [True, 56, 35],\n     [False, 56, 35],\n     [True, 56, 35],\n     [True, 56, 35],\n     [True, 33, 50],\n     [True, 33, 20],\n     [True, 33, 50],\n     [False, 33, 60],\n     [True, 33, 35],\n     [True, 33, 35],\n     [True, 33, 50],\n     [True, 33, 60],\n     [True, 33, 35],\n     [True, 33, 35],\n     [True, 20, 50],\n     [True, 20, 51]]],\n   ['off',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat']],\n  ['regression: scenario 4',\n   [4,\n    4,\n    [[False, 40, 50],\n     [True, 40, 50],\n     [True, 40, 35],\n     [True, 40, 50],\n     [True, 40, 50],\n     [True, 28, 50],\n     [True, 28, 50],\n     [False, 28, 60],\n     [False, 28, 20],\n     [True, 28, 60],\n     [True, 28, 50],\n     [False, 28, 60],\n     [True, 28, 50],\n     [True, 28, 35],\n     [False, 28, 50],\n     [True, 28, 20],\n     [True, 28, 51],\n     [True, 33, 20]]],\n   ['off',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'off',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'off',\n    'heat',\n    'heat',\n    'heat']]],\n [['regression: scenario 2',\n   [4,\n    3,\n    [[True, 32, 20],\n     [True, 57, 60],\n     [True, 57, 60],\n     [True, 57, 20],\n     [False, 40, 51],\n     [True, 50, 50],\n     [True, 50, 51],\n     [True, 50, 50],\n     [True, 56, 60],\n     [True, 40, 20],\n     [False, 40, 35],\n     [True, 50, 35],\n     [False, 50, 51],\n     [False, 50, 35],\n     [True, 57, 35],\n     [True, 57, 20],\n     [True, 57, 20],\n     [True, 57, 50],\n     [True, 57, 60]]],\n   ['heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'off',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat']],\n  ['regression: scenario 3',\n   [3,\n    6,\n    [[True, 20, 60],\n     [True, 33, 20],\n     [True, 33, 60],\n     [True, 33, 51],\n     [True, 33, 35],\n     [True, 32, 50],\n     [True, 32, 35],\n     [True, 32, 35],\n     [True, 32, 60],\n     [True, 32, 60],\n     [False, 32, 60],\n     [True, 32, 35],\n     [False, 32, 50],\n     [True, 40, 50]]],\n   ['heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'off',\n    'heat']],\n  ['regression: two defrosts',\n   [3,\n    4,\n    [[True, 30, 20],\n     [True, 30, 20],\n     [False, 30, 20],\n     [True, 32, 20],\n     [True, 40, 20],\n     [True, 45, 20],\n     [True, 57, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20]]],\n   ['heat',\n    'heat',\n    'off',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat']],\n  ['control: warm outdoor inhibits',\n   [2, 3, [[True, 30, 55], [True, 30, 55], [True, 30, 50], [True, 60, 50], [True, 30, 50]]],\n   ['heat', 'heat', 'defrost', 'heat', 'heat']],\n  ['regression: dry coil runtime',\n   [2, 3, [[True, 40, 20], [True, 33, 20], [True, 32, 20], [True, 31, 20], [True, 50, 20]]],\n   ['heat', 'heat', 'heat', 'defrost', 'defrost']],\n  ['control: exact termination temperature',\n   [1, 5, [[True, 30, 20], [True, 56, 20], [True, 57, 20], [False, 30, 20], [True, 30, 20]]],\n   ['defrost', 'defrost', 'heat', 'off', 'defrost']],\n  ['regression: scenario 1',\n   [4,\n    6,\n    [[True, 33, 20],\n     [True, 28, 50],\n     [True, 56, 51],\n     [True, 33, 51],\n     [True, 28, 35],\n     [False, 28, 50],\n     [True, 28, 60],\n     [True, 28, 20],\n     [True, 40, 50],\n     [True, 40, 35],\n     [True, 40, 51],\n     [True, 40, 50],\n     [True, 28, 60],\n     [True, 28, 50],\n     [True, 50, 35],\n     [True, 60, 50],\n     [True, 57, 20],\n     [True, 40, 50]]],\n   ['heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat']],\n  ['regression: scenario 4',\n   [3,\n    3,\n    [[True, 28, 51],\n     [True, 28, 35],\n     [True, 56, 50],\n     [False, 56, 51],\n     [True, 56, 50],\n     [True, 56, 20],\n     [False, 40, 50],\n     [True, 40, 20],\n     [False, 60, 20],\n     [True, 50, 50],\n     [True, 56, 35],\n     [True, 56, 35],\n     [True, 56, 51],\n     [True, 32, 60],\n     [True, 32, 60],\n     [True, 32, 35],\n     [True, 32, 60],\n     [True, 32, 20],\n     [True, 32, 50],\n     [True, 32, 60],\n     [True, 32, 51],\n     [True, 40, 20],\n     [True, 40, 20],\n     [True, 40, 20]]],\n   ['heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat']]],\n [['regression: scenario 4',\n   [4,\n    6,\n    [[True, 28, 50],\n     [True, 28, 35],\n     [True, 28, 50],\n     [True, 50, 35],\n     [True, 40, 50],\n     [True, 40, 51],\n     [False, 40, 35],\n     [True, 20, 50],\n     [True, 20, 35],\n     [True, 28, 50],\n     [True, 32, 51],\n     [True, 32, 51],\n     [True, 28, 51],\n     [False, 28, 50]]],\n   ['heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'off']],\n  ['regression: scenario 13',\n   [4,\n    4,\n    [[True, 20, 51],\n     [True, 20, 50],\n     [True, 32, 20],\n     [True, 56, 35],\n     [True, 56, 50],\n     [True, 56, 51],\n     [True, 56, 50],\n     [True, 56, 20],\n     [True, 32, 20],\n     [True, 32, 51],\n     [True, 32, 60],\n     [True, 33, 51],\n     [True, 28, 60],\n     [True, 28, 50],\n     [True, 28, 50],\n     [True, 28, 51],\n     [True, 28, 50],\n     [True, 28, 51]]],\n   ['heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost']],\n  ['regression: two defrosts',\n   [3,\n    4,\n    [[True, 30, 20],\n     [True, 30, 20],\n     [False, 30, 20],\n     [True, 32, 20],\n     [True, 40, 20],\n     [True, 45, 20],\n     [True, 57, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20]]],\n   ['heat',\n    'heat',\n    'off',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat']],\n  ['control: warm outdoor inhibits',\n   [2, 3, [[True, 30, 55], [True, 30, 55], [True, 30, 50], [True, 60, 50], [True, 30, 50]]],\n   ['heat', 'heat', 'defrost', 'heat', 'heat']],\n  ['regression: dry coil runtime',\n   [2, 3, [[True, 40, 20], [True, 33, 20], [True, 32, 20], [True, 31, 20], [True, 50, 20]]],\n   ['heat', 'heat', 'heat', 'defrost', 'defrost']],\n  ['control: exact termination temperature',\n   [1, 5, [[True, 30, 20], [True, 56, 20], [True, 57, 20], [False, 30, 20], [True, 30, 20]]],\n   ['defrost', 'defrost', 'heat', 'off', 'defrost']],\n  ['regression: scenario 1',\n   [5,\n    4,\n    [[True, 57, 60],\n     [True, 57, 50],\n     [True, 57, 50],\n     [True, 57, 35],\n     [True, 33, 50],\n     [True, 33, 50],\n     [True, 32, 50],\n     [True, 50, 51],\n     [True, 50, 51],\n     [False, 50, 20],\n     [False, 33, 50],\n     [True, 56, 20],\n     [True, 32, 60],\n     [True, 32, 35],\n     [True, 32, 20]]],\n   ['heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat']],\n  ['regression: scenario 2',\n   [4,\n    6,\n    [[False, 28, 50],\n     [True, 28, 51],\n     [True, 28, 35],\n     [True, 28, 50],\n     [True, 57, 50],\n     [True, 57, 20],\n     [True, 57, 50],\n     [True, 57, 50],\n     [True, 56, 50],\n     [True, 56, 35],\n     [True, 56, 51],\n     [True, 56, 50]]],\n   ['off', 'heat', 'heat', 'heat', 'heat', 'heat', 'heat', 'heat', 'heat', 'heat', 'heat', 'heat']]],\n [['regression: scenario 4',\n   [5,\n    4,\n    [[True, 28, 50],\n     [True, 28, 35],\n     [True, 28, 50],\n     [True, 57, 51],\n     [True, 57, 50],\n     [True, 57, 20],\n     [True, 57, 35],\n     [True, 57, 20],\n     [True, 57, 35],\n     [True, 56, 20],\n     [False, 56, 20],\n     [True, 33, 35],\n     [True, 33, 60],\n     [True, 33, 50],\n     [True, 20, 50]]],\n   ['heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat']],\n  ['regression: scenario 6',\n   [4,\n    4,\n    [[True, 40, 51],\n     [True, 40, 20],\n     [False, 40, 35],\n     [True, 28, 51],\n     [True, 28, 20],\n     [True, 28, 60],\n     [False, 28, 51],\n     [False, 28, 51],\n     [False, 32, 60],\n     [True, 32, 35],\n     [True, 20, 51],\n     [True, 20, 35],\n     [True, 20, 50],\n     [True, 20, 20],\n     [False, 20, 35]]],\n   ['heat',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'off',\n    'off',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'off']],\n  ['regression: two defrosts',\n   [3,\n    4,\n    [[True, 30, 20],\n     [True, 30, 20],\n     [False, 30, 20],\n     [True, 32, 20],\n     [True, 40, 20],\n     [True, 45, 20],\n     [True, 57, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20]]],\n   ['heat',\n    'heat',\n    'off',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat']],\n  ['control: warm outdoor inhibits',\n   [2, 3, [[True, 30, 55], [True, 30, 55], [True, 30, 50], [True, 60, 50], [True, 30, 50]]],\n   ['heat', 'heat', 'defrost', 'heat', 'heat']],\n  ['regression: dry coil runtime',\n   [2, 3, [[True, 40, 20], [True, 33, 20], [True, 32, 20], [True, 31, 20], [True, 50, 20]]],\n   ['heat', 'heat', 'heat', 'defrost', 'defrost']],\n  ['control: exact termination temperature',\n   [1, 5, [[True, 30, 20], [True, 56, 20], [True, 57, 20], [False, 30, 20], [True, 30, 20]]],\n   ['defrost', 'defrost', 'heat', 'off', 'defrost']],\n  ['regression: scenario 1',\n   [4,\n    6,\n    [[True, 32, 50],\n     [True, 50, 50],\n     [True, 50, 35],\n     [True, 57, 51],\n     [True, 57, 20],\n     [False, 57, 51],\n     [True, 57, 50],\n     [True, 57, 51],\n     [True, 32, 50],\n     [True, 32, 51],\n     [True, 32, 50],\n     [False, 28, 50]]],\n   ['heat', 'heat', 'heat', 'heat', 'heat', 'off', 'heat', 'heat', 'heat', 'heat', 'defrost', 'defrost']],\n  ['regression: scenario 2',\n   [3,\n    4,\n    [[True, 32, 35],\n     [True, 32, 35],\n     [True, 33, 60],\n     [True, 33, 50],\n     [True, 33, 60],\n     [True, 57, 51],\n     [True, 20, 60],\n     [True, 20, 50],\n     [True, 33, 50],\n     [False, 33, 51],\n     [False, 33, 20],\n     [True, 33, 20],\n     [True, 40, 50],\n     [True, 40, 50],\n     [True, 40, 35],\n     [True, 40, 35],\n     [True, 40, 51],\n     [True, 28, 35],\n     [True, 28, 51],\n     [True, 33, 60],\n     [False, 33, 60],\n     [True, 56, 51],\n     [True, 56, 60],\n     [False, 56, 60]]],\n   ['heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'off']]]]\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":"67cdfeaf2269b3e0f381eeeaafc93ba77553e43e708d7479d7e22710177bce92","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(interval, max_minutes, samples):\n    acc = 0\n    defrost_min = None\n    out = []\n    for running, coil, outdoor in samples:\n        if defrost_min is not None:\n            defrost_min += 1\n            if coil >= 57 or defrost_min >= max_minutes:\n                defrost_min = None\n                out.append('heat' if running else 'off')\n            else:\n                out.append('defrost')\n            continue\n        if running and coil <= 32:\n            acc += 1\n        if acc >= interval and outdoor <= 50:\n            acc = 0\n            defrost_min = 0\n            out.append('defrost')\n            continue\n        out.append('heat' if running else 'off')\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: dry coil runtime',\n   [2, 3, [[True, 40, 20], [True, 33, 20], [True, 32, 20], [True, 31, 20], [True, 50, 20]]],\n   ['heat', 'heat', 'heat', 'defrost', 'defrost']],\n  ['regression: two defrosts',\n   [3,\n    4,\n    [[True, 30, 20],\n     [True, 30, 20],\n     [False, 30, 20],\n     [True, 32, 20],\n     [True, 40, 20],\n     [True, 45, 20],\n     [True, 57, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20]]],\n   ['heat',\n    'heat',\n    'off',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat']],\n  ['control: warm outdoor inhibits',\n   [2, 3, [[True, 30, 55], [True, 30, 55], [True, 30, 50], [True, 60, 50], [True, 30, 50]]],\n   ['heat', 'heat', 'defrost', 'heat', 'heat']],\n  ['control: exact termination temperature',\n   [1, 5, [[True, 30, 20], [True, 56, 20], [True, 57, 20], [False, 30, 20], [True, 30, 20]]],\n   ['defrost', 'defrost', 'heat', 'off', 'defrost']],\n  ['regression: scenario 1',\n   [3,\n    3,\n    [[True, 40, 35],\n     [True, 40, 50],\n     [True, 40, 51],\n     [True, 40, 51],\n     [True, 40, 50],\n     [True, 40, 50],\n     [False, 20, 35],\n     [False, 20, 51],\n     [True, 20, 50],\n     [True, 50, 20],\n     [True, 50, 50],\n     [True, 56, 50],\n     [True, 40, 50],\n     [True, 40, 50],\n     [False, 40, 51],\n     [True, 40, 50],\n     [False, 20, 51],\n     [False, 20, 60],\n     [True, 57, 51],\n     [False, 57, 51]]],\n   ['heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'off',\n    'off',\n    'heat',\n    'off']],\n  ['regression: scenario 2',\n   [4,\n    3,\n    [[True, 33, 60],\n     [False, 57, 20],\n     [True, 57, 50],\n     [True, 60, 20],\n     [True, 60, 35],\n     [True, 60, 50],\n     [True, 28, 50],\n     [True, 28, 20],\n     [True, 28, 20],\n     [False, 28, 50],\n     [True, 28, 51],\n     [True, 28, 35],\n     [True, 28, 60],\n     [True, 28, 50],\n     [True, 40, 50],\n     [True, 40, 50],\n     [False, 40, 60]]],\n   ['heat',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'off']],\n  ['control: scenario 3',\n   [5,\n    3,\n    [[True, 20, 20],\n     [True, 20, 50],\n     [True, 20, 50],\n     [True, 20, 50],\n     [True, 20, 35],\n     [True, 40, 50],\n     [False, 40, 20],\n     [True, 40, 50],\n     [True, 40, 50],\n     [True, 33, 60],\n     [False, 33, 60],\n     [True, 60, 50]]],\n   ['heat', 'heat', 'heat', 'heat', 'defrost', 'defrost', 'defrost', 'heat', 'heat', 'heat', 'off', 'heat']],\n  ['regression: scenario 4',\n   [3,\n    4,\n    [[True, 20, 50],\n     [True, 20, 35],\n     [True, 20, 60],\n     [True, 20, 50],\n     [False, 20, 50],\n     [True, 20, 35],\n     [True, 20, 60],\n     [True, 20, 51],\n     [False, 20, 20],\n     [True, 50, 50],\n     [True, 50, 50],\n     [False, 50, 50],\n     [True, 50, 35],\n     [False, 33, 60],\n     [True, 33, 60],\n     [True, 33, 50],\n     [True, 20, 35],\n     [True, 20, 35],\n     [True, 20, 50],\n     [True, 50, 20]]],\n   ['heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost']]],\n [['regression: scenario 1',\n   [3,\n    3,\n    [[True, 28, 20],\n     [True, 28, 50],\n     [True, 32, 50],\n     [False, 32, 35],\n     [True, 60, 20],\n     [True, 60, 35],\n     [True, 60, 50],\n     [True, 60, 50],\n     [True, 57, 50],\n     [True, 57, 50],\n     [True, 60, 60],\n     [False, 60, 50],\n     [True, 60, 35],\n     [True, 33, 50]]],\n   ['heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'heat']],\n  ['regression: dry coil runtime',\n   [2, 3, [[True, 40, 20], [True, 33, 20], [True, 32, 20], [True, 31, 20], [True, 50, 20]]],\n   ['heat', 'heat', 'heat', 'defrost', 'defrost']],\n  ['regression: two defrosts',\n   [3,\n    4,\n    [[True, 30, 20],\n     [True, 30, 20],\n     [False, 30, 20],\n     [True, 32, 20],\n     [True, 40, 20],\n     [True, 45, 20],\n     [True, 57, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20]]],\n   ['heat',\n    'heat',\n    'off',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat']],\n  ['control: warm outdoor inhibits',\n   [2, 3, [[True, 30, 55], [True, 30, 55], [True, 30, 50], [True, 60, 50], [True, 30, 50]]],\n   ['heat', 'heat', 'defrost', 'heat', 'heat']],\n  ['control: exact termination temperature',\n   [1, 5, [[True, 30, 20], [True, 56, 20], [True, 57, 20], [False, 30, 20], [True, 30, 20]]],\n   ['defrost', 'defrost', 'heat', 'off', 'defrost']],\n  ['regression: scenario 2',\n   [4,\n    4,\n    [[True, 40, 50],\n     [True, 40, 35],\n     [True, 40, 60],\n     [False, 56, 60],\n     [True, 56, 35],\n     [True, 50, 50],\n     [True, 32, 35],\n     [True, 32, 51],\n     [True, 32, 20],\n     [True, 32, 51],\n     [True, 32, 60],\n     [True, 57, 35],\n     [True, 32, 50],\n     [True, 32, 35],\n     [True, 20, 35],\n     [True, 50, 35],\n     [True, 57, 35],\n     [True, 57, 51],\n     [False, 57, 50]]],\n   ['heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'off']],\n  ['regression: scenario 3',\n   [3,\n    6,\n    [[False, 56, 51],\n     [True, 56, 35],\n     [False, 56, 35],\n     [True, 56, 35],\n     [True, 56, 35],\n     [True, 33, 50],\n     [True, 33, 20],\n     [True, 33, 50],\n     [False, 33, 60],\n     [True, 33, 35],\n     [True, 33, 35],\n     [True, 33, 50],\n     [True, 33, 60],\n     [True, 33, 35],\n     [True, 33, 35],\n     [True, 20, 50],\n     [True, 20, 51]]],\n   ['off',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat']],\n  ['regression: scenario 4',\n   [4,\n    4,\n    [[False, 40, 50],\n     [True, 40, 50],\n     [True, 40, 35],\n     [True, 40, 50],\n     [True, 40, 50],\n     [True, 28, 50],\n     [True, 28, 50],\n     [False, 28, 60],\n     [False, 28, 20],\n     [True, 28, 60],\n     [True, 28, 50],\n     [False, 28, 60],\n     [True, 28, 50],\n     [True, 28, 35],\n     [False, 28, 50],\n     [True, 28, 20],\n     [True, 28, 51],\n     [True, 33, 20]]],\n   ['off',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'off',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'off',\n    'heat',\n    'heat',\n    'heat']]],\n [['regression: scenario 2',\n   [4,\n    3,\n    [[True, 32, 20],\n     [True, 57, 60],\n     [True, 57, 60],\n     [True, 57, 20],\n     [False, 40, 51],\n     [True, 50, 50],\n     [True, 50, 51],\n     [True, 50, 50],\n     [True, 56, 60],\n     [True, 40, 20],\n     [False, 40, 35],\n     [True, 50, 35],\n     [False, 50, 51],\n     [False, 50, 35],\n     [True, 57, 35],\n     [True, 57, 20],\n     [True, 57, 20],\n     [True, 57, 50],\n     [True, 57, 60]]],\n   ['heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'off',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat']],\n  ['regression: scenario 3',\n   [3,\n    6,\n    [[True, 20, 60],\n     [True, 33, 20],\n     [True, 33, 60],\n     [True, 33, 51],\n     [True, 33, 35],\n     [True, 32, 50],\n     [True, 32, 35],\n     [True, 32, 35],\n     [True, 32, 60],\n     [True, 32, 60],\n     [False, 32, 60],\n     [True, 32, 35],\n     [False, 32, 50],\n     [True, 40, 50]]],\n   ['heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'off',\n    'heat']],\n  ['regression: two defrosts',\n   [3,\n    4,\n    [[True, 30, 20],\n     [True, 30, 20],\n     [False, 30, 20],\n     [True, 32, 20],\n     [True, 40, 20],\n     [True, 45, 20],\n     [True, 57, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20]]],\n   ['heat',\n    'heat',\n    'off',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat']],\n  ['control: warm outdoor inhibits',\n   [2, 3, [[True, 30, 55], [True, 30, 55], [True, 30, 50], [True, 60, 50], [True, 30, 50]]],\n   ['heat', 'heat', 'defrost', 'heat', 'heat']],\n  ['regression: dry coil runtime',\n   [2, 3, [[True, 40, 20], [True, 33, 20], [True, 32, 20], [True, 31, 20], [True, 50, 20]]],\n   ['heat', 'heat', 'heat', 'defrost', 'defrost']],\n  ['control: exact termination temperature',\n   [1, 5, [[True, 30, 20], [True, 56, 20], [True, 57, 20], [False, 30, 20], [True, 30, 20]]],\n   ['defrost', 'defrost', 'heat', 'off', 'defrost']],\n  ['regression: scenario 1',\n   [4,\n    6,\n    [[True, 33, 20],\n     [True, 28, 50],\n     [True, 56, 51],\n     [True, 33, 51],\n     [True, 28, 35],\n     [False, 28, 50],\n     [True, 28, 60],\n     [True, 28, 20],\n     [True, 40, 50],\n     [True, 40, 35],\n     [True, 40, 51],\n     [True, 40, 50],\n     [True, 28, 60],\n     [True, 28, 50],\n     [True, 50, 35],\n     [True, 60, 50],\n     [True, 57, 20],\n     [True, 40, 50]]],\n   ['heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat']],\n  ['regression: scenario 4',\n   [3,\n    3,\n    [[True, 28, 51],\n     [True, 28, 35],\n     [True, 56, 50],\n     [False, 56, 51],\n     [True, 56, 50],\n     [True, 56, 20],\n     [False, 40, 50],\n     [True, 40, 20],\n     [False, 60, 20],\n     [True, 50, 50],\n     [True, 56, 35],\n     [True, 56, 35],\n     [True, 56, 51],\n     [True, 32, 60],\n     [True, 32, 60],\n     [True, 32, 35],\n     [True, 32, 60],\n     [True, 32, 20],\n     [True, 32, 50],\n     [True, 32, 60],\n     [True, 32, 51],\n     [True, 40, 20],\n     [True, 40, 20],\n     [True, 40, 20]]],\n   ['heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat']]],\n [['regression: scenario 4',\n   [4,\n    6,\n    [[True, 28, 50],\n     [True, 28, 35],\n     [True, 28, 50],\n     [True, 50, 35],\n     [True, 40, 50],\n     [True, 40, 51],\n     [False, 40, 35],\n     [True, 20, 50],\n     [True, 20, 35],\n     [True, 28, 50],\n     [True, 32, 51],\n     [True, 32, 51],\n     [True, 28, 51],\n     [False, 28, 50]]],\n   ['heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'off']],\n  ['regression: scenario 13',\n   [4,\n    4,\n    [[True, 20, 51],\n     [True, 20, 50],\n     [True, 32, 20],\n     [True, 56, 35],\n     [True, 56, 50],\n     [True, 56, 51],\n     [True, 56, 50],\n     [True, 56, 20],\n     [True, 32, 20],\n     [True, 32, 51],\n     [True, 32, 60],\n     [True, 33, 51],\n     [True, 28, 60],\n     [True, 28, 50],\n     [True, 28, 50],\n     [True, 28, 51],\n     [True, 28, 50],\n     [True, 28, 51]]],\n   ['heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost']],\n  ['regression: two defrosts',\n   [3,\n    4,\n    [[True, 30, 20],\n     [True, 30, 20],\n     [False, 30, 20],\n     [True, 32, 20],\n     [True, 40, 20],\n     [True, 45, 20],\n     [True, 57, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20]]],\n   ['heat',\n    'heat',\n    'off',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat']],\n  ['control: warm outdoor inhibits',\n   [2, 3, [[True, 30, 55], [True, 30, 55], [True, 30, 50], [True, 60, 50], [True, 30, 50]]],\n   ['heat', 'heat', 'defrost', 'heat', 'heat']],\n  ['regression: dry coil runtime',\n   [2, 3, [[True, 40, 20], [True, 33, 20], [True, 32, 20], [True, 31, 20], [True, 50, 20]]],\n   ['heat', 'heat', 'heat', 'defrost', 'defrost']],\n  ['control: exact termination temperature',\n   [1, 5, [[True, 30, 20], [True, 56, 20], [True, 57, 20], [False, 30, 20], [True, 30, 20]]],\n   ['defrost', 'defrost', 'heat', 'off', 'defrost']],\n  ['regression: scenario 1',\n   [5,\n    4,\n    [[True, 57, 60],\n     [True, 57, 50],\n     [True, 57, 50],\n     [True, 57, 35],\n     [True, 33, 50],\n     [True, 33, 50],\n     [True, 32, 50],\n     [True, 50, 51],\n     [True, 50, 51],\n     [False, 50, 20],\n     [False, 33, 50],\n     [True, 56, 20],\n     [True, 32, 60],\n     [True, 32, 35],\n     [True, 32, 20]]],\n   ['heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat']],\n  ['regression: scenario 2',\n   [4,\n    6,\n    [[False, 28, 50],\n     [True, 28, 51],\n     [True, 28, 35],\n     [True, 28, 50],\n     [True, 57, 50],\n     [True, 57, 20],\n     [True, 57, 50],\n     [True, 57, 50],\n     [True, 56, 50],\n     [True, 56, 35],\n     [True, 56, 51],\n     [True, 56, 50]]],\n   ['off', 'heat', 'heat', 'heat', 'heat', 'heat', 'heat', 'heat', 'heat', 'heat', 'heat', 'heat']]],\n [['regression: scenario 4',\n   [5,\n    4,\n    [[True, 28, 50],\n     [True, 28, 35],\n     [True, 28, 50],\n     [True, 57, 51],\n     [True, 57, 50],\n     [True, 57, 20],\n     [True, 57, 35],\n     [True, 57, 20],\n     [True, 57, 35],\n     [True, 56, 20],\n     [False, 56, 20],\n     [True, 33, 35],\n     [True, 33, 60],\n     [True, 33, 50],\n     [True, 20, 50]]],\n   ['heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'heat']],\n  ['regression: scenario 6',\n   [4,\n    4,\n    [[True, 40, 51],\n     [True, 40, 20],\n     [False, 40, 35],\n     [True, 28, 51],\n     [True, 28, 20],\n     [True, 28, 60],\n     [False, 28, 51],\n     [False, 28, 51],\n     [False, 32, 60],\n     [True, 32, 35],\n     [True, 20, 51],\n     [True, 20, 35],\n     [True, 20, 50],\n     [True, 20, 20],\n     [False, 20, 35]]],\n   ['heat',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'off',\n    'off',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'off']],\n  ['regression: two defrosts',\n   [3,\n    4,\n    [[True, 30, 20],\n     [True, 30, 20],\n     [False, 30, 20],\n     [True, 32, 20],\n     [True, 40, 20],\n     [True, 45, 20],\n     [True, 57, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20],\n     [True, 20, 20]]],\n   ['heat',\n    'heat',\n    'off',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat']],\n  ['control: warm outdoor inhibits',\n   [2, 3, [[True, 30, 55], [True, 30, 55], [True, 30, 50], [True, 60, 50], [True, 30, 50]]],\n   ['heat', 'heat', 'defrost', 'heat', 'heat']],\n  ['regression: dry coil runtime',\n   [2, 3, [[True, 40, 20], [True, 33, 20], [True, 32, 20], [True, 31, 20], [True, 50, 20]]],\n   ['heat', 'heat', 'heat', 'defrost', 'defrost']],\n  ['control: exact termination temperature',\n   [1, 5, [[True, 30, 20], [True, 56, 20], [True, 57, 20], [False, 30, 20], [True, 30, 20]]],\n   ['defrost', 'defrost', 'heat', 'off', 'defrost']],\n  ['regression: scenario 1',\n   [4,\n    6,\n    [[True, 32, 50],\n     [True, 50, 50],\n     [True, 50, 35],\n     [True, 57, 51],\n     [True, 57, 20],\n     [False, 57, 51],\n     [True, 57, 50],\n     [True, 57, 51],\n     [True, 32, 50],\n     [True, 32, 51],\n     [True, 32, 50],\n     [False, 28, 50]]],\n   ['heat', 'heat', 'heat', 'heat', 'heat', 'off', 'heat', 'heat', 'heat', 'heat', 'defrost', 'defrost']],\n  ['regression: scenario 2',\n   [3,\n    4,\n    [[True, 32, 35],\n     [True, 32, 35],\n     [True, 33, 60],\n     [True, 33, 50],\n     [True, 33, 60],\n     [True, 57, 51],\n     [True, 20, 60],\n     [True, 20, 50],\n     [True, 33, 50],\n     [False, 33, 51],\n     [False, 33, 20],\n     [True, 33, 20],\n     [True, 40, 50],\n     [True, 40, 50],\n     [True, 40, 35],\n     [True, 40, 35],\n     [True, 40, 51],\n     [True, 28, 35],\n     [True, 28, 51],\n     [True, 33, 60],\n     [False, 33, 60],\n     [True, 56, 51],\n     [True, 56, 60],\n     [False, 56, 60]]],\n   ['heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'defrost',\n    'defrost',\n    'defrost',\n    'defrost',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'heat',\n    'off',\n    'heat',\n    'heat',\n    'off']]]]\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 thermostat or HVAC controller decision evaluated per sample. Temperatures are integer tenths of a degree Fahrenheit unless stated otherwise. The contract is a stipulated toy convention, not a claim of conformance to any manufacturer, ASHRAE guideline or code. 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-hvac-thermostat-control-demand-defrost-frost-accumulation","generated_at":"2026-09-29T14:51:45.709831+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Residential and light-commercial thermostats make these decisions sample by sample; each defect changes equipment calls in a way that shows up as short cycling, comfort complaints or equipment stress.","repair":"Accumulate only while the coil is at or below 32 F.","root_cause":"Runtime accumulates whenever the compressor runs, regardless of coil temperature.","sha256":"67877b6bc93e07b0d417ab9dc9078cd4b0222a3a552e2aaf355c0a1892dc16db","title":"Defrost timer accumulates runtime with a dry coil · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":40.894,"exit_code":1,"observations":[{"actual":["heat","heat","heat","heat","heat"],"check":"regression: dry coil runtime","expected":["heat","heat","heat","defrost","defrost"],"passed":false},{"actual":["heat","heat","off","heat","heat","heat","heat","defrost","defrost","defrost","defrost","heat","heat","heat"],"check":"regression: two defrosts","expected":["heat","heat","off","defrost","defrost","defrost","heat","heat","heat","defrost","defrost","defrost","defrost","heat"],"passed":false},{"actual":["heat","heat","defrost","heat","heat"],"check":"control: warm outdoor inhibits","expected":["heat","heat","defrost","heat","heat"],"passed":true},{"actual":["defrost","defrost","heat","off","defrost"],"check":"control: exact termination temperature","expected":["defrost","defrost","heat","off","defrost"],"passed":true},{"actual":["heat","heat","heat","heat","heat","heat","off","off","heat","heat","heat","heat","heat","heat","off","heat","off","off","heat","off"],"check":"regression: scenario 1","expected":["heat","heat","heat","heat","heat","heat","off","off","heat","heat","heat","heat","heat","heat","off","heat","off","off","heat","off"],"passed":true},{"actual":["heat","off","heat","heat","heat","heat","heat","heat","heat","off","heat","defrost","defrost","defrost","heat","heat","off"],"check":"regression: scenario 2","expected":["heat","off","heat","heat","heat","heat","heat","heat","heat","off","heat","defrost","defrost","defrost","heat","heat","off"],"passed":true},{"actual":["heat","heat","heat","heat","defrost","defrost","defrost","heat","heat","heat","off","heat"],"check":"control: scenario 3","expected":["heat","heat","heat","heat","defrost","defrost","defrost","heat","heat","heat","off","heat"],"passed":true},{"actual":["heat","heat","heat","defrost","defrost","defrost","defrost","heat","off","heat","heat","off","heat","off","heat","heat","heat","heat","defrost","defrost"],"check":"regression: scenario 4","expected":["heat","heat","heat","defrost","defrost","defrost","defrost","heat","off","heat","heat","off","heat","off","heat","heat","heat","heat","defrost","defrost"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: dry coil runtime\", \"actual\": [\"heat\", \"heat\", \"heat\", \"heat\", \"heat\"], \"expected\": [\"heat\", \"heat\", \"heat\", \"defrost\", \"defrost\"], \"passed\": false}, {\"check\": \"regression: two defrosts\", \"actual\": [\"heat\", \"heat\", \"off\", \"heat\", \"heat\", \"heat\", \"heat\", \"defrost\", \"defrost\", \"defrost\", \"defrost\", \"heat\", \"heat\", \"heat\"], \"expected\": [\"heat\", \"heat\", \"off\", \"defrost\", \"defrost\", \"defrost\", \"heat\", \"heat\", \"heat\", \"defrost\", \"defrost\", \"defrost\", \"defrost\", \"heat\"], \"passed\": false}, {\"check\": \"control: warm outdoor inhibits\", \"actual\": [\"heat\", \"heat\", \"defrost\", \"heat\", \"heat\"], \"expected\": [\"heat\", \"heat\", \"defrost\", \"heat\", \"heat\"], \"passed\": true}, {\"check\": \"control: exact termination temperature\", \"actual\": [\"defrost\", \"defrost\", \"heat\", \"off\", \"defrost\"], \"expected\": [\"defrost\", \"defrost\", \"heat\", \"off\", \"defrost\"], \"passed\": true}, {\"check\": \"regression: scenario 1\", \"actual\": [\"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"off\", \"off\", \"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"off\", \"heat\", \"off\", \"off\", \"heat\", \"off\"], \"expected\": [\"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"off\", \"off\", \"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"off\", \"heat\", \"off\", \"off\", \"heat\", \"off\"], \"passed\": true}, {\"check\": \"regression: scenario 2\", \"actual\": [\"heat\", \"off\", \"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"off\", \"heat\", \"defrost\", \"defrost\", \"defrost\", \"heat\", \"heat\", \"off\"], \"expected\": [\"heat\", \"off\", \"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"off\", \"heat\", \"defrost\", \"defrost\", \"defrost\", \"heat\", \"heat\", \"off\"], \"passed\": true}, {\"check\": \"control: scenario 3\", \"actual\": [\"heat\", \"heat\", \"heat\", \"heat\", \"defrost\", \"defrost\", \"defrost\", \"heat\", \"heat\", \"heat\", \"off\", \"heat\"], \"expected\": [\"heat\", \"heat\", \"heat\", \"heat\", \"defrost\", \"defrost\", \"defrost\", \"heat\", \"heat\", \"heat\", \"off\", \"heat\"], \"passed\": true}, {\"check\": \"regression: scenario 4\", \"actual\": [\"heat\", \"heat\", \"heat\", \"defrost\", \"defrost\", \"defrost\", \"defrost\", \"heat\", \"off\", \"heat\", \"heat\", \"off\", \"heat\", \"off\", \"heat\", \"heat\", \"heat\", \"heat\", \"defrost\", \"defrost\"], \"expected\": [\"heat\", \"heat\", \"heat\", \"defrost\", \"defrost\", \"defrost\", \"defrost\", \"heat\", \"off\", \"heat\", \"heat\", \"off\", \"heat\", \"off\", \"heat\", \"heat\", \"heat\", \"heat\", \"defrost\", \"defrost\"], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.14,"exit_code":1,"observations":[{"actual":["heat","defrost","defrost","defrost","heat"],"check":"regression: dry coil runtime","expected":["heat","heat","heat","defrost","defrost"],"passed":false},{"actual":["heat","heat","off","defrost","defrost","defrost","heat","heat","heat","defrost","defrost","defrost","defrost","heat"],"check":"regression: two defrosts","expected":["heat","heat","off","defrost","defrost","defrost","heat","heat","heat","defrost","defrost","defrost","defrost","heat"],"passed":true},{"actual":["heat","heat","defrost","heat","heat"],"check":"control: warm outdoor inhibits","expected":["heat","heat","defrost","heat","heat"],"passed":true},{"actual":["defrost","defrost","heat","off","defrost"],"check":"control: exact termination temperature","expected":["defrost","defrost","heat","off","defrost"],"passed":true},{"actual":["heat","heat","heat","heat","defrost","defrost","defrost","off","heat","heat","defrost","defrost","defrost","heat","off","heat","off","off","heat","off"],"check":"regression: scenario 1","expected":["heat","heat","heat","heat","heat","heat","off","off","heat","heat","heat","heat","heat","heat","off","heat","off","off","heat","off"],"passed":false},{"actual":["heat","off","heat","heat","defrost","heat","heat","heat","heat","off","heat","defrost","defrost","defrost","heat","heat","off"],"check":"regression: scenario 2","expected":["heat","off","heat","heat","heat","heat","heat","heat","heat","off","heat","defrost","defrost","defrost","heat","heat","off"],"passed":false},{"actual":["heat","heat","heat","heat","defrost","defrost","defrost","heat","heat","heat","off","heat"],"check":"control: scenario 3","expected":["heat","heat","heat","heat","defrost","defrost","defrost","heat","heat","heat","off","heat"],"passed":true},{"actual":["heat","heat","heat","defrost","defrost","defrost","defrost","heat","off","heat","heat","off","defrost","defrost","defrost","defrost","heat","heat","heat","defrost"],"check":"regression: scenario 4","expected":["heat","heat","heat","defrost","defrost","defrost","defrost","heat","off","heat","heat","off","heat","off","heat","heat","heat","heat","defrost","defrost"],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: dry coil runtime\", \"actual\": [\"heat\", \"defrost\", \"defrost\", \"defrost\", \"heat\"], \"expected\": [\"heat\", \"heat\", \"heat\", \"defrost\", \"defrost\"], \"passed\": false}, {\"check\": \"regression: two defrosts\", \"actual\": [\"heat\", \"heat\", \"off\", \"defrost\", \"defrost\", \"defrost\", \"heat\", \"heat\", \"heat\", \"defrost\", \"defrost\", \"defrost\", \"defrost\", \"heat\"], \"expected\": [\"heat\", \"heat\", \"off\", \"defrost\", \"defrost\", \"defrost\", \"heat\", \"heat\", \"heat\", \"defrost\", \"defrost\", \"defrost\", \"defrost\", \"heat\"], \"passed\": true}, {\"check\": \"control: warm outdoor inhibits\", \"actual\": [\"heat\", \"heat\", \"defrost\", \"heat\", \"heat\"], \"expected\": [\"heat\", \"heat\", \"defrost\", \"heat\", \"heat\"], \"passed\": true}, {\"check\": \"control: exact termination temperature\", \"actual\": [\"defrost\", \"defrost\", \"heat\", \"off\", \"defrost\"], \"expected\": [\"defrost\", \"defrost\", \"heat\", \"off\", \"defrost\"], \"passed\": true}, {\"check\": \"regression: scenario 1\", \"actual\": [\"heat\", \"heat\", \"heat\", \"heat\", \"defrost\", \"defrost\", \"defrost\", \"off\", \"heat\", \"heat\", \"defrost\", \"defrost\", \"defrost\", \"heat\", \"off\", \"heat\", \"off\", \"off\", \"heat\", \"off\"], \"expected\": [\"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"off\", \"off\", \"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"off\", \"heat\", \"off\", \"off\", \"heat\", \"off\"], \"passed\": false}, {\"check\": \"regression: scenario 2\", \"actual\": [\"heat\", \"off\", \"heat\", \"heat\", \"defrost\", \"heat\", \"heat\", \"heat\", \"heat\", \"off\", \"heat\", \"defrost\", \"defrost\", \"defrost\", \"heat\", \"heat\", \"off\"], \"expected\": [\"heat\", \"off\", \"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"off\", \"heat\", \"defrost\", \"defrost\", \"defrost\", \"heat\", \"heat\", \"off\"], \"passed\": false}, {\"check\": \"control: scenario 3\", \"actual\": [\"heat\", \"heat\", \"heat\", \"heat\", \"defrost\", \"defrost\", \"defrost\", \"heat\", \"heat\", \"heat\", \"off\", \"heat\"], \"expected\": [\"heat\", \"heat\", \"heat\", \"heat\", \"defrost\", \"defrost\", \"defrost\", \"heat\", \"heat\", \"heat\", \"off\", \"heat\"], \"passed\": true}, {\"check\": \"regression: scenario 4\", \"actual\": [\"heat\", \"heat\", \"heat\", \"defrost\", \"defrost\", \"defrost\", \"defrost\", \"heat\", \"off\", \"heat\", \"heat\", \"off\", \"defrost\", \"defrost\", \"defrost\", \"defrost\", \"heat\", \"heat\", \"heat\", \"defrost\"], \"expected\": [\"heat\", \"heat\", \"heat\", \"defrost\", \"defrost\", \"defrost\", \"defrost\", \"heat\", \"off\", \"heat\", \"heat\", \"off\", \"heat\", \"off\", \"heat\", \"heat\", \"heat\", \"heat\", \"defrost\", \"defrost\"], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.12,"exit_code":0,"observations":[{"actual":["heat","heat","heat","defrost","defrost"],"check":"regression: dry coil runtime","expected":["heat","heat","heat","defrost","defrost"],"passed":true},{"actual":["heat","heat","off","defrost","defrost","defrost","heat","heat","heat","defrost","defrost","defrost","defrost","heat"],"check":"regression: two defrosts","expected":["heat","heat","off","defrost","defrost","defrost","heat","heat","heat","defrost","defrost","defrost","defrost","heat"],"passed":true},{"actual":["heat","heat","defrost","heat","heat"],"check":"control: warm outdoor inhibits","expected":["heat","heat","defrost","heat","heat"],"passed":true},{"actual":["defrost","defrost","heat","off","defrost"],"check":"control: exact termination temperature","expected":["defrost","defrost","heat","off","defrost"],"passed":true},{"actual":["heat","heat","heat","heat","heat","heat","off","off","heat","heat","heat","heat","heat","heat","off","heat","off","off","heat","off"],"check":"regression: scenario 1","expected":["heat","heat","heat","heat","heat","heat","off","off","heat","heat","heat","heat","heat","heat","off","heat","off","off","heat","off"],"passed":true},{"actual":["heat","off","heat","heat","heat","heat","heat","heat","heat","off","heat","defrost","defrost","defrost","heat","heat","off"],"check":"regression: scenario 2","expected":["heat","off","heat","heat","heat","heat","heat","heat","heat","off","heat","defrost","defrost","defrost","heat","heat","off"],"passed":true},{"actual":["heat","heat","heat","heat","defrost","defrost","defrost","heat","heat","heat","off","heat"],"check":"control: scenario 3","expected":["heat","heat","heat","heat","defrost","defrost","defrost","heat","heat","heat","off","heat"],"passed":true},{"actual":["heat","heat","heat","defrost","defrost","defrost","defrost","heat","off","heat","heat","off","heat","off","heat","heat","heat","heat","defrost","defrost"],"check":"regression: scenario 4","expected":["heat","heat","heat","defrost","defrost","defrost","defrost","heat","off","heat","heat","off","heat","off","heat","heat","heat","heat","defrost","defrost"],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: dry coil runtime\", \"actual\": [\"heat\", \"heat\", \"heat\", \"defrost\", \"defrost\"], \"expected\": [\"heat\", \"heat\", \"heat\", \"defrost\", \"defrost\"], \"passed\": true}, {\"check\": \"regression: two defrosts\", \"actual\": [\"heat\", \"heat\", \"off\", \"defrost\", \"defrost\", \"defrost\", \"heat\", \"heat\", \"heat\", \"defrost\", \"defrost\", \"defrost\", \"defrost\", \"heat\"], \"expected\": [\"heat\", \"heat\", \"off\", \"defrost\", \"defrost\", \"defrost\", \"heat\", \"heat\", \"heat\", \"defrost\", \"defrost\", \"defrost\", \"defrost\", \"heat\"], \"passed\": true}, {\"check\": \"control: warm outdoor inhibits\", \"actual\": [\"heat\", \"heat\", \"defrost\", \"heat\", \"heat\"], \"expected\": [\"heat\", \"heat\", \"defrost\", \"heat\", \"heat\"], \"passed\": true}, {\"check\": \"control: exact termination temperature\", \"actual\": [\"defrost\", \"defrost\", \"heat\", \"off\", \"defrost\"], \"expected\": [\"defrost\", \"defrost\", \"heat\", \"off\", \"defrost\"], \"passed\": true}, {\"check\": \"regression: scenario 1\", \"actual\": [\"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"off\", \"off\", \"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"off\", \"heat\", \"off\", \"off\", \"heat\", \"off\"], \"expected\": [\"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"off\", \"off\", \"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"off\", \"heat\", \"off\", \"off\", \"heat\", \"off\"], \"passed\": true}, {\"check\": \"regression: scenario 2\", \"actual\": [\"heat\", \"off\", \"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"off\", \"heat\", \"defrost\", \"defrost\", \"defrost\", \"heat\", \"heat\", \"off\"], \"expected\": [\"heat\", \"off\", \"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"heat\", \"off\", \"heat\", \"defrost\", \"defrost\", \"defrost\", \"heat\", \"heat\", \"off\"], \"passed\": true}, {\"check\": \"control: scenario 3\", \"actual\": [\"heat\", \"heat\", \"heat\", \"heat\", \"defrost\", \"defrost\", \"defrost\", \"heat\", \"heat\", \"heat\", \"off\", \"heat\"], \"expected\": [\"heat\", \"heat\", \"heat\", \"heat\", \"defrost\", \"defrost\", \"defrost\", \"heat\", \"heat\", \"heat\", \"off\", \"heat\"], \"passed\": true}, {\"check\": \"regression: scenario 4\", \"actual\": [\"heat\", \"heat\", \"heat\", \"defrost\", \"defrost\", \"defrost\", \"defrost\", \"heat\", \"off\", \"heat\", \"heat\", \"off\", \"heat\", \"off\", \"heat\", \"heat\", \"heat\", \"heat\", \"defrost\", \"defrost\"], \"expected\": [\"heat\", \"heat\", \"heat\", \"defrost\", \"defrost\", \"defrost\", \"defrost\", \"heat\", \"off\", \"heat\", \"heat\", \"off\", \"heat\", \"off\", \"heat\", \"heat\", \"heat\", \"heat\", \"defrost\", \"defrost\"], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}