{"abstract":"The damper throttles back on cold mornings even when the mixed air is warm enough, and fails to protect when it is not.","category":"HVAC thermostat control","checks":8,"contract":"Rooftop economizer per sample; samples are [outdoor, return_air, cooling_call, mixed_air, occupied] in tenths F. Economizing is enabled when outdoor <= high_limit - 2.0 F and outdoor < return - diff, and disabled when outdoor > high_limit or outdoor >= return. Unoccupied: damper 0%. Occupied, enabled and cooling: if mixed air < mat_low the damper steps down 10% but not below min_pos, otherwise it steps up 20% from at least min_pos, capped at 100%. Otherwise the damper sits at min_pos. Return [enabled, damper%] per sample.","contract_signature":"settings, samples","evaluation_group":"w2-hvac-thermostat-control-dry-bulb-economizer","failed_approach":"Throttling when either sensor is low still closes the damper on cold outdoor air alone.","family":"w2-hvac-thermostat-control-dry-bulb-economizer-low-limit-sensor","id":"FA-92541","implementations":{"attempt":{"sha256":"003a46094c2ec273bfd1ce5841d6eee3480e2d9920d8cd2af4493ab4b9273526","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(settings, samples):\n    enabled = False\n    pos = 0\n    out = []\n    for outdoor, ret, cooling, mixed, occupied in samples:\n        if enabled and (outdoor > settings['high_limit'] or outdoor >= ret):\n            enabled = False\n        elif not enabled and outdoor <= settings['high_limit'] - 20 and outdoor < ret - settings['diff']:\n            enabled = True\n        if not occupied:\n            pos = 0\n        elif enabled and cooling:\n            if min(mixed, outdoor) < settings['mat_low']:\n                pos = max(settings['min_pos'], pos - 10)\n            else:\n                pos = min(100, max(settings['min_pos'], pos) + 20)\n        else:\n            pos = settings['min_pos']\n        out.append([enabled, pos])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: economizer cycle',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[600, 740, True, 560, True],\n     [600, 740, True, 560, True],\n     [600, 740, True, 520, True],\n     [690, 740, True, 560, True],\n     [705, 740, True, 560, True],\n     [600, 740, False, 560, True],\n     [600, 740, True, 560, False]]],\n   [[True, 40], [True, 60], [True, 50], [True, 70], [False, 20], [True, 20], [True, 0]]],\n  ['regression: cold mixed air',\n   [{'high_limit': 700, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[450, 720, True, 600, True],\n     [450, 720, True, 600, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True]]],\n   [[True, 50], [True, 70], [True, 60], [True, 50], [True, 40], [True, 30]]],\n  ['control: enable band edges',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[681, 740, True, 560, True],\n     [680, 700, True, 560, True],\n     [680, 701, True, 560, True],\n     [700, 750, True, 560, True],\n     [710, 750, True, 560, True]]],\n   [[False, 20], [False, 20], [True, 40], [True, 60], [False, 20]]],\n  ['control: night cooling call',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[550, 740, True, 560, False], [550, 740, True, 560, True]]],\n   [[True, 0], [True, 40]]],\n  ['control: near return disable',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[700, 730, True, 560, True],\n     [715, 730, True, 560, True],\n     [725, 730, True, 560, True],\n     [730, 730, True, 560, True]]],\n   [[True, 35], [True, 55], [True, 75], [False, 15]]],\n  ['regression: scenario 1',\n   [{'high_limit': 750, 'diff': 0, 'min_pos': 20, 'mat_low': 500},\n    [[648, 701, True, 604, True],\n     [640, 708, True, 484, True],\n     [671, 716, True, 536, True],\n     [649, 721, True, 616, False],\n     [640, 749, True, 619, True],\n     [651, 751, True, 599, True],\n     [669, 718, False, 504, True],\n     [638, 704, False, 542, True]]],\n   [[True, 40], [True, 30], [True, 50], [True, 0], [True, 40], [True, 60], [True, 20], [True, 20]]],\n  ['regression: scenario 2',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[460, 757, True, 619, True],\n     [462, 720, False, 618, True],\n     [502, 734, True, 534, True],\n     [488, 707, False, 516, True],\n     [450, 735, False, 496, True],\n     [472, 754, True, 606, True],\n     [477, 741, False, 575, True],\n     [452, 710, True, 531, True],\n     [431, 759, False, 576, True]]],\n   [[True, 40],\n    [True, 20],\n    [True, 40],\n    [True, 20],\n    [True, 20],\n    [True, 40],\n    [True, 20],\n    [True, 40],\n    [True, 20]]],\n  ['regression: scenario 3',\n   [{'high_limit': 700, 'diff': 40, 'min_pos': 30, 'mat_low': 530},\n    [[608, 734, True, 493, True],\n     [609, 741, True, 531, True],\n     [587, 758, True, 553, True],\n     [561, 759, False, 498, False],\n     [530, 741, False, 509, True],\n     [544, 760, True, 493, True],\n     [548, 751, True, 583, True],\n     [512, 705, False, 540, False],\n     [490, 711, True, 562, True]]],\n   [[True, 30],\n    [True, 50],\n    [True, 70],\n    [True, 0],\n    [True, 30],\n    [True, 30],\n    [True, 50],\n    [True, 0],\n    [True, 50]]]],\n [['regression: cold mixed air',\n   [{'high_limit': 700, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[450, 720, True, 600, True],\n     [450, 720, True, 600, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True]]],\n   [[True, 50], [True, 70], [True, 60], [True, 50], [True, 40], [True, 30]]],\n  ['regression: scenario 5',\n   [{'high_limit': 700, 'diff': 40, 'min_pos': 15, 'mat_low': 530},\n    [[504, 733, True, 584, False],\n     [484, 752, False, 481, True],\n     [504, 718, True, 551, True],\n     [492, 701, True, 483, True],\n     [465, 718, True, 546, True],\n     [495, 735, False, 516, True],\n     [510, 719, True, 599, True],\n     [515, 712, True, 501, True],\n     [523, 748, True, 540, False],\n     [497, 704, True, 609, True],\n     [534, 716, False, 536, True],\n     [558, 732, True, 617, True],\n     [554, 748, True, 531, True]]],\n   [[True, 0],\n    [True, 15],\n    [True, 35],\n    [True, 25],\n    [True, 45],\n    [True, 15],\n    [True, 35],\n    [True, 25],\n    [True, 0],\n    [True, 35],\n    [True, 15],\n    [True, 35],\n    [True, 55]]],\n  ['regression: economizer cycle',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[600, 740, True, 560, True],\n     [600, 740, True, 560, True],\n     [600, 740, True, 520, True],\n     [690, 740, True, 560, True],\n     [705, 740, True, 560, True],\n     [600, 740, False, 560, True],\n     [600, 740, True, 560, False]]],\n   [[True, 40], [True, 60], [True, 50], [True, 70], [False, 20], [True, 20], [True, 0]]],\n  ['control: enable band edges',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[681, 740, True, 560, True],\n     [680, 700, True, 560, True],\n     [680, 701, True, 560, True],\n     [700, 750, True, 560, True],\n     [710, 750, True, 560, True]]],\n   [[False, 20], [False, 20], [True, 40], [True, 60], [False, 20]]],\n  ['control: night cooling call',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[550, 740, True, 560, False], [550, 740, True, 560, True]]],\n   [[True, 0], [True, 40]]],\n  ['control: near return disable',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[700, 730, True, 560, True],\n     [715, 730, True, 560, True],\n     [725, 730, True, 560, True],\n     [730, 730, True, 560, True]]],\n   [[True, 35], [True, 55], [True, 75], [False, 15]]],\n  ['control: scenario 1',\n   [{'high_limit': 650, 'diff': 0, 'min_pos': 30, 'mat_low': 500},\n    [[754, 754, False, 483, False],\n     [716, 749, True, 499, True],\n     [699, 701, False, 573, True],\n     [694, 750, True, 534, False],\n     [704, 716, False, 517, True],\n     [708, 701, False, 567, True],\n     [743, 735, True, 609, True],\n     [775, 747, False, 554, True],\n     [743, 731, False, 583, False],\n     [764, 708, False, 507, True],\n     [795, 743, False, 528, True],\n     [770, 706, True, 501, True],\n     [764, 752, False, 578, True]]],\n   [[False, 0],\n    [False, 30],\n    [False, 30],\n    [False, 0],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 0],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30]]],\n  ['regression: scenario 2',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 30, 'mat_low': 500},\n    [[492, 750, False, 518, True],\n     [495, 710, True, 564, True],\n     [507, 701, True, 603, True],\n     [545, 705, False, 490, True],\n     [529, 724, True, 489, False],\n     [508, 721, True, 529, False],\n     [482, 717, True, 619, True],\n     [464, 753, False, 608, True],\n     [478, 719, False, 559, False],\n     [481, 730, False, 494, True],\n     [511, 719, False, 613, True],\n     [479, 743, False, 542, True],\n     [477, 728, True, 597, True],\n     [493, 756, False, 531, True]]],\n   [[True, 30],\n    [True, 50],\n    [True, 70],\n    [True, 30],\n    [True, 0],\n    [True, 0],\n    [True, 50],\n    [True, 30],\n    [True, 0],\n    [True, 30],\n    [True, 30],\n    [True, 30],\n    [True, 50],\n    [True, 30]]]],\n [['regression: scenario 2',\n   [{'high_limit': 650, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[599, 747, False, 570, True],\n     [625, 701, False, 603, True],\n     [623, 732, False, 565, False],\n     [624, 737, True, 482, True],\n     [637, 740, False, 485, True],\n     [676, 702, True, 590, True],\n     [678, 755, True, 522, True],\n     [670, 733, True, 571, True],\n     [684, 712, True, 616, False],\n     [687, 736, True, 607, False],\n     [712, 739, False, 524, True]]],\n   [[True, 30],\n    [True, 30],\n    [True, 0],\n    [True, 30],\n    [True, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 0],\n    [False, 0],\n    [False, 30]]],\n  ['regression: scenario 5',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 500},\n    [[461, 718, True, 532, True],\n     [443, 741, True, 488, True],\n     [450, 751, True, 605, True],\n     [448, 717, False, 535, True],\n     [417, 745, False, 488, False],\n     [418, 721, True, 581, True],\n     [400, 757, False, 544, False],\n     [435, 716, False, 598, False],\n     [436, 729, False, 485, True],\n     [440, 713, True, 511, True],\n     [402, 722, True, 517, True],\n     [427, 710, False, 571, True],\n     [402, 739, True, 565, True],\n     [400, 705, True, 571, True]]],\n   [[True, 40],\n    [True, 30],\n    [True, 50],\n    [True, 20],\n    [True, 0],\n    [True, 40],\n    [True, 0],\n    [True, 0],\n    [True, 20],\n    [True, 40],\n    [True, 60],\n    [True, 20],\n    [True, 40],\n    [True, 60]]],\n  ['regression: economizer cycle',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[600, 740, True, 560, True],\n     [600, 740, True, 560, True],\n     [600, 740, True, 520, True],\n     [690, 740, True, 560, True],\n     [705, 740, True, 560, True],\n     [600, 740, False, 560, True],\n     [600, 740, True, 560, False]]],\n   [[True, 40], [True, 60], [True, 50], [True, 70], [False, 20], [True, 20], [True, 0]]],\n  ['control: enable band edges',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[681, 740, True, 560, True],\n     [680, 700, True, 560, True],\n     [680, 701, True, 560, True],\n     [700, 750, True, 560, True],\n     [710, 750, True, 560, True]]],\n   [[False, 20], [False, 20], [True, 40], [True, 60], [False, 20]]],\n  ['regression: cold mixed air',\n   [{'high_limit': 700, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[450, 720, True, 600, True],\n     [450, 720, True, 600, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True]]],\n   [[True, 50], [True, 70], [True, 60], [True, 50], [True, 40], [True, 30]]],\n  ['control: night cooling call',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[550, 740, True, 560, False], [550, 740, True, 560, True]]],\n   [[True, 0], [True, 40]]],\n  ['control: near return disable',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[700, 730, True, 560, True],\n     [715, 730, True, 560, True],\n     [725, 730, True, 560, True],\n     [730, 730, True, 560, True]]],\n   [[True, 35], [True, 55], [True, 75], [False, 15]]],\n  ['control: scenario 1',\n   [{'high_limit': 650, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[678, 721, True, 495, True],\n     [646, 726, True, 616, True],\n     [669, 714, True, 600, True],\n     [630, 728, True, 542, True],\n     [626, 751, True, 530, False],\n     [638, 723, False, 607, True],\n     [654, 706, True, 557, True],\n     [625, 704, False, 618, True]]],\n   [[False, 20], [False, 20], [False, 20], [True, 40], [True, 0], [True, 20], [False, 20], [True, 20]]]],\n [['regression: scenario 3',\n   [{'high_limit': 700, 'diff': 40, 'min_pos': 15, 'mat_low': 500},\n    [[648, 702, True, 512, True],\n     [638, 725, True, 584, True],\n     [603, 726, True, 591, True],\n     [610, 705, True, 566, False],\n     [612, 706, False, 595, True],\n     [587, 717, True, 552, True],\n     [623, 754, True, 482, True],\n     [595, 710, True, 491, True],\n     [615, 710, False, 485, True]]],\n   [[True, 35],\n    [True, 55],\n    [True, 75],\n    [True, 0],\n    [True, 15],\n    [True, 35],\n    [True, 25],\n    [True, 15],\n    [True, 15]]],\n  ['regression: scenario 10',\n   [{'high_limit': 700, 'diff': 40, 'min_pos': 20, 'mat_low': 500},\n    [[520, 710, False, 509, False],\n     [491, 725, True, 541, True],\n     [521, 752, True, 598, True],\n     [550, 728, False, 517, True],\n     [558, 714, True, 566, True],\n     [591, 703, True, 597, True],\n     [618, 705, True, 567, True],\n     [620, 729, True, 571, True]]],\n   [[True, 0], [True, 40], [True, 60], [True, 20], [True, 40], [True, 60], [True, 80], [True, 100]]],\n  ['regression: economizer cycle',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[600, 740, True, 560, True],\n     [600, 740, True, 560, True],\n     [600, 740, True, 520, True],\n     [690, 740, True, 560, True],\n     [705, 740, True, 560, True],\n     [600, 740, False, 560, True],\n     [600, 740, True, 560, False]]],\n   [[True, 40], [True, 60], [True, 50], [True, 70], [False, 20], [True, 20], [True, 0]]],\n  ['control: enable band edges',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[681, 740, True, 560, True],\n     [680, 700, True, 560, True],\n     [680, 701, True, 560, True],\n     [700, 750, True, 560, True],\n     [710, 750, True, 560, True]]],\n   [[False, 20], [False, 20], [True, 40], [True, 60], [False, 20]]],\n  ['regression: cold mixed air',\n   [{'high_limit': 700, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[450, 720, True, 600, True],\n     [450, 720, True, 600, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True]]],\n   [[True, 50], [True, 70], [True, 60], [True, 50], [True, 40], [True, 30]]],\n  ['control: night cooling call',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[550, 740, True, 560, False], [550, 740, True, 560, True]]],\n   [[True, 0], [True, 40]]],\n  ['control: near return disable',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[700, 730, True, 560, True],\n     [715, 730, True, 560, True],\n     [725, 730, True, 560, True],\n     [730, 730, True, 560, True]]],\n   [[True, 35], [True, 55], [True, 75], [False, 15]]],\n  ['regression: scenario 1',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 30, 'mat_low': 500},\n    [[505, 738, False, 612, True],\n     [535, 706, True, 498, True],\n     [549, 734, False, 604, True],\n     [558, 729, True, 521, True],\n     [540, 724, True, 571, True],\n     [530, 749, True, 592, True],\n     [507, 715, True, 533, False],\n     [468, 703, False, 516, True],\n     [457, 715, False, 563, True],\n     [444, 708, False, 513, True]]],\n   [[True, 30],\n    [True, 30],\n    [True, 30],\n    [True, 50],\n    [True, 70],\n    [True, 90],\n    [True, 0],\n    [True, 30],\n    [True, 30],\n    [True, 30]]]],\n [['regression: scenario 6',\n   [{'high_limit': 650, 'diff': 40, 'min_pos': 30, 'mat_low': 530},\n    [[450, 740, True, 605, True],\n     [424, 725, True, 523, False],\n     [400, 741, True, 543, True],\n     [409, 711, True, 502, True],\n     [439, 732, False, 568, True],\n     [438, 760, True, 580, False],\n     [467, 735, True, 574, False],\n     [492, 716, False, 501, False],\n     [529, 729, True, 518, True]]],\n   [[True, 50], [True, 0], [True, 50], [True, 40], [True, 30], [True, 0], [True, 0], [True, 0], [True, 30]]],\n  ['regression: scenario 17',\n   [{'high_limit': 650, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[434, 753, False, 609, True],\n     [452, 724, True, 552, False],\n     [436, 712, False, 524, True],\n     [474, 746, True, 615, True],\n     [451, 733, True, 562, True],\n     [481, 717, False, 524, True],\n     [491, 741, True, 555, True],\n     [455, 719, True, 526, True],\n     [439, 710, True, 496, True],\n     [464, 724, False, 599, True],\n     [450, 703, True, 557, True],\n     [486, 758, True, 584, True],\n     [461, 733, True, 595, False],\n     [466, 711, True, 561, True]]],\n   [[True, 15],\n    [True, 0],\n    [True, 15],\n    [True, 35],\n    [True, 55],\n    [True, 15],\n    [True, 35],\n    [True, 55],\n    [True, 45],\n    [True, 15],\n    [True, 35],\n    [True, 55],\n    [True, 0],\n    [True, 35]]],\n  ['regression: economizer cycle',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[600, 740, True, 560, True],\n     [600, 740, True, 560, True],\n     [600, 740, True, 520, True],\n     [690, 740, True, 560, True],\n     [705, 740, True, 560, True],\n     [600, 740, False, 560, True],\n     [600, 740, True, 560, False]]],\n   [[True, 40], [True, 60], [True, 50], [True, 70], [False, 20], [True, 20], [True, 0]]],\n  ['control: enable band edges',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[681, 740, True, 560, True],\n     [680, 700, True, 560, True],\n     [680, 701, True, 560, True],\n     [700, 750, True, 560, True],\n     [710, 750, True, 560, True]]],\n   [[False, 20], [False, 20], [True, 40], [True, 60], [False, 20]]],\n  ['regression: cold mixed air',\n   [{'high_limit': 700, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[450, 720, True, 600, True],\n     [450, 720, True, 600, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True]]],\n   [[True, 50], [True, 70], [True, 60], [True, 50], [True, 40], [True, 30]]],\n  ['control: night cooling call',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[550, 740, True, 560, False], [550, 740, True, 560, True]]],\n   [[True, 0], [True, 40]]],\n  ['control: near return disable',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[700, 730, True, 560, True],\n     [715, 730, True, 560, True],\n     [725, 730, True, 560, True],\n     [730, 730, True, 560, True]]],\n   [[True, 35], [True, 55], [True, 75], [False, 15]]],\n  ['control: scenario 1',\n   [{'high_limit': 750, 'diff': 0, 'min_pos': 20, 'mat_low': 500},\n    [[684, 714, False, 579, True],\n     [715, 719, False, 481, True],\n     [737, 759, True, 615, False],\n     [715, 756, True, 609, False],\n     [743, 742, True, 491, True],\n     [776, 713, False, 491, True],\n     [798, 748, False, 566, True],\n     [800, 751, True, 547, True],\n     [800, 736, True, 486, True],\n     [760, 727, False, 570, True]]],\n   [[True, 20],\n    [True, 20],\n    [True, 0],\n    [True, 0],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20]]]]]\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":"07d382bb224f928dbb1f860f03af1f42bf0f9179dfcd1853c411672e8e65cae5","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(settings, samples):\n    enabled = False\n    pos = 0\n    out = []\n    for outdoor, ret, cooling, mixed, occupied in samples:\n        if enabled and (outdoor > settings['high_limit'] or outdoor >= ret):\n            enabled = False\n        elif not enabled and outdoor <= settings['high_limit'] - 20 and outdoor < ret - settings['diff']:\n            enabled = True\n        if not occupied:\n            pos = 0\n        elif enabled and cooling:\n            if outdoor < settings['mat_low']:\n                pos = max(settings['min_pos'], pos - 10)\n            else:\n                pos = min(100, max(settings['min_pos'], pos) + 20)\n        else:\n            pos = settings['min_pos']\n        out.append([enabled, pos])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: economizer cycle',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[600, 740, True, 560, True],\n     [600, 740, True, 560, True],\n     [600, 740, True, 520, True],\n     [690, 740, True, 560, True],\n     [705, 740, True, 560, True],\n     [600, 740, False, 560, True],\n     [600, 740, True, 560, False]]],\n   [[True, 40], [True, 60], [True, 50], [True, 70], [False, 20], [True, 20], [True, 0]]],\n  ['regression: cold mixed air',\n   [{'high_limit': 700, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[450, 720, True, 600, True],\n     [450, 720, True, 600, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True]]],\n   [[True, 50], [True, 70], [True, 60], [True, 50], [True, 40], [True, 30]]],\n  ['control: enable band edges',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[681, 740, True, 560, True],\n     [680, 700, True, 560, True],\n     [680, 701, True, 560, True],\n     [700, 750, True, 560, True],\n     [710, 750, True, 560, True]]],\n   [[False, 20], [False, 20], [True, 40], [True, 60], [False, 20]]],\n  ['control: night cooling call',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[550, 740, True, 560, False], [550, 740, True, 560, True]]],\n   [[True, 0], [True, 40]]],\n  ['control: near return disable',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[700, 730, True, 560, True],\n     [715, 730, True, 560, True],\n     [725, 730, True, 560, True],\n     [730, 730, True, 560, True]]],\n   [[True, 35], [True, 55], [True, 75], [False, 15]]],\n  ['regression: scenario 1',\n   [{'high_limit': 750, 'diff': 0, 'min_pos': 20, 'mat_low': 500},\n    [[648, 701, True, 604, True],\n     [640, 708, True, 484, True],\n     [671, 716, True, 536, True],\n     [649, 721, True, 616, False],\n     [640, 749, True, 619, True],\n     [651, 751, True, 599, True],\n     [669, 718, False, 504, True],\n     [638, 704, False, 542, True]]],\n   [[True, 40], [True, 30], [True, 50], [True, 0], [True, 40], [True, 60], [True, 20], [True, 20]]],\n  ['regression: scenario 2',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[460, 757, True, 619, True],\n     [462, 720, False, 618, True],\n     [502, 734, True, 534, True],\n     [488, 707, False, 516, True],\n     [450, 735, False, 496, True],\n     [472, 754, True, 606, True],\n     [477, 741, False, 575, True],\n     [452, 710, True, 531, True],\n     [431, 759, False, 576, True]]],\n   [[True, 40],\n    [True, 20],\n    [True, 40],\n    [True, 20],\n    [True, 20],\n    [True, 40],\n    [True, 20],\n    [True, 40],\n    [True, 20]]],\n  ['regression: scenario 3',\n   [{'high_limit': 700, 'diff': 40, 'min_pos': 30, 'mat_low': 530},\n    [[608, 734, True, 493, True],\n     [609, 741, True, 531, True],\n     [587, 758, True, 553, True],\n     [561, 759, False, 498, False],\n     [530, 741, False, 509, True],\n     [544, 760, True, 493, True],\n     [548, 751, True, 583, True],\n     [512, 705, False, 540, False],\n     [490, 711, True, 562, True]]],\n   [[True, 30],\n    [True, 50],\n    [True, 70],\n    [True, 0],\n    [True, 30],\n    [True, 30],\n    [True, 50],\n    [True, 0],\n    [True, 50]]]],\n [['regression: cold mixed air',\n   [{'high_limit': 700, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[450, 720, True, 600, True],\n     [450, 720, True, 600, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True]]],\n   [[True, 50], [True, 70], [True, 60], [True, 50], [True, 40], [True, 30]]],\n  ['regression: scenario 5',\n   [{'high_limit': 700, 'diff': 40, 'min_pos': 15, 'mat_low': 530},\n    [[504, 733, True, 584, False],\n     [484, 752, False, 481, True],\n     [504, 718, True, 551, True],\n     [492, 701, True, 483, True],\n     [465, 718, True, 546, True],\n     [495, 735, False, 516, True],\n     [510, 719, True, 599, True],\n     [515, 712, True, 501, True],\n     [523, 748, True, 540, False],\n     [497, 704, True, 609, True],\n     [534, 716, False, 536, True],\n     [558, 732, True, 617, True],\n     [554, 748, True, 531, True]]],\n   [[True, 0],\n    [True, 15],\n    [True, 35],\n    [True, 25],\n    [True, 45],\n    [True, 15],\n    [True, 35],\n    [True, 25],\n    [True, 0],\n    [True, 35],\n    [True, 15],\n    [True, 35],\n    [True, 55]]],\n  ['regression: economizer cycle',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[600, 740, True, 560, True],\n     [600, 740, True, 560, True],\n     [600, 740, True, 520, True],\n     [690, 740, True, 560, True],\n     [705, 740, True, 560, True],\n     [600, 740, False, 560, True],\n     [600, 740, True, 560, False]]],\n   [[True, 40], [True, 60], [True, 50], [True, 70], [False, 20], [True, 20], [True, 0]]],\n  ['control: enable band edges',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[681, 740, True, 560, True],\n     [680, 700, True, 560, True],\n     [680, 701, True, 560, True],\n     [700, 750, True, 560, True],\n     [710, 750, True, 560, True]]],\n   [[False, 20], [False, 20], [True, 40], [True, 60], [False, 20]]],\n  ['control: night cooling call',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[550, 740, True, 560, False], [550, 740, True, 560, True]]],\n   [[True, 0], [True, 40]]],\n  ['control: near return disable',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[700, 730, True, 560, True],\n     [715, 730, True, 560, True],\n     [725, 730, True, 560, True],\n     [730, 730, True, 560, True]]],\n   [[True, 35], [True, 55], [True, 75], [False, 15]]],\n  ['control: scenario 1',\n   [{'high_limit': 650, 'diff': 0, 'min_pos': 30, 'mat_low': 500},\n    [[754, 754, False, 483, False],\n     [716, 749, True, 499, True],\n     [699, 701, False, 573, True],\n     [694, 750, True, 534, False],\n     [704, 716, False, 517, True],\n     [708, 701, False, 567, True],\n     [743, 735, True, 609, True],\n     [775, 747, False, 554, True],\n     [743, 731, False, 583, False],\n     [764, 708, False, 507, True],\n     [795, 743, False, 528, True],\n     [770, 706, True, 501, True],\n     [764, 752, False, 578, True]]],\n   [[False, 0],\n    [False, 30],\n    [False, 30],\n    [False, 0],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 0],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30]]],\n  ['regression: scenario 2',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 30, 'mat_low': 500},\n    [[492, 750, False, 518, True],\n     [495, 710, True, 564, True],\n     [507, 701, True, 603, True],\n     [545, 705, False, 490, True],\n     [529, 724, True, 489, False],\n     [508, 721, True, 529, False],\n     [482, 717, True, 619, True],\n     [464, 753, False, 608, True],\n     [478, 719, False, 559, False],\n     [481, 730, False, 494, True],\n     [511, 719, False, 613, True],\n     [479, 743, False, 542, True],\n     [477, 728, True, 597, True],\n     [493, 756, False, 531, True]]],\n   [[True, 30],\n    [True, 50],\n    [True, 70],\n    [True, 30],\n    [True, 0],\n    [True, 0],\n    [True, 50],\n    [True, 30],\n    [True, 0],\n    [True, 30],\n    [True, 30],\n    [True, 30],\n    [True, 50],\n    [True, 30]]]],\n [['regression: scenario 2',\n   [{'high_limit': 650, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[599, 747, False, 570, True],\n     [625, 701, False, 603, True],\n     [623, 732, False, 565, False],\n     [624, 737, True, 482, True],\n     [637, 740, False, 485, True],\n     [676, 702, True, 590, True],\n     [678, 755, True, 522, True],\n     [670, 733, True, 571, True],\n     [684, 712, True, 616, False],\n     [687, 736, True, 607, False],\n     [712, 739, False, 524, True]]],\n   [[True, 30],\n    [True, 30],\n    [True, 0],\n    [True, 30],\n    [True, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 0],\n    [False, 0],\n    [False, 30]]],\n  ['regression: scenario 5',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 500},\n    [[461, 718, True, 532, True],\n     [443, 741, True, 488, True],\n     [450, 751, True, 605, True],\n     [448, 717, False, 535, True],\n     [417, 745, False, 488, False],\n     [418, 721, True, 581, True],\n     [400, 757, False, 544, False],\n     [435, 716, False, 598, False],\n     [436, 729, False, 485, True],\n     [440, 713, True, 511, True],\n     [402, 722, True, 517, True],\n     [427, 710, False, 571, True],\n     [402, 739, True, 565, True],\n     [400, 705, True, 571, True]]],\n   [[True, 40],\n    [True, 30],\n    [True, 50],\n    [True, 20],\n    [True, 0],\n    [True, 40],\n    [True, 0],\n    [True, 0],\n    [True, 20],\n    [True, 40],\n    [True, 60],\n    [True, 20],\n    [True, 40],\n    [True, 60]]],\n  ['regression: economizer cycle',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[600, 740, True, 560, True],\n     [600, 740, True, 560, True],\n     [600, 740, True, 520, True],\n     [690, 740, True, 560, True],\n     [705, 740, True, 560, True],\n     [600, 740, False, 560, True],\n     [600, 740, True, 560, False]]],\n   [[True, 40], [True, 60], [True, 50], [True, 70], [False, 20], [True, 20], [True, 0]]],\n  ['control: enable band edges',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[681, 740, True, 560, True],\n     [680, 700, True, 560, True],\n     [680, 701, True, 560, True],\n     [700, 750, True, 560, True],\n     [710, 750, True, 560, True]]],\n   [[False, 20], [False, 20], [True, 40], [True, 60], [False, 20]]],\n  ['regression: cold mixed air',\n   [{'high_limit': 700, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[450, 720, True, 600, True],\n     [450, 720, True, 600, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True]]],\n   [[True, 50], [True, 70], [True, 60], [True, 50], [True, 40], [True, 30]]],\n  ['control: night cooling call',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[550, 740, True, 560, False], [550, 740, True, 560, True]]],\n   [[True, 0], [True, 40]]],\n  ['control: near return disable',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[700, 730, True, 560, True],\n     [715, 730, True, 560, True],\n     [725, 730, True, 560, True],\n     [730, 730, True, 560, True]]],\n   [[True, 35], [True, 55], [True, 75], [False, 15]]],\n  ['control: scenario 1',\n   [{'high_limit': 650, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[678, 721, True, 495, True],\n     [646, 726, True, 616, True],\n     [669, 714, True, 600, True],\n     [630, 728, True, 542, True],\n     [626, 751, True, 530, False],\n     [638, 723, False, 607, True],\n     [654, 706, True, 557, True],\n     [625, 704, False, 618, True]]],\n   [[False, 20], [False, 20], [False, 20], [True, 40], [True, 0], [True, 20], [False, 20], [True, 20]]]],\n [['regression: scenario 3',\n   [{'high_limit': 700, 'diff': 40, 'min_pos': 15, 'mat_low': 500},\n    [[648, 702, True, 512, True],\n     [638, 725, True, 584, True],\n     [603, 726, True, 591, True],\n     [610, 705, True, 566, False],\n     [612, 706, False, 595, True],\n     [587, 717, True, 552, True],\n     [623, 754, True, 482, True],\n     [595, 710, True, 491, True],\n     [615, 710, False, 485, True]]],\n   [[True, 35],\n    [True, 55],\n    [True, 75],\n    [True, 0],\n    [True, 15],\n    [True, 35],\n    [True, 25],\n    [True, 15],\n    [True, 15]]],\n  ['regression: scenario 10',\n   [{'high_limit': 700, 'diff': 40, 'min_pos': 20, 'mat_low': 500},\n    [[520, 710, False, 509, False],\n     [491, 725, True, 541, True],\n     [521, 752, True, 598, True],\n     [550, 728, False, 517, True],\n     [558, 714, True, 566, True],\n     [591, 703, True, 597, True],\n     [618, 705, True, 567, True],\n     [620, 729, True, 571, True]]],\n   [[True, 0], [True, 40], [True, 60], [True, 20], [True, 40], [True, 60], [True, 80], [True, 100]]],\n  ['regression: economizer cycle',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[600, 740, True, 560, True],\n     [600, 740, True, 560, True],\n     [600, 740, True, 520, True],\n     [690, 740, True, 560, True],\n     [705, 740, True, 560, True],\n     [600, 740, False, 560, True],\n     [600, 740, True, 560, False]]],\n   [[True, 40], [True, 60], [True, 50], [True, 70], [False, 20], [True, 20], [True, 0]]],\n  ['control: enable band edges',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[681, 740, True, 560, True],\n     [680, 700, True, 560, True],\n     [680, 701, True, 560, True],\n     [700, 750, True, 560, True],\n     [710, 750, True, 560, True]]],\n   [[False, 20], [False, 20], [True, 40], [True, 60], [False, 20]]],\n  ['regression: cold mixed air',\n   [{'high_limit': 700, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[450, 720, True, 600, True],\n     [450, 720, True, 600, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True]]],\n   [[True, 50], [True, 70], [True, 60], [True, 50], [True, 40], [True, 30]]],\n  ['control: night cooling call',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[550, 740, True, 560, False], [550, 740, True, 560, True]]],\n   [[True, 0], [True, 40]]],\n  ['control: near return disable',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[700, 730, True, 560, True],\n     [715, 730, True, 560, True],\n     [725, 730, True, 560, True],\n     [730, 730, True, 560, True]]],\n   [[True, 35], [True, 55], [True, 75], [False, 15]]],\n  ['regression: scenario 1',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 30, 'mat_low': 500},\n    [[505, 738, False, 612, True],\n     [535, 706, True, 498, True],\n     [549, 734, False, 604, True],\n     [558, 729, True, 521, True],\n     [540, 724, True, 571, True],\n     [530, 749, True, 592, True],\n     [507, 715, True, 533, False],\n     [468, 703, False, 516, True],\n     [457, 715, False, 563, True],\n     [444, 708, False, 513, True]]],\n   [[True, 30],\n    [True, 30],\n    [True, 30],\n    [True, 50],\n    [True, 70],\n    [True, 90],\n    [True, 0],\n    [True, 30],\n    [True, 30],\n    [True, 30]]]],\n [['regression: scenario 6',\n   [{'high_limit': 650, 'diff': 40, 'min_pos': 30, 'mat_low': 530},\n    [[450, 740, True, 605, True],\n     [424, 725, True, 523, False],\n     [400, 741, True, 543, True],\n     [409, 711, True, 502, True],\n     [439, 732, False, 568, True],\n     [438, 760, True, 580, False],\n     [467, 735, True, 574, False],\n     [492, 716, False, 501, False],\n     [529, 729, True, 518, True]]],\n   [[True, 50], [True, 0], [True, 50], [True, 40], [True, 30], [True, 0], [True, 0], [True, 0], [True, 30]]],\n  ['regression: scenario 17',\n   [{'high_limit': 650, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[434, 753, False, 609, True],\n     [452, 724, True, 552, False],\n     [436, 712, False, 524, True],\n     [474, 746, True, 615, True],\n     [451, 733, True, 562, True],\n     [481, 717, False, 524, True],\n     [491, 741, True, 555, True],\n     [455, 719, True, 526, True],\n     [439, 710, True, 496, True],\n     [464, 724, False, 599, True],\n     [450, 703, True, 557, True],\n     [486, 758, True, 584, True],\n     [461, 733, True, 595, False],\n     [466, 711, True, 561, True]]],\n   [[True, 15],\n    [True, 0],\n    [True, 15],\n    [True, 35],\n    [True, 55],\n    [True, 15],\n    [True, 35],\n    [True, 55],\n    [True, 45],\n    [True, 15],\n    [True, 35],\n    [True, 55],\n    [True, 0],\n    [True, 35]]],\n  ['regression: economizer cycle',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[600, 740, True, 560, True],\n     [600, 740, True, 560, True],\n     [600, 740, True, 520, True],\n     [690, 740, True, 560, True],\n     [705, 740, True, 560, True],\n     [600, 740, False, 560, True],\n     [600, 740, True, 560, False]]],\n   [[True, 40], [True, 60], [True, 50], [True, 70], [False, 20], [True, 20], [True, 0]]],\n  ['control: enable band edges',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[681, 740, True, 560, True],\n     [680, 700, True, 560, True],\n     [680, 701, True, 560, True],\n     [700, 750, True, 560, True],\n     [710, 750, True, 560, True]]],\n   [[False, 20], [False, 20], [True, 40], [True, 60], [False, 20]]],\n  ['regression: cold mixed air',\n   [{'high_limit': 700, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[450, 720, True, 600, True],\n     [450, 720, True, 600, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True]]],\n   [[True, 50], [True, 70], [True, 60], [True, 50], [True, 40], [True, 30]]],\n  ['control: night cooling call',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[550, 740, True, 560, False], [550, 740, True, 560, True]]],\n   [[True, 0], [True, 40]]],\n  ['control: near return disable',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[700, 730, True, 560, True],\n     [715, 730, True, 560, True],\n     [725, 730, True, 560, True],\n     [730, 730, True, 560, True]]],\n   [[True, 35], [True, 55], [True, 75], [False, 15]]],\n  ['control: scenario 1',\n   [{'high_limit': 750, 'diff': 0, 'min_pos': 20, 'mat_low': 500},\n    [[684, 714, False, 579, True],\n     [715, 719, False, 481, True],\n     [737, 759, True, 615, False],\n     [715, 756, True, 609, False],\n     [743, 742, True, 491, True],\n     [776, 713, False, 491, True],\n     [798, 748, False, 566, True],\n     [800, 751, True, 547, True],\n     [800, 736, True, 486, True],\n     [760, 727, False, 570, True]]],\n   [[True, 20],\n    [True, 20],\n    [True, 0],\n    [True, 0],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20]]]]]\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-dry-bulb-economizer-low-limit-sensor","generated_at":"2026-09-29T14:51:46.579427+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 low-limit test compares outdoor air to the mixed-air limit.","sha256":"c925cd8f3c04d73bc5bc839b7ed8611a4f8839f2d750a6ae3f82d3cb7b3fcc0c","title":"Mixed-air low limit reads the outdoor air sensor · 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":41.984,"exit_code":1,"observations":[{"actual":[[true,40],[true,60],[true,50],[true,70],[false,20],[true,20],[true,0]],"check":"regression: economizer cycle","expected":[[true,40],[true,60],[true,50],[true,70],[false,20],[true,20],[true,0]],"passed":true},{"actual":[[true,30],[true,30],[true,30],[true,30],[true,30],[true,30]],"check":"regression: cold mixed air","expected":[[true,50],[true,70],[true,60],[true,50],[true,40],[true,30]],"passed":false},{"actual":[[false,20],[false,20],[true,40],[true,60],[false,20]],"check":"control: enable band edges","expected":[[false,20],[false,20],[true,40],[true,60],[false,20]],"passed":true},{"actual":[[true,0],[true,40]],"check":"control: night cooling call","expected":[[true,0],[true,40]],"passed":true},{"actual":[[true,35],[true,55],[true,75],[false,15]],"check":"control: near return disable","expected":[[true,35],[true,55],[true,75],[false,15]],"passed":true},{"actual":[[true,40],[true,30],[true,50],[true,0],[true,40],[true,60],[true,20],[true,20]],"check":"regression: scenario 1","expected":[[true,40],[true,30],[true,50],[true,0],[true,40],[true,60],[true,20],[true,20]],"passed":true},{"actual":[[true,20],[true,20],[true,20],[true,20],[true,20],[true,20],[true,20],[true,20],[true,20]],"check":"regression: scenario 2","expected":[[true,40],[true,20],[true,40],[true,20],[true,20],[true,40],[true,20],[true,40],[true,20]],"passed":false},{"actual":[[true,30],[true,50],[true,70],[true,0],[true,30],[true,30],[true,50],[true,0],[true,30]],"check":"regression: scenario 3","expected":[[true,30],[true,50],[true,70],[true,0],[true,30],[true,30],[true,50],[true,0],[true,50]],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: economizer cycle\", \"actual\": [[true, 40], [true, 60], [true, 50], [true, 70], [false, 20], [true, 20], [true, 0]], \"expected\": [[true, 40], [true, 60], [true, 50], [true, 70], [false, 20], [true, 20], [true, 0]], \"passed\": true}, {\"check\": \"regression: cold mixed air\", \"actual\": [[true, 30], [true, 30], [true, 30], [true, 30], [true, 30], [true, 30]], \"expected\": [[true, 50], [true, 70], [true, 60], [true, 50], [true, 40], [true, 30]], \"passed\": false}, {\"check\": \"control: enable band edges\", \"actual\": [[false, 20], [false, 20], [true, 40], [true, 60], [false, 20]], \"expected\": [[false, 20], [false, 20], [true, 40], [true, 60], [false, 20]], \"passed\": true}, {\"check\": \"control: night cooling call\", \"actual\": [[true, 0], [true, 40]], \"expected\": [[true, 0], [true, 40]], \"passed\": true}, {\"check\": \"control: near return disable\", \"actual\": [[true, 35], [true, 55], [true, 75], [false, 15]], \"expected\": [[true, 35], [true, 55], [true, 75], [false, 15]], \"passed\": true}, {\"check\": \"regression: scenario 1\", \"actual\": [[true, 40], [true, 30], [true, 50], [true, 0], [true, 40], [true, 60], [true, 20], [true, 20]], \"expected\": [[true, 40], [true, 30], [true, 50], [true, 0], [true, 40], [true, 60], [true, 20], [true, 20]], \"passed\": true}, {\"check\": \"regression: scenario 2\", \"actual\": [[true, 20], [true, 20], [true, 20], [true, 20], [true, 20], [true, 20], [true, 20], [true, 20], [true, 20]], \"expected\": [[true, 40], [true, 20], [true, 40], [true, 20], [true, 20], [true, 40], [true, 20], [true, 40], [true, 20]], \"passed\": false}, {\"check\": \"regression: scenario 3\", \"actual\": [[true, 30], [true, 50], [true, 70], [true, 0], [true, 30], [true, 30], [true, 50], [true, 0], [true, 30]], \"expected\": [[true, 30], [true, 50], [true, 70], [true, 0], [true, 30], [true, 30], [true, 50], [true, 0], [true, 50]], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":44.371,"exit_code":1,"observations":[{"actual":[[true,40],[true,60],[true,80],[true,100],[false,20],[true,20],[true,0]],"check":"regression: economizer cycle","expected":[[true,40],[true,60],[true,50],[true,70],[false,20],[true,20],[true,0]],"passed":false},{"actual":[[true,30],[true,30],[true,30],[true,30],[true,30],[true,30]],"check":"regression: cold mixed air","expected":[[true,50],[true,70],[true,60],[true,50],[true,40],[true,30]],"passed":false},{"actual":[[false,20],[false,20],[true,40],[true,60],[false,20]],"check":"control: enable band edges","expected":[[false,20],[false,20],[true,40],[true,60],[false,20]],"passed":true},{"actual":[[true,0],[true,40]],"check":"control: night cooling call","expected":[[true,0],[true,40]],"passed":true},{"actual":[[true,35],[true,55],[true,75],[false,15]],"check":"control: near return disable","expected":[[true,35],[true,55],[true,75],[false,15]],"passed":true},{"actual":[[true,40],[true,60],[true,80],[true,0],[true,40],[true,60],[true,20],[true,20]],"check":"regression: scenario 1","expected":[[true,40],[true,30],[true,50],[true,0],[true,40],[true,60],[true,20],[true,20]],"passed":false},{"actual":[[true,20],[true,20],[true,20],[true,20],[true,20],[true,20],[true,20],[true,20],[true,20]],"check":"regression: scenario 2","expected":[[true,40],[true,20],[true,40],[true,20],[true,20],[true,40],[true,20],[true,40],[true,20]],"passed":false},{"actual":[[true,50],[true,70],[true,90],[true,0],[true,30],[true,50],[true,70],[true,0],[true,30]],"check":"regression: scenario 3","expected":[[true,30],[true,50],[true,70],[true,0],[true,30],[true,30],[true,50],[true,0],[true,50]],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: economizer cycle\", \"actual\": [[true, 40], [true, 60], [true, 80], [true, 100], [false, 20], [true, 20], [true, 0]], \"expected\": [[true, 40], [true, 60], [true, 50], [true, 70], [false, 20], [true, 20], [true, 0]], \"passed\": false}, {\"check\": \"regression: cold mixed air\", \"actual\": [[true, 30], [true, 30], [true, 30], [true, 30], [true, 30], [true, 30]], \"expected\": [[true, 50], [true, 70], [true, 60], [true, 50], [true, 40], [true, 30]], \"passed\": false}, {\"check\": \"control: enable band edges\", \"actual\": [[false, 20], [false, 20], [true, 40], [true, 60], [false, 20]], \"expected\": [[false, 20], [false, 20], [true, 40], [true, 60], [false, 20]], \"passed\": true}, {\"check\": \"control: night cooling call\", \"actual\": [[true, 0], [true, 40]], \"expected\": [[true, 0], [true, 40]], \"passed\": true}, {\"check\": \"control: near return disable\", \"actual\": [[true, 35], [true, 55], [true, 75], [false, 15]], \"expected\": [[true, 35], [true, 55], [true, 75], [false, 15]], \"passed\": true}, {\"check\": \"regression: scenario 1\", \"actual\": [[true, 40], [true, 60], [true, 80], [true, 0], [true, 40], [true, 60], [true, 20], [true, 20]], \"expected\": [[true, 40], [true, 30], [true, 50], [true, 0], [true, 40], [true, 60], [true, 20], [true, 20]], \"passed\": false}, {\"check\": \"regression: scenario 2\", \"actual\": [[true, 20], [true, 20], [true, 20], [true, 20], [true, 20], [true, 20], [true, 20], [true, 20], [true, 20]], \"expected\": [[true, 40], [true, 20], [true, 40], [true, 20], [true, 20], [true, 40], [true, 20], [true, 40], [true, 20]], \"passed\": false}, {\"check\": \"regression: scenario 3\", \"actual\": [[true, 50], [true, 70], [true, 90], [true, 0], [true, 30], [true, 50], [true, 70], [true, 0], [true, 30]], \"expected\": [[true, 30], [true, 50], [true, 70], [true, 0], [true, 30], [true, 30], [true, 50], [true, 0], [true, 50]], \"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."}}