{"abstract":"Overlap phase indication returns a wrong result when a parent in yellow keeps the overlap green.","category":"Traffic signal timing plans","checks":8,"contract":"Input {parents, not_during, state: [[phase, G|Y|RC|R]] for timing phases, next: phases to be served next}. The overlap is red while any not_during phase is green. Otherwise it is green while any parent is green. If a parent is terminating (Y or RC) the overlap stays green when any next phase is a parent; otherwise it is yellow if any terminating parent is in yellow, else red. Otherwise red.","contract_signature":"x","evaluation_group":"w2-traffic_signal_timing_plans-overlap-phase","failed_approach":"Checking only the lowest parent ignores the other parents.","family":"w2-traffic_signal_timing_plans-overlap-phase-parent-green","id":"FA-68321","implementations":{"attempt":{"sha256":"d01cd98d8a0b023f21f32e493574f205d869a8ebfdff1bdaa59feac178a83c5a","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    par = set(x['parents'])\n    nd = set(x['not_during'])\n    cur = {ph: iv for ph, iv in x['state']}\n    if any(cur.get(p) == 'G' for p in nd):\n        return 'R'\n    if cur.get(min(par)) == 'G':\n        return 'G'\n    terminating = [p for p in sorted(par) if cur.get(p) in ('Y', 'RC')]\n    if terminating:\n        if any(p in par for p in x['next']):\n            return 'G'\n        if any(cur[p] == 'Y' for p in terminating):\n            return 'Y'\n        return 'R'\n    return 'R'\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[({'parents': [2, 3], 'not_during': [], 'state': [[2, 'RC'], [6, 'RC']], 'next': [3, 7]}, 'G'), ({'parents': [1, 3, 4], 'not_during': [], 'state': [[8, 'Y'], [7, 'G'], [3, 'Y']], 'next': []}, 'Y'), ({'parents': [1, 2, 3], 'not_during': [], 'state': [[3, 'G']], 'next': [6, 7]}, 'G'), ({'parents': [1, 7], 'not_during': [4, 6], 'state': [[2, 'G'], [1, 'Y'], [8, 'R']], 'next': [8]}, 'Y'), ({'parents': [2, 5, 7], 'not_during': [3, 8], 'state': [[8, 'R'], [5, 'G']], 'next': [4]}, 'G'), ({'parents': [5, 7], 'not_during': [8], 'state': [[4, 'RC']], 'next': [2]}, 'R'), ({'parents': [2, 3], 'not_during': [5], 'state': [[3, 'G'], [5, 'G']], 'next': []}, 'R'), ({'parents': [4, 5], 'not_during': [], 'state': [[4, 'RC'], [5, 'Y']], 'next': [1]}, 'Y')], [({'parents': [3, 4, 7], 'not_during': [], 'state': [[3, 'Y']], 'next': [2, 8]}, 'Y'), ({'parents': [1, 2, 8], 'not_during': [6], 'state': [[8, 'G'], [4, 'Y']], 'next': [3]}, 'G'), ({'parents': [2, 3], 'not_during': [5], 'state': [[3, 'G'], [5, 'G']], 'next': []}, 'R'), ({'parents': [8], 'not_during': [], 'state': [[7, 'Y'], [3, 'G'], [1, 'R']], 'next': [4]}, 'R'), ({'parents': [4, 5, 7], 'not_during': [2], 'state': [[5, 'Y'], [2, 'RC'], [1, 'Y']], 'next': []}, 'Y'), ({'parents': [4, 5], 'not_during': [], 'state': [[4, 'RC'], [5, 'Y']], 'next': [1]}, 'Y'), ({'parents': [1, 2, 4], 'not_during': [3, 6], 'state': [[5, 'RC'], [2, 'G'], [1, 'RC']], 'next': [5]}, 'G'), ({'parents': [2, 3], 'not_during': [], 'state': [[2, 'RC'], [6, 'RC']], 'next': [3, 7]}, 'G')], [({'parents': [2, 6, 8], 'not_during': [], 'state': [[7, 'G'], [8, 'G'], [1, 'Y']], 'next': [3, 5]}, 'G'), ({'parents': [3, 4, 5], 'not_during': [], 'state': [[4, 'G']], 'next': [6]}, 'G'), ({'parents': [2, 3], 'not_during': [], 'state': [[2, 'RC'], [6, 'RC']], 'next': [3, 7]}, 'G'), ({'parents': [4, 5], 'not_during': [], 'state': [[4, 'RC'], [5, 'Y']], 'next': [1]}, 'Y'), ({'parents': [2], 'not_during': [7], 'state': [[2, 'Y'], [6, 'R']], 'next': [3, 7]}, 'Y'), ({'parents': [2], 'not_during': [3, 6], 'state': [[7, 'G'], [2, 'G'], [6, 'Y']], 'next': [1, 4]}, 'G'), ({'parents': [5], 'not_during': [2, 4], 'state': [[1, 'R'], [5, 'Y'], [8, 'R']], 'next': []}, 'Y'), ({'parents': [2, 3], 'not_during': [5], 'state': [[3, 'G'], [5, 'G']], 'next': []}, 'R')], [({'parents': [4, 5], 'not_during': [], 'state': [[4, 'RC'], [5, 'Y']], 'next': [1]}, 'Y'), ({'parents': [5, 6, 8], 'not_during': [4], 'state': [[6, 'G']], 'next': [5, 8]}, 'G'), ({'parents': [3, 4, 6], 'not_during': [], 'state': [[7, 'Y'], [6, 'Y']], 'next': [2]}, 'Y'), ({'parents': [6], 'not_during': [], 'state': [[6, 'R'], [5, 'RC']], 'next': []}, 'R'), ({'parents': [4, 5, 8], 'not_during': [2, 3], 'state': [[6, 'G'], [5, 'G'], [8, 'Y']], 'next': [3]}, 'G'), ({'parents': [3, 4, 6], 'not_during': [], 'state': [[1, 'Y'], [4, 'RC'], [3, 'Y']], 'next': []}, 'Y'), ({'parents': [2, 3], 'not_during': [], 'state': [[2, 'RC'], [6, 'RC']], 'next': [3, 7]}, 'G'), ({'parents': [2, 3], 'not_during': [5], 'state': [[3, 'G'], [5, 'G']], 'next': []}, 'R')], [({'parents': [1, 3, 8], 'not_during': [], 'state': [[2, 'G'], [4, 'Y'], [6, 'R']], 'next': [1]}, 'R'), ({'parents': [4, 5], 'not_during': [], 'state': [[4, 'RC'], [5, 'Y']], 'next': [1]}, 'Y'), ({'parents': [2, 3], 'not_during': [5], 'state': [[3, 'G'], [5, 'G']], 'next': []}, 'R'), ({'parents': [1, 7], 'not_during': [2, 5], 'state': [[7, 'G'], [3, 'Y']], 'next': []}, 'G'), ({'parents': [4, 5], 'not_during': [], 'state': [[5, 'Y'], [6, 'G']], 'next': []}, 'Y'), ({'parents': [3, 4], 'not_during': [], 'state': [[4, 'G'], [7, 'G'], [5, 'RC']], 'next': [2]}, 'G'), ({'parents': [2, 3], 'not_during': [], 'state': [[2, 'RC'], [6, 'RC']], 'next': [3, 7]}, 'G'), ({'parents': [2, 6], 'not_during': [4], 'state': [[3, 'G'], [2, 'Y'], [4, 'R']], 'next': []}, 'Y')]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check('timing oracle' + ' %d' % i, 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":"287cefcc66d5def1605ad9ad4ac885f826fd6948c63d02818b1d0cf7275b0515","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    par = set(x['parents'])\n    nd = set(x['not_during'])\n    cur = {ph: iv for ph, iv in x['state']}\n    if any(cur.get(p) == 'G' for p in nd):\n        return 'R'\n    if any(cur.get(p) in ('G', 'Y') for p in par):\n        return 'G'\n    terminating = [p for p in sorted(par) if cur.get(p) in ('Y', 'RC')]\n    if terminating:\n        if any(p in par for p in x['next']):\n            return 'G'\n        if any(cur[p] == 'Y' for p in terminating):\n            return 'Y'\n        return 'R'\n    return 'R'\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[({'parents': [2, 3], 'not_during': [], 'state': [[2, 'RC'], [6, 'RC']], 'next': [3, 7]}, 'G'), ({'parents': [1, 3, 4], 'not_during': [], 'state': [[8, 'Y'], [7, 'G'], [3, 'Y']], 'next': []}, 'Y'), ({'parents': [1, 2, 3], 'not_during': [], 'state': [[3, 'G']], 'next': [6, 7]}, 'G'), ({'parents': [1, 7], 'not_during': [4, 6], 'state': [[2, 'G'], [1, 'Y'], [8, 'R']], 'next': [8]}, 'Y'), ({'parents': [2, 5, 7], 'not_during': [3, 8], 'state': [[8, 'R'], [5, 'G']], 'next': [4]}, 'G'), ({'parents': [5, 7], 'not_during': [8], 'state': [[4, 'RC']], 'next': [2]}, 'R'), ({'parents': [2, 3], 'not_during': [5], 'state': [[3, 'G'], [5, 'G']], 'next': []}, 'R'), ({'parents': [4, 5], 'not_during': [], 'state': [[4, 'RC'], [5, 'Y']], 'next': [1]}, 'Y')], [({'parents': [3, 4, 7], 'not_during': [], 'state': [[3, 'Y']], 'next': [2, 8]}, 'Y'), ({'parents': [1, 2, 8], 'not_during': [6], 'state': [[8, 'G'], [4, 'Y']], 'next': [3]}, 'G'), ({'parents': [2, 3], 'not_during': [5], 'state': [[3, 'G'], [5, 'G']], 'next': []}, 'R'), ({'parents': [8], 'not_during': [], 'state': [[7, 'Y'], [3, 'G'], [1, 'R']], 'next': [4]}, 'R'), ({'parents': [4, 5, 7], 'not_during': [2], 'state': [[5, 'Y'], [2, 'RC'], [1, 'Y']], 'next': []}, 'Y'), ({'parents': [4, 5], 'not_during': [], 'state': [[4, 'RC'], [5, 'Y']], 'next': [1]}, 'Y'), ({'parents': [1, 2, 4], 'not_during': [3, 6], 'state': [[5, 'RC'], [2, 'G'], [1, 'RC']], 'next': [5]}, 'G'), ({'parents': [2, 3], 'not_during': [], 'state': [[2, 'RC'], [6, 'RC']], 'next': [3, 7]}, 'G')], [({'parents': [2, 6, 8], 'not_during': [], 'state': [[7, 'G'], [8, 'G'], [1, 'Y']], 'next': [3, 5]}, 'G'), ({'parents': [3, 4, 5], 'not_during': [], 'state': [[4, 'G']], 'next': [6]}, 'G'), ({'parents': [2, 3], 'not_during': [], 'state': [[2, 'RC'], [6, 'RC']], 'next': [3, 7]}, 'G'), ({'parents': [4, 5], 'not_during': [], 'state': [[4, 'RC'], [5, 'Y']], 'next': [1]}, 'Y'), ({'parents': [2], 'not_during': [7], 'state': [[2, 'Y'], [6, 'R']], 'next': [3, 7]}, 'Y'), ({'parents': [2], 'not_during': [3, 6], 'state': [[7, 'G'], [2, 'G'], [6, 'Y']], 'next': [1, 4]}, 'G'), ({'parents': [5], 'not_during': [2, 4], 'state': [[1, 'R'], [5, 'Y'], [8, 'R']], 'next': []}, 'Y'), ({'parents': [2, 3], 'not_during': [5], 'state': [[3, 'G'], [5, 'G']], 'next': []}, 'R')], [({'parents': [4, 5], 'not_during': [], 'state': [[4, 'RC'], [5, 'Y']], 'next': [1]}, 'Y'), ({'parents': [5, 6, 8], 'not_during': [4], 'state': [[6, 'G']], 'next': [5, 8]}, 'G'), ({'parents': [3, 4, 6], 'not_during': [], 'state': [[7, 'Y'], [6, 'Y']], 'next': [2]}, 'Y'), ({'parents': [6], 'not_during': [], 'state': [[6, 'R'], [5, 'RC']], 'next': []}, 'R'), ({'parents': [4, 5, 8], 'not_during': [2, 3], 'state': [[6, 'G'], [5, 'G'], [8, 'Y']], 'next': [3]}, 'G'), ({'parents': [3, 4, 6], 'not_during': [], 'state': [[1, 'Y'], [4, 'RC'], [3, 'Y']], 'next': []}, 'Y'), ({'parents': [2, 3], 'not_during': [], 'state': [[2, 'RC'], [6, 'RC']], 'next': [3, 7]}, 'G'), ({'parents': [2, 3], 'not_during': [5], 'state': [[3, 'G'], [5, 'G']], 'next': []}, 'R')], [({'parents': [1, 3, 8], 'not_during': [], 'state': [[2, 'G'], [4, 'Y'], [6, 'R']], 'next': [1]}, 'R'), ({'parents': [4, 5], 'not_during': [], 'state': [[4, 'RC'], [5, 'Y']], 'next': [1]}, 'Y'), ({'parents': [2, 3], 'not_during': [5], 'state': [[3, 'G'], [5, 'G']], 'next': []}, 'R'), ({'parents': [1, 7], 'not_during': [2, 5], 'state': [[7, 'G'], [3, 'Y']], 'next': []}, 'G'), ({'parents': [4, 5], 'not_during': [], 'state': [[5, 'Y'], [6, 'G']], 'next': []}, 'Y'), ({'parents': [3, 4], 'not_during': [], 'state': [[4, 'G'], [7, 'G'], [5, 'RC']], 'next': [2]}, 'G'), ({'parents': [2, 3], 'not_during': [], 'state': [[2, 'RC'], [6, 'RC']], 'next': [3, 7]}, 'G'), ({'parents': [2, 6], 'not_during': [4], 'state': [[3, 'G'], [2, 'Y'], [4, 'R']], 'next': []}, 'Y')]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check('timing oracle' + ' %d' % i, 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":"A deterministic, bounded toy model with a stipulated contract; it makes no claim of conformance to any agency manual or standard. 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-traffic_signal_timing_plans-overlap-phase-parent-green","generated_at":"2026-09-29T14:48:01.153159+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Signal timing arithmetic is exact and integer or rational; a wrong rule silently produces unsafe or inefficient timing plans.","root_cause":"Yellow is treated as green for parents, so the overlap skips its own yellow and goes straight to red after the parent clears.","sha256":"10a62b8dc40925cb8f0dbd2f65dbfc76e6914ccab2bc8951e12d1f2852ce4865","title":"Overlap phase indication: a parent in yellow keeps the overlap green · 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.262,"exit_code":1,"observations":[{"actual":"G","check":"timing oracle 0","expected":"G","passed":true},{"actual":"Y","check":"timing oracle 1","expected":"Y","passed":true},{"actual":"R","check":"timing oracle 2","expected":"G","passed":false},{"actual":"Y","check":"timing oracle 3","expected":"Y","passed":true},{"actual":"R","check":"timing oracle 4","expected":"G","passed":false},{"actual":"R","check":"timing oracle 5","expected":"R","passed":true},{"actual":"R","check":"timing oracle 6","expected":"R","passed":true},{"actual":"Y","check":"timing oracle 7","expected":"Y","passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"timing oracle 0\", \"actual\": \"G\", \"expected\": \"G\", \"passed\": true}, {\"check\": \"timing oracle 1\", \"actual\": \"Y\", \"expected\": \"Y\", \"passed\": true}, {\"check\": \"timing oracle 2\", \"actual\": \"R\", \"expected\": \"G\", \"passed\": false}, {\"check\": \"timing oracle 3\", \"actual\": \"Y\", \"expected\": \"Y\", \"passed\": true}, {\"check\": \"timing oracle 4\", \"actual\": \"R\", \"expected\": \"G\", \"passed\": false}, {\"check\": \"timing oracle 5\", \"actual\": \"R\", \"expected\": \"R\", \"passed\": true}, {\"check\": \"timing oracle 6\", \"actual\": \"R\", \"expected\": \"R\", \"passed\": true}, {\"check\": \"timing oracle 7\", \"actual\": \"Y\", \"expected\": \"Y\", \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":42.001,"exit_code":1,"observations":[{"actual":"G","check":"timing oracle 0","expected":"G","passed":true},{"actual":"G","check":"timing oracle 1","expected":"Y","passed":false},{"actual":"G","check":"timing oracle 2","expected":"G","passed":true},{"actual":"G","check":"timing oracle 3","expected":"Y","passed":false},{"actual":"G","check":"timing oracle 4","expected":"G","passed":true},{"actual":"R","check":"timing oracle 5","expected":"R","passed":true},{"actual":"R","check":"timing oracle 6","expected":"R","passed":true},{"actual":"G","check":"timing oracle 7","expected":"Y","passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"timing oracle 0\", \"actual\": \"G\", \"expected\": \"G\", \"passed\": true}, {\"check\": \"timing oracle 1\", \"actual\": \"G\", \"expected\": \"Y\", \"passed\": false}, {\"check\": \"timing oracle 2\", \"actual\": \"G\", \"expected\": \"G\", \"passed\": true}, {\"check\": \"timing oracle 3\", \"actual\": \"G\", \"expected\": \"Y\", \"passed\": false}, {\"check\": \"timing oracle 4\", \"actual\": \"G\", \"expected\": \"G\", \"passed\": true}, {\"check\": \"timing oracle 5\", \"actual\": \"R\", \"expected\": \"R\", \"passed\": true}, {\"check\": \"timing oracle 6\", \"actual\": \"R\", \"expected\": \"R\", \"passed\": true}, {\"check\": \"timing oracle 7\", \"actual\": \"G\", \"expected\": \"Y\", \"passed\": false}], \"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."}}