FA-92401 / HVAC thermostat control / Open access
Minimum off time is measured from the last start · case 01
A compressor that ran longer than the off delay restarts immediately after stopping.
ROOT CAUSE
The off-delay check subtracts the start time instead of the stop time.
VERIFIED REPAIR
Measure minimum off time from the most recent stop.
Unsuccessful approach: Measuring from the stop but with a strict comparison adds an extra minute.
Case contract
Compressor protection sampled per minute; calls is a list of [demand, safety_ok]. After power-up the compressor may not start before minute startup_delay. Once started it runs at least min_on minutes even if demand ends; after stopping it stays off at least min_off minutes. A safety fault stops it immediately regardless of minimum on time, and that stop also starts the minimum off time; it cannot start while the safety is faulted. Return the compressor state per minute.
Why this case matters
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.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(min_on, min_off, startup_delay, calls):
running = False
on_at = None
off_at = None
out = []
for minute, (demand, safety_ok) in enumerate(calls):
if running:
if not safety_ok:
running = False
off_at = minute
elif not demand and minute - on_at >= min_on:
running = False
off_at = minute
elif demand and safety_ok and minute >= startup_delay:
if off_at is None or minute - on_at >= min_off:
running = True
on_at = minute
out.append(running)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: min on and off',
[3,
4,
2,
[[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[False, False, True, True, True, False, False, False, False, False, True]],
['regression: safety during min on',
[5,
3,
0,
[[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, True, True]],
['regression: safety then quick recall',
[2,
4,
0,
[[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, False, True]],
['regression: exact min on',
[2,
3,
0,
[[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True]]],
[True, True, False, False, False, True, True, False, False, False, True, True]],
['control: scenario 1',
[3,
3,
4,
[[False, False],
[False, True],
[False, True],
[False, False],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, False],
[False, True],
[False, True],
[False, True],
[True, True],
[False, True],
[False, False],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True]]],
[False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False]],
['regression: scenario 2',
[5,
3,
0,
[[True, True],
[True, True],
[True, True],
[True, False],
[False, True],
[False, True],
[True, True],
[True, True],
[True, False],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True]]],
[True, True, True, False, False, False, True, True, False, False, False, False, False, True]],
['regression: scenario 3',
[3,
4,
0,
[[True, True],
[True, True],
[True, True],
[True, True],
[False, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[True, True, True, True, False, False, False, False, True, False, False]],
['control: scenario 4',
[5,
5,
4,
[[True, True],
[False, False],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, False],
[False, True],
[False, True],
[False, True]]],
[False, False, False, False, False, False, False, False, False, False, False, False, False]]],
[['regression: safety during min on',
[5,
3,
0,
[[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, True, True]],
['regression: exact min on',
[2,
3,
0,
[[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True]]],
[True, True, False, False, False, True, True, False, False, False, True, True]],
['regression: min on and off',
[3,
4,
2,
[[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[False, False, True, True, True, False, False, False, False, False, True]],
['regression: safety then quick recall',
[2,
4,
0,
[[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, False, True]],
['control: scenario 1',
[5,
3,
0,
[[False, True],
[False, True],
[False, True],
[False, False],
[False, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True]]],
[False, False, False, False, False, True, True, True, True, True, True, True]],
['regression: scenario 2',
[2,
5,
4,
[[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[True, True],
[False, True],
[True, True],
[False, True],
[True, True],
[True, True],
[False, False],
[False, True],
[False, True]]],
[False, False, False, False, False, True, True, True, False, False, False, False, False, False]],
['regression: scenario 3',
[3,
4,
0,
[[True, True],
[True, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, False],
[True, True],
[False, True],
[False, True]]],
[True,
False,
False,
False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
False,
True,
True,
True]],
['regression: scenario 4',
[2,
4,
2,
[[True, True],
[True, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[True, True],
[False, True],
[True, True],
[False, True],
[False, True],
[True, False],
[True, False]]],
[False, False, True, True, True, True, True, False, False, False, False, False, False, False, False]]],
[['regression: safety then quick recall',
[2,
4,
0,
[[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, False, True]],
['regression: scenario 3',
[2,
5,
0,
[[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, False],
[True, True],
[True, False],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True]]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True]],
['regression: min on and off',
[3,
4,
2,
[[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[False, False, True, True, True, False, False, False, False, False, True]],
['regression: safety during min on',
[5,
3,
0,
[[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, True, True]],
['regression: exact min on',
[2,
3,
0,
[[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True]]],
[True, True, False, False, False, True, True, False, False, False, True, True]],
['regression: scenario 1',
[2,
5,
2,
[[True, False],
[True, True],
[True, False],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True],
[False, True],
[False, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, False],
[True, True],
[True, False],
[True, True]]],
[False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
True,
False,
False]],
['regression: scenario 2',
[2,
4,
0,
[[False, True],
[True, True],
[True, False],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[False, True],
[False, True],
[False, True]]],
[False,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False]],
['control: scenario 4',
[5,
5,
4,
[[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, False],
[True, True],
[True, True],
[False, True],
[True, True],
[True, True],
[False, True]]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
False]]],
[['regression: exact min on',
[2,
3,
0,
[[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True]]],
[True, True, False, False, False, True, True, False, False, False, True, True]],
['regression: scenario 3',
[2,
3,
0,
[[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, False],
[False, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True]]],
[False,
False,
True,
True,
True,
False,
False,
False,
True,
True,
False,
False,
False,
True,
True,
True,
True,
True]],
['regression: min on and off',
[3,
4,
2,
[[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[False, False, True, True, True, False, False, False, False, False, True]],
['regression: safety during min on',
[5,
3,
0,
[[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, True, True]],
['regression: safety then quick recall',
[2,
4,
0,
[[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, False, True]],
['regression: scenario 1',
[5,
4,
2,
[[False, True],
[False, False],
[False, True],
[False, True],
[False, True],
[True, True],
[True, False],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True]]],
[False,
False,
False,
False,
False,
True,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
False]],
['regression: scenario 2',
[2,
4,
2,
[[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, False],
[False, True],
[False, True],
[False, True],
[False, False]]],
[False,
False,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
False,
False,
False,
False,
False]],
['regression: scenario 4',
[2,
5,
4,
[[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True]]],
[False, False, False, False, True, True, True, False, False, False, False, False, False, False]]],
[['regression: scenario 2',
[2,
4,
2,
[[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True]]],
[False,
False,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
True,
False]],
['regression: scenario 14',
[5,
5,
4,
[[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True]]],
[False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
True,
True,
True]],
['regression: min on and off',
[3,
4,
2,
[[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[False, False, True, True, True, False, False, False, False, False, True]],
['regression: safety during min on',
[5,
3,
0,
[[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, True, True]],
['regression: safety then quick recall',
[2,
4,
0,
[[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, False, True]],
['regression: exact min on',
[2,
3,
0,
[[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True]]],
[True, True, False, False, False, True, True, False, False, False, True, True]],
['control: scenario 1',
[3,
4,
0,
[[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[False, True],
[True, True],
[False, True],
[False, False],
[False, False],
[False, True]]],
[False, False, False, False, True, True, True, False, False, False, False]],
['regression: scenario 3',
[2,
5,
0,
[[True, True],
[True, True],
[True, False],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[False, True],
[False, True],
[False, True]]],
[True, True, False, False, False, False, False, False, True, True, False, False]]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: min on and off | [False, False, True, True, True, False, True, True, True, False, True] | [False, False, True, True, True, False, False, False, False, False, True] | Failed |
| regression: safety during min on | [True, True, False, True, True, True, True] | [True, True, False, False, False, True, True] | Failed |
| regression: safety then quick recall | [True, True, False, False, True, True, True] | [True, True, False, False, False, False, True] | Failed |
| regression: exact min on | [True, True, False, True, True, True, True, False, False, True, True, True] | [True, True, False, False, False, True, True, False, False, False, True, True] | Failed |
| control: scenario 1 | [False, False, False, False, False, True, True, True, True, True, False, False, False, False, True, True, False, False, False, False, False, False] | [False, False, False, False, False, True, True, True, True, True, False, False, False, False, True, True, False, False, False, False, False, False] | Passed |
| regression: scenario 2 | [True, True, True, False, False, False, True, True, False, False, False, False, False, True] | [True, True, True, False, False, False, True, True, False, False, False, False, False, True] | Passed |
| regression: scenario 3 | [True, True, True, True, False, True, True, True, True, False, True] | [True, True, True, True, False, False, False, False, True, False, False] | Failed |
| control: scenario 4 | [False, False, False, False, False, False, False, False, False, False, False, False, False] | [False, False, False, False, False, False, False, False, False, False, False, False, False] | Passed |
SHA-256 / a4987050b771e6186ff5b02e7722b1d2b24a56924303abb99c2c002502d77132
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(min_on, min_off, startup_delay, calls):
running = False
on_at = None
off_at = None
out = []
for minute, (demand, safety_ok) in enumerate(calls):
if running:
if not safety_ok:
running = False
off_at = minute
elif not demand and minute - on_at >= min_on:
running = False
off_at = minute
elif demand and safety_ok and minute >= startup_delay:
if off_at is None or minute - off_at > min_off:
running = True
on_at = minute
out.append(running)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: min on and off',
[3,
4,
2,
[[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[False, False, True, True, True, False, False, False, False, False, True]],
['regression: safety during min on',
[5,
3,
0,
[[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, True, True]],
['regression: safety then quick recall',
[2,
4,
0,
[[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, False, True]],
['regression: exact min on',
[2,
3,
0,
[[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True]]],
[True, True, False, False, False, True, True, False, False, False, True, True]],
['control: scenario 1',
[3,
3,
4,
[[False, False],
[False, True],
[False, True],
[False, False],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, False],
[False, True],
[False, True],
[False, True],
[True, True],
[False, True],
[False, False],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True]]],
[False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False]],
['regression: scenario 2',
[5,
3,
0,
[[True, True],
[True, True],
[True, True],
[True, False],
[False, True],
[False, True],
[True, True],
[True, True],
[True, False],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True]]],
[True, True, True, False, False, False, True, True, False, False, False, False, False, True]],
['regression: scenario 3',
[3,
4,
0,
[[True, True],
[True, True],
[True, True],
[True, True],
[False, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[True, True, True, True, False, False, False, False, True, False, False]],
['control: scenario 4',
[5,
5,
4,
[[True, True],
[False, False],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, False],
[False, True],
[False, True],
[False, True]]],
[False, False, False, False, False, False, False, False, False, False, False, False, False]]],
[['regression: safety during min on',
[5,
3,
0,
[[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, True, True]],
['regression: exact min on',
[2,
3,
0,
[[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True]]],
[True, True, False, False, False, True, True, False, False, False, True, True]],
['regression: min on and off',
[3,
4,
2,
[[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[False, False, True, True, True, False, False, False, False, False, True]],
['regression: safety then quick recall',
[2,
4,
0,
[[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, False, True]],
['control: scenario 1',
[5,
3,
0,
[[False, True],
[False, True],
[False, True],
[False, False],
[False, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True]]],
[False, False, False, False, False, True, True, True, True, True, True, True]],
['regression: scenario 2',
[2,
5,
4,
[[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[True, True],
[False, True],
[True, True],
[False, True],
[True, True],
[True, True],
[False, False],
[False, True],
[False, True]]],
[False, False, False, False, False, True, True, True, False, False, False, False, False, False]],
['regression: scenario 3',
[3,
4,
0,
[[True, True],
[True, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, False],
[True, True],
[False, True],
[False, True]]],
[True,
False,
False,
False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
False,
True,
True,
True]],
['regression: scenario 4',
[2,
4,
2,
[[True, True],
[True, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[True, True],
[False, True],
[True, True],
[False, True],
[False, True],
[True, False],
[True, False]]],
[False, False, True, True, True, True, True, False, False, False, False, False, False, False, False]]],
[['regression: safety then quick recall',
[2,
4,
0,
[[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, False, True]],
['regression: scenario 3',
[2,
5,
0,
[[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, False],
[True, True],
[True, False],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True]]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True]],
['regression: min on and off',
[3,
4,
2,
[[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[False, False, True, True, True, False, False, False, False, False, True]],
['regression: safety during min on',
[5,
3,
0,
[[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, True, True]],
['regression: exact min on',
[2,
3,
0,
[[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True]]],
[True, True, False, False, False, True, True, False, False, False, True, True]],
['regression: scenario 1',
[2,
5,
2,
[[True, False],
[True, True],
[True, False],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True],
[False, True],
[False, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, False],
[True, True],
[True, False],
[True, True]]],
[False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
True,
False,
False]],
['regression: scenario 2',
[2,
4,
0,
[[False, True],
[True, True],
[True, False],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[False, True],
[False, True],
[False, True]]],
[False,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False]],
['control: scenario 4',
[5,
5,
4,
[[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, False],
[True, True],
[True, True],
[False, True],
[True, True],
[True, True],
[False, True]]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
False]]],
[['regression: exact min on',
[2,
3,
0,
[[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True]]],
[True, True, False, False, False, True, True, False, False, False, True, True]],
['regression: scenario 3',
[2,
3,
0,
[[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, False],
[False, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True]]],
[False,
False,
True,
True,
True,
False,
False,
False,
True,
True,
False,
False,
False,
True,
True,
True,
True,
True]],
['regression: min on and off',
[3,
4,
2,
[[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[False, False, True, True, True, False, False, False, False, False, True]],
['regression: safety during min on',
[5,
3,
0,
[[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, True, True]],
['regression: safety then quick recall',
[2,
4,
0,
[[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, False, True]],
['regression: scenario 1',
[5,
4,
2,
[[False, True],
[False, False],
[False, True],
[False, True],
[False, True],
[True, True],
[True, False],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True]]],
[False,
False,
False,
False,
False,
True,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
False]],
['regression: scenario 2',
[2,
4,
2,
[[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, False],
[False, True],
[False, True],
[False, True],
[False, False]]],
[False,
False,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
False,
False,
False,
False,
False]],
['regression: scenario 4',
[2,
5,
4,
[[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True]]],
[False, False, False, False, True, True, True, False, False, False, False, False, False, False]]],
[['regression: scenario 2',
[2,
4,
2,
[[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True]]],
[False,
False,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
True,
False]],
['regression: scenario 14',
[5,
5,
4,
[[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True]]],
[False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
True,
True,
True]],
['regression: min on and off',
[3,
4,
2,
[[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[False, False, True, True, True, False, False, False, False, False, True]],
['regression: safety during min on',
[5,
3,
0,
[[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, True, True]],
['regression: safety then quick recall',
[2,
4,
0,
[[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, False, True]],
['regression: exact min on',
[2,
3,
0,
[[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True]]],
[True, True, False, False, False, True, True, False, False, False, True, True]],
['control: scenario 1',
[3,
4,
0,
[[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[False, True],
[True, True],
[False, True],
[False, False],
[False, False],
[False, True]]],
[False, False, False, False, True, True, True, False, False, False, False]],
['regression: scenario 3',
[2,
5,
0,
[[True, True],
[True, True],
[True, False],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[False, True],
[False, True],
[False, True]]],
[True, True, False, False, False, False, False, False, True, True, False, False]]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: min on and off | [False, False, True, True, True, False, False, False, False, False, True] | [False, False, True, True, True, False, False, False, False, False, True] | Passed |
| regression: safety during min on | [True, True, False, False, False, False, True] | [True, True, False, False, False, True, True] | Failed |
| regression: safety then quick recall | [True, True, False, False, False, False, False] | [True, True, False, False, False, False, True] | Failed |
| regression: exact min on | [True, True, False, False, False, False, True, True, False, False, False, False] | [True, True, False, False, False, True, True, False, False, False, True, True] | Failed |
| control: scenario 1 | [False, False, False, False, False, True, True, True, True, True, False, False, False, False, True, True, False, False, False, False, False, False] | [False, False, False, False, False, True, True, True, True, True, False, False, False, False, True, True, False, False, False, False, False, False] | Passed |
| regression: scenario 2 | [True, True, True, False, False, False, False, True, False, False, False, False, False, True] | [True, True, True, False, False, False, True, True, False, False, False, False, False, True] | Failed |
| regression: scenario 3 | [True, True, True, True, False, False, False, False, False, False, True] | [True, True, True, True, False, False, False, False, True, False, False] | Failed |
| control: scenario 4 | [False, False, False, False, False, False, False, False, False, False, False, False, False] | [False, False, False, False, False, False, False, False, False, False, False, False, False] | Passed |
SHA-256 / cfa338680f430f1f6f239c41f20e0fc86b547fa43c52454e8bccd6c3a479fa2f
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(min_on, min_off, startup_delay, calls):
running = False
on_at = None
off_at = None
out = []
for minute, (demand, safety_ok) in enumerate(calls):
if running:
if not safety_ok:
running = False
off_at = minute
elif not demand and minute - on_at >= min_on:
running = False
off_at = minute
elif demand and safety_ok and minute >= startup_delay:
if off_at is None or minute - off_at >= min_off:
running = True
on_at = minute
out.append(running)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: min on and off',
[3,
4,
2,
[[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[False, False, True, True, True, False, False, False, False, False, True]],
['regression: safety during min on',
[5,
3,
0,
[[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, True, True]],
['regression: safety then quick recall',
[2,
4,
0,
[[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, False, True]],
['regression: exact min on',
[2,
3,
0,
[[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True]]],
[True, True, False, False, False, True, True, False, False, False, True, True]],
['control: scenario 1',
[3,
3,
4,
[[False, False],
[False, True],
[False, True],
[False, False],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, False],
[False, True],
[False, True],
[False, True],
[True, True],
[False, True],
[False, False],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True]]],
[False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False]],
['regression: scenario 2',
[5,
3,
0,
[[True, True],
[True, True],
[True, True],
[True, False],
[False, True],
[False, True],
[True, True],
[True, True],
[True, False],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True]]],
[True, True, True, False, False, False, True, True, False, False, False, False, False, True]],
['regression: scenario 3',
[3,
4,
0,
[[True, True],
[True, True],
[True, True],
[True, True],
[False, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[True, True, True, True, False, False, False, False, True, False, False]],
['control: scenario 4',
[5,
5,
4,
[[True, True],
[False, False],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, False],
[False, True],
[False, True],
[False, True]]],
[False, False, False, False, False, False, False, False, False, False, False, False, False]]],
[['regression: safety during min on',
[5,
3,
0,
[[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, True, True]],
['regression: exact min on',
[2,
3,
0,
[[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True]]],
[True, True, False, False, False, True, True, False, False, False, True, True]],
['regression: min on and off',
[3,
4,
2,
[[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[False, False, True, True, True, False, False, False, False, False, True]],
['regression: safety then quick recall',
[2,
4,
0,
[[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, False, True]],
['control: scenario 1',
[5,
3,
0,
[[False, True],
[False, True],
[False, True],
[False, False],
[False, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True]]],
[False, False, False, False, False, True, True, True, True, True, True, True]],
['regression: scenario 2',
[2,
5,
4,
[[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[True, True],
[False, True],
[True, True],
[False, True],
[True, True],
[True, True],
[False, False],
[False, True],
[False, True]]],
[False, False, False, False, False, True, True, True, False, False, False, False, False, False]],
['regression: scenario 3',
[3,
4,
0,
[[True, True],
[True, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, False],
[True, True],
[False, True],
[False, True]]],
[True,
False,
False,
False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
False,
True,
True,
True]],
['regression: scenario 4',
[2,
4,
2,
[[True, True],
[True, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[True, True],
[False, True],
[True, True],
[False, True],
[False, True],
[True, False],
[True, False]]],
[False, False, True, True, True, True, True, False, False, False, False, False, False, False, False]]],
[['regression: safety then quick recall',
[2,
4,
0,
[[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, False, True]],
['regression: scenario 3',
[2,
5,
0,
[[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, False],
[True, True],
[True, False],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True]]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True]],
['regression: min on and off',
[3,
4,
2,
[[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[False, False, True, True, True, False, False, False, False, False, True]],
['regression: safety during min on',
[5,
3,
0,
[[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, True, True]],
['regression: exact min on',
[2,
3,
0,
[[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True]]],
[True, True, False, False, False, True, True, False, False, False, True, True]],
['regression: scenario 1',
[2,
5,
2,
[[True, False],
[True, True],
[True, False],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True],
[False, True],
[False, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, False],
[True, True],
[True, False],
[True, True]]],
[False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
True,
False,
False]],
['regression: scenario 2',
[2,
4,
0,
[[False, True],
[True, True],
[True, False],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[False, True],
[False, True],
[False, True]]],
[False,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False]],
['control: scenario 4',
[5,
5,
4,
[[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, False],
[True, True],
[True, True],
[False, True],
[True, True],
[True, True],
[False, True]]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
False]]],
[['regression: exact min on',
[2,
3,
0,
[[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True]]],
[True, True, False, False, False, True, True, False, False, False, True, True]],
['regression: scenario 3',
[2,
3,
0,
[[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, False],
[False, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True]]],
[False,
False,
True,
True,
True,
False,
False,
False,
True,
True,
False,
False,
False,
True,
True,
True,
True,
True]],
['regression: min on and off',
[3,
4,
2,
[[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[False, False, True, True, True, False, False, False, False, False, True]],
['regression: safety during min on',
[5,
3,
0,
[[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, True, True]],
['regression: safety then quick recall',
[2,
4,
0,
[[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, False, True]],
['regression: scenario 1',
[5,
4,
2,
[[False, True],
[False, False],
[False, True],
[False, True],
[False, True],
[True, True],
[True, False],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True]]],
[False,
False,
False,
False,
False,
True,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
False]],
['regression: scenario 2',
[2,
4,
2,
[[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, False],
[False, True],
[False, True],
[False, True],
[False, False]]],
[False,
False,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
False,
False,
False,
False,
False]],
['regression: scenario 4',
[2,
5,
4,
[[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True]]],
[False, False, False, False, True, True, True, False, False, False, False, False, False, False]]],
[['regression: scenario 2',
[2,
4,
2,
[[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True]]],
[False,
False,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
True,
False]],
['regression: scenario 14',
[5,
5,
4,
[[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True]]],
[False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
True,
True,
True]],
['regression: min on and off',
[3,
4,
2,
[[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[False, False, True, True, True, False, False, False, False, False, True]],
['regression: safety during min on',
[5,
3,
0,
[[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, True, True]],
['regression: safety then quick recall',
[2,
4,
0,
[[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, False, True]],
['regression: exact min on',
[2,
3,
0,
[[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True]]],
[True, True, False, False, False, True, True, False, False, False, True, True]],
['control: scenario 1',
[3,
4,
0,
[[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[False, True],
[True, True],
[False, True],
[False, False],
[False, False],
[False, True]]],
[False, False, False, False, True, True, True, False, False, False, False]],
['regression: scenario 3',
[2,
5,
0,
[[True, True],
[True, True],
[True, False],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[False, True],
[False, True],
[False, True]]],
[True, True, False, False, False, False, False, False, True, True, False, False]]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: min on and off | [False, False, True, True, True, False, False, False, False, False, True] | [False, False, True, True, True, False, False, False, False, False, True] | Passed |
| regression: safety during min on | [True, True, False, False, False, True, True] | [True, True, False, False, False, True, True] | Passed |
| regression: safety then quick recall | [True, True, False, False, False, False, True] | [True, True, False, False, False, False, True] | Passed |
| regression: exact min on | [True, True, False, False, False, True, True, False, False, False, True, True] | [True, True, False, False, False, True, True, False, False, False, True, True] | Passed |
| control: scenario 1 | [False, False, False, False, False, True, True, True, True, True, False, False, False, False, True, True, False, False, False, False, False, False] | [False, False, False, False, False, True, True, True, True, True, False, False, False, False, True, True, False, False, False, False, False, False] | Passed |
| regression: scenario 2 | [True, True, True, False, False, False, True, True, False, False, False, False, False, True] | [True, True, True, False, False, False, True, True, False, False, False, False, False, True] | Passed |
| regression: scenario 3 | [True, True, True, True, False, False, False, False, True, False, False] | [True, True, True, True, False, False, False, False, True, False, False] | Passed |
| control: scenario 4 | [False, False, False, False, False, False, False, False, False, False, False, False, False] | [False, False, False, False, False, False, False, False, False, False, False, False, False] | Passed |
SHA-256 / b0d78ba6884f4722ca800061e1b2b974f9b7226ca95657936173adba4d7943a7
Verification & scope
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.
Observations recorded using Python 3.12.14 at 2026-09-29T14:51:45.260337+00:00.
Case digest / 0997ec7e02d2d8cd155dbf975dac50c82810da2b327658f086b73505beb77913