{"abstract":"Secant cones open the wrong way and produce mirrored, inflated output.","category":"Map projection transforms","checks":8,"contract":"Input [lon, lat, lon0, lat0, lat1, lat2] degrees, sphere R = 6371000, all latitudes strictly inside (-90, 90) and on the cone side of the equator. t(p) = tan(pi/4 + p/2). n = ln(cos p1/cos p2)/ln(t(p2)/t(p1)), or sin(p1) for a tangent cone (lat1 == lat2). F = cos(p1)*t(p1)**n/n; rho = R*F/t(phi)**n; rho0 = R*F/t(p0)**n; theta = n*dlon with dlon wrapped to [-180, 180). x = rho*sin(theta), y = rho0 - rho*cos(theta), rounded to 2 decimals.","contract_signature":"x","evaluation_group":"w2-map-projection-transforms-lambert-conformal-conic","failed_approach":"Taking the absolute value repairs northern secant cones but forces southern cones to a positive n.","family":"w2-map-projection-transforms-lambert-conformal-conic-secant-ratio-order","id":"FA-70101","implementations":{"attempt":{"sha256":"f0f1c6bf9cfa60199c96578f5554e5c6ec1eedcc1e13892adeb1b47d6a32ff1d","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    lon, lat, lon0, lat0, lat1, lat2 = x\n    R = 6371000.0\n    p0, p1, p2, phi = [math.radians(v) for v in (lat0, lat1, lat2, lat)]\n    def t(p):\n        return math.tan(math.pi / 4 + p / 2)\n    if abs(lat1 - lat2) < 1e-9:\n        n = math.sin(p1)\n    else:\n        n = math.log(math.cos(p1) / math.cos(p2)) / abs(math.log(t(p1) / t(p2)))\n    Fc = math.cos(p1) * t(p1) ** n / n\n    rho = R * Fc / t(phi) ** n\n    rho0 = R * Fc / t(p0) ** n\n    dl = math.radians(((lon - lon0 + 180.0) % 360.0) - 180.0)\n    theta = n * dl\n    return [round(rho * math.sin(theta), 2), round(rho0 - rho * math.cos(theta), 2)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('control #0', [-89.295, -2.579, -96.0, 23.0, 33.0, 45.0], [944572.37, -3177093.78]), ('control #1', [43.173, 23.809, 10.0, 52.0, 35.0, 65.0], [3477264.95, -2333351.52]), ('control #2', [133.802, -22.769, 132.0, 0.0, -18.0, -36.0], [182997.23, -2612489.01]), ('control #3', [-77.146, 4.744, -60.0, -32.0, -5.0, -42.0], [-2030234.59, 3881165.57]), ('control #4', [-6.229, 62.13, 0.0, 40.0, 40.0, 40.0], [-353408.33, 2543656.82]), ('control #5', [57.493, -17.538, 20.0, -45.0, -45.0, -45.0], [4256679.54, 2162268.41]), ('control #6', [108.376, 58.574, 100.0, 30.0, 25.0, 47.0], [519881.13, 3212621.55]), ('control #11', [-30.764, 26.528, 0.0, 40.0, 40.0, 40.0], [-3080105.21, -974518.51])], [('control #1', [43.173, 23.809, 10.0, 52.0, 35.0, 65.0], [3477264.95, -2333351.52]), ('control #3', [-77.146, 4.744, -60.0, -32.0, -5.0, -42.0], [-2030234.59, 3881165.57]), ('control #5', [57.493, -17.538, 20.0, -45.0, -45.0, -45.0], [4256679.54, 2162268.41]), ('control #6', [108.376, 58.574, 100.0, 30.0, 25.0, 47.0], [519881.13, 3212621.55]), ('control #7', [-134.048, 58.473, -96.0, 23.0, 33.0, 45.0], [-2281076.94, 4475835.48]), ('control #8', [38.766, 26.431, 10.0, 52.0, 35.0, 65.0], [2923972.77, -2242833.53]), ('control #11', [-30.764, 26.528, 0.0, 40.0, 40.0, 40.0], [-3080105.21, -974518.51]), ('control #12', [31.835, 4.636, 20.0, -45.0, -45.0, -45.0], [1831181.26, 6076923.26])], [('control #2', [133.802, -22.769, 132.0, 0.0, -18.0, -36.0], [182997.23, -2612489.01]), ('control #7', [-134.048, 58.473, -96.0, 23.0, 33.0, 45.0], [-2281076.94, 4475835.48]), ('control #8', [38.766, 26.431, 10.0, 52.0, 35.0, 65.0], [2923972.77, -2242833.53]), ('control #9', [128.089, -10.995, 132.0, 0.0, -18.0, -36.0], [-438054.92, -1302331.66]), ('control #10', [-72.231, -55.506, -60.0, -32.0, -5.0, -42.0], [-871966.44, -2710910.26]), ('control #11', [-30.764, 26.528, 0.0, 40.0, 40.0, 40.0], [-3080105.21, -974518.51]), ('control #12', [31.835, 4.636, 20.0, -45.0, -45.0, -45.0], [1831181.26, 6076923.26]), ('control #18', [28.411, 1.618, 0.0, 40.0, 40.0, 40.0], [3815361.61, -3969481.26])], [('control #3', [-77.146, 4.744, -60.0, -32.0, -5.0, -42.0], [-2030234.59, 3881165.57]), ('control #10', [-72.231, -55.506, -60.0, -32.0, -5.0, -42.0], [-871966.44, -2710910.26]), ('control #11', [-30.764, 26.528, 0.0, 40.0, 40.0, 40.0], [-3080105.21, -974518.51]), ('control #12', [31.835, 4.636, 20.0, -45.0, -45.0, -45.0], [1831181.26, 6076923.26]), ('control #13', [74.565, 35.028, 100.0, 30.0, 25.0, 47.0], [-2247809.44, 846928.26]), ('control #14', [-102.998, 17.408, -96.0, 23.0, 33.0, 45.0], [-788758.63, -620642.12]), ('control #16', [150.921, -43.877, 132.0, 0.0, -18.0, -36.0], [1562347.67, -5075599.0]), ('control #18', [28.411, 1.618, 0.0, 40.0, 40.0, 40.0], [3815361.61, -3969481.26])], [('control #6', [108.376, 58.574, 100.0, 30.0, 25.0, 47.0], [519881.13, 3212621.55]), ('control #13', [74.565, 35.028, 100.0, 30.0, 25.0, 47.0], [-2247809.44, 846928.26]), ('control #14', [-102.998, 17.408, -96.0, 23.0, 33.0, 45.0], [-788758.63, -620642.12]), ('control #15', [-3.245, 2.365, 10.0, 52.0, 35.0, 65.0], [-1927899.63, -5755732.58]), ('control #16', [150.921, -43.877, 132.0, 0.0, -18.0, -36.0], [1562347.67, -5075599.0]), ('control #18', [28.411, 1.618, 0.0, 40.0, 40.0, 40.0], [3815361.61, -3969481.26]), ('control #19', [0.654, -74.153, 20.0, -45.0, -45.0, -45.0], [-696797.89, -3508209.88]), ('control #25', [24.182, 45.341, 0.0, 40.0, 40.0, 40.0], [1875269.88, 850716.48])]]\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":"9520851c2a4be341a7d5ed139c9f44b6142cf7793ea9da3df421c80a895a94ec","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    lon, lat, lon0, lat0, lat1, lat2 = x\n    R = 6371000.0\n    p0, p1, p2, phi = [math.radians(v) for v in (lat0, lat1, lat2, lat)]\n    def t(p):\n        return math.tan(math.pi / 4 + p / 2)\n    if abs(lat1 - lat2) < 1e-9:\n        n = math.sin(p1)\n    else:\n        n = math.log(math.cos(p1) / math.cos(p2)) / math.log(t(p1) / t(p2))\n    Fc = math.cos(p1) * t(p1) ** n / n\n    rho = R * Fc / t(phi) ** n\n    rho0 = R * Fc / t(p0) ** n\n    dl = math.radians(((lon - lon0 + 180.0) % 360.0) - 180.0)\n    theta = n * dl\n    return [round(rho * math.sin(theta), 2), round(rho0 - rho * math.cos(theta), 2)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('control #0', [-89.295, -2.579, -96.0, 23.0, 33.0, 45.0], [944572.37, -3177093.78]), ('control #1', [43.173, 23.809, 10.0, 52.0, 35.0, 65.0], [3477264.95, -2333351.52]), ('control #2', [133.802, -22.769, 132.0, 0.0, -18.0, -36.0], [182997.23, -2612489.01]), ('control #3', [-77.146, 4.744, -60.0, -32.0, -5.0, -42.0], [-2030234.59, 3881165.57]), ('control #4', [-6.229, 62.13, 0.0, 40.0, 40.0, 40.0], [-353408.33, 2543656.82]), ('control #5', [57.493, -17.538, 20.0, -45.0, -45.0, -45.0], [4256679.54, 2162268.41]), ('control #6', [108.376, 58.574, 100.0, 30.0, 25.0, 47.0], [519881.13, 3212621.55]), ('control #11', [-30.764, 26.528, 0.0, 40.0, 40.0, 40.0], [-3080105.21, -974518.51])], [('control #1', [43.173, 23.809, 10.0, 52.0, 35.0, 65.0], [3477264.95, -2333351.52]), ('control #3', [-77.146, 4.744, -60.0, -32.0, -5.0, -42.0], [-2030234.59, 3881165.57]), ('control #5', [57.493, -17.538, 20.0, -45.0, -45.0, -45.0], [4256679.54, 2162268.41]), ('control #6', [108.376, 58.574, 100.0, 30.0, 25.0, 47.0], [519881.13, 3212621.55]), ('control #7', [-134.048, 58.473, -96.0, 23.0, 33.0, 45.0], [-2281076.94, 4475835.48]), ('control #8', [38.766, 26.431, 10.0, 52.0, 35.0, 65.0], [2923972.77, -2242833.53]), ('control #11', [-30.764, 26.528, 0.0, 40.0, 40.0, 40.0], [-3080105.21, -974518.51]), ('control #12', [31.835, 4.636, 20.0, -45.0, -45.0, -45.0], [1831181.26, 6076923.26])], [('control #2', [133.802, -22.769, 132.0, 0.0, -18.0, -36.0], [182997.23, -2612489.01]), ('control #7', [-134.048, 58.473, -96.0, 23.0, 33.0, 45.0], [-2281076.94, 4475835.48]), ('control #8', [38.766, 26.431, 10.0, 52.0, 35.0, 65.0], [2923972.77, -2242833.53]), ('control #9', [128.089, -10.995, 132.0, 0.0, -18.0, -36.0], [-438054.92, -1302331.66]), ('control #10', [-72.231, -55.506, -60.0, -32.0, -5.0, -42.0], [-871966.44, -2710910.26]), ('control #11', [-30.764, 26.528, 0.0, 40.0, 40.0, 40.0], [-3080105.21, -974518.51]), ('control #12', [31.835, 4.636, 20.0, -45.0, -45.0, -45.0], [1831181.26, 6076923.26]), ('control #18', [28.411, 1.618, 0.0, 40.0, 40.0, 40.0], [3815361.61, -3969481.26])], [('control #3', [-77.146, 4.744, -60.0, -32.0, -5.0, -42.0], [-2030234.59, 3881165.57]), ('control #10', [-72.231, -55.506, -60.0, -32.0, -5.0, -42.0], [-871966.44, -2710910.26]), ('control #11', [-30.764, 26.528, 0.0, 40.0, 40.0, 40.0], [-3080105.21, -974518.51]), ('control #12', [31.835, 4.636, 20.0, -45.0, -45.0, -45.0], [1831181.26, 6076923.26]), ('control #13', [74.565, 35.028, 100.0, 30.0, 25.0, 47.0], [-2247809.44, 846928.26]), ('control #14', [-102.998, 17.408, -96.0, 23.0, 33.0, 45.0], [-788758.63, -620642.12]), ('control #16', [150.921, -43.877, 132.0, 0.0, -18.0, -36.0], [1562347.67, -5075599.0]), ('control #18', [28.411, 1.618, 0.0, 40.0, 40.0, 40.0], [3815361.61, -3969481.26])], [('control #6', [108.376, 58.574, 100.0, 30.0, 25.0, 47.0], [519881.13, 3212621.55]), ('control #13', [74.565, 35.028, 100.0, 30.0, 25.0, 47.0], [-2247809.44, 846928.26]), ('control #14', [-102.998, 17.408, -96.0, 23.0, 33.0, 45.0], [-788758.63, -620642.12]), ('control #15', [-3.245, 2.365, 10.0, 52.0, 35.0, 65.0], [-1927899.63, -5755732.58]), ('control #16', [150.921, -43.877, 132.0, 0.0, -18.0, -36.0], [1562347.67, -5075599.0]), ('control #18', [28.411, 1.618, 0.0, 40.0, 40.0, 40.0], [3815361.61, -3969481.26]), ('control #19', [0.654, -74.153, 20.0, -45.0, -45.0, -45.0], [-696797.89, -3508209.88]), ('control #25', [24.182, 45.341, 0.0, 40.0, 40.0, 40.0], [1875269.88, 850716.48])]]\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 toy contract on a bounded input domain; results are rounded as stated and no conformance with any published standard or library is claimed. 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-map-projection-transforms-lambert-conformal-conic-secant-ratio-order","generated_at":"2026-09-29T14:48:17.582672+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Aeronautical charts and many national grids use conformal conics; a wrong cone constant distorts whole regions.","root_cause":"The denominator ratio of the cone constant is inverted, negating n.","sha256":"56d59ec2f9b04d638bcbd4f2725b0061061c1967b80108be617f5f4069e5a368","title":"Spherical Lambert conformal conic forward: secant ratio order · 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.312,"exit_code":1,"observations":[{"actual":[944572.37,-3177093.78],"check":"control #0","expected":[944572.37,-3177093.78],"passed":true},{"actual":[3477264.95,-2333351.52],"check":"control #1","expected":[3477264.95,-2333351.52],"passed":true},{"actual":[198434.83,-2349156.72],"check":"control #2","expected":[182997.23,-2612489.01],"passed":false},{"actual":[-1768071.12,4690788.93],"check":"control #3","expected":[-2030234.59,3881165.57],"passed":false},{"actual":[-353408.33,2543656.82],"check":"control #4","expected":[-353408.33,2543656.82],"passed":true},{"actual":[4256679.54,2162268.41],"check":"control #5","expected":[4256679.54,2162268.41],"passed":true},{"actual":[519881.13,3212621.55],"check":"control #6","expected":[519881.13,3212621.55],"passed":true},{"actual":[-3080105.21,-974518.51],"check":"control #11","expected":[-3080105.21,-974518.51],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control #0\", \"actual\": [944572.37, -3177093.78], \"expected\": [944572.37, -3177093.78], \"passed\": true}, {\"check\": \"control #1\", \"actual\": [3477264.95, -2333351.52], \"expected\": [3477264.95, -2333351.52], \"passed\": true}, {\"check\": \"control #2\", \"actual\": [198434.83, -2349156.72], \"expected\": [182997.23, -2612489.01], \"passed\": false}, {\"check\": \"control #3\", \"actual\": [-1768071.12, 4690788.93], \"expected\": [-2030234.59, 3881165.57], \"passed\": false}, {\"check\": \"control #4\", \"actual\": [-353408.33, 2543656.82], \"expected\": [-353408.33, 2543656.82], \"passed\": true}, {\"check\": \"control #5\", \"actual\": [4256679.54, 2162268.41], \"expected\": [4256679.54, 2162268.41], \"passed\": true}, {\"check\": \"control #6\", \"actual\": [519881.13, 3212621.55], \"expected\": [519881.13, 3212621.55], \"passed\": true}, {\"check\": \"control #11\", \"actual\": [-3080105.21, -974518.51], \"expected\": [-3080105.21, -974518.51], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.303,"exit_code":1,"observations":[{"actual":[413168.19,-1890168.26],"check":"control #0","expected":[944572.37,-3177093.78],"passed":false},{"actual":[2453938.75,-4179542.56],"check":"control #1","expected":[3477264.95,-2333351.52],"passed":false},{"actual":[198434.83,-2349156.72],"check":"control #2","expected":[182997.23,-2612489.01],"passed":false},{"actual":[-1768071.12,4690788.93],"check":"control #3","expected":[-2030234.59,3881165.57],"passed":false},{"actual":[-353408.33,2543656.82],"check":"control #4","expected":[-353408.33,2543656.82],"passed":true},{"actual":[4256679.54,2162268.41],"check":"control #5","expected":[4256679.54,2162268.41],"passed":true},{"actual":[1367124.51,5424191.38],"check":"control #6","expected":[519881.13,3212621.55],"passed":false},{"actual":[-3080105.21,-974518.51],"check":"control #11","expected":[-3080105.21,-974518.51],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"control #0\", \"actual\": [413168.19, -1890168.26], \"expected\": [944572.37, -3177093.78], \"passed\": false}, {\"check\": \"control #1\", \"actual\": [2453938.75, -4179542.56], \"expected\": [3477264.95, -2333351.52], \"passed\": false}, {\"check\": \"control #2\", \"actual\": [198434.83, -2349156.72], \"expected\": [182997.23, -2612489.01], \"passed\": false}, {\"check\": \"control #3\", \"actual\": [-1768071.12, 4690788.93], \"expected\": [-2030234.59, 3881165.57], \"passed\": false}, {\"check\": \"control #4\", \"actual\": [-353408.33, 2543656.82], \"expected\": [-353408.33, 2543656.82], \"passed\": true}, {\"check\": \"control #5\", \"actual\": [4256679.54, 2162268.41], \"expected\": [4256679.54, 2162268.41], \"passed\": true}, {\"check\": \"control #6\", \"actual\": [1367124.51, 5424191.38], \"expected\": [519881.13, 3212621.55], \"passed\": false}, {\"check\": \"control #11\", \"actual\": [-3080105.21, -974518.51], \"expected\": [-3080105.21, -974518.51], \"passed\": true}], \"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."}}