FA-92406 / HVAC thermostat control / Open access
Compressor starts immediately after power is restored · case 01
All units on a feeder start together after an outage because the power-up delay is skipped.
ROOT CAUSE
The start condition does not check the power-up delay.
VERIFIED REPAIR
Do not start before minute startup_delay.
Unsuccessful approach: Using a strict comparison delays the first start by an extra minute.
Case contract
Compressor protection sampled per minute; calls is a list of [demand, safety_ok]. After power-up the compressor may not start before minute startup_delay. Once started it runs at least min_on minutes even if demand ends; after stopping it stays off at least min_off minutes. A safety fault stops it immediately regardless of minimum on time, and that stop also starts the minimum off time; it cannot start while the safety is faulted. Return the compressor state per minute.
Why this case matters
Residential and light-commercial thermostats make these decisions sample by sample; each defect changes equipment calls in a way that shows up as short cycling, comfort complaints or equipment stress.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(min_on, min_off, startup_delay, calls):
running = False
on_at = None
off_at = None
out = []
for minute, (demand, safety_ok) in enumerate(calls):
if running:
if not safety_ok:
running = False
off_at = minute
elif not demand and minute - on_at >= min_on:
running = False
off_at = minute
elif demand and safety_ok:
if off_at is None or minute - off_at >= min_off:
running = True
on_at = minute
out.append(running)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: min on and off',
[3,
4,
2,
[[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[False, False, True, True, True, False, False, False, False, False, True]],
['regression: safety during min on',
[5,
3,
0,
[[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, True, True]],
['regression: safety then quick recall',
[2,
4,
0,
[[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, False, True]],
['regression: exact min on',
[2,
3,
0,
[[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True]]],
[True, True, False, False, False, True, True, False, False, False, True, True]],
['control: scenario 1',
[3,
3,
4,
[[False, False],
[False, True],
[False, True],
[False, False],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, False],
[False, True],
[False, True],
[False, True],
[True, True],
[False, True],
[False, False],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True]]],
[False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False]],
['regression: scenario 2',
[5,
3,
0,
[[True, True],
[True, True],
[True, True],
[True, False],
[False, True],
[False, True],
[True, True],
[True, True],
[True, False],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True]]],
[True, True, True, False, False, False, True, True, False, False, False, False, False, True]],
['regression: scenario 3',
[3,
4,
0,
[[True, True],
[True, True],
[True, True],
[True, True],
[False, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[True, True, True, True, False, False, False, False, True, False, False]],
['regression: 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: 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: safety during min on',
[5,
3,
0,
[[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, True, True]],
['regression: min on and off',
[3,
4,
2,
[[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[False, False, True, True, True, False, False, False, False, False, True]],
['regression: safety then quick recall',
[2,
4,
0,
[[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, False, True]],
['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,
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]],
['regression: scenario 4',
[2,
4,
2,
[[True, True],
[True, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[True, True],
[False, True],
[True, True],
[False, True],
[False, True],
[True, False],
[True, False]]],
[False, False, True, True, True, True, True, False, False, False, False, False, False, False, False]]],
[['regression: scenario 4',
[5,
5,
4,
[[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, False],
[True, True],
[True, True],
[False, True],
[True, True],
[True, True],
[False, True]]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
False]],
['regression: 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: min on and off',
[3,
4,
2,
[[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[False, False, True, True, True, False, False, False, False, False, True]],
['regression: safety during min on',
[5,
3,
0,
[[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, True, True]],
['regression: exact min on',
[2,
3,
0,
[[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True]]],
[True, True, False, False, False, True, True, False, False, False, True, True]],
['regression: scenario 1',
[2,
5,
2,
[[True, False],
[True, True],
[True, False],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True],
[False, True],
[False, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, False],
[True, True],
[True, False],
[True, True]]],
[False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
True,
False,
False]],
['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]],
['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 7',
[2,
3,
2,
[[True, True],
[False, True],
[False, True],
[False, False],
[False, True],
[True, False],
[True, True],
[False, True],
[False, True],
[True, False],
[True, True],
[True, True],
[True, False],
[True, True],
[False, True],
[False, False],
[False, True]]],
[False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
True,
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: min on and off',
[3,
4,
2,
[[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[False, False, True, True, True, False, False, False, False, False, True]],
['regression: safety during min on',
[5,
3,
0,
[[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, True, True]],
['regression: safety then quick recall',
[2,
4,
0,
[[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, False, True]],
['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]],
['regression: scenario 2',
[2,
4,
2,
[[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, False],
[False, True],
[False, True],
[False, True],
[False, False]]],
[False,
False,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
False,
False,
False,
False,
False]],
['control: scenario 3',
[2,
3,
0,
[[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, False],
[False, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True]]],
[False,
False,
True,
True,
True,
False,
False,
False,
True,
True,
False,
False,
False,
True,
True,
True,
True,
True]]],
[['regression: scenario 7',
[3,
5,
4,
[[True, True],
[True, True],
[True, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, False],
[True, True]]],
[False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
True,
False,
False]],
['regression: scenario 2',
[2,
4,
2,
[[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True]]],
[False,
False,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
True,
False]],
['regression: min on and off',
[3,
4,
2,
[[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[False, False, True, True, True, False, False, False, False, False, True]],
['regression: safety during min on',
[5,
3,
0,
[[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, True, True]],
['regression: safety then quick recall',
[2,
4,
0,
[[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, False, True]],
['regression: exact min on',
[2,
3,
0,
[[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True]]],
[True, True, False, False, False, True, True, False, False, False, True, True]],
['control: scenario 1',
[3,
4,
0,
[[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[False, True],
[True, True],
[False, True],
[False, False],
[False, False],
[False, True]]],
[False, False, False, False, True, True, True, False, False, False, False]],
['regression: scenario 3',
[2,
5,
0,
[[True, True],
[True, True],
[True, False],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[False, True],
[False, True],
[False, True]]],
[True, True, False, False, False, False, False, False, True, True, False, False]]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: min on and off | [True, True, True, False, False, False, False, True, True, False, False] | [False, False, True, True, True, False, False, False, False, False, True] | Failed |
| regression: safety during min on | [True, True, False, False, False, True, True] | [True, True, False, False, False, True, True] | Passed |
| regression: safety then quick recall | [True, True, False, False, False, False, True] | [True, True, False, False, False, False, True] | Passed |
| regression: exact min on | [True, True, False, False, False, True, True, False, False, False, True, True] | [True, True, False, False, False, True, True, False, False, False, True, True] | Passed |
| control: scenario 1 | [False, False, False, False, False, True, True, True, True, True, False, False, False, False, True, True, False, False, False, False, False, False] | [False, False, False, False, False, True, True, True, True, True, False, False, False, False, True, True, False, False, False, False, False, False] | Passed |
| regression: scenario 2 | [True, True, True, False, False, False, True, True, False, False, False, False, False, True] | [True, True, True, False, False, False, True, True, False, False, False, False, False, True] | Passed |
| regression: scenario 3 | [True, True, True, True, False, False, False, False, True, False, False] | [True, True, True, True, False, False, False, False, True, False, False] | Passed |
| regression: scenario 4 | [True, 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] | Failed |
SHA-256 / 1392009541a92a9857983afe40da34bddc3b80bf05a81947fdf2ddef1b80afde
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(min_on, min_off, startup_delay, calls):
running = False
on_at = None
off_at = None
out = []
for minute, (demand, safety_ok) in enumerate(calls):
if running:
if not safety_ok:
running = False
off_at = minute
elif not demand and minute - on_at >= min_on:
running = False
off_at = minute
elif demand and safety_ok and minute > startup_delay:
if off_at is None or minute - off_at >= min_off:
running = True
on_at = minute
out.append(running)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: min on and off',
[3,
4,
2,
[[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[False, False, True, True, True, False, False, False, False, False, True]],
['regression: safety during min on',
[5,
3,
0,
[[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, True, True]],
['regression: safety then quick recall',
[2,
4,
0,
[[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, False, True]],
['regression: exact min on',
[2,
3,
0,
[[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True]]],
[True, True, False, False, False, True, True, False, False, False, True, True]],
['control: scenario 1',
[3,
3,
4,
[[False, False],
[False, True],
[False, True],
[False, False],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, False],
[False, True],
[False, True],
[False, True],
[True, True],
[False, True],
[False, False],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True]]],
[False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False]],
['regression: scenario 2',
[5,
3,
0,
[[True, True],
[True, True],
[True, True],
[True, False],
[False, True],
[False, True],
[True, True],
[True, True],
[True, False],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True]]],
[True, True, True, False, False, False, True, True, False, False, False, False, False, True]],
['regression: scenario 3',
[3,
4,
0,
[[True, True],
[True, True],
[True, True],
[True, True],
[False, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[True, True, True, True, False, False, False, False, True, False, False]],
['regression: 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: 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: safety during min on',
[5,
3,
0,
[[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, True, True]],
['regression: min on and off',
[3,
4,
2,
[[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[False, False, True, True, True, False, False, False, False, False, True]],
['regression: safety then quick recall',
[2,
4,
0,
[[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, False, True]],
['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,
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]],
['regression: scenario 4',
[2,
4,
2,
[[True, True],
[True, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[True, True],
[False, True],
[True, True],
[False, True],
[False, True],
[True, False],
[True, False]]],
[False, False, True, True, True, True, True, False, False, False, False, False, False, False, False]]],
[['regression: scenario 4',
[5,
5,
4,
[[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, False],
[True, True],
[True, True],
[False, True],
[True, True],
[True, True],
[False, True]]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
False]],
['regression: 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: min on and off',
[3,
4,
2,
[[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[False, False, True, True, True, False, False, False, False, False, True]],
['regression: safety during min on',
[5,
3,
0,
[[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, True, True]],
['regression: exact min on',
[2,
3,
0,
[[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True]]],
[True, True, False, False, False, True, True, False, False, False, True, True]],
['regression: scenario 1',
[2,
5,
2,
[[True, False],
[True, True],
[True, False],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True],
[False, True],
[False, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, False],
[True, True],
[True, False],
[True, True]]],
[False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
True,
False,
False]],
['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]],
['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 7',
[2,
3,
2,
[[True, True],
[False, True],
[False, True],
[False, False],
[False, True],
[True, False],
[True, True],
[False, True],
[False, True],
[True, False],
[True, True],
[True, True],
[True, False],
[True, True],
[False, True],
[False, False],
[False, True]]],
[False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
True,
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: min on and off',
[3,
4,
2,
[[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[False, False, True, True, True, False, False, False, False, False, True]],
['regression: safety during min on',
[5,
3,
0,
[[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, True, True]],
['regression: safety then quick recall',
[2,
4,
0,
[[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, False, True]],
['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]],
['regression: scenario 2',
[2,
4,
2,
[[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, False],
[False, True],
[False, True],
[False, True],
[False, False]]],
[False,
False,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
False,
False,
False,
False,
False]],
['control: scenario 3',
[2,
3,
0,
[[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, False],
[False, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True]]],
[False,
False,
True,
True,
True,
False,
False,
False,
True,
True,
False,
False,
False,
True,
True,
True,
True,
True]]],
[['regression: scenario 7',
[3,
5,
4,
[[True, True],
[True, True],
[True, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, False],
[True, True]]],
[False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
True,
False,
False]],
['regression: scenario 2',
[2,
4,
2,
[[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True]]],
[False,
False,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
True,
False]],
['regression: min on and off',
[3,
4,
2,
[[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[False, False, True, True, True, False, False, False, False, False, True]],
['regression: safety during min on',
[5,
3,
0,
[[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, True, True]],
['regression: safety then quick recall',
[2,
4,
0,
[[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, False, True]],
['regression: exact min on',
[2,
3,
0,
[[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True]]],
[True, True, False, False, False, True, True, False, False, False, True, True]],
['control: scenario 1',
[3,
4,
0,
[[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[False, True],
[True, True],
[False, True],
[False, False],
[False, False],
[False, True]]],
[False, False, False, False, True, True, True, False, False, False, False]],
['regression: scenario 3',
[2,
5,
0,
[[True, True],
[True, True],
[True, False],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[False, True],
[False, True],
[False, True]]],
[True, True, False, False, False, False, False, False, True, True, False, False]]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: min on and off | [False, False, False, False, False, False, True, True, True, False, False] | [False, False, True, True, True, False, False, False, False, False, True] | Failed |
| regression: safety during min on | [False, False, False, True, True, True, True] | [True, True, False, False, False, True, True] | Failed |
| regression: safety then quick recall | [False, True, False, False, False, False, True] | [True, True, False, False, False, False, True] | Failed |
| regression: exact min on | [False, False, False, True, True, True, True, False, False, False, True, True] | [True, True, False, False, False, True, True, False, False, False, True, True] | Failed |
| control: scenario 1 | [False, False, False, False, False, True, True, True, True, True, False, False, False, False, True, True, False, False, False, False, False, False] | [False, False, False, False, False, True, True, True, True, True, False, False, False, False, True, True, False, False, False, False, False, False] | Passed |
| regression: scenario 2 | [False, 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] | Failed |
| regression: scenario 3 | [False, True, True, True, False, False, False, False, True, False, False] | [True, True, True, True, False, False, False, False, True, False, False] | Failed |
| regression: 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 / 50bf5b7e6a31a09fa989a69fe6492ff654ad70577c8655b432acdbefcfeb6941
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(min_on, min_off, startup_delay, calls):
running = False
on_at = None
off_at = None
out = []
for minute, (demand, safety_ok) in enumerate(calls):
if running:
if not safety_ok:
running = False
off_at = minute
elif not demand and minute - on_at >= min_on:
running = False
off_at = minute
elif demand and safety_ok and minute >= startup_delay:
if off_at is None or minute - off_at >= min_off:
running = True
on_at = minute
out.append(running)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: min on and off',
[3,
4,
2,
[[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[False, False, True, True, True, False, False, False, False, False, True]],
['regression: safety during min on',
[5,
3,
0,
[[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, True, True]],
['regression: safety then quick recall',
[2,
4,
0,
[[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, False, True]],
['regression: exact min on',
[2,
3,
0,
[[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True]]],
[True, True, False, False, False, True, True, False, False, False, True, True]],
['control: scenario 1',
[3,
3,
4,
[[False, False],
[False, True],
[False, True],
[False, False],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, False],
[False, True],
[False, True],
[False, True],
[True, True],
[False, True],
[False, False],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True]]],
[False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False]],
['regression: scenario 2',
[5,
3,
0,
[[True, True],
[True, True],
[True, True],
[True, False],
[False, True],
[False, True],
[True, True],
[True, True],
[True, False],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True]]],
[True, True, True, False, False, False, True, True, False, False, False, False, False, True]],
['regression: scenario 3',
[3,
4,
0,
[[True, True],
[True, True],
[True, True],
[True, True],
[False, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[True, True, True, True, False, False, False, False, True, False, False]],
['regression: 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: 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: safety during min on',
[5,
3,
0,
[[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, True, True]],
['regression: min on and off',
[3,
4,
2,
[[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[False, False, True, True, True, False, False, False, False, False, True]],
['regression: safety then quick recall',
[2,
4,
0,
[[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, False, True]],
['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,
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]],
['regression: scenario 4',
[2,
4,
2,
[[True, True],
[True, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[True, True],
[False, True],
[True, True],
[False, True],
[False, True],
[True, False],
[True, False]]],
[False, False, True, True, True, True, True, False, False, False, False, False, False, False, False]]],
[['regression: scenario 4',
[5,
5,
4,
[[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, False],
[True, True],
[True, True],
[False, True],
[True, True],
[True, True],
[False, True]]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
False]],
['regression: 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: min on and off',
[3,
4,
2,
[[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[False, False, True, True, True, False, False, False, False, False, True]],
['regression: safety during min on',
[5,
3,
0,
[[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, True, True]],
['regression: exact min on',
[2,
3,
0,
[[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True]]],
[True, True, False, False, False, True, True, False, False, False, True, True]],
['regression: scenario 1',
[2,
5,
2,
[[True, False],
[True, True],
[True, False],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True],
[False, True],
[False, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, False],
[True, True],
[True, False],
[True, True]]],
[False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
True,
False,
False]],
['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]],
['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 7',
[2,
3,
2,
[[True, True],
[False, True],
[False, True],
[False, False],
[False, True],
[True, False],
[True, True],
[False, True],
[False, True],
[True, False],
[True, True],
[True, True],
[True, False],
[True, True],
[False, True],
[False, False],
[False, True]]],
[False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
True,
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: min on and off',
[3,
4,
2,
[[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[False, False, True, True, True, False, False, False, False, False, True]],
['regression: safety during min on',
[5,
3,
0,
[[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, True, True]],
['regression: safety then quick recall',
[2,
4,
0,
[[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, False, True]],
['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]],
['regression: scenario 2',
[2,
4,
2,
[[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, False],
[False, True],
[False, True],
[False, True],
[False, False]]],
[False,
False,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
False,
False,
False,
False,
False]],
['control: scenario 3',
[2,
3,
0,
[[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[False, True],
[False, False],
[False, False],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True]]],
[False,
False,
True,
True,
True,
False,
False,
False,
True,
True,
False,
False,
False,
True,
True,
True,
True,
True]]],
[['regression: scenario 7',
[3,
5,
4,
[[True, True],
[True, True],
[True, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, False],
[True, True]]],
[False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
True,
False,
False]],
['regression: scenario 2',
[2,
4,
2,
[[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True]]],
[False,
False,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
True,
False]],
['regression: min on and off',
[3,
4,
2,
[[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, False],
[True, True]]],
[False, False, True, True, True, False, False, False, False, False, True]],
['regression: safety during min on',
[5,
3,
0,
[[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, True, True]],
['regression: safety then quick recall',
[2,
4,
0,
[[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
[True, True, False, False, False, False, True]],
['regression: exact min on',
[2,
3,
0,
[[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[True, True],
[True, True]]],
[True, True, False, False, False, True, True, False, False, False, True, True]],
['control: scenario 1',
[3,
4,
0,
[[False, True],
[False, True],
[False, True],
[False, True],
[True, True],
[False, True],
[True, True],
[False, True],
[False, False],
[False, False],
[False, True]]],
[False, False, False, False, True, True, True, False, False, False, False]],
['regression: scenario 3',
[2,
5,
0,
[[True, True],
[True, True],
[True, False],
[False, True],
[True, True],
[True, True],
[False, True],
[False, True],
[True, True],
[False, True],
[False, True],
[False, True]]],
[True, True, False, False, False, False, False, False, True, True, False, False]]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: min on and off | [False, False, True, True, True, False, False, False, False, False, True] | [False, False, True, True, True, False, False, False, False, False, True] | Passed |
| regression: safety during min on | [True, True, False, False, False, True, True] | [True, True, False, False, False, True, True] | Passed |
| regression: safety then quick recall | [True, True, False, False, False, False, True] | [True, True, False, False, False, False, True] | Passed |
| regression: exact min on | [True, True, False, False, False, True, True, False, False, False, True, True] | [True, True, False, False, False, True, True, False, False, False, True, True] | Passed |
| control: scenario 1 | [False, False, False, False, False, True, True, True, True, True, False, False, False, False, True, True, False, False, False, False, False, False] | [False, False, False, False, False, True, True, True, True, True, False, False, False, False, True, True, False, False, False, False, False, False] | Passed |
| regression: scenario 2 | [True, True, True, False, False, False, True, True, False, False, False, False, False, True] | [True, True, True, False, False, False, True, True, False, False, False, False, False, True] | Passed |
| regression: scenario 3 | [True, True, True, True, False, False, False, False, True, False, False] | [True, True, True, True, False, False, False, False, True, False, False] | Passed |
| regression: 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 / ff7c80ed3aa874eacad678bfd4b39decb46b14d47e3a12bd1478842f5c89584d
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.345074+00:00.
Case digest / f13000bc571e05d9e960bf90682610efd008318f38beea611d089cb7587569a2