FAILURE MAP
← Case archive

FA-71771 / Seismic magnitude estimation / Open access

Abe tsunami magnitude: far-field gauge limit · case 01

A tide gauge at exactly 100 km is ignored.

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

ROOT CAUSE

The far-field distance limit is exclusive.

THE FAILURE

The far-field distance limit is exclusive.

Unsuccessful approach: Raising the limit to 200 km discards valid gauges.

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(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 4', [[[1.0, 101], [2.6, 50], [0.4, 800], [0.1, 101], [0.4, 100]]], [7.28, 4]], ['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 13', [[[2.6, 50], [2.6, 100], [0.1, 99], [2.6, 800]]], [8.37, 2]], ['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 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 28', [[[8.0, 101], [1.0, 99]]], [8.41, 1]]], [['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 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]]]]
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
tide gauges 0None[7.91, 1]Failed
tide gauges 1[7.76, 2][7.76, 2]Passed
tide gauges 2None[6.5, 1]Failed
tide gauges 3None[6.5, 1]Failed
tide gauges 4[7.34, 3][7.28, 4]Failed
tide gauges 5[8.45, 2][8.45, 2]Passed
tide gauges 6[8.98, 1][8.98, 1]Passed
tide gauges 7[8.1, 3][8.1, 3]Passed

SHA-256 / 6dd6abd3063350c172b4ce9b625b126707cc97f6581d74824d8fc729ebb285f4

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 < 200 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(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 4', [[[1.0, 101], [2.6, 50], [0.4, 800], [0.1, 101], [0.4, 100]]], [7.28, 4]], ['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 13', [[[2.6, 50], [2.6, 100], [0.1, 99], [2.6, 800]]], [8.37, 2]], ['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 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 28', [[[8.0, 101], [1.0, 99]]], [8.41, 1]]], [['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 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]]]]
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
tide gauges 0None[7.91, 1]Failed
tide gauges 1None[7.76, 2]Failed
tide gauges 2None[6.5, 1]Failed
tide gauges 3None[6.5, 1]Failed
tide gauges 4[8.0, 1][7.28, 4]Failed
tide gauges 5[9.39, 1][8.45, 2]Failed
tide gauges 6[8.98, 1][8.98, 1]Passed
tide gauges 7[8.4, 1][8.1, 3]Failed

SHA-256 / 1f57eec2ff0c816b8e1844a66cd56ae7adbcf99d0b50c86f0b633f19c31c26bd

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

Case digest / 1a9325fd5bd7b9ed6f0fb48fa3c927eb081f6a9408e81d647a7a2453a514880a