FA-69786 / Orbital propagation / Open access
Radial in-track cross-track projection: Relative vector points from deputy to chief · case 01
Every RIC component has the wrong sign.
ROOT CAUSE
The offset is computed as rc - rd.
VERIFIED REPAIR
Use rd - rc.
Unsuccessful approach: Projecting the absolute deputy position includes the chief radius.
Case contract
Input [rc, vc, rd]: chief position and velocity and deputy position. R=rc/|rc|, C=(rc x vc)/|rc x vc|, I=C x R. Return the deputy offset rd-rc projected onto [R, I, C], rounded to 6.
Why this case matters
Orbit determination and mission planning chain many small conversions; one wrong branch or unit silently moves a spacecraft by kilometres.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
rc,vc,rd=x
def dot(a,b): return sum(p*q for p,q in zip(a,b))
def cross(a,b): return [a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]]
def unit(a):
m=math.sqrt(dot(a,a))
return [q/m for q in a]
R=unit(rc)
C=unit(cross(rc,vc))
I=cross(C,R)
d=[q-p for p,q in zip(rd,rc)]
return [round(dot(d,R),6),round(dot(d,I),6),round(dot(d,C),6)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]]', [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]], [1.0, 2.0, 3.0]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]]', [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]], [0.0, 5.0, 0.0]), ('radial in-track cross-track projection [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]]', [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]], [10.0, -10.46518, -2.545584]), ('radial in-track cross-track projection [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]]', [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]], [0.980196, -3.240487, 2.353394]), ('radial in-track cross-track projection [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]]', [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]], [0.0, 1.414214, 0.0]), ('radial in-track cross-track projection [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]]', [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]], [0.1, 0.2, -0.3]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]]', [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]], [0.0, 0.0, 0.0])], [('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]]', [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]], [0.0, 5.0, 0.0]), ('radial in-track cross-track projection [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]]', [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]], [0.980196, -3.240487, 2.353394]), ('radial in-track cross-track projection [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]]', [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]], [0.0, 1.414214, 0.0]), ('radial in-track cross-track projection [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]]', [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]], [0.1, 0.2, -0.3]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]]', [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]], [0.0, 0.0, 0.0]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]]', [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]], [1.0, 2.0, 3.0]), ('radial in-track cross-track projection [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]]', [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]], [10.0, -10.46518, -2.545584])], [('radial in-track cross-track projection [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]]', [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]], [10.0, -10.46518, -2.545584]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]]', [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]], [0.0, 0.0, 0.0]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]]', [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]], [1.0, 2.0, 3.0]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]]', [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]], [0.0, 5.0, 0.0]), ('radial in-track cross-track projection [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]]', [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]], [0.980196, -3.240487, 2.353394]), ('radial in-track cross-track projection [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]]', [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]], [0.0, 1.414214, 0.0]), ('radial in-track cross-track projection [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]]', [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]], [0.1, 0.2, -0.3])], [('radial in-track cross-track projection [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]]', [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]], [0.980196, -3.240487, 2.353394]), ('radial in-track cross-track projection [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]]', [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]], [10.0, -10.46518, -2.545584]), ('radial in-track cross-track projection [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]]', [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]], [0.0, 1.414214, 0.0]), ('radial in-track cross-track projection [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]]', [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]], [0.1, 0.2, -0.3]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]]', [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]], [0.0, 0.0, 0.0]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]]', [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]], [1.0, 2.0, 3.0]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]]', [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]], [0.0, 5.0, 0.0])], [('radial in-track cross-track projection [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]]', [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]], [0.0, 1.414214, 0.0]), ('radial in-track cross-track projection [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]]', [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]], [0.1, 0.2, -0.3]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]]', [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]], [0.0, 0.0, 0.0]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]]', [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]], [1.0, 2.0, 3.0]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]]', [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]], [0.0, 5.0, 0.0]), ('radial in-track cross-track projection [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]]', [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]], [10.0, -10.46518, -2.545584]), ('radial in-track cross-track projection [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]]', [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]], [0.980196, -3.240487, 2.353394])]]
for label, args, expected in fixtures[N-1]:
check(label, solve(args), expected)
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 |
|---|---|---|---|
| radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]] | [-1.0, -2.0, -3.0] | [1.0, 2.0, 3.0] | Failed |
| radial in-track cross-track projection [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]] | [0.0, -5.0, 0.0] | [0.0, 5.0, 0.0] | Failed |
| radial in-track cross-track projection [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]] | [-10.0, 10.46518, 2.545584] | [10.0, -10.46518, -2.545584] | Failed |
| radial in-track cross-track projection [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]] | [-0.980196, 3.240487, -2.353394] | [0.980196, -3.240487, 2.353394] | Failed |
| radial in-track cross-track projection [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]] | [0.0, -1.414214, 0.0] | [0.0, 1.414214, 0.0] | Failed |
| radial in-track cross-track projection [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]] | [-0.1, -0.2, 0.3] | [0.1, 0.2, -0.3] | Failed |
| radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]] | [0.0, 0.0, 0.0] | [0.0, 0.0, 0.0] | Passed |
SHA-256 / 9a9e2e69a536e5d36f85083ee06abe04ae11d5c00cd5a6844208c3bf97b4069e
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
rc,vc,rd=x
def dot(a,b): return sum(p*q for p,q in zip(a,b))
def cross(a,b): return [a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]]
def unit(a):
m=math.sqrt(dot(a,a))
return [q/m for q in a]
R=unit(rc)
C=unit(cross(rc,vc))
I=cross(C,R)
d=list(rd)
return [round(dot(d,R),6),round(dot(d,I),6),round(dot(d,C),6)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]]', [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]], [1.0, 2.0, 3.0]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]]', [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]], [0.0, 5.0, 0.0]), ('radial in-track cross-track projection [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]]', [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]], [10.0, -10.46518, -2.545584]), ('radial in-track cross-track projection [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]]', [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]], [0.980196, -3.240487, 2.353394]), ('radial in-track cross-track projection [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]]', [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]], [0.0, 1.414214, 0.0]), ('radial in-track cross-track projection [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]]', [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]], [0.1, 0.2, -0.3]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]]', [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]], [0.0, 0.0, 0.0])], [('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]]', [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]], [0.0, 5.0, 0.0]), ('radial in-track cross-track projection [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]]', [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]], [0.980196, -3.240487, 2.353394]), ('radial in-track cross-track projection [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]]', [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]], [0.0, 1.414214, 0.0]), ('radial in-track cross-track projection [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]]', [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]], [0.1, 0.2, -0.3]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]]', [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]], [0.0, 0.0, 0.0]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]]', [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]], [1.0, 2.0, 3.0]), ('radial in-track cross-track projection [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]]', [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]], [10.0, -10.46518, -2.545584])], [('radial in-track cross-track projection [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]]', [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]], [10.0, -10.46518, -2.545584]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]]', [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]], [0.0, 0.0, 0.0]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]]', [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]], [1.0, 2.0, 3.0]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]]', [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]], [0.0, 5.0, 0.0]), ('radial in-track cross-track projection [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]]', [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]], [0.980196, -3.240487, 2.353394]), ('radial in-track cross-track projection [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]]', [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]], [0.0, 1.414214, 0.0]), ('radial in-track cross-track projection [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]]', [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]], [0.1, 0.2, -0.3])], [('radial in-track cross-track projection [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]]', [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]], [0.980196, -3.240487, 2.353394]), ('radial in-track cross-track projection [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]]', [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]], [10.0, -10.46518, -2.545584]), ('radial in-track cross-track projection [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]]', [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]], [0.0, 1.414214, 0.0]), ('radial in-track cross-track projection [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]]', [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]], [0.1, 0.2, -0.3]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]]', [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]], [0.0, 0.0, 0.0]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]]', [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]], [1.0, 2.0, 3.0]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]]', [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]], [0.0, 5.0, 0.0])], [('radial in-track cross-track projection [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]]', [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]], [0.0, 1.414214, 0.0]), ('radial in-track cross-track projection [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]]', [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]], [0.1, 0.2, -0.3]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]]', [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]], [0.0, 0.0, 0.0]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]]', [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]], [1.0, 2.0, 3.0]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]]', [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]], [0.0, 5.0, 0.0]), ('radial in-track cross-track projection [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]]', [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]], [10.0, -10.46518, -2.545584]), ('radial in-track cross-track projection [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]]', [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]], [0.980196, -3.240487, 2.353394])]]
for label, args, expected in fixtures[N-1]:
check(label, solve(args), expected)
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 |
|---|---|---|---|
| radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]] | [7001.0, 2.0, 3.0] | [1.0, 2.0, 3.0] | Failed |
| radial in-track cross-track projection [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]] | [7000.0, 5.0, 0.0] | [0.0, 5.0, 0.0] | Failed |
| radial in-track cross-track projection [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]] | [7010.0, -10.46518, -2.545584] | [10.0, -10.46518, -2.545584] | Failed |
| radial in-track cross-track projection [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]] | [7142.408625, -3.240487, 2.353394] | [0.980196, -3.240487, 2.353394] | Failed |
| radial in-track cross-track projection [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]] | [6778.0, 1.414214, 0.0] | [0.0, 1.414214, 0.0] | Failed |
| radial in-track cross-track projection [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]] | [1.1, 0.2, -0.3] | [0.1, 0.2, -0.3] | Failed |
| radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]] | [7000.0, 0.0, 0.0] | [0.0, 0.0, 0.0] | Failed |
SHA-256 / b4500c3757a01d179a2fbc7aa1712c88246bfacd002035748925cbcf4a273292
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
rc,vc,rd=x
def dot(a,b): return sum(p*q for p,q in zip(a,b))
def cross(a,b): return [a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]]
def unit(a):
m=math.sqrt(dot(a,a))
return [q/m for q in a]
R=unit(rc)
C=unit(cross(rc,vc))
I=cross(C,R)
d=[p-q for p,q in zip(rd,rc)]
return [round(dot(d,R),6),round(dot(d,I),6),round(dot(d,C),6)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]]', [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]], [1.0, 2.0, 3.0]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]]', [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]], [0.0, 5.0, 0.0]), ('radial in-track cross-track projection [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]]', [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]], [10.0, -10.46518, -2.545584]), ('radial in-track cross-track projection [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]]', [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]], [0.980196, -3.240487, 2.353394]), ('radial in-track cross-track projection [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]]', [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]], [0.0, 1.414214, 0.0]), ('radial in-track cross-track projection [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]]', [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]], [0.1, 0.2, -0.3]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]]', [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]], [0.0, 0.0, 0.0])], [('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]]', [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]], [0.0, 5.0, 0.0]), ('radial in-track cross-track projection [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]]', [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]], [0.980196, -3.240487, 2.353394]), ('radial in-track cross-track projection [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]]', [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]], [0.0, 1.414214, 0.0]), ('radial in-track cross-track projection [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]]', [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]], [0.1, 0.2, -0.3]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]]', [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]], [0.0, 0.0, 0.0]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]]', [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]], [1.0, 2.0, 3.0]), ('radial in-track cross-track projection [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]]', [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]], [10.0, -10.46518, -2.545584])], [('radial in-track cross-track projection [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]]', [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]], [10.0, -10.46518, -2.545584]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]]', [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]], [0.0, 0.0, 0.0]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]]', [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]], [1.0, 2.0, 3.0]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]]', [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]], [0.0, 5.0, 0.0]), ('radial in-track cross-track projection [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]]', [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]], [0.980196, -3.240487, 2.353394]), ('radial in-track cross-track projection [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]]', [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]], [0.0, 1.414214, 0.0]), ('radial in-track cross-track projection [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]]', [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]], [0.1, 0.2, -0.3])], [('radial in-track cross-track projection [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]]', [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]], [0.980196, -3.240487, 2.353394]), ('radial in-track cross-track projection [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]]', [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]], [10.0, -10.46518, -2.545584]), ('radial in-track cross-track projection [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]]', [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]], [0.0, 1.414214, 0.0]), ('radial in-track cross-track projection [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]]', [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]], [0.1, 0.2, -0.3]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]]', [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]], [0.0, 0.0, 0.0]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]]', [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]], [1.0, 2.0, 3.0]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]]', [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]], [0.0, 5.0, 0.0])], [('radial in-track cross-track projection [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]]', [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]], [0.0, 1.414214, 0.0]), ('radial in-track cross-track projection [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]]', [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]], [0.1, 0.2, -0.3]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]]', [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]], [0.0, 0.0, 0.0]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]]', [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]], [1.0, 2.0, 3.0]), ('radial in-track cross-track projection [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]]', [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]], [0.0, 5.0, 0.0]), ('radial in-track cross-track projection [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]]', [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]], [10.0, -10.46518, -2.545584]), ('radial in-track cross-track projection [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]]', [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]], [0.980196, -3.240487, 2.353394])]]
for label, args, expected in fixtures[N-1]:
check(label, solve(args), expected)
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 |
|---|---|---|---|
| radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7001.0, 2.0, 3.0]] | [1.0, 2.0, 3.0] | [1.0, 2.0, 3.0] | Passed |
| radial in-track cross-track projection [[7000.0, 0.0, 0.0], [1.0, 7.5, 0.0], [7000.0, 5.0, 0.0]] | [0.0, 5.0, 0.0] | [0.0, 5.0, 0.0] | Passed |
| radial in-track cross-track projection [[0.0, 7000.0, 0.0], [-7.0, 0.0, 1.0], [10.0, 7010.0, -4.0]] | [10.0, -10.46518, -2.545584] | [10.0, -10.46518, -2.545584] | Passed |
| radial in-track cross-track projection [[5000.0, 5000.0, 1000.0], [-5.0, 5.0, 1.0], [5003.0, 4998.0, 1002.0]] | [0.980196, -3.240487, 2.353394] | [0.980196, -3.240487, 2.353394] | Passed |
| radial in-track cross-track projection [[6778.0, 0.0, 0.0], [0.0, 5.3, 5.3], [6778.0, 1.0, 1.0]] | [0.0, 1.414214, 0.0] | [0.0, 1.414214, 0.0] | Passed |
| radial in-track cross-track projection [[1.0, 0.0, 0.0], [0.5, 1.0, 0.0], [1.1, 0.2, -0.3]] | [0.1, 0.2, -0.3] | [0.1, 0.2, -0.3] | Passed |
| radial in-track cross-track projection [[7000.0, 0.0, 0.0], [0.0, 7.5, 0.0], [7000.0, 0.0, 0.0]] | [0.0, 0.0, 0.0] | [0.0, 0.0, 0.0] | Passed |
SHA-256 / a0258d05145cc1bf085f162e594a5e8624cf78d9e228f5a3cb0a0fbc5f23547c
Verification & scope
A deterministic toy two-body model with stipulated constants and conventions; not flight dynamics software or a validated SGP4 implementation. 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:48:14.549381+00:00.
Case digest / b71db5f4f7878586d418cd4b7dcd31d28103a62555e256642a2579419d33d344