{"abstract":"Allowances with half a cent or more lose a cent.","category":"Shift rostering labor rules","checks":8,"contract":"Standby window [start, end], callout intervals and hourly rate in cents; minutes from Monday 00:00. Callout minutes (union of callouts, inside or outside standby) pay full rate. Standby minutes not in a callout pay a third of rate on weekdays and half on Saturday/Sunday (days 5-6). Return total cents, computed exactly and rounded half up once.","evaluation_group":"w2-shift-rostering-labor-rules-standby-allowance","failed_approach":"Rounding units to whole minutes of full pay first distorts the fractional standby rates.","family":"w2-shift-rostering-labor-rules-standby-allowance-allowance-rounding","id":"FA-94246","implementations":{"attempt":{"sha256":"fe7894d040fc155f566f040f875f1dda18af7cb56cc49eae965b0462dfa3029b","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(standby, callouts, rate):\n    s0, e0 = standby\n    busy = set()\n    for s, e in callouts:\n        busy.update(range(s, e))\n    units = 0\n    for t in range(s0, e0):\n        if t in busy:\n            continue\n        units += 20 if (t // 1440) % 7 < 5 else 30\n    units += 60 * len(busy)\n    return (units + 30) // 60 * rate // 60\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: allowance rounding 1', [[7140, 7260], [[7190, 7250]], 2400], 3267),\n  ('regression variant: allowance rounding 2', [[5400, 6240], [], 1999], 9329),\n  ('partial repair guard 3', [[1080, 1320], [[1310, 1340]], 1999], 3554),\n  ('boundary control 4', [[7200, 7260], [], 1800], 900),\n  ('normal control 5', [[1440, 2880], [[2236, 2356]], 1999], 18657),\n  ('normal control 6', [[2880, 3720], [[3367, 3457]], 3000], 17000),\n  ('normal control 7', [[2880, 4320], [[3679, 3739], [3048, 3138], [3606, 3726]], 1800], 18860),\n  ('normal control 8', [[1320, 2760], [[2547, 2637]], 2400], 21600)],\n [('regression: allowance rounding 1', [[0, 1], [], 90], 1),\n  ('regression variant: allowance rounding 2', [[0, 1440], [[1320, 1440], [1406, 1526], [1262, 1322]], 1999],\n   22811),\n  ('partial repair guard 3', [[6840, 7680], [[7144, 7264], [6829, 6919], [6824, 6854]], 1999], 16592),\n  ('boundary control 4', [[0, 60], [], 1800], 600), ('boundary control 5', [[0, 3], [], 30], 1),\n  ('normal control 6', [[2760, 3000], [[2936, 2966], [2726, 2816]], 2400], 6853),\n  ('normal control 7', [[5760, 6360], [[6008, 6038], [6344, 6434]], 1800], 9140),\n  ('normal control 8', [[8520, 8760], [[8576, 8696], [8730, 8850], [8520, 8580]], 2400], 12520)],\n [('regression: allowance rounding 1', [[0, 3], [], 30], 1),\n  ('regression variant: allowance rounding 2',\n   [[3900, 5340], [[4265, 4355], [4658, 4688], [4876, 4906]], 1999], 19324),\n  ('partial repair guard 3', [[7200, 8040], [[7671, 7731], [7689, 7809], [7240, 7360]], 1999], 18291),\n  ('boundary control 4', [[7140, 7260], [[7190, 7250]], 2400], 3267),\n  ('boundary control 5', [[7200, 7260], [], 1800], 900),\n  ('normal control 6', [[9660, 11100], [[11072, 11162], [9928, 9958]], 2400], 25827),\n  ('normal control 7', [[1020, 2460], [[1085, 1115]], 2400], 20000),\n  ('normal control 8', [[4200, 4800], [[4321, 4351], [4378, 4468]], 1800], 8400)],\n [('regression: allowance rounding 1', [[1080, 1320], [[1310, 1340]], 1999], 3554),\n  ('regression variant: allowance rounding 2', [[5340, 6180], [[5928, 6018], [6161, 6281]], 2400], 18147),\n  ('partial repair guard 3', [[9960, 11400], [[10425, 10545]], 1999], 19324),\n  ('boundary control 4', [[0, 60], [], 1800], 600), ('boundary control 5', [[0, 3], [], 30], 1),\n  ('normal control 6', [[5340, 5940], [], 2400], 8000),\n  ('normal control 7', [[9720, 10560], [[9952, 10042]], 2400], 15400),\n  ('normal control 8', [[2880, 3120], [[3022, 3112]], 1999], 4664)],\n [('regression: allowance rounding 1', [[7080, 7320], [[7181, 7241], [7166, 7226]], 2400], 5727),\n  ('regression variant: allowance rounding 2', [[5760, 6000], [[5707, 5767]], 1999], 4587),\n  ('partial repair guard 3', [[9960, 10200], [[10055, 10145], [10110, 10200]], 1999], 6413),\n  ('boundary control 4', [[7140, 7260], [[7190, 7250]], 2400], 3267),\n  ('boundary control 5', [[7200, 7260], [], 1800], 900),\n  ('normal control 6', [[5640, 6240], [[5947, 6007], [5613, 5733], [5788, 5908]], 2400], 16360),\n  ('normal control 7', [[9720, 9960], [[9734, 9764]], 2400], 5400),\n  ('normal control 8', [[9660, 11100], [], 1999], 18324)]]\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":"b61f2e42afc95e44687bad4f7da3062bba498fd06838a8e2907abe42974deac0","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(standby, callouts, rate):\n    s0, e0 = standby\n    busy = set()\n    for s, e in callouts:\n        busy.update(range(s, e))\n    units = 0\n    for t in range(s0, e0):\n        if t in busy:\n            continue\n        units += 20 if (t // 1440) % 7 < 5 else 30\n    units += 60 * len(busy)\n    return units * rate // 3600\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: allowance rounding 1', [[7140, 7260], [[7190, 7250]], 2400], 3267),\n  ('regression variant: allowance rounding 2', [[5400, 6240], [], 1999], 9329),\n  ('partial repair guard 3', [[1080, 1320], [[1310, 1340]], 1999], 3554),\n  ('boundary control 4', [[7200, 7260], [], 1800], 900),\n  ('normal control 5', [[1440, 2880], [[2236, 2356]], 1999], 18657),\n  ('normal control 6', [[2880, 3720], [[3367, 3457]], 3000], 17000),\n  ('normal control 7', [[2880, 4320], [[3679, 3739], [3048, 3138], [3606, 3726]], 1800], 18860),\n  ('normal control 8', [[1320, 2760], [[2547, 2637]], 2400], 21600)],\n [('regression: allowance rounding 1', [[0, 1], [], 90], 1),\n  ('regression variant: allowance rounding 2', [[0, 1440], [[1320, 1440], [1406, 1526], [1262, 1322]], 1999],\n   22811),\n  ('partial repair guard 3', [[6840, 7680], [[7144, 7264], [6829, 6919], [6824, 6854]], 1999], 16592),\n  ('boundary control 4', [[0, 60], [], 1800], 600), ('boundary control 5', [[0, 3], [], 30], 1),\n  ('normal control 6', [[2760, 3000], [[2936, 2966], [2726, 2816]], 2400], 6853),\n  ('normal control 7', [[5760, 6360], [[6008, 6038], [6344, 6434]], 1800], 9140),\n  ('normal control 8', [[8520, 8760], [[8576, 8696], [8730, 8850], [8520, 8580]], 2400], 12520)],\n [('regression: allowance rounding 1', [[0, 3], [], 30], 1),\n  ('regression variant: allowance rounding 2',\n   [[3900, 5340], [[4265, 4355], [4658, 4688], [4876, 4906]], 1999], 19324),\n  ('partial repair guard 3', [[7200, 8040], [[7671, 7731], [7689, 7809], [7240, 7360]], 1999], 18291),\n  ('boundary control 4', [[7140, 7260], [[7190, 7250]], 2400], 3267),\n  ('boundary control 5', [[7200, 7260], [], 1800], 900),\n  ('normal control 6', [[9660, 11100], [[11072, 11162], [9928, 9958]], 2400], 25827),\n  ('normal control 7', [[1020, 2460], [[1085, 1115]], 2400], 20000),\n  ('normal control 8', [[4200, 4800], [[4321, 4351], [4378, 4468]], 1800], 8400)],\n [('regression: allowance rounding 1', [[1080, 1320], [[1310, 1340]], 1999], 3554),\n  ('regression variant: allowance rounding 2', [[5340, 6180], [[5928, 6018], [6161, 6281]], 2400], 18147),\n  ('partial repair guard 3', [[9960, 11400], [[10425, 10545]], 1999], 19324),\n  ('boundary control 4', [[0, 60], [], 1800], 600), ('boundary control 5', [[0, 3], [], 30], 1),\n  ('normal control 6', [[5340, 5940], [], 2400], 8000),\n  ('normal control 7', [[9720, 10560], [[9952, 10042]], 2400], 15400),\n  ('normal control 8', [[2880, 3120], [[3022, 3112]], 1999], 4664)],\n [('regression: allowance rounding 1', [[7080, 7320], [[7181, 7241], [7166, 7226]], 2400], 5727),\n  ('regression variant: allowance rounding 2', [[5760, 6000], [[5707, 5767]], 1999], 4587),\n  ('partial repair guard 3', [[9960, 10200], [[10055, 10145], [10110, 10200]], 1999], 6413),\n  ('boundary control 4', [[7140, 7260], [[7190, 7250]], 2400], 3267),\n  ('boundary control 5', [[7200, 7260], [], 1800], 900),\n  ('normal control 6', [[5640, 6240], [[5947, 6007], [5613, 5733], [5788, 5908]], 2400], 16360),\n  ('normal control 7', [[9720, 9960], [[9734, 9764]], 2400], 5400),\n  ('normal control 8', [[9660, 11100], [], 1999], 18324)]]\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":"2b4b1ff7d7e82837629ac9e3ce5bfe03f7451e8b4d4533f1117c077eb9ebab10","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(standby, callouts, rate):\n    s0, e0 = standby\n    busy = set()\n    for s, e in callouts:\n        busy.update(range(s, e))\n    units = 0\n    for t in range(s0, e0):\n        if t in busy:\n            continue\n        units += 20 if (t // 1440) % 7 < 5 else 30\n    units += 60 * len(busy)\n    return (units * rate + 1800) // 3600\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: allowance rounding 1', [[7140, 7260], [[7190, 7250]], 2400], 3267),\n  ('regression variant: allowance rounding 2', [[5400, 6240], [], 1999], 9329),\n  ('partial repair guard 3', [[1080, 1320], [[1310, 1340]], 1999], 3554),\n  ('boundary control 4', [[7200, 7260], [], 1800], 900),\n  ('normal control 5', [[1440, 2880], [[2236, 2356]], 1999], 18657),\n  ('normal control 6', [[2880, 3720], [[3367, 3457]], 3000], 17000),\n  ('normal control 7', [[2880, 4320], [[3679, 3739], [3048, 3138], [3606, 3726]], 1800], 18860),\n  ('normal control 8', [[1320, 2760], [[2547, 2637]], 2400], 21600)],\n [('regression: allowance rounding 1', [[0, 1], [], 90], 1),\n  ('regression variant: allowance rounding 2', [[0, 1440], [[1320, 1440], [1406, 1526], [1262, 1322]], 1999],\n   22811),\n  ('partial repair guard 3', [[6840, 7680], [[7144, 7264], [6829, 6919], [6824, 6854]], 1999], 16592),\n  ('boundary control 4', [[0, 60], [], 1800], 600), ('boundary control 5', [[0, 3], [], 30], 1),\n  ('normal control 6', [[2760, 3000], [[2936, 2966], [2726, 2816]], 2400], 6853),\n  ('normal control 7', [[5760, 6360], [[6008, 6038], [6344, 6434]], 1800], 9140),\n  ('normal control 8', [[8520, 8760], [[8576, 8696], [8730, 8850], [8520, 8580]], 2400], 12520)],\n [('regression: allowance rounding 1', [[0, 3], [], 30], 1),\n  ('regression variant: allowance rounding 2',\n   [[3900, 5340], [[4265, 4355], [4658, 4688], [4876, 4906]], 1999], 19324),\n  ('partial repair guard 3', [[7200, 8040], [[7671, 7731], [7689, 7809], [7240, 7360]], 1999], 18291),\n  ('boundary control 4', [[7140, 7260], [[7190, 7250]], 2400], 3267),\n  ('boundary control 5', [[7200, 7260], [], 1800], 900),\n  ('normal control 6', [[9660, 11100], [[11072, 11162], [9928, 9958]], 2400], 25827),\n  ('normal control 7', [[1020, 2460], [[1085, 1115]], 2400], 20000),\n  ('normal control 8', [[4200, 4800], [[4321, 4351], [4378, 4468]], 1800], 8400)],\n [('regression: allowance rounding 1', [[1080, 1320], [[1310, 1340]], 1999], 3554),\n  ('regression variant: allowance rounding 2', [[5340, 6180], [[5928, 6018], [6161, 6281]], 2400], 18147),\n  ('partial repair guard 3', [[9960, 11400], [[10425, 10545]], 1999], 19324),\n  ('boundary control 4', [[0, 60], [], 1800], 600), ('boundary control 5', [[0, 3], [], 30], 1),\n  ('normal control 6', [[5340, 5940], [], 2400], 8000),\n  ('normal control 7', [[9720, 10560], [[9952, 10042]], 2400], 15400),\n  ('normal control 8', [[2880, 3120], [[3022, 3112]], 1999], 4664)],\n [('regression: allowance rounding 1', [[7080, 7320], [[7181, 7241], [7166, 7226]], 2400], 5727),\n  ('regression variant: allowance rounding 2', [[5760, 6000], [[5707, 5767]], 1999], 4587),\n  ('partial repair guard 3', [[9960, 10200], [[10055, 10145], [10110, 10200]], 1999], 6413),\n  ('boundary control 4', [[7140, 7260], [[7190, 7250]], 2400], 3267),\n  ('boundary control 5', [[7200, 7260], [], 1800], 900),\n  ('normal control 6', [[5640, 6240], [[5947, 6007], [5613, 5733], [5788, 5908]], 2400], 16360),\n  ('normal control 7', [[9720, 9960], [[9734, 9764]], 2400], 5400),\n  ('normal control 8', [[9660, 11100], [], 1999], 18324)]]\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-standby-allowance-allowance-rounding","generated_at":"2026-09-29T14:52:02.624244+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"On-call allowances interact with callout pay; double payment and wrong day attribution are common.","repair":"Round half up once on the exact amount.","root_cause":"The exact amount is floor-divided.","sha256":"bf08510f4b57956bbc7a1c31ef7609be694b1aefb3e8f85c044b1914e7529dbb","title":"Standby allowance truncated to the cent · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":48.099,"exit_code":1,"observations":[{"actual":3280,"check":"regression: allowance rounding 1","expected":3267,"passed":false},{"actual":9328,"check":"regression variant: allowance rounding 2","expected":9329,"passed":false},{"actual":3564,"check":"partial repair guard 3","expected":3554,"passed":false},{"actual":900,"check":"boundary control 4","expected":900,"passed":true},{"actual":18657,"check":"normal control 5","expected":18657,"passed":true},{"actual":17000,"check":"normal control 6","expected":17000,"passed":true},{"actual":18870,"check":"normal control 7","expected":18860,"passed":false},{"actual":21600,"check":"normal control 8","expected":21600,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: allowance rounding 1\", \"actual\": 3280, \"expected\": 3267, \"passed\": false}, {\"check\": \"regression variant: allowance rounding 2\", \"actual\": 9328, \"expected\": 9329, \"passed\": false}, {\"check\": \"partial repair guard 3\", \"actual\": 3564, \"expected\": 3554, \"passed\": false}, {\"check\": \"boundary control 4\", \"actual\": 900, \"expected\": 900, \"passed\": true}, {\"check\": \"normal control 5\", \"actual\": 18657, \"expected\": 18657, \"passed\": true}, {\"check\": \"normal control 6\", \"actual\": 17000, \"expected\": 17000, \"passed\": true}, {\"check\": \"normal control 7\", \"actual\": 18870, \"expected\": 18860, \"passed\": false}, {\"check\": \"normal control 8\", \"actual\": 21600, \"expected\": 21600, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.509,"exit_code":1,"observations":[{"actual":3266,"check":"regression: allowance rounding 1","expected":3267,"passed":false},{"actual":9328,"check":"regression variant: allowance rounding 2","expected":9329,"passed":false},{"actual":3553,"check":"partial repair guard 3","expected":3554,"passed":false},{"actual":900,"check":"boundary control 4","expected":900,"passed":true},{"actual":18657,"check":"normal control 5","expected":18657,"passed":true},{"actual":17000,"check":"normal control 6","expected":17000,"passed":true},{"actual":18860,"check":"normal control 7","expected":18860,"passed":true},{"actual":21600,"check":"normal control 8","expected":21600,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: allowance rounding 1\", \"actual\": 3266, \"expected\": 3267, \"passed\": false}, {\"check\": \"regression variant: allowance rounding 2\", \"actual\": 9328, \"expected\": 9329, \"passed\": false}, {\"check\": \"partial repair guard 3\", \"actual\": 3553, \"expected\": 3554, \"passed\": false}, {\"check\": \"boundary control 4\", \"actual\": 900, \"expected\": 900, \"passed\": true}, {\"check\": \"normal control 5\", \"actual\": 18657, \"expected\": 18657, \"passed\": true}, {\"check\": \"normal control 6\", \"actual\": 17000, \"expected\": 17000, \"passed\": true}, {\"check\": \"normal control 7\", \"actual\": 18860, \"expected\": 18860, \"passed\": true}, {\"check\": \"normal control 8\", \"actual\": 21600, \"expected\": 21600, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":43.164,"exit_code":0,"observations":[{"actual":3267,"check":"regression: allowance rounding 1","expected":3267,"passed":true},{"actual":9329,"check":"regression variant: allowance rounding 2","expected":9329,"passed":true},{"actual":3554,"check":"partial repair guard 3","expected":3554,"passed":true},{"actual":900,"check":"boundary control 4","expected":900,"passed":true},{"actual":18657,"check":"normal control 5","expected":18657,"passed":true},{"actual":17000,"check":"normal control 6","expected":17000,"passed":true},{"actual":18860,"check":"normal control 7","expected":18860,"passed":true},{"actual":21600,"check":"normal control 8","expected":21600,"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: allowance rounding 1\", \"actual\": 3267, \"expected\": 3267, \"passed\": true}, {\"check\": \"regression variant: allowance rounding 2\", \"actual\": 9329, \"expected\": 9329, \"passed\": true}, {\"check\": \"partial repair guard 3\", \"actual\": 3554, \"expected\": 3554, \"passed\": true}, {\"check\": \"boundary control 4\", \"actual\": 900, \"expected\": 900, \"passed\": true}, {\"check\": \"normal control 5\", \"actual\": 18657, \"expected\": 18657, \"passed\": true}, {\"check\": \"normal control 6\", \"actual\": 17000, \"expected\": 17000, \"passed\": true}, {\"check\": \"normal control 7\", \"actual\": 18860, \"expected\": 18860, \"passed\": true}, {\"check\": \"normal control 8\", \"actual\": 21600, \"expected\": 21600, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}