FAILURE MAP
← Case archive

FA-71796 / Seismic magnitude estimation / Open access

S-P nomogram local magnitude: distance proxy factor · case 01

Magnitudes are 2.7 units low.

Verified by executionVariant 1 · 8 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

The 8 km/s interval-to-distance factor is dropped.

VERIFIED REPAIR

Use 3 log10(8 dt).

Unsuccessful approach: Moving dt outside the logarithm grows linearly with the interval.

Case contract

Zero-to-peak amplitude in mm and P and S arrival times in s. dt = tS - tP must be positive and amplitude positive, else None. ML = log10 A + 3 log10(8 dt) - 2.92, rounded 0.01.

Why this case matters

Field seismologists read ML from the S-P interval and amplitude nomogram.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(amp_mm, t_p, t_s):
    dt = t_s - t_p
    if dt <= 0 or amp_mm <= 0:
        return None
    ml = math.log10(amp_mm) + 3 * math.log10(dt) - 2.92
    return round(ml, 2)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['A 0.001 mm P 10.0 S 12.5', [0.001, 10.0, 12.5], -2.02], ['A 0.001 mm P 3.2 S 8.7', [0.001, 3.2, 8.7], -0.99], ['A 0.001 mm P 100.0 S 160.0', [0.001, 100.0, 160.0], 2.12], ['A 0.001 mm P 5.0 S 5.0', [0.001, 5.0, 5.0], None], ['A 0.001 mm P 7.0 S 6.0', [0.001, 7.0, 6.0], None], ['A 0.001 mm P 0.0 S 1.0', [0.001, 0.0, 1.0], -3.21], ['A 0.5 mm P 10.0 S 12.5', [0.5, 10.0, 12.5], 0.68], ['A 0.5 mm P 3.2 S 8.7', [0.5, 3.2, 8.7], 1.71]], [['A 0.001 mm P 0.0 S 1.0', [0.001, 0.0, 1.0], -3.21], ['A 0.5 mm P 3.2 S 8.7', [0.5, 3.2, 8.7], 1.71], ['A 0.5 mm P 100.0 S 160.0', [0.5, 100.0, 160.0], 4.82], ['A 0.5 mm P 5.0 S 5.0', [0.5, 5.0, 5.0], None], ['A 0.5 mm P 7.0 S 6.0', [0.5, 7.0, 6.0], None], ['A 0.5 mm P 0.0 S 1.0', [0.5, 0.0, 1.0], -0.51], ['A 23.0 mm P 10.0 S 12.5', [23.0, 10.0, 12.5], 2.34], ['A 23.0 mm P 3.2 S 8.7', [23.0, 3.2, 8.7], 3.37]], [['A 0.001 mm P 10.0 S 12.5', [0.001, 10.0, 12.5], -2.02], ['A 0.001 mm P 100.0 S 160.0', [0.001, 100.0, 160.0], 2.12], ['A 0.5 mm P 100.0 S 160.0', [0.5, 100.0, 160.0], 4.82], ['A 23.0 mm P 100.0 S 160.0', [23.0, 100.0, 160.0], 6.49], ['A 23.0 mm P 5.0 S 5.0', [23.0, 5.0, 5.0], None], ['A 23.0 mm P 7.0 S 6.0', [23.0, 7.0, 6.0], None], ['A 23.0 mm P 0.0 S 1.0', [23.0, 0.0, 1.0], 1.15], ['zero amplitude', [0.0, 1.0, 3.0], None]], [['A 0.001 mm P 100.0 S 160.0', [0.001, 100.0, 160.0], 2.12], ['A 0.001 mm P 5.0 S 5.0', [0.001, 5.0, 5.0], None], ['A 0.001 mm P 7.0 S 6.0', [0.001, 7.0, 6.0], None], ['A 0.001 mm P 0.0 S 1.0', [0.001, 0.0, 1.0], -3.21], ['A 0.5 mm P 10.0 S 12.5', [0.5, 10.0, 12.5], 0.68], ['A 0.5 mm P 3.2 S 8.7', [0.5, 3.2, 8.7], 1.71], ['A 0.5 mm P 100.0 S 160.0', [0.5, 100.0, 160.0], 4.82], ['A 23.0 mm P 3.2 S 8.7', [23.0, 3.2, 8.7], 3.37]], [['A 0.001 mm P 10.0 S 12.5', [0.001, 10.0, 12.5], -2.02], ['A 0.5 mm P 10.0 S 12.5', [0.5, 10.0, 12.5], 0.68], ['A 0.5 mm P 5.0 S 5.0', [0.5, 5.0, 5.0], None], ['A 0.5 mm P 7.0 S 6.0', [0.5, 7.0, 6.0], None], ['A 0.5 mm P 0.0 S 1.0', [0.5, 0.0, 1.0], -0.51], ['A 23.0 mm P 10.0 S 12.5', [23.0, 10.0, 12.5], 2.34], ['A 23.0 mm P 3.2 S 8.7', [23.0, 3.2, 8.7], 3.37], ['A 23.0 mm P 100.0 S 160.0', [23.0, 100.0, 160.0], 6.49]]]
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 fixtureActualExpectedOutcome
A 0.001 mm P 10.0 S 12.5-4.73-2.02Failed
A 0.001 mm P 3.2 S 8.7-3.7-0.99Failed
A 0.001 mm P 100.0 S 160.0-0.592.12Failed
A 0.001 mm P 5.0 S 5.0NoneNonePassed
A 0.001 mm P 7.0 S 6.0NoneNonePassed
A 0.001 mm P 0.0 S 1.0-5.92-3.21Failed
A 0.5 mm P 10.0 S 12.5-2.030.68Failed
A 0.5 mm P 3.2 S 8.7-1.01.71Failed

SHA-256 / fb70005d5ea8d2b9e14493a94fb365cd9f59dd23a8bcde32e4231c6b518084f5

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(amp_mm, t_p, t_s):
    dt = t_s - t_p
    if dt <= 0 or amp_mm <= 0:
        return None
    ml = math.log10(amp_mm) + 3 * math.log10(8) * dt - 2.92
    return round(ml, 2)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['A 0.001 mm P 10.0 S 12.5', [0.001, 10.0, 12.5], -2.02], ['A 0.001 mm P 3.2 S 8.7', [0.001, 3.2, 8.7], -0.99], ['A 0.001 mm P 100.0 S 160.0', [0.001, 100.0, 160.0], 2.12], ['A 0.001 mm P 5.0 S 5.0', [0.001, 5.0, 5.0], None], ['A 0.001 mm P 7.0 S 6.0', [0.001, 7.0, 6.0], None], ['A 0.001 mm P 0.0 S 1.0', [0.001, 0.0, 1.0], -3.21], ['A 0.5 mm P 10.0 S 12.5', [0.5, 10.0, 12.5], 0.68], ['A 0.5 mm P 3.2 S 8.7', [0.5, 3.2, 8.7], 1.71]], [['A 0.001 mm P 0.0 S 1.0', [0.001, 0.0, 1.0], -3.21], ['A 0.5 mm P 3.2 S 8.7', [0.5, 3.2, 8.7], 1.71], ['A 0.5 mm P 100.0 S 160.0', [0.5, 100.0, 160.0], 4.82], ['A 0.5 mm P 5.0 S 5.0', [0.5, 5.0, 5.0], None], ['A 0.5 mm P 7.0 S 6.0', [0.5, 7.0, 6.0], None], ['A 0.5 mm P 0.0 S 1.0', [0.5, 0.0, 1.0], -0.51], ['A 23.0 mm P 10.0 S 12.5', [23.0, 10.0, 12.5], 2.34], ['A 23.0 mm P 3.2 S 8.7', [23.0, 3.2, 8.7], 3.37]], [['A 0.001 mm P 10.0 S 12.5', [0.001, 10.0, 12.5], -2.02], ['A 0.001 mm P 100.0 S 160.0', [0.001, 100.0, 160.0], 2.12], ['A 0.5 mm P 100.0 S 160.0', [0.5, 100.0, 160.0], 4.82], ['A 23.0 mm P 100.0 S 160.0', [23.0, 100.0, 160.0], 6.49], ['A 23.0 mm P 5.0 S 5.0', [23.0, 5.0, 5.0], None], ['A 23.0 mm P 7.0 S 6.0', [23.0, 7.0, 6.0], None], ['A 23.0 mm P 0.0 S 1.0', [23.0, 0.0, 1.0], 1.15], ['zero amplitude', [0.0, 1.0, 3.0], None]], [['A 0.001 mm P 100.0 S 160.0', [0.001, 100.0, 160.0], 2.12], ['A 0.001 mm P 5.0 S 5.0', [0.001, 5.0, 5.0], None], ['A 0.001 mm P 7.0 S 6.0', [0.001, 7.0, 6.0], None], ['A 0.001 mm P 0.0 S 1.0', [0.001, 0.0, 1.0], -3.21], ['A 0.5 mm P 10.0 S 12.5', [0.5, 10.0, 12.5], 0.68], ['A 0.5 mm P 3.2 S 8.7', [0.5, 3.2, 8.7], 1.71], ['A 0.5 mm P 100.0 S 160.0', [0.5, 100.0, 160.0], 4.82], ['A 23.0 mm P 3.2 S 8.7', [23.0, 3.2, 8.7], 3.37]], [['A 0.001 mm P 10.0 S 12.5', [0.001, 10.0, 12.5], -2.02], ['A 0.5 mm P 10.0 S 12.5', [0.5, 10.0, 12.5], 0.68], ['A 0.5 mm P 5.0 S 5.0', [0.5, 5.0, 5.0], None], ['A 0.5 mm P 7.0 S 6.0', [0.5, 7.0, 6.0], None], ['A 0.5 mm P 0.0 S 1.0', [0.5, 0.0, 1.0], -0.51], ['A 23.0 mm P 10.0 S 12.5', [23.0, 10.0, 12.5], 2.34], ['A 23.0 mm P 3.2 S 8.7', [23.0, 3.2, 8.7], 3.37], ['A 23.0 mm P 100.0 S 160.0', [23.0, 100.0, 160.0], 6.49]]]
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 fixtureActualExpectedOutcome
A 0.001 mm P 10.0 S 12.50.85-2.02Failed
A 0.001 mm P 3.2 S 8.78.98-0.99Failed
A 0.001 mm P 100.0 S 160.0156.642.12Failed
A 0.001 mm P 5.0 S 5.0NoneNonePassed
A 0.001 mm P 7.0 S 6.0NoneNonePassed
A 0.001 mm P 0.0 S 1.0-3.21-3.21Passed
A 0.5 mm P 10.0 S 12.53.550.68Failed
A 0.5 mm P 3.2 S 8.711.681.71Failed

SHA-256 / d6d1579f8531aadc3ee3f8a8b5cbe39dc05fe694fe9ff3663f9b2062f0dbf928

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(amp_mm, t_p, t_s):
    dt = t_s - t_p
    if dt <= 0 or amp_mm <= 0:
        return None
    ml = math.log10(amp_mm) + 3 * math.log10(8 * dt) - 2.92
    return round(ml, 2)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['A 0.001 mm P 10.0 S 12.5', [0.001, 10.0, 12.5], -2.02], ['A 0.001 mm P 3.2 S 8.7', [0.001, 3.2, 8.7], -0.99], ['A 0.001 mm P 100.0 S 160.0', [0.001, 100.0, 160.0], 2.12], ['A 0.001 mm P 5.0 S 5.0', [0.001, 5.0, 5.0], None], ['A 0.001 mm P 7.0 S 6.0', [0.001, 7.0, 6.0], None], ['A 0.001 mm P 0.0 S 1.0', [0.001, 0.0, 1.0], -3.21], ['A 0.5 mm P 10.0 S 12.5', [0.5, 10.0, 12.5], 0.68], ['A 0.5 mm P 3.2 S 8.7', [0.5, 3.2, 8.7], 1.71]], [['A 0.001 mm P 0.0 S 1.0', [0.001, 0.0, 1.0], -3.21], ['A 0.5 mm P 3.2 S 8.7', [0.5, 3.2, 8.7], 1.71], ['A 0.5 mm P 100.0 S 160.0', [0.5, 100.0, 160.0], 4.82], ['A 0.5 mm P 5.0 S 5.0', [0.5, 5.0, 5.0], None], ['A 0.5 mm P 7.0 S 6.0', [0.5, 7.0, 6.0], None], ['A 0.5 mm P 0.0 S 1.0', [0.5, 0.0, 1.0], -0.51], ['A 23.0 mm P 10.0 S 12.5', [23.0, 10.0, 12.5], 2.34], ['A 23.0 mm P 3.2 S 8.7', [23.0, 3.2, 8.7], 3.37]], [['A 0.001 mm P 10.0 S 12.5', [0.001, 10.0, 12.5], -2.02], ['A 0.001 mm P 100.0 S 160.0', [0.001, 100.0, 160.0], 2.12], ['A 0.5 mm P 100.0 S 160.0', [0.5, 100.0, 160.0], 4.82], ['A 23.0 mm P 100.0 S 160.0', [23.0, 100.0, 160.0], 6.49], ['A 23.0 mm P 5.0 S 5.0', [23.0, 5.0, 5.0], None], ['A 23.0 mm P 7.0 S 6.0', [23.0, 7.0, 6.0], None], ['A 23.0 mm P 0.0 S 1.0', [23.0, 0.0, 1.0], 1.15], ['zero amplitude', [0.0, 1.0, 3.0], None]], [['A 0.001 mm P 100.0 S 160.0', [0.001, 100.0, 160.0], 2.12], ['A 0.001 mm P 5.0 S 5.0', [0.001, 5.0, 5.0], None], ['A 0.001 mm P 7.0 S 6.0', [0.001, 7.0, 6.0], None], ['A 0.001 mm P 0.0 S 1.0', [0.001, 0.0, 1.0], -3.21], ['A 0.5 mm P 10.0 S 12.5', [0.5, 10.0, 12.5], 0.68], ['A 0.5 mm P 3.2 S 8.7', [0.5, 3.2, 8.7], 1.71], ['A 0.5 mm P 100.0 S 160.0', [0.5, 100.0, 160.0], 4.82], ['A 23.0 mm P 3.2 S 8.7', [23.0, 3.2, 8.7], 3.37]], [['A 0.001 mm P 10.0 S 12.5', [0.001, 10.0, 12.5], -2.02], ['A 0.5 mm P 10.0 S 12.5', [0.5, 10.0, 12.5], 0.68], ['A 0.5 mm P 5.0 S 5.0', [0.5, 5.0, 5.0], None], ['A 0.5 mm P 7.0 S 6.0', [0.5, 7.0, 6.0], None], ['A 0.5 mm P 0.0 S 1.0', [0.5, 0.0, 1.0], -0.51], ['A 23.0 mm P 10.0 S 12.5', [23.0, 10.0, 12.5], 2.34], ['A 23.0 mm P 3.2 S 8.7', [23.0, 3.2, 8.7], 3.37], ['A 23.0 mm P 100.0 S 160.0', [23.0, 100.0, 160.0], 6.49]]]
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 fixtureActualExpectedOutcome
A 0.001 mm P 10.0 S 12.5-2.02-2.02Passed
A 0.001 mm P 3.2 S 8.7-0.99-0.99Passed
A 0.001 mm P 100.0 S 160.02.122.12Passed
A 0.001 mm P 5.0 S 5.0NoneNonePassed
A 0.001 mm P 7.0 S 6.0NoneNonePassed
A 0.001 mm P 0.0 S 1.0-3.21-3.21Passed
A 0.5 mm P 10.0 S 12.50.680.68Passed
A 0.5 mm P 3.2 S 8.71.711.71Passed

SHA-256 / f2f665892474d13a755f015b1bca57b21bfe296f575a88ba423d645c2c46f82e

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.849641+00:00.

Case digest / 3cd6c5d3b039157fa3ac29ad30e0e6ef30fb0b9ffe8da87144764935f055c028