FA-92411 / HVAC thermostat control / Open access
Minimum on time is measured from the first ever start · case 01
After the first cycle the compressor may stop right after starting because its start time is stale.
ROOT CAUSE
The start time is only recorded on the first start.
VERIFIED REPAIR
Record the start time on every start.
Unsuccessful approach: Using the previous stop time as the start time still shortens the minimum run.
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
if on_at is None:
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: 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 7',
[5,
3,
4,
[[False, True],
[True, True],
[True, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[True, True],
[True, True],
[False, True]]],
[False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
False,
False,
False,
True,
True,
True,
True,
True,
True,
False]],
['control: 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: 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 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]]],
[['regression: scenario 6',
[2,
3,
0,
[[True, False],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, False],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[False, True]]],
[False, False, False, False, False, True, False, False, False, False, False, True, True]],
['regression: scenario 9',
[3,
3,
2,
[[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, False],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[True, True],
[True, False],
[True, True],
[True, True],
[False, False],
[True, True],
[True, True]]],
[False,
False,
False,
True,
True,
True,
True,
True,
False,
False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
True,
True]],
['control: 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: 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,
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]],
['control: 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 11',
[2,
4,
0,
[[False, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, False],
[True, False],
[True, True],
[False, True],
[True, False],
[True, True],
[True, True],
[True, True],
[False, False],
[False, True],
[False, True],
[False, True],
[True, True]]],
[False,
True,
True,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
True]],
['regression: scenario 13',
[2,
4,
0,
[[True, True],
[True, False],
[True, True],
[False, True],
[True, True],
[False, True],
[False, True],
[True, True],
[False, True],
[True, False],
[True, False],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, False],
[False, True],
[True, True]]],
[True,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True]],
['control: 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: 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]],
['control: 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]]],
[['regression: scenario 29',
[3,
4,
0,
[[False, True],
[False, False],
[True, True],
[False, True],
[False, True],
[True, True],
[True, False],
[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],
[True, True]]],
[False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
True]],
['regression: scenario 37',
[2,
3,
0,
[[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, False],
[True, True],
[False, 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,
False,
False,
False,
False,
True,
True]],
['control: 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: 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',
[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 15',
[3,
4,
0,
[[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, False],
[True, True],
[True, True],
[False, True],
[False, False],
[False, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, False],
[False, False],
[True, False],
[True, True],
[False, True],
[False, True],
[False, False]]],
[True,
True,
True,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 16',
[2,
4,
0,
[[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[True, True],
[True, True],
[True, False],
[True, True],
[False, True],
[True, True],
[True, True],
[True, True]]],
[True, True, True, True, True, False, False, False, False, True, True, True, True, True]],
['control: 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: 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]],
['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: scenario 1 | [False, False, False, False, False, True, True, True, True, True, False, False, False, False, True, False, 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] | Failed |
| regression: scenario 7 | [False, False, False, False, True, True, True, True, True, True, False, False, False, True, True, True, False, False, False, False] | [False, False, False, False, True, True, True, True, True, True, False, False, False, True, True, True, True, True, True, False] | Failed |
| control: 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 |
| 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: 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 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 |
SHA-256 / 201ef969117f3edad88bd0a6943042d88999d36b1857fad72eb82d6a7079b972
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 = off_at if off_at is not None else minute
out.append(running)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: 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 7',
[5,
3,
4,
[[False, True],
[True, True],
[True, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[True, True],
[True, True],
[False, True]]],
[False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
False,
False,
False,
True,
True,
True,
True,
True,
True,
False]],
['control: 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: 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 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]]],
[['regression: scenario 6',
[2,
3,
0,
[[True, False],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, False],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[False, True]]],
[False, False, False, False, False, True, False, False, False, False, False, True, True]],
['regression: scenario 9',
[3,
3,
2,
[[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, False],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[True, True],
[True, False],
[True, True],
[True, True],
[False, False],
[True, True],
[True, True]]],
[False,
False,
False,
True,
True,
True,
True,
True,
False,
False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
True,
True]],
['control: 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: 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,
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]],
['control: 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 11',
[2,
4,
0,
[[False, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, False],
[True, False],
[True, True],
[False, True],
[True, False],
[True, True],
[True, True],
[True, True],
[False, False],
[False, True],
[False, True],
[False, True],
[True, True]]],
[False,
True,
True,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
True]],
['regression: scenario 13',
[2,
4,
0,
[[True, True],
[True, False],
[True, True],
[False, True],
[True, True],
[False, True],
[False, True],
[True, True],
[False, True],
[True, False],
[True, False],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, False],
[False, True],
[True, True]]],
[True,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True]],
['control: 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: 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]],
['control: 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]]],
[['regression: scenario 29',
[3,
4,
0,
[[False, True],
[False, False],
[True, True],
[False, True],
[False, True],
[True, True],
[True, False],
[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],
[True, True]]],
[False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
True]],
['regression: scenario 37',
[2,
3,
0,
[[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, False],
[True, True],
[False, 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,
False,
False,
False,
False,
True,
True]],
['control: 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: 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',
[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 15',
[3,
4,
0,
[[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, False],
[True, True],
[True, True],
[False, True],
[False, False],
[False, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, False],
[False, False],
[True, False],
[True, True],
[False, True],
[False, True],
[False, False]]],
[True,
True,
True,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 16',
[2,
4,
0,
[[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[True, True],
[True, True],
[True, False],
[True, True],
[False, True],
[True, True],
[True, True],
[True, True]]],
[True, True, True, True, True, False, False, False, False, True, True, True, True, True]],
['control: 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: 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]],
['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: scenario 1 | [False, False, False, False, False, True, True, True, True, True, False, False, False, False, True, False, 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] | Failed |
| regression: scenario 7 | [False, False, False, False, True, True, True, True, True, True, False, False, False, True, True, True, False, False, False, False] | [False, False, False, False, True, True, True, True, True, True, False, False, False, True, True, True, True, True, True, False] | Failed |
| control: 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 |
| 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: 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 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 |
SHA-256 / ed6d84c5854bdf6588842a825f27c2600a0ea3bfc48ffe2ad6049dd050cdc89e
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: 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 7',
[5,
3,
4,
[[False, True],
[True, True],
[True, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[True, True],
[True, True],
[False, True]]],
[False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
False,
False,
False,
True,
True,
True,
True,
True,
True,
False]],
['control: 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: 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 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]]],
[['regression: scenario 6',
[2,
3,
0,
[[True, False],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, False],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[False, True]]],
[False, False, False, False, False, True, False, False, False, False, False, True, True]],
['regression: scenario 9',
[3,
3,
2,
[[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, False],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[True, True],
[True, False],
[True, True],
[True, True],
[False, False],
[True, True],
[True, True]]],
[False,
False,
False,
True,
True,
True,
True,
True,
False,
False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
True,
True]],
['control: 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: 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,
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]],
['control: 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 11',
[2,
4,
0,
[[False, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, False],
[True, False],
[True, True],
[False, True],
[True, False],
[True, True],
[True, True],
[True, True],
[False, False],
[False, True],
[False, True],
[False, True],
[True, True]]],
[False,
True,
True,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
True]],
['regression: scenario 13',
[2,
4,
0,
[[True, True],
[True, False],
[True, True],
[False, True],
[True, True],
[False, True],
[False, True],
[True, True],
[False, True],
[True, False],
[True, False],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, False],
[False, True],
[True, True]]],
[True,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True]],
['control: 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: 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]],
['control: 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]]],
[['regression: scenario 29',
[3,
4,
0,
[[False, True],
[False, False],
[True, True],
[False, True],
[False, True],
[True, True],
[True, False],
[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],
[True, True]]],
[False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
True]],
['regression: scenario 37',
[2,
3,
0,
[[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, False],
[True, True],
[False, 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,
False,
False,
False,
False,
True,
True]],
['control: 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: 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',
[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 15',
[3,
4,
0,
[[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, False],
[True, True],
[True, True],
[False, True],
[False, False],
[False, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, False],
[False, False],
[True, False],
[True, True],
[False, True],
[False, True],
[False, False]]],
[True,
True,
True,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 16',
[2,
4,
0,
[[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[True, True],
[True, True],
[True, False],
[True, True],
[False, True],
[True, True],
[True, True],
[True, True]]],
[True, True, True, True, True, False, False, False, False, True, True, True, True, True]],
['control: 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: 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]],
['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: 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 7 | [False, False, False, False, True, True, True, True, True, True, False, False, False, True, True, True, True, True, True, False] | [False, False, False, False, True, True, True, True, True, True, False, False, False, True, True, True, True, True, True, False] | Passed |
| control: 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 |
| 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: 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 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 |
SHA-256 / df4440aafb329eefef0e3824bd184b0635f5d1c7d922993ee268047c0d472a59
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.554989+00:00.
Case digest / e907d24c2b84e623e552ca72e0eabeb3c17bbe792ab45143dc844714d62e6805