FA-12236 / Navigation route constraints / Open access
A curbside waypoint accepts arrival from the wrong carriageway · case 01
A curbside waypoint accepts arrival from the wrong carriageway in the controlled route-policy fixture.
ROOT CAUSE
Waypoint reachability is based only on road membership, ignoring its required arrival side.
VERIFIED REPAIR
Compare the requested physical curb side with the vehicle side implied by travel direction and driving side.
Unsuccessful approach: Hard-coding right-hand driving reverses curbside access in left-driving regions.
Case contract
This straight east-west two-carriageway model has north/south curbs. A right-driving eastbound vehicle serves south; westbound serves north. Left-driving reverses this. either permits either curb.
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(direction, driving_side, curb, road_id, waypoint_road_id):
return road_id == waypoint_road_id
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
# Vary approach order without changing the explicitly named physical-side oracle.
d = 'east' if N % 2 else 'west'
side = 'south' if N % 2 else 'north'
other = 'north' if N % 2 else 'south'
check('right-driving served curb', solve(d,'right',side,N,N), True)
check('right-driving opposite curb', solve(d,'right',other,N,N), False)
check('left-driving served curb', solve(d,'left',other,N,N), True)
check('left-driving opposite curb', solve(d,'left',side,N,N), False)
check('unrestricted curb', solve(d,'left','either',N,N), True)
check('different road', solve(d,'right',side,N,N+1), False)
check('different road unrestricted', solve(d,'left','either',N,N+1), 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 |
|---|---|---|---|
| right-driving served curb | True | True | Passed |
| right-driving opposite curb | True | False | Failed |
| left-driving served curb | True | True | Passed |
| left-driving opposite curb | True | False | Failed |
| unrestricted curb | True | True | Passed |
| different road | False | False | Passed |
| different road unrestricted | False | False | Passed |
SHA-256 / 8cf1479715c050ecbb7864511da18d1310929d792cb86cb9af3b00f2fab39e77
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(direction, driving_side, curb, road_id, waypoint_road_id):
return road_id == waypoint_road_id and (curb == 'either' or curb == ('south' if direction == 'east' else 'north'))
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
# Vary approach order without changing the explicitly named physical-side oracle.
d = 'east' if N % 2 else 'west'
side = 'south' if N % 2 else 'north'
other = 'north' if N % 2 else 'south'
check('right-driving served curb', solve(d,'right',side,N,N), True)
check('right-driving opposite curb', solve(d,'right',other,N,N), False)
check('left-driving served curb', solve(d,'left',other,N,N), True)
check('left-driving opposite curb', solve(d,'left',side,N,N), False)
check('unrestricted curb', solve(d,'left','either',N,N), True)
check('different road', solve(d,'right',side,N,N+1), False)
check('different road unrestricted', solve(d,'left','either',N,N+1), 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 |
|---|---|---|---|
| right-driving served curb | True | True | Passed |
| right-driving opposite curb | False | False | Passed |
| left-driving served curb | False | True | Failed |
| left-driving opposite curb | True | False | Failed |
| unrestricted curb | True | True | Passed |
| different road | False | False | Passed |
| different road unrestricted | False | False | Passed |
SHA-256 / 18e77e257c0857a2b003300ad76f8529fcc6748b5a3c9c4a3702344d9e3d69b6
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(direction, driving_side, curb, road_id, waypoint_road_id):
vehicle_curb = 'south' if (direction == 'east') == (driving_side == 'right') else 'north'
return road_id == waypoint_road_id and (curb == 'either' or curb == vehicle_curb)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
# Vary approach order without changing the explicitly named physical-side oracle.
d = 'east' if N % 2 else 'west'
side = 'south' if N % 2 else 'north'
other = 'north' if N % 2 else 'south'
check('right-driving served curb', solve(d,'right',side,N,N), True)
check('right-driving opposite curb', solve(d,'right',other,N,N), False)
check('left-driving served curb', solve(d,'left',other,N,N), True)
check('left-driving opposite curb', solve(d,'left',side,N,N), False)
check('unrestricted curb', solve(d,'left','either',N,N), True)
check('different road', solve(d,'right',side,N,N+1), False)
check('different road unrestricted', solve(d,'left','either',N,N+1), 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 |
|---|---|---|---|
| right-driving served curb | True | True | Passed |
| right-driving opposite curb | False | False | Passed |
| left-driving served curb | True | True | Passed |
| left-driving opposite curb | False | False | Passed |
| unrestricted curb | True | True | Passed |
| different road | False | False | Passed |
| different road unrestricted | False | False | Passed |
SHA-256 / 75fedbd02a11dc08008867817030ea7a73a8e8bff77f2c92592daab52c9f49b4
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.964597+00:00.
Case digest / 8967fd103ef8e92a0d6839564e06c80c29f01164352f0dfd03b83e66be93d3d8