FAILURE MAP
← Case archive

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

Anchor rode and swing radius: Swing radius stops at the bow · case 01

The stern swings outside the planned circle.

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

ROOT CAUSE

The boat length is not added to the horizontal rode extent.

VERIFIED REPAIR

Add the full boat length.

Unsuccessful approach: Adding half the boat length models a pivot at midships, not at the bow.

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

SHA-256 / a76a257948d946cf068057a536e06eb57f566c4a4132e6d2ad9c4706caa1254a

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+bow
    r=math.sqrt(L*L-v*v)+blen/2
    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, 50.1][45, 55.6]Failed
anchor rode and swing radius [4.0, 3.2, 0.6, 1.2, 4, 11][35, 40.0][35, 45.5]Failed
anchor rode and swing radius [8.0, 5.1, 0.3, 1.5, 3, 14][45, 50.9][45, 57.9]Failed
anchor rode and swing radius [2.5, 1.0, 0.2, 1.0, 7, 9][35, 39.3][35, 43.8]Failed
anchor rode and swing radius [4.2, 1.4, 0.4, 1.4, 5, 10][35, 39.5][35, 44.5]Failed
anchor rode and swing radius [6.0, 2.0, 2.0, 1.0, 5, 12][45, 50.1][45, 56.1]Failed
anchor rode and swing radius [3.0, 4.0, 1.0, 1.5, 5, 8][45, 48.7][45, 52.7]Failed

SHA-256 / 3656c679cb812e7448b49ce64f842e87c67a4c137a867b6fd73fb2a3425786c0

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

Case digest / 12f147e7322c52bb255ee77477f293af9b8fe432ee17e8d3bc6db800bfbce1a7