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.
Files changed (57) hide show
  1. package/PROVENANCE.md +3 -3
  2. package/README.md +19 -10
  3. package/data/applicability.json +219 -244
  4. package/data/corpora.json +41 -0
  5. package/data/editions.json +27 -0
  6. package/data/facts.json +4 -4
  7. package/data/geometry.json +8 -8
  8. package/data/i18n/en.json +27 -0
  9. package/data/i18n/fi.json +25 -0
  10. package/data/images.json +32 -32
  11. package/data/operations.json +79 -0
  12. package/data/rules.json +176 -599
  13. package/data/text/intl/2016/en-US.uscg.json +877 -0
  14. package/data/text/intl/2016/es.boe.json +23 -0
  15. package/data/text/intl/2016/fi.finlex.json +22 -0
  16. package/data/text/us/inland/2014/en-US.ecfr.json +22 -0
  17. package/data/version.json +1 -1
  18. package/docs/adr/0001-name-and-jurisdiction-model.md +42 -2
  19. package/docs/adr/0003-language-as-a-dimension.md +8 -7
  20. package/docs/adr/0006-json-schema-and-identifier-diff.md +2 -0
  21. package/docs/adr/0011-api-shape.md +1 -1
  22. package/docs/adr/0012-trace-and-rule2-departure-api.md +3 -4
  23. package/docs/adr/0013-corpus-files-with-editions.md +70 -0
  24. package/docs/adr/0014-engine-interface-owned-by-colregs.md +103 -0
  25. package/docs/adr/0015-rule-ids-are-paragraph-keys.md +191 -0
  26. package/docs/budgets.json +17 -17
  27. package/docs/gates.json +3 -3
  28. package/docs/identifiers.md +49 -51
  29. package/docs/maritime-sources.md +58 -0
  30. package/docs/normative-language.md +103 -0
  31. package/docs/part-b-invariants.md +31 -29
  32. package/docs/requirements.md +118 -97
  33. package/docs/timeline.md +102 -0
  34. package/docs/verification/2026-09-09-text-slug-straw-man.md +3 -2
  35. package/fixtures/applicability-fixtures.json +190 -190
  36. package/fixtures/situation-fixtures.json +287 -287
  37. package/package.json +1 -1
  38. package/schema/applicability-fixtures.schema.json +4 -13
  39. package/schema/applicability.schema.json +27 -27
  40. package/schema/conduct-evaluation.schema.json +135 -0
  41. package/schema/corpora.schema.json +68 -0
  42. package/schema/corpus.schema.json +329 -0
  43. package/schema/display-evaluation.schema.json +146 -0
  44. package/schema/editions.schema.json +47 -0
  45. package/schema/encounter-evaluation.schema.json +109 -0
  46. package/schema/evaluation.schema.json +149 -0
  47. package/schema/fact-record.schema.json +30 -0
  48. package/schema/i18n-catalog.schema.json +47 -0
  49. package/schema/operations.schema.json +124 -0
  50. package/schema/rule2-departure-finding.schema.json +72 -0
  51. package/schema/rule2-departure-model.schema.json +159 -0
  52. package/schema/rules.schema.json +20 -90
  53. package/schema/situation-fixtures.schema.json +10 -146
  54. package/schema/situation.schema.json +72 -0
  55. package/schema/trace.schema.json +33 -0
  56. package/data/deprecated-identifiers.json +0 -7
  57. package/schema/deprecated-identifiers.schema.json +0 -29
@@ -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-buoy`/`30b-buoy`).
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 derived from its paragraph path (`25b`, `25d1`).
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
- (`25d2`), a gated alternative set (`when` + `one_of`, `27f`), and a gated
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.1.1`.** The prohibitions above bind every
229
- identifier present in the first version released *after* `colregs@0.1.1`,
230
- and every identifier introduced from then on. Identifiers as they stood
231
- in `0.1.1` and earlier are outside the baseline. The reason, recorded so
232
- it is not mistaken for convenience later: `0.1.1` was published
233
- 2026-08-29, the day the package was seeded, before the identifier review
234
- this requirement itself calls for had been done and before any consumer
235
- existed. Read without a baseline, the requirement froze the vocabulary at
236
- the moment of its first accidental publication and forbade the one review
237
- it was written to make possible — including the vocabulary type-prefixing
238
- that resolved a live namespace collision (`docs/identifiers.md`). That is
239
- a defect in the requirement, not a licence to skip the review.
240
-
241
- The baseline is **set exactly once**. It MUST NOT be moved, raised,
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. One recorded exception is a correction; a second is a policy.
244
+ normative.
248
245
 
249
246
  `test/data.test.mjs` pins the baseline literal and asserts it is stated
250
- exactly once. A build has no access to git history, so it cannot see the
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
- `data/deprecated-identifiers.json`, schema-validated
283
- (`schema/deprecated-identifiers.schema.json`, ADR 0006); it ships empty
284
- until the first identifier is retired.
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** **(unimplemented — no language dimension exists in the
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** **(unimplemented — rule text is one untagged ruleset, not a
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** **(unimplemented — no coverage declaration, and the CI checks
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** **(unimplemented — the shipped text declares no normalization
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** **(unimplemented — neither the skeleton nor the ruleset
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** **(unimplemented — source identity is a prose string and
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
- - **GATE-2 — instrument → edition → corpus as first-class layers**
703
- (ADR 0003, declined; the adopted 80% is REQ-LANG-10).
704
- *Closing event*: the second corpus of any one jurisdiction — which,
705
- read against ADR 0003's sequencing, means **the first non-English
706
- corpus**, not a distant milestone. A French or Finnish text of `intl`
707
- is a second corpus of `intl`. With one corpus, re-homing it under an
708
- edition parent is a single file move; the cost scales with
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 gives this trigger a foothold.
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 (`23a2`, `26b-mast`, `30c`'s `fact:length_m` thresholds) live only in
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 `23a2`,
823
- `26b-mast` and `30c` in the new form. Pencil, so a session that finds a
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? Settled by reading the cases (*The Bywell
984
- Castle*, *Boy Andrew v St Rognvald*, both unverified), not by advocacy.
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 `8f3` reads the risk-of-collision half
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 — `13b-overtaking` and
1148
- `13b-overtaken` — because the encounter type belongs to the pair and reading
1149
- aspect alone classified the overtaken vessel's side of the same encounter as
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 — and costs one paragraph two entries, which the entry-id suffix
1156
- scheme was already built for.
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 `12a1`–`12a3`
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 `12a1`–`12a3`. 13(a), being
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-give-way` kept the four Rule 18 ranks — NUC, RAM, fishing and WIG —
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 `18a1`–`18a3`, `18c1`–`18c2` and `18f1` carry
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-crossing` classified the
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-give-way` — the
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-crossing` are gated on `hist:was_overtaking`
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-overtaking` and `13b-overtaken` cite 13(b), the deeming paragraph,
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 retired in `retired_entry_ids` and, because v0.1.3 shipped it,
1317
- recorded in `data/deprecated-identifiers.json` with `14b` as its
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 `12a2` hits on "both have the wind on the same side",
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-give-way` applies to both of them and the "never
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 `7d1`. The partition sweep now constructs positions
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-crossing` already do.
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. Default **A**: `hist:was_overtaking` is "was, at some earlier point
1425
- in this encounter, an overtaking vessel" and `13b-overtaking` is geometry.
1426
- No recommendation; downstream of `Q-50`.
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. Default
1432
- **broad**: `13d` yields `encounter: overtaking` from history alone, `14b` and
1433
- `15a-crossing` gate on `was_overtaking: false`. No recommendation.
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
@@ -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/rules.json` at this commit. Nothing was written into `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