{"abstract":"A shorted or open remote sensor drags the control temperature to an absurd value.","category":"HVAC thermostat control","checks":8,"contract":"Thermostat with remote room sensors; each sample is a list of [room, reading tenths F or None, occupied]. Readings outside 32.0-100.0 F or None are invalid. The control temperature is the mean of valid readings from occupied rooms, or of all valid readings if no occupied room has one, rounded half up to a tenth; if nothing is valid the previous control temperature is held (None initially). Return the control temperature per sample.","evaluation_group":"w2-hvac-thermostat-control-remote-sensor-averaging","failed_approach":"Checking only the lower limit still accepts open-circuit high readings.","family":"w2-hvac-thermostat-control-remote-sensor-averaging-sensor-range-check","id":"FA-92631","implementations":{"attempt":{"sha256":"2a3fc182c57b7efa2327573615ba261daf545e91c3881ba7f885b4f1cd74bfc1","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(samples):\n    last = None\n    out = []\n    for readings in samples:\n        valid = [(t, occ) for room, t, occ in readings if t is not None and t >= 320]\n        pool = [t for t, occ in valid if occ] or [t for t, occ in valid]\n        if pool:\n            last = (2 * sum(pool) + len(pool)) // (2 * len(pool))\n        out.append(last)\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: occupancy and faults',\n   [[[['liv', 700, True], ['bed', 680, False]],\n     [['liv', None, True], ['bed', 681, False], ['den', 690, False]],\n     [['liv', 1200, True]],\n     [['liv', 701, True], ['bed', 702, True]]]],\n   [700, 686, 686, 702]],\n  ['regression: shorted sensor',\n   [[[['a', 700, True], ['b', 5, True]], [['a', 1300, False], ['b', 690, False]]]],\n   [700, 690]],\n  ['control: first sample all invalid',\n   [[[['a', None, True]], [['a', 700, True]], [['a', None, False]]]],\n   [None, 700, 700]],\n  ['control: single occupied room',\n   [[[['a', 700, True], ['b', 650, False], ['c', 660, False]], [['a', 707, True], ['b', 704, True]]]],\n   [700, 706]],\n  ['control: scenario 1',\n   [[[['living', 611, False], ['bed', 799, True]],\n     [['living', 697, True]],\n     [['living', 697, False], ['bed', 609, True]],\n     [['living', 751, False], ['bed', 736, True], ['den', 616, True]],\n     [['living', 1100, False], ['bed', 686, True]],\n     [['living', 798, False], ['bed', 743, True], ['den', 646, False], ['office', 720, False]],\n     [['living', 668, False], ['bed', None, True], ['den', None, True], ['office', 795, False]]]],\n   [799, 697, 609, 676, 686, 743, 732]],\n  ['regression: scenario 2',\n   [[[['living', 602, False], ['bed', 665, False], ['den', 790, False], ['office', 677, False]],\n     [['living', 638, False]],\n     [['living', 602, False], ['bed', 750, True]],\n     [['living', None, True], ['bed', 250, False], ['den', 250, True]],\n     [['living', 744, True], ['bed', 711, True], ['den', 676, False], ['office', 640, True]],\n     [['living', 771, False], ['bed', 646, True]],\n     [['living', 608, False]],\n     [['living', 663, True], ['bed', 793, True], ['den', 250, True], ['office', 743, False]]]],\n   [684, 638, 750, 750, 698, 646, 608, 728]],\n  ['regression: scenario 3',\n   [[[['living', 677, True]],\n     [['living', 624, True], ['bed', 620, True]],\n     [['living', 605, True], ['bed', 250, False]],\n     [['living', 764, False]],\n     [['living', 612, False], ['bed', None, True], ['den', 664, True]],\n     [['living', None, True], ['bed', 250, False], ['den', 250, True]],\n     [['living', 745, True], ['bed', None, False]],\n     [['living', 665, True]]]],\n   [677, 622, 605, 764, 664, 664, 745, 665]],\n  ['regression: scenario 4',\n   [[[['living', 600, True]],\n     [['living', 742, True], ['bed', 607, False], ['den', 638, True], ['office', 791, True]],\n     [['living', 710, False], ['bed', 602, True], ['den', 716, False]],\n     [['living', 607, False], ['bed', 735, True], ['den', 739, False], ['office', 723, True]],\n     [['living', 621, True], ['bed', 625, False], ['den', 688, True], ['office', 627, False]],\n     [['living', 677, False], ['bed', 775, True]],\n     [['living', 1100, False], ['bed', None, False], ['den', 687, False]]]],\n   [600, 724, 602, 729, 655, 775, 687]]],\n [['regression: shorted sensor',\n   [[[['a', 700, True], ['b', 5, True]], [['a', 1300, False], ['b', 690, False]]]],\n   [700, 690]],\n  ['regression: scenario 4',\n   [[[['living', 713, False]],\n     [['living', 741, True], ['bed', 652, False], ['den', 796, False], ['office', 784, False]],\n     [['living', 756, True], ['bed', 687, True], ['den', 250, False], ['office', 657, False]],\n     [['living', 601, True], ['bed', 743, True], ['den', 250, True]],\n     [['living', 728, False]],\n     [['living', 605, False], ['bed', 766, True], ['den', 601, False]],\n     [['living', 748, True]],\n     [['living', 1100, True], ['bed', 622, False], ['den', 714, True], ['office', 644, True]],\n     [['living', 773, True]]]],\n   [713, 741, 722, 672, 728, 766, 748, 679, 773]],\n  ['regression: occupancy and faults',\n   [[[['liv', 700, True], ['bed', 680, False]],\n     [['liv', None, True], ['bed', 681, False], ['den', 690, False]],\n     [['liv', 1200, True]],\n     [['liv', 701, True], ['bed', 702, True]]]],\n   [700, 686, 686, 702]],\n  ['control: first sample all invalid',\n   [[[['a', None, True]], [['a', 700, True]], [['a', None, False]]]],\n   [None, 700, 700]],\n  ['control: single occupied room',\n   [[[['a', 700, True], ['b', 650, False], ['c', 660, False]], [['a', 707, True], ['b', 704, True]]]],\n   [700, 706]],\n  ['control: scenario 1',\n   [[[['living', 631, False], ['bed', None, True]],\n     [['living', 674, True], ['bed', 788, True]],\n     [['living', 629, False]],\n     [['living', 617, False], ['bed', 636, True], ['den', 622, True]],\n     [['living', 602, True], ['bed', 659, True], ['den', 604, False]],\n     [['living', 641, True], ['bed', 600, True]],\n     [['living', 781, True]],\n     [['living', 615, True], ['bed', 788, True], ['den', 658, True]]]],\n   [631, 731, 629, 629, 631, 621, 781, 687]],\n  ['control: scenario 2',\n   [[[['living', 675, True], ['bed', 724, False], ['den', 793, True]],\n     [['living', 711, False], ['bed', 720, False]],\n     [['living', 722, False], ['bed', 1100, False], ['den', 606, False], ['office', 625, True]],\n     [['living', 657, False], ['bed', 619, True], ['den', 800, True], ['office', 629, True]],\n     [['living', 765, True], ['bed', 726, True]],\n     [['living', 785, False], ['bed', 626, False]]]],\n   [734, 716, 625, 683, 746, 706]],\n  ['regression: scenario 3',\n   [[[['living', 795, False]],\n     [['living', 769, False], ['bed', 675, False]],\n     [['living', 640, False]],\n     [['living', None, False]],\n     [['living', None, False], ['bed', 790, True], ['den', 684, False], ['office', 789, True]],\n     [['living', 722, True], ['bed', 750, True], ['den', 250, True]],\n     [['living', 663, True], ['bed', 670, True]],\n     [['living', 628, False], ['bed', 687, False], ['den', 635, False]]]],\n   [795, 722, 640, 640, 790, 736, 667, 650]]],\n [['regression: scenario 1',\n   [[[['living', 627, False], ['bed', 693, True], ['den', 769, True], ['office', 704, True]],\n     [['living', 738, True], ['bed', 638, True]],\n     [['living', 760, True], ['bed', 696, True], ['den', 683, False]],\n     [['living', 771, False], ['bed', 1100, False]],\n     [['living', 686, True]],\n     [['living', 734, True]],\n     [['living', None, True], ['bed', 649, False], ['den', 767, False]],\n     [['living', 722, True]],\n     [['living', 686, True], ['bed', 715, False], ['den', 617, False], ['office', 250, False]],\n     [['living', 790, True]]]],\n   [722, 688, 728, 771, 686, 734, 708, 722, 686, 790]],\n  ['regression: scenario 2',\n   [[[['living', 663, False], ['bed', 781, True], ['den', 775, False], ['office', 722, True]],\n     [['living', 655, False]],\n     [['living', 777, False], ['bed', 790, True], ['den', 637, False], ['office', 682, False]],\n     [['living', 250, False], ['bed', 701, True], ['den', 745, True], ['office', 626, False]],\n     [['living', 619, False]],\n     [['living', 619, True], ['bed', 710, True]],\n     [['living', 732, False]],\n     [['living', 772, False]],\n     [['living', None, True], ['bed', 664, True], ['den', 728, True], ['office', 783, False]],\n     [['living', 1100, True], ['bed', 734, True], ['den', 657, False], ['office', 601, False]]]],\n   [752, 655, 790, 723, 619, 665, 732, 772, 696, 734]],\n  ['regression: occupancy and faults',\n   [[[['liv', 700, True], ['bed', 680, False]],\n     [['liv', None, True], ['bed', 681, False], ['den', 690, False]],\n     [['liv', 1200, True]],\n     [['liv', 701, True], ['bed', 702, True]]]],\n   [700, 686, 686, 702]],\n  ['regression: shorted sensor',\n   [[[['a', 700, True], ['b', 5, True]], [['a', 1300, False], ['b', 690, False]]]],\n   [700, 690]],\n  ['control: first sample all invalid',\n   [[[['a', None, True]], [['a', 700, True]], [['a', None, False]]]],\n   [None, 700, 700]],\n  ['control: single occupied room',\n   [[[['a', 700, True], ['b', 650, False], ['c', 660, False]], [['a', 707, True], ['b', 704, True]]]],\n   [700, 706]],\n  ['regression: scenario 3',\n   [[[['living', 740, True], ['bed', None, False], ['den', 718, True], ['office', 628, True]],\n     [['living', 687, True]],\n     [['living', 766, True], ['bed', 604, False], ['den', 725, False], ['office', 735, False]],\n     [['living', 788, False], ['bed', 698, False], ['den', 700, False], ['office', None, True]],\n     [['living', None, False], ['bed', 607, True], ['den', 754, False]],\n     [['living', 250, False], ['bed', 649, True], ['den', 666, False]],\n     [['living', None, True], ['bed', 785, True]],\n     [['living', 715, True], ['bed', 699, False], ['den', 1100, True]],\n     [['living', 605, False], ['bed', 735, False]]]],\n   [695, 687, 766, 729, 607, 649, 785, 715, 670]],\n  ['regression: scenario 4',\n   [[[['living', 647, True], ['bed', 693, False]],\n     [['living', None, False], ['bed', 1100, False], ['den', None, True], ['office', None, False]],\n     [['living', 791, False], ['bed', 250, False], ['den', 778, True]],\n     [['living', 650, False], ['bed', None, True]],\n     [['living', 1100, True], ['bed', 680, False], ['den', 250, False]],\n     [['living', 700, True], ['bed', 1100, True], ['den', 712, False]],\n     [['living', 662, True], ['bed', 670, True]]]],\n   [647, 647, 778, 650, 680, 700, 666]]],\n [['regression: scenario 4',\n   [[[['living', 614, False]],\n     [['living', 616, True], ['bed', None, True], ['den', 783, True]],\n     [['living', 250, True], ['bed', 250, True]],\n     [['living', None, True]],\n     [['living', 663, True]],\n     [['living', 656, True], ['bed', 250, True], ['den', 679, True]],\n     [['living', 799, True], ['bed', 707, True], ['den', 751, True]],\n     [['living', None, True]]]],\n   [614, 700, 700, 700, 663, 668, 752, 752]],\n  ['regression: scenario 7',\n   [[[['living', 776, True], ['bed', 1100, False], ['den', 734, False]],\n     [['living', 250, True], ['bed', 734, False], ['den', 775, True], ['office', 1100, False]],\n     [['living', 250, False], ['bed', 747, True], ['den', None, True]],\n     [['living', 622, True], ['bed', 623, False], ['den', 793, True]],\n     [['living', 728, True], ['bed', 708, True], ['den', None, False]],\n     [['living', 644, False]],\n     [['living', 765, True], ['bed', 650, True], ['den', 749, False], ['office', 1100, False]],\n     [['living', 672, False], ['bed', 769, True], ['den', 1100, True]],\n     [['living', 729, True], ['bed', None, False]],\n     [['living', 794, False], ['bed', 670, True]]]],\n   [776, 775, 747, 708, 718, 644, 708, 769, 729, 670]],\n  ['regression: occupancy and faults',\n   [[[['liv', 700, True], ['bed', 680, False]],\n     [['liv', None, True], ['bed', 681, False], ['den', 690, False]],\n     [['liv', 1200, True]],\n     [['liv', 701, True], ['bed', 702, True]]]],\n   [700, 686, 686, 702]],\n  ['regression: shorted sensor',\n   [[[['a', 700, True], ['b', 5, True]], [['a', 1300, False], ['b', 690, False]]]],\n   [700, 690]],\n  ['control: first sample all invalid',\n   [[[['a', None, True]], [['a', 700, True]], [['a', None, False]]]],\n   [None, 700, 700]],\n  ['control: single occupied room',\n   [[[['a', 700, True], ['b', 650, False], ['c', 660, False]], [['a', 707, True], ['b', 704, True]]]],\n   [700, 706]],\n  ['control: scenario 1',\n   [[[['living', 782, False], ['bed', 708, True], ['den', 678, True]],\n     [['living', 772, False], ['bed', 795, True]],\n     [['living', 744, True], ['bed', 616, True], ['den', 694, True]],\n     [['living', 790, False], ['bed', 733, True]],\n     [['living', 722, True], ['bed', 701, False]],\n     [['living', 699, False], ['bed', 636, False]]]],\n   [693, 795, 685, 733, 722, 668]],\n  ['regression: scenario 2',\n   [[[['living', 675, False], ['bed', 659, True], ['den', 738, False], ['office', 1100, False]],\n     [['living', 250, True], ['bed', 649, True]],\n     [['living', 604, True]],\n     [['living', 629, True], ['bed', None, True], ['den', 610, True]],\n     [['living', 633, False], ['bed', None, True], ['den', 778, True], ['office', 795, False]],\n     [['living', None, False]]]],\n   [659, 649, 604, 620, 778, 778]]],\n [['regression: scenario 3',\n   [[[['living', None, True], ['bed', 631, True]],\n     [['living', 654, False], ['bed', 779, False], ['den', 716, True]],\n     [['living', 799, True]],\n     [['living', 664, True]],\n     [['living', 622, False]],\n     [['living', 697, False], ['bed', 685, False]],\n     [['living', 727, False], ['bed', 250, True], ['den', 737, False], ['office', 692, False]]]],\n   [631, 716, 799, 664, 622, 691, 719]],\n  ['regression: scenario 6',\n   [[[['living', 696, False], ['bed', 633, True]],\n     [['living', 662, False], ['bed', 1100, False]],\n     [['living', 654, True]],\n     [['living', 773, True], ['bed', 789, False], ['den', 791, True], ['office', 696, True]],\n     [['living', 709, True], ['bed', 753, False]]]],\n   [633, 662, 654, 753, 709]],\n  ['regression: occupancy and faults',\n   [[[['liv', 700, True], ['bed', 680, False]],\n     [['liv', None, True], ['bed', 681, False], ['den', 690, False]],\n     [['liv', 1200, True]],\n     [['liv', 701, True], ['bed', 702, True]]]],\n   [700, 686, 686, 702]],\n  ['regression: shorted sensor',\n   [[[['a', 700, True], ['b', 5, True]], [['a', 1300, False], ['b', 690, False]]]],\n   [700, 690]],\n  ['control: first sample all invalid',\n   [[[['a', None, True]], [['a', 700, True]], [['a', None, False]]]],\n   [None, 700, 700]],\n  ['control: single occupied room',\n   [[[['a', 700, True], ['b', 650, False], ['c', 660, False]], [['a', 707, True], ['b', 704, True]]]],\n   [700, 706]],\n  ['regression: scenario 1',\n   [[[['living', 1100, True]],\n     [['living', 634, False], ['bed', 740, False], ['den', None, True]],\n     [['living', 1100, True]],\n     [['living', 618, False], ['bed', 787, False], ['den', 754, False]],\n     [['living', 673, False], ['bed', 795, True], ['den', 612, False], ['office', 721, True]]]],\n   [None, 687, 687, 720, 758]],\n  ['regression: scenario 2',\n   [[[['living', 733, True], ['bed', 629, True], ['den', 631, True], ['office', 649, True]],\n     [['living', 766, True]],\n     [['living', 727, False], ['bed', 610, False]],\n     [['living', None, True]],\n     [['living', 627, False]],\n     [['living', 689, True], ['bed', 635, True], ['den', 250, False]],\n     [['living', 613, False], ['bed', 717, False]],\n     [['living', 1100, True]]]],\n   [661, 766, 669, 669, 627, 662, 665, 665]]]]\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":"b232091ab1c0c69181416233a9e378da52a958c7e90834939982b911f66543c9","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(samples):\n    last = None\n    out = []\n    for readings in samples:\n        valid = [(t, occ) for room, t, occ in readings if t is not None]\n        pool = [t for t, occ in valid if occ] or [t for t, occ in valid]\n        if pool:\n            last = (2 * sum(pool) + len(pool)) // (2 * len(pool))\n        out.append(last)\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: occupancy and faults',\n   [[[['liv', 700, True], ['bed', 680, False]],\n     [['liv', None, True], ['bed', 681, False], ['den', 690, False]],\n     [['liv', 1200, True]],\n     [['liv', 701, True], ['bed', 702, True]]]],\n   [700, 686, 686, 702]],\n  ['regression: shorted sensor',\n   [[[['a', 700, True], ['b', 5, True]], [['a', 1300, False], ['b', 690, False]]]],\n   [700, 690]],\n  ['control: first sample all invalid',\n   [[[['a', None, True]], [['a', 700, True]], [['a', None, False]]]],\n   [None, 700, 700]],\n  ['control: single occupied room',\n   [[[['a', 700, True], ['b', 650, False], ['c', 660, False]], [['a', 707, True], ['b', 704, True]]]],\n   [700, 706]],\n  ['control: scenario 1',\n   [[[['living', 611, False], ['bed', 799, True]],\n     [['living', 697, True]],\n     [['living', 697, False], ['bed', 609, True]],\n     [['living', 751, False], ['bed', 736, True], ['den', 616, True]],\n     [['living', 1100, False], ['bed', 686, True]],\n     [['living', 798, False], ['bed', 743, True], ['den', 646, False], ['office', 720, False]],\n     [['living', 668, False], ['bed', None, True], ['den', None, True], ['office', 795, False]]]],\n   [799, 697, 609, 676, 686, 743, 732]],\n  ['regression: scenario 2',\n   [[[['living', 602, False], ['bed', 665, False], ['den', 790, False], ['office', 677, False]],\n     [['living', 638, False]],\n     [['living', 602, False], ['bed', 750, True]],\n     [['living', None, True], ['bed', 250, False], ['den', 250, True]],\n     [['living', 744, True], ['bed', 711, True], ['den', 676, False], ['office', 640, True]],\n     [['living', 771, False], ['bed', 646, True]],\n     [['living', 608, False]],\n     [['living', 663, True], ['bed', 793, True], ['den', 250, True], ['office', 743, False]]]],\n   [684, 638, 750, 750, 698, 646, 608, 728]],\n  ['regression: scenario 3',\n   [[[['living', 677, True]],\n     [['living', 624, True], ['bed', 620, True]],\n     [['living', 605, True], ['bed', 250, False]],\n     [['living', 764, False]],\n     [['living', 612, False], ['bed', None, True], ['den', 664, True]],\n     [['living', None, True], ['bed', 250, False], ['den', 250, True]],\n     [['living', 745, True], ['bed', None, False]],\n     [['living', 665, True]]]],\n   [677, 622, 605, 764, 664, 664, 745, 665]],\n  ['regression: scenario 4',\n   [[[['living', 600, True]],\n     [['living', 742, True], ['bed', 607, False], ['den', 638, True], ['office', 791, True]],\n     [['living', 710, False], ['bed', 602, True], ['den', 716, False]],\n     [['living', 607, False], ['bed', 735, True], ['den', 739, False], ['office', 723, True]],\n     [['living', 621, True], ['bed', 625, False], ['den', 688, True], ['office', 627, False]],\n     [['living', 677, False], ['bed', 775, True]],\n     [['living', 1100, False], ['bed', None, False], ['den', 687, False]]]],\n   [600, 724, 602, 729, 655, 775, 687]]],\n [['regression: shorted sensor',\n   [[[['a', 700, True], ['b', 5, True]], [['a', 1300, False], ['b', 690, False]]]],\n   [700, 690]],\n  ['regression: scenario 4',\n   [[[['living', 713, False]],\n     [['living', 741, True], ['bed', 652, False], ['den', 796, False], ['office', 784, False]],\n     [['living', 756, True], ['bed', 687, True], ['den', 250, False], ['office', 657, False]],\n     [['living', 601, True], ['bed', 743, True], ['den', 250, True]],\n     [['living', 728, False]],\n     [['living', 605, False], ['bed', 766, True], ['den', 601, False]],\n     [['living', 748, True]],\n     [['living', 1100, True], ['bed', 622, False], ['den', 714, True], ['office', 644, True]],\n     [['living', 773, True]]]],\n   [713, 741, 722, 672, 728, 766, 748, 679, 773]],\n  ['regression: occupancy and faults',\n   [[[['liv', 700, True], ['bed', 680, False]],\n     [['liv', None, True], ['bed', 681, False], ['den', 690, False]],\n     [['liv', 1200, True]],\n     [['liv', 701, True], ['bed', 702, True]]]],\n   [700, 686, 686, 702]],\n  ['control: first sample all invalid',\n   [[[['a', None, True]], [['a', 700, True]], [['a', None, False]]]],\n   [None, 700, 700]],\n  ['control: single occupied room',\n   [[[['a', 700, True], ['b', 650, False], ['c', 660, False]], [['a', 707, True], ['b', 704, True]]]],\n   [700, 706]],\n  ['control: scenario 1',\n   [[[['living', 631, False], ['bed', None, True]],\n     [['living', 674, True], ['bed', 788, True]],\n     [['living', 629, False]],\n     [['living', 617, False], ['bed', 636, True], ['den', 622, True]],\n     [['living', 602, True], ['bed', 659, True], ['den', 604, False]],\n     [['living', 641, True], ['bed', 600, True]],\n     [['living', 781, True]],\n     [['living', 615, True], ['bed', 788, True], ['den', 658, True]]]],\n   [631, 731, 629, 629, 631, 621, 781, 687]],\n  ['control: scenario 2',\n   [[[['living', 675, True], ['bed', 724, False], ['den', 793, True]],\n     [['living', 711, False], ['bed', 720, False]],\n     [['living', 722, False], ['bed', 1100, False], ['den', 606, False], ['office', 625, True]],\n     [['living', 657, False], ['bed', 619, True], ['den', 800, True], ['office', 629, True]],\n     [['living', 765, True], ['bed', 726, True]],\n     [['living', 785, False], ['bed', 626, False]]]],\n   [734, 716, 625, 683, 746, 706]],\n  ['regression: scenario 3',\n   [[[['living', 795, False]],\n     [['living', 769, False], ['bed', 675, False]],\n     [['living', 640, False]],\n     [['living', None, False]],\n     [['living', None, False], ['bed', 790, True], ['den', 684, False], ['office', 789, True]],\n     [['living', 722, True], ['bed', 750, True], ['den', 250, True]],\n     [['living', 663, True], ['bed', 670, True]],\n     [['living', 628, False], ['bed', 687, False], ['den', 635, False]]]],\n   [795, 722, 640, 640, 790, 736, 667, 650]]],\n [['regression: scenario 1',\n   [[[['living', 627, False], ['bed', 693, True], ['den', 769, True], ['office', 704, True]],\n     [['living', 738, True], ['bed', 638, True]],\n     [['living', 760, True], ['bed', 696, True], ['den', 683, False]],\n     [['living', 771, False], ['bed', 1100, False]],\n     [['living', 686, True]],\n     [['living', 734, True]],\n     [['living', None, True], ['bed', 649, False], ['den', 767, False]],\n     [['living', 722, True]],\n     [['living', 686, True], ['bed', 715, False], ['den', 617, False], ['office', 250, False]],\n     [['living', 790, True]]]],\n   [722, 688, 728, 771, 686, 734, 708, 722, 686, 790]],\n  ['regression: scenario 2',\n   [[[['living', 663, False], ['bed', 781, True], ['den', 775, False], ['office', 722, True]],\n     [['living', 655, False]],\n     [['living', 777, False], ['bed', 790, True], ['den', 637, False], ['office', 682, False]],\n     [['living', 250, False], ['bed', 701, True], ['den', 745, True], ['office', 626, False]],\n     [['living', 619, False]],\n     [['living', 619, True], ['bed', 710, True]],\n     [['living', 732, False]],\n     [['living', 772, False]],\n     [['living', None, True], ['bed', 664, True], ['den', 728, True], ['office', 783, False]],\n     [['living', 1100, True], ['bed', 734, True], ['den', 657, False], ['office', 601, False]]]],\n   [752, 655, 790, 723, 619, 665, 732, 772, 696, 734]],\n  ['regression: occupancy and faults',\n   [[[['liv', 700, True], ['bed', 680, False]],\n     [['liv', None, True], ['bed', 681, False], ['den', 690, False]],\n     [['liv', 1200, True]],\n     [['liv', 701, True], ['bed', 702, True]]]],\n   [700, 686, 686, 702]],\n  ['regression: shorted sensor',\n   [[[['a', 700, True], ['b', 5, True]], [['a', 1300, False], ['b', 690, False]]]],\n   [700, 690]],\n  ['control: first sample all invalid',\n   [[[['a', None, True]], [['a', 700, True]], [['a', None, False]]]],\n   [None, 700, 700]],\n  ['control: single occupied room',\n   [[[['a', 700, True], ['b', 650, False], ['c', 660, False]], [['a', 707, True], ['b', 704, True]]]],\n   [700, 706]],\n  ['regression: scenario 3',\n   [[[['living', 740, True], ['bed', None, False], ['den', 718, True], ['office', 628, True]],\n     [['living', 687, True]],\n     [['living', 766, True], ['bed', 604, False], ['den', 725, False], ['office', 735, False]],\n     [['living', 788, False], ['bed', 698, False], ['den', 700, False], ['office', None, True]],\n     [['living', None, False], ['bed', 607, True], ['den', 754, False]],\n     [['living', 250, False], ['bed', 649, True], ['den', 666, False]],\n     [['living', None, True], ['bed', 785, True]],\n     [['living', 715, True], ['bed', 699, False], ['den', 1100, True]],\n     [['living', 605, False], ['bed', 735, False]]]],\n   [695, 687, 766, 729, 607, 649, 785, 715, 670]],\n  ['regression: scenario 4',\n   [[[['living', 647, True], ['bed', 693, False]],\n     [['living', None, False], ['bed', 1100, False], ['den', None, True], ['office', None, False]],\n     [['living', 791, False], ['bed', 250, False], ['den', 778, True]],\n     [['living', 650, False], ['bed', None, True]],\n     [['living', 1100, True], ['bed', 680, False], ['den', 250, False]],\n     [['living', 700, True], ['bed', 1100, True], ['den', 712, False]],\n     [['living', 662, True], ['bed', 670, True]]]],\n   [647, 647, 778, 650, 680, 700, 666]]],\n [['regression: scenario 4',\n   [[[['living', 614, False]],\n     [['living', 616, True], ['bed', None, True], ['den', 783, True]],\n     [['living', 250, True], ['bed', 250, True]],\n     [['living', None, True]],\n     [['living', 663, True]],\n     [['living', 656, True], ['bed', 250, True], ['den', 679, True]],\n     [['living', 799, True], ['bed', 707, True], ['den', 751, True]],\n     [['living', None, True]]]],\n   [614, 700, 700, 700, 663, 668, 752, 752]],\n  ['regression: scenario 7',\n   [[[['living', 776, True], ['bed', 1100, False], ['den', 734, False]],\n     [['living', 250, True], ['bed', 734, False], ['den', 775, True], ['office', 1100, False]],\n     [['living', 250, False], ['bed', 747, True], ['den', None, True]],\n     [['living', 622, True], ['bed', 623, False], ['den', 793, True]],\n     [['living', 728, True], ['bed', 708, True], ['den', None, False]],\n     [['living', 644, False]],\n     [['living', 765, True], ['bed', 650, True], ['den', 749, False], ['office', 1100, False]],\n     [['living', 672, False], ['bed', 769, True], ['den', 1100, True]],\n     [['living', 729, True], ['bed', None, False]],\n     [['living', 794, False], ['bed', 670, True]]]],\n   [776, 775, 747, 708, 718, 644, 708, 769, 729, 670]],\n  ['regression: occupancy and faults',\n   [[[['liv', 700, True], ['bed', 680, False]],\n     [['liv', None, True], ['bed', 681, False], ['den', 690, False]],\n     [['liv', 1200, True]],\n     [['liv', 701, True], ['bed', 702, True]]]],\n   [700, 686, 686, 702]],\n  ['regression: shorted sensor',\n   [[[['a', 700, True], ['b', 5, True]], [['a', 1300, False], ['b', 690, False]]]],\n   [700, 690]],\n  ['control: first sample all invalid',\n   [[[['a', None, True]], [['a', 700, True]], [['a', None, False]]]],\n   [None, 700, 700]],\n  ['control: single occupied room',\n   [[[['a', 700, True], ['b', 650, False], ['c', 660, False]], [['a', 707, True], ['b', 704, True]]]],\n   [700, 706]],\n  ['control: scenario 1',\n   [[[['living', 782, False], ['bed', 708, True], ['den', 678, True]],\n     [['living', 772, False], ['bed', 795, True]],\n     [['living', 744, True], ['bed', 616, True], ['den', 694, True]],\n     [['living', 790, False], ['bed', 733, True]],\n     [['living', 722, True], ['bed', 701, False]],\n     [['living', 699, False], ['bed', 636, False]]]],\n   [693, 795, 685, 733, 722, 668]],\n  ['regression: scenario 2',\n   [[[['living', 675, False], ['bed', 659, True], ['den', 738, False], ['office', 1100, False]],\n     [['living', 250, True], ['bed', 649, True]],\n     [['living', 604, True]],\n     [['living', 629, True], ['bed', None, True], ['den', 610, True]],\n     [['living', 633, False], ['bed', None, True], ['den', 778, True], ['office', 795, False]],\n     [['living', None, False]]]],\n   [659, 649, 604, 620, 778, 778]]],\n [['regression: scenario 3',\n   [[[['living', None, True], ['bed', 631, True]],\n     [['living', 654, False], ['bed', 779, False], ['den', 716, True]],\n     [['living', 799, True]],\n     [['living', 664, True]],\n     [['living', 622, False]],\n     [['living', 697, False], ['bed', 685, False]],\n     [['living', 727, False], ['bed', 250, True], ['den', 737, False], ['office', 692, False]]]],\n   [631, 716, 799, 664, 622, 691, 719]],\n  ['regression: scenario 6',\n   [[[['living', 696, False], ['bed', 633, True]],\n     [['living', 662, False], ['bed', 1100, False]],\n     [['living', 654, True]],\n     [['living', 773, True], ['bed', 789, False], ['den', 791, True], ['office', 696, True]],\n     [['living', 709, True], ['bed', 753, False]]]],\n   [633, 662, 654, 753, 709]],\n  ['regression: occupancy and faults',\n   [[[['liv', 700, True], ['bed', 680, False]],\n     [['liv', None, True], ['bed', 681, False], ['den', 690, False]],\n     [['liv', 1200, True]],\n     [['liv', 701, True], ['bed', 702, True]]]],\n   [700, 686, 686, 702]],\n  ['regression: shorted sensor',\n   [[[['a', 700, True], ['b', 5, True]], [['a', 1300, False], ['b', 690, False]]]],\n   [700, 690]],\n  ['control: first sample all invalid',\n   [[[['a', None, True]], [['a', 700, True]], [['a', None, False]]]],\n   [None, 700, 700]],\n  ['control: single occupied room',\n   [[[['a', 700, True], ['b', 650, False], ['c', 660, False]], [['a', 707, True], ['b', 704, True]]]],\n   [700, 706]],\n  ['regression: scenario 1',\n   [[[['living', 1100, True]],\n     [['living', 634, False], ['bed', 740, False], ['den', None, True]],\n     [['living', 1100, True]],\n     [['living', 618, False], ['bed', 787, False], ['den', 754, False]],\n     [['living', 673, False], ['bed', 795, True], ['den', 612, False], ['office', 721, True]]]],\n   [None, 687, 687, 720, 758]],\n  ['regression: scenario 2',\n   [[[['living', 733, True], ['bed', 629, True], ['den', 631, True], ['office', 649, True]],\n     [['living', 766, True]],\n     [['living', 727, False], ['bed', 610, False]],\n     [['living', None, True]],\n     [['living', 627, False]],\n     [['living', 689, True], ['bed', 635, True], ['den', 250, False]],\n     [['living', 613, False], ['bed', 717, False]],\n     [['living', 1100, True]]]],\n   [661, 766, 669, 669, 627, 662, 665, 665]]]]\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":"24e8dfb31ee9f79add1aee29ecbc8fa548591842406423591a53fe896a057f54","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(samples):\n    last = None\n    out = []\n    for readings in samples:\n        valid = [(t, occ) for room, t, occ in readings if t is not None and 320 <= t <= 1000]\n        pool = [t for t, occ in valid if occ] or [t for t, occ in valid]\n        if pool:\n            last = (2 * sum(pool) + len(pool)) // (2 * len(pool))\n        out.append(last)\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: occupancy and faults',\n   [[[['liv', 700, True], ['bed', 680, False]],\n     [['liv', None, True], ['bed', 681, False], ['den', 690, False]],\n     [['liv', 1200, True]],\n     [['liv', 701, True], ['bed', 702, True]]]],\n   [700, 686, 686, 702]],\n  ['regression: shorted sensor',\n   [[[['a', 700, True], ['b', 5, True]], [['a', 1300, False], ['b', 690, False]]]],\n   [700, 690]],\n  ['control: first sample all invalid',\n   [[[['a', None, True]], [['a', 700, True]], [['a', None, False]]]],\n   [None, 700, 700]],\n  ['control: single occupied room',\n   [[[['a', 700, True], ['b', 650, False], ['c', 660, False]], [['a', 707, True], ['b', 704, True]]]],\n   [700, 706]],\n  ['control: scenario 1',\n   [[[['living', 611, False], ['bed', 799, True]],\n     [['living', 697, True]],\n     [['living', 697, False], ['bed', 609, True]],\n     [['living', 751, False], ['bed', 736, True], ['den', 616, True]],\n     [['living', 1100, False], ['bed', 686, True]],\n     [['living', 798, False], ['bed', 743, True], ['den', 646, False], ['office', 720, False]],\n     [['living', 668, False], ['bed', None, True], ['den', None, True], ['office', 795, False]]]],\n   [799, 697, 609, 676, 686, 743, 732]],\n  ['regression: scenario 2',\n   [[[['living', 602, False], ['bed', 665, False], ['den', 790, False], ['office', 677, False]],\n     [['living', 638, False]],\n     [['living', 602, False], ['bed', 750, True]],\n     [['living', None, True], ['bed', 250, False], ['den', 250, True]],\n     [['living', 744, True], ['bed', 711, True], ['den', 676, False], ['office', 640, True]],\n     [['living', 771, False], ['bed', 646, True]],\n     [['living', 608, False]],\n     [['living', 663, True], ['bed', 793, True], ['den', 250, True], ['office', 743, False]]]],\n   [684, 638, 750, 750, 698, 646, 608, 728]],\n  ['regression: scenario 3',\n   [[[['living', 677, True]],\n     [['living', 624, True], ['bed', 620, True]],\n     [['living', 605, True], ['bed', 250, False]],\n     [['living', 764, False]],\n     [['living', 612, False], ['bed', None, True], ['den', 664, True]],\n     [['living', None, True], ['bed', 250, False], ['den', 250, True]],\n     [['living', 745, True], ['bed', None, False]],\n     [['living', 665, True]]]],\n   [677, 622, 605, 764, 664, 664, 745, 665]],\n  ['regression: scenario 4',\n   [[[['living', 600, True]],\n     [['living', 742, True], ['bed', 607, False], ['den', 638, True], ['office', 791, True]],\n     [['living', 710, False], ['bed', 602, True], ['den', 716, False]],\n     [['living', 607, False], ['bed', 735, True], ['den', 739, False], ['office', 723, True]],\n     [['living', 621, True], ['bed', 625, False], ['den', 688, True], ['office', 627, False]],\n     [['living', 677, False], ['bed', 775, True]],\n     [['living', 1100, False], ['bed', None, False], ['den', 687, False]]]],\n   [600, 724, 602, 729, 655, 775, 687]]],\n [['regression: shorted sensor',\n   [[[['a', 700, True], ['b', 5, True]], [['a', 1300, False], ['b', 690, False]]]],\n   [700, 690]],\n  ['regression: scenario 4',\n   [[[['living', 713, False]],\n     [['living', 741, True], ['bed', 652, False], ['den', 796, False], ['office', 784, False]],\n     [['living', 756, True], ['bed', 687, True], ['den', 250, False], ['office', 657, False]],\n     [['living', 601, True], ['bed', 743, True], ['den', 250, True]],\n     [['living', 728, False]],\n     [['living', 605, False], ['bed', 766, True], ['den', 601, False]],\n     [['living', 748, True]],\n     [['living', 1100, True], ['bed', 622, False], ['den', 714, True], ['office', 644, True]],\n     [['living', 773, True]]]],\n   [713, 741, 722, 672, 728, 766, 748, 679, 773]],\n  ['regression: occupancy and faults',\n   [[[['liv', 700, True], ['bed', 680, False]],\n     [['liv', None, True], ['bed', 681, False], ['den', 690, False]],\n     [['liv', 1200, True]],\n     [['liv', 701, True], ['bed', 702, True]]]],\n   [700, 686, 686, 702]],\n  ['control: first sample all invalid',\n   [[[['a', None, True]], [['a', 700, True]], [['a', None, False]]]],\n   [None, 700, 700]],\n  ['control: single occupied room',\n   [[[['a', 700, True], ['b', 650, False], ['c', 660, False]], [['a', 707, True], ['b', 704, True]]]],\n   [700, 706]],\n  ['control: scenario 1',\n   [[[['living', 631, False], ['bed', None, True]],\n     [['living', 674, True], ['bed', 788, True]],\n     [['living', 629, False]],\n     [['living', 617, False], ['bed', 636, True], ['den', 622, True]],\n     [['living', 602, True], ['bed', 659, True], ['den', 604, False]],\n     [['living', 641, True], ['bed', 600, True]],\n     [['living', 781, True]],\n     [['living', 615, True], ['bed', 788, True], ['den', 658, True]]]],\n   [631, 731, 629, 629, 631, 621, 781, 687]],\n  ['control: scenario 2',\n   [[[['living', 675, True], ['bed', 724, False], ['den', 793, True]],\n     [['living', 711, False], ['bed', 720, False]],\n     [['living', 722, False], ['bed', 1100, False], ['den', 606, False], ['office', 625, True]],\n     [['living', 657, False], ['bed', 619, True], ['den', 800, True], ['office', 629, True]],\n     [['living', 765, True], ['bed', 726, True]],\n     [['living', 785, False], ['bed', 626, False]]]],\n   [734, 716, 625, 683, 746, 706]],\n  ['regression: scenario 3',\n   [[[['living', 795, False]],\n     [['living', 769, False], ['bed', 675, False]],\n     [['living', 640, False]],\n     [['living', None, False]],\n     [['living', None, False], ['bed', 790, True], ['den', 684, False], ['office', 789, True]],\n     [['living', 722, True], ['bed', 750, True], ['den', 250, True]],\n     [['living', 663, True], ['bed', 670, True]],\n     [['living', 628, False], ['bed', 687, False], ['den', 635, False]]]],\n   [795, 722, 640, 640, 790, 736, 667, 650]]],\n [['regression: scenario 1',\n   [[[['living', 627, False], ['bed', 693, True], ['den', 769, True], ['office', 704, True]],\n     [['living', 738, True], ['bed', 638, True]],\n     [['living', 760, True], ['bed', 696, True], ['den', 683, False]],\n     [['living', 771, False], ['bed', 1100, False]],\n     [['living', 686, True]],\n     [['living', 734, True]],\n     [['living', None, True], ['bed', 649, False], ['den', 767, False]],\n     [['living', 722, True]],\n     [['living', 686, True], ['bed', 715, False], ['den', 617, False], ['office', 250, False]],\n     [['living', 790, True]]]],\n   [722, 688, 728, 771, 686, 734, 708, 722, 686, 790]],\n  ['regression: scenario 2',\n   [[[['living', 663, False], ['bed', 781, True], ['den', 775, False], ['office', 722, True]],\n     [['living', 655, False]],\n     [['living', 777, False], ['bed', 790, True], ['den', 637, False], ['office', 682, False]],\n     [['living', 250, False], ['bed', 701, True], ['den', 745, True], ['office', 626, False]],\n     [['living', 619, False]],\n     [['living', 619, True], ['bed', 710, True]],\n     [['living', 732, False]],\n     [['living', 772, False]],\n     [['living', None, True], ['bed', 664, True], ['den', 728, True], ['office', 783, False]],\n     [['living', 1100, True], ['bed', 734, True], ['den', 657, False], ['office', 601, False]]]],\n   [752, 655, 790, 723, 619, 665, 732, 772, 696, 734]],\n  ['regression: occupancy and faults',\n   [[[['liv', 700, True], ['bed', 680, False]],\n     [['liv', None, True], ['bed', 681, False], ['den', 690, False]],\n     [['liv', 1200, True]],\n     [['liv', 701, True], ['bed', 702, True]]]],\n   [700, 686, 686, 702]],\n  ['regression: shorted sensor',\n   [[[['a', 700, True], ['b', 5, True]], [['a', 1300, False], ['b', 690, False]]]],\n   [700, 690]],\n  ['control: first sample all invalid',\n   [[[['a', None, True]], [['a', 700, True]], [['a', None, False]]]],\n   [None, 700, 700]],\n  ['control: single occupied room',\n   [[[['a', 700, True], ['b', 650, False], ['c', 660, False]], [['a', 707, True], ['b', 704, True]]]],\n   [700, 706]],\n  ['regression: scenario 3',\n   [[[['living', 740, True], ['bed', None, False], ['den', 718, True], ['office', 628, True]],\n     [['living', 687, True]],\n     [['living', 766, True], ['bed', 604, False], ['den', 725, False], ['office', 735, False]],\n     [['living', 788, False], ['bed', 698, False], ['den', 700, False], ['office', None, True]],\n     [['living', None, False], ['bed', 607, True], ['den', 754, False]],\n     [['living', 250, False], ['bed', 649, True], ['den', 666, False]],\n     [['living', None, True], ['bed', 785, True]],\n     [['living', 715, True], ['bed', 699, False], ['den', 1100, True]],\n     [['living', 605, False], ['bed', 735, False]]]],\n   [695, 687, 766, 729, 607, 649, 785, 715, 670]],\n  ['regression: scenario 4',\n   [[[['living', 647, True], ['bed', 693, False]],\n     [['living', None, False], ['bed', 1100, False], ['den', None, True], ['office', None, False]],\n     [['living', 791, False], ['bed', 250, False], ['den', 778, True]],\n     [['living', 650, False], ['bed', None, True]],\n     [['living', 1100, True], ['bed', 680, False], ['den', 250, False]],\n     [['living', 700, True], ['bed', 1100, True], ['den', 712, False]],\n     [['living', 662, True], ['bed', 670, True]]]],\n   [647, 647, 778, 650, 680, 700, 666]]],\n [['regression: scenario 4',\n   [[[['living', 614, False]],\n     [['living', 616, True], ['bed', None, True], ['den', 783, True]],\n     [['living', 250, True], ['bed', 250, True]],\n     [['living', None, True]],\n     [['living', 663, True]],\n     [['living', 656, True], ['bed', 250, True], ['den', 679, True]],\n     [['living', 799, True], ['bed', 707, True], ['den', 751, True]],\n     [['living', None, True]]]],\n   [614, 700, 700, 700, 663, 668, 752, 752]],\n  ['regression: scenario 7',\n   [[[['living', 776, True], ['bed', 1100, False], ['den', 734, False]],\n     [['living', 250, True], ['bed', 734, False], ['den', 775, True], ['office', 1100, False]],\n     [['living', 250, False], ['bed', 747, True], ['den', None, True]],\n     [['living', 622, True], ['bed', 623, False], ['den', 793, True]],\n     [['living', 728, True], ['bed', 708, True], ['den', None, False]],\n     [['living', 644, False]],\n     [['living', 765, True], ['bed', 650, True], ['den', 749, False], ['office', 1100, False]],\n     [['living', 672, False], ['bed', 769, True], ['den', 1100, True]],\n     [['living', 729, True], ['bed', None, False]],\n     [['living', 794, False], ['bed', 670, True]]]],\n   [776, 775, 747, 708, 718, 644, 708, 769, 729, 670]],\n  ['regression: occupancy and faults',\n   [[[['liv', 700, True], ['bed', 680, False]],\n     [['liv', None, True], ['bed', 681, False], ['den', 690, False]],\n     [['liv', 1200, True]],\n     [['liv', 701, True], ['bed', 702, True]]]],\n   [700, 686, 686, 702]],\n  ['regression: shorted sensor',\n   [[[['a', 700, True], ['b', 5, True]], [['a', 1300, False], ['b', 690, False]]]],\n   [700, 690]],\n  ['control: first sample all invalid',\n   [[[['a', None, True]], [['a', 700, True]], [['a', None, False]]]],\n   [None, 700, 700]],\n  ['control: single occupied room',\n   [[[['a', 700, True], ['b', 650, False], ['c', 660, False]], [['a', 707, True], ['b', 704, True]]]],\n   [700, 706]],\n  ['control: scenario 1',\n   [[[['living', 782, False], ['bed', 708, True], ['den', 678, True]],\n     [['living', 772, False], ['bed', 795, True]],\n     [['living', 744, True], ['bed', 616, True], ['den', 694, True]],\n     [['living', 790, False], ['bed', 733, True]],\n     [['living', 722, True], ['bed', 701, False]],\n     [['living', 699, False], ['bed', 636, False]]]],\n   [693, 795, 685, 733, 722, 668]],\n  ['regression: scenario 2',\n   [[[['living', 675, False], ['bed', 659, True], ['den', 738, False], ['office', 1100, False]],\n     [['living', 250, True], ['bed', 649, True]],\n     [['living', 604, True]],\n     [['living', 629, True], ['bed', None, True], ['den', 610, True]],\n     [['living', 633, False], ['bed', None, True], ['den', 778, True], ['office', 795, False]],\n     [['living', None, False]]]],\n   [659, 649, 604, 620, 778, 778]]],\n [['regression: scenario 3',\n   [[[['living', None, True], ['bed', 631, True]],\n     [['living', 654, False], ['bed', 779, False], ['den', 716, True]],\n     [['living', 799, True]],\n     [['living', 664, True]],\n     [['living', 622, False]],\n     [['living', 697, False], ['bed', 685, False]],\n     [['living', 727, False], ['bed', 250, True], ['den', 737, False], ['office', 692, False]]]],\n   [631, 716, 799, 664, 622, 691, 719]],\n  ['regression: scenario 6',\n   [[[['living', 696, False], ['bed', 633, True]],\n     [['living', 662, False], ['bed', 1100, False]],\n     [['living', 654, True]],\n     [['living', 773, True], ['bed', 789, False], ['den', 791, True], ['office', 696, True]],\n     [['living', 709, True], ['bed', 753, False]]]],\n   [633, 662, 654, 753, 709]],\n  ['regression: occupancy and faults',\n   [[[['liv', 700, True], ['bed', 680, False]],\n     [['liv', None, True], ['bed', 681, False], ['den', 690, False]],\n     [['liv', 1200, True]],\n     [['liv', 701, True], ['bed', 702, True]]]],\n   [700, 686, 686, 702]],\n  ['regression: shorted sensor',\n   [[[['a', 700, True], ['b', 5, True]], [['a', 1300, False], ['b', 690, False]]]],\n   [700, 690]],\n  ['control: first sample all invalid',\n   [[[['a', None, True]], [['a', 700, True]], [['a', None, False]]]],\n   [None, 700, 700]],\n  ['control: single occupied room',\n   [[[['a', 700, True], ['b', 650, False], ['c', 660, False]], [['a', 707, True], ['b', 704, True]]]],\n   [700, 706]],\n  ['regression: scenario 1',\n   [[[['living', 1100, True]],\n     [['living', 634, False], ['bed', 740, False], ['den', None, True]],\n     [['living', 1100, True]],\n     [['living', 618, False], ['bed', 787, False], ['den', 754, False]],\n     [['living', 673, False], ['bed', 795, True], ['den', 612, False], ['office', 721, True]]]],\n   [None, 687, 687, 720, 758]],\n  ['regression: scenario 2',\n   [[[['living', 733, True], ['bed', 629, True], ['den', 631, True], ['office', 649, True]],\n     [['living', 766, True]],\n     [['living', 727, False], ['bed', 610, False]],\n     [['living', None, True]],\n     [['living', 627, False]],\n     [['living', 689, True], ['bed', 635, True], ['den', 250, False]],\n     [['living', 613, False], ['bed', 717, False]],\n     [['living', 1100, True]]]],\n   [661, 766, 669, 669, 627, 662, 665, 665]]]]\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-remote-sensor-averaging-sensor-range-check","generated_at":"2026-09-29T14:51:47.670699+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":"Discard readings outside 32.0-100.0 F.","root_cause":"Validity only checks for a missing reading.","sha256":"ecf43ceaf078dbd593835016ff4c019b6c30b9efc91d2994ee227ac4434a9e24","title":"Out-of-range remote sensor readings are averaged in · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":43.882,"exit_code":1,"observations":[{"actual":[700,686,1200,702],"check":"regression: occupancy and faults","expected":[700,686,686,702],"passed":false},{"actual":[700,995],"check":"regression: shorted sensor","expected":[700,690],"passed":false},{"actual":[null,700,700],"check":"control: first sample all invalid","expected":[null,700,700],"passed":true},{"actual":[700,706],"check":"control: single occupied room","expected":[700,706],"passed":true},{"actual":[799,697,609,676,686,743,732],"check":"control: scenario 1","expected":[799,697,609,676,686,743,732],"passed":true},{"actual":[684,638,750,750,698,646,608,728],"check":"regression: scenario 2","expected":[684,638,750,750,698,646,608,728],"passed":true},{"actual":[677,622,605,764,664,664,745,665],"check":"regression: scenario 3","expected":[677,622,605,764,664,664,745,665],"passed":true},{"actual":[600,724,602,729,655,775,894],"check":"regression: scenario 4","expected":[600,724,602,729,655,775,687],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: occupancy and faults\", \"actual\": [700, 686, 1200, 702], \"expected\": [700, 686, 686, 702], \"passed\": false}, {\"check\": \"regression: shorted sensor\", \"actual\": [700, 995], \"expected\": [700, 690], \"passed\": false}, {\"check\": \"control: first sample all invalid\", \"actual\": [null, 700, 700], \"expected\": [null, 700, 700], \"passed\": true}, {\"check\": \"control: single occupied room\", \"actual\": [700, 706], \"expected\": [700, 706], \"passed\": true}, {\"check\": \"control: scenario 1\", \"actual\": [799, 697, 609, 676, 686, 743, 732], \"expected\": [799, 697, 609, 676, 686, 743, 732], \"passed\": true}, {\"check\": \"regression: scenario 2\", \"actual\": [684, 638, 750, 750, 698, 646, 608, 728], \"expected\": [684, 638, 750, 750, 698, 646, 608, 728], \"passed\": true}, {\"check\": \"regression: scenario 3\", \"actual\": [677, 622, 605, 764, 664, 664, 745, 665], \"expected\": [677, 622, 605, 764, 664, 664, 745, 665], \"passed\": true}, {\"check\": \"regression: scenario 4\", \"actual\": [600, 724, 602, 729, 655, 775, 894], \"expected\": [600, 724, 602, 729, 655, 775, 687], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.116,"exit_code":1,"observations":[{"actual":[700,686,1200,702],"check":"regression: occupancy and faults","expected":[700,686,686,702],"passed":false},{"actual":[353,995],"check":"regression: shorted sensor","expected":[700,690],"passed":false},{"actual":[null,700,700],"check":"control: first sample all invalid","expected":[null,700,700],"passed":true},{"actual":[700,706],"check":"control: single occupied room","expected":[700,706],"passed":true},{"actual":[799,697,609,676,686,743,732],"check":"control: scenario 1","expected":[799,697,609,676,686,743,732],"passed":true},{"actual":[684,638,750,250,698,646,608,569],"check":"regression: scenario 2","expected":[684,638,750,750,698,646,608,728],"passed":false},{"actual":[677,622,605,764,664,250,745,665],"check":"regression: scenario 3","expected":[677,622,605,764,664,664,745,665],"passed":false},{"actual":[600,724,602,729,655,775,894],"check":"regression: scenario 4","expected":[600,724,602,729,655,775,687],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: occupancy and faults\", \"actual\": [700, 686, 1200, 702], \"expected\": [700, 686, 686, 702], \"passed\": false}, {\"check\": \"regression: shorted sensor\", \"actual\": [353, 995], \"expected\": [700, 690], \"passed\": false}, {\"check\": \"control: first sample all invalid\", \"actual\": [null, 700, 700], \"expected\": [null, 700, 700], \"passed\": true}, {\"check\": \"control: single occupied room\", \"actual\": [700, 706], \"expected\": [700, 706], \"passed\": true}, {\"check\": \"control: scenario 1\", \"actual\": [799, 697, 609, 676, 686, 743, 732], \"expected\": [799, 697, 609, 676, 686, 743, 732], \"passed\": true}, {\"check\": \"regression: scenario 2\", \"actual\": [684, 638, 750, 250, 698, 646, 608, 569], \"expected\": [684, 638, 750, 750, 698, 646, 608, 728], \"passed\": false}, {\"check\": \"regression: scenario 3\", \"actual\": [677, 622, 605, 764, 664, 250, 745, 665], \"expected\": [677, 622, 605, 764, 664, 664, 745, 665], \"passed\": false}, {\"check\": \"regression: scenario 4\", \"actual\": [600, 724, 602, 729, 655, 775, 894], \"expected\": [600, 724, 602, 729, 655, 775, 687], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":44.31,"exit_code":0,"observations":[{"actual":[700,686,686,702],"check":"regression: occupancy and faults","expected":[700,686,686,702],"passed":true},{"actual":[700,690],"check":"regression: shorted sensor","expected":[700,690],"passed":true},{"actual":[null,700,700],"check":"control: first sample all invalid","expected":[null,700,700],"passed":true},{"actual":[700,706],"check":"control: single occupied room","expected":[700,706],"passed":true},{"actual":[799,697,609,676,686,743,732],"check":"control: scenario 1","expected":[799,697,609,676,686,743,732],"passed":true},{"actual":[684,638,750,750,698,646,608,728],"check":"regression: scenario 2","expected":[684,638,750,750,698,646,608,728],"passed":true},{"actual":[677,622,605,764,664,664,745,665],"check":"regression: scenario 3","expected":[677,622,605,764,664,664,745,665],"passed":true},{"actual":[600,724,602,729,655,775,687],"check":"regression: scenario 4","expected":[600,724,602,729,655,775,687],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: occupancy and faults\", \"actual\": [700, 686, 686, 702], \"expected\": [700, 686, 686, 702], \"passed\": true}, {\"check\": \"regression: shorted sensor\", \"actual\": [700, 690], \"expected\": [700, 690], \"passed\": true}, {\"check\": \"control: first sample all invalid\", \"actual\": [null, 700, 700], \"expected\": [null, 700, 700], \"passed\": true}, {\"check\": \"control: single occupied room\", \"actual\": [700, 706], \"expected\": [700, 706], \"passed\": true}, {\"check\": \"control: scenario 1\", \"actual\": [799, 697, 609, 676, 686, 743, 732], \"expected\": [799, 697, 609, 676, 686, 743, 732], \"passed\": true}, {\"check\": \"regression: scenario 2\", \"actual\": [684, 638, 750, 750, 698, 646, 608, 728], \"expected\": [684, 638, 750, 750, 698, 646, 608, 728], \"passed\": true}, {\"check\": \"regression: scenario 3\", \"actual\": [677, 622, 605, 764, 664, 664, 745, 665], \"expected\": [677, 622, 605, 764, 664, 664, 745, 665], \"passed\": true}, {\"check\": \"regression: scenario 4\", \"actual\": [600, 724, 602, 729, 655, 775, 687], \"expected\": [600, 724, 602, 729, 655, 775, 687], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}