{"abstract":"A humidifier call appears in summer when indoor air is dry after heavy air conditioning.","category":"HVAC thermostat control","checks":8,"contract":"Thermostat humidity functions per sample; samples are [temp tenths F, indoor RH %, outdoor whole F]. Dehumidify-by-overcooling turns on when RH > rh_sp + 5 and off when RH <= rh_sp; while on, the effective cooling setpoint is lowered by min(max_overcool, (RH - rh_sp) * 5) tenths. Cooling starts above effective + 1.0 F and ends at <= effective. Humidifier: allowed RH = 40 + floor((outdoor - 20) / 10) * 5 clamped to 15..45; target = min(hum_sp, allowed); it is off when outdoor >= 50, otherwise starts below target - 3 and stops at >= target. Return [cooling, effective_sp, humidifier].","contract_signature":"settings, samples","evaluation_group":"w2-hvac-thermostat-control-humidity-overcool-frost","failed_approach":"Turning off only a running humidifier still lets it start for a sample in warm weather.","family":"w2-hvac-thermostat-control-humidity-overcool-frost-humidifier-season","id":"FA-92621","implementations":{"attempt":{"sha256":"927eb383c9f93d8f48ee1283a0d320852fa4bda14105ae6cf06a33b70bab679e","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(settings, samples):\n    dehum = False\n    cooling = False\n    humid = False\n    out = []\n    for temp, rh, outdoor in samples:\n        if dehum and rh <= settings['rh_sp']:\n            dehum = False\n        elif not dehum and rh > settings['rh_sp'] + 5:\n            dehum = True\n        eff = settings['cool_sp']\n        if dehum:\n            eff -= min(settings['max_overcool'], (rh - settings['rh_sp']) * 5)\n        if cooling and temp <= eff:\n            cooling = False\n        elif not cooling and temp > eff + 10:\n            cooling = True\n        allowed = max(15, min(45, 40 + (outdoor - 20) // 10 * 5))\n        target = min(settings['hum_sp'], allowed)\n        if outdoor >= 50 and humid:\n            humid = False\n        elif humid and rh >= target:\n            humid = False\n        elif not humid and rh < target - 3:\n            humid = True\n        out.append([cooling, eff, humid])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: frost limit steps',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},\n    [[700, 30, 25], [700, 33, 29], [700, 36, 30], [700, 36, -5], [700, 10, -40], [700, 30, 55]]],\n   [[False, 750, True],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, False]]],\n  ['regression: cold snap',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},\n    [[700, 12, -60], [700, 14, -60], [700, 16, -60], [700, 20, 50], [700, 20, 49]]],\n   [[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]]],\n  ['control: summer then winter',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},\n    [[765, 52, 80],\n     [762, 58, 80],\n     [745, 58, 80],\n     [738, 50, 80],\n     [700, 25, 10],\n     [700, 29, 10],\n     [700, 36, 10],\n     [700, 10, -15]]],\n   [[True, 750, False],\n    [True, 720, False],\n    [True, 720, False],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, True]]],\n  ['control: dehumidify band',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},\n    [[760, 56, 80],\n     [752, 53, 80],\n     [745, 52, 80],\n     [741, 51, 80],\n     [741, 50, 80],\n     [752, 52, 80],\n     [749, 52, 80]]],\n   [[True, 720, False],\n    [True, 735, False],\n    [True, 740, False],\n    [False, 745, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False]]],\n  ['control: mild dry day',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},\n    [[700, 40, 45], [700, 43, 45], [700, 46, 45], [700, 48, 45]]],\n   [[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]]],\n  ['control: scenario 1',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},\n    [[738, 41, 24],\n     [734, 38, 21],\n     [725, 33, 9],\n     [726, 34, -2],\n     [733, 39, 7],\n     [743, 36, 7],\n     [740, 38, 7],\n     [752, 32, 19],\n     [742, 34, 11],\n     [732, 32, 9]]],\n   [[False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False]]],\n  ['control: scenario 2',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},\n    [[762, 20, -5],\n     [767, 18, -6],\n     [764, 13, -16],\n     [765, 11, -12],\n     [758, 10, -15],\n     [757, 16, -3],\n     [761, 16, 7],\n     [758, 10, 13],\n     [765, 10, 16],\n     [763, 13, 12],\n     [775, 16, 9],\n     [765, 18, 4],\n     [755, 20, 3],\n     [754, 25, -3]]],\n   [[True, 750, True],\n    [True, 750, True],\n    [True, 750, True],\n    [True, 750, True],\n    [True, 750, True],\n    [True, 750, True],\n    [True, 750, True],\n    [True, 750, True],\n    [True, 750, True],\n    [True, 750, True],\n    [True, 750, True],\n    [True, 750, True],\n    [True, 750, True],\n    [True, 750, False]]],\n  ['regression: scenario 3',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 45},\n    [[741, 31, 49],\n     [750, 36, 55],\n     [739, 36, 59],\n     [734, 34, 55],\n     [728, 33, 56],\n     [717, 35, 48],\n     [715, 34, 60],\n     [726, 38, 57],\n     [726, 39, 57],\n     [719, 34, 54],\n     [726, 39, 57],\n     [729, 41, 61],\n     [732, 39, 66],\n     [743, 40, 75]]],\n   [[False, 750, True],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False]]]],\n [['regression: cold snap',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},\n    [[700, 12, -60], [700, 14, -60], [700, 16, -60], [700, 20, 50], [700, 20, 49]]],\n   [[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]]],\n  ['regression: scenario 14',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 40},\n    [[755, 47, 53],\n     [757, 46, 56],\n     [745, 42, 65],\n     [736, 39, 62],\n     [733, 34, 69],\n     [729, 29, 61],\n     [724, 29, 49],\n     [729, 32, 59],\n     [736, 30, 71],\n     [729, 36, 70],\n     [732, 31, 59],\n     [721, 35, 68],\n     [715, 32, 61],\n     [715, 36, 65]]],\n   [[False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False]]],\n  ['control: summer then winter',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},\n    [[765, 52, 80],\n     [762, 58, 80],\n     [745, 58, 80],\n     [738, 50, 80],\n     [700, 25, 10],\n     [700, 29, 10],\n     [700, 36, 10],\n     [700, 10, -15]]],\n   [[True, 750, False],\n    [True, 720, False],\n    [True, 720, False],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, True]]],\n  ['control: dehumidify band',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},\n    [[760, 56, 80],\n     [752, 53, 80],\n     [745, 52, 80],\n     [741, 51, 80],\n     [741, 50, 80],\n     [752, 52, 80],\n     [749, 52, 80]]],\n   [[True, 720, False],\n    [True, 735, False],\n    [True, 740, False],\n    [False, 745, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False]]],\n  ['regression: frost limit steps',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},\n    [[700, 30, 25], [700, 33, 29], [700, 36, 30], [700, 36, -5], [700, 10, -40], [700, 30, 55]]],\n   [[False, 750, True],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, False]]],\n  ['control: mild dry day',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},\n    [[700, 40, 45], [700, 43, 45], [700, 46, 45], [700, 48, 45]]],\n   [[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]]],\n  ['control: scenario 1',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},\n    [[741, 58, -1],\n     [736, 54, -9],\n     [726, 56, 2],\n     [715, 54, 0],\n     [721, 55, 1],\n     [732, 51, -1],\n     [731, 51, -7],\n     [727, 55, -12],\n     [721, 57, -12]]],\n   [[True, 720, False],\n    [True, 730, False],\n    [True, 720, False],\n    [False, 730, False],\n    [False, 725, False],\n    [False, 745, False],\n    [False, 745, False],\n    [False, 725, False],\n    [False, 720, False]]],\n  ['regression: scenario 2',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 40},\n    [[749, 37, 58],\n     [756, 33, 55],\n     [768, 38, 65],\n     [771, 41, 72],\n     [780, 47, 71],\n     [774, 50, 64],\n     [770, 54, 73],\n     [777, 59, 73],\n     [786, 63, 85],\n     [788, 59, 90],\n     [790, 61, 90],\n     [782, 58, 85],\n     [790, 53, 80],\n     [790, 48, 82]]],\n   [[False, 750, False],\n    [False, 750, False],\n    [True, 750, False],\n    [True, 750, False],\n    [True, 750, False],\n    [True, 750, False],\n    [True, 750, False],\n    [True, 730, False],\n    [True, 730, False],\n    [True, 730, False],\n    [True, 730, False],\n    [True, 730, False],\n    [True, 735, False],\n    [True, 750, False]]]],\n [['regression: scenario 1',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 35},\n    [[760, 30, 52],\n     [750, 32, 60],\n     [748, 28, 48],\n     [744, 33, 44],\n     [754, 37, 54],\n     [748, 40, 55],\n     [758, 39, 61],\n     [760, 42, 61],\n     [754, 36, 49],\n     [742, 30, 44],\n     [731, 32, 54],\n     [739, 36, 48],\n     [733, 36, 54]]],\n   [[False, 750, False],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False]]],\n  ['regression: scenario 13',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 45},\n    [[744, 24, 58],\n     [755, 21, 59],\n     [744, 27, 47],\n     [738, 30, 55],\n     [732, 25, 67],\n     [742, 25, 55],\n     [736, 25, 52],\n     [725, 28, 62],\n     [722, 29, 66],\n     [734, 32, 57],\n     [737, 27, 45],\n     [738, 21, 55],\n     [730, 17, 59],\n     [741, 20, 52]]],\n   [[False, 750, False],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False]]],\n  ['control: summer then winter',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},\n    [[765, 52, 80],\n     [762, 58, 80],\n     [745, 58, 80],\n     [738, 50, 80],\n     [700, 25, 10],\n     [700, 29, 10],\n     [700, 36, 10],\n     [700, 10, -15]]],\n   [[True, 750, False],\n    [True, 720, False],\n    [True, 720, False],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, True]]],\n  ['control: dehumidify band',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},\n    [[760, 56, 80],\n     [752, 53, 80],\n     [745, 52, 80],\n     [741, 51, 80],\n     [741, 50, 80],\n     [752, 52, 80],\n     [749, 52, 80]]],\n   [[True, 720, False],\n    [True, 735, False],\n    [True, 740, False],\n    [False, 745, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False]]],\n  ['regression: frost limit steps',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},\n    [[700, 30, 25], [700, 33, 29], [700, 36, 30], [700, 36, -5], [700, 10, -40], [700, 30, 55]]],\n   [[False, 750, True],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, False]]],\n  ['control: mild dry day',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},\n    [[700, 40, 45], [700, 43, 45], [700, 46, 45], [700, 48, 45]]],\n   [[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]]],\n  ['regression: cold snap',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},\n    [[700, 12, -60], [700, 14, -60], [700, 16, -60], [700, 20, 50], [700, 20, 49]]],\n   [[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]]],\n  ['control: scenario 2',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 45},\n    [[746, 32, -7],\n     [745, 28, -12],\n     [741, 24, -18],\n     [736, 26, -12],\n     [729, 31, 0],\n     [720, 32, 7],\n     [730, 30, 14],\n     [728, 28, 19],\n     [725, 23, 17],\n     [729, 20, 18],\n     [717, 24, 19],\n     [715, 19, 10],\n     [723, 14, 20],\n     [722, 10, 23]]],\n   [[False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, True]]]],\n [['regression: scenario 19',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},\n    [[747, 29, 61],\n     [735, 30, 51],\n     [725, 33, 44],\n     [718, 39, 33],\n     [727, 44, 29],\n     [737, 38, 29],\n     [729, 43, 39],\n     [738, 49, 37]]],\n   [[False, 750, False],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False]]],\n  ['regression: scenario 24',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 40},\n    [[757, 26, 51],\n     [747, 24, 47],\n     [737, 30, 53],\n     [726, 27, 41],\n     [719, 23, 50],\n     [715, 21, 46],\n     [717, 18, 36],\n     [715, 16, 36],\n     [715, 15, 25],\n     [715, 18, 24],\n     [720, 14, 18],\n     [715, 14, 18]]],\n   [[False, 750, False],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, True]]],\n  ['control: summer then winter',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},\n    [[765, 52, 80],\n     [762, 58, 80],\n     [745, 58, 80],\n     [738, 50, 80],\n     [700, 25, 10],\n     [700, 29, 10],\n     [700, 36, 10],\n     [700, 10, -15]]],\n   [[True, 750, False],\n    [True, 720, False],\n    [True, 720, False],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, True]]],\n  ['control: dehumidify band',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},\n    [[760, 56, 80],\n     [752, 53, 80],\n     [745, 52, 80],\n     [741, 51, 80],\n     [741, 50, 80],\n     [752, 52, 80],\n     [749, 52, 80]]],\n   [[True, 720, False],\n    [True, 735, False],\n    [True, 740, False],\n    [False, 745, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False]]],\n  ['regression: frost limit steps',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},\n    [[700, 30, 25], [700, 33, 29], [700, 36, 30], [700, 36, -5], [700, 10, -40], [700, 30, 55]]],\n   [[False, 750, True],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, False]]],\n  ['control: mild dry day',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},\n    [[700, 40, 45], [700, 43, 45], [700, 46, 45], [700, 48, 45]]],\n   [[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]]],\n  ['regression: cold snap',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},\n    [[700, 12, -60], [700, 14, -60], [700, 16, -60], [700, 20, 50], [700, 20, 49]]],\n   [[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]]],\n  ['control: scenario 1',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},\n    [[741, 41, 9],\n     [745, 42, 4],\n     [749, 41, 7],\n     [737, 37, 8],\n     [740, 34, 14],\n     [733, 38, 20],\n     [730, 44, 9],\n     [724, 38, 16],\n     [725, 32, 6],\n     [721, 27, -4]]],\n   [[False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False]]]],\n [['regression: scenario 18',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 50},\n    [[741, 28, 78],\n     [744, 29, 75],\n     [746, 23, 67],\n     [740, 21, 68],\n     [748, 15, 58],\n     [750, 13, 59],\n     [757, 16, 52],\n     [749, 12, 61],\n     [737, 16, 54],\n     [733, 10, 42]]],\n   [[False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, True]]],\n  ['regression: scenario 45',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},\n    [[758, 56, 75],\n     [748, 51, 86],\n     [749, 50, 74],\n     [742, 45, 78],\n     [745, 39, 80],\n     [757, 33, 86],\n     [755, 33, 89],\n     [761, 30, 84],\n     [754, 24, 90],\n     [745, 30, 81],\n     [745, 36, 73],\n     [734, 39, 69],\n     [741, 35, 70],\n     [751, 36, 67]]],\n   [[True, 720, False],\n    [True, 745, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [True, 750, False],\n    [True, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False]]],\n  ['control: summer then winter',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},\n    [[765, 52, 80],\n     [762, 58, 80],\n     [745, 58, 80],\n     [738, 50, 80],\n     [700, 25, 10],\n     [700, 29, 10],\n     [700, 36, 10],\n     [700, 10, -15]]],\n   [[True, 750, False],\n    [True, 720, False],\n    [True, 720, False],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, True]]],\n  ['control: dehumidify band',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},\n    [[760, 56, 80],\n     [752, 53, 80],\n     [745, 52, 80],\n     [741, 51, 80],\n     [741, 50, 80],\n     [752, 52, 80],\n     [749, 52, 80]]],\n   [[True, 720, False],\n    [True, 735, False],\n    [True, 740, False],\n    [False, 745, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False]]],\n  ['regression: frost limit steps',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},\n    [[700, 30, 25], [700, 33, 29], [700, 36, 30], [700, 36, -5], [700, 10, -40], [700, 30, 55]]],\n   [[False, 750, True],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, False]]],\n  ['control: mild dry day',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},\n    [[700, 40, 45], [700, 43, 45], [700, 46, 45], [700, 48, 45]]],\n   [[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]]],\n  ['regression: cold snap',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},\n    [[700, 12, -60], [700, 14, -60], [700, 16, -60], [700, 20, 50], [700, 20, 49]]],\n   [[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]]],\n  ['control: scenario 1',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 35},\n    [[755, 53, 26],\n     [756, 54, 25],\n     [766, 54, 30],\n     [774, 48, 25],\n     [783, 43, 35],\n     [778, 37, 35],\n     [777, 33, 39],\n     [784, 35, 49],\n     [779, 31, 39],\n     [788, 27, 45],\n     [778, 31, 42],\n     [779, 31, 44],\n     [789, 36, 51]]],\n   [[False, 750, False],\n    [False, 750, False],\n    [True, 750, False],\n    [True, 750, False],\n    [True, 750, False],\n    [True, 750, False],\n    [True, 750, False],\n    [True, 750, False],\n    [True, 750, True],\n    [True, 750, True],\n    [True, 750, True],\n    [True, 750, True],\n    [True, 750, 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":"1e6a02ee731568dc49cc8940fed5643ceebac7ba82bcb26af48c4fc2b5c68899","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(settings, samples):\n    dehum = False\n    cooling = False\n    humid = False\n    out = []\n    for temp, rh, outdoor in samples:\n        if dehum and rh <= settings['rh_sp']:\n            dehum = False\n        elif not dehum and rh > settings['rh_sp'] + 5:\n            dehum = True\n        eff = settings['cool_sp']\n        if dehum:\n            eff -= min(settings['max_overcool'], (rh - settings['rh_sp']) * 5)\n        if cooling and temp <= eff:\n            cooling = False\n        elif not cooling and temp > eff + 10:\n            cooling = True\n        allowed = max(15, min(45, 40 + (outdoor - 20) // 10 * 5))\n        target = min(settings['hum_sp'], allowed)\n        if humid and rh >= target:\n            humid = False\n        elif not humid and rh < target - 3:\n            humid = True\n        out.append([cooling, eff, humid])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: frost limit steps',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},\n    [[700, 30, 25], [700, 33, 29], [700, 36, 30], [700, 36, -5], [700, 10, -40], [700, 30, 55]]],\n   [[False, 750, True],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, False]]],\n  ['regression: cold snap',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},\n    [[700, 12, -60], [700, 14, -60], [700, 16, -60], [700, 20, 50], [700, 20, 49]]],\n   [[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]]],\n  ['control: summer then winter',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},\n    [[765, 52, 80],\n     [762, 58, 80],\n     [745, 58, 80],\n     [738, 50, 80],\n     [700, 25, 10],\n     [700, 29, 10],\n     [700, 36, 10],\n     [700, 10, -15]]],\n   [[True, 750, False],\n    [True, 720, False],\n    [True, 720, False],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, True]]],\n  ['control: dehumidify band',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},\n    [[760, 56, 80],\n     [752, 53, 80],\n     [745, 52, 80],\n     [741, 51, 80],\n     [741, 50, 80],\n     [752, 52, 80],\n     [749, 52, 80]]],\n   [[True, 720, False],\n    [True, 735, False],\n    [True, 740, False],\n    [False, 745, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False]]],\n  ['control: mild dry day',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},\n    [[700, 40, 45], [700, 43, 45], [700, 46, 45], [700, 48, 45]]],\n   [[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]]],\n  ['control: scenario 1',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},\n    [[738, 41, 24],\n     [734, 38, 21],\n     [725, 33, 9],\n     [726, 34, -2],\n     [733, 39, 7],\n     [743, 36, 7],\n     [740, 38, 7],\n     [752, 32, 19],\n     [742, 34, 11],\n     [732, 32, 9]]],\n   [[False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False]]],\n  ['control: scenario 2',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},\n    [[762, 20, -5],\n     [767, 18, -6],\n     [764, 13, -16],\n     [765, 11, -12],\n     [758, 10, -15],\n     [757, 16, -3],\n     [761, 16, 7],\n     [758, 10, 13],\n     [765, 10, 16],\n     [763, 13, 12],\n     [775, 16, 9],\n     [765, 18, 4],\n     [755, 20, 3],\n     [754, 25, -3]]],\n   [[True, 750, True],\n    [True, 750, True],\n    [True, 750, True],\n    [True, 750, True],\n    [True, 750, True],\n    [True, 750, True],\n    [True, 750, True],\n    [True, 750, True],\n    [True, 750, True],\n    [True, 750, True],\n    [True, 750, True],\n    [True, 750, True],\n    [True, 750, True],\n    [True, 750, False]]],\n  ['regression: scenario 3',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 45},\n    [[741, 31, 49],\n     [750, 36, 55],\n     [739, 36, 59],\n     [734, 34, 55],\n     [728, 33, 56],\n     [717, 35, 48],\n     [715, 34, 60],\n     [726, 38, 57],\n     [726, 39, 57],\n     [719, 34, 54],\n     [726, 39, 57],\n     [729, 41, 61],\n     [732, 39, 66],\n     [743, 40, 75]]],\n   [[False, 750, True],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False]]]],\n [['regression: cold snap',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},\n    [[700, 12, -60], [700, 14, -60], [700, 16, -60], [700, 20, 50], [700, 20, 49]]],\n   [[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]]],\n  ['regression: scenario 14',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 40},\n    [[755, 47, 53],\n     [757, 46, 56],\n     [745, 42, 65],\n     [736, 39, 62],\n     [733, 34, 69],\n     [729, 29, 61],\n     [724, 29, 49],\n     [729, 32, 59],\n     [736, 30, 71],\n     [729, 36, 70],\n     [732, 31, 59],\n     [721, 35, 68],\n     [715, 32, 61],\n     [715, 36, 65]]],\n   [[False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False]]],\n  ['control: summer then winter',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},\n    [[765, 52, 80],\n     [762, 58, 80],\n     [745, 58, 80],\n     [738, 50, 80],\n     [700, 25, 10],\n     [700, 29, 10],\n     [700, 36, 10],\n     [700, 10, -15]]],\n   [[True, 750, False],\n    [True, 720, False],\n    [True, 720, False],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, True]]],\n  ['control: dehumidify band',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},\n    [[760, 56, 80],\n     [752, 53, 80],\n     [745, 52, 80],\n     [741, 51, 80],\n     [741, 50, 80],\n     [752, 52, 80],\n     [749, 52, 80]]],\n   [[True, 720, False],\n    [True, 735, False],\n    [True, 740, False],\n    [False, 745, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False]]],\n  ['regression: frost limit steps',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},\n    [[700, 30, 25], [700, 33, 29], [700, 36, 30], [700, 36, -5], [700, 10, -40], [700, 30, 55]]],\n   [[False, 750, True],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, False]]],\n  ['control: mild dry day',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},\n    [[700, 40, 45], [700, 43, 45], [700, 46, 45], [700, 48, 45]]],\n   [[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]]],\n  ['control: scenario 1',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},\n    [[741, 58, -1],\n     [736, 54, -9],\n     [726, 56, 2],\n     [715, 54, 0],\n     [721, 55, 1],\n     [732, 51, -1],\n     [731, 51, -7],\n     [727, 55, -12],\n     [721, 57, -12]]],\n   [[True, 720, False],\n    [True, 730, False],\n    [True, 720, False],\n    [False, 730, False],\n    [False, 725, False],\n    [False, 745, False],\n    [False, 745, False],\n    [False, 725, False],\n    [False, 720, False]]],\n  ['regression: scenario 2',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 40},\n    [[749, 37, 58],\n     [756, 33, 55],\n     [768, 38, 65],\n     [771, 41, 72],\n     [780, 47, 71],\n     [774, 50, 64],\n     [770, 54, 73],\n     [777, 59, 73],\n     [786, 63, 85],\n     [788, 59, 90],\n     [790, 61, 90],\n     [782, 58, 85],\n     [790, 53, 80],\n     [790, 48, 82]]],\n   [[False, 750, False],\n    [False, 750, False],\n    [True, 750, False],\n    [True, 750, False],\n    [True, 750, False],\n    [True, 750, False],\n    [True, 750, False],\n    [True, 730, False],\n    [True, 730, False],\n    [True, 730, False],\n    [True, 730, False],\n    [True, 730, False],\n    [True, 735, False],\n    [True, 750, False]]]],\n [['regression: scenario 1',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 35},\n    [[760, 30, 52],\n     [750, 32, 60],\n     [748, 28, 48],\n     [744, 33, 44],\n     [754, 37, 54],\n     [748, 40, 55],\n     [758, 39, 61],\n     [760, 42, 61],\n     [754, 36, 49],\n     [742, 30, 44],\n     [731, 32, 54],\n     [739, 36, 48],\n     [733, 36, 54]]],\n   [[False, 750, False],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False]]],\n  ['regression: scenario 13',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 45},\n    [[744, 24, 58],\n     [755, 21, 59],\n     [744, 27, 47],\n     [738, 30, 55],\n     [732, 25, 67],\n     [742, 25, 55],\n     [736, 25, 52],\n     [725, 28, 62],\n     [722, 29, 66],\n     [734, 32, 57],\n     [737, 27, 45],\n     [738, 21, 55],\n     [730, 17, 59],\n     [741, 20, 52]]],\n   [[False, 750, False],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False]]],\n  ['control: summer then winter',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},\n    [[765, 52, 80],\n     [762, 58, 80],\n     [745, 58, 80],\n     [738, 50, 80],\n     [700, 25, 10],\n     [700, 29, 10],\n     [700, 36, 10],\n     [700, 10, -15]]],\n   [[True, 750, False],\n    [True, 720, False],\n    [True, 720, False],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, True]]],\n  ['control: dehumidify band',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},\n    [[760, 56, 80],\n     [752, 53, 80],\n     [745, 52, 80],\n     [741, 51, 80],\n     [741, 50, 80],\n     [752, 52, 80],\n     [749, 52, 80]]],\n   [[True, 720, False],\n    [True, 735, False],\n    [True, 740, False],\n    [False, 745, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False]]],\n  ['regression: frost limit steps',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},\n    [[700, 30, 25], [700, 33, 29], [700, 36, 30], [700, 36, -5], [700, 10, -40], [700, 30, 55]]],\n   [[False, 750, True],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, False]]],\n  ['control: mild dry day',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},\n    [[700, 40, 45], [700, 43, 45], [700, 46, 45], [700, 48, 45]]],\n   [[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]]],\n  ['regression: cold snap',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},\n    [[700, 12, -60], [700, 14, -60], [700, 16, -60], [700, 20, 50], [700, 20, 49]]],\n   [[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]]],\n  ['control: scenario 2',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 45},\n    [[746, 32, -7],\n     [745, 28, -12],\n     [741, 24, -18],\n     [736, 26, -12],\n     [729, 31, 0],\n     [720, 32, 7],\n     [730, 30, 14],\n     [728, 28, 19],\n     [725, 23, 17],\n     [729, 20, 18],\n     [717, 24, 19],\n     [715, 19, 10],\n     [723, 14, 20],\n     [722, 10, 23]]],\n   [[False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, True]]]],\n [['regression: scenario 19',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},\n    [[747, 29, 61],\n     [735, 30, 51],\n     [725, 33, 44],\n     [718, 39, 33],\n     [727, 44, 29],\n     [737, 38, 29],\n     [729, 43, 39],\n     [738, 49, 37]]],\n   [[False, 750, False],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False]]],\n  ['regression: scenario 24',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 40},\n    [[757, 26, 51],\n     [747, 24, 47],\n     [737, 30, 53],\n     [726, 27, 41],\n     [719, 23, 50],\n     [715, 21, 46],\n     [717, 18, 36],\n     [715, 16, 36],\n     [715, 15, 25],\n     [715, 18, 24],\n     [720, 14, 18],\n     [715, 14, 18]]],\n   [[False, 750, False],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, True]]],\n  ['control: summer then winter',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},\n    [[765, 52, 80],\n     [762, 58, 80],\n     [745, 58, 80],\n     [738, 50, 80],\n     [700, 25, 10],\n     [700, 29, 10],\n     [700, 36, 10],\n     [700, 10, -15]]],\n   [[True, 750, False],\n    [True, 720, False],\n    [True, 720, False],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, True]]],\n  ['control: dehumidify band',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},\n    [[760, 56, 80],\n     [752, 53, 80],\n     [745, 52, 80],\n     [741, 51, 80],\n     [741, 50, 80],\n     [752, 52, 80],\n     [749, 52, 80]]],\n   [[True, 720, False],\n    [True, 735, False],\n    [True, 740, False],\n    [False, 745, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False]]],\n  ['regression: frost limit steps',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},\n    [[700, 30, 25], [700, 33, 29], [700, 36, 30], [700, 36, -5], [700, 10, -40], [700, 30, 55]]],\n   [[False, 750, True],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, False]]],\n  ['control: mild dry day',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},\n    [[700, 40, 45], [700, 43, 45], [700, 46, 45], [700, 48, 45]]],\n   [[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]]],\n  ['regression: cold snap',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},\n    [[700, 12, -60], [700, 14, -60], [700, 16, -60], [700, 20, 50], [700, 20, 49]]],\n   [[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]]],\n  ['control: scenario 1',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},\n    [[741, 41, 9],\n     [745, 42, 4],\n     [749, 41, 7],\n     [737, 37, 8],\n     [740, 34, 14],\n     [733, 38, 20],\n     [730, 44, 9],\n     [724, 38, 16],\n     [725, 32, 6],\n     [721, 27, -4]]],\n   [[False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False]]]],\n [['regression: scenario 18',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 50},\n    [[741, 28, 78],\n     [744, 29, 75],\n     [746, 23, 67],\n     [740, 21, 68],\n     [748, 15, 58],\n     [750, 13, 59],\n     [757, 16, 52],\n     [749, 12, 61],\n     [737, 16, 54],\n     [733, 10, 42]]],\n   [[False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, True]]],\n  ['regression: scenario 45',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},\n    [[758, 56, 75],\n     [748, 51, 86],\n     [749, 50, 74],\n     [742, 45, 78],\n     [745, 39, 80],\n     [757, 33, 86],\n     [755, 33, 89],\n     [761, 30, 84],\n     [754, 24, 90],\n     [745, 30, 81],\n     [745, 36, 73],\n     [734, 39, 69],\n     [741, 35, 70],\n     [751, 36, 67]]],\n   [[True, 720, False],\n    [True, 745, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [True, 750, False],\n    [True, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False]]],\n  ['control: summer then winter',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},\n    [[765, 52, 80],\n     [762, 58, 80],\n     [745, 58, 80],\n     [738, 50, 80],\n     [700, 25, 10],\n     [700, 29, 10],\n     [700, 36, 10],\n     [700, 10, -15]]],\n   [[True, 750, False],\n    [True, 720, False],\n    [True, 720, False],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, True]]],\n  ['control: dehumidify band',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},\n    [[760, 56, 80],\n     [752, 53, 80],\n     [745, 52, 80],\n     [741, 51, 80],\n     [741, 50, 80],\n     [752, 52, 80],\n     [749, 52, 80]]],\n   [[True, 720, False],\n    [True, 735, False],\n    [True, 740, False],\n    [False, 745, False],\n    [False, 750, False],\n    [False, 750, False],\n    [False, 750, False]]],\n  ['regression: frost limit steps',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},\n    [[700, 30, 25], [700, 33, 29], [700, 36, 30], [700, 36, -5], [700, 10, -40], [700, 30, 55]]],\n   [[False, 750, True],\n    [False, 750, True],\n    [False, 750, True],\n    [False, 750, False],\n    [False, 750, True],\n    [False, 750, False]]],\n  ['control: mild dry day',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},\n    [[700, 40, 45], [700, 43, 45], [700, 46, 45], [700, 48, 45]]],\n   [[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]]],\n  ['regression: cold snap',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},\n    [[700, 12, -60], [700, 14, -60], [700, 16, -60], [700, 20, 50], [700, 20, 49]]],\n   [[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]]],\n  ['control: scenario 1',\n   [{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 35},\n    [[755, 53, 26],\n     [756, 54, 25],\n     [766, 54, 30],\n     [774, 48, 25],\n     [783, 43, 35],\n     [778, 37, 35],\n     [777, 33, 39],\n     [784, 35, 49],\n     [779, 31, 39],\n     [788, 27, 45],\n     [778, 31, 42],\n     [779, 31, 44],\n     [789, 36, 51]]],\n   [[False, 750, False],\n    [False, 750, False],\n    [True, 750, False],\n    [True, 750, False],\n    [True, 750, False],\n    [True, 750, False],\n    [True, 750, False],\n    [True, 750, False],\n    [True, 750, True],\n    [True, 750, True],\n    [True, 750, True],\n    [True, 750, True],\n    [True, 750, 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-humidity-overcool-frost-humidifier-season","generated_at":"2026-09-29T14:51:47.578782+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 outdoor season lockout is missing.","sha256":"dc4f49208124fcc562d09de82c9d6469ca4ccdeb466d13a9f946aa9cac74caa8","title":"Humidifier runs in warm weather · 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.748,"exit_code":1,"observations":[{"actual":[[false,750,true],[false,750,true],[false,750,true],[false,750,false],[false,750,true],[false,750,false]],"check":"regression: frost limit steps","expected":[[false,750,true],[false,750,true],[false,750,true],[false,750,false],[false,750,true],[false,750,false]],"passed":true},{"actual":[[false,750,false],[false,750,false],[false,750,false],[false,750,true],[false,750,true]],"check":"regression: cold snap","expected":[[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,true]],"passed":false},{"actual":[[true,750,false],[true,720,false],[true,720,false],[false,750,false],[false,750,true],[false,750,true],[false,750,false],[false,750,true]],"check":"control: summer then winter","expected":[[true,750,false],[true,720,false],[true,720,false],[false,750,false],[false,750,true],[false,750,true],[false,750,false],[false,750,true]],"passed":true},{"actual":[[true,720,false],[true,735,false],[true,740,false],[false,745,false],[false,750,false],[false,750,false],[false,750,false]],"check":"control: dehumidify band","expected":[[true,720,false],[true,735,false],[true,740,false],[false,745,false],[false,750,false],[false,750,false],[false,750,false]],"passed":true},{"actual":[[false,750,true],[false,750,true],[false,750,false],[false,750,false]],"check":"control: mild dry day","expected":[[false,750,true],[false,750,true],[false,750,false],[false,750,false]],"passed":true},{"actual":[[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false]],"check":"control: scenario 1","expected":[[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false]],"passed":true},{"actual":[[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,false]],"check":"control: scenario 2","expected":[[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,false]],"passed":true},{"actual":[[false,750,true],[false,750,false],[false,750,true],[false,750,false],[false,750,true],[false,750,true],[false,750,false],[false,750,true],[false,750,false],[false,750,true],[false,750,false],[false,750,true],[false,750,false],[false,750,true]],"check":"regression: scenario 3","expected":[[false,750,true],[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,true],[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false]],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: frost limit steps\", \"actual\": [[false, 750, true], [false, 750, true], [false, 750, true], [false, 750, false], [false, 750, true], [false, 750, false]], \"expected\": [[false, 750, true], [false, 750, true], [false, 750, true], [false, 750, false], [false, 750, true], [false, 750, false]], \"passed\": true}, {\"check\": \"regression: cold snap\", \"actual\": [[false, 750, false], [false, 750, false], [false, 750, false], [false, 750, true], [false, 750, true]], \"expected\": [[false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, true]], \"passed\": false}, {\"check\": \"control: summer then winter\", \"actual\": [[true, 750, false], [true, 720, false], [true, 720, false], [false, 750, false], [false, 750, true], [false, 750, true], [false, 750, false], [false, 750, true]], \"expected\": [[true, 750, false], [true, 720, false], [true, 720, false], [false, 750, false], [false, 750, true], [false, 750, true], [false, 750, false], [false, 750, true]], \"passed\": true}, {\"check\": \"control: dehumidify band\", \"actual\": [[true, 720, false], [true, 735, false], [true, 740, false], [false, 745, false], [false, 750, false], [false, 750, false], [false, 750, false]], \"expected\": [[true, 720, false], [true, 735, false], [true, 740, false], [false, 745, false], [false, 750, false], [false, 750, false], [false, 750, false]], \"passed\": true}, {\"check\": \"control: mild dry day\", \"actual\": [[false, 750, true], [false, 750, true], [false, 750, false], [false, 750, false]], \"expected\": [[false, 750, true], [false, 750, true], [false, 750, false], [false, 750, false]], \"passed\": true}, {\"check\": \"control: scenario 1\", \"actual\": [[false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false]], \"expected\": [[false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false]], \"passed\": true}, {\"check\": \"control: scenario 2\", \"actual\": [[true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, false]], \"expected\": [[true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, false]], \"passed\": true}, {\"check\": \"regression: scenario 3\", \"actual\": [[false, 750, true], [false, 750, false], [false, 750, true], [false, 750, false], [false, 750, true], [false, 750, true], [false, 750, false], [false, 750, true], [false, 750, false], [false, 750, true], [false, 750, false], [false, 750, true], [false, 750, false], [false, 750, true]], \"expected\": [[false, 750, true], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, true], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false]], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":44.222,"exit_code":1,"observations":[{"actual":[[false,750,true],[false,750,true],[false,750,true],[false,750,false],[false,750,true],[false,750,true]],"check":"regression: frost limit steps","expected":[[false,750,true],[false,750,true],[false,750,true],[false,750,false],[false,750,true],[false,750,false]],"passed":false},{"actual":[[false,750,false],[false,750,false],[false,750,false],[false,750,true],[false,750,true]],"check":"regression: cold snap","expected":[[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,true]],"passed":false},{"actual":[[true,750,false],[true,720,false],[true,720,false],[false,750,false],[false,750,true],[false,750,true],[false,750,false],[false,750,true]],"check":"control: summer then winter","expected":[[true,750,false],[true,720,false],[true,720,false],[false,750,false],[false,750,true],[false,750,true],[false,750,false],[false,750,true]],"passed":true},{"actual":[[true,720,false],[true,735,false],[true,740,false],[false,745,false],[false,750,false],[false,750,false],[false,750,false]],"check":"control: dehumidify band","expected":[[true,720,false],[true,735,false],[true,740,false],[false,745,false],[false,750,false],[false,750,false],[false,750,false]],"passed":true},{"actual":[[false,750,true],[false,750,true],[false,750,false],[false,750,false]],"check":"control: mild dry day","expected":[[false,750,true],[false,750,true],[false,750,false],[false,750,false]],"passed":true},{"actual":[[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false]],"check":"control: scenario 1","expected":[[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false]],"passed":true},{"actual":[[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,false]],"check":"control: scenario 2","expected":[[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,true],[true,750,false]],"passed":true},{"actual":[[false,750,true],[false,750,true],[false,750,true],[false,750,true],[false,750,true],[false,750,true],[false,750,true],[false,750,true],[false,750,true],[false,750,true],[false,750,true],[false,750,true],[false,750,true],[false,750,true]],"check":"regression: scenario 3","expected":[[false,750,true],[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,true],[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false],[false,750,false]],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: frost limit steps\", \"actual\": [[false, 750, true], [false, 750, true], [false, 750, true], [false, 750, false], [false, 750, true], [false, 750, true]], \"expected\": [[false, 750, true], [false, 750, true], [false, 750, true], [false, 750, false], [false, 750, true], [false, 750, false]], \"passed\": false}, {\"check\": \"regression: cold snap\", \"actual\": [[false, 750, false], [false, 750, false], [false, 750, false], [false, 750, true], [false, 750, true]], \"expected\": [[false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, true]], \"passed\": false}, {\"check\": \"control: summer then winter\", \"actual\": [[true, 750, false], [true, 720, false], [true, 720, false], [false, 750, false], [false, 750, true], [false, 750, true], [false, 750, false], [false, 750, true]], \"expected\": [[true, 750, false], [true, 720, false], [true, 720, false], [false, 750, false], [false, 750, true], [false, 750, true], [false, 750, false], [false, 750, true]], \"passed\": true}, {\"check\": \"control: dehumidify band\", \"actual\": [[true, 720, false], [true, 735, false], [true, 740, false], [false, 745, false], [false, 750, false], [false, 750, false], [false, 750, false]], \"expected\": [[true, 720, false], [true, 735, false], [true, 740, false], [false, 745, false], [false, 750, false], [false, 750, false], [false, 750, false]], \"passed\": true}, {\"check\": \"control: mild dry day\", \"actual\": [[false, 750, true], [false, 750, true], [false, 750, false], [false, 750, false]], \"expected\": [[false, 750, true], [false, 750, true], [false, 750, false], [false, 750, false]], \"passed\": true}, {\"check\": \"control: scenario 1\", \"actual\": [[false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false]], \"expected\": [[false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false]], \"passed\": true}, {\"check\": \"control: scenario 2\", \"actual\": [[true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, false]], \"expected\": [[true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, true], [true, 750, false]], \"passed\": true}, {\"check\": \"regression: scenario 3\", \"actual\": [[false, 750, true], [false, 750, true], [false, 750, true], [false, 750, true], [false, 750, true], [false, 750, true], [false, 750, true], [false, 750, true], [false, 750, true], [false, 750, true], [false, 750, true], [false, 750, true], [false, 750, true], [false, 750, true]], \"expected\": [[false, 750, true], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, true], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false], [false, 750, false]], \"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."}}