{"abstract":"The damper slams open when a meeting room fills, upsetting mixed-air temperature.","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":"Adding 10 points without stopping at the target overshoots it.","family":"w2-hvac-thermostat-control-co2-demand-ventilation-opening-rate-limit","id":"FA-92716","implementations":{"attempt":{"sha256":"3b44183ef54cd11ecbd1c168f6dae9e190a6af42b6653979995920746c8d353c","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 = 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: 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: 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: 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': 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 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: 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: 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': 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: 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: 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 7',\n   [{'min_pos': 15, 'max_pos': 100, 'co2_low': 700, 'co2_high': 1200},\n    [[675, True],\n     [553, False],\n     [630, True],\n     [746, True],\n     [799, False],\n     [713, True],\n     [783, True],\n     [718, True]]],\n   [10, 0, 10, 20, 10, 17, 27, 18]],\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  ['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 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: 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 6',\n   [{'min_pos': 15, 'max_pos': 60, 'co2_low': 600, 'co2_high': 1200},\n    [[1241, True],\n     [1251, True],\n     [1129, True],\n     [1007, True],\n     [865, True],\n     [796, True],\n     [856, True],\n     [908, True],\n     [822, True],\n     [747, True],\n     [773, True],\n     [762, True],\n     [674, True]]],\n   [10, 20, 30, 40, 35, 30, 34, 38, 32, 26, 28, 27, 21]],\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  ['regression: 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': 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 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 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 10',\n   [{'min_pos': 15, 'max_pos': 60, 'co2_low': 700, 'co2_high': 1200},\n    [[1256, False],\n     [1206, True],\n     [1065, True],\n     [1046, True],\n     [1037, True],\n     [1140, True],\n     [1055, False],\n     [1023, True],\n     [930, True],\n     [795, True],\n     [685, False]]],\n   [0, 10, 20, 30, 40, 50, 40, 44, 36, 26, 16]],\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  ['regression: 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': 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 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":"9009b0f53d4269fd89ee6cf1a2ff41408e46e66b330a9c1bc1c5154e962bdb0e","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 = target\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: 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: 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: 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': 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 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: 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: 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': 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: 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: 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 7',\n   [{'min_pos': 15, 'max_pos': 100, 'co2_low': 700, 'co2_high': 1200},\n    [[675, True],\n     [553, False],\n     [630, True],\n     [746, True],\n     [799, False],\n     [713, True],\n     [783, True],\n     [718, True]]],\n   [10, 0, 10, 20, 10, 17, 27, 18]],\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  ['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 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: 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 6',\n   [{'min_pos': 15, 'max_pos': 60, 'co2_low': 600, 'co2_high': 1200},\n    [[1241, True],\n     [1251, True],\n     [1129, True],\n     [1007, True],\n     [865, True],\n     [796, True],\n     [856, True],\n     [908, True],\n     [822, True],\n     [747, True],\n     [773, True],\n     [762, True],\n     [674, True]]],\n   [10, 20, 30, 40, 35, 30, 34, 38, 32, 26, 28, 27, 21]],\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  ['regression: 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': 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 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 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 10',\n   [{'min_pos': 15, 'max_pos': 60, 'co2_low': 700, 'co2_high': 1200},\n    [[1256, False],\n     [1206, True],\n     [1065, True],\n     [1046, True],\n     [1037, True],\n     [1140, True],\n     [1055, False],\n     [1023, True],\n     [930, True],\n     [795, True],\n     [685, False]]],\n   [0, 10, 20, 30, 40, 50, 40, 44, 36, 26, 16]],\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  ['regression: 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': 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 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":"baef580bf2545d8babb030373b0c98f43f580e4261abddbdee46dd98dd8208e2","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: 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: 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: 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': 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 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: 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: 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': 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: 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: 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 7',\n   [{'min_pos': 15, 'max_pos': 100, 'co2_low': 700, 'co2_high': 1200},\n    [[675, True],\n     [553, False],\n     [630, True],\n     [746, True],\n     [799, False],\n     [713, True],\n     [783, True],\n     [718, True]]],\n   [10, 0, 10, 20, 10, 17, 27, 18]],\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  ['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 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: 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 6',\n   [{'min_pos': 15, 'max_pos': 60, 'co2_low': 600, 'co2_high': 1200},\n    [[1241, True],\n     [1251, True],\n     [1129, True],\n     [1007, True],\n     [865, True],\n     [796, True],\n     [856, True],\n     [908, True],\n     [822, True],\n     [747, True],\n     [773, True],\n     [762, True],\n     [674, True]]],\n   [10, 20, 30, 40, 35, 30, 34, 38, 32, 26, 28, 27, 21]],\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  ['regression: 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': 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 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 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 10',\n   [{'min_pos': 15, 'max_pos': 60, 'co2_low': 700, 'co2_high': 1200},\n    [[1256, False],\n     [1206, True],\n     [1065, True],\n     [1046, True],\n     [1037, True],\n     [1140, True],\n     [1055, False],\n     [1023, True],\n     [930, True],\n     [795, True],\n     [685, False]]],\n   [0, 10, 20, 30, 40, 50, 40, 44, 36, 26, 16]],\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  ['regression: 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': 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 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-opening-rate-limit","generated_at":"2026-09-29T14:51:48.385824+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":"Open by at most 10 points per sample.","root_cause":"The opening path assigns the target without a rate limit.","sha256":"0eb3f0d994e04c776005b29042862b803341d36a6c82c5f9208d0dea63aca876","title":"DCV damper opens to target in a single step · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":46.86,"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,40,35,28,28],"check":"regression: moderate co2","expected":[10,20,30,35,35,28,28],"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":[0,0,10],"check":"regression: unoccupied high co2","expected":[0,0,10],"passed":true},{"actual":[10,20,30,40,50,60,70,80],"check":"regression: scenario 1","expected":[10,20,30,40,48,54,64,72],"passed":false},{"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,50,40,50,40,30,20,10],"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, 50], \"expected\": [10, 20, 30, 40, 50, 50, 60, 50], \"passed\": true}, {\"check\": \"regression: moderate co2\", \"actual\": [10, 20, 30, 40, 35, 28, 28], \"expected\": [10, 20, 30, 35, 35, 28, 28], \"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\": \"regression: unoccupied high co2\", \"actual\": [0, 0, 10], \"expected\": [0, 0, 10], \"passed\": true}, {\"check\": \"regression: scenario 1\", \"actual\": [10, 20, 30, 40, 50, 60, 70, 80], \"expected\": [10, 20, 30, 40, 48, 54, 64, 72], \"passed\": false}, {\"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, 50, 40, 50, 40, 30, 20, 10], \"expected\": [10, 20, 30, 40, 45, 35, 45, 35, 25, 15, 10], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":47.066,"exit_code":1,"observations":[{"actual":[20,20,50,50,50,50,80,70],"check":"regression: occupied day","expected":[10,20,30,40,50,50,60,50],"passed":false},{"actual":[35,35,35,35,35,28,28],"check":"regression: moderate co2","expected":[10,20,30,35,35,28,28],"passed":false},{"actual":[80,80,80,80,80,80,80,80,80,70,60],"check":"regression: crowd arrives","expected":[10,20,30,40,50,60,70,80,80,70,60],"passed":false},{"actual":[0,0,80],"check":"regression: unoccupied high co2","expected":[0,0,10],"passed":false},{"actual":[20,20,31,43,48,54,68,72],"check":"regression: scenario 1","expected":[10,20,30,40,48,54,64,72],"passed":false},{"actual":[60,60,60,50,40,57,47,37],"check":"regression: scenario 2","expected":[10,20,30,20,10,20,30,20],"passed":false},{"actual":[0,80,80,70,80,80,70,80,70,80,70,80],"check":"regression: scenario 3","expected":[0,10,20,10,20,30,20,30,20,30,20,30],"passed":false},{"actual":[41,57,86,76,66,56,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\": [20, 20, 50, 50, 50, 50, 80, 70], \"expected\": [10, 20, 30, 40, 50, 50, 60, 50], \"passed\": false}, {\"check\": \"regression: moderate co2\", \"actual\": [35, 35, 35, 35, 35, 28, 28], \"expected\": [10, 20, 30, 35, 35, 28, 28], \"passed\": false}, {\"check\": \"regression: crowd arrives\", \"actual\": [80, 80, 80, 80, 80, 80, 80, 80, 80, 70, 60], \"expected\": [10, 20, 30, 40, 50, 60, 70, 80, 80, 70, 60], \"passed\": false}, {\"check\": \"regression: unoccupied high co2\", \"actual\": [0, 0, 80], \"expected\": [0, 0, 10], \"passed\": false}, {\"check\": \"regression: scenario 1\", \"actual\": [20, 20, 31, 43, 48, 54, 68, 72], \"expected\": [10, 20, 30, 40, 48, 54, 64, 72], \"passed\": false}, {\"check\": \"regression: scenario 2\", \"actual\": [60, 60, 60, 50, 40, 57, 47, 37], \"expected\": [10, 20, 30, 20, 10, 20, 30, 20], \"passed\": false}, {\"check\": \"regression: scenario 3\", \"actual\": [0, 80, 80, 70, 80, 80, 70, 80, 70, 80, 70, 80], \"expected\": [0, 10, 20, 10, 20, 30, 20, 30, 20, 30, 20, 30], \"passed\": false}, {\"check\": \"regression: scenario 4\", \"actual\": [41, 57, 86, 76, 66, 56, 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":42.757,"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":[10,20,30,35,35,28,28],"check":"regression: moderate co2","expected":[10,20,30,35,35,28,28],"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":[0,0,10],"check":"regression: unoccupied high co2","expected":[0,0,10],"passed":true},{"actual":[10,20,30,40,48,54,64,72],"check":"regression: 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: moderate co2\", \"actual\": [10, 20, 30, 35, 35, 28, 28], \"expected\": [10, 20, 30, 35, 35, 28, 28], \"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\": \"regression: unoccupied high co2\", \"actual\": [0, 0, 10], \"expected\": [0, 0, 10], \"passed\": true}, {\"check\": \"regression: 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"}