FA-71786 / Seismic magnitude estimation / Open access
Abe tsunami magnitude: gauge averaging · case 01
Events recorded by near-field gauges have their Mt diluted.
ROOT CAUSE
The mean divides by all gauges, including rejected near-field ones.
THE FAILURE
The mean divides by all gauges, including rejected near-field ones.
Unsuccessful approach: Taking the maximum reports the single largest gauge.
Case contract
gauges are [crest-to-trough double amplitude m, distance km]. Only gauges with distance >= 100 km are used. H = double amplitude / 2; Mt_i = log10 H + log10 distance + 5.8. Return [mean rounded 0.01, gauges used] or None.
Why this case matters
Tsunami magnitude compares tsunami size with seismic magnitude to flag tsunami earthquakes.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(gauges):
vals = []
for dbl, dist in gauges:
if dist < 100 or dbl <= 0:
continue
h = dbl / 2.0
vals.append(math.log10(h) + math.log10(dist) + 5.8)
if not vals:
return None
return [round(sum(vals) / len(gauges), 2), len(vals)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['tide gauges 0', [[[2.6, 100], [1.0, 50], [0.4, 99], [0.1, 99]]], [7.91, 1]], ['tide gauges 1', [[[0.4, 101], [0.4, 99], [8.0, 101]]], [7.76, 2]], ['tide gauges 2', [[[0.1, 100]]], [6.5, 1]], ['tide gauges 3', [[[0.1, 100]]], [6.5, 1]], ['tide gauges 4', [[[1.0, 101], [2.6, 50], [0.4, 800], [0.1, 101], [0.4, 100]]], [7.28, 4]], ['tide gauges 5', [[[2.6, 3000], [1.0, 101]]], [8.45, 2]], ['tide gauges 6', [[[0.1, 50], [1.0, 3000], [1.0, 50], [2.6, 50]]], [8.98, 1]], ['tide gauges 7', [[[8.0, 101], [1.0, 101], [1.0, 800]]], [8.1, 3]]], [['tide gauges 6', [[[0.1, 50], [1.0, 3000], [1.0, 50], [2.6, 50]]], [8.98, 1]], ['tide gauges 7', [[[8.0, 101], [1.0, 101], [1.0, 800]]], [8.1, 3]], ['tide gauges 8', [[[0.1, 50], [1.0, 99], [1.0, 99], [1.0, 3000]]], [8.98, 1]], ['tide gauges 9', [[[1.0, 100], [1.0, 800], [0.4, 99], [8.0, 101], [2.6, 100]]], [8.06, 4]], ['tide gauges 10', [[[8.0, 800], [8.0, 800], [8.0, 101]]], [9.01, 3]], ['tide gauges 11', [[[2.6, 100], [8.0, 100]]], [8.16, 2]], ['tide gauges 12', [[[0.1, 800], [1.0, 50], [1.0, 101], [0.4, 800]]], [7.64, 3]], ['tide gauges 13', [[[2.6, 50], [2.6, 100], [0.1, 99], [2.6, 800]]], [8.37, 2]]], [['tide gauges 12', [[[0.1, 800], [1.0, 50], [1.0, 101], [0.4, 800]]], [7.64, 3]], ['tide gauges 14', [[[0.1, 101], [2.6, 101]]], [7.21, 2]], ['tide gauges 15', [[[0.4, 50], [2.6, 800], [2.6, 50]]], [8.82, 1]], ['tide gauges 16', [[[8.0, 3000], [8.0, 101], [1.0, 99], [8.0, 800]]], [9.2, 3]], ['tide gauges 17', [[[0.1, 99], [1.0, 800], [1.0, 100], [8.0, 101]]], [8.1, 3]], ['tide gauges 18', [[[1.0, 50]]], None], ['tide gauges 19', [[[0.1, 50]]], None], ['tide gauges 20', [[[2.6, 100], [2.6, 800], [0.1, 800], [0.4, 99]]], [8.04, 3]]], [['tide gauges 16', [[[8.0, 3000], [8.0, 101], [1.0, 99], [8.0, 800]]], [9.2, 3]], ['tide gauges 21', [[[1.0, 50], [8.0, 3000], [2.6, 101]]], [8.9, 2]], ['tide gauges 22', [[[2.6, 101]]], [7.92, 1]], ['tide gauges 23', [[[0.1, 50], [1.0, 800], [1.0, 50], [0.4, 100]]], [7.75, 2]], ['tide gauges 24', [[[2.6, 100], [0.1, 100], [1.0, 101], [8.0, 101], [1.0, 99]]], [7.58, 4]], ['tide gauges 25', [[[2.6, 101], [0.4, 800], [8.0, 100], [2.6, 99], [0.1, 101]]], [7.71, 4]], ['tide gauges 26', [[[8.0, 101], [0.1, 800], [2.6, 99], [0.1, 99]]], [7.9, 2]], ['tide gauges 27', [[[0.1, 100], [0.4, 800]]], [7.25, 2]]], [['tide gauges 21', [[[1.0, 50], [8.0, 3000], [2.6, 101]]], [8.9, 2]], ['tide gauges 28', [[[8.0, 101], [1.0, 99]]], [8.41, 1]], ['tide gauges 29', [[[0.4, 101], [0.1, 99], [2.6, 99], [0.1, 100], [0.1, 50]]], [6.8, 2]], ['tide gauges 30', [[[0.1, 99], [2.6, 3000], [0.1, 3000]]], [8.68, 2]], ['tide gauges 31', [[[2.6, 3000], [0.1, 3000], [8.0, 800]]], [8.89, 3]], ['tide gauges 32', [[[2.6, 800], [1.0, 99]]], [8.82, 1]], ['tide gauges 33', [[[1.0, 800]]], [8.4, 1]], ['gauge at 100 km', [[[1.0, 100]]], [7.5, 1]]]]
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 |
|---|---|---|---|
| tide gauges 0 | [1.98, 1] | [7.91, 1] | Failed |
| tide gauges 1 | [5.17, 2] | [7.76, 2] | Failed |
| tide gauges 2 | [6.5, 1] | [6.5, 1] | Passed |
| tide gauges 3 | [6.5, 1] | [6.5, 1] | Passed |
| tide gauges 4 | [5.82, 4] | [7.28, 4] | Failed |
| tide gauges 5 | [8.45, 2] | [8.45, 2] | Passed |
| tide gauges 6 | [2.24, 1] | [8.98, 1] | Failed |
| tide gauges 7 | [8.1, 3] | [8.1, 3] | Passed |
SHA-256 / 87a5799ace63759f87657381fcc86cab9c903276baf1ab130c59d6ea81b9e669
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(gauges):
vals = []
for dbl, dist in gauges:
if dist < 100 or dbl <= 0:
continue
h = dbl / 2.0
vals.append(math.log10(h) + math.log10(dist) + 5.8)
if not vals:
return None
return [round(max(vals), 2), len(vals)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['tide gauges 0', [[[2.6, 100], [1.0, 50], [0.4, 99], [0.1, 99]]], [7.91, 1]], ['tide gauges 1', [[[0.4, 101], [0.4, 99], [8.0, 101]]], [7.76, 2]], ['tide gauges 2', [[[0.1, 100]]], [6.5, 1]], ['tide gauges 3', [[[0.1, 100]]], [6.5, 1]], ['tide gauges 4', [[[1.0, 101], [2.6, 50], [0.4, 800], [0.1, 101], [0.4, 100]]], [7.28, 4]], ['tide gauges 5', [[[2.6, 3000], [1.0, 101]]], [8.45, 2]], ['tide gauges 6', [[[0.1, 50], [1.0, 3000], [1.0, 50], [2.6, 50]]], [8.98, 1]], ['tide gauges 7', [[[8.0, 101], [1.0, 101], [1.0, 800]]], [8.1, 3]]], [['tide gauges 6', [[[0.1, 50], [1.0, 3000], [1.0, 50], [2.6, 50]]], [8.98, 1]], ['tide gauges 7', [[[8.0, 101], [1.0, 101], [1.0, 800]]], [8.1, 3]], ['tide gauges 8', [[[0.1, 50], [1.0, 99], [1.0, 99], [1.0, 3000]]], [8.98, 1]], ['tide gauges 9', [[[1.0, 100], [1.0, 800], [0.4, 99], [8.0, 101], [2.6, 100]]], [8.06, 4]], ['tide gauges 10', [[[8.0, 800], [8.0, 800], [8.0, 101]]], [9.01, 3]], ['tide gauges 11', [[[2.6, 100], [8.0, 100]]], [8.16, 2]], ['tide gauges 12', [[[0.1, 800], [1.0, 50], [1.0, 101], [0.4, 800]]], [7.64, 3]], ['tide gauges 13', [[[2.6, 50], [2.6, 100], [0.1, 99], [2.6, 800]]], [8.37, 2]]], [['tide gauges 12', [[[0.1, 800], [1.0, 50], [1.0, 101], [0.4, 800]]], [7.64, 3]], ['tide gauges 14', [[[0.1, 101], [2.6, 101]]], [7.21, 2]], ['tide gauges 15', [[[0.4, 50], [2.6, 800], [2.6, 50]]], [8.82, 1]], ['tide gauges 16', [[[8.0, 3000], [8.0, 101], [1.0, 99], [8.0, 800]]], [9.2, 3]], ['tide gauges 17', [[[0.1, 99], [1.0, 800], [1.0, 100], [8.0, 101]]], [8.1, 3]], ['tide gauges 18', [[[1.0, 50]]], None], ['tide gauges 19', [[[0.1, 50]]], None], ['tide gauges 20', [[[2.6, 100], [2.6, 800], [0.1, 800], [0.4, 99]]], [8.04, 3]]], [['tide gauges 16', [[[8.0, 3000], [8.0, 101], [1.0, 99], [8.0, 800]]], [9.2, 3]], ['tide gauges 21', [[[1.0, 50], [8.0, 3000], [2.6, 101]]], [8.9, 2]], ['tide gauges 22', [[[2.6, 101]]], [7.92, 1]], ['tide gauges 23', [[[0.1, 50], [1.0, 800], [1.0, 50], [0.4, 100]]], [7.75, 2]], ['tide gauges 24', [[[2.6, 100], [0.1, 100], [1.0, 101], [8.0, 101], [1.0, 99]]], [7.58, 4]], ['tide gauges 25', [[[2.6, 101], [0.4, 800], [8.0, 100], [2.6, 99], [0.1, 101]]], [7.71, 4]], ['tide gauges 26', [[[8.0, 101], [0.1, 800], [2.6, 99], [0.1, 99]]], [7.9, 2]], ['tide gauges 27', [[[0.1, 100], [0.4, 800]]], [7.25, 2]]], [['tide gauges 21', [[[1.0, 50], [8.0, 3000], [2.6, 101]]], [8.9, 2]], ['tide gauges 28', [[[8.0, 101], [1.0, 99]]], [8.41, 1]], ['tide gauges 29', [[[0.4, 101], [0.1, 99], [2.6, 99], [0.1, 100], [0.1, 50]]], [6.8, 2]], ['tide gauges 30', [[[0.1, 99], [2.6, 3000], [0.1, 3000]]], [8.68, 2]], ['tide gauges 31', [[[2.6, 3000], [0.1, 3000], [8.0, 800]]], [8.89, 3]], ['tide gauges 32', [[[2.6, 800], [1.0, 99]]], [8.82, 1]], ['tide gauges 33', [[[1.0, 800]]], [8.4, 1]], ['gauge at 100 km', [[[1.0, 100]]], [7.5, 1]]]]
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 |
|---|---|---|---|
| tide gauges 0 | [7.91, 1] | [7.91, 1] | Passed |
| tide gauges 1 | [8.41, 2] | [7.76, 2] | Failed |
| tide gauges 2 | [6.5, 1] | [6.5, 1] | Passed |
| tide gauges 3 | [6.5, 1] | [6.5, 1] | Passed |
| tide gauges 4 | [8.0, 4] | [7.28, 4] | Failed |
| tide gauges 5 | [9.39, 2] | [8.45, 2] | Failed |
| tide gauges 6 | [8.98, 1] | [8.98, 1] | Passed |
| tide gauges 7 | [8.41, 3] | [8.1, 3] | Failed |
SHA-256 / 223ff27203a50fc4a5f78ddb53b9e463f424a2019022390cd8f22fd802292085
HELD IN THE MEMBER ARCHIVE
The verified repair and its recorded checks are member-only.
This mechanism has 8 recorded checks per implementation. The open-access tier publishes the failure and the unsuccessful fix; the repaired source that passes every check, and the observations that prove it, are available to members.
Every case sharing this mechanism uses the same contract and the same repair, so this one record is held back for all of them.
Member access is invitation-based. Sign in with your invited account to inspect the repair.
Sign in to the archive ↗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.786372+00:00.
Case digest / c8ce6d953434ab8530093a85c5fe6c1bcfb6e14b4ca1868d241d7b6ee8841f80