{"abstract":"Coordinated local cycle timer returns a wrong result when split start accumulates green only.","category":"Traffic signal timing plans","checks":8,"contract":"Input {cycle, offset, master, splits: [[phase, split s]] in sequence starting with the coordinated phase, yellow, red, ref}. Splits must sum to the cycle, else 'bad-splits'. Local time = (master - offset) mod cycle, where the offset marks the start of coordinated green (ref 'begin') or the end of coordinated green (ref 'end'). Each split is green then yellow then all-red. Return [phase, interval, seconds remaining].","evaluation_group":"w2-traffic_signal_timing_plans-coord-timer","failed_approach":"Accumulating only green time drops the clearance intervals from every later split start.","family":"w2-traffic_signal_timing_plans-coord-timer-split-start","id":"FA-68051","implementations":{"attempt":{"sha256":"613bb08ba6295bca337d23581ac9929e98411baf6f2a8c23d96cce787b752125","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    C = x['cycle']\n    sp = x['splits']\n    y, r = x['yellow'], x['red']\n    if sum(s for _, s in sp) != C:\n        return 'bad-splits'\n    lc = (x['master'] - x['offset']) % C\n    if x['ref'] == 'end':\n        lc = (lc + sp[0][1] - y - r) % C\n    start = 0\n    for ph, s in sp:\n        ge = start + s - y - r\n        if lc < ge:\n            return [ph, 'green', ge - lc]\n        if lc < ge + y:\n            return [ph, 'yellow', ge + y - lc]\n        if lc < start + s:\n            return [ph, 'red', start + s - lc]\n        start += s - y - r\n    return ['free', 'dark', 0]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[({'cycle': 80, 'offset': 70, 'master': 10, 'splits': [[2, 50], [4, 30]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 25]), ({'cycle': 75, 'offset': 33, 'master': 335, 'splits': [[2, 35], [4, 40]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, [2, 'green', 27]), ({'cycle': 58, 'offset': 7, 'master': 869, 'splits': [[2, 13], [4, 31], [6, 14]], 'yellow': 4, 'red': 2, 'ref': 'end'}, [6, 'red', 1]), ({'cycle': 90, 'offset': 30, 'master': 45, 'splits': [[2, 40], [4, 25], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'green', 10]), ({'cycle': 100, 'offset': 5, 'master': 3, 'splits': [[2, 50], [4, 30], [8, 25]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 97, 'offset': 19, 'master': 312, 'splits': [[2, 36], [4, 31], [6, 35]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 104, 'offset': 12, 'master': 419, 'splits': [[2, 35], [4, 31], [6, 38]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [6, 'green', 4]), ({'cycle': 112, 'offset': 58, 'master': 105, 'splits': [[2, 36], [4, 16], [6, 28], [8, 32]], 'yellow': 3, 'red': 2, 'ref': 'end'}, [6, 'red', 2])], [({'cycle': 55, 'offset': 54, 'master': 609, 'splits': [[2, 33], [4, 22]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, [2, 'green', 22]), ({'cycle': 101, 'offset': 40, 'master': 329, 'splits': [[2, 22], [4, 28], [6, 38], [8, 13]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [6, 'red', 1]), ({'cycle': 125, 'offset': 85, 'master': 573, 'splits': [[2, 29], [4, 23], [6, 40], [8, 33]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [8, 'green', 7]), ({'cycle': 100, 'offset': 5, 'master': 3, 'splits': [[2, 50], [4, 30], [8, 25]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 80, 'offset': 70, 'master': 10, 'splits': [[2, 50], [4, 30]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 25]), ({'cycle': 115, 'offset': 109, 'master': 857, 'splits': [[2, 24], [4, 29], [6, 39], [8, 23]], 'yellow': 3, 'red': 1, 'ref': 'end'}, [6, 'green', 10]), ({'cycle': 90, 'offset': 30, 'master': 45, 'splits': [[2, 40], [4, 25], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'green', 10]), ({'cycle': 78, 'offset': 52, 'master': 624, 'splits': [[2, 18], [4, 32], [6, 28]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, [4, 'green', 18])], [({'cycle': 63, 'offset': 10, 'master': 656, 'splits': [[2, 34], [4, 29]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, [2, 'green', 12]), ({'cycle': 93, 'offset': 24, 'master': 66, 'splits': [[2, 32], [4, 23], [6, 38]], 'yellow': 3, 'red': 1, 'ref': 'end'}, [6, 'green', 19]), ({'cycle': 92, 'offset': 24, 'master': 289, 'splits': [[2, 19], [4, 20], [6, 39], [8, 14]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [8, 'green', 6]), ({'cycle': 58, 'offset': 12, 'master': 441, 'splits': [[2, 15], [4, 38]], 'yellow': 3, 'red': 1, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 90, 'offset': 30, 'master': 45, 'splits': [[2, 40], [4, 25], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'green', 10]), ({'cycle': 100, 'offset': 5, 'master': 3, 'splits': [[2, 50], [4, 30], [8, 25]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 82, 'offset': 23, 'master': 673, 'splits': [[2, 38], [4, 28], [6, 16]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [6, 'green', 1]), ({'cycle': 80, 'offset': 70, 'master': 10, 'splits': [[2, 50], [4, 30]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 25])], [({'cycle': 96, 'offset': 42, 'master': 942, 'splits': [[2, 39], [4, 25], [6, 22], [8, 15]], 'yellow': 3, 'red': 1, 'ref': 'end'}, 'bad-splits'), ({'cycle': 90, 'offset': 30, 'master': 45, 'splits': [[2, 40], [4, 25], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'green', 10]), ({'cycle': 67, 'offset': 65, 'master': 64, 'splits': [[2, 21], [4, 33], [6, 13]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [6, 'red', 1]), ({'cycle': 132, 'offset': 4, 'master': 870, 'splits': [[2, 27], [4, 35], [6, 39], [8, 31]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [6, 'green', 22]), ({'cycle': 64, 'offset': 6, 'master': 411, 'splits': [[2, 22], [4, 16], [6, 13], [8, 13]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'red', 1]), ({'cycle': 100, 'offset': 5, 'master': 3, 'splits': [[2, 50], [4, 30], [8, 25]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 58, 'offset': 42, 'master': 894, 'splits': [[2, 16], [4, 17], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [6, 'green', 13]), ({'cycle': 80, 'offset': 70, 'master': 10, 'splits': [[2, 50], [4, 30]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 25])], [({'cycle': 99, 'offset': 85, 'master': 843, 'splits': [[2, 25], [4, 40], [6, 34]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, [6, 'green', 28]), ({'cycle': 80, 'offset': 70, 'master': 10, 'splits': [[2, 50], [4, 30]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 25]), ({'cycle': 120, 'offset': 49, 'master': 612, 'splits': [[2, 34], [4, 36], [6, 26], [8, 24]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, [6, 'green', 7]), ({'cycle': 100, 'offset': 5, 'master': 3, 'splits': [[2, 50], [4, 30], [8, 25]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 40, 'offset': 17, 'master': 388, 'splits': [[2, 24], [4, 16]], 'yellow': 4, 'red': 2, 'ref': 'end'}, [4, 'green', 5]), ({'cycle': 90, 'offset': 30, 'master': 45, 'splits': [[2, 40], [4, 25], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'green', 10]), ({'cycle': 63, 'offset': 11, 'master': 608, 'splits': [[2, 35], [4, 12], [6, 16]], 'yellow': 3, 'red': 1, 'ref': 'begin'}, [2, 'green', 1]), ({'cycle': 99, 'offset': 65, 'master': 228, 'splits': [[2, 22], [4, 29], [6, 15], [8, 33]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [6, 'yellow', 1])]]\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":"1b6eaa11d9ff2edd7ee28ff2e6e463ad986440751cedbbc1fc9678c6b86a0bb5","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    C = x['cycle']\n    sp = x['splits']\n    y, r = x['yellow'], x['red']\n    if sum(s for _, s in sp) != C:\n        return 'bad-splits'\n    lc = (x['master'] - x['offset']) % C\n    if x['ref'] == 'end':\n        lc = (lc + sp[0][1] - y - r) % C\n    start = 0\n    for ph, s in sp:\n        ge = start + s - y - r\n        if lc < ge:\n            return [ph, 'green', ge - lc]\n        if lc < ge + y:\n            return [ph, 'yellow', ge + y - lc]\n        if lc < start + s:\n            return [ph, 'red', start + s - lc]\n        start = s\n    return ['free', 'dark', 0]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[({'cycle': 80, 'offset': 70, 'master': 10, 'splits': [[2, 50], [4, 30]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 25]), ({'cycle': 75, 'offset': 33, 'master': 335, 'splits': [[2, 35], [4, 40]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, [2, 'green', 27]), ({'cycle': 58, 'offset': 7, 'master': 869, 'splits': [[2, 13], [4, 31], [6, 14]], 'yellow': 4, 'red': 2, 'ref': 'end'}, [6, 'red', 1]), ({'cycle': 90, 'offset': 30, 'master': 45, 'splits': [[2, 40], [4, 25], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'green', 10]), ({'cycle': 100, 'offset': 5, 'master': 3, 'splits': [[2, 50], [4, 30], [8, 25]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 97, 'offset': 19, 'master': 312, 'splits': [[2, 36], [4, 31], [6, 35]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 104, 'offset': 12, 'master': 419, 'splits': [[2, 35], [4, 31], [6, 38]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [6, 'green', 4]), ({'cycle': 112, 'offset': 58, 'master': 105, 'splits': [[2, 36], [4, 16], [6, 28], [8, 32]], 'yellow': 3, 'red': 2, 'ref': 'end'}, [6, 'red', 2])], [({'cycle': 55, 'offset': 54, 'master': 609, 'splits': [[2, 33], [4, 22]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, [2, 'green', 22]), ({'cycle': 101, 'offset': 40, 'master': 329, 'splits': [[2, 22], [4, 28], [6, 38], [8, 13]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [6, 'red', 1]), ({'cycle': 125, 'offset': 85, 'master': 573, 'splits': [[2, 29], [4, 23], [6, 40], [8, 33]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [8, 'green', 7]), ({'cycle': 100, 'offset': 5, 'master': 3, 'splits': [[2, 50], [4, 30], [8, 25]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 80, 'offset': 70, 'master': 10, 'splits': [[2, 50], [4, 30]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 25]), ({'cycle': 115, 'offset': 109, 'master': 857, 'splits': [[2, 24], [4, 29], [6, 39], [8, 23]], 'yellow': 3, 'red': 1, 'ref': 'end'}, [6, 'green', 10]), ({'cycle': 90, 'offset': 30, 'master': 45, 'splits': [[2, 40], [4, 25], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'green', 10]), ({'cycle': 78, 'offset': 52, 'master': 624, 'splits': [[2, 18], [4, 32], [6, 28]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, [4, 'green', 18])], [({'cycle': 63, 'offset': 10, 'master': 656, 'splits': [[2, 34], [4, 29]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, [2, 'green', 12]), ({'cycle': 93, 'offset': 24, 'master': 66, 'splits': [[2, 32], [4, 23], [6, 38]], 'yellow': 3, 'red': 1, 'ref': 'end'}, [6, 'green', 19]), ({'cycle': 92, 'offset': 24, 'master': 289, 'splits': [[2, 19], [4, 20], [6, 39], [8, 14]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [8, 'green', 6]), ({'cycle': 58, 'offset': 12, 'master': 441, 'splits': [[2, 15], [4, 38]], 'yellow': 3, 'red': 1, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 90, 'offset': 30, 'master': 45, 'splits': [[2, 40], [4, 25], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'green', 10]), ({'cycle': 100, 'offset': 5, 'master': 3, 'splits': [[2, 50], [4, 30], [8, 25]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 82, 'offset': 23, 'master': 673, 'splits': [[2, 38], [4, 28], [6, 16]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [6, 'green', 1]), ({'cycle': 80, 'offset': 70, 'master': 10, 'splits': [[2, 50], [4, 30]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 25])], [({'cycle': 96, 'offset': 42, 'master': 942, 'splits': [[2, 39], [4, 25], [6, 22], [8, 15]], 'yellow': 3, 'red': 1, 'ref': 'end'}, 'bad-splits'), ({'cycle': 90, 'offset': 30, 'master': 45, 'splits': [[2, 40], [4, 25], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'green', 10]), ({'cycle': 67, 'offset': 65, 'master': 64, 'splits': [[2, 21], [4, 33], [6, 13]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [6, 'red', 1]), ({'cycle': 132, 'offset': 4, 'master': 870, 'splits': [[2, 27], [4, 35], [6, 39], [8, 31]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [6, 'green', 22]), ({'cycle': 64, 'offset': 6, 'master': 411, 'splits': [[2, 22], [4, 16], [6, 13], [8, 13]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'red', 1]), ({'cycle': 100, 'offset': 5, 'master': 3, 'splits': [[2, 50], [4, 30], [8, 25]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 58, 'offset': 42, 'master': 894, 'splits': [[2, 16], [4, 17], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [6, 'green', 13]), ({'cycle': 80, 'offset': 70, 'master': 10, 'splits': [[2, 50], [4, 30]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 25])], [({'cycle': 99, 'offset': 85, 'master': 843, 'splits': [[2, 25], [4, 40], [6, 34]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, [6, 'green', 28]), ({'cycle': 80, 'offset': 70, 'master': 10, 'splits': [[2, 50], [4, 30]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 25]), ({'cycle': 120, 'offset': 49, 'master': 612, 'splits': [[2, 34], [4, 36], [6, 26], [8, 24]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, [6, 'green', 7]), ({'cycle': 100, 'offset': 5, 'master': 3, 'splits': [[2, 50], [4, 30], [8, 25]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 40, 'offset': 17, 'master': 388, 'splits': [[2, 24], [4, 16]], 'yellow': 4, 'red': 2, 'ref': 'end'}, [4, 'green', 5]), ({'cycle': 90, 'offset': 30, 'master': 45, 'splits': [[2, 40], [4, 25], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'green', 10]), ({'cycle': 63, 'offset': 11, 'master': 608, 'splits': [[2, 35], [4, 12], [6, 16]], 'yellow': 3, 'red': 1, 'ref': 'begin'}, [2, 'green', 1]), ({'cycle': 99, 'offset': 65, 'master': 228, 'splits': [[2, 22], [4, 29], [6, 15], [8, 33]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [6, 'yellow', 1])]]\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"},"fixed":{"sha256":"b3cc1223060a6a20fc661a5435cf13dc5f477e4890e953a372786caabf4adfb0","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    C = x['cycle']\n    sp = x['splits']\n    y, r = x['yellow'], x['red']\n    if sum(s for _, s in sp) != C:\n        return 'bad-splits'\n    lc = (x['master'] - x['offset']) % C\n    if x['ref'] == 'end':\n        lc = (lc + sp[0][1] - y - r) % C\n    start = 0\n    for ph, s in sp:\n        ge = start + s - y - r\n        if lc < ge:\n            return [ph, 'green', ge - lc]\n        if lc < ge + y:\n            return [ph, 'yellow', ge + y - lc]\n        if lc < start + s:\n            return [ph, 'red', start + s - lc]\n        start += s\n    return ['free', 'dark', 0]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[({'cycle': 80, 'offset': 70, 'master': 10, 'splits': [[2, 50], [4, 30]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 25]), ({'cycle': 75, 'offset': 33, 'master': 335, 'splits': [[2, 35], [4, 40]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, [2, 'green', 27]), ({'cycle': 58, 'offset': 7, 'master': 869, 'splits': [[2, 13], [4, 31], [6, 14]], 'yellow': 4, 'red': 2, 'ref': 'end'}, [6, 'red', 1]), ({'cycle': 90, 'offset': 30, 'master': 45, 'splits': [[2, 40], [4, 25], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'green', 10]), ({'cycle': 100, 'offset': 5, 'master': 3, 'splits': [[2, 50], [4, 30], [8, 25]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 97, 'offset': 19, 'master': 312, 'splits': [[2, 36], [4, 31], [6, 35]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 104, 'offset': 12, 'master': 419, 'splits': [[2, 35], [4, 31], [6, 38]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [6, 'green', 4]), ({'cycle': 112, 'offset': 58, 'master': 105, 'splits': [[2, 36], [4, 16], [6, 28], [8, 32]], 'yellow': 3, 'red': 2, 'ref': 'end'}, [6, 'red', 2])], [({'cycle': 55, 'offset': 54, 'master': 609, 'splits': [[2, 33], [4, 22]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, [2, 'green', 22]), ({'cycle': 101, 'offset': 40, 'master': 329, 'splits': [[2, 22], [4, 28], [6, 38], [8, 13]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [6, 'red', 1]), ({'cycle': 125, 'offset': 85, 'master': 573, 'splits': [[2, 29], [4, 23], [6, 40], [8, 33]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [8, 'green', 7]), ({'cycle': 100, 'offset': 5, 'master': 3, 'splits': [[2, 50], [4, 30], [8, 25]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 80, 'offset': 70, 'master': 10, 'splits': [[2, 50], [4, 30]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 25]), ({'cycle': 115, 'offset': 109, 'master': 857, 'splits': [[2, 24], [4, 29], [6, 39], [8, 23]], 'yellow': 3, 'red': 1, 'ref': 'end'}, [6, 'green', 10]), ({'cycle': 90, 'offset': 30, 'master': 45, 'splits': [[2, 40], [4, 25], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'green', 10]), ({'cycle': 78, 'offset': 52, 'master': 624, 'splits': [[2, 18], [4, 32], [6, 28]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, [4, 'green', 18])], [({'cycle': 63, 'offset': 10, 'master': 656, 'splits': [[2, 34], [4, 29]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, [2, 'green', 12]), ({'cycle': 93, 'offset': 24, 'master': 66, 'splits': [[2, 32], [4, 23], [6, 38]], 'yellow': 3, 'red': 1, 'ref': 'end'}, [6, 'green', 19]), ({'cycle': 92, 'offset': 24, 'master': 289, 'splits': [[2, 19], [4, 20], [6, 39], [8, 14]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [8, 'green', 6]), ({'cycle': 58, 'offset': 12, 'master': 441, 'splits': [[2, 15], [4, 38]], 'yellow': 3, 'red': 1, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 90, 'offset': 30, 'master': 45, 'splits': [[2, 40], [4, 25], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'green', 10]), ({'cycle': 100, 'offset': 5, 'master': 3, 'splits': [[2, 50], [4, 30], [8, 25]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 82, 'offset': 23, 'master': 673, 'splits': [[2, 38], [4, 28], [6, 16]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [6, 'green', 1]), ({'cycle': 80, 'offset': 70, 'master': 10, 'splits': [[2, 50], [4, 30]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 25])], [({'cycle': 96, 'offset': 42, 'master': 942, 'splits': [[2, 39], [4, 25], [6, 22], [8, 15]], 'yellow': 3, 'red': 1, 'ref': 'end'}, 'bad-splits'), ({'cycle': 90, 'offset': 30, 'master': 45, 'splits': [[2, 40], [4, 25], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'green', 10]), ({'cycle': 67, 'offset': 65, 'master': 64, 'splits': [[2, 21], [4, 33], [6, 13]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [6, 'red', 1]), ({'cycle': 132, 'offset': 4, 'master': 870, 'splits': [[2, 27], [4, 35], [6, 39], [8, 31]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [6, 'green', 22]), ({'cycle': 64, 'offset': 6, 'master': 411, 'splits': [[2, 22], [4, 16], [6, 13], [8, 13]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'red', 1]), ({'cycle': 100, 'offset': 5, 'master': 3, 'splits': [[2, 50], [4, 30], [8, 25]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 58, 'offset': 42, 'master': 894, 'splits': [[2, 16], [4, 17], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [6, 'green', 13]), ({'cycle': 80, 'offset': 70, 'master': 10, 'splits': [[2, 50], [4, 30]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 25])], [({'cycle': 99, 'offset': 85, 'master': 843, 'splits': [[2, 25], [4, 40], [6, 34]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, [6, 'green', 28]), ({'cycle': 80, 'offset': 70, 'master': 10, 'splits': [[2, 50], [4, 30]], 'yellow': 3, 'red': 2, 'ref': 'begin'}, [2, 'green', 25]), ({'cycle': 120, 'offset': 49, 'master': 612, 'splits': [[2, 34], [4, 36], [6, 26], [8, 24]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, [6, 'green', 7]), ({'cycle': 100, 'offset': 5, 'master': 3, 'splits': [[2, 50], [4, 30], [8, 25]], 'yellow': 4, 'red': 2, 'ref': 'begin'}, 'bad-splits'), ({'cycle': 40, 'offset': 17, 'master': 388, 'splits': [[2, 24], [4, 16]], 'yellow': 4, 'red': 2, 'ref': 'end'}, [4, 'green', 5]), ({'cycle': 90, 'offset': 30, 'master': 45, 'splits': [[2, 40], [4, 25], [6, 25]], 'yellow': 4, 'red': 1, 'ref': 'end'}, [4, 'green', 10]), ({'cycle': 63, 'offset': 11, 'master': 608, 'splits': [[2, 35], [4, 12], [6, 16]], 'yellow': 3, 'red': 1, 'ref': 'begin'}, [2, 'green', 1]), ({'cycle': 99, 'offset': 65, 'master': 228, 'splits': [[2, 22], [4, 29], [6, 15], [8, 33]], 'yellow': 4, 'red': 1, 'ref': 'begin'}, [6, 'yellow', 1])]]\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-coord-timer-split-start","generated_at":"2026-09-29T14:47:58.544828+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.","repair":"Restore the split start accumulation rule so that the step reads `start += s`.","root_cause":"Resetting the start to the previous split length places the third and later phases at the wrong local time.","sha256":"8e3bf1e308cca408d09731afa2a563afcbe198c02bbf59b8ba5db5c379b7f1cb","title":"Coordinated local cycle timer: split start accumulates green only · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":41.678,"exit_code":1,"observations":[{"actual":[2,"green",25],"check":"timing oracle 0","expected":[2,"green",25],"passed":true},{"actual":[2,"green",27],"check":"timing oracle 1","expected":[2,"green",27],"passed":true},{"actual":["free","dark",0],"check":"timing oracle 2","expected":[6,"red",1],"passed":false},{"actual":[4,"green",5],"check":"timing oracle 3","expected":[4,"green",10],"passed":false},{"actual":"bad-splits","check":"timing oracle 4","expected":"bad-splits","passed":true},{"actual":"bad-splits","check":"timing oracle 5","expected":"bad-splits","passed":true},{"actual":["free","dark",0],"check":"timing oracle 6","expected":[6,"green",4],"passed":false},{"actual":[8,"green",14],"check":"timing oracle 7","expected":[6,"red",2],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"timing oracle 0\", \"actual\": [2, \"green\", 25], \"expected\": [2, \"green\", 25], \"passed\": true}, {\"check\": \"timing oracle 1\", \"actual\": [2, \"green\", 27], \"expected\": [2, \"green\", 27], \"passed\": true}, {\"check\": \"timing oracle 2\", \"actual\": [\"free\", \"dark\", 0], \"expected\": [6, \"red\", 1], \"passed\": false}, {\"check\": \"timing oracle 3\", \"actual\": [4, \"green\", 5], \"expected\": [4, \"green\", 10], \"passed\": false}, {\"check\": \"timing oracle 4\", \"actual\": \"bad-splits\", \"expected\": \"bad-splits\", \"passed\": true}, {\"check\": \"timing oracle 5\", \"actual\": \"bad-splits\", \"expected\": \"bad-splits\", \"passed\": true}, {\"check\": \"timing oracle 6\", \"actual\": [\"free\", \"dark\", 0], \"expected\": [6, \"green\", 4], \"passed\": false}, {\"check\": \"timing oracle 7\", \"actual\": [8, \"green\", 14], \"expected\": [6, \"red\", 2], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.804,"exit_code":1,"observations":[{"actual":[2,"green",25],"check":"timing oracle 0","expected":[2,"green",25],"passed":true},{"actual":[2,"green",27],"check":"timing oracle 1","expected":[2,"green",27],"passed":true},{"actual":["free","dark",0],"check":"timing oracle 2","expected":[6,"red",1],"passed":false},{"actual":[4,"green",10],"check":"timing oracle 3","expected":[4,"green",10],"passed":true},{"actual":"bad-splits","check":"timing oracle 4","expected":"bad-splits","passed":true},{"actual":"bad-splits","check":"timing oracle 5","expected":"bad-splits","passed":true},{"actual":["free","dark",0],"check":"timing oracle 6","expected":[6,"green",4],"passed":false},{"actual":["free","dark",0],"check":"timing oracle 7","expected":[6,"red",2],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"timing oracle 0\", \"actual\": [2, \"green\", 25], \"expected\": [2, \"green\", 25], \"passed\": true}, {\"check\": \"timing oracle 1\", \"actual\": [2, \"green\", 27], \"expected\": [2, \"green\", 27], \"passed\": true}, {\"check\": \"timing oracle 2\", \"actual\": [\"free\", \"dark\", 0], \"expected\": [6, \"red\", 1], \"passed\": false}, {\"check\": \"timing oracle 3\", \"actual\": [4, \"green\", 10], \"expected\": [4, \"green\", 10], \"passed\": true}, {\"check\": \"timing oracle 4\", \"actual\": \"bad-splits\", \"expected\": \"bad-splits\", \"passed\": true}, {\"check\": \"timing oracle 5\", \"actual\": \"bad-splits\", \"expected\": \"bad-splits\", \"passed\": true}, {\"check\": \"timing oracle 6\", \"actual\": [\"free\", \"dark\", 0], \"expected\": [6, \"green\", 4], \"passed\": false}, {\"check\": \"timing oracle 7\", \"actual\": [\"free\", \"dark\", 0], \"expected\": [6, \"red\", 2], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":42.876,"exit_code":0,"observations":[{"actual":[2,"green",25],"check":"timing oracle 0","expected":[2,"green",25],"passed":true},{"actual":[2,"green",27],"check":"timing oracle 1","expected":[2,"green",27],"passed":true},{"actual":[6,"red",1],"check":"timing oracle 2","expected":[6,"red",1],"passed":true},{"actual":[4,"green",10],"check":"timing oracle 3","expected":[4,"green",10],"passed":true},{"actual":"bad-splits","check":"timing oracle 4","expected":"bad-splits","passed":true},{"actual":"bad-splits","check":"timing oracle 5","expected":"bad-splits","passed":true},{"actual":[6,"green",4],"check":"timing oracle 6","expected":[6,"green",4],"passed":true},{"actual":[6,"red",2],"check":"timing oracle 7","expected":[6,"red",2],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"timing oracle 0\", \"actual\": [2, \"green\", 25], \"expected\": [2, \"green\", 25], \"passed\": true}, {\"check\": \"timing oracle 1\", \"actual\": [2, \"green\", 27], \"expected\": [2, \"green\", 27], \"passed\": true}, {\"check\": \"timing oracle 2\", \"actual\": [6, \"red\", 1], \"expected\": [6, \"red\", 1], \"passed\": true}, {\"check\": \"timing oracle 3\", \"actual\": [4, \"green\", 10], \"expected\": [4, \"green\", 10], \"passed\": true}, {\"check\": \"timing oracle 4\", \"actual\": \"bad-splits\", \"expected\": \"bad-splits\", \"passed\": true}, {\"check\": \"timing oracle 5\", \"actual\": \"bad-splits\", \"expected\": \"bad-splits\", \"passed\": true}, {\"check\": \"timing oracle 6\", \"actual\": [6, \"green\", 4], \"expected\": [6, \"green\", 4], \"passed\": true}, {\"check\": \"timing oracle 7\", \"actual\": [6, \"red\", 2], \"expected\": [6, \"red\", 2], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}