FAILURE MAP
← Case archive

FA-12196 / Navigation route constraints / Open access

An only-turn rule leaks onto other incoming roads · case 01

An only-turn rule leaks onto other incoming roads in the controlled route-policy fixture.

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

ROOT CAUSE

The allowed outgoing road is treated as a junction-wide rule instead of an incoming-road-specific rule.

VERIFIED REPAIR

Collect allowed exits for this approach, and constrain only that approach.

Unsuccessful approach: Applying only the first matching rule loses other permitted exits in the explicit union model.

Case contract

Rules are pairs of incoming and permitted outgoing IDs. For one incoming road matching rules form a union; an unmatched approach permits all exits.

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(incoming, outgoing, rules):
    return outgoing in [b for a,b in rules] if rules else True
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
a,b,c,x = N,N+10,N+20,N+30
rules = [(a,b),(a,c)]
check('first permitted', solve(a,b,rules), True)
check('second permitted', solve(a,c,rules), True)
check('restricted wrong exit', solve(a,x,rules), False)
check('unrelated incoming', solve(x,x,rules), True)
check('no rules', solve(a,x,[]), True)
check('other approach rules', solve(x,c,[(a,b),(x,c)]), True)
check('other approach denied', solve(x,b,[(a,b),(x,c)]), 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
first permittedTrueTruePassed
second permittedTrueTruePassed
restricted wrong exitFalseFalsePassed
unrelated incomingFalseTrueFailed
no rulesTrueTruePassed
other approach rulesTrueTruePassed
other approach deniedTrueFalseFailed

SHA-256 / 7baaa0e5ff0893bf086a3f0897b1e2f57f1e4e9d6bef0b4accee5c2627a1ab74

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(incoming, outgoing, rules):
    for a,b in rules:
        if a == incoming:
            return outgoing == b
    return True
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
a,b,c,x = N,N+10,N+20,N+30
rules = [(a,b),(a,c)]
check('first permitted', solve(a,b,rules), True)
check('second permitted', solve(a,c,rules), True)
check('restricted wrong exit', solve(a,x,rules), False)
check('unrelated incoming', solve(x,x,rules), True)
check('no rules', solve(a,x,[]), True)
check('other approach rules', solve(x,c,[(a,b),(x,c)]), True)
check('other approach denied', solve(x,b,[(a,b),(x,c)]), 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
first permittedTrueTruePassed
second permittedFalseTrueFailed
restricted wrong exitFalseFalsePassed
unrelated incomingTrueTruePassed
no rulesTrueTruePassed
other approach rulesTrueTruePassed
other approach deniedFalseFalsePassed

SHA-256 / 36636cb09e98cd86d1a78bfb955e0afa4282d0694cc2b166e6c7761c87bb17b4

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(incoming, outgoing, rules):
    exits = [b for a,b in rules if a == incoming]
    return not exits or outgoing in exits
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
a,b,c,x = N,N+10,N+20,N+30
rules = [(a,b),(a,c)]
check('first permitted', solve(a,b,rules), True)
check('second permitted', solve(a,c,rules), True)
check('restricted wrong exit', solve(a,x,rules), False)
check('unrelated incoming', solve(x,x,rules), True)
check('no rules', solve(a,x,[]), True)
check('other approach rules', solve(x,c,[(a,b),(x,c)]), True)
check('other approach denied', solve(x,b,[(a,b),(x,c)]), 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
first permittedTrueTruePassed
second permittedTrueTruePassed
restricted wrong exitFalseFalsePassed
unrelated incomingTrueTruePassed
no rulesTrueTruePassed
other approach rulesTrueTruePassed
other approach deniedFalseFalsePassed

SHA-256 / 7abd97b90c98f2978f644efd3d93107a5fb462a1ec02771e963f7eff2a64591b

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.752525+00:00.

Case digest / 92db1dbf425342b247820b903862da99dac31557aa3a881b0e38786be8b1ce62