Naval Gaming

The Naval Gaming spec

Written 2026-10-06 and signed off by Marlinspike the same day. It changes only by his decisions, each marked with his name and its date. This page is the spec, served at /spec/.

This is the rebuild's specification for the launch: single-player Battle Builder. It describes what the game does, in player terms, and the shape of the code that will do it. It covers only what Marlinspike kept for launch on 2026-10-06; everything else is listed under Later and Dropped.

1. Rules

What the game is

A game of manoeuvre and crew management (Marlinspike, 2026-10-08: "We want things that enhance the play of maneuver and the play of crew management. Officers is an example of a feature that will enhance crew management play."). A feature earns its place by making one of the two better to play.

Playability comes first, over history and realism, in mechanics as well as in numbers (Marlinspike, 2026-10-08). History and realism are where a value or a mechanic starts, never what it must stay; where they and play disagree, play wins, and the record says why. Fun is judged by playing, so Marlinspike's playtest is the last word. Playable means (Marlinspike, 2026-10-08):

  1. The game for its own sake: "something people play for its own sake" (2026-09-24), "not trying to simulate history" (2026-10-06), "released from historical precedent" (2026-10-07). Checked by: tests read their targets from the data, so a value moved for play passes.
  2. Responsive: an order shows its effect in seconds (the game clock, 2026-10-06; braking and sternway, 2026-10-07). Checked by: the physics and manoeuvre tests, against each class's handling stats.
  3. Paced: a fight lasts minutes, not hours; an even close action takes about five full broadsides (2026-10-09). Checked by: the pace report.
  4. Seamanship pays: a tack by hand is worth making, and every class can work to windward (2026-10-07). Checked by: the manoeuvre tests.
  5. Choices matter: where you put your ship and what you load change the outcome. A rake kills more than a beam hit, chain is for the rig, double for close in, and enemies that switch shot make each fight different (2026-10-07). Checked by: the shot tests.
  6. Readable: you can tell where everyone is and what your orders are doing; you can't fight what you can't place (2026-10-07). Checked by: Marlinspike's playtest.
  7. Every class worth playing, under manoeuvre: a smaller ship can beat a bigger one by outsailing it (2026-10-08). Not met yet. Checked by: the pace report's meeting scenario, and Marlinspike's playtest.

For every number

For every word

The gate

bin/cleanroom_check.sh (in the station repo, run from the projects root) passes on this repo, and Marlinspike signs off. Hits cleared by a citation are listed in cleanroom-accepted.txt at the repo root.

2. Behaviour

What the player sees and does at launch. Dates and "Marlinspike" mark his decisions; "proposed" marks a choice made in this draft for him to confirm.

The game

Naval Gaming is "something people play for its own sake" (Marlinspike, 2026-09-24), not a testbed for a sailing model. At launch it is one product, Battle Builder: you set up two lines of ships and fight in one of them, alone in your browser, with no account (Marlinspike, 2026-09-29).

Battle Builder

The shipyard

Tutorials

The island and grounding

Sailing: the helm

Sailing: sail

Wind

In Battle Builder and the tutorials the wind is steady for the whole engagement: one direction, one strength (Marlinspike, 2026-10-06). Its strength is a tuning guess, set by play. Corona del Mar's wind follows the clock (see Corona del Mar).

Gunnery

Hits

Crew

Morale and striking

NPC captains

The squadron and signals

The view

Sound

Marlinspike, 2026-10-12. Two things sound, the guns and the sea ("sea sound and gun sound is good, remove the rest"). Both are made in code from the physics of what produces them ("be serious about the realism"). The plan is docs/plans/sound.md; both can be heard on their own at /admin/sounds/, the admin section’s sound board (Marlinspike, 2026-10-12).

Accounts

Site stage 2, built 2026-10-12 (proposed; the decisions in it are Marlinspike's of that day). An account exists to carry a player's name; on day one it does nothing else (Marlinspike, 2026-10-12: "just exist with a username"). Saved progress, crew and officers come later on top of it. The game needs no account: Battle Builder plays without one, as before.

The logbook

Marlinspike, 2026-10-19: every battle and voyage is logged, full enough to recreate it, and shown on the account. The code is www/play/logbook/.

Multiplayer rooms

First after the launch (Marlinspike, 2026-10-09). The rules came through the crossings list as a description on 2026-10-14, and the transport and tickets as staged code (Marlinspike, 2026-10-14: split; guests may join). Built 2026-10-14, on dev and production: Battle Builder's Host a room, for a signed-in player, opens the battle as a room.

Boats

Marlinspike's rules (2026-09-27 to 2026-10-01), brought over 2026-10-14 (Corona 8). In Battle Builder and Corona del Mar; not yet in multiplayer rooms, where B does nothing (Marlinspike, 2026-10-14).

Corona del Mar

Being built, one piece at a time, from the crossings list (Corona 1 to 9). What is built so far is below; the rest stays on the Later list until it lands.

3. Controls

The sailing keys are Marlinspike's (2026-10-06): helm and sail on A/D and W/S, yards on Q/E and Z/C, auto-trim on F, a double tap for hard over. Since 2026-10-10 the helm steps a place a press, with no holding and no double tap, and sail is one key, S, stepping round none, topsails, full, and W and ↑ / ↓ are unbound (Marlinspike). The gun and signal keys are his too (2026-10-06). The rebuild plan asked for controls designed fresh; these are Marlinspike's choice as owner, made deliberately. A check before the launch found that the sailing keys match an earlier game's default layout, and Marlinspike kept them (2026-10-09: "keep the key layout, record it as my decision"). The controls panel is generated from the bindings, so this table and the game can't drift apart once the code exists.

The idea: the left hand sails and trims, the right hand fights, the mouse looks.

Keyboard

ActionKeyNotes
Helm to port / starboardA / D, or ← / →Held, the helm goes over; let go, it eases back amidships. Double tap: hard over, held until the helm is touched again (Marlinspike, 2026-10-14).
Make more sail / take in sailW / S, or ↑ / ↓One step: none, topsails, full (Marlinspike, 2026-10-14, as before 2026-10-10). Sail on the station bar, clicked or tapped, steps round none, topsails, full. In a boat, a stroke faster or slower.
Brace fore yards to port / starboardQ / ETurns auto-trim off. On the brigantine: her fore yards, as a brig's.
Brace main and mizzen yards to port / starboardZ / CTurns auto-trim off. On the cutter: the mainsheet (Marlinspike). On the brigantine: her gaff main's sheet, as the cutter's (Marlinspike, 2026-09-28).
Yards braced hard over, helddouble tap Q / E / Z / CThat group keeps bracing to the end of its range until one of its keys, or auto-trim, is touched (Marlinspike, 2026-10-07).
Auto-trim onFBoth yard groups follow the wind again (Marlinspike).
Sheet the headsails to port / starboardR / TThe cutter's too: her staysail and jib, sheeted together (Marlinspike, 2026-10-15; until then on Q / E, as her "jib"). Square-rigged ships and the brigantine: takes them off the fore yards until auto-trim; double tap: hard over, held (Marlinspike, 2026-10-07).
Port guns: Stand Down → Load → Fire at WillJEach press moves to the next order; the order in force shows on the station bar.
Starboard guns: Stand Down → Load → Fire at WillL
Port guns' ammunitionUBall → chain → double (Marlinspike, 2026-10-06; on U and O since 2026-10-07, above J and L). The game takes no Ctrl keys.
Starboard guns' ammunitionOBall → chain → double.
Boat: lower it, or go aboard the ship alongsideBSee Boats. Pressed again, stops the work. In the boat, Sail steps the stroke: hold water, easy, full, back water. On touch, ☰, then Boat.
Go ashore, or put to seaPCorona del Mar: see Corona del Mar.
Signal listTabOpens without pausing; ↑ / ↓ choose, Enter makes the signal; Tab or Esc closes it.
Slower / faster time, / .1×, 2×, 4×, 8×.
Pause menuEscWith the camera on the mouse, the first Esc frees the cursor and the next opens the menu. Time scale, Controls, Fight again, Leave.
Controls panelH
Log entryF1Opens the log entry card; see The logbook. Not F12, which stays the browser's (Marlinspike, 2026-10-19). On touch, ❚❚, then Log entry.
TelescopeShift, heldLooks from your deck along the camera; ship labels show in the glass (Marlinspike, 2026-10-06).
Camera closer / farther+ / −While the telescope is up, its magnification, 3× to 12×.
MapMOpens and closes the chart; the fight runs on. While it is open, + / − zoom it and Esc closes it (Marlinspike, 2026-10-08).
Minimap rangeNSteps through three ranges, shortest to longest, in the deck view (Marlinspike, 2026-10-08).

While the signal list is open, ↑ / ↓ move through the list and ← / → do nothing. A / D / W / S, the yards and the gun keys stay live (Marlinspike, 2026-10-06).

Mouse

ActionInput
Look aroundThe mouse, once a click on the sea has given it the camera; the camera holds where you point it. Esc frees the cursor.
Camera distanceWheel; while the telescope is up, its magnification.
Station barClick a gun side to cycle its order; the same command as the key.
Signal listClick a signal to make it; the list closes. A click on the sea closes it (Marlinspike, 2026-10-12).
MapWheel zooms; drag pans.
MinimapClick it to step its range, the same as N.

Touch

A phone or tablet plays the same game (Marlinspike, 2026-10-10): every touch button is one of the keys above, pressed and let go, so a touch player and a keyboard player sail the same ship, and the yards' hold and double tap work the same. The touch controls show on a touch screen, held either way up; upright, the view keeps its width across, so it shows more sea and sky top to bottom rather than narrowing. Added to the home screen, the game runs without the browser's bars.

Portrait first (Marlinspike, 2026-10-10: "this really is best in portrait"; "keep both, portrait first"). A phone is laid out upright first; held sideways it still plays, and a tablet uses that layout. New touch controls are designed for portrait, then fitted to landscape.

ActionTouch
Helm◀ ▶ under the thumbs, held and double tapped as A and D are (Marlinspike, 2026-10-14): held sideways, a pad at the bottom left; upright, the two halves of a row along the foot. The button lights while the helm is hard over its way.
SailTap Sail on the station bar (Marlinspike, 2026-10-10).
BracingThe Trim panel, opened from its button: a row for each yard group, the headsails first (on the cutter, the headsail and main sheets; on the brigantine, Main is her gaff's sheet), with ◀ ▶, held or double tapped like their keys, and Auto. Auto, or a touch on the sea, closes the panel; it stands over the minimap (Marlinspike, 2026-10-10). Bracing on touch is a deliberate act, not a reflex; he chose it over auto-trim only, so that touch players keep it as a tool for manoeuvre.
Guns, ammunitionTap the station bar, as it is clicked.
Look aroundDrag a finger on the sea.
Camera distancePinch.
Pause menu❚❚, in the strip: a column under the minimap upright (in its place while it is hidden, Marlinspike, 2026-10-12), a row along the top sideways. It also closes the map, as Esc does. The time scale is set in the pause menu; the strip has no time button (Marlinspike, 2026-10-10).
Telescope, map, signal list☰, in the strip, opens a menu of Glass, Map and Signals; choosing one closes it, and so does a touch or click on the sea (Marlinspike, 2026-10-10, 2026-10-12). ☰ lights while any of them is up.
TelescopeGlass: a tap raises it and the next lowers it, so two fingers are free to pinch its magnification. On the keyboard it is held; on touch, holding a button while pinching takes three fingers.
MapOne finger drags the chart, two pinch it (Marlinspike, 2026-10-10).
Signal listTap a signal to make it; the list closes. A touch on the sea closes it (Marlinspike, 2026-10-12).
Minimap rangeTap the minimap.
Hide the compass or minimapThe small button on its corner hides it, and the tab left in its place brings it back (Marlinspike, 2026-10-10). Upright, the minimap's tab stands under the strip, which rises into its place (Marlinspike, 2026-10-12).

The bindings carry each control's touch form, so the guide's touch table and the in-game Controls screen on a touch screen are generated from them, as the keys' are.

Not bound at launch

Gamepad and rebinding. Keys for later features (range rings) are not reserved; they are chosen when those features are specified.

4. Ships

Five classes at launch (Marlinspike, 2026-10-06): four square-rigged, sharing one rig model, and one fore-and-aft cutter with its own. A sixth, the brigantine (Marlinspike, 2026-10-16), has a rig model of her own, both rigs at once, and sails only in the shipyard's Sea Trial: unarmed, she is no warship. Each class takes its numbers from one real ship or class, cited below. Where armament varied from ship to ship, the class takes its cited ship's exactly and notes the variance (Marlinspike, 2026-10-06). The real ship is the source, not a name in play: in the game a class is "the First Rate", "the Seventy-four" and so on, and individual ships get placeholder names and numbers (Marlinspike, 2026-10-01).

Confidence: H consistent across sources or from a primary or academic text; M one secondary source; L an uncited page or a clash. Source keys are in Sources. Draught is missing for five of the six and best speed for four. Those cells say so; they are not to be filled from memory.

First Rate: HMS Victory (1765), as at Trafalgar, 1805

Source: [VICTORY], which cites Goodwin, Lavery and Winchester.

ValueConf.
Length on the gundeck / keel186 ft / 152 ft 6⅝ inH
Beam / depth in hold51 ft 7½ in / 21 ft 6 inH
Burthen2,142 bmH
Draught, victualled24 ft 3 in forward, 25 ft 6 in aftM
Lower gundeck30 × 32-pdrH
Middle gundeck28 × 24-pdrH
Upper gundeck30 × 12-pdrH
Quarterdeck12 × 12-pdr, 2 × 68-pdr carronadesM
Forecastle2 × 12-pdr, 2 × 68-pdr carronadesM
Complementabout 850M
Rigship, three masts; 6,510 sq yd of sailM
Speed"up to 11 knots"; 7–8 knots in a topgallant gale (point of sail not given)M

Seventy-four: the Arrogant class

Source: [ARROGANT], which cites Winfield 2007, pp. 64 and 77, and Lavery 1984, p. 176.

ValueConf.
Length on the gundeck / keel168 ft / 138 ft 10 inH
Beam / depth in hold46 ft 9 in / 19 ft 9 inH
Burthen1,614 bmH
Draughtcitation needed
Lower gundeck28 × 32-pdrH
Upper gundeck28 × 18-pdrH
Quarterdeck14 × 9-pdrH
Forecastle4 × 9-pdrH
Complement550 (first batch), 600 (second)H
RigshipH
Speedcitation needed

Frigate: HMS Shannon (1806), a 38 of the Leda class

Sources: [SHANNON], [LEDA], citing Winfield 2007 and Gardiner 2000 (no pages given).

ValueConf.
Length on the gundeck / keel150 ft 2 in / 125 ft 6½ in (the class page: 150 ft 1½ in / 125 ft 7⅞ in)H
Beam / depth in hold39 ft 11⅜ in / 12 ft 11 in (the class page: 12 ft 9 in)H
Burthen1,065 bmH
Draughtcitation needed
Upper deck28 × 18-pdrH
Quarterdeck2 × 9-pdr, 12 × 32-pdr carronades, Shannon's own and the figure used (armament varied by ship; the class page gives 8 × 9-pdr, 6 × 32-pdr carronades, noted only)M
Forecastle2 × 9-pdr, 2 × 32-pdr carronadesM
Complement284, later 300M
RigshipH
Speed"13 knots running large, 10 knots close-hauled"; "unweatherly" against frigates of British lines (Gardiner, via [LEDA])M

Shannon is also the source of the best-recorded single-ship action of the period: it took Chesapeake in 11 minutes (see Pacing).

Brig: the Cruizer class brig-sloop

Source: [CRUIZER], which cites Winfield 2008, pp. 282 and 291.

ValueConf.
Length overall / keel100 ft / 77 ft 3½ inH
Beam / depth in hold30 ft 6 in / 12 ft 9 inH
Burthen382 bmH
Draughtcitation needed
Armament16 × 32-pdr carronades, 2 × 6-pdr bow guns, one deckH
Complement121H
Rigbrig: two masts, square-riggedH
Speed"fast sailers and seaworthy"; no figureM

The brig's broadside is all carronade: heavy at close range and short-ranged. That is a real difference between classes, and play should keep it.

Cutter: HMS Surly (1806), Cheerful class

Source: [SURLY], which cites Winfield, British Warships in the Age of Sail 1817–1863, 2014, p. 267 (the later volume). Kept (Marlinspike, 2026-10-06): built in 1806, it is in period; an earlier cutter replaces it only if a better-suited one turns up.

ValueConf.
Length overall / keel63 ft / 46 ft 9⅜ inM
Beam / depth in hold23 ft 6 in / 10 ftM
Burthen137 bmM
Draughtcitation needed
Armament10 × 12-pdr carronades, 2 × 4-pdrM
Complement50M
Rigsingle-masted, fore-and-aft: citation needed (general knowledge, not yet sourced)
Speedcitation needed

Brigantine: the merchant brigantine Amazon (1861), later the Mary Celeste

Source: [CELESTE]. Chosen (Marlinspike, 2026-10-16): no brigantine of the period with her particulars on record turned up, and she is well documented. Her numbers are as built, before the 1872 rebuild. A trader, not a warship: no guns, and a small crew (Marlinspike, 2026-10-01); handling goes by shares of the crew, so she sails the same however few they are.

ValueConf.
Length99.3 ft (the source does not say which length)M
Beam / depth in hold25 ft 6 in / 11 ft 8.4 in. The beam clashes: 25.5 ft from her registration documents in the source's text, 22.5 ft in its summary table. The game takes 25.5.L
Tonnage198.42 gross tons: a register tonnage, not builder's measure, taken as her burthenL
Draughtcitation needed
ArmamentnoneM
Complement8: not given as built; her master and seven crew on her 1872 voyageM
Rigbrigantine: two masts, a square-rigged foremast and a fore-and-aft mainM
Speedcitation needed

Her best speed (9 knots), her closest angle (5 points, between the cutter's 4 and the brig's 6), her handling times and her whole rig model are tuning guesses, set by play.

What each class needs that history doesn't give

These are tuning guesses, set by play, until a source turns up:

5. Physics

How the sim works out speed, turning, shot, hits and morale, and where each number comes from. Every quantity below is either cited (source keys in Sources), derived by stated physics from cited quantities, or marked tuning guess or citation needed.

The sim core runs on a fixed step with a seeded random number generator, so the same inputs give the same battle (Architecture). The water is flat for physics; swell is drawn, not simulated.

Speed: the polar

Each class has a polar: its best speed through the water at each angle off the true wind, under full sail, in the engagement's wind. Polars are generated by a small sail-force model and stored as JSON tables, one per class (from its rig's inputs and its own closest angle), so the clean-room check can compare them as tables. The model has few inputs, each with its source:

InputSquare rigFore-and-aft (cutter)Source
Closest angle at which the sails fillbetween 6 points (67.5°) for the best ships and 7 points (78.75°) for most; each class's own, set by play (below)4 points (45°)Willis 2003, H
Leeway, close-hauledabout 1 point (11¼°) for most ships; ¼ point for the bestcitation neededWillis 2003, H
Close-hauled speed as a share of best10 of 13 knots for the frigate's classcitation needed[LEDA], M
Best speedFirst Rate "up to 11 knots"; frigate 13 knots running largecitation needed[VICTORY], [LEDA], M
Angle of best speedtuning guess (wind on the quarter)tuning guess
Dead before the windtuning guess (below best: the after sails blanket the fore)tuning guess

The brigantine's rig model (Marlinspike, 2026-09-28; built 2026-10-16) is both at once: fore yards that brace round as far as a brig's, a gaff main and staysails sheeted as the cutter's, and headsails as a square rig's, each group trimmed its own way. Every input is a tuning guess. Her close-hauled share is lower than the other rigs' (0.57), since her fore yards barely fill there; it is set where her fitted lift lands with theirs. Her windward angle is 57½°, inside the brig's 62½°.

Leeway matters: at 7 points close-hauled with a point of leeway, a ship makes good 8 points and gains no ground to windward (Willis 2003). The sim models leeway as a sideways drift, so this comes out of the model rather than being written in. Play uses half a point close-hauled (Marlinspike, 2026-10-07: weatherliness was too harsh). Willis's range, a quarter point for the best ships to a point for most, is the note, not a limit.

Weatherliness is a class trait (Marlinspike, 2026-10-07). With every square-rigger at 7 points, none could gain ground to windward, so the weather gage could be kept but never won. Each class now has its own closest angle, set by play, and the no-go zone grows from each class to the next larger (Marlinspike, 2026-10-09): the brig 6 points, the handy one; the frigate 6½; the Seventy-four 6¾; the First Rate 7, the most leewardly. Willis's 6 to 7 points is the note, not a limit. The frigate's class was "unweatherly" (Gardiner via [LEDA]), nearer 7 than 6; play moved it to 6½. Sailed full and by in 8 m/s of wind, the cutter gains about 3.8 knots to windward, the brig 2.5, the frigate 1.9, the Seventy-four 1.2 and the First Rate 0.8.

Pinching (Marlinspike, 2026-10-09; tried and dropped on 2026-10-07, brought back in this form). Each side of the no-go zone has a shoulder where she pinches: inside the closest angle her sails still draw, at falling speed, down to nothing at the shoulder's inner edge. Inside that is the dead core. Each shoulder is a share of the whole no-go wedge (twice the closest angle), so it grows with the wedge from cutter to First Rate; the share is the pinch lever (Pacing), a tuning guess set by play, at 15%: cutter 13½°, brig 20°, frigate 22°, Seventy-four 23°, First Rate 23½°. A shoulder is held to the sail's luff angle: past it, a square sail braced hard round is aback, not pinching. Pinched a little inside the closest angle, a square-rigger makes more ground to windward than sailed full and by: in 8 m/s, at her best, the brig about 2.6 knots, the frigate 2.35, the Seventy-four 1.7, the First Rate 1.45. The cutter gains nothing by it. The compass rose shows the shoulders pale and the core darker. Captains pinch too (Marlinspike, 2026-10-09): each class's windward angle, where she makes most ground to windward with her leeway allowed for, is worked out with her polar, and a captain sails no closer than that: about 10° inside the closest angle for the First Rate, 5° for the brig, at it for the cutter.

Speed: from polar to speed

Turning

Sail handling

Guns: rate of fire

Guns: crews

GunCrewSource
32-pdr9–14[GUN32], M
24-pdr12 and a powder boy[GUN24], [DRILL], M
18-pdrcitation needed
12-pdr8 and a boy[DRILL], M
9-pdrcitation needed
6-pdr, 4-pdr6 and a boy (6-pdr)[DRILL], M
Carronades"a much smaller crew"; number citation needed[DRILL], [CARRONADE]

A gun with fewer men than its crew reloads more slowly, in proportion (tuning guess).

Guns: the shot

Hits

Morale

6. Pacing

"I loved the idea of pacing and testing of pacing and making adjustments accordingly" (Marlinspike, 2026-10-06). Pacing is a design principle: how long fights last is measured, given a target, and adjusted by a few known levers, never by editing ship data.

History as the anchor

Real actions ran from minutes to hours. These are the anchors the time scales start from:

ActionDurationLosses, killed / woundedHow it endedSource
Shannon vs Chesapeake, 1 June 181311 minutesShannon 23 / 56; Chesapeake about 60 / about 60 of 379boarded and carried[CHESAPEAKE], M
Constitution vs Guerriere, 19 Aug 1812about 15 minutes of close broadsidesConstitution 7 / 7; Guerriere 15 / 78 of 272all three masts gone[GUERRIERE], M
United States vs Macedonian, 25 Oct 1812about 3 hoursUnited States 7 / 5; Macedonian 43 / 71 of 301dismasted[MACEDONIAN], M
Constitution vs Java, 29 Dec 1812about 3 hours from sightingJava 22 / 102 of 426; Constitution 9 / 57dismasted, about to be raked[JAVA], M
Glorious First of June, 1794about 3–3½ hours of main actionabout 1,200 British7 French ships of the line taken[FIRSTJUNE], M
Trafalgar, 21 Oct 1805about 5¾ hours (11:50 to 17:30)British 458 / 1,20817 ships taken, one burning[RMG], [TRAFALGAR], H

A close frigate action could be decided in a quarter of an hour; manoeuvring to it took hours. The game compresses the manoeuvring far more than the fighting.

Targets

An even close action takes about five full broadsides (Marlinspike, 2026-10-09, "increase from 3 broadsides to 5"; it was three from 2026-10-07): two ships of the same class lying abreast at close range, every gun bearing, exchange about five full broadsides before one strikes. On the game clock that is about five minutes for a frigate (reload lever 3). In a fight under sail the same weight of shot comes as partial broadsides, as guns bear, spread over several minutes. The pace tool reports broadsides for every pair; nothing fails on the target yet. Marlinspike may set more, possibly by class: a first-rate's fight may run longer than a cutter's.

Chain brings masts down in minutes (Marlinspike's target, 2026-10-02, brought over 2026-10-08; a tuning guess, set by play): a first rate firing only chain at a frigate brings the frigate's first mast down about 2 minutes after its first rig hit, and all three in about 5. The pace tool reports it; nothing fails on it yet.

The pace tool

Built from the start, alongside Studio. It runs fights headless and deterministically, for every pair of the five classes, each class against itself too (fifteen pairs; Marlinspike's target is set on equal ships), over fixed seeds and set scenarios, and reports how long each took and what each side lost, against the targets once they exist.

Its scenarios (2026-10-06): a meeting, where both ships' captains sail and fight from 2,000 m apart, one starting 50 m off the other's line, once to each side: head-on, each captain's first turn was a tie broken by rounding, and it decided the fight (2026-10-14); and stand-up duels, two ships lying broadside to broadside at 100, 400 and 1,000 m, no sail, the engaged sides at Fire at Will from the start, which test gunnery and morale alone. Its report is docs/pace/report.md.

The levers

Pacing is adjusted only through these, kept in one file:

  1. Time scales: reload, crew movement between stations, sail handling. Symptom it fixes: everything is too slow, or too fast, overall.
  2. Accuracy: what share of a broadside hits, by range: it divides both dispersion and the misjudged range. Symptom: nobody hits, or every shot hits.
  3. Hit effect: casualties per hull hit, drive lost per rig hit. Symptom: fights are too bloody, or hits do too little.
  4. Breaking point: the losses that make a ship strike, and how fast morale recovers. Symptom: ships strike too soon, or fight to the last man.
  5. Weatherliness (Marlinspike, 2026-10-09): the pinch shoulders of the no-go zone (Physics). Symptom: ships can't work to windward, or claw up it too easily.

Each lever has a global value and optional per-class overrides, so classes can have different targets without forking the model. Naming the symptom first stops pulling whichever knob is nearest.

The log

Every lever change is logged with the pace tool's report before and after, on the same seeds, and its reason. A lever change with no log entry fails review.

Consistency rules

Tests between levers, run with the suite:

7. Architecture

The shape of the code. These are lessons stated as design (rebuild plan, 2b), not a description of any earlier code. Where a choice is mine rather than the plan's, it says "proposed".

Stack

One pure sim core

One world, two sims

One world, two sims (Marlinspike, 2026-10-18). Corona del Mar is one world: one chart, one clock and its wind, one town, one voyage, one set of ships. It is seen from two places, the deck and the quay, and each is its own simulation over the same world. The sea sim steps ships; the walking sim steps a ped. Neither moves the other's bodies: a ship at the quay is the sea sim's, a ped on her deck is the walking sim's. Nothing is built twice: a second chart, a second town or a second copy of a ship's state for the other view is a fault.

The walking sim runs on the server, as the sea sim does for a room, so that in time players may meet ashore (Marlinspike, 2026-10-18). The plan is docs/plans/one-world-two-sims.md.

From one level to another only by a stair (Marlinspike, 2026-10-19: "stairs only"). A ped walks no ground steeper than 45 degrees, up or down. The town's ground is gentler than 14; a stair climbs about 35, and he walks it as a slope; a wall's face, a pier's or a mole's edge is sheer, and he slides along it as along a house. So the sea wall's top, the pier and the moles are reached by their stairs; a stair that runs along the sea wall ends in a level landing, and he steps sideways between it and the wall. The piers' piles, the palms, the shophouses' walkway posts and the flagstaff's plinth are solid too (Marlinspike, 2026-10-19: "make the piles, palms, posts and plinth solid"): he walks round a post, sliding along its edge, and along the plinth's faces as along a house. A post stops him only where it stands up above his ground, so the piles below the sea wall's top don't stop him on it.

One command layer

One ship-state shape

Ships as data, with a schema

Every tunable stat is derived

Studio

Tests from the first commit

Layout

Adopted with the first module (Marlinspike, 2026-10-06). Tests sit beside each module (rng.js and rng.test.js), so they are served with it; they hold nothing private. The test that no served file names another game waits until Marlinspike gives the names to look for; until then bin/cleanroom_check.sh covers it.

www/                  the docroot (as now)
  play/               the game page and its modules
    core/             the sim core: no DOM
    view/             3D view, HUD, menus: read the core's state
    input/            keyboard, mouse, station bar: issue commands
    data/             ship classes, polars, levers (JSON)
  spec/               this spec
  vendor/three/       three.js, vendored
tools/                pace tool, Studio, polar generator: run the core under Node
package.json          npm test: node --test, then tsc --noEmit (TypeScript is a dev tool, not served)

8. Sources

Every source cited in this spec. Pages marked fetched were read on 2026-10-06; books and articles marked read were read in full text. Nothing here comes from a game or game data.

Web pages (fetched 2026-10-06)

KeyPageWhat it cites
[VICTORY]HMS VictoryGoodwin; Lavery; Winchester
[ARROGANT]Arrogant-class ship of the lineWinfield 2007, pp. 64, 77; Lavery 1984, p. 176
[SHANNON]HMS Shannon (1806)Winfield 2007
[LEDA]Leda-class frigateWinfield 2007; Gardiner 2000
[CRUIZER]Cruizer-class brig-sloopWinfield 2008, pp. 282, 291
[SURLY]HMS Surly (1806)Winfield 2014, p. 267
[CELESTE]Mary Celeste (fetched 2026-10-16)her registration documents
[ARTILLERY]Naval artillery in the Age of Sail
[GUN32]32-pounder gunGoodwin, HMS Victory Pocket Manual; McConnell 1988
[GUN24]24-pounder long gun
[CARRONADE]Carronade
[DRILL]navyandmarine.org: gun drill
[BROADSIDE]nelsonsnavy.co.uk: broadside
[GUERRIERE]USS Constitution vs HMS Guerriere
[MACEDONIAN]USS United States vs HMS Macedonian
[JAVA]HMS Java (1811)
[CHESAPEAKE]Capture of USS Chesapeake
[TRAFALGAR]Battle of TrafalgarGoodwin; Adkins
[FIRSTJUNE]Glorious First of June
[RMG]rmg.co.uk, the Trafalgar timeline

Books and articles

Looked for, not found

Not used

9. Later and dropped

Later (Marlinspike, 2026-10-06, plus sound the same day): shifting wind and a building sea; range rings (the brigantine was built 2026-10-16, for the shipyard: see Ships; boats, prizes and taking to the boat when struck were built 2026-10-14: see Boats); crew carried between battles (built 2026-10-16 for Corona del Mar: see Corona del Mar); crew figures; real-nation ensigns; multiplayer rooms (built 2026-10-14: see Multiplayer rooms); the rest of Corona del Mar (its sea, town, port and clock wind were built 2026-10-14, the Cabal at sea 2026-10-15: see Corona del Mar); shipyard pages; saved progress (sign-in itself was built 2026-10-12: see Accounts); a welcome video. (Gun sound was built 2026-10-12 as the full soundscape: see Sound.)

Dropped (Marlinspike, 2026-10-06): riding as a passenger on an ally's ship; the explored chart; frame reports; any tool that builds numbers from another game's data; the inherited admin, dossier, rank, register and decoration pages.

10. Open for Marlinspike

Nothing open: all eight items were decided by Marlinspike on 2026-10-06.