{"abstract":"Days broken into many fragments accumulate unbounded split premiums.","category":"Shift rostering labor rules","checks":8,"contract":"Worked segments [start, end] of one workday (unordered, possibly overlapping) and a minimum wage in cents. Overlapping or touching segments merge. Spread is last end minus first start. Each gap longer than 60 minutes is a split. A spread over 600 minutes earns one hour of minimum wage and replaces any split premium; otherwise each split earns min_wage // 2, for at most two splits. Return [spread, splits, premium].","contract_signature":"segments, min_wage","evaluation_group":"w2-shift-rostering-labor-rules-spread-of-hours-split-premium","failed_approach":"Capping at one split underpays genuine two-split days.","family":"w2-shift-rostering-labor-rules-spread-of-hours-split-premium-split-premium-cap","id":"FA-93916","implementations":{"attempt":{"sha256":"b5e8d9a83bcd57eeb55d3d7625661c440a932b7daa184fdb4e7fa9d7bc519f7e","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(segments, min_wage):\n    seg = sorted(segments)\n    merged = []\n    for s, e in seg:\n        if merged and s <= merged[-1][1]:\n            merged[-1][1] = max(merged[-1][1], e)\n        else:\n            merged.append([s, e])\n    spread = merged[-1][1] - merged[0][0]\n    splits = sum(1 for a, b in zip(merged, merged[1:]) if b[0] - a[1] > 60)\n    if spread > 600:\n        premium = min_wage\n    else:\n        premium = (min_wage // 2) * min(splits, 1)\n    return [spread, splits, premium]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: split premium cap 1', [[[420, 450], [520, 550], [620, 650], [720, 750]], 1600],\n   [330, 3, 1600]),\n  ('regression variant: split premium cap 2',\n   [[[420, 480], [550, 600], [700, 760], [840, 900], [980, 1010]], 1655], [590, 4, 1654]),\n  ('partial repair guard 3', [[[360, 540], [841, 901], [601, 661]], 1520], [541, 2, 1520]),\n  ('boundary control 4', [[[420, 1020]], 1600], [600, 0, 0]),\n  ('normal control 5', [[[420, 540]], 1701], [120, 0, 0]),\n  ('normal control 6', [[[810, 1050], [480, 720]], 1701], [570, 1, 850]),\n  ('normal control 7', [[[600, 840], [900, 1140]], 1655], [540, 0, 0]),\n  ('normal control 8', [[[600, 840]], 1600], [240, 0, 0])],\n [('regression: split premium cap 1', [[[420, 480], [550, 600], [700, 760], [840, 900], [980, 1010]], 1655],\n   [590, 4, 1654]),\n  ('regression variant: split premium cap 2', [[[600, 630], [700, 730], [800, 830], [900, 930]], 1701],\n   [330, 3, 1700]),\n  ('partial repair guard 3', [[[360, 420], [602, 782], [481, 541]], 1701], [422, 2, 1700]),\n  ('boundary control 4', [[[900, 1000], [420, 600], [700, 800]], 1520], [580, 2, 1520]),\n  ('boundary control 5', [[[480, 720], [781, 1080]], 1600], [600, 1, 800]),\n  ('normal control 6', [[[360, 420], [479, 779], [370, 380]], 1600], [419, 0, 0]),\n  ('normal control 7', [[[600, 660], [1081, 1381], [900, 1020]], 1520], [781, 2, 1520]),\n  ('normal control 8', [[[810, 870], [840, 1020], [600, 720], [990, 1290]], 1600], [690, 1, 1600])],\n [('regression: split premium cap 1', [[[600, 630], [700, 730], [800, 830], [900, 930]], 1701],\n   [330, 3, 1700]),\n  ('regression variant: split premium cap 2', [[[420, 450], [520, 550], [620, 650], [720, 750]], 1600],\n   [330, 3, 1600]),\n  ('partial repair guard 3', [[[420, 480], [550, 600], [700, 760], [840, 900], [980, 1010]], 1655],\n   [590, 4, 1654]),\n  ('boundary control 4', [[[420, 1021]], 1600], [601, 0, 1600]),\n  ('normal control 5', [[[900, 1020], [600, 780], [780, 900], [910, 920]], 1600], [420, 0, 0]),\n  ('normal control 6', [[[420, 660], [430, 440]], 1520], [240, 0, 0]),\n  ('normal control 7', [[[360, 480], [600, 660]], 1655], [300, 1, 827]),\n  ('normal control 8', [[[810, 1110], [480, 780]], 1520], [630, 0, 1520])],\n [('regression: split premium cap 1', [[[420, 450], [520, 550], [620, 650], [720, 750]], 1600],\n   [330, 3, 1600]),\n  ('regression variant: split premium cap 2',\n   [[[420, 480], [550, 600], [700, 760], [840, 900], [980, 1010]], 1655], [590, 4, 1654]),\n  ('partial repair guard 3', [[[900, 1000], [420, 600], [700, 800]], 1520], [580, 2, 1520]),\n  ('boundary control 4', [[[420, 600], [660, 780], [840, 1020]], 1701], [600, 0, 0]),\n  ('normal control 5', [[[1230, 1470], [480, 780], [960, 1140]], 1520], [990, 2, 1520]),\n  ('normal control 6', [[[480, 720]], 1701], [240, 0, 0]),\n  ('normal control 7', [[[630, 870], [600, 660]], 1655], [270, 0, 0]),\n  ('normal control 8', [[[960, 1140], [420, 480], [480, 720]], 1520], [720, 1, 1520])],\n [('regression: split premium cap 1', [[[420, 480], [550, 600], [700, 760], [840, 900], [980, 1010]], 1655],\n   [590, 4, 1654]),\n  ('regression variant: split premium cap 2', [[[600, 630], [700, 730], [800, 830], [900, 930]], 1701],\n   [330, 3, 1700]),\n  ('partial repair guard 3', [[[781, 961], [1081, 1141], [600, 720]], 1600], [541, 2, 1600]),\n  ('boundary control 4', [[[600, 900], [610, 620], [1000, 1100]], 1655], [500, 1, 827]),\n  ('boundary control 5', [[[480, 720], [780, 1080]], 1600], [600, 0, 0]),\n  ('normal control 6', [[[1320, 1560], [960, 1080], [480, 720], [970, 980]], 1600], [1080, 2, 1600]),\n  ('normal control 7', [[[1051, 1111], [630, 870], [870, 990], [420, 660]], 1520], [691, 1, 1520]),\n  ('normal control 8', [[[1021, 1261], [781, 961], [480, 720]], 1600], [781, 1, 1600])]]\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":"7be8167d4fe79aa0700f9e9793584ad3e1e06aad9503618131415e445659d7cf","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(segments, min_wage):\n    seg = sorted(segments)\n    merged = []\n    for s, e in seg:\n        if merged and s <= merged[-1][1]:\n            merged[-1][1] = max(merged[-1][1], e)\n        else:\n            merged.append([s, e])\n    spread = merged[-1][1] - merged[0][0]\n    splits = sum(1 for a, b in zip(merged, merged[1:]) if b[0] - a[1] > 60)\n    if spread > 600:\n        premium = min_wage\n    else:\n        premium = (min_wage // 2) * splits\n    return [spread, splits, premium]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: split premium cap 1', [[[420, 450], [520, 550], [620, 650], [720, 750]], 1600],\n   [330, 3, 1600]),\n  ('regression variant: split premium cap 2',\n   [[[420, 480], [550, 600], [700, 760], [840, 900], [980, 1010]], 1655], [590, 4, 1654]),\n  ('partial repair guard 3', [[[360, 540], [841, 901], [601, 661]], 1520], [541, 2, 1520]),\n  ('boundary control 4', [[[420, 1020]], 1600], [600, 0, 0]),\n  ('normal control 5', [[[420, 540]], 1701], [120, 0, 0]),\n  ('normal control 6', [[[810, 1050], [480, 720]], 1701], [570, 1, 850]),\n  ('normal control 7', [[[600, 840], [900, 1140]], 1655], [540, 0, 0]),\n  ('normal control 8', [[[600, 840]], 1600], [240, 0, 0])],\n [('regression: split premium cap 1', [[[420, 480], [550, 600], [700, 760], [840, 900], [980, 1010]], 1655],\n   [590, 4, 1654]),\n  ('regression variant: split premium cap 2', [[[600, 630], [700, 730], [800, 830], [900, 930]], 1701],\n   [330, 3, 1700]),\n  ('partial repair guard 3', [[[360, 420], [602, 782], [481, 541]], 1701], [422, 2, 1700]),\n  ('boundary control 4', [[[900, 1000], [420, 600], [700, 800]], 1520], [580, 2, 1520]),\n  ('boundary control 5', [[[480, 720], [781, 1080]], 1600], [600, 1, 800]),\n  ('normal control 6', [[[360, 420], [479, 779], [370, 380]], 1600], [419, 0, 0]),\n  ('normal control 7', [[[600, 660], [1081, 1381], [900, 1020]], 1520], [781, 2, 1520]),\n  ('normal control 8', [[[810, 870], [840, 1020], [600, 720], [990, 1290]], 1600], [690, 1, 1600])],\n [('regression: split premium cap 1', [[[600, 630], [700, 730], [800, 830], [900, 930]], 1701],\n   [330, 3, 1700]),\n  ('regression variant: split premium cap 2', [[[420, 450], [520, 550], [620, 650], [720, 750]], 1600],\n   [330, 3, 1600]),\n  ('partial repair guard 3', [[[420, 480], [550, 600], [700, 760], [840, 900], [980, 1010]], 1655],\n   [590, 4, 1654]),\n  ('boundary control 4', [[[420, 1021]], 1600], [601, 0, 1600]),\n  ('normal control 5', [[[900, 1020], [600, 780], [780, 900], [910, 920]], 1600], [420, 0, 0]),\n  ('normal control 6', [[[420, 660], [430, 440]], 1520], [240, 0, 0]),\n  ('normal control 7', [[[360, 480], [600, 660]], 1655], [300, 1, 827]),\n  ('normal control 8', [[[810, 1110], [480, 780]], 1520], [630, 0, 1520])],\n [('regression: split premium cap 1', [[[420, 450], [520, 550], [620, 650], [720, 750]], 1600],\n   [330, 3, 1600]),\n  ('regression variant: split premium cap 2',\n   [[[420, 480], [550, 600], [700, 760], [840, 900], [980, 1010]], 1655], [590, 4, 1654]),\n  ('partial repair guard 3', [[[900, 1000], [420, 600], [700, 800]], 1520], [580, 2, 1520]),\n  ('boundary control 4', [[[420, 600], [660, 780], [840, 1020]], 1701], [600, 0, 0]),\n  ('normal control 5', [[[1230, 1470], [480, 780], [960, 1140]], 1520], [990, 2, 1520]),\n  ('normal control 6', [[[480, 720]], 1701], [240, 0, 0]),\n  ('normal control 7', [[[630, 870], [600, 660]], 1655], [270, 0, 0]),\n  ('normal control 8', [[[960, 1140], [420, 480], [480, 720]], 1520], [720, 1, 1520])],\n [('regression: split premium cap 1', [[[420, 480], [550, 600], [700, 760], [840, 900], [980, 1010]], 1655],\n   [590, 4, 1654]),\n  ('regression variant: split premium cap 2', [[[600, 630], [700, 730], [800, 830], [900, 930]], 1701],\n   [330, 3, 1700]),\n  ('partial repair guard 3', [[[781, 961], [1081, 1141], [600, 720]], 1600], [541, 2, 1600]),\n  ('boundary control 4', [[[600, 900], [610, 620], [1000, 1100]], 1655], [500, 1, 827]),\n  ('boundary control 5', [[[480, 720], [780, 1080]], 1600], [600, 0, 0]),\n  ('normal control 6', [[[1320, 1560], [960, 1080], [480, 720], [970, 980]], 1600], [1080, 2, 1600]),\n  ('normal control 7', [[[1051, 1111], [630, 870], [870, 990], [420, 660]], 1520], [691, 1, 1520]),\n  ('normal control 8', [[[1021, 1261], [781, 961], [480, 720]], 1600], [781, 1, 1600])]]\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":"Stipulated toy labor rule for a bounded roster model; it is not legal advice and does not claim conformance with any jurisdiction, award, or collective agreement. 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-shift-rostering-labor-rules-spread-of-hours-split-premium-split-premium-cap","generated_at":"2026-09-29T14:51:59.481551+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Spread-of-hours and split-shift premiums are frequent roster-pay rules that depend on correct interval handling.","root_cause":"The split count is used directly instead of being capped at two.","sha256":"f1b5d3d7640feb348dd6aaabde0ce702ad3c044ef1bb3fc4bcb7add2570c301d","title":"Split premium not capped at two splits per day · 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":40.958,"exit_code":1,"observations":[{"actual":[330,3,800],"check":"regression: split premium cap 1","expected":[330,3,1600],"passed":false},{"actual":[590,4,827],"check":"regression variant: split premium cap 2","expected":[590,4,1654],"passed":false},{"actual":[541,2,760],"check":"partial repair guard 3","expected":[541,2,1520],"passed":false},{"actual":[600,0,0],"check":"boundary control 4","expected":[600,0,0],"passed":true},{"actual":[120,0,0],"check":"normal control 5","expected":[120,0,0],"passed":true},{"actual":[570,1,850],"check":"normal control 6","expected":[570,1,850],"passed":true},{"actual":[540,0,0],"check":"normal control 7","expected":[540,0,0],"passed":true},{"actual":[240,0,0],"check":"normal control 8","expected":[240,0,0],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: split premium cap 1\", \"actual\": [330, 3, 800], \"expected\": [330, 3, 1600], \"passed\": false}, {\"check\": \"regression variant: split premium cap 2\", \"actual\": [590, 4, 827], \"expected\": [590, 4, 1654], \"passed\": false}, {\"check\": \"partial repair guard 3\", \"actual\": [541, 2, 760], \"expected\": [541, 2, 1520], \"passed\": false}, {\"check\": \"boundary control 4\", \"actual\": [600, 0, 0], \"expected\": [600, 0, 0], \"passed\": true}, {\"check\": \"normal control 5\", \"actual\": [120, 0, 0], \"expected\": [120, 0, 0], \"passed\": true}, {\"check\": \"normal control 6\", \"actual\": [570, 1, 850], \"expected\": [570, 1, 850], \"passed\": true}, {\"check\": \"normal control 7\", \"actual\": [540, 0, 0], \"expected\": [540, 0, 0], \"passed\": true}, {\"check\": \"normal control 8\", \"actual\": [240, 0, 0], \"expected\": [240, 0, 0], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":38.961,"exit_code":1,"observations":[{"actual":[330,3,2400],"check":"regression: split premium cap 1","expected":[330,3,1600],"passed":false},{"actual":[590,4,3308],"check":"regression variant: split premium cap 2","expected":[590,4,1654],"passed":false},{"actual":[541,2,1520],"check":"partial repair guard 3","expected":[541,2,1520],"passed":true},{"actual":[600,0,0],"check":"boundary control 4","expected":[600,0,0],"passed":true},{"actual":[120,0,0],"check":"normal control 5","expected":[120,0,0],"passed":true},{"actual":[570,1,850],"check":"normal control 6","expected":[570,1,850],"passed":true},{"actual":[540,0,0],"check":"normal control 7","expected":[540,0,0],"passed":true},{"actual":[240,0,0],"check":"normal control 8","expected":[240,0,0],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: split premium cap 1\", \"actual\": [330, 3, 2400], \"expected\": [330, 3, 1600], \"passed\": false}, {\"check\": \"regression variant: split premium cap 2\", \"actual\": [590, 4, 3308], \"expected\": [590, 4, 1654], \"passed\": false}, {\"check\": \"partial repair guard 3\", \"actual\": [541, 2, 1520], \"expected\": [541, 2, 1520], \"passed\": true}, {\"check\": \"boundary control 4\", \"actual\": [600, 0, 0], \"expected\": [600, 0, 0], \"passed\": true}, {\"check\": \"normal control 5\", \"actual\": [120, 0, 0], \"expected\": [120, 0, 0], \"passed\": true}, {\"check\": \"normal control 6\", \"actual\": [570, 1, 850], \"expected\": [570, 1, 850], \"passed\": true}, {\"check\": \"normal control 7\", \"actual\": [540, 0, 0], \"expected\": [540, 0, 0], \"passed\": true}, {\"check\": \"normal control 8\", \"actual\": [240, 0, 0], \"expected\": [240, 0, 0], \"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."}}