{"abstract":"The immersion heater chatters on and off around aux_dm.","category":"HVAC thermostat control","checks":8,"contract":"Hydronic heat pump degree-minute controller, one sample per minute of [supply_temp, target_supply] in whole F. Degree-minutes DM accumulate supply - target each minute and are clamped to [floor, 100]. The compressor starts when DM <= start_dm and stops when DM >= stop_dm. Auxiliary heat starts when DM <= aux_dm and stops when DM >= start_dm. Decisions use the DM value after this minute's update. Return [DM, compressor, aux] per minute.","contract_signature":"settings, samples","evaluation_group":"w2-hvac-thermostat-control-degree-minute-heat-pump","failed_approach":"Holding aux until the compressor stop level runs the heater far too long.","family":"w2-hvac-thermostat-control-degree-minute-heat-pump-aux-release","id":"FA-92666","implementations":{"attempt":{"sha256":"32ca0df2c79e99c25431b75945fd60786e035b20ee5e36254344fd9be4722677","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(settings, samples):\n    dm = 0\n    comp = False\n    aux = False\n    out = []\n    for supply, target in samples:\n        dm = max(settings['floor'], min(100, dm + supply - target))\n        if comp and dm >= settings['stop_dm']:\n            comp = False\n        elif not comp and dm <= settings['start_dm']:\n            comp = True\n        if aux and dm >= settings['stop_dm']:\n            aux = False\n        elif not aux and dm <= settings['aux_dm']:\n            aux = True\n        out.append([dm, comp, aux])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: deficit and recovery',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40]]],\n   [[-20, False, False],\n    [-40, False, False],\n    [-60, True, False],\n    [-80, True, False],\n    [-100, True, True],\n    [-120, True, True],\n    [-140, True, True],\n    [-120, True, True],\n    [-100, True, True],\n    [-80, True, True],\n    [-60, True, False],\n    [-40, True, False],\n    [-20, True, False],\n    [0, False, False]]],\n  ['regression: deep deficit floor',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[0, 40], [0, 40], [0, 40], [0, 40], [0, 40], [0, 40], [80, 40], [80, 40], [80, 40], [80, 40]]],\n   [[-40, False, False],\n    [-80, True, False],\n    [-120, True, True],\n    [-150, True, True],\n    [-150, True, True],\n    [-150, True, True],\n    [-110, True, True],\n    [-70, True, True],\n    [-30, True, False],\n    [10, False, False]]],\n  ['control: long surplus',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[70, 40],\n     [70, 40],\n     [70, 40],\n     [70, 40],\n     [70, 40],\n     [70, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40]]],\n   [[30, False, False],\n    [60, False, False],\n    [90, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [80, False, False],\n    [60, False, False],\n    [40, False, False],\n    [20, False, False],\n    [0, False, False]]],\n  ['control: start then immediate surplus',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[0, 40], [20, 40], [70, 40], [70, 40], [45, 40]]],\n   [[-40, False, False], [-60, True, False], [-30, True, False], [0, False, False], [5, False, False]]],\n  ['control: scenario 1',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -400},\n    [[11, 40],\n     [50, 40],\n     [49, 40],\n     [53, 40],\n     [49, 40],\n     [71, 40],\n     [105, 40],\n     [100, 40],\n     [17, 40],\n     [13, 40],\n     [102, 40],\n     [102, 40],\n     [99, 40],\n     [105, 40],\n     [96, 40],\n     [50, 40],\n     [48, 40],\n     [46, 40],\n     [47, 40],\n     [50, 40],\n     [52, 40],\n     [48, 40],\n     [71, 40]]],\n   [[-29, False, False],\n    [-19, False, False],\n    [-10, False, False],\n    [3, False, False],\n    [12, False, False],\n    [43, False, False],\n    [100, False, False],\n    [100, False, False],\n    [77, False, False],\n    [50, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False]]],\n  ['control: scenario 2',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -300, 'floor': -250},\n    [[67, 40],\n     [67, 40],\n     [73, 40],\n     [71, 40],\n     [11, 40],\n     [19, 40],\n     [69, 40],\n     [70, 40],\n     [65, 40],\n     [70, 40],\n     [66, 40],\n     [66, 40],\n     [71, 40],\n     [68, 40],\n     [70, 40],\n     [73, 40],\n     [74, 40],\n     [73, 40],\n     [65, 40],\n     [75, 40],\n     [104, 40]]],\n   [[27, False, False],\n    [54, False, False],\n    [87, False, False],\n    [100, False, False],\n    [71, False, False],\n    [50, False, False],\n    [79, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False]]],\n  ['control: scenario 3',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -300, 'floor': -400},\n    [[71, 40],\n     [75, 40],\n     [72, 40],\n     [68, 40],\n     [75, 40],\n     [48, 40],\n     [45, 40],\n     [30, 40],\n     [18, 40],\n     [19, 40],\n     [12, 40],\n     [16, 40],\n     [10, 40],\n     [18, 40],\n     [18, 40],\n     [18, 40],\n     [72, 40],\n     [20, 40],\n     [20, 40],\n     [17, 40]]],\n   [[31, False, False],\n    [66, False, False],\n    [98, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [90, False, False],\n    [68, False, False],\n    [47, False, False],\n    [19, False, False],\n    [-5, False, False],\n    [-35, False, False],\n    [-57, False, False],\n    [-79, True, False],\n    [-101, True, False],\n    [-69, True, False],\n    [-89, True, False],\n    [-109, True, False],\n    [-132, True, False]]],\n  ['control: scenario 4',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -250},\n    [[27, 40],\n     [23, 40],\n     [28, 40],\n     [67, 40],\n     [96, 40],\n     [101, 40],\n     [18, 40],\n     [11, 40],\n     [16, 40],\n     [18, 40],\n     [13, 40],\n     [16, 40],\n     [18, 40],\n     [16, 40],\n     [17, 40],\n     [10, 40],\n     [15, 40]]],\n   [[-13, False, False],\n    [-30, False, False],\n    [-42, False, False],\n    [-15, False, False],\n    [41, False, False],\n    [100, False, False],\n    [78, False, False],\n    [49, False, False],\n    [25, False, False],\n    [3, False, False],\n    [-24, False, False],\n    [-48, False, False],\n    [-70, True, False],\n    [-94, True, False],\n    [-117, True, False],\n    [-147, True, False],\n    [-172, True, True]]]],\n [['regression: deep deficit floor',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[0, 40], [0, 40], [0, 40], [0, 40], [0, 40], [0, 40], [80, 40], [80, 40], [80, 40], [80, 40]]],\n   [[-40, False, False],\n    [-80, True, False],\n    [-120, True, True],\n    [-150, True, True],\n    [-150, True, True],\n    [-150, True, True],\n    [-110, True, True],\n    [-70, True, True],\n    [-30, True, False],\n    [10, False, False]]],\n  ['regression: scenario 40',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -250},\n    [[30, 40],\n     [24, 40],\n     [21, 40],\n     [13, 40],\n     [20, 40],\n     [16, 40],\n     [16, 40],\n     [16, 40],\n     [10, 40],\n     [18, 40],\n     [103, 40],\n     [48, 40],\n     [50, 40],\n     [46, 40],\n     [52, 40],\n     [50, 40],\n     [47, 40],\n     [52, 40],\n     [48, 40],\n     [47, 40],\n     [50, 40],\n     [48, 40],\n     [51, 40],\n     [46, 40]]],\n   [[-10, False, False],\n    [-26, False, False],\n    [-45, False, False],\n    [-72, True, False],\n    [-92, True, False],\n    [-116, True, False],\n    [-140, True, False],\n    [-164, True, True],\n    [-194, True, True],\n    [-216, True, True],\n    [-153, True, True],\n    [-145, True, True],\n    [-135, True, True],\n    [-129, True, True],\n    [-117, True, True],\n    [-107, True, True],\n    [-100, True, True],\n    [-88, True, True],\n    [-80, True, True],\n    [-73, True, True],\n    [-63, True, True],\n    [-55, True, False],\n    [-44, True, False],\n    [-38, True, False]]],\n  ['regression: deficit and recovery',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40]]],\n   [[-20, False, False],\n    [-40, False, False],\n    [-60, True, False],\n    [-80, True, False],\n    [-100, True, True],\n    [-120, True, True],\n    [-140, True, True],\n    [-120, True, True],\n    [-100, True, True],\n    [-80, True, True],\n    [-60, True, False],\n    [-40, True, False],\n    [-20, True, False],\n    [0, False, False]]],\n  ['control: long surplus',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[70, 40],\n     [70, 40],\n     [70, 40],\n     [70, 40],\n     [70, 40],\n     [70, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40]]],\n   [[30, False, False],\n    [60, False, False],\n    [90, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [80, False, False],\n    [60, False, False],\n    [40, False, False],\n    [20, False, False],\n    [0, False, False]]],\n  ['control: start then immediate surplus',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[0, 40], [20, 40], [70, 40], [70, 40], [45, 40]]],\n   [[-40, False, False], [-60, True, False], [-30, True, False], [0, False, False], [5, False, False]]],\n  ['control: scenario 1',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -300, 'floor': -250},\n    [[57, 40],\n     [101, 40],\n     [100, 40],\n     [98, 40],\n     [95, 40],\n     [100, 40],\n     [101, 40],\n     [103, 40],\n     [96, 40],\n     [97, 40],\n     [14, 40],\n     [17, 40],\n     [12, 40],\n     [20, 40],\n     [13, 40]]],\n   [[17, False, False],\n    [78, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [74, False, False],\n    [51, False, False],\n    [23, False, False],\n    [3, False, False],\n    [-24, False, False]]],\n  ['control: scenario 2',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -250},\n    [[10, 40],\n     [10, 40],\n     [19, 40],\n     [28, 40],\n     [26, 40],\n     [27, 40],\n     [28, 40],\n     [26, 40],\n     [75, 40],\n     [65, 40],\n     [73, 40],\n     [71, 40],\n     [71, 40],\n     [72, 40],\n     [11, 40],\n     [13, 40],\n     [19, 40],\n     [15, 40],\n     [27, 40],\n     [30, 40]]],\n   [[-30, False, False],\n    [-60, True, False],\n    [-81, True, False],\n    [-93, True, False],\n    [-107, True, False],\n    [-120, True, False],\n    [-132, True, False],\n    [-146, True, False],\n    [-111, True, False],\n    [-86, True, False],\n    [-53, True, False],\n    [-22, True, False],\n    [9, False, False],\n    [41, False, False],\n    [12, False, False],\n    [-15, False, False],\n    [-36, False, False],\n    [-61, True, False],\n    [-74, True, False],\n    [-84, True, False]]],\n  ['control: scenario 3',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -400},\n    [[13, 40],\n     [95, 40],\n     [100, 40],\n     [49, 40],\n     [97, 40],\n     [103, 40],\n     [97, 40],\n     [101, 40],\n     [99, 40],\n     [99, 40],\n     [105, 40],\n     [101, 40]]],\n   [[-27, False, False],\n    [28, False, False],\n    [88, False, False],\n    [97, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False]]]],\n [['regression: scenario 7',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -250},\n    [[11, 40],\n     [16, 40],\n     [14, 40],\n     [16, 40],\n     [17, 40],\n     [11, 40],\n     [10, 40],\n     [20, 40],\n     [19, 40],\n     [70, 40],\n     [69, 40],\n     [69, 40],\n     [66, 40],\n     [69, 40],\n     [47, 40],\n     [52, 40],\n     [54, 40],\n     [48, 40],\n     [49, 40],\n     [47, 40]]],\n   [[-29, False, False],\n    [-53, False, False],\n    [-79, True, False],\n    [-103, True, False],\n    [-126, True, False],\n    [-155, True, True],\n    [-185, True, True],\n    [-205, True, True],\n    [-226, True, True],\n    [-196, True, True],\n    [-167, True, True],\n    [-138, True, True],\n    [-112, True, True],\n    [-83, True, True],\n    [-76, True, True],\n    [-64, True, True],\n    [-50, True, False],\n    [-42, True, False],\n    [-33, True, False],\n    [-26, True, False]]],\n  ['regression: deficit and recovery',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40]]],\n   [[-20, False, False],\n    [-40, False, False],\n    [-60, True, False],\n    [-80, True, False],\n    [-100, True, True],\n    [-120, True, True],\n    [-140, True, True],\n    [-120, True, True],\n    [-100, True, True],\n    [-80, True, True],\n    [-60, True, False],\n    [-40, True, False],\n    [-20, True, False],\n    [0, False, False]]],\n  ['control: long surplus',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[70, 40],\n     [70, 40],\n     [70, 40],\n     [70, 40],\n     [70, 40],\n     [70, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40]]],\n   [[30, False, False],\n    [60, False, False],\n    [90, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [80, False, False],\n    [60, False, False],\n    [40, False, False],\n    [20, False, False],\n    [0, False, False]]],\n  ['regression: deep deficit floor',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[0, 40], [0, 40], [0, 40], [0, 40], [0, 40], [0, 40], [80, 40], [80, 40], [80, 40], [80, 40]]],\n   [[-40, False, False],\n    [-80, True, False],\n    [-120, True, True],\n    [-150, True, True],\n    [-150, True, True],\n    [-150, True, True],\n    [-110, True, True],\n    [-70, True, True],\n    [-30, True, False],\n    [10, False, False]]],\n  ['control: start then immediate surplus',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[0, 40], [20, 40], [70, 40], [70, 40], [45, 40]]],\n   [[-40, False, False], [-60, True, False], [-30, True, False], [0, False, False], [5, False, False]]],\n  ['control: scenario 1',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -250},\n    [[14, 40],\n     [17, 40],\n     [19, 40],\n     [12, 40],\n     [16, 40],\n     [10, 40],\n     [16, 40],\n     [12, 40],\n     [16, 40],\n     [19, 40],\n     [16, 40],\n     [12, 40],\n     [20, 40],\n     [10, 40],\n     [20, 40],\n     [11, 40],\n     [20, 40]]],\n   [[-26, False, False],\n    [-49, False, False],\n    [-70, True, False],\n    [-98, True, False],\n    [-122, True, False],\n    [-152, True, True],\n    [-176, True, True],\n    [-204, True, True],\n    [-228, True, True],\n    [-249, True, True],\n    [-250, True, True],\n    [-250, True, True],\n    [-250, True, True],\n    [-250, True, True],\n    [-250, True, True],\n    [-250, True, True],\n    [-250, True, True]]],\n  ['control: scenario 2',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -250},\n    [[68, 40],\n     [72, 40],\n     [75, 40],\n     [69, 40],\n     [70, 40],\n     [66, 40],\n     [65, 40],\n     [68, 40],\n     [75, 40],\n     [71, 40],\n     [70, 40],\n     [74, 40],\n     [68, 40],\n     [74, 40],\n     [68, 40],\n     [67, 40],\n     [69, 40],\n     [72, 40],\n     [68, 40],\n     [70, 40],\n     [75, 40],\n     [72, 40],\n     [75, 40],\n     [66, 40]]],\n   [[28, False, False],\n    [60, False, False],\n    [95, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False]]],\n  ['control: scenario 3',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -300, 'floor': -250},\n    [[67, 40],\n     [23, 40],\n     [22, 40],\n     [25, 40],\n     [49, 40],\n     [10, 40],\n     [100, 40],\n     [95, 40],\n     [103, 40],\n     [100, 40],\n     [104, 40],\n     [14, 40],\n     [50, 40],\n     [48, 40],\n     [51, 40],\n     [48, 40],\n     [46, 40],\n     [53, 40],\n     [52, 40],\n     [47, 40],\n     [52, 40]]],\n   [[27, False, False],\n    [10, False, False],\n    [-8, False, False],\n    [-23, False, False],\n    [-14, False, False],\n    [-44, False, False],\n    [16, False, False],\n    [71, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [74, False, False],\n    [84, False, False],\n    [92, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False]]]],\n [['regression: scenario 19',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -250},\n    [[22, 40],\n     [24, 40],\n     [20, 40],\n     [51, 40],\n     [12, 40],\n     [20, 40],\n     [19, 40],\n     [22, 40],\n     [30, 40],\n     [25, 40],\n     [25, 40],\n     [28, 40],\n     [21, 40],\n     [28, 40],\n     [22, 40],\n     [28, 40],\n     [22, 40],\n     [26, 40],\n     [105, 40],\n     [100, 40],\n     [96, 40]]],\n   [[-18, False, False],\n    [-34, False, False],\n    [-54, False, False],\n    [-43, False, False],\n    [-71, True, False],\n    [-91, True, False],\n    [-112, True, False],\n    [-130, True, False],\n    [-140, True, False],\n    [-155, True, True],\n    [-170, True, True],\n    [-182, True, True],\n    [-201, True, True],\n    [-213, True, True],\n    [-231, True, True],\n    [-243, True, True],\n    [-250, True, True],\n    [-250, True, True],\n    [-185, True, True],\n    [-125, True, True],\n    [-69, True, True]]],\n  ['regression: deficit and recovery',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40]]],\n   [[-20, False, False],\n    [-40, False, False],\n    [-60, True, False],\n    [-80, True, False],\n    [-100, True, True],\n    [-120, True, True],\n    [-140, True, True],\n    [-120, True, True],\n    [-100, True, True],\n    [-80, True, True],\n    [-60, True, False],\n    [-40, True, False],\n    [-20, True, False],\n    [0, False, False]]],\n  ['control: long surplus',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[70, 40],\n     [70, 40],\n     [70, 40],\n     [70, 40],\n     [70, 40],\n     [70, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40]]],\n   [[30, False, False],\n    [60, False, False],\n    [90, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [80, False, False],\n    [60, False, False],\n    [40, False, False],\n    [20, False, False],\n    [0, False, False]]],\n  ['regression: deep deficit floor',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[0, 40], [0, 40], [0, 40], [0, 40], [0, 40], [0, 40], [80, 40], [80, 40], [80, 40], [80, 40]]],\n   [[-40, False, False],\n    [-80, True, False],\n    [-120, True, True],\n    [-150, True, True],\n    [-150, True, True],\n    [-150, True, True],\n    [-110, True, True],\n    [-70, True, True],\n    [-30, True, False],\n    [10, False, False]]],\n  ['control: start then immediate surplus',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[0, 40], [20, 40], [70, 40], [70, 40], [45, 40]]],\n   [[-40, False, False], [-60, True, False], [-30, True, False], [0, False, False], [5, False, False]]],\n  ['control: scenario 1',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -300, 'floor': -400},\n    [[55, 40],\n     [51, 40],\n     [74, 40],\n     [47, 40],\n     [27, 40],\n     [24, 40],\n     [105, 40],\n     [55, 40],\n     [46, 40],\n     [45, 40],\n     [55, 40],\n     [53, 40],\n     [101, 40],\n     [105, 40],\n     [95, 40],\n     [54, 40]]],\n   [[15, False, False],\n    [26, False, False],\n    [60, False, False],\n    [67, False, False],\n    [54, False, False],\n    [38, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False]]],\n  ['control: scenario 2',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -300, 'floor': -400},\n    [[52, 40],\n     [102, 40],\n     [104, 40],\n     [97, 40],\n     [46, 40],\n     [49, 40],\n     [53, 40],\n     [53, 40],\n     [51, 40],\n     [50, 40],\n     [47, 40],\n     [52, 40]]],\n   [[12, False, False],\n    [74, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False]]],\n  ['control: scenario 3',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -400},\n    [[102, 40],\n     [98, 40],\n     [95, 40],\n     [51, 40],\n     [53, 40],\n     [52, 40],\n     [51, 40],\n     [53, 40],\n     [53, 40],\n     [52, 40],\n     [46, 40],\n     [53, 40],\n     [47, 40],\n     [46, 40],\n     [46, 40]]],\n   [[62, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False]]]],\n [['regression: scenario 55',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -250},\n    [[25, 40],\n     [25, 40],\n     [70, 40],\n     [11, 40],\n     [16, 40],\n     [13, 40],\n     [20, 40],\n     [24, 40],\n     [21, 40],\n     [20, 40],\n     [22, 40],\n     [22, 40],\n     [27, 40],\n     [98, 40],\n     [105, 40],\n     [105, 40],\n     [101, 40],\n     [104, 40],\n     [105, 40]]],\n   [[-15, False, False],\n    [-30, False, False],\n    [0, False, False],\n    [-29, False, False],\n    [-53, False, False],\n    [-80, True, False],\n    [-100, True, False],\n    [-116, True, False],\n    [-135, True, False],\n    [-155, True, True],\n    [-173, True, True],\n    [-191, True, True],\n    [-204, True, True],\n    [-146, True, True],\n    [-81, True, True],\n    [-16, True, False],\n    [45, False, False],\n    [100, False, False],\n    [100, False, False]]],\n  ['regression: deficit and recovery',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40]]],\n   [[-20, False, False],\n    [-40, False, False],\n    [-60, True, False],\n    [-80, True, False],\n    [-100, True, True],\n    [-120, True, True],\n    [-140, True, True],\n    [-120, True, True],\n    [-100, True, True],\n    [-80, True, True],\n    [-60, True, False],\n    [-40, True, False],\n    [-20, True, False],\n    [0, False, False]]],\n  ['control: long surplus',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[70, 40],\n     [70, 40],\n     [70, 40],\n     [70, 40],\n     [70, 40],\n     [70, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40]]],\n   [[30, False, False],\n    [60, False, False],\n    [90, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [80, False, False],\n    [60, False, False],\n    [40, False, False],\n    [20, False, False],\n    [0, False, False]]],\n  ['regression: deep deficit floor',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[0, 40], [0, 40], [0, 40], [0, 40], [0, 40], [0, 40], [80, 40], [80, 40], [80, 40], [80, 40]]],\n   [[-40, False, False],\n    [-80, True, False],\n    [-120, True, True],\n    [-150, True, True],\n    [-150, True, True],\n    [-150, True, True],\n    [-110, True, True],\n    [-70, True, True],\n    [-30, True, False],\n    [10, False, False]]],\n  ['control: start then immediate surplus',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[0, 40], [20, 40], [70, 40], [70, 40], [45, 40]]],\n   [[-40, False, False], [-60, True, False], [-30, True, False], [0, False, False], [5, False, False]]],\n  ['control: scenario 1',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -400},\n    [[67, 40],\n     [73, 40],\n     [101, 40],\n     [96, 40],\n     [104, 40],\n     [99, 40],\n     [101, 40],\n     [98, 40],\n     [95, 40],\n     [95, 40],\n     [65, 40],\n     [71, 40]]],\n   [[27, False, False],\n    [60, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False]]],\n  ['control: scenario 2',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -250},\n    [[20, 40], [25, 40], [21, 40], [22, 40], [26, 40], [25, 40], [26, 40], [24, 40], [73, 40], [71, 40]]],\n   [[-20, False, False],\n    [-35, False, False],\n    [-54, False, False],\n    [-72, True, False],\n    [-86, True, False],\n    [-101, True, False],\n    [-115, True, False],\n    [-131, True, False],\n    [-98, True, False],\n    [-67, True, False]]],\n  ['control: scenario 3',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -400},\n    [[10, 40],\n     [18, 40],\n     [24, 40],\n     [27, 40],\n     [27, 40],\n     [27, 40],\n     [30, 40],\n     [25, 40],\n     [26, 40],\n     [103, 40],\n     [99, 40],\n     [97, 40],\n     [101, 40],\n     [14, 40],\n     [19, 40],\n     [17, 40]]],\n   [[-30, False, False],\n    [-52, False, False],\n    [-68, True, False],\n    [-81, True, False],\n    [-94, True, False],\n    [-107, True, False],\n    [-117, True, False],\n    [-132, True, False],\n    [-146, True, False],\n    [-83, True, False],\n    [-24, True, False],\n    [33, False, False],\n    [94, False, False],\n    [68, False, False],\n    [47, False, False],\n    [24, False, False]]]]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"77e4e870702a35accf459574b405e28d8b898b6e56ba9f813991948edc47c437","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(settings, samples):\n    dm = 0\n    comp = False\n    aux = False\n    out = []\n    for supply, target in samples:\n        dm = max(settings['floor'], min(100, dm + supply - target))\n        if comp and dm >= settings['stop_dm']:\n            comp = False\n        elif not comp and dm <= settings['start_dm']:\n            comp = True\n        if aux and dm >= settings['aux_dm']:\n            aux = False\n        elif not aux and dm <= settings['aux_dm']:\n            aux = True\n        out.append([dm, comp, aux])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: deficit and recovery',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40]]],\n   [[-20, False, False],\n    [-40, False, False],\n    [-60, True, False],\n    [-80, True, False],\n    [-100, True, True],\n    [-120, True, True],\n    [-140, True, True],\n    [-120, True, True],\n    [-100, True, True],\n    [-80, True, True],\n    [-60, True, False],\n    [-40, True, False],\n    [-20, True, False],\n    [0, False, False]]],\n  ['regression: deep deficit floor',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[0, 40], [0, 40], [0, 40], [0, 40], [0, 40], [0, 40], [80, 40], [80, 40], [80, 40], [80, 40]]],\n   [[-40, False, False],\n    [-80, True, False],\n    [-120, True, True],\n    [-150, True, True],\n    [-150, True, True],\n    [-150, True, True],\n    [-110, True, True],\n    [-70, True, True],\n    [-30, True, False],\n    [10, False, False]]],\n  ['control: long surplus',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[70, 40],\n     [70, 40],\n     [70, 40],\n     [70, 40],\n     [70, 40],\n     [70, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40]]],\n   [[30, False, False],\n    [60, False, False],\n    [90, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [80, False, False],\n    [60, False, False],\n    [40, False, False],\n    [20, False, False],\n    [0, False, False]]],\n  ['control: start then immediate surplus',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[0, 40], [20, 40], [70, 40], [70, 40], [45, 40]]],\n   [[-40, False, False], [-60, True, False], [-30, True, False], [0, False, False], [5, False, False]]],\n  ['control: scenario 1',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -400},\n    [[11, 40],\n     [50, 40],\n     [49, 40],\n     [53, 40],\n     [49, 40],\n     [71, 40],\n     [105, 40],\n     [100, 40],\n     [17, 40],\n     [13, 40],\n     [102, 40],\n     [102, 40],\n     [99, 40],\n     [105, 40],\n     [96, 40],\n     [50, 40],\n     [48, 40],\n     [46, 40],\n     [47, 40],\n     [50, 40],\n     [52, 40],\n     [48, 40],\n     [71, 40]]],\n   [[-29, False, False],\n    [-19, False, False],\n    [-10, False, False],\n    [3, False, False],\n    [12, False, False],\n    [43, False, False],\n    [100, False, False],\n    [100, False, False],\n    [77, False, False],\n    [50, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False]]],\n  ['control: scenario 2',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -300, 'floor': -250},\n    [[67, 40],\n     [67, 40],\n     [73, 40],\n     [71, 40],\n     [11, 40],\n     [19, 40],\n     [69, 40],\n     [70, 40],\n     [65, 40],\n     [70, 40],\n     [66, 40],\n     [66, 40],\n     [71, 40],\n     [68, 40],\n     [70, 40],\n     [73, 40],\n     [74, 40],\n     [73, 40],\n     [65, 40],\n     [75, 40],\n     [104, 40]]],\n   [[27, False, False],\n    [54, False, False],\n    [87, False, False],\n    [100, False, False],\n    [71, False, False],\n    [50, False, False],\n    [79, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False]]],\n  ['control: scenario 3',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -300, 'floor': -400},\n    [[71, 40],\n     [75, 40],\n     [72, 40],\n     [68, 40],\n     [75, 40],\n     [48, 40],\n     [45, 40],\n     [30, 40],\n     [18, 40],\n     [19, 40],\n     [12, 40],\n     [16, 40],\n     [10, 40],\n     [18, 40],\n     [18, 40],\n     [18, 40],\n     [72, 40],\n     [20, 40],\n     [20, 40],\n     [17, 40]]],\n   [[31, False, False],\n    [66, False, False],\n    [98, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [90, False, False],\n    [68, False, False],\n    [47, False, False],\n    [19, False, False],\n    [-5, False, False],\n    [-35, False, False],\n    [-57, False, False],\n    [-79, True, False],\n    [-101, True, False],\n    [-69, True, False],\n    [-89, True, False],\n    [-109, True, False],\n    [-132, True, False]]],\n  ['control: scenario 4',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -250},\n    [[27, 40],\n     [23, 40],\n     [28, 40],\n     [67, 40],\n     [96, 40],\n     [101, 40],\n     [18, 40],\n     [11, 40],\n     [16, 40],\n     [18, 40],\n     [13, 40],\n     [16, 40],\n     [18, 40],\n     [16, 40],\n     [17, 40],\n     [10, 40],\n     [15, 40]]],\n   [[-13, False, False],\n    [-30, False, False],\n    [-42, False, False],\n    [-15, False, False],\n    [41, False, False],\n    [100, False, False],\n    [78, False, False],\n    [49, False, False],\n    [25, False, False],\n    [3, False, False],\n    [-24, False, False],\n    [-48, False, False],\n    [-70, True, False],\n    [-94, True, False],\n    [-117, True, False],\n    [-147, True, False],\n    [-172, True, True]]]],\n [['regression: deep deficit floor',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[0, 40], [0, 40], [0, 40], [0, 40], [0, 40], [0, 40], [80, 40], [80, 40], [80, 40], [80, 40]]],\n   [[-40, False, False],\n    [-80, True, False],\n    [-120, True, True],\n    [-150, True, True],\n    [-150, True, True],\n    [-150, True, True],\n    [-110, True, True],\n    [-70, True, True],\n    [-30, True, False],\n    [10, False, False]]],\n  ['regression: scenario 40',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -250},\n    [[30, 40],\n     [24, 40],\n     [21, 40],\n     [13, 40],\n     [20, 40],\n     [16, 40],\n     [16, 40],\n     [16, 40],\n     [10, 40],\n     [18, 40],\n     [103, 40],\n     [48, 40],\n     [50, 40],\n     [46, 40],\n     [52, 40],\n     [50, 40],\n     [47, 40],\n     [52, 40],\n     [48, 40],\n     [47, 40],\n     [50, 40],\n     [48, 40],\n     [51, 40],\n     [46, 40]]],\n   [[-10, False, False],\n    [-26, False, False],\n    [-45, False, False],\n    [-72, True, False],\n    [-92, True, False],\n    [-116, True, False],\n    [-140, True, False],\n    [-164, True, True],\n    [-194, True, True],\n    [-216, True, True],\n    [-153, True, True],\n    [-145, True, True],\n    [-135, True, True],\n    [-129, True, True],\n    [-117, True, True],\n    [-107, True, True],\n    [-100, True, True],\n    [-88, True, True],\n    [-80, True, True],\n    [-73, True, True],\n    [-63, True, True],\n    [-55, True, False],\n    [-44, True, False],\n    [-38, True, False]]],\n  ['regression: deficit and recovery',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40]]],\n   [[-20, False, False],\n    [-40, False, False],\n    [-60, True, False],\n    [-80, True, False],\n    [-100, True, True],\n    [-120, True, True],\n    [-140, True, True],\n    [-120, True, True],\n    [-100, True, True],\n    [-80, True, True],\n    [-60, True, False],\n    [-40, True, False],\n    [-20, True, False],\n    [0, False, False]]],\n  ['control: long surplus',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[70, 40],\n     [70, 40],\n     [70, 40],\n     [70, 40],\n     [70, 40],\n     [70, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40]]],\n   [[30, False, False],\n    [60, False, False],\n    [90, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [80, False, False],\n    [60, False, False],\n    [40, False, False],\n    [20, False, False],\n    [0, False, False]]],\n  ['control: start then immediate surplus',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[0, 40], [20, 40], [70, 40], [70, 40], [45, 40]]],\n   [[-40, False, False], [-60, True, False], [-30, True, False], [0, False, False], [5, False, False]]],\n  ['control: scenario 1',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -300, 'floor': -250},\n    [[57, 40],\n     [101, 40],\n     [100, 40],\n     [98, 40],\n     [95, 40],\n     [100, 40],\n     [101, 40],\n     [103, 40],\n     [96, 40],\n     [97, 40],\n     [14, 40],\n     [17, 40],\n     [12, 40],\n     [20, 40],\n     [13, 40]]],\n   [[17, False, False],\n    [78, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [74, False, False],\n    [51, False, False],\n    [23, False, False],\n    [3, False, False],\n    [-24, False, False]]],\n  ['control: scenario 2',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -250},\n    [[10, 40],\n     [10, 40],\n     [19, 40],\n     [28, 40],\n     [26, 40],\n     [27, 40],\n     [28, 40],\n     [26, 40],\n     [75, 40],\n     [65, 40],\n     [73, 40],\n     [71, 40],\n     [71, 40],\n     [72, 40],\n     [11, 40],\n     [13, 40],\n     [19, 40],\n     [15, 40],\n     [27, 40],\n     [30, 40]]],\n   [[-30, False, False],\n    [-60, True, False],\n    [-81, True, False],\n    [-93, True, False],\n    [-107, True, False],\n    [-120, True, False],\n    [-132, True, False],\n    [-146, True, False],\n    [-111, True, False],\n    [-86, True, False],\n    [-53, True, False],\n    [-22, True, False],\n    [9, False, False],\n    [41, False, False],\n    [12, False, False],\n    [-15, False, False],\n    [-36, False, False],\n    [-61, True, False],\n    [-74, True, False],\n    [-84, True, False]]],\n  ['control: scenario 3',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -400},\n    [[13, 40],\n     [95, 40],\n     [100, 40],\n     [49, 40],\n     [97, 40],\n     [103, 40],\n     [97, 40],\n     [101, 40],\n     [99, 40],\n     [99, 40],\n     [105, 40],\n     [101, 40]]],\n   [[-27, False, False],\n    [28, False, False],\n    [88, False, False],\n    [97, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False]]]],\n [['regression: scenario 7',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -250},\n    [[11, 40],\n     [16, 40],\n     [14, 40],\n     [16, 40],\n     [17, 40],\n     [11, 40],\n     [10, 40],\n     [20, 40],\n     [19, 40],\n     [70, 40],\n     [69, 40],\n     [69, 40],\n     [66, 40],\n     [69, 40],\n     [47, 40],\n     [52, 40],\n     [54, 40],\n     [48, 40],\n     [49, 40],\n     [47, 40]]],\n   [[-29, False, False],\n    [-53, False, False],\n    [-79, True, False],\n    [-103, True, False],\n    [-126, True, False],\n    [-155, True, True],\n    [-185, True, True],\n    [-205, True, True],\n    [-226, True, True],\n    [-196, True, True],\n    [-167, True, True],\n    [-138, True, True],\n    [-112, True, True],\n    [-83, True, True],\n    [-76, True, True],\n    [-64, True, True],\n    [-50, True, False],\n    [-42, True, False],\n    [-33, True, False],\n    [-26, True, False]]],\n  ['regression: deficit and recovery',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40]]],\n   [[-20, False, False],\n    [-40, False, False],\n    [-60, True, False],\n    [-80, True, False],\n    [-100, True, True],\n    [-120, True, True],\n    [-140, True, True],\n    [-120, True, True],\n    [-100, True, True],\n    [-80, True, True],\n    [-60, True, False],\n    [-40, True, False],\n    [-20, True, False],\n    [0, False, False]]],\n  ['control: long surplus',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[70, 40],\n     [70, 40],\n     [70, 40],\n     [70, 40],\n     [70, 40],\n     [70, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40]]],\n   [[30, False, False],\n    [60, False, False],\n    [90, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [80, False, False],\n    [60, False, False],\n    [40, False, False],\n    [20, False, False],\n    [0, False, False]]],\n  ['regression: deep deficit floor',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[0, 40], [0, 40], [0, 40], [0, 40], [0, 40], [0, 40], [80, 40], [80, 40], [80, 40], [80, 40]]],\n   [[-40, False, False],\n    [-80, True, False],\n    [-120, True, True],\n    [-150, True, True],\n    [-150, True, True],\n    [-150, True, True],\n    [-110, True, True],\n    [-70, True, True],\n    [-30, True, False],\n    [10, False, False]]],\n  ['control: start then immediate surplus',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[0, 40], [20, 40], [70, 40], [70, 40], [45, 40]]],\n   [[-40, False, False], [-60, True, False], [-30, True, False], [0, False, False], [5, False, False]]],\n  ['control: scenario 1',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -250},\n    [[14, 40],\n     [17, 40],\n     [19, 40],\n     [12, 40],\n     [16, 40],\n     [10, 40],\n     [16, 40],\n     [12, 40],\n     [16, 40],\n     [19, 40],\n     [16, 40],\n     [12, 40],\n     [20, 40],\n     [10, 40],\n     [20, 40],\n     [11, 40],\n     [20, 40]]],\n   [[-26, False, False],\n    [-49, False, False],\n    [-70, True, False],\n    [-98, True, False],\n    [-122, True, False],\n    [-152, True, True],\n    [-176, True, True],\n    [-204, True, True],\n    [-228, True, True],\n    [-249, True, True],\n    [-250, True, True],\n    [-250, True, True],\n    [-250, True, True],\n    [-250, True, True],\n    [-250, True, True],\n    [-250, True, True],\n    [-250, True, True]]],\n  ['control: scenario 2',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -250},\n    [[68, 40],\n     [72, 40],\n     [75, 40],\n     [69, 40],\n     [70, 40],\n     [66, 40],\n     [65, 40],\n     [68, 40],\n     [75, 40],\n     [71, 40],\n     [70, 40],\n     [74, 40],\n     [68, 40],\n     [74, 40],\n     [68, 40],\n     [67, 40],\n     [69, 40],\n     [72, 40],\n     [68, 40],\n     [70, 40],\n     [75, 40],\n     [72, 40],\n     [75, 40],\n     [66, 40]]],\n   [[28, False, False],\n    [60, False, False],\n    [95, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False]]],\n  ['control: scenario 3',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -300, 'floor': -250},\n    [[67, 40],\n     [23, 40],\n     [22, 40],\n     [25, 40],\n     [49, 40],\n     [10, 40],\n     [100, 40],\n     [95, 40],\n     [103, 40],\n     [100, 40],\n     [104, 40],\n     [14, 40],\n     [50, 40],\n     [48, 40],\n     [51, 40],\n     [48, 40],\n     [46, 40],\n     [53, 40],\n     [52, 40],\n     [47, 40],\n     [52, 40]]],\n   [[27, False, False],\n    [10, False, False],\n    [-8, False, False],\n    [-23, False, False],\n    [-14, False, False],\n    [-44, False, False],\n    [16, False, False],\n    [71, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [74, False, False],\n    [84, False, False],\n    [92, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False]]]],\n [['regression: scenario 19',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -250},\n    [[22, 40],\n     [24, 40],\n     [20, 40],\n     [51, 40],\n     [12, 40],\n     [20, 40],\n     [19, 40],\n     [22, 40],\n     [30, 40],\n     [25, 40],\n     [25, 40],\n     [28, 40],\n     [21, 40],\n     [28, 40],\n     [22, 40],\n     [28, 40],\n     [22, 40],\n     [26, 40],\n     [105, 40],\n     [100, 40],\n     [96, 40]]],\n   [[-18, False, False],\n    [-34, False, False],\n    [-54, False, False],\n    [-43, False, False],\n    [-71, True, False],\n    [-91, True, False],\n    [-112, True, False],\n    [-130, True, False],\n    [-140, True, False],\n    [-155, True, True],\n    [-170, True, True],\n    [-182, True, True],\n    [-201, True, True],\n    [-213, True, True],\n    [-231, True, True],\n    [-243, True, True],\n    [-250, True, True],\n    [-250, True, True],\n    [-185, True, True],\n    [-125, True, True],\n    [-69, True, True]]],\n  ['regression: deficit and recovery',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40]]],\n   [[-20, False, False],\n    [-40, False, False],\n    [-60, True, False],\n    [-80, True, False],\n    [-100, True, True],\n    [-120, True, True],\n    [-140, True, True],\n    [-120, True, True],\n    [-100, True, True],\n    [-80, True, True],\n    [-60, True, False],\n    [-40, True, False],\n    [-20, True, False],\n    [0, False, False]]],\n  ['control: long surplus',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[70, 40],\n     [70, 40],\n     [70, 40],\n     [70, 40],\n     [70, 40],\n     [70, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40]]],\n   [[30, False, False],\n    [60, False, False],\n    [90, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [80, False, False],\n    [60, False, False],\n    [40, False, False],\n    [20, False, False],\n    [0, False, False]]],\n  ['regression: deep deficit floor',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[0, 40], [0, 40], [0, 40], [0, 40], [0, 40], [0, 40], [80, 40], [80, 40], [80, 40], [80, 40]]],\n   [[-40, False, False],\n    [-80, True, False],\n    [-120, True, True],\n    [-150, True, True],\n    [-150, True, True],\n    [-150, True, True],\n    [-110, True, True],\n    [-70, True, True],\n    [-30, True, False],\n    [10, False, False]]],\n  ['control: start then immediate surplus',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[0, 40], [20, 40], [70, 40], [70, 40], [45, 40]]],\n   [[-40, False, False], [-60, True, False], [-30, True, False], [0, False, False], [5, False, False]]],\n  ['control: scenario 1',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -300, 'floor': -400},\n    [[55, 40],\n     [51, 40],\n     [74, 40],\n     [47, 40],\n     [27, 40],\n     [24, 40],\n     [105, 40],\n     [55, 40],\n     [46, 40],\n     [45, 40],\n     [55, 40],\n     [53, 40],\n     [101, 40],\n     [105, 40],\n     [95, 40],\n     [54, 40]]],\n   [[15, False, False],\n    [26, False, False],\n    [60, False, False],\n    [67, False, False],\n    [54, False, False],\n    [38, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False]]],\n  ['control: scenario 2',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -300, 'floor': -400},\n    [[52, 40],\n     [102, 40],\n     [104, 40],\n     [97, 40],\n     [46, 40],\n     [49, 40],\n     [53, 40],\n     [53, 40],\n     [51, 40],\n     [50, 40],\n     [47, 40],\n     [52, 40]]],\n   [[12, False, False],\n    [74, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False]]],\n  ['control: scenario 3',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -400},\n    [[102, 40],\n     [98, 40],\n     [95, 40],\n     [51, 40],\n     [53, 40],\n     [52, 40],\n     [51, 40],\n     [53, 40],\n     [53, 40],\n     [52, 40],\n     [46, 40],\n     [53, 40],\n     [47, 40],\n     [46, 40],\n     [46, 40]]],\n   [[62, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False]]]],\n [['regression: scenario 55',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -250},\n    [[25, 40],\n     [25, 40],\n     [70, 40],\n     [11, 40],\n     [16, 40],\n     [13, 40],\n     [20, 40],\n     [24, 40],\n     [21, 40],\n     [20, 40],\n     [22, 40],\n     [22, 40],\n     [27, 40],\n     [98, 40],\n     [105, 40],\n     [105, 40],\n     [101, 40],\n     [104, 40],\n     [105, 40]]],\n   [[-15, False, False],\n    [-30, False, False],\n    [0, False, False],\n    [-29, False, False],\n    [-53, False, False],\n    [-80, True, False],\n    [-100, True, False],\n    [-116, True, False],\n    [-135, True, False],\n    [-155, True, True],\n    [-173, True, True],\n    [-191, True, True],\n    [-204, True, True],\n    [-146, True, True],\n    [-81, True, True],\n    [-16, True, False],\n    [45, False, False],\n    [100, False, False],\n    [100, False, False]]],\n  ['regression: deficit and recovery',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40],\n     [60, 40]]],\n   [[-20, False, False],\n    [-40, False, False],\n    [-60, True, False],\n    [-80, True, False],\n    [-100, True, True],\n    [-120, True, True],\n    [-140, True, True],\n    [-120, True, True],\n    [-100, True, True],\n    [-80, True, True],\n    [-60, True, False],\n    [-40, True, False],\n    [-20, True, False],\n    [0, False, False]]],\n  ['control: long surplus',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[70, 40],\n     [70, 40],\n     [70, 40],\n     [70, 40],\n     [70, 40],\n     [70, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40],\n     [20, 40]]],\n   [[30, False, False],\n    [60, False, False],\n    [90, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [80, False, False],\n    [60, False, False],\n    [40, False, False],\n    [20, False, False],\n    [0, False, False]]],\n  ['regression: deep deficit floor',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[0, 40], [0, 40], [0, 40], [0, 40], [0, 40], [0, 40], [80, 40], [80, 40], [80, 40], [80, 40]]],\n   [[-40, False, False],\n    [-80, True, False],\n    [-120, True, True],\n    [-150, True, True],\n    [-150, True, True],\n    [-150, True, True],\n    [-110, True, True],\n    [-70, True, True],\n    [-30, True, False],\n    [10, False, False]]],\n  ['control: start then immediate surplus',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -100, 'floor': -150},\n    [[0, 40], [20, 40], [70, 40], [70, 40], [45, 40]]],\n   [[-40, False, False], [-60, True, False], [-30, True, False], [0, False, False], [5, False, False]]],\n  ['control: scenario 1',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -400},\n    [[67, 40],\n     [73, 40],\n     [101, 40],\n     [96, 40],\n     [104, 40],\n     [99, 40],\n     [101, 40],\n     [98, 40],\n     [95, 40],\n     [95, 40],\n     [65, 40],\n     [71, 40]]],\n   [[27, False, False],\n    [60, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False]]],\n  ['control: scenario 2',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -250},\n    [[20, 40], [25, 40], [21, 40], [22, 40], [26, 40], [25, 40], [26, 40], [24, 40], [73, 40], [71, 40]]],\n   [[-20, False, False],\n    [-35, False, False],\n    [-54, False, False],\n    [-72, True, False],\n    [-86, True, False],\n    [-101, True, False],\n    [-115, True, False],\n    [-131, True, False],\n    [-98, True, False],\n    [-67, True, False]]],\n  ['control: scenario 3',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -400},\n    [[10, 40],\n     [18, 40],\n     [24, 40],\n     [27, 40],\n     [27, 40],\n     [27, 40],\n     [30, 40],\n     [25, 40],\n     [26, 40],\n     [103, 40],\n     [99, 40],\n     [97, 40],\n     [101, 40],\n     [14, 40],\n     [19, 40],\n     [17, 40]]],\n   [[-30, False, False],\n    [-52, False, False],\n    [-68, True, False],\n    [-81, True, False],\n    [-94, True, False],\n    [-107, True, False],\n    [-117, True, False],\n    [-132, True, False],\n    [-146, True, False],\n    [-83, True, False],\n    [-24, True, False],\n    [33, False, False],\n    [94, False, False],\n    [68, False, False],\n    [47, False, False],\n    [24, False, False]]]]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"A deterministic bounded teaching model of one 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-degree-minute-heat-pump-aux-release","generated_at":"2026-09-29T14:51:47.854604+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":"Aux stops at DM >= aux_dm instead of the compressor start level.","sha256":"a096b12601bd13356403087500c0b880afafe14ee2e74263dc468110822142f7","title":"Auxiliary heat releases as soon as DM rises above its start point · 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":42.3,"exit_code":1,"observations":[{"actual":[[-20,false,false],[-40,false,false],[-60,true,false],[-80,true,false],[-100,true,true],[-120,true,true],[-140,true,true],[-120,true,true],[-100,true,true],[-80,true,true],[-60,true,true],[-40,true,true],[-20,true,true],[0,false,false]],"check":"regression: deficit and recovery","expected":[[-20,false,false],[-40,false,false],[-60,true,false],[-80,true,false],[-100,true,true],[-120,true,true],[-140,true,true],[-120,true,true],[-100,true,true],[-80,true,true],[-60,true,false],[-40,true,false],[-20,true,false],[0,false,false]],"passed":false},{"actual":[[-40,false,false],[-80,true,false],[-120,true,true],[-150,true,true],[-150,true,true],[-150,true,true],[-110,true,true],[-70,true,true],[-30,true,true],[10,false,false]],"check":"regression: deep deficit floor","expected":[[-40,false,false],[-80,true,false],[-120,true,true],[-150,true,true],[-150,true,true],[-150,true,true],[-110,true,true],[-70,true,true],[-30,true,false],[10,false,false]],"passed":false},{"actual":[[30,false,false],[60,false,false],[90,false,false],[100,false,false],[100,false,false],[100,false,false],[80,false,false],[60,false,false],[40,false,false],[20,false,false],[0,false,false]],"check":"control: long surplus","expected":[[30,false,false],[60,false,false],[90,false,false],[100,false,false],[100,false,false],[100,false,false],[80,false,false],[60,false,false],[40,false,false],[20,false,false],[0,false,false]],"passed":true},{"actual":[[-40,false,false],[-60,true,false],[-30,true,false],[0,false,false],[5,false,false]],"check":"control: start then immediate surplus","expected":[[-40,false,false],[-60,true,false],[-30,true,false],[0,false,false],[5,false,false]],"passed":true},{"actual":[[-29,false,false],[-19,false,false],[-10,false,false],[3,false,false],[12,false,false],[43,false,false],[100,false,false],[100,false,false],[77,false,false],[50,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false]],"check":"control: scenario 1","expected":[[-29,false,false],[-19,false,false],[-10,false,false],[3,false,false],[12,false,false],[43,false,false],[100,false,false],[100,false,false],[77,false,false],[50,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false]],"passed":true},{"actual":[[27,false,false],[54,false,false],[87,false,false],[100,false,false],[71,false,false],[50,false,false],[79,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false]],"check":"control: scenario 2","expected":[[27,false,false],[54,false,false],[87,false,false],[100,false,false],[71,false,false],[50,false,false],[79,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false]],"passed":true},{"actual":[[31,false,false],[66,false,false],[98,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[90,false,false],[68,false,false],[47,false,false],[19,false,false],[-5,false,false],[-35,false,false],[-57,false,false],[-79,true,false],[-101,true,false],[-69,true,false],[-89,true,false],[-109,true,false],[-132,true,false]],"check":"control: scenario 3","expected":[[31,false,false],[66,false,false],[98,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[90,false,false],[68,false,false],[47,false,false],[19,false,false],[-5,false,false],[-35,false,false],[-57,false,false],[-79,true,false],[-101,true,false],[-69,true,false],[-89,true,false],[-109,true,false],[-132,true,false]],"passed":true},{"actual":[[-13,false,false],[-30,false,false],[-42,false,false],[-15,false,false],[41,false,false],[100,false,false],[78,false,false],[49,false,false],[25,false,false],[3,false,false],[-24,false,false],[-48,false,false],[-70,true,false],[-94,true,false],[-117,true,false],[-147,true,false],[-172,true,true]],"check":"control: scenario 4","expected":[[-13,false,false],[-30,false,false],[-42,false,false],[-15,false,false],[41,false,false],[100,false,false],[78,false,false],[49,false,false],[25,false,false],[3,false,false],[-24,false,false],[-48,false,false],[-70,true,false],[-94,true,false],[-117,true,false],[-147,true,false],[-172,true,true]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: deficit and recovery\", \"actual\": [[-20, false, false], [-40, false, false], [-60, true, false], [-80, true, false], [-100, true, true], [-120, true, true], [-140, true, true], [-120, true, true], [-100, true, true], [-80, true, true], [-60, true, true], [-40, true, true], [-20, true, true], [0, false, false]], \"expected\": [[-20, false, false], [-40, false, false], [-60, true, false], [-80, true, false], [-100, true, true], [-120, true, true], [-140, true, true], [-120, true, true], [-100, true, true], [-80, true, true], [-60, true, false], [-40, true, false], [-20, true, false], [0, false, false]], \"passed\": false}, {\"check\": \"regression: deep deficit floor\", \"actual\": [[-40, false, false], [-80, true, false], [-120, true, true], [-150, true, true], [-150, true, true], [-150, true, true], [-110, true, true], [-70, true, true], [-30, true, true], [10, false, false]], \"expected\": [[-40, false, false], [-80, true, false], [-120, true, true], [-150, true, true], [-150, true, true], [-150, true, true], [-110, true, true], [-70, true, true], [-30, true, false], [10, false, false]], \"passed\": false}, {\"check\": \"control: long surplus\", \"actual\": [[30, false, false], [60, false, false], [90, false, false], [100, false, false], [100, false, false], [100, false, false], [80, false, false], [60, false, false], [40, false, false], [20, false, false], [0, false, false]], \"expected\": [[30, false, false], [60, false, false], [90, false, false], [100, false, false], [100, false, false], [100, false, false], [80, false, false], [60, false, false], [40, false, false], [20, false, false], [0, false, false]], \"passed\": true}, {\"check\": \"control: start then immediate surplus\", \"actual\": [[-40, false, false], [-60, true, false], [-30, true, false], [0, false, false], [5, false, false]], \"expected\": [[-40, false, false], [-60, true, false], [-30, true, false], [0, false, false], [5, false, false]], \"passed\": true}, {\"check\": \"control: scenario 1\", \"actual\": [[-29, false, false], [-19, false, false], [-10, false, false], [3, false, false], [12, false, false], [43, false, false], [100, false, false], [100, false, false], [77, false, false], [50, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false]], \"expected\": [[-29, false, false], [-19, false, false], [-10, false, false], [3, false, false], [12, false, false], [43, false, false], [100, false, false], [100, false, false], [77, false, false], [50, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false]], \"passed\": true}, {\"check\": \"control: scenario 2\", \"actual\": [[27, false, false], [54, false, false], [87, false, false], [100, false, false], [71, false, false], [50, false, false], [79, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false]], \"expected\": [[27, false, false], [54, false, false], [87, false, false], [100, false, false], [71, false, false], [50, false, false], [79, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false]], \"passed\": true}, {\"check\": \"control: scenario 3\", \"actual\": [[31, false, false], [66, false, false], [98, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [90, false, false], [68, false, false], [47, false, false], [19, false, false], [-5, false, false], [-35, false, false], [-57, false, false], [-79, true, false], [-101, true, false], [-69, true, false], [-89, true, false], [-109, true, false], [-132, true, false]], \"expected\": [[31, false, false], [66, false, false], [98, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [90, false, false], [68, false, false], [47, false, false], [19, false, false], [-5, false, false], [-35, false, false], [-57, false, false], [-79, true, false], [-101, true, false], [-69, true, false], [-89, true, false], [-109, true, false], [-132, true, false]], \"passed\": true}, {\"check\": \"control: scenario 4\", \"actual\": [[-13, false, false], [-30, false, false], [-42, false, false], [-15, false, false], [41, false, false], [100, false, false], [78, false, false], [49, false, false], [25, false, false], [3, false, false], [-24, false, false], [-48, false, false], [-70, true, false], [-94, true, false], [-117, true, false], [-147, true, false], [-172, true, true]], \"expected\": [[-13, false, false], [-30, false, false], [-42, false, false], [-15, false, false], [41, false, false], [100, false, false], [78, false, false], [49, false, false], [25, false, false], [3, false, false], [-24, false, false], [-48, false, false], [-70, true, false], [-94, true, false], [-117, true, false], [-147, true, false], [-172, true, true]], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.994,"exit_code":1,"observations":[{"actual":[[-20,false,false],[-40,false,false],[-60,true,false],[-80,true,false],[-100,true,true],[-120,true,true],[-140,true,true],[-120,true,true],[-100,true,false],[-80,true,false],[-60,true,false],[-40,true,false],[-20,true,false],[0,false,false]],"check":"regression: deficit and recovery","expected":[[-20,false,false],[-40,false,false],[-60,true,false],[-80,true,false],[-100,true,true],[-120,true,true],[-140,true,true],[-120,true,true],[-100,true,true],[-80,true,true],[-60,true,false],[-40,true,false],[-20,true,false],[0,false,false]],"passed":false},{"actual":[[-40,false,false],[-80,true,false],[-120,true,true],[-150,true,true],[-150,true,true],[-150,true,true],[-110,true,true],[-70,true,false],[-30,true,false],[10,false,false]],"check":"regression: deep deficit floor","expected":[[-40,false,false],[-80,true,false],[-120,true,true],[-150,true,true],[-150,true,true],[-150,true,true],[-110,true,true],[-70,true,true],[-30,true,false],[10,false,false]],"passed":false},{"actual":[[30,false,false],[60,false,false],[90,false,false],[100,false,false],[100,false,false],[100,false,false],[80,false,false],[60,false,false],[40,false,false],[20,false,false],[0,false,false]],"check":"control: long surplus","expected":[[30,false,false],[60,false,false],[90,false,false],[100,false,false],[100,false,false],[100,false,false],[80,false,false],[60,false,false],[40,false,false],[20,false,false],[0,false,false]],"passed":true},{"actual":[[-40,false,false],[-60,true,false],[-30,true,false],[0,false,false],[5,false,false]],"check":"control: start then immediate surplus","expected":[[-40,false,false],[-60,true,false],[-30,true,false],[0,false,false],[5,false,false]],"passed":true},{"actual":[[-29,false,false],[-19,false,false],[-10,false,false],[3,false,false],[12,false,false],[43,false,false],[100,false,false],[100,false,false],[77,false,false],[50,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false]],"check":"control: scenario 1","expected":[[-29,false,false],[-19,false,false],[-10,false,false],[3,false,false],[12,false,false],[43,false,false],[100,false,false],[100,false,false],[77,false,false],[50,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false]],"passed":true},{"actual":[[27,false,false],[54,false,false],[87,false,false],[100,false,false],[71,false,false],[50,false,false],[79,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false]],"check":"control: scenario 2","expected":[[27,false,false],[54,false,false],[87,false,false],[100,false,false],[71,false,false],[50,false,false],[79,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false]],"passed":true},{"actual":[[31,false,false],[66,false,false],[98,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[90,false,false],[68,false,false],[47,false,false],[19,false,false],[-5,false,false],[-35,false,false],[-57,false,false],[-79,true,false],[-101,true,false],[-69,true,false],[-89,true,false],[-109,true,false],[-132,true,false]],"check":"control: scenario 3","expected":[[31,false,false],[66,false,false],[98,false,false],[100,false,false],[100,false,false],[100,false,false],[100,false,false],[90,false,false],[68,false,false],[47,false,false],[19,false,false],[-5,false,false],[-35,false,false],[-57,false,false],[-79,true,false],[-101,true,false],[-69,true,false],[-89,true,false],[-109,true,false],[-132,true,false]],"passed":true},{"actual":[[-13,false,false],[-30,false,false],[-42,false,false],[-15,false,false],[41,false,false],[100,false,false],[78,false,false],[49,false,false],[25,false,false],[3,false,false],[-24,false,false],[-48,false,false],[-70,true,false],[-94,true,false],[-117,true,false],[-147,true,false],[-172,true,true]],"check":"control: scenario 4","expected":[[-13,false,false],[-30,false,false],[-42,false,false],[-15,false,false],[41,false,false],[100,false,false],[78,false,false],[49,false,false],[25,false,false],[3,false,false],[-24,false,false],[-48,false,false],[-70,true,false],[-94,true,false],[-117,true,false],[-147,true,false],[-172,true,true]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: deficit and recovery\", \"actual\": [[-20, false, false], [-40, false, false], [-60, true, false], [-80, true, false], [-100, true, true], [-120, true, true], [-140, true, true], [-120, true, true], [-100, true, false], [-80, true, false], [-60, true, false], [-40, true, false], [-20, true, false], [0, false, false]], \"expected\": [[-20, false, false], [-40, false, false], [-60, true, false], [-80, true, false], [-100, true, true], [-120, true, true], [-140, true, true], [-120, true, true], [-100, true, true], [-80, true, true], [-60, true, false], [-40, true, false], [-20, true, false], [0, false, false]], \"passed\": false}, {\"check\": \"regression: deep deficit floor\", \"actual\": [[-40, false, false], [-80, true, false], [-120, true, true], [-150, true, true], [-150, true, true], [-150, true, true], [-110, true, true], [-70, true, false], [-30, true, false], [10, false, false]], \"expected\": [[-40, false, false], [-80, true, false], [-120, true, true], [-150, true, true], [-150, true, true], [-150, true, true], [-110, true, true], [-70, true, true], [-30, true, false], [10, false, false]], \"passed\": false}, {\"check\": \"control: long surplus\", \"actual\": [[30, false, false], [60, false, false], [90, false, false], [100, false, false], [100, false, false], [100, false, false], [80, false, false], [60, false, false], [40, false, false], [20, false, false], [0, false, false]], \"expected\": [[30, false, false], [60, false, false], [90, false, false], [100, false, false], [100, false, false], [100, false, false], [80, false, false], [60, false, false], [40, false, false], [20, false, false], [0, false, false]], \"passed\": true}, {\"check\": \"control: start then immediate surplus\", \"actual\": [[-40, false, false], [-60, true, false], [-30, true, false], [0, false, false], [5, false, false]], \"expected\": [[-40, false, false], [-60, true, false], [-30, true, false], [0, false, false], [5, false, false]], \"passed\": true}, {\"check\": \"control: scenario 1\", \"actual\": [[-29, false, false], [-19, false, false], [-10, false, false], [3, false, false], [12, false, false], [43, false, false], [100, false, false], [100, false, false], [77, false, false], [50, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false]], \"expected\": [[-29, false, false], [-19, false, false], [-10, false, false], [3, false, false], [12, false, false], [43, false, false], [100, false, false], [100, false, false], [77, false, false], [50, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false]], \"passed\": true}, {\"check\": \"control: scenario 2\", \"actual\": [[27, false, false], [54, false, false], [87, false, false], [100, false, false], [71, false, false], [50, false, false], [79, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false]], \"expected\": [[27, false, false], [54, false, false], [87, false, false], [100, false, false], [71, false, false], [50, false, false], [79, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false]], \"passed\": true}, {\"check\": \"control: scenario 3\", \"actual\": [[31, false, false], [66, false, false], [98, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [90, false, false], [68, false, false], [47, false, false], [19, false, false], [-5, false, false], [-35, false, false], [-57, false, false], [-79, true, false], [-101, true, false], [-69, true, false], [-89, true, false], [-109, true, false], [-132, true, false]], \"expected\": [[31, false, false], [66, false, false], [98, false, false], [100, false, false], [100, false, false], [100, false, false], [100, false, false], [90, false, false], [68, false, false], [47, false, false], [19, false, false], [-5, false, false], [-35, false, false], [-57, false, false], [-79, true, false], [-101, true, false], [-69, true, false], [-89, true, false], [-109, true, false], [-132, true, false]], \"passed\": true}, {\"check\": \"control: scenario 4\", \"actual\": [[-13, false, false], [-30, false, false], [-42, false, false], [-15, false, false], [41, false, false], [100, false, false], [78, false, false], [49, false, false], [25, false, false], [3, false, false], [-24, false, false], [-48, false, false], [-70, true, false], [-94, true, false], [-117, true, false], [-147, true, false], [-172, true, true]], \"expected\": [[-13, false, false], [-30, false, false], [-42, false, false], [-15, false, false], [41, false, false], [100, false, false], [78, false, false], [49, false, false], [25, false, false], [3, false, false], [-24, false, false], [-48, false, false], [-70, true, false], [-94, true, false], [-117, true, false], [-147, true, false], [-172, true, 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."}}