{"abstract":"Moderate CO2 levels ventilate less than the minimum outdoor air position.","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":"Scaling by max_pos instead of the min-to-max range overshoots in the middle.","family":"w2-hvac-thermostat-control-co2-demand-ventilation-ramp-origin","id":"FA-92711","implementations":{"attempt":{"sha256":"3244c04e1a9cf159d45405660755657e1c4fc7d63179676f95173d3bedb22852","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']\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  ['control: 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: 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  ['control: 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  ['control: 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: 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 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  ['control: 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: 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  ['control: 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: 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 5',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 600, 'co2_high': 1000},\n    [[634, True],\n     [750, True],\n     [806, True],\n     [753, True],\n     [817, False],\n     [708, True],\n     [649, True],\n     [630, True],\n     [579, True]]],\n   [10, 20, 30, 40, 30, 36, 27, 25, 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: 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  ['control: 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  ['control: 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 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 5',\n   [{'min_pos': 10, 'max_pos': 80, 'co2_low': 600, 'co2_high': 1000},\n    [[515, True],\n     [400, True],\n     [400, True],\n     [516, True],\n     [637, True],\n     [681, True],\n     [818, True],\n     [899, False],\n     [844, True]]],\n   [10, 10, 10, 10, 16, 24, 34, 24, 34]],\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: 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  ['control: 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': 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 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 5',\n   [{'min_pos': 20, 'max_pos': 60, 'co2_low': 600, 'co2_high': 1200},\n    [[926, True],\n     [1018, True],\n     [890, True],\n     [999, True],\n     [942, True],\n     [808, True],\n     [889, True],\n     [876, True],\n     [853, True],\n     [951, True],\n     [843, True],\n     [701, True]]],\n   [10, 20, 30, 40, 43, 34, 39, 38, 37, 43, 36, 27]],\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  ['control: 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  ['control: 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': 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  ['control: 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]]]]\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":"2787990e41b38f6c1e1c6b580228924ba29e34b07a1e9bcf75e0ab507a0debf1","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 = (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  ['control: 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: 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  ['control: 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  ['control: 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: 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 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  ['control: 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: 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  ['control: 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: 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 5',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 600, 'co2_high': 1000},\n    [[634, True],\n     [750, True],\n     [806, True],\n     [753, True],\n     [817, False],\n     [708, True],\n     [649, True],\n     [630, True],\n     [579, True]]],\n   [10, 20, 30, 40, 30, 36, 27, 25, 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: 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  ['control: 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  ['control: 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 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 5',\n   [{'min_pos': 10, 'max_pos': 80, 'co2_low': 600, 'co2_high': 1000},\n    [[515, True],\n     [400, True],\n     [400, True],\n     [516, True],\n     [637, True],\n     [681, True],\n     [818, True],\n     [899, False],\n     [844, True]]],\n   [10, 10, 10, 10, 16, 24, 34, 24, 34]],\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: 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  ['control: 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': 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 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 5',\n   [{'min_pos': 20, 'max_pos': 60, 'co2_low': 600, 'co2_high': 1200},\n    [[926, True],\n     [1018, True],\n     [890, True],\n     [999, True],\n     [942, True],\n     [808, True],\n     [889, True],\n     [876, True],\n     [853, True],\n     [951, True],\n     [843, True],\n     [701, True]]],\n   [10, 20, 30, 40, 43, 34, 39, 38, 37, 43, 36, 27]],\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  ['control: 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  ['control: 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': 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  ['control: 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]]]]\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":"18b6f56a5792e594404579f93672ccc19076459d9cccdccd5f2d0b312460879f","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  ['control: 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: 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  ['control: 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  ['control: 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: 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 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  ['control: 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: 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  ['control: 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: 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 5',\n   [{'min_pos': 20, 'max_pos': 80, 'co2_low': 600, 'co2_high': 1000},\n    [[634, True],\n     [750, True],\n     [806, True],\n     [753, True],\n     [817, False],\n     [708, True],\n     [649, True],\n     [630, True],\n     [579, True]]],\n   [10, 20, 30, 40, 30, 36, 27, 25, 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: 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  ['control: 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  ['control: 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 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 5',\n   [{'min_pos': 10, 'max_pos': 80, 'co2_low': 600, 'co2_high': 1000},\n    [[515, True],\n     [400, True],\n     [400, True],\n     [516, True],\n     [637, True],\n     [681, True],\n     [818, True],\n     [899, False],\n     [844, True]]],\n   [10, 10, 10, 10, 16, 24, 34, 24, 34]],\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: 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  ['control: 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': 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 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 5',\n   [{'min_pos': 20, 'max_pos': 60, 'co2_low': 600, 'co2_high': 1200},\n    [[926, True],\n     [1018, True],\n     [890, True],\n     [999, True],\n     [942, True],\n     [808, True],\n     [889, True],\n     [876, True],\n     [853, True],\n     [951, True],\n     [843, True],\n     [701, True]]],\n   [10, 20, 30, 40, 43, 34, 39, 38, 37, 43, 36, 27]],\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  ['control: 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  ['control: 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': 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  ['control: 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]]]]\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-ramp-origin","generated_at":"2026-09-29T14:51:48.352214+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":"Interpolate from min_pos at co2_low to max_pos at co2_high.","root_cause":"The linear reset omits the min_pos offset.","sha256":"0cfc4fe365bff7e86422fe31c22f69cb8473b57dd6a1ca0864b6ae277663612e","title":"DCV ramp starts from 0% instead of the minimum position · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":43.378,"exit_code":1,"observations":[{"actual":[10,20,30,40,50,60,70,60],"check":"regression: occupied day","expected":[10,20,30,40,50,50,60,50],"passed":false},{"actual":[10,20,30,40,40,30,30],"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":"control: crowd arrives","expected":[10,20,30,40,50,60,70,80,80,70,60],"passed":true},{"actual":[0,0,10],"check":"control: 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":"control: 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":"control: scenario 3","expected":[0,10,20,10,20,30,20,30,20,30,20,30],"passed":true},{"actual":[10,20,30,40,49,39,49,39,29,19,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, 60, 70, 60], \"expected\": [10, 20, 30, 40, 50, 50, 60, 50], \"passed\": false}, {\"check\": \"regression: moderate co2\", \"actual\": [10, 20, 30, 40, 40, 30, 30], \"expected\": [10, 20, 30, 35, 35, 28, 28], \"passed\": false}, {\"check\": \"control: 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: 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\": \"control: scenario 2\", \"actual\": [10, 20, 30, 20, 10, 20, 30, 20], \"expected\": [10, 20, 30, 20, 10, 20, 30, 20], \"passed\": true}, {\"check\": \"control: 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, 49, 39, 49, 39, 29, 19, 10], \"expected\": [10, 20, 30, 40, 45, 35, 45, 35, 25, 15, 10], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.765,"exit_code":1,"observations":[{"actual":[10,20,30,30,30,30,40,30],"check":"regression: occupied day","expected":[10,20,30,40,50,50,60,50],"passed":false},{"actual":[10,15,15,15,15,8,8],"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":"control: crowd arrives","expected":[10,20,30,40,50,60,70,80,80,70,60],"passed":true},{"actual":[0,0,10],"check":"control: unoccupied high co2","expected":[0,0,10],"passed":true},{"actual":[10,20,11,21,28,34,44,52],"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":"control: 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":"control: scenario 3","expected":[0,10,20,10,20,30,20,30,20,30,20,30],"passed":true},{"actual":[10,20,30,40,35,25,35,25,15,10,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, 30, 30, 30, 40, 30], \"expected\": [10, 20, 30, 40, 50, 50, 60, 50], \"passed\": false}, {\"check\": \"regression: moderate co2\", \"actual\": [10, 15, 15, 15, 15, 8, 8], \"expected\": [10, 20, 30, 35, 35, 28, 28], \"passed\": false}, {\"check\": \"control: 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: unoccupied high co2\", \"actual\": [0, 0, 10], \"expected\": [0, 0, 10], \"passed\": true}, {\"check\": \"regression: scenario 1\", \"actual\": [10, 20, 11, 21, 28, 34, 44, 52], \"expected\": [10, 20, 30, 40, 48, 54, 64, 72], \"passed\": false}, {\"check\": \"control: scenario 2\", \"actual\": [10, 20, 30, 20, 10, 20, 30, 20], \"expected\": [10, 20, 30, 20, 10, 20, 30, 20], \"passed\": true}, {\"check\": \"control: 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, 35, 25, 35, 25, 15, 10, 10], \"expected\": [10, 20, 30, 40, 45, 35, 45, 35, 25, 15, 10], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":45.016,"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":"control: crowd arrives","expected":[10,20,30,40,50,60,70,80,80,70,60],"passed":true},{"actual":[0,0,10],"check":"control: 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":"control: 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":"control: 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\": \"control: 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: 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\": \"control: scenario 2\", \"actual\": [10, 20, 30, 20, 10, 20, 30, 20], \"expected\": [10, 20, 30, 20, 10, 20, 30, 20], \"passed\": true}, {\"check\": \"control: 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"}