{"abstract":"Overlapping rules (sat and fri-pm style) produce duplicate findings.","category":"Exam timetabling constraints","checks":8,"contract":"sits [student, exam, period]; periods index -> [weekday 0=Mon..6=Sun, slot am/pm/eve]; avoid student -> rules \"day\" (whole day) or \"day-slot\" (that slot and later slots that day). Each sitting matching any rule is reported once as [student, exam, period]; return rows sorted.","contract_signature":"sits, periods, avoid","evaluation_group":"w2-exam-timetabling-constraints-observance-unavailability","failed_approach":"Global deduplication also merges genuinely repeated sitting rows.","family":"w2-exam-timetabling-constraints-observance-unavailability-one-row-per-sitting","id":"FA-94726","implementations":{"attempt":{"sha256":"a0ea1240ec54413aa10fe3fe98cf8e961fbbb5e9299d91bf082bfa9948a5861a","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(sits, periods, avoid):\n    names = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']\n    order = ['am', 'pm', 'eve']\n    out = []\n    for st, ex, p in sits:\n        wd, slot = periods[p]\n        for rule in avoid.get(st, []):\n            parts = rule.split('-')\n            if parts[0] != names[wd]:\n                continue\n            if len(parts) == 1 or order.index(slot) >= order.index(parts[1]):\n                if [st, ex, p] not in out:\n                    out.append([st, ex, p])\n    return sorted(out)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: one row per sitting 1', [[['s1', 'A', 0]], [[4, 'eve']], {'s1': ['fri-eve', 'fri-pm']}],\n   [['s1', 'A', 0]]),\n  ('regression variant: one row per sitting 2',\n   [[['s2', 'MATH101H', 3], ['s1', 'CHEM120', 1], ['s1', 'CHEM120', 3], ['s2', 'MATH101', 0],\n     ['s1', 'BIO130', 0], ['s3', 'MATH101', 1]],\n    [[4, 'eve'], [3, 'pm'], [4, 'eve'], [1, 'am'], [3, 'pm'], [6, 'eve']],\n    {'s1': ['fri-eve', 'sun-am', 'fri'], 's2': ['fri-eve'], 's3': ['fri-eve', 'mon-eve', 'fri-pm']}],\n   [['s1', 'BIO130', 0], ['s2', 'MATH101', 0]]),\n  ('partial repair guard 3',\n   [[['s3', 'ECON150', 0], ['s3', 'ECON150', 0]],\n    [[4, 'pm'], [2, 'eve'], [6, 'am'], [6, 'am'], [5, 'eve'], [6, 'eve']],\n    {'s1': ['sun-am', 'fri'], 's2': ['fri-eve', 'fri'], 's3': ['fri-pm']}],\n   [['s3', 'ECON150', 0], ['s3', 'ECON150', 0]]),\n  ('normal control 4',\n   [[['s2', 'ECON150', 4], ['s3', 'MATH101H', 0], ['s1', 'HIST140', 3], ['s1', 'BIO130', 4],\n     ['s2', 'CHEM120', 5], ['s3', 'ECON150', 3]],\n    [[3, 'pm'], [2, 'pm'], [3, 'am'], [3, 'pm'], [3, 'eve'], [5, 'am']],\n    {'s1': ['mon-eve', 'sun-am'], 's2': ['mon-eve'], 's3': ['sat', 'fri-pm', 'fri']}],\n   []),\n  ('normal control 5',\n   [[['s3', 'PHYS110', 5], ['s3', 'ECON150', 5]],\n    [[1, 'eve'], [4, 'am'], [4, 'pm'], [3, 'pm'], [4, 'eve'], [1, 'eve']],\n    {'s1': ['sun-am'], 's2': ['fri'], 's3': ['fri-eve', 'mon-eve', 'sat']}],\n   []),\n  ('normal control 6',\n   [[['s1', 'CHEM120', 4], ['s3', 'HIST140', 3]],\n    [[5, 'pm'], [4, 'am'], [3, 'am'], [2, 'eve'], [4, 'pm'], [1, 'pm']],\n    {'s1': ['fri', 'sun-am', 'mon-eve'], 's2': ['sun-am', 'sat'], 's3': ['fri-pm', 'sat', 'fri']}],\n   [['s1', 'CHEM120', 4]]),\n  ('normal control 7',\n   [[['s3', 'PHYS110', 4], ['s2', 'MATH101H', 5], ['s1', 'HIST140', 0], ['s1', 'ECON150', 5],\n     ['s1', 'BIO130', 5]],\n    [[2, 'pm'], [1, 'am'], [2, 'pm'], [0, 'eve'], [3, 'eve'], [5, 'eve']],\n    {'s1': ['fri', 'mon-eve', 'sun-am']}],\n   []),\n  ('normal control 8',\n   [[['s1', 'CHEM120', 3], ['s3', 'HIST140', 1], ['s1', 'CHEM120', 4], ['s2', 'HIST140', 5]],\n    [[6, 'am'], [3, 'pm'], [4, 'eve'], [1, 'am'], [6, 'eve'], [1, 'pm']],\n    {'s1': ['fri-pm'], 's3': ['mon-eve', 'sat', 'fri-pm']}],\n   [])],\n [('regression: one row per sitting 1',\n   [[['s1', 'HIST140', 2], ['s3', 'MATH101H', 1], ['s1', 'CHEM120', 4], ['s2', 'CHEM120', 4],\n     ['s2', 'MATH101', 4], ['s3', 'MATH101H', 5]],\n    [[0, 'eve'], [4, 'eve'], [4, 'pm'], [4, 'pm'], [5, 'pm'], [0, 'pm']],\n    {'s1': ['fri-eve', 'sat', 'mon-eve'],\n     's2': ['mon-eve', 'fri', 'sun-am'],\n     's3': ['sun-am', 'fri-pm', 'fri']}],\n   [['s1', 'CHEM120', 4], ['s3', 'MATH101H', 1]]),\n  ('regression variant: one row per sitting 2',\n   [[['s1', 'PHYS110', 2], ['s2', 'BIO130', 0], ['s2', 'ECON150', 3], ['s2', 'ECON150', 5]],\n    [[3, 'am'], [2, 'pm'], [4, 'am'], [4, 'eve'], [4, 'eve'], [5, 'am']],\n    {'s2': ['sun-am', 'fri-pm', 'fri'], 's3': ['sat', 'sun-am']}],\n   [['s2', 'ECON150', 3]]),\n  ('partial repair guard 3',\n   [[['s2', 'HIST140', 4], ['s1', 'HIST140', 2], ['s1', 'BIO130', 2], ['s3', 'MATH101', 3],\n     ['s3', 'MATH101', 3]],\n    [[0, 'eve'], [0, 'am'], [4, 'am'], [5, 'pm'], [0, 'eve'], [3, 'pm']],\n    {'s1': ['fri', 'fri-pm'], 's2': ['fri-eve', 'fri'], 's3': ['sat']}],\n   [['s1', 'BIO130', 2], ['s1', 'HIST140', 2], ['s3', 'MATH101', 3], ['s3', 'MATH101', 3]]),\n  ('boundary control 4', [[['s1', 'A', 0]], [[4, 'am']], {'s1': ['fri-pm']}], []),\n  ('normal control 5',\n   [[['s1', 'HIST140', 0], ['s3', 'ECON150', 3]],\n    [[6, 'pm'], [1, 'eve'], [3, 'pm'], [3, 'pm'], [1, 'am'], [4, 'am']],\n    {'s1': ['fri-eve', 'fri-pm', 'mon-eve'], 's2': ['sat', 'fri'], 's3': ['sun-am']}],\n   []),\n  ('normal control 6',\n   [[['s1', 'HIST140', 1], ['s3', 'MATH101', 0]],\n    [[0, 'eve'], [2, 'pm'], [4, 'pm'], [5, 'pm'], [2, 'pm'], [6, 'pm']],\n    {'s1': ['sun-am', 'sat'], 's2': ['fri', 'mon-eve', 'fri-eve']}],\n   []),\n  ('normal control 7',\n   [[['s3', 'MATH101', 3]], [[3, 'pm'], [3, 'eve'], [0, 'eve'], [4, 'pm'], [0, 'pm'], [3, 'pm']],\n    {'s1': ['sat', 'fri-eve', 'fri']}],\n   []),\n  ('normal control 8',\n   [[['s1', 'CHEM120', 4], ['s3', 'HIST140', 4], ['s2', 'HIST140', 5], ['s2', 'BIO130', 5],\n     ['s2', 'BIO130', 3], ['s1', 'MATH101', 3]],\n    [[5, 'eve'], [2, 'pm'], [1, 'am'], [2, 'am'], [2, 'pm'], [1, 'pm']], {'s3': ['fri-eve']}],\n   [])],\n [('regression: one row per sitting 1',\n   [[['s1', 'MATH101', 5], ['s2', 'BIO130', 3], ['s3', 'MATH101H', 0], ['s3', 'CHEM120', 4],\n     ['s1', 'MATH101H', 4], ['s2', 'PHYS110', 5]],\n    [[4, 'eve'], [3, 'pm'], [1, 'eve'], [0, 'eve'], [4, 'pm'], [0, 'am']],\n    {'s2': ['sat', 'fri-pm'], 's3': ['fri-eve', 'fri']}],\n   [['s3', 'CHEM120', 4], ['s3', 'MATH101H', 0]]),\n  ('regression variant: one row per sitting 2',\n   [[['s2', 'MATH101H', 3], ['s1', 'CHEM120', 1], ['s1', 'CHEM120', 3], ['s2', 'MATH101', 0],\n     ['s1', 'BIO130', 0], ['s3', 'MATH101', 1]],\n    [[4, 'eve'], [3, 'pm'], [4, 'eve'], [1, 'am'], [3, 'pm'], [6, 'eve']],\n    {'s1': ['fri-eve', 'sun-am', 'fri'], 's2': ['fri-eve'], 's3': ['fri-eve', 'mon-eve', 'fri-pm']}],\n   [['s1', 'BIO130', 0], ['s2', 'MATH101', 0]]),\n  ('partial repair guard 3',\n   [[['s3', 'ECON150', 5], ['s3', 'CHEM120', 0], ['s3', 'CHEM120', 0]],\n    [[5, 'pm'], [4, 'eve'], [0, 'eve'], [3, 'eve'], [4, 'am'], [1, 'eve']],\n    {'s2': ['sun-am'], 's3': ['sat', 'mon-eve']}],\n   [['s3', 'CHEM120', 0], ['s3', 'CHEM120', 0]]),\n  ('boundary control 4', [[['s1', 'A', 0]], [[0, 'am']], {'s1': ['sun']}], []),\n  ('normal control 5',\n   [[['s2', 'ECON150', 5], ['s1', 'ECON150', 2], ['s2', 'HIST140', 0], ['s2', 'PHYS110', 2],\n     ['s1', 'HIST140', 3]],\n    [[2, 'pm'], [5, 'pm'], [3, 'am'], [6, 'am'], [0, 'am'], [3, 'am']],\n    {'s1': ['fri-eve'], 's2': ['fri-eve', 'sun-am']}],\n   []),\n  ('normal control 6',\n   [[['s3', 'CHEM120', 1], ['s3', 'BIO130', 1], ['s1', 'HIST140', 5], ['s2', 'MATH101H', 0],\n     ['s1', 'CHEM120', 0]],\n    [[3, 'pm'], [3, 'eve'], [1, 'eve'], [0, 'pm'], [5, 'pm'], [2, 'am']],\n    {'s1': ['sun-am', 'fri-eve'], 's2': ['mon-eve', 'sat'], 's3': ['fri-eve', 'fri']}],\n   []),\n  ('normal control 7',\n   [[['s2', 'MATH101H', 2], ['s2', 'CHEM120', 1], ['s1', 'MATH101H', 1], ['s2', 'MATH101H', 1],\n     ['s3', 'MATH101H', 2], ['s3', 'BIO130', 5]],\n    [[0, 'pm'], [0, 'am'], [3, 'eve'], [4, 'am'], [3, 'pm'], [5, 'pm']],\n    {'s1': ['mon-eve', 'sat'], 's3': ['sat']}],\n   [['s3', 'BIO130', 5]]),\n  ('normal control 8',\n   [[['s1', 'ECON150', 0], ['s2', 'HIST140', 4]],\n    [[3, 'pm'], [4, 'pm'], [5, 'am'], [5, 'eve'], [5, 'am'], [5, 'eve']],\n    {'s1': ['sat', 'mon-eve', 'fri'], 's3': ['fri-pm', 'fri', 'sun-am']}],\n   [])],\n [('regression: one row per sitting 1',\n   [[['s1', 'PHYS110', 2], ['s2', 'BIO130', 0], ['s2', 'ECON150', 3], ['s2', 'ECON150', 5]],\n    [[3, 'am'], [2, 'pm'], [4, 'am'], [4, 'eve'], [4, 'eve'], [5, 'am']],\n    {'s2': ['sun-am', 'fri-pm', 'fri'], 's3': ['sat', 'sun-am']}],\n   [['s2', 'ECON150', 3]]),\n  ('partial repair guard 2',\n   [[['s1', 'MATH101H', 1], ['s3', 'MATH101', 0], ['s3', 'MATH101', 0], ['s2', 'PHYS110', 4],\n     ['s2', 'BIO130', 1]],\n    [[6, 'eve'], [5, 'am'], [5, 'eve'], [0, 'pm'], [5, 'am'], [0, 'pm']],\n    {'s1': ['sat', 'mon-eve'], 's2': ['fri'], 's3': ['fri-pm', 'sun-am']}],\n   [['s1', 'MATH101H', 1], ['s3', 'MATH101', 0], ['s3', 'MATH101', 0]]),\n  ('boundary control 3', [[['s1', 'A', 0]], [[5, 'am']], {'s1': ['sat', 'fri-pm']}], [['s1', 'A', 0]]),\n  ('normal control 4',\n   [[['s3', 'ECON150', 3]], [[0, 'eve'], [4, 'eve'], [2, 'eve'], [0, 'am'], [4, 'pm'], [6, 'pm']],\n    {'s1': ['fri-eve', 'sun-am'], 's2': ['fri', 'sat', 'fri-eve'], 's3': ['fri-eve', 'mon-eve', 'sat']}],\n   []),\n  ('normal control 5',\n   [[['s3', 'BIO130', 0], ['s1', 'HIST140', 5]],\n    [[2, 'pm'], [1, 'eve'], [1, 'eve'], [0, 'pm'], [0, 'am'], [0, 'eve']],\n    {'s1': ['mon-eve', 'fri-pm'], 's2': ['fri-pm', 'sat'], 's3': ['fri-eve']}],\n   [['s1', 'HIST140', 5]]),\n  ('normal control 6',\n   [[['s2', 'CHEM120', 0], ['s2', 'MATH101', 3], ['s1', 'HIST140', 2], ['s1', 'MATH101H', 1],\n     ['s2', 'PHYS110', 1], ['s3', 'PHYS110', 3]],\n    [[1, 'pm'], [4, 'pm'], [4, 'am'], [3, 'am'], [3, 'eve'], [3, 'eve']], {'s1': ['mon-eve']}],\n   []),\n  ('normal control 7',\n   [[['s1', 'HIST140', 4]], [[4, 'eve'], [3, 'am'], [5, 'eve'], [6, 'pm'], [6, 'eve'], [6, 'pm']],\n    {'s1': ['fri-pm', 'fri-eve', 'sun-am'], 's2': ['mon-eve', 'fri'], 's3': ['fri', 'fri-eve']}],\n   [['s1', 'HIST140', 4]]),\n  ('normal control 8',\n   [[['s1', 'MATH101', 3], ['s3', 'BIO130', 1]],\n    [[0, 'pm'], [2, 'pm'], [2, 'pm'], [4, 'pm'], [0, 'eve'], [5, 'eve']],\n    {'s1': ['mon-eve'], 's2': ['fri', 'sat'], 's3': ['fri-pm', 'sun-am']}],\n   [])],\n [('regression: one row per sitting 1',\n   [[['s1', 'ECON150', 0], ['s2', 'ECON150', 3], ['s2', 'ECON150', 5]],\n    [[4, 'am'], [4, 'eve'], [3, 'am'], [4, 'eve'], [0, 'pm'], [2, 'am']],\n    {'s1': ['sun-am', 'fri-pm'], 's2': ['mon-eve', 'fri', 'fri-pm'], 's3': ['sat', 'sun-am']}],\n   [['s2', 'ECON150', 3]]),\n  ('regression variant: one row per sitting 2',\n   [[['s2', 'MATH101H', 3], ['s1', 'CHEM120', 1], ['s1', 'CHEM120', 3], ['s2', 'MATH101', 0],\n     ['s1', 'BIO130', 0], ['s3', 'MATH101', 1]],\n    [[4, 'eve'], [3, 'pm'], [4, 'eve'], [1, 'am'], [3, 'pm'], [6, 'eve']],\n    {'s1': ['fri-eve', 'sun-am', 'fri'], 's2': ['fri-eve'], 's3': ['fri-eve', 'mon-eve', 'fri-pm']}],\n   [['s1', 'BIO130', 0], ['s2', 'MATH101', 0]]),\n  ('partial repair guard 3',\n   [[['s3', 'ECON150', 0], ['s3', 'ECON150', 0]],\n    [[4, 'pm'], [2, 'eve'], [6, 'am'], [6, 'am'], [5, 'eve'], [6, 'eve']],\n    {'s1': ['sun-am', 'fri'], 's2': ['fri-eve', 'fri'], 's3': ['fri-pm']}],\n   [['s3', 'ECON150', 0], ['s3', 'ECON150', 0]]),\n  ('boundary control 4', [[['s1', 'A', 0]], [[4, 'eve']], {'s1': ['fri-pm']}], [['s1', 'A', 0]]),\n  ('normal control 5',\n   [[['s3', 'HIST140', 1], ['s3', 'PHYS110', 4], ['s2', 'CHEM120', 2], ['s2', 'MATH101H', 4],\n     ['s2', 'CHEM120', 1]],\n    [[2, 'pm'], [0, 'pm'], [4, 'eve'], [4, 'pm'], [4, 'pm'], [1, 'am']],\n    {'s1': ['mon-eve'], 's3': ['mon-eve', 'fri-eve']}],\n   []),\n  ('normal control 6',\n   [[['s1', 'CHEM120', 3], ['s1', 'BIO130', 4], ['s2', 'ECON150', 4], ['s1', 'HIST140', 0],\n     ['s1', 'CHEM120', 1]],\n    [[6, 'pm'], [3, 'pm'], [5, 'pm'], [0, 'eve'], [6, 'am'], [1, 'am']],\n    {'s1': ['mon-eve', 'fri', 'sun-am'], 's2': ['sat', 'fri-pm', 'fri']}],\n   [['s1', 'BIO130', 4], ['s1', 'CHEM120', 3], ['s1', 'HIST140', 0]]),\n  ('normal control 7',\n   [[['s3', 'CHEM120', 3], ['s2', 'MATH101', 0], ['s3', 'MATH101', 3], ['s3', 'ECON150', 0]],\n    [[3, 'eve'], [3, 'pm'], [4, 'eve'], [0, 'am'], [0, 'pm'], [6, 'am']],\n    {'s1': ['fri-eve', 'fri', 'sun-am'], 's3': ['fri-eve', 'sun-am', 'sat']}],\n   []),\n  ('normal control 8',\n   [[['s3', 'HIST140', 4]], [[3, 'pm'], [5, 'pm'], [4, 'eve'], [1, 'eve'], [6, 'am'], [1, 'pm']],\n    {'s1': ['fri-pm', 'fri-eve'], 's2': ['fri-eve', 'fri-pm'], 's3': ['mon-eve', 'sun-am']}],\n   [['s3', 'HIST140', 4]])]]\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":"09a62509ca034eff5f350004a60c380ad97e0506994a42aa88b8c09d1f974dff","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(sits, periods, avoid):\n    names = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']\n    order = ['am', 'pm', 'eve']\n    out = []\n    for st, ex, p in sits:\n        wd, slot = periods[p]\n        for rule in avoid.get(st, []):\n            parts = rule.split('-')\n            if parts[0] != names[wd]:\n                continue\n            if len(parts) == 1 or order.index(slot) >= order.index(parts[1]):\n                out.append([st, ex, p])\n    return sorted(out)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: one row per sitting 1', [[['s1', 'A', 0]], [[4, 'eve']], {'s1': ['fri-eve', 'fri-pm']}],\n   [['s1', 'A', 0]]),\n  ('regression variant: one row per sitting 2',\n   [[['s2', 'MATH101H', 3], ['s1', 'CHEM120', 1], ['s1', 'CHEM120', 3], ['s2', 'MATH101', 0],\n     ['s1', 'BIO130', 0], ['s3', 'MATH101', 1]],\n    [[4, 'eve'], [3, 'pm'], [4, 'eve'], [1, 'am'], [3, 'pm'], [6, 'eve']],\n    {'s1': ['fri-eve', 'sun-am', 'fri'], 's2': ['fri-eve'], 's3': ['fri-eve', 'mon-eve', 'fri-pm']}],\n   [['s1', 'BIO130', 0], ['s2', 'MATH101', 0]]),\n  ('partial repair guard 3',\n   [[['s3', 'ECON150', 0], ['s3', 'ECON150', 0]],\n    [[4, 'pm'], [2, 'eve'], [6, 'am'], [6, 'am'], [5, 'eve'], [6, 'eve']],\n    {'s1': ['sun-am', 'fri'], 's2': ['fri-eve', 'fri'], 's3': ['fri-pm']}],\n   [['s3', 'ECON150', 0], ['s3', 'ECON150', 0]]),\n  ('normal control 4',\n   [[['s2', 'ECON150', 4], ['s3', 'MATH101H', 0], ['s1', 'HIST140', 3], ['s1', 'BIO130', 4],\n     ['s2', 'CHEM120', 5], ['s3', 'ECON150', 3]],\n    [[3, 'pm'], [2, 'pm'], [3, 'am'], [3, 'pm'], [3, 'eve'], [5, 'am']],\n    {'s1': ['mon-eve', 'sun-am'], 's2': ['mon-eve'], 's3': ['sat', 'fri-pm', 'fri']}],\n   []),\n  ('normal control 5',\n   [[['s3', 'PHYS110', 5], ['s3', 'ECON150', 5]],\n    [[1, 'eve'], [4, 'am'], [4, 'pm'], [3, 'pm'], [4, 'eve'], [1, 'eve']],\n    {'s1': ['sun-am'], 's2': ['fri'], 's3': ['fri-eve', 'mon-eve', 'sat']}],\n   []),\n  ('normal control 6',\n   [[['s1', 'CHEM120', 4], ['s3', 'HIST140', 3]],\n    [[5, 'pm'], [4, 'am'], [3, 'am'], [2, 'eve'], [4, 'pm'], [1, 'pm']],\n    {'s1': ['fri', 'sun-am', 'mon-eve'], 's2': ['sun-am', 'sat'], 's3': ['fri-pm', 'sat', 'fri']}],\n   [['s1', 'CHEM120', 4]]),\n  ('normal control 7',\n   [[['s3', 'PHYS110', 4], ['s2', 'MATH101H', 5], ['s1', 'HIST140', 0], ['s1', 'ECON150', 5],\n     ['s1', 'BIO130', 5]],\n    [[2, 'pm'], [1, 'am'], [2, 'pm'], [0, 'eve'], [3, 'eve'], [5, 'eve']],\n    {'s1': ['fri', 'mon-eve', 'sun-am']}],\n   []),\n  ('normal control 8',\n   [[['s1', 'CHEM120', 3], ['s3', 'HIST140', 1], ['s1', 'CHEM120', 4], ['s2', 'HIST140', 5]],\n    [[6, 'am'], [3, 'pm'], [4, 'eve'], [1, 'am'], [6, 'eve'], [1, 'pm']],\n    {'s1': ['fri-pm'], 's3': ['mon-eve', 'sat', 'fri-pm']}],\n   [])],\n [('regression: one row per sitting 1',\n   [[['s1', 'HIST140', 2], ['s3', 'MATH101H', 1], ['s1', 'CHEM120', 4], ['s2', 'CHEM120', 4],\n     ['s2', 'MATH101', 4], ['s3', 'MATH101H', 5]],\n    [[0, 'eve'], [4, 'eve'], [4, 'pm'], [4, 'pm'], [5, 'pm'], [0, 'pm']],\n    {'s1': ['fri-eve', 'sat', 'mon-eve'],\n     's2': ['mon-eve', 'fri', 'sun-am'],\n     's3': ['sun-am', 'fri-pm', 'fri']}],\n   [['s1', 'CHEM120', 4], ['s3', 'MATH101H', 1]]),\n  ('regression variant: one row per sitting 2',\n   [[['s1', 'PHYS110', 2], ['s2', 'BIO130', 0], ['s2', 'ECON150', 3], ['s2', 'ECON150', 5]],\n    [[3, 'am'], [2, 'pm'], [4, 'am'], [4, 'eve'], [4, 'eve'], [5, 'am']],\n    {'s2': ['sun-am', 'fri-pm', 'fri'], 's3': ['sat', 'sun-am']}],\n   [['s2', 'ECON150', 3]]),\n  ('partial repair guard 3',\n   [[['s2', 'HIST140', 4], ['s1', 'HIST140', 2], ['s1', 'BIO130', 2], ['s3', 'MATH101', 3],\n     ['s3', 'MATH101', 3]],\n    [[0, 'eve'], [0, 'am'], [4, 'am'], [5, 'pm'], [0, 'eve'], [3, 'pm']],\n    {'s1': ['fri', 'fri-pm'], 's2': ['fri-eve', 'fri'], 's3': ['sat']}],\n   [['s1', 'BIO130', 2], ['s1', 'HIST140', 2], ['s3', 'MATH101', 3], ['s3', 'MATH101', 3]]),\n  ('boundary control 4', [[['s1', 'A', 0]], [[4, 'am']], {'s1': ['fri-pm']}], []),\n  ('normal control 5',\n   [[['s1', 'HIST140', 0], ['s3', 'ECON150', 3]],\n    [[6, 'pm'], [1, 'eve'], [3, 'pm'], [3, 'pm'], [1, 'am'], [4, 'am']],\n    {'s1': ['fri-eve', 'fri-pm', 'mon-eve'], 's2': ['sat', 'fri'], 's3': ['sun-am']}],\n   []),\n  ('normal control 6',\n   [[['s1', 'HIST140', 1], ['s3', 'MATH101', 0]],\n    [[0, 'eve'], [2, 'pm'], [4, 'pm'], [5, 'pm'], [2, 'pm'], [6, 'pm']],\n    {'s1': ['sun-am', 'sat'], 's2': ['fri', 'mon-eve', 'fri-eve']}],\n   []),\n  ('normal control 7',\n   [[['s3', 'MATH101', 3]], [[3, 'pm'], [3, 'eve'], [0, 'eve'], [4, 'pm'], [0, 'pm'], [3, 'pm']],\n    {'s1': ['sat', 'fri-eve', 'fri']}],\n   []),\n  ('normal control 8',\n   [[['s1', 'CHEM120', 4], ['s3', 'HIST140', 4], ['s2', 'HIST140', 5], ['s2', 'BIO130', 5],\n     ['s2', 'BIO130', 3], ['s1', 'MATH101', 3]],\n    [[5, 'eve'], [2, 'pm'], [1, 'am'], [2, 'am'], [2, 'pm'], [1, 'pm']], {'s3': ['fri-eve']}],\n   [])],\n [('regression: one row per sitting 1',\n   [[['s1', 'MATH101', 5], ['s2', 'BIO130', 3], ['s3', 'MATH101H', 0], ['s3', 'CHEM120', 4],\n     ['s1', 'MATH101H', 4], ['s2', 'PHYS110', 5]],\n    [[4, 'eve'], [3, 'pm'], [1, 'eve'], [0, 'eve'], [4, 'pm'], [0, 'am']],\n    {'s2': ['sat', 'fri-pm'], 's3': ['fri-eve', 'fri']}],\n   [['s3', 'CHEM120', 4], ['s3', 'MATH101H', 0]]),\n  ('regression variant: one row per sitting 2',\n   [[['s2', 'MATH101H', 3], ['s1', 'CHEM120', 1], ['s1', 'CHEM120', 3], ['s2', 'MATH101', 0],\n     ['s1', 'BIO130', 0], ['s3', 'MATH101', 1]],\n    [[4, 'eve'], [3, 'pm'], [4, 'eve'], [1, 'am'], [3, 'pm'], [6, 'eve']],\n    {'s1': ['fri-eve', 'sun-am', 'fri'], 's2': ['fri-eve'], 's3': ['fri-eve', 'mon-eve', 'fri-pm']}],\n   [['s1', 'BIO130', 0], ['s2', 'MATH101', 0]]),\n  ('partial repair guard 3',\n   [[['s3', 'ECON150', 5], ['s3', 'CHEM120', 0], ['s3', 'CHEM120', 0]],\n    [[5, 'pm'], [4, 'eve'], [0, 'eve'], [3, 'eve'], [4, 'am'], [1, 'eve']],\n    {'s2': ['sun-am'], 's3': ['sat', 'mon-eve']}],\n   [['s3', 'CHEM120', 0], ['s3', 'CHEM120', 0]]),\n  ('boundary control 4', [[['s1', 'A', 0]], [[0, 'am']], {'s1': ['sun']}], []),\n  ('normal control 5',\n   [[['s2', 'ECON150', 5], ['s1', 'ECON150', 2], ['s2', 'HIST140', 0], ['s2', 'PHYS110', 2],\n     ['s1', 'HIST140', 3]],\n    [[2, 'pm'], [5, 'pm'], [3, 'am'], [6, 'am'], [0, 'am'], [3, 'am']],\n    {'s1': ['fri-eve'], 's2': ['fri-eve', 'sun-am']}],\n   []),\n  ('normal control 6',\n   [[['s3', 'CHEM120', 1], ['s3', 'BIO130', 1], ['s1', 'HIST140', 5], ['s2', 'MATH101H', 0],\n     ['s1', 'CHEM120', 0]],\n    [[3, 'pm'], [3, 'eve'], [1, 'eve'], [0, 'pm'], [5, 'pm'], [2, 'am']],\n    {'s1': ['sun-am', 'fri-eve'], 's2': ['mon-eve', 'sat'], 's3': ['fri-eve', 'fri']}],\n   []),\n  ('normal control 7',\n   [[['s2', 'MATH101H', 2], ['s2', 'CHEM120', 1], ['s1', 'MATH101H', 1], ['s2', 'MATH101H', 1],\n     ['s3', 'MATH101H', 2], ['s3', 'BIO130', 5]],\n    [[0, 'pm'], [0, 'am'], [3, 'eve'], [4, 'am'], [3, 'pm'], [5, 'pm']],\n    {'s1': ['mon-eve', 'sat'], 's3': ['sat']}],\n   [['s3', 'BIO130', 5]]),\n  ('normal control 8',\n   [[['s1', 'ECON150', 0], ['s2', 'HIST140', 4]],\n    [[3, 'pm'], [4, 'pm'], [5, 'am'], [5, 'eve'], [5, 'am'], [5, 'eve']],\n    {'s1': ['sat', 'mon-eve', 'fri'], 's3': ['fri-pm', 'fri', 'sun-am']}],\n   [])],\n [('regression: one row per sitting 1',\n   [[['s1', 'PHYS110', 2], ['s2', 'BIO130', 0], ['s2', 'ECON150', 3], ['s2', 'ECON150', 5]],\n    [[3, 'am'], [2, 'pm'], [4, 'am'], [4, 'eve'], [4, 'eve'], [5, 'am']],\n    {'s2': ['sun-am', 'fri-pm', 'fri'], 's3': ['sat', 'sun-am']}],\n   [['s2', 'ECON150', 3]]),\n  ('partial repair guard 2',\n   [[['s1', 'MATH101H', 1], ['s3', 'MATH101', 0], ['s3', 'MATH101', 0], ['s2', 'PHYS110', 4],\n     ['s2', 'BIO130', 1]],\n    [[6, 'eve'], [5, 'am'], [5, 'eve'], [0, 'pm'], [5, 'am'], [0, 'pm']],\n    {'s1': ['sat', 'mon-eve'], 's2': ['fri'], 's3': ['fri-pm', 'sun-am']}],\n   [['s1', 'MATH101H', 1], ['s3', 'MATH101', 0], ['s3', 'MATH101', 0]]),\n  ('boundary control 3', [[['s1', 'A', 0]], [[5, 'am']], {'s1': ['sat', 'fri-pm']}], [['s1', 'A', 0]]),\n  ('normal control 4',\n   [[['s3', 'ECON150', 3]], [[0, 'eve'], [4, 'eve'], [2, 'eve'], [0, 'am'], [4, 'pm'], [6, 'pm']],\n    {'s1': ['fri-eve', 'sun-am'], 's2': ['fri', 'sat', 'fri-eve'], 's3': ['fri-eve', 'mon-eve', 'sat']}],\n   []),\n  ('normal control 5',\n   [[['s3', 'BIO130', 0], ['s1', 'HIST140', 5]],\n    [[2, 'pm'], [1, 'eve'], [1, 'eve'], [0, 'pm'], [0, 'am'], [0, 'eve']],\n    {'s1': ['mon-eve', 'fri-pm'], 's2': ['fri-pm', 'sat'], 's3': ['fri-eve']}],\n   [['s1', 'HIST140', 5]]),\n  ('normal control 6',\n   [[['s2', 'CHEM120', 0], ['s2', 'MATH101', 3], ['s1', 'HIST140', 2], ['s1', 'MATH101H', 1],\n     ['s2', 'PHYS110', 1], ['s3', 'PHYS110', 3]],\n    [[1, 'pm'], [4, 'pm'], [4, 'am'], [3, 'am'], [3, 'eve'], [3, 'eve']], {'s1': ['mon-eve']}],\n   []),\n  ('normal control 7',\n   [[['s1', 'HIST140', 4]], [[4, 'eve'], [3, 'am'], [5, 'eve'], [6, 'pm'], [6, 'eve'], [6, 'pm']],\n    {'s1': ['fri-pm', 'fri-eve', 'sun-am'], 's2': ['mon-eve', 'fri'], 's3': ['fri', 'fri-eve']}],\n   [['s1', 'HIST140', 4]]),\n  ('normal control 8',\n   [[['s1', 'MATH101', 3], ['s3', 'BIO130', 1]],\n    [[0, 'pm'], [2, 'pm'], [2, 'pm'], [4, 'pm'], [0, 'eve'], [5, 'eve']],\n    {'s1': ['mon-eve'], 's2': ['fri', 'sat'], 's3': ['fri-pm', 'sun-am']}],\n   [])],\n [('regression: one row per sitting 1',\n   [[['s1', 'ECON150', 0], ['s2', 'ECON150', 3], ['s2', 'ECON150', 5]],\n    [[4, 'am'], [4, 'eve'], [3, 'am'], [4, 'eve'], [0, 'pm'], [2, 'am']],\n    {'s1': ['sun-am', 'fri-pm'], 's2': ['mon-eve', 'fri', 'fri-pm'], 's3': ['sat', 'sun-am']}],\n   [['s2', 'ECON150', 3]]),\n  ('regression variant: one row per sitting 2',\n   [[['s2', 'MATH101H', 3], ['s1', 'CHEM120', 1], ['s1', 'CHEM120', 3], ['s2', 'MATH101', 0],\n     ['s1', 'BIO130', 0], ['s3', 'MATH101', 1]],\n    [[4, 'eve'], [3, 'pm'], [4, 'eve'], [1, 'am'], [3, 'pm'], [6, 'eve']],\n    {'s1': ['fri-eve', 'sun-am', 'fri'], 's2': ['fri-eve'], 's3': ['fri-eve', 'mon-eve', 'fri-pm']}],\n   [['s1', 'BIO130', 0], ['s2', 'MATH101', 0]]),\n  ('partial repair guard 3',\n   [[['s3', 'ECON150', 0], ['s3', 'ECON150', 0]],\n    [[4, 'pm'], [2, 'eve'], [6, 'am'], [6, 'am'], [5, 'eve'], [6, 'eve']],\n    {'s1': ['sun-am', 'fri'], 's2': ['fri-eve', 'fri'], 's3': ['fri-pm']}],\n   [['s3', 'ECON150', 0], ['s3', 'ECON150', 0]]),\n  ('boundary control 4', [[['s1', 'A', 0]], [[4, 'eve']], {'s1': ['fri-pm']}], [['s1', 'A', 0]]),\n  ('normal control 5',\n   [[['s3', 'HIST140', 1], ['s3', 'PHYS110', 4], ['s2', 'CHEM120', 2], ['s2', 'MATH101H', 4],\n     ['s2', 'CHEM120', 1]],\n    [[2, 'pm'], [0, 'pm'], [4, 'eve'], [4, 'pm'], [4, 'pm'], [1, 'am']],\n    {'s1': ['mon-eve'], 's3': ['mon-eve', 'fri-eve']}],\n   []),\n  ('normal control 6',\n   [[['s1', 'CHEM120', 3], ['s1', 'BIO130', 4], ['s2', 'ECON150', 4], ['s1', 'HIST140', 0],\n     ['s1', 'CHEM120', 1]],\n    [[6, 'pm'], [3, 'pm'], [5, 'pm'], [0, 'eve'], [6, 'am'], [1, 'am']],\n    {'s1': ['mon-eve', 'fri', 'sun-am'], 's2': ['sat', 'fri-pm', 'fri']}],\n   [['s1', 'BIO130', 4], ['s1', 'CHEM120', 3], ['s1', 'HIST140', 0]]),\n  ('normal control 7',\n   [[['s3', 'CHEM120', 3], ['s2', 'MATH101', 0], ['s3', 'MATH101', 3], ['s3', 'ECON150', 0]],\n    [[3, 'eve'], [3, 'pm'], [4, 'eve'], [0, 'am'], [0, 'pm'], [6, 'am']],\n    {'s1': ['fri-eve', 'fri', 'sun-am'], 's3': ['fri-eve', 'sun-am', 'sat']}],\n   []),\n  ('normal control 8',\n   [[['s3', 'HIST140', 4]], [[3, 'pm'], [5, 'pm'], [4, 'eve'], [1, 'eve'], [6, 'am'], [1, 'pm']],\n    {'s1': ['fri-pm', 'fri-eve'], 's2': ['fri-eve', 'fri-pm'], 's3': ['mon-eve', 'sun-am']}],\n   [['s3', 'HIST140', 4]])]]\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 exam-timetabling rule set for a bounded model; it does not claim conformance with any institution's regulations or a benchmark specification, and it performs no search or optimisation. 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-exam-timetabling-constraints-observance-unavailability-one-row-per-sitting","generated_at":"2026-09-29T14:52:07.121338+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Religious-observance and other unavailability constraints are student-specific hard constraints.","root_cause":"Rule matching continues after the first match.","sha256":"b8433e100d604029696ed63ed6cf50566dd4da5409d93243e4879b60f8b34f5a","title":"Sitting reported once per matching rule · 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":43.81,"exit_code":1,"observations":[{"actual":[["s1","A",0]],"check":"regression: one row per sitting 1","expected":[["s1","A",0]],"passed":true},{"actual":[["s1","BIO130",0],["s2","MATH101",0]],"check":"regression variant: one row per sitting 2","expected":[["s1","BIO130",0],["s2","MATH101",0]],"passed":true},{"actual":[["s3","ECON150",0]],"check":"partial repair guard 3","expected":[["s3","ECON150",0],["s3","ECON150",0]],"passed":false},{"actual":[],"check":"normal control 4","expected":[],"passed":true},{"actual":[],"check":"normal control 5","expected":[],"passed":true},{"actual":[["s1","CHEM120",4]],"check":"normal control 6","expected":[["s1","CHEM120",4]],"passed":true},{"actual":[],"check":"normal control 7","expected":[],"passed":true},{"actual":[],"check":"normal control 8","expected":[],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: one row per sitting 1\", \"actual\": [[\"s1\", \"A\", 0]], \"expected\": [[\"s1\", \"A\", 0]], \"passed\": true}, {\"check\": \"regression variant: one row per sitting 2\", \"actual\": [[\"s1\", \"BIO130\", 0], [\"s2\", \"MATH101\", 0]], \"expected\": [[\"s1\", \"BIO130\", 0], [\"s2\", \"MATH101\", 0]], \"passed\": true}, {\"check\": \"partial repair guard 3\", \"actual\": [[\"s3\", \"ECON150\", 0]], \"expected\": [[\"s3\", \"ECON150\", 0], [\"s3\", \"ECON150\", 0]], \"passed\": false}, {\"check\": \"normal control 4\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"normal control 5\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"normal control 6\", \"actual\": [[\"s1\", \"CHEM120\", 4]], \"expected\": [[\"s1\", \"CHEM120\", 4]], \"passed\": true}, {\"check\": \"normal control 7\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"normal control 8\", \"actual\": [], \"expected\": [], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.555,"exit_code":1,"observations":[{"actual":[["s1","A",0],["s1","A",0]],"check":"regression: one row per sitting 1","expected":[["s1","A",0]],"passed":false},{"actual":[["s1","BIO130",0],["s1","BIO130",0],["s2","MATH101",0]],"check":"regression variant: one row per sitting 2","expected":[["s1","BIO130",0],["s2","MATH101",0]],"passed":false},{"actual":[["s3","ECON150",0],["s3","ECON150",0]],"check":"partial repair guard 3","expected":[["s3","ECON150",0],["s3","ECON150",0]],"passed":true},{"actual":[],"check":"normal control 4","expected":[],"passed":true},{"actual":[],"check":"normal control 5","expected":[],"passed":true},{"actual":[["s1","CHEM120",4]],"check":"normal control 6","expected":[["s1","CHEM120",4]],"passed":true},{"actual":[],"check":"normal control 7","expected":[],"passed":true},{"actual":[],"check":"normal control 8","expected":[],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: one row per sitting 1\", \"actual\": [[\"s1\", \"A\", 0], [\"s1\", \"A\", 0]], \"expected\": [[\"s1\", \"A\", 0]], \"passed\": false}, {\"check\": \"regression variant: one row per sitting 2\", \"actual\": [[\"s1\", \"BIO130\", 0], [\"s1\", \"BIO130\", 0], [\"s2\", \"MATH101\", 0]], \"expected\": [[\"s1\", \"BIO130\", 0], [\"s2\", \"MATH101\", 0]], \"passed\": false}, {\"check\": \"partial repair guard 3\", \"actual\": [[\"s3\", \"ECON150\", 0], [\"s3\", \"ECON150\", 0]], \"expected\": [[\"s3\", \"ECON150\", 0], [\"s3\", \"ECON150\", 0]], \"passed\": true}, {\"check\": \"normal control 4\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"normal control 5\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"normal control 6\", \"actual\": [[\"s1\", \"CHEM120\", 4]], \"expected\": [[\"s1\", \"CHEM120\", 4]], \"passed\": true}, {\"check\": \"normal control 7\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"normal control 8\", \"actual\": [], \"expected\": [], \"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."}}