FA-92396 / HVAC thermostat control / Open access
Minimum on time holds the compressor one minute too long · case 01
Every short call runs one minute longer than the configured minimum.
ROOT CAUSE
The minimum on test uses > instead of >=.
VERIFIED REPAIR
Allow stopping once minute - start >= min_on.
Unsuccessful approach: Subtracting one from min_on allows stopping a minute early.
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 - 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: 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: 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]],
['control: 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',
[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]],
['control: 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]],
['control: 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: 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 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: 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]],
['control: 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]],
['control: 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 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]],
['control: 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: 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 8',
[3,
4,
4,
[[False, True],
[True, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True]]],
[False,
False,
False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
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]],
['control: 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]],
['control: 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]],
['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 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: scenario 11',
[5,
5,
0,
[[True, False],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[True, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, False],
[True, True],
[True, True],
[True, True]]],
[False,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True]],
['regression: scenario 5',
[3,
5,
2,
[[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, True]]],
[False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False]],
['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]],
['control: 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]],
['control: 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',
[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]],
['control: 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 5',
[5,
3,
2,
[[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, False],
[False, True],
[False, True],
[False, True],
[True, False],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, False],
[False, True]]],
[False,
False,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
False,
False,
False]],
['regression: scenario 9',
[3,
4,
0,
[[False, True],
[True, True],
[False, True],
[False, True],
[True, True],
[False, False],
[False, False],
[False, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[False, True],
[False, True],
[False, True]]],
[False,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
False]],
['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]],
['control: 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]],
['control: 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]],
['regression: 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]],
['control: 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]]]]
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, True, True, True, True, False, False] | [False, False, True, True, True, False, False, False, False, False, True] | Failed |
| regression: exact min on | [True, True, True, True, True, True, True, False, False, False, True, True] | [True, True, False, False, False, True, True, False, False, False, True, True] | Failed |
| control: safety during min on | [True, True, False, False, False, True, True] | [True, True, False, False, False, True, True] | Passed |
| control: safety then quick recall | [True, True, False, False, False, False, True] | [True, True, False, False, False, False, 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 |
| control: 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 |
| control: 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 / 0ea0a11d2339cc3a8e6127a005b93ea4ce908adfb3b6d54f24228f29f66d3021
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 - 1:
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: 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: 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]],
['control: 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',
[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]],
['control: 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]],
['control: 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: 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 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: 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]],
['control: 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]],
['control: 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 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]],
['control: 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: 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 8',
[3,
4,
4,
[[False, True],
[True, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True]]],
[False,
False,
False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
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]],
['control: 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]],
['control: 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]],
['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 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: scenario 11',
[5,
5,
0,
[[True, False],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[True, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, False],
[True, True],
[True, True],
[True, True]]],
[False,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True]],
['regression: scenario 5',
[3,
5,
2,
[[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, True]]],
[False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False]],
['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]],
['control: 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]],
['control: 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',
[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]],
['control: 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 5',
[5,
3,
2,
[[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, False],
[False, True],
[False, True],
[False, True],
[True, False],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, False],
[False, True]]],
[False,
False,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
False,
False,
False]],
['regression: scenario 9',
[3,
4,
0,
[[False, True],
[True, True],
[False, True],
[False, True],
[True, True],
[False, False],
[False, False],
[False, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[False, True],
[False, True],
[False, True]]],
[False,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
False]],
['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]],
['control: 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]],
['control: 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]],
['regression: 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]],
['control: 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]]]]
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, False, False, False, False, True, False, False] | [False, False, True, True, True, False, False, False, False, False, True] | Failed |
| regression: exact min on | [True, False, False, False, True, True, True, False, False, False, True, True] | [True, True, False, False, False, True, True, False, False, False, True, True] | Failed |
| control: safety during min on | [True, True, False, False, False, True, True] | [True, True, False, False, False, True, True] | Passed |
| control: safety then quick recall | [True, True, False, False, False, False, True] | [True, True, False, False, False, False, 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 |
| control: 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 |
| control: 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 / bf5a4f05a248545d21c4bca06dc127e389d63cd1bfd8f0c421781f93caa1bc63
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: 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: 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]],
['control: 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',
[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]],
['control: 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]],
['control: 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: 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 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: 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]],
['control: 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]],
['control: 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 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]],
['control: 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: 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 8',
[3,
4,
4,
[[False, True],
[True, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True]]],
[False,
False,
False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
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]],
['control: 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]],
['control: 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]],
['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 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: scenario 11',
[5,
5,
0,
[[True, False],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[True, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, False],
[True, True],
[True, True],
[True, True]]],
[False,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True]],
['regression: scenario 5',
[3,
5,
2,
[[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, True]]],
[False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False]],
['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]],
['control: 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]],
['control: 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',
[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]],
['control: 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 5',
[5,
3,
2,
[[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, False],
[False, True],
[False, True],
[False, True],
[True, False],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, False],
[False, True]]],
[False,
False,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
False,
False,
False]],
['regression: scenario 9',
[3,
4,
0,
[[False, True],
[True, True],
[False, True],
[False, True],
[True, True],
[False, False],
[False, False],
[False, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[False, True],
[False, True],
[False, True]]],
[False,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
False]],
['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]],
['control: 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]],
['control: 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]],
['regression: 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]],
['control: 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]]]]
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: 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: safety during min on | [True, True, False, False, False, True, True] | [True, True, False, False, False, True, True] | Passed |
| control: safety then quick recall | [True, True, False, False, False, False, True] | [True, True, False, False, False, False, 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 |
| control: 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 |
| control: 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 / cc4dc54427d9f1a0616bad1179a57d15dabab224b8583c56513fec709ad16c37
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.219620+00:00.
Case digest / ea2437f50f2577ed49fb7cca869674e88ca424daf8efcd07e6fa01b33615811f