{"abstract":"All magnitudes are about 0.19 high and near-field events are biased.","category":"Seismic magnitude estimation","checks":8,"contract":"Input the Wood-Anderson peak-to-peak amplitude in nm, epicentral distance and depth in km. Non-positive amplitude returns None. A (mm, zero-to-peak) = p2p/2 * 1e-6; r = hypocentral distance; ML = log10(A) + 1.11 log10(r/100) + 0.00189 (r - 100) + 3.0, rounded to 0.01.","evaluation_group":"w2-seismic_magnitude_estimation-hutton-boore-ml","failed_approach":"Dividing the anelastic term by 100 removes most of the attenuation correction.","family":"w2-seismic_magnitude_estimation-hutton-boore-ml-anelastic-reference-distance","id":"FA-71356","implementations":{"attempt":{"sha256":"9f06359047bba1e6ad93c9f01d3b680e4414fa565d2cff5508d9d6da672ebc4a","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(amp_p2p_nm, epi_km, depth_km):\n    if amp_p2p_nm <= 0:\n        return None\n    a_mm = amp_p2p_nm / 2.0 * 1e-6\n    r = math.hypot(epi_km, depth_km)\n    ml = math.log10(a_mm) + 1.11 * math.log10(r / 100.0) + 0.00189 * (r - 100.0) / 100.0 + 3.0\n    return round(ml, 2)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['0 nm p2p at 0 km (depth 8)', [0, 0, 8], None], ['0 nm p2p at 12 km (depth 5)', [0, 12, 5], None], ['0 nm p2p at 40 km (depth 10)', [0, 40, 10], None], ['0 nm p2p at 100 km (depth 0)', [0, 100, 0], None], ['0 nm p2p at 100 km (depth 15)', [0, 100, 15], None], ['0 nm p2p at 250 km (depth 12)', [0, 250, 12], None], ['150 nm p2p at 0 km (depth 8)', [150, 0, 8], -2.52], ['150 nm p2p at 12 km (depth 5)', [150, 12, 5], -2.27]], [['150 nm p2p at 0 km (depth 8)', [150, 0, 8], -2.52], ['150 nm p2p at 12 km (depth 5)', [150, 12, 5], -2.27], ['150 nm p2p at 40 km (depth 10)', [150, 40, 10], -1.66], ['150 nm p2p at 100 km (depth 0)', [150, 100, 0], -1.12], ['150 nm p2p at 100 km (depth 15)', [150, 100, 15], -1.12], ['150 nm p2p at 250 km (depth 12)', [150, 250, 12], -0.4], ['150 nm p2p at 480 km (depth 30)', [150, 480, 30], 0.35], ['2000 nm p2p at 12 km (depth 5)', [2000, 12, 5], -1.15]], [['150 nm p2p at 480 km (depth 30)', [150, 480, 30], 0.35], ['2000 nm p2p at 0 km (depth 8)', [2000, 0, 8], -1.39], ['2000 nm p2p at 12 km (depth 5)', [2000, 12, 5], -1.15], ['2000 nm p2p at 40 km (depth 10)', [2000, 40, 10], -0.54], ['2000 nm p2p at 100 km (depth 0)', [2000, 100, 0], 0.0], ['2000 nm p2p at 100 km (depth 15)', [2000, 100, 15], 0.01], ['2000 nm p2p at 250 km (depth 12)', [2000, 250, 12], 0.73], ['48000 nm p2p at 12 km (depth 5)', [48000, 12, 5], 0.23]], [['2000 nm p2p at 40 km (depth 10)', [2000, 40, 10], -0.54], ['48000 nm p2p at 0 km (depth 8)', [48000, 0, 8], -0.01], ['48000 nm p2p at 12 km (depth 5)', [48000, 12, 5], 0.23], ['48000 nm p2p at 40 km (depth 10)', [48000, 40, 10], 0.84], ['48000 nm p2p at 100 km (depth 0)', [48000, 100, 0], 1.38], ['48000 nm p2p at 100 km (depth 15)', [48000, 100, 15], 1.39], ['48000 nm p2p at 250 km (depth 12)', [48000, 250, 12], 2.11], ['900000 nm p2p at 12 km (depth 5)', [900000, 12, 5], 1.51]], [['150 nm p2p at 12 km (depth 5)', [150, 12, 5], -2.27], ['2000 nm p2p at 250 km (depth 12)', [2000, 250, 12], 0.73], ['900000 nm p2p at 0 km (depth 8)', [900000, 0, 8], 1.26], ['900000 nm p2p at 12 km (depth 5)', [900000, 12, 5], 1.51], ['900000 nm p2p at 40 km (depth 10)', [900000, 40, 10], 2.12], ['900000 nm p2p at 100 km (depth 0)', [900000, 100, 0], 2.65], ['900000 nm p2p at 100 km (depth 15)', [900000, 100, 15], 2.66], ['900000 nm p2p at 250 km (depth 12)', [900000, 250, 12], 3.38]]]\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":"6cd36d6728467ad7cac027943fb26688b6877c76d780382d3cd83937f5ee2171","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(amp_p2p_nm, epi_km, depth_km):\n    if amp_p2p_nm <= 0:\n        return None\n    a_mm = amp_p2p_nm / 2.0 * 1e-6\n    r = math.hypot(epi_km, depth_km)\n    ml = math.log10(a_mm) + 1.11 * math.log10(r / 100.0) + 0.00189 * r + 3.0\n    return round(ml, 2)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['0 nm p2p at 0 km (depth 8)', [0, 0, 8], None], ['0 nm p2p at 12 km (depth 5)', [0, 12, 5], None], ['0 nm p2p at 40 km (depth 10)', [0, 40, 10], None], ['0 nm p2p at 100 km (depth 0)', [0, 100, 0], None], ['0 nm p2p at 100 km (depth 15)', [0, 100, 15], None], ['0 nm p2p at 250 km (depth 12)', [0, 250, 12], None], ['150 nm p2p at 0 km (depth 8)', [150, 0, 8], -2.52], ['150 nm p2p at 12 km (depth 5)', [150, 12, 5], -2.27]], [['150 nm p2p at 0 km (depth 8)', [150, 0, 8], -2.52], ['150 nm p2p at 12 km (depth 5)', [150, 12, 5], -2.27], ['150 nm p2p at 40 km (depth 10)', [150, 40, 10], -1.66], ['150 nm p2p at 100 km (depth 0)', [150, 100, 0], -1.12], ['150 nm p2p at 100 km (depth 15)', [150, 100, 15], -1.12], ['150 nm p2p at 250 km (depth 12)', [150, 250, 12], -0.4], ['150 nm p2p at 480 km (depth 30)', [150, 480, 30], 0.35], ['2000 nm p2p at 12 km (depth 5)', [2000, 12, 5], -1.15]], [['150 nm p2p at 480 km (depth 30)', [150, 480, 30], 0.35], ['2000 nm p2p at 0 km (depth 8)', [2000, 0, 8], -1.39], ['2000 nm p2p at 12 km (depth 5)', [2000, 12, 5], -1.15], ['2000 nm p2p at 40 km (depth 10)', [2000, 40, 10], -0.54], ['2000 nm p2p at 100 km (depth 0)', [2000, 100, 0], 0.0], ['2000 nm p2p at 100 km (depth 15)', [2000, 100, 15], 0.01], ['2000 nm p2p at 250 km (depth 12)', [2000, 250, 12], 0.73], ['48000 nm p2p at 12 km (depth 5)', [48000, 12, 5], 0.23]], [['2000 nm p2p at 40 km (depth 10)', [2000, 40, 10], -0.54], ['48000 nm p2p at 0 km (depth 8)', [48000, 0, 8], -0.01], ['48000 nm p2p at 12 km (depth 5)', [48000, 12, 5], 0.23], ['48000 nm p2p at 40 km (depth 10)', [48000, 40, 10], 0.84], ['48000 nm p2p at 100 km (depth 0)', [48000, 100, 0], 1.38], ['48000 nm p2p at 100 km (depth 15)', [48000, 100, 15], 1.39], ['48000 nm p2p at 250 km (depth 12)', [48000, 250, 12], 2.11], ['900000 nm p2p at 12 km (depth 5)', [900000, 12, 5], 1.51]], [['150 nm p2p at 12 km (depth 5)', [150, 12, 5], -2.27], ['2000 nm p2p at 250 km (depth 12)', [2000, 250, 12], 0.73], ['900000 nm p2p at 0 km (depth 8)', [900000, 0, 8], 1.26], ['900000 nm p2p at 12 km (depth 5)', [900000, 12, 5], 1.51], ['900000 nm p2p at 40 km (depth 10)', [900000, 40, 10], 2.12], ['900000 nm p2p at 100 km (depth 0)', [900000, 100, 0], 2.65], ['900000 nm p2p at 100 km (depth 15)', [900000, 100, 15], 2.66], ['900000 nm p2p at 250 km (depth 12)', [900000, 250, 12], 3.38]]]\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"},"fixed":{"sha256":"79e2bcfa7f803b965213c5031f879a41f4cc775cd4cca23494d80aee7dc0e6e8","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(amp_p2p_nm, epi_km, depth_km):\n    if amp_p2p_nm <= 0:\n        return None\n    a_mm = amp_p2p_nm / 2.0 * 1e-6\n    r = math.hypot(epi_km, depth_km)\n    ml = math.log10(a_mm) + 1.11 * math.log10(r / 100.0) + 0.00189 * (r - 100.0) + 3.0\n    return round(ml, 2)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['0 nm p2p at 0 km (depth 8)', [0, 0, 8], None], ['0 nm p2p at 12 km (depth 5)', [0, 12, 5], None], ['0 nm p2p at 40 km (depth 10)', [0, 40, 10], None], ['0 nm p2p at 100 km (depth 0)', [0, 100, 0], None], ['0 nm p2p at 100 km (depth 15)', [0, 100, 15], None], ['0 nm p2p at 250 km (depth 12)', [0, 250, 12], None], ['150 nm p2p at 0 km (depth 8)', [150, 0, 8], -2.52], ['150 nm p2p at 12 km (depth 5)', [150, 12, 5], -2.27]], [['150 nm p2p at 0 km (depth 8)', [150, 0, 8], -2.52], ['150 nm p2p at 12 km (depth 5)', [150, 12, 5], -2.27], ['150 nm p2p at 40 km (depth 10)', [150, 40, 10], -1.66], ['150 nm p2p at 100 km (depth 0)', [150, 100, 0], -1.12], ['150 nm p2p at 100 km (depth 15)', [150, 100, 15], -1.12], ['150 nm p2p at 250 km (depth 12)', [150, 250, 12], -0.4], ['150 nm p2p at 480 km (depth 30)', [150, 480, 30], 0.35], ['2000 nm p2p at 12 km (depth 5)', [2000, 12, 5], -1.15]], [['150 nm p2p at 480 km (depth 30)', [150, 480, 30], 0.35], ['2000 nm p2p at 0 km (depth 8)', [2000, 0, 8], -1.39], ['2000 nm p2p at 12 km (depth 5)', [2000, 12, 5], -1.15], ['2000 nm p2p at 40 km (depth 10)', [2000, 40, 10], -0.54], ['2000 nm p2p at 100 km (depth 0)', [2000, 100, 0], 0.0], ['2000 nm p2p at 100 km (depth 15)', [2000, 100, 15], 0.01], ['2000 nm p2p at 250 km (depth 12)', [2000, 250, 12], 0.73], ['48000 nm p2p at 12 km (depth 5)', [48000, 12, 5], 0.23]], [['2000 nm p2p at 40 km (depth 10)', [2000, 40, 10], -0.54], ['48000 nm p2p at 0 km (depth 8)', [48000, 0, 8], -0.01], ['48000 nm p2p at 12 km (depth 5)', [48000, 12, 5], 0.23], ['48000 nm p2p at 40 km (depth 10)', [48000, 40, 10], 0.84], ['48000 nm p2p at 100 km (depth 0)', [48000, 100, 0], 1.38], ['48000 nm p2p at 100 km (depth 15)', [48000, 100, 15], 1.39], ['48000 nm p2p at 250 km (depth 12)', [48000, 250, 12], 2.11], ['900000 nm p2p at 12 km (depth 5)', [900000, 12, 5], 1.51]], [['150 nm p2p at 12 km (depth 5)', [150, 12, 5], -2.27], ['2000 nm p2p at 250 km (depth 12)', [2000, 250, 12], 0.73], ['900000 nm p2p at 0 km (depth 8)', [900000, 0, 8], 1.26], ['900000 nm p2p at 12 km (depth 5)', [900000, 12, 5], 1.51], ['900000 nm p2p at 40 km (depth 10)', [900000, 40, 10], 2.12], ['900000 nm p2p at 100 km (depth 0)', [900000, 100, 0], 2.65], ['900000 nm p2p at 100 km (depth 15)', [900000, 100, 15], 2.66], ['900000 nm p2p at 250 km (depth 12)', [900000, 250, 12], 3.38]]]\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 a seismological magnitude procedure; constants and tables are fixed by the contract and no claim of agency or 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-seismic_magnitude_estimation-hutton-boore-ml-anelastic-reference-distance","generated_at":"2026-09-29T14:48:28.936880+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Regional networks publish ML for most small and moderate earthquakes.","repair":"Use 0.00189*(r - 100).","root_cause":"The anelastic term is not referenced to the 100 km anchor distance.","sha256":"c1da5fe699dcab6a04590c3095c16924b54d104b32e23ae91e81fe5fc09dc00c","title":"Hutton-Boore local magnitude: anelastic reference distance · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":36.598,"exit_code":1,"observations":[{"actual":null,"check":"0 nm p2p at 0 km (depth 8)","expected":null,"passed":true},{"actual":null,"check":"0 nm p2p at 12 km (depth 5)","expected":null,"passed":true},{"actual":null,"check":"0 nm p2p at 40 km (depth 10)","expected":null,"passed":true},{"actual":null,"check":"0 nm p2p at 100 km (depth 0)","expected":null,"passed":true},{"actual":null,"check":"0 nm p2p at 100 km (depth 15)","expected":null,"passed":true},{"actual":null,"check":"0 nm p2p at 250 km (depth 12)","expected":null,"passed":true},{"actual":-2.34,"check":"150 nm p2p at 0 km (depth 8)","expected":-2.52,"passed":false},{"actual":-2.11,"check":"150 nm p2p at 12 km (depth 5)","expected":-2.27,"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"0 nm p2p at 0 km (depth 8)\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"0 nm p2p at 12 km (depth 5)\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"0 nm p2p at 40 km (depth 10)\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"0 nm p2p at 100 km (depth 0)\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"0 nm p2p at 100 km (depth 15)\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"0 nm p2p at 250 km (depth 12)\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"150 nm p2p at 0 km (depth 8)\", \"actual\": -2.34, \"expected\": -2.52, \"passed\": false}, {\"check\": \"150 nm p2p at 12 km (depth 5)\", \"actual\": -2.11, \"expected\": -2.27, \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":37.513,"exit_code":1,"observations":[{"actual":null,"check":"0 nm p2p at 0 km (depth 8)","expected":null,"passed":true},{"actual":null,"check":"0 nm p2p at 12 km (depth 5)","expected":null,"passed":true},{"actual":null,"check":"0 nm p2p at 40 km (depth 10)","expected":null,"passed":true},{"actual":null,"check":"0 nm p2p at 100 km (depth 0)","expected":null,"passed":true},{"actual":null,"check":"0 nm p2p at 100 km (depth 15)","expected":null,"passed":true},{"actual":null,"check":"0 nm p2p at 250 km (depth 12)","expected":null,"passed":true},{"actual":-2.33,"check":"150 nm p2p at 0 km (depth 8)","expected":-2.52,"passed":false},{"actual":-2.08,"check":"150 nm p2p at 12 km (depth 5)","expected":-2.27,"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"0 nm p2p at 0 km (depth 8)\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"0 nm p2p at 12 km (depth 5)\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"0 nm p2p at 40 km (depth 10)\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"0 nm p2p at 100 km (depth 0)\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"0 nm p2p at 100 km (depth 15)\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"0 nm p2p at 250 km (depth 12)\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"150 nm p2p at 0 km (depth 8)\", \"actual\": -2.33, \"expected\": -2.52, \"passed\": false}, {\"check\": \"150 nm p2p at 12 km (depth 5)\", \"actual\": -2.08, \"expected\": -2.27, \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":37.508,"exit_code":0,"observations":[{"actual":null,"check":"0 nm p2p at 0 km (depth 8)","expected":null,"passed":true},{"actual":null,"check":"0 nm p2p at 12 km (depth 5)","expected":null,"passed":true},{"actual":null,"check":"0 nm p2p at 40 km (depth 10)","expected":null,"passed":true},{"actual":null,"check":"0 nm p2p at 100 km (depth 0)","expected":null,"passed":true},{"actual":null,"check":"0 nm p2p at 100 km (depth 15)","expected":null,"passed":true},{"actual":null,"check":"0 nm p2p at 250 km (depth 12)","expected":null,"passed":true},{"actual":-2.52,"check":"150 nm p2p at 0 km (depth 8)","expected":-2.52,"passed":true},{"actual":-2.27,"check":"150 nm p2p at 12 km (depth 5)","expected":-2.27,"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"0 nm p2p at 0 km (depth 8)\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"0 nm p2p at 12 km (depth 5)\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"0 nm p2p at 40 km (depth 10)\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"0 nm p2p at 100 km (depth 0)\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"0 nm p2p at 100 km (depth 15)\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"0 nm p2p at 250 km (depth 12)\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"150 nm p2p at 0 km (depth 8)\", \"actual\": -2.52, \"expected\": -2.52, \"passed\": true}, {\"check\": \"150 nm p2p at 12 km (depth 5)\", \"actual\": -2.27, \"expected\": -2.27, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}