colregs 0.2.4 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/PROVENANCE.md +3 -3
- package/README.md +19 -10
- package/data/applicability.json +219 -244
- package/data/corpora.json +41 -0
- package/data/editions.json +27 -0
- package/data/facts.json +4 -4
- package/data/geometry.json +8 -8
- package/data/i18n/en.json +27 -0
- package/data/i18n/fi.json +25 -0
- package/data/images.json +32 -32
- package/data/operations.json +79 -0
- package/data/rules.json +176 -599
- package/data/text/intl/2016/en-US.uscg.json +877 -0
- package/data/text/intl/2016/es.boe.json +23 -0
- package/data/text/intl/2016/fi.finlex.json +22 -0
- package/data/text/us/inland/2014/en-US.ecfr.json +22 -0
- package/data/version.json +1 -1
- package/docs/adr/0001-name-and-jurisdiction-model.md +42 -2
- package/docs/adr/0003-language-as-a-dimension.md +8 -7
- package/docs/adr/0006-json-schema-and-identifier-diff.md +2 -0
- package/docs/adr/0011-api-shape.md +1 -1
- package/docs/adr/0012-trace-and-rule2-departure-api.md +3 -4
- package/docs/adr/0013-corpus-files-with-editions.md +70 -0
- package/docs/adr/0014-engine-interface-owned-by-colregs.md +103 -0
- package/docs/adr/0015-rule-ids-are-paragraph-keys.md +191 -0
- package/docs/budgets.json +17 -17
- package/docs/gates.json +3 -3
- package/docs/identifiers.md +49 -51
- package/docs/maritime-sources.md +58 -0
- package/docs/normative-language.md +103 -0
- package/docs/part-b-invariants.md +31 -29
- package/docs/requirements.md +118 -97
- package/docs/timeline.md +102 -0
- package/docs/verification/2026-09-09-text-slug-straw-man.md +3 -2
- package/fixtures/applicability-fixtures.json +190 -190
- package/fixtures/situation-fixtures.json +287 -287
- package/package.json +1 -1
- package/schema/applicability-fixtures.schema.json +4 -13
- package/schema/applicability.schema.json +27 -27
- package/schema/conduct-evaluation.schema.json +135 -0
- package/schema/corpora.schema.json +68 -0
- package/schema/corpus.schema.json +329 -0
- package/schema/display-evaluation.schema.json +146 -0
- package/schema/editions.schema.json +47 -0
- package/schema/encounter-evaluation.schema.json +109 -0
- package/schema/evaluation.schema.json +149 -0
- package/schema/fact-record.schema.json +30 -0
- package/schema/i18n-catalog.schema.json +47 -0
- package/schema/operations.schema.json +124 -0
- package/schema/rule2-departure-finding.schema.json +72 -0
- package/schema/rule2-departure-model.schema.json +159 -0
- package/schema/rules.schema.json +20 -90
- package/schema/situation-fixtures.schema.json +10 -146
- package/schema/situation.schema.json +72 -0
- package/schema/trace.schema.json +33 -0
- package/data/deprecated-identifiers.json +0 -7
- package/schema/deprecated-identifiers.schema.json +0 -29
package/docs/requirements.md
CHANGED
|
@@ -79,7 +79,7 @@ Neither consumer lives in this repo.
|
|
|
79
79
|
exists. That bar is about suppression, not licensing: it is independent of
|
|
80
80
|
REQ-PROV-2 and ADR 0010, and it binds whether a jurisdiction's text ships or
|
|
81
81
|
is withheld. A delta that only *adds* entries is exempt: it suppresses nothing,
|
|
82
|
-
so the Q-11 hazard cannot arise from it (ADR 0008, `30a
|
|
82
|
+
so the Q-11 hazard cannot arise from it (ADR 0008, `rule:30a:mooring_buoy`/`rule:30b:mooring_buoy`).
|
|
83
83
|
A delta that suppresses or replaces an `intl` entry still waits.
|
|
84
84
|
- **REQ-SCOPE-4** — Adding a jurisdiction MUST be additive. It MUST NOT require
|
|
85
85
|
a schema change or edits to existing `intl` entries.
|
|
@@ -156,7 +156,7 @@ Four layers, each independently addressable.
|
|
|
156
156
|
identifiers do not.
|
|
157
157
|
- **REQ-MODEL-4** — **Applicability entries**: `when` (predicate over facts) →
|
|
158
158
|
lights or refs → modality → citation → jurisdiction. Every entry MUST have a
|
|
159
|
-
stable id
|
|
159
|
+
stable id, a paragraph key in the `rule:` namespace (`rule:25d_i`; ADR 0015).
|
|
160
160
|
- **REQ-MODEL-5** — Gates MUST be expressed as predicates over facts
|
|
161
161
|
(`fact:length_m < 7`), never as pre-enumerated tuples or configuration counts. Any
|
|
162
162
|
count of "configurations" is an output of evaluation, never an input to the
|
|
@@ -187,8 +187,8 @@ Four layers, each independently addressable.
|
|
|
187
187
|
ADR 0005 §4.
|
|
188
188
|
- **REQ-MODEL-12** — `rel:conditional_includes` currently carries three
|
|
189
189
|
distinct shapes under one relation name: a bare `one_of` alternative set
|
|
190
|
-
(`
|
|
191
|
-
import with its own citation (`when` + `rel:includes` + `cite`, `29a`). Which
|
|
190
|
+
(`rule:25d_ii`), a gated alternative set (`when` + `one_of`, `rule:27f`), and a gated
|
|
191
|
+
import with its own citation (`when` + `rel:includes` + `cite`, `rule:29a`). Which
|
|
192
192
|
behaviour applies is inferred from which keys are present. This is a
|
|
193
193
|
**soft** requirement — the data is correct today and the tests cover it,
|
|
194
194
|
so nothing is broken. It is recorded because a third jurisdiction adding
|
|
@@ -211,7 +211,7 @@ Four layers, each independently addressable.
|
|
|
211
211
|
denoted, MUST be marked deprecated in data with the version that
|
|
212
212
|
deprecated it, and MUST NOT be removed in the same major version.
|
|
213
213
|
- **Mutating** one is forbidden. This covers the obvious case (renaming
|
|
214
|
-
`25b`) and the dangerous quiet one: an identifier keeping its spelling
|
|
214
|
+
`rule:25b`) and the dangerous quiet one: an identifier keeping its spelling
|
|
215
215
|
while changing what it denotes — a paragraph path repointed at
|
|
216
216
|
different text, a fact value narrowed, a light id reassigned. A
|
|
217
217
|
consumer cannot detect this, and every stored citation becomes silently
|
|
@@ -225,29 +225,28 @@ Four layers, each independently addressable.
|
|
|
225
225
|
removing an identifier is a major version (REQ-PKG-4); repointing one is
|
|
226
226
|
not a version event at all, because it is not permitted.
|
|
227
227
|
|
|
228
|
-
**Immutability baseline: `0.
|
|
229
|
-
identifier present in
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
2026-08-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
re-stated in a later version, or joined by a second baseline clause. This
|
|
243
|
-
clause is the whole of the exception; there is no mechanism for granting
|
|
244
|
-
another. Without that, "move the baseline" is a silent escape hatch from
|
|
228
|
+
**Immutability baseline: `1.0.0`.** The prohibitions above bind every
|
|
229
|
+
identifier present in `colregs@1.0.0` and every identifier introduced
|
|
230
|
+
from then on. Identifiers as they stood before `1.0.0` are outside the
|
|
231
|
+
baseline: while the package is pre-1.0 the schema is being designed, and
|
|
232
|
+
an identifier may be renamed or discarded without a deprecation record.
|
|
233
|
+
The baseline was first set at `0.1.1` on 2026-08-30, the day after the
|
|
234
|
+
package was seeded, so that the identifier review this requirement calls
|
|
235
|
+
for could happen at all. It was moved to `1.0.0` by Solace's ruling on
|
|
236
|
+
#121 (ADR 0015, 2026-09-16), which reshaped every entry id into a
|
|
237
|
+
paragraph key in the `rule:` namespace.
|
|
238
|
+
|
|
239
|
+
From `1.0.0` the baseline is **fixed**. It MUST NOT be moved, raised,
|
|
240
|
+
re-stated in a later version, or joined by a second baseline clause.
|
|
241
|
+
Without that, "move the baseline" is a silent escape hatch from
|
|
245
242
|
REQ-MODEL-10 and the exception becomes the pattern — a specification that
|
|
246
243
|
can suspend its own prohibition by editing one number is advisory, not
|
|
247
|
-
normative.
|
|
244
|
+
normative.
|
|
248
245
|
|
|
249
246
|
`test/data.test.mjs` pins the baseline literal and asserts it is stated
|
|
250
|
-
exactly once.
|
|
247
|
+
exactly once. There is no identifier diff against the last release: ADR 0006
|
|
248
|
+
proposed one, ADR 0015 removed it pre-1.0, and it returns with the baseline
|
|
249
|
+
tag if at all. A build has no access to git history, so it cannot see the
|
|
251
250
|
number being *edited* in place; a test that reconstructed history to
|
|
252
251
|
check would cost more than it is worth and would still pass on a rewritten
|
|
253
252
|
history. What it can refuse is a **second** baseline clause, which is the
|
|
@@ -274,14 +273,18 @@ Four layers, each independently addressable.
|
|
|
274
273
|
names, not a modelling convenience of this package.
|
|
275
274
|
- **`nuc`, `cbd`, `ram`, `ram_underwater`** — kept unspelled as terms of
|
|
276
275
|
art; see `docs/identifiers.md` for the reasoning and the trap in `ram`.
|
|
276
|
+
|
|
277
|
+
ADR 0015 (Solace's ruling on #121, 2026-09-16) reopened the first two
|
|
278
|
+
bullets: an entry id is a paragraph key in the `rule:` namespace now, and
|
|
279
|
+
the suffix taxonomy went with it. They stand as the audit's record.
|
|
277
280
|
- **REQ-MODEL-11** — Deprecated identifiers MUST be recorded as data — a
|
|
278
281
|
registry naming each retired identifier, what it denoted, the version that
|
|
279
282
|
deprecated it, and its replacement where one exists. Prose in a changelog
|
|
280
283
|
MUST NOT stand in for it: a consumer pinned to an old version needs to
|
|
281
|
-
resolve a stale identifier mechanically. The registry is
|
|
282
|
-
`
|
|
283
|
-
|
|
284
|
-
|
|
284
|
+
resolve a stale identifier mechanically. **The registry is absent until
|
|
285
|
+
`1.0.0`.** ADR 0015 deleted it, and the diff that read it: nothing before
|
|
286
|
+
the baseline is immutable, so nothing before it can be retired, and an
|
|
287
|
+
empty file with a dormant test is a mechanism that cannot fire.
|
|
285
288
|
|
|
286
289
|
### 4.1 Rule categories and the situation record
|
|
287
290
|
|
|
@@ -438,8 +441,7 @@ official languages, and many states gazette their own legally binding
|
|
|
438
441
|
translation. (Recalled, not yet verified against the primary sources — Q-6.)
|
|
439
442
|
See ADR 0003.
|
|
440
443
|
|
|
441
|
-
- **REQ-LANG-1**
|
|
442
|
-
data)** — Language MUST be a dimension orthogonal to jurisdiction,
|
|
444
|
+
- **REQ-LANG-1** — Language MUST be a dimension orthogonal to jurisdiction,
|
|
443
445
|
identified by BCP 47 tags. Which body of rules applies and which text of
|
|
444
446
|
them is displayed are independent questions; neither MUST ever be inferred
|
|
445
447
|
from the other, and no property beyond the language of the text — not
|
|
@@ -452,8 +454,7 @@ See ADR 0003.
|
|
|
452
454
|
and renaming an identifier is a breaking change (REQ-PKG-4). Immutability
|
|
453
455
|
itself is REQ-MODEL-10; this requirement adds only that identifiers are
|
|
454
456
|
never localized.
|
|
455
|
-
- **REQ-LANG-3**
|
|
456
|
-
corpus per jurisdiction × language × source)** — Rule text MUST be storable
|
|
457
|
+
- **REQ-LANG-3** — Rule text MUST be storable
|
|
457
458
|
as a **corpus** per (jurisdiction × language × source), keyed by paragraph
|
|
458
459
|
path, holding at most one text per path, with corpus-level provenance and
|
|
459
460
|
one declared status tier:
|
|
@@ -468,8 +469,7 @@ See ADR 0003.
|
|
|
468
469
|
rule applies per corpus, against that corpus's own source.
|
|
469
470
|
- **REQ-LANG-4** — Adding a language MUST be additive: no schema change, no
|
|
470
471
|
edits to existing corpora or catalogs (the language mirror of REQ-SCOPE-4).
|
|
471
|
-
- **REQ-LANG-5**
|
|
472
|
-
are unwritten)** — Corpora MAY be partial. Coverage MUST be declared in
|
|
472
|
+
- **REQ-LANG-5** — Corpora MAY be partial. Coverage MUST be declared in
|
|
473
473
|
machine-readable form, and CI MUST fail on a corpus key that does not
|
|
474
474
|
resolve to a known paragraph path, and on a corpus filename that disagrees
|
|
475
475
|
with the file's internal metadata. Silence MUST NOT imply coverage (the
|
|
@@ -495,15 +495,13 @@ See ADR 0003.
|
|
|
495
495
|
- **REQ-LANG-8** — A `community`-tier corpus MUST record who produced and
|
|
496
496
|
who reviewed it. Machine translation without named human review MUST NOT
|
|
497
497
|
be accepted.
|
|
498
|
-
- **REQ-LANG-9**
|
|
499
|
-
form)** — Verbatim (REQ-MODEL-1) is defined at the Unicode level: each
|
|
498
|
+
- **REQ-LANG-9** — Verbatim (REQ-MODEL-1) is defined at the Unicode level: each
|
|
500
499
|
corpus MUST declare the normalization form applied to its text (NFC unless
|
|
501
500
|
declared otherwise) and MUST NOT insert or strip bidi control characters,
|
|
502
501
|
localize numerals, punctuation, units or quotation marks, or otherwise "fix"
|
|
503
502
|
the source text. Rendering direction is a consumer concern and MUST stay out
|
|
504
503
|
of the data.
|
|
505
|
-
- **REQ-LANG-10**
|
|
506
|
-
declares an amendment state)** — The structural skeleton MUST declare, as
|
|
504
|
+
- **REQ-LANG-10** — The structural skeleton MUST declare, as
|
|
507
505
|
data, the amendment state it consolidates (e.g. "COLREGS 72 as amended
|
|
508
506
|
through …"). Every corpus MUST declare the amendment state its source
|
|
509
507
|
reflects. The two MAY differ — a corpus transcribed from an older
|
|
@@ -527,8 +525,7 @@ See ADR 0003.
|
|
|
527
525
|
- **REQ-PROV-5** — Images MUST be addressable as data: an image record per file,
|
|
528
526
|
naming what it illustrates by entry id or paragraph path. Unexplained filename
|
|
529
527
|
prefixes are a provenance defect.
|
|
530
|
-
- **REQ-PROV-6**
|
|
531
|
-
rights are one flat field)** — Source identity MUST be structured data —
|
|
528
|
+
- **REQ-PROV-6** — Source identity MUST be structured data —
|
|
532
529
|
publisher, title, edition, publication and effective dates, URL, retrieval
|
|
533
530
|
date — not a prose string. Rights MUST be recorded separately for the source
|
|
534
531
|
text, for the basis on which this package redistributes it, and for the
|
|
@@ -699,20 +696,21 @@ Each gate names the declined design, the closing event, and the trigger.
|
|
|
699
696
|
second-jurisdiction bundle — justified by Q-11 and GATE-2, no longer by
|
|
700
697
|
a cross-jurisdiction trigger route.
|
|
701
698
|
|
|
702
|
-
-
|
|
703
|
-
(ADR 0003, declined; the adopted 80% is REQ-LANG-10).
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
699
|
+
- ~~**GATE-2 — instrument → edition → corpus as first-class layers**~~
|
|
700
|
+
(ADR 0003, declined; the adopted 80% is REQ-LANG-10). **Re-taken and
|
|
701
|
+
adopted, ADR 0013** — ahead of its due date (translation #1): the
|
|
702
|
+
edition registry lands directly, rather than waiting for the trigger
|
|
703
|
+
below to fire.
|
|
704
|
+
*Closing event, as declined*: the second corpus of any one jurisdiction
|
|
705
|
+
— which, read against ADR 0003's sequencing, means **the first
|
|
706
|
+
non-English corpus**, not a distant milestone. A French or Finnish text
|
|
707
|
+
of `intl` is a second corpus of `intl`. With one corpus, re-homing it
|
|
708
|
+
under an edition parent is a single file move; the cost scales with
|
|
709
709
|
corpora × languages immediately thereafter.
|
|
710
|
-
*Trigger*: a jurisdiction publishing two editions in force
|
|
710
|
+
*Trigger, as declined*: a jurisdiction publishing two editions in force
|
|
711
711
|
concurrently — an old and a new text running in parallel through a
|
|
712
712
|
transition period. REQ-LANG-10's declared amendment state makes such a
|
|
713
|
-
pair machine-visible, which is what
|
|
714
|
-
*Re-take required before translation #1 lands* — the edition-layer
|
|
715
|
-
decision is due at the first added translation, not at 1.0.
|
|
713
|
+
pair machine-visible, which is what gave this trigger its foothold.
|
|
716
714
|
|
|
717
715
|
- **GATE-3 — legal-status × translation-status as two enums**
|
|
718
716
|
(ADR 0003, half-adopted: one tier for legal authority in REQ-LANG-3,
|
|
@@ -806,7 +804,7 @@ Tracked here until resolved; each becomes an ADR.
|
|
|
806
804
|
- **Q-4** — Two upstream SignalK spec asks are outstanding and independent of
|
|
807
805
|
this package: a making-way indicator, and `design.maxSpeed`.
|
|
808
806
|
- **Q-5** — REQ-VERIFY-5 asks for boundary fixtures on every numeric gate.
|
|
809
|
-
Three gates (`
|
|
807
|
+
Three gates (`rule:23a_ii`, `rule:26b_ii`, `rule:30c`'s `fact:length_m` thresholds) live only in
|
|
810
808
|
`modality_by`, not in the entry's `when` — they flip `shall` to `may`, not
|
|
811
809
|
which entries apply. The fixture format only asserts applying entry ids, not
|
|
812
810
|
expected modality, so there is no way to fixture these three without
|
|
@@ -819,8 +817,8 @@ Tracked here until resolved; each becomes an ADR.
|
|
|
819
817
|
id asserts nothing, so `applicability-fixtures.json` stays byte-identical
|
|
820
818
|
and needs no migration; REQ-CAT-7 states the rule and
|
|
821
819
|
`fixtures/situation-fixtures.json` carries the worked example. What is left
|
|
822
|
-
is not a decision but the work: writing the boundary fixtures for `
|
|
823
|
-
`
|
|
820
|
+
is not a decision but the work: writing the boundary fixtures for `rule:23a_ii`,
|
|
821
|
+
`rule:26b_ii` and `rule:30c` in the new form. Pencil, so a session that finds a
|
|
824
822
|
better shape may change it, logging the change; settled for good by those
|
|
825
823
|
three fixtures actually landing.
|
|
826
824
|
- **Q-6** — The treaty-language facts behind §5 (en/fr authentic, es/ru
|
|
@@ -842,6 +840,14 @@ Tracked here until resolved; each becomes an ADR.
|
|
|
842
840
|
not only as a whole: clearing one candidate source unblocks that corpus
|
|
843
841
|
alone, which is the cheap path when a demo needs a specific language
|
|
844
842
|
early.
|
|
843
|
+
**BOE (`es`) and Finlex (`fi`) verified clean, 2026-09-09 and 2026-09-12**
|
|
844
|
+
(ADR 0001 amendments) — both permit the reuse REQ-PROV-2 needs. The UNTS
|
|
845
|
+
deposit (`en`/`fr`) is confirmed **blocked**, not merely unverified: no
|
|
846
|
+
UNTS-specific rights statement exists, and the reachable terms are the
|
|
847
|
+
same personal/non-commercial, no-derivative-works terms that block CEVNI.
|
|
848
|
+
`es` is the cheapest language to ship the first non-`intl` corpus; UNTS
|
|
849
|
+
needs written UN permission or a national republication before `en`/`fr`
|
|
850
|
+
can use the deposit route.
|
|
845
851
|
- **Q-8** — Does the paragraph path survive the first national amalgamation?
|
|
846
852
|
GATE-1's accepted risk rests on paragraph paths being immutable
|
|
847
853
|
(REQ-MODEL-10) — adding and deprecating are fine, but a path that keeps its
|
|
@@ -870,7 +876,7 @@ Tracked here until resolved; each becomes an ADR.
|
|
|
870
876
|
`24(d)`, `24(f)`, `24(g)`, `24(i)`, `25(d)(i)`, `25(d)(ii)`, `25(e)`,
|
|
871
877
|
`26(d)`, `30(e)`), plus one structural path-mismatch (`23(d)(i)` — the
|
|
872
878
|
Inland equivalent sits at bare `23(d)`, not `23(d)(i)`), one whole-rule
|
|
873
|
-
clean absence (`28`, "[Reserved]" in Inland), and two clean intl-only
|
|
879
|
+
clean absence (`rule:28`, "[Reserved]" in Inland), and two clean intl-only
|
|
874
880
|
absences. Secondary claim (amendment history): also refuted — the WIG
|
|
875
881
|
amendment (A.910(22), 2001) explicitly renumbers, displacing the
|
|
876
882
|
pre-existing `23(c)` (small-vessel alternative lights) to `23(d)`; a 1981
|
|
@@ -959,6 +965,11 @@ listed here, one line each, because the ADR is what makes them live. Most are
|
|
|
959
965
|
invariant that does not fit. *(engine)*
|
|
960
966
|
- **Q-17** — What separation distance *d* defines the "safe" level? Fixed to
|
|
961
967
|
one value to start; settled by the sensitivity matrix of Q-22. *(engine)*
|
|
968
|
+
One data point: `docs/maritime-sources.md`'s MAIB *Polesie*/*Verity* report
|
|
969
|
+
cites UK case law putting close-quarters at a ~12-minute TCPA and adapts a
|
|
970
|
+
suggested-TCPA table (its Figure 16) from *A Guide to the Collision
|
|
971
|
+
Avoidance Rules* — not a d in metres, but a real-world anchor for the
|
|
972
|
+
sensitivity matrix.
|
|
962
973
|
- **Q-18** — What is the dynamics model, and what is the list of dynamics
|
|
963
974
|
classes (tanker, ferry, yacht, …)? Settled by the first two-vessel
|
|
964
975
|
computation; the class list is a data question once it stabilises.
|
|
@@ -980,8 +991,10 @@ listed here, one line each, because the ADR is what makes them live. Most are
|
|
|
980
991
|
it have to be computed at runtime? Settled by the first two-vessel
|
|
981
992
|
computation's cost. *(engine)*
|
|
982
993
|
- **Q-23** — Is Rule 2(b) a duty where departure is necessary, and does the
|
|
983
|
-
departing vessel bear the burden?
|
|
984
|
-
|
|
994
|
+
departing vessel bear the burden? Partly settled — yes and yes — by
|
|
995
|
+
`docs/maritime-sources.md`'s *Ever Smart* and *Crowley* entries; the
|
|
996
|
+
taxonomy of qualifying circumstances, and *The Bywell Castle* and *Boy
|
|
997
|
+
Andrew v St Rognvald*, are still unread. *colregs-engine* issue #83.
|
|
985
998
|
- **Q-24** — Are the four worked illustrations (R0, R1, R2,
|
|
986
999
|
`inconclusive-in-model`) actually in the regions they are said to be in?
|
|
987
1000
|
They fix meanings, not numbers; settled by computing them. *(engine)*
|
|
@@ -1117,8 +1130,8 @@ named that gap before the class existed.
|
|
|
1117
1130
|
protected-vessel property is a per-vessel fact, consumer-supplied like
|
|
1118
1131
|
`pair:env:narrow_channel` and `pair:env:traffic_lane` are.** `fact:confined_to_channel`
|
|
1119
1132
|
and `fact:following_traffic_lane` name it, in the same shape as the existing
|
|
1120
|
-
`fact:near_channel` and `fact:obstruction_exists`; entries `9b`, `10i` and
|
|
1121
|
-
`10j` now read `other:fact:confined_to_channel`/`other:fact:following_traffic_lane`
|
|
1133
|
+
`fact:near_channel` and `fact:obstruction_exists`; entries `rule:9b`, `rule:10i` and
|
|
1134
|
+
`rule:10j` now read `other:fact:confined_to_channel`/`other:fact:following_traffic_lane`
|
|
1122
1135
|
and their `gap` fields are closed. `9(d)` has no entry yet, so it inherits
|
|
1123
1136
|
the same fact when one is written. **18(d)(i) is deliberately left open**:
|
|
1124
1137
|
"exhibiting the signals in Rule 28" is a display-compliance fact rather than
|
|
@@ -1126,7 +1139,7 @@ named that gap before the class existed.
|
|
|
1126
1139
|
CLAUDE.md "Coverage") — settling it is a narrower, separate decision.
|
|
1127
1140
|
- **Q-35** — 8(f)(iii)'s antecedent is "a vessel, the passage of which is not to
|
|
1128
1141
|
be impeded" — the *output* of another norm, not a fact. A precedence
|
|
1129
|
-
predicate reads only facts, so entry `
|
|
1142
|
+
predicate reads only facts, so entry `rule:8f_iii` reads the risk-of-collision half
|
|
1130
1143
|
alone and applies to every pair with risk of collision. Settled by deciding
|
|
1131
1144
|
whether a norm may read another norm's effect, which is the same question a
|
|
1132
1145
|
`conduct` monitor will ask about role and phase.
|
|
@@ -1138,22 +1151,22 @@ named that gap before the class existed.
|
|
|
1138
1151
|
Settled by reading 8(f)(ii) against the cases, not by picking a role.
|
|
1139
1152
|
- **Q-37** — 13(a) is `classification` in ADR 0005 §1 and in the proposal's
|
|
1140
1153
|
first-cut table, but it is the one paragraph of Rule 13 that assigns a role
|
|
1141
|
-
and a `classification` entry has nowhere to put one. Entry `13a` is
|
|
1154
|
+
and a `classification` entry has nowhere to put one. Entry `rule:13a` is
|
|
1142
1155
|
`precedence` here, with 13(b)'s sector test left for the `classification`
|
|
1143
1156
|
entry that would set the `hist:was_overtaking` latch. Settled with the rest
|
|
1144
1157
|
of `Q-14`, paragraph by paragraph.
|
|
1145
1158
|
|
|
1146
1159
|
**Closed in pencil 2026-09-04 (PR #26).** 13(b) is now written, as *two*
|
|
1147
|
-
`classification` entries rather than one —
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
a crossing. 13(a) stays `precedence`, and its predicate now carries both
|
|
1160
|
+
`classification` entries rather than one — one per subject — because the
|
|
1161
|
+
encounter type belongs to the pair and reading aspect alone classified the
|
|
1162
|
+
overtaken vessel's side of the same encounter as a crossing. 13(a) stays `precedence`, and its predicate now carries both
|
|
1151
1163
|
halves of "any vessel overtaking any other": the 13(b) sector and the 13(d)
|
|
1152
1164
|
latch, as an `any_of`, which closes the gap the entry recorded. 13(d) is a
|
|
1153
1165
|
third `classification` entry, reading history and no geometry at all. The
|
|
1154
1166
|
split confirms the thing ADR 0005 §1 was really defending — one category per
|
|
1155
|
-
paragraph
|
|
1156
|
-
|
|
1167
|
+
paragraph. **Reversed in part, 2026-09-16:** ADR 0015 as rewritten makes
|
|
1168
|
+
13(b) one symmetric entry, `rule:13b`, reading the same sector object on
|
|
1169
|
+
either subject under `any_of`. 13(a) staying `precedence` is untouched.
|
|
1157
1170
|
- **Q-38** — 9(d), 18(d)(ii), 18(e), 18(f)(ii), 1(a)–(e) and 20(b)–(c) are
|
|
1158
1171
|
recorded in `known_omissions` rather than modelled: 9(d) needs the channel's
|
|
1159
1172
|
axis, 18(e) needs a fact for being a seaplane, 20(b)–(c) need time of day,
|
|
@@ -1180,7 +1193,7 @@ written up in `docs/identifiers.md` §"Effects"; what it could not is here.
|
|
|
1180
1193
|
or an overtaking; Rule 12 says which of them gives way, not what kind of
|
|
1181
1194
|
meeting it is. 12(b) is a `definition` and is the cite on `kin:wind_side`
|
|
1182
1195
|
rather than an entry. The second half of the question is narrower and worse:
|
|
1183
|
-
12(a) says "two sailing vessels", which is 3(c), but entries
|
|
1196
|
+
12(a) says "two sailing vessels", which is 3(c), but entries the three Rule 12 entries
|
|
1184
1197
|
read `rule18_class:sail` instead, so a vessel engaged in fishing under sail
|
|
1185
1198
|
falls out of Rule 12 — because letting her in would have given her a give-way
|
|
1186
1199
|
duty under 12(a) and a stand-on role under 18(b)(iii) with no override
|
|
@@ -1200,7 +1213,7 @@ written up in `docs/identifiers.md` §"Effects"; what it could not is here.
|
|
|
1200
1213
|
it: Rule 18's chapeau excepts Rules 9, 10 and 13 and no others, so every
|
|
1201
1214
|
Rule 18 norm that can be in force between two sailing vessels — 18(b)(i)–(iii)
|
|
1202
1215
|
from the ordinary sailing vessel's side, 18(c)(i)–(ii) from the fishing
|
|
1203
|
-
vessel's — carries `rel:overrides` against
|
|
1216
|
+
vessel's — carries `rel:overrides` against the three Rule 12 entries. 13(a), being
|
|
1204
1217
|
"notwithstanding" the whole of Sections I and II, overrides them too, which
|
|
1205
1218
|
it had to: two sailing vessels in an overtaking held 13(a)'s and 12(a)(ii)'s
|
|
1206
1219
|
roles at once and nothing had noticed. Two fixtures and a sweep over sailing
|
|
@@ -1214,21 +1227,21 @@ written up in `docs/identifiers.md` §"Effects"; what it could not is here.
|
|
|
1214
1227
|
|
|
1215
1228
|
**Decided in pencil 2026-09-05 (PR #46): Rule 15 reads 3(b), and Rule 18
|
|
1216
1229
|
overrides it too.** The same question answered the other way for Rule 15.
|
|
1217
|
-
`15a
|
|
1230
|
+
`rule:15a:keep_out_of_the_way` kept the four Rule 18 ranks — NUC, RAM, fishing and WIG —
|
|
1218
1231
|
out of Rule 15 by negating them on both subjects in its own predicate; the
|
|
1219
1232
|
negation is gone, both subjects gate on `fact:propulsion: propulsion:power`
|
|
1220
|
-
which is 3(b), and
|
|
1233
|
+
which is 3(b), and the 18(a)(i)–(iii) entries, the two 18(c) entries and `rule:18f_i` carry
|
|
1221
1234
|
`rel:overrides` against it. The gate was not merely the relation said in
|
|
1222
1235
|
the wrong place. It produced the right roles wherever Rule 18 speaks and
|
|
1223
1236
|
*no* role at all where Rule 18 is silent: two vessels engaged in fishing
|
|
1224
1237
|
under power, and a vessel not under command crossing one restricted in her
|
|
1225
1238
|
ability to manoeuvre under power, are pairs Rule 18 does not order, and
|
|
1226
1239
|
neither vessel took a helm role from any entry. Both are fixtures now, and
|
|
1227
|
-
both failed on the data before the change — `15a
|
|
1240
|
+
both failed on the data before the change — `rule:15a:crossing` classified the
|
|
1228
1241
|
encounter and nothing assigned a role. What it leaves is Rule 12's residue
|
|
1229
1242
|
again: on those unordered pairs Rule 15 lays a give-way duty on a vessel
|
|
1230
1243
|
that may be unable to discharge it, which is Rule 2's region and is
|
|
1231
|
-
recorded, not gated. `13a` needs no override against `15a
|
|
1244
|
+
recorded, not gated. `rule:13a` needs no override against `rule:15a:keep_out_of_the_way` — the
|
|
1232
1245
|
entry excludes every overtaking by the `hist:was_overtaking` latch and by
|
|
1233
1246
|
13(b)'s sector — and a test pins that absence so it stays a reason rather
|
|
1234
1247
|
than an oversight. The hand-list of six is asserted complete by a derived
|
|
@@ -1269,7 +1282,7 @@ written up in `docs/identifiers.md` §"Effects"; what it could not is here.
|
|
|
1269
1282
|
judgement. Settled by deciding whether the vocabulary gains one — `Q-31`'s
|
|
1270
1283
|
neighbour, not its duplicate.
|
|
1271
1284
|
- **Q-43** — **The partition needs history to be present, and says nothing when
|
|
1272
|
-
it is absent.** `14b` and `15a
|
|
1285
|
+
it is absent.** `rule:14b` and `rule:15a:crossing` are gated on `hist:was_overtaking`
|
|
1273
1286
|
being `false` on both subjects, which is 13(d)'s requirement and the only way
|
|
1274
1287
|
the three encounter types stay disjoint once the latch is set. Because absent
|
|
1275
1288
|
is absent, a situation that omits the fact is classified as *no encounter at
|
|
@@ -1307,15 +1320,14 @@ written up in `docs/identifiers.md` §"Effects"; what it could not is here.
|
|
|
1307
1320
|
effect of its own. It produces the only effect the entry has: "such a
|
|
1308
1321
|
situation shall be deemed to exist when…" is the deeming test, and
|
|
1309
1322
|
`{"encounter": "head-on"}` is what a deeming test yields — exactly as
|
|
1310
|
-
`13b
|
|
1323
|
+
`rule:13b` cites 13(b), the deeming paragraph,
|
|
1311
1324
|
and not 13(a). 14(a) states the situation in words ("reciprocal or nearly
|
|
1312
1325
|
reciprocal courses") and imposes the duty ("each shall alter her course to
|
|
1313
1326
|
starboard"); the duty is `conduct`, and the words are what 14(b) makes
|
|
1314
|
-
checkable. So the entry is `14b`, cites 14(b), and reads nothing 14(b) does
|
|
1327
|
+
checkable. So the entry is `rule:14b`, cites 14(b), and reads nothing 14(b) does
|
|
1315
1328
|
not fix; 14(a) joins `known_omissions` as conduct beside 18(d)(ii), and
|
|
1316
|
-
`14a` is
|
|
1317
|
-
|
|
1318
|
-
replacement — the registry's first record (REQ-MODEL-11). The
|
|
1329
|
+
the `14a` id it displaced is gone with the rest of the citation-derived ids
|
|
1330
|
+
and leaves no record behind it (ADR 0015). The
|
|
1319
1331
|
general question — whether a paragraph with no effect of its own gets an
|
|
1320
1332
|
entry — is `Q-39`'s and is untouched; this paragraph turned out not to be an
|
|
1321
1333
|
instance of it.
|
|
@@ -1323,7 +1335,7 @@ written up in `docs/identifiers.md` §"Effects"; what it could not is here.
|
|
|
1323
1335
|
vessel to be overtaking when *coming up with* another from more than 22.5°
|
|
1324
1336
|
abaft her beam. That is `own:kin:sog_kn` against `other:kin:sog_kn`, and the
|
|
1325
1337
|
predicate language compares a fact to a constant and never one fact to
|
|
1326
|
-
another — the same wall `
|
|
1338
|
+
another — the same wall `rule:12a_ii` hits on "both have the wind on the same side",
|
|
1327
1339
|
which it gets over only because that comparison has two values to enumerate
|
|
1328
1340
|
and this one has infinitely many. `pair:geo:tcpa_s > 0` stands in: the pair
|
|
1329
1341
|
is closing, and closing from abaft the beam is coming up. It excludes the
|
|
@@ -1335,7 +1347,7 @@ written up in `docs/identifiers.md` §"Effects"; what it could not is here.
|
|
|
1335
1347
|
- **Q-47** — **13(d)'s latch never clears.** The paragraph runs "until she is
|
|
1336
1348
|
finally past and clear", nothing in the fact vocabulary carries that, and so
|
|
1337
1349
|
in this model `hist:was_overtaking` is set by a consumer and cleared by a
|
|
1338
|
-
consumer while entry `13d` classifies an overtaking for as long as it stands.
|
|
1350
|
+
consumer while entry `rule:13d` classifies an overtaking for as long as it stands.
|
|
1339
1351
|
Not approximated with a range or a bearing: past and clear is a seamanship
|
|
1340
1352
|
judgement of the same kind as risk of collision, and a threshold for it would
|
|
1341
1353
|
be a number invented rather than declared. Settled by whatever settles the
|
|
@@ -1346,7 +1358,7 @@ written up in `docs/identifiers.md` §"Effects"; what it could not is here.
|
|
|
1346
1358
|
test is suppressed on the other, newly-gaining vessel — once overtaking,
|
|
1347
1359
|
always overtaking, per 13(d)'s own text, so a geometry test that would
|
|
1348
1360
|
newly name a second give-way vessel must not fire while the first still
|
|
1349
|
-
holds the role by history alone. `13a`'s sector branch now also reads
|
|
1361
|
+
holds the role by history alone. `rule:13a`'s sector branch now also reads
|
|
1350
1362
|
`other:hist:was_overtaking: false`; the closing fixture in
|
|
1351
1363
|
`fixtures/situation-fixtures.json` is the case this closes — a vessel
|
|
1352
1364
|
drops back onto the latch-holder's own stern, and only the latch-holder
|
|
@@ -1358,7 +1370,7 @@ written up in `docs/identifiers.md` §"Effects"; what it could not is here.
|
|
|
1358
1370
|
fixture — can state a pair of bearings that no two headings produce, and the
|
|
1359
1371
|
entries will classify it without complaint. It bites in one visible place:
|
|
1360
1372
|
where both vessels have the other on the starboard side, which cannot happen
|
|
1361
|
-
on a collision course, `15a
|
|
1373
|
+
on a collision course, `rule:15a:keep_out_of_the_way` applies to both of them and the "never
|
|
1362
1374
|
both give-way" property fails. The fixtures added here are built from a
|
|
1363
1375
|
heading and a bearing so that they are consistent by construction, and the
|
|
1364
1376
|
file says so; the model is not. Settled by deciding whether the record gains
|
|
@@ -1381,7 +1393,7 @@ written up in `docs/identifiers.md` §"Effects"; what it could not is here.
|
|
|
1381
1393
|
and speeds. Two cases could not keep their story: the R1 head-on had both
|
|
1382
1394
|
vessels with the other to starboard, which no speeds make a steady bearing,
|
|
1383
1395
|
and is recast as one; the 13(d) latch case is 400 m abeam with the CPA
|
|
1384
|
-
already past, and lost `
|
|
1396
|
+
already past, and lost `rule:7d_i`. The partition sweep now constructs positions
|
|
1385
1397
|
and headings for every bearing pair and is consistent at every point. The
|
|
1386
1398
|
"never both give-way" property is asserted over a sweep of steady-bearing
|
|
1387
1399
|
geometries — every relative bearing, several speed pairs, both intercept
|
|
@@ -1398,12 +1410,12 @@ written up in `docs/identifiers.md` §"Effects"; what it could not is here.
|
|
|
1398
1410
|
the relative quantities as derived facts stays open in the block's
|
|
1399
1411
|
`settled_by`.
|
|
1400
1412
|
|
|
1401
|
-
- **Q-49** — **Must `13d`'s effect cross the Section II/III boundary for Rule 19(d)(i) to be expressible?**
|
|
1402
|
-
- *broad* — drop `13d`'s `pair:geo:in_sight` gate so `encounter: overtaking` is visible in Section III; breaks the scope invariant.
|
|
1403
|
-
- *narrow* — `13d` stays gated; a 19(d)(i) entry reads `own:hist:was_overtaking`/`other:hist:was_overtaking` directly, as `14b` and `15a
|
|
1413
|
+
- **Q-49** — **Must `rule:13d`'s effect cross the Section II/III boundary for Rule 19(d)(i) to be expressible?**
|
|
1414
|
+
- *broad* — drop `rule:13d`'s `pair:geo:in_sight` gate so `encounter: overtaking` is visible in Section III; breaks the scope invariant.
|
|
1415
|
+
- *narrow* — `rule:13d` stays gated; a 19(d)(i) entry reads `own:hist:was_overtaking`/`other:hist:was_overtaking` directly, as `rule:14b` and `rule:15a:crossing` already do.
|
|
1404
1416
|
- Default: narrow (nothing changes).
|
|
1405
1417
|
- Recommendation: narrow — the test named below shows the fact resolves out of sight
|
|
1406
|
-
(`Q-49: hist:was_overtaking resolves out of sight; 13d does not fire`, `test/data.test.mjs`).
|
|
1418
|
+
(`Q-49: hist:was_overtaking resolves out of sight; rule:13d does not fire`, `test/data.test.mjs`).
|
|
1407
1419
|
|
|
1408
1420
|
### From the Part B invariants (P4.1)
|
|
1409
1421
|
|
|
@@ -1416,21 +1428,30 @@ nothing is blocked while open.
|
|
|
1416
1428
|
*Wide:* they attach whenever in sight and the geometry holds — Rule 11 is the
|
|
1417
1429
|
only gate Section II states — so a vessel overtaking a mile clear abeam is
|
|
1418
1430
|
give-way and Rule 16 binds her. *Narrow:* Section II's duties attach only with
|
|
1419
|
-
risk of collision; 14 and 15 are emphasis. Default **wide**: `13a`, `13b
|
|
1420
|
-
`13d` and every Rule 18 entry read `in_sight` only. No recommendation.
|
|
1431
|
+
risk of collision; 14 and 15 are emphasis. Default **wide**: `rule:13a`, `rule:13b`,
|
|
1432
|
+
`rule:13d` and every Rule 18 entry read `in_sight` only. No recommendation.
|
|
1421
1433
|
- **Q-51** — **What arms 13(d)'s latch?** *A:* 13(b)'s deeming, at the first
|
|
1422
1434
|
state the geometry holds. *B:* 13(a)'s duty actually attaching. They differ
|
|
1423
1435
|
where the geometry holds but a condition on 13(a) does not — `Q-50`'s
|
|
1424
|
-
surface.
|
|
1425
|
-
|
|
1426
|
-
|
|
1436
|
+
surface. Pencilled **B** ✎ (Solace, 2026-09-14): the latch arms when the
|
|
1437
|
+
duty attaches. KIVELI [2025] EWHC 1185 (Admlty) holds the analogous Rule 14
|
|
1438
|
+
latch arms on risk of collision and then persists; no authority was found on
|
|
1439
|
+
overtaking geometry with no risk of collision. Free to reverse: four entries
|
|
1440
|
+
(`rule:13a`, `rule:13b`, `rule:13d`) and their fixtures, and nothing consumes the one
|
|
1441
|
+
state this changes the answer for. Settled by: a decision on Rule 13 itself,
|
|
1442
|
+
or Cockcroft & Lameijer on whether overtaking status needs risk of
|
|
1443
|
+
collision.
|
|
1427
1444
|
- **Q-52** — **What does 13(d)'s latch forbid?** *Narrow:* reclassification to
|
|
1428
1445
|
*crossing* only, as the paragraph says, leaving head-on to Rule 14 on the
|
|
1429
1446
|
geometry of the moment. *Broad:* the encounter stays an overtaking and no
|
|
1430
1447
|
other Section II classification attaches. Both preserve the duty; they differ
|
|
1431
|
-
on encounter type, which Rule 17's phases and 14(a) hang off.
|
|
1432
|
-
**broad
|
|
1433
|
-
`
|
|
1448
|
+
on encounter type, which Rule 17's phases and 14(a) hang off.
|
|
1449
|
+
Pencilled **broad** ✎ (Solace, 2026-09-14), which is also the data's
|
|
1450
|
+
default: `rule:13d` yields `encounter: overtaking` from history alone, `rule:14b` and
|
|
1451
|
+
`rule:15a:crossing` gate on `was_overtaking: false`. 13(a)'s "notwithstanding"
|
|
1452
|
+
already displaces Rule 14; eCOLREGs states the broad reading as conventional.
|
|
1453
|
+
Settled by: a case or commentary on an overtaking becoming a head-on; none
|
|
1454
|
+
found.
|
|
1434
1455
|
- **Q-53** — **Does 17(a)(ii) suspend 17(a)(i)'s duty, or add an exception?**
|
|
1435
1456
|
*Suspension:* "may, however" lifts the duty once non-compliance is apparent;
|
|
1436
1457
|
a monitor then flags nothing. *Exception:* the duty stands and a departure is
|
|
@@ -1456,7 +1477,7 @@ nothing is blocked while open.
|
|
|
1456
1477
|
Not in sight *and* not in or near restricted visibility (clear weather, beyond
|
|
1457
1478
|
visual range, radar contact) is outside Rule 11 and 19(a): Section I only.
|
|
1458
1479
|
*Hole:* represent it; a fact for "in or near restricted visibility" is owed.
|
|
1459
|
-
*Closed:* treat not-in-sight as Section III. Default **closed**: `19a` drops
|
|
1480
|
+
*Closed:* treat not-in-sight as Section III. Default **closed**: `rule:19a` drops
|
|
1460
1481
|
the second conjunct, recorded as a `gap`. Recommend **hole**: the default is
|
|
1461
1482
|
safe for a switching consumer and unsafe for a traceability claim.
|
|
1462
1483
|
- **Q-57** — **The baseline for "keep her course and speed"?** 17(a)(i) fixes
|
package/docs/timeline.md
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Timeline
|
|
2
|
+
|
|
3
|
+
When COLREG 1972 changed, and how long each jurisdiction took to catch up.
|
|
4
|
+
Public record, every row cited. Relevant to this package because
|
|
5
|
+
`jurisdiction` (`intl`, `us/inland`, …) is a first-class dimension here, not
|
|
6
|
+
an afterthought — this is the evidence that national texts genuinely lag
|
|
7
|
+
the IMO instrument, by years, and by different amounts per country.
|
|
8
|
+
|
|
9
|
+
## 1. IMO instrument history
|
|
10
|
+
|
|
11
|
+
| Date | Event | What changed | Source | Verified? |
|
|
12
|
+
|---|---|---|---|---|
|
|
13
|
+
| 1972-10-20 | COLREG 1972 adopted | Replaced 1960 Collision Regs; made TSS mandatory (Rule 10) | [imo.org](https://www.imo.org/en/About/Conventions/Pages/COLREG.aspx) | verified |
|
|
14
|
+
| 1977-07-15 | Entry into force | Binding on ratifying states | [imo.org](https://www.imo.org/en/About/Conventions/Pages/COLREG.aspx) | verified |
|
|
15
|
+
| 1981-11-19 → 1983-06-01 | 1981 amdts, Res. A.464(XII) | Rule 10: exempted safety-operation and cable-laying vessels in TSS | [imo.org](https://www.imo.org/en/ourwork/safety/pages/preventing-collisions.aspx) | verified |
|
|
16
|
+
| 1987-11-19 → 1989-11-19 | 1987 amdts, Res. A.626(15) | New Rule 1(e), 8(f); Rule 3(h) def.; Rule 10(c) clarified; Annexes I & IV updated (light positions, GMDSS) | [imo.org](https://www.imo.org/en/ourwork/safety/pages/preventing-collisions.aspx) | verified |
|
|
17
|
+
| 1989-10-19 → 1991-04-19 | 1989 amdts, Res. A.678(16) | Rule 10: further restricted inshore-traffic-zone use | [imo.org](https://www.imo.org/en/ourwork/safety/pages/preventing-collisions.aspx) | verified |
|
|
18
|
+
| 1993-11-04 → 1995-11-04 | 1993 amdts, Res. A.736(18) | Light-positioning rules revised; Annex IV gained SART signals | [imo.org](https://www.imo.org/en/ourwork/safety/pages/preventing-collisions.aspx) | verified |
|
|
19
|
+
| 2001-11-29 → 2003-11-29 | 2001 amdts, Res. A.910(22) | Added Wing-in-Ground (WIG) craft: Rule 3 def., Rules 8(a),18,23,31,33,35; Annex I & III updates | [imo.org](https://www.imo.org/en/ourwork/safety/pages/preventing-collisions.aspx) | verified |
|
|
20
|
+
| 2007-11-29 → 2009-12-01 | 2007 amdts, Res. A.1004(25) | Annex IV (distress signals) replaced wholesale: added DSC, Inmarsat, EPIRB signals | [imo.org](https://www.imo.org/en/ourwork/safety/pages/preventing-collisions.aspx) | verified |
|
|
21
|
+
| 2013-12-04 → 2016-01-01 | 2013 amdts, Res. A.1085(28) | New Part F (Rules 39–41) appended: compulsory Member State Audit Scheme verification | [imo.org](https://www.imo.org/en/ourwork/safety/pages/preventing-collisions.aspx) | verified |
|
|
22
|
+
|
|
23
|
+
No amendment adopted since 2013; autonomous-ship ("MASS") work is ongoing but has not produced one — [Wikipedia](https://en.wikipedia.org/wiki/Convention_on_the_International_Regulations_for_Preventing_Collisions_at_Sea).
|
|
24
|
+
|
|
25
|
+
**Renumbering:** none of the seven amendments renumbers or deletes an existing rule; each adds a paragraph, a definition, or (2013) an appended Part. Annex IV's 2007 replacement kept its number and position.
|
|
26
|
+
|
|
27
|
+
**Languages:** Article IX makes English and French "equally authentic"; Russian and Spanish are official translations, not authentic text — [Convention text, CIL NUS](https://cil.nus.edu.sg/wp-content/uploads/2019/02/1972-Convention-on-Regulations-for-Preventing-Collisions-at-Sea.pdf), verified. IMO's own official languages (for documents generally, not this treaty) are Arabic, Chinese, English, French, Russian, Spanish — [imo.org](https://www.imo.org/en/About/Conventions/Pages/COLREG.aspx), verified.
|
|
28
|
+
|
|
29
|
+
## 2. National instruments
|
|
30
|
+
|
|
31
|
+
### United States
|
|
32
|
+
|
|
33
|
+
| Date | Event | What changed | Source | Verified? |
|
|
34
|
+
|---|---|---|---|---|
|
|
35
|
+
| 1977 | Int'l Navigation Rules Act of 1977 | Adopted COLREG 1972 for international waters | [FR 2014-14413](https://www.federalregister.gov/documents/2014/07/02/2014-14413/changes-to-the-inland-navigation-rules) | verified |
|
|
36
|
+
| enacted 1980-12-24, eff. 1981-12-24 | Inland Navigational Rules Act, Pub. L. 96-591 | Created a separate, COLREG-modeled U.S. Inland Rules | [Pub. L. 96-591](https://www.navcen.uscg.gov/sites/default/files/pdf/navRules/PLaw_96_591_%2094%20_Stat_3415_1980_Inland_Navigation_Rules.pdf) | verified |
|
|
37
|
+
| 2010-04-15 | 75 FR 19544 | Moved Inland Rules from U.S. Code to 33 CFR 83–88; future changes by rulemaking, not statute | [FR 2014-14413](https://www.federalregister.gov/documents/2014/07/02/2014-14413/changes-to-the-inland-navigation-rules) | verified |
|
|
38
|
+
| 2014-08-01 | Final rule, "Changes to the Inland Navigation Rules" | Incorporated the 2001 & 2007 IMO amendments (WIG craft, new Annex IV); renumbered the CFR to track COLREG rule numbers | [FR 2014-14413](https://www.federalregister.gov/documents/2014/07/02/2014-14413/changes-to-the-inland-navigation-rules) | verified |
|
|
39
|
+
|
|
40
|
+
### United Kingdom
|
|
41
|
+
|
|
42
|
+
| Date | Event | What changed | Source | Verified? |
|
|
43
|
+
|---|---|---|---|---|
|
|
44
|
+
| 1996-05-01 | SI 1996/75 in force | Domestic effect for COLREG as then amended | [legislation.gov.uk](https://www.legislation.gov.uk/uksi/1996/75/made) | verified |
|
|
45
|
+
| 2004-05-28 | MSN 1781 first published | MCA notice carrying the technical Rules text | [gov.uk](https://www.gov.uk/government/publications/msn-1781-distress-signals-and-preventing-collisions) | verified |
|
|
46
|
+
| 2016 | MSN 1781 Amendment 2 | Reissued, superseding the original | [gov.uk PDF](https://assets.publishing.service.gov.uk/media/5dfa3bcced915d54a89bd4ab/MSN1781_Amendment2_2016.pdf) | date verified; which IMO round it applies unverified |
|
|
47
|
+
| 2023-11-21 | MSN 1781 Amendment 3 | Non-COLREG: scope re Watercraft Order 2023 | [gov.uk](https://www.gov.uk/government/publications/msn-1781-mf-amendment-3-the-merchant-shipping-regulations-1996-colreg) | verified |
|
|
48
|
+
|
|
49
|
+
### Canada
|
|
50
|
+
|
|
51
|
+
| Date | Event | What changed | Source | Verified? |
|
|
52
|
+
|---|---|---|---|---|
|
|
53
|
+
| 1978 base | Collision Regs, C.R.C. c. 1416 | Incorporates COLREG "with Canadian Modifications" | [Justice Laws](https://laws-lois.justice.gc.ca/eng/regulations/C.R.C.,_c._1416/) | verified |
|
|
54
|
+
| ongoing | SOR/78-528, SOR/83-202, etc. | Periodic amendments track IMO and add Canadian mods | [publications.gc.ca](https://publications.gc.ca/site/eng/9.662001/publication.html) | verified |
|
|
55
|
+
| 2023-06-07 | Most recent amendment | Current to 2026-07-21, last amended 2023-06-07 | [Justice Laws](https://laws-lois.justice.gc.ca/eng/regulations/C.R.C.,_c._1416/page-4.html) | verified |
|
|
56
|
+
|
|
57
|
+
### Finland
|
|
58
|
+
|
|
59
|
+
| Date | Event | What changed | Source | Verified? |
|
|
60
|
+
|---|---|---|---|---|
|
|
61
|
+
| 1977, SopS 30/1977 | Decree bringing COLREG 1972 into force | Ratified 1977-01-28 | [Finlex](https://finlex.fi/fi/sopimukset/sopsteksti/1977/19770030) | verified |
|
|
62
|
+
| 1983-07-04 | Decree incorporating the 1981 amdts | Applied Res. A.464(XII) | [Finlex](https://finlex.fi/fi/sopimukset/sopsteksti/1983/19830037) | verified |
|
|
63
|
+
| approved 2008-12-19, force 2009-12-01 | Decree incorporating the 2007 amdts | Applied Res. A.1004(25); domestic entry into force matches the global date exactly | [Finlex](https://finlex.fi/fi/valtiosopimukset/sopimussarja/2009/12) | verified |
|
|
64
|
+
|
|
65
|
+
### Spain
|
|
66
|
+
|
|
67
|
+
| Date | Event | What changed | Source | Verified? |
|
|
68
|
+
|---|---|---|---|---|
|
|
69
|
+
| 1977-07-09 | BOE publishes accession instrument | Corrections followed in 1978 and 1981 | [BOE-A-1977-15605](https://www.boe.es/buscar/act.php?id=BOE-A-1977-15605) | verified |
|
|
70
|
+
| adopted 2001-11-29, BOE pub. 2003-02-11, eff. 2003-11-29 | 2001 amdts (A.910(22)) | BOE publication preceded the global entry into force by ~9 months | [BOE-A-2003-2716](https://www.boe.es/buscar/doc.php?id=BOE-A-2003-2716) | verified |
|
|
71
|
+
| adopted 2007-11-29, BOE pub. 2010-03-20, eff. 2009-12-01 | 2007 amdts (A.1004(25)) | BOE publication came ~3.5 months *after* the global entry into force | [BOE-A-2010-4648](https://www.boe.es/buscar/doc.php?id=BOE-A-2010-4648) | verified |
|
|
72
|
+
|
|
73
|
+
### Germany
|
|
74
|
+
|
|
75
|
+
| Date | Event | What changed | Source | Verified? |
|
|
76
|
+
|---|---|---|---|---|
|
|
77
|
+
| enacted 1976-06-29 | Ratification statute, BGBl. 1976 II S. 1017 | Approved German accession | [dejure.org](https://dejure.org/BGBl/1976/BGBl._II_S._1017) | verified |
|
|
78
|
+
| announced 1977-06-01, eff. 1977-07-15 | Bekanntmachung of entry into force | Matches the global date | [gesetze-im-internet.de](https://www.gesetze-im-internet.de/seestro1972_bk/SeeStrO1972%C3%9Cbk.pdf) | verified |
|
|
79
|
+
| through the 2013 amdt (28th Assembly) | Ordinance updating the Convention annex | Cites the IMO Assembly session directly, not re-legislated | [buzer.de](https://www.buzer.de/gesetz/5250/a72559.htm) | verified |
|
|
80
|
+
|
|
81
|
+
### Australia
|
|
82
|
+
|
|
83
|
+
| Date | Event | What changed | Source | Verified? |
|
|
84
|
+
|---|---|---|---|---|
|
|
85
|
+
| 2009-12-01 | Marine Orders Part 30, Issue 8 | Repealed Issue 7; timed to match the 2007 amdts' entry into force, same day | [PDF](https://www.marinerescueportjackson.com.au/ddlfiles/colregs.pdf) | verified |
|
|
86
|
+
| 2016-07-19 | Marine Order 30 (2016) | Remade under the Navigation Act 2012, replacing the 1912 Act | [legislation.gov.au](https://www.legislation.gov.au/F2016L01187/asmade) | verified |
|
|
87
|
+
|
|
88
|
+
### Europe, inland — CEVNI
|
|
89
|
+
|
|
90
|
+
| Date | Event | What changed | Source | Verified? |
|
|
91
|
+
|---|---|---|---|---|
|
|
92
|
+
| 1962 (Res. 4); refounded as Res. 24, 1985-11-15 | Original / refounding resolution | UNECE code adapting COLREG-style rules for inland waterways | [waterways.cz PDF](https://waterways.cz/documents/European_Code_for_Inland_Waterways_E.pdf) | verified |
|
|
93
|
+
| 2009 | CEVNI Rev. 4 | ECE/TRANS/SC.3/115/Rev.4 | [UN Digital Library](https://digitallibrary.un.org/record/1489444) | verified |
|
|
94
|
+
| 2015 | CEVNI Rev. 5 | ECE/TRANS/SC.3/115/Rev.5 | [UN Digital Library](https://digitallibrary.un.org/record/1489444) | verified |
|
|
95
|
+
| 2022 Rev. 6; Amdt 1 in 2025-04 | CEVNI Rev. 6 and first amendment | Latest edition; the amendment issued separately | [UNECE](https://unece.org/transport/documents/2025/04/standards/cevni-european-code-inland-waterways-resolution-no-24) | Rev. 6's 2022 date unverified (year only); Amdt 1 date verified |
|
|
96
|
+
|
|
97
|
+
## 3. Cadence
|
|
98
|
+
|
|
99
|
+
- **IMO gap between amendments:** seven amendments, 1981–2013 — 6y, 2y, 4y, 8y (max, 1993→2001), 6y, 6y. Mean ≈5.3y. None since 2013.
|
|
100
|
+
- **National lag varies by country and by amendment, not on a fixed schedule.** Finland and Australia both brought the 2007 amendments into force on 1 Dec 2009 — the same day as the global date. The U.S. did not incorporate the 2001 and 2007 amendments until an August 2014 rule: 13- and 7-year lags on the same two rounds.
|
|
101
|
+
- **Gazette date can trail legal effect.** Spain's 2007-amendment text was published in the BOE on 20 Mar 2010, ~3.5 months after it was already binding (1 Dec 2009) — a publishing lag, not two rule-numbering schemes concurrently in force. No case of the latter was found (absence not proven).
|
|
102
|
+
- **Citation style differs by country:** Spain and Finland cite the IMO resolution number and dates directly; the U.S. and Canada cite Federal Register/SOR numbers plus a "current to" date; the UK cites an SI number plus an MSN amendment; CEVNI cites a revision plus amendment number.
|
|
@@ -5,8 +5,9 @@ text, and names a slug as a straw man to be built and judged rather than
|
|
|
5
5
|
argued about. This is the build and the judgement. The research issue is
|
|
6
6
|
colregs#83; nothing here decides the pencil item.
|
|
7
7
|
|
|
8
|
-
Everything below is reproducible from `scripts/text-slug.mjs` over
|
|
9
|
-
`data/
|
|
8
|
+
Everything below is reproducible from `scripts/text-slug.mjs` over the
|
|
9
|
+
en-US corpus (`data/text/intl/2016/en-US.uscg.json` since ADR 0013 moved the
|
|
10
|
+
words out of `data/rules.json`). Nothing was written into `data/`.
|
|
10
11
|
|
|
11
12
|
## What the pipeline does
|
|
12
13
|
|