{"abstract":"Directions from different sensors average to meaningless values.","category":"Weather index computation","checks":8,"contract":"obs are [speed, direction_from_deg]. Components u=-s*sin(d), v=-s*cos(d); average them. Return [vector speed rounded 0.01, direction the wind blows FROM in [0,360) rounded 0.1 or None if the vector speed is below 1e-9, steadiness = vector speed / scalar mean speed rounded 0.001 (0.0 if calm)]; empty input returns None.","contract_signature":"obs","evaluation_group":"w2-weather_index_computation-wind-steadiness","failed_approach":"Using pi/360 halves every angle.","family":"w2-weather_index_computation-wind-steadiness-degree-to-radian-conversion","id":"FA-71251","implementations":{"attempt":{"sha256":"526eb39e706882874fe1c5c2093d5f731bcc674c8a61820046cba9bc8a210f41","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(obs):\n    if not obs:\n        return None\n    u = v = s = 0.0\n    for spd, d in obs:\n        r = d * math.pi / 360\n        u += -spd * math.sin(r)\n        v += -spd * math.cos(r)\n        s += spd\n    n = len(obs)\n    u /= n\n    v /= n\n    vs = math.hypot(u, v)\n    if vs < 1e-9:\n        direction = None\n    else:\n        direction = round(math.degrees(math.atan2(-u, -v)) % 360, 1)\n    steadiness = round(vs / (s / n), 3) if s > 0 else 0.0\n    return [round(vs, 2), direction, steadiness]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['mast 0', [[[2, 180], [2, 170], [5, 180]]], [2.99, 177.8, 0.997]], ['mast 1', [[[2, 170], [8, 210], [5, 210], [5, 190], [12, 140]]], [5.47, 178.5, 0.855]], ['mast 2', [[[0, 50], [5, 340], [2, 340]]], [2.33, 340.0, 1.0]], ['mast 3', [[[2, 10], [5, 60], [0, 10], [12, 10], [12, 320]]], [5.1, 357.9, 0.823]], ['mast 4', [[[2, 190], [2, 180], [0, 170]]], [1.33, 185.0, 0.996]], ['mast 5', [[[8, 90], [0, 90], [5, 50], [0, 100], [0, 50], [5, 50]]], [2.82, 67.7, 0.94]], ['mast 6', [[[0, 30], [12, 350], [12, 350], [12, 30], [0, 320], [0, 0]]], [5.68, 3.1, 0.947]], ['mast 7', [[[8, 120], [8, 120], [5, 90]]], [6.83, 113.0, 0.975]]], [['mast 3', [[[2, 10], [5, 60], [0, 10], [12, 10], [12, 320]]], [5.1, 357.9, 0.823]], ['mast 6', [[[0, 30], [12, 350], [12, 350], [12, 30], [0, 320], [0, 0]]], [5.68, 3.1, 0.947]], ['mast 7', [[[8, 120], [8, 120], [5, 90]]], [6.83, 113.0, 0.975]], ['mast 8', [[[2, 300], [12, 270], [12, 260], [8, 260], [2, 330]]], [6.89, 268.8, 0.957]], ['mast 9', [[[8, 320], [5, 30], [12, 320], [0, 60], [5, 350]]], [5.4, 335.5, 0.901]], ['mast 10', [[[5, 240], [2, 240], [8, 180], [0, 210], [5, 170]]], [3.45, 197.5, 0.861]], ['mast 11', [[[2, 35], [12, 45], [8, 75], [8, 105]]], [6.76, 68.0, 0.902]], ['mast 12', [[[12, 100], [5, 100], [0, 80]]], [5.67, 100.0, 1.0]]], [['mast 6', [[[0, 30], [12, 350], [12, 350], [12, 30], [0, 320], [0, 0]]], [5.68, 3.1, 0.947]], ['mast 11', [[[2, 35], [12, 45], [8, 75], [8, 105]]], [6.76, 68.0, 0.902]], ['mast 14', [[[12, 45], [8, 55], [8, 35], [8, 45], [12, 105], [8, 35]]], [8.41, 55.3, 0.901]], ['mast 15', [[[2, 60], [5, 320], [2, 0], [0, 0]]], [1.75, 347.8, 0.777]], ['mast 16', [[[8, 330], [12, 270], [12, 280]]], [9.75, 288.0, 0.914]], ['mast 17', [[[12, 30], [0, 350], [12, 0], [8, 0], [8, 60]]], [7.35, 20.6, 0.919]], ['mast 18', [[[2, 330], [2, 230], [2, 280], [8, 270]]], [3.13, 273.6, 0.895]], ['mast 19', [[[8, 5], [2, 45], [0, 105]]], [3.21, 12.7, 0.962]]], [['mast 9', [[[8, 320], [5, 30], [12, 320], [0, 60], [5, 350]]], [5.4, 335.5, 0.901]], ['mast 16', [[[8, 330], [12, 270], [12, 280]]], [9.75, 288.0, 0.914]], ['mast 21', [[[12, 170], [5, 180], [5, 240], [0, 190]]], [4.86, 186.6, 0.884]], ['mast 22', [[[0, 260], [8, 270], [5, 260], [12, 260]]], [6.23, 263.2, 0.997]], ['mast 23', [[[5, 180], [8, 240], [0, 190], [0, 140], [2, 180], [0, 240]]], [2.17, 212.2, 0.867]], ['mast 24', [[[12, 190], [12, 240], [0, 170]]], [7.25, 215.0, 0.906]], ['mast 25', [[[5, 210], [2, 190], [8, 210], [8, 210], [5, 240]]], [5.45, 213.8, 0.974]], ['mast 26', [[[8, 350], [8, 0], [5, 30], [0, 60], [8, 350]]], [5.62, 359.4, 0.969]]], [['mast 12', [[[12, 100], [5, 100], [0, 80]]], [5.67, 100.0, 1.0]], ['mast 21', [[[12, 170], [5, 180], [5, 240], [0, 190]]], [4.86, 186.6, 0.884]], ['mast 28', [[[12, 310], [12, 20], [2, 0], [8, 350], [5, 0], [12, 350]]], [7.75, 349.4, 0.911]], ['mast 29', [[[0, 340], [0, 20], [5, 350]]], [1.67, 350.0, 1.0]], ['north wrap', [[[5, 350], [5, 10]]], [4.92, 360.0, 0.985]], ['opposed winds', [[[5, 90], [5, 270]]], [0.0, None, 0.0]], ['calm', [[[0, 0], [0, 180]]], [0.0, None, 0.0]], ['empty', [[]], None]]]\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":"8bc18683ba1e830a8a5070a2752f7a71decd5d59e768917d2ee95787e5699197","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(obs):\n    if not obs:\n        return None\n    u = v = s = 0.0\n    for spd, d in obs:\n        r = d\n        u += -spd * math.sin(r)\n        v += -spd * math.cos(r)\n        s += spd\n    n = len(obs)\n    u /= n\n    v /= n\n    vs = math.hypot(u, v)\n    if vs < 1e-9:\n        direction = None\n    else:\n        direction = round(math.degrees(math.atan2(-u, -v)) % 360, 1)\n    steadiness = round(vs / (s / n), 3) if s > 0 else 0.0\n    return [round(vs, 2), direction, steadiness]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['mast 0', [[[2, 180], [2, 170], [5, 180]]], [2.99, 177.8, 0.997]], ['mast 1', [[[2, 170], [8, 210], [5, 210], [5, 190], [12, 140]]], [5.47, 178.5, 0.855]], ['mast 2', [[[0, 50], [5, 340], [2, 340]]], [2.33, 340.0, 1.0]], ['mast 3', [[[2, 10], [5, 60], [0, 10], [12, 10], [12, 320]]], [5.1, 357.9, 0.823]], ['mast 4', [[[2, 190], [2, 180], [0, 170]]], [1.33, 185.0, 0.996]], ['mast 5', [[[8, 90], [0, 90], [5, 50], [0, 100], [0, 50], [5, 50]]], [2.82, 67.7, 0.94]], ['mast 6', [[[0, 30], [12, 350], [12, 350], [12, 30], [0, 320], [0, 0]]], [5.68, 3.1, 0.947]], ['mast 7', [[[8, 120], [8, 120], [5, 90]]], [6.83, 113.0, 0.975]]], [['mast 3', [[[2, 10], [5, 60], [0, 10], [12, 10], [12, 320]]], [5.1, 357.9, 0.823]], ['mast 6', [[[0, 30], [12, 350], [12, 350], [12, 30], [0, 320], [0, 0]]], [5.68, 3.1, 0.947]], ['mast 7', [[[8, 120], [8, 120], [5, 90]]], [6.83, 113.0, 0.975]], ['mast 8', [[[2, 300], [12, 270], [12, 260], [8, 260], [2, 330]]], [6.89, 268.8, 0.957]], ['mast 9', [[[8, 320], [5, 30], [12, 320], [0, 60], [5, 350]]], [5.4, 335.5, 0.901]], ['mast 10', [[[5, 240], [2, 240], [8, 180], [0, 210], [5, 170]]], [3.45, 197.5, 0.861]], ['mast 11', [[[2, 35], [12, 45], [8, 75], [8, 105]]], [6.76, 68.0, 0.902]], ['mast 12', [[[12, 100], [5, 100], [0, 80]]], [5.67, 100.0, 1.0]]], [['mast 6', [[[0, 30], [12, 350], [12, 350], [12, 30], [0, 320], [0, 0]]], [5.68, 3.1, 0.947]], ['mast 11', [[[2, 35], [12, 45], [8, 75], [8, 105]]], [6.76, 68.0, 0.902]], ['mast 14', [[[12, 45], [8, 55], [8, 35], [8, 45], [12, 105], [8, 35]]], [8.41, 55.3, 0.901]], ['mast 15', [[[2, 60], [5, 320], [2, 0], [0, 0]]], [1.75, 347.8, 0.777]], ['mast 16', [[[8, 330], [12, 270], [12, 280]]], [9.75, 288.0, 0.914]], ['mast 17', [[[12, 30], [0, 350], [12, 0], [8, 0], [8, 60]]], [7.35, 20.6, 0.919]], ['mast 18', [[[2, 330], [2, 230], [2, 280], [8, 270]]], [3.13, 273.6, 0.895]], ['mast 19', [[[8, 5], [2, 45], [0, 105]]], [3.21, 12.7, 0.962]]], [['mast 9', [[[8, 320], [5, 30], [12, 320], [0, 60], [5, 350]]], [5.4, 335.5, 0.901]], ['mast 16', [[[8, 330], [12, 270], [12, 280]]], [9.75, 288.0, 0.914]], ['mast 21', [[[12, 170], [5, 180], [5, 240], [0, 190]]], [4.86, 186.6, 0.884]], ['mast 22', [[[0, 260], [8, 270], [5, 260], [12, 260]]], [6.23, 263.2, 0.997]], ['mast 23', [[[5, 180], [8, 240], [0, 190], [0, 140], [2, 180], [0, 240]]], [2.17, 212.2, 0.867]], ['mast 24', [[[12, 190], [12, 240], [0, 170]]], [7.25, 215.0, 0.906]], ['mast 25', [[[5, 210], [2, 190], [8, 210], [8, 210], [5, 240]]], [5.45, 213.8, 0.974]], ['mast 26', [[[8, 350], [8, 0], [5, 30], [0, 60], [8, 350]]], [5.62, 359.4, 0.969]]], [['mast 12', [[[12, 100], [5, 100], [0, 80]]], [5.67, 100.0, 1.0]], ['mast 21', [[[12, 170], [5, 180], [5, 240], [0, 190]]], [4.86, 186.6, 0.884]], ['mast 28', [[[12, 310], [12, 20], [2, 0], [8, 350], [5, 0], [12, 350]]], [7.75, 349.4, 0.911]], ['mast 29', [[[0, 340], [0, 20], [5, 350]]], [1.67, 350.0, 1.0]], ['north wrap', [[[5, 350], [5, 10]]], [4.92, 360.0, 0.985]], ['opposed winds', [[[5, 90], [5, 270]]], [0.0, None, 0.0]], ['calm', [[[0, 0], [0, 180]]], [0.0, None, 0.0]], ['empty', [[]], None]]]\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":"Stipulated deterministic teaching model of an operational weather index; coefficients and thresholds are fixed by the contract and no claim of standards conformance is made. 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-weather_index_computation-wind-steadiness-degree-to-radian-conversion","generated_at":"2026-09-29T14:48:28.001587+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Wind roses, dispersion inputs and runway selection need vector-mean wind direction.","root_cause":"Bearings in degrees are passed to sin and cos as radians.","sha256":"55463b2c6cd1349d443e915c2613f177bb46d01b6fddb1b24ade52777e6fc99d","title":"Vector-mean wind and steadiness: degree to radian conversion · 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":40.435,"exit_code":1,"observations":[{"actual":[3.0,88.9,0.999],"check":"mast 0","expected":[2.99,177.8,0.997],"passed":false},{"actual":[6.16,89.1,0.963],"check":"mast 1","expected":[5.47,178.5,0.855],"passed":false},{"actual":[2.33,170.0,1.0],"check":"mast 2","expected":[2.33,340.0,1.0],"passed":false},{"actual":[2.1,48.2,0.339],"check":"mast 3","expected":[5.1,357.9,0.823],"passed":false},{"actual":[1.33,92.5,0.999],"check":"mast 4","expected":[1.33,185.0,0.996],"passed":false},{"actual":[2.95,33.9,0.985],"check":"mast 5","expected":[2.82,67.7,0.94],"passed":false},{"actual":[2.23,157.1,0.371],"check":"mast 6","expected":[5.68,3.1,0.947],"passed":false},{"actual":[6.96,56.4,0.994],"check":"mast 7","expected":[6.83,113.0,0.975],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"mast 0\", \"actual\": [3.0, 88.9, 0.999], \"expected\": [2.99, 177.8, 0.997], \"passed\": false}, {\"check\": \"mast 1\", \"actual\": [6.16, 89.1, 0.963], \"expected\": [5.47, 178.5, 0.855], \"passed\": false}, {\"check\": \"mast 2\", \"actual\": [2.33, 170.0, 1.0], \"expected\": [2.33, 340.0, 1.0], \"passed\": false}, {\"check\": \"mast 3\", \"actual\": [2.1, 48.2, 0.339], \"expected\": [5.1, 357.9, 0.823], \"passed\": false}, {\"check\": \"mast 4\", \"actual\": [1.33, 92.5, 0.999], \"expected\": [1.33, 185.0, 0.996], \"passed\": false}, {\"check\": \"mast 5\", \"actual\": [2.95, 33.9, 0.985], \"expected\": [2.82, 67.7, 0.94], \"passed\": false}, {\"check\": \"mast 6\", \"actual\": [2.23, 157.1, 0.371], \"expected\": [5.68, 3.1, 0.947], \"passed\": false}, {\"check\": \"mast 7\", \"actual\": [6.96, 56.4, 0.994], \"expected\": [6.83, 113.0, 0.975], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.215,"exit_code":1,"observations":[{"actual":[1.81,244.8,0.604],"check":"mast 0","expected":[2.99,177.8,0.997],"passed":false},{"actual":[5.25,116.4,0.82],"check":"mast 1","expected":[5.47,178.5,0.855],"passed":false},{"actual":[2.33,40.6,1.0],"check":"mast 2","expected":[2.33,340.0,1.0],"passed":false},{"actual":[3.07,248.4,0.496],"check":"mast 3","expected":[5.1,357.9,0.823],"passed":false},{"actual":[0.38,159.7,0.284],"check":"mast 4","expected":[1.33,185.0,0.996],"passed":false},{"actual":[1.26,36.7,0.421],"check":"mast 5","expected":[2.82,67.7,0.94],"passed":false},{"actual":[5.87,261.9,0.978],"check":"mast 6","expected":[5.68,3.1,0.947],"passed":false},{"actual":[5.83,51.9,0.833],"check":"mast 7","expected":[6.83,113.0,0.975],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"mast 0\", \"actual\": [1.81, 244.8, 0.604], \"expected\": [2.99, 177.8, 0.997], \"passed\": false}, {\"check\": \"mast 1\", \"actual\": [5.25, 116.4, 0.82], \"expected\": [5.47, 178.5, 0.855], \"passed\": false}, {\"check\": \"mast 2\", \"actual\": [2.33, 40.6, 1.0], \"expected\": [2.33, 340.0, 1.0], \"passed\": false}, {\"check\": \"mast 3\", \"actual\": [3.07, 248.4, 0.496], \"expected\": [5.1, 357.9, 0.823], \"passed\": false}, {\"check\": \"mast 4\", \"actual\": [0.38, 159.7, 0.284], \"expected\": [1.33, 185.0, 0.996], \"passed\": false}, {\"check\": \"mast 5\", \"actual\": [1.26, 36.7, 0.421], \"expected\": [2.82, 67.7, 0.94], \"passed\": false}, {\"check\": \"mast 6\", \"actual\": [5.87, 261.9, 0.978], \"expected\": [5.68, 3.1, 0.947], \"passed\": false}, {\"check\": \"mast 7\", \"actual\": [5.83, 51.9, 0.833], \"expected\": [6.83, 113.0, 0.975], \"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."}}