{"abstract":"The applied limit depends on the order periods were listed in the message.","category":"EV charging session scheduling","checks":7,"contract":"Each profile has purpose max/default/tx, stack level, validity [valid_from, valid_to) (valid_to None = open), kind absolute (origin valid_from) or relative (origin session_start; skipped when no session) and periods [[offset, amps]] in any order. A profile yields the amps of the last period with offset <= t-origin, or nothing before its first period. Per purpose the highest stack wins (ties: earlier profile). tx replaces default. Effective limit is the minimum of max, tx-or-default and hw_max, ties resolved in that order. Return [amps, source].","contract_signature":"profiles, t, session_start, hw_max","evaluation_group":"w2-ev_charging_session_scheduling-charging-profile-stack","failed_approach":"Reverse sorting keeps the earliest started period instead of the latest.","family":"w2-ev_charging_session_scheduling-charging-profile-stack-period-ordering","id":"FA-92951","implementations":{"attempt":{"sha256":"15638a0f0e1fc0cd5b08f5b3ce99db99c898159ee88cb4386a90e16abdd9c4d9","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(profiles, t, session_start, hw_max):\n    best = {}\n    for p in profiles:\n        if not (p['valid_from'] <= t and (p['valid_to'] is None or t < p['valid_to'])):\n            continue\n        if p['kind'] == 'relative':\n            if session_start is None:\n                continue\n            origin = session_start\n        else:\n            origin = p['valid_from']\n        el = t - origin\n        lim = None\n        for off, val in sorted(p['periods'], reverse=True):\n            if off <= el:\n                lim = val\n        if lim is None:\n            continue\n        cur = best.get(p['purpose'])\n        if cur is None or p['stack'] > cur[0]:\n            best[p['purpose']] = [p['stack'], lim]\n    cands = []\n    if 'max' in best:\n        cands.append(['max', best['max'][1]])\n    if 'tx' in best:\n        cands.append(['tx', best['tx'][1]])\n    elif 'default' in best:\n        cands.append(['default', best['default'][1]])\n    cands.append(['hw', hw_max])\n    win = cands[0]\n    for c in cands[1:]:\n        if c[1] < win[1]:\n            win = c\n    return [win[1], win[0]]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['boundary: profile expires at t',\n   [[{'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 0,\n      'valid_to': 30,\n      'kind': 'absolute',\n      'periods': [[0, 10]]}],\n    30, None, 32],\n   [32, 'hw']],\n  ['boundary: relative profile without session',\n   [[{'purpose': 'default',\n      'stack': 1,\n      'valid_from': 0,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[0, 8]]}],\n    20, None, 32],\n   [32, 'hw']],\n  ['boundary: tx overrides lower default',\n   [[{'purpose': 'default',\n      'stack': 0,\n      'valid_from': 0,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[0, 6]]},\n     {'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 0,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[0, 20]]}],\n    5, 0, 32],\n   [20, 'tx']],\n  ['regression: period ordering',\n   [[{'purpose': 'default',\n      'stack': 1,\n      'valid_from': 45,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[10, 32], [45, 20], [5, 16]]},\n     {'purpose': 'tx',\n      'stack': 2,\n      'valid_from': 58,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[20, 10], [45, 32], [0, 6]]},\n     {'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 42,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[45, 10], [0, 32]]}],\n    56, None, 24],\n   [24, 'hw']],\n  ['regression: period ordering (partial repair)',\n   [[{'purpose': 'tx',\n      'stack': 2,\n      'valid_from': 11,\n      'valid_to': 58,\n      'kind': 'absolute',\n      'periods': [[20, 32], [30, 20]]},\n     {'purpose': 'tx',\n      'stack': 1,\n      'valid_from': 23,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[0, 6], [20, 16]]},\n     {'purpose': 'default',\n      'stack': 2,\n      'valid_from': 57,\n      'valid_to': 98,\n      'kind': 'relative',\n      'periods': [[10, 6], [0, 10], [0, 20]]}],\n    100, 56, 16],\n   [16, 'tx']],\n  ['control 1',\n   [[{'purpose': 'max',\n      'stack': 1,\n      'valid_from': 44,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[0, 10], [0, 10], [5, 10]]},\n     {'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 7,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[0, 10], [30, 20]]}],\n    3, None, 24],\n   [24, 'hw']],\n  ['control 2',\n   [[{'purpose': 'max',\n      'stack': 2,\n      'valid_from': 11,\n      'valid_to': 21,\n      'kind': 'relative',\n      'periods': [[30, 32], [10, 20], [45, 6]]},\n     {'purpose': 'max',\n      'stack': 1,\n      'valid_from': 14,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[10, 32]]},\n     {'purpose': 'max',\n      'stack': 0,\n      'valid_from': 19,\n      'valid_to': 56,\n      'kind': 'absolute',\n      'periods': [[0, 6], [45, 10], [20, 16]]},\n     {'purpose': 'max',\n      'stack': 1,\n      'valid_from': 53,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[0, 10], [0, 32], [0, 20]]}],\n    97, None, 16],\n   [16, 'hw']]],\n [['boundary: profile expires at t',\n   [[{'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 0,\n      'valid_to': 30,\n      'kind': 'absolute',\n      'periods': [[0, 10]]}],\n    30, None, 32],\n   [32, 'hw']],\n  ['boundary: relative profile without session',\n   [[{'purpose': 'default',\n      'stack': 1,\n      'valid_from': 0,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[0, 8]]}],\n    20, None, 32],\n   [32, 'hw']],\n  ['boundary: tx overrides lower default',\n   [[{'purpose': 'default',\n      'stack': 0,\n      'valid_from': 0,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[0, 6]]},\n     {'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 0,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[0, 20]]}],\n    5, 0, 32],\n   [20, 'tx']],\n  ['regression: period ordering',\n   [[{'purpose': 'tx',\n      'stack': 1,\n      'valid_from': 7,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[45, 16], [20, 6]]}],\n    100, None, 24],\n   [16, 'tx']],\n  ['regression: period ordering (partial repair)',\n   [[{'purpose': 'tx',\n      'stack': 1,\n      'valid_from': 10,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[0, 16], [20, 32], [45, 10]]},\n     {'purpose': 'default',\n      'stack': 0,\n      'valid_from': 24,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[0, 16], [5, 32], [5, 10]]}],\n    90, 50, 24],\n   [10, 'tx']],\n  ['control 1',\n   [[{'purpose': 'default',\n      'stack': 2,\n      'valid_from': 20,\n      'valid_to': 56,\n      'kind': 'relative',\n      'periods': [[20, 10], [10, 20]]}],\n    53, 38, 24],\n   [20, 'default']],\n  ['control 2',\n   [[{'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 43,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[10, 32]]},\n     {'purpose': 'default',\n      'stack': 1,\n      'valid_from': 44,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[45, 32], [45, 6], [20, 20]]}],\n    88, 57, 24],\n   [24, 'hw']]],\n [['boundary: profile expires at t',\n   [[{'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 0,\n      'valid_to': 30,\n      'kind': 'absolute',\n      'periods': [[0, 10]]}],\n    30, None, 32],\n   [32, 'hw']],\n  ['boundary: relative profile without session',\n   [[{'purpose': 'default',\n      'stack': 1,\n      'valid_from': 0,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[0, 8]]}],\n    20, None, 32],\n   [32, 'hw']],\n  ['boundary: tx overrides lower default',\n   [[{'purpose': 'default',\n      'stack': 0,\n      'valid_from': 0,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[0, 6]]},\n     {'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 0,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[0, 20]]}],\n    5, 0, 32],\n   [20, 'tx']],\n  ['regression: period ordering',\n   [[{'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 5,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[10, 6]]},\n     {'purpose': 'tx',\n      'stack': 2,\n      'valid_from': 56,\n      'valid_to': 120,\n      'kind': 'absolute',\n      'periods': [[45, 32], [45, 16]]},\n     {'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 56,\n      'valid_to': 77,\n      'kind': 'absolute',\n      'periods': [[10, 10], [0, 32]]},\n     {'purpose': 'default',\n      'stack': 0,\n      'valid_from': 4,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[10, 16], [20, 16], [5, 6]]},\n     {'purpose': 'tx',\n      'stack': 1,\n      'valid_from': 53,\n      'valid_to': 121,\n      'kind': 'relative',\n      'periods': [[0, 32], [0, 6]]}],\n    58, 13, 16],\n   [16, 'hw']],\n  ['regression: period ordering (partial repair)',\n   [[{'purpose': 'tx',\n      'stack': 2,\n      'valid_from': 18,\n      'valid_to': 34,\n      'kind': 'relative',\n      'periods': [[30, 16], [20, 10], [5, 10]]},\n     {'purpose': 'max',\n      'stack': 2,\n      'valid_from': 21,\n      'valid_to': 43,\n      'kind': 'relative',\n      'periods': [[45, 20], [10, 16], [5, 10]]},\n     {'purpose': 'tx',\n      'stack': 1,\n      'valid_from': 59,\n      'valid_to': 88,\n      'kind': 'absolute',\n      'periods': [[0, 10], [10, 20]]},\n     {'purpose': 'default',\n      'stack': 2,\n      'valid_from': 41,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[10, 20], [10, 10], [20, 10]]}],\n    69, None, 24],\n   [20, 'tx']],\n  ['control 1',\n   [[{'purpose': 'tx',\n      'stack': 2,\n      'valid_from': 29,\n      'valid_to': 52,\n      'kind': 'absolute',\n      'periods': [[30, 16], [45, 32], [0, 16]]},\n     {'purpose': 'max',\n      'stack': 0,\n      'valid_from': 13,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[0, 6], [0, 10], [45, 16]]},\n     {'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 58,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[10, 16]]}],\n    74, None, 24],\n   [16, 'max']],\n  ['control 2',\n   [[{'purpose': 'tx',\n      'stack': 1,\n      'valid_from': 8,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[30, 6], [10, 6], [20, 32]]},\n     {'purpose': 'max',\n      'stack': 0,\n      'valid_from': 59,\n      'valid_to': 85,\n      'kind': 'absolute',\n      'periods': [[5, 6], [5, 20], [30, 20]]},\n     {'purpose': 'tx',\n      'stack': 2,\n      'valid_from': 29,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[20, 10], [30, 10]]}],\n    15, 48, 16],\n   [16, 'hw']]],\n [['boundary: profile expires at t',\n   [[{'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 0,\n      'valid_to': 30,\n      'kind': 'absolute',\n      'periods': [[0, 10]]}],\n    30, None, 32],\n   [32, 'hw']],\n  ['boundary: relative profile without session',\n   [[{'purpose': 'default',\n      'stack': 1,\n      'valid_from': 0,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[0, 8]]}],\n    20, None, 32],\n   [32, 'hw']],\n  ['boundary: tx overrides lower default',\n   [[{'purpose': 'default',\n      'stack': 0,\n      'valid_from': 0,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[0, 6]]},\n     {'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 0,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[0, 20]]}],\n    5, 0, 32],\n   [20, 'tx']],\n  ['regression: period ordering',\n   [[{'purpose': 'max',\n      'stack': 0,\n      'valid_from': 9,\n      'valid_to': 26,\n      'kind': 'absolute',\n      'periods': [[30, 6]]},\n     {'purpose': 'default',\n      'stack': 2,\n      'valid_from': 36,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[30, 6], [10, 32], [10, 10]]},\n     {'purpose': 'tx',\n      'stack': 2,\n      'valid_from': 54,\n      'valid_to': 130,\n      'kind': 'relative',\n      'periods': [[30, 32], [10, 10], [30, 6]]},\n     {'purpose': 'tx',\n      'stack': 1,\n      'valid_from': 29,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[0, 6], [20, 20], [5, 32]]}],\n    81, 13, 32],\n   [32, 'tx']],\n  ['regression: period ordering (partial repair)',\n   [[{'purpose': 'default',\n      'stack': 0,\n      'valid_from': 6,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[30, 10], [45, 16]]},\n     {'purpose': 'default',\n      'stack': 2,\n      'valid_from': 2,\n      'valid_to': 37,\n      'kind': 'relative',\n      'periods': [[45, 10], [10, 32]]},\n     {'purpose': 'default',\n      'stack': 0,\n      'valid_from': 38,\n      'valid_to': 48,\n      'kind': 'absolute',\n      'periods': [[5, 10]]}],\n    53, None, 24],\n   [16, 'default']],\n  ['control 1',\n   [[{'purpose': 'max',\n      'stack': 2,\n      'valid_from': 22,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[30, 6]]},\n     {'purpose': 'default',\n      'stack': 0,\n      'valid_from': 34,\n      'valid_to': 106,\n      'kind': 'absolute',\n      'periods': [[30, 16], [30, 10]]},\n     {'purpose': 'tx',\n      'stack': 2,\n      'valid_from': 11,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[10, 6], [30, 20]]},\n     {'purpose': 'default',\n      'stack': 2,\n      'valid_from': 26,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[5, 6], [5, 6], [45, 10]]},\n     {'purpose': 'default',\n      'stack': 1,\n      'valid_from': 12,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[20, 32], [20, 6]]}],\n    77, None, 24],\n   [20, 'tx']],\n  ['control 2',\n   [[{'purpose': 'default',\n      'stack': 2,\n      'valid_from': 55,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[5, 10], [30, 10]]}],\n    25, 14, 16],\n   [16, 'hw']]],\n [['boundary: profile expires at t',\n   [[{'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 0,\n      'valid_to': 30,\n      'kind': 'absolute',\n      'periods': [[0, 10]]}],\n    30, None, 32],\n   [32, 'hw']],\n  ['boundary: relative profile without session',\n   [[{'purpose': 'default',\n      'stack': 1,\n      'valid_from': 0,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[0, 8]]}],\n    20, None, 32],\n   [32, 'hw']],\n  ['boundary: tx overrides lower default',\n   [[{'purpose': 'default',\n      'stack': 0,\n      'valid_from': 0,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[0, 6]]},\n     {'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 0,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[0, 20]]}],\n    5, 0, 32],\n   [20, 'tx']],\n  ['regression: period ordering',\n   [[{'purpose': 'default',\n      'stack': 2,\n      'valid_from': 56,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[45, 10], [0, 6], [0, 20]]},\n     {'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 23,\n      'valid_to': 53,\n      'kind': 'relative',\n      'periods': [[10, 10], [5, 20], [45, 20]]},\n     {'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 59,\n      'valid_to': 135,\n      'kind': 'absolute',\n      'periods': [[0, 32]]},\n     {'purpose': 'default',\n      'stack': 2,\n      'valid_from': 59,\n      'valid_to': 130,\n      'kind': 'relative',\n      'periods': [[0, 16], [20, 32], [30, 20]]}],\n    51, 36, 16],\n   [10, 'tx']],\n  ['regression: period ordering (partial repair)',\n   [[{'purpose': 'default',\n      'stack': 0,\n      'valid_from': 24,\n      'valid_to': 78,\n      'kind': 'absolute',\n      'periods': [[0, 6], [20, 20]]},\n     {'purpose': 'default',\n      'stack': 0,\n      'valid_from': 1,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[20, 20], [0, 10], [0, 16]]}],\n    99, None, 32],\n   [20, 'default']],\n  ['control 1',\n   [[{'purpose': 'tx',\n      'stack': 1,\n      'valid_from': 8,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[30, 6]]}],\n    71, 15, 16],\n   [6, 'tx']],\n  ['control 2',\n   [[{'purpose': 'tx',\n      'stack': 2,\n      'valid_from': 39,\n      'valid_to': 108,\n      'kind': 'absolute',\n      'periods': [[20, 16], [30, 32], [20, 20]]},\n     {'purpose': 'max',\n      'stack': 0,\n      'valid_from': 45,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[5, 20]]},\n     {'purpose': 'default',\n      'stack': 1,\n      'valid_from': 21,\n      'valid_to': 46,\n      'kind': 'absolute',\n      'periods': [[5, 20]]}],\n    34, None, 24],\n   [20, 'default']]]]\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":"eb5ee951fb9a93c39d7565139259a3f260fd14870a9adb7ab8b6619f1d6df88c","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(profiles, t, session_start, hw_max):\n    best = {}\n    for p in profiles:\n        if not (p['valid_from'] <= t and (p['valid_to'] is None or t < p['valid_to'])):\n            continue\n        if p['kind'] == 'relative':\n            if session_start is None:\n                continue\n            origin = session_start\n        else:\n            origin = p['valid_from']\n        el = t - origin\n        lim = None\n        for off, val in p['periods']:\n            if off <= el:\n                lim = val\n        if lim is None:\n            continue\n        cur = best.get(p['purpose'])\n        if cur is None or p['stack'] > cur[0]:\n            best[p['purpose']] = [p['stack'], lim]\n    cands = []\n    if 'max' in best:\n        cands.append(['max', best['max'][1]])\n    if 'tx' in best:\n        cands.append(['tx', best['tx'][1]])\n    elif 'default' in best:\n        cands.append(['default', best['default'][1]])\n    cands.append(['hw', hw_max])\n    win = cands[0]\n    for c in cands[1:]:\n        if c[1] < win[1]:\n            win = c\n    return [win[1], win[0]]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['boundary: profile expires at t',\n   [[{'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 0,\n      'valid_to': 30,\n      'kind': 'absolute',\n      'periods': [[0, 10]]}],\n    30, None, 32],\n   [32, 'hw']],\n  ['boundary: relative profile without session',\n   [[{'purpose': 'default',\n      'stack': 1,\n      'valid_from': 0,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[0, 8]]}],\n    20, None, 32],\n   [32, 'hw']],\n  ['boundary: tx overrides lower default',\n   [[{'purpose': 'default',\n      'stack': 0,\n      'valid_from': 0,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[0, 6]]},\n     {'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 0,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[0, 20]]}],\n    5, 0, 32],\n   [20, 'tx']],\n  ['regression: period ordering',\n   [[{'purpose': 'default',\n      'stack': 1,\n      'valid_from': 45,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[10, 32], [45, 20], [5, 16]]},\n     {'purpose': 'tx',\n      'stack': 2,\n      'valid_from': 58,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[20, 10], [45, 32], [0, 6]]},\n     {'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 42,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[45, 10], [0, 32]]}],\n    56, None, 24],\n   [24, 'hw']],\n  ['regression: period ordering (partial repair)',\n   [[{'purpose': 'tx',\n      'stack': 2,\n      'valid_from': 11,\n      'valid_to': 58,\n      'kind': 'absolute',\n      'periods': [[20, 32], [30, 20]]},\n     {'purpose': 'tx',\n      'stack': 1,\n      'valid_from': 23,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[0, 6], [20, 16]]},\n     {'purpose': 'default',\n      'stack': 2,\n      'valid_from': 57,\n      'valid_to': 98,\n      'kind': 'relative',\n      'periods': [[10, 6], [0, 10], [0, 20]]}],\n    100, 56, 16],\n   [16, 'tx']],\n  ['control 1',\n   [[{'purpose': 'max',\n      'stack': 1,\n      'valid_from': 44,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[0, 10], [0, 10], [5, 10]]},\n     {'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 7,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[0, 10], [30, 20]]}],\n    3, None, 24],\n   [24, 'hw']],\n  ['control 2',\n   [[{'purpose': 'max',\n      'stack': 2,\n      'valid_from': 11,\n      'valid_to': 21,\n      'kind': 'relative',\n      'periods': [[30, 32], [10, 20], [45, 6]]},\n     {'purpose': 'max',\n      'stack': 1,\n      'valid_from': 14,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[10, 32]]},\n     {'purpose': 'max',\n      'stack': 0,\n      'valid_from': 19,\n      'valid_to': 56,\n      'kind': 'absolute',\n      'periods': [[0, 6], [45, 10], [20, 16]]},\n     {'purpose': 'max',\n      'stack': 1,\n      'valid_from': 53,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[0, 10], [0, 32], [0, 20]]}],\n    97, None, 16],\n   [16, 'hw']]],\n [['boundary: profile expires at t',\n   [[{'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 0,\n      'valid_to': 30,\n      'kind': 'absolute',\n      'periods': [[0, 10]]}],\n    30, None, 32],\n   [32, 'hw']],\n  ['boundary: relative profile without session',\n   [[{'purpose': 'default',\n      'stack': 1,\n      'valid_from': 0,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[0, 8]]}],\n    20, None, 32],\n   [32, 'hw']],\n  ['boundary: tx overrides lower default',\n   [[{'purpose': 'default',\n      'stack': 0,\n      'valid_from': 0,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[0, 6]]},\n     {'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 0,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[0, 20]]}],\n    5, 0, 32],\n   [20, 'tx']],\n  ['regression: period ordering',\n   [[{'purpose': 'tx',\n      'stack': 1,\n      'valid_from': 7,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[45, 16], [20, 6]]}],\n    100, None, 24],\n   [16, 'tx']],\n  ['regression: period ordering (partial repair)',\n   [[{'purpose': 'tx',\n      'stack': 1,\n      'valid_from': 10,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[0, 16], [20, 32], [45, 10]]},\n     {'purpose': 'default',\n      'stack': 0,\n      'valid_from': 24,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[0, 16], [5, 32], [5, 10]]}],\n    90, 50, 24],\n   [10, 'tx']],\n  ['control 1',\n   [[{'purpose': 'default',\n      'stack': 2,\n      'valid_from': 20,\n      'valid_to': 56,\n      'kind': 'relative',\n      'periods': [[20, 10], [10, 20]]}],\n    53, 38, 24],\n   [20, 'default']],\n  ['control 2',\n   [[{'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 43,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[10, 32]]},\n     {'purpose': 'default',\n      'stack': 1,\n      'valid_from': 44,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[45, 32], [45, 6], [20, 20]]}],\n    88, 57, 24],\n   [24, 'hw']]],\n [['boundary: profile expires at t',\n   [[{'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 0,\n      'valid_to': 30,\n      'kind': 'absolute',\n      'periods': [[0, 10]]}],\n    30, None, 32],\n   [32, 'hw']],\n  ['boundary: relative profile without session',\n   [[{'purpose': 'default',\n      'stack': 1,\n      'valid_from': 0,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[0, 8]]}],\n    20, None, 32],\n   [32, 'hw']],\n  ['boundary: tx overrides lower default',\n   [[{'purpose': 'default',\n      'stack': 0,\n      'valid_from': 0,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[0, 6]]},\n     {'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 0,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[0, 20]]}],\n    5, 0, 32],\n   [20, 'tx']],\n  ['regression: period ordering',\n   [[{'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 5,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[10, 6]]},\n     {'purpose': 'tx',\n      'stack': 2,\n      'valid_from': 56,\n      'valid_to': 120,\n      'kind': 'absolute',\n      'periods': [[45, 32], [45, 16]]},\n     {'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 56,\n      'valid_to': 77,\n      'kind': 'absolute',\n      'periods': [[10, 10], [0, 32]]},\n     {'purpose': 'default',\n      'stack': 0,\n      'valid_from': 4,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[10, 16], [20, 16], [5, 6]]},\n     {'purpose': 'tx',\n      'stack': 1,\n      'valid_from': 53,\n      'valid_to': 121,\n      'kind': 'relative',\n      'periods': [[0, 32], [0, 6]]}],\n    58, 13, 16],\n   [16, 'hw']],\n  ['regression: period ordering (partial repair)',\n   [[{'purpose': 'tx',\n      'stack': 2,\n      'valid_from': 18,\n      'valid_to': 34,\n      'kind': 'relative',\n      'periods': [[30, 16], [20, 10], [5, 10]]},\n     {'purpose': 'max',\n      'stack': 2,\n      'valid_from': 21,\n      'valid_to': 43,\n      'kind': 'relative',\n      'periods': [[45, 20], [10, 16], [5, 10]]},\n     {'purpose': 'tx',\n      'stack': 1,\n      'valid_from': 59,\n      'valid_to': 88,\n      'kind': 'absolute',\n      'periods': [[0, 10], [10, 20]]},\n     {'purpose': 'default',\n      'stack': 2,\n      'valid_from': 41,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[10, 20], [10, 10], [20, 10]]}],\n    69, None, 24],\n   [20, 'tx']],\n  ['control 1',\n   [[{'purpose': 'tx',\n      'stack': 2,\n      'valid_from': 29,\n      'valid_to': 52,\n      'kind': 'absolute',\n      'periods': [[30, 16], [45, 32], [0, 16]]},\n     {'purpose': 'max',\n      'stack': 0,\n      'valid_from': 13,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[0, 6], [0, 10], [45, 16]]},\n     {'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 58,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[10, 16]]}],\n    74, None, 24],\n   [16, 'max']],\n  ['control 2',\n   [[{'purpose': 'tx',\n      'stack': 1,\n      'valid_from': 8,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[30, 6], [10, 6], [20, 32]]},\n     {'purpose': 'max',\n      'stack': 0,\n      'valid_from': 59,\n      'valid_to': 85,\n      'kind': 'absolute',\n      'periods': [[5, 6], [5, 20], [30, 20]]},\n     {'purpose': 'tx',\n      'stack': 2,\n      'valid_from': 29,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[20, 10], [30, 10]]}],\n    15, 48, 16],\n   [16, 'hw']]],\n [['boundary: profile expires at t',\n   [[{'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 0,\n      'valid_to': 30,\n      'kind': 'absolute',\n      'periods': [[0, 10]]}],\n    30, None, 32],\n   [32, 'hw']],\n  ['boundary: relative profile without session',\n   [[{'purpose': 'default',\n      'stack': 1,\n      'valid_from': 0,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[0, 8]]}],\n    20, None, 32],\n   [32, 'hw']],\n  ['boundary: tx overrides lower default',\n   [[{'purpose': 'default',\n      'stack': 0,\n      'valid_from': 0,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[0, 6]]},\n     {'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 0,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[0, 20]]}],\n    5, 0, 32],\n   [20, 'tx']],\n  ['regression: period ordering',\n   [[{'purpose': 'max',\n      'stack': 0,\n      'valid_from': 9,\n      'valid_to': 26,\n      'kind': 'absolute',\n      'periods': [[30, 6]]},\n     {'purpose': 'default',\n      'stack': 2,\n      'valid_from': 36,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[30, 6], [10, 32], [10, 10]]},\n     {'purpose': 'tx',\n      'stack': 2,\n      'valid_from': 54,\n      'valid_to': 130,\n      'kind': 'relative',\n      'periods': [[30, 32], [10, 10], [30, 6]]},\n     {'purpose': 'tx',\n      'stack': 1,\n      'valid_from': 29,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[0, 6], [20, 20], [5, 32]]}],\n    81, 13, 32],\n   [32, 'tx']],\n  ['regression: period ordering (partial repair)',\n   [[{'purpose': 'default',\n      'stack': 0,\n      'valid_from': 6,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[30, 10], [45, 16]]},\n     {'purpose': 'default',\n      'stack': 2,\n      'valid_from': 2,\n      'valid_to': 37,\n      'kind': 'relative',\n      'periods': [[45, 10], [10, 32]]},\n     {'purpose': 'default',\n      'stack': 0,\n      'valid_from': 38,\n      'valid_to': 48,\n      'kind': 'absolute',\n      'periods': [[5, 10]]}],\n    53, None, 24],\n   [16, 'default']],\n  ['control 1',\n   [[{'purpose': 'max',\n      'stack': 2,\n      'valid_from': 22,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[30, 6]]},\n     {'purpose': 'default',\n      'stack': 0,\n      'valid_from': 34,\n      'valid_to': 106,\n      'kind': 'absolute',\n      'periods': [[30, 16], [30, 10]]},\n     {'purpose': 'tx',\n      'stack': 2,\n      'valid_from': 11,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[10, 6], [30, 20]]},\n     {'purpose': 'default',\n      'stack': 2,\n      'valid_from': 26,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[5, 6], [5, 6], [45, 10]]},\n     {'purpose': 'default',\n      'stack': 1,\n      'valid_from': 12,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[20, 32], [20, 6]]}],\n    77, None, 24],\n   [20, 'tx']],\n  ['control 2',\n   [[{'purpose': 'default',\n      'stack': 2,\n      'valid_from': 55,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[5, 10], [30, 10]]}],\n    25, 14, 16],\n   [16, 'hw']]],\n [['boundary: profile expires at t',\n   [[{'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 0,\n      'valid_to': 30,\n      'kind': 'absolute',\n      'periods': [[0, 10]]}],\n    30, None, 32],\n   [32, 'hw']],\n  ['boundary: relative profile without session',\n   [[{'purpose': 'default',\n      'stack': 1,\n      'valid_from': 0,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[0, 8]]}],\n    20, None, 32],\n   [32, 'hw']],\n  ['boundary: tx overrides lower default',\n   [[{'purpose': 'default',\n      'stack': 0,\n      'valid_from': 0,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[0, 6]]},\n     {'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 0,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[0, 20]]}],\n    5, 0, 32],\n   [20, 'tx']],\n  ['regression: period ordering',\n   [[{'purpose': 'default',\n      'stack': 2,\n      'valid_from': 56,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[45, 10], [0, 6], [0, 20]]},\n     {'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 23,\n      'valid_to': 53,\n      'kind': 'relative',\n      'periods': [[10, 10], [5, 20], [45, 20]]},\n     {'purpose': 'tx',\n      'stack': 0,\n      'valid_from': 59,\n      'valid_to': 135,\n      'kind': 'absolute',\n      'periods': [[0, 32]]},\n     {'purpose': 'default',\n      'stack': 2,\n      'valid_from': 59,\n      'valid_to': 130,\n      'kind': 'relative',\n      'periods': [[0, 16], [20, 32], [30, 20]]}],\n    51, 36, 16],\n   [10, 'tx']],\n  ['regression: period ordering (partial repair)',\n   [[{'purpose': 'default',\n      'stack': 0,\n      'valid_from': 24,\n      'valid_to': 78,\n      'kind': 'absolute',\n      'periods': [[0, 6], [20, 20]]},\n     {'purpose': 'default',\n      'stack': 0,\n      'valid_from': 1,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[20, 20], [0, 10], [0, 16]]}],\n    99, None, 32],\n   [20, 'default']],\n  ['control 1',\n   [[{'purpose': 'tx',\n      'stack': 1,\n      'valid_from': 8,\n      'valid_to': None,\n      'kind': 'absolute',\n      'periods': [[30, 6]]}],\n    71, 15, 16],\n   [6, 'tx']],\n  ['control 2',\n   [[{'purpose': 'tx',\n      'stack': 2,\n      'valid_from': 39,\n      'valid_to': 108,\n      'kind': 'absolute',\n      'periods': [[20, 16], [30, 32], [20, 20]]},\n     {'purpose': 'max',\n      'stack': 0,\n      'valid_from': 45,\n      'valid_to': None,\n      'kind': 'relative',\n      'periods': [[5, 20]]},\n     {'purpose': 'default',\n      'stack': 1,\n      'valid_from': 21,\n      'valid_to': 46,\n      'kind': 'absolute',\n      'periods': [[5, 20]]}],\n    34, None, 24],\n   [20, 'default']]]]\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-charging-profile-stack-period-ordering","generated_at":"2026-09-29T14:51:50.609054+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.","root_cause":"Periods are scanned in list order, so a later-listed earlier period overwrites the current one.","sha256":"2ae6d7fccae7e4191272ec1bb09f053b273f126d7a3cdca6a7d666e29bbe109b","title":"Charging profile stack resolution: period ordering · 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.315,"exit_code":1,"observations":[{"actual":[32,"hw"],"check":"boundary: profile expires at t","expected":[32,"hw"],"passed":true},{"actual":[32,"hw"],"check":"boundary: relative profile without session","expected":[32,"hw"],"passed":true},{"actual":[20,"tx"],"check":"boundary: tx overrides lower default","expected":[20,"tx"],"passed":true},{"actual":[16,"default"],"check":"regression: period ordering","expected":[24,"hw"],"passed":false},{"actual":[6,"tx"],"check":"regression: period ordering (partial repair)","expected":[16,"tx"],"passed":false},{"actual":[24,"hw"],"check":"control 1","expected":[24,"hw"],"passed":true},{"actual":[16,"hw"],"check":"control 2","expected":[16,"hw"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"boundary: profile expires at t\", \"actual\": [32, \"hw\"], \"expected\": [32, \"hw\"], \"passed\": true}, {\"check\": \"boundary: relative profile without session\", \"actual\": [32, \"hw\"], \"expected\": [32, \"hw\"], \"passed\": true}, {\"check\": \"boundary: tx overrides lower default\", \"actual\": [20, \"tx\"], \"expected\": [20, \"tx\"], \"passed\": true}, {\"check\": \"regression: period ordering\", \"actual\": [16, \"default\"], \"expected\": [24, \"hw\"], \"passed\": false}, {\"check\": \"regression: period ordering (partial repair)\", \"actual\": [6, \"tx\"], \"expected\": [16, \"tx\"], \"passed\": false}, {\"check\": \"control 1\", \"actual\": [24, \"hw\"], \"expected\": [24, \"hw\"], \"passed\": true}, {\"check\": \"control 2\", \"actual\": [16, \"hw\"], \"expected\": [16, \"hw\"], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":42.929,"exit_code":1,"observations":[{"actual":[32,"hw"],"check":"boundary: profile expires at t","expected":[32,"hw"],"passed":true},{"actual":[32,"hw"],"check":"boundary: relative profile without session","expected":[32,"hw"],"passed":true},{"actual":[20,"tx"],"check":"boundary: tx overrides lower default","expected":[20,"tx"],"passed":true},{"actual":[16,"default"],"check":"regression: period ordering","expected":[24,"hw"],"passed":false},{"actual":[16,"tx"],"check":"regression: period ordering (partial repair)","expected":[16,"tx"],"passed":true},{"actual":[24,"hw"],"check":"control 1","expected":[24,"hw"],"passed":true},{"actual":[16,"hw"],"check":"control 2","expected":[16,"hw"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"boundary: profile expires at t\", \"actual\": [32, \"hw\"], \"expected\": [32, \"hw\"], \"passed\": true}, {\"check\": \"boundary: relative profile without session\", \"actual\": [32, \"hw\"], \"expected\": [32, \"hw\"], \"passed\": true}, {\"check\": \"boundary: tx overrides lower default\", \"actual\": [20, \"tx\"], \"expected\": [20, \"tx\"], \"passed\": true}, {\"check\": \"regression: period ordering\", \"actual\": [16, \"default\"], \"expected\": [24, \"hw\"], \"passed\": false}, {\"check\": \"regression: period ordering (partial repair)\", \"actual\": [16, \"tx\"], \"expected\": [16, \"tx\"], \"passed\": true}, {\"check\": \"control 1\", \"actual\": [24, \"hw\"], \"expected\": [24, \"hw\"], \"passed\": true}, {\"check\": \"control 2\", \"actual\": [16, \"hw\"], \"expected\": [16, \"hw\"], \"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."}}