FA-93161 / EV charging session scheduling / Open access
Demand-response curtailment of a charge plan: opt-out honoured · case 01
Customers who opted out of an event are curtailed anyway.
ROOT CAUSE
The opt-out flag is never consulted.
VERIFIED REPAIR
Skip opted-out events.
Unsuccessful approach: Resetting to 100 percent on an opted-out event also cancels earlier active events.
Case contract
profile is planned watts per slot. events are [start, end, pct, opt_out]; during [start, end) a non-opted-out event limits power to pct percent of plan (integer floor of p*pct/100), and overlapping events apply the lowest pct. Curtailed power never drops below min(plan, floor_w). Return [new profile, total curtailed watts over slots].
Why this case matters
Depot, workplace and public EV chargers schedule sessions against prices, circuit limits and departure deadlines; a wrong decision silently strands a driver or overloads a feeder.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(profile, events, floor_w):
out = []
for t, p in enumerate(profile):
pct = 100
for s, e, q, opt in events:
if s <= t < e and q < pct:
pct = q
new = p * pct // 100
new = max(new, min(p, floor_w))
out.append(new)
return [out, sum(profile) - sum(out)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['boundary: event ends at slot', [[3680, 3680, 3680], [[0, 1, 50, False]], 0],
[[1840, 3680, 3680], 1840]],
['boundary: opted-out event', [[7400, 7400], [[0, 2, 0, True]], 1380], [[7400, 7400], 0]],
['boundary: plan below floor', [[1000, 7400], [[0, 2, 0, False]], 1380], [[1000, 1380], 6020]],
['regression: opt-out honoured',
[[1380, 1000, 3333, 2345, 1000, 1380, 11000, 3333, 3680, 0],
[[8, 9, 60, False], [9, 10, 25, True], [4, 9, 75, True]], 0],
[[1380, 1000, 3333, 2345, 1000, 1380, 11000, 3333, 2208, 0], 1472]],
['regression: opt-out honoured (partial repair)',
[[0, 0, 1111, 11000, 7400, 3680, 1111, 1380, 11000],
[[1, 3, 60, False], [5, 8, 60, False], [3, 8, 0, True]], 1380],
[[0, 0, 1111, 11000, 7400, 2208, 1111, 1380, 11000], 1472]],
['control 1',
[[1000, 3333, 1111, 1380, 11000], [[1, 2, 75, True], [5, 8, 75, False], [4, 5, 25, False]], 0],
[[1000, 3333, 1111, 1380, 2750], 8250]],
['control 2',
[[1380, 1000, 1111, 1000, 1000, 3333, 3333, 7400, 1111, 3680, 11000, 1111],
[[8, 12, 60, False], [5, 7, 0, False]], 2000],
[[1380, 1000, 1111, 1000, 1000, 2000, 2000, 7400, 1111, 2208, 6600, 1111], 8538]]],
[['boundary: event ends at slot', [[3680, 3680, 3680], [[0, 1, 50, False]], 0],
[[1840, 3680, 3680], 1840]],
['boundary: opted-out event', [[7400, 7400], [[0, 2, 0, True]], 1380], [[7400, 7400], 0]],
['boundary: plan below floor', [[1000, 7400], [[0, 2, 0, False]], 1380], [[1000, 1380], 6020]],
['regression: opt-out honoured',
[[7400, 1111, 3680, 11000, 1000, 11000, 1380, 3333, 0, 11000, 0],
[[4, 8, 0, False], [8, 11, 50, True]], 0],
[[7400, 1111, 3680, 11000, 0, 0, 0, 0, 0, 11000, 0], 16713]],
['regression: opt-out honoured (partial repair)',
[[1111, 3680, 1000, 11000], [[3, 4, 75, False], [1, 1, 25, True]], 0],
[[1111, 3680, 1000, 8250], 2750]],
['control 1',
[[3680, 1000, 3680, 1000, 3333, 2345, 1380, 1380, 1000, 3680, 7400],
[[6, 11, 25, True], [5, 10, 75, False]], 0],
[[3680, 1000, 3680, 1000, 3333, 1758, 1035, 1035, 750, 2760, 7400], 2447]],
['control 2',
[[7400, 3680, 7400, 3333, 0, 1380, 1111, 3333, 3680, 7400, 1111, 1380],
[[0, 3, 75, True], [0, 3, 50, False]], 0],
[[3700, 1840, 3700, 3333, 0, 1380, 1111, 3333, 3680, 7400, 1111, 1380], 9240]]],
[['boundary: event ends at slot', [[3680, 3680, 3680], [[0, 1, 50, False]], 0],
[[1840, 3680, 3680], 1840]],
['boundary: opted-out event', [[7400, 7400], [[0, 2, 0, True]], 1380], [[7400, 7400], 0]],
['boundary: plan below floor', [[1000, 7400], [[0, 2, 0, False]], 1380], [[1000, 1380], 6020]],
['regression: opt-out honoured',
[[7400, 1380, 2345, 7400, 3333, 0, 11000, 2345],
[[1, 3, 0, True], [8, 9, 75, False], [8, 8, 50, False]], 0],
[[7400, 1380, 2345, 7400, 3333, 0, 11000, 2345], 0]],
['regression: opt-out honoured (partial repair)',
[[2345, 7400, 3680, 3333, 7400, 3680], [[2, 4, 60, False], [1, 5, 0, True], [5, 10, 25, False]],
2000],
[[2345, 7400, 2208, 2000, 7400, 2000], 4485]],
['control 1',
[[0, 1000, 1000, 2345, 0, 3680, 1380, 3680], [[4, 8, 50, True], [5, 10, 75, True]], 0],
[[0, 1000, 1000, 2345, 0, 3680, 1380, 3680], 0]],
['control 2',
[[3333, 7400, 1000, 2345, 11000, 2345], [[3, 7, 50, False], [5, 6, 25, True]], 2000],
[[3333, 7400, 1000, 2000, 5500, 2000], 6190]]],
[['boundary: event ends at slot', [[3680, 3680, 3680], [[0, 1, 50, False]], 0],
[[1840, 3680, 3680], 1840]],
['boundary: opted-out event', [[7400, 7400], [[0, 2, 0, True]], 1380], [[7400, 7400], 0]],
['boundary: plan below floor', [[1000, 7400], [[0, 2, 0, False]], 1380], [[1000, 1380], 6020]],
['regression: opt-out honoured',
[[0, 3333, 3333, 0, 1380, 2345, 1111, 11000, 0],
[[7, 11, 25, False], [3, 4, 0, True], [3, 6, 0, True]], 2000],
[[0, 3333, 3333, 0, 1380, 2345, 1111, 2750, 0], 8250]],
['regression: opt-out honoured (partial repair)',
[[2345, 0, 11000, 3680, 0, 1380, 0, 7400, 3680, 11000],
[[2, 5, 50, True], [2, 3, 60, False], [0, 4, 25, True]], 0],
[[2345, 0, 6600, 3680, 0, 1380, 0, 7400, 3680, 11000], 4400]],
['control 1',
[[3680, 3680, 1000, 0, 3333, 1000, 3333, 3680],
[[1, 5, 0, False], [7, 11, 25, False], [6, 6, 60, False]], 2000],
[[3680, 2000, 1000, 0, 2000, 1000, 3333, 2000], 4693]],
['control 2',
[[1380, 7400, 7400, 1000, 1111, 2345, 1380], [[4, 8, 0, False], [6, 10, 0, False]], 0],
[[1380, 7400, 7400, 1000, 0, 0, 0], 4836]]],
[['boundary: event ends at slot', [[3680, 3680, 3680], [[0, 1, 50, False]], 0],
[[1840, 3680, 3680], 1840]],
['boundary: opted-out event', [[7400, 7400], [[0, 2, 0, True]], 1380], [[7400, 7400], 0]],
['boundary: plan below floor', [[1000, 7400], [[0, 2, 0, False]], 1380], [[1000, 1380], 6020]],
['regression: opt-out honoured',
[[0, 2345, 1000, 7400, 11000, 1380, 2345, 1380, 1111],
[[6, 10, 0, False], [3, 6, 25, True], [5, 8, 60, False]], 2000],
[[0, 2345, 1000, 7400, 11000, 1380, 2000, 1380, 1111], 345]],
['regression: opt-out honoured (partial repair)',
[[1000, 2345, 1111, 1111, 1111, 1380, 1380, 2345],
[[4, 8, 50, False], [4, 4, 75, True], [0, 5, 25, False]], 2000],
[[1000, 2000, 1111, 1111, 1111, 1380, 1380, 2000], 690]],
['control 1', [[3333, 0, 1000, 1111, 1380, 7400, 1380, 7400, 3680], [[5, 10, 0, True]], 1380],
[[3333, 0, 1000, 1111, 1380, 7400, 1380, 7400, 3680], 0]],
['control 2', [[2345, 7400, 1111, 3333, 3333, 7400, 3680], [[5, 8, 25, False]], 0],
[[2345, 7400, 1111, 3333, 3333, 1850, 920], 8310]]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| boundary: event ends at slot | [[1840, 3680, 3680], 1840] | [[1840, 3680, 3680], 1840] | Passed |
| boundary: opted-out event | [[1380, 1380], 12040] | [[7400, 7400], 0] | Failed |
| boundary: plan below floor | [[1000, 1380], 6020] | [[1000, 1380], 6020] | Passed |
| regression: opt-out honoured | [[1380, 1000, 3333, 2345, 750, 1035, 8250, 2499, 2208, 0], 5651] | [[1380, 1000, 3333, 2345, 1000, 1380, 11000, 3333, 2208, 0], 1472] | Failed |
| regression: opt-out honoured (partial repair) | [[0, 0, 1111, 1380, 1380, 1380, 1111, 1380, 11000], 17940] | [[0, 0, 1111, 11000, 7400, 2208, 1111, 1380, 11000], 1472] | Failed |
| control 1 | [[1000, 2499, 1111, 1380, 2750], 9084] | [[1000, 3333, 1111, 1380, 2750], 8250] | Failed |
| control 2 | [[1380, 1000, 1111, 1000, 1000, 2000, 2000, 7400, 1111, 2208, 6600, 1111], 8538] | [[1380, 1000, 1111, 1000, 1000, 2000, 2000, 7400, 1111, 2208, 6600, 1111], 8538] | Passed |
SHA-256 / 1a5772c6f7ec6a91358a3b3cb2fada524e9d0ae33bc44d1c381d848f09c387c5
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(profile, events, floor_w):
out = []
for t, p in enumerate(profile):
pct = 100
for s, e, q, opt in events:
if opt:
pct = 100
continue
if s <= t < e and q < pct:
pct = q
new = p * pct // 100
new = max(new, min(p, floor_w))
out.append(new)
return [out, sum(profile) - sum(out)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['boundary: event ends at slot', [[3680, 3680, 3680], [[0, 1, 50, False]], 0],
[[1840, 3680, 3680], 1840]],
['boundary: opted-out event', [[7400, 7400], [[0, 2, 0, True]], 1380], [[7400, 7400], 0]],
['boundary: plan below floor', [[1000, 7400], [[0, 2, 0, False]], 1380], [[1000, 1380], 6020]],
['regression: opt-out honoured',
[[1380, 1000, 3333, 2345, 1000, 1380, 11000, 3333, 3680, 0],
[[8, 9, 60, False], [9, 10, 25, True], [4, 9, 75, True]], 0],
[[1380, 1000, 3333, 2345, 1000, 1380, 11000, 3333, 2208, 0], 1472]],
['regression: opt-out honoured (partial repair)',
[[0, 0, 1111, 11000, 7400, 3680, 1111, 1380, 11000],
[[1, 3, 60, False], [5, 8, 60, False], [3, 8, 0, True]], 1380],
[[0, 0, 1111, 11000, 7400, 2208, 1111, 1380, 11000], 1472]],
['control 1',
[[1000, 3333, 1111, 1380, 11000], [[1, 2, 75, True], [5, 8, 75, False], [4, 5, 25, False]], 0],
[[1000, 3333, 1111, 1380, 2750], 8250]],
['control 2',
[[1380, 1000, 1111, 1000, 1000, 3333, 3333, 7400, 1111, 3680, 11000, 1111],
[[8, 12, 60, False], [5, 7, 0, False]], 2000],
[[1380, 1000, 1111, 1000, 1000, 2000, 2000, 7400, 1111, 2208, 6600, 1111], 8538]]],
[['boundary: event ends at slot', [[3680, 3680, 3680], [[0, 1, 50, False]], 0],
[[1840, 3680, 3680], 1840]],
['boundary: opted-out event', [[7400, 7400], [[0, 2, 0, True]], 1380], [[7400, 7400], 0]],
['boundary: plan below floor', [[1000, 7400], [[0, 2, 0, False]], 1380], [[1000, 1380], 6020]],
['regression: opt-out honoured',
[[7400, 1111, 3680, 11000, 1000, 11000, 1380, 3333, 0, 11000, 0],
[[4, 8, 0, False], [8, 11, 50, True]], 0],
[[7400, 1111, 3680, 11000, 0, 0, 0, 0, 0, 11000, 0], 16713]],
['regression: opt-out honoured (partial repair)',
[[1111, 3680, 1000, 11000], [[3, 4, 75, False], [1, 1, 25, True]], 0],
[[1111, 3680, 1000, 8250], 2750]],
['control 1',
[[3680, 1000, 3680, 1000, 3333, 2345, 1380, 1380, 1000, 3680, 7400],
[[6, 11, 25, True], [5, 10, 75, False]], 0],
[[3680, 1000, 3680, 1000, 3333, 1758, 1035, 1035, 750, 2760, 7400], 2447]],
['control 2',
[[7400, 3680, 7400, 3333, 0, 1380, 1111, 3333, 3680, 7400, 1111, 1380],
[[0, 3, 75, True], [0, 3, 50, False]], 0],
[[3700, 1840, 3700, 3333, 0, 1380, 1111, 3333, 3680, 7400, 1111, 1380], 9240]]],
[['boundary: event ends at slot', [[3680, 3680, 3680], [[0, 1, 50, False]], 0],
[[1840, 3680, 3680], 1840]],
['boundary: opted-out event', [[7400, 7400], [[0, 2, 0, True]], 1380], [[7400, 7400], 0]],
['boundary: plan below floor', [[1000, 7400], [[0, 2, 0, False]], 1380], [[1000, 1380], 6020]],
['regression: opt-out honoured',
[[7400, 1380, 2345, 7400, 3333, 0, 11000, 2345],
[[1, 3, 0, True], [8, 9, 75, False], [8, 8, 50, False]], 0],
[[7400, 1380, 2345, 7400, 3333, 0, 11000, 2345], 0]],
['regression: opt-out honoured (partial repair)',
[[2345, 7400, 3680, 3333, 7400, 3680], [[2, 4, 60, False], [1, 5, 0, True], [5, 10, 25, False]],
2000],
[[2345, 7400, 2208, 2000, 7400, 2000], 4485]],
['control 1',
[[0, 1000, 1000, 2345, 0, 3680, 1380, 3680], [[4, 8, 50, True], [5, 10, 75, True]], 0],
[[0, 1000, 1000, 2345, 0, 3680, 1380, 3680], 0]],
['control 2',
[[3333, 7400, 1000, 2345, 11000, 2345], [[3, 7, 50, False], [5, 6, 25, True]], 2000],
[[3333, 7400, 1000, 2000, 5500, 2000], 6190]]],
[['boundary: event ends at slot', [[3680, 3680, 3680], [[0, 1, 50, False]], 0],
[[1840, 3680, 3680], 1840]],
['boundary: opted-out event', [[7400, 7400], [[0, 2, 0, True]], 1380], [[7400, 7400], 0]],
['boundary: plan below floor', [[1000, 7400], [[0, 2, 0, False]], 1380], [[1000, 1380], 6020]],
['regression: opt-out honoured',
[[0, 3333, 3333, 0, 1380, 2345, 1111, 11000, 0],
[[7, 11, 25, False], [3, 4, 0, True], [3, 6, 0, True]], 2000],
[[0, 3333, 3333, 0, 1380, 2345, 1111, 2750, 0], 8250]],
['regression: opt-out honoured (partial repair)',
[[2345, 0, 11000, 3680, 0, 1380, 0, 7400, 3680, 11000],
[[2, 5, 50, True], [2, 3, 60, False], [0, 4, 25, True]], 0],
[[2345, 0, 6600, 3680, 0, 1380, 0, 7400, 3680, 11000], 4400]],
['control 1',
[[3680, 3680, 1000, 0, 3333, 1000, 3333, 3680],
[[1, 5, 0, False], [7, 11, 25, False], [6, 6, 60, False]], 2000],
[[3680, 2000, 1000, 0, 2000, 1000, 3333, 2000], 4693]],
['control 2',
[[1380, 7400, 7400, 1000, 1111, 2345, 1380], [[4, 8, 0, False], [6, 10, 0, False]], 0],
[[1380, 7400, 7400, 1000, 0, 0, 0], 4836]]],
[['boundary: event ends at slot', [[3680, 3680, 3680], [[0, 1, 50, False]], 0],
[[1840, 3680, 3680], 1840]],
['boundary: opted-out event', [[7400, 7400], [[0, 2, 0, True]], 1380], [[7400, 7400], 0]],
['boundary: plan below floor', [[1000, 7400], [[0, 2, 0, False]], 1380], [[1000, 1380], 6020]],
['regression: opt-out honoured',
[[0, 2345, 1000, 7400, 11000, 1380, 2345, 1380, 1111],
[[6, 10, 0, False], [3, 6, 25, True], [5, 8, 60, False]], 2000],
[[0, 2345, 1000, 7400, 11000, 1380, 2000, 1380, 1111], 345]],
['regression: opt-out honoured (partial repair)',
[[1000, 2345, 1111, 1111, 1111, 1380, 1380, 2345],
[[4, 8, 50, False], [4, 4, 75, True], [0, 5, 25, False]], 2000],
[[1000, 2000, 1111, 1111, 1111, 1380, 1380, 2000], 690]],
['control 1', [[3333, 0, 1000, 1111, 1380, 7400, 1380, 7400, 3680], [[5, 10, 0, True]], 1380],
[[3333, 0, 1000, 1111, 1380, 7400, 1380, 7400, 3680], 0]],
['control 2', [[2345, 7400, 1111, 3333, 3333, 7400, 3680], [[5, 8, 25, False]], 0],
[[2345, 7400, 1111, 3333, 3333, 1850, 920], 8310]]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| boundary: event ends at slot | [[1840, 3680, 3680], 1840] | [[1840, 3680, 3680], 1840] | Passed |
| boundary: opted-out event | [[7400, 7400], 0] | [[7400, 7400], 0] | Passed |
| boundary: plan below floor | [[1000, 1380], 6020] | [[1000, 1380], 6020] | Passed |
| regression: opt-out honoured | [[1380, 1000, 3333, 2345, 1000, 1380, 11000, 3333, 3680, 0], 0] | [[1380, 1000, 3333, 2345, 1000, 1380, 11000, 3333, 2208, 0], 1472] | Failed |
| regression: opt-out honoured (partial repair) | [[0, 0, 1111, 11000, 7400, 3680, 1111, 1380, 11000], 0] | [[0, 0, 1111, 11000, 7400, 2208, 1111, 1380, 11000], 1472] | Failed |
| control 1 | [[1000, 3333, 1111, 1380, 2750], 8250] | [[1000, 3333, 1111, 1380, 2750], 8250] | Passed |
| control 2 | [[1380, 1000, 1111, 1000, 1000, 2000, 2000, 7400, 1111, 2208, 6600, 1111], 8538] | [[1380, 1000, 1111, 1000, 1000, 2000, 2000, 7400, 1111, 2208, 6600, 1111], 8538] | Passed |
SHA-256 / 1d9fd9560805b283f63b1511da9d56c1a76ab0fe2f9aa47dde56173261ac8c0f
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(profile, events, floor_w):
out = []
for t, p in enumerate(profile):
pct = 100
for s, e, q, opt in events:
if opt:
continue
if s <= t < e and q < pct:
pct = q
new = p * pct // 100
new = max(new, min(p, floor_w))
out.append(new)
return [out, sum(profile) - sum(out)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['boundary: event ends at slot', [[3680, 3680, 3680], [[0, 1, 50, False]], 0],
[[1840, 3680, 3680], 1840]],
['boundary: opted-out event', [[7400, 7400], [[0, 2, 0, True]], 1380], [[7400, 7400], 0]],
['boundary: plan below floor', [[1000, 7400], [[0, 2, 0, False]], 1380], [[1000, 1380], 6020]],
['regression: opt-out honoured',
[[1380, 1000, 3333, 2345, 1000, 1380, 11000, 3333, 3680, 0],
[[8, 9, 60, False], [9, 10, 25, True], [4, 9, 75, True]], 0],
[[1380, 1000, 3333, 2345, 1000, 1380, 11000, 3333, 2208, 0], 1472]],
['regression: opt-out honoured (partial repair)',
[[0, 0, 1111, 11000, 7400, 3680, 1111, 1380, 11000],
[[1, 3, 60, False], [5, 8, 60, False], [3, 8, 0, True]], 1380],
[[0, 0, 1111, 11000, 7400, 2208, 1111, 1380, 11000], 1472]],
['control 1',
[[1000, 3333, 1111, 1380, 11000], [[1, 2, 75, True], [5, 8, 75, False], [4, 5, 25, False]], 0],
[[1000, 3333, 1111, 1380, 2750], 8250]],
['control 2',
[[1380, 1000, 1111, 1000, 1000, 3333, 3333, 7400, 1111, 3680, 11000, 1111],
[[8, 12, 60, False], [5, 7, 0, False]], 2000],
[[1380, 1000, 1111, 1000, 1000, 2000, 2000, 7400, 1111, 2208, 6600, 1111], 8538]]],
[['boundary: event ends at slot', [[3680, 3680, 3680], [[0, 1, 50, False]], 0],
[[1840, 3680, 3680], 1840]],
['boundary: opted-out event', [[7400, 7400], [[0, 2, 0, True]], 1380], [[7400, 7400], 0]],
['boundary: plan below floor', [[1000, 7400], [[0, 2, 0, False]], 1380], [[1000, 1380], 6020]],
['regression: opt-out honoured',
[[7400, 1111, 3680, 11000, 1000, 11000, 1380, 3333, 0, 11000, 0],
[[4, 8, 0, False], [8, 11, 50, True]], 0],
[[7400, 1111, 3680, 11000, 0, 0, 0, 0, 0, 11000, 0], 16713]],
['regression: opt-out honoured (partial repair)',
[[1111, 3680, 1000, 11000], [[3, 4, 75, False], [1, 1, 25, True]], 0],
[[1111, 3680, 1000, 8250], 2750]],
['control 1',
[[3680, 1000, 3680, 1000, 3333, 2345, 1380, 1380, 1000, 3680, 7400],
[[6, 11, 25, True], [5, 10, 75, False]], 0],
[[3680, 1000, 3680, 1000, 3333, 1758, 1035, 1035, 750, 2760, 7400], 2447]],
['control 2',
[[7400, 3680, 7400, 3333, 0, 1380, 1111, 3333, 3680, 7400, 1111, 1380],
[[0, 3, 75, True], [0, 3, 50, False]], 0],
[[3700, 1840, 3700, 3333, 0, 1380, 1111, 3333, 3680, 7400, 1111, 1380], 9240]]],
[['boundary: event ends at slot', [[3680, 3680, 3680], [[0, 1, 50, False]], 0],
[[1840, 3680, 3680], 1840]],
['boundary: opted-out event', [[7400, 7400], [[0, 2, 0, True]], 1380], [[7400, 7400], 0]],
['boundary: plan below floor', [[1000, 7400], [[0, 2, 0, False]], 1380], [[1000, 1380], 6020]],
['regression: opt-out honoured',
[[7400, 1380, 2345, 7400, 3333, 0, 11000, 2345],
[[1, 3, 0, True], [8, 9, 75, False], [8, 8, 50, False]], 0],
[[7400, 1380, 2345, 7400, 3333, 0, 11000, 2345], 0]],
['regression: opt-out honoured (partial repair)',
[[2345, 7400, 3680, 3333, 7400, 3680], [[2, 4, 60, False], [1, 5, 0, True], [5, 10, 25, False]],
2000],
[[2345, 7400, 2208, 2000, 7400, 2000], 4485]],
['control 1',
[[0, 1000, 1000, 2345, 0, 3680, 1380, 3680], [[4, 8, 50, True], [5, 10, 75, True]], 0],
[[0, 1000, 1000, 2345, 0, 3680, 1380, 3680], 0]],
['control 2',
[[3333, 7400, 1000, 2345, 11000, 2345], [[3, 7, 50, False], [5, 6, 25, True]], 2000],
[[3333, 7400, 1000, 2000, 5500, 2000], 6190]]],
[['boundary: event ends at slot', [[3680, 3680, 3680], [[0, 1, 50, False]], 0],
[[1840, 3680, 3680], 1840]],
['boundary: opted-out event', [[7400, 7400], [[0, 2, 0, True]], 1380], [[7400, 7400], 0]],
['boundary: plan below floor', [[1000, 7400], [[0, 2, 0, False]], 1380], [[1000, 1380], 6020]],
['regression: opt-out honoured',
[[0, 3333, 3333, 0, 1380, 2345, 1111, 11000, 0],
[[7, 11, 25, False], [3, 4, 0, True], [3, 6, 0, True]], 2000],
[[0, 3333, 3333, 0, 1380, 2345, 1111, 2750, 0], 8250]],
['regression: opt-out honoured (partial repair)',
[[2345, 0, 11000, 3680, 0, 1380, 0, 7400, 3680, 11000],
[[2, 5, 50, True], [2, 3, 60, False], [0, 4, 25, True]], 0],
[[2345, 0, 6600, 3680, 0, 1380, 0, 7400, 3680, 11000], 4400]],
['control 1',
[[3680, 3680, 1000, 0, 3333, 1000, 3333, 3680],
[[1, 5, 0, False], [7, 11, 25, False], [6, 6, 60, False]], 2000],
[[3680, 2000, 1000, 0, 2000, 1000, 3333, 2000], 4693]],
['control 2',
[[1380, 7400, 7400, 1000, 1111, 2345, 1380], [[4, 8, 0, False], [6, 10, 0, False]], 0],
[[1380, 7400, 7400, 1000, 0, 0, 0], 4836]]],
[['boundary: event ends at slot', [[3680, 3680, 3680], [[0, 1, 50, False]], 0],
[[1840, 3680, 3680], 1840]],
['boundary: opted-out event', [[7400, 7400], [[0, 2, 0, True]], 1380], [[7400, 7400], 0]],
['boundary: plan below floor', [[1000, 7400], [[0, 2, 0, False]], 1380], [[1000, 1380], 6020]],
['regression: opt-out honoured',
[[0, 2345, 1000, 7400, 11000, 1380, 2345, 1380, 1111],
[[6, 10, 0, False], [3, 6, 25, True], [5, 8, 60, False]], 2000],
[[0, 2345, 1000, 7400, 11000, 1380, 2000, 1380, 1111], 345]],
['regression: opt-out honoured (partial repair)',
[[1000, 2345, 1111, 1111, 1111, 1380, 1380, 2345],
[[4, 8, 50, False], [4, 4, 75, True], [0, 5, 25, False]], 2000],
[[1000, 2000, 1111, 1111, 1111, 1380, 1380, 2000], 690]],
['control 1', [[3333, 0, 1000, 1111, 1380, 7400, 1380, 7400, 3680], [[5, 10, 0, True]], 1380],
[[3333, 0, 1000, 1111, 1380, 7400, 1380, 7400, 3680], 0]],
['control 2', [[2345, 7400, 1111, 3333, 3333, 7400, 3680], [[5, 8, 25, False]], 0],
[[2345, 7400, 1111, 3333, 3333, 1850, 920], 8310]]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| boundary: event ends at slot | [[1840, 3680, 3680], 1840] | [[1840, 3680, 3680], 1840] | Passed |
| boundary: opted-out event | [[7400, 7400], 0] | [[7400, 7400], 0] | Passed |
| boundary: plan below floor | [[1000, 1380], 6020] | [[1000, 1380], 6020] | Passed |
| regression: opt-out honoured | [[1380, 1000, 3333, 2345, 1000, 1380, 11000, 3333, 2208, 0], 1472] | [[1380, 1000, 3333, 2345, 1000, 1380, 11000, 3333, 2208, 0], 1472] | Passed |
| regression: opt-out honoured (partial repair) | [[0, 0, 1111, 11000, 7400, 2208, 1111, 1380, 11000], 1472] | [[0, 0, 1111, 11000, 7400, 2208, 1111, 1380, 11000], 1472] | Passed |
| control 1 | [[1000, 3333, 1111, 1380, 2750], 8250] | [[1000, 3333, 1111, 1380, 2750], 8250] | Passed |
| control 2 | [[1380, 1000, 1111, 1000, 1000, 2000, 2000, 7400, 1111, 2208, 6600, 1111], 8538] | [[1380, 1000, 1111, 1000, 1000, 2000, 2000, 7400, 1111, 2208, 6600, 1111], 8538] | Passed |
SHA-256 / ce097d6501fb2242c83cf9fa2dde02c64d42eee1471a0ab3ed6dd0d8e93668ea
Verification & scope
Deterministic stipulated toy contract for teaching; no claim of conformance with any standard, vendor protocol or production controller. 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:52.564220+00:00.
Case digest / 59bc937463340b842a57345b7110a4e405a64e1424213701d14c05b54296a99e