FA-71721 / Seismic magnitude estimation / Open access
Regional conversion to Mw: Ms branch boundary · case 01
Ms 6.1 converts with the large-magnitude relation.
ROOT CAUSE
The small-Ms relation excludes 6.1.
VERIFIED REPAIR
Use 0.67 Ms + 2.07 through 6.1 inclusive.
Unsuccessful approach: Ending the small-Ms relation below 6.0 converts 6.0 with the large-magnitude relation.
Case contract
Case-sensitive type. ML: < 3.5 -> 0.8 ML + 0.6; 3.5..6.0 -> ML; > 6.0 None. mb: 3.5..6.2 -> 1.54 mb - 2.54, else None. Ms: <= 6.1 -> 0.67 Ms + 2.07; 6.1 < Ms <= 8.2 -> 0.99 Ms + 0.08; else None. Other types None. Round half up to 0.1 via floor(x*10 + 0.5)/10.
Why this case matters
Homogenised catalogues convert heterogeneous magnitudes to a common Mw.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(mtype, value):
if mtype == "ML":
if value > 6.0:
return None
x = 0.8 * value + 0.6 if value < 3.5 else value
elif mtype == "mb":
if not (3.5 <= value <= 6.2):
return None
x = 1.54 * value - 2.54
elif mtype == "Ms":
if value > 8.2:
return None
x = 0.67 * value + 2.07 if value < 6.1 else 0.99 * value + 0.08
else:
return None
return math.floor(x * 10 + 0.5) / 10
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['ML 2.0', ['ML', 2.0], 2.2], ['ML 3.4', ['ML', 3.4], 3.3], ['ML 3.5', ['ML', 3.5], 3.5], ['ML 4.8', ['ML', 4.8], 4.8], ['ML 6.0', ['ML', 6.0], 6.0], ['ML 6.1', ['ML', 6.1], None], ['ML 6.9', ['ML', 6.9], None], ['Ms 6.1', ['Ms', 6.1], 6.2]], [['mb 3.4', ['mb', 3.4], None], ['mb 3.5', ['mb', 3.5], 2.9], ['mb 5.0', ['mb', 5.0], 5.2], ['mb 6.2', ['mb', 6.2], 7.0], ['mb 6.3', ['mb', 6.3], None], ['Ms 4.0', ['Ms', 4.0], 4.8], ['Ms 6.0', ['Ms', 6.0], 6.1], ['Ms 6.1', ['Ms', 6.1], 6.2]], [['ML 2.0', ['ML', 2.0], 2.2], ['ML 3.4', ['ML', 3.4], 3.3], ['Ms 6.1', ['Ms', 6.1], 6.2], ['Ms 6.2', ['Ms', 6.2], 6.2], ['Ms 8.2', ['Ms', 8.2], 8.2], ['Ms 8.3', ['Ms', 8.3], None], ['Md 3.0', ['Md', 3.0], None], ['ml 4.0', ['ml', 4.0], None]], [['ML 3.4', ['ML', 3.4], 3.3], ['ML 3.5', ['ML', 3.5], 3.5], ['ML 4.8', ['ML', 4.8], 4.8], ['ML 6.0', ['ML', 6.0], 6.0], ['ML 6.1', ['ML', 6.1], None], ['ML 6.9', ['ML', 6.9], None], ['Ms 6.0', ['Ms', 6.0], 6.1], ['Ms 6.1', ['Ms', 6.1], 6.2]], [['mb 3.5', ['mb', 3.5], 2.9], ['mb 5.0', ['mb', 5.0], 5.2], ['mb 6.2', ['mb', 6.2], 7.0], ['mb 6.3', ['mb', 6.3], None], ['Ms 4.0', ['Ms', 4.0], 4.8], ['Ms 6.0', ['Ms', 6.0], 6.1], ['Ms 6.1', ['Ms', 6.1], 6.2], ['Ms 6.2', ['Ms', 6.2], 6.2]]]
for label, args, expected in fixtures[N - 1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| ML 2.0 | 2.2 | 2.2 | Passed |
| ML 3.4 | 3.3 | 3.3 | Passed |
| ML 3.5 | 3.5 | 3.5 | Passed |
| ML 4.8 | 4.8 | 4.8 | Passed |
| ML 6.0 | 6.0 | 6.0 | Passed |
| ML 6.1 | None | None | Passed |
| ML 6.9 | None | None | Passed |
| Ms 6.1 | 6.1 | 6.2 | Failed |
SHA-256 / 05be0cc4a2392ced4dc90fdf14d8ca2660723ac5ab62495d4a384064b0fea9b2
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(mtype, value):
if mtype == "ML":
if value > 6.0:
return None
x = 0.8 * value + 0.6 if value < 3.5 else value
elif mtype == "mb":
if not (3.5 <= value <= 6.2):
return None
x = 1.54 * value - 2.54
elif mtype == "Ms":
if value > 8.2:
return None
x = 0.67 * value + 2.07 if value < 6.0 else 0.99 * value + 0.08
else:
return None
return math.floor(x * 10 + 0.5) / 10
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['ML 2.0', ['ML', 2.0], 2.2], ['ML 3.4', ['ML', 3.4], 3.3], ['ML 3.5', ['ML', 3.5], 3.5], ['ML 4.8', ['ML', 4.8], 4.8], ['ML 6.0', ['ML', 6.0], 6.0], ['ML 6.1', ['ML', 6.1], None], ['ML 6.9', ['ML', 6.9], None], ['Ms 6.1', ['Ms', 6.1], 6.2]], [['mb 3.4', ['mb', 3.4], None], ['mb 3.5', ['mb', 3.5], 2.9], ['mb 5.0', ['mb', 5.0], 5.2], ['mb 6.2', ['mb', 6.2], 7.0], ['mb 6.3', ['mb', 6.3], None], ['Ms 4.0', ['Ms', 4.0], 4.8], ['Ms 6.0', ['Ms', 6.0], 6.1], ['Ms 6.1', ['Ms', 6.1], 6.2]], [['ML 2.0', ['ML', 2.0], 2.2], ['ML 3.4', ['ML', 3.4], 3.3], ['Ms 6.1', ['Ms', 6.1], 6.2], ['Ms 6.2', ['Ms', 6.2], 6.2], ['Ms 8.2', ['Ms', 8.2], 8.2], ['Ms 8.3', ['Ms', 8.3], None], ['Md 3.0', ['Md', 3.0], None], ['ml 4.0', ['ml', 4.0], None]], [['ML 3.4', ['ML', 3.4], 3.3], ['ML 3.5', ['ML', 3.5], 3.5], ['ML 4.8', ['ML', 4.8], 4.8], ['ML 6.0', ['ML', 6.0], 6.0], ['ML 6.1', ['ML', 6.1], None], ['ML 6.9', ['ML', 6.9], None], ['Ms 6.0', ['Ms', 6.0], 6.1], ['Ms 6.1', ['Ms', 6.1], 6.2]], [['mb 3.5', ['mb', 3.5], 2.9], ['mb 5.0', ['mb', 5.0], 5.2], ['mb 6.2', ['mb', 6.2], 7.0], ['mb 6.3', ['mb', 6.3], None], ['Ms 4.0', ['Ms', 4.0], 4.8], ['Ms 6.0', ['Ms', 6.0], 6.1], ['Ms 6.1', ['Ms', 6.1], 6.2], ['Ms 6.2', ['Ms', 6.2], 6.2]]]
for label, args, expected in fixtures[N - 1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| ML 2.0 | 2.2 | 2.2 | Passed |
| ML 3.4 | 3.3 | 3.3 | Passed |
| ML 3.5 | 3.5 | 3.5 | Passed |
| ML 4.8 | 4.8 | 4.8 | Passed |
| ML 6.0 | 6.0 | 6.0 | Passed |
| ML 6.1 | None | None | Passed |
| ML 6.9 | None | None | Passed |
| Ms 6.1 | 6.1 | 6.2 | Failed |
SHA-256 / 64b599ea07c4ed63c57cbcbe3827c69bfe38725c87694552e659a4c68849bee4
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(mtype, value):
if mtype == "ML":
if value > 6.0:
return None
x = 0.8 * value + 0.6 if value < 3.5 else value
elif mtype == "mb":
if not (3.5 <= value <= 6.2):
return None
x = 1.54 * value - 2.54
elif mtype == "Ms":
if value > 8.2:
return None
x = 0.67 * value + 2.07 if value <= 6.1 else 0.99 * value + 0.08
else:
return None
return math.floor(x * 10 + 0.5) / 10
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['ML 2.0', ['ML', 2.0], 2.2], ['ML 3.4', ['ML', 3.4], 3.3], ['ML 3.5', ['ML', 3.5], 3.5], ['ML 4.8', ['ML', 4.8], 4.8], ['ML 6.0', ['ML', 6.0], 6.0], ['ML 6.1', ['ML', 6.1], None], ['ML 6.9', ['ML', 6.9], None], ['Ms 6.1', ['Ms', 6.1], 6.2]], [['mb 3.4', ['mb', 3.4], None], ['mb 3.5', ['mb', 3.5], 2.9], ['mb 5.0', ['mb', 5.0], 5.2], ['mb 6.2', ['mb', 6.2], 7.0], ['mb 6.3', ['mb', 6.3], None], ['Ms 4.0', ['Ms', 4.0], 4.8], ['Ms 6.0', ['Ms', 6.0], 6.1], ['Ms 6.1', ['Ms', 6.1], 6.2]], [['ML 2.0', ['ML', 2.0], 2.2], ['ML 3.4', ['ML', 3.4], 3.3], ['Ms 6.1', ['Ms', 6.1], 6.2], ['Ms 6.2', ['Ms', 6.2], 6.2], ['Ms 8.2', ['Ms', 8.2], 8.2], ['Ms 8.3', ['Ms', 8.3], None], ['Md 3.0', ['Md', 3.0], None], ['ml 4.0', ['ml', 4.0], None]], [['ML 3.4', ['ML', 3.4], 3.3], ['ML 3.5', ['ML', 3.5], 3.5], ['ML 4.8', ['ML', 4.8], 4.8], ['ML 6.0', ['ML', 6.0], 6.0], ['ML 6.1', ['ML', 6.1], None], ['ML 6.9', ['ML', 6.9], None], ['Ms 6.0', ['Ms', 6.0], 6.1], ['Ms 6.1', ['Ms', 6.1], 6.2]], [['mb 3.5', ['mb', 3.5], 2.9], ['mb 5.0', ['mb', 5.0], 5.2], ['mb 6.2', ['mb', 6.2], 7.0], ['mb 6.3', ['mb', 6.3], None], ['Ms 4.0', ['Ms', 4.0], 4.8], ['Ms 6.0', ['Ms', 6.0], 6.1], ['Ms 6.1', ['Ms', 6.1], 6.2], ['Ms 6.2', ['Ms', 6.2], 6.2]]]
for label, args, expected in fixtures[N - 1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| ML 2.0 | 2.2 | 2.2 | Passed |
| ML 3.4 | 3.3 | 3.3 | Passed |
| ML 3.5 | 3.5 | 3.5 | Passed |
| ML 4.8 | 4.8 | 4.8 | Passed |
| ML 6.0 | 6.0 | 6.0 | Passed |
| ML 6.1 | None | None | Passed |
| ML 6.9 | None | None | Passed |
| Ms 6.1 | 6.2 | 6.2 | Passed |
SHA-256 / f1e424cbcbc515182a35797301dc7570f4c22e9027aa3067107fd8f9305166cf
Verification & scope
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.
Observations recorded using Python 3.12.14 at 2026-09-29T14:48:32.229561+00:00.
Case digest / 3e95da7e66166ca4bb5bf43cae3528735eccd0ac8f7cbebd584132137989cc6f