{"abstract":"Residual CO2 after everyone leaves keeps the outdoor damper open overnight.","category":"HVAC thermostat control","checks":8,"contract":"CO2 demand-controlled ventilation per sample; samples are [co2_ppm, occupied]. Unoccupied target is 0%. Occupied: min_pos at or below co2_low, max_pos at or above co2_high, and linear in between rounded half up to whole percent. The damper moves toward the target by at most 10 percentage points per sample in either direction. Return the damper position per sample.","evaluation_group":"w2-hvac-thermostat-control-co2-demand-ventilation","failed_approach":"Holding the minimum position when unoccupied still ventilates an empty space.","family":"w2-hvac-thermostat-control-co2-demand-ventilation-unoccupied-target","id":"FA-92726","implementations":{"attempt":{"sha256":"fd3afeccce85c8d8ff53cf13e422a2369c47c6d4121e7d044893af81a2e53af8","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(settings, samples):\n    pos = 0\n    out = []\n    for co2, occupied in samples:\n        if not occupied:\n            target = settings['min_pos']\n        elif co2 <= settings['co2_low']:\n            target = settings['min_pos']\n        elif co2 >= settings['co2_high']:\n            target = settings['max_pos']\n        else:\n            span = settings['co2_high'] - settings['co2_low']\n            num = (co2 - settings['co2_low']) * (settings['max_pos'] - settings['min_pos'])\n            target = settings['min_pos'] + (2 * num + span) // (2 * span)\n        if target > pos:\n            pos = min(target, pos + 10)\n        else:\n            pos = max(target, pos - 10)\n        out.append(pos)\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: occupied day',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[650, True],\n     [650, True],\n     [900, True],\n     [900, True],\n     [900, True],\n     [900, True],\n     [1300, True],\n     [1300, False]]],\n   [10, 20, 30, 40, 50, 50, 60, 50]],\n  ['regression: unoccupied high co2',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[1200, False], [1200, False], [1200, True]]],\n   [0, 0, 10]],\n  ['regression: crowd arrives',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, False],\n     [1500, False]]],\n   [10, 20, 30, 40, 50, 60, 70, 80, 80, 70, 60]],\n  ['control: moderate co2',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[800, True], [800, True], [800, True], [800, True], [800, True], [750, True], [750, True]]],\n   [10, 20, 30, 35, 35, 28, 28]],\n  ['control: scenario 1',\n   [{'min_pos': 20, 'max_pos': 100, 'co2_low': 600, 'co2_high': 1000},\n    [[424, True], [551, True], [655, True], [713, True], [740, True], [769, True], [840, True], [858, True]]],\n   [10, 20, 30, 40, 48, 54, 64, 72]],\n  ['regression: scenario 2',\n   [{'min_pos': 10, 'max_pos': 60, 'co2_low': 700, 'co2_high': 1000},\n    [[1150, True],\n     [1009, True],\n     [1044, True],\n     [985, False],\n     [1131, False],\n     [982, True],\n     [895, True],\n     [828, False]]],\n   [10, 20, 30, 20, 10, 20, 30, 20]],\n  ['regression: scenario 3',\n   [{'min_pos': 15, 'max_pos': 80, 'co2_low': 600, 'co2_high': 1000},\n    [[1300, False],\n     [1254, True],\n     [1354, True],\n     [1400, False],\n     [1471, True],\n     [1498, True],\n     [1500, False],\n     [1488, True],\n     [1500, False],\n     [1500, True],\n     [1500, False],\n     [1464, True]]],\n   [0, 10, 20, 10, 20, 30, 20, 30, 20, 30, 20, 30]],\n  ['regression: scenario 4',\n   [{'min_pos': 10, 'max_pos': 100, 'co2_low': 700, 'co2_high': 1000},\n    [[802, True],\n     [856, True],\n     [954, True],\n     [853, True],\n     [816, True],\n     [847, False],\n     [865, True],\n     [741, True],\n     [680, True],\n     [592, True],\n     [485, True]]],\n   [10, 20, 30, 40, 45, 35, 45, 35, 25, 15, 10]]],\n [['regression: crowd arrives',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, False],\n     [1500, False]]],\n   [10, 20, 30, 40, 50, 60, 70, 80, 80, 70, 60]],\n  ['regression: scenario 1',\n   [{'min_pos': 20, 'max_pos': 100, 'co2_low': 600, 'co2_high': 1200},\n    [[631, True],\n     [545, True],\n     [465, True],\n     [503, True],\n     [568, True],\n     [550, True],\n     [450, False],\n     [459, True],\n     [434, True],\n     [539, True],\n     [480, True],\n     [462, False],\n     [400, True],\n     [400, True]]],\n   [10, 20, 20, 20, 20, 20, 10, 20, 20, 20, 20, 10, 20, 20]],\n  ['regression: occupied day',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[650, True],\n     [650, True],\n     [900, True],\n     [900, True],\n     [900, True],\n     [900, True],\n     [1300, True],\n     [1300, False]]],\n   [10, 20, 30, 40, 50, 50, 60, 50]],\n  ['control: moderate co2',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[800, True], [800, True], [800, True], [800, True], [800, True], [750, True], [750, True]]],\n   [10, 20, 30, 35, 35, 28, 28]],\n  ['regression: unoccupied high co2',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[1200, False], [1200, False], [1200, True]]],\n   [0, 0, 10]],\n  ['control: scenario 2',\n   [{'min_pos': 15, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1000},\n    [[775, True],\n     [743, True],\n     [851, True],\n     [853, True],\n     [893, True],\n     [872, True],\n     [870, True],\n     [781, False],\n     [813, True],\n     [851, True],\n     [955, True]]],\n   [10, 20, 30, 40, 50, 52, 52, 42, 39, 48, 58]],\n  ['regression: scenario 3',\n   [{'min_pos': 10, 'max_pos': 100, 'co2_low': 700, 'co2_high': 1200},\n    [[1109, True],\n     [1033, False],\n     [1170, False],\n     [1235, True],\n     [1208, True],\n     [1230, True],\n     [1178, True],\n     [1182, True],\n     [1206, False],\n     [1261, True],\n     [1328, True],\n     [1474, True]]],\n   [10, 0, 0, 10, 20, 30, 40, 50, 40, 50, 60, 70]],\n  ['regression: scenario 4',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 600, 'co2_high': 1200},\n    [[1028, True],\n     [998, True],\n     [1129, True],\n     [1164, True],\n     [1200, True],\n     [1276, False],\n     [1335, True],\n     [1192, True],\n     [1105, True],\n     [1194, True],\n     [1207, True]]],\n   [10, 20, 30, 40, 50, 40, 50, 60, 70, 79, 80]]],\n [['regression: unoccupied high co2',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[1200, False], [1200, False], [1200, True]]],\n   [0, 0, 10]],\n  ['regression: scenario 4',\n   [{'min_pos': 10, 'max_pos': 60, 'co2_low': 600, 'co2_high': 1000},\n    [[675, True],\n     [548, False],\n     [502, True],\n     [455, False],\n     [400, True],\n     [462, True],\n     [400, True],\n     [400, True],\n     [400, True],\n     [402, False],\n     [447, True]]],\n   [10, 0, 10, 0, 10, 10, 10, 10, 10, 0, 10]],\n  ['regression: occupied day',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[650, True],\n     [650, True],\n     [900, True],\n     [900, True],\n     [900, True],\n     [900, True],\n     [1300, True],\n     [1300, False]]],\n   [10, 20, 30, 40, 50, 50, 60, 50]],\n  ['regression: crowd arrives',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, False],\n     [1500, False]]],\n   [10, 20, 30, 40, 50, 60, 70, 80, 80, 70, 60]],\n  ['control: moderate co2',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[800, True], [800, True], [800, True], [800, True], [800, True], [750, True], [750, True]]],\n   [10, 20, 30, 35, 35, 28, 28]],\n  ['regression: scenario 1',\n   [{'min_pos': 10, 'max_pos': 60, 'co2_low': 700, 'co2_high': 1000},\n    [[523, True],\n     [506, True],\n     [620, False],\n     [668, True],\n     [557, True],\n     [453, True],\n     [400, True],\n     [400, True],\n     [409, True],\n     [455, False],\n     [443, False],\n     [561, True]]],\n   [10, 10, 0, 10, 10, 10, 10, 10, 10, 0, 0, 10]],\n  ['regression: scenario 2',\n   [{'min_pos': 20, 'max_pos': 60, 'co2_low': 600, 'co2_high': 1000},\n    [[640, True],\n     [668, False],\n     [658, True],\n     [602, False],\n     [640, False],\n     [525, False],\n     [604, True],\n     [456, True],\n     [591, True],\n     [611, True]]],\n   [10, 0, 10, 0, 0, 0, 10, 20, 20, 21]],\n  ['regression: scenario 3',\n   [{'min_pos': 20, 'max_pos': 60, 'co2_low': 700, 'co2_high': 1000},\n    [[1018, True],\n     [1052, True],\n     [988, True],\n     [1071, True],\n     [1109, True],\n     [1124, True],\n     [1196, True],\n     [1221, False],\n     [1203, True]]],\n   [10, 20, 30, 40, 50, 60, 60, 50, 60]]],\n [['regression: scenario 1',\n   [{'min_pos': 15, 'max_pos': 60, 'co2_low': 700, 'co2_high': 1200},\n    [[1121, True],\n     [1144, True],\n     [1172, True],\n     [1223, True],\n     [1138, True],\n     [1273, True],\n     [1319, True],\n     [1227, False],\n     [1253, True]]],\n   [10, 20, 30, 40, 50, 60, 60, 50, 60]],\n  ['regression: scenario 8',\n   [{'min_pos': 20, 'max_pos': 100, 'co2_low': 700, 'co2_high': 1200},\n    [[1134, False],\n     [1275, True],\n     [1185, True],\n     [1223, True],\n     [1341, True],\n     [1446, True],\n     [1500, True],\n     [1466, True],\n     [1500, False]]],\n   [0, 10, 20, 30, 40, 50, 60, 70, 60]],\n  ['regression: occupied day',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[650, True],\n     [650, True],\n     [900, True],\n     [900, True],\n     [900, True],\n     [900, True],\n     [1300, True],\n     [1300, False]]],\n   [10, 20, 30, 40, 50, 50, 60, 50]],\n  ['regression: crowd arrives',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, False],\n     [1500, False]]],\n   [10, 20, 30, 40, 50, 60, 70, 80, 80, 70, 60]],\n  ['control: moderate co2',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[800, True], [800, True], [800, True], [800, True], [800, True], [750, True], [750, True]]],\n   [10, 20, 30, 35, 35, 28, 28]],\n  ['regression: unoccupied high co2',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[1200, False], [1200, False], [1200, True]]],\n   [0, 0, 10]],\n  ['regression: scenario 2',\n   [{'min_pos': 20, 'max_pos': 60, 'co2_low': 600, 'co2_high': 1200},\n    [[570, True],\n     [539, True],\n     [432, True],\n     [498, True],\n     [536, True],\n     [559, True],\n     [607, True],\n     [706, False],\n     [703, False],\n     [767, True],\n     [618, False],\n     [742, False],\n     [796, True]]],\n   [10, 20, 20, 20, 20, 20, 20, 10, 0, 10, 0, 0, 10]],\n  ['regression: scenario 3',\n   [{'min_pos': 20, 'max_pos': 60, 'co2_low': 600, 'co2_high': 1000},\n    [[853, True],\n     [828, True],\n     [845, True],\n     [890, False],\n     [973, True],\n     [895, True],\n     [751, True],\n     [855, True],\n     [839, False],\n     [909, True],\n     [1031, True],\n     [926, True],\n     [1032, True]]],\n   [10, 20, 30, 20, 30, 40, 35, 45, 35, 45, 55, 53, 60]]],\n [['regression: scenario 2',\n   [{'min_pos': 15, 'max_pos': 100, 'co2_low': 700, 'co2_high': 1000},\n    [[788, True],\n     [835, True],\n     [980, True],\n     [906, False],\n     [1052, True],\n     [960, False],\n     [1028, True],\n     [1053, False],\n     [1100, True],\n     [1140, False]]],\n   [10, 20, 30, 20, 30, 20, 30, 20, 30, 20]],\n  ['regression: scenario 9',\n   [{'min_pos': 15, 'max_pos': 80, 'co2_low': 600, 'co2_high': 1000},\n    [[1157, False],\n     [1218, True],\n     [1323, True],\n     [1229, False],\n     [1145, True],\n     [1200, True],\n     [1197, False],\n     [1302, True]]],\n   [0, 10, 20, 10, 20, 30, 20, 30]],\n  ['regression: occupied day',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[650, True],\n     [650, True],\n     [900, True],\n     [900, True],\n     [900, True],\n     [900, True],\n     [1300, True],\n     [1300, False]]],\n   [10, 20, 30, 40, 50, 50, 60, 50]],\n  ['regression: crowd arrives',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, False],\n     [1500, False]]],\n   [10, 20, 30, 40, 50, 60, 70, 80, 80, 70, 60]],\n  ['control: moderate co2',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[800, True], [800, True], [800, True], [800, True], [800, True], [750, True], [750, True]]],\n   [10, 20, 30, 35, 35, 28, 28]],\n  ['regression: unoccupied high co2',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[1200, False], [1200, False], [1200, True]]],\n   [0, 0, 10]],\n  ['regression: scenario 1',\n   [{'min_pos': 15, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1200},\n    [[1383, True],\n     [1500, True],\n     [1500, True],\n     [1483, True],\n     [1492, True],\n     [1500, False],\n     [1500, True],\n     [1500, True],\n     [1500, False],\n     [1465, True],\n     [1443, False],\n     [1458, False],\n     [1430, True]]],\n   [10, 20, 30, 40, 50, 40, 50, 60, 50, 60, 50, 40, 50]],\n  ['regression: scenario 3',\n   [{'min_pos': 20, 'max_pos': 100, 'co2_low': 600, 'co2_high': 1200},\n    [[1068, True],\n     [969, True],\n     [993, True],\n     [1093, True],\n     [1019, True],\n     [1021, True],\n     [1037, False],\n     [990, True],\n     [876, False],\n     [997, True],\n     [984, True],\n     [903, False],\n     [822, False]]],\n   [10, 20, 30, 40, 50, 60, 50, 60, 50, 60, 70, 60, 50]]]]\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":"cd6b43d07032096a2c5f3650571beee8210cf30a7c741664579a33324771633b","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(settings, samples):\n    pos = 0\n    out = []\n    for co2, occupied in samples:\n        if co2 <= settings['co2_low']:\n            target = settings['min_pos']\n        elif co2 >= settings['co2_high']:\n            target = settings['max_pos']\n        else:\n            span = settings['co2_high'] - settings['co2_low']\n            num = (co2 - settings['co2_low']) * (settings['max_pos'] - settings['min_pos'])\n            target = settings['min_pos'] + (2 * num + span) // (2 * span)\n        if target > pos:\n            pos = min(target, pos + 10)\n        else:\n            pos = max(target, pos - 10)\n        out.append(pos)\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: occupied day',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[650, True],\n     [650, True],\n     [900, True],\n     [900, True],\n     [900, True],\n     [900, True],\n     [1300, True],\n     [1300, False]]],\n   [10, 20, 30, 40, 50, 50, 60, 50]],\n  ['regression: unoccupied high co2',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[1200, False], [1200, False], [1200, True]]],\n   [0, 0, 10]],\n  ['regression: crowd arrives',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, False],\n     [1500, False]]],\n   [10, 20, 30, 40, 50, 60, 70, 80, 80, 70, 60]],\n  ['control: moderate co2',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[800, True], [800, True], [800, True], [800, True], [800, True], [750, True], [750, True]]],\n   [10, 20, 30, 35, 35, 28, 28]],\n  ['control: scenario 1',\n   [{'min_pos': 20, 'max_pos': 100, 'co2_low': 600, 'co2_high': 1000},\n    [[424, True], [551, True], [655, True], [713, True], [740, True], [769, True], [840, True], [858, True]]],\n   [10, 20, 30, 40, 48, 54, 64, 72]],\n  ['regression: scenario 2',\n   [{'min_pos': 10, 'max_pos': 60, 'co2_low': 700, 'co2_high': 1000},\n    [[1150, True],\n     [1009, True],\n     [1044, True],\n     [985, False],\n     [1131, False],\n     [982, True],\n     [895, True],\n     [828, False]]],\n   [10, 20, 30, 20, 10, 20, 30, 20]],\n  ['regression: scenario 3',\n   [{'min_pos': 15, 'max_pos': 80, 'co2_low': 600, 'co2_high': 1000},\n    [[1300, False],\n     [1254, True],\n     [1354, True],\n     [1400, False],\n     [1471, True],\n     [1498, True],\n     [1500, False],\n     [1488, True],\n     [1500, False],\n     [1500, True],\n     [1500, False],\n     [1464, True]]],\n   [0, 10, 20, 10, 20, 30, 20, 30, 20, 30, 20, 30]],\n  ['regression: scenario 4',\n   [{'min_pos': 10, 'max_pos': 100, 'co2_low': 700, 'co2_high': 1000},\n    [[802, True],\n     [856, True],\n     [954, True],\n     [853, True],\n     [816, True],\n     [847, False],\n     [865, True],\n     [741, True],\n     [680, True],\n     [592, True],\n     [485, True]]],\n   [10, 20, 30, 40, 45, 35, 45, 35, 25, 15, 10]]],\n [['regression: crowd arrives',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, False],\n     [1500, False]]],\n   [10, 20, 30, 40, 50, 60, 70, 80, 80, 70, 60]],\n  ['regression: scenario 1',\n   [{'min_pos': 20, 'max_pos': 100, 'co2_low': 600, 'co2_high': 1200},\n    [[631, True],\n     [545, True],\n     [465, True],\n     [503, True],\n     [568, True],\n     [550, True],\n     [450, False],\n     [459, True],\n     [434, True],\n     [539, True],\n     [480, True],\n     [462, False],\n     [400, True],\n     [400, True]]],\n   [10, 20, 20, 20, 20, 20, 10, 20, 20, 20, 20, 10, 20, 20]],\n  ['regression: occupied day',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[650, True],\n     [650, True],\n     [900, True],\n     [900, True],\n     [900, True],\n     [900, True],\n     [1300, True],\n     [1300, False]]],\n   [10, 20, 30, 40, 50, 50, 60, 50]],\n  ['control: moderate co2',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[800, True], [800, True], [800, True], [800, True], [800, True], [750, True], [750, True]]],\n   [10, 20, 30, 35, 35, 28, 28]],\n  ['regression: unoccupied high co2',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[1200, False], [1200, False], [1200, True]]],\n   [0, 0, 10]],\n  ['control: scenario 2',\n   [{'min_pos': 15, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1000},\n    [[775, True],\n     [743, True],\n     [851, True],\n     [853, True],\n     [893, True],\n     [872, True],\n     [870, True],\n     [781, False],\n     [813, True],\n     [851, True],\n     [955, True]]],\n   [10, 20, 30, 40, 50, 52, 52, 42, 39, 48, 58]],\n  ['regression: scenario 3',\n   [{'min_pos': 10, 'max_pos': 100, 'co2_low': 700, 'co2_high': 1200},\n    [[1109, True],\n     [1033, False],\n     [1170, False],\n     [1235, True],\n     [1208, True],\n     [1230, True],\n     [1178, True],\n     [1182, True],\n     [1206, False],\n     [1261, True],\n     [1328, True],\n     [1474, True]]],\n   [10, 0, 0, 10, 20, 30, 40, 50, 40, 50, 60, 70]],\n  ['regression: scenario 4',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 600, 'co2_high': 1200},\n    [[1028, True],\n     [998, True],\n     [1129, True],\n     [1164, True],\n     [1200, True],\n     [1276, False],\n     [1335, True],\n     [1192, True],\n     [1105, True],\n     [1194, True],\n     [1207, True]]],\n   [10, 20, 30, 40, 50, 40, 50, 60, 70, 79, 80]]],\n [['regression: unoccupied high co2',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[1200, False], [1200, False], [1200, True]]],\n   [0, 0, 10]],\n  ['regression: scenario 4',\n   [{'min_pos': 10, 'max_pos': 60, 'co2_low': 600, 'co2_high': 1000},\n    [[675, True],\n     [548, False],\n     [502, True],\n     [455, False],\n     [400, True],\n     [462, True],\n     [400, True],\n     [400, True],\n     [400, True],\n     [402, False],\n     [447, True]]],\n   [10, 0, 10, 0, 10, 10, 10, 10, 10, 0, 10]],\n  ['regression: occupied day',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[650, True],\n     [650, True],\n     [900, True],\n     [900, True],\n     [900, True],\n     [900, True],\n     [1300, True],\n     [1300, False]]],\n   [10, 20, 30, 40, 50, 50, 60, 50]],\n  ['regression: crowd arrives',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, False],\n     [1500, False]]],\n   [10, 20, 30, 40, 50, 60, 70, 80, 80, 70, 60]],\n  ['control: moderate co2',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[800, True], [800, True], [800, True], [800, True], [800, True], [750, True], [750, True]]],\n   [10, 20, 30, 35, 35, 28, 28]],\n  ['regression: scenario 1',\n   [{'min_pos': 10, 'max_pos': 60, 'co2_low': 700, 'co2_high': 1000},\n    [[523, True],\n     [506, True],\n     [620, False],\n     [668, True],\n     [557, True],\n     [453, True],\n     [400, True],\n     [400, True],\n     [409, True],\n     [455, False],\n     [443, False],\n     [561, True]]],\n   [10, 10, 0, 10, 10, 10, 10, 10, 10, 0, 0, 10]],\n  ['regression: scenario 2',\n   [{'min_pos': 20, 'max_pos': 60, 'co2_low': 600, 'co2_high': 1000},\n    [[640, True],\n     [668, False],\n     [658, True],\n     [602, False],\n     [640, False],\n     [525, False],\n     [604, True],\n     [456, True],\n     [591, True],\n     [611, True]]],\n   [10, 0, 10, 0, 0, 0, 10, 20, 20, 21]],\n  ['regression: scenario 3',\n   [{'min_pos': 20, 'max_pos': 60, 'co2_low': 700, 'co2_high': 1000},\n    [[1018, True],\n     [1052, True],\n     [988, True],\n     [1071, True],\n     [1109, True],\n     [1124, True],\n     [1196, True],\n     [1221, False],\n     [1203, True]]],\n   [10, 20, 30, 40, 50, 60, 60, 50, 60]]],\n [['regression: scenario 1',\n   [{'min_pos': 15, 'max_pos': 60, 'co2_low': 700, 'co2_high': 1200},\n    [[1121, True],\n     [1144, True],\n     [1172, True],\n     [1223, True],\n     [1138, True],\n     [1273, True],\n     [1319, True],\n     [1227, False],\n     [1253, True]]],\n   [10, 20, 30, 40, 50, 60, 60, 50, 60]],\n  ['regression: scenario 8',\n   [{'min_pos': 20, 'max_pos': 100, 'co2_low': 700, 'co2_high': 1200},\n    [[1134, False],\n     [1275, True],\n     [1185, True],\n     [1223, True],\n     [1341, True],\n     [1446, True],\n     [1500, True],\n     [1466, True],\n     [1500, False]]],\n   [0, 10, 20, 30, 40, 50, 60, 70, 60]],\n  ['regression: occupied day',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[650, True],\n     [650, True],\n     [900, True],\n     [900, True],\n     [900, True],\n     [900, True],\n     [1300, True],\n     [1300, False]]],\n   [10, 20, 30, 40, 50, 50, 60, 50]],\n  ['regression: crowd arrives',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, False],\n     [1500, False]]],\n   [10, 20, 30, 40, 50, 60, 70, 80, 80, 70, 60]],\n  ['control: moderate co2',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[800, True], [800, True], [800, True], [800, True], [800, True], [750, True], [750, True]]],\n   [10, 20, 30, 35, 35, 28, 28]],\n  ['regression: unoccupied high co2',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[1200, False], [1200, False], [1200, True]]],\n   [0, 0, 10]],\n  ['regression: scenario 2',\n   [{'min_pos': 20, 'max_pos': 60, 'co2_low': 600, 'co2_high': 1200},\n    [[570, True],\n     [539, True],\n     [432, True],\n     [498, True],\n     [536, True],\n     [559, True],\n     [607, True],\n     [706, False],\n     [703, False],\n     [767, True],\n     [618, False],\n     [742, False],\n     [796, True]]],\n   [10, 20, 20, 20, 20, 20, 20, 10, 0, 10, 0, 0, 10]],\n  ['regression: scenario 3',\n   [{'min_pos': 20, 'max_pos': 60, 'co2_low': 600, 'co2_high': 1000},\n    [[853, True],\n     [828, True],\n     [845, True],\n     [890, False],\n     [973, True],\n     [895, True],\n     [751, True],\n     [855, True],\n     [839, False],\n     [909, True],\n     [1031, True],\n     [926, True],\n     [1032, True]]],\n   [10, 20, 30, 20, 30, 40, 35, 45, 35, 45, 55, 53, 60]]],\n [['regression: scenario 2',\n   [{'min_pos': 15, 'max_pos': 100, 'co2_low': 700, 'co2_high': 1000},\n    [[788, True],\n     [835, True],\n     [980, True],\n     [906, False],\n     [1052, True],\n     [960, False],\n     [1028, True],\n     [1053, False],\n     [1100, True],\n     [1140, False]]],\n   [10, 20, 30, 20, 30, 20, 30, 20, 30, 20]],\n  ['regression: scenario 9',\n   [{'min_pos': 15, 'max_pos': 80, 'co2_low': 600, 'co2_high': 1000},\n    [[1157, False],\n     [1218, True],\n     [1323, True],\n     [1229, False],\n     [1145, True],\n     [1200, True],\n     [1197, False],\n     [1302, True]]],\n   [0, 10, 20, 10, 20, 30, 20, 30]],\n  ['regression: occupied day',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[650, True],\n     [650, True],\n     [900, True],\n     [900, True],\n     [900, True],\n     [900, True],\n     [1300, True],\n     [1300, False]]],\n   [10, 20, 30, 40, 50, 50, 60, 50]],\n  ['regression: crowd arrives',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, False],\n     [1500, False]]],\n   [10, 20, 30, 40, 50, 60, 70, 80, 80, 70, 60]],\n  ['control: moderate co2',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[800, True], [800, True], [800, True], [800, True], [800, True], [750, True], [750, True]]],\n   [10, 20, 30, 35, 35, 28, 28]],\n  ['regression: unoccupied high co2',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[1200, False], [1200, False], [1200, True]]],\n   [0, 0, 10]],\n  ['regression: scenario 1',\n   [{'min_pos': 15, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1200},\n    [[1383, True],\n     [1500, True],\n     [1500, True],\n     [1483, True],\n     [1492, True],\n     [1500, False],\n     [1500, True],\n     [1500, True],\n     [1500, False],\n     [1465, True],\n     [1443, False],\n     [1458, False],\n     [1430, True]]],\n   [10, 20, 30, 40, 50, 40, 50, 60, 50, 60, 50, 40, 50]],\n  ['regression: scenario 3',\n   [{'min_pos': 20, 'max_pos': 100, 'co2_low': 600, 'co2_high': 1200},\n    [[1068, True],\n     [969, True],\n     [993, True],\n     [1093, True],\n     [1019, True],\n     [1021, True],\n     [1037, False],\n     [990, True],\n     [876, False],\n     [997, True],\n     [984, True],\n     [903, False],\n     [822, False]]],\n   [10, 20, 30, 40, 50, 60, 50, 60, 50, 60, 70, 60, 50]]]]\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"},"fixed":{"sha256":"c8d141d6e701d910741dab565eacdf13d4ef8f7ab3f2bc273a01eebc19983e0c","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(settings, samples):\n    pos = 0\n    out = []\n    for co2, occupied in samples:\n        if not occupied:\n            target = 0\n        elif co2 <= settings['co2_low']:\n            target = settings['min_pos']\n        elif co2 >= settings['co2_high']:\n            target = settings['max_pos']\n        else:\n            span = settings['co2_high'] - settings['co2_low']\n            num = (co2 - settings['co2_low']) * (settings['max_pos'] - settings['min_pos'])\n            target = settings['min_pos'] + (2 * num + span) // (2 * span)\n        if target > pos:\n            pos = min(target, pos + 10)\n        else:\n            pos = max(target, pos - 10)\n        out.append(pos)\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: occupied day',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[650, True],\n     [650, True],\n     [900, True],\n     [900, True],\n     [900, True],\n     [900, True],\n     [1300, True],\n     [1300, False]]],\n   [10, 20, 30, 40, 50, 50, 60, 50]],\n  ['regression: unoccupied high co2',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[1200, False], [1200, False], [1200, True]]],\n   [0, 0, 10]],\n  ['regression: crowd arrives',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, False],\n     [1500, False]]],\n   [10, 20, 30, 40, 50, 60, 70, 80, 80, 70, 60]],\n  ['control: moderate co2',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[800, True], [800, True], [800, True], [800, True], [800, True], [750, True], [750, True]]],\n   [10, 20, 30, 35, 35, 28, 28]],\n  ['control: scenario 1',\n   [{'min_pos': 20, 'max_pos': 100, 'co2_low': 600, 'co2_high': 1000},\n    [[424, True], [551, True], [655, True], [713, True], [740, True], [769, True], [840, True], [858, True]]],\n   [10, 20, 30, 40, 48, 54, 64, 72]],\n  ['regression: scenario 2',\n   [{'min_pos': 10, 'max_pos': 60, 'co2_low': 700, 'co2_high': 1000},\n    [[1150, True],\n     [1009, True],\n     [1044, True],\n     [985, False],\n     [1131, False],\n     [982, True],\n     [895, True],\n     [828, False]]],\n   [10, 20, 30, 20, 10, 20, 30, 20]],\n  ['regression: scenario 3',\n   [{'min_pos': 15, 'max_pos': 80, 'co2_low': 600, 'co2_high': 1000},\n    [[1300, False],\n     [1254, True],\n     [1354, True],\n     [1400, False],\n     [1471, True],\n     [1498, True],\n     [1500, False],\n     [1488, True],\n     [1500, False],\n     [1500, True],\n     [1500, False],\n     [1464, True]]],\n   [0, 10, 20, 10, 20, 30, 20, 30, 20, 30, 20, 30]],\n  ['regression: scenario 4',\n   [{'min_pos': 10, 'max_pos': 100, 'co2_low': 700, 'co2_high': 1000},\n    [[802, True],\n     [856, True],\n     [954, True],\n     [853, True],\n     [816, True],\n     [847, False],\n     [865, True],\n     [741, True],\n     [680, True],\n     [592, True],\n     [485, True]]],\n   [10, 20, 30, 40, 45, 35, 45, 35, 25, 15, 10]]],\n [['regression: crowd arrives',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, False],\n     [1500, False]]],\n   [10, 20, 30, 40, 50, 60, 70, 80, 80, 70, 60]],\n  ['regression: scenario 1',\n   [{'min_pos': 20, 'max_pos': 100, 'co2_low': 600, 'co2_high': 1200},\n    [[631, True],\n     [545, True],\n     [465, True],\n     [503, True],\n     [568, True],\n     [550, True],\n     [450, False],\n     [459, True],\n     [434, True],\n     [539, True],\n     [480, True],\n     [462, False],\n     [400, True],\n     [400, True]]],\n   [10, 20, 20, 20, 20, 20, 10, 20, 20, 20, 20, 10, 20, 20]],\n  ['regression: occupied day',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[650, True],\n     [650, True],\n     [900, True],\n     [900, True],\n     [900, True],\n     [900, True],\n     [1300, True],\n     [1300, False]]],\n   [10, 20, 30, 40, 50, 50, 60, 50]],\n  ['control: moderate co2',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[800, True], [800, True], [800, True], [800, True], [800, True], [750, True], [750, True]]],\n   [10, 20, 30, 35, 35, 28, 28]],\n  ['regression: unoccupied high co2',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[1200, False], [1200, False], [1200, True]]],\n   [0, 0, 10]],\n  ['control: scenario 2',\n   [{'min_pos': 15, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1000},\n    [[775, True],\n     [743, True],\n     [851, True],\n     [853, True],\n     [893, True],\n     [872, True],\n     [870, True],\n     [781, False],\n     [813, True],\n     [851, True],\n     [955, True]]],\n   [10, 20, 30, 40, 50, 52, 52, 42, 39, 48, 58]],\n  ['regression: scenario 3',\n   [{'min_pos': 10, 'max_pos': 100, 'co2_low': 700, 'co2_high': 1200},\n    [[1109, True],\n     [1033, False],\n     [1170, False],\n     [1235, True],\n     [1208, True],\n     [1230, True],\n     [1178, True],\n     [1182, True],\n     [1206, False],\n     [1261, True],\n     [1328, True],\n     [1474, True]]],\n   [10, 0, 0, 10, 20, 30, 40, 50, 40, 50, 60, 70]],\n  ['regression: scenario 4',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 600, 'co2_high': 1200},\n    [[1028, True],\n     [998, True],\n     [1129, True],\n     [1164, True],\n     [1200, True],\n     [1276, False],\n     [1335, True],\n     [1192, True],\n     [1105, True],\n     [1194, True],\n     [1207, True]]],\n   [10, 20, 30, 40, 50, 40, 50, 60, 70, 79, 80]]],\n [['regression: unoccupied high co2',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[1200, False], [1200, False], [1200, True]]],\n   [0, 0, 10]],\n  ['regression: scenario 4',\n   [{'min_pos': 10, 'max_pos': 60, 'co2_low': 600, 'co2_high': 1000},\n    [[675, True],\n     [548, False],\n     [502, True],\n     [455, False],\n     [400, True],\n     [462, True],\n     [400, True],\n     [400, True],\n     [400, True],\n     [402, False],\n     [447, True]]],\n   [10, 0, 10, 0, 10, 10, 10, 10, 10, 0, 10]],\n  ['regression: occupied day',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[650, True],\n     [650, True],\n     [900, True],\n     [900, True],\n     [900, True],\n     [900, True],\n     [1300, True],\n     [1300, False]]],\n   [10, 20, 30, 40, 50, 50, 60, 50]],\n  ['regression: crowd arrives',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, False],\n     [1500, False]]],\n   [10, 20, 30, 40, 50, 60, 70, 80, 80, 70, 60]],\n  ['control: moderate co2',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[800, True], [800, True], [800, True], [800, True], [800, True], [750, True], [750, True]]],\n   [10, 20, 30, 35, 35, 28, 28]],\n  ['regression: scenario 1',\n   [{'min_pos': 10, 'max_pos': 60, 'co2_low': 700, 'co2_high': 1000},\n    [[523, True],\n     [506, True],\n     [620, False],\n     [668, True],\n     [557, True],\n     [453, True],\n     [400, True],\n     [400, True],\n     [409, True],\n     [455, False],\n     [443, False],\n     [561, True]]],\n   [10, 10, 0, 10, 10, 10, 10, 10, 10, 0, 0, 10]],\n  ['regression: scenario 2',\n   [{'min_pos': 20, 'max_pos': 60, 'co2_low': 600, 'co2_high': 1000},\n    [[640, True],\n     [668, False],\n     [658, True],\n     [602, False],\n     [640, False],\n     [525, False],\n     [604, True],\n     [456, True],\n     [591, True],\n     [611, True]]],\n   [10, 0, 10, 0, 0, 0, 10, 20, 20, 21]],\n  ['regression: scenario 3',\n   [{'min_pos': 20, 'max_pos': 60, 'co2_low': 700, 'co2_high': 1000},\n    [[1018, True],\n     [1052, True],\n     [988, True],\n     [1071, True],\n     [1109, True],\n     [1124, True],\n     [1196, True],\n     [1221, False],\n     [1203, True]]],\n   [10, 20, 30, 40, 50, 60, 60, 50, 60]]],\n [['regression: scenario 1',\n   [{'min_pos': 15, 'max_pos': 60, 'co2_low': 700, 'co2_high': 1200},\n    [[1121, True],\n     [1144, True],\n     [1172, True],\n     [1223, True],\n     [1138, True],\n     [1273, True],\n     [1319, True],\n     [1227, False],\n     [1253, True]]],\n   [10, 20, 30, 40, 50, 60, 60, 50, 60]],\n  ['regression: scenario 8',\n   [{'min_pos': 20, 'max_pos': 100, 'co2_low': 700, 'co2_high': 1200},\n    [[1134, False],\n     [1275, True],\n     [1185, True],\n     [1223, True],\n     [1341, True],\n     [1446, True],\n     [1500, True],\n     [1466, True],\n     [1500, False]]],\n   [0, 10, 20, 30, 40, 50, 60, 70, 60]],\n  ['regression: occupied day',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[650, True],\n     [650, True],\n     [900, True],\n     [900, True],\n     [900, True],\n     [900, True],\n     [1300, True],\n     [1300, False]]],\n   [10, 20, 30, 40, 50, 50, 60, 50]],\n  ['regression: crowd arrives',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, False],\n     [1500, False]]],\n   [10, 20, 30, 40, 50, 60, 70, 80, 80, 70, 60]],\n  ['control: moderate co2',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[800, True], [800, True], [800, True], [800, True], [800, True], [750, True], [750, True]]],\n   [10, 20, 30, 35, 35, 28, 28]],\n  ['regression: unoccupied high co2',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[1200, False], [1200, False], [1200, True]]],\n   [0, 0, 10]],\n  ['regression: scenario 2',\n   [{'min_pos': 20, 'max_pos': 60, 'co2_low': 600, 'co2_high': 1200},\n    [[570, True],\n     [539, True],\n     [432, True],\n     [498, True],\n     [536, True],\n     [559, True],\n     [607, True],\n     [706, False],\n     [703, False],\n     [767, True],\n     [618, False],\n     [742, False],\n     [796, True]]],\n   [10, 20, 20, 20, 20, 20, 20, 10, 0, 10, 0, 0, 10]],\n  ['regression: scenario 3',\n   [{'min_pos': 20, 'max_pos': 60, 'co2_low': 600, 'co2_high': 1000},\n    [[853, True],\n     [828, True],\n     [845, True],\n     [890, False],\n     [973, True],\n     [895, True],\n     [751, True],\n     [855, True],\n     [839, False],\n     [909, True],\n     [1031, True],\n     [926, True],\n     [1032, True]]],\n   [10, 20, 30, 20, 30, 40, 35, 45, 35, 45, 55, 53, 60]]],\n [['regression: scenario 2',\n   [{'min_pos': 15, 'max_pos': 100, 'co2_low': 700, 'co2_high': 1000},\n    [[788, True],\n     [835, True],\n     [980, True],\n     [906, False],\n     [1052, True],\n     [960, False],\n     [1028, True],\n     [1053, False],\n     [1100, True],\n     [1140, False]]],\n   [10, 20, 30, 20, 30, 20, 30, 20, 30, 20]],\n  ['regression: scenario 9',\n   [{'min_pos': 15, 'max_pos': 80, 'co2_low': 600, 'co2_high': 1000},\n    [[1157, False],\n     [1218, True],\n     [1323, True],\n     [1229, False],\n     [1145, True],\n     [1200, True],\n     [1197, False],\n     [1302, True]]],\n   [0, 10, 20, 10, 20, 30, 20, 30]],\n  ['regression: occupied day',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[650, True],\n     [650, True],\n     [900, True],\n     [900, True],\n     [900, True],\n     [900, True],\n     [1300, True],\n     [1300, False]]],\n   [10, 20, 30, 40, 50, 50, 60, 50]],\n  ['regression: crowd arrives',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, True],\n     [1500, False],\n     [1500, False]]],\n   [10, 20, 30, 40, 50, 60, 70, 80, 80, 70, 60]],\n  ['control: moderate co2',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[800, True], [800, True], [800, True], [800, True], [800, True], [750, True], [750, True]]],\n   [10, 20, 30, 35, 35, 28, 28]],\n  ['regression: unoccupied high co2',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1100},\n    [[1200, False], [1200, False], [1200, True]]],\n   [0, 0, 10]],\n  ['regression: scenario 1',\n   [{'min_pos': 15, 'max_pos': 80, 'co2_low': 700, 'co2_high': 1200},\n    [[1383, True],\n     [1500, True],\n     [1500, True],\n     [1483, True],\n     [1492, True],\n     [1500, False],\n     [1500, True],\n     [1500, True],\n     [1500, False],\n     [1465, True],\n     [1443, False],\n     [1458, False],\n     [1430, True]]],\n   [10, 20, 30, 40, 50, 40, 50, 60, 50, 60, 50, 40, 50]],\n  ['regression: scenario 3',\n   [{'min_pos': 20, 'max_pos': 100, 'co2_low': 600, 'co2_high': 1200},\n    [[1068, True],\n     [969, True],\n     [993, True],\n     [1093, True],\n     [1019, True],\n     [1021, True],\n     [1037, False],\n     [990, True],\n     [876, False],\n     [997, True],\n     [984, True],\n     [903, False],\n     [822, False]]],\n   [10, 20, 30, 40, 50, 60, 50, 60, 50, 60, 70, 60, 50]]]]\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-co2-demand-ventilation-unoccupied-target","generated_at":"2026-09-29T14:51:48.511651+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.","repair":"The unoccupied target is 0%.","root_cause":"The unoccupied branch is missing, so CO2 drives the target regardless of occupancy.","sha256":"ec084b091d86b164ddf5096b32bb3e8beab7099eecdaa2a714439e6a8bff9be9","title":"DCV ventilates an unoccupied space from CO2 readings · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":43.901,"exit_code":1,"observations":[{"actual":[10,20,30,40,50,50,60,50],"check":"regression: occupied day","expected":[10,20,30,40,50,50,60,50],"passed":true},{"actual":[10,20,30],"check":"regression: unoccupied high co2","expected":[0,0,10],"passed":false},{"actual":[10,20,30,40,50,60,70,80,80,70,60],"check":"regression: crowd arrives","expected":[10,20,30,40,50,60,70,80,80,70,60],"passed":true},{"actual":[10,20,30,35,35,28,28],"check":"control: moderate co2","expected":[10,20,30,35,35,28,28],"passed":true},{"actual":[10,20,30,40,48,54,64,72],"check":"control: scenario 1","expected":[10,20,30,40,48,54,64,72],"passed":true},{"actual":[10,20,30,20,10,20,30,20],"check":"regression: scenario 2","expected":[10,20,30,20,10,20,30,20],"passed":true},{"actual":[10,20,30,20,30,40,30,40,30,40,30,40],"check":"regression: scenario 3","expected":[0,10,20,10,20,30,20,30,20,30,20,30],"passed":false},{"actual":[10,20,30,40,45,35,45,35,25,15,10],"check":"regression: scenario 4","expected":[10,20,30,40,45,35,45,35,25,15,10],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: occupied day\", \"actual\": [10, 20, 30, 40, 50, 50, 60, 50], \"expected\": [10, 20, 30, 40, 50, 50, 60, 50], \"passed\": true}, {\"check\": \"regression: unoccupied high co2\", \"actual\": [10, 20, 30], \"expected\": [0, 0, 10], \"passed\": false}, {\"check\": \"regression: crowd arrives\", \"actual\": [10, 20, 30, 40, 50, 60, 70, 80, 80, 70, 60], \"expected\": [10, 20, 30, 40, 50, 60, 70, 80, 80, 70, 60], \"passed\": true}, {\"check\": \"control: moderate co2\", \"actual\": [10, 20, 30, 35, 35, 28, 28], \"expected\": [10, 20, 30, 35, 35, 28, 28], \"passed\": true}, {\"check\": \"control: scenario 1\", \"actual\": [10, 20, 30, 40, 48, 54, 64, 72], \"expected\": [10, 20, 30, 40, 48, 54, 64, 72], \"passed\": true}, {\"check\": \"regression: scenario 2\", \"actual\": [10, 20, 30, 20, 10, 20, 30, 20], \"expected\": [10, 20, 30, 20, 10, 20, 30, 20], \"passed\": true}, {\"check\": \"regression: scenario 3\", \"actual\": [10, 20, 30, 20, 30, 40, 30, 40, 30, 40, 30, 40], \"expected\": [0, 10, 20, 10, 20, 30, 20, 30, 20, 30, 20, 30], \"passed\": false}, {\"check\": \"regression: scenario 4\", \"actual\": [10, 20, 30, 40, 45, 35, 45, 35, 25, 15, 10], \"expected\": [10, 20, 30, 40, 45, 35, 45, 35, 25, 15, 10], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":42.413,"exit_code":1,"observations":[{"actual":[10,20,30,40,50,50,60,70],"check":"regression: occupied day","expected":[10,20,30,40,50,50,60,50],"passed":false},{"actual":[10,20,30],"check":"regression: unoccupied high co2","expected":[0,0,10],"passed":false},{"actual":[10,20,30,40,50,60,70,80,80,80,80],"check":"regression: crowd arrives","expected":[10,20,30,40,50,60,70,80,80,70,60],"passed":false},{"actual":[10,20,30,35,35,28,28],"check":"control: moderate co2","expected":[10,20,30,35,35,28,28],"passed":true},{"actual":[10,20,30,40,48,54,64,72],"check":"control: scenario 1","expected":[10,20,30,40,48,54,64,72],"passed":true},{"actual":[10,20,30,40,50,57,47,37],"check":"regression: scenario 2","expected":[10,20,30,20,10,20,30,20],"passed":false},{"actual":[10,20,30,40,50,60,70,80,80,80,80,80],"check":"regression: scenario 3","expected":[0,10,20,10,20,30,20,30,20,30,20,30],"passed":false},{"actual":[10,20,30,40,45,54,60,50,40,30,20],"check":"regression: scenario 4","expected":[10,20,30,40,45,35,45,35,25,15,10],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: occupied day\", \"actual\": [10, 20, 30, 40, 50, 50, 60, 70], \"expected\": [10, 20, 30, 40, 50, 50, 60, 50], \"passed\": false}, {\"check\": \"regression: unoccupied high co2\", \"actual\": [10, 20, 30], \"expected\": [0, 0, 10], \"passed\": false}, {\"check\": \"regression: crowd arrives\", \"actual\": [10, 20, 30, 40, 50, 60, 70, 80, 80, 80, 80], \"expected\": [10, 20, 30, 40, 50, 60, 70, 80, 80, 70, 60], \"passed\": false}, {\"check\": \"control: moderate co2\", \"actual\": [10, 20, 30, 35, 35, 28, 28], \"expected\": [10, 20, 30, 35, 35, 28, 28], \"passed\": true}, {\"check\": \"control: scenario 1\", \"actual\": [10, 20, 30, 40, 48, 54, 64, 72], \"expected\": [10, 20, 30, 40, 48, 54, 64, 72], \"passed\": true}, {\"check\": \"regression: scenario 2\", \"actual\": [10, 20, 30, 40, 50, 57, 47, 37], \"expected\": [10, 20, 30, 20, 10, 20, 30, 20], \"passed\": false}, {\"check\": \"regression: scenario 3\", \"actual\": [10, 20, 30, 40, 50, 60, 70, 80, 80, 80, 80, 80], \"expected\": [0, 10, 20, 10, 20, 30, 20, 30, 20, 30, 20, 30], \"passed\": false}, {\"check\": \"regression: scenario 4\", \"actual\": [10, 20, 30, 40, 45, 54, 60, 50, 40, 30, 20], \"expected\": [10, 20, 30, 40, 45, 35, 45, 35, 25, 15, 10], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":46.022,"exit_code":0,"observations":[{"actual":[10,20,30,40,50,50,60,50],"check":"regression: occupied day","expected":[10,20,30,40,50,50,60,50],"passed":true},{"actual":[0,0,10],"check":"regression: unoccupied high co2","expected":[0,0,10],"passed":true},{"actual":[10,20,30,40,50,60,70,80,80,70,60],"check":"regression: crowd arrives","expected":[10,20,30,40,50,60,70,80,80,70,60],"passed":true},{"actual":[10,20,30,35,35,28,28],"check":"control: moderate co2","expected":[10,20,30,35,35,28,28],"passed":true},{"actual":[10,20,30,40,48,54,64,72],"check":"control: scenario 1","expected":[10,20,30,40,48,54,64,72],"passed":true},{"actual":[10,20,30,20,10,20,30,20],"check":"regression: scenario 2","expected":[10,20,30,20,10,20,30,20],"passed":true},{"actual":[0,10,20,10,20,30,20,30,20,30,20,30],"check":"regression: scenario 3","expected":[0,10,20,10,20,30,20,30,20,30,20,30],"passed":true},{"actual":[10,20,30,40,45,35,45,35,25,15,10],"check":"regression: scenario 4","expected":[10,20,30,40,45,35,45,35,25,15,10],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: occupied day\", \"actual\": [10, 20, 30, 40, 50, 50, 60, 50], \"expected\": [10, 20, 30, 40, 50, 50, 60, 50], \"passed\": true}, {\"check\": \"regression: unoccupied high co2\", \"actual\": [0, 0, 10], \"expected\": [0, 0, 10], \"passed\": true}, {\"check\": \"regression: crowd arrives\", \"actual\": [10, 20, 30, 40, 50, 60, 70, 80, 80, 70, 60], \"expected\": [10, 20, 30, 40, 50, 60, 70, 80, 80, 70, 60], \"passed\": true}, {\"check\": \"control: moderate co2\", \"actual\": [10, 20, 30, 35, 35, 28, 28], \"expected\": [10, 20, 30, 35, 35, 28, 28], \"passed\": true}, {\"check\": \"control: scenario 1\", \"actual\": [10, 20, 30, 40, 48, 54, 64, 72], \"expected\": [10, 20, 30, 40, 48, 54, 64, 72], \"passed\": true}, {\"check\": \"regression: scenario 2\", \"actual\": [10, 20, 30, 20, 10, 20, 30, 20], \"expected\": [10, 20, 30, 20, 10, 20, 30, 20], \"passed\": true}, {\"check\": \"regression: scenario 3\", \"actual\": [0, 10, 20, 10, 20, 30, 20, 30, 20, 30, 20, 30], \"expected\": [0, 10, 20, 10, 20, 30, 20, 30, 20, 30, 20, 30], \"passed\": true}, {\"check\": \"regression: scenario 4\", \"actual\": [10, 20, 30, 40, 45, 35, 45, 35, 25, 15, 10], \"expected\": [10, 20, 30, 40, 45, 35, 45, 35, 25, 15, 10], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}