FA-93151 / EV charging session scheduling / Open access
Weekly recurring charging windows: weekday bit order · case 01
Weekday-only schedules allow charging on Sunday and not on Friday.
ROOT CAUSE
The mask is decoded with bit 0 as Sunday instead of Monday.
VERIFIED REPAIR
Decode bit 0 as Monday for both the current and previous day.
Unsuccessful approach: Decoding today correctly but the previous day Sunday-based still misplaces overnight tails.
Case contract
rules are [day_mask, start, end] with bit 0 = Monday .. bit 6 = Sunday. start < end is a same-day window [start, end); start == end means the whole selected day; start > end crosses midnight and belongs to its start day (Sunday continues into Monday). Return the sorted indices of rules allowing charging at (day 0..6, minute 0..1439).
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(rules, day, minute):
hits = []
for i, (mask, s, e) in enumerate(rules):
today = mask >> (day + 1) % 7 & 1
yday = mask >> day & 1
if s == e:
if today:
hits.append(i)
elif s < e:
if today and s <= minute < e:
hits.append(i)
elif (today and minute >= s) or (yday and minute < e):
hits.append(i)
return hits
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['boundary: Monday morning after Sunday night window', [[[64, 1320, 360]], 0, 100], [0]],
['boundary: same-day window end minute', [[[127, 60, 360]], 3, 360], []],
['boundary: whole-day rule', [[[4, 420, 420]], 2, 5], [0]],
['regression: weekday bit order', [[[84, 60, 360]], 1, 60], []],
['regression: weekday bit order (partial repair)',
[[[72, 0, 1380], [114, 1380, 1080], [82, 1320, 60], [68, 1080, 1380]], 0, 900], [1]],
['control 1', [[[75, 1380, 360]], 0, 1379], []],
['control 2', [[[26, 1380, 420], [118, 360, 0], [104, 1080, 1080]], 3, 0], [2]]],
[['boundary: Monday morning after Sunday night window', [[[64, 1320, 360]], 0, 100], [0]],
['boundary: same-day window end minute', [[[127, 60, 360]], 3, 360], []],
['boundary: whole-day rule', [[[4, 420, 420]], 2, 5], [0]],
['regression: weekday bit order', [[[53, 1080, 0]], 0, 1320], [0]],
['regression: weekday bit order (partial repair)',
[[[113, 360, 60], [87, 420, 0], [65, 1380, 1380], [90, 1380, 1320]], 5, 420], [0, 3]],
['control 1', [[[18, 60, 0], [118, 1080, 0], [124, 60, 360], [93, 1080, 60]], 4, 0], [3]],
['control 2', [[[28, 1320, 1080], [123, 420, 1380], [9, 1380, 0]], 6, 359], []]],
[['boundary: Monday morning after Sunday night window', [[[64, 1320, 360]], 0, 100], [0]],
['boundary: same-day window end minute', [[[127, 60, 360]], 3, 360], []],
['boundary: whole-day rule', [[[4, 420, 420]], 2, 5], [0]],
['regression: weekday bit order', [[[28, 420, 60], [26, 0, 1320]], 1, 1380], []],
['regression: weekday bit order (partial repair)',
[[[7, 0, 0], [6, 360, 1380], [33, 1080, 420], [76, 0, 1080]], 6, 59], [2, 3]],
['control 1', [[[103, 0, 360], [65, 360, 1380], [37, 1080, 1080]], 4, 60], []],
['control 2', [[[52, 420, 1320], [97, 1080, 360]], 0, 0], [1]]],
[['boundary: Monday morning after Sunday night window', [[[64, 1320, 360]], 0, 100], [0]],
['boundary: same-day window end minute', [[[127, 60, 360]], 3, 360], []],
['boundary: whole-day rule', [[[4, 420, 420]], 2, 5], [0]],
['regression: weekday bit order',
[[[33, 1080, 420], [17, 360, 360], [101, 1380, 1380], [116, 1380, 1080]], 2, 1379], [2]],
['regression: weekday bit order (partial repair)',
[[[124, 0, 0], [53, 1320, 360], [89, 60, 60]], 4, 30], [0, 2]],
['control 1', [[[105, 420, 360], [31, 1380, 1320], [47, 1080, 1320]], 4, 60], [0, 1]],
['control 2', [[[59, 360, 60], [45, 420, 60]], 5, 360], [0]]],
[['boundary: Monday morning after Sunday night window', [[[64, 1320, 360]], 0, 100], [0]],
['boundary: same-day window end minute', [[[127, 60, 360]], 3, 360], []],
['boundary: whole-day rule', [[[4, 420, 420]], 2, 5], [0]],
['regression: weekday bit order', [[[51, 360, 1080], [116, 1320, 420]], 0, 60], [1]],
['regression: weekday bit order (partial repair)',
[[[68, 1320, 360], [42, 360, 360], [95, 0, 360], [40, 1380, 60]], 0, 359], [0, 2]],
['control 1', [[[51, 360, 60], [78, 1080, 1080], [25, 1320, 360], [11, 360, 0]], 2, 1380], [1]],
['control 2', [[[16, 1380, 0]], 1, 360], []]]]
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: Monday morning after Sunday night window | [] | [0] | Failed |
| boundary: same-day window end minute | [] | [] | Passed |
| boundary: whole-day rule | [] | [0] | Failed |
| regression: weekday bit order | [0] | [] | Failed |
| regression: weekday bit order (partial repair) | [] | [1] | Failed |
| control 1 | [] | [] | Passed |
| control 2 | [0] | [2] | Failed |
SHA-256 / 762a561cc10f98422ae16e4c662aa5babb057e1313fc217d421332ad645f5cab
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(rules, day, minute):
hits = []
for i, (mask, s, e) in enumerate(rules):
today = mask >> day & 1
yday = mask >> day & 1
if s == e:
if today:
hits.append(i)
elif s < e:
if today and s <= minute < e:
hits.append(i)
elif (today and minute >= s) or (yday and minute < e):
hits.append(i)
return hits
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['boundary: Monday morning after Sunday night window', [[[64, 1320, 360]], 0, 100], [0]],
['boundary: same-day window end minute', [[[127, 60, 360]], 3, 360], []],
['boundary: whole-day rule', [[[4, 420, 420]], 2, 5], [0]],
['regression: weekday bit order', [[[84, 60, 360]], 1, 60], []],
['regression: weekday bit order (partial repair)',
[[[72, 0, 1380], [114, 1380, 1080], [82, 1320, 60], [68, 1080, 1380]], 0, 900], [1]],
['control 1', [[[75, 1380, 360]], 0, 1379], []],
['control 2', [[[26, 1380, 420], [118, 360, 0], [104, 1080, 1080]], 3, 0], [2]]],
[['boundary: Monday morning after Sunday night window', [[[64, 1320, 360]], 0, 100], [0]],
['boundary: same-day window end minute', [[[127, 60, 360]], 3, 360], []],
['boundary: whole-day rule', [[[4, 420, 420]], 2, 5], [0]],
['regression: weekday bit order', [[[53, 1080, 0]], 0, 1320], [0]],
['regression: weekday bit order (partial repair)',
[[[113, 360, 60], [87, 420, 0], [65, 1380, 1380], [90, 1380, 1320]], 5, 420], [0, 3]],
['control 1', [[[18, 60, 0], [118, 1080, 0], [124, 60, 360], [93, 1080, 60]], 4, 0], [3]],
['control 2', [[[28, 1320, 1080], [123, 420, 1380], [9, 1380, 0]], 6, 359], []]],
[['boundary: Monday morning after Sunday night window', [[[64, 1320, 360]], 0, 100], [0]],
['boundary: same-day window end minute', [[[127, 60, 360]], 3, 360], []],
['boundary: whole-day rule', [[[4, 420, 420]], 2, 5], [0]],
['regression: weekday bit order', [[[28, 420, 60], [26, 0, 1320]], 1, 1380], []],
['regression: weekday bit order (partial repair)',
[[[7, 0, 0], [6, 360, 1380], [33, 1080, 420], [76, 0, 1080]], 6, 59], [2, 3]],
['control 1', [[[103, 0, 360], [65, 360, 1380], [37, 1080, 1080]], 4, 60], []],
['control 2', [[[52, 420, 1320], [97, 1080, 360]], 0, 0], [1]]],
[['boundary: Monday morning after Sunday night window', [[[64, 1320, 360]], 0, 100], [0]],
['boundary: same-day window end minute', [[[127, 60, 360]], 3, 360], []],
['boundary: whole-day rule', [[[4, 420, 420]], 2, 5], [0]],
['regression: weekday bit order',
[[[33, 1080, 420], [17, 360, 360], [101, 1380, 1380], [116, 1380, 1080]], 2, 1379], [2]],
['regression: weekday bit order (partial repair)',
[[[124, 0, 0], [53, 1320, 360], [89, 60, 60]], 4, 30], [0, 2]],
['control 1', [[[105, 420, 360], [31, 1380, 1320], [47, 1080, 1320]], 4, 60], [0, 1]],
['control 2', [[[59, 360, 60], [45, 420, 60]], 5, 360], [0]]],
[['boundary: Monday morning after Sunday night window', [[[64, 1320, 360]], 0, 100], [0]],
['boundary: same-day window end minute', [[[127, 60, 360]], 3, 360], []],
['boundary: whole-day rule', [[[4, 420, 420]], 2, 5], [0]],
['regression: weekday bit order', [[[51, 360, 1080], [116, 1320, 420]], 0, 60], [1]],
['regression: weekday bit order (partial repair)',
[[[68, 1320, 360], [42, 360, 360], [95, 0, 360], [40, 1380, 60]], 0, 359], [0, 2]],
['control 1', [[[51, 360, 60], [78, 1080, 1080], [25, 1320, 360], [11, 360, 0]], 2, 1380], [1]],
['control 2', [[[16, 1380, 0]], 1, 360], []]]]
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: Monday morning after Sunday night window | [] | [0] | Failed |
| boundary: same-day window end minute | [] | [] | Passed |
| boundary: whole-day rule | [0] | [0] | Passed |
| regression: weekday bit order | [] | [] | Passed |
| regression: weekday bit order (partial repair) | [] | [1] | Failed |
| control 1 | [] | [] | Passed |
| control 2 | [0, 2] | [2] | Failed |
SHA-256 / 2e783ae0aaab7a43c9354aa231a7c7d143f9ae38c0f67e17ae90687fca03441c
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(rules, day, minute):
hits = []
for i, (mask, s, e) in enumerate(rules):
today = mask >> day & 1
yday = mask >> (day - 1) % 7 & 1
if s == e:
if today:
hits.append(i)
elif s < e:
if today and s <= minute < e:
hits.append(i)
elif (today and minute >= s) or (yday and minute < e):
hits.append(i)
return hits
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['boundary: Monday morning after Sunday night window', [[[64, 1320, 360]], 0, 100], [0]],
['boundary: same-day window end minute', [[[127, 60, 360]], 3, 360], []],
['boundary: whole-day rule', [[[4, 420, 420]], 2, 5], [0]],
['regression: weekday bit order', [[[84, 60, 360]], 1, 60], []],
['regression: weekday bit order (partial repair)',
[[[72, 0, 1380], [114, 1380, 1080], [82, 1320, 60], [68, 1080, 1380]], 0, 900], [1]],
['control 1', [[[75, 1380, 360]], 0, 1379], []],
['control 2', [[[26, 1380, 420], [118, 360, 0], [104, 1080, 1080]], 3, 0], [2]]],
[['boundary: Monday morning after Sunday night window', [[[64, 1320, 360]], 0, 100], [0]],
['boundary: same-day window end minute', [[[127, 60, 360]], 3, 360], []],
['boundary: whole-day rule', [[[4, 420, 420]], 2, 5], [0]],
['regression: weekday bit order', [[[53, 1080, 0]], 0, 1320], [0]],
['regression: weekday bit order (partial repair)',
[[[113, 360, 60], [87, 420, 0], [65, 1380, 1380], [90, 1380, 1320]], 5, 420], [0, 3]],
['control 1', [[[18, 60, 0], [118, 1080, 0], [124, 60, 360], [93, 1080, 60]], 4, 0], [3]],
['control 2', [[[28, 1320, 1080], [123, 420, 1380], [9, 1380, 0]], 6, 359], []]],
[['boundary: Monday morning after Sunday night window', [[[64, 1320, 360]], 0, 100], [0]],
['boundary: same-day window end minute', [[[127, 60, 360]], 3, 360], []],
['boundary: whole-day rule', [[[4, 420, 420]], 2, 5], [0]],
['regression: weekday bit order', [[[28, 420, 60], [26, 0, 1320]], 1, 1380], []],
['regression: weekday bit order (partial repair)',
[[[7, 0, 0], [6, 360, 1380], [33, 1080, 420], [76, 0, 1080]], 6, 59], [2, 3]],
['control 1', [[[103, 0, 360], [65, 360, 1380], [37, 1080, 1080]], 4, 60], []],
['control 2', [[[52, 420, 1320], [97, 1080, 360]], 0, 0], [1]]],
[['boundary: Monday morning after Sunday night window', [[[64, 1320, 360]], 0, 100], [0]],
['boundary: same-day window end minute', [[[127, 60, 360]], 3, 360], []],
['boundary: whole-day rule', [[[4, 420, 420]], 2, 5], [0]],
['regression: weekday bit order',
[[[33, 1080, 420], [17, 360, 360], [101, 1380, 1380], [116, 1380, 1080]], 2, 1379], [2]],
['regression: weekday bit order (partial repair)',
[[[124, 0, 0], [53, 1320, 360], [89, 60, 60]], 4, 30], [0, 2]],
['control 1', [[[105, 420, 360], [31, 1380, 1320], [47, 1080, 1320]], 4, 60], [0, 1]],
['control 2', [[[59, 360, 60], [45, 420, 60]], 5, 360], [0]]],
[['boundary: Monday morning after Sunday night window', [[[64, 1320, 360]], 0, 100], [0]],
['boundary: same-day window end minute', [[[127, 60, 360]], 3, 360], []],
['boundary: whole-day rule', [[[4, 420, 420]], 2, 5], [0]],
['regression: weekday bit order', [[[51, 360, 1080], [116, 1320, 420]], 0, 60], [1]],
['regression: weekday bit order (partial repair)',
[[[68, 1320, 360], [42, 360, 360], [95, 0, 360], [40, 1380, 60]], 0, 359], [0, 2]],
['control 1', [[[51, 360, 60], [78, 1080, 1080], [25, 1320, 360], [11, 360, 0]], 2, 1380], [1]],
['control 2', [[[16, 1380, 0]], 1, 360], []]]]
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: Monday morning after Sunday night window | [0] | [0] | Passed |
| boundary: same-day window end minute | [] | [] | Passed |
| boundary: whole-day rule | [0] | [0] | Passed |
| regression: weekday bit order | [] | [] | Passed |
| regression: weekday bit order (partial repair) | [1] | [1] | Passed |
| control 1 | [] | [] | Passed |
| control 2 | [2] | [2] | Passed |
SHA-256 / d83792262e906ef1acf4a277a1442e61d5b35260b4548c23271deeeaee647aac
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.468329+00:00.
Case digest / 83379dd94fa684e2bb158a497dac493e23a1854020608583cbbbe025a649bac7