FAILURE MAP
← Case archive

FA-69096 / Tide and marine navigation tables / Open access

Vertical datum conversion: Datum offsets are subtracted in reverse order · case 01

Every conversion moves values the wrong way by the offset difference.

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

ROOT CAUSE

The shift is computed as off[to]-off[frm].

VERIFIED REPAIR

Use off[frm]-off[to].

Unsuccessful approach: Taking the absolute difference is right in only one direction.

Case contract

Input [kind, value, frm, to, table]: table lists [datum, offset above chart datum]; CD itself has offset 0 even if absent. Heights and drying heights are measured upward from their datum; depths downward. Converting frm->to: height=value+off[frm]-off[to], depth=value-off[frm]+off[to]. Unknown datum names return None. Result rounded to 3 decimals.

Why this case matters

Tide tables and passage plans turn published predictions into go/no-go decisions about depth, clearance and timing.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
    kind,val,frm,to,table=x
    off=dict(table)
    off.setdefault('CD',0.0)
    if frm not in off or to not in off: return None
    shift=off[to]-off[frm]
    if kind=='depth': res=val-shift
    else: res=val+shift
    return round(res,3)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('vertical datum conversion ["height", 3.1, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 3.1, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 0.7), ('vertical datum conversion ["depth", 12.0, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 12.0, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 14.4), ('vertical datum conversion ["depth", 7.5, "MSL", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 7.5, 'MSL', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.1), ('vertical datum conversion ["height", 1.2, "MHWS", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 1.2, 'MHWS', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8), ('vertical datum conversion ["drying", 1.4, "CD", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['drying', 1.4, 'CD', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 1.7), ('vertical datum conversion ["drying", 0.8, "MLWS", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['drying', 0.8, 'MLWS', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], -1.1), ('vertical datum conversion ["depth", 5.0, "LAT", "MLWS", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 5.0, 'LAT', 'MLWS', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8)], [('vertical datum conversion ["depth", 12.0, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 12.0, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 14.4), ('vertical datum conversion ["height", 1.2, "MHWS", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 1.2, 'MHWS', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8), ('vertical datum conversion ["drying", 1.4, "CD", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['drying', 1.4, 'CD', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 1.7), ('vertical datum conversion ["drying", 0.8, "MLWS", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['drying', 0.8, 'MLWS', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], -1.1), ('vertical datum conversion ["depth", 5.0, "LAT", "MLWS", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 5.0, 'LAT', 'MLWS', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8), ('vertical datum conversion ["height", 2.0, "CD", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 2.0, 'CD', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 2.0), ('vertical datum conversion ["height", 2.0, "ODN", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 2.0, 'ODN', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None)], [('vertical datum conversion ["depth", 7.5, "MSL", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 7.5, 'MSL', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.1), ('vertical datum conversion ["drying", 0.8, "MLWS", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['drying', 0.8, 'MLWS', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], -1.1), ('vertical datum conversion ["depth", 5.0, "LAT", "MLWS", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 5.0, 'LAT', 'MLWS', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8), ('vertical datum conversion ["height", 2.0, "CD", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 2.0, 'CD', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 2.0), ('vertical datum conversion ["height", 2.0, "ODN", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 2.0, 'ODN', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["depth", 3.0, "CD", "ODN", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 3.0, 'CD', 'ODN', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["height", 0.0, "LAT", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 0.0, 'LAT', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], -0.3)], [('vertical datum conversion ["height", 1.2, "MHWS", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 1.2, 'MHWS', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8), ('vertical datum conversion ["depth", 5.0, "LAT", "MLWS", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 5.0, 'LAT', 'MLWS', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8), ('vertical datum conversion ["depth", 3.0, "CD", "ODN", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 3.0, 'CD', 'ODN', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["height", 0.0, "LAT", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 0.0, 'LAT', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], -0.3), ('vertical datum conversion ["depth", 9.0, "MHWS", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 9.0, 'MHWS', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 4.1), ('vertical datum conversion ["height", 1.0, "MSL", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4]]]', ['height', 1.0, 'MSL', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4]]], 3.7), ('vertical datum conversion ["height", 3.1, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 3.1, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 0.7)], [('vertical datum conversion ["drying", 1.4, "CD", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['drying', 1.4, 'CD', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 1.7), ('vertical datum conversion ["height", 0.0, "LAT", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 0.0, 'LAT', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], -0.3), ('vertical datum conversion ["height", 1.0, "MSL", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4]]]', ['height', 1.0, 'MSL', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4]]], 3.7), ('vertical datum conversion ["height", 3.1, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 3.1, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 0.7), ('vertical datum conversion ["depth", 12.0, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 12.0, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 14.4), ('vertical datum conversion ["depth", 7.5, "MSL", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 7.5, 'MSL', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.1), ('vertical datum conversion ["height", 1.2, "MHWS", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 1.2, 'MHWS', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8)]]
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
vertical datum conversion ["height", 3.1, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]5.50.7Failed
vertical datum conversion ["depth", 12.0, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]9.614.4Failed
vertical datum conversion ["depth", 7.5, "MSL", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]9.95.1Failed
vertical datum conversion ["height", 1.2, "MHWS", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]-3.45.8Failed
vertical datum conversion ["drying", 1.4, "CD", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]1.11.7Failed
vertical datum conversion ["drying", 0.8, "MLWS", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]2.7-1.1Failed
vertical datum conversion ["depth", 5.0, "LAT", "MLWS", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]4.25.8Failed

SHA-256 / 49d5e4666a00b1040048e92791b1d2b13f18ad228b089deaa67bd1e35b1d42c1

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
    kind,val,frm,to,table=x
    off=dict(table)
    off.setdefault('CD',0.0)
    if frm not in off or to not in off: return None
    shift=abs(off[frm]-off[to])
    if kind=='depth': res=val-shift
    else: res=val+shift
    return round(res,3)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('vertical datum conversion ["height", 3.1, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 3.1, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 0.7), ('vertical datum conversion ["depth", 12.0, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 12.0, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 14.4), ('vertical datum conversion ["depth", 7.5, "MSL", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 7.5, 'MSL', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.1), ('vertical datum conversion ["height", 1.2, "MHWS", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 1.2, 'MHWS', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8), ('vertical datum conversion ["drying", 1.4, "CD", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['drying', 1.4, 'CD', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 1.7), ('vertical datum conversion ["drying", 0.8, "MLWS", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['drying', 0.8, 'MLWS', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], -1.1), ('vertical datum conversion ["depth", 5.0, "LAT", "MLWS", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 5.0, 'LAT', 'MLWS', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8)], [('vertical datum conversion ["depth", 12.0, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 12.0, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 14.4), ('vertical datum conversion ["height", 1.2, "MHWS", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 1.2, 'MHWS', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8), ('vertical datum conversion ["drying", 1.4, "CD", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['drying', 1.4, 'CD', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 1.7), ('vertical datum conversion ["drying", 0.8, "MLWS", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['drying', 0.8, 'MLWS', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], -1.1), ('vertical datum conversion ["depth", 5.0, "LAT", "MLWS", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 5.0, 'LAT', 'MLWS', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8), ('vertical datum conversion ["height", 2.0, "CD", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 2.0, 'CD', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 2.0), ('vertical datum conversion ["height", 2.0, "ODN", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 2.0, 'ODN', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None)], [('vertical datum conversion ["depth", 7.5, "MSL", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 7.5, 'MSL', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.1), ('vertical datum conversion ["drying", 0.8, "MLWS", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['drying', 0.8, 'MLWS', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], -1.1), ('vertical datum conversion ["depth", 5.0, "LAT", "MLWS", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 5.0, 'LAT', 'MLWS', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8), ('vertical datum conversion ["height", 2.0, "CD", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 2.0, 'CD', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 2.0), ('vertical datum conversion ["height", 2.0, "ODN", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 2.0, 'ODN', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["depth", 3.0, "CD", "ODN", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 3.0, 'CD', 'ODN', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["height", 0.0, "LAT", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 0.0, 'LAT', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], -0.3)], [('vertical datum conversion ["height", 1.2, "MHWS", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 1.2, 'MHWS', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8), ('vertical datum conversion ["depth", 5.0, "LAT", "MLWS", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 5.0, 'LAT', 'MLWS', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8), ('vertical datum conversion ["depth", 3.0, "CD", "ODN", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 3.0, 'CD', 'ODN', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["height", 0.0, "LAT", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 0.0, 'LAT', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], -0.3), ('vertical datum conversion ["depth", 9.0, "MHWS", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 9.0, 'MHWS', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 4.1), ('vertical datum conversion ["height", 1.0, "MSL", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4]]]', ['height', 1.0, 'MSL', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4]]], 3.7), ('vertical datum conversion ["height", 3.1, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 3.1, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 0.7)], [('vertical datum conversion ["drying", 1.4, "CD", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['drying', 1.4, 'CD', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 1.7), ('vertical datum conversion ["height", 0.0, "LAT", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 0.0, 'LAT', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], -0.3), ('vertical datum conversion ["height", 1.0, "MSL", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4]]]', ['height', 1.0, 'MSL', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4]]], 3.7), ('vertical datum conversion ["height", 3.1, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 3.1, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 0.7), ('vertical datum conversion ["depth", 12.0, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 12.0, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 14.4), ('vertical datum conversion ["depth", 7.5, "MSL", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 7.5, 'MSL', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.1), ('vertical datum conversion ["height", 1.2, "MHWS", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 1.2, 'MHWS', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8)]]
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
vertical datum conversion ["height", 3.1, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]5.50.7Failed
vertical datum conversion ["depth", 12.0, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]9.614.4Failed
vertical datum conversion ["depth", 7.5, "MSL", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]5.15.1Passed
vertical datum conversion ["height", 1.2, "MHWS", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]5.85.8Passed
vertical datum conversion ["drying", 1.4, "CD", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]1.71.7Passed
vertical datum conversion ["drying", 0.8, "MLWS", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]2.7-1.1Failed
vertical datum conversion ["depth", 5.0, "LAT", "MLWS", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]4.25.8Failed

SHA-256 / 4ef0cc8bb446c69598535fabc5cc04aa9bab48d9b492fee4d35a1b7f4c4c86dc

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
    kind,val,frm,to,table=x
    off=dict(table)
    off.setdefault('CD',0.0)
    if frm not in off or to not in off: return None
    shift=off[frm]-off[to]
    if kind=='depth': res=val-shift
    else: res=val+shift
    return round(res,3)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('vertical datum conversion ["height", 3.1, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 3.1, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 0.7), ('vertical datum conversion ["depth", 12.0, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 12.0, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 14.4), ('vertical datum conversion ["depth", 7.5, "MSL", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 7.5, 'MSL', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.1), ('vertical datum conversion ["height", 1.2, "MHWS", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 1.2, 'MHWS', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8), ('vertical datum conversion ["drying", 1.4, "CD", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['drying', 1.4, 'CD', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 1.7), ('vertical datum conversion ["drying", 0.8, "MLWS", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['drying', 0.8, 'MLWS', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], -1.1), ('vertical datum conversion ["depth", 5.0, "LAT", "MLWS", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 5.0, 'LAT', 'MLWS', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8)], [('vertical datum conversion ["depth", 12.0, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 12.0, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 14.4), ('vertical datum conversion ["height", 1.2, "MHWS", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 1.2, 'MHWS', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8), ('vertical datum conversion ["drying", 1.4, "CD", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['drying', 1.4, 'CD', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 1.7), ('vertical datum conversion ["drying", 0.8, "MLWS", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['drying', 0.8, 'MLWS', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], -1.1), ('vertical datum conversion ["depth", 5.0, "LAT", "MLWS", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 5.0, 'LAT', 'MLWS', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8), ('vertical datum conversion ["height", 2.0, "CD", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 2.0, 'CD', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 2.0), ('vertical datum conversion ["height", 2.0, "ODN", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 2.0, 'ODN', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None)], [('vertical datum conversion ["depth", 7.5, "MSL", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 7.5, 'MSL', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.1), ('vertical datum conversion ["drying", 0.8, "MLWS", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['drying', 0.8, 'MLWS', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], -1.1), ('vertical datum conversion ["depth", 5.0, "LAT", "MLWS", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 5.0, 'LAT', 'MLWS', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8), ('vertical datum conversion ["height", 2.0, "CD", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 2.0, 'CD', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 2.0), ('vertical datum conversion ["height", 2.0, "ODN", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 2.0, 'ODN', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["depth", 3.0, "CD", "ODN", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 3.0, 'CD', 'ODN', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["height", 0.0, "LAT", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 0.0, 'LAT', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], -0.3)], [('vertical datum conversion ["height", 1.2, "MHWS", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 1.2, 'MHWS', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8), ('vertical datum conversion ["depth", 5.0, "LAT", "MLWS", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 5.0, 'LAT', 'MLWS', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8), ('vertical datum conversion ["depth", 3.0, "CD", "ODN", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 3.0, 'CD', 'ODN', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], None), ('vertical datum conversion ["height", 0.0, "LAT", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 0.0, 'LAT', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], -0.3), ('vertical datum conversion ["depth", 9.0, "MHWS", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 9.0, 'MHWS', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 4.1), ('vertical datum conversion ["height", 1.0, "MSL", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4]]]', ['height', 1.0, 'MSL', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4]]], 3.7), ('vertical datum conversion ["height", 3.1, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 3.1, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 0.7)], [('vertical datum conversion ["drying", 1.4, "CD", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['drying', 1.4, 'CD', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 1.7), ('vertical datum conversion ["height", 0.0, "LAT", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 0.0, 'LAT', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], -0.3), ('vertical datum conversion ["height", 1.0, "MSL", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4]]]', ['height', 1.0, 'MSL', 'LAT', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4]]], 3.7), ('vertical datum conversion ["height", 3.1, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 3.1, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 0.7), ('vertical datum conversion ["depth", 12.0, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 12.0, 'CD', 'MSL', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 14.4), ('vertical datum conversion ["depth", 7.5, "MSL", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['depth', 7.5, 'MSL', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.1), ('vertical datum conversion ["height", 1.2, "MHWS", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]', ['height', 1.2, 'MHWS', 'CD', [['LAT', -0.3], ['MLWS', 0.5], ['MSL', 2.4], ['MHWS', 4.6]]], 5.8)]]
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
vertical datum conversion ["height", 3.1, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]0.70.7Passed
vertical datum conversion ["depth", 12.0, "CD", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]14.414.4Passed
vertical datum conversion ["depth", 7.5, "MSL", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]5.15.1Passed
vertical datum conversion ["height", 1.2, "MHWS", "CD", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]5.85.8Passed
vertical datum conversion ["drying", 1.4, "CD", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]1.71.7Passed
vertical datum conversion ["drying", 0.8, "MLWS", "MSL", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]-1.1-1.1Passed
vertical datum conversion ["depth", 5.0, "LAT", "MLWS", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]5.85.8Passed

SHA-256 / 4aa97a78252ca45687efd9f1f095a5dba4eb6c719f29eb5a224d50ca938f2882

Verification & scope

A deterministic toy model with stipulated rules and constants; not certified hydrographic software or a substitute for official tide tables. 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:08.272014+00:00.

Case digest / 690e7f0828d58f03d32cc7a22418c302e3d959397fc4e13adc4b64a200f91265