FA-12226 / Navigation route constraints / Open access
A reversible lane is used after its direction changes · case 01
A reversible lane is used after its direction changes in the controlled route-policy fixture.
ROOT CAUSE
Availability is checked only at entry time, even when the traversal outlasts the allocated direction.
VERIFIED REPAIR
Require the entire positive-duration traversal to fit one matching direction window.
Unsuccessful approach: A strict end comparison rejects a traversal finishing exactly when its direction window ends.
Case contract
Windows are nonoverlapping (start,end,direction) on an absolute integer timeline. Entry is inclusive and exit may equal end; travel duration is positive.
Why this case matters
Navigation policies depend on road context that a shortest-path cost alone does not encode.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(entry, duration, direction, windows):
return any(a <= entry < b and d == direction for a,b,d in windows)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
t = N*100
w = [(t,t+10,'east'),(t+10,t+20,'west')]
check('finish at switch', solve(t+5,5,'east',w), True)
check('overrun switch', solve(t+5,6,'east',w), False)
check('new direction at boundary', solve(t+10,1,'west',w), True)
check('old direction at boundary', solve(t+10,1,'east',w), False)
check('before window', solve(t-1,1,'east',w), False)
check('whole window', solve(t,10,'east',w), True)
check('no allocation', solve(t,1,'east',[]), False)
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 |
|---|---|---|---|
| finish at switch | True | True | Passed |
| overrun switch | True | False | Failed |
| new direction at boundary | True | True | Passed |
| old direction at boundary | False | False | Passed |
| before window | False | False | Passed |
| whole window | True | True | Passed |
| no allocation | False | False | Passed |
SHA-256 / 2d363e18c16b54f49b4e9015887b9d46ed0568413b8081723e576523564440fa
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(entry, duration, direction, windows):
return any(a <= entry and entry + duration < b and d == direction for a,b,d in windows)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
t = N*100
w = [(t,t+10,'east'),(t+10,t+20,'west')]
check('finish at switch', solve(t+5,5,'east',w), True)
check('overrun switch', solve(t+5,6,'east',w), False)
check('new direction at boundary', solve(t+10,1,'west',w), True)
check('old direction at boundary', solve(t+10,1,'east',w), False)
check('before window', solve(t-1,1,'east',w), False)
check('whole window', solve(t,10,'east',w), True)
check('no allocation', solve(t,1,'east',[]), False)
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 |
|---|---|---|---|
| finish at switch | False | True | Failed |
| overrun switch | False | False | Passed |
| new direction at boundary | True | True | Passed |
| old direction at boundary | False | False | Passed |
| before window | False | False | Passed |
| whole window | False | True | Failed |
| no allocation | False | False | Passed |
SHA-256 / d8bc91a0107a895cb5efa5e8ec6a8886ba5c9865b526bb5857063e3e565d05ac
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(entry, duration, direction, windows):
return any(a <= entry and entry + duration <= b and d == direction for a,b,d in windows)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
t = N*100
w = [(t,t+10,'east'),(t+10,t+20,'west')]
check('finish at switch', solve(t+5,5,'east',w), True)
check('overrun switch', solve(t+5,6,'east',w), False)
check('new direction at boundary', solve(t+10,1,'west',w), True)
check('old direction at boundary', solve(t+10,1,'east',w), False)
check('before window', solve(t-1,1,'east',w), False)
check('whole window', solve(t,10,'east',w), True)
check('no allocation', solve(t,1,'east',[]), False)
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 |
|---|---|---|---|
| finish at switch | True | True | Passed |
| overrun switch | False | False | Passed |
| new direction at boundary | True | True | Passed |
| old direction at boundary | False | False | Passed |
| before window | False | False | Passed |
| whole window | True | True | Passed |
| no allocation | False | False | Passed |
SHA-256 / 915f59c55775b6ce5657db6b92b3fb46135581d960d828eefd006229f3bdcf9f
Verification & scope
Simplified deterministic offline policy model; not a production router or authoritative road guidance. 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:38:54.963487+00:00.
Case digest / 2234ce4efd4ffcf62b4bf9d97666d213cffae73a09d141a3e786235b6d48452c