FAILURE MAP
← Case archive

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.

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

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 fixtureActualExpectedOutcome
finish at switchTrueTruePassed
overrun switchTrueFalseFailed
new direction at boundaryTrueTruePassed
old direction at boundaryFalseFalsePassed
before windowFalseFalsePassed
whole windowTrueTruePassed
no allocationFalseFalsePassed

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 fixtureActualExpectedOutcome
finish at switchFalseTrueFailed
overrun switchFalseFalsePassed
new direction at boundaryTrueTruePassed
old direction at boundaryFalseFalsePassed
before windowFalseFalsePassed
whole windowFalseTrueFailed
no allocationFalseFalsePassed

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 fixtureActualExpectedOutcome
finish at switchTrueTruePassed
overrun switchFalseFalsePassed
new direction at boundaryTrueTruePassed
old direction at boundaryFalseFalsePassed
before windowFalseFalsePassed
whole windowTrueTruePassed
no allocationFalseFalsePassed

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