FAILURE MAP
← Case archive

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

Anchor rode and swing radius: Swing radius uses the high-water depth · case 01

The swing circle is underestimated and the boat can touch neighbours at low water.

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

ROOT CAUSE

The vertical leg uses tmax, the smallest horizontal extent.

VERIFIED REPAIR

Use the lowest tide for the largest radius.

Unsuccessful approach: Using the low-tide depth without the bow height overstates the vertical leg removal incorrectly.

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+tmax+bow)
    L=math.ceil(L/5-1e-9)*5
    v=d+tmax+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 [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]), ('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])]]
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.2][45, 55.6]Failed
anchor rode and swing radius [4.0, 3.2, 0.6, 1.2, 4, 11][35, 45.0][35, 45.5]Failed
anchor rode and swing radius [8.0, 5.1, 0.3, 1.5, 3, 14][45, 56.6][45, 57.9]Failed
anchor rode and swing radius [2.5, 1.0, 0.2, 1.0, 7, 9][35, 43.7][35, 43.8]Failed
anchor rode and swing radius [4.2, 1.4, 0.4, 1.4, 5, 10][35, 44.3][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][45, 52.2][45, 52.7]Failed

SHA-256 / 3e0b1db0041756c0ee6d942780eb58ac63e4e4b96bb6e6fba2e9b80afc1f94e5

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+bow)
    L=math.ceil(L/5-1e-9)*5
    v=d+tmin
    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 [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]), ('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])]]
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.8][45, 55.6]Failed
anchor rode and swing radius [4.0, 3.2, 0.6, 1.2, 4, 11][35, 45.7][35, 45.5]Failed
anchor rode and swing radius [8.0, 5.1, 0.3, 1.5, 3, 14][45, 58.2][45, 57.9]Failed
anchor rode and swing radius [2.5, 1.0, 0.2, 1.0, 7, 9][35, 43.9][35, 43.8]Failed
anchor rode and swing radius [4.2, 1.4, 0.4, 1.4, 5, 10][35, 44.7][35, 44.5]Failed
anchor rode and swing radius [6.0, 2.0, 2.0, 1.0, 5, 12][45, 56.3][45, 56.1]Failed
anchor rode and swing radius [3.0, 4.0, 1.0, 1.5, 5, 8][45, 52.8][45, 52.7]Failed

SHA-256 / 807db34494278642dc61d744a4f7735f8751e2280407c9219b45ebbebd5fe27c

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 [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]), ('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])]]
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 / 7d9ff45cc44f406a773226d748a237bc2f27ef7ffc2dd9700df8d059db193780

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

Case digest / 4855691d7e12ed7182b14bcb25a76d0cf965349c2ca3cd592ff2a0463a2eea77