{"abstract":"An evening exam followed by the next day's first exam is not reported.","category":"Exam timetabling constraints","checks":8,"contract":"sits [student, period] with spd periods per day (day = p // spd). Report [\"day\", student, day] when a student has more than maxday distinct periods on a day, and [\"eve_morn\", student, day] when a student sits the last period of a day and the first period of the next day. Rows by student: day findings by day, then evening-morning findings.","contract_signature":"sits, spd, maxday","evaluation_group":"w2-exam-timetabling-constraints-daily-limit-and-evening-morning","failed_approach":"Also accepting p + 2 reports evening-then-midday sequences.","family":"w2-exam-timetabling-constraints-daily-limit-and-evening-morning-next-morning-period","id":"FA-94791","implementations":{"attempt":{"sha256":"65938d1b71bbbc395908f9ab2621fe90ad1eedb29e9a506d0dea49b81f5c04c0","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(sits, spd, maxday):\n    by = {}\n    for st, p in sits:\n        by.setdefault(st, set()).add(p)\n    out = []\n    for st in sorted(by):\n        ps = by[st]\n        days = {}\n        for p in ps:\n            days[p // spd] = days.get(p // spd, 0) + 1\n        for d in sorted(days):\n            if days[d] > maxday:\n                out.append(['day', st, d])\n        for p in sorted(ps):\n            if p % spd == spd - 1 and (p + 1 in ps or p + 2 in ps):\n                out.append(['eve_morn', st, p // spd])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: next morning period 1', [[['s1', 2], ['s1', 3]], 3, 2], [['eve_morn', 's1', 0]]),\n  ('regression variant: next morning period 2',\n   [[['s2', 8], ['s3', 2], ['s2', 1], ['s2', 1], ['s3', 3]], 3, 1], [['eve_morn', 's3', 0]]),\n  ('partial repair guard 3',\n   [[['s1', 3], ['s3', 7], ['s3', 11], ['s3', 9], ['s2', 0], ['s1', 6], ['s3', 7], ['s1', 6]], 4, 2], []),\n  ('boundary control 4', [[['s1', 0], ['s1', 1], ['s1', 2]], 3, 2], [['day', 's1', 0]]),\n  ('normal control 5', [[['s2', 3], ['s1', 6]], 3, 2], []),\n  ('normal control 6', [[['s1', 3], ['s3', 2], ['s3', 2]], 4, 1], []),\n  ('normal control 7', [[['s3', 2], ['s1', 4], ['s3', 11], ['s1', 3], ['s1', 11]], 4, 2],\n   [['eve_morn', 's1', 0]]),\n  ('normal control 8', [[['s3', 0], ['s3', 0], ['s1', 1], ['s3', 3], ['s1', 0]], 2, 2], [])],\n [('regression: next morning period 1', [[['s1', 5], ['s1', 6]], 3, 2], [['eve_morn', 's1', 1]]),\n  ('regression variant: next morning period 2',\n   [[['s1', 7], ['s3', 8], ['s1', 9], ['s1', 11], ['s1', 4], ['s3', 6], ['s3', 7]], 4, 1],\n   [['day', 's1', 1], ['day', 's1', 2], ['day', 's3', 1], ['eve_morn', 's3', 1]]),\n  ('partial repair guard 3',\n   [[['s2', 4], ['s2', 9], ['s1', 10], ['s1', 10], ['s2', 11], ['s2', 1], ['s2', 7], ['s3', 7]], 4, 1],\n   [['day', 's2', 1], ['day', 's2', 2]]),\n  ('boundary control 4', [[['s1', 1], ['s1', 2]], 3, 2], []),\n  ('normal control 5', [[['s3', 2], ['s2', 2], ['s1', 6], ['s2', 4], ['s2', 4], ['s2', 8], ['s1', 2]], 3, 1],\n   []),\n  ('normal control 6', [[['s3', 5], ['s3', 5]], 3, 2], []),\n  ('normal control 7', [[['s2', 2], ['s1', 8], ['s3', 1], ['s3', 5], ['s2', 0], ['s1', 1]], 3, 1],\n   [['day', 's2', 0]]),\n  ('normal control 8', [[['s1', 1], ['s2', 1], ['s2', 2], ['s1', 1], ['s3', 8]], 3, 1], [['day', 's2', 0]])],\n [('regression: next morning period 1', [[['s3', 3], ['s1', 1], ['s2', 7], ['s3', 5], ['s3', 8]], 3, 1],\n   [['day', 's3', 1]]),\n  ('regression variant: next morning period 2', [[['s2', 3], ['s1', 4], ['s2', 4]], 2, 2],\n   [['eve_morn', 's2', 1]]),\n  ('partial repair guard 3', [[['s2', 4], ['s1', 1], ['s2', 5], ['s2', 7]], 3, 1], [['day', 's2', 1]]),\n  ('boundary control 4', [[['s1', 5], ['s1', 6]], 3, 2], [['eve_morn', 's1', 1]]),\n  ('normal control 5', [[['s1', 0], ['s1', 6], ['s1', 0], ['s2', 5], ['s2', 5], ['s3', 0]], 4, 1], []),\n  ('normal control 6', [[['s2', 3], ['s3', 4], ['s3', 0], ['s2', 3], ['s2', 2]], 2, 1], [['day', 's2', 1]]),\n  ('normal control 7', [[['s3', 1], ['s3', 5]], 3, 2], []),\n  ('normal control 8',\n   [[['s2', 3], ['s3', 5], ['s3', 2], ['s3', 0], ['s2', 1], ['s1', 2], ['s3', 1], ['s3', 4]], 2, 2],\n   [['eve_morn', 's3', 0]])],\n [('regression: next morning period 1',\n   [[['s1', 5], ['s3', 2], ['s1', 5], ['s2', 5], ['s1', 3], ['s1', 1], ['s1', 4]], 2, 1],\n   [['day', 's1', 2], ['eve_morn', 's1', 1]]),\n  ('regression variant: next morning period 2', [[['s1', 3], ['s3', 2], ['s1', 1], ['s3', 2]], 2, 2], []),\n  ('partial repair guard 3',\n   [[['s1', 1], ['s3', 3], ['s1', 4], ['s3', 6], ['s1', 8], ['s2', 5], ['s1', 2], ['s3', 0]], 3, 2], []),\n  ('boundary control 4', [[['s1', 0], ['s1', 1]], 3, 2], []),\n  ('normal control 5', [[['s3', 0], ['s2', 1], ['s1', 3], ['s2', 5], ['s3', 1], ['s3', 3]], 2, 1],\n   [['day', 's3', 0]]),\n  ('normal control 6', [[['s3', 4], ['s2', 5], ['s3', 6], ['s3', 5], ['s2', 0], ['s3', 4], ['s1', 0]], 3, 2],\n   [['eve_morn', 's3', 1]]),\n  ('normal control 7', [[['s1', 1], ['s1', 2]], 4, 1], [['day', 's1', 0]]),\n  ('normal control 8', [[['s3', 4], ['s2', 8], ['s3', 1], ['s1', 1], ['s2', 3]], 3, 1], [])],\n [('regression: next morning period 1',\n   [[['s3', 1], ['s2', 4], ['s1', 11], ['s1', 7], ['s2', 1], ['s2', 5], ['s3', 2], ['s3', 4]], 4, 1],\n   [['day', 's2', 1], ['day', 's3', 0]]),\n  ('regression variant: next morning period 2',\n   [[['s1', 2], ['s2', 6], ['s3', 4], ['s3', 4], ['s1', 5], ['s3', 8], ['s3', 2], ['s1', 6]], 3, 2],\n   [['eve_morn', 's1', 1]]),\n  ('partial repair guard 3',\n   [[['s2', 0], ['s3', 2], ['s1', 3], ['s2', 3], ['s2', 5], ['s3', 0], ['s1', 4], ['s3', 0]], 2, 2],\n   [['eve_morn', 's1', 1]]),\n  ('boundary control 4', [[['s1', 2], ['s1', 3]], 3, 2], [['eve_morn', 's1', 0]]),\n  ('normal control 5',\n   [[['s2', 5], ['s2', 1], ['s1', 2], ['s2', 3], ['s1', 4], ['s2', 1], ['s3', 2], ['s2', 0]], 2, 1],\n   [['day', 's2', 0]]),\n  ('normal control 6', [[['s1', 3], ['s3', 2], ['s1', 3]], 3, 1], []),\n  ('normal control 7', [[['s1', 4], ['s1', 0], ['s1', 3], ['s1', 0], ['s1', 2], ['s3', 4], ['s2', 2]], 2, 1],\n   [['day', 's1', 1], ['eve_morn', 's1', 1]]),\n  ('normal control 8', [[['s1', 3], ['s3', 2], ['s1', 1], ['s3', 2]], 2, 2], [])]]\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":"1767dceb7f74dced61a0e2e615aeecced7042686322a5e398d8b18f029f07fd5","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(sits, spd, maxday):\n    by = {}\n    for st, p in sits:\n        by.setdefault(st, set()).add(p)\n    out = []\n    for st in sorted(by):\n        ps = by[st]\n        days = {}\n        for p in ps:\n            days[p // spd] = days.get(p // spd, 0) + 1\n        for d in sorted(days):\n            if days[d] > maxday:\n                out.append(['day', st, d])\n        for p in sorted(ps):\n            if p % spd == spd - 1 and p + spd in ps:\n                out.append(['eve_morn', st, p // spd])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: next morning period 1', [[['s1', 2], ['s1', 3]], 3, 2], [['eve_morn', 's1', 0]]),\n  ('regression variant: next morning period 2',\n   [[['s2', 8], ['s3', 2], ['s2', 1], ['s2', 1], ['s3', 3]], 3, 1], [['eve_morn', 's3', 0]]),\n  ('partial repair guard 3',\n   [[['s1', 3], ['s3', 7], ['s3', 11], ['s3', 9], ['s2', 0], ['s1', 6], ['s3', 7], ['s1', 6]], 4, 2], []),\n  ('boundary control 4', [[['s1', 0], ['s1', 1], ['s1', 2]], 3, 2], [['day', 's1', 0]]),\n  ('normal control 5', [[['s2', 3], ['s1', 6]], 3, 2], []),\n  ('normal control 6', [[['s1', 3], ['s3', 2], ['s3', 2]], 4, 1], []),\n  ('normal control 7', [[['s3', 2], ['s1', 4], ['s3', 11], ['s1', 3], ['s1', 11]], 4, 2],\n   [['eve_morn', 's1', 0]]),\n  ('normal control 8', [[['s3', 0], ['s3', 0], ['s1', 1], ['s3', 3], ['s1', 0]], 2, 2], [])],\n [('regression: next morning period 1', [[['s1', 5], ['s1', 6]], 3, 2], [['eve_morn', 's1', 1]]),\n  ('regression variant: next morning period 2',\n   [[['s1', 7], ['s3', 8], ['s1', 9], ['s1', 11], ['s1', 4], ['s3', 6], ['s3', 7]], 4, 1],\n   [['day', 's1', 1], ['day', 's1', 2], ['day', 's3', 1], ['eve_morn', 's3', 1]]),\n  ('partial repair guard 3',\n   [[['s2', 4], ['s2', 9], ['s1', 10], ['s1', 10], ['s2', 11], ['s2', 1], ['s2', 7], ['s3', 7]], 4, 1],\n   [['day', 's2', 1], ['day', 's2', 2]]),\n  ('boundary control 4', [[['s1', 1], ['s1', 2]], 3, 2], []),\n  ('normal control 5', [[['s3', 2], ['s2', 2], ['s1', 6], ['s2', 4], ['s2', 4], ['s2', 8], ['s1', 2]], 3, 1],\n   []),\n  ('normal control 6', [[['s3', 5], ['s3', 5]], 3, 2], []),\n  ('normal control 7', [[['s2', 2], ['s1', 8], ['s3', 1], ['s3', 5], ['s2', 0], ['s1', 1]], 3, 1],\n   [['day', 's2', 0]]),\n  ('normal control 8', [[['s1', 1], ['s2', 1], ['s2', 2], ['s1', 1], ['s3', 8]], 3, 1], [['day', 's2', 0]])],\n [('regression: next morning period 1', [[['s3', 3], ['s1', 1], ['s2', 7], ['s3', 5], ['s3', 8]], 3, 1],\n   [['day', 's3', 1]]),\n  ('regression variant: next morning period 2', [[['s2', 3], ['s1', 4], ['s2', 4]], 2, 2],\n   [['eve_morn', 's2', 1]]),\n  ('partial repair guard 3', [[['s2', 4], ['s1', 1], ['s2', 5], ['s2', 7]], 3, 1], [['day', 's2', 1]]),\n  ('boundary control 4', [[['s1', 5], ['s1', 6]], 3, 2], [['eve_morn', 's1', 1]]),\n  ('normal control 5', [[['s1', 0], ['s1', 6], ['s1', 0], ['s2', 5], ['s2', 5], ['s3', 0]], 4, 1], []),\n  ('normal control 6', [[['s2', 3], ['s3', 4], ['s3', 0], ['s2', 3], ['s2', 2]], 2, 1], [['day', 's2', 1]]),\n  ('normal control 7', [[['s3', 1], ['s3', 5]], 3, 2], []),\n  ('normal control 8',\n   [[['s2', 3], ['s3', 5], ['s3', 2], ['s3', 0], ['s2', 1], ['s1', 2], ['s3', 1], ['s3', 4]], 2, 2],\n   [['eve_morn', 's3', 0]])],\n [('regression: next morning period 1',\n   [[['s1', 5], ['s3', 2], ['s1', 5], ['s2', 5], ['s1', 3], ['s1', 1], ['s1', 4]], 2, 1],\n   [['day', 's1', 2], ['eve_morn', 's1', 1]]),\n  ('regression variant: next morning period 2', [[['s1', 3], ['s3', 2], ['s1', 1], ['s3', 2]], 2, 2], []),\n  ('partial repair guard 3',\n   [[['s1', 1], ['s3', 3], ['s1', 4], ['s3', 6], ['s1', 8], ['s2', 5], ['s1', 2], ['s3', 0]], 3, 2], []),\n  ('boundary control 4', [[['s1', 0], ['s1', 1]], 3, 2], []),\n  ('normal control 5', [[['s3', 0], ['s2', 1], ['s1', 3], ['s2', 5], ['s3', 1], ['s3', 3]], 2, 1],\n   [['day', 's3', 0]]),\n  ('normal control 6', [[['s3', 4], ['s2', 5], ['s3', 6], ['s3', 5], ['s2', 0], ['s3', 4], ['s1', 0]], 3, 2],\n   [['eve_morn', 's3', 1]]),\n  ('normal control 7', [[['s1', 1], ['s1', 2]], 4, 1], [['day', 's1', 0]]),\n  ('normal control 8', [[['s3', 4], ['s2', 8], ['s3', 1], ['s1', 1], ['s2', 3]], 3, 1], [])],\n [('regression: next morning period 1',\n   [[['s3', 1], ['s2', 4], ['s1', 11], ['s1', 7], ['s2', 1], ['s2', 5], ['s3', 2], ['s3', 4]], 4, 1],\n   [['day', 's2', 1], ['day', 's3', 0]]),\n  ('regression variant: next morning period 2',\n   [[['s1', 2], ['s2', 6], ['s3', 4], ['s3', 4], ['s1', 5], ['s3', 8], ['s3', 2], ['s1', 6]], 3, 2],\n   [['eve_morn', 's1', 1]]),\n  ('partial repair guard 3',\n   [[['s2', 0], ['s3', 2], ['s1', 3], ['s2', 3], ['s2', 5], ['s3', 0], ['s1', 4], ['s3', 0]], 2, 2],\n   [['eve_morn', 's1', 1]]),\n  ('boundary control 4', [[['s1', 2], ['s1', 3]], 3, 2], [['eve_morn', 's1', 0]]),\n  ('normal control 5',\n   [[['s2', 5], ['s2', 1], ['s1', 2], ['s2', 3], ['s1', 4], ['s2', 1], ['s3', 2], ['s2', 0]], 2, 1],\n   [['day', 's2', 0]]),\n  ('normal control 6', [[['s1', 3], ['s3', 2], ['s1', 3]], 3, 1], []),\n  ('normal control 7', [[['s1', 4], ['s1', 0], ['s1', 3], ['s1', 0], ['s1', 2], ['s3', 4], ['s2', 2]], 2, 1],\n   [['day', 's1', 1], ['eve_morn', 's1', 1]]),\n  ('normal control 8', [[['s1', 3], ['s3', 2], ['s1', 1], ['s3', 2]], 2, 2], [])]]\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-daily-limit-and-evening-morning-next-morning-period","generated_at":"2026-09-29T14:52:07.789066+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Daily exam limits and evening-then-morning sequences are common student-welfare rules.","root_cause":"The following morning is computed as p + spd.","sha256":"432540b023957bece8723858d2812d0a59733cb2ec287649db9c5a31070a732b","title":"Next-morning check looks at the same slot next 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":43.86,"exit_code":1,"observations":[{"actual":[["eve_morn","s1",0]],"check":"regression: next morning period 1","expected":[["eve_morn","s1",0]],"passed":true},{"actual":[["eve_morn","s3",0]],"check":"regression variant: next morning period 2","expected":[["eve_morn","s3",0]],"passed":true},{"actual":[["eve_morn","s3",1]],"check":"partial repair guard 3","expected":[],"passed":false},{"actual":[["day","s1",0]],"check":"boundary control 4","expected":[["day","s1",0]],"passed":true},{"actual":[],"check":"normal control 5","expected":[],"passed":true},{"actual":[],"check":"normal control 6","expected":[],"passed":true},{"actual":[["eve_morn","s1",0]],"check":"normal control 7","expected":[["eve_morn","s1",0]],"passed":true},{"actual":[],"check":"normal control 8","expected":[],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: next morning period 1\", \"actual\": [[\"eve_morn\", \"s1\", 0]], \"expected\": [[\"eve_morn\", \"s1\", 0]], \"passed\": true}, {\"check\": \"regression variant: next morning period 2\", \"actual\": [[\"eve_morn\", \"s3\", 0]], \"expected\": [[\"eve_morn\", \"s3\", 0]], \"passed\": true}, {\"check\": \"partial repair guard 3\", \"actual\": [[\"eve_morn\", \"s3\", 1]], \"expected\": [], \"passed\": false}, {\"check\": \"boundary control 4\", \"actual\": [[\"day\", \"s1\", 0]], \"expected\": [[\"day\", \"s1\", 0]], \"passed\": true}, {\"check\": \"normal control 5\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"normal control 6\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"normal control 7\", \"actual\": [[\"eve_morn\", \"s1\", 0]], \"expected\": [[\"eve_morn\", \"s1\", 0]], \"passed\": true}, {\"check\": \"normal control 8\", \"actual\": [], \"expected\": [], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.928,"exit_code":1,"observations":[{"actual":[],"check":"regression: next morning period 1","expected":[["eve_morn","s1",0]],"passed":false},{"actual":[],"check":"regression variant: next morning period 2","expected":[["eve_morn","s3",0]],"passed":false},{"actual":[["eve_morn","s3",1]],"check":"partial repair guard 3","expected":[],"passed":false},{"actual":[["day","s1",0]],"check":"boundary control 4","expected":[["day","s1",0]],"passed":true},{"actual":[],"check":"normal control 5","expected":[],"passed":true},{"actual":[],"check":"normal control 6","expected":[],"passed":true},{"actual":[],"check":"normal control 7","expected":[["eve_morn","s1",0]],"passed":false},{"actual":[],"check":"normal control 8","expected":[],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: next morning period 1\", \"actual\": [], \"expected\": [[\"eve_morn\", \"s1\", 0]], \"passed\": false}, {\"check\": \"regression variant: next morning period 2\", \"actual\": [], \"expected\": [[\"eve_morn\", \"s3\", 0]], \"passed\": false}, {\"check\": \"partial repair guard 3\", \"actual\": [[\"eve_morn\", \"s3\", 1]], \"expected\": [], \"passed\": false}, {\"check\": \"boundary control 4\", \"actual\": [[\"day\", \"s1\", 0]], \"expected\": [[\"day\", \"s1\", 0]], \"passed\": true}, {\"check\": \"normal control 5\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"normal control 6\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"normal control 7\", \"actual\": [], \"expected\": [[\"eve_morn\", \"s1\", 0]], \"passed\": false}, {\"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."}}