{"abstract":"True anomaly runs twice as fast as the orbit.","category":"Orbital propagation","checks":7,"contract":"Input [E, e] (radians, 0<=e<1, E any real). Return [nu, r/a] with nu = 2*atan2(sqrt(1+e) sin(E/2), sqrt(1-e) cos(E/2)) reduced to [0,2pi) and r/a = 1-e cos E, both rounded to 9 decimals.","contract_signature":"x","evaluation_group":"w2-orbital_propagation-true_anomaly","failed_approach":"Using half angles but dropping the doubling returns nu/2.","family":"w2-orbital_propagation-true_anomaly-half-angle","id":"FA-69376","implementations":{"attempt":{"sha256":"272df4e5247963dfdaba04c3512cd94b377f2973e7f5079f6c410bca5258f421","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    E,e=x\n    nu=math.atan2(math.sqrt(1+e)*math.sin(E/2),math.sqrt(1-e)*math.cos(E/2))\n    nu%=2*math.pi\n    return [round(nu,9),round(1-e*math.cos(E),9)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('true anomaly from eccentric anomaly [0.4, 0.1]', [0.4, 0.1], [0.440923623, 0.907893901]), ('true anomaly from eccentric anomaly [2.5, 0.3]', [2.5, 0.3], [2.663281246, 1.240343085]), ('true anomaly from eccentric anomaly [4.0, 0.3]', [4.0, 0.3], [3.789582293, 1.196093086]), ('true anomaly from eccentric anomaly [5.9, 0.7]', [5.9, 0.7], [5.418028431, 0.350765098]), ('true anomaly from eccentric anomaly [3.141592653589793, 0.5]', [3.141592653589793, 0.5], [3.141592654, 1.5]), ('true anomaly from eccentric anomaly [0.0, 0.9]', [0.0, 0.9], [0.0, 0.1]), ('true anomaly from eccentric anomaly [7.0, 0.2]', [7.0, 0.2], [0.860249203, 0.849219549])], [('true anomaly from eccentric anomaly [2.5, 0.3]', [2.5, 0.3], [2.663281246, 1.240343085]), ('true anomaly from eccentric anomaly [5.9, 0.7]', [5.9, 0.7], [5.418028431, 0.350765098]), ('true anomaly from eccentric anomaly [3.141592653589793, 0.5]', [3.141592653589793, 0.5], [3.141592654, 1.5]), ('true anomaly from eccentric anomaly [0.0, 0.9]', [0.0, 0.9], [0.0, 0.1]), ('true anomaly from eccentric anomaly [7.0, 0.2]', [7.0, 0.2], [0.860249203, 0.849219549]), ('true anomaly from eccentric anomaly [-1.0, 0.4]', [-1.0, 0.4], [4.892343298, 0.783879078]), ('true anomaly from eccentric anomaly [-4.0, 0.6]', [-4.0, 0.6], [2.691681202, 1.392186173])], [('true anomaly from eccentric anomaly [4.0, 0.3]', [4.0, 0.3], [3.789582293, 1.196093086]), ('true anomaly from eccentric anomaly [7.0, 0.2]', [7.0, 0.2], [0.860249203, 0.849219549]), ('true anomaly from eccentric anomaly [-1.0, 0.4]', [-1.0, 0.4], [4.892343298, 0.783879078]), ('true anomaly from eccentric anomaly [-4.0, 0.6]', [-4.0, 0.6], [2.691681202, 1.392186173]), ('true anomaly from eccentric anomaly [1.2, 0.0]', [1.2, 0.0], [1.2, 1.0]), ('true anomaly from eccentric anomaly [3.5, 0.95]', [3.5, 0.95], [3.199589845, 1.889633853]), ('true anomaly from eccentric anomaly [12.0, 0.15]', [12.0, 0.15], [5.630422415, 0.873421906])], [('true anomaly from eccentric anomaly [5.9, 0.7]', [5.9, 0.7], [5.418028431, 0.350765098]), ('true anomaly from eccentric anomaly [1.2, 0.0]', [1.2, 0.0], [1.2, 1.0]), ('true anomaly from eccentric anomaly [3.5, 0.95]', [3.5, 0.95], [3.199589845, 1.889633853]), ('true anomaly from eccentric anomaly [12.0, 0.15]', [12.0, 0.15], [5.630422415, 0.873421906]), ('true anomaly from eccentric anomaly [0.4, 0.1]', [0.4, 0.1], [0.440923623, 0.907893901]), ('true anomaly from eccentric anomaly [2.5, 0.3]', [2.5, 0.3], [2.663281246, 1.240343085]), ('true anomaly from eccentric anomaly [4.0, 0.3]', [4.0, 0.3], [3.789582293, 1.196093086])], [('true anomaly from eccentric anomaly [3.141592653589793, 0.5]', [3.141592653589793, 0.5], [3.141592654, 1.5]), ('true anomaly from eccentric anomaly [0.4, 0.1]', [0.4, 0.1], [0.440923623, 0.907893901]), ('true anomaly from eccentric anomaly [2.5, 0.3]', [2.5, 0.3], [2.663281246, 1.240343085]), ('true anomaly from eccentric anomaly [4.0, 0.3]', [4.0, 0.3], [3.789582293, 1.196093086]), ('true anomaly from eccentric anomaly [5.9, 0.7]', [5.9, 0.7], [5.418028431, 0.350765098]), ('true anomaly from eccentric anomaly [0.0, 0.9]', [0.0, 0.9], [0.0, 0.1]), ('true anomaly from eccentric anomaly [7.0, 0.2]', [7.0, 0.2], [0.860249203, 0.849219549])]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"5b54e38e057b31bce163134a8b553ed5ea23795dd8fb7719502821ed7172b347","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    E,e=x\n    nu=2*math.atan2(math.sqrt(1+e)*math.sin(E),math.sqrt(1-e)*math.cos(E))\n    nu%=2*math.pi\n    return [round(nu,9),round(1-e*math.cos(E),9)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('true anomaly from eccentric anomaly [0.4, 0.1]', [0.4, 0.1], [0.440923623, 0.907893901]), ('true anomaly from eccentric anomaly [2.5, 0.3]', [2.5, 0.3], [2.663281246, 1.240343085]), ('true anomaly from eccentric anomaly [4.0, 0.3]', [4.0, 0.3], [3.789582293, 1.196093086]), ('true anomaly from eccentric anomaly [5.9, 0.7]', [5.9, 0.7], [5.418028431, 0.350765098]), ('true anomaly from eccentric anomaly [3.141592653589793, 0.5]', [3.141592653589793, 0.5], [3.141592654, 1.5]), ('true anomaly from eccentric anomaly [0.0, 0.9]', [0.0, 0.9], [0.0, 0.1]), ('true anomaly from eccentric anomaly [7.0, 0.2]', [7.0, 0.2], [0.860249203, 0.849219549])], [('true anomaly from eccentric anomaly [2.5, 0.3]', [2.5, 0.3], [2.663281246, 1.240343085]), ('true anomaly from eccentric anomaly [5.9, 0.7]', [5.9, 0.7], [5.418028431, 0.350765098]), ('true anomaly from eccentric anomaly [3.141592653589793, 0.5]', [3.141592653589793, 0.5], [3.141592654, 1.5]), ('true anomaly from eccentric anomaly [0.0, 0.9]', [0.0, 0.9], [0.0, 0.1]), ('true anomaly from eccentric anomaly [7.0, 0.2]', [7.0, 0.2], [0.860249203, 0.849219549]), ('true anomaly from eccentric anomaly [-1.0, 0.4]', [-1.0, 0.4], [4.892343298, 0.783879078]), ('true anomaly from eccentric anomaly [-4.0, 0.6]', [-4.0, 0.6], [2.691681202, 1.392186173])], [('true anomaly from eccentric anomaly [4.0, 0.3]', [4.0, 0.3], [3.789582293, 1.196093086]), ('true anomaly from eccentric anomaly [7.0, 0.2]', [7.0, 0.2], [0.860249203, 0.849219549]), ('true anomaly from eccentric anomaly [-1.0, 0.4]', [-1.0, 0.4], [4.892343298, 0.783879078]), ('true anomaly from eccentric anomaly [-4.0, 0.6]', [-4.0, 0.6], [2.691681202, 1.392186173]), ('true anomaly from eccentric anomaly [1.2, 0.0]', [1.2, 0.0], [1.2, 1.0]), ('true anomaly from eccentric anomaly [3.5, 0.95]', [3.5, 0.95], [3.199589845, 1.889633853]), ('true anomaly from eccentric anomaly [12.0, 0.15]', [12.0, 0.15], [5.630422415, 0.873421906])], [('true anomaly from eccentric anomaly [5.9, 0.7]', [5.9, 0.7], [5.418028431, 0.350765098]), ('true anomaly from eccentric anomaly [1.2, 0.0]', [1.2, 0.0], [1.2, 1.0]), ('true anomaly from eccentric anomaly [3.5, 0.95]', [3.5, 0.95], [3.199589845, 1.889633853]), ('true anomaly from eccentric anomaly [12.0, 0.15]', [12.0, 0.15], [5.630422415, 0.873421906]), ('true anomaly from eccentric anomaly [0.4, 0.1]', [0.4, 0.1], [0.440923623, 0.907893901]), ('true anomaly from eccentric anomaly [2.5, 0.3]', [2.5, 0.3], [2.663281246, 1.240343085]), ('true anomaly from eccentric anomaly [4.0, 0.3]', [4.0, 0.3], [3.789582293, 1.196093086])], [('true anomaly from eccentric anomaly [3.141592653589793, 0.5]', [3.141592653589793, 0.5], [3.141592654, 1.5]), ('true anomaly from eccentric anomaly [0.4, 0.1]', [0.4, 0.1], [0.440923623, 0.907893901]), ('true anomaly from eccentric anomaly [2.5, 0.3]', [2.5, 0.3], [2.663281246, 1.240343085]), ('true anomaly from eccentric anomaly [4.0, 0.3]', [4.0, 0.3], [3.789582293, 1.196093086]), ('true anomaly from eccentric anomaly [5.9, 0.7]', [5.9, 0.7], [5.418028431, 0.350765098]), ('true anomaly from eccentric anomaly [0.0, 0.9]', [0.0, 0.9], [0.0, 0.1]), ('true anomaly from eccentric anomaly [7.0, 0.2]', [7.0, 0.2], [0.860249203, 0.849219549])]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"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.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-orbital_propagation-true_anomaly-half-angle","generated_at":"2026-09-29T14:48:10.829885+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Orbit determination and mission planning chain many small conversions; one wrong branch or unit silently moves a spacecraft by kilometres.","root_cause":"The formula uses sin(E) and cos(E) while still doubling the result.","sha256":"9d08ce37abfd5da09218e9511cfd1310ff3398cd91b26c20733f20b85e8d9755","title":"True anomaly from eccentric anomaly: Full angles are used in the half-angle formula · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verified":true,"visibility":"public","verification":{"attempt":{"elapsed_ms":41.051,"exit_code":1,"observations":[{"actual":[0.220461812,0.907893901],"check":"true anomaly from eccentric anomaly [0.4, 0.1]","expected":[0.440923623,0.907893901],"passed":false},{"actual":[1.331640623,1.240343085],"check":"true anomaly from eccentric anomaly [2.5, 0.3]","expected":[2.663281246,1.240343085],"passed":false},{"actual":[1.894791146,1.196093086],"check":"true anomaly from eccentric anomaly [4.0, 0.3]","expected":[3.789582293,1.196093086],"passed":false},{"actual":[2.709014216,0.350765098],"check":"true anomaly from eccentric anomaly [5.9, 0.7]","expected":[5.418028431,0.350765098],"passed":false},{"actual":[1.570796327,1.5],"check":"true anomaly from eccentric anomaly [3.141592653589793, 0.5]","expected":[3.141592654,1.5],"passed":false},{"actual":[0.0,0.1],"check":"true anomaly from eccentric anomaly [0.0, 0.9]","expected":[0.0,0.1],"passed":true},{"actual":[3.571717255,0.849219549],"check":"true anomaly from eccentric anomaly [7.0, 0.2]","expected":[0.860249203,0.849219549],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"true anomaly from eccentric anomaly [0.4, 0.1]\", \"actual\": [0.220461812, 0.907893901], \"expected\": [0.440923623, 0.907893901], \"passed\": false}, {\"check\": \"true anomaly from eccentric anomaly [2.5, 0.3]\", \"actual\": [1.331640623, 1.240343085], \"expected\": [2.663281246, 1.240343085], \"passed\": false}, {\"check\": \"true anomaly from eccentric anomaly [4.0, 0.3]\", \"actual\": [1.894791146, 1.196093086], \"expected\": [3.789582293, 1.196093086], \"passed\": false}, {\"check\": \"true anomaly from eccentric anomaly [5.9, 0.7]\", \"actual\": [2.709014216, 0.350765098], \"expected\": [5.418028431, 0.350765098], \"passed\": false}, {\"check\": \"true anomaly from eccentric anomaly [3.141592653589793, 0.5]\", \"actual\": [1.570796327, 1.5], \"expected\": [3.141592654, 1.5], \"passed\": false}, {\"check\": \"true anomaly from eccentric anomaly [0.0, 0.9]\", \"actual\": [0.0, 0.1], \"expected\": [0.0, 0.1], \"passed\": true}, {\"check\": \"true anomaly from eccentric anomaly [7.0, 0.2]\", \"actual\": [3.571717255, 0.849219549], \"expected\": [0.860249203, 0.849219549], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":37.303,"exit_code":1,"observations":[{"actual":[0.874483786,0.907893901],"check":"true anomaly from eccentric anomaly [0.4, 0.1]","expected":[0.440923623,0.907893901],"passed":false},{"actual":[4.694530571,1.240343085],"check":"true anomaly from eccentric anomaly [2.5, 0.3]","expected":[2.663281246,1.240343085],"passed":false},{"actual":[2.011822058,1.196093086],"check":"true anomaly from eccentric anomaly [4.0, 0.3]","expected":[3.789582293,1.196093086],"passed":false},{"actual":[4.753620334,0.350765098],"check":"true anomaly from eccentric anomaly [5.9, 0.7]","expected":[5.418028431,0.350765098],"passed":false},{"actual":[0.0,1.5],"check":"true anomaly from eccentric anomaly [3.141592653589793, 0.5]","expected":[3.141592654,1.5],"passed":false},{"actual":[0.0,0.1],"check":"true anomaly from eccentric anomaly [0.0, 0.9]","expected":[0.0,0.1],"passed":true},{"actual":[1.635883773,0.849219549],"check":"true anomaly from eccentric anomaly [7.0, 0.2]","expected":[0.860249203,0.849219549],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"true anomaly from eccentric anomaly [0.4, 0.1]\", \"actual\": [0.874483786, 0.907893901], \"expected\": [0.440923623, 0.907893901], \"passed\": false}, {\"check\": \"true anomaly from eccentric anomaly [2.5, 0.3]\", \"actual\": [4.694530571, 1.240343085], \"expected\": [2.663281246, 1.240343085], \"passed\": false}, {\"check\": \"true anomaly from eccentric anomaly [4.0, 0.3]\", \"actual\": [2.011822058, 1.196093086], \"expected\": [3.789582293, 1.196093086], \"passed\": false}, {\"check\": \"true anomaly from eccentric anomaly [5.9, 0.7]\", \"actual\": [4.753620334, 0.350765098], \"expected\": [5.418028431, 0.350765098], \"passed\": false}, {\"check\": \"true anomaly from eccentric anomaly [3.141592653589793, 0.5]\", \"actual\": [0.0, 1.5], \"expected\": [3.141592654, 1.5], \"passed\": false}, {\"check\": \"true anomaly from eccentric anomaly [0.0, 0.9]\", \"actual\": [0.0, 0.1], \"expected\": [0.0, 0.1], \"passed\": true}, {\"check\": \"true anomaly from eccentric anomaly [7.0, 0.2]\", \"actual\": [1.635883773, 0.849219549], \"expected\": [0.860249203, 0.849219549], \"passed\": false}], \"passed\": false}\n"}},"member_only":{"stages":["fixed"],"fields":["implementations.fixed","verification.fixed","harness","repair"],"note":"The verified repair, its recorded checks, the repair description, and the scoring harness are available to members."}}