{"abstract":"EV charging session and idle fee returns a wrong result when the minimum applies only to the energy charge.","category":"Toll and parking fee computation","checks":8,"contract":"Input {plug_in, charge_end, unplug (minutes), wh, price_per_kwh, idle_grace, idle_rate (per started 10 min), idle_cap, session_fee, min_fee}. Energy = ceil(wh*price/1000). Idle minutes = max(0, unplug - charge_end - grace); idle fee = min(idle_cap, started 10-minute blocks * idle_rate). Total = max(min_fee, session_fee + energy + idle). Return {energy, idle, total}.","contract_signature":"x","evaluation_group":"w2-toll_and_parking_fee_computation-ev-idle-fee","failed_approach":"Applying the minimum to energy only ignores idle fees that already exceed it.","family":"w2-toll_and_parking_fee_computation-ev-idle-fee-minimum-scope","id":"FA-68716","implementations":{"attempt":{"sha256":"8415f323688c07c78804c1b4a84dc57b00ad18d27cca03179b5319aba9006187","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    energy = -(-x['wh'] * x['price_per_kwh'] // 1000)\n    idle = max(0, x['unplug'] - x['charge_end'] - x['idle_grace'])\n    idle_fee = min(x['idle_cap'], -(-idle // 10) * x['idle_rate'])\n    total = x['session_fee'] + energy + idle_fee\n    return {'energy': energy, 'idle': idle_fee, 'total': max(x['min_fee'], energy) + x['session_fee'] + idle_fee}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[({'plug_in': 0, 'charge_end': 90, 'unplug': 106, 'wh': 12500, 'price_per_kwh': 35, 'idle_grace': 15, 'idle_rate': 50, 'idle_cap': 2000, 'session_fee': 100, 'min_fee': 300}, {'energy': 438, 'idle': 50, 'total': 588}), ({'plug_in': 93, 'charge_end': 112, 'unplug': 312, 'wh': 46598, 'price_per_kwh': 35, 'idle_grace': 10, 'idle_rate': 100, 'idle_cap': 2000, 'session_fee': 0, 'min_fee': 500}, {'energy': 1631, 'idle': 1900, 'total': 3531}), ({'plug_in': 548, 'charge_end': 701, 'unplug': 706, 'wh': 9990, 'price_per_kwh': 29, 'idle_grace': 15, 'idle_rate': 40, 'idle_cap': 3000, 'session_fee': 150, 'min_fee': 500}, {'energy': 290, 'idle': 0, 'total': 500}), ({'plug_in': 502, 'charge_end': 683, 'unplug': 698, 'wh': 5462, 'price_per_kwh': 45, 'idle_grace': 10, 'idle_rate': 50, 'idle_cap': 1000, 'session_fee': 0, 'min_fee': 300}, {'energy': 246, 'idle': 50, 'total': 300}), ({'plug_in': 119, 'charge_end': 199, 'unplug': 215, 'wh': 5114, 'price_per_kwh': 29, 'idle_grace': 15, 'idle_rate': 100, 'idle_cap': 3000, 'session_fee': 100, 'min_fee': 500}, {'energy': 149, 'idle': 100, 'total': 500}), ({'plug_in': 74, 'charge_end': 111, 'unplug': 171, 'wh': 4221, 'price_per_kwh': 29, 'idle_grace': 15, 'idle_rate': 40, 'idle_cap': 3000, 'session_fee': 150, 'min_fee': 500}, {'energy': 123, 'idle': 200, 'total': 500}), ({'plug_in': 585, 'charge_end': 800, 'unplug': 810, 'wh': 39441, 'price_per_kwh': 35, 'idle_grace': 15, 'idle_rate': 40, 'idle_cap': 2000, 'session_fee': 0, 'min_fee': 500}, {'energy': 1381, 'idle': 0, 'total': 1381}), ({'plug_in': 30, 'charge_end': 45, 'unplug': 400, 'wh': 800, 'price_per_kwh': 29, 'idle_grace': 10, 'idle_rate': 100, 'idle_cap': 1000, 'session_fee': 0, 'min_fee': 500}, {'energy': 24, 'idle': 1000, 'total': 1024})], [({'plug_in': 30, 'charge_end': 45, 'unplug': 400, 'wh': 800, 'price_per_kwh': 29, 'idle_grace': 10, 'idle_rate': 100, 'idle_cap': 1000, 'session_fee': 0, 'min_fee': 500}, {'energy': 24, 'idle': 1000, 'total': 1024}), ({'plug_in': 4, 'charge_end': 296, 'unplug': 312, 'wh': 3717, 'price_per_kwh': 52, 'idle_grace': 10, 'idle_rate': 40, 'idle_cap': 2000, 'session_fee': 100, 'min_fee': 500}, {'energy': 194, 'idle': 40, 'total': 500}), ({'plug_in': 73, 'charge_end': 83, 'unplug': 283, 'wh': 4230, 'price_per_kwh': 35, 'idle_grace': 10, 'idle_rate': 100, 'idle_cap': 1000, 'session_fee': 100, 'min_fee': 200}, {'energy': 149, 'idle': 1000, 'total': 1249}), ({'plug_in': 115, 'charge_end': 331, 'unplug': 346, 'wh': 4709, 'price_per_kwh': 52, 'idle_grace': 15, 'idle_rate': 50, 'idle_cap': 3000, 'session_fee': 150, 'min_fee': 200}, {'energy': 245, 'idle': 0, 'total': 395}), ({'plug_in': 0, 'charge_end': 90, 'unplug': 106, 'wh': 12500, 'price_per_kwh': 35, 'idle_grace': 15, 'idle_rate': 50, 'idle_cap': 2000, 'session_fee': 100, 'min_fee': 300}, {'energy': 438, 'idle': 50, 'total': 588}), ({'plug_in': 490, 'charge_end': 569, 'unplug': 569, 'wh': 4974, 'price_per_kwh': 52, 'idle_grace': 15, 'idle_rate': 100, 'idle_cap': 3000, 'session_fee': 100, 'min_fee': 300}, {'energy': 259, 'idle': 0, 'total': 359}), ({'plug_in': 157, 'charge_end': 214, 'unplug': 274, 'wh': 2276, 'price_per_kwh': 45, 'idle_grace': 10, 'idle_rate': 50, 'idle_cap': 1000, 'session_fee': 150, 'min_fee': 500}, {'energy': 103, 'idle': 250, 'total': 503}), ({'plug_in': 230, 'charge_end': 290, 'unplug': 306, 'wh': 27281, 'price_per_kwh': 45, 'idle_grace': 10, 'idle_rate': 100, 'idle_cap': 3000, 'session_fee': 150, 'min_fee': 300}, {'energy': 1228, 'idle': 100, 'total': 1478})], [({'plug_in': 0, 'charge_end': 90, 'unplug': 106, 'wh': 12500, 'price_per_kwh': 35, 'idle_grace': 15, 'idle_rate': 50, 'idle_cap': 2000, 'session_fee': 100, 'min_fee': 300}, {'energy': 438, 'idle': 50, 'total': 588}), ({'plug_in': 361, 'charge_end': 626, 'unplug': 626, 'wh': 29818, 'price_per_kwh': 52, 'idle_grace': 15, 'idle_rate': 50, 'idle_cap': 2000, 'session_fee': 150, 'min_fee': 300}, {'energy': 1551, 'idle': 0, 'total': 1701}), ({'plug_in': 58, 'charge_end': 244, 'unplug': 260, 'wh': 4184, 'price_per_kwh': 45, 'idle_grace': 15, 'idle_rate': 100, 'idle_cap': 3000, 'session_fee': 100, 'min_fee': 300}, {'energy': 189, 'idle': 100, 'total': 389}), ({'plug_in': 34, 'charge_end': 215, 'unplug': 215, 'wh': 13150, 'price_per_kwh': 35, 'idle_grace': 10, 'idle_rate': 100, 'idle_cap': 1000, 'session_fee': 100, 'min_fee': 500}, {'energy': 461, 'idle': 0, 'total': 561}), ({'plug_in': 30, 'charge_end': 45, 'unplug': 400, 'wh': 800, 'price_per_kwh': 29, 'idle_grace': 10, 'idle_rate': 100, 'idle_cap': 1000, 'session_fee': 0, 'min_fee': 500}, {'energy': 24, 'idle': 1000, 'total': 1024}), ({'plug_in': 437, 'charge_end': 628, 'unplug': 628, 'wh': 6615, 'price_per_kwh': 45, 'idle_grace': 15, 'idle_rate': 100, 'idle_cap': 2000, 'session_fee': 100, 'min_fee': 300}, {'energy': 298, 'idle': 0, 'total': 398}), ({'plug_in': 86, 'charge_end': 283, 'unplug': 288, 'wh': 13385, 'price_per_kwh': 52, 'idle_grace': 15, 'idle_rate': 100, 'idle_cap': 1000, 'session_fee': 0, 'min_fee': 500}, {'energy': 697, 'idle': 0, 'total': 697}), ({'plug_in': 433, 'charge_end': 493, 'unplug': 893, 'wh': 1131, 'price_per_kwh': 45, 'idle_grace': 15, 'idle_rate': 40, 'idle_cap': 2000, 'session_fee': 0, 'min_fee': 200}, {'energy': 51, 'idle': 1560, 'total': 1611})], [({'plug_in': 30, 'charge_end': 45, 'unplug': 400, 'wh': 800, 'price_per_kwh': 29, 'idle_grace': 10, 'idle_rate': 100, 'idle_cap': 1000, 'session_fee': 0, 'min_fee': 500}, {'energy': 24, 'idle': 1000, 'total': 1024}), ({'plug_in': 63, 'charge_end': 346, 'unplug': 406, 'wh': 5005, 'price_per_kwh': 35, 'idle_grace': 15, 'idle_rate': 50, 'idle_cap': 3000, 'session_fee': 150, 'min_fee': 500}, {'energy': 176, 'idle': 250, 'total': 576}), ({'plug_in': 197, 'charge_end': 253, 'unplug': 263, 'wh': 7897, 'price_per_kwh': 45, 'idle_grace': 15, 'idle_rate': 40, 'idle_cap': 3000, 'session_fee': 100, 'min_fee': 500}, {'energy': 356, 'idle': 0, 'total': 500}), ({'plug_in': 0, 'charge_end': 90, 'unplug': 106, 'wh': 12500, 'price_per_kwh': 35, 'idle_grace': 15, 'idle_rate': 50, 'idle_cap': 2000, 'session_fee': 100, 'min_fee': 300}, {'energy': 438, 'idle': 50, 'total': 588}), ({'plug_in': 484, 'charge_end': 672, 'unplug': 682, 'wh': 3159, 'price_per_kwh': 52, 'idle_grace': 10, 'idle_rate': 100, 'idle_cap': 3000, 'session_fee': 150, 'min_fee': 200}, {'energy': 165, 'idle': 0, 'total': 315}), ({'plug_in': 540, 'charge_end': 691, 'unplug': 691, 'wh': 40240, 'price_per_kwh': 35, 'idle_grace': 15, 'idle_rate': 40, 'idle_cap': 3000, 'session_fee': 150, 'min_fee': 300}, {'energy': 1409, 'idle': 0, 'total': 1559}), ({'plug_in': 530, 'charge_end': 706, 'unplug': 722, 'wh': 19196, 'price_per_kwh': 29, 'idle_grace': 10, 'idle_rate': 100, 'idle_cap': 2000, 'session_fee': 100, 'min_fee': 200}, {'energy': 557, 'idle': 100, 'total': 757}), ({'plug_in': 103, 'charge_end': 177, 'unplug': 377, 'wh': 8629, 'price_per_kwh': 45, 'idle_grace': 10, 'idle_rate': 40, 'idle_cap': 3000, 'session_fee': 0, 'min_fee': 500}, {'energy': 389, 'idle': 760, 'total': 1149})], [({'plug_in': 537, 'charge_end': 679, 'unplug': 704, 'wh': 2203, 'price_per_kwh': 29, 'idle_grace': 10, 'idle_rate': 100, 'idle_cap': 2000, 'session_fee': 100, 'min_fee': 300}, {'energy': 64, 'idle': 200, 'total': 364}), ({'plug_in': 358, 'charge_end': 474, 'unplug': 484, 'wh': 14178, 'price_per_kwh': 29, 'idle_grace': 15, 'idle_rate': 40, 'idle_cap': 2000, 'session_fee': 150, 'min_fee': 500}, {'energy': 412, 'idle': 0, 'total': 562}), ({'plug_in': 193, 'charge_end': 361, 'unplug': 386, 'wh': 58152, 'price_per_kwh': 52, 'idle_grace': 15, 'idle_rate': 40, 'idle_cap': 1000, 'session_fee': 0, 'min_fee': 300}, {'energy': 3024, 'idle': 40, 'total': 3064}), ({'plug_in': 0, 'charge_end': 90, 'unplug': 106, 'wh': 12500, 'price_per_kwh': 35, 'idle_grace': 15, 'idle_rate': 50, 'idle_cap': 2000, 'session_fee': 100, 'min_fee': 300}, {'energy': 438, 'idle': 50, 'total': 588}), ({'plug_in': 80, 'charge_end': 341, 'unplug': 346, 'wh': 6794, 'price_per_kwh': 35, 'idle_grace': 15, 'idle_rate': 100, 'idle_cap': 2000, 'session_fee': 100, 'min_fee': 500}, {'energy': 238, 'idle': 0, 'total': 500}), ({'plug_in': 473, 'charge_end': 503, 'unplug': 519, 'wh': 7069, 'price_per_kwh': 45, 'idle_grace': 10, 'idle_rate': 100, 'idle_cap': 3000, 'session_fee': 0, 'min_fee': 500}, {'energy': 319, 'idle': 100, 'total': 500}), ({'plug_in': 30, 'charge_end': 45, 'unplug': 400, 'wh': 800, 'price_per_kwh': 29, 'idle_grace': 10, 'idle_rate': 100, 'idle_cap': 1000, 'session_fee': 0, 'min_fee': 500}, {'energy': 24, 'idle': 1000, 'total': 1024}), ({'plug_in': 411, 'charge_end': 481, 'unplug': 541, 'wh': 51535, 'price_per_kwh': 52, 'idle_grace': 15, 'idle_rate': 50, 'idle_cap': 3000, 'session_fee': 150, 'min_fee': 500}, {'energy': 2680, 'idle': 250, 'total': 3080})]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check('fee oracle' + ' %d' % i, 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":"0d841b6449c768e265558ffce829e1cb9ce54ffa6ab5b3075054457a82a2cbc3","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    energy = -(-x['wh'] * x['price_per_kwh'] // 1000)\n    idle = max(0, x['unplug'] - x['charge_end'] - x['idle_grace'])\n    idle_fee = min(x['idle_cap'], -(-idle // 10) * x['idle_rate'])\n    total = x['session_fee'] + energy + idle_fee\n    return {'energy': energy, 'idle': idle_fee, 'total': x['session_fee'] + max(x['min_fee'], energy + idle_fee)}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[({'plug_in': 0, 'charge_end': 90, 'unplug': 106, 'wh': 12500, 'price_per_kwh': 35, 'idle_grace': 15, 'idle_rate': 50, 'idle_cap': 2000, 'session_fee': 100, 'min_fee': 300}, {'energy': 438, 'idle': 50, 'total': 588}), ({'plug_in': 93, 'charge_end': 112, 'unplug': 312, 'wh': 46598, 'price_per_kwh': 35, 'idle_grace': 10, 'idle_rate': 100, 'idle_cap': 2000, 'session_fee': 0, 'min_fee': 500}, {'energy': 1631, 'idle': 1900, 'total': 3531}), ({'plug_in': 548, 'charge_end': 701, 'unplug': 706, 'wh': 9990, 'price_per_kwh': 29, 'idle_grace': 15, 'idle_rate': 40, 'idle_cap': 3000, 'session_fee': 150, 'min_fee': 500}, {'energy': 290, 'idle': 0, 'total': 500}), ({'plug_in': 502, 'charge_end': 683, 'unplug': 698, 'wh': 5462, 'price_per_kwh': 45, 'idle_grace': 10, 'idle_rate': 50, 'idle_cap': 1000, 'session_fee': 0, 'min_fee': 300}, {'energy': 246, 'idle': 50, 'total': 300}), ({'plug_in': 119, 'charge_end': 199, 'unplug': 215, 'wh': 5114, 'price_per_kwh': 29, 'idle_grace': 15, 'idle_rate': 100, 'idle_cap': 3000, 'session_fee': 100, 'min_fee': 500}, {'energy': 149, 'idle': 100, 'total': 500}), ({'plug_in': 74, 'charge_end': 111, 'unplug': 171, 'wh': 4221, 'price_per_kwh': 29, 'idle_grace': 15, 'idle_rate': 40, 'idle_cap': 3000, 'session_fee': 150, 'min_fee': 500}, {'energy': 123, 'idle': 200, 'total': 500}), ({'plug_in': 585, 'charge_end': 800, 'unplug': 810, 'wh': 39441, 'price_per_kwh': 35, 'idle_grace': 15, 'idle_rate': 40, 'idle_cap': 2000, 'session_fee': 0, 'min_fee': 500}, {'energy': 1381, 'idle': 0, 'total': 1381}), ({'plug_in': 30, 'charge_end': 45, 'unplug': 400, 'wh': 800, 'price_per_kwh': 29, 'idle_grace': 10, 'idle_rate': 100, 'idle_cap': 1000, 'session_fee': 0, 'min_fee': 500}, {'energy': 24, 'idle': 1000, 'total': 1024})], [({'plug_in': 30, 'charge_end': 45, 'unplug': 400, 'wh': 800, 'price_per_kwh': 29, 'idle_grace': 10, 'idle_rate': 100, 'idle_cap': 1000, 'session_fee': 0, 'min_fee': 500}, {'energy': 24, 'idle': 1000, 'total': 1024}), ({'plug_in': 4, 'charge_end': 296, 'unplug': 312, 'wh': 3717, 'price_per_kwh': 52, 'idle_grace': 10, 'idle_rate': 40, 'idle_cap': 2000, 'session_fee': 100, 'min_fee': 500}, {'energy': 194, 'idle': 40, 'total': 500}), ({'plug_in': 73, 'charge_end': 83, 'unplug': 283, 'wh': 4230, 'price_per_kwh': 35, 'idle_grace': 10, 'idle_rate': 100, 'idle_cap': 1000, 'session_fee': 100, 'min_fee': 200}, {'energy': 149, 'idle': 1000, 'total': 1249}), ({'plug_in': 115, 'charge_end': 331, 'unplug': 346, 'wh': 4709, 'price_per_kwh': 52, 'idle_grace': 15, 'idle_rate': 50, 'idle_cap': 3000, 'session_fee': 150, 'min_fee': 200}, {'energy': 245, 'idle': 0, 'total': 395}), ({'plug_in': 0, 'charge_end': 90, 'unplug': 106, 'wh': 12500, 'price_per_kwh': 35, 'idle_grace': 15, 'idle_rate': 50, 'idle_cap': 2000, 'session_fee': 100, 'min_fee': 300}, {'energy': 438, 'idle': 50, 'total': 588}), ({'plug_in': 490, 'charge_end': 569, 'unplug': 569, 'wh': 4974, 'price_per_kwh': 52, 'idle_grace': 15, 'idle_rate': 100, 'idle_cap': 3000, 'session_fee': 100, 'min_fee': 300}, {'energy': 259, 'idle': 0, 'total': 359}), ({'plug_in': 157, 'charge_end': 214, 'unplug': 274, 'wh': 2276, 'price_per_kwh': 45, 'idle_grace': 10, 'idle_rate': 50, 'idle_cap': 1000, 'session_fee': 150, 'min_fee': 500}, {'energy': 103, 'idle': 250, 'total': 503}), ({'plug_in': 230, 'charge_end': 290, 'unplug': 306, 'wh': 27281, 'price_per_kwh': 45, 'idle_grace': 10, 'idle_rate': 100, 'idle_cap': 3000, 'session_fee': 150, 'min_fee': 300}, {'energy': 1228, 'idle': 100, 'total': 1478})], [({'plug_in': 0, 'charge_end': 90, 'unplug': 106, 'wh': 12500, 'price_per_kwh': 35, 'idle_grace': 15, 'idle_rate': 50, 'idle_cap': 2000, 'session_fee': 100, 'min_fee': 300}, {'energy': 438, 'idle': 50, 'total': 588}), ({'plug_in': 361, 'charge_end': 626, 'unplug': 626, 'wh': 29818, 'price_per_kwh': 52, 'idle_grace': 15, 'idle_rate': 50, 'idle_cap': 2000, 'session_fee': 150, 'min_fee': 300}, {'energy': 1551, 'idle': 0, 'total': 1701}), ({'plug_in': 58, 'charge_end': 244, 'unplug': 260, 'wh': 4184, 'price_per_kwh': 45, 'idle_grace': 15, 'idle_rate': 100, 'idle_cap': 3000, 'session_fee': 100, 'min_fee': 300}, {'energy': 189, 'idle': 100, 'total': 389}), ({'plug_in': 34, 'charge_end': 215, 'unplug': 215, 'wh': 13150, 'price_per_kwh': 35, 'idle_grace': 10, 'idle_rate': 100, 'idle_cap': 1000, 'session_fee': 100, 'min_fee': 500}, {'energy': 461, 'idle': 0, 'total': 561}), ({'plug_in': 30, 'charge_end': 45, 'unplug': 400, 'wh': 800, 'price_per_kwh': 29, 'idle_grace': 10, 'idle_rate': 100, 'idle_cap': 1000, 'session_fee': 0, 'min_fee': 500}, {'energy': 24, 'idle': 1000, 'total': 1024}), ({'plug_in': 437, 'charge_end': 628, 'unplug': 628, 'wh': 6615, 'price_per_kwh': 45, 'idle_grace': 15, 'idle_rate': 100, 'idle_cap': 2000, 'session_fee': 100, 'min_fee': 300}, {'energy': 298, 'idle': 0, 'total': 398}), ({'plug_in': 86, 'charge_end': 283, 'unplug': 288, 'wh': 13385, 'price_per_kwh': 52, 'idle_grace': 15, 'idle_rate': 100, 'idle_cap': 1000, 'session_fee': 0, 'min_fee': 500}, {'energy': 697, 'idle': 0, 'total': 697}), ({'plug_in': 433, 'charge_end': 493, 'unplug': 893, 'wh': 1131, 'price_per_kwh': 45, 'idle_grace': 15, 'idle_rate': 40, 'idle_cap': 2000, 'session_fee': 0, 'min_fee': 200}, {'energy': 51, 'idle': 1560, 'total': 1611})], [({'plug_in': 30, 'charge_end': 45, 'unplug': 400, 'wh': 800, 'price_per_kwh': 29, 'idle_grace': 10, 'idle_rate': 100, 'idle_cap': 1000, 'session_fee': 0, 'min_fee': 500}, {'energy': 24, 'idle': 1000, 'total': 1024}), ({'plug_in': 63, 'charge_end': 346, 'unplug': 406, 'wh': 5005, 'price_per_kwh': 35, 'idle_grace': 15, 'idle_rate': 50, 'idle_cap': 3000, 'session_fee': 150, 'min_fee': 500}, {'energy': 176, 'idle': 250, 'total': 576}), ({'plug_in': 197, 'charge_end': 253, 'unplug': 263, 'wh': 7897, 'price_per_kwh': 45, 'idle_grace': 15, 'idle_rate': 40, 'idle_cap': 3000, 'session_fee': 100, 'min_fee': 500}, {'energy': 356, 'idle': 0, 'total': 500}), ({'plug_in': 0, 'charge_end': 90, 'unplug': 106, 'wh': 12500, 'price_per_kwh': 35, 'idle_grace': 15, 'idle_rate': 50, 'idle_cap': 2000, 'session_fee': 100, 'min_fee': 300}, {'energy': 438, 'idle': 50, 'total': 588}), ({'plug_in': 484, 'charge_end': 672, 'unplug': 682, 'wh': 3159, 'price_per_kwh': 52, 'idle_grace': 10, 'idle_rate': 100, 'idle_cap': 3000, 'session_fee': 150, 'min_fee': 200}, {'energy': 165, 'idle': 0, 'total': 315}), ({'plug_in': 540, 'charge_end': 691, 'unplug': 691, 'wh': 40240, 'price_per_kwh': 35, 'idle_grace': 15, 'idle_rate': 40, 'idle_cap': 3000, 'session_fee': 150, 'min_fee': 300}, {'energy': 1409, 'idle': 0, 'total': 1559}), ({'plug_in': 530, 'charge_end': 706, 'unplug': 722, 'wh': 19196, 'price_per_kwh': 29, 'idle_grace': 10, 'idle_rate': 100, 'idle_cap': 2000, 'session_fee': 100, 'min_fee': 200}, {'energy': 557, 'idle': 100, 'total': 757}), ({'plug_in': 103, 'charge_end': 177, 'unplug': 377, 'wh': 8629, 'price_per_kwh': 45, 'idle_grace': 10, 'idle_rate': 40, 'idle_cap': 3000, 'session_fee': 0, 'min_fee': 500}, {'energy': 389, 'idle': 760, 'total': 1149})], [({'plug_in': 537, 'charge_end': 679, 'unplug': 704, 'wh': 2203, 'price_per_kwh': 29, 'idle_grace': 10, 'idle_rate': 100, 'idle_cap': 2000, 'session_fee': 100, 'min_fee': 300}, {'energy': 64, 'idle': 200, 'total': 364}), ({'plug_in': 358, 'charge_end': 474, 'unplug': 484, 'wh': 14178, 'price_per_kwh': 29, 'idle_grace': 15, 'idle_rate': 40, 'idle_cap': 2000, 'session_fee': 150, 'min_fee': 500}, {'energy': 412, 'idle': 0, 'total': 562}), ({'plug_in': 193, 'charge_end': 361, 'unplug': 386, 'wh': 58152, 'price_per_kwh': 52, 'idle_grace': 15, 'idle_rate': 40, 'idle_cap': 1000, 'session_fee': 0, 'min_fee': 300}, {'energy': 3024, 'idle': 40, 'total': 3064}), ({'plug_in': 0, 'charge_end': 90, 'unplug': 106, 'wh': 12500, 'price_per_kwh': 35, 'idle_grace': 15, 'idle_rate': 50, 'idle_cap': 2000, 'session_fee': 100, 'min_fee': 300}, {'energy': 438, 'idle': 50, 'total': 588}), ({'plug_in': 80, 'charge_end': 341, 'unplug': 346, 'wh': 6794, 'price_per_kwh': 35, 'idle_grace': 15, 'idle_rate': 100, 'idle_cap': 2000, 'session_fee': 100, 'min_fee': 500}, {'energy': 238, 'idle': 0, 'total': 500}), ({'plug_in': 473, 'charge_end': 503, 'unplug': 519, 'wh': 7069, 'price_per_kwh': 45, 'idle_grace': 10, 'idle_rate': 100, 'idle_cap': 3000, 'session_fee': 0, 'min_fee': 500}, {'energy': 319, 'idle': 100, 'total': 500}), ({'plug_in': 30, 'charge_end': 45, 'unplug': 400, 'wh': 800, 'price_per_kwh': 29, 'idle_grace': 10, 'idle_rate': 100, 'idle_cap': 1000, 'session_fee': 0, 'min_fee': 500}, {'energy': 24, 'idle': 1000, 'total': 1024}), ({'plug_in': 411, 'charge_end': 481, 'unplug': 541, 'wh': 51535, 'price_per_kwh': 52, 'idle_grace': 15, 'idle_rate': 50, 'idle_cap': 3000, 'session_fee': 150, 'min_fee': 500}, {'energy': 2680, 'idle': 250, 'total': 3080})]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check('fee oracle' + ' %d' % i, 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":"A deterministic, bounded toy model with a stipulated contract; it makes no claim of conformance to any agency manual or standard. 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-toll_and_parking_fee_computation-ev-idle-fee-minimum-scope","generated_at":"2026-09-29T14:48:04.838482+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Fee engines bill customers in integer cents; a wrong boundary, rounding stage or cap scope silently over- or under-charges.","root_cause":"The session fee is added on top of the minimum instead of counting toward it.","sha256":"dce671fb935aaafa93417312d58e5714f1dc1452a4914f4b2266967213ad11db","title":"EV charging session and idle fee: the minimum applies only to the energy charge · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verified":true,"visibility":"public","verification":{"attempt":{"elapsed_ms":42.935,"exit_code":1,"observations":[{"actual":{"energy":438,"idle":50,"total":588},"check":"fee oracle 0","expected":{"energy":438,"idle":50,"total":588},"passed":true},{"actual":{"energy":1631,"idle":1900,"total":3531},"check":"fee oracle 1","expected":{"energy":1631,"idle":1900,"total":3531},"passed":true},{"actual":{"energy":290,"idle":0,"total":650},"check":"fee oracle 2","expected":{"energy":290,"idle":0,"total":500},"passed":false},{"actual":{"energy":246,"idle":50,"total":350},"check":"fee oracle 3","expected":{"energy":246,"idle":50,"total":300},"passed":false},{"actual":{"energy":149,"idle":100,"total":700},"check":"fee oracle 4","expected":{"energy":149,"idle":100,"total":500},"passed":false},{"actual":{"energy":123,"idle":200,"total":850},"check":"fee oracle 5","expected":{"energy":123,"idle":200,"total":500},"passed":false},{"actual":{"energy":1381,"idle":0,"total":1381},"check":"fee oracle 6","expected":{"energy":1381,"idle":0,"total":1381},"passed":true},{"actual":{"energy":24,"idle":1000,"total":1500},"check":"fee oracle 7","expected":{"energy":24,"idle":1000,"total":1024},"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"fee oracle 0\", \"actual\": {\"energy\": 438, \"idle\": 50, \"total\": 588}, \"expected\": {\"energy\": 438, \"idle\": 50, \"total\": 588}, \"passed\": true}, {\"check\": \"fee oracle 1\", \"actual\": {\"energy\": 1631, \"idle\": 1900, \"total\": 3531}, \"expected\": {\"energy\": 1631, \"idle\": 1900, \"total\": 3531}, \"passed\": true}, {\"check\": \"fee oracle 2\", \"actual\": {\"energy\": 290, \"idle\": 0, \"total\": 650}, \"expected\": {\"energy\": 290, \"idle\": 0, \"total\": 500}, \"passed\": false}, {\"check\": \"fee oracle 3\", \"actual\": {\"energy\": 246, \"idle\": 50, \"total\": 350}, \"expected\": {\"energy\": 246, \"idle\": 50, \"total\": 300}, \"passed\": false}, {\"check\": \"fee oracle 4\", \"actual\": {\"energy\": 149, \"idle\": 100, \"total\": 700}, \"expected\": {\"energy\": 149, \"idle\": 100, \"total\": 500}, \"passed\": false}, {\"check\": \"fee oracle 5\", \"actual\": {\"energy\": 123, \"idle\": 200, \"total\": 850}, \"expected\": {\"energy\": 123, \"idle\": 200, \"total\": 500}, \"passed\": false}, {\"check\": \"fee oracle 6\", \"actual\": {\"energy\": 1381, \"idle\": 0, \"total\": 1381}, \"expected\": {\"energy\": 1381, \"idle\": 0, \"total\": 1381}, \"passed\": true}, {\"check\": \"fee oracle 7\", \"actual\": {\"energy\": 24, \"idle\": 1000, \"total\": 1500}, \"expected\": {\"energy\": 24, \"idle\": 1000, \"total\": 1024}, \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.717,"exit_code":1,"observations":[{"actual":{"energy":438,"idle":50,"total":588},"check":"fee oracle 0","expected":{"energy":438,"idle":50,"total":588},"passed":true},{"actual":{"energy":1631,"idle":1900,"total":3531},"check":"fee oracle 1","expected":{"energy":1631,"idle":1900,"total":3531},"passed":true},{"actual":{"energy":290,"idle":0,"total":650},"check":"fee oracle 2","expected":{"energy":290,"idle":0,"total":500},"passed":false},{"actual":{"energy":246,"idle":50,"total":300},"check":"fee oracle 3","expected":{"energy":246,"idle":50,"total":300},"passed":true},{"actual":{"energy":149,"idle":100,"total":600},"check":"fee oracle 4","expected":{"energy":149,"idle":100,"total":500},"passed":false},{"actual":{"energy":123,"idle":200,"total":650},"check":"fee oracle 5","expected":{"energy":123,"idle":200,"total":500},"passed":false},{"actual":{"energy":1381,"idle":0,"total":1381},"check":"fee oracle 6","expected":{"energy":1381,"idle":0,"total":1381},"passed":true},{"actual":{"energy":24,"idle":1000,"total":1024},"check":"fee oracle 7","expected":{"energy":24,"idle":1000,"total":1024},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"fee oracle 0\", \"actual\": {\"energy\": 438, \"idle\": 50, \"total\": 588}, \"expected\": {\"energy\": 438, \"idle\": 50, \"total\": 588}, \"passed\": true}, {\"check\": \"fee oracle 1\", \"actual\": {\"energy\": 1631, \"idle\": 1900, \"total\": 3531}, \"expected\": {\"energy\": 1631, \"idle\": 1900, \"total\": 3531}, \"passed\": true}, {\"check\": \"fee oracle 2\", \"actual\": {\"energy\": 290, \"idle\": 0, \"total\": 650}, \"expected\": {\"energy\": 290, \"idle\": 0, \"total\": 500}, \"passed\": false}, {\"check\": \"fee oracle 3\", \"actual\": {\"energy\": 246, \"idle\": 50, \"total\": 300}, \"expected\": {\"energy\": 246, \"idle\": 50, \"total\": 300}, \"passed\": true}, {\"check\": \"fee oracle 4\", \"actual\": {\"energy\": 149, \"idle\": 100, \"total\": 600}, \"expected\": {\"energy\": 149, \"idle\": 100, \"total\": 500}, \"passed\": false}, {\"check\": \"fee oracle 5\", \"actual\": {\"energy\": 123, \"idle\": 200, \"total\": 650}, \"expected\": {\"energy\": 123, \"idle\": 200, \"total\": 500}, \"passed\": false}, {\"check\": \"fee oracle 6\", \"actual\": {\"energy\": 1381, \"idle\": 0, \"total\": 1381}, \"expected\": {\"energy\": 1381, \"idle\": 0, \"total\": 1381}, \"passed\": true}, {\"check\": \"fee oracle 7\", \"actual\": {\"energy\": 24, \"idle\": 1000, \"total\": 1024}, \"expected\": {\"energy\": 24, \"idle\": 1000, \"total\": 1024}, \"passed\": true}], \"passed\": false}\n"}},"member_only":{"stages":["fixed"],"fields":["implementations.fixed","verification.fixed","harness","repair"],"note":"The verified repair, its recorded checks, the repair description, and the scoring harness are available to members."}}