{"abstract":"A holiday whose only prior days are unscheduled treats an off day at index 0 as the prior shift and is denied.","category":"Shift rostering labor rules","checks":8,"contract":"A day-status string (W worked, A unexcused absence, X excused absence, O not scheduled) and holiday indices. A holiday is paid if the nearest scheduled day before it and the nearest after it (skipping O days and other holidays) are both W or X; if either does not exist in the roster, it is not paid. Return [holiday, eligible] in holiday order.","contract_signature":"days, holidays","evaluation_group":"w2-shift-rostering-labor-rules-holiday-pay-eligibility","failed_approach":"Stopping before the last index has the same defect at the far end.","family":"w2-shift-rostering-labor-rules-holiday-pay-eligibility-search-lower-bound","id":"FA-94211","implementations":{"attempt":{"sha256":"14677e171d7cf3702eae0e2c039adc1f92dcb1cacffe2eb3435a271ab910ab1f","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(days, holidays):\n    hs = set(holidays)\n    ok = ('W', 'X')\n    def near(i, step):\n        j = i + step\n        while 0 <= j < len(days) - 1 and (days[j] == 'O' or j in hs):\n            j += step\n        return days[j] if 0 <= j < len(days) else None\n    return [[h, near(h, -1) in ok and near(h, 1) in ok] for h in sorted(holidays)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: search lower bound 1', ['WOWXXOAW', [1, 7, 0]], [[0, False], [1, False], [7, False]]),\n  ('regression variant: search lower bound 2', ['WOOOWOW', [3, 2, 0]], [[0, False], [2, False], [3, False]]),\n  ('partial repair guard 3', ['OWWOOOW', [3, 6, 4]], [[3, False], [4, False], [6, False]]),\n  ('boundary control 4', ['OWOOW', [2]], [[2, True]]), ('boundary control 5', ['WAOWW', [2]], [[2, False]]),\n  ('normal control 6', ['OAOXWXXOOW', [7]], [[7, True]]),\n  ('normal control 7', ['WOWWWOXXAOO', [4, 5, 10]], [[4, True], [5, True], [10, False]]),\n  ('normal control 8', ['WWXWXOWAWOWW', [8, 5]], [[5, True], [8, False]])],\n [('regression: search lower bound 1', ['WOWOOOW', [3, 1, 0]], [[0, False], [1, False], [3, True]]),\n  ('partial repair guard 2', ['OOAXOOW', [4, 0, 6]], [[0, False], [4, False], [6, False]]),\n  ('boundary control 3', ['WWOWA', [2]], [[2, True]]),\n  ('boundary control 4', ['WOOOW', [1, 2]], [[1, True], [2, True]]),\n  ('normal control 5', ['OWXWOXWWOXWA', [1]], [[1, False]]),\n  ('normal control 6', ['OWAWOWOWOWO', [0, 4, 8]], [[0, False], [4, True], [8, True]]),\n  ('normal control 7', ['XXOXXOO', [6]], [[6, False]]),\n  ('normal control 8', ['OWWOWWOWO', [5, 8, 6]], [[5, True], [6, True], [8, False]])],\n [('regression: search lower bound 1', ['WOOOWOW', [3, 2, 0]], [[0, False], [2, False], [3, False]]),\n  ('regression variant: search lower bound 2', ['WOWXXOAW', [1, 7, 0]], [[0, False], [1, False], [7, False]]),\n  ('partial repair guard 3', ['WOAXAXXWW', [7, 8]], [[7, False], [8, False]]),\n  ('boundary control 4', ['WXOWX', [2]], [[2, True]]), ('boundary control 5', ['WOOWW', [2]], [[2, True]]),\n  ('normal control 6', ['WXWWAOOW', [5]], [[5, False]]),\n  ('normal control 7', ['WOWWOWO', [6, 0, 4]], [[0, False], [4, True], [6, False]]),\n  ('normal control 8', ['XOOAWWAWWAW', [10, 2]], [[2, False], [10, False]])],\n [('regression: search lower bound 1', ['WOWOWOX', [0, 1, 4]], [[0, False], [1, False], [4, True]]),\n  ('partial repair guard 2', ['XOOXOW', [1, 4, 5]], [[1, True], [4, False], [5, False]]),\n  ('boundary control 3', ['OOWWW', [0]], [[0, False]]), ('boundary control 4', ['OWOOW', [2]], [[2, True]]),\n  ('normal control 5', ['WWOWOWWOW', [7]], [[7, True]]),\n  ('normal control 6', ['WXWWAOOW', [5]], [[5, False]]),\n  ('normal control 7', ['AWWWWW', [5, 3]], [[3, True], [5, False]]),\n  ('normal control 8', ['XOWOAWW', [3, 1, 6]], [[1, True], [3, False], [6, False]])],\n [('regression: search lower bound 1', ['WOWXXOAW', [1, 7, 0]], [[0, False], [1, False], [7, False]]),\n  ('regression variant: search lower bound 2', ['WOOOWOW', [3, 2, 0]], [[0, False], [2, False], [3, False]]),\n  ('partial repair guard 3', ['AOWOXWOOW', [7, 8]], [[7, False], [8, False]]),\n  ('boundary control 4', ['WAOWW', [2]], [[2, False]]), ('boundary control 5', ['WWOWA', [2]], [[2, True]]),\n  ('normal control 6', ['XWWWWXWWWWW', [10, 4]], [[4, True], [10, False]]),\n  ('normal control 7', ['OAWXWXXWOA', [8]], [[8, False]]),\n  ('normal control 8', ['WWOWWOOXX', [4, 2, 5]], [[2, True], [4, True], [5, True]])]]\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":"a8bbe279c883356c6357bb3039923c646a482bbb302b7b59ca64ba56a671d4cf","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(days, holidays):\n    hs = set(holidays)\n    ok = ('W', 'X')\n    def near(i, step):\n        j = i + step\n        while 0 < j < len(days) and (days[j] == 'O' or j in hs):\n            j += step\n        return days[j] if 0 <= j < len(days) else None\n    return [[h, near(h, -1) in ok and near(h, 1) in ok] for h in sorted(holidays)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: search lower bound 1', ['WOWXXOAW', [1, 7, 0]], [[0, False], [1, False], [7, False]]),\n  ('regression variant: search lower bound 2', ['WOOOWOW', [3, 2, 0]], [[0, False], [2, False], [3, False]]),\n  ('partial repair guard 3', ['OWWOOOW', [3, 6, 4]], [[3, False], [4, False], [6, False]]),\n  ('boundary control 4', ['OWOOW', [2]], [[2, True]]), ('boundary control 5', ['WAOWW', [2]], [[2, False]]),\n  ('normal control 6', ['OAOXWXXOOW', [7]], [[7, True]]),\n  ('normal control 7', ['WOWWWOXXAOO', [4, 5, 10]], [[4, True], [5, True], [10, False]]),\n  ('normal control 8', ['WWXWXOWAWOWW', [8, 5]], [[5, True], [8, False]])],\n [('regression: search lower bound 1', ['WOWOOOW', [3, 1, 0]], [[0, False], [1, False], [3, True]]),\n  ('partial repair guard 2', ['OOAXOOW', [4, 0, 6]], [[0, False], [4, False], [6, False]]),\n  ('boundary control 3', ['WWOWA', [2]], [[2, True]]),\n  ('boundary control 4', ['WOOOW', [1, 2]], [[1, True], [2, True]]),\n  ('normal control 5', ['OWXWOXWWOXWA', [1]], [[1, False]]),\n  ('normal control 6', ['OWAWOWOWOWO', [0, 4, 8]], [[0, False], [4, True], [8, True]]),\n  ('normal control 7', ['XXOXXOO', [6]], [[6, False]]),\n  ('normal control 8', ['OWWOWWOWO', [5, 8, 6]], [[5, True], [6, True], [8, False]])],\n [('regression: search lower bound 1', ['WOOOWOW', [3, 2, 0]], [[0, False], [2, False], [3, False]]),\n  ('regression variant: search lower bound 2', ['WOWXXOAW', [1, 7, 0]], [[0, False], [1, False], [7, False]]),\n  ('partial repair guard 3', ['WOAXAXXWW', [7, 8]], [[7, False], [8, False]]),\n  ('boundary control 4', ['WXOWX', [2]], [[2, True]]), ('boundary control 5', ['WOOWW', [2]], [[2, True]]),\n  ('normal control 6', ['WXWWAOOW', [5]], [[5, False]]),\n  ('normal control 7', ['WOWWOWO', [6, 0, 4]], [[0, False], [4, True], [6, False]]),\n  ('normal control 8', ['XOOAWWAWWAW', [10, 2]], [[2, False], [10, False]])],\n [('regression: search lower bound 1', ['WOWOWOX', [0, 1, 4]], [[0, False], [1, False], [4, True]]),\n  ('partial repair guard 2', ['XOOXOW', [1, 4, 5]], [[1, True], [4, False], [5, False]]),\n  ('boundary control 3', ['OOWWW', [0]], [[0, False]]), ('boundary control 4', ['OWOOW', [2]], [[2, True]]),\n  ('normal control 5', ['WWOWOWWOW', [7]], [[7, True]]),\n  ('normal control 6', ['WXWWAOOW', [5]], [[5, False]]),\n  ('normal control 7', ['AWWWWW', [5, 3]], [[3, True], [5, False]]),\n  ('normal control 8', ['XOWOAWW', [3, 1, 6]], [[1, True], [3, False], [6, False]])],\n [('regression: search lower bound 1', ['WOWXXOAW', [1, 7, 0]], [[0, False], [1, False], [7, False]]),\n  ('regression variant: search lower bound 2', ['WOOOWOW', [3, 2, 0]], [[0, False], [2, False], [3, False]]),\n  ('partial repair guard 3', ['AOWOXWOOW', [7, 8]], [[7, False], [8, False]]),\n  ('boundary control 4', ['WAOWW', [2]], [[2, False]]), ('boundary control 5', ['WWOWA', [2]], [[2, True]]),\n  ('normal control 6', ['XWWWWXWWWWW', [10, 4]], [[4, True], [10, False]]),\n  ('normal control 7', ['OAWXWXXWOA', [8]], [[8, False]]),\n  ('normal control 8', ['WWOWWOOXX', [4, 2, 5]], [[2, True], [4, True], [5, True]])]]\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-holiday-pay-eligibility-search-lower-bound","generated_at":"2026-09-29T14:52:02.179602+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Last-and-first-shift holiday pay rules are frequently misapplied around days off and adjacent holidays.","root_cause":"The skip loop stops before examining index 0.","sha256":"ae8b6a106a84194f02088ca1572aa1158343bea484a79e9482cde628c64bb553","title":"Neighbour search treats day zero as scheduled · 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":41.096,"exit_code":1,"observations":[{"actual":[[0,false],[1,false],[7,false]],"check":"regression: search lower bound 1","expected":[[0,false],[1,false],[7,false]],"passed":true},{"actual":[[0,false],[2,false],[3,false]],"check":"regression variant: search lower bound 2","expected":[[0,false],[2,false],[3,false]],"passed":true},{"actual":[[3,true],[4,true],[6,false]],"check":"partial repair guard 3","expected":[[3,false],[4,false],[6,false]],"passed":false},{"actual":[[2,true]],"check":"boundary control 4","expected":[[2,true]],"passed":true},{"actual":[[2,false]],"check":"boundary control 5","expected":[[2,false]],"passed":true},{"actual":[[7,true]],"check":"normal control 6","expected":[[7,true]],"passed":true},{"actual":[[4,true],[5,true],[10,false]],"check":"normal control 7","expected":[[4,true],[5,true],[10,false]],"passed":true},{"actual":[[5,true],[8,false]],"check":"normal control 8","expected":[[5,true],[8,false]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: search lower bound 1\", \"actual\": [[0, false], [1, false], [7, false]], \"expected\": [[0, false], [1, false], [7, false]], \"passed\": true}, {\"check\": \"regression variant: search lower bound 2\", \"actual\": [[0, false], [2, false], [3, false]], \"expected\": [[0, false], [2, false], [3, false]], \"passed\": true}, {\"check\": \"partial repair guard 3\", \"actual\": [[3, true], [4, true], [6, false]], \"expected\": [[3, false], [4, false], [6, false]], \"passed\": false}, {\"check\": \"boundary control 4\", \"actual\": [[2, true]], \"expected\": [[2, true]], \"passed\": true}, {\"check\": \"boundary control 5\", \"actual\": [[2, false]], \"expected\": [[2, false]], \"passed\": true}, {\"check\": \"normal control 6\", \"actual\": [[7, true]], \"expected\": [[7, true]], \"passed\": true}, {\"check\": \"normal control 7\", \"actual\": [[4, true], [5, true], [10, false]], \"expected\": [[4, true], [5, true], [10, false]], \"passed\": true}, {\"check\": \"normal control 8\", \"actual\": [[5, true], [8, false]], \"expected\": [[5, true], [8, false]], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.622,"exit_code":1,"observations":[{"actual":[[0,false],[1,true],[7,false]],"check":"regression: search lower bound 1","expected":[[0,false],[1,false],[7,false]],"passed":false},{"actual":[[0,false],[2,true],[3,true]],"check":"regression variant: search lower bound 2","expected":[[0,false],[2,false],[3,false]],"passed":false},{"actual":[[3,false],[4,false],[6,false]],"check":"partial repair guard 3","expected":[[3,false],[4,false],[6,false]],"passed":true},{"actual":[[2,true]],"check":"boundary control 4","expected":[[2,true]],"passed":true},{"actual":[[2,false]],"check":"boundary control 5","expected":[[2,false]],"passed":true},{"actual":[[7,true]],"check":"normal control 6","expected":[[7,true]],"passed":true},{"actual":[[4,true],[5,true],[10,false]],"check":"normal control 7","expected":[[4,true],[5,true],[10,false]],"passed":true},{"actual":[[5,true],[8,false]],"check":"normal control 8","expected":[[5,true],[8,false]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: search lower bound 1\", \"actual\": [[0, false], [1, true], [7, false]], \"expected\": [[0, false], [1, false], [7, false]], \"passed\": false}, {\"check\": \"regression variant: search lower bound 2\", \"actual\": [[0, false], [2, true], [3, true]], \"expected\": [[0, false], [2, false], [3, false]], \"passed\": false}, {\"check\": \"partial repair guard 3\", \"actual\": [[3, false], [4, false], [6, false]], \"expected\": [[3, false], [4, false], [6, false]], \"passed\": true}, {\"check\": \"boundary control 4\", \"actual\": [[2, true]], \"expected\": [[2, true]], \"passed\": true}, {\"check\": \"boundary control 5\", \"actual\": [[2, false]], \"expected\": [[2, false]], \"passed\": true}, {\"check\": \"normal control 6\", \"actual\": [[7, true]], \"expected\": [[7, true]], \"passed\": true}, {\"check\": \"normal control 7\", \"actual\": [[4, true], [5, true], [10, false]], \"expected\": [[4, true], [5, true], [10, false]], \"passed\": true}, {\"check\": \"normal control 8\", \"actual\": [[5, true], [8, false]], \"expected\": [[5, true], [8, false]], \"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."}}