{"abstract":"A punch out exactly seven minutes late is rounded instead of snapping to the schedule.","category":"Shift rostering labor rules","checks":8,"contract":"Scheduled [start, end] and raw punches in minutes. A punch in at most 7 minutes before the scheduled start is treated as the start; a punch out at most 7 minutes after the scheduled end is treated as the end. Then each time is rounded to the quarter hour: remainder 0-7 down, 8-14 up. Return [in, out, max(out - in, 0)].","evaluation_group":"w2-shift-rostering-labor-rules-punch-rounding-grace","failed_approach":"Widening the grace to 15 minutes hides genuine overtime.","family":"w2-shift-rostering-labor-rules-punch-rounding-grace-late-out-grace-window","id":"FA-94161","implementations":{"attempt":{"sha256":"22170296dd311099289f0f9bbd80fbc5c6829227eb1e6c92941900562908d437","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(sched, punch_in, punch_out):\n    start, end = sched\n    def q(t):\n        r = t % 15\n        return t - r if r <= 7 else t + 15 - r\n    i = start if 0 < start - punch_in <= 7 else punch_in\n    o = end if 0 < punch_out - end <= 15 else punch_out\n    i, o = q(i), q(o)\n    return [i, o, max(o - i, 0)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: late out grace window 1', [[487, 727], 495, 734], [495, 720, 225]),\n  ('regression variant: late out grace window 2', [[487, 967], 486, 974], [480, 960, 480]),\n  ('partial repair guard 3', [[487, 997], 490, 1006], [495, 1005, 510]),\n  ('boundary control 4', [[480, 960], 488, 952], [495, 945, 450]),\n  ('boundary control 5', [[480, 960], 487, 953], [480, 960, 480]),\n  ('normal control 6', [[487, 727], 496, 739], [495, 735, 240]),\n  ('normal control 7', [[600, 1110], 595, 1122], [600, 1125, 525]),\n  ('normal control 8', [[540, 1050], 532, 1051], [525, 1050, 525])],\n [('regression: late out grace window 1', [[487, 727], 467, 734], [465, 720, 255]),\n  ('regression variant: late out grace window 2', [[487, 727], 480, 734], [480, 720, 240]),\n  ('partial repair guard 3', [[600, 1080], 595, 1092], [600, 1095, 495]),\n  ('boundary control 4', [[480, 960], 473, 967], [480, 960, 480]),\n  ('boundary control 5', [[480, 960], 500, 490], [495, 495, 0]),\n  ('normal control 6', [[600, 1080], 607, 1088], [600, 1095, 495]),\n  ('normal control 7', [[540, 1020], 532, 1032], [525, 1035, 510]),\n  ('normal control 8', [[420, 660], 413, 672], [420, 675, 255])],\n [('regression: late out grace window 1', [[487, 967], 479, 974], [480, 960, 480]),\n  ('regression variant: late out grace window 2', [[487, 727], 495, 734], [495, 720, 225]),\n  ('partial repair guard 3', [[487, 727], 496, 739], [495, 735, 240]),\n  ('boundary control 4', [[480, 960], 488, 952], [495, 945, 450]),\n  ('boundary control 5', [[480, 960], 487, 953], [480, 960, 480]),\n  ('normal control 6', [[420, 930], 400, 931], [405, 930, 525]),\n  ('normal control 7', [[540, 1050], 539, 1049], [540, 1050, 510]),\n  ('normal control 8', [[420, 660], 413, 672], [420, 675, 255])],\n [('regression: late out grace window 1', [[487, 967], 467, 974], [465, 960, 495]),\n  ('regression variant: late out grace window 2', [[487, 727], 467, 734], [465, 720, 255]),\n  ('partial repair guard 3', [[487, 997], 479, 1005], [480, 1005, 525]),\n  ('boundary control 4', [[480, 960], 473, 967], [480, 960, 480]),\n  ('boundary control 5', [[480, 960], 500, 490], [495, 495, 0]),\n  ('normal control 6', [[487, 967], 480, 979], [480, 975, 495]),\n  ('normal control 7', [[540, 1050], 532, 1072], [525, 1065, 540]),\n  ('normal control 8', [[600, 840], 614, 862], [615, 855, 240])],\n [('regression: late out grace window 1', [[487, 967], 486, 974], [480, 960, 480]),\n  ('regression variant: late out grace window 2', [[487, 967], 479, 974], [480, 960, 480]),\n  ('partial repair guard 3', [[420, 660], 413, 672], [420, 675, 255]),\n  ('boundary control 4', [[480, 960], 488, 952], [495, 945, 450]),\n  ('boundary control 5', [[480, 960], 487, 953], [480, 960, 480]),\n  ('normal control 6', [[600, 840], 607, 840], [600, 840, 240]),\n  ('normal control 7', [[480, 990], 479, 980], [480, 975, 495]),\n  ('normal control 8', [[487, 727], 467, 734], [465, 720, 255])]]\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":"91b87e1cc020405a03a5705e1db52b21ec72856db9f150d85d6ed30c9dcb4d9a","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(sched, punch_in, punch_out):\n    start, end = sched\n    def q(t):\n        r = t % 15\n        return t - r if r <= 7 else t + 15 - r\n    i = start if 0 < start - punch_in <= 7 else punch_in\n    o = end if 0 < punch_out - end < 7 else punch_out\n    i, o = q(i), q(o)\n    return [i, o, max(o - i, 0)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: late out grace window 1', [[487, 727], 495, 734], [495, 720, 225]),\n  ('regression variant: late out grace window 2', [[487, 967], 486, 974], [480, 960, 480]),\n  ('partial repair guard 3', [[487, 997], 490, 1006], [495, 1005, 510]),\n  ('boundary control 4', [[480, 960], 488, 952], [495, 945, 450]),\n  ('boundary control 5', [[480, 960], 487, 953], [480, 960, 480]),\n  ('normal control 6', [[487, 727], 496, 739], [495, 735, 240]),\n  ('normal control 7', [[600, 1110], 595, 1122], [600, 1125, 525]),\n  ('normal control 8', [[540, 1050], 532, 1051], [525, 1050, 525])],\n [('regression: late out grace window 1', [[487, 727], 467, 734], [465, 720, 255]),\n  ('regression variant: late out grace window 2', [[487, 727], 480, 734], [480, 720, 240]),\n  ('partial repair guard 3', [[600, 1080], 595, 1092], [600, 1095, 495]),\n  ('boundary control 4', [[480, 960], 473, 967], [480, 960, 480]),\n  ('boundary control 5', [[480, 960], 500, 490], [495, 495, 0]),\n  ('normal control 6', [[600, 1080], 607, 1088], [600, 1095, 495]),\n  ('normal control 7', [[540, 1020], 532, 1032], [525, 1035, 510]),\n  ('normal control 8', [[420, 660], 413, 672], [420, 675, 255])],\n [('regression: late out grace window 1', [[487, 967], 479, 974], [480, 960, 480]),\n  ('regression variant: late out grace window 2', [[487, 727], 495, 734], [495, 720, 225]),\n  ('partial repair guard 3', [[487, 727], 496, 739], [495, 735, 240]),\n  ('boundary control 4', [[480, 960], 488, 952], [495, 945, 450]),\n  ('boundary control 5', [[480, 960], 487, 953], [480, 960, 480]),\n  ('normal control 6', [[420, 930], 400, 931], [405, 930, 525]),\n  ('normal control 7', [[540, 1050], 539, 1049], [540, 1050, 510]),\n  ('normal control 8', [[420, 660], 413, 672], [420, 675, 255])],\n [('regression: late out grace window 1', [[487, 967], 467, 974], [465, 960, 495]),\n  ('regression variant: late out grace window 2', [[487, 727], 467, 734], [465, 720, 255]),\n  ('partial repair guard 3', [[487, 997], 479, 1005], [480, 1005, 525]),\n  ('boundary control 4', [[480, 960], 473, 967], [480, 960, 480]),\n  ('boundary control 5', [[480, 960], 500, 490], [495, 495, 0]),\n  ('normal control 6', [[487, 967], 480, 979], [480, 975, 495]),\n  ('normal control 7', [[540, 1050], 532, 1072], [525, 1065, 540]),\n  ('normal control 8', [[600, 840], 614, 862], [615, 855, 240])],\n [('regression: late out grace window 1', [[487, 967], 486, 974], [480, 960, 480]),\n  ('regression variant: late out grace window 2', [[487, 967], 479, 974], [480, 960, 480]),\n  ('partial repair guard 3', [[420, 660], 413, 672], [420, 675, 255]),\n  ('boundary control 4', [[480, 960], 488, 952], [495, 945, 450]),\n  ('boundary control 5', [[480, 960], 487, 953], [480, 960, 480]),\n  ('normal control 6', [[600, 840], 607, 840], [600, 840, 240]),\n  ('normal control 7', [[480, 990], 479, 980], [480, 975, 495]),\n  ('normal control 8', [[487, 727], 467, 734], [465, 720, 255])]]\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":"10cc4fb7a422b239d8e1fafe6c131d076ddfd9f75f91c2b29902b8598d5c4520","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(sched, punch_in, punch_out):\n    start, end = sched\n    def q(t):\n        r = t % 15\n        return t - r if r <= 7 else t + 15 - r\n    i = start if 0 < start - punch_in <= 7 else punch_in\n    o = end if 0 < punch_out - end <= 7 else punch_out\n    i, o = q(i), q(o)\n    return [i, o, max(o - i, 0)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: late out grace window 1', [[487, 727], 495, 734], [495, 720, 225]),\n  ('regression variant: late out grace window 2', [[487, 967], 486, 974], [480, 960, 480]),\n  ('partial repair guard 3', [[487, 997], 490, 1006], [495, 1005, 510]),\n  ('boundary control 4', [[480, 960], 488, 952], [495, 945, 450]),\n  ('boundary control 5', [[480, 960], 487, 953], [480, 960, 480]),\n  ('normal control 6', [[487, 727], 496, 739], [495, 735, 240]),\n  ('normal control 7', [[600, 1110], 595, 1122], [600, 1125, 525]),\n  ('normal control 8', [[540, 1050], 532, 1051], [525, 1050, 525])],\n [('regression: late out grace window 1', [[487, 727], 467, 734], [465, 720, 255]),\n  ('regression variant: late out grace window 2', [[487, 727], 480, 734], [480, 720, 240]),\n  ('partial repair guard 3', [[600, 1080], 595, 1092], [600, 1095, 495]),\n  ('boundary control 4', [[480, 960], 473, 967], [480, 960, 480]),\n  ('boundary control 5', [[480, 960], 500, 490], [495, 495, 0]),\n  ('normal control 6', [[600, 1080], 607, 1088], [600, 1095, 495]),\n  ('normal control 7', [[540, 1020], 532, 1032], [525, 1035, 510]),\n  ('normal control 8', [[420, 660], 413, 672], [420, 675, 255])],\n [('regression: late out grace window 1', [[487, 967], 479, 974], [480, 960, 480]),\n  ('regression variant: late out grace window 2', [[487, 727], 495, 734], [495, 720, 225]),\n  ('partial repair guard 3', [[487, 727], 496, 739], [495, 735, 240]),\n  ('boundary control 4', [[480, 960], 488, 952], [495, 945, 450]),\n  ('boundary control 5', [[480, 960], 487, 953], [480, 960, 480]),\n  ('normal control 6', [[420, 930], 400, 931], [405, 930, 525]),\n  ('normal control 7', [[540, 1050], 539, 1049], [540, 1050, 510]),\n  ('normal control 8', [[420, 660], 413, 672], [420, 675, 255])],\n [('regression: late out grace window 1', [[487, 967], 467, 974], [465, 960, 495]),\n  ('regression variant: late out grace window 2', [[487, 727], 467, 734], [465, 720, 255]),\n  ('partial repair guard 3', [[487, 997], 479, 1005], [480, 1005, 525]),\n  ('boundary control 4', [[480, 960], 473, 967], [480, 960, 480]),\n  ('boundary control 5', [[480, 960], 500, 490], [495, 495, 0]),\n  ('normal control 6', [[487, 967], 480, 979], [480, 975, 495]),\n  ('normal control 7', [[540, 1050], 532, 1072], [525, 1065, 540]),\n  ('normal control 8', [[600, 840], 614, 862], [615, 855, 240])],\n [('regression: late out grace window 1', [[487, 967], 486, 974], [480, 960, 480]),\n  ('regression variant: late out grace window 2', [[487, 967], 479, 974], [480, 960, 480]),\n  ('partial repair guard 3', [[420, 660], 413, 672], [420, 675, 255]),\n  ('boundary control 4', [[480, 960], 488, 952], [495, 945, 450]),\n  ('boundary control 5', [[480, 960], 487, 953], [480, 960, 480]),\n  ('normal control 6', [[600, 840], 607, 840], [600, 840, 240]),\n  ('normal control 7', [[480, 990], 479, 980], [480, 975, 495]),\n  ('normal control 8', [[487, 727], 467, 734], [465, 720, 255])]]\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-punch-rounding-grace-late-out-grace-window","generated_at":"2026-09-29T14:52:01.918609+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Punch rounding and grace periods must be neutral; asymmetric boundaries systematically underpay.","repair":"Snap punch outs up to and including seven minutes after the end.","root_cause":"The clock-out grace window is strict at seven minutes.","sha256":"1218ad3e7680286d2e31e04d894ae027a56223b6cc369501a7637d07aabeae35","title":"Seventh grace minute after the scheduled end not forgiven · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":43.156,"exit_code":1,"observations":[{"actual":[495,720,225],"check":"regression: late out grace window 1","expected":[495,720,225],"passed":true},{"actual":[480,960,480],"check":"regression variant: late out grace window 2","expected":[480,960,480],"passed":true},{"actual":[495,990,495],"check":"partial repair guard 3","expected":[495,1005,510],"passed":false},{"actual":[495,945,450],"check":"boundary control 4","expected":[495,945,450],"passed":true},{"actual":[480,960,480],"check":"boundary control 5","expected":[480,960,480],"passed":true},{"actual":[495,720,225],"check":"normal control 6","expected":[495,735,240],"passed":false},{"actual":[600,1110,510],"check":"normal control 7","expected":[600,1125,525],"passed":false},{"actual":[525,1050,525],"check":"normal control 8","expected":[525,1050,525],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: late out grace window 1\", \"actual\": [495, 720, 225], \"expected\": [495, 720, 225], \"passed\": true}, {\"check\": \"regression variant: late out grace window 2\", \"actual\": [480, 960, 480], \"expected\": [480, 960, 480], \"passed\": true}, {\"check\": \"partial repair guard 3\", \"actual\": [495, 990, 495], \"expected\": [495, 1005, 510], \"passed\": false}, {\"check\": \"boundary control 4\", \"actual\": [495, 945, 450], \"expected\": [495, 945, 450], \"passed\": true}, {\"check\": \"boundary control 5\", \"actual\": [480, 960, 480], \"expected\": [480, 960, 480], \"passed\": true}, {\"check\": \"normal control 6\", \"actual\": [495, 720, 225], \"expected\": [495, 735, 240], \"passed\": false}, {\"check\": \"normal control 7\", \"actual\": [600, 1110, 510], \"expected\": [600, 1125, 525], \"passed\": false}, {\"check\": \"normal control 8\", \"actual\": [525, 1050, 525], \"expected\": [525, 1050, 525], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":38.913,"exit_code":1,"observations":[{"actual":[495,735,240],"check":"regression: late out grace window 1","expected":[495,720,225],"passed":false},{"actual":[480,975,495],"check":"regression variant: late out grace window 2","expected":[480,960,480],"passed":false},{"actual":[495,1005,510],"check":"partial repair guard 3","expected":[495,1005,510],"passed":true},{"actual":[495,945,450],"check":"boundary control 4","expected":[495,945,450],"passed":true},{"actual":[480,960,480],"check":"boundary control 5","expected":[480,960,480],"passed":true},{"actual":[495,735,240],"check":"normal control 6","expected":[495,735,240],"passed":true},{"actual":[600,1125,525],"check":"normal control 7","expected":[600,1125,525],"passed":true},{"actual":[525,1050,525],"check":"normal control 8","expected":[525,1050,525],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: late out grace window 1\", \"actual\": [495, 735, 240], \"expected\": [495, 720, 225], \"passed\": false}, {\"check\": \"regression variant: late out grace window 2\", \"actual\": [480, 975, 495], \"expected\": [480, 960, 480], \"passed\": false}, {\"check\": \"partial repair guard 3\", \"actual\": [495, 1005, 510], \"expected\": [495, 1005, 510], \"passed\": true}, {\"check\": \"boundary control 4\", \"actual\": [495, 945, 450], \"expected\": [495, 945, 450], \"passed\": true}, {\"check\": \"boundary control 5\", \"actual\": [480, 960, 480], \"expected\": [480, 960, 480], \"passed\": true}, {\"check\": \"normal control 6\", \"actual\": [495, 735, 240], \"expected\": [495, 735, 240], \"passed\": true}, {\"check\": \"normal control 7\", \"actual\": [600, 1125, 525], \"expected\": [600, 1125, 525], \"passed\": true}, {\"check\": \"normal control 8\", \"actual\": [525, 1050, 525], \"expected\": [525, 1050, 525], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":44.873,"exit_code":0,"observations":[{"actual":[495,720,225],"check":"regression: late out grace window 1","expected":[495,720,225],"passed":true},{"actual":[480,960,480],"check":"regression variant: late out grace window 2","expected":[480,960,480],"passed":true},{"actual":[495,1005,510],"check":"partial repair guard 3","expected":[495,1005,510],"passed":true},{"actual":[495,945,450],"check":"boundary control 4","expected":[495,945,450],"passed":true},{"actual":[480,960,480],"check":"boundary control 5","expected":[480,960,480],"passed":true},{"actual":[495,735,240],"check":"normal control 6","expected":[495,735,240],"passed":true},{"actual":[600,1125,525],"check":"normal control 7","expected":[600,1125,525],"passed":true},{"actual":[525,1050,525],"check":"normal control 8","expected":[525,1050,525],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: late out grace window 1\", \"actual\": [495, 720, 225], \"expected\": [495, 720, 225], \"passed\": true}, {\"check\": \"regression variant: late out grace window 2\", \"actual\": [480, 960, 480], \"expected\": [480, 960, 480], \"passed\": true}, {\"check\": \"partial repair guard 3\", \"actual\": [495, 1005, 510], \"expected\": [495, 1005, 510], \"passed\": true}, {\"check\": \"boundary control 4\", \"actual\": [495, 945, 450], \"expected\": [495, 945, 450], \"passed\": true}, {\"check\": \"boundary control 5\", \"actual\": [480, 960, 480], \"expected\": [480, 960, 480], \"passed\": true}, {\"check\": \"normal control 6\", \"actual\": [495, 735, 240], \"expected\": [495, 735, 240], \"passed\": true}, {\"check\": \"normal control 7\", \"actual\": [600, 1125, 525], \"expected\": [600, 1125, 525], \"passed\": true}, {\"check\": \"normal control 8\", \"actual\": [525, 1050, 525], \"expected\": [525, 1050, 525], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}