FAILURE MAP
← Case archive

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

Anchor rode and swing radius: Rode length uses the lowest tide · case 01

At high water the anchor has too little scope and drags.

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

ROOT CAUSE

Rode length is based on the minimum instead of the maximum tide during the stay.

VERIFIED REPAIR

Size rode for the highest tide.

Unsuccessful approach: Using the mean of high and low tide still leaves short scope at high water.

Case contract

Input [depth, tmax, tmin, bow, scope, boat_len]: charted depth and tide heights above datum (m). Rode = scope*(depth+tmax+bow) rounded up to the next 5 m chain mark. Swing radius = sqrt(rode^2 - (depth+tmin+bow)^2) + boat_len (largest at the lowest tide), rounded to 0.1 m. Return [rode, radius].

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,tmax,tmin,bow,scope,blen=x
    L=scope*(d+tmin+bow)
    L=math.ceil(L/5-1e-9)*5
    v=d+tmin+bow
    r=math.sqrt(L*L-v*v)+blen
    return [L,round(r,1)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('anchor rode and swing radius [4.0, 3.2, 0.6, 1.2, 5, 11]', [4.0, 3.2, 0.6, 1.2, 5, 11], [45, 55.6]), ('anchor rode and swing radius [4.0, 3.2, 0.6, 1.2, 4, 11]', [4.0, 3.2, 0.6, 1.2, 4, 11], [35, 45.5]), ('anchor rode and swing radius [8.0, 5.1, 0.3, 1.5, 3, 14]', [8.0, 5.1, 0.3, 1.5, 3, 14], [45, 57.9]), ('anchor rode and swing radius [2.5, 1.0, 0.2, 1.0, 7, 9]', [2.5, 1.0, 0.2, 1.0, 7, 9], [35, 43.8]), ('anchor rode and swing radius [4.2, 1.4, 0.4, 1.4, 5, 10]', [4.2, 1.4, 0.4, 1.4, 5, 10], [35, 44.5]), ('anchor rode and swing radius [6.0, 2.0, 2.0, 1.0, 5, 12]', [6.0, 2.0, 2.0, 1.0, 5, 12], [45, 56.1]), ('anchor rode and swing radius [3.0, 4.0, 1.0, 1.5, 5, 8]', [3.0, 4.0, 1.0, 1.5, 5, 8], [45, 52.7])], [('anchor rode and swing radius [4.0, 3.2, 0.6, 1.2, 4, 11]', [4.0, 3.2, 0.6, 1.2, 4, 11], [35, 45.5]), ('anchor rode and swing radius [2.5, 1.0, 0.2, 1.0, 7, 9]', [2.5, 1.0, 0.2, 1.0, 7, 9], [35, 43.8]), ('anchor rode and swing radius [4.2, 1.4, 0.4, 1.4, 5, 10]', [4.2, 1.4, 0.4, 1.4, 5, 10], [35, 44.5]), ('anchor rode and swing radius [6.0, 2.0, 2.0, 1.0, 5, 12]', [6.0, 2.0, 2.0, 1.0, 5, 12], [45, 56.1]), ('anchor rode and swing radius [3.0, 4.0, 1.0, 1.5, 5, 8]', [3.0, 4.0, 1.0, 1.5, 5, 8], [45, 52.7]), ('anchor rode and swing radius [10.0, 0.5, 0.1, 2.0, 4, 20]', [10.0, 0.5, 0.1, 2.0, 4, 20], [50, 68.5]), ('anchor rode and swing radius [5.0, 1.0, 0.5, 1.0, 6, 10]', [5.0, 1.0, 0.5, 1.0, 6, 10], [45, 54.5])], [('anchor rode and swing radius [8.0, 5.1, 0.3, 1.5, 3, 14]', [8.0, 5.1, 0.3, 1.5, 3, 14], [45, 57.9]), ('anchor rode and swing radius [3.0, 4.0, 1.0, 1.5, 5, 8]', [3.0, 4.0, 1.0, 1.5, 5, 8], [45, 52.7]), ('anchor rode and swing radius [10.0, 0.5, 0.1, 2.0, 4, 20]', [10.0, 0.5, 0.1, 2.0, 4, 20], [50, 68.5]), ('anchor rode and swing radius [5.0, 1.0, 0.5, 1.0, 6, 10]', [5.0, 1.0, 0.5, 1.0, 6, 10], [45, 54.5]), ('anchor rode and swing radius [2.0, 0.5, 0.5, 1.0, 7, 7]', [2.0, 0.5, 0.5, 1.0, 7, 7], [25, 31.8]), ('anchor rode and swing radius [4.2, 2.1, 1.0, 1.2, 4, 10]', [4.2, 2.1, 1.0, 1.2, 4, 10], [30, 39.3]), ('anchor rode and swing radius [1.1, 1.3, 0.4, 0.6, 5, 6]', [1.1, 1.3, 0.4, 0.6, 5, 6], [15, 20.9])], [('anchor rode and swing radius [2.5, 1.0, 0.2, 1.0, 7, 9]', [2.5, 1.0, 0.2, 1.0, 7, 9], [35, 43.8]), ('anchor rode and swing radius [2.0, 0.5, 0.5, 1.0, 7, 7]', [2.0, 0.5, 0.5, 1.0, 7, 7], [25, 31.8]), ('anchor rode and swing radius [4.2, 2.1, 1.0, 1.2, 4, 10]', [4.2, 2.1, 1.0, 1.2, 4, 10], [30, 39.3]), ('anchor rode and swing radius [1.1, 1.3, 0.4, 0.6, 5, 6]', [1.1, 1.3, 0.4, 0.6, 5, 6], [15, 20.9]), ('anchor rode and swing radius [4.0, 3.2, 0.6, 1.2, 5, 11]', [4.0, 3.2, 0.6, 1.2, 5, 11], [45, 55.6]), ('anchor rode and swing radius [4.0, 3.2, 0.6, 1.2, 4, 11]', [4.0, 3.2, 0.6, 1.2, 4, 11], [35, 45.5]), ('anchor rode and swing radius [8.0, 5.1, 0.3, 1.5, 3, 14]', [8.0, 5.1, 0.3, 1.5, 3, 14], [45, 57.9])], [('anchor rode and swing radius [4.2, 1.4, 0.4, 1.4, 5, 10]', [4.2, 1.4, 0.4, 1.4, 5, 10], [35, 44.5]), ('anchor rode and swing radius [3.0, 4.0, 1.0, 1.5, 5, 8]', [3.0, 4.0, 1.0, 1.5, 5, 8], [45, 52.7]), ('anchor rode and swing radius [4.0, 3.2, 0.6, 1.2, 5, 11]', [4.0, 3.2, 0.6, 1.2, 5, 11], [45, 55.6]), ('anchor rode and swing radius [4.0, 3.2, 0.6, 1.2, 4, 11]', [4.0, 3.2, 0.6, 1.2, 4, 11], [35, 45.5]), ('anchor rode and swing radius [8.0, 5.1, 0.3, 1.5, 3, 14]', [8.0, 5.1, 0.3, 1.5, 3, 14], [45, 57.9]), ('anchor rode and swing radius [2.5, 1.0, 0.2, 1.0, 7, 9]', [2.5, 1.0, 0.2, 1.0, 7, 9], [35, 43.8]), ('anchor rode and swing radius [6.0, 2.0, 2.0, 1.0, 5, 12]', [6.0, 2.0, 2.0, 1.0, 5, 12], [45, 56.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
anchor rode and swing radius [4.0, 3.2, 0.6, 1.2, 5, 11][30, 40.4][45, 55.6]Failed
anchor rode and swing radius [4.0, 3.2, 0.6, 1.2, 4, 11][25, 35.3][35, 45.5]Failed
anchor rode and swing radius [8.0, 5.1, 0.3, 1.5, 3, 14][30, 42.4][45, 57.9]Failed
anchor rode and swing radius [2.5, 1.0, 0.2, 1.0, 7, 9][30, 38.8][35, 43.8]Failed
anchor rode and swing radius [4.2, 1.4, 0.4, 1.4, 5, 10][30, 39.4][35, 44.5]Failed
anchor rode and swing radius [6.0, 2.0, 2.0, 1.0, 5, 12][45, 56.1][45, 56.1]Passed
anchor rode and swing radius [3.0, 4.0, 1.0, 1.5, 5, 8][30, 37.5][45, 52.7]Failed

SHA-256 / 706cd6fd5252992efa95a679508b563c38114b5bbe245aa616903cd123fa8412

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,tmax,tmin,bow,scope,blen=x
    L=scope*(d+(tmax+tmin)/2+bow)
    L=math.ceil(L/5-1e-9)*5
    v=d+tmin+bow
    r=math.sqrt(L*L-v*v)+blen
    return [L,round(r,1)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('anchor rode and swing radius [4.0, 3.2, 0.6, 1.2, 5, 11]', [4.0, 3.2, 0.6, 1.2, 5, 11], [45, 55.6]), ('anchor rode and swing radius [4.0, 3.2, 0.6, 1.2, 4, 11]', [4.0, 3.2, 0.6, 1.2, 4, 11], [35, 45.5]), ('anchor rode and swing radius [8.0, 5.1, 0.3, 1.5, 3, 14]', [8.0, 5.1, 0.3, 1.5, 3, 14], [45, 57.9]), ('anchor rode and swing radius [2.5, 1.0, 0.2, 1.0, 7, 9]', [2.5, 1.0, 0.2, 1.0, 7, 9], [35, 43.8]), ('anchor rode and swing radius [4.2, 1.4, 0.4, 1.4, 5, 10]', [4.2, 1.4, 0.4, 1.4, 5, 10], [35, 44.5]), ('anchor rode and swing radius [6.0, 2.0, 2.0, 1.0, 5, 12]', [6.0, 2.0, 2.0, 1.0, 5, 12], [45, 56.1]), ('anchor rode and swing radius [3.0, 4.0, 1.0, 1.5, 5, 8]', [3.0, 4.0, 1.0, 1.5, 5, 8], [45, 52.7])], [('anchor rode and swing radius [4.0, 3.2, 0.6, 1.2, 4, 11]', [4.0, 3.2, 0.6, 1.2, 4, 11], [35, 45.5]), ('anchor rode and swing radius [2.5, 1.0, 0.2, 1.0, 7, 9]', [2.5, 1.0, 0.2, 1.0, 7, 9], [35, 43.8]), ('anchor rode and swing radius [4.2, 1.4, 0.4, 1.4, 5, 10]', [4.2, 1.4, 0.4, 1.4, 5, 10], [35, 44.5]), ('anchor rode and swing radius [6.0, 2.0, 2.0, 1.0, 5, 12]', [6.0, 2.0, 2.0, 1.0, 5, 12], [45, 56.1]), ('anchor rode and swing radius [3.0, 4.0, 1.0, 1.5, 5, 8]', [3.0, 4.0, 1.0, 1.5, 5, 8], [45, 52.7]), ('anchor rode and swing radius [10.0, 0.5, 0.1, 2.0, 4, 20]', [10.0, 0.5, 0.1, 2.0, 4, 20], [50, 68.5]), ('anchor rode and swing radius [5.0, 1.0, 0.5, 1.0, 6, 10]', [5.0, 1.0, 0.5, 1.0, 6, 10], [45, 54.5])], [('anchor rode and swing radius [8.0, 5.1, 0.3, 1.5, 3, 14]', [8.0, 5.1, 0.3, 1.5, 3, 14], [45, 57.9]), ('anchor rode and swing radius [3.0, 4.0, 1.0, 1.5, 5, 8]', [3.0, 4.0, 1.0, 1.5, 5, 8], [45, 52.7]), ('anchor rode and swing radius [10.0, 0.5, 0.1, 2.0, 4, 20]', [10.0, 0.5, 0.1, 2.0, 4, 20], [50, 68.5]), ('anchor rode and swing radius [5.0, 1.0, 0.5, 1.0, 6, 10]', [5.0, 1.0, 0.5, 1.0, 6, 10], [45, 54.5]), ('anchor rode and swing radius [2.0, 0.5, 0.5, 1.0, 7, 7]', [2.0, 0.5, 0.5, 1.0, 7, 7], [25, 31.8]), ('anchor rode and swing radius [4.2, 2.1, 1.0, 1.2, 4, 10]', [4.2, 2.1, 1.0, 1.2, 4, 10], [30, 39.3]), ('anchor rode and swing radius [1.1, 1.3, 0.4, 0.6, 5, 6]', [1.1, 1.3, 0.4, 0.6, 5, 6], [15, 20.9])], [('anchor rode and swing radius [2.5, 1.0, 0.2, 1.0, 7, 9]', [2.5, 1.0, 0.2, 1.0, 7, 9], [35, 43.8]), ('anchor rode and swing radius [2.0, 0.5, 0.5, 1.0, 7, 7]', [2.0, 0.5, 0.5, 1.0, 7, 7], [25, 31.8]), ('anchor rode and swing radius [4.2, 2.1, 1.0, 1.2, 4, 10]', [4.2, 2.1, 1.0, 1.2, 4, 10], [30, 39.3]), ('anchor rode and swing radius [1.1, 1.3, 0.4, 0.6, 5, 6]', [1.1, 1.3, 0.4, 0.6, 5, 6], [15, 20.9]), ('anchor rode and swing radius [4.0, 3.2, 0.6, 1.2, 5, 11]', [4.0, 3.2, 0.6, 1.2, 5, 11], [45, 55.6]), ('anchor rode and swing radius [4.0, 3.2, 0.6, 1.2, 4, 11]', [4.0, 3.2, 0.6, 1.2, 4, 11], [35, 45.5]), ('anchor rode and swing radius [8.0, 5.1, 0.3, 1.5, 3, 14]', [8.0, 5.1, 0.3, 1.5, 3, 14], [45, 57.9])], [('anchor rode and swing radius [4.2, 1.4, 0.4, 1.4, 5, 10]', [4.2, 1.4, 0.4, 1.4, 5, 10], [35, 44.5]), ('anchor rode and swing radius [3.0, 4.0, 1.0, 1.5, 5, 8]', [3.0, 4.0, 1.0, 1.5, 5, 8], [45, 52.7]), ('anchor rode and swing radius [4.0, 3.2, 0.6, 1.2, 5, 11]', [4.0, 3.2, 0.6, 1.2, 5, 11], [45, 55.6]), ('anchor rode and swing radius [4.0, 3.2, 0.6, 1.2, 4, 11]', [4.0, 3.2, 0.6, 1.2, 4, 11], [35, 45.5]), ('anchor rode and swing radius [8.0, 5.1, 0.3, 1.5, 3, 14]', [8.0, 5.1, 0.3, 1.5, 3, 14], [45, 57.9]), ('anchor rode and swing radius [2.5, 1.0, 0.2, 1.0, 7, 9]', [2.5, 1.0, 0.2, 1.0, 7, 9], [35, 43.8]), ('anchor rode and swing radius [6.0, 2.0, 2.0, 1.0, 5, 12]', [6.0, 2.0, 2.0, 1.0, 5, 12], [45, 56.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
anchor rode and swing radius [4.0, 3.2, 0.6, 1.2, 5, 11][40, 50.6][45, 55.6]Failed
anchor rode and swing radius [4.0, 3.2, 0.6, 1.2, 4, 11][30, 40.4][35, 45.5]Failed
anchor rode and swing radius [8.0, 5.1, 0.3, 1.5, 3, 14][40, 52.8][45, 57.9]Failed
anchor rode and swing radius [2.5, 1.0, 0.2, 1.0, 7, 9][30, 38.8][35, 43.8]Failed
anchor rode and swing radius [4.2, 1.4, 0.4, 1.4, 5, 10][35, 44.5][35, 44.5]Passed
anchor rode and swing radius [6.0, 2.0, 2.0, 1.0, 5, 12][45, 56.1][45, 56.1]Passed
anchor rode and swing radius [3.0, 4.0, 1.0, 1.5, 5, 8][35, 42.6][45, 52.7]Failed

SHA-256 / a481348b2890eb60ebc84c403a15bbfc78dd202783fb0f7910aa54f2ce7a7ff1

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,tmax,tmin,bow,scope,blen=x
    L=scope*(d+tmax+bow)
    L=math.ceil(L/5-1e-9)*5
    v=d+tmin+bow
    r=math.sqrt(L*L-v*v)+blen
    return [L,round(r,1)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('anchor rode and swing radius [4.0, 3.2, 0.6, 1.2, 5, 11]', [4.0, 3.2, 0.6, 1.2, 5, 11], [45, 55.6]), ('anchor rode and swing radius [4.0, 3.2, 0.6, 1.2, 4, 11]', [4.0, 3.2, 0.6, 1.2, 4, 11], [35, 45.5]), ('anchor rode and swing radius [8.0, 5.1, 0.3, 1.5, 3, 14]', [8.0, 5.1, 0.3, 1.5, 3, 14], [45, 57.9]), ('anchor rode and swing radius [2.5, 1.0, 0.2, 1.0, 7, 9]', [2.5, 1.0, 0.2, 1.0, 7, 9], [35, 43.8]), ('anchor rode and swing radius [4.2, 1.4, 0.4, 1.4, 5, 10]', [4.2, 1.4, 0.4, 1.4, 5, 10], [35, 44.5]), ('anchor rode and swing radius [6.0, 2.0, 2.0, 1.0, 5, 12]', [6.0, 2.0, 2.0, 1.0, 5, 12], [45, 56.1]), ('anchor rode and swing radius [3.0, 4.0, 1.0, 1.5, 5, 8]', [3.0, 4.0, 1.0, 1.5, 5, 8], [45, 52.7])], [('anchor rode and swing radius [4.0, 3.2, 0.6, 1.2, 4, 11]', [4.0, 3.2, 0.6, 1.2, 4, 11], [35, 45.5]), ('anchor rode and swing radius [2.5, 1.0, 0.2, 1.0, 7, 9]', [2.5, 1.0, 0.2, 1.0, 7, 9], [35, 43.8]), ('anchor rode and swing radius [4.2, 1.4, 0.4, 1.4, 5, 10]', [4.2, 1.4, 0.4, 1.4, 5, 10], [35, 44.5]), ('anchor rode and swing radius [6.0, 2.0, 2.0, 1.0, 5, 12]', [6.0, 2.0, 2.0, 1.0, 5, 12], [45, 56.1]), ('anchor rode and swing radius [3.0, 4.0, 1.0, 1.5, 5, 8]', [3.0, 4.0, 1.0, 1.5, 5, 8], [45, 52.7]), ('anchor rode and swing radius [10.0, 0.5, 0.1, 2.0, 4, 20]', [10.0, 0.5, 0.1, 2.0, 4, 20], [50, 68.5]), ('anchor rode and swing radius [5.0, 1.0, 0.5, 1.0, 6, 10]', [5.0, 1.0, 0.5, 1.0, 6, 10], [45, 54.5])], [('anchor rode and swing radius [8.0, 5.1, 0.3, 1.5, 3, 14]', [8.0, 5.1, 0.3, 1.5, 3, 14], [45, 57.9]), ('anchor rode and swing radius [3.0, 4.0, 1.0, 1.5, 5, 8]', [3.0, 4.0, 1.0, 1.5, 5, 8], [45, 52.7]), ('anchor rode and swing radius [10.0, 0.5, 0.1, 2.0, 4, 20]', [10.0, 0.5, 0.1, 2.0, 4, 20], [50, 68.5]), ('anchor rode and swing radius [5.0, 1.0, 0.5, 1.0, 6, 10]', [5.0, 1.0, 0.5, 1.0, 6, 10], [45, 54.5]), ('anchor rode and swing radius [2.0, 0.5, 0.5, 1.0, 7, 7]', [2.0, 0.5, 0.5, 1.0, 7, 7], [25, 31.8]), ('anchor rode and swing radius [4.2, 2.1, 1.0, 1.2, 4, 10]', [4.2, 2.1, 1.0, 1.2, 4, 10], [30, 39.3]), ('anchor rode and swing radius [1.1, 1.3, 0.4, 0.6, 5, 6]', [1.1, 1.3, 0.4, 0.6, 5, 6], [15, 20.9])], [('anchor rode and swing radius [2.5, 1.0, 0.2, 1.0, 7, 9]', [2.5, 1.0, 0.2, 1.0, 7, 9], [35, 43.8]), ('anchor rode and swing radius [2.0, 0.5, 0.5, 1.0, 7, 7]', [2.0, 0.5, 0.5, 1.0, 7, 7], [25, 31.8]), ('anchor rode and swing radius [4.2, 2.1, 1.0, 1.2, 4, 10]', [4.2, 2.1, 1.0, 1.2, 4, 10], [30, 39.3]), ('anchor rode and swing radius [1.1, 1.3, 0.4, 0.6, 5, 6]', [1.1, 1.3, 0.4, 0.6, 5, 6], [15, 20.9]), ('anchor rode and swing radius [4.0, 3.2, 0.6, 1.2, 5, 11]', [4.0, 3.2, 0.6, 1.2, 5, 11], [45, 55.6]), ('anchor rode and swing radius [4.0, 3.2, 0.6, 1.2, 4, 11]', [4.0, 3.2, 0.6, 1.2, 4, 11], [35, 45.5]), ('anchor rode and swing radius [8.0, 5.1, 0.3, 1.5, 3, 14]', [8.0, 5.1, 0.3, 1.5, 3, 14], [45, 57.9])], [('anchor rode and swing radius [4.2, 1.4, 0.4, 1.4, 5, 10]', [4.2, 1.4, 0.4, 1.4, 5, 10], [35, 44.5]), ('anchor rode and swing radius [3.0, 4.0, 1.0, 1.5, 5, 8]', [3.0, 4.0, 1.0, 1.5, 5, 8], [45, 52.7]), ('anchor rode and swing radius [4.0, 3.2, 0.6, 1.2, 5, 11]', [4.0, 3.2, 0.6, 1.2, 5, 11], [45, 55.6]), ('anchor rode and swing radius [4.0, 3.2, 0.6, 1.2, 4, 11]', [4.0, 3.2, 0.6, 1.2, 4, 11], [35, 45.5]), ('anchor rode and swing radius [8.0, 5.1, 0.3, 1.5, 3, 14]', [8.0, 5.1, 0.3, 1.5, 3, 14], [45, 57.9]), ('anchor rode and swing radius [2.5, 1.0, 0.2, 1.0, 7, 9]', [2.5, 1.0, 0.2, 1.0, 7, 9], [35, 43.8]), ('anchor rode and swing radius [6.0, 2.0, 2.0, 1.0, 5, 12]', [6.0, 2.0, 2.0, 1.0, 5, 12], [45, 56.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
anchor rode and swing radius [4.0, 3.2, 0.6, 1.2, 5, 11][45, 55.6][45, 55.6]Passed
anchor rode and swing radius [4.0, 3.2, 0.6, 1.2, 4, 11][35, 45.5][35, 45.5]Passed
anchor rode and swing radius [8.0, 5.1, 0.3, 1.5, 3, 14][45, 57.9][45, 57.9]Passed
anchor rode and swing radius [2.5, 1.0, 0.2, 1.0, 7, 9][35, 43.8][35, 43.8]Passed
anchor rode and swing radius [4.2, 1.4, 0.4, 1.4, 5, 10][35, 44.5][35, 44.5]Passed
anchor rode and swing radius [6.0, 2.0, 2.0, 1.0, 5, 12][45, 56.1][45, 56.1]Passed
anchor rode and swing radius [3.0, 4.0, 1.0, 1.5, 5, 8][45, 52.7][45, 52.7]Passed

SHA-256 / d7bc2391ab97d915c521b37f6f52df8e3ccbc40118f47be594401fb056aaece4

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

Case digest / 7a595b72bc66e8573314a0e78c65391586626edd561a6a1173e53a797a29d26c