FAILURE MAP
← Case archive

FA-69751 / Orbital propagation / Open access

Clohessy-Wiltshire relative motion: Along-track velocity couples into radial motion with the wrong sign · case 01

A prograde burn appears to lower the chaser.

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

ROOT CAUSE

The x equation subtracts 2/n (1-cos nt) vy0.

VERIFIED REPAIR

Add 2/n (1-cos nt) vy0.

Unsuccessful approach: Using (1+cos nt) keeps the right sign but the wrong phase.

Case contract

Input [x0,y0,z0,vx0,vy0,vz0,n,t] with x radial, y along-track, z cross-track about a circular reference orbit of mean motion n. Return [x,y,z,vx,vy,vz] from the closed-form HCW solution, 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):
    x0,y0,z0,vx,vy,vz,n,t=x
    s=math.sin(n*t); c=math.cos(n*t)
    X=(4-3*c)*x0+s/n*vx-2/n*(1-c)*vy
    Y=6*(s-n*t)*x0+y0-2/n*(1-c)*vx+(4*s-3*n*t)/n*vy
    Z=c*z0+s/n*vz
    VX=3*n*s*x0+c*vx+2*s*vy
    VY=6*n*(c-1)*x0-2*s*vx+(4*c-3)*vy
    VZ=-n*s*z0+c*vz
    return [round(q,6) for q in (X,Y,Z,VX,VY,VZ)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0]', [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0], [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0]), ('clohessy-wiltshire relative motion [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0]', [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0], [0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0]', [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0], [0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563]), ('clohessy-wiltshire relative motion [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0]', [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0], [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0]', [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0], [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0]), ('clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0]', [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0], [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0]', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], [('clohessy-wiltshire relative motion [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0]', [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0], [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0]', [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0], [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0]), ('clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0]', [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0], [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0]', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), ('clohessy-wiltshire relative motion [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0]', [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0], [-0.571404, 9.834915, -0.062542, 0.000589, 0.000851, -0.000249]), ('clohessy-wiltshire relative motion [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0]', [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0], [0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0]), ('clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0]', [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0], [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0])], [('clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0]', [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0], [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0]', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), ('clohessy-wiltshire relative motion [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0]', [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0], [-0.571404, 9.834915, -0.062542, 0.000589, 0.000851, -0.000249]), ('clohessy-wiltshire relative motion [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0]', [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0], [0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0]), ('clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0]', [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0], [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0]', [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0], [0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563]), ('clohessy-wiltshire relative motion [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0]', [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0], [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05])], [('clohessy-wiltshire relative motion [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0]', [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0], [-0.571404, 9.834915, -0.062542, 0.000589, 0.000851, -0.000249]), ('clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0]', [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0], [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0]', [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0], [0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563]), ('clohessy-wiltshire relative motion [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0]', [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0], [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0]', [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0], [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0]), ('clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0]', [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0], [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0]', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], [('clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0]', [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0], [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0]', [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0], [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0]), ('clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0]', [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0], [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0]', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), ('clohessy-wiltshire relative motion [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0]', [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0], [-0.571404, 9.834915, -0.062542, 0.000589, 0.000851, -0.000249]), ('clohessy-wiltshire relative motion [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0]', [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0], [0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0]', [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0], [0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563])]]
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 fixtureActualExpectedOutcome
clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0][-1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0][1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0]Failed
clohessy-wiltshire relative motion [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0][0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0][0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0]Passed
clohessy-wiltshire relative motion [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0][0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563][0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563]Passed
clohessy-wiltshire relative motion [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0][2.404865, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05][0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05]Failed
clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0][0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0][0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0]Passed
clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0][4.217884, -1.682942, 0.0, -0.841471, -1.080605, 0.0][0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0]Failed
clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0][0.0, 0.0, 0.0, 0.0, 0.0, 0.0][0.0, 0.0, 0.0, 0.0, 0.0, 0.0]Passed

SHA-256 / 641e976d67f79b173face0f2f8c2a9e733e53212b1abb33a81a98f5f4bbcd261

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
    x0,y0,z0,vx,vy,vz,n,t=x
    s=math.sin(n*t); c=math.cos(n*t)
    X=(4-3*c)*x0+s/n*vx+2/n*(1+c)*vy
    Y=6*(s-n*t)*x0+y0-2/n*(1-c)*vx+(4*s-3*n*t)/n*vy
    Z=c*z0+s/n*vz
    VX=3*n*s*x0+c*vx+2*s*vy
    VY=6*n*(c-1)*x0-2*s*vx+(4*c-3)*vy
    VZ=-n*s*z0+c*vz
    return [round(q,6) for q in (X,Y,Z,VX,VY,VZ)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0]', [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0], [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0]), ('clohessy-wiltshire relative motion [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0]', [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0], [0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0]', [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0], [0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563]), ('clohessy-wiltshire relative motion [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0]', [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0], [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0]', [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0], [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0]), ('clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0]', [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0], [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0]', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], [('clohessy-wiltshire relative motion [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0]', [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0], [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0]', [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0], [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0]), ('clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0]', [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0], [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0]', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), ('clohessy-wiltshire relative motion [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0]', [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0], [-0.571404, 9.834915, -0.062542, 0.000589, 0.000851, -0.000249]), ('clohessy-wiltshire relative motion [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0]', [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0], [0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0]), ('clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0]', [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0], [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0])], [('clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0]', [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0], [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0]', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), ('clohessy-wiltshire relative motion [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0]', [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0], [-0.571404, 9.834915, -0.062542, 0.000589, 0.000851, -0.000249]), ('clohessy-wiltshire relative motion [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0]', [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0], [0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0]), ('clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0]', [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0], [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0]', [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0], [0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563]), ('clohessy-wiltshire relative motion [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0]', [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0], [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05])], [('clohessy-wiltshire relative motion [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0]', [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0], [-0.571404, 9.834915, -0.062542, 0.000589, 0.000851, -0.000249]), ('clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0]', [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0], [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0]', [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0], [0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563]), ('clohessy-wiltshire relative motion [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0]', [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0], [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0]', [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0], [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0]), ('clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0]', [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0], [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0]', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], [('clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0]', [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0], [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0]', [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0], [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0]), ('clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0]', [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0], [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0]', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), ('clohessy-wiltshire relative motion [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0]', [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0], [-0.571404, 9.834915, -0.062542, 0.000589, 0.000851, -0.000249]), ('clohessy-wiltshire relative motion [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0]', [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0], [0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0]', [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0], [0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563])]]
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 fixtureActualExpectedOutcome
clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0][2.147165, 0.858477, 0.0, 0.001954, -0.002147, 0.0][1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0]Failed
clohessy-wiltshire relative motion [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0][0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0][0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0]Passed
clohessy-wiltshire relative motion [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0][0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563][0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563]Passed
clohessy-wiltshire relative motion [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0][1.313956, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05][0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05]Failed
clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0][0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0][0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0]Passed
clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0][-3.782116, -1.682942, 0.0, -0.841471, -1.080605, 0.0][0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0]Failed
clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0][0.0, 0.0, 0.0, 0.0, 0.0, 0.0][0.0, 0.0, 0.0, 0.0, 0.0, 0.0]Passed

SHA-256 / 7551a391d04905f1620cb6ae442ff1f07dbb3249e9587e88f997985c2b46d05a

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
    x0,y0,z0,vx,vy,vz,n,t=x
    s=math.sin(n*t); c=math.cos(n*t)
    X=(4-3*c)*x0+s/n*vx+2/n*(1-c)*vy
    Y=6*(s-n*t)*x0+y0-2/n*(1-c)*vx+(4*s-3*n*t)/n*vy
    Z=c*z0+s/n*vz
    VX=3*n*s*x0+c*vx+2*s*vy
    VY=6*n*(c-1)*x0-2*s*vx+(4*c-3)*vy
    VZ=-n*s*z0+c*vz
    return [round(q,6) for q in (X,Y,Z,VX,VY,VZ)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0]', [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0], [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0]), ('clohessy-wiltshire relative motion [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0]', [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0], [0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0]', [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0], [0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563]), ('clohessy-wiltshire relative motion [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0]', [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0], [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0]', [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0], [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0]), ('clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0]', [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0], [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0]', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], [('clohessy-wiltshire relative motion [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0]', [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0], [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0]', [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0], [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0]), ('clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0]', [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0], [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0]', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), ('clohessy-wiltshire relative motion [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0]', [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0], [-0.571404, 9.834915, -0.062542, 0.000589, 0.000851, -0.000249]), ('clohessy-wiltshire relative motion [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0]', [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0], [0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0]), ('clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0]', [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0], [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0])], [('clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0]', [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0], [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0]', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), ('clohessy-wiltshire relative motion [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0]', [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0], [-0.571404, 9.834915, -0.062542, 0.000589, 0.000851, -0.000249]), ('clohessy-wiltshire relative motion [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0]', [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0], [0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0]), ('clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0]', [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0], [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0]', [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0], [0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563]), ('clohessy-wiltshire relative motion [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0]', [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0], [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05])], [('clohessy-wiltshire relative motion [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0]', [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0], [-0.571404, 9.834915, -0.062542, 0.000589, 0.000851, -0.000249]), ('clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0]', [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0], [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0]', [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0], [0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563]), ('clohessy-wiltshire relative motion [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0]', [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0], [0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0]', [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0], [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0]), ('clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0]', [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0], [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0]', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0])], [('clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0]', [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0], [1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0]', [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0], [0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0]), ('clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0]', [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0], [0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0]', [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), ('clohessy-wiltshire relative motion [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0]', [-0.3, 2.0, -0.2, 0.0001, 0.0002, -0.0001, 0.0012, 4500.0], [-0.571404, 9.834915, -0.062542, 0.000589, 0.000851, -0.000249]), ('clohessy-wiltshire relative motion [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0]', [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0], [0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0]), ('clohessy-wiltshire relative motion [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0]', [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0], [0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563])]]
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 fixtureActualExpectedOutcome
clohessy-wiltshire relative motion [0.0, 1.0, 0.0, 0.0, 0.001, 0.0, 0.00113, 1200.0][1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0][1.392658, 0.858477, 0.0, 0.001954, -0.002147, 0.0]Passed
clohessy-wiltshire relative motion [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 600.0][0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0][0.166351, -0.030458, 0.0, 0.000213, -0.00015, 0.0]Passed
clohessy-wiltshire relative motion [0.0, 0.0, 0.5, 0.0, 0.0, 0.0002, 0.00113, 2000.0][0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563][0.0, 0.0, -0.181368, 0.0, -0.0, -0.000563]Passed
clohessy-wiltshire relative motion [0.2, -1.0, 0.1, 0.0005, -0.0003, 0.0, 0.0011, 3000.0][0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05][0.236705, -4.084008, -0.098748, -0.000503, -0.000381, 1.7e-05]Passed
clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.00113, 900.0][0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0][0.752685, -0.83908, 0.0, 0.000526, -0.001701, 0.0]Passed
clohessy-wiltshire relative motion [1.0, 0.0, 0.0, 0.0, -2.0, 0.0, 1.0, 1.0][0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0][0.540302, -1.682942, 0.0, -0.841471, -1.080605, 0.0]Passed
clohessy-wiltshire relative motion [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00113, 500.0][0.0, 0.0, 0.0, 0.0, 0.0, 0.0][0.0, 0.0, 0.0, 0.0, 0.0, 0.0]Passed

SHA-256 / c80bd0d994e14e165a4e8e3a659da25009e8b8e01705659357de8a253ac8dee7

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.374137+00:00.

Case digest / d689cedaed22280d030e751ead7eda9db6b294905354cf03a21e1ac196b4a290