{"abstract":"After a long surplus the compressor takes a very long time to restart, and deep deficits wind up without bound.","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":"Clamping only the floor still lets surplus wind up above 100.","family":"w2-hvac-thermostat-control-degree-minute-heat-pump-dm-clamp","id":"FA-92661","implementations":{"attempt":{"sha256":"35f910b158d8940d3ed484f4cdfb062461beb5f064ca8d9fae280965d9f9f9a4","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'], 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['start_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: 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: 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: 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: 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  ['regression: 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  ['regression: 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  ['regression: 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 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: 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: 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 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  ['regression: 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 4',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -250},\n    [[21, 40],\n     [25, 40],\n     [46, 40],\n     [48, 40],\n     [21, 40],\n     [24, 40],\n     [26, 40],\n     [25, 40],\n     [25, 40],\n     [45, 40],\n     [49, 40],\n     [50, 40],\n     [50, 40],\n     [48, 40],\n     [45, 40],\n     [55, 40],\n     [20, 40],\n     [23, 40],\n     [103, 40],\n     [102, 40],\n     [73, 40],\n     [75, 40]]],\n   [[-19, False, False],\n    [-34, False, False],\n    [-28, False, False],\n    [-20, False, False],\n    [-39, False, False],\n    [-55, False, False],\n    [-69, True, False],\n    [-84, True, False],\n    [-99, True, False],\n    [-94, True, False],\n    [-85, True, False],\n    [-75, True, False],\n    [-65, True, False],\n    [-57, True, False],\n    [-52, True, False],\n    [-37, True, False],\n    [-57, True, False],\n    [-74, True, False],\n    [-11, True, False],\n    [51, False, False],\n    [84, False, False],\n    [100, False, False]]]],\n [['regression: 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  ['regression: 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  ['control: 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: 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  ['regression: 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  ['regression: scenario 4',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -400},\n    [[57, 40],\n     [54, 40],\n     [54, 40],\n     [50, 40],\n     [55, 40],\n     [52, 40],\n     [53, 40],\n     [50, 40],\n     [59, 40],\n     [50, 40],\n     [51, 40],\n     [57, 40],\n     [73, 40],\n     [67, 40],\n     [15, 40],\n     [71, 40],\n     [65, 40],\n     [74, 40]]],\n   [[17, False, False],\n    [31, False, False],\n    [45, False, False],\n    [55, False, False],\n    [70, False, False],\n    [82, 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    [75, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False]]]],\n [['regression: 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  ['regression: scenario 5',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -300, 'floor': -250},\n    [[103, 40],\n     [99, 40],\n     [104, 40],\n     [101, 40],\n     [48, 40],\n     [50, 40],\n     [46, 40],\n     [45, 40],\n     [45, 40],\n     [30, 40],\n     [24, 40],\n     [24, 40],\n     [98, 40],\n     [99, 40],\n     [98, 40],\n     [95, 40],\n     [101, 40],\n     [97, 40],\n     [99, 40],\n     [104, 40],\n     [99, 40],\n     [99, 40],\n     [49, 40],\n     [46, 40]]],\n   [[63, 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    [90, False, False],\n    [74, False, False],\n    [58, 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: 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: 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  ['regression: 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  ['regression: 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 5',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -300, 'floor': -400},\n    [[16, 40],\n     [10, 40],\n     [17, 40],\n     [20, 40],\n     [11, 40],\n     [20, 40],\n     [104, 40],\n     [102, 40],\n     [103, 40],\n     [97, 40],\n     [101, 40],\n     [102, 40],\n     [95, 40],\n     [103, 40],\n     [99, 40],\n     [101, 40],\n     [17, 40],\n     [17, 40],\n     [14, 40],\n     [67, 40],\n     [72, 40],\n     [74, 40]]],\n   [[-24, False, False],\n    [-54, False, False],\n    [-77, True, False],\n    [-97, True, False],\n    [-126, True, False],\n    [-146, True, False],\n    [-82, True, False],\n    [-20, True, False],\n    [43, 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    [77, False, False],\n    [54, False, False],\n    [28, False, False],\n    [55, False, False],\n    [87, False, False],\n    [100, False, False]]],\n  ['regression: scenario 11',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -300, 'floor': -250},\n    [[56, 40],\n     [54, 40],\n     [53, 40],\n     [100, 40],\n     [101, 40],\n     [104, 40],\n     [72, 40],\n     [69, 40],\n     [71, 40],\n     [65, 40],\n     [71, 40],\n     [73, 40],\n     [102, 40],\n     [47, 40],\n     [55, 40],\n     [47, 40],\n     [54, 40],\n     [49, 40],\n     [47, 40],\n     [52, 40],\n     [51, 40],\n     [54, 40],\n     [50, 40]]],\n   [[16, False, False],\n    [30, False, False],\n    [43, 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: 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: 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  ['regression: 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]]]]]\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":"df0b880749ad54d3d0e46fedf8fa579e972a72a582bf6b1bdb114ecd57dee233","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 = 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['start_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: 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: 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: 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: 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  ['regression: 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  ['regression: 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  ['regression: 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 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: 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: 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 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  ['regression: 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 4',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -250},\n    [[21, 40],\n     [25, 40],\n     [46, 40],\n     [48, 40],\n     [21, 40],\n     [24, 40],\n     [26, 40],\n     [25, 40],\n     [25, 40],\n     [45, 40],\n     [49, 40],\n     [50, 40],\n     [50, 40],\n     [48, 40],\n     [45, 40],\n     [55, 40],\n     [20, 40],\n     [23, 40],\n     [103, 40],\n     [102, 40],\n     [73, 40],\n     [75, 40]]],\n   [[-19, False, False],\n    [-34, False, False],\n    [-28, False, False],\n    [-20, False, False],\n    [-39, False, False],\n    [-55, False, False],\n    [-69, True, False],\n    [-84, True, False],\n    [-99, True, False],\n    [-94, True, False],\n    [-85, True, False],\n    [-75, True, False],\n    [-65, True, False],\n    [-57, True, False],\n    [-52, True, False],\n    [-37, True, False],\n    [-57, True, False],\n    [-74, True, False],\n    [-11, True, False],\n    [51, False, False],\n    [84, False, False],\n    [100, False, False]]]],\n [['regression: 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  ['regression: 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  ['control: 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: 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  ['regression: 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  ['regression: scenario 4',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -150, 'floor': -400},\n    [[57, 40],\n     [54, 40],\n     [54, 40],\n     [50, 40],\n     [55, 40],\n     [52, 40],\n     [53, 40],\n     [50, 40],\n     [59, 40],\n     [50, 40],\n     [51, 40],\n     [57, 40],\n     [73, 40],\n     [67, 40],\n     [15, 40],\n     [71, 40],\n     [65, 40],\n     [74, 40]]],\n   [[17, False, False],\n    [31, False, False],\n    [45, False, False],\n    [55, False, False],\n    [70, False, False],\n    [82, 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    [75, False, False],\n    [100, False, False],\n    [100, False, False],\n    [100, False, False]]]],\n [['regression: 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  ['regression: scenario 5',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -300, 'floor': -250},\n    [[103, 40],\n     [99, 40],\n     [104, 40],\n     [101, 40],\n     [48, 40],\n     [50, 40],\n     [46, 40],\n     [45, 40],\n     [45, 40],\n     [30, 40],\n     [24, 40],\n     [24, 40],\n     [98, 40],\n     [99, 40],\n     [98, 40],\n     [95, 40],\n     [101, 40],\n     [97, 40],\n     [99, 40],\n     [104, 40],\n     [99, 40],\n     [99, 40],\n     [49, 40],\n     [46, 40]]],\n   [[63, 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    [90, False, False],\n    [74, False, False],\n    [58, 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: 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: 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  ['regression: 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  ['regression: 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 5',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -300, 'floor': -400},\n    [[16, 40],\n     [10, 40],\n     [17, 40],\n     [20, 40],\n     [11, 40],\n     [20, 40],\n     [104, 40],\n     [102, 40],\n     [103, 40],\n     [97, 40],\n     [101, 40],\n     [102, 40],\n     [95, 40],\n     [103, 40],\n     [99, 40],\n     [101, 40],\n     [17, 40],\n     [17, 40],\n     [14, 40],\n     [67, 40],\n     [72, 40],\n     [74, 40]]],\n   [[-24, False, False],\n    [-54, False, False],\n    [-77, True, False],\n    [-97, True, False],\n    [-126, True, False],\n    [-146, True, False],\n    [-82, True, False],\n    [-20, True, False],\n    [43, 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    [77, False, False],\n    [54, False, False],\n    [28, False, False],\n    [55, False, False],\n    [87, False, False],\n    [100, False, False]]],\n  ['regression: scenario 11',\n   [{'start_dm': -60, 'stop_dm': 0, 'aux_dm': -300, 'floor': -250},\n    [[56, 40],\n     [54, 40],\n     [53, 40],\n     [100, 40],\n     [101, 40],\n     [104, 40],\n     [72, 40],\n     [69, 40],\n     [71, 40],\n     [65, 40],\n     [71, 40],\n     [73, 40],\n     [102, 40],\n     [47, 40],\n     [55, 40],\n     [47, 40],\n     [54, 40],\n     [49, 40],\n     [47, 40],\n     [52, 40],\n     [51, 40],\n     [54, 40],\n     [50, 40]]],\n   [[16, False, False],\n    [30, False, False],\n    [43, 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: 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: 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  ['regression: 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]]]]]\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-dm-clamp","generated_at":"2026-09-29T14:51:47.815585+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":"The DM update has no floor or ceiling.","sha256":"de365493dfcf12d8a5dfe94debc2dce33b7620d20289ff5d4108fdf1805af950","title":"Degree-minute integral is not clamped · 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":43.859,"exit_code":1,"observations":[{"actual":[[30,false,false],[60,false,false],[90,false,false],[120,false,false],[150,false,false],[180,false,false],[160,false,false],[140,false,false],[120,false,false],[100,false,false],[80,false,false]],"check":"regression: 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":false},{"actual":[[-29,false,false],[-19,false,false],[-10,false,false],[3,false,false],[12,false,false],[43,false,false],[108,false,false],[168,false,false],[145,false,false],[118,false,false],[180,false,false],[242,false,false],[301,false,false],[366,false,false],[422,false,false],[432,false,false],[440,false,false],[446,false,false],[453,false,false],[463,false,false],[475,false,false],[483,false,false],[514,false,false]],"check":"regression: 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":false},{"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,false],[-40,true,false],[-20,true,false],[0,false,false]],"check":"control: 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":true},{"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,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":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":[[27,false,false],[54,false,false],[87,false,false],[118,false,false],[89,false,false],[68,false,false],[97,false,false],[127,false,false],[152,false,false],[182,false,false],[208,false,false],[234,false,false],[265,false,false],[293,false,false],[323,false,false],[356,false,false],[390,false,false],[423,false,false],[448,false,false],[483,false,false],[547,false,false]],"check":"regression: 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":false},{"actual":[[31,false,false],[66,false,false],[98,false,false],[126,false,false],[161,false,false],[169,false,false],[174,false,false],[164,false,false],[142,false,false],[121,false,false],[93,false,false],[69,false,false],[39,false,false],[17,false,false],[-5,false,false],[-27,false,false],[5,false,false],[-15,false,false],[-35,false,false],[-58,false,false]],"check":"regression: 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":false},{"actual":[[-13,false,false],[-30,false,false],[-42,false,false],[-15,false,false],[41,false,false],[102,false,false],[80,false,false],[51,false,false],[27,false,false],[5,false,false],[-22,false,false],[-46,false,false],[-68,true,false],[-92,true,false],[-115,true,false],[-145,true,false],[-170,true,true]],"check":"regression: 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":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: long surplus\", \"actual\": [[30, false, false], [60, false, false], [90, false, false], [120, false, false], [150, false, false], [180, false, false], [160, false, false], [140, false, false], [120, false, false], [100, false, false], [80, 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\": false}, {\"check\": \"regression: scenario 1\", \"actual\": [[-29, false, false], [-19, false, false], [-10, false, false], [3, false, false], [12, false, false], [43, false, false], [108, false, false], [168, false, false], [145, false, false], [118, false, false], [180, false, false], [242, false, false], [301, false, false], [366, false, false], [422, false, false], [432, false, false], [440, false, false], [446, false, false], [453, false, false], [463, false, false], [475, false, false], [483, false, false], [514, 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\": false}, {\"check\": \"control: 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, 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\": true}, {\"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, 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\": 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\": \"regression: scenario 2\", \"actual\": [[27, false, false], [54, false, false], [87, false, false], [118, false, false], [89, false, false], [68, false, false], [97, false, false], [127, false, false], [152, false, false], [182, false, false], [208, false, false], [234, false, false], [265, false, false], [293, false, false], [323, false, false], [356, false, false], [390, false, false], [423, false, false], [448, false, false], [483, false, false], [547, 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\": false}, {\"check\": \"regression: scenario 3\", \"actual\": [[31, false, false], [66, false, false], [98, false, false], [126, false, false], [161, false, false], [169, false, false], [174, false, false], [164, false, false], [142, false, false], [121, false, false], [93, false, false], [69, false, false], [39, false, false], [17, false, false], [-5, false, false], [-27, false, false], [5, false, false], [-15, false, false], [-35, false, false], [-58, false, 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\": false}, {\"check\": \"regression: scenario 4\", \"actual\": [[-13, false, false], [-30, false, false], [-42, false, false], [-15, false, false], [41, false, false], [102, false, false], [80, false, false], [51, false, false], [27, false, false], [5, false, false], [-22, false, false], [-46, false, false], [-68, true, false], [-92, true, false], [-115, true, false], [-145, true, false], [-170, 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\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.477,"exit_code":1,"observations":[{"actual":[[30,false,false],[60,false,false],[90,false,false],[120,false,false],[150,false,false],[180,false,false],[160,false,false],[140,false,false],[120,false,false],[100,false,false],[80,false,false]],"check":"regression: 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":false},{"actual":[[-29,false,false],[-19,false,false],[-10,false,false],[3,false,false],[12,false,false],[43,false,false],[108,false,false],[168,false,false],[145,false,false],[118,false,false],[180,false,false],[242,false,false],[301,false,false],[366,false,false],[422,false,false],[432,false,false],[440,false,false],[446,false,false],[453,false,false],[463,false,false],[475,false,false],[483,false,false],[514,false,false]],"check":"regression: 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":false},{"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,false],[-40,true,false],[-20,true,false],[0,false,false]],"check":"control: 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":true},{"actual":[[-40,false,false],[-80,true,false],[-120,true,true],[-160,true,true],[-200,true,true],[-240,true,true],[-200,true,true],[-160,true,true],[-120,true,true],[-80,true,true]],"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":[[-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":[[27,false,false],[54,false,false],[87,false,false],[118,false,false],[89,false,false],[68,false,false],[97,false,false],[127,false,false],[152,false,false],[182,false,false],[208,false,false],[234,false,false],[265,false,false],[293,false,false],[323,false,false],[356,false,false],[390,false,false],[423,false,false],[448,false,false],[483,false,false],[547,false,false]],"check":"regression: 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":false},{"actual":[[31,false,false],[66,false,false],[98,false,false],[126,false,false],[161,false,false],[169,false,false],[174,false,false],[164,false,false],[142,false,false],[121,false,false],[93,false,false],[69,false,false],[39,false,false],[17,false,false],[-5,false,false],[-27,false,false],[5,false,false],[-15,false,false],[-35,false,false],[-58,false,false]],"check":"regression: 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":false},{"actual":[[-13,false,false],[-30,false,false],[-42,false,false],[-15,false,false],[41,false,false],[102,false,false],[80,false,false],[51,false,false],[27,false,false],[5,false,false],[-22,false,false],[-46,false,false],[-68,true,false],[-92,true,false],[-115,true,false],[-145,true,false],[-170,true,true]],"check":"regression: 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":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: long surplus\", \"actual\": [[30, false, false], [60, false, false], [90, false, false], [120, false, false], [150, false, false], [180, false, false], [160, false, false], [140, false, false], [120, false, false], [100, false, false], [80, 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\": false}, {\"check\": \"regression: scenario 1\", \"actual\": [[-29, false, false], [-19, false, false], [-10, false, false], [3, false, false], [12, false, false], [43, false, false], [108, false, false], [168, false, false], [145, false, false], [118, false, false], [180, false, false], [242, false, false], [301, false, false], [366, false, false], [422, false, false], [432, false, false], [440, false, false], [446, false, false], [453, false, false], [463, false, false], [475, false, false], [483, false, false], [514, 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\": false}, {\"check\": \"control: 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, 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\": true}, {\"check\": \"regression: deep deficit floor\", \"actual\": [[-40, false, false], [-80, true, false], [-120, true, true], [-160, true, true], [-200, true, true], [-240, true, true], [-200, true, true], [-160, true, true], [-120, true, true], [-80, true, true]], \"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: 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\": \"regression: scenario 2\", \"actual\": [[27, false, false], [54, false, false], [87, false, false], [118, false, false], [89, false, false], [68, false, false], [97, false, false], [127, false, false], [152, false, false], [182, false, false], [208, false, false], [234, false, false], [265, false, false], [293, false, false], [323, false, false], [356, false, false], [390, false, false], [423, false, false], [448, false, false], [483, false, false], [547, 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\": false}, {\"check\": \"regression: scenario 3\", \"actual\": [[31, false, false], [66, false, false], [98, false, false], [126, false, false], [161, false, false], [169, false, false], [174, false, false], [164, false, false], [142, false, false], [121, false, false], [93, false, false], [69, false, false], [39, false, false], [17, false, false], [-5, false, false], [-27, false, false], [5, false, false], [-15, false, false], [-35, false, false], [-58, false, 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\": false}, {\"check\": \"regression: scenario 4\", \"actual\": [[-13, false, false], [-30, false, false], [-42, false, false], [-15, false, false], [41, false, false], [102, false, false], [80, false, false], [51, false, false], [27, false, false], [5, false, false], [-22, false, false], [-46, false, false], [-68, true, false], [-92, true, false], [-115, true, false], [-145, true, false], [-170, 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\": false}], \"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."}}