FAILURE MAP
← Case archive

FA-12071 / Sensor fusion consistency / Open access

Innovation gate ignores uncertainty in the predicted state · case 01

Plausible measurements are rejected when prediction uncertainty grows.

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

ROOT CAUSE

Gate normalizes residual only by measurement variance.

VERIFIED REPAIR

Compare squared residual against threshold times the summed prediction and measurement variances.

Unsuccessful approach: Using standard deviation without squaring the residual mixes dimensions.

Case contract

Scalar independent-noise innovation gate: accept residual squared <= threshold*(p+r). p and r positive integer variances; threshold positive integer squared-Mahalanobis limit.

Why this case matters

Deterministic sensor-fusion model isolating one consistency contract; no hardware or production estimator is simulated.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
N = 1
observations = []
def solve(residual, p, r, threshold):
    return residual*residual <= threshold*r
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('prediction uncertainty matters', solve(2*N,3*N*N,N*N,1), True)
check('failed dimensional fix', solve(3*N,2*N*N,2*N*N,1), False)
check('negative boundary', solve(-2*N,3*N*N,N*N,1), True)
check('zero innovation', solve(0,N,N,1), True)
check('large rejection', solve(10*N,N,N,1), False)
check('squared threshold convention', solve(4*N,2*N*N,2*N*N,4), True)
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
prediction uncertainty mattersFalseTrueFailed
failed dimensional fixFalseFalsePassed
negative boundaryFalseTrueFailed
zero innovationTrueTruePassed
large rejectionFalseFalsePassed
squared threshold conventionFalseTrueFailed

SHA-256 / acd8634432e92a8150c92301e695a482b2375c8eb49e951acf079dcc6107341a

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
N = 1
observations = []
def solve(residual, p, r, threshold):
    return abs(residual) <= threshold*(p+r)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('prediction uncertainty matters', solve(2*N,3*N*N,N*N,1), True)
check('failed dimensional fix', solve(3*N,2*N*N,2*N*N,1), False)
check('negative boundary', solve(-2*N,3*N*N,N*N,1), True)
check('zero innovation', solve(0,N,N,1), True)
check('large rejection', solve(10*N,N,N,1), False)
check('squared threshold convention', solve(4*N,2*N*N,2*N*N,4), True)
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
prediction uncertainty mattersTrueTruePassed
failed dimensional fixTrueFalseFailed
negative boundaryTrueTruePassed
zero innovationTrueTruePassed
large rejectionFalseFalsePassed
squared threshold conventionTrueTruePassed

SHA-256 / 4d9bb580ad764942d760caa18e0983170c8bd690b1f396243ab29fe37a44fe9c

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
N = 1
observations = []
def solve(residual, p, r, threshold):
    return residual*residual <= threshold*(p+r)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('prediction uncertainty matters', solve(2*N,3*N*N,N*N,1), True)
check('failed dimensional fix', solve(3*N,2*N*N,2*N*N,1), False)
check('negative boundary', solve(-2*N,3*N*N,N*N,1), True)
check('zero innovation', solve(0,N,N,1), True)
check('large rejection', solve(10*N,N,N,1), False)
check('squared threshold convention', solve(4*N,2*N*N,2*N*N,4), True)
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
prediction uncertainty mattersTrueTruePassed
failed dimensional fixFalseFalsePassed
negative boundaryTrueTruePassed
zero innovationTrueTruePassed
large rejectionFalseFalsePassed
squared threshold conventionTrueTruePassed

SHA-256 / 759f94bbf462029f57fe726a1a0f3af2b882e1bc5d3a26c1c9faf54dad326769

Verification & scope

Exact small scalar or two-axis models; no nonlinear dynamics, numerical conditioning, or real sensor noise simulation. 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:53.619954+00:00.

Case digest / 038a92a5c623da5e7346974ffae5257d3e35f99798f2c93d62a537cdc46cd91a