{"abstract":"Eastings are 57 times too large.","category":"Map projection transforms","checks":8,"contract":"Input [lon, lat] in degrees. Longitude is first wrapped into the half-open range [-180, 180); latitude is clamped to +/-85.05112878. Return [x, y] metres on a sphere of radius 6378137 with y growing northward, each rounded to 3 decimals.","contract_signature":"x","evaluation_group":"w2-map-projection-transforms-web-mercator-forward","failed_approach":"The conversion divides by 360 instead of 180, halving every easting.","family":"w2-map-projection-transforms-web-mercator-forward-easting-angular-unit","id":"FA-69856","implementations":{"attempt":{"sha256":"b05c06b89c883674e58d37363d7d503b760c5f5b6fb97d75785b59a06e03a5d3","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    lon, lat = x\n    lon = ((lon + 180.0) % 360.0) - 180.0\n    lat = max(-85.05112878, min(85.05112878, lat))\n    R = 6378137.0\n    px = R * lon * math.pi / 360.0\n    py = R * math.log(math.tan(math.pi / 4 + math.radians(lat) / 2))\n    return [round(px, 3), round(py, 3)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression #0', [190.0, 10.0], [-18924313.435, 1118889.975]), ('regression #1', [-200.0, -20.0], [17811118.527, -2273030.927]), ('boundary #2', [180.0, 0.0], [-20037508.343, -0.0]), ('boundary #3', [-180.0, 45.0], [-20037508.343, 5621521.486]), ('regression #4', [545.0, 5.0], [-19480910.889, 557305.257]), ('boundary #5', [0.0, 89.0], [0.0, 20037508.343]), ('boundary #7', [0.0, 85.05112878], [0.0, 20037508.343]), ('control #8', [0.0, 0.0], [0.0, -0.0])], [('regression #1', [-200.0, -20.0], [17811118.527, -2273030.927]), ('boundary #2', [180.0, 0.0], [-20037508.343, -0.0]), ('boundary #5', [0.0, 89.0], [0.0, 20037508.343]), ('boundary #6', [10.0, -88.0], [1113194.908, -20037508.343]), ('boundary #7', [0.0, 85.05112878], [0.0, 20037508.343]), ('control #8', [0.0, 0.0], [0.0, -0.0]), ('regression #9', [-540.0, 30.0], [-20037508.343, 3503549.844]), ('regression #10', [-250.0, 12.5], [12245143.987, 1402665.19])], [('boundary #2', [180.0, 0.0], [-20037508.343, -0.0]), ('boundary #3', [-180.0, 45.0], [-20037508.343, 5621521.486]), ('boundary #5', [0.0, 89.0], [0.0, 20037508.343]), ('boundary #7', [0.0, 85.05112878], [0.0, 20037508.343]), ('control #8', [0.0, 0.0], [0.0, -0.0]), ('regression #9', [-540.0, 30.0], [-20037508.343, 3503549.844]), ('regression #10', [-250.0, 12.5], [12245143.987, 1402665.19]), ('regression #11', [-359.5, -40.0], [55659.745, -4865942.28])], [('boundary #3', [-180.0, 45.0], [-20037508.343, 5621521.486]), ('regression #4', [545.0, 5.0], [-19480910.889, 557305.257]), ('boundary #5', [0.0, 89.0], [0.0, 20037508.343]), ('boundary #7', [0.0, 85.05112878], [0.0, 20037508.343]), ('control #8', [0.0, 0.0], [0.0, -0.0]), ('regression #11', [-359.5, -40.0], [55659.745, -4865942.28]), ('boundary #12', [45.0, -86.5], [5009377.086, -20037508.343]), ('boundary #13', [-120.0, -87.25], [-13358338.895, -20037508.343])], [('regression #4', [545.0, 5.0], [-19480910.889, 557305.257]), ('boundary #5', [0.0, 89.0], [0.0, 20037508.343]), ('boundary #6', [10.0, -88.0], [1113194.908, -20037508.343]), ('boundary #7', [0.0, 85.05112878], [0.0, 20037508.343]), ('control #8', [0.0, 0.0], [0.0, -0.0]), ('regression #14', [-181.0, 0.5], [19926188.852, 55660.452]), ('control #15', [-17.048, 10.042], [-1897774.679, 1123637.827]), ('control #16', [151.867, -5.771], [16905757.108, -643513.79])]]\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":"7c60b4a3acb6ea77fba7e0d4a273bc383ff0fdf942bfe33d821099c0d7ce6128","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    lon, lat = x\n    lon = ((lon + 180.0) % 360.0) - 180.0\n    lat = max(-85.05112878, min(85.05112878, lat))\n    R = 6378137.0\n    px = R * lon\n    py = R * math.log(math.tan(math.pi / 4 + math.radians(lat) / 2))\n    return [round(px, 3), round(py, 3)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression #0', [190.0, 10.0], [-18924313.435, 1118889.975]), ('regression #1', [-200.0, -20.0], [17811118.527, -2273030.927]), ('boundary #2', [180.0, 0.0], [-20037508.343, -0.0]), ('boundary #3', [-180.0, 45.0], [-20037508.343, 5621521.486]), ('regression #4', [545.0, 5.0], [-19480910.889, 557305.257]), ('boundary #5', [0.0, 89.0], [0.0, 20037508.343]), ('boundary #7', [0.0, 85.05112878], [0.0, 20037508.343]), ('control #8', [0.0, 0.0], [0.0, -0.0])], [('regression #1', [-200.0, -20.0], [17811118.527, -2273030.927]), ('boundary #2', [180.0, 0.0], [-20037508.343, -0.0]), ('boundary #5', [0.0, 89.0], [0.0, 20037508.343]), ('boundary #6', [10.0, -88.0], [1113194.908, -20037508.343]), ('boundary #7', [0.0, 85.05112878], [0.0, 20037508.343]), ('control #8', [0.0, 0.0], [0.0, -0.0]), ('regression #9', [-540.0, 30.0], [-20037508.343, 3503549.844]), ('regression #10', [-250.0, 12.5], [12245143.987, 1402665.19])], [('boundary #2', [180.0, 0.0], [-20037508.343, -0.0]), ('boundary #3', [-180.0, 45.0], [-20037508.343, 5621521.486]), ('boundary #5', [0.0, 89.0], [0.0, 20037508.343]), ('boundary #7', [0.0, 85.05112878], [0.0, 20037508.343]), ('control #8', [0.0, 0.0], [0.0, -0.0]), ('regression #9', [-540.0, 30.0], [-20037508.343, 3503549.844]), ('regression #10', [-250.0, 12.5], [12245143.987, 1402665.19]), ('regression #11', [-359.5, -40.0], [55659.745, -4865942.28])], [('boundary #3', [-180.0, 45.0], [-20037508.343, 5621521.486]), ('regression #4', [545.0, 5.0], [-19480910.889, 557305.257]), ('boundary #5', [0.0, 89.0], [0.0, 20037508.343]), ('boundary #7', [0.0, 85.05112878], [0.0, 20037508.343]), ('control #8', [0.0, 0.0], [0.0, -0.0]), ('regression #11', [-359.5, -40.0], [55659.745, -4865942.28]), ('boundary #12', [45.0, -86.5], [5009377.086, -20037508.343]), ('boundary #13', [-120.0, -87.25], [-13358338.895, -20037508.343])], [('regression #4', [545.0, 5.0], [-19480910.889, 557305.257]), ('boundary #5', [0.0, 89.0], [0.0, 20037508.343]), ('boundary #6', [10.0, -88.0], [1113194.908, -20037508.343]), ('boundary #7', [0.0, 85.05112878], [0.0, 20037508.343]), ('control #8', [0.0, 0.0], [0.0, -0.0]), ('regression #14', [-181.0, 0.5], [19926188.852, 55660.452]), ('control #15', [-17.048, 10.042], [-1897774.679, 1123637.827]), ('control #16', [151.867, -5.771], [16905757.108, -643513.79])]]\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-web-mercator-forward-easting-angular-unit","generated_at":"2026-09-29T14:48:15.237472+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Web map tiles, vector tile encoders and map viewers all start from this forward transform; small mistakes shift features by kilometres or mirror them across the equator.","root_cause":"The easting multiplies the radius by longitude in degrees rather than radians.","sha256":"959b6f833febc0dd30bf1756165864f7d69c877e956e00c76b1deeb4f2bbc4c5","title":"Spherical web mercator forward projection: easting angular unit · 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":39.727,"exit_code":1,"observations":[{"actual":[-9462156.717,1118889.975],"check":"regression #0","expected":[-18924313.435,1118889.975],"passed":false},{"actual":[8905559.263,-2273030.927],"check":"regression #1","expected":[17811118.527,-2273030.927],"passed":false},{"actual":[-10018754.171,-0.0],"check":"boundary #2","expected":[-20037508.343,-0.0],"passed":false},{"actual":[-10018754.171,5621521.486],"check":"boundary #3","expected":[-20037508.343,5621521.486],"passed":false},{"actual":[-9740455.444,557305.257],"check":"regression #4","expected":[-19480910.889,557305.257],"passed":false},{"actual":[0.0,20037508.343],"check":"boundary #5","expected":[0.0,20037508.343],"passed":true},{"actual":[0.0,20037508.343],"check":"boundary #7","expected":[0.0,20037508.343],"passed":true},{"actual":[0.0,-0.0],"check":"control #8","expected":[0.0,-0.0],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression #0\", \"actual\": [-9462156.717, 1118889.975], \"expected\": [-18924313.435, 1118889.975], \"passed\": false}, {\"check\": \"regression #1\", \"actual\": [8905559.263, -2273030.927], \"expected\": [17811118.527, -2273030.927], \"passed\": false}, {\"check\": \"boundary #2\", \"actual\": [-10018754.171, -0.0], \"expected\": [-20037508.343, -0.0], \"passed\": false}, {\"check\": \"boundary #3\", \"actual\": [-10018754.171, 5621521.486], \"expected\": [-20037508.343, 5621521.486], \"passed\": false}, {\"check\": \"regression #4\", \"actual\": [-9740455.444, 557305.257], \"expected\": [-19480910.889, 557305.257], \"passed\": false}, {\"check\": \"boundary #5\", \"actual\": [0.0, 20037508.343], \"expected\": [0.0, 20037508.343], \"passed\": true}, {\"check\": \"boundary #7\", \"actual\": [0.0, 20037508.343], \"expected\": [0.0, 20037508.343], \"passed\": true}, {\"check\": \"control #8\", \"actual\": [0.0, -0.0], \"expected\": [0.0, -0.0], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":74.163,"exit_code":1,"observations":[{"actual":[-1084283290.0,1118889.975],"check":"regression #0","expected":[-18924313.435,1118889.975],"passed":false},{"actual":[1020501920.0,-2273030.927],"check":"regression #1","expected":[17811118.527,-2273030.927],"passed":false},{"actual":[-1148064660.0,-0.0],"check":"boundary #2","expected":[-20037508.343,-0.0],"passed":false},{"actual":[-1148064660.0,5621521.486],"check":"boundary #3","expected":[-20037508.343,5621521.486],"passed":false},{"actual":[-1116173975.0,557305.257],"check":"regression #4","expected":[-19480910.889,557305.257],"passed":false},{"actual":[0.0,20037508.343],"check":"boundary #5","expected":[0.0,20037508.343],"passed":true},{"actual":[0.0,20037508.343],"check":"boundary #7","expected":[0.0,20037508.343],"passed":true},{"actual":[0.0,-0.0],"check":"control #8","expected":[0.0,-0.0],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression #0\", \"actual\": [-1084283290.0, 1118889.975], \"expected\": [-18924313.435, 1118889.975], \"passed\": false}, {\"check\": \"regression #1\", \"actual\": [1020501920.0, -2273030.927], \"expected\": [17811118.527, -2273030.927], \"passed\": false}, {\"check\": \"boundary #2\", \"actual\": [-1148064660.0, -0.0], \"expected\": [-20037508.343, -0.0], \"passed\": false}, {\"check\": \"boundary #3\", \"actual\": [-1148064660.0, 5621521.486], \"expected\": [-20037508.343, 5621521.486], \"passed\": false}, {\"check\": \"regression #4\", \"actual\": [-1116173975.0, 557305.257], \"expected\": [-19480910.889, 557305.257], \"passed\": false}, {\"check\": \"boundary #5\", \"actual\": [0.0, 20037508.343], \"expected\": [0.0, 20037508.343], \"passed\": true}, {\"check\": \"boundary #7\", \"actual\": [0.0, 20037508.343], \"expected\": [0.0, 20037508.343], \"passed\": true}, {\"check\": \"control #8\", \"actual\": [0.0, -0.0], \"expected\": [0.0, -0.0], \"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."}}