{"abstract":"A momentary wireless dropout makes the thermostat report no 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":"Substituting a fixed default before the first valid reading invents a temperature.","family":"w2-hvac-thermostat-control-remote-sensor-averaging-invalid-hold","id":"FA-92646","implementations":{"attempt":{"sha256":"13d1dc4486c97a5e8611515cf45362430248a493c7b3f6e292e445b8f3a93c9a","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        elif last is None:\n            last = 700\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: first sample all invalid',\n   [[[['a', None, True]], [['a', 700, True]], [['a', None, False]]]],\n   [None, 700, 700]],\n  ['control: shorted sensor',\n   [[[['a', 700, True], ['b', 5, True]], [['a', 1300, False], ['b', 690, False]]]],\n   [700, 690]],\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  ['control: 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: first sample all invalid',\n   [[[['a', None, True]], [['a', 700, True]], [['a', None, False]]]],\n   [None, 700, 700]],\n  ['regression: scenario 48',\n   [[[['living', 1100, False]],\n     [['living', 686, False], ['bed', 704, True]],\n     [['living', 632, False]],\n     [['living', 620, False], ['bed', 693, False]],\n     [['living', 1100, True], ['bed', 656, False], ['den', None, False], ['office', 1100, False]]]],\n   [None, 704, 632, 657, 656]],\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: shorted sensor',\n   [[[['a', 700, True], ['b', 5, True]], [['a', 1300, False], ['b', 690, False]]]],\n   [700, 690]],\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 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 14',\n   [[[['living', None, True]],\n     [['living', 603, True], ['bed', 671, False], ['den', 792, False], ['office', 751, False]],\n     [['living', 693, False]],\n     [['living', 613, True], ['bed', None, True], ['den', None, False], ['office', None, True]],\n     [['living', 719, False]],\n     [['living', 1100, False], ['bed', 610, False], ['den', 674, False], ['office', 667, True]],\n     [['living', 667, True]],\n     [['living', 605, True], ['bed', 623, True], ['den', 783, False], ['office', 712, True]]]],\n   [None, 603, 693, 613, 719, 667, 667, 647]],\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: shorted sensor',\n   [[[['a', 700, True], ['b', 5, True]], [['a', 1300, False], ['b', 690, False]]]],\n   [700, 690]],\n  ['regression: 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', 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  ['control: 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 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: first sample all invalid',\n   [[[['a', None, True]], [['a', 700, True]], [['a', None, False]]]],\n   [None, 700, 700]],\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: shorted sensor',\n   [[[['a', 700, True], ['b', 5, True]], [['a', 1300, False], ['b', 690, False]]]],\n   [700, 690]],\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  ['control: 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 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: scenario 40',\n   [[[['living', None, True]],\n     [['living', 665, False], ['bed', 608, False], ['den', 792, True], ['office', 620, False]],\n     [['living', 647, False]],\n     [['living', 755, True], ['bed', 690, False], ['den', 709, True], ['office', None, True]],\n     [['living', 691, True], ['bed', 698, True], ['den', 700, False], ['office', 250, False]],\n     [['living', 750, True], ['bed', 722, True], ['den', 783, True], ['office', 665, False]],\n     [['living', 644, False], ['bed', 639, False], ['den', 710, False]],\n     [['living', 629, False]],\n     [['living', 644, True], ['bed', 612, False], ['den', 762, False], ['office', 767, False]]]],\n   [None, 792, 647, 732, 695, 752, 664, 629, 644]],\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: shorted sensor',\n   [[[['a', 700, True], ['b', 5, True]], [['a', 1300, False], ['b', 690, False]]]],\n   [700, 690]],\n  ['regression: 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":"0c154bf3b9938c32109cd267fb3d92c69ad18699e7a7dd1564f12aed6e7af0ed","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        else:\n            last = None\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: first sample all invalid',\n   [[[['a', None, True]], [['a', 700, True]], [['a', None, False]]]],\n   [None, 700, 700]],\n  ['control: shorted sensor',\n   [[[['a', 700, True], ['b', 5, True]], [['a', 1300, False], ['b', 690, False]]]],\n   [700, 690]],\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  ['control: 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: first sample all invalid',\n   [[[['a', None, True]], [['a', 700, True]], [['a', None, False]]]],\n   [None, 700, 700]],\n  ['regression: scenario 48',\n   [[[['living', 1100, False]],\n     [['living', 686, False], ['bed', 704, True]],\n     [['living', 632, False]],\n     [['living', 620, False], ['bed', 693, False]],\n     [['living', 1100, True], ['bed', 656, False], ['den', None, False], ['office', 1100, False]]]],\n   [None, 704, 632, 657, 656]],\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: shorted sensor',\n   [[[['a', 700, True], ['b', 5, True]], [['a', 1300, False], ['b', 690, False]]]],\n   [700, 690]],\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 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 14',\n   [[[['living', None, True]],\n     [['living', 603, True], ['bed', 671, False], ['den', 792, False], ['office', 751, False]],\n     [['living', 693, False]],\n     [['living', 613, True], ['bed', None, True], ['den', None, False], ['office', None, True]],\n     [['living', 719, False]],\n     [['living', 1100, False], ['bed', 610, False], ['den', 674, False], ['office', 667, True]],\n     [['living', 667, True]],\n     [['living', 605, True], ['bed', 623, True], ['den', 783, False], ['office', 712, True]]]],\n   [None, 603, 693, 613, 719, 667, 667, 647]],\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: shorted sensor',\n   [[[['a', 700, True], ['b', 5, True]], [['a', 1300, False], ['b', 690, False]]]],\n   [700, 690]],\n  ['regression: 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', 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  ['control: 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 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: first sample all invalid',\n   [[[['a', None, True]], [['a', 700, True]], [['a', None, False]]]],\n   [None, 700, 700]],\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: shorted sensor',\n   [[[['a', 700, True], ['b', 5, True]], [['a', 1300, False], ['b', 690, False]]]],\n   [700, 690]],\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  ['control: 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 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: scenario 40',\n   [[[['living', None, True]],\n     [['living', 665, False], ['bed', 608, False], ['den', 792, True], ['office', 620, False]],\n     [['living', 647, False]],\n     [['living', 755, True], ['bed', 690, False], ['den', 709, True], ['office', None, True]],\n     [['living', 691, True], ['bed', 698, True], ['den', 700, False], ['office', 250, False]],\n     [['living', 750, True], ['bed', 722, True], ['den', 783, True], ['office', 665, False]],\n     [['living', 644, False], ['bed', 639, False], ['den', 710, False]],\n     [['living', 629, False]],\n     [['living', 644, True], ['bed', 612, False], ['den', 762, False], ['office', 767, False]]]],\n   [None, 792, 647, 732, 695, 752, 664, 629, 644]],\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: shorted sensor',\n   [[[['a', 700, True], ['b', 5, True]], [['a', 1300, False], ['b', 690, False]]]],\n   [700, 690]],\n  ['regression: 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-invalid-hold","generated_at":"2026-09-29T14:51:47.716020+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":"The previous value is cleared when no reading is valid.","sha256":"2145210d55a3c2a714fe35b1a9d0ebef2e365d28794b06450e551fe1a45bb43e","title":"Control temperature is lost when every sensor is invalid · 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.826,"exit_code":1,"observations":[{"actual":[700,686,686,702],"check":"regression: occupancy and faults","expected":[700,686,686,702],"passed":true},{"actual":[700,700,700],"check":"regression: first sample all invalid","expected":[null,700,700],"passed":false},{"actual":[700,690],"check":"control: shorted sensor","expected":[700,690],"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":"control: scenario 4","expected":[600,724,602,729,655,775,687],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: occupancy and faults\", \"actual\": [700, 686, 686, 702], \"expected\": [700, 686, 686, 702], \"passed\": true}, {\"check\": \"regression: first sample all invalid\", \"actual\": [700, 700, 700], \"expected\": [null, 700, 700], \"passed\": false}, {\"check\": \"control: shorted sensor\", \"actual\": [700, 690], \"expected\": [700, 690], \"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\": \"control: scenario 4\", \"actual\": [600, 724, 602, 729, 655, 775, 687], \"expected\": [600, 724, 602, 729, 655, 775, 687], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.411,"exit_code":1,"observations":[{"actual":[700,686,null,702],"check":"regression: occupancy and faults","expected":[700,686,686,702],"passed":false},{"actual":[null,700,null],"check":"regression: first sample all invalid","expected":[null,700,700],"passed":false},{"actual":[700,690],"check":"control: shorted sensor","expected":[700,690],"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,null,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,null,745,665],"check":"regression: scenario 3","expected":[677,622,605,764,664,664,745,665],"passed":false},{"actual":[600,724,602,729,655,775,687],"check":"control: scenario 4","expected":[600,724,602,729,655,775,687],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: occupancy and faults\", \"actual\": [700, 686, null, 702], \"expected\": [700, 686, 686, 702], \"passed\": false}, {\"check\": \"regression: first sample all invalid\", \"actual\": [null, 700, null], \"expected\": [null, 700, 700], \"passed\": false}, {\"check\": \"control: shorted sensor\", \"actual\": [700, 690], \"expected\": [700, 690], \"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, null, 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, null, 745, 665], \"expected\": [677, 622, 605, 764, 664, 664, 745, 665], \"passed\": false}, {\"check\": \"control: scenario 4\", \"actual\": [600, 724, 602, 729, 655, 775, 687], \"expected\": [600, 724, 602, 729, 655, 775, 687], \"passed\": true}], \"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."}}