FAILURE MAP
← Case archive

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.

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

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 fixtureActualExpectedOutcome
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 fixtureActualExpectedOutcome
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 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: 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