FA-68951 / Tide and marine navigation tables / Open access
Under-keel clearance with squat: Squat grows linearly with speed · case 01
Fast transits get far too little squat allowance.
ROOT CAUSE
Squat is computed as cb*v/100 instead of the square of speed.
VERIFIED REPAIR
Use the speed squared.
Unsuccessful approach: Using v**1.5 still under-reads squat at higher speeds.
Case contract
Input [charted, tide, draft, speed_kn, cb, confined, margin]. Charted value is depth below chart datum (negative means a drying height above datum). Squat = cb*speed^2/100 metres in open water and twice that when confined. UKC = charted+tide-draft-squat. Required clearance is margin*draft. Return [round(ukc,3), ukc>=required].
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):
d,tide,draft,v,cb,confined,margin=x
squat=cb*v/100
if confined: squat*=2
water=d+tide
ukc=water-draft-squat
return [round(ukc,3),ukc>=margin*draft]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('under-keel clearance with squat [12.0, 1.5, 10.5, 8, 0.8, false, 0.1]', [12.0, 1.5, 10.5, 8, 0.8, False, 0.1], [2.488, True]), ('under-keel clearance with squat [12.0, 1.5, 10.5, 8, 0.8, true, 0.1]', [12.0, 1.5, 10.5, 8, 0.8, True, 0.1], [1.976, True]), ('under-keel clearance with squat [-1.2, 3.8, 1.6, 4, 0.45, false, 0.2]', [-1.2, 3.8, 1.6, 4, 0.45, False, 0.2], [0.928, True]), ('under-keel clearance with squat [-0.5, 2.9, 1.2, 5, 0.5, true, 0.15]', [-0.5, 2.9, 1.2, 5, 0.5, True, 0.15], [0.95, True]), ('under-keel clearance with squat [9.0, 2.0, 8.0, 6, 0.82, false, 0.1]', [9.0, 2.0, 8.0, 6, 0.82, False, 0.1], [2.705, True]), ('under-keel clearance with squat [9.0, 2.0, 8.0, 10, 0.82, true, 0.1]', [9.0, 2.0, 8.0, 10, 0.82, True, 0.1], [1.36, True]), ('under-keel clearance with squat [15.0, 0.0, 12.0, 12, 0.7, false, 0.1]', [15.0, 0.0, 12.0, 12, 0.7, False, 0.1], [1.992, True])], [('under-keel clearance with squat [12.0, 1.5, 10.5, 8, 0.8, true, 0.1]', [12.0, 1.5, 10.5, 8, 0.8, True, 0.1], [1.976, True]), ('under-keel clearance with squat [-0.5, 2.9, 1.2, 5, 0.5, true, 0.15]', [-0.5, 2.9, 1.2, 5, 0.5, True, 0.15], [0.95, True]), ('under-keel clearance with squat [9.0, 2.0, 8.0, 6, 0.82, false, 0.1]', [9.0, 2.0, 8.0, 6, 0.82, False, 0.1], [2.705, True]), ('under-keel clearance with squat [9.0, 2.0, 8.0, 10, 0.82, true, 0.1]', [9.0, 2.0, 8.0, 10, 0.82, True, 0.1], [1.36, True]), ('under-keel clearance with squat [15.0, 0.0, 12.0, 12, 0.7, false, 0.1]', [15.0, 0.0, 12.0, 12, 0.7, False, 0.1], [1.992, True]), ('under-keel clearance with squat [15.0, 0.0, 12.0, 12, 0.7, true, 0.05]', [15.0, 0.0, 12.0, 12, 0.7, True, 0.05], [0.984, True]), ('under-keel clearance with squat [4.0, 1.0, 4.3, 0, 0.6, false, 0.1]', [4.0, 1.0, 4.3, 0, 0.6, False, 0.1], [0.7, True])], [('under-keel clearance with squat [-1.2, 3.8, 1.6, 4, 0.45, false, 0.2]', [-1.2, 3.8, 1.6, 4, 0.45, False, 0.2], [0.928, True]), ('under-keel clearance with squat [15.0, 0.0, 12.0, 12, 0.7, false, 0.1]', [15.0, 0.0, 12.0, 12, 0.7, False, 0.1], [1.992, True]), ('under-keel clearance with squat [15.0, 0.0, 12.0, 12, 0.7, true, 0.05]', [15.0, 0.0, 12.0, 12, 0.7, True, 0.05], [0.984, True]), ('under-keel clearance with squat [4.0, 1.0, 4.3, 0, 0.6, false, 0.1]', [4.0, 1.0, 4.3, 0, 0.6, False, 0.1], [0.7, True]), ('under-keel clearance with squat [5.0, 1.0, 5.0, 7, 0.5, false, 0.0]', [5.0, 1.0, 5.0, 7, 0.5, False, 0.0], [0.755, True]), ('under-keel clearance with squat [-2.0, 4.5, 1.0, 3, 0.4, false, 0.2]', [-2.0, 4.5, 1.0, 3, 0.4, False, 0.2], [1.464, True]), ('under-keel clearance with squat [8.0, 1.0, 7.0, 5, 0.75, false, 0.1]', [8.0, 1.0, 7.0, 5, 0.75, False, 0.1], [1.812, True])], [('under-keel clearance with squat [-0.5, 2.9, 1.2, 5, 0.5, true, 0.15]', [-0.5, 2.9, 1.2, 5, 0.5, True, 0.15], [0.95, True]), ('under-keel clearance with squat [5.0, 1.0, 5.0, 7, 0.5, false, 0.0]', [5.0, 1.0, 5.0, 7, 0.5, False, 0.0], [0.755, True]), ('under-keel clearance with squat [-2.0, 4.5, 1.0, 3, 0.4, false, 0.2]', [-2.0, 4.5, 1.0, 3, 0.4, False, 0.2], [1.464, True]), ('under-keel clearance with squat [8.0, 1.0, 7.0, 5, 0.75, false, 0.1]', [8.0, 1.0, 7.0, 5, 0.75, False, 0.1], [1.812, True]), ('under-keel clearance with squat [11.0, 0.3, 10.0, 5, 0.8, false, 0.1]', [11.0, 0.3, 10.0, 5, 0.8, False, 0.1], [1.1, True]), ('under-keel clearance with squat [11.0, 0.21, 10.0, 5, 0.8, false, 0.1]', [11.0, 0.21, 10.0, 5, 0.8, False, 0.1], [1.01, True]), ('under-keel clearance with squat [6.0, 0.9, 6.0, 5, 0.8, false, 0.1]', [6.0, 0.9, 6.0, 5, 0.8, False, 0.1], [0.7, True])], [('under-keel clearance with squat [9.0, 2.0, 8.0, 6, 0.82, false, 0.1]', [9.0, 2.0, 8.0, 6, 0.82, False, 0.1], [2.705, True]), ('under-keel clearance with squat [11.0, 0.3, 10.0, 5, 0.8, false, 0.1]', [11.0, 0.3, 10.0, 5, 0.8, False, 0.1], [1.1, True]), ('under-keel clearance with squat [11.0, 0.21, 10.0, 5, 0.8, false, 0.1]', [11.0, 0.21, 10.0, 5, 0.8, False, 0.1], [1.01, True]), ('under-keel clearance with squat [6.0, 0.9, 6.0, 5, 0.8, false, 0.1]', [6.0, 0.9, 6.0, 5, 0.8, False, 0.1], [0.7, True]), ('under-keel clearance with squat [4.0, 1.0, 4.0, 0, 0.7, false, 0.25]', [4.0, 1.0, 4.0, 0, 0.7, False, 0.25], [1.0, True]), ('under-keel clearance with squat [4.0, 0.97, 4.0, 0, 0.7, false, 0.25]', [4.0, 0.97, 4.0, 0, 0.7, False, 0.25], [0.97, False]), ('under-keel clearance with squat [12.0, 1.5, 10.5, 8, 0.8, false, 0.1]', [12.0, 1.5, 10.5, 8, 0.8, False, 0.1], [2.488, True])]]
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 |
|---|---|---|---|
| under-keel clearance with squat [12.0, 1.5, 10.5, 8, 0.8, false, 0.1] | [2.936, True] | [2.488, True] | Failed |
| under-keel clearance with squat [12.0, 1.5, 10.5, 8, 0.8, true, 0.1] | [2.872, True] | [1.976, True] | Failed |
| under-keel clearance with squat [-1.2, 3.8, 1.6, 4, 0.45, false, 0.2] | [0.982, True] | [0.928, True] | Failed |
| under-keel clearance with squat [-0.5, 2.9, 1.2, 5, 0.5, true, 0.15] | [1.15, True] | [0.95, True] | Failed |
| under-keel clearance with squat [9.0, 2.0, 8.0, 6, 0.82, false, 0.1] | [2.951, True] | [2.705, True] | Failed |
| under-keel clearance with squat [9.0, 2.0, 8.0, 10, 0.82, true, 0.1] | [2.836, True] | [1.36, True] | Failed |
| under-keel clearance with squat [15.0, 0.0, 12.0, 12, 0.7, false, 0.1] | [2.916, True] | [1.992, True] | Failed |
SHA-256 / 9b54fa95d9b6cf59dda34bfbfd0fe1c6306c3171a5e8b73635fff20e8dad904a
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
d,tide,draft,v,cb,confined,margin=x
squat=cb*v**1.5/100
if confined: squat*=2
water=d+tide
ukc=water-draft-squat
return [round(ukc,3),ukc>=margin*draft]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('under-keel clearance with squat [12.0, 1.5, 10.5, 8, 0.8, false, 0.1]', [12.0, 1.5, 10.5, 8, 0.8, False, 0.1], [2.488, True]), ('under-keel clearance with squat [12.0, 1.5, 10.5, 8, 0.8, true, 0.1]', [12.0, 1.5, 10.5, 8, 0.8, True, 0.1], [1.976, True]), ('under-keel clearance with squat [-1.2, 3.8, 1.6, 4, 0.45, false, 0.2]', [-1.2, 3.8, 1.6, 4, 0.45, False, 0.2], [0.928, True]), ('under-keel clearance with squat [-0.5, 2.9, 1.2, 5, 0.5, true, 0.15]', [-0.5, 2.9, 1.2, 5, 0.5, True, 0.15], [0.95, True]), ('under-keel clearance with squat [9.0, 2.0, 8.0, 6, 0.82, false, 0.1]', [9.0, 2.0, 8.0, 6, 0.82, False, 0.1], [2.705, True]), ('under-keel clearance with squat [9.0, 2.0, 8.0, 10, 0.82, true, 0.1]', [9.0, 2.0, 8.0, 10, 0.82, True, 0.1], [1.36, True]), ('under-keel clearance with squat [15.0, 0.0, 12.0, 12, 0.7, false, 0.1]', [15.0, 0.0, 12.0, 12, 0.7, False, 0.1], [1.992, True])], [('under-keel clearance with squat [12.0, 1.5, 10.5, 8, 0.8, true, 0.1]', [12.0, 1.5, 10.5, 8, 0.8, True, 0.1], [1.976, True]), ('under-keel clearance with squat [-0.5, 2.9, 1.2, 5, 0.5, true, 0.15]', [-0.5, 2.9, 1.2, 5, 0.5, True, 0.15], [0.95, True]), ('under-keel clearance with squat [9.0, 2.0, 8.0, 6, 0.82, false, 0.1]', [9.0, 2.0, 8.0, 6, 0.82, False, 0.1], [2.705, True]), ('under-keel clearance with squat [9.0, 2.0, 8.0, 10, 0.82, true, 0.1]', [9.0, 2.0, 8.0, 10, 0.82, True, 0.1], [1.36, True]), ('under-keel clearance with squat [15.0, 0.0, 12.0, 12, 0.7, false, 0.1]', [15.0, 0.0, 12.0, 12, 0.7, False, 0.1], [1.992, True]), ('under-keel clearance with squat [15.0, 0.0, 12.0, 12, 0.7, true, 0.05]', [15.0, 0.0, 12.0, 12, 0.7, True, 0.05], [0.984, True]), ('under-keel clearance with squat [4.0, 1.0, 4.3, 0, 0.6, false, 0.1]', [4.0, 1.0, 4.3, 0, 0.6, False, 0.1], [0.7, True])], [('under-keel clearance with squat [-1.2, 3.8, 1.6, 4, 0.45, false, 0.2]', [-1.2, 3.8, 1.6, 4, 0.45, False, 0.2], [0.928, True]), ('under-keel clearance with squat [15.0, 0.0, 12.0, 12, 0.7, false, 0.1]', [15.0, 0.0, 12.0, 12, 0.7, False, 0.1], [1.992, True]), ('under-keel clearance with squat [15.0, 0.0, 12.0, 12, 0.7, true, 0.05]', [15.0, 0.0, 12.0, 12, 0.7, True, 0.05], [0.984, True]), ('under-keel clearance with squat [4.0, 1.0, 4.3, 0, 0.6, false, 0.1]', [4.0, 1.0, 4.3, 0, 0.6, False, 0.1], [0.7, True]), ('under-keel clearance with squat [5.0, 1.0, 5.0, 7, 0.5, false, 0.0]', [5.0, 1.0, 5.0, 7, 0.5, False, 0.0], [0.755, True]), ('under-keel clearance with squat [-2.0, 4.5, 1.0, 3, 0.4, false, 0.2]', [-2.0, 4.5, 1.0, 3, 0.4, False, 0.2], [1.464, True]), ('under-keel clearance with squat [8.0, 1.0, 7.0, 5, 0.75, false, 0.1]', [8.0, 1.0, 7.0, 5, 0.75, False, 0.1], [1.812, True])], [('under-keel clearance with squat [-0.5, 2.9, 1.2, 5, 0.5, true, 0.15]', [-0.5, 2.9, 1.2, 5, 0.5, True, 0.15], [0.95, True]), ('under-keel clearance with squat [5.0, 1.0, 5.0, 7, 0.5, false, 0.0]', [5.0, 1.0, 5.0, 7, 0.5, False, 0.0], [0.755, True]), ('under-keel clearance with squat [-2.0, 4.5, 1.0, 3, 0.4, false, 0.2]', [-2.0, 4.5, 1.0, 3, 0.4, False, 0.2], [1.464, True]), ('under-keel clearance with squat [8.0, 1.0, 7.0, 5, 0.75, false, 0.1]', [8.0, 1.0, 7.0, 5, 0.75, False, 0.1], [1.812, True]), ('under-keel clearance with squat [11.0, 0.3, 10.0, 5, 0.8, false, 0.1]', [11.0, 0.3, 10.0, 5, 0.8, False, 0.1], [1.1, True]), ('under-keel clearance with squat [11.0, 0.21, 10.0, 5, 0.8, false, 0.1]', [11.0, 0.21, 10.0, 5, 0.8, False, 0.1], [1.01, True]), ('under-keel clearance with squat [6.0, 0.9, 6.0, 5, 0.8, false, 0.1]', [6.0, 0.9, 6.0, 5, 0.8, False, 0.1], [0.7, True])], [('under-keel clearance with squat [9.0, 2.0, 8.0, 6, 0.82, false, 0.1]', [9.0, 2.0, 8.0, 6, 0.82, False, 0.1], [2.705, True]), ('under-keel clearance with squat [11.0, 0.3, 10.0, 5, 0.8, false, 0.1]', [11.0, 0.3, 10.0, 5, 0.8, False, 0.1], [1.1, True]), ('under-keel clearance with squat [11.0, 0.21, 10.0, 5, 0.8, false, 0.1]', [11.0, 0.21, 10.0, 5, 0.8, False, 0.1], [1.01, True]), ('under-keel clearance with squat [6.0, 0.9, 6.0, 5, 0.8, false, 0.1]', [6.0, 0.9, 6.0, 5, 0.8, False, 0.1], [0.7, True]), ('under-keel clearance with squat [4.0, 1.0, 4.0, 0, 0.7, false, 0.25]', [4.0, 1.0, 4.0, 0, 0.7, False, 0.25], [1.0, True]), ('under-keel clearance with squat [4.0, 0.97, 4.0, 0, 0.7, false, 0.25]', [4.0, 0.97, 4.0, 0, 0.7, False, 0.25], [0.97, False]), ('under-keel clearance with squat [12.0, 1.5, 10.5, 8, 0.8, false, 0.1]', [12.0, 1.5, 10.5, 8, 0.8, False, 0.1], [2.488, True])]]
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 |
|---|---|---|---|
| under-keel clearance with squat [12.0, 1.5, 10.5, 8, 0.8, false, 0.1] | [2.819, True] | [2.488, True] | Failed |
| under-keel clearance with squat [12.0, 1.5, 10.5, 8, 0.8, true, 0.1] | [2.638, True] | [1.976, True] | Failed |
| under-keel clearance with squat [-1.2, 3.8, 1.6, 4, 0.45, false, 0.2] | [0.964, True] | [0.928, True] | Failed |
| under-keel clearance with squat [-0.5, 2.9, 1.2, 5, 0.5, true, 0.15] | [1.088, True] | [0.95, True] | Failed |
| under-keel clearance with squat [9.0, 2.0, 8.0, 6, 0.82, false, 0.1] | [2.879, True] | [2.705, True] | Failed |
| under-keel clearance with squat [9.0, 2.0, 8.0, 10, 0.82, true, 0.1] | [2.481, True] | [1.36, True] | Failed |
| under-keel clearance with squat [15.0, 0.0, 12.0, 12, 0.7, false, 0.1] | [2.709, True] | [1.992, True] | Failed |
SHA-256 / f0435d4d027ef17cf26651ff73ff06f8d9282ee8ad69b9ab01b15345d6ee1e06
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
d,tide,draft,v,cb,confined,margin=x
squat=cb*v*v/100
if confined: squat*=2
water=d+tide
ukc=water-draft-squat
return [round(ukc,3),ukc>=margin*draft]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('under-keel clearance with squat [12.0, 1.5, 10.5, 8, 0.8, false, 0.1]', [12.0, 1.5, 10.5, 8, 0.8, False, 0.1], [2.488, True]), ('under-keel clearance with squat [12.0, 1.5, 10.5, 8, 0.8, true, 0.1]', [12.0, 1.5, 10.5, 8, 0.8, True, 0.1], [1.976, True]), ('under-keel clearance with squat [-1.2, 3.8, 1.6, 4, 0.45, false, 0.2]', [-1.2, 3.8, 1.6, 4, 0.45, False, 0.2], [0.928, True]), ('under-keel clearance with squat [-0.5, 2.9, 1.2, 5, 0.5, true, 0.15]', [-0.5, 2.9, 1.2, 5, 0.5, True, 0.15], [0.95, True]), ('under-keel clearance with squat [9.0, 2.0, 8.0, 6, 0.82, false, 0.1]', [9.0, 2.0, 8.0, 6, 0.82, False, 0.1], [2.705, True]), ('under-keel clearance with squat [9.0, 2.0, 8.0, 10, 0.82, true, 0.1]', [9.0, 2.0, 8.0, 10, 0.82, True, 0.1], [1.36, True]), ('under-keel clearance with squat [15.0, 0.0, 12.0, 12, 0.7, false, 0.1]', [15.0, 0.0, 12.0, 12, 0.7, False, 0.1], [1.992, True])], [('under-keel clearance with squat [12.0, 1.5, 10.5, 8, 0.8, true, 0.1]', [12.0, 1.5, 10.5, 8, 0.8, True, 0.1], [1.976, True]), ('under-keel clearance with squat [-0.5, 2.9, 1.2, 5, 0.5, true, 0.15]', [-0.5, 2.9, 1.2, 5, 0.5, True, 0.15], [0.95, True]), ('under-keel clearance with squat [9.0, 2.0, 8.0, 6, 0.82, false, 0.1]', [9.0, 2.0, 8.0, 6, 0.82, False, 0.1], [2.705, True]), ('under-keel clearance with squat [9.0, 2.0, 8.0, 10, 0.82, true, 0.1]', [9.0, 2.0, 8.0, 10, 0.82, True, 0.1], [1.36, True]), ('under-keel clearance with squat [15.0, 0.0, 12.0, 12, 0.7, false, 0.1]', [15.0, 0.0, 12.0, 12, 0.7, False, 0.1], [1.992, True]), ('under-keel clearance with squat [15.0, 0.0, 12.0, 12, 0.7, true, 0.05]', [15.0, 0.0, 12.0, 12, 0.7, True, 0.05], [0.984, True]), ('under-keel clearance with squat [4.0, 1.0, 4.3, 0, 0.6, false, 0.1]', [4.0, 1.0, 4.3, 0, 0.6, False, 0.1], [0.7, True])], [('under-keel clearance with squat [-1.2, 3.8, 1.6, 4, 0.45, false, 0.2]', [-1.2, 3.8, 1.6, 4, 0.45, False, 0.2], [0.928, True]), ('under-keel clearance with squat [15.0, 0.0, 12.0, 12, 0.7, false, 0.1]', [15.0, 0.0, 12.0, 12, 0.7, False, 0.1], [1.992, True]), ('under-keel clearance with squat [15.0, 0.0, 12.0, 12, 0.7, true, 0.05]', [15.0, 0.0, 12.0, 12, 0.7, True, 0.05], [0.984, True]), ('under-keel clearance with squat [4.0, 1.0, 4.3, 0, 0.6, false, 0.1]', [4.0, 1.0, 4.3, 0, 0.6, False, 0.1], [0.7, True]), ('under-keel clearance with squat [5.0, 1.0, 5.0, 7, 0.5, false, 0.0]', [5.0, 1.0, 5.0, 7, 0.5, False, 0.0], [0.755, True]), ('under-keel clearance with squat [-2.0, 4.5, 1.0, 3, 0.4, false, 0.2]', [-2.0, 4.5, 1.0, 3, 0.4, False, 0.2], [1.464, True]), ('under-keel clearance with squat [8.0, 1.0, 7.0, 5, 0.75, false, 0.1]', [8.0, 1.0, 7.0, 5, 0.75, False, 0.1], [1.812, True])], [('under-keel clearance with squat [-0.5, 2.9, 1.2, 5, 0.5, true, 0.15]', [-0.5, 2.9, 1.2, 5, 0.5, True, 0.15], [0.95, True]), ('under-keel clearance with squat [5.0, 1.0, 5.0, 7, 0.5, false, 0.0]', [5.0, 1.0, 5.0, 7, 0.5, False, 0.0], [0.755, True]), ('under-keel clearance with squat [-2.0, 4.5, 1.0, 3, 0.4, false, 0.2]', [-2.0, 4.5, 1.0, 3, 0.4, False, 0.2], [1.464, True]), ('under-keel clearance with squat [8.0, 1.0, 7.0, 5, 0.75, false, 0.1]', [8.0, 1.0, 7.0, 5, 0.75, False, 0.1], [1.812, True]), ('under-keel clearance with squat [11.0, 0.3, 10.0, 5, 0.8, false, 0.1]', [11.0, 0.3, 10.0, 5, 0.8, False, 0.1], [1.1, True]), ('under-keel clearance with squat [11.0, 0.21, 10.0, 5, 0.8, false, 0.1]', [11.0, 0.21, 10.0, 5, 0.8, False, 0.1], [1.01, True]), ('under-keel clearance with squat [6.0, 0.9, 6.0, 5, 0.8, false, 0.1]', [6.0, 0.9, 6.0, 5, 0.8, False, 0.1], [0.7, True])], [('under-keel clearance with squat [9.0, 2.0, 8.0, 6, 0.82, false, 0.1]', [9.0, 2.0, 8.0, 6, 0.82, False, 0.1], [2.705, True]), ('under-keel clearance with squat [11.0, 0.3, 10.0, 5, 0.8, false, 0.1]', [11.0, 0.3, 10.0, 5, 0.8, False, 0.1], [1.1, True]), ('under-keel clearance with squat [11.0, 0.21, 10.0, 5, 0.8, false, 0.1]', [11.0, 0.21, 10.0, 5, 0.8, False, 0.1], [1.01, True]), ('under-keel clearance with squat [6.0, 0.9, 6.0, 5, 0.8, false, 0.1]', [6.0, 0.9, 6.0, 5, 0.8, False, 0.1], [0.7, True]), ('under-keel clearance with squat [4.0, 1.0, 4.0, 0, 0.7, false, 0.25]', [4.0, 1.0, 4.0, 0, 0.7, False, 0.25], [1.0, True]), ('under-keel clearance with squat [4.0, 0.97, 4.0, 0, 0.7, false, 0.25]', [4.0, 0.97, 4.0, 0, 0.7, False, 0.25], [0.97, False]), ('under-keel clearance with squat [12.0, 1.5, 10.5, 8, 0.8, false, 0.1]', [12.0, 1.5, 10.5, 8, 0.8, False, 0.1], [2.488, True])]]
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 |
|---|---|---|---|
| under-keel clearance with squat [12.0, 1.5, 10.5, 8, 0.8, false, 0.1] | [2.488, True] | [2.488, True] | Passed |
| under-keel clearance with squat [12.0, 1.5, 10.5, 8, 0.8, true, 0.1] | [1.976, True] | [1.976, True] | Passed |
| under-keel clearance with squat [-1.2, 3.8, 1.6, 4, 0.45, false, 0.2] | [0.928, True] | [0.928, True] | Passed |
| under-keel clearance with squat [-0.5, 2.9, 1.2, 5, 0.5, true, 0.15] | [0.95, True] | [0.95, True] | Passed |
| under-keel clearance with squat [9.0, 2.0, 8.0, 6, 0.82, false, 0.1] | [2.705, True] | [2.705, True] | Passed |
| under-keel clearance with squat [9.0, 2.0, 8.0, 10, 0.82, true, 0.1] | [1.36, True] | [1.36, True] | Passed |
| under-keel clearance with squat [15.0, 0.0, 12.0, 12, 0.7, false, 0.1] | [1.992, True] | [1.992, True] | Passed |
SHA-256 / 6295a810f16828c1759f771d1a0c572203178fc690918c1ce33d8d71e817878b
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:06.985254+00:00.
Case digest / 1702d7b63864a4d3ff1d9e26dbde7fa21cfc2b89d390e90deb076f1b67438e31