FA-69791 / Orbital propagation / Open access
Radial in-track cross-track projection: Radial axis is the raw position vector · case 01
Radial offsets are multiplied by the orbit radius.
ROOT CAUSE
R is not normalized.
VERIFIED REPAIR
Normalize the chief position.
Unsuccessful approach: Normalizing the relative vector instead of the chief position aligns the radial axis with the offset.
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=list(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]] | [7000.0, 14000.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, 35000.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]] | [70000.0, -73256.262531, -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]] | [7000.0, -23141.703946, 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, 9585.539526, 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] | 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 / a925351e08050803f053acd751ba8b4bb1dbbec12c57dbfb22b5ab61313a928b
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([p-q for p,q in zip(rd,rc)]) if rd!=rc else 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]] | [3.741657, 0.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]] | [5.0, 0.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]] | [14.696938, 0.0, -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]] | [4.123106, -0.0, 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]] | [1.414214, 0.0, 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.374166, 0.0, -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 / b95d731588e77a494fe25433de8e93c0fc2023b3240ade59137aca176aa44da1
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.636702+00:00.
Case digest / e190537aa4f6a333b0ddb03753c5b453fd31c3399be87cba59721b9c9f76f555