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.
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| first permitted | True | True | Passed |
| second permitted | True | True | Passed |
| restricted wrong exit | False | False | Passed |
| unrelated incoming | False | True | Failed |
| no rules | True | True | Passed |
| other approach rules | True | True | Passed |
| other approach denied | True | False | Failed |
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| first permitted | True | True | Passed |
| second permitted | False | True | Failed |
| restricted wrong exit | False | False | Passed |
| unrelated incoming | True | True | Passed |
| no rules | True | True | Passed |
| other approach rules | True | True | Passed |
| other approach denied | False | False | Passed |
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| first permitted | True | True | Passed |
| second permitted | True | True | Passed |
| restricted wrong exit | False | False | Passed |
| unrelated incoming | True | True | Passed |
| no rules | True | True | Passed |
| other approach rules | True | True | Passed |
| other approach denied | False | False | Passed |
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