{"abstract":"A 7.4 kW charger is scheduled to deliver 7.4 kWh inside a quarter hour.","category":"EV charging session scheduling","checks":7,"contract":"prices[i] is the tariff in cents/kWh of 15-minute slot i. The car is present for slots arrive..depart-1 (depart exclusive) clipped to the tariff horizon; arrive may be negative. Each slot delivers at most max_w//4 Wh. Fill the cheapest slots first (equal price: earlier slot first), the last slot partially. Return [[slot, wh] sorted by slot, cost in millicents (sum wh*price), unmet wh]. need_wh<=0 or max_w<=0 returns [[], 0, max(need_wh,0)].","evaluation_group":"w2-ev_charging_session_scheduling-tou-cheapest-slots","failed_approach":"Dividing by 60 treats the slot as one minute and underfills every slot.","family":"w2-ev_charging_session_scheduling-tou-cheapest-slots-slot-energy-from-power","id":"FA-92851","implementations":{"attempt":{"sha256":"88f3aa991dc9a3cd7e380b953a9a6b6e84f46626aae6a977827d1496e2729729","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(prices, arrive, depart, need_wh, max_w):\n    if need_wh <= 0 or max_w <= 0:\n        return [[], 0, max(need_wh, 0)]\n    slot_wh = max_w // 60\n    lo = max(arrive, 0)\n    hi = min(depart, len(prices))\n    window = list(range(lo, hi))\n    ranked = sorted(window, key=lambda s: (prices[s], s))\n    plan = []\n    left = need_wh\n    for s in ranked:\n        if left <= 0:\n            break\n        take = min(slot_wh, left)\n        plan.append([s, take])\n        left -= take\n    plan.sort()\n    cost = sum(wh * prices[s] for s, wh in plan)\n    return [plan, cost, left]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['boundary: nothing needed', [[10, 20, 30], 0, 3, 0, 7400], [[], 0, 0]],\n  ['boundary: empty window', [[10, 20, 30], 2, 2, 5000, 7400], [[], 0, 5000]],\n  ['boundary: departure beyond tariff horizon', [[30, 10, 10, 20], 1, 9, 5000, 7400],\n   [[[1, 1850], [2, 1850], [3, 1300]], 63000, 0]],\n  ['regression: slot energy from power',\n   [[12, 10, 8, 25, 30, 10, 20, 10, 8, 10, 10, 25, 25], 3, 16, 1500, 3700],\n   [[[5, 575], [8, 925]], 13150, 0]],\n  ['regression: slot energy from power (partial repair)', [[30, 8, 15, 8, 20], -3, 4, 4000, 11000],\n   [[[1, 2750], [3, 1250]], 32000, 0]],\n  ['control 1', [[25, 30, 20, 12, 12], 2, 2, 20000, 11000], [[], 0, 20000]],\n  ['control 2', [[8, 15, 12, 10, 8, 25, 12, 8, 8, 20, 20, 25, 12, 8], -3, 15, 7000, 3700],\n   [[[0, 925], [2, 925], [3, 925], [4, 925], [6, 525], [7, 925], [8, 925], [13, 925]], 63650, 0]]],\n [['boundary: nothing needed', [[10, 20, 30], 0, 3, 0, 7400], [[], 0, 0]],\n  ['boundary: empty window', [[10, 20, 30], 2, 2, 5000, 7400], [[], 0, 5000]],\n  ['boundary: departure beyond tariff horizon', [[30, 10, 10, 20], 1, 9, 5000, 7400],\n   [[[1, 1850], [2, 1850], [3, 1300]], 63000, 0]],\n  ['regression: slot energy from power',\n   [[30, 12, 30, 8, 15, 25, 8, 15, 15, 12, 8], 8, 9, 7000, 3700], [[[8, 925]], 13875, 6075]],\n  ['regression: slot energy from power (partial repair)',\n   [[25, 30, 25, 25, 30, 15, 15, 8, 8, 12, 20, 30, 12, 30], 12, 16, 9000, 3700],\n   [[[12, 925], [13, 925]], 38850, 7150]],\n  ['control 1', [[30, 12, 20, 30, 25, 30, 12, 30, 20, 10, 20, 8, 15], 7, 12, 4000, 11000],\n   [[[9, 1250], [11, 2750]], 34500, 0]],\n  ['control 2', [[12, 12, 25, 30, 8, 20, 12, 12], 3, 11, 9000, 3700],\n   [[[3, 925], [4, 925], [5, 925], [6, 925], [7, 925]], 75850, 4375]]],\n [['boundary: nothing needed', [[10, 20, 30], 0, 3, 0, 7400], [[], 0, 0]],\n  ['boundary: empty window', [[10, 20, 30], 2, 2, 5000, 7400], [[], 0, 5000]],\n  ['boundary: departure beyond tariff horizon', [[30, 10, 10, 20], 1, 9, 5000, 7400],\n   [[[1, 1850], [2, 1850], [3, 1300]], 63000, 0]],\n  ['regression: slot energy from power',\n   [[10, 25, 25, 30, 8, 12, 25, 8, 25, 25], 3, 13, 9000, 3700],\n   [[[3, 925], [4, 925], [5, 925], [6, 925], [7, 925], [8, 925], [9, 925]], 123025, 2525]],\n  ['regression: slot energy from power (partial repair)',\n   [[15, 25, 10, 15, 8, 10, 12, 25, 15, 10, 10, 15, 10, 8], 4, 8, 4000, 11000],\n   [[[4, 2750], [5, 1250]], 34500, 0]],\n  ['control 1', [[12, 10, 15, 25, 30], 4, 4, 12500, 7400], [[], 0, 12500]],\n  ['control 2', [[30, 12, 15, 12, 30, 15, 12, 20, 20], -2, 1, 9000, 0], [[], 0, 9000]]],\n [['boundary: nothing needed', [[10, 20, 30], 0, 3, 0, 7400], [[], 0, 0]],\n  ['boundary: empty window', [[10, 20, 30], 2, 2, 5000, 7400], [[], 0, 5000]],\n  ['boundary: departure beyond tariff horizon', [[30, 10, 10, 20], 1, 9, 5000, 7400],\n   [[[1, 1850], [2, 1850], [3, 1300]], 63000, 0]],\n  ['regression: slot energy from power', [[10, 30, 12, 30, 30, 10], -1, 1, 12500, 11000],\n   [[[0, 2750]], 27500, 9750]],\n  ['regression: slot energy from power (partial repair)',\n   [[20, 15, 25, 30, 8, 15, 10, 15, 20, 25, 25], -2, 9, 1500, 7400], [[[4, 1500]], 12000, 0]],\n  ['control 1', [[12, 20, 8, 15, 10, 8, 25, 12, 30, 12], 2, 12, 20000, 11000],\n   [[[2, 2750], [3, 2750], [4, 2750], [5, 2750], [6, 2750], [7, 2750], [8, 750], [9, 2750]], 270000,\n    0]],\n  ['control 2', [[30, 30, 20, 12, 12, 15, 12, 10], -1, 8, 7000, 7400],\n   [[[3, 1850], [4, 1850], [6, 1450], [7, 1850]], 80300, 0]]],\n [['boundary: nothing needed', [[10, 20, 30], 0, 3, 0, 7400], [[], 0, 0]],\n  ['boundary: empty window', [[10, 20, 30], 2, 2, 5000, 7400], [[], 0, 5000]],\n  ['boundary: departure beyond tariff horizon', [[30, 10, 10, 20], 1, 9, 5000, 7400],\n   [[[1, 1850], [2, 1850], [3, 1300]], 63000, 0]],\n  ['regression: slot energy from power',\n   [[8, 25, 15, 12, 12, 12, 20, 25, 10, 12, 20, 20], 10, 14, 9000, 11000],\n   [[[10, 2750], [11, 2750]], 110000, 3500]],\n  ['regression: slot energy from power (partial repair)',\n   [[12, 20, 12, 12, 12, 12, 20, 15, 10, 12], 0, 11, 4000, 7400],\n   [[[0, 1850], [2, 300], [8, 1850]], 44300, 0]],\n  ['control 1', [[12, 12, 8, 15, 10, 12, 20, 15, 12, 10, 12, 12, 15, 15], 12, 13, 1500, 3700],\n   [[[12, 925]], 13875, 575]],\n  ['control 2', [[10, 12, 10, 8, 10, 12, 12], 2, 5, 4000, 11000],\n   [[[2, 1250], [3, 2750]], 34500, 0]]]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"aed098d5e71df82b8b348ec8a3a90e46c7fbf6232cd45c3094c30b826ad86980","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(prices, arrive, depart, need_wh, max_w):\n    if need_wh <= 0 or max_w <= 0:\n        return [[], 0, max(need_wh, 0)]\n    slot_wh = max_w\n    lo = max(arrive, 0)\n    hi = min(depart, len(prices))\n    window = list(range(lo, hi))\n    ranked = sorted(window, key=lambda s: (prices[s], s))\n    plan = []\n    left = need_wh\n    for s in ranked:\n        if left <= 0:\n            break\n        take = min(slot_wh, left)\n        plan.append([s, take])\n        left -= take\n    plan.sort()\n    cost = sum(wh * prices[s] for s, wh in plan)\n    return [plan, cost, left]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['boundary: nothing needed', [[10, 20, 30], 0, 3, 0, 7400], [[], 0, 0]],\n  ['boundary: empty window', [[10, 20, 30], 2, 2, 5000, 7400], [[], 0, 5000]],\n  ['boundary: departure beyond tariff horizon', [[30, 10, 10, 20], 1, 9, 5000, 7400],\n   [[[1, 1850], [2, 1850], [3, 1300]], 63000, 0]],\n  ['regression: slot energy from power',\n   [[12, 10, 8, 25, 30, 10, 20, 10, 8, 10, 10, 25, 25], 3, 16, 1500, 3700],\n   [[[5, 575], [8, 925]], 13150, 0]],\n  ['regression: slot energy from power (partial repair)', [[30, 8, 15, 8, 20], -3, 4, 4000, 11000],\n   [[[1, 2750], [3, 1250]], 32000, 0]],\n  ['control 1', [[25, 30, 20, 12, 12], 2, 2, 20000, 11000], [[], 0, 20000]],\n  ['control 2', [[8, 15, 12, 10, 8, 25, 12, 8, 8, 20, 20, 25, 12, 8], -3, 15, 7000, 3700],\n   [[[0, 925], [2, 925], [3, 925], [4, 925], [6, 525], [7, 925], [8, 925], [13, 925]], 63650, 0]]],\n [['boundary: nothing needed', [[10, 20, 30], 0, 3, 0, 7400], [[], 0, 0]],\n  ['boundary: empty window', [[10, 20, 30], 2, 2, 5000, 7400], [[], 0, 5000]],\n  ['boundary: departure beyond tariff horizon', [[30, 10, 10, 20], 1, 9, 5000, 7400],\n   [[[1, 1850], [2, 1850], [3, 1300]], 63000, 0]],\n  ['regression: slot energy from power',\n   [[30, 12, 30, 8, 15, 25, 8, 15, 15, 12, 8], 8, 9, 7000, 3700], [[[8, 925]], 13875, 6075]],\n  ['regression: slot energy from power (partial repair)',\n   [[25, 30, 25, 25, 30, 15, 15, 8, 8, 12, 20, 30, 12, 30], 12, 16, 9000, 3700],\n   [[[12, 925], [13, 925]], 38850, 7150]],\n  ['control 1', [[30, 12, 20, 30, 25, 30, 12, 30, 20, 10, 20, 8, 15], 7, 12, 4000, 11000],\n   [[[9, 1250], [11, 2750]], 34500, 0]],\n  ['control 2', [[12, 12, 25, 30, 8, 20, 12, 12], 3, 11, 9000, 3700],\n   [[[3, 925], [4, 925], [5, 925], [6, 925], [7, 925]], 75850, 4375]]],\n [['boundary: nothing needed', [[10, 20, 30], 0, 3, 0, 7400], [[], 0, 0]],\n  ['boundary: empty window', [[10, 20, 30], 2, 2, 5000, 7400], [[], 0, 5000]],\n  ['boundary: departure beyond tariff horizon', [[30, 10, 10, 20], 1, 9, 5000, 7400],\n   [[[1, 1850], [2, 1850], [3, 1300]], 63000, 0]],\n  ['regression: slot energy from power',\n   [[10, 25, 25, 30, 8, 12, 25, 8, 25, 25], 3, 13, 9000, 3700],\n   [[[3, 925], [4, 925], [5, 925], [6, 925], [7, 925], [8, 925], [9, 925]], 123025, 2525]],\n  ['regression: slot energy from power (partial repair)',\n   [[15, 25, 10, 15, 8, 10, 12, 25, 15, 10, 10, 15, 10, 8], 4, 8, 4000, 11000],\n   [[[4, 2750], [5, 1250]], 34500, 0]],\n  ['control 1', [[12, 10, 15, 25, 30], 4, 4, 12500, 7400], [[], 0, 12500]],\n  ['control 2', [[30, 12, 15, 12, 30, 15, 12, 20, 20], -2, 1, 9000, 0], [[], 0, 9000]]],\n [['boundary: nothing needed', [[10, 20, 30], 0, 3, 0, 7400], [[], 0, 0]],\n  ['boundary: empty window', [[10, 20, 30], 2, 2, 5000, 7400], [[], 0, 5000]],\n  ['boundary: departure beyond tariff horizon', [[30, 10, 10, 20], 1, 9, 5000, 7400],\n   [[[1, 1850], [2, 1850], [3, 1300]], 63000, 0]],\n  ['regression: slot energy from power', [[10, 30, 12, 30, 30, 10], -1, 1, 12500, 11000],\n   [[[0, 2750]], 27500, 9750]],\n  ['regression: slot energy from power (partial repair)',\n   [[20, 15, 25, 30, 8, 15, 10, 15, 20, 25, 25], -2, 9, 1500, 7400], [[[4, 1500]], 12000, 0]],\n  ['control 1', [[12, 20, 8, 15, 10, 8, 25, 12, 30, 12], 2, 12, 20000, 11000],\n   [[[2, 2750], [3, 2750], [4, 2750], [5, 2750], [6, 2750], [7, 2750], [8, 750], [9, 2750]], 270000,\n    0]],\n  ['control 2', [[30, 30, 20, 12, 12, 15, 12, 10], -1, 8, 7000, 7400],\n   [[[3, 1850], [4, 1850], [6, 1450], [7, 1850]], 80300, 0]]],\n [['boundary: nothing needed', [[10, 20, 30], 0, 3, 0, 7400], [[], 0, 0]],\n  ['boundary: empty window', [[10, 20, 30], 2, 2, 5000, 7400], [[], 0, 5000]],\n  ['boundary: departure beyond tariff horizon', [[30, 10, 10, 20], 1, 9, 5000, 7400],\n   [[[1, 1850], [2, 1850], [3, 1300]], 63000, 0]],\n  ['regression: slot energy from power',\n   [[8, 25, 15, 12, 12, 12, 20, 25, 10, 12, 20, 20], 10, 14, 9000, 11000],\n   [[[10, 2750], [11, 2750]], 110000, 3500]],\n  ['regression: slot energy from power (partial repair)',\n   [[12, 20, 12, 12, 12, 12, 20, 15, 10, 12], 0, 11, 4000, 7400],\n   [[[0, 1850], [2, 300], [8, 1850]], 44300, 0]],\n  ['control 1', [[12, 12, 8, 15, 10, 12, 20, 15, 12, 10, 12, 12, 15, 15], 12, 13, 1500, 3700],\n   [[[12, 925]], 13875, 575]],\n  ['control 2', [[10, 12, 10, 8, 10, 12, 12], 2, 5, 4000, 11000],\n   [[[2, 1250], [3, 2750]], 34500, 0]]]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"45ac50dbb3225f677d0533987a0debf84c86233a8fc8d235d293cb9cd2b3405c","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(prices, arrive, depart, need_wh, max_w):\n    if need_wh <= 0 or max_w <= 0:\n        return [[], 0, max(need_wh, 0)]\n    slot_wh = max_w // 4\n    lo = max(arrive, 0)\n    hi = min(depart, len(prices))\n    window = list(range(lo, hi))\n    ranked = sorted(window, key=lambda s: (prices[s], s))\n    plan = []\n    left = need_wh\n    for s in ranked:\n        if left <= 0:\n            break\n        take = min(slot_wh, left)\n        plan.append([s, take])\n        left -= take\n    plan.sort()\n    cost = sum(wh * prices[s] for s, wh in plan)\n    return [plan, cost, left]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['boundary: nothing needed', [[10, 20, 30], 0, 3, 0, 7400], [[], 0, 0]],\n  ['boundary: empty window', [[10, 20, 30], 2, 2, 5000, 7400], [[], 0, 5000]],\n  ['boundary: departure beyond tariff horizon', [[30, 10, 10, 20], 1, 9, 5000, 7400],\n   [[[1, 1850], [2, 1850], [3, 1300]], 63000, 0]],\n  ['regression: slot energy from power',\n   [[12, 10, 8, 25, 30, 10, 20, 10, 8, 10, 10, 25, 25], 3, 16, 1500, 3700],\n   [[[5, 575], [8, 925]], 13150, 0]],\n  ['regression: slot energy from power (partial repair)', [[30, 8, 15, 8, 20], -3, 4, 4000, 11000],\n   [[[1, 2750], [3, 1250]], 32000, 0]],\n  ['control 1', [[25, 30, 20, 12, 12], 2, 2, 20000, 11000], [[], 0, 20000]],\n  ['control 2', [[8, 15, 12, 10, 8, 25, 12, 8, 8, 20, 20, 25, 12, 8], -3, 15, 7000, 3700],\n   [[[0, 925], [2, 925], [3, 925], [4, 925], [6, 525], [7, 925], [8, 925], [13, 925]], 63650, 0]]],\n [['boundary: nothing needed', [[10, 20, 30], 0, 3, 0, 7400], [[], 0, 0]],\n  ['boundary: empty window', [[10, 20, 30], 2, 2, 5000, 7400], [[], 0, 5000]],\n  ['boundary: departure beyond tariff horizon', [[30, 10, 10, 20], 1, 9, 5000, 7400],\n   [[[1, 1850], [2, 1850], [3, 1300]], 63000, 0]],\n  ['regression: slot energy from power',\n   [[30, 12, 30, 8, 15, 25, 8, 15, 15, 12, 8], 8, 9, 7000, 3700], [[[8, 925]], 13875, 6075]],\n  ['regression: slot energy from power (partial repair)',\n   [[25, 30, 25, 25, 30, 15, 15, 8, 8, 12, 20, 30, 12, 30], 12, 16, 9000, 3700],\n   [[[12, 925], [13, 925]], 38850, 7150]],\n  ['control 1', [[30, 12, 20, 30, 25, 30, 12, 30, 20, 10, 20, 8, 15], 7, 12, 4000, 11000],\n   [[[9, 1250], [11, 2750]], 34500, 0]],\n  ['control 2', [[12, 12, 25, 30, 8, 20, 12, 12], 3, 11, 9000, 3700],\n   [[[3, 925], [4, 925], [5, 925], [6, 925], [7, 925]], 75850, 4375]]],\n [['boundary: nothing needed', [[10, 20, 30], 0, 3, 0, 7400], [[], 0, 0]],\n  ['boundary: empty window', [[10, 20, 30], 2, 2, 5000, 7400], [[], 0, 5000]],\n  ['boundary: departure beyond tariff horizon', [[30, 10, 10, 20], 1, 9, 5000, 7400],\n   [[[1, 1850], [2, 1850], [3, 1300]], 63000, 0]],\n  ['regression: slot energy from power',\n   [[10, 25, 25, 30, 8, 12, 25, 8, 25, 25], 3, 13, 9000, 3700],\n   [[[3, 925], [4, 925], [5, 925], [6, 925], [7, 925], [8, 925], [9, 925]], 123025, 2525]],\n  ['regression: slot energy from power (partial repair)',\n   [[15, 25, 10, 15, 8, 10, 12, 25, 15, 10, 10, 15, 10, 8], 4, 8, 4000, 11000],\n   [[[4, 2750], [5, 1250]], 34500, 0]],\n  ['control 1', [[12, 10, 15, 25, 30], 4, 4, 12500, 7400], [[], 0, 12500]],\n  ['control 2', [[30, 12, 15, 12, 30, 15, 12, 20, 20], -2, 1, 9000, 0], [[], 0, 9000]]],\n [['boundary: nothing needed', [[10, 20, 30], 0, 3, 0, 7400], [[], 0, 0]],\n  ['boundary: empty window', [[10, 20, 30], 2, 2, 5000, 7400], [[], 0, 5000]],\n  ['boundary: departure beyond tariff horizon', [[30, 10, 10, 20], 1, 9, 5000, 7400],\n   [[[1, 1850], [2, 1850], [3, 1300]], 63000, 0]],\n  ['regression: slot energy from power', [[10, 30, 12, 30, 30, 10], -1, 1, 12500, 11000],\n   [[[0, 2750]], 27500, 9750]],\n  ['regression: slot energy from power (partial repair)',\n   [[20, 15, 25, 30, 8, 15, 10, 15, 20, 25, 25], -2, 9, 1500, 7400], [[[4, 1500]], 12000, 0]],\n  ['control 1', [[12, 20, 8, 15, 10, 8, 25, 12, 30, 12], 2, 12, 20000, 11000],\n   [[[2, 2750], [3, 2750], [4, 2750], [5, 2750], [6, 2750], [7, 2750], [8, 750], [9, 2750]], 270000,\n    0]],\n  ['control 2', [[30, 30, 20, 12, 12, 15, 12, 10], -1, 8, 7000, 7400],\n   [[[3, 1850], [4, 1850], [6, 1450], [7, 1850]], 80300, 0]]],\n [['boundary: nothing needed', [[10, 20, 30], 0, 3, 0, 7400], [[], 0, 0]],\n  ['boundary: empty window', [[10, 20, 30], 2, 2, 5000, 7400], [[], 0, 5000]],\n  ['boundary: departure beyond tariff horizon', [[30, 10, 10, 20], 1, 9, 5000, 7400],\n   [[[1, 1850], [2, 1850], [3, 1300]], 63000, 0]],\n  ['regression: slot energy from power',\n   [[8, 25, 15, 12, 12, 12, 20, 25, 10, 12, 20, 20], 10, 14, 9000, 11000],\n   [[[10, 2750], [11, 2750]], 110000, 3500]],\n  ['regression: slot energy from power (partial repair)',\n   [[12, 20, 12, 12, 12, 12, 20, 15, 10, 12], 0, 11, 4000, 7400],\n   [[[0, 1850], [2, 300], [8, 1850]], 44300, 0]],\n  ['control 1', [[12, 12, 8, 15, 10, 12, 20, 15, 12, 10, 12, 12, 15, 15], 12, 13, 1500, 3700],\n   [[[12, 925]], 13875, 575]],\n  ['control 2', [[10, 12, 10, 8, 10, 12, 12], 2, 5, 4000, 11000],\n   [[[2, 1250], [3, 2750]], 34500, 0]]]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"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.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-ev_charging_session_scheduling-tou-cheapest-slots-slot-energy-from-power","generated_at":"2026-09-29T14:51:49.751350+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"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.","repair":"Limit each 15-minute slot to max_w // 4 Wh.","root_cause":"The per-slot energy limit uses the hourly power rating without converting to a 15-minute slot.","sha256":"1ff9c05eb9cdd96913d60a3ec9e07b90f64ca9aca1262b71aad39ad888813328","title":"Time-of-use cheapest slot plan: slot energy from power · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":41.04,"exit_code":1,"observations":[{"actual":[[],0,0],"check":"boundary: nothing needed","expected":[[],0,0],"passed":true},{"actual":[[],0,5000],"check":"boundary: empty window","expected":[[],0,5000],"passed":true},{"actual":[[[1,123],[2,123],[3,123]],4920,4631],"check":"boundary: departure beyond tariff horizon","expected":[[[1,1850],[2,1850],[3,1300]],63000,0],"passed":false},{"actual":[[[3,61],[4,61],[5,61],[6,61],[7,61],[8,61],[9,61],[10,61],[11,61],[12,61]],10553,890],"check":"regression: slot energy from power","expected":[[[5,575],[8,925]],13150,0],"passed":false},{"actual":[[[0,183],[1,183],[2,183],[3,183]],11163,3268],"check":"regression: slot energy from power (partial repair)","expected":[[[1,2750],[3,1250]],32000,0],"passed":false},{"actual":[[],0,20000],"check":"control 1","expected":[[],0,20000],"passed":true},{"actual":[[[0,61],[1,61],[2,61],[3,61],[4,61],[5,61],[6,61],[7,61],[8,61],[9,61],[10,61],[11,61],[12,61],[13,61]],11651,6146],"check":"control 2","expected":[[[0,925],[2,925],[3,925],[4,925],[6,525],[7,925],[8,925],[13,925]],63650,0],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"boundary: nothing needed\", \"actual\": [[], 0, 0], \"expected\": [[], 0, 0], \"passed\": true}, {\"check\": \"boundary: empty window\", \"actual\": [[], 0, 5000], \"expected\": [[], 0, 5000], \"passed\": true}, {\"check\": \"boundary: departure beyond tariff horizon\", \"actual\": [[[1, 123], [2, 123], [3, 123]], 4920, 4631], \"expected\": [[[1, 1850], [2, 1850], [3, 1300]], 63000, 0], \"passed\": false}, {\"check\": \"regression: slot energy from power\", \"actual\": [[[3, 61], [4, 61], [5, 61], [6, 61], [7, 61], [8, 61], [9, 61], [10, 61], [11, 61], [12, 61]], 10553, 890], \"expected\": [[[5, 575], [8, 925]], 13150, 0], \"passed\": false}, {\"check\": \"regression: slot energy from power (partial repair)\", \"actual\": [[[0, 183], [1, 183], [2, 183], [3, 183]], 11163, 3268], \"expected\": [[[1, 2750], [3, 1250]], 32000, 0], \"passed\": false}, {\"check\": \"control 1\", \"actual\": [[], 0, 20000], \"expected\": [[], 0, 20000], \"passed\": true}, {\"check\": \"control 2\", \"actual\": [[[0, 61], [1, 61], [2, 61], [3, 61], [4, 61], [5, 61], [6, 61], [7, 61], [8, 61], [9, 61], [10, 61], [11, 61], [12, 61], [13, 61]], 11651, 6146], \"expected\": [[[0, 925], [2, 925], [3, 925], [4, 925], [6, 525], [7, 925], [8, 925], [13, 925]], 63650, 0], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.804,"exit_code":1,"observations":[{"actual":[[],0,0],"check":"boundary: nothing needed","expected":[[],0,0],"passed":true},{"actual":[[],0,5000],"check":"boundary: empty window","expected":[[],0,5000],"passed":true},{"actual":[[[1,5000]],50000,0],"check":"boundary: departure beyond tariff horizon","expected":[[[1,1850],[2,1850],[3,1300]],63000,0],"passed":false},{"actual":[[[8,1500]],12000,0],"check":"regression: slot energy from power","expected":[[[5,575],[8,925]],13150,0],"passed":false},{"actual":[[[1,4000]],32000,0],"check":"regression: slot energy from power (partial repair)","expected":[[[1,2750],[3,1250]],32000,0],"passed":false},{"actual":[[],0,20000],"check":"control 1","expected":[[],0,20000],"passed":true},{"actual":[[[0,3700],[4,3300]],56000,0],"check":"control 2","expected":[[[0,925],[2,925],[3,925],[4,925],[6,525],[7,925],[8,925],[13,925]],63650,0],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"boundary: nothing needed\", \"actual\": [[], 0, 0], \"expected\": [[], 0, 0], \"passed\": true}, {\"check\": \"boundary: empty window\", \"actual\": [[], 0, 5000], \"expected\": [[], 0, 5000], \"passed\": true}, {\"check\": \"boundary: departure beyond tariff horizon\", \"actual\": [[[1, 5000]], 50000, 0], \"expected\": [[[1, 1850], [2, 1850], [3, 1300]], 63000, 0], \"passed\": false}, {\"check\": \"regression: slot energy from power\", \"actual\": [[[8, 1500]], 12000, 0], \"expected\": [[[5, 575], [8, 925]], 13150, 0], \"passed\": false}, {\"check\": \"regression: slot energy from power (partial repair)\", \"actual\": [[[1, 4000]], 32000, 0], \"expected\": [[[1, 2750], [3, 1250]], 32000, 0], \"passed\": false}, {\"check\": \"control 1\", \"actual\": [[], 0, 20000], \"expected\": [[], 0, 20000], \"passed\": true}, {\"check\": \"control 2\", \"actual\": [[[0, 3700], [4, 3300]], 56000, 0], \"expected\": [[[0, 925], [2, 925], [3, 925], [4, 925], [6, 525], [7, 925], [8, 925], [13, 925]], 63650, 0], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":39.881,"exit_code":0,"observations":[{"actual":[[],0,0],"check":"boundary: nothing needed","expected":[[],0,0],"passed":true},{"actual":[[],0,5000],"check":"boundary: empty window","expected":[[],0,5000],"passed":true},{"actual":[[[1,1850],[2,1850],[3,1300]],63000,0],"check":"boundary: departure beyond tariff horizon","expected":[[[1,1850],[2,1850],[3,1300]],63000,0],"passed":true},{"actual":[[[5,575],[8,925]],13150,0],"check":"regression: slot energy from power","expected":[[[5,575],[8,925]],13150,0],"passed":true},{"actual":[[[1,2750],[3,1250]],32000,0],"check":"regression: slot energy from power (partial repair)","expected":[[[1,2750],[3,1250]],32000,0],"passed":true},{"actual":[[],0,20000],"check":"control 1","expected":[[],0,20000],"passed":true},{"actual":[[[0,925],[2,925],[3,925],[4,925],[6,525],[7,925],[8,925],[13,925]],63650,0],"check":"control 2","expected":[[[0,925],[2,925],[3,925],[4,925],[6,525],[7,925],[8,925],[13,925]],63650,0],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"boundary: nothing needed\", \"actual\": [[], 0, 0], \"expected\": [[], 0, 0], \"passed\": true}, {\"check\": \"boundary: empty window\", \"actual\": [[], 0, 5000], \"expected\": [[], 0, 5000], \"passed\": true}, {\"check\": \"boundary: departure beyond tariff horizon\", \"actual\": [[[1, 1850], [2, 1850], [3, 1300]], 63000, 0], \"expected\": [[[1, 1850], [2, 1850], [3, 1300]], 63000, 0], \"passed\": true}, {\"check\": \"regression: slot energy from power\", \"actual\": [[[5, 575], [8, 925]], 13150, 0], \"expected\": [[[5, 575], [8, 925]], 13150, 0], \"passed\": true}, {\"check\": \"regression: slot energy from power (partial repair)\", \"actual\": [[[1, 2750], [3, 1250]], 32000, 0], \"expected\": [[[1, 2750], [3, 1250]], 32000, 0], \"passed\": true}, {\"check\": \"control 1\", \"actual\": [[], 0, 20000], \"expected\": [[], 0, 20000], \"passed\": true}, {\"check\": \"control 2\", \"actual\": [[[0, 925], [2, 925], [3, 925], [4, 925], [6, 525], [7, 925], [8, 925], [13, 925]], 63650, 0], \"expected\": [[[0, 925], [2, 925], [3, 925], [4, 925], [6, 525], [7, 925], [8, 925], [13, 925]], 63650, 0], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}