{"abstract":"With everyone out of the occupied rooms the thermostat stops tracking temperature.","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.","contract_signature":"samples","evaluation_group":"w2-hvac-thermostat-control-remote-sensor-averaging","failed_approach":"Falling back to every non-missing reading reintroduces invalid sensors.","family":"w2-hvac-thermostat-control-remote-sensor-averaging-occupancy-fallback","id":"FA-92636","implementations":{"attempt":{"sha256":"92df8e8f25c6b1c844783c28d946b606a30ee1b2b6a1df9b664f9d667eabb779","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 room, t, occ in readings if t is not None]\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  ['regression: 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 5',\n   [[[['living', 660, True], ['bed', 706, True], ['den', 697, False], ['office', None, False]],\n     [['living', 683, True], ['bed', None, False]],\n     [['living', 604, False], ['bed', None, False], ['den', 677, True]],\n     [['living', None, False], ['bed', 609, True], ['den', 696, True], ['office', 610, False]],\n     [['living', 712, False]],\n     [['living', 629, True]],\n     [['living', 250, True]],\n     [['living', 770, True], ['bed', 1100, False], ['den', 760, False]]]],\n   [683, 683, 677, 653, 712, 629, 629, 770]],\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  ['regression: 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  ['regression: 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 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: 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 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: 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 3',\n   [[[['living', 687, True], ['bed', 761, True]],\n     [['living', 719, False], ['bed', None, False], ['den', 774, True]],\n     [['living', 723, False]],\n     [['living', 649, False]],\n     [['living', 649, False], ['bed', 705, True]],\n     [['living', 699, True]]]],\n   [724, 774, 723, 649, 705, 699]],\n  ['regression: scenario 6',\n   [[[['living', 794, False], ['bed', 676, True], ['den', 708, False]],\n     [['living', 732, False], ['bed', 732, True]],\n     [['living', 729, True], ['bed', 788, True], ['den', 788, True], ['office', 250, True]],\n     [['living', 739, True]],\n     [['living', 690, False], ['bed', 658, True]],\n     [['living', 653, False]],\n     [['living', 666, False], ['bed', None, True]],\n     [['living', 250, False], ['bed', 777, False], ['den', 1100, False]],\n     [['living', 756, True], ['bed', 629, False], ['den', 678, True], ['office', 703, False]],\n     [['living', 601, False], ['bed', 643, False], ['den', 790, True]]]],\n   [676, 732, 768, 739, 658, 653, 666, 777, 717, 790]],\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', 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  ['control: 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 4',\n   [[[['living', 1100, False], ['bed', 686, True], ['den', 660, False]],\n     [['living', 716, True], ['bed', 689, True], ['den', 723, False]],\n     [['living', 729, True]],\n     [['living', 660, False], ['bed', 657, True]],\n     [['living', 765, True]],\n     [['living', 250, False]],\n     [['living', None, True], ['bed', 707, True], ['den', 646, True]],\n     [['living', 766, False], ['bed', 703, False]],\n     [['living', 617, True], ['bed', 608, True], ['den', 250, True]],\n     [['living', 603, False], ['bed', 746, True], ['den', None, True], ['office', 695, False]]]],\n   [686, 703, 729, 657, 765, 765, 677, 735, 613, 746]],\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":"9aed0c8659f382a47adeb2fbd2afb8ea3750983079899c09e5a688bacafc1c83","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]\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  ['regression: 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 5',\n   [[[['living', 660, True], ['bed', 706, True], ['den', 697, False], ['office', None, False]],\n     [['living', 683, True], ['bed', None, False]],\n     [['living', 604, False], ['bed', None, False], ['den', 677, True]],\n     [['living', None, False], ['bed', 609, True], ['den', 696, True], ['office', 610, False]],\n     [['living', 712, False]],\n     [['living', 629, True]],\n     [['living', 250, True]],\n     [['living', 770, True], ['bed', 1100, False], ['den', 760, False]]]],\n   [683, 683, 677, 653, 712, 629, 629, 770]],\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  ['regression: 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  ['regression: 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 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: 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 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: 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 3',\n   [[[['living', 687, True], ['bed', 761, True]],\n     [['living', 719, False], ['bed', None, False], ['den', 774, True]],\n     [['living', 723, False]],\n     [['living', 649, False]],\n     [['living', 649, False], ['bed', 705, True]],\n     [['living', 699, True]]]],\n   [724, 774, 723, 649, 705, 699]],\n  ['regression: scenario 6',\n   [[[['living', 794, False], ['bed', 676, True], ['den', 708, False]],\n     [['living', 732, False], ['bed', 732, True]],\n     [['living', 729, True], ['bed', 788, True], ['den', 788, True], ['office', 250, True]],\n     [['living', 739, True]],\n     [['living', 690, False], ['bed', 658, True]],\n     [['living', 653, False]],\n     [['living', 666, False], ['bed', None, True]],\n     [['living', 250, False], ['bed', 777, False], ['den', 1100, False]],\n     [['living', 756, True], ['bed', 629, False], ['den', 678, True], ['office', 703, False]],\n     [['living', 601, False], ['bed', 643, False], ['den', 790, True]]]],\n   [676, 732, 768, 739, 658, 653, 666, 777, 717, 790]],\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', 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  ['control: 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 4',\n   [[[['living', 1100, False], ['bed', 686, True], ['den', 660, False]],\n     [['living', 716, True], ['bed', 689, True], ['den', 723, False]],\n     [['living', 729, True]],\n     [['living', 660, False], ['bed', 657, True]],\n     [['living', 765, True]],\n     [['living', 250, False]],\n     [['living', None, True], ['bed', 707, True], ['den', 646, True]],\n     [['living', 766, False], ['bed', 703, False]],\n     [['living', 617, True], ['bed', 608, True], ['den', 250, True]],\n     [['living', 603, False], ['bed', 746, True], ['den', None, True], ['office', 695, False]]]],\n   [686, 703, 729, 657, 765, 765, 677, 735, 613, 746]],\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-occupancy-fallback","generated_at":"2026-09-29T14:51:47.669756+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Residential and light-commercial thermostats make these decisions sample by sample; each defect changes equipment calls in a way that shows up as short cycling, comfort complaints or equipment stress.","root_cause":"There is no fallback to all valid sensors when no occupied sensor is valid.","sha256":"90ac85113e639883d25cc10ebbcabfafcb4e38dd2522c8783ac27f126759ef39","title":"Averaging holds a stale value when no occupied room is valid · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verified":true,"visibility":"public","verification":{"attempt":{"elapsed_ms":43.755,"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":"regression: scenario 1","expected":[799,697,609,676,686,743,732],"passed":true},{"actual":[684,638,750,250,698,646,608,728],"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\": [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\": \"regression: 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, 728], \"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"},"broken":{"elapsed_ms":42.278,"exit_code":1,"observations":[{"actual":[700,700,700,702],"check":"regression: occupancy and faults","expected":[700,686,686,702],"passed":false},{"actual":[700,700],"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,743],"check":"regression: scenario 1","expected":[799,697,609,676,686,743,732],"passed":false},{"actual":[null,null,750,750,698,646,646,728],"check":"regression: scenario 2","expected":[684,638,750,750,698,646,608,728],"passed":false},{"actual":[677,622,605,605,664,664,745,665],"check":"regression: scenario 3","expected":[677,622,605,764,664,664,745,665],"passed":false},{"actual":[600,724,602,729,655,775,775],"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, 700, 700, 702], \"expected\": [700, 686, 686, 702], \"passed\": false}, {\"check\": \"regression: shorted sensor\", \"actual\": [700, 700], \"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\": \"regression: scenario 1\", \"actual\": [799, 697, 609, 676, 686, 743, 743], \"expected\": [799, 697, 609, 676, 686, 743, 732], \"passed\": false}, {\"check\": \"regression: scenario 2\", \"actual\": [null, null, 750, 750, 698, 646, 646, 728], \"expected\": [684, 638, 750, 750, 698, 646, 608, 728], \"passed\": false}, {\"check\": \"regression: scenario 3\", \"actual\": [677, 622, 605, 605, 664, 664, 745, 665], \"expected\": [677, 622, 605, 764, 664, 664, 745, 665], \"passed\": false}, {\"check\": \"regression: scenario 4\", \"actual\": [600, 724, 602, 729, 655, 775, 775], \"expected\": [600, 724, 602, 729, 655, 775, 687], \"passed\": false}], \"passed\": false}\n"}},"member_only":{"stages":["fixed"],"fields":["implementations.fixed","verification.fixed","harness","repair"],"note":"The verified repair, its recorded checks, the repair description, and the scoring harness are available to members."}}