FAILURE MAP
← Case archive

FA-92396 / HVAC thermostat control / Open access

Minimum on time holds the compressor one minute too long · case 01

Every short call runs one minute longer than the configured minimum.

Verified by executionVariant 1 · 8 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

The minimum on test uses > instead of >=.

VERIFIED REPAIR

Allow stopping once minute - start >= min_on.

Unsuccessful approach: Subtracting one from min_on allows stopping a minute early.

Case contract

Compressor protection sampled per minute; calls is a list of [demand, safety_ok]. After power-up the compressor may not start before minute startup_delay. Once started it runs at least min_on minutes even if demand ends; after stopping it stays off at least min_off minutes. A safety fault stops it immediately regardless of minimum on time, and that stop also starts the minimum off time; it cannot start while the safety is faulted. Return the compressor state per minute.

Why this case matters

Residential and light-commercial thermostats make these decisions sample by sample; each defect changes equipment calls in a way that shows up as short cycling, comfort complaints or equipment stress.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(min_on, min_off, startup_delay, calls):
    running = False
    on_at = None
    off_at = None
    out = []
    for minute, (demand, safety_ok) in enumerate(calls):
        if running:
            if not safety_ok:
                running = False
                off_at = minute
            elif not demand and minute - on_at > min_on:
                running = False
                off_at = minute
        elif demand and safety_ok and minute >= startup_delay:
            if off_at is None or minute - off_at >= min_off:
                running = True
                on_at = minute
        out.append(running)
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: min on and off',
   [3,
    4,
    2,
    [[True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, False],
     [True, True]]],
   [False, False, True, True, True, False, False, False, False, False, True]],
  ['regression: exact min on',
   [2,
    3,
    0,
    [[True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True]]],
   [True, True, False, False, False, True, True, False, False, False, True, True]],
  ['control: safety during min on',
   [5,
    3,
    0,
    [[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
   [True, True, False, False, False, True, True]],
  ['control: safety then quick recall',
   [2,
    4,
    0,
    [[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
   [True, True, False, False, False, False, True]],
  ['control: scenario 1',
   [3,
    3,
    4,
    [[False, False],
     [False, True],
     [False, True],
     [False, False],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, False],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [False, True],
     [False, False],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True]]],
   [False,
    False,
    False,
    False,
    False,
    True,
    True,
    True,
    True,
    True,
    False,
    False,
    False,
    False,
    True,
    True,
    False,
    False,
    False,
    False,
    False,
    False]],
  ['control: scenario 2',
   [5,
    3,
    0,
    [[True, True],
     [True, True],
     [True, True],
     [True, False],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, False],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True]]],
   [True, True, True, False, False, False, True, True, False, False, False, False, False, True]],
  ['control: scenario 3',
   [3,
    4,
    0,
    [[True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, False],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, False],
     [True, True]]],
   [True, True, True, True, False, False, False, False, True, False, False]],
  ['control: scenario 4',
   [5,
    5,
    4,
    [[True, True],
     [False, False],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, False],
     [False, True],
     [False, True],
     [False, True]]],
   [False, False, False, False, False, False, False, False, False, False, False, False, False]]],
 [['regression: exact min on',
   [2,
    3,
    0,
    [[True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True]]],
   [True, True, False, False, False, True, True, False, False, False, True, True]],
  ['regression: scenario 2',
   [2,
    5,
    4,
    [[False, True],
     [False, True],
     [True, True],
     [True, True],
     [False, True],
     [True, True],
     [False, True],
     [True, True],
     [False, True],
     [True, True],
     [True, True],
     [False, False],
     [False, True],
     [False, True]]],
   [False, False, False, False, False, True, True, True, False, False, False, False, False, False]],
  ['regression: min on and off',
   [3,
    4,
    2,
    [[True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, False],
     [True, True]]],
   [False, False, True, True, True, False, False, False, False, False, True]],
  ['control: safety during min on',
   [5,
    3,
    0,
    [[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
   [True, True, False, False, False, True, True]],
  ['control: safety then quick recall',
   [2,
    4,
    0,
    [[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
   [True, True, False, False, False, False, True]],
  ['control: scenario 1',
   [5,
    3,
    0,
    [[False, True],
     [False, True],
     [False, True],
     [False, False],
     [False, False],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True]]],
   [False, False, False, False, False, True, True, True, True, True, True, True]],
  ['regression: scenario 3',
   [3,
    4,
    0,
    [[True, True],
     [True, False],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [True, True],
     [True, True],
     [False, True],
     [False, False],
     [True, True],
     [False, True],
     [False, True]]],
   [True,
    False,
    False,
    False,
    False,
    True,
    True,
    True,
    True,
    False,
    False,
    False,
    False,
    False,
    True,
    True,
    True]],
  ['control: scenario 4',
   [2,
    4,
    2,
    [[True, True],
     [True, False],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [True, True],
     [False, True],
     [True, True],
     [False, True],
     [False, True],
     [True, False],
     [True, False]]],
   [False, False, True, True, True, True, True, False, False, False, False, False, False, False, False]]],
 [['regression: scenario 1',
   [2,
    5,
    2,
    [[True, False],
     [True, True],
     [True, False],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, False],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [True, False],
     [True, True],
     [True, False],
     [True, True]]],
   [False,
    False,
    False,
    True,
    True,
    False,
    False,
    False,
    False,
    False,
    False,
    True,
    True,
    False,
    False,
    False,
    False,
    False,
    False,
    True,
    False,
    False]],
  ['regression: scenario 8',
   [3,
    4,
    4,
    [[False, True],
     [True, False],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [False, True]]],
   [False,
    False,
    False,
    False,
    True,
    True,
    True,
    True,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    True,
    True,
    True]],
  ['regression: min on and off',
   [3,
    4,
    2,
    [[True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, False],
     [True, True]]],
   [False, False, True, True, True, False, False, False, False, False, True]],
  ['control: safety during min on',
   [5,
    3,
    0,
    [[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
   [True, True, False, False, False, True, True]],
  ['control: safety then quick recall',
   [2,
    4,
    0,
    [[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
   [True, True, False, False, False, False, True]],
  ['regression: exact min on',
   [2,
    3,
    0,
    [[True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True]]],
   [True, True, False, False, False, True, True, False, False, False, True, True]],
  ['regression: scenario 2',
   [2,
    4,
    0,
    [[False, True],
     [True, True],
     [True, False],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True]]],
   [False,
    True,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    True,
    True,
    False,
    False,
    False,
    False,
    False,
    False]],
  ['control: scenario 3',
   [2,
    5,
    0,
    [[False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [True, False],
     [True, True],
     [True, False],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True]]],
   [False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    True,
    False,
    False,
    False,
    False,
    False,
    True,
    True,
    True,
    True,
    True]]],
 [['regression: scenario 11',
   [5,
    5,
    0,
    [[True, False],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [False, True],
     [True, True],
     [False, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [True, False],
     [True, True],
     [True, True],
     [True, True]]],
   [False,
    True,
    True,
    True,
    True,
    True,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    True,
    True,
    True]],
  ['regression: scenario 5',
   [3,
    5,
    2,
    [[False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True]]],
   [False,
    False,
    False,
    False,
    False,
    True,
    True,
    True,
    True,
    True,
    True,
    True,
    True,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False]],
  ['regression: min on and off',
   [3,
    4,
    2,
    [[True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, False],
     [True, True]]],
   [False, False, True, True, True, False, False, False, False, False, True]],
  ['control: safety during min on',
   [5,
    3,
    0,
    [[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
   [True, True, False, False, False, True, True]],
  ['control: safety then quick recall',
   [2,
    4,
    0,
    [[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
   [True, True, False, False, False, False, True]],
  ['regression: exact min on',
   [2,
    3,
    0,
    [[True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True]]],
   [True, True, False, False, False, True, True, False, False, False, True, True]],
  ['control: scenario 1',
   [5,
    4,
    2,
    [[False, True],
     [False, False],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, False],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True]]],
   [False,
    False,
    False,
    False,
    False,
    True,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    True,
    True,
    True,
    True,
    True,
    True,
    True,
    False]],
  ['control: scenario 2',
   [2,
    4,
    2,
    [[True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, False],
     [False, True],
     [False, True],
     [False, True],
     [False, False]]],
   [False,
    False,
    True,
    True,
    True,
    False,
    False,
    False,
    False,
    True,
    True,
    True,
    False,
    False,
    False,
    False,
    False]]],
 [['regression: scenario 5',
   [5,
    3,
    2,
    [[True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, False],
     [False, True],
     [False, True],
     [False, True],
     [True, False],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [False, False],
     [False, True]]],
   [False,
    False,
    True,
    True,
    True,
    True,
    True,
    False,
    False,
    False,
    False,
    False,
    True,
    True,
    True,
    True,
    True,
    False,
    False,
    False]],
  ['regression: scenario 9',
   [3,
    4,
    0,
    [[False, True],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [False, False],
     [False, False],
     [False, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True]]],
   [False,
    True,
    True,
    True,
    True,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    True,
    True,
    True,
    False]],
  ['regression: min on and off',
   [3,
    4,
    2,
    [[True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, False],
     [True, True]]],
   [False, False, True, True, True, False, False, False, False, False, True]],
  ['control: safety during min on',
   [5,
    3,
    0,
    [[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
   [True, True, False, False, False, True, True]],
  ['control: safety then quick recall',
   [2,
    4,
    0,
    [[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
   [True, True, False, False, False, False, True]],
  ['regression: exact min on',
   [2,
    3,
    0,
    [[True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True]]],
   [True, True, False, False, False, True, True, False, False, False, True, True]],
  ['regression: scenario 1',
   [3,
    4,
    0,
    [[False, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [False, True],
     [True, True],
     [False, True],
     [False, False],
     [False, False],
     [False, True]]],
   [False, False, False, False, True, True, True, False, False, False, False]],
  ['control: scenario 2',
   [2,
    4,
    2,
    [[True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True]]],
   [False,
    False,
    True,
    True,
    True,
    False,
    False,
    False,
    False,
    True,
    True,
    True,
    True,
    True,
    True,
    True,
    True,
    True,
    False]]]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
regression: min on and off[False, False, True, True, True, True, True, True, True, False, False][False, False, True, True, True, False, False, False, False, False, True]Failed
regression: exact min on[True, True, True, True, True, True, True, False, False, False, True, True][True, True, False, False, False, True, True, False, False, False, True, True]Failed
control: safety during min on[True, True, False, False, False, True, True][True, True, False, False, False, True, True]Passed
control: safety then quick recall[True, True, False, False, False, False, True][True, True, False, False, False, False, True]Passed
control: scenario 1[False, False, False, False, False, True, True, True, True, True, False, False, False, False, True, True, False, False, False, False, False, False][False, False, False, False, False, True, True, True, True, True, False, False, False, False, True, True, False, False, False, False, False, False]Passed
control: scenario 2[True, True, True, False, False, False, True, True, False, False, False, False, False, True][True, True, True, False, False, False, True, True, False, False, False, False, False, True]Passed
control: scenario 3[True, True, True, True, False, False, False, False, True, False, False][True, True, True, True, False, False, False, False, True, False, False]Passed
control: scenario 4[False, False, False, False, False, False, False, False, False, False, False, False, False][False, False, False, False, False, False, False, False, False, False, False, False, False]Passed

SHA-256 / 0ea0a11d2339cc3a8e6127a005b93ea4ce908adfb3b6d54f24228f29f66d3021

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(min_on, min_off, startup_delay, calls):
    running = False
    on_at = None
    off_at = None
    out = []
    for minute, (demand, safety_ok) in enumerate(calls):
        if running:
            if not safety_ok:
                running = False
                off_at = minute
            elif not demand and minute - on_at >= min_on - 1:
                running = False
                off_at = minute
        elif demand and safety_ok and minute >= startup_delay:
            if off_at is None or minute - off_at >= min_off:
                running = True
                on_at = minute
        out.append(running)
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: min on and off',
   [3,
    4,
    2,
    [[True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, False],
     [True, True]]],
   [False, False, True, True, True, False, False, False, False, False, True]],
  ['regression: exact min on',
   [2,
    3,
    0,
    [[True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True]]],
   [True, True, False, False, False, True, True, False, False, False, True, True]],
  ['control: safety during min on',
   [5,
    3,
    0,
    [[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
   [True, True, False, False, False, True, True]],
  ['control: safety then quick recall',
   [2,
    4,
    0,
    [[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
   [True, True, False, False, False, False, True]],
  ['control: scenario 1',
   [3,
    3,
    4,
    [[False, False],
     [False, True],
     [False, True],
     [False, False],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, False],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [False, True],
     [False, False],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True]]],
   [False,
    False,
    False,
    False,
    False,
    True,
    True,
    True,
    True,
    True,
    False,
    False,
    False,
    False,
    True,
    True,
    False,
    False,
    False,
    False,
    False,
    False]],
  ['control: scenario 2',
   [5,
    3,
    0,
    [[True, True],
     [True, True],
     [True, True],
     [True, False],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, False],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True]]],
   [True, True, True, False, False, False, True, True, False, False, False, False, False, True]],
  ['control: scenario 3',
   [3,
    4,
    0,
    [[True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, False],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, False],
     [True, True]]],
   [True, True, True, True, False, False, False, False, True, False, False]],
  ['control: scenario 4',
   [5,
    5,
    4,
    [[True, True],
     [False, False],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, False],
     [False, True],
     [False, True],
     [False, True]]],
   [False, False, False, False, False, False, False, False, False, False, False, False, False]]],
 [['regression: exact min on',
   [2,
    3,
    0,
    [[True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True]]],
   [True, True, False, False, False, True, True, False, False, False, True, True]],
  ['regression: scenario 2',
   [2,
    5,
    4,
    [[False, True],
     [False, True],
     [True, True],
     [True, True],
     [False, True],
     [True, True],
     [False, True],
     [True, True],
     [False, True],
     [True, True],
     [True, True],
     [False, False],
     [False, True],
     [False, True]]],
   [False, False, False, False, False, True, True, True, False, False, False, False, False, False]],
  ['regression: min on and off',
   [3,
    4,
    2,
    [[True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, False],
     [True, True]]],
   [False, False, True, True, True, False, False, False, False, False, True]],
  ['control: safety during min on',
   [5,
    3,
    0,
    [[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
   [True, True, False, False, False, True, True]],
  ['control: safety then quick recall',
   [2,
    4,
    0,
    [[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
   [True, True, False, False, False, False, True]],
  ['control: scenario 1',
   [5,
    3,
    0,
    [[False, True],
     [False, True],
     [False, True],
     [False, False],
     [False, False],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True]]],
   [False, False, False, False, False, True, True, True, True, True, True, True]],
  ['regression: scenario 3',
   [3,
    4,
    0,
    [[True, True],
     [True, False],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [True, True],
     [True, True],
     [False, True],
     [False, False],
     [True, True],
     [False, True],
     [False, True]]],
   [True,
    False,
    False,
    False,
    False,
    True,
    True,
    True,
    True,
    False,
    False,
    False,
    False,
    False,
    True,
    True,
    True]],
  ['control: scenario 4',
   [2,
    4,
    2,
    [[True, True],
     [True, False],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [True, True],
     [False, True],
     [True, True],
     [False, True],
     [False, True],
     [True, False],
     [True, False]]],
   [False, False, True, True, True, True, True, False, False, False, False, False, False, False, False]]],
 [['regression: scenario 1',
   [2,
    5,
    2,
    [[True, False],
     [True, True],
     [True, False],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, False],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [True, False],
     [True, True],
     [True, False],
     [True, True]]],
   [False,
    False,
    False,
    True,
    True,
    False,
    False,
    False,
    False,
    False,
    False,
    True,
    True,
    False,
    False,
    False,
    False,
    False,
    False,
    True,
    False,
    False]],
  ['regression: scenario 8',
   [3,
    4,
    4,
    [[False, True],
     [True, False],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [False, True]]],
   [False,
    False,
    False,
    False,
    True,
    True,
    True,
    True,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    True,
    True,
    True]],
  ['regression: min on and off',
   [3,
    4,
    2,
    [[True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, False],
     [True, True]]],
   [False, False, True, True, True, False, False, False, False, False, True]],
  ['control: safety during min on',
   [5,
    3,
    0,
    [[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
   [True, True, False, False, False, True, True]],
  ['control: safety then quick recall',
   [2,
    4,
    0,
    [[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
   [True, True, False, False, False, False, True]],
  ['regression: exact min on',
   [2,
    3,
    0,
    [[True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True]]],
   [True, True, False, False, False, True, True, False, False, False, True, True]],
  ['regression: scenario 2',
   [2,
    4,
    0,
    [[False, True],
     [True, True],
     [True, False],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True]]],
   [False,
    True,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    True,
    True,
    False,
    False,
    False,
    False,
    False,
    False]],
  ['control: scenario 3',
   [2,
    5,
    0,
    [[False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [True, False],
     [True, True],
     [True, False],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True]]],
   [False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    True,
    False,
    False,
    False,
    False,
    False,
    True,
    True,
    True,
    True,
    True]]],
 [['regression: scenario 11',
   [5,
    5,
    0,
    [[True, False],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [False, True],
     [True, True],
     [False, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [True, False],
     [True, True],
     [True, True],
     [True, True]]],
   [False,
    True,
    True,
    True,
    True,
    True,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    True,
    True,
    True]],
  ['regression: scenario 5',
   [3,
    5,
    2,
    [[False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True]]],
   [False,
    False,
    False,
    False,
    False,
    True,
    True,
    True,
    True,
    True,
    True,
    True,
    True,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False]],
  ['regression: min on and off',
   [3,
    4,
    2,
    [[True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, False],
     [True, True]]],
   [False, False, True, True, True, False, False, False, False, False, True]],
  ['control: safety during min on',
   [5,
    3,
    0,
    [[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
   [True, True, False, False, False, True, True]],
  ['control: safety then quick recall',
   [2,
    4,
    0,
    [[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
   [True, True, False, False, False, False, True]],
  ['regression: exact min on',
   [2,
    3,
    0,
    [[True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True]]],
   [True, True, False, False, False, True, True, False, False, False, True, True]],
  ['control: scenario 1',
   [5,
    4,
    2,
    [[False, True],
     [False, False],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, False],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True]]],
   [False,
    False,
    False,
    False,
    False,
    True,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    True,
    True,
    True,
    True,
    True,
    True,
    True,
    False]],
  ['control: scenario 2',
   [2,
    4,
    2,
    [[True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, False],
     [False, True],
     [False, True],
     [False, True],
     [False, False]]],
   [False,
    False,
    True,
    True,
    True,
    False,
    False,
    False,
    False,
    True,
    True,
    True,
    False,
    False,
    False,
    False,
    False]]],
 [['regression: scenario 5',
   [5,
    3,
    2,
    [[True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, False],
     [False, True],
     [False, True],
     [False, True],
     [True, False],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [False, False],
     [False, True]]],
   [False,
    False,
    True,
    True,
    True,
    True,
    True,
    False,
    False,
    False,
    False,
    False,
    True,
    True,
    True,
    True,
    True,
    False,
    False,
    False]],
  ['regression: scenario 9',
   [3,
    4,
    0,
    [[False, True],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [False, False],
     [False, False],
     [False, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True]]],
   [False,
    True,
    True,
    True,
    True,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    True,
    True,
    True,
    False]],
  ['regression: min on and off',
   [3,
    4,
    2,
    [[True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, False],
     [True, True]]],
   [False, False, True, True, True, False, False, False, False, False, True]],
  ['control: safety during min on',
   [5,
    3,
    0,
    [[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
   [True, True, False, False, False, True, True]],
  ['control: safety then quick recall',
   [2,
    4,
    0,
    [[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
   [True, True, False, False, False, False, True]],
  ['regression: exact min on',
   [2,
    3,
    0,
    [[True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True]]],
   [True, True, False, False, False, True, True, False, False, False, True, True]],
  ['regression: scenario 1',
   [3,
    4,
    0,
    [[False, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [False, True],
     [True, True],
     [False, True],
     [False, False],
     [False, False],
     [False, True]]],
   [False, False, False, False, True, True, True, False, False, False, False]],
  ['control: scenario 2',
   [2,
    4,
    2,
    [[True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True]]],
   [False,
    False,
    True,
    True,
    True,
    False,
    False,
    False,
    False,
    True,
    True,
    True,
    True,
    True,
    True,
    True,
    True,
    True,
    False]]]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
regression: min on and off[False, False, True, True, False, False, False, False, True, False, False][False, False, True, True, True, False, False, False, False, False, True]Failed
regression: exact min on[True, False, False, False, True, True, True, False, False, False, True, True][True, True, False, False, False, True, True, False, False, False, True, True]Failed
control: safety during min on[True, True, False, False, False, True, True][True, True, False, False, False, True, True]Passed
control: safety then quick recall[True, True, False, False, False, False, True][True, True, False, False, False, False, True]Passed
control: scenario 1[False, False, False, False, False, True, True, True, True, True, False, False, False, False, True, True, False, False, False, False, False, False][False, False, False, False, False, True, True, True, True, True, False, False, False, False, True, True, False, False, False, False, False, False]Passed
control: scenario 2[True, True, True, False, False, False, True, True, False, False, False, False, False, True][True, True, True, False, False, False, True, True, False, False, False, False, False, True]Passed
control: scenario 3[True, True, True, True, False, False, False, False, True, False, False][True, True, True, True, False, False, False, False, True, False, False]Passed
control: scenario 4[False, False, False, False, False, False, False, False, False, False, False, False, False][False, False, False, False, False, False, False, False, False, False, False, False, False]Passed

SHA-256 / bf5a4f05a248545d21c4bca06dc127e389d63cd1bfd8f0c421781f93caa1bc63

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(min_on, min_off, startup_delay, calls):
    running = False
    on_at = None
    off_at = None
    out = []
    for minute, (demand, safety_ok) in enumerate(calls):
        if running:
            if not safety_ok:
                running = False
                off_at = minute
            elif not demand and minute - on_at >= min_on:
                running = False
                off_at = minute
        elif demand and safety_ok and minute >= startup_delay:
            if off_at is None or minute - off_at >= min_off:
                running = True
                on_at = minute
        out.append(running)
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: min on and off',
   [3,
    4,
    2,
    [[True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, False],
     [True, True]]],
   [False, False, True, True, True, False, False, False, False, False, True]],
  ['regression: exact min on',
   [2,
    3,
    0,
    [[True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True]]],
   [True, True, False, False, False, True, True, False, False, False, True, True]],
  ['control: safety during min on',
   [5,
    3,
    0,
    [[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
   [True, True, False, False, False, True, True]],
  ['control: safety then quick recall',
   [2,
    4,
    0,
    [[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
   [True, True, False, False, False, False, True]],
  ['control: scenario 1',
   [3,
    3,
    4,
    [[False, False],
     [False, True],
     [False, True],
     [False, False],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, False],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [False, True],
     [False, False],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True]]],
   [False,
    False,
    False,
    False,
    False,
    True,
    True,
    True,
    True,
    True,
    False,
    False,
    False,
    False,
    True,
    True,
    False,
    False,
    False,
    False,
    False,
    False]],
  ['control: scenario 2',
   [5,
    3,
    0,
    [[True, True],
     [True, True],
     [True, True],
     [True, False],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, False],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True]]],
   [True, True, True, False, False, False, True, True, False, False, False, False, False, True]],
  ['control: scenario 3',
   [3,
    4,
    0,
    [[True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, False],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, False],
     [True, True]]],
   [True, True, True, True, False, False, False, False, True, False, False]],
  ['control: scenario 4',
   [5,
    5,
    4,
    [[True, True],
     [False, False],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, False],
     [False, True],
     [False, True],
     [False, True]]],
   [False, False, False, False, False, False, False, False, False, False, False, False, False]]],
 [['regression: exact min on',
   [2,
    3,
    0,
    [[True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True]]],
   [True, True, False, False, False, True, True, False, False, False, True, True]],
  ['regression: scenario 2',
   [2,
    5,
    4,
    [[False, True],
     [False, True],
     [True, True],
     [True, True],
     [False, True],
     [True, True],
     [False, True],
     [True, True],
     [False, True],
     [True, True],
     [True, True],
     [False, False],
     [False, True],
     [False, True]]],
   [False, False, False, False, False, True, True, True, False, False, False, False, False, False]],
  ['regression: min on and off',
   [3,
    4,
    2,
    [[True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, False],
     [True, True]]],
   [False, False, True, True, True, False, False, False, False, False, True]],
  ['control: safety during min on',
   [5,
    3,
    0,
    [[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
   [True, True, False, False, False, True, True]],
  ['control: safety then quick recall',
   [2,
    4,
    0,
    [[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
   [True, True, False, False, False, False, True]],
  ['control: scenario 1',
   [5,
    3,
    0,
    [[False, True],
     [False, True],
     [False, True],
     [False, False],
     [False, False],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True]]],
   [False, False, False, False, False, True, True, True, True, True, True, True]],
  ['regression: scenario 3',
   [3,
    4,
    0,
    [[True, True],
     [True, False],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [True, True],
     [True, True],
     [False, True],
     [False, False],
     [True, True],
     [False, True],
     [False, True]]],
   [True,
    False,
    False,
    False,
    False,
    True,
    True,
    True,
    True,
    False,
    False,
    False,
    False,
    False,
    True,
    True,
    True]],
  ['control: scenario 4',
   [2,
    4,
    2,
    [[True, True],
     [True, False],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [True, True],
     [False, True],
     [True, True],
     [False, True],
     [False, True],
     [True, False],
     [True, False]]],
   [False, False, True, True, True, True, True, False, False, False, False, False, False, False, False]]],
 [['regression: scenario 1',
   [2,
    5,
    2,
    [[True, False],
     [True, True],
     [True, False],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, False],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [True, False],
     [True, True],
     [True, False],
     [True, True]]],
   [False,
    False,
    False,
    True,
    True,
    False,
    False,
    False,
    False,
    False,
    False,
    True,
    True,
    False,
    False,
    False,
    False,
    False,
    False,
    True,
    False,
    False]],
  ['regression: scenario 8',
   [3,
    4,
    4,
    [[False, True],
     [True, False],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [False, True]]],
   [False,
    False,
    False,
    False,
    True,
    True,
    True,
    True,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    True,
    True,
    True]],
  ['regression: min on and off',
   [3,
    4,
    2,
    [[True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, False],
     [True, True]]],
   [False, False, True, True, True, False, False, False, False, False, True]],
  ['control: safety during min on',
   [5,
    3,
    0,
    [[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
   [True, True, False, False, False, True, True]],
  ['control: safety then quick recall',
   [2,
    4,
    0,
    [[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
   [True, True, False, False, False, False, True]],
  ['regression: exact min on',
   [2,
    3,
    0,
    [[True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True]]],
   [True, True, False, False, False, True, True, False, False, False, True, True]],
  ['regression: scenario 2',
   [2,
    4,
    0,
    [[False, True],
     [True, True],
     [True, False],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True]]],
   [False,
    True,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    True,
    True,
    False,
    False,
    False,
    False,
    False,
    False]],
  ['control: scenario 3',
   [2,
    5,
    0,
    [[False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [True, False],
     [True, True],
     [True, False],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True]]],
   [False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    True,
    False,
    False,
    False,
    False,
    False,
    True,
    True,
    True,
    True,
    True]]],
 [['regression: scenario 11',
   [5,
    5,
    0,
    [[True, False],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [False, True],
     [True, True],
     [False, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [True, False],
     [True, True],
     [True, True],
     [True, True]]],
   [False,
    True,
    True,
    True,
    True,
    True,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    True,
    True,
    True]],
  ['regression: scenario 5',
   [3,
    5,
    2,
    [[False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True]]],
   [False,
    False,
    False,
    False,
    False,
    True,
    True,
    True,
    True,
    True,
    True,
    True,
    True,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False]],
  ['regression: min on and off',
   [3,
    4,
    2,
    [[True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, False],
     [True, True]]],
   [False, False, True, True, True, False, False, False, False, False, True]],
  ['control: safety during min on',
   [5,
    3,
    0,
    [[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
   [True, True, False, False, False, True, True]],
  ['control: safety then quick recall',
   [2,
    4,
    0,
    [[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
   [True, True, False, False, False, False, True]],
  ['regression: exact min on',
   [2,
    3,
    0,
    [[True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True]]],
   [True, True, False, False, False, True, True, False, False, False, True, True]],
  ['control: scenario 1',
   [5,
    4,
    2,
    [[False, True],
     [False, False],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, False],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True]]],
   [False,
    False,
    False,
    False,
    False,
    True,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    True,
    True,
    True,
    True,
    True,
    True,
    True,
    False]],
  ['control: scenario 2',
   [2,
    4,
    2,
    [[True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, False],
     [False, True],
     [False, True],
     [False, True],
     [False, False]]],
   [False,
    False,
    True,
    True,
    True,
    False,
    False,
    False,
    False,
    True,
    True,
    True,
    False,
    False,
    False,
    False,
    False]]],
 [['regression: scenario 5',
   [5,
    3,
    2,
    [[True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, False],
     [False, True],
     [False, True],
     [False, True],
     [True, False],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [False, False],
     [False, True]]],
   [False,
    False,
    True,
    True,
    True,
    True,
    True,
    False,
    False,
    False,
    False,
    False,
    True,
    True,
    True,
    True,
    True,
    False,
    False,
    False]],
  ['regression: scenario 9',
   [3,
    4,
    0,
    [[False, True],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [False, False],
     [False, False],
     [False, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True]]],
   [False,
    True,
    True,
    True,
    True,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    False,
    True,
    True,
    True,
    False]],
  ['regression: min on and off',
   [3,
    4,
    2,
    [[True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, False],
     [True, True]]],
   [False, False, True, True, True, False, False, False, False, False, True]],
  ['control: safety during min on',
   [5,
    3,
    0,
    [[True, True], [False, True], [False, False], [True, True], [True, True], [True, True], [True, True]]],
   [True, True, False, False, False, True, True]],
  ['control: safety then quick recall',
   [2,
    4,
    0,
    [[True, True], [True, True], [True, False], [True, True], [True, True], [True, True], [True, True]]],
   [True, True, False, False, False, False, True]],
  ['regression: exact min on',
   [2,
    3,
    0,
    [[True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True]]],
   [True, True, False, False, False, True, True, False, False, False, True, True]],
  ['regression: scenario 1',
   [3,
    4,
    0,
    [[False, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [False, True],
     [True, True],
     [False, True],
     [False, False],
     [False, False],
     [False, True]]],
   [False, False, False, False, True, True, True, False, False, False, False]],
  ['control: scenario 2',
   [2,
    4,
    2,
    [[True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True],
     [False, True],
     [False, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [True, True],
     [False, True]]],
   [False,
    False,
    True,
    True,
    True,
    False,
    False,
    False,
    False,
    True,
    True,
    True,
    True,
    True,
    True,
    True,
    True,
    True,
    False]]]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
regression: min on and off[False, False, True, True, True, False, False, False, False, False, True][False, False, True, True, True, False, False, False, False, False, True]Passed
regression: exact min on[True, True, False, False, False, True, True, False, False, False, True, True][True, True, False, False, False, True, True, False, False, False, True, True]Passed
control: safety during min on[True, True, False, False, False, True, True][True, True, False, False, False, True, True]Passed
control: safety then quick recall[True, True, False, False, False, False, True][True, True, False, False, False, False, True]Passed
control: scenario 1[False, False, False, False, False, True, True, True, True, True, False, False, False, False, True, True, False, False, False, False, False, False][False, False, False, False, False, True, True, True, True, True, False, False, False, False, True, True, False, False, False, False, False, False]Passed
control: scenario 2[True, True, True, False, False, False, True, True, False, False, False, False, False, True][True, True, True, False, False, False, True, True, False, False, False, False, False, True]Passed
control: scenario 3[True, True, True, True, False, False, False, False, True, False, False][True, True, True, True, False, False, False, False, True, False, False]Passed
control: scenario 4[False, False, False, False, False, False, False, False, False, False, False, False, False][False, False, False, False, False, False, False, False, False, False, False, False, False]Passed

SHA-256 / cc4dc54427d9f1a0616bad1179a57d15dabab224b8583c56513fec709ad16c37

Verification & scope

A deterministic bounded teaching model of one thermostat or HVAC controller decision evaluated per sample. Temperatures are integer tenths of a degree Fahrenheit unless stated otherwise. The contract is a stipulated toy convention, not a claim of conformance to any manufacturer, ASHRAE guideline or code. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.

Observations recorded using Python 3.12.14 at 2026-09-29T14:51:45.219620+00:00.

Case digest / ea2437f50f2577ed49fb7cca869674e88ca424daf8efcd07e6fa01b33615811f