FAILURE MAP
← Case archive

FA-68116 / Traffic signal timing plans / Open access

Dual-ring barrier sequencing: skipped phases still consume their duration · case 01

Dual-ring barrier sequencing returns a wrong result when skipped phases still consume their duration.

Verified by executionVariant 1 · 8 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

The time advance is outside the call test, so a phase with no demand still holds the ring for its full duration.

VERIFIED REPAIR

Restore the skipped phase time rule so that the step reads `starts.append([ph, t]) t += dur`.

Unsuccessful approach: Treating the main-street phases as always timing is a recall assumption the contract does not make.

Case contract

Input {ring1: [[1,d],[2,d],[3,d],[4,d]], ring2: [[5,d],[6,d],[7,d],[8,d]] with durations including clearance, calls, lag}. Phases 1-2/5-6 are left of the barrier and 3-4/7-8 right of it. On each side both rings start together at the barrier; if the first phase of a ring's pair is in lag the pair is swapped. Phases without calls are skipped and take no time. Both rings cross a barrier together when the slower ring finishes. Return {starts: sorted [phase, start], cycle}.

Why this case matters

Signal timing arithmetic is exact and integer or rational; a wrong rule silently produces unsafe or inefficient timing plans.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    calls = set(x['calls'])
    lag = set(x['lag'])
    t0 = 0
    starts = []
    for side in (0, 1):
        ends = []
        for ring in (x['ring1'], x['ring2']):
            pair = ring[2 * side:2 * side + 2]
            if pair[0][0] in lag:
                pair = [pair[1], pair[0]]
            t = t0
            for ph, dur in pair:
                if ph in calls:
                    starts.append([ph, t])
                t += dur
            ends.append(t)
        t0 = max(ends)
    return {'starts': sorted(starts), 'cycle': t0}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[({'ring1': [[1, 21], [2, 10], [3, 24], [4, 36]], 'ring2': [[5, 8], [6, 10], [7, 11], [8, 12]], 'calls': [1, 3, 4, 5, 6, 8], 'lag': [6, 8]}, {'starts': [[1, 0], [3, 21], [4, 45], [5, 0], [6, 8], [8, 21]], 'cycle': 81}), ({'ring1': [[1, 37], [2, 15], [3, 25], [4, 24]], 'ring2': [[5, 27], [6, 31], [7, 30], [8, 40]], 'calls': [1, 2, 3, 5], 'lag': [1, 7]}, {'starts': [[1, 15], [2, 0], [3, 52], [5, 0]], 'cycle': 77}), ({'ring1': [[1, 29], [2, 37], [3, 36], [4, 30]], 'ring2': [[5, 13], [6, 32], [7, 33], [8, 14]], 'calls': [1, 2, 3, 4, 5, 6, 7], 'lag': [4]}, {'starts': [[1, 0], [2, 29], [3, 66], [4, 102], [5, 0], [6, 13], [7, 66]], 'cycle': 132}), ({'ring1': [[1, 19], [2, 31], [3, 11], [4, 28]], 'ring2': [[5, 27], [6, 22], [7, 24], [8, 10]], 'calls': [1, 2, 3, 5, 7, 8], 'lag': [2, 7]}, {'starts': [[1, 0], [2, 19], [3, 50], [5, 0], [7, 60], [8, 50]], 'cycle': 84}), ({'ring1': [[1, 14], [2, 25], [3, 38], [4, 20]], 'ring2': [[5, 8], [6, 21], [7, 18], [8, 9]], 'calls': [1, 2, 3, 4, 5, 6, 7], 'lag': [3, 4, 6]}, {'starts': [[1, 0], [2, 14], [3, 59], [4, 39], [5, 0], [6, 8], [7, 39]], 'cycle': 97}), ({'ring1': [[1, 12], [2, 30], [3, 10], [4, 25]], 'ring2': [[5, 15], [6, 20], [7, 12], [8, 30]], 'calls': [1, 2, 3, 4, 5, 6, 7, 8], 'lag': [1]}, {'starts': [[1, 30], [2, 0], [3, 42], [4, 52], [5, 0], [6, 15], [7, 42], [8, 54]], 'cycle': 84}), ({'ring1': [[1, 12], [2, 30], [3, 10], [4, 25]], 'ring2': [[5, 15], [6, 20], [7, 12], [8, 30]], 'calls': [2, 4, 6, 7, 8], 'lag': []}, {'starts': [[2, 0], [4, 30], [6, 0], [7, 30], [8, 42]], 'cycle': 72}), ({'ring1': [[1, 18], [2, 34], [3, 12], [4, 19]], 'ring2': [[5, 28], [6, 32], [7, 40], [8, 28]], 'calls': [1, 2, 3, 4, 5, 6, 7, 8], 'lag': [2, 4, 7]}, {'starts': [[1, 0], [2, 18], [3, 60], [4, 72], [5, 0], [6, 28], [7, 88], [8, 60]], 'cycle': 128})], [({'ring1': [[1, 25], [2, 39], [3, 14], [4, 17]], 'ring2': [[5, 19], [6, 19], [7, 21], [8, 8]], 'calls': [1, 3, 5, 7, 8], 'lag': [1]}, {'starts': [[1, 0], [3, 25], [5, 0], [7, 25], [8, 46]], 'cycle': 54}), ({'ring1': [[1, 22], [2, 38], [3, 34], [4, 26]], 'ring2': [[5, 20], [6, 35], [7, 33], [8, 39]], 'calls': [2, 3, 4, 5, 6, 7, 8], 'lag': [2, 6]}, {'starts': [[2, 0], [3, 55], [4, 89], [5, 0], [6, 20], [7, 55], [8, 88]], 'cycle': 127}), ({'ring1': [[1, 30], [2, 30], [3, 9], [4, 21]], 'ring2': [[5, 27], [6, 20], [7, 39], [8, 23]], 'calls': [1, 2, 3, 4, 7, 8], 'lag': [3, 8]}, {'starts': [[1, 0], [2, 30], [3, 81], [4, 60], [7, 60], [8, 99]], 'cycle': 122}), ({'ring1': [[1, 12], [2, 30], [3, 10], [4, 25]], 'ring2': [[5, 15], [6, 20], [7, 12], [8, 30]], 'calls': [2, 4, 6, 7, 8], 'lag': []}, {'starts': [[2, 0], [4, 30], [6, 0], [7, 30], [8, 42]], 'cycle': 72}), ({'ring1': [[1, 26], [2, 35], [3, 18], [4, 27]], 'ring2': [[5, 23], [6, 11], [7, 35], [8, 40]], 'calls': [1, 2, 4, 5, 7, 8], 'lag': [2]}, {'starts': [[1, 0], [2, 26], [4, 61], [5, 0], [7, 61], [8, 96]], 'cycle': 136}), ({'ring1': [[1, 12], [2, 30], [3, 10], [4, 25]], 'ring2': [[5, 15], [6, 20], [7, 12], [8, 30]], 'calls': [1, 2, 3, 4, 5, 6, 7, 8], 'lag': [1]}, {'starts': [[1, 30], [2, 0], [3, 42], [4, 52], [5, 0], [6, 15], [7, 42], [8, 54]], 'cycle': 84}), ({'ring1': [[1, 24], [2, 31], [3, 27], [4, 26]], 'ring2': [[5, 26], [6, 9], [7, 31], [8, 30]], 'calls': [1, 2, 3, 4, 5, 6, 7, 8], 'lag': [4, 5]}, {'starts': [[1, 0], [2, 24], [3, 55], [4, 82], [5, 9], [6, 0], [7, 55], [8, 86]], 'cycle': 116}), ({'ring1': [[1, 27], [2, 34], [3, 25], [4, 19]], 'ring2': [[5, 21], [6, 36], [7, 36], [8, 11]], 'calls': [1, 2, 4, 5, 7], 'lag': [5]}, {'starts': [[1, 0], [2, 27], [4, 61], [5, 0], [7, 61]], 'cycle': 97})], [({'ring1': [[1, 16], [2, 39], [3, 27], [4, 11]], 'ring2': [[5, 9], [6, 21], [7, 35], [8, 30]], 'calls': [1, 2, 3, 5, 6, 7], 'lag': [3, 6, 7]}, {'starts': [[1, 0], [2, 16], [3, 55], [5, 0], [6, 9], [7, 55]], 'cycle': 90}), ({'ring1': [[1, 28], [2, 39], [3, 11], [4, 35]], 'ring2': [[5, 12], [6, 27], [7, 28], [8, 32]], 'calls': [1, 2, 3, 6, 8], 'lag': [2, 8]}, {'starts': [[1, 0], [2, 28], [3, 67], [6, 0], [8, 67]], 'cycle': 99}), ({'ring1': [[1, 37], [2, 28], [3, 14], [4, 40]], 'ring2': [[5, 20], [6, 13], [7, 26], [8, 20]], 'calls': [1, 2, 3, 4, 7, 8], 'lag': [1, 6]}, {'starts': [[1, 28], [2, 0], [3, 65], [4, 79], [7, 65], [8, 91]], 'cycle': 119}), ({'ring1': [[1, 12], [2, 30], [3, 10], [4, 25]], 'ring2': [[5, 15], [6, 20], [7, 12], [8, 30]], 'calls': [2, 4, 6, 7, 8], 'lag': []}, {'starts': [[2, 0], [4, 30], [6, 0], [7, 30], [8, 42]], 'cycle': 72}), ({'ring1': [[1, 12], [2, 30], [3, 10], [4, 25]], 'ring2': [[5, 15], [6, 20], [7, 12], [8, 30]], 'calls': [1, 2, 3, 4, 5, 6, 7, 8], 'lag': [1]}, {'starts': [[1, 30], [2, 0], [3, 42], [4, 52], [5, 0], [6, 15], [7, 42], [8, 54]], 'cycle': 84}), ({'ring1': [[1, 21], [2, 16], [3, 29], [4, 37]], 'ring2': [[5, 30], [6, 28], [7, 16], [8, 39]], 'calls': [1, 2, 3, 4, 5, 6, 8], 'lag': [4, 7, 8]}, {'starts': [[1, 0], [2, 21], [3, 58], [4, 87], [5, 0], [6, 30], [8, 58]], 'cycle': 124}), ({'ring1': [[1, 23], [2, 24], [3, 12], [4, 26]], 'ring2': [[5, 11], [6, 28], [7, 38], [8, 34]], 'calls': [1, 3, 5, 7], 'lag': [2, 4, 5, 7]}, {'starts': [[1, 0], [3, 23], [5, 0], [7, 23]], 'cycle': 61}), ({'ring1': [[1, 37], [2, 15], [3, 36], [4, 34]], 'ring2': [[5, 15], [6, 33], [7, 31], [8, 19]], 'calls': [2, 3, 4, 5, 8], 'lag': [1, 3, 6]}, {'starts': [[2, 0], [3, 49], [4, 15], [5, 0], [8, 15]], 'cycle': 85})], [({'ring1': [[1, 18], [2, 28], [3, 16], [4, 40]], 'ring2': [[5, 14], [6, 18], [7, 14], [8, 8]], 'calls': [1, 3, 4, 5, 7, 8], 'lag': [7]}, {'starts': [[1, 0], [3, 18], [4, 34], [5, 0], [7, 26], [8, 18]], 'cycle': 74}), ({'ring1': [[1, 25], [2, 37], [3, 29], [4, 39]], 'ring2': [[5, 20], [6, 22], [7, 35], [8, 25]], 'calls': [2, 3, 5, 6, 8], 'lag': [6, 8]}, {'starts': [[2, 0], [3, 42], [5, 0], [6, 20], [8, 42]], 'cycle': 71}), ({'ring1': [[1, 12], [2, 30], [3, 10], [4, 25]], 'ring2': [[5, 15], [6, 20], [7, 12], [8, 30]], 'calls': [1, 2, 3, 4, 5, 6, 7, 8], 'lag': [1]}, {'starts': [[1, 30], [2, 0], [3, 42], [4, 52], [5, 0], [6, 15], [7, 42], [8, 54]], 'cycle': 84}), ({'ring1': [[1, 12], [2, 30], [3, 10], [4, 25]], 'ring2': [[5, 15], [6, 20], [7, 12], [8, 30]], 'calls': [2, 4, 6, 7, 8], 'lag': []}, {'starts': [[2, 0], [4, 30], [6, 0], [7, 30], [8, 42]], 'cycle': 72}), ({'ring1': [[1, 24], [2, 32], [3, 15], [4, 34]], 'ring2': [[5, 25], [6, 14], [7, 27], [8, 24]], 'calls': [1, 2, 3, 5, 6, 7, 8], 'lag': [8]}, {'starts': [[1, 0], [2, 24], [3, 56], [5, 0], [6, 25], [7, 56], [8, 83]], 'cycle': 107}), ({'ring1': [[1, 11], [2, 16], [3, 39], [4, 30]], 'ring2': [[5, 39], [6, 32], [7, 25], [8, 16]], 'calls': [1, 2, 3, 6, 8], 'lag': []}, {'starts': [[1, 0], [2, 11], [3, 32], [6, 0], [8, 32]], 'cycle': 71}), ({'ring1': [[1, 28], [2, 19], [3, 22], [4, 16]], 'ring2': [[5, 12], [6, 13], [7, 24], [8, 33]], 'calls': [1, 4, 5, 7, 8], 'lag': [5, 7]}, {'starts': [[1, 0], [4, 28], [5, 0], [7, 61], [8, 28]], 'cycle': 85}), ({'ring1': [[1, 13], [2, 17], [3, 17], [4, 21]], 'ring2': [[5, 23], [6, 15], [7, 9], [8, 12]], 'calls': [1, 2, 3, 4, 5, 6, 7, 8], 'lag': [1]}, {'starts': [[1, 17], [2, 0], [3, 38], [4, 55], [5, 0], [6, 23], [7, 38], [8, 47]], 'cycle': 76})], [({'ring1': [[1, 36], [2, 14], [3, 25], [4, 8]], 'ring2': [[5, 20], [6, 12], [7, 38], [8, 10]], 'calls': [2, 3, 4, 5, 8], 'lag': [1, 7]}, {'starts': [[2, 0], [3, 20], [4, 45], [5, 0], [8, 20]], 'cycle': 53}), ({'ring1': [[1, 24], [2, 12], [3, 31], [4, 23]], 'ring2': [[5, 26], [6, 34], [7, 9], [8, 27]], 'calls': [1, 3, 4, 6, 7], 'lag': [2, 3]}, {'starts': [[1, 0], [3, 57], [4, 34], [6, 0], [7, 34]], 'cycle': 88}), ({'ring1': [[1, 40], [2, 8], [3, 11], [4, 14]], 'ring2': [[5, 14], [6, 38], [7, 12], [8, 25]], 'calls': [1, 2, 3, 4, 5, 6, 7, 8], 'lag': [8]}, {'starts': [[1, 0], [2, 40], [3, 52], [4, 63], [5, 0], [6, 14], [7, 52], [8, 64]], 'cycle': 89}), ({'ring1': [[1, 38], [2, 25], [3, 11], [4, 13]], 'ring2': [[5, 31], [6, 32], [7, 29], [8, 35]], 'calls': [1, 2, 3, 4, 5, 7, 8], 'lag': [2, 7]}, {'starts': [[1, 0], [2, 38], [3, 63], [4, 74], [5, 0], [7, 98], [8, 63]], 'cycle': 127}), ({'ring1': [[1, 12], [2, 30], [3, 10], [4, 25]], 'ring2': [[5, 15], [6, 20], [7, 12], [8, 30]], 'calls': [2, 4, 6, 7, 8], 'lag': []}, {'starts': [[2, 0], [4, 30], [6, 0], [7, 30], [8, 42]], 'cycle': 72}), ({'ring1': [[1, 36], [2, 21], [3, 23], [4, 13]], 'ring2': [[5, 29], [6, 11], [7, 32], [8, 38]], 'calls': [1, 2, 3, 4, 5, 6, 7, 8], 'lag': [6, 7, 8]}, {'starts': [[1, 0], [2, 36], [3, 57], [4, 80], [5, 0], [6, 29], [7, 95], [8, 57]], 'cycle': 127}), ({'ring1': [[1, 12], [2, 30], [3, 10], [4, 25]], 'ring2': [[5, 15], [6, 20], [7, 12], [8, 30]], 'calls': [1, 2, 3, 4, 5, 6, 7, 8], 'lag': [1]}, {'starts': [[1, 30], [2, 0], [3, 42], [4, 52], [5, 0], [6, 15], [7, 42], [8, 54]], 'cycle': 84}), ({'ring1': [[1, 38], [2, 13], [3, 11], [4, 35]], 'ring2': [[5, 34], [6, 11], [7, 12], [8, 15]], 'calls': [1, 2, 5, 7, 8], 'lag': [1, 4, 5]}, {'starts': [[1, 13], [2, 0], [5, 0], [7, 51], [8, 63]], 'cycle': 78})]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check('timing oracle' + ' %d' % i, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
timing oracle 0{'cycle': 91, 'starts': [[1, 0], [3, 31], [4, 55], [5, 0], [6, 8], [8, 42]]}{'cycle': 81, 'starts': [[1, 0], [3, 21], [4, 45], [5, 0], [6, 8], [8, 21]]}Failed
timing oracle 1{'cycle': 128, 'starts': [[1, 15], [2, 0], [3, 58], [5, 0]]}{'cycle': 77, 'starts': [[1, 15], [2, 0], [3, 52], [5, 0]]}Failed
timing oracle 2{'cycle': 132, 'starts': [[1, 0], [2, 29], [3, 66], [4, 102], [5, 0], [6, 13], [7, 66]]}{'cycle': 132, 'starts': [[1, 0], [2, 29], [3, 66], [4, 102], [5, 0], [6, 13], [7, 66]]}Passed
timing oracle 3{'cycle': 89, 'starts': [[1, 0], [2, 19], [3, 50], [5, 0], [7, 60], [8, 50]]}{'cycle': 84, 'starts': [[1, 0], [2, 19], [3, 50], [5, 0], [7, 60], [8, 50]]}Failed
timing oracle 4{'cycle': 97, 'starts': [[1, 0], [2, 14], [3, 59], [4, 39], [5, 0], [6, 8], [7, 39]]}{'cycle': 97, 'starts': [[1, 0], [2, 14], [3, 59], [4, 39], [5, 0], [6, 8], [7, 39]]}Passed
timing oracle 5{'cycle': 84, 'starts': [[1, 30], [2, 0], [3, 42], [4, 52], [5, 0], [6, 15], [7, 42], [8, 54]]}{'cycle': 84, 'starts': [[1, 30], [2, 0], [3, 42], [4, 52], [5, 0], [6, 15], [7, 42], [8, 54]]}Passed
timing oracle 6{'cycle': 84, 'starts': [[2, 12], [4, 52], [6, 15], [7, 42], [8, 54]]}{'cycle': 72, 'starts': [[2, 0], [4, 30], [6, 0], [7, 30], [8, 42]]}Failed
timing oracle 7{'cycle': 128, 'starts': [[1, 0], [2, 18], [3, 60], [4, 72], [5, 0], [6, 28], [7, 88], [8, 60]]}{'cycle': 128, 'starts': [[1, 0], [2, 18], [3, 60], [4, 72], [5, 0], [6, 28], [7, 88], [8, 60]]}Passed

SHA-256 / 3dc533741ded6c5f353346fb8df6071c576ac16f647b69154f8fb87b47024e7e

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    calls = set(x['calls'])
    lag = set(x['lag'])
    t0 = 0
    starts = []
    for side in (0, 1):
        ends = []
        for ring in (x['ring1'], x['ring2']):
            pair = ring[2 * side:2 * side + 2]
            if pair[0][0] in lag:
                pair = [pair[1], pair[0]]
            t = t0
            for ph, dur in pair:
                if ph in calls:
                    starts.append([ph, t])
                    t += dur
                elif ph in (2, 6):
                    t += dur
            ends.append(t)
        t0 = max(ends)
    return {'starts': sorted(starts), 'cycle': t0}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[({'ring1': [[1, 21], [2, 10], [3, 24], [4, 36]], 'ring2': [[5, 8], [6, 10], [7, 11], [8, 12]], 'calls': [1, 3, 4, 5, 6, 8], 'lag': [6, 8]}, {'starts': [[1, 0], [3, 21], [4, 45], [5, 0], [6, 8], [8, 21]], 'cycle': 81}), ({'ring1': [[1, 37], [2, 15], [3, 25], [4, 24]], 'ring2': [[5, 27], [6, 31], [7, 30], [8, 40]], 'calls': [1, 2, 3, 5], 'lag': [1, 7]}, {'starts': [[1, 15], [2, 0], [3, 52], [5, 0]], 'cycle': 77}), ({'ring1': [[1, 29], [2, 37], [3, 36], [4, 30]], 'ring2': [[5, 13], [6, 32], [7, 33], [8, 14]], 'calls': [1, 2, 3, 4, 5, 6, 7], 'lag': [4]}, {'starts': [[1, 0], [2, 29], [3, 66], [4, 102], [5, 0], [6, 13], [7, 66]], 'cycle': 132}), ({'ring1': [[1, 19], [2, 31], [3, 11], [4, 28]], 'ring2': [[5, 27], [6, 22], [7, 24], [8, 10]], 'calls': [1, 2, 3, 5, 7, 8], 'lag': [2, 7]}, {'starts': [[1, 0], [2, 19], [3, 50], [5, 0], [7, 60], [8, 50]], 'cycle': 84}), ({'ring1': [[1, 14], [2, 25], [3, 38], [4, 20]], 'ring2': [[5, 8], [6, 21], [7, 18], [8, 9]], 'calls': [1, 2, 3, 4, 5, 6, 7], 'lag': [3, 4, 6]}, {'starts': [[1, 0], [2, 14], [3, 59], [4, 39], [5, 0], [6, 8], [7, 39]], 'cycle': 97}), ({'ring1': [[1, 12], [2, 30], [3, 10], [4, 25]], 'ring2': [[5, 15], [6, 20], [7, 12], [8, 30]], 'calls': [1, 2, 3, 4, 5, 6, 7, 8], 'lag': [1]}, {'starts': [[1, 30], [2, 0], [3, 42], [4, 52], [5, 0], [6, 15], [7, 42], [8, 54]], 'cycle': 84}), ({'ring1': [[1, 12], [2, 30], [3, 10], [4, 25]], 'ring2': [[5, 15], [6, 20], [7, 12], [8, 30]], 'calls': [2, 4, 6, 7, 8], 'lag': []}, {'starts': [[2, 0], [4, 30], [6, 0], [7, 30], [8, 42]], 'cycle': 72}), ({'ring1': [[1, 18], [2, 34], [3, 12], [4, 19]], 'ring2': [[5, 28], [6, 32], [7, 40], [8, 28]], 'calls': [1, 2, 3, 4, 5, 6, 7, 8], 'lag': [2, 4, 7]}, {'starts': [[1, 0], [2, 18], [3, 60], [4, 72], [5, 0], [6, 28], [7, 88], [8, 60]], 'cycle': 128})], [({'ring1': [[1, 25], [2, 39], [3, 14], [4, 17]], 'ring2': [[5, 19], [6, 19], [7, 21], [8, 8]], 'calls': [1, 3, 5, 7, 8], 'lag': [1]}, {'starts': [[1, 0], [3, 25], [5, 0], [7, 25], [8, 46]], 'cycle': 54}), ({'ring1': [[1, 22], [2, 38], [3, 34], [4, 26]], 'ring2': [[5, 20], [6, 35], [7, 33], [8, 39]], 'calls': [2, 3, 4, 5, 6, 7, 8], 'lag': [2, 6]}, {'starts': [[2, 0], [3, 55], [4, 89], [5, 0], [6, 20], [7, 55], [8, 88]], 'cycle': 127}), ({'ring1': [[1, 30], [2, 30], [3, 9], [4, 21]], 'ring2': [[5, 27], [6, 20], [7, 39], [8, 23]], 'calls': [1, 2, 3, 4, 7, 8], 'lag': [3, 8]}, {'starts': [[1, 0], [2, 30], [3, 81], [4, 60], [7, 60], [8, 99]], 'cycle': 122}), ({'ring1': [[1, 12], [2, 30], [3, 10], [4, 25]], 'ring2': [[5, 15], [6, 20], [7, 12], [8, 30]], 'calls': [2, 4, 6, 7, 8], 'lag': []}, {'starts': [[2, 0], [4, 30], [6, 0], [7, 30], [8, 42]], 'cycle': 72}), ({'ring1': [[1, 26], [2, 35], [3, 18], [4, 27]], 'ring2': [[5, 23], [6, 11], [7, 35], [8, 40]], 'calls': [1, 2, 4, 5, 7, 8], 'lag': [2]}, {'starts': [[1, 0], [2, 26], [4, 61], [5, 0], [7, 61], [8, 96]], 'cycle': 136}), ({'ring1': [[1, 12], [2, 30], [3, 10], [4, 25]], 'ring2': [[5, 15], [6, 20], [7, 12], [8, 30]], 'calls': [1, 2, 3, 4, 5, 6, 7, 8], 'lag': [1]}, {'starts': [[1, 30], [2, 0], [3, 42], [4, 52], [5, 0], [6, 15], [7, 42], [8, 54]], 'cycle': 84}), ({'ring1': [[1, 24], [2, 31], [3, 27], [4, 26]], 'ring2': [[5, 26], [6, 9], [7, 31], [8, 30]], 'calls': [1, 2, 3, 4, 5, 6, 7, 8], 'lag': [4, 5]}, {'starts': [[1, 0], [2, 24], [3, 55], [4, 82], [5, 9], [6, 0], [7, 55], [8, 86]], 'cycle': 116}), ({'ring1': [[1, 27], [2, 34], [3, 25], [4, 19]], 'ring2': [[5, 21], [6, 36], [7, 36], [8, 11]], 'calls': [1, 2, 4, 5, 7], 'lag': [5]}, {'starts': [[1, 0], [2, 27], [4, 61], [5, 0], [7, 61]], 'cycle': 97})], [({'ring1': [[1, 16], [2, 39], [3, 27], [4, 11]], 'ring2': [[5, 9], [6, 21], [7, 35], [8, 30]], 'calls': [1, 2, 3, 5, 6, 7], 'lag': [3, 6, 7]}, {'starts': [[1, 0], [2, 16], [3, 55], [5, 0], [6, 9], [7, 55]], 'cycle': 90}), ({'ring1': [[1, 28], [2, 39], [3, 11], [4, 35]], 'ring2': [[5, 12], [6, 27], [7, 28], [8, 32]], 'calls': [1, 2, 3, 6, 8], 'lag': [2, 8]}, {'starts': [[1, 0], [2, 28], [3, 67], [6, 0], [8, 67]], 'cycle': 99}), ({'ring1': [[1, 37], [2, 28], [3, 14], [4, 40]], 'ring2': [[5, 20], [6, 13], [7, 26], [8, 20]], 'calls': [1, 2, 3, 4, 7, 8], 'lag': [1, 6]}, {'starts': [[1, 28], [2, 0], [3, 65], [4, 79], [7, 65], [8, 91]], 'cycle': 119}), ({'ring1': [[1, 12], [2, 30], [3, 10], [4, 25]], 'ring2': [[5, 15], [6, 20], [7, 12], [8, 30]], 'calls': [2, 4, 6, 7, 8], 'lag': []}, {'starts': [[2, 0], [4, 30], [6, 0], [7, 30], [8, 42]], 'cycle': 72}), ({'ring1': [[1, 12], [2, 30], [3, 10], [4, 25]], 'ring2': [[5, 15], [6, 20], [7, 12], [8, 30]], 'calls': [1, 2, 3, 4, 5, 6, 7, 8], 'lag': [1]}, {'starts': [[1, 30], [2, 0], [3, 42], [4, 52], [5, 0], [6, 15], [7, 42], [8, 54]], 'cycle': 84}), ({'ring1': [[1, 21], [2, 16], [3, 29], [4, 37]], 'ring2': [[5, 30], [6, 28], [7, 16], [8, 39]], 'calls': [1, 2, 3, 4, 5, 6, 8], 'lag': [4, 7, 8]}, {'starts': [[1, 0], [2, 21], [3, 58], [4, 87], [5, 0], [6, 30], [8, 58]], 'cycle': 124}), ({'ring1': [[1, 23], [2, 24], [3, 12], [4, 26]], 'ring2': [[5, 11], [6, 28], [7, 38], [8, 34]], 'calls': [1, 3, 5, 7], 'lag': [2, 4, 5, 7]}, {'starts': [[1, 0], [3, 23], [5, 0], [7, 23]], 'cycle': 61}), ({'ring1': [[1, 37], [2, 15], [3, 36], [4, 34]], 'ring2': [[5, 15], [6, 33], [7, 31], [8, 19]], 'calls': [2, 3, 4, 5, 8], 'lag': [1, 3, 6]}, {'starts': [[2, 0], [3, 49], [4, 15], [5, 0], [8, 15]], 'cycle': 85})], [({'ring1': [[1, 18], [2, 28], [3, 16], [4, 40]], 'ring2': [[5, 14], [6, 18], [7, 14], [8, 8]], 'calls': [1, 3, 4, 5, 7, 8], 'lag': [7]}, {'starts': [[1, 0], [3, 18], [4, 34], [5, 0], [7, 26], [8, 18]], 'cycle': 74}), ({'ring1': [[1, 25], [2, 37], [3, 29], [4, 39]], 'ring2': [[5, 20], [6, 22], [7, 35], [8, 25]], 'calls': [2, 3, 5, 6, 8], 'lag': [6, 8]}, {'starts': [[2, 0], [3, 42], [5, 0], [6, 20], [8, 42]], 'cycle': 71}), ({'ring1': [[1, 12], [2, 30], [3, 10], [4, 25]], 'ring2': [[5, 15], [6, 20], [7, 12], [8, 30]], 'calls': [1, 2, 3, 4, 5, 6, 7, 8], 'lag': [1]}, {'starts': [[1, 30], [2, 0], [3, 42], [4, 52], [5, 0], [6, 15], [7, 42], [8, 54]], 'cycle': 84}), ({'ring1': [[1, 12], [2, 30], [3, 10], [4, 25]], 'ring2': [[5, 15], [6, 20], [7, 12], [8, 30]], 'calls': [2, 4, 6, 7, 8], 'lag': []}, {'starts': [[2, 0], [4, 30], [6, 0], [7, 30], [8, 42]], 'cycle': 72}), ({'ring1': [[1, 24], [2, 32], [3, 15], [4, 34]], 'ring2': [[5, 25], [6, 14], [7, 27], [8, 24]], 'calls': [1, 2, 3, 5, 6, 7, 8], 'lag': [8]}, {'starts': [[1, 0], [2, 24], [3, 56], [5, 0], [6, 25], [7, 56], [8, 83]], 'cycle': 107}), ({'ring1': [[1, 11], [2, 16], [3, 39], [4, 30]], 'ring2': [[5, 39], [6, 32], [7, 25], [8, 16]], 'calls': [1, 2, 3, 6, 8], 'lag': []}, {'starts': [[1, 0], [2, 11], [3, 32], [6, 0], [8, 32]], 'cycle': 71}), ({'ring1': [[1, 28], [2, 19], [3, 22], [4, 16]], 'ring2': [[5, 12], [6, 13], [7, 24], [8, 33]], 'calls': [1, 4, 5, 7, 8], 'lag': [5, 7]}, {'starts': [[1, 0], [4, 28], [5, 0], [7, 61], [8, 28]], 'cycle': 85}), ({'ring1': [[1, 13], [2, 17], [3, 17], [4, 21]], 'ring2': [[5, 23], [6, 15], [7, 9], [8, 12]], 'calls': [1, 2, 3, 4, 5, 6, 7, 8], 'lag': [1]}, {'starts': [[1, 17], [2, 0], [3, 38], [4, 55], [5, 0], [6, 23], [7, 38], [8, 47]], 'cycle': 76})], [({'ring1': [[1, 36], [2, 14], [3, 25], [4, 8]], 'ring2': [[5, 20], [6, 12], [7, 38], [8, 10]], 'calls': [2, 3, 4, 5, 8], 'lag': [1, 7]}, {'starts': [[2, 0], [3, 20], [4, 45], [5, 0], [8, 20]], 'cycle': 53}), ({'ring1': [[1, 24], [2, 12], [3, 31], [4, 23]], 'ring2': [[5, 26], [6, 34], [7, 9], [8, 27]], 'calls': [1, 3, 4, 6, 7], 'lag': [2, 3]}, {'starts': [[1, 0], [3, 57], [4, 34], [6, 0], [7, 34]], 'cycle': 88}), ({'ring1': [[1, 40], [2, 8], [3, 11], [4, 14]], 'ring2': [[5, 14], [6, 38], [7, 12], [8, 25]], 'calls': [1, 2, 3, 4, 5, 6, 7, 8], 'lag': [8]}, {'starts': [[1, 0], [2, 40], [3, 52], [4, 63], [5, 0], [6, 14], [7, 52], [8, 64]], 'cycle': 89}), ({'ring1': [[1, 38], [2, 25], [3, 11], [4, 13]], 'ring2': [[5, 31], [6, 32], [7, 29], [8, 35]], 'calls': [1, 2, 3, 4, 5, 7, 8], 'lag': [2, 7]}, {'starts': [[1, 0], [2, 38], [3, 63], [4, 74], [5, 0], [7, 98], [8, 63]], 'cycle': 127}), ({'ring1': [[1, 12], [2, 30], [3, 10], [4, 25]], 'ring2': [[5, 15], [6, 20], [7, 12], [8, 30]], 'calls': [2, 4, 6, 7, 8], 'lag': []}, {'starts': [[2, 0], [4, 30], [6, 0], [7, 30], [8, 42]], 'cycle': 72}), ({'ring1': [[1, 36], [2, 21], [3, 23], [4, 13]], 'ring2': [[5, 29], [6, 11], [7, 32], [8, 38]], 'calls': [1, 2, 3, 4, 5, 6, 7, 8], 'lag': [6, 7, 8]}, {'starts': [[1, 0], [2, 36], [3, 57], [4, 80], [5, 0], [6, 29], [7, 95], [8, 57]], 'cycle': 127}), ({'ring1': [[1, 12], [2, 30], [3, 10], [4, 25]], 'ring2': [[5, 15], [6, 20], [7, 12], [8, 30]], 'calls': [1, 2, 3, 4, 5, 6, 7, 8], 'lag': [1]}, {'starts': [[1, 30], [2, 0], [3, 42], [4, 52], [5, 0], [6, 15], [7, 42], [8, 54]], 'cycle': 84}), ({'ring1': [[1, 38], [2, 13], [3, 11], [4, 35]], 'ring2': [[5, 34], [6, 11], [7, 12], [8, 15]], 'calls': [1, 2, 5, 7, 8], 'lag': [1, 4, 5]}, {'starts': [[1, 13], [2, 0], [5, 0], [7, 51], [8, 63]], 'cycle': 78})]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check('timing oracle' + ' %d' % i, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
timing oracle 0{'cycle': 91, 'starts': [[1, 0], [3, 31], [4, 55], [5, 0], [6, 8], [8, 31]]}{'cycle': 81, 'starts': [[1, 0], [3, 21], [4, 45], [5, 0], [6, 8], [8, 21]]}Failed
timing oracle 1{'cycle': 83, 'starts': [[1, 15], [2, 0], [3, 58], [5, 0]]}{'cycle': 77, 'starts': [[1, 15], [2, 0], [3, 52], [5, 0]]}Failed
timing oracle 2{'cycle': 132, 'starts': [[1, 0], [2, 29], [3, 66], [4, 102], [5, 0], [6, 13], [7, 66]]}{'cycle': 132, 'starts': [[1, 0], [2, 29], [3, 66], [4, 102], [5, 0], [6, 13], [7, 66]]}Passed
timing oracle 3{'cycle': 84, 'starts': [[1, 0], [2, 19], [3, 50], [5, 0], [7, 60], [8, 50]]}{'cycle': 84, 'starts': [[1, 0], [2, 19], [3, 50], [5, 0], [7, 60], [8, 50]]}Passed
timing oracle 4{'cycle': 97, 'starts': [[1, 0], [2, 14], [3, 59], [4, 39], [5, 0], [6, 8], [7, 39]]}{'cycle': 97, 'starts': [[1, 0], [2, 14], [3, 59], [4, 39], [5, 0], [6, 8], [7, 39]]}Passed
timing oracle 5{'cycle': 84, 'starts': [[1, 30], [2, 0], [3, 42], [4, 52], [5, 0], [6, 15], [7, 42], [8, 54]]}{'cycle': 84, 'starts': [[1, 30], [2, 0], [3, 42], [4, 52], [5, 0], [6, 15], [7, 42], [8, 54]]}Passed
timing oracle 6{'cycle': 72, 'starts': [[2, 0], [4, 30], [6, 0], [7, 30], [8, 42]]}{'cycle': 72, 'starts': [[2, 0], [4, 30], [6, 0], [7, 30], [8, 42]]}Passed
timing oracle 7{'cycle': 128, 'starts': [[1, 0], [2, 18], [3, 60], [4, 72], [5, 0], [6, 28], [7, 88], [8, 60]]}{'cycle': 128, 'starts': [[1, 0], [2, 18], [3, 60], [4, 72], [5, 0], [6, 28], [7, 88], [8, 60]]}Passed

SHA-256 / a38f928455915a589692282f30ef2f9f9d2cefa18673d6f5484eee2d8d6b971b

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    calls = set(x['calls'])
    lag = set(x['lag'])
    t0 = 0
    starts = []
    for side in (0, 1):
        ends = []
        for ring in (x['ring1'], x['ring2']):
            pair = ring[2 * side:2 * side + 2]
            if pair[0][0] in lag:
                pair = [pair[1], pair[0]]
            t = t0
            for ph, dur in pair:
                if ph in calls:
                    starts.append([ph, t])
                    t += dur
            ends.append(t)
        t0 = max(ends)
    return {'starts': sorted(starts), 'cycle': t0}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[({'ring1': [[1, 21], [2, 10], [3, 24], [4, 36]], 'ring2': [[5, 8], [6, 10], [7, 11], [8, 12]], 'calls': [1, 3, 4, 5, 6, 8], 'lag': [6, 8]}, {'starts': [[1, 0], [3, 21], [4, 45], [5, 0], [6, 8], [8, 21]], 'cycle': 81}), ({'ring1': [[1, 37], [2, 15], [3, 25], [4, 24]], 'ring2': [[5, 27], [6, 31], [7, 30], [8, 40]], 'calls': [1, 2, 3, 5], 'lag': [1, 7]}, {'starts': [[1, 15], [2, 0], [3, 52], [5, 0]], 'cycle': 77}), ({'ring1': [[1, 29], [2, 37], [3, 36], [4, 30]], 'ring2': [[5, 13], [6, 32], [7, 33], [8, 14]], 'calls': [1, 2, 3, 4, 5, 6, 7], 'lag': [4]}, {'starts': [[1, 0], [2, 29], [3, 66], [4, 102], [5, 0], [6, 13], [7, 66]], 'cycle': 132}), ({'ring1': [[1, 19], [2, 31], [3, 11], [4, 28]], 'ring2': [[5, 27], [6, 22], [7, 24], [8, 10]], 'calls': [1, 2, 3, 5, 7, 8], 'lag': [2, 7]}, {'starts': [[1, 0], [2, 19], [3, 50], [5, 0], [7, 60], [8, 50]], 'cycle': 84}), ({'ring1': [[1, 14], [2, 25], [3, 38], [4, 20]], 'ring2': [[5, 8], [6, 21], [7, 18], [8, 9]], 'calls': [1, 2, 3, 4, 5, 6, 7], 'lag': [3, 4, 6]}, {'starts': [[1, 0], [2, 14], [3, 59], [4, 39], [5, 0], [6, 8], [7, 39]], 'cycle': 97}), ({'ring1': [[1, 12], [2, 30], [3, 10], [4, 25]], 'ring2': [[5, 15], [6, 20], [7, 12], [8, 30]], 'calls': [1, 2, 3, 4, 5, 6, 7, 8], 'lag': [1]}, {'starts': [[1, 30], [2, 0], [3, 42], [4, 52], [5, 0], [6, 15], [7, 42], [8, 54]], 'cycle': 84}), ({'ring1': [[1, 12], [2, 30], [3, 10], [4, 25]], 'ring2': [[5, 15], [6, 20], [7, 12], [8, 30]], 'calls': [2, 4, 6, 7, 8], 'lag': []}, {'starts': [[2, 0], [4, 30], [6, 0], [7, 30], [8, 42]], 'cycle': 72}), ({'ring1': [[1, 18], [2, 34], [3, 12], [4, 19]], 'ring2': [[5, 28], [6, 32], [7, 40], [8, 28]], 'calls': [1, 2, 3, 4, 5, 6, 7, 8], 'lag': [2, 4, 7]}, {'starts': [[1, 0], [2, 18], [3, 60], [4, 72], [5, 0], [6, 28], [7, 88], [8, 60]], 'cycle': 128})], [({'ring1': [[1, 25], [2, 39], [3, 14], [4, 17]], 'ring2': [[5, 19], [6, 19], [7, 21], [8, 8]], 'calls': [1, 3, 5, 7, 8], 'lag': [1]}, {'starts': [[1, 0], [3, 25], [5, 0], [7, 25], [8, 46]], 'cycle': 54}), ({'ring1': [[1, 22], [2, 38], [3, 34], [4, 26]], 'ring2': [[5, 20], [6, 35], [7, 33], [8, 39]], 'calls': [2, 3, 4, 5, 6, 7, 8], 'lag': [2, 6]}, {'starts': [[2, 0], [3, 55], [4, 89], [5, 0], [6, 20], [7, 55], [8, 88]], 'cycle': 127}), ({'ring1': [[1, 30], [2, 30], [3, 9], [4, 21]], 'ring2': [[5, 27], [6, 20], [7, 39], [8, 23]], 'calls': [1, 2, 3, 4, 7, 8], 'lag': [3, 8]}, {'starts': [[1, 0], [2, 30], [3, 81], [4, 60], [7, 60], [8, 99]], 'cycle': 122}), ({'ring1': [[1, 12], [2, 30], [3, 10], [4, 25]], 'ring2': [[5, 15], [6, 20], [7, 12], [8, 30]], 'calls': [2, 4, 6, 7, 8], 'lag': []}, {'starts': [[2, 0], [4, 30], [6, 0], [7, 30], [8, 42]], 'cycle': 72}), ({'ring1': [[1, 26], [2, 35], [3, 18], [4, 27]], 'ring2': [[5, 23], [6, 11], [7, 35], [8, 40]], 'calls': [1, 2, 4, 5, 7, 8], 'lag': [2]}, {'starts': [[1, 0], [2, 26], [4, 61], [5, 0], [7, 61], [8, 96]], 'cycle': 136}), ({'ring1': [[1, 12], [2, 30], [3, 10], [4, 25]], 'ring2': [[5, 15], [6, 20], [7, 12], [8, 30]], 'calls': [1, 2, 3, 4, 5, 6, 7, 8], 'lag': [1]}, {'starts': [[1, 30], [2, 0], [3, 42], [4, 52], [5, 0], [6, 15], [7, 42], [8, 54]], 'cycle': 84}), ({'ring1': [[1, 24], [2, 31], [3, 27], [4, 26]], 'ring2': [[5, 26], [6, 9], [7, 31], [8, 30]], 'calls': [1, 2, 3, 4, 5, 6, 7, 8], 'lag': [4, 5]}, {'starts': [[1, 0], [2, 24], [3, 55], [4, 82], [5, 9], [6, 0], [7, 55], [8, 86]], 'cycle': 116}), ({'ring1': [[1, 27], [2, 34], [3, 25], [4, 19]], 'ring2': [[5, 21], [6, 36], [7, 36], [8, 11]], 'calls': [1, 2, 4, 5, 7], 'lag': [5]}, {'starts': [[1, 0], [2, 27], [4, 61], [5, 0], [7, 61]], 'cycle': 97})], [({'ring1': [[1, 16], [2, 39], [3, 27], [4, 11]], 'ring2': [[5, 9], [6, 21], [7, 35], [8, 30]], 'calls': [1, 2, 3, 5, 6, 7], 'lag': [3, 6, 7]}, {'starts': [[1, 0], [2, 16], [3, 55], [5, 0], [6, 9], [7, 55]], 'cycle': 90}), ({'ring1': [[1, 28], [2, 39], [3, 11], [4, 35]], 'ring2': [[5, 12], [6, 27], [7, 28], [8, 32]], 'calls': [1, 2, 3, 6, 8], 'lag': [2, 8]}, {'starts': [[1, 0], [2, 28], [3, 67], [6, 0], [8, 67]], 'cycle': 99}), ({'ring1': [[1, 37], [2, 28], [3, 14], [4, 40]], 'ring2': [[5, 20], [6, 13], [7, 26], [8, 20]], 'calls': [1, 2, 3, 4, 7, 8], 'lag': [1, 6]}, {'starts': [[1, 28], [2, 0], [3, 65], [4, 79], [7, 65], [8, 91]], 'cycle': 119}), ({'ring1': [[1, 12], [2, 30], [3, 10], [4, 25]], 'ring2': [[5, 15], [6, 20], [7, 12], [8, 30]], 'calls': [2, 4, 6, 7, 8], 'lag': []}, {'starts': [[2, 0], [4, 30], [6, 0], [7, 30], [8, 42]], 'cycle': 72}), ({'ring1': [[1, 12], [2, 30], [3, 10], [4, 25]], 'ring2': [[5, 15], [6, 20], [7, 12], [8, 30]], 'calls': [1, 2, 3, 4, 5, 6, 7, 8], 'lag': [1]}, {'starts': [[1, 30], [2, 0], [3, 42], [4, 52], [5, 0], [6, 15], [7, 42], [8, 54]], 'cycle': 84}), ({'ring1': [[1, 21], [2, 16], [3, 29], [4, 37]], 'ring2': [[5, 30], [6, 28], [7, 16], [8, 39]], 'calls': [1, 2, 3, 4, 5, 6, 8], 'lag': [4, 7, 8]}, {'starts': [[1, 0], [2, 21], [3, 58], [4, 87], [5, 0], [6, 30], [8, 58]], 'cycle': 124}), ({'ring1': [[1, 23], [2, 24], [3, 12], [4, 26]], 'ring2': [[5, 11], [6, 28], [7, 38], [8, 34]], 'calls': [1, 3, 5, 7], 'lag': [2, 4, 5, 7]}, {'starts': [[1, 0], [3, 23], [5, 0], [7, 23]], 'cycle': 61}), ({'ring1': [[1, 37], [2, 15], [3, 36], [4, 34]], 'ring2': [[5, 15], [6, 33], [7, 31], [8, 19]], 'calls': [2, 3, 4, 5, 8], 'lag': [1, 3, 6]}, {'starts': [[2, 0], [3, 49], [4, 15], [5, 0], [8, 15]], 'cycle': 85})], [({'ring1': [[1, 18], [2, 28], [3, 16], [4, 40]], 'ring2': [[5, 14], [6, 18], [7, 14], [8, 8]], 'calls': [1, 3, 4, 5, 7, 8], 'lag': [7]}, {'starts': [[1, 0], [3, 18], [4, 34], [5, 0], [7, 26], [8, 18]], 'cycle': 74}), ({'ring1': [[1, 25], [2, 37], [3, 29], [4, 39]], 'ring2': [[5, 20], [6, 22], [7, 35], [8, 25]], 'calls': [2, 3, 5, 6, 8], 'lag': [6, 8]}, {'starts': [[2, 0], [3, 42], [5, 0], [6, 20], [8, 42]], 'cycle': 71}), ({'ring1': [[1, 12], [2, 30], [3, 10], [4, 25]], 'ring2': [[5, 15], [6, 20], [7, 12], [8, 30]], 'calls': [1, 2, 3, 4, 5, 6, 7, 8], 'lag': [1]}, {'starts': [[1, 30], [2, 0], [3, 42], [4, 52], [5, 0], [6, 15], [7, 42], [8, 54]], 'cycle': 84}), ({'ring1': [[1, 12], [2, 30], [3, 10], [4, 25]], 'ring2': [[5, 15], [6, 20], [7, 12], [8, 30]], 'calls': [2, 4, 6, 7, 8], 'lag': []}, {'starts': [[2, 0], [4, 30], [6, 0], [7, 30], [8, 42]], 'cycle': 72}), ({'ring1': [[1, 24], [2, 32], [3, 15], [4, 34]], 'ring2': [[5, 25], [6, 14], [7, 27], [8, 24]], 'calls': [1, 2, 3, 5, 6, 7, 8], 'lag': [8]}, {'starts': [[1, 0], [2, 24], [3, 56], [5, 0], [6, 25], [7, 56], [8, 83]], 'cycle': 107}), ({'ring1': [[1, 11], [2, 16], [3, 39], [4, 30]], 'ring2': [[5, 39], [6, 32], [7, 25], [8, 16]], 'calls': [1, 2, 3, 6, 8], 'lag': []}, {'starts': [[1, 0], [2, 11], [3, 32], [6, 0], [8, 32]], 'cycle': 71}), ({'ring1': [[1, 28], [2, 19], [3, 22], [4, 16]], 'ring2': [[5, 12], [6, 13], [7, 24], [8, 33]], 'calls': [1, 4, 5, 7, 8], 'lag': [5, 7]}, {'starts': [[1, 0], [4, 28], [5, 0], [7, 61], [8, 28]], 'cycle': 85}), ({'ring1': [[1, 13], [2, 17], [3, 17], [4, 21]], 'ring2': [[5, 23], [6, 15], [7, 9], [8, 12]], 'calls': [1, 2, 3, 4, 5, 6, 7, 8], 'lag': [1]}, {'starts': [[1, 17], [2, 0], [3, 38], [4, 55], [5, 0], [6, 23], [7, 38], [8, 47]], 'cycle': 76})], [({'ring1': [[1, 36], [2, 14], [3, 25], [4, 8]], 'ring2': [[5, 20], [6, 12], [7, 38], [8, 10]], 'calls': [2, 3, 4, 5, 8], 'lag': [1, 7]}, {'starts': [[2, 0], [3, 20], [4, 45], [5, 0], [8, 20]], 'cycle': 53}), ({'ring1': [[1, 24], [2, 12], [3, 31], [4, 23]], 'ring2': [[5, 26], [6, 34], [7, 9], [8, 27]], 'calls': [1, 3, 4, 6, 7], 'lag': [2, 3]}, {'starts': [[1, 0], [3, 57], [4, 34], [6, 0], [7, 34]], 'cycle': 88}), ({'ring1': [[1, 40], [2, 8], [3, 11], [4, 14]], 'ring2': [[5, 14], [6, 38], [7, 12], [8, 25]], 'calls': [1, 2, 3, 4, 5, 6, 7, 8], 'lag': [8]}, {'starts': [[1, 0], [2, 40], [3, 52], [4, 63], [5, 0], [6, 14], [7, 52], [8, 64]], 'cycle': 89}), ({'ring1': [[1, 38], [2, 25], [3, 11], [4, 13]], 'ring2': [[5, 31], [6, 32], [7, 29], [8, 35]], 'calls': [1, 2, 3, 4, 5, 7, 8], 'lag': [2, 7]}, {'starts': [[1, 0], [2, 38], [3, 63], [4, 74], [5, 0], [7, 98], [8, 63]], 'cycle': 127}), ({'ring1': [[1, 12], [2, 30], [3, 10], [4, 25]], 'ring2': [[5, 15], [6, 20], [7, 12], [8, 30]], 'calls': [2, 4, 6, 7, 8], 'lag': []}, {'starts': [[2, 0], [4, 30], [6, 0], [7, 30], [8, 42]], 'cycle': 72}), ({'ring1': [[1, 36], [2, 21], [3, 23], [4, 13]], 'ring2': [[5, 29], [6, 11], [7, 32], [8, 38]], 'calls': [1, 2, 3, 4, 5, 6, 7, 8], 'lag': [6, 7, 8]}, {'starts': [[1, 0], [2, 36], [3, 57], [4, 80], [5, 0], [6, 29], [7, 95], [8, 57]], 'cycle': 127}), ({'ring1': [[1, 12], [2, 30], [3, 10], [4, 25]], 'ring2': [[5, 15], [6, 20], [7, 12], [8, 30]], 'calls': [1, 2, 3, 4, 5, 6, 7, 8], 'lag': [1]}, {'starts': [[1, 30], [2, 0], [3, 42], [4, 52], [5, 0], [6, 15], [7, 42], [8, 54]], 'cycle': 84}), ({'ring1': [[1, 38], [2, 13], [3, 11], [4, 35]], 'ring2': [[5, 34], [6, 11], [7, 12], [8, 15]], 'calls': [1, 2, 5, 7, 8], 'lag': [1, 4, 5]}, {'starts': [[1, 13], [2, 0], [5, 0], [7, 51], [8, 63]], 'cycle': 78})]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check('timing oracle' + ' %d' % i, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
timing oracle 0{'cycle': 81, 'starts': [[1, 0], [3, 21], [4, 45], [5, 0], [6, 8], [8, 21]]}{'cycle': 81, 'starts': [[1, 0], [3, 21], [4, 45], [5, 0], [6, 8], [8, 21]]}Passed
timing oracle 1{'cycle': 77, 'starts': [[1, 15], [2, 0], [3, 52], [5, 0]]}{'cycle': 77, 'starts': [[1, 15], [2, 0], [3, 52], [5, 0]]}Passed
timing oracle 2{'cycle': 132, 'starts': [[1, 0], [2, 29], [3, 66], [4, 102], [5, 0], [6, 13], [7, 66]]}{'cycle': 132, 'starts': [[1, 0], [2, 29], [3, 66], [4, 102], [5, 0], [6, 13], [7, 66]]}Passed
timing oracle 3{'cycle': 84, 'starts': [[1, 0], [2, 19], [3, 50], [5, 0], [7, 60], [8, 50]]}{'cycle': 84, 'starts': [[1, 0], [2, 19], [3, 50], [5, 0], [7, 60], [8, 50]]}Passed
timing oracle 4{'cycle': 97, 'starts': [[1, 0], [2, 14], [3, 59], [4, 39], [5, 0], [6, 8], [7, 39]]}{'cycle': 97, 'starts': [[1, 0], [2, 14], [3, 59], [4, 39], [5, 0], [6, 8], [7, 39]]}Passed
timing oracle 5{'cycle': 84, 'starts': [[1, 30], [2, 0], [3, 42], [4, 52], [5, 0], [6, 15], [7, 42], [8, 54]]}{'cycle': 84, 'starts': [[1, 30], [2, 0], [3, 42], [4, 52], [5, 0], [6, 15], [7, 42], [8, 54]]}Passed
timing oracle 6{'cycle': 72, 'starts': [[2, 0], [4, 30], [6, 0], [7, 30], [8, 42]]}{'cycle': 72, 'starts': [[2, 0], [4, 30], [6, 0], [7, 30], [8, 42]]}Passed
timing oracle 7{'cycle': 128, 'starts': [[1, 0], [2, 18], [3, 60], [4, 72], [5, 0], [6, 28], [7, 88], [8, 60]]}{'cycle': 128, 'starts': [[1, 0], [2, 18], [3, 60], [4, 72], [5, 0], [6, 28], [7, 88], [8, 60]]}Passed

SHA-256 / 3af56d1e66897104b4b9cabc3db0df3bd662ccc1da3c96b546e42f4080c27bee

Verification & scope

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.

Observations recorded using Python 3.12.14 at 2026-09-29T14:47:59.187735+00:00.

Case digest / fec08fc7ed76006448ab4ec9216d47459aeb5daeeca67d0fac95ee918638d7ae