navigation · epigraphy of the sea

Some Lights Are Only Themselves

At night a lighthouse has no shape. It has no colour you can trust at ten miles and no tower you can see. It has a rhythm, and the rhythm is its name. Here are the lights of one real stretch of coast, at their true bearings, keeping the exact timings their own entry prints.

Artificial Wasteland · sources: NGA List of Lights Pub 110 to 116; US Chart No. 1 (NOAA/NGA) · lights parsed · every number below recomputed by research/list-of-lights/

Every light above is a real record. Its position is the position printed in the list, its bearing is measured from the observer's position given under the table, and its flashing is the schedule its own entry states, second by second. Nothing here is stylised: when a light shows fl. 0.5s, ec. 9.5s, it is lit for half a second and dark for nine and a half. Where the list gives a period but no breakdown of it, the table says class instead of printed and the flash length is reconstructed from what the rhythm class means, which is a guess at the shape and not at the period.

The seen to column is worth a look. A light's advertised range is a promise about its lamp, not about the planet: past a certain distance the curve of the Earth takes it away whatever its candlepower. The column shows the smaller of the two, computed from the light's charted height and an eye five metres above the water. On the second horizon there is a light advertised at fifty-four nautical miles that the Earth cuts to under seventeen.

That is the whole trick of a coast at night. A ship cannot see shape, so the shore speaks in rhythm. The vocabulary is small and old: a light is fixed if it never changes, flashing if the dark is longer than the light, occulting if the light is longer than the dark, isophase if they are equal, quick if it flashes about once a second, and it may come in groups, two at a time or three, with a period after which the whole pattern repeats. Written down, that is a character: Fl.(3)W. 15s is three white flashes every fifteen seconds, and somewhere on the earth there is a tower that does exactly that and a book that says which one.

Time one

Here is a light with its name withheld. It is a real entry from the list. Watch it, count the flashes in a burst, then time how long until the burst comes round again, and pick its character. There is a stopwatch if you want one, but a watch and a count is all a mariner has ever had.

watch: not started

The stopwatch reports the mean interval between your taps, which is what a mariner reads off a watch after counting several cycles. Your error is yours: this page measures no one else and claims nothing about what anybody else can do.

The book, and how small its alphabet is

The National Geospatial-Intelligence Agency publishes the List of Lights in seven volumes covering the coasts of the world outside the United States, and publishes it as data rather than only as a book. Fetched whole and parsed, it gives records, of which are lights with a position and a readable character. Those lights carry distinct characters between them.

Forty thousand lights and about fifteen hundred ways to blink. The alphabet is small because it is built out of round numbers: almost every period is an integer number of seconds, and the integers people choose are not spread evenly.

Periods in use across the corpus. The bars are counts of lights, and the spikes are the numbers a designer reaches for.

Small alphabet, forty thousand words to spell. Collisions are guaranteed somewhere. The question that matters is whether they are guaranteed here, close enough that one ship can see both at once.

How far away is your twin?

Take a light, and search outward until you find another light a mariner could not tell from it: same rhythm, same figure in the group, same period as printed, and a colour they have in common. That distance is the light's margin. Do it for all of them and the answer is not one distribution but two, laid on top of each other.

Distance to the nearest confusable light, log scale. The left hump is a class of lights whose twin is a few hundred metres away.

The left hump is not a scandal. It is the system working. A great many of the lights with a twin at a few hundred metres are leading lights: two lights set behind one another so that a ship sees them in line only when it is in the safe channel. They are meant to be a pair, and they are frequently given the same character on purpose, because the message is the alignment and not the identity.

Which is exactly what the standard says. US Chart No. 1, the joint NOAA and NGA key to chart symbols, introduces the international buoyage system with a sentence that turns out to be the whole story:

Where in force, the IALA System applies to all fixed and floating marks except landfall lights, leading lights and marks, sectored lights and major floating lights.

and a note in its section on lights:

Note: Minor lights, fixed and floating, usually conform to IALA Maritime Buoyage System characteristics.

Read together, those two sentences say the world's lights are running two vocabularies at once. In one, a character is a place: this flash belongs to this tower and to no other, and a second tower using it is a hazard. In the other, a character is a thing: quick flashing in groups of six with a long flash on the end means deep water lies to the south of me, and every mark in the world that means that is supposed to say it the same way. In the second vocabulary, repetition is not a failure. It is the point.

The standard draws that line by category, in prose. The question this page can actually settle is whether the line is visible in the positions alone.

The test, and the null it is measured against

Count the lights that have at least one confusable light within ten kilometres. That number on its own means nothing, because lights cluster in harbours and harbours are where lights are. So it is compared against a world that is identical in every respect except one: the same lights, in the same positions, carrying the same characters, but with the characters dealt out at random among them. Do that a thousand times and you have a distribution of what accident produces.

The dealing can be done more or less locally, and the ladder matters. Shuffling the whole world lets a Norwegian character land in Java. Shuffling inside one country holds national habit fixed. The strictest rung shuffles only inside a one degree box, about a hundred kilometres on a side, so no regional fashion can produce the effect.

Lights with a confusable neighbour within 10 km, whole corpus, against each null. 1,000 permutations each.

So confusable lights do sit closer together than accident allows, and the effect survives the strictest shuffle. Now take the corpus apart along the line the standard drew.

The same test on subsets, against the one degree box null. Ratio above 1 means confusable lights sit closer together than chance; below 1 means they are further apart.

The sectored lights are worth pausing on, because the instrument is biased against the result. Two lights count as confusable here if their colour sets overlap, since a light showing white to seaward and red over a shoal looks like a plain white light from inside the white sector. That rule makes a three-colour light easier to match than a one-colour light, so a sectored light should collide more often for a purely mechanical reason. It collides less.

The great lights

The lights a landfall is made on, the ones with twenty and thirty mile ranges, are the purest case of the first vocabulary. A light that can be seen for thirty miles is speaking to a ship that has crossed an ocean and needs to know which coast this is.

By nominal range, leading lights removed, against the within-country null.

The same question, asked of a different book

Everything above rests on one compilation by one agency, read through one grammar written for this page, with the leading lights picked out by a regular expression over names. Any of those three could be producing the result on its own. So the whole test was run again on a corpus that shares none of them: OpenStreetMap's seamark data, compiled by volunteers, covering the United States that Pub 110 to 116 leave out, storing the character in separate tags that were never a string to be parsed, and carrying seamark:light:category as a tag, so the leading lights there are labelled by other people rather than inferred by me. It holds lights, including inside a box around the contiguous United States.

The same statistic and the same one degree box null, on OpenStreetMap. 1,000 permutations.

What the second corpus is not able to settle

Two predictions, written down first, and what happened to them

The predictions for this page were committed to the repository before the analysis script existed, which is checkable: git log on PREREGISTRATION.md against analyze.mjs. Both of the substantive ones came out wrong, in different and useful ways.

The one that was wrong about the world

The characters the standard fixes completely, ranked among all characters carried by at least 30 lights, by how much more often than chance they have a confusable neighbour within 10 km.

The one that was wrong about my own arithmetic

The pairs that are left

Both lights above are drawn from their own entries and started at the same instant, which is the one thing that is not real: two lights in the world are not phase locked, so in practice they drift against each other and a patient observer can sometimes separate them by watching for a long time. What cannot be separated is the character, which is what the book gives you and what a tired mate on a wet bridge wing is working from.

The check

The grammar is tested rather than trusted. Every characteristic in the corpus is parsed into a structure and then printed back out in the list's own notation, and the round trip must be the identity. Across characteristics there are 0 token-level failures. The residue is 22 records where NGA's own punctuation differs from its usual form, such as Q(6)+L.Fl.W. for Q.(6)+L.Fl.W. and Fl.(2).R. for Fl.(2)R., all of which parse to the same character.

That test only covers what the parser accepted, so the accounting of what it did not accept has to be separate and it is: records of are refused outright and listed by frequency in build-report.json. An earlier draft of this page said that number was zero. It was not: the parser was returning failures with a status field the build script read as "blank", so 234 real refusals were being filed as empty records. The bug changed no result, because those rows were excluded either way and the corpus is the same 40,559 lights before and after, but it did mean the page was printing a perfect score it had not earned. The fix is in engine.mjs with a comment saying what it cost.

The whole pipeline runs from the committed raw JSON: build.mjs makes the corpus, analyze.mjs runs every test at a fixed seed, scenes.mjs makes everything this page draws. The verifier verify-some-lights-are-only-themselves.mjs re-derives the numbers printed above from the artifacts and drives the page in a real browser.

What this does not show, and what it got wrong on the way