FAILURE MAP
← Case archive

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.

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

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 fixtureActualExpectedOutcome
right-driving served curbTrueTruePassed
right-driving opposite curbTrueFalseFailed
left-driving served curbTrueTruePassed
left-driving opposite curbTrueFalseFailed
unrestricted curbTrueTruePassed
different roadFalseFalsePassed
different road unrestrictedFalseFalsePassed

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 fixtureActualExpectedOutcome
right-driving served curbTrueTruePassed
right-driving opposite curbFalseFalsePassed
left-driving served curbFalseTrueFailed
left-driving opposite curbTrueFalseFailed
unrestricted curbTrueTruePassed
different roadFalseFalsePassed
different road unrestrictedFalseFalsePassed

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 fixtureActualExpectedOutcome
right-driving served curbTrueTruePassed
right-driving opposite curbFalseFalsePassed
left-driving served curbTrueTruePassed
left-driving opposite curbFalseFalsePassed
unrestricted curbTrueTruePassed
different roadFalseFalsePassed
different road unrestrictedFalseFalsePassed

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