FAILURE MAP
← Case archive

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

Vertical datum conversion: Drying heights are converted as depths · case 01

Drying banks appear lower after conversion to a higher datum.

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

ROOT CAUSE

Every kind other than height is sent through the depth branch.

VERIFIED REPAIR

Treat drying heights as upward heights.

Unsuccessful approach: Negating drying heights into depths before converting returns the wrong sign.

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[frm]-off[to]
    if kind!='height': 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 ["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", 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", 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 ["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 ["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 ["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 ["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 ["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 ["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 ["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", 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 ["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 ["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", 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), ('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)]]
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 ["drying", 1.4, "CD", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]1.11.7Failed
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", 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]]]5.85.8Passed

SHA-256 / 52c9fdb02d69edeaa528da0eadf7d63bb40952649022f80bb7413d5bf3188f85

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=off[frm]-off[to]
    if kind=='depth': res=val-shift
    elif kind=='drying': 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 ["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", 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", 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 ["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 ["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 ["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 ["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 ["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 ["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 ["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", 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 ["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 ["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", 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), ('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)]]
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 ["drying", 1.4, "CD", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]-1.11.7Failed
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", 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]]]5.85.8Passed

SHA-256 / e1961514e1ce82ff2659e62da3fb718a9f02dda77cb08f64dd2d2fb81d3af05a

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 ["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", 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", 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 ["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 ["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 ["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 ["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 ["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 ["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 ["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", 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 ["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 ["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", 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), ('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)]]
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 ["drying", 1.4, "CD", "LAT", [["LAT", -0.3], ["MLWS", 0.5], ["MSL", 2.4], ["MHWS", 4.6]]]1.71.7Passed
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", 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 / 28feeb9b1dace4110b57697ed83394a8adf756bec258334d723871904626099c

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

Case digest / 6992be030d1b8ab7bbf6fee3d8b63f694d08fcf89e4e8131d4ff12f42974353f