FA-68071 / Traffic signal timing plans / Open access
Shortway offset transition: the per-cycle shortening limit is rounded up · case 01
Shortway offset transition returns a wrong result when the per-cycle shortening limit is rounded up.
ROOT CAUSE
Rounding the limit up lets a transition cycle shorten more than the permitted percentage.
VERIFIED REPAIR
Restore the per-cycle shortening limit rule so that the step reads `S = C * x['shorten_pct'] // 100`.
Unsuccessful approach: Rounding to nearest still exceeds the limit when the fractional part is at least one half.
Case contract
Input {cycle, current_offset, target_offset, lengthen_pct, shorten_pct}. The needed correction e = (target - current) mod cycle can be made by lengthening cycles by a total of e or shortening them by cycle - e. Per-cycle limits are floor(cycle*pct/100). Choose the direction needing fewer cycles (ties lengthen) and front-load the maximum adjustment each cycle. Return the list of transition cycle lengths ([] when already in step).
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):
C = x['cycle']
e = (x['target_offset'] - x['current_offset']) % C
if e == 0:
return []
L = C * x['lengthen_pct'] // 100
S = -(-C * x['shorten_pct'] // 100)
nl = -(-e // L)
ns = -(-(C - e) // S)
if nl <= ns:
amt, step, sign = e, L, 1
else:
amt, step, sign = C - e, S, -1
out = []
while amt > 0:
d = min(step, amt)
out.append(C + sign * d)
amt -= d
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[({'cycle': 100, 'current_offset': 10, 'target_offset': 50, 'lengthen_pct': 20, 'shorten_pct': 20}, [120, 120]), ({'cycle': 70, 'current_offset': 47, 'target_offset': 25, 'lengthen_pct': 10, 'shorten_pct': 17}, [59, 59]), ({'cycle': 90, 'current_offset': 30, 'target_offset': 30, 'lengthen_pct': 20, 'shorten_pct': 17}, []), ({'cycle': 90, 'current_offset': 78, 'target_offset': 67, 'lengthen_pct': 25, 'shorten_pct': 13}, [79]), ({'cycle': 110, 'current_offset': 48, 'target_offset': 34, 'lengthen_pct': 25, 'shorten_pct': 13}, [96]), ({'cycle': 80, 'current_offset': 54, 'target_offset': 32, 'lengthen_pct': 10, 'shorten_pct': 13}, [70, 70, 78]), ({'cycle': 80, 'current_offset': 2, 'target_offset': 66, 'lengthen_pct': 20, 'shorten_pct': 17}, [67, 77]), ({'cycle': 120, 'current_offset': 90, 'target_offset': 20, 'lengthen_pct': 17, 'shorten_pct': 13}, [140, 140, 130])], [({'cycle': 150, 'current_offset': 93, 'target_offset': 41, 'lengthen_pct': 20, 'shorten_pct': 13}, [131, 131, 136]), ({'cycle': 100, 'current_offset': 10, 'target_offset': 50, 'lengthen_pct': 20, 'shorten_pct': 20}, [120, 120]), ({'cycle': 70, 'current_offset': 3, 'target_offset': 56, 'lengthen_pct': 10, 'shorten_pct': 13}, [61, 62]), ({'cycle': 140, 'current_offset': 132, 'target_offset': 106, 'lengthen_pct': 10, 'shorten_pct': 13}, [122, 132]), ({'cycle': 150, 'current_offset': 73, 'target_offset': 8, 'lengthen_pct': 10, 'shorten_pct': 13}, [131, 131, 131, 142]), ({'cycle': 120, 'current_offset': 90, 'target_offset': 20, 'lengthen_pct': 17, 'shorten_pct': 13}, [140, 140, 130]), ({'cycle': 90, 'current_offset': 25, 'target_offset': 12, 'lengthen_pct': 20, 'shorten_pct': 20}, [77]), ({'cycle': 90, 'current_offset': 30, 'target_offset': 30, 'lengthen_pct': 20, 'shorten_pct': 17}, [])], [({'cycle': 90, 'current_offset': 30, 'target_offset': 30, 'lengthen_pct': 20, 'shorten_pct': 17}, []), ({'cycle': 130, 'current_offset': 45, 'target_offset': 22, 'lengthen_pct': 25, 'shorten_pct': 17}, [108, 129]), ({'cycle': 100, 'current_offset': 10, 'target_offset': 50, 'lengthen_pct': 20, 'shorten_pct': 20}, [120, 120]), ({'cycle': 140, 'current_offset': 49, 'target_offset': 7, 'lengthen_pct': 20, 'shorten_pct': 13}, [122, 122, 134]), ({'cycle': 130, 'current_offset': 11, 'target_offset': 106, 'lengthen_pct': 20, 'shorten_pct': 13}, [114, 114, 127]), ({'cycle': 70, 'current_offset': 25, 'target_offset': 64, 'lengthen_pct': 10, 'shorten_pct': 17}, [59, 59, 61]), ({'cycle': 120, 'current_offset': 90, 'target_offset': 20, 'lengthen_pct': 17, 'shorten_pct': 13}, [140, 140, 130]), ({'cycle': 90, 'current_offset': 40, 'target_offset': 20, 'lengthen_pct': 10, 'shorten_pct': 17}, [75, 85])], [({'cycle': 100, 'current_offset': 10, 'target_offset': 50, 'lengthen_pct': 20, 'shorten_pct': 20}, [120, 120]), ({'cycle': 70, 'current_offset': 2, 'target_offset': 34, 'lengthen_pct': 10, 'shorten_pct': 10}, [77, 77, 77, 77, 74]), ({'cycle': 80, 'current_offset': 13, 'target_offset': 76, 'lengthen_pct': 17, 'shorten_pct': 17}, [67, 76]), ({'cycle': 90, 'current_offset': 30, 'target_offset': 30, 'lengthen_pct': 20, 'shorten_pct': 17}, []), ({'cycle': 120, 'current_offset': 90, 'target_offset': 20, 'lengthen_pct': 17, 'shorten_pct': 13}, [140, 140, 130]), ({'cycle': 120, 'current_offset': 74, 'target_offset': 53, 'lengthen_pct': 20, 'shorten_pct': 13}, [105, 114]), ({'cycle': 90, 'current_offset': 52, 'target_offset': 61, 'lengthen_pct': 20, 'shorten_pct': 13}, [99]), ({'cycle': 130, 'current_offset': 40, 'target_offset': 93, 'lengthen_pct': 10, 'shorten_pct': 17}, [108, 108, 108, 119])], [({'cycle': 70, 'current_offset': 61, 'target_offset': 45, 'lengthen_pct': 20, 'shorten_pct': 17}, [59, 65]), ({'cycle': 150, 'current_offset': 106, 'target_offset': 139, 'lengthen_pct': 10, 'shorten_pct': 10}, [165, 165, 153]), ({'cycle': 140, 'current_offset': 12, 'target_offset': 108, 'lengthen_pct': 25, 'shorten_pct': 17}, [117, 119]), ({'cycle': 120, 'current_offset': 90, 'target_offset': 20, 'lengthen_pct': 17, 'shorten_pct': 13}, [140, 140, 130]), ({'cycle': 90, 'current_offset': 30, 'target_offset': 30, 'lengthen_pct': 20, 'shorten_pct': 17}, []), ({'cycle': 80, 'current_offset': 12, 'target_offset': 23, 'lengthen_pct': 25, 'shorten_pct': 10}, [91]), ({'cycle': 100, 'current_offset': 10, 'target_offset': 50, 'lengthen_pct': 20, 'shorten_pct': 20}, [120, 120]), ({'cycle': 80, 'current_offset': 56, 'target_offset': 28, 'lengthen_pct': 10, 'shorten_pct': 17}, [67, 67, 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| timing oracle 0 | [120, 120] | [120, 120] | Passed |
| timing oracle 1 | [58, 60] | [59, 59] | Failed |
| timing oracle 2 | [] | [] | Passed |
| timing oracle 3 | [79] | [79] | Passed |
| timing oracle 4 | [96] | [96] | Passed |
| timing oracle 5 | [69, 69] | [70, 70, 78] | Failed |
| timing oracle 6 | [66, 78] | [67, 77] | Failed |
| timing oracle 7 | [140, 140, 130] | [140, 140, 130] | Passed |
SHA-256 / fe0d07f565516beb36c82bab3bc611f0c8ad3cef3e6cd0e4f81c12ac83cc7d04
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
C = x['cycle']
e = (x['target_offset'] - x['current_offset']) % C
if e == 0:
return []
L = C * x['lengthen_pct'] // 100
S = round(C * x['shorten_pct'] / 100)
nl = -(-e // L)
ns = -(-(C - e) // S)
if nl <= ns:
amt, step, sign = e, L, 1
else:
amt, step, sign = C - e, S, -1
out = []
while amt > 0:
d = min(step, amt)
out.append(C + sign * d)
amt -= d
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[({'cycle': 100, 'current_offset': 10, 'target_offset': 50, 'lengthen_pct': 20, 'shorten_pct': 20}, [120, 120]), ({'cycle': 70, 'current_offset': 47, 'target_offset': 25, 'lengthen_pct': 10, 'shorten_pct': 17}, [59, 59]), ({'cycle': 90, 'current_offset': 30, 'target_offset': 30, 'lengthen_pct': 20, 'shorten_pct': 17}, []), ({'cycle': 90, 'current_offset': 78, 'target_offset': 67, 'lengthen_pct': 25, 'shorten_pct': 13}, [79]), ({'cycle': 110, 'current_offset': 48, 'target_offset': 34, 'lengthen_pct': 25, 'shorten_pct': 13}, [96]), ({'cycle': 80, 'current_offset': 54, 'target_offset': 32, 'lengthen_pct': 10, 'shorten_pct': 13}, [70, 70, 78]), ({'cycle': 80, 'current_offset': 2, 'target_offset': 66, 'lengthen_pct': 20, 'shorten_pct': 17}, [67, 77]), ({'cycle': 120, 'current_offset': 90, 'target_offset': 20, 'lengthen_pct': 17, 'shorten_pct': 13}, [140, 140, 130])], [({'cycle': 150, 'current_offset': 93, 'target_offset': 41, 'lengthen_pct': 20, 'shorten_pct': 13}, [131, 131, 136]), ({'cycle': 100, 'current_offset': 10, 'target_offset': 50, 'lengthen_pct': 20, 'shorten_pct': 20}, [120, 120]), ({'cycle': 70, 'current_offset': 3, 'target_offset': 56, 'lengthen_pct': 10, 'shorten_pct': 13}, [61, 62]), ({'cycle': 140, 'current_offset': 132, 'target_offset': 106, 'lengthen_pct': 10, 'shorten_pct': 13}, [122, 132]), ({'cycle': 150, 'current_offset': 73, 'target_offset': 8, 'lengthen_pct': 10, 'shorten_pct': 13}, [131, 131, 131, 142]), ({'cycle': 120, 'current_offset': 90, 'target_offset': 20, 'lengthen_pct': 17, 'shorten_pct': 13}, [140, 140, 130]), ({'cycle': 90, 'current_offset': 25, 'target_offset': 12, 'lengthen_pct': 20, 'shorten_pct': 20}, [77]), ({'cycle': 90, 'current_offset': 30, 'target_offset': 30, 'lengthen_pct': 20, 'shorten_pct': 17}, [])], [({'cycle': 90, 'current_offset': 30, 'target_offset': 30, 'lengthen_pct': 20, 'shorten_pct': 17}, []), ({'cycle': 130, 'current_offset': 45, 'target_offset': 22, 'lengthen_pct': 25, 'shorten_pct': 17}, [108, 129]), ({'cycle': 100, 'current_offset': 10, 'target_offset': 50, 'lengthen_pct': 20, 'shorten_pct': 20}, [120, 120]), ({'cycle': 140, 'current_offset': 49, 'target_offset': 7, 'lengthen_pct': 20, 'shorten_pct': 13}, [122, 122, 134]), ({'cycle': 130, 'current_offset': 11, 'target_offset': 106, 'lengthen_pct': 20, 'shorten_pct': 13}, [114, 114, 127]), ({'cycle': 70, 'current_offset': 25, 'target_offset': 64, 'lengthen_pct': 10, 'shorten_pct': 17}, [59, 59, 61]), ({'cycle': 120, 'current_offset': 90, 'target_offset': 20, 'lengthen_pct': 17, 'shorten_pct': 13}, [140, 140, 130]), ({'cycle': 90, 'current_offset': 40, 'target_offset': 20, 'lengthen_pct': 10, 'shorten_pct': 17}, [75, 85])], [({'cycle': 100, 'current_offset': 10, 'target_offset': 50, 'lengthen_pct': 20, 'shorten_pct': 20}, [120, 120]), ({'cycle': 70, 'current_offset': 2, 'target_offset': 34, 'lengthen_pct': 10, 'shorten_pct': 10}, [77, 77, 77, 77, 74]), ({'cycle': 80, 'current_offset': 13, 'target_offset': 76, 'lengthen_pct': 17, 'shorten_pct': 17}, [67, 76]), ({'cycle': 90, 'current_offset': 30, 'target_offset': 30, 'lengthen_pct': 20, 'shorten_pct': 17}, []), ({'cycle': 120, 'current_offset': 90, 'target_offset': 20, 'lengthen_pct': 17, 'shorten_pct': 13}, [140, 140, 130]), ({'cycle': 120, 'current_offset': 74, 'target_offset': 53, 'lengthen_pct': 20, 'shorten_pct': 13}, [105, 114]), ({'cycle': 90, 'current_offset': 52, 'target_offset': 61, 'lengthen_pct': 20, 'shorten_pct': 13}, [99]), ({'cycle': 130, 'current_offset': 40, 'target_offset': 93, 'lengthen_pct': 10, 'shorten_pct': 17}, [108, 108, 108, 119])], [({'cycle': 70, 'current_offset': 61, 'target_offset': 45, 'lengthen_pct': 20, 'shorten_pct': 17}, [59, 65]), ({'cycle': 150, 'current_offset': 106, 'target_offset': 139, 'lengthen_pct': 10, 'shorten_pct': 10}, [165, 165, 153]), ({'cycle': 140, 'current_offset': 12, 'target_offset': 108, 'lengthen_pct': 25, 'shorten_pct': 17}, [117, 119]), ({'cycle': 120, 'current_offset': 90, 'target_offset': 20, 'lengthen_pct': 17, 'shorten_pct': 13}, [140, 140, 130]), ({'cycle': 90, 'current_offset': 30, 'target_offset': 30, 'lengthen_pct': 20, 'shorten_pct': 17}, []), ({'cycle': 80, 'current_offset': 12, 'target_offset': 23, 'lengthen_pct': 25, 'shorten_pct': 10}, [91]), ({'cycle': 100, 'current_offset': 10, 'target_offset': 50, 'lengthen_pct': 20, 'shorten_pct': 20}, [120, 120]), ({'cycle': 80, 'current_offset': 56, 'target_offset': 28, 'lengthen_pct': 10, 'shorten_pct': 17}, [67, 67, 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| timing oracle 0 | [120, 120] | [120, 120] | Passed |
| timing oracle 1 | [58, 60] | [59, 59] | Failed |
| timing oracle 2 | [] | [] | Passed |
| timing oracle 3 | [79] | [79] | Passed |
| timing oracle 4 | [96] | [96] | Passed |
| timing oracle 5 | [70, 70, 78] | [70, 70, 78] | Passed |
| timing oracle 6 | [66, 78] | [67, 77] | Failed |
| timing oracle 7 | [140, 140, 130] | [140, 140, 130] | Passed |
SHA-256 / 3ea069d0986c7ddd390e71156b2e8a958ee3f5a2d1d89798556237498b85bd5c
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
C = x['cycle']
e = (x['target_offset'] - x['current_offset']) % C
if e == 0:
return []
L = C * x['lengthen_pct'] // 100
S = C * x['shorten_pct'] // 100
nl = -(-e // L)
ns = -(-(C - e) // S)
if nl <= ns:
amt, step, sign = e, L, 1
else:
amt, step, sign = C - e, S, -1
out = []
while amt > 0:
d = min(step, amt)
out.append(C + sign * d)
amt -= d
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[({'cycle': 100, 'current_offset': 10, 'target_offset': 50, 'lengthen_pct': 20, 'shorten_pct': 20}, [120, 120]), ({'cycle': 70, 'current_offset': 47, 'target_offset': 25, 'lengthen_pct': 10, 'shorten_pct': 17}, [59, 59]), ({'cycle': 90, 'current_offset': 30, 'target_offset': 30, 'lengthen_pct': 20, 'shorten_pct': 17}, []), ({'cycle': 90, 'current_offset': 78, 'target_offset': 67, 'lengthen_pct': 25, 'shorten_pct': 13}, [79]), ({'cycle': 110, 'current_offset': 48, 'target_offset': 34, 'lengthen_pct': 25, 'shorten_pct': 13}, [96]), ({'cycle': 80, 'current_offset': 54, 'target_offset': 32, 'lengthen_pct': 10, 'shorten_pct': 13}, [70, 70, 78]), ({'cycle': 80, 'current_offset': 2, 'target_offset': 66, 'lengthen_pct': 20, 'shorten_pct': 17}, [67, 77]), ({'cycle': 120, 'current_offset': 90, 'target_offset': 20, 'lengthen_pct': 17, 'shorten_pct': 13}, [140, 140, 130])], [({'cycle': 150, 'current_offset': 93, 'target_offset': 41, 'lengthen_pct': 20, 'shorten_pct': 13}, [131, 131, 136]), ({'cycle': 100, 'current_offset': 10, 'target_offset': 50, 'lengthen_pct': 20, 'shorten_pct': 20}, [120, 120]), ({'cycle': 70, 'current_offset': 3, 'target_offset': 56, 'lengthen_pct': 10, 'shorten_pct': 13}, [61, 62]), ({'cycle': 140, 'current_offset': 132, 'target_offset': 106, 'lengthen_pct': 10, 'shorten_pct': 13}, [122, 132]), ({'cycle': 150, 'current_offset': 73, 'target_offset': 8, 'lengthen_pct': 10, 'shorten_pct': 13}, [131, 131, 131, 142]), ({'cycle': 120, 'current_offset': 90, 'target_offset': 20, 'lengthen_pct': 17, 'shorten_pct': 13}, [140, 140, 130]), ({'cycle': 90, 'current_offset': 25, 'target_offset': 12, 'lengthen_pct': 20, 'shorten_pct': 20}, [77]), ({'cycle': 90, 'current_offset': 30, 'target_offset': 30, 'lengthen_pct': 20, 'shorten_pct': 17}, [])], [({'cycle': 90, 'current_offset': 30, 'target_offset': 30, 'lengthen_pct': 20, 'shorten_pct': 17}, []), ({'cycle': 130, 'current_offset': 45, 'target_offset': 22, 'lengthen_pct': 25, 'shorten_pct': 17}, [108, 129]), ({'cycle': 100, 'current_offset': 10, 'target_offset': 50, 'lengthen_pct': 20, 'shorten_pct': 20}, [120, 120]), ({'cycle': 140, 'current_offset': 49, 'target_offset': 7, 'lengthen_pct': 20, 'shorten_pct': 13}, [122, 122, 134]), ({'cycle': 130, 'current_offset': 11, 'target_offset': 106, 'lengthen_pct': 20, 'shorten_pct': 13}, [114, 114, 127]), ({'cycle': 70, 'current_offset': 25, 'target_offset': 64, 'lengthen_pct': 10, 'shorten_pct': 17}, [59, 59, 61]), ({'cycle': 120, 'current_offset': 90, 'target_offset': 20, 'lengthen_pct': 17, 'shorten_pct': 13}, [140, 140, 130]), ({'cycle': 90, 'current_offset': 40, 'target_offset': 20, 'lengthen_pct': 10, 'shorten_pct': 17}, [75, 85])], [({'cycle': 100, 'current_offset': 10, 'target_offset': 50, 'lengthen_pct': 20, 'shorten_pct': 20}, [120, 120]), ({'cycle': 70, 'current_offset': 2, 'target_offset': 34, 'lengthen_pct': 10, 'shorten_pct': 10}, [77, 77, 77, 77, 74]), ({'cycle': 80, 'current_offset': 13, 'target_offset': 76, 'lengthen_pct': 17, 'shorten_pct': 17}, [67, 76]), ({'cycle': 90, 'current_offset': 30, 'target_offset': 30, 'lengthen_pct': 20, 'shorten_pct': 17}, []), ({'cycle': 120, 'current_offset': 90, 'target_offset': 20, 'lengthen_pct': 17, 'shorten_pct': 13}, [140, 140, 130]), ({'cycle': 120, 'current_offset': 74, 'target_offset': 53, 'lengthen_pct': 20, 'shorten_pct': 13}, [105, 114]), ({'cycle': 90, 'current_offset': 52, 'target_offset': 61, 'lengthen_pct': 20, 'shorten_pct': 13}, [99]), ({'cycle': 130, 'current_offset': 40, 'target_offset': 93, 'lengthen_pct': 10, 'shorten_pct': 17}, [108, 108, 108, 119])], [({'cycle': 70, 'current_offset': 61, 'target_offset': 45, 'lengthen_pct': 20, 'shorten_pct': 17}, [59, 65]), ({'cycle': 150, 'current_offset': 106, 'target_offset': 139, 'lengthen_pct': 10, 'shorten_pct': 10}, [165, 165, 153]), ({'cycle': 140, 'current_offset': 12, 'target_offset': 108, 'lengthen_pct': 25, 'shorten_pct': 17}, [117, 119]), ({'cycle': 120, 'current_offset': 90, 'target_offset': 20, 'lengthen_pct': 17, 'shorten_pct': 13}, [140, 140, 130]), ({'cycle': 90, 'current_offset': 30, 'target_offset': 30, 'lengthen_pct': 20, 'shorten_pct': 17}, []), ({'cycle': 80, 'current_offset': 12, 'target_offset': 23, 'lengthen_pct': 25, 'shorten_pct': 10}, [91]), ({'cycle': 100, 'current_offset': 10, 'target_offset': 50, 'lengthen_pct': 20, 'shorten_pct': 20}, [120, 120]), ({'cycle': 80, 'current_offset': 56, 'target_offset': 28, 'lengthen_pct': 10, 'shorten_pct': 17}, [67, 67, 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| timing oracle 0 | [120, 120] | [120, 120] | Passed |
| timing oracle 1 | [59, 59] | [59, 59] | Passed |
| timing oracle 2 | [] | [] | Passed |
| timing oracle 3 | [79] | [79] | Passed |
| timing oracle 4 | [96] | [96] | Passed |
| timing oracle 5 | [70, 70, 78] | [70, 70, 78] | Passed |
| timing oracle 6 | [67, 77] | [67, 77] | Passed |
| timing oracle 7 | [140, 140, 130] | [140, 140, 130] | Passed |
SHA-256 / f34a1f2e8da9f6f73c93f442091e51a5c2ae49249218c2a0c3e2d93d83fd4b30
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:58.810764+00:00.
Case digest / f8a64751e37490bf4dfacffc18466436ef96575c4f50bf4dbc1f9da14ca51e4b