FA-12066 / Sensor fusion consistency / Open access
Measurement channel permutation leaves covariance behind · case 01
An uncertainty belongs to the wrong sensor channel.
ROOT CAUSE
Only the measurement vector is reordered.
VERIFIED REPAIR
Apply the same channel permutation to both covariance dimensions.
Unsuccessful approach: Permuting rows alone breaks diagonal association and symmetry.
Case contract
Given a 2x2 measurement covariance in source order and a permutation of [0,1], return covariance in requested channel order.
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(covariance, order):
return covariance
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('unequal uncertainties', solve([[N,0],[0,4*N]],[1,0]), [[4*N,0],[0,N]])
check('cross covariance', solve([[2*N,N],[N,3*N]],[1,0]), [[3*N,N],[N,2*N]])
check('negative cross covariance', solve([[2*N,-N],[-N,3*N]],[1,0]), [[3*N,-N],[-N,2*N]])
check('identity channel order', solve([[N,0],[0,2*N]],[0,1]), [[N,0],[0,2*N]])
check('equal variances', solve([[2*N,N],[N,2*N]],[1,0]), [[2*N,N],[N,2*N]])
check('zero covariance boundary', solve([[0,0],[0,N]],[1,0]), [[N,0],[0,0]])
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 |
|---|---|---|---|
| unequal uncertainties | [[1, 0], [0, 4]] | [[4, 0], [0, 1]] | Failed |
| cross covariance | [[2, 1], [1, 3]] | [[3, 1], [1, 2]] | Failed |
| negative cross covariance | [[2, -1], [-1, 3]] | [[3, -1], [-1, 2]] | Failed |
| identity channel order | [[1, 0], [0, 2]] | [[1, 0], [0, 2]] | Passed |
| equal variances | [[2, 1], [1, 2]] | [[2, 1], [1, 2]] | Passed |
| zero covariance boundary | [[0, 0], [0, 1]] | [[1, 0], [0, 0]] | Failed |
SHA-256 / 8d1d79a22b6bda7331864f2bf33381a1b1ff1766f72b14398a1cb089c1eda5dc
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(covariance, order):
return [covariance[i] for i in order]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('unequal uncertainties', solve([[N,0],[0,4*N]],[1,0]), [[4*N,0],[0,N]])
check('cross covariance', solve([[2*N,N],[N,3*N]],[1,0]), [[3*N,N],[N,2*N]])
check('negative cross covariance', solve([[2*N,-N],[-N,3*N]],[1,0]), [[3*N,-N],[-N,2*N]])
check('identity channel order', solve([[N,0],[0,2*N]],[0,1]), [[N,0],[0,2*N]])
check('equal variances', solve([[2*N,N],[N,2*N]],[1,0]), [[2*N,N],[N,2*N]])
check('zero covariance boundary', solve([[0,0],[0,N]],[1,0]), [[N,0],[0,0]])
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 |
|---|---|---|---|
| unequal uncertainties | [[0, 4], [1, 0]] | [[4, 0], [0, 1]] | Failed |
| cross covariance | [[1, 3], [2, 1]] | [[3, 1], [1, 2]] | Failed |
| negative cross covariance | [[-1, 3], [2, -1]] | [[3, -1], [-1, 2]] | Failed |
| identity channel order | [[1, 0], [0, 2]] | [[1, 0], [0, 2]] | Passed |
| equal variances | [[1, 2], [2, 1]] | [[2, 1], [1, 2]] | Failed |
| zero covariance boundary | [[0, 1], [0, 0]] | [[1, 0], [0, 0]] | Failed |
SHA-256 / a86a64fdfd6c7b018070bbe54f5337903b19e17d109a168f7a0e4912d17d7c05
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(covariance, order):
return [[covariance[i][j] for j in order] for i in order]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('unequal uncertainties', solve([[N,0],[0,4*N]],[1,0]), [[4*N,0],[0,N]])
check('cross covariance', solve([[2*N,N],[N,3*N]],[1,0]), [[3*N,N],[N,2*N]])
check('negative cross covariance', solve([[2*N,-N],[-N,3*N]],[1,0]), [[3*N,-N],[-N,2*N]])
check('identity channel order', solve([[N,0],[0,2*N]],[0,1]), [[N,0],[0,2*N]])
check('equal variances', solve([[2*N,N],[N,2*N]],[1,0]), [[2*N,N],[N,2*N]])
check('zero covariance boundary', solve([[0,0],[0,N]],[1,0]), [[N,0],[0,0]])
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 |
|---|---|---|---|
| unequal uncertainties | [[4, 0], [0, 1]] | [[4, 0], [0, 1]] | Passed |
| cross covariance | [[3, 1], [1, 2]] | [[3, 1], [1, 2]] | Passed |
| negative cross covariance | [[3, -1], [-1, 2]] | [[3, -1], [-1, 2]] | Passed |
| identity channel order | [[1, 0], [0, 2]] | [[1, 0], [0, 2]] | Passed |
| equal variances | [[2, 1], [1, 2]] | [[2, 1], [1, 2]] | Passed |
| zero covariance boundary | [[1, 0], [0, 0]] | [[1, 0], [0, 0]] | Passed |
SHA-256 / b26e20cf6a9bd3ad0e98fdb5836905ce1613c14532a4d930e037301ef2a0aa63
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.573488+00:00.
Case digest / c165ef0038674d119cbc1aac812f8b4a0664c51ba08864f43855ed28a0142c59