DiveSite.configure() builds the height field once (TerrainHeightField
validates the data) instead of running the definition validation and
then the field construction again; the composition root relies on the
error returned by configure(). The collision shape takes the field's
row-major elevations directly instead of copying 263k cells one by one.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The target hull now lies along the groove axis (yaw derived from the
groove constants), set back 22 m from the groove end so both hull ends
rest on the flat groove floor. The mooring, spawn and first route
waypoints move to z = -210 and the decoy yacht to (-30, -150) so no
wreck is farther than 320 m from the mooring and no two wrecks are
farther than 260 m apart (spec 4.1). The spawn faces south toward the
site. Four contract assertions pin the budget, the spawn heading and
the hull orientation.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Zone 1 becomes the default dive site; the foundation suite still selects the
calibration site explicitly. Documents the site suites, the site content
workflow and the authored heightfield terrain (ADR 0012), and aligns the zone 1
brief with the baked data (storage format, route lengths, 6 m ridge and
pinnacles).
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The calibration site spawn sat 16 m from the south bounds edge, inside the
40 m warning margin. The vehicle_test recipe now extends the terrain and
playable bounds 42 m to the south so the spawn is inside the zone.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
MSYS mangles the single-byte separator argument on Windows, and the swallowed
rg error made the Input check pass vacuously.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
ripgrep prints backslash paths on Windows, so the infrastructure/input
exclusion never matched and the architecture check failed on a clean tree.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>