{"abstract":"Near the balance point the compressor and auxiliary heat swap every sample as outdoor temperature jitters.","category":"HVAC thermostat control","checks":8,"contract":"Heat pump with electric auxiliary heat; samples are [indoor, outdoor, mode] in tenths F. The compressor is locked out when outdoor < comp_lockout and released when outdoor >= comp_lockout + 2.0 F. Stage 1 demand is indoor < sp - 1.0 F, stage 2 is indoor < sp - 3.0 F. Emergency mode: no compressor, aux on stage-1 demand. Compressor locked out: aux replaces it on stage-1 demand regardless of the aux lockout. Otherwise the compressor serves stage 1 and aux serves stage 2 only when outdoor <= aux_lockout. Return [compressor, aux] per sample.","contract_signature":"settings, samples","evaluation_group":"w2-hvac-thermostat-control-heat-pump-balance-lockouts","failed_approach":"Locking below the release temperature without state keeps the compressor off too long and still has no memory.","family":"w2-hvac-thermostat-control-heat-pump-balance-lockouts-lockout-hysteresis","id":"FA-92416","implementations":{"attempt":{"sha256":"cc0ba5df2e1bb75cf58f4b760d5b5fc243b46d37fabc798656645d064ab30546","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(settings, samples):\n    locked = False\n    out = []\n    for indoor, outdoor, mode in samples:\n        locked = outdoor < settings['comp_lockout'] + 20\n        stage1 = indoor < settings['sp'] - 10\n        stage2 = indoor < settings['sp'] - 30\n        if mode == 'emergency':\n            comp, aux = False, stage1\n        elif locked:\n            comp, aux = False, stage1\n        else:\n            comp = stage1\n            aux = stage2 and outdoor <= settings['aux_lockout']\n        out.append([comp, aux])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: lockout band',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 260},\n    [[680, 300, 'normal'],\n     [660, 300, 'normal'],\n     [680, 240, 'normal'],\n     [680, 265, 'normal'],\n     [680, 275, 'normal'],\n     [680, 275, 'emergency'],\n     [705, 275, 'normal']]],\n   [[True, False],\n    [True, False],\n    [False, True],\n    [False, True],\n    [True, False],\n    [False, True],\n    [False, False]]],\n  ['regression: scenario 11',\n   [{'sp': 700, 'comp_lockout': 100, 'aux_lockout': 260},\n    [[673, 167, 'emergency'],\n     [676, 142, 'normal'],\n     [700, 107, 'normal'],\n     [686, 119, 'normal'],\n     [651, 114, 'normal'],\n     [674, 78, 'normal'],\n     [699, 85, 'normal'],\n     [689, 119, 'normal'],\n     [666, 128, 'normal'],\n     [709, 159, 'normal'],\n     [667, 190, 'emergency'],\n     [645, 174, 'normal']]],\n   [[False, True],\n    [True, False],\n    [False, False],\n    [True, False],\n    [True, True],\n    [False, True],\n    [False, False],\n    [False, True],\n    [True, True],\n    [False, False],\n    [False, True],\n    [True, True]]],\n  ['control: emergency deep demand',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 260},\n    [[660, 300, 'emergency'], [685, 300, 'emergency'], [660, 200, 'emergency']]],\n   [[False, True], [False, True], [False, True]]],\n  ['control: mild weather second stage',\n   [{'sp': 700, 'comp_lockout': 100, 'aux_lockout': 350},\n    [[660, 300, 'normal'], [660, 400, 'normal'], [685, 300, 'normal']]],\n   [[True, True], [True, False], [True, False]]],\n  ['control: scenario 1',\n   [{'sp': 700, 'comp_lockout': 100, 'aux_lockout': 400},\n    [[687, 348, 'normal'],\n     [652, 381, 'normal'],\n     [674, 420, 'normal'],\n     [677, 440, 'normal'],\n     [683, 450, 'normal'],\n     [663, 450, 'normal'],\n     [653, 450, 'emergency'],\n     [676, 450, 'normal']]],\n   [[True, False],\n    [True, True],\n    [True, False],\n    [True, False],\n    [True, False],\n    [True, False],\n    [False, True],\n    [True, False]]],\n  ['control: scenario 2',\n   [{'sp': 700, 'comp_lockout': 200, 'aux_lockout': 350},\n    [[699, 249, 'normal'],\n     [700, 272, 'normal'],\n     [645, 234, 'normal'],\n     [690, 236, 'normal'],\n     [673, 263, 'normal'],\n     [640, 258, 'normal'],\n     [654, 238, 'normal'],\n     [643, 242, 'normal'],\n     [684, 258, 'normal'],\n     [708, 254, 'normal'],\n     [694, 251, 'normal']]],\n   [[False, False],\n    [False, False],\n    [True, True],\n    [False, False],\n    [True, False],\n    [True, True],\n    [True, True],\n    [True, True],\n    [True, False],\n    [False, False],\n    [False, False]]],\n  ['control: scenario 3',\n   [{'sp': 700, 'comp_lockout': 100, 'aux_lockout': 400},\n    [[686, 162, 'normal'],\n     [670, 135, 'normal'],\n     [670, 167, 'normal'],\n     [669, 193, 'normal'],\n     [644, 179, 'normal'],\n     [688, 208, 'normal'],\n     [667, 194, 'normal'],\n     [675, 157, 'emergency'],\n     [694, 183, 'normal']]],\n   [[True, False],\n    [True, False],\n    [True, False],\n    [True, True],\n    [True, True],\n    [True, False],\n    [True, True],\n    [False, True],\n    [False, False]]],\n  ['control: scenario 4',\n   [{'sp': 700, 'comp_lockout': 100, 'aux_lockout': 400},\n    [[644, 286, 'normal'],\n     [705, 298, 'normal'],\n     [682, 281, 'emergency'],\n     [671, 281, 'normal'],\n     [648, 278, 'normal'],\n     [676, 245, 'normal'],\n     [688, 265, 'normal'],\n     [709, 228, 'normal'],\n     [660, 218, 'normal'],\n     [665, 244, 'normal'],\n     [644, 223, 'emergency']]],\n   [[True, True],\n    [False, False],\n    [False, True],\n    [True, False],\n    [True, True],\n    [True, False],\n    [True, False],\n    [False, False],\n    [True, True],\n    [True, True],\n    [False, True]]]],\n [['regression: scenario 13',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 350},\n    [[710, 253, 'emergency'],\n     [657, 222, 'normal'],\n     [664, 261, 'normal'],\n     [691, 223, 'emergency'],\n     [655, 231, 'normal'],\n     [668, 223, 'emergency'],\n     [693, 257, 'normal'],\n     [662, 290, 'normal'],\n     [674, 324, 'normal'],\n     [663, 291, 'normal'],\n     [660, 322, 'normal']]],\n   [[False, False],\n    [False, True],\n    [False, True],\n    [False, False],\n    [False, True],\n    [False, True],\n    [False, False],\n    [True, True],\n    [True, False],\n    [True, True],\n    [True, True]]],\n  ['regression: scenario 3',\n   [{'sp': 700, 'comp_lockout': 200, 'aux_lockout': 260},\n    [[692, 278, 'normal'],\n     [691, 268, 'normal'],\n     [684, 292, 'normal'],\n     [688, 283, 'normal'],\n     [653, 265, 'normal'],\n     [680, 269, 'emergency'],\n     [707, 242, 'normal'],\n     [669, 239, 'emergency'],\n     [643, 234, 'normal'],\n     [651, 213, 'normal'],\n     [644, 185, 'normal'],\n     [647, 176, 'normal'],\n     [663, 170, 'normal']]],\n   [[False, False],\n    [False, False],\n    [True, False],\n    [True, False],\n    [True, False],\n    [False, True],\n    [False, False],\n    [False, True],\n    [True, True],\n    [True, True],\n    [False, True],\n    [False, True],\n    [False, True]]],\n  ['regression: lockout band',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 260},\n    [[680, 300, 'normal'],\n     [660, 300, 'normal'],\n     [680, 240, 'normal'],\n     [680, 265, 'normal'],\n     [680, 275, 'normal'],\n     [680, 275, 'emergency'],\n     [705, 275, 'normal']]],\n   [[True, False],\n    [True, False],\n    [False, True],\n    [False, True],\n    [True, False],\n    [False, True],\n    [False, False]]],\n  ['control: emergency deep demand',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 260},\n    [[660, 300, 'emergency'], [685, 300, 'emergency'], [660, 200, 'emergency']]],\n   [[False, True], [False, True], [False, True]]],\n  ['control: mild weather second stage',\n   [{'sp': 700, 'comp_lockout': 100, 'aux_lockout': 350},\n    [[660, 300, 'normal'], [660, 400, 'normal'], [685, 300, 'normal']]],\n   [[True, True], [True, False], [True, False]]],\n  ['control: scenario 1',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 400},\n    [[678, 181, 'normal'],\n     [678, 142, 'normal'],\n     [683, 132, 'normal'],\n     [658, 153, 'normal'],\n     [693, 132, 'normal'],\n     [649, 113, 'normal'],\n     [678, 138, 'emergency'],\n     [696, 166, 'emergency']]],\n   [[False, True],\n    [False, True],\n    [False, True],\n    [False, True],\n    [False, False],\n    [False, True],\n    [False, True],\n    [False, False]]],\n  ['regression: scenario 2',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 350},\n    [[697, 219, 'normal'],\n     [704, 237, 'normal'],\n     [668, 209, 'emergency'],\n     [683, 245, 'normal'],\n     [642, 277, 'normal'],\n     [657, 316, 'normal'],\n     [702, 302, 'normal'],\n     [678, 281, 'normal'],\n     [661, 253, 'normal']]],\n   [[False, False],\n    [False, False],\n    [False, True],\n    [False, True],\n    [True, True],\n    [True, True],\n    [False, False],\n    [True, False],\n    [True, True]]],\n  ['control: scenario 4',\n   [{'sp': 700, 'comp_lockout': 100, 'aux_lockout': 400},\n    [[698, 201, 'normal'],\n     [643, 184, 'normal'],\n     [672, 162, 'normal'],\n     [705, 174, 'normal'],\n     [677, 136, 'normal'],\n     [672, 158, 'normal'],\n     [648, 177, 'emergency'],\n     [670, 217, 'normal'],\n     [654, 224, 'normal'],\n     [658, 203, 'normal'],\n     [659, 228, 'normal'],\n     [710, 227, 'normal']]],\n   [[False, False],\n    [True, True],\n    [True, False],\n    [False, False],\n    [True, False],\n    [True, False],\n    [False, True],\n    [True, False],\n    [True, True],\n    [True, True],\n    [True, True],\n    [False, False]]]],\n [['regression: scenario 5',\n   [{'sp': 700, 'comp_lockout': 200, 'aux_lockout': 400},\n    [[660, 230, 'emergency'],\n     [682, 226, 'normal'],\n     [678, 266, 'normal'],\n     [651, 246, 'normal'],\n     [666, 260, 'normal'],\n     [710, 220, 'normal'],\n     [691, 190, 'normal'],\n     [700, 168, 'emergency'],\n     [661, 186, 'normal'],\n     [665, 195, 'normal'],\n     [666, 222, 'normal'],\n     [697, 194, 'normal'],\n     [677, 202, 'normal']]],\n   [[False, True],\n    [True, False],\n    [True, False],\n    [True, True],\n    [True, True],\n    [False, False],\n    [False, False],\n    [False, False],\n    [False, True],\n    [False, True],\n    [True, True],\n    [False, False],\n    [False, True]]],\n  ['regression: scenario 26',\n   [{'sp': 700, 'comp_lockout': 100, 'aux_lockout': 400},\n    [[684, 153, 'normal'],\n     [644, 179, 'normal'],\n     [710, 153, 'normal'],\n     [669, 122, 'normal'],\n     [682, 158, 'normal'],\n     [654, 138, 'normal'],\n     [662, 142, 'normal'],\n     [684, 119, 'normal'],\n     [660, 122, 'normal'],\n     [705, 148, 'normal'],\n     [709, 180, 'normal'],\n     [659, 175, 'normal'],\n     [705, 158, 'normal']]],\n   [[True, False],\n    [True, True],\n    [False, False],\n    [True, True],\n    [True, False],\n    [True, True],\n    [True, True],\n    [True, False],\n    [True, True],\n    [False, False],\n    [False, False],\n    [True, True],\n    [False, False]]],\n  ['regression: lockout band',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 260},\n    [[680, 300, 'normal'],\n     [660, 300, 'normal'],\n     [680, 240, 'normal'],\n     [680, 265, 'normal'],\n     [680, 275, 'normal'],\n     [680, 275, 'emergency'],\n     [705, 275, 'normal']]],\n   [[True, False],\n    [True, False],\n    [False, True],\n    [False, True],\n    [True, False],\n    [False, True],\n    [False, False]]],\n  ['control: emergency deep demand',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 260},\n    [[660, 300, 'emergency'], [685, 300, 'emergency'], [660, 200, 'emergency']]],\n   [[False, True], [False, True], [False, True]]],\n  ['control: mild weather second stage',\n   [{'sp': 700, 'comp_lockout': 100, 'aux_lockout': 350},\n    [[660, 300, 'normal'], [660, 400, 'normal'], [685, 300, 'normal']]],\n   [[True, True], [True, False], [True, False]]],\n  ['control: scenario 1',\n   [{'sp': 700, 'comp_lockout': 100, 'aux_lockout': 350},\n    [[656, 273, 'normal'],\n     [679, 265, 'normal'],\n     [672, 284, 'emergency'],\n     [690, 310, 'normal'],\n     [697, 308, 'normal'],\n     [641, 322, 'emergency'],\n     [679, 346, 'normal'],\n     [640, 329, 'normal']]],\n   [[True, True],\n    [True, False],\n    [False, True],\n    [False, False],\n    [False, False],\n    [False, True],\n    [True, False],\n    [True, True]]],\n  ['regression: scenario 2',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 350},\n    [[672, 231, 'normal'],\n     [699, 194, 'normal'],\n     [704, 214, 'emergency'],\n     [667, 230, 'normal'],\n     [666, 253, 'normal'],\n     [654, 226, 'emergency'],\n     [693, 222, 'normal'],\n     [664, 244, 'normal'],\n     [687, 282, 'normal']]],\n   [[False, True],\n    [False, False],\n    [False, False],\n    [False, True],\n    [False, True],\n    [False, True],\n    [False, False],\n    [False, True],\n    [True, False]]],\n  ['control: scenario 3',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 400},\n    [[678, 176, 'normal'],\n     [691, 141, 'normal'],\n     [686, 110, 'normal'],\n     [675, 124, 'emergency'],\n     [703, 99, 'normal'],\n     [680, 101, 'normal'],\n     [698, 114, 'normal'],\n     [672, 121, 'emergency'],\n     [691, 83, 'normal'],\n     [656, 108, 'emergency'],\n     [692, 99, 'emergency'],\n     [643, 79, 'normal'],\n     [648, 52, 'emergency']]],\n   [[False, True],\n    [False, False],\n    [False, True],\n    [False, True],\n    [False, False],\n    [False, True],\n    [False, False],\n    [False, True],\n    [False, False],\n    [False, True],\n    [False, False],\n    [False, True],\n    [False, True]]]],\n [['regression: scenario 30',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 400},\n    [[658, 169, 'normal'],\n     [681, 176, 'normal'],\n     [691, 189, 'normal'],\n     [677, 190, 'normal'],\n     [707, 214, 'normal'],\n     [691, 222, 'normal'],\n     [656, 251, 'normal'],\n     [642, 273, 'emergency'],\n     [708, 246, 'normal'],\n     [694, 243, 'normal'],\n     [671, 203, 'emergency'],\n     [697, 231, 'normal']]],\n   [[False, True],\n    [False, True],\n    [False, False],\n    [False, True],\n    [False, False],\n    [False, False],\n    [False, True],\n    [False, True],\n    [False, False],\n    [False, False],\n    [False, True],\n    [False, False]]],\n  ['regression: scenario 59',\n   [{'sp': 700, 'comp_lockout': 200, 'aux_lockout': 350},\n    [[665, 339, 'normal'],\n     [643, 312, 'normal'],\n     [676, 307, 'normal'],\n     [671, 289, 'normal'],\n     [664, 274, 'normal'],\n     [666, 282, 'normal'],\n     [700, 283, 'emergency'],\n     [693, 262, 'normal'],\n     [651, 238, 'normal'],\n     [670, 219, 'normal'],\n     [684, 253, 'normal'],\n     [668, 215, 'normal'],\n     [668, 187, 'normal'],\n     [692, 218, 'normal']]],\n   [[True, True],\n    [True, True],\n    [True, False],\n    [True, False],\n    [True, True],\n    [True, True],\n    [False, False],\n    [False, False],\n    [True, True],\n    [True, False],\n    [True, False],\n    [True, True],\n    [False, True],\n    [False, False]]],\n  ['regression: lockout band',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 260},\n    [[680, 300, 'normal'],\n     [660, 300, 'normal'],\n     [680, 240, 'normal'],\n     [680, 265, 'normal'],\n     [680, 275, 'normal'],\n     [680, 275, 'emergency'],\n     [705, 275, 'normal']]],\n   [[True, False],\n    [True, False],\n    [False, True],\n    [False, True],\n    [True, False],\n    [False, True],\n    [False, False]]],\n  ['control: emergency deep demand',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 260},\n    [[660, 300, 'emergency'], [685, 300, 'emergency'], [660, 200, 'emergency']]],\n   [[False, True], [False, True], [False, True]]],\n  ['control: mild weather second stage',\n   [{'sp': 700, 'comp_lockout': 100, 'aux_lockout': 350},\n    [[660, 300, 'normal'], [660, 400, 'normal'], [685, 300, 'normal']]],\n   [[True, True], [True, False], [True, False]]],\n  ['control: scenario 1',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 350},\n    [[646, 150, 'normal'],\n     [640, 123, 'normal'],\n     [670, 110, 'normal'],\n     [675, 118, 'normal'],\n     [648, 101, 'normal'],\n     [649, 91, 'normal'],\n     [710, 74, 'normal'],\n     [697, 95, 'normal'],\n     [708, 135, 'normal'],\n     [649, 147, 'normal'],\n     [671, 109, 'normal'],\n     [710, 89, 'normal']]],\n   [[False, True],\n    [False, True],\n    [False, True],\n    [False, True],\n    [False, True],\n    [False, True],\n    [False, False],\n    [False, False],\n    [False, False],\n    [False, True],\n    [False, True],\n    [False, False]]],\n  ['control: scenario 2',\n   [{'sp': 700, 'comp_lockout': 100, 'aux_lockout': 260},\n    [[658, 406, 'emergency'],\n     [643, 441, 'emergency'],\n     [654, 450, 'normal'],\n     [657, 450, 'normal'],\n     [665, 450, 'normal'],\n     [695, 448, 'normal'],\n     [697, 442, 'normal'],\n     [675, 450, 'normal'],\n     [708, 418, 'emergency'],\n     [709, 386, 'normal'],\n     [681, 419, 'normal']]],\n   [[False, True],\n    [False, True],\n    [True, False],\n    [True, False],\n    [True, False],\n    [False, False],\n    [False, False],\n    [True, False],\n    [False, False],\n    [False, False],\n    [True, False]]],\n  ['control: scenario 3',\n   [{'sp': 700, 'comp_lockout': 200, 'aux_lockout': 350},\n    [[690, 409, 'emergency'],\n     [686, 373, 'normal'],\n     [681, 348, 'normal'],\n     [644, 353, 'normal'],\n     [673, 341, 'normal'],\n     [673, 370, 'emergency'],\n     [680, 331, 'normal'],\n     [708, 324, 'normal'],\n     [641, 331, 'normal'],\n     [660, 331, 'normal'],\n     [697, 361, 'normal'],\n     [691, 365, 'emergency'],\n     [667, 390, 'normal']]],\n   [[False, False],\n    [True, False],\n    [True, False],\n    [True, False],\n    [True, False],\n    [False, True],\n    [True, False],\n    [False, False],\n    [True, True],\n    [True, True],\n    [False, False],\n    [False, False],\n    [True, False]]]],\n [['regression: scenario 56',\n   [{'sp': 700, 'comp_lockout': 200, 'aux_lockout': 260},\n    [[687, 188, 'normal'],\n     [695, 188, 'normal'],\n     [667, 213, 'normal'],\n     [682, 248, 'emergency'],\n     [666, 278, 'normal'],\n     [694, 258, 'normal'],\n     [644, 298, 'normal'],\n     [678, 280, 'normal'],\n     [695, 250, 'normal'],\n     [700, 231, 'normal'],\n     [687, 237, 'normal'],\n     [677, 248, 'emergency'],\n     [642, 275, 'normal'],\n     [692, 237, 'normal']]],\n   [[False, True],\n    [False, False],\n    [False, True],\n    [False, True],\n    [True, False],\n    [False, False],\n    [True, False],\n    [True, False],\n    [False, False],\n    [False, False],\n    [True, False],\n    [False, True],\n    [True, False],\n    [False, False]]],\n  ['regression: scenario 33',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 400},\n    [[641, 231, 'normal'],\n     [675, 205, 'normal'],\n     [686, 205, 'normal'],\n     [699, 218, 'normal'],\n     [645, 241, 'emergency'],\n     [657, 237, 'normal'],\n     [686, 217, 'normal'],\n     [644, 249, 'normal'],\n     [642, 272, 'normal'],\n     [668, 258, 'normal'],\n     [679, 222, 'emergency'],\n     [671, 252, 'normal']]],\n   [[False, True],\n    [False, True],\n    [False, True],\n    [False, False],\n    [False, True],\n    [False, True],\n    [False, True],\n    [False, True],\n    [True, True],\n    [True, True],\n    [False, True],\n    [False, True]]],\n  ['regression: lockout band',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 260},\n    [[680, 300, 'normal'],\n     [660, 300, 'normal'],\n     [680, 240, 'normal'],\n     [680, 265, 'normal'],\n     [680, 275, 'normal'],\n     [680, 275, 'emergency'],\n     [705, 275, 'normal']]],\n   [[True, False],\n    [True, False],\n    [False, True],\n    [False, True],\n    [True, False],\n    [False, True],\n    [False, False]]],\n  ['control: emergency deep demand',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 260},\n    [[660, 300, 'emergency'], [685, 300, 'emergency'], [660, 200, 'emergency']]],\n   [[False, True], [False, True], [False, True]]],\n  ['control: mild weather second stage',\n   [{'sp': 700, 'comp_lockout': 100, 'aux_lockout': 350},\n    [[660, 300, 'normal'], [660, 400, 'normal'], [685, 300, 'normal']]],\n   [[True, True], [True, False], [True, False]]],\n  ['control: scenario 1',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 260},\n    [[678, 197, 'normal'],\n     [653, 218, 'normal'],\n     [654, 208, 'normal'],\n     [686, 178, 'normal'],\n     [675, 155, 'normal'],\n     [678, 163, 'normal'],\n     [708, 201, 'normal'],\n     [702, 220, 'normal'],\n     [697, 255, 'normal']]],\n   [[False, True],\n    [False, True],\n    [False, True],\n    [False, True],\n    [False, True],\n    [False, True],\n    [False, False],\n    [False, False],\n    [False, False]]],\n  ['control: scenario 2',\n   [{'sp': 700, 'comp_lockout': 200, 'aux_lockout': 350},\n    [[696, 417, 'normal'],\n     [700, 441, 'normal'],\n     [669, 443, 'normal'],\n     [695, 420, 'normal'],\n     [699, 380, 'normal'],\n     [657, 360, 'emergency'],\n     [665, 359, 'normal'],\n     [646, 335, 'emergency'],\n     [705, 331, 'normal'],\n     [699, 371, 'emergency'],\n     [696, 334, 'emergency'],\n     [698, 318, 'normal']]],\n   [[False, False],\n    [False, False],\n    [True, False],\n    [False, False],\n    [False, False],\n    [False, True],\n    [True, False],\n    [False, True],\n    [False, False],\n    [False, False],\n    [False, False],\n    [False, False]]],\n  ['control: scenario 3',\n   [{'sp': 700, 'comp_lockout': 100, 'aux_lockout': 350},\n    [[670, 296, 'normal'],\n     [694, 303, 'normal'],\n     [704, 303, 'normal'],\n     [692, 316, 'normal'],\n     [688, 277, 'normal'],\n     [695, 304, 'normal'],\n     [691, 336, 'normal'],\n     [648, 337, 'normal'],\n     [686, 313, 'normal']]],\n   [[True, False],\n    [False, False],\n    [False, False],\n    [False, False],\n    [True, False],\n    [False, False],\n    [False, False],\n    [True, True],\n    [True, 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":"ee58b20a093811752cb8a65bb4d72ef7b635850a763fd74c9c5fd9a99e19626b","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(settings, samples):\n    locked = False\n    out = []\n    for indoor, outdoor, mode in samples:\n        locked = outdoor < settings['comp_lockout']\n        stage1 = indoor < settings['sp'] - 10\n        stage2 = indoor < settings['sp'] - 30\n        if mode == 'emergency':\n            comp, aux = False, stage1\n        elif locked:\n            comp, aux = False, stage1\n        else:\n            comp = stage1\n            aux = stage2 and outdoor <= settings['aux_lockout']\n        out.append([comp, aux])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: lockout band',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 260},\n    [[680, 300, 'normal'],\n     [660, 300, 'normal'],\n     [680, 240, 'normal'],\n     [680, 265, 'normal'],\n     [680, 275, 'normal'],\n     [680, 275, 'emergency'],\n     [705, 275, 'normal']]],\n   [[True, False],\n    [True, False],\n    [False, True],\n    [False, True],\n    [True, False],\n    [False, True],\n    [False, False]]],\n  ['regression: scenario 11',\n   [{'sp': 700, 'comp_lockout': 100, 'aux_lockout': 260},\n    [[673, 167, 'emergency'],\n     [676, 142, 'normal'],\n     [700, 107, 'normal'],\n     [686, 119, 'normal'],\n     [651, 114, 'normal'],\n     [674, 78, 'normal'],\n     [699, 85, 'normal'],\n     [689, 119, 'normal'],\n     [666, 128, 'normal'],\n     [709, 159, 'normal'],\n     [667, 190, 'emergency'],\n     [645, 174, 'normal']]],\n   [[False, True],\n    [True, False],\n    [False, False],\n    [True, False],\n    [True, True],\n    [False, True],\n    [False, False],\n    [False, True],\n    [True, True],\n    [False, False],\n    [False, True],\n    [True, True]]],\n  ['control: emergency deep demand',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 260},\n    [[660, 300, 'emergency'], [685, 300, 'emergency'], [660, 200, 'emergency']]],\n   [[False, True], [False, True], [False, True]]],\n  ['control: mild weather second stage',\n   [{'sp': 700, 'comp_lockout': 100, 'aux_lockout': 350},\n    [[660, 300, 'normal'], [660, 400, 'normal'], [685, 300, 'normal']]],\n   [[True, True], [True, False], [True, False]]],\n  ['control: scenario 1',\n   [{'sp': 700, 'comp_lockout': 100, 'aux_lockout': 400},\n    [[687, 348, 'normal'],\n     [652, 381, 'normal'],\n     [674, 420, 'normal'],\n     [677, 440, 'normal'],\n     [683, 450, 'normal'],\n     [663, 450, 'normal'],\n     [653, 450, 'emergency'],\n     [676, 450, 'normal']]],\n   [[True, False],\n    [True, True],\n    [True, False],\n    [True, False],\n    [True, False],\n    [True, False],\n    [False, True],\n    [True, False]]],\n  ['control: scenario 2',\n   [{'sp': 700, 'comp_lockout': 200, 'aux_lockout': 350},\n    [[699, 249, 'normal'],\n     [700, 272, 'normal'],\n     [645, 234, 'normal'],\n     [690, 236, 'normal'],\n     [673, 263, 'normal'],\n     [640, 258, 'normal'],\n     [654, 238, 'normal'],\n     [643, 242, 'normal'],\n     [684, 258, 'normal'],\n     [708, 254, 'normal'],\n     [694, 251, 'normal']]],\n   [[False, False],\n    [False, False],\n    [True, True],\n    [False, False],\n    [True, False],\n    [True, True],\n    [True, True],\n    [True, True],\n    [True, False],\n    [False, False],\n    [False, False]]],\n  ['control: scenario 3',\n   [{'sp': 700, 'comp_lockout': 100, 'aux_lockout': 400},\n    [[686, 162, 'normal'],\n     [670, 135, 'normal'],\n     [670, 167, 'normal'],\n     [669, 193, 'normal'],\n     [644, 179, 'normal'],\n     [688, 208, 'normal'],\n     [667, 194, 'normal'],\n     [675, 157, 'emergency'],\n     [694, 183, 'normal']]],\n   [[True, False],\n    [True, False],\n    [True, False],\n    [True, True],\n    [True, True],\n    [True, False],\n    [True, True],\n    [False, True],\n    [False, False]]],\n  ['control: scenario 4',\n   [{'sp': 700, 'comp_lockout': 100, 'aux_lockout': 400},\n    [[644, 286, 'normal'],\n     [705, 298, 'normal'],\n     [682, 281, 'emergency'],\n     [671, 281, 'normal'],\n     [648, 278, 'normal'],\n     [676, 245, 'normal'],\n     [688, 265, 'normal'],\n     [709, 228, 'normal'],\n     [660, 218, 'normal'],\n     [665, 244, 'normal'],\n     [644, 223, 'emergency']]],\n   [[True, True],\n    [False, False],\n    [False, True],\n    [True, False],\n    [True, True],\n    [True, False],\n    [True, False],\n    [False, False],\n    [True, True],\n    [True, True],\n    [False, True]]]],\n [['regression: scenario 13',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 350},\n    [[710, 253, 'emergency'],\n     [657, 222, 'normal'],\n     [664, 261, 'normal'],\n     [691, 223, 'emergency'],\n     [655, 231, 'normal'],\n     [668, 223, 'emergency'],\n     [693, 257, 'normal'],\n     [662, 290, 'normal'],\n     [674, 324, 'normal'],\n     [663, 291, 'normal'],\n     [660, 322, 'normal']]],\n   [[False, False],\n    [False, True],\n    [False, True],\n    [False, False],\n    [False, True],\n    [False, True],\n    [False, False],\n    [True, True],\n    [True, False],\n    [True, True],\n    [True, True]]],\n  ['regression: scenario 3',\n   [{'sp': 700, 'comp_lockout': 200, 'aux_lockout': 260},\n    [[692, 278, 'normal'],\n     [691, 268, 'normal'],\n     [684, 292, 'normal'],\n     [688, 283, 'normal'],\n     [653, 265, 'normal'],\n     [680, 269, 'emergency'],\n     [707, 242, 'normal'],\n     [669, 239, 'emergency'],\n     [643, 234, 'normal'],\n     [651, 213, 'normal'],\n     [644, 185, 'normal'],\n     [647, 176, 'normal'],\n     [663, 170, 'normal']]],\n   [[False, False],\n    [False, False],\n    [True, False],\n    [True, False],\n    [True, False],\n    [False, True],\n    [False, False],\n    [False, True],\n    [True, True],\n    [True, True],\n    [False, True],\n    [False, True],\n    [False, True]]],\n  ['regression: lockout band',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 260},\n    [[680, 300, 'normal'],\n     [660, 300, 'normal'],\n     [680, 240, 'normal'],\n     [680, 265, 'normal'],\n     [680, 275, 'normal'],\n     [680, 275, 'emergency'],\n     [705, 275, 'normal']]],\n   [[True, False],\n    [True, False],\n    [False, True],\n    [False, True],\n    [True, False],\n    [False, True],\n    [False, False]]],\n  ['control: emergency deep demand',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 260},\n    [[660, 300, 'emergency'], [685, 300, 'emergency'], [660, 200, 'emergency']]],\n   [[False, True], [False, True], [False, True]]],\n  ['control: mild weather second stage',\n   [{'sp': 700, 'comp_lockout': 100, 'aux_lockout': 350},\n    [[660, 300, 'normal'], [660, 400, 'normal'], [685, 300, 'normal']]],\n   [[True, True], [True, False], [True, False]]],\n  ['control: scenario 1',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 400},\n    [[678, 181, 'normal'],\n     [678, 142, 'normal'],\n     [683, 132, 'normal'],\n     [658, 153, 'normal'],\n     [693, 132, 'normal'],\n     [649, 113, 'normal'],\n     [678, 138, 'emergency'],\n     [696, 166, 'emergency']]],\n   [[False, True],\n    [False, True],\n    [False, True],\n    [False, True],\n    [False, False],\n    [False, True],\n    [False, True],\n    [False, False]]],\n  ['regression: scenario 2',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 350},\n    [[697, 219, 'normal'],\n     [704, 237, 'normal'],\n     [668, 209, 'emergency'],\n     [683, 245, 'normal'],\n     [642, 277, 'normal'],\n     [657, 316, 'normal'],\n     [702, 302, 'normal'],\n     [678, 281, 'normal'],\n     [661, 253, 'normal']]],\n   [[False, False],\n    [False, False],\n    [False, True],\n    [False, True],\n    [True, True],\n    [True, True],\n    [False, False],\n    [True, False],\n    [True, True]]],\n  ['control: scenario 4',\n   [{'sp': 700, 'comp_lockout': 100, 'aux_lockout': 400},\n    [[698, 201, 'normal'],\n     [643, 184, 'normal'],\n     [672, 162, 'normal'],\n     [705, 174, 'normal'],\n     [677, 136, 'normal'],\n     [672, 158, 'normal'],\n     [648, 177, 'emergency'],\n     [670, 217, 'normal'],\n     [654, 224, 'normal'],\n     [658, 203, 'normal'],\n     [659, 228, 'normal'],\n     [710, 227, 'normal']]],\n   [[False, False],\n    [True, True],\n    [True, False],\n    [False, False],\n    [True, False],\n    [True, False],\n    [False, True],\n    [True, False],\n    [True, True],\n    [True, True],\n    [True, True],\n    [False, False]]]],\n [['regression: scenario 5',\n   [{'sp': 700, 'comp_lockout': 200, 'aux_lockout': 400},\n    [[660, 230, 'emergency'],\n     [682, 226, 'normal'],\n     [678, 266, 'normal'],\n     [651, 246, 'normal'],\n     [666, 260, 'normal'],\n     [710, 220, 'normal'],\n     [691, 190, 'normal'],\n     [700, 168, 'emergency'],\n     [661, 186, 'normal'],\n     [665, 195, 'normal'],\n     [666, 222, 'normal'],\n     [697, 194, 'normal'],\n     [677, 202, 'normal']]],\n   [[False, True],\n    [True, False],\n    [True, False],\n    [True, True],\n    [True, True],\n    [False, False],\n    [False, False],\n    [False, False],\n    [False, True],\n    [False, True],\n    [True, True],\n    [False, False],\n    [False, True]]],\n  ['regression: scenario 26',\n   [{'sp': 700, 'comp_lockout': 100, 'aux_lockout': 400},\n    [[684, 153, 'normal'],\n     [644, 179, 'normal'],\n     [710, 153, 'normal'],\n     [669, 122, 'normal'],\n     [682, 158, 'normal'],\n     [654, 138, 'normal'],\n     [662, 142, 'normal'],\n     [684, 119, 'normal'],\n     [660, 122, 'normal'],\n     [705, 148, 'normal'],\n     [709, 180, 'normal'],\n     [659, 175, 'normal'],\n     [705, 158, 'normal']]],\n   [[True, False],\n    [True, True],\n    [False, False],\n    [True, True],\n    [True, False],\n    [True, True],\n    [True, True],\n    [True, False],\n    [True, True],\n    [False, False],\n    [False, False],\n    [True, True],\n    [False, False]]],\n  ['regression: lockout band',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 260},\n    [[680, 300, 'normal'],\n     [660, 300, 'normal'],\n     [680, 240, 'normal'],\n     [680, 265, 'normal'],\n     [680, 275, 'normal'],\n     [680, 275, 'emergency'],\n     [705, 275, 'normal']]],\n   [[True, False],\n    [True, False],\n    [False, True],\n    [False, True],\n    [True, False],\n    [False, True],\n    [False, False]]],\n  ['control: emergency deep demand',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 260},\n    [[660, 300, 'emergency'], [685, 300, 'emergency'], [660, 200, 'emergency']]],\n   [[False, True], [False, True], [False, True]]],\n  ['control: mild weather second stage',\n   [{'sp': 700, 'comp_lockout': 100, 'aux_lockout': 350},\n    [[660, 300, 'normal'], [660, 400, 'normal'], [685, 300, 'normal']]],\n   [[True, True], [True, False], [True, False]]],\n  ['control: scenario 1',\n   [{'sp': 700, 'comp_lockout': 100, 'aux_lockout': 350},\n    [[656, 273, 'normal'],\n     [679, 265, 'normal'],\n     [672, 284, 'emergency'],\n     [690, 310, 'normal'],\n     [697, 308, 'normal'],\n     [641, 322, 'emergency'],\n     [679, 346, 'normal'],\n     [640, 329, 'normal']]],\n   [[True, True],\n    [True, False],\n    [False, True],\n    [False, False],\n    [False, False],\n    [False, True],\n    [True, False],\n    [True, True]]],\n  ['regression: scenario 2',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 350},\n    [[672, 231, 'normal'],\n     [699, 194, 'normal'],\n     [704, 214, 'emergency'],\n     [667, 230, 'normal'],\n     [666, 253, 'normal'],\n     [654, 226, 'emergency'],\n     [693, 222, 'normal'],\n     [664, 244, 'normal'],\n     [687, 282, 'normal']]],\n   [[False, True],\n    [False, False],\n    [False, False],\n    [False, True],\n    [False, True],\n    [False, True],\n    [False, False],\n    [False, True],\n    [True, False]]],\n  ['control: scenario 3',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 400},\n    [[678, 176, 'normal'],\n     [691, 141, 'normal'],\n     [686, 110, 'normal'],\n     [675, 124, 'emergency'],\n     [703, 99, 'normal'],\n     [680, 101, 'normal'],\n     [698, 114, 'normal'],\n     [672, 121, 'emergency'],\n     [691, 83, 'normal'],\n     [656, 108, 'emergency'],\n     [692, 99, 'emergency'],\n     [643, 79, 'normal'],\n     [648, 52, 'emergency']]],\n   [[False, True],\n    [False, False],\n    [False, True],\n    [False, True],\n    [False, False],\n    [False, True],\n    [False, False],\n    [False, True],\n    [False, False],\n    [False, True],\n    [False, False],\n    [False, True],\n    [False, True]]]],\n [['regression: scenario 30',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 400},\n    [[658, 169, 'normal'],\n     [681, 176, 'normal'],\n     [691, 189, 'normal'],\n     [677, 190, 'normal'],\n     [707, 214, 'normal'],\n     [691, 222, 'normal'],\n     [656, 251, 'normal'],\n     [642, 273, 'emergency'],\n     [708, 246, 'normal'],\n     [694, 243, 'normal'],\n     [671, 203, 'emergency'],\n     [697, 231, 'normal']]],\n   [[False, True],\n    [False, True],\n    [False, False],\n    [False, True],\n    [False, False],\n    [False, False],\n    [False, True],\n    [False, True],\n    [False, False],\n    [False, False],\n    [False, True],\n    [False, False]]],\n  ['regression: scenario 59',\n   [{'sp': 700, 'comp_lockout': 200, 'aux_lockout': 350},\n    [[665, 339, 'normal'],\n     [643, 312, 'normal'],\n     [676, 307, 'normal'],\n     [671, 289, 'normal'],\n     [664, 274, 'normal'],\n     [666, 282, 'normal'],\n     [700, 283, 'emergency'],\n     [693, 262, 'normal'],\n     [651, 238, 'normal'],\n     [670, 219, 'normal'],\n     [684, 253, 'normal'],\n     [668, 215, 'normal'],\n     [668, 187, 'normal'],\n     [692, 218, 'normal']]],\n   [[True, True],\n    [True, True],\n    [True, False],\n    [True, False],\n    [True, True],\n    [True, True],\n    [False, False],\n    [False, False],\n    [True, True],\n    [True, False],\n    [True, False],\n    [True, True],\n    [False, True],\n    [False, False]]],\n  ['regression: lockout band',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 260},\n    [[680, 300, 'normal'],\n     [660, 300, 'normal'],\n     [680, 240, 'normal'],\n     [680, 265, 'normal'],\n     [680, 275, 'normal'],\n     [680, 275, 'emergency'],\n     [705, 275, 'normal']]],\n   [[True, False],\n    [True, False],\n    [False, True],\n    [False, True],\n    [True, False],\n    [False, True],\n    [False, False]]],\n  ['control: emergency deep demand',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 260},\n    [[660, 300, 'emergency'], [685, 300, 'emergency'], [660, 200, 'emergency']]],\n   [[False, True], [False, True], [False, True]]],\n  ['control: mild weather second stage',\n   [{'sp': 700, 'comp_lockout': 100, 'aux_lockout': 350},\n    [[660, 300, 'normal'], [660, 400, 'normal'], [685, 300, 'normal']]],\n   [[True, True], [True, False], [True, False]]],\n  ['control: scenario 1',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 350},\n    [[646, 150, 'normal'],\n     [640, 123, 'normal'],\n     [670, 110, 'normal'],\n     [675, 118, 'normal'],\n     [648, 101, 'normal'],\n     [649, 91, 'normal'],\n     [710, 74, 'normal'],\n     [697, 95, 'normal'],\n     [708, 135, 'normal'],\n     [649, 147, 'normal'],\n     [671, 109, 'normal'],\n     [710, 89, 'normal']]],\n   [[False, True],\n    [False, True],\n    [False, True],\n    [False, True],\n    [False, True],\n    [False, True],\n    [False, False],\n    [False, False],\n    [False, False],\n    [False, True],\n    [False, True],\n    [False, False]]],\n  ['control: scenario 2',\n   [{'sp': 700, 'comp_lockout': 100, 'aux_lockout': 260},\n    [[658, 406, 'emergency'],\n     [643, 441, 'emergency'],\n     [654, 450, 'normal'],\n     [657, 450, 'normal'],\n     [665, 450, 'normal'],\n     [695, 448, 'normal'],\n     [697, 442, 'normal'],\n     [675, 450, 'normal'],\n     [708, 418, 'emergency'],\n     [709, 386, 'normal'],\n     [681, 419, 'normal']]],\n   [[False, True],\n    [False, True],\n    [True, False],\n    [True, False],\n    [True, False],\n    [False, False],\n    [False, False],\n    [True, False],\n    [False, False],\n    [False, False],\n    [True, False]]],\n  ['control: scenario 3',\n   [{'sp': 700, 'comp_lockout': 200, 'aux_lockout': 350},\n    [[690, 409, 'emergency'],\n     [686, 373, 'normal'],\n     [681, 348, 'normal'],\n     [644, 353, 'normal'],\n     [673, 341, 'normal'],\n     [673, 370, 'emergency'],\n     [680, 331, 'normal'],\n     [708, 324, 'normal'],\n     [641, 331, 'normal'],\n     [660, 331, 'normal'],\n     [697, 361, 'normal'],\n     [691, 365, 'emergency'],\n     [667, 390, 'normal']]],\n   [[False, False],\n    [True, False],\n    [True, False],\n    [True, False],\n    [True, False],\n    [False, True],\n    [True, False],\n    [False, False],\n    [True, True],\n    [True, True],\n    [False, False],\n    [False, False],\n    [True, False]]]],\n [['regression: scenario 56',\n   [{'sp': 700, 'comp_lockout': 200, 'aux_lockout': 260},\n    [[687, 188, 'normal'],\n     [695, 188, 'normal'],\n     [667, 213, 'normal'],\n     [682, 248, 'emergency'],\n     [666, 278, 'normal'],\n     [694, 258, 'normal'],\n     [644, 298, 'normal'],\n     [678, 280, 'normal'],\n     [695, 250, 'normal'],\n     [700, 231, 'normal'],\n     [687, 237, 'normal'],\n     [677, 248, 'emergency'],\n     [642, 275, 'normal'],\n     [692, 237, 'normal']]],\n   [[False, True],\n    [False, False],\n    [False, True],\n    [False, True],\n    [True, False],\n    [False, False],\n    [True, False],\n    [True, False],\n    [False, False],\n    [False, False],\n    [True, False],\n    [False, True],\n    [True, False],\n    [False, False]]],\n  ['regression: scenario 33',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 400},\n    [[641, 231, 'normal'],\n     [675, 205, 'normal'],\n     [686, 205, 'normal'],\n     [699, 218, 'normal'],\n     [645, 241, 'emergency'],\n     [657, 237, 'normal'],\n     [686, 217, 'normal'],\n     [644, 249, 'normal'],\n     [642, 272, 'normal'],\n     [668, 258, 'normal'],\n     [679, 222, 'emergency'],\n     [671, 252, 'normal']]],\n   [[False, True],\n    [False, True],\n    [False, True],\n    [False, False],\n    [False, True],\n    [False, True],\n    [False, True],\n    [False, True],\n    [True, True],\n    [True, True],\n    [False, True],\n    [False, True]]],\n  ['regression: lockout band',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 260},\n    [[680, 300, 'normal'],\n     [660, 300, 'normal'],\n     [680, 240, 'normal'],\n     [680, 265, 'normal'],\n     [680, 275, 'normal'],\n     [680, 275, 'emergency'],\n     [705, 275, 'normal']]],\n   [[True, False],\n    [True, False],\n    [False, True],\n    [False, True],\n    [True, False],\n    [False, True],\n    [False, False]]],\n  ['control: emergency deep demand',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 260},\n    [[660, 300, 'emergency'], [685, 300, 'emergency'], [660, 200, 'emergency']]],\n   [[False, True], [False, True], [False, True]]],\n  ['control: mild weather second stage',\n   [{'sp': 700, 'comp_lockout': 100, 'aux_lockout': 350},\n    [[660, 300, 'normal'], [660, 400, 'normal'], [685, 300, 'normal']]],\n   [[True, True], [True, False], [True, False]]],\n  ['control: scenario 1',\n   [{'sp': 700, 'comp_lockout': 250, 'aux_lockout': 260},\n    [[678, 197, 'normal'],\n     [653, 218, 'normal'],\n     [654, 208, 'normal'],\n     [686, 178, 'normal'],\n     [675, 155, 'normal'],\n     [678, 163, 'normal'],\n     [708, 201, 'normal'],\n     [702, 220, 'normal'],\n     [697, 255, 'normal']]],\n   [[False, True],\n    [False, True],\n    [False, True],\n    [False, True],\n    [False, True],\n    [False, True],\n    [False, False],\n    [False, False],\n    [False, False]]],\n  ['control: scenario 2',\n   [{'sp': 700, 'comp_lockout': 200, 'aux_lockout': 350},\n    [[696, 417, 'normal'],\n     [700, 441, 'normal'],\n     [669, 443, 'normal'],\n     [695, 420, 'normal'],\n     [699, 380, 'normal'],\n     [657, 360, 'emergency'],\n     [665, 359, 'normal'],\n     [646, 335, 'emergency'],\n     [705, 331, 'normal'],\n     [699, 371, 'emergency'],\n     [696, 334, 'emergency'],\n     [698, 318, 'normal']]],\n   [[False, False],\n    [False, False],\n    [True, False],\n    [False, False],\n    [False, False],\n    [False, True],\n    [True, False],\n    [False, True],\n    [False, False],\n    [False, False],\n    [False, False],\n    [False, False]]],\n  ['control: scenario 3',\n   [{'sp': 700, 'comp_lockout': 100, 'aux_lockout': 350},\n    [[670, 296, 'normal'],\n     [694, 303, 'normal'],\n     [704, 303, 'normal'],\n     [692, 316, 'normal'],\n     [688, 277, 'normal'],\n     [695, 304, 'normal'],\n     [691, 336, 'normal'],\n     [648, 337, 'normal'],\n     [686, 313, 'normal']]],\n   [[True, False],\n    [False, False],\n    [False, False],\n    [False, False],\n    [True, False],\n    [False, False],\n    [False, False],\n    [True, True],\n    [True, 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 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-heat-pump-balance-lockouts-lockout-hysteresis","generated_at":"2026-09-29T14:51:45.599857+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.","root_cause":"Lockout state is recomputed from outdoor < comp_lockout each sample.","sha256":"60011717df5f40bc885b69edc49a20a4aa4fe51e53a03f264e44d944fc81bb9b","title":"Heat pump compressor lockout has no release differential · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verified":true,"visibility":"public","verification":{"attempt":{"elapsed_ms":40.801,"exit_code":1,"observations":[{"actual":[[true,false],[true,false],[false,true],[false,true],[true,false],[false,true],[false,false]],"check":"regression: lockout band","expected":[[true,false],[true,false],[false,true],[false,true],[true,false],[false,true],[false,false]],"passed":true},{"actual":[[false,true],[true,false],[false,false],[false,true],[false,true],[false,true],[false,false],[false,true],[true,true],[false,false],[false,true],[true,true]],"check":"regression: scenario 11","expected":[[false,true],[true,false],[false,false],[true,false],[true,true],[false,true],[false,false],[false,true],[true,true],[false,false],[false,true],[true,true]],"passed":false},{"actual":[[false,true],[false,true],[false,true]],"check":"control: emergency deep demand","expected":[[false,true],[false,true],[false,true]],"passed":true},{"actual":[[true,true],[true,false],[true,false]],"check":"control: mild weather second stage","expected":[[true,true],[true,false],[true,false]],"passed":true},{"actual":[[true,false],[true,true],[true,false],[true,false],[true,false],[true,false],[false,true],[true,false]],"check":"control: scenario 1","expected":[[true,false],[true,true],[true,false],[true,false],[true,false],[true,false],[false,true],[true,false]],"passed":true},{"actual":[[false,false],[false,false],[true,true],[false,false],[true,false],[true,true],[true,true],[true,true],[true,false],[false,false],[false,false]],"check":"control: scenario 2","expected":[[false,false],[false,false],[true,true],[false,false],[true,false],[true,true],[true,true],[true,true],[true,false],[false,false],[false,false]],"passed":true},{"actual":[[true,false],[true,false],[true,false],[true,true],[true,true],[true,false],[true,true],[false,true],[false,false]],"check":"control: scenario 3","expected":[[true,false],[true,false],[true,false],[true,true],[true,true],[true,false],[true,true],[false,true],[false,false]],"passed":true},{"actual":[[true,true],[false,false],[false,true],[true,false],[true,true],[true,false],[true,false],[false,false],[true,true],[true,true],[false,true]],"check":"control: scenario 4","expected":[[true,true],[false,false],[false,true],[true,false],[true,true],[true,false],[true,false],[false,false],[true,true],[true,true],[false,true]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: lockout band\", \"actual\": [[true, false], [true, false], [false, true], [false, true], [true, false], [false, true], [false, false]], \"expected\": [[true, false], [true, false], [false, true], [false, true], [true, false], [false, true], [false, false]], \"passed\": true}, {\"check\": \"regression: scenario 11\", \"actual\": [[false, true], [true, false], [false, false], [false, true], [false, true], [false, true], [false, false], [false, true], [true, true], [false, false], [false, true], [true, true]], \"expected\": [[false, true], [true, false], [false, false], [true, false], [true, true], [false, true], [false, false], [false, true], [true, true], [false, false], [false, true], [true, true]], \"passed\": false}, {\"check\": \"control: emergency deep demand\", \"actual\": [[false, true], [false, true], [false, true]], \"expected\": [[false, true], [false, true], [false, true]], \"passed\": true}, {\"check\": \"control: mild weather second stage\", \"actual\": [[true, true], [true, false], [true, false]], \"expected\": [[true, true], [true, false], [true, false]], \"passed\": true}, {\"check\": \"control: scenario 1\", \"actual\": [[true, false], [true, true], [true, false], [true, false], [true, false], [true, false], [false, true], [true, false]], \"expected\": [[true, false], [true, true], [true, false], [true, false], [true, false], [true, false], [false, true], [true, false]], \"passed\": true}, {\"check\": \"control: scenario 2\", \"actual\": [[false, false], [false, false], [true, true], [false, false], [true, false], [true, true], [true, true], [true, true], [true, false], [false, false], [false, false]], \"expected\": [[false, false], [false, false], [true, true], [false, false], [true, false], [true, true], [true, true], [true, true], [true, false], [false, false], [false, false]], \"passed\": true}, {\"check\": \"control: scenario 3\", \"actual\": [[true, false], [true, false], [true, false], [true, true], [true, true], [true, false], [true, true], [false, true], [false, false]], \"expected\": [[true, false], [true, false], [true, false], [true, true], [true, true], [true, false], [true, true], [false, true], [false, false]], \"passed\": true}, {\"check\": \"control: scenario 4\", \"actual\": [[true, true], [false, false], [false, true], [true, false], [true, true], [true, false], [true, false], [false, false], [true, true], [true, true], [false, true]], \"expected\": [[true, true], [false, false], [false, true], [true, false], [true, true], [true, false], [true, false], [false, false], [true, true], [true, true], [false, true]], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.796,"exit_code":1,"observations":[{"actual":[[true,false],[true,false],[false,true],[true,false],[true,false],[false,true],[false,false]],"check":"regression: lockout band","expected":[[true,false],[true,false],[false,true],[false,true],[true,false],[false,true],[false,false]],"passed":false},{"actual":[[false,true],[true,false],[false,false],[true,false],[true,true],[false,true],[false,false],[true,false],[true,true],[false,false],[false,true],[true,true]],"check":"regression: scenario 11","expected":[[false,true],[true,false],[false,false],[true,false],[true,true],[false,true],[false,false],[false,true],[true,true],[false,false],[false,true],[true,true]],"passed":false},{"actual":[[false,true],[false,true],[false,true]],"check":"control: emergency deep demand","expected":[[false,true],[false,true],[false,true]],"passed":true},{"actual":[[true,true],[true,false],[true,false]],"check":"control: mild weather second stage","expected":[[true,true],[true,false],[true,false]],"passed":true},{"actual":[[true,false],[true,true],[true,false],[true,false],[true,false],[true,false],[false,true],[true,false]],"check":"control: scenario 1","expected":[[true,false],[true,true],[true,false],[true,false],[true,false],[true,false],[false,true],[true,false]],"passed":true},{"actual":[[false,false],[false,false],[true,true],[false,false],[true,false],[true,true],[true,true],[true,true],[true,false],[false,false],[false,false]],"check":"control: scenario 2","expected":[[false,false],[false,false],[true,true],[false,false],[true,false],[true,true],[true,true],[true,true],[true,false],[false,false],[false,false]],"passed":true},{"actual":[[true,false],[true,false],[true,false],[true,true],[true,true],[true,false],[true,true],[false,true],[false,false]],"check":"control: scenario 3","expected":[[true,false],[true,false],[true,false],[true,true],[true,true],[true,false],[true,true],[false,true],[false,false]],"passed":true},{"actual":[[true,true],[false,false],[false,true],[true,false],[true,true],[true,false],[true,false],[false,false],[true,true],[true,true],[false,true]],"check":"control: scenario 4","expected":[[true,true],[false,false],[false,true],[true,false],[true,true],[true,false],[true,false],[false,false],[true,true],[true,true],[false,true]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: lockout band\", \"actual\": [[true, false], [true, false], [false, true], [true, false], [true, false], [false, true], [false, false]], \"expected\": [[true, false], [true, false], [false, true], [false, true], [true, false], [false, true], [false, false]], \"passed\": false}, {\"check\": \"regression: scenario 11\", \"actual\": [[false, true], [true, false], [false, false], [true, false], [true, true], [false, true], [false, false], [true, false], [true, true], [false, false], [false, true], [true, true]], \"expected\": [[false, true], [true, false], [false, false], [true, false], [true, true], [false, true], [false, false], [false, true], [true, true], [false, false], [false, true], [true, true]], \"passed\": false}, {\"check\": \"control: emergency deep demand\", \"actual\": [[false, true], [false, true], [false, true]], \"expected\": [[false, true], [false, true], [false, true]], \"passed\": true}, {\"check\": \"control: mild weather second stage\", \"actual\": [[true, true], [true, false], [true, false]], \"expected\": [[true, true], [true, false], [true, false]], \"passed\": true}, {\"check\": \"control: scenario 1\", \"actual\": [[true, false], [true, true], [true, false], [true, false], [true, false], [true, false], [false, true], [true, false]], \"expected\": [[true, false], [true, true], [true, false], [true, false], [true, false], [true, false], [false, true], [true, false]], \"passed\": true}, {\"check\": \"control: scenario 2\", \"actual\": [[false, false], [false, false], [true, true], [false, false], [true, false], [true, true], [true, true], [true, true], [true, false], [false, false], [false, false]], \"expected\": [[false, false], [false, false], [true, true], [false, false], [true, false], [true, true], [true, true], [true, true], [true, false], [false, false], [false, false]], \"passed\": true}, {\"check\": \"control: scenario 3\", \"actual\": [[true, false], [true, false], [true, false], [true, true], [true, true], [true, false], [true, true], [false, true], [false, false]], \"expected\": [[true, false], [true, false], [true, false], [true, true], [true, true], [true, false], [true, true], [false, true], [false, false]], \"passed\": true}, {\"check\": \"control: scenario 4\", \"actual\": [[true, true], [false, false], [false, true], [true, false], [true, true], [true, false], [true, false], [false, false], [true, true], [true, true], [false, true]], \"expected\": [[true, true], [false, false], [false, true], [true, false], [true, true], [true, false], [true, false], [false, false], [true, true], [true, true], [false, true]], \"passed\": true}], \"passed\": false}\n"}},"member_only":{"stages":["fixed"],"fields":["implementations.fixed","verification.fixed","harness","repair"],"note":"The verified repair, its recorded checks, the repair description, and the scoring harness are available to members."}}