colregs 0.2.4 → 0.3.0

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.
@@ -0,0 +1,23 @@
1
+ {
2
+ "id": "intl@2016.es.boe",
3
+ "edition": "intl@2016",
4
+ "edition_status": "claimed",
5
+ "language": "es",
6
+ "source_id": "boe",
7
+ "tier": "national",
8
+ "normalization": "NFC",
9
+ "source": {
10
+ "publisher": "Agencia Estatal Boletín Oficial del Estado",
11
+ "title": "Instrumento de Adhesión de España al Convenio sobre el Reglamento internacional para prevenir los abordajes, 1972",
12
+ "url": "https://www.boe.es/",
13
+ "retrieved": null
14
+ },
15
+ "rights": {
16
+ "source_text": "BOE aviso legal: reuse permitted, commercial and non-commercial; consolidated texts must not be represented as official",
17
+ "redistribution_basis": "BOE aviso legal, with attribution",
18
+ "attribution": "Fuente de los datos: Agencia Estatal Boletín Oficial del Estado",
19
+ "package_licence": "Apache-2.0"
20
+ },
21
+ "note": "Stub: the BOE instrument id is not yet located; resolve it and the retrieval date before any text lands -- Q-7.",
22
+ "paragraphs": {}
23
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "id": "intl@2016.fi.finlex",
3
+ "edition": "intl@2016",
4
+ "edition_status": "claimed",
5
+ "language": "fi",
6
+ "source_id": "finlex",
7
+ "tier": "national",
8
+ "normalization": "NFC",
9
+ "source": {
10
+ "publisher": "Finlex (Oikeusministeriö), Suomen säädöskokoelman sopimussarja",
11
+ "title": "Asetus kansainvälisistä säännöistä yhteentörmäämisen ehkäisemiseksi merellä vuonna 1972 tehdyn yleissopimuksen voimaansaattamisesta, SopS 30/1977",
12
+ "url": "https://www.finlex.fi/fi/sopimukset/sopsteksti/1977/19770030",
13
+ "retrieved": "2026-09-12"
14
+ },
15
+ "rights": {
16
+ "source_text": "Tekijänoikeuslaki 404/1961 §9: no copyright in treaties and their official translations",
17
+ "redistribution_basis": "Finlex FAQ: published materials carry no usage restriction; open data CC BY 4.0",
18
+ "package_licence": "Apache-2.0"
19
+ },
20
+ "note": "Stub: identity and provenance only; the Finnish text is not transcribed yet. GATE-2 is adopted in docs/gates.json, settled by ADR 0013, so nothing structural blocks it.",
21
+ "paragraphs": {}
22
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "id": "us/inland@2014.en-US.ecfr",
3
+ "edition": "us/inland@2014",
4
+ "edition_status": "claimed",
5
+ "language": "en-US",
6
+ "source_id": "ecfr",
7
+ "tier": "national",
8
+ "normalization": "NFC",
9
+ "source": {
10
+ "publisher": "Office of the Federal Register, eCFR",
11
+ "title": "33 CFR Part 83, Navigation Rules (Inland)",
12
+ "url": "https://www.ecfr.gov/current/title-33/chapter-I/subchapter-E/part-83",
13
+ "retrieved": null
14
+ },
15
+ "rights": {
16
+ "source_text": "Work of the United States Government, not subject to copyright in the United States (17 U.S.C. 105)",
17
+ "redistribution_basis": "17 U.S.C. 105",
18
+ "package_licence": "Apache-2.0"
19
+ },
20
+ "note": "Stub: a second jurisdiction, so the key shape is exercised on both axes; the delta itself waits on Q-11 -- REQ-SCOPE-3.",
21
+ "paragraphs": {}
22
+ }
package/data/version.json CHANGED
@@ -1,3 +1,3 @@
1
1
  {
2
- "version": "0.2.4"
2
+ "version": "0.3.0"
3
3
  }
@@ -1,8 +1,9 @@
1
1
  # ADR 0001 — Package name, and jurisdiction as a dimension
2
2
 
3
3
  Date: 2026-08-29
4
- Status: accepted; amended 2026-09-05 and 2026-09-09 (licence terms verified,
5
- see Amendments). CEVNI's text stays blocked; ADR 0010 unblocks modelling it.
4
+ Status: accepted; amended 2026-09-05, 2026-09-09 and 2026-09-12 (licence
5
+ terms verified, see Amendments). CEVNI's text stays blocked; ADR 0010
6
+ unblocks modelling it.
6
7
 
7
8
  ## Context
8
9
 
@@ -225,3 +226,42 @@ corpus candidates, previously unchecked. Q-6 (authenticity) verified
225
226
  `es` clears REQ-PROV-2; `fi` and `en`/`fr` via UNTS stay open. Updating
226
227
  `docs/requirements.md` Q-7 for this is left as a follow-up (concurrent
227
228
  edits to that file are in flight elsewhere).
229
+
230
+ ### 2026-09-12 — UNTS and Finlex resolved (issue #81, Q-7)
231
+
232
+ Re-ran both 2026-09-09 checks with a fetch that renders what looked like a
233
+ JS-only shell. Finlex turned out not to need a browser: its Next.js page
234
+ ships the article text inline in a React Server Components payload that a
235
+ plain fetch already receives, just not as visible HTML.
236
+
237
+ **Finlex (`fi`) — resolved clean.** §9, Tekijänoikeuslaki 404/1961: no
238
+ copyright in laws and decrees; in other documents enacted via the Statutes
239
+ Collection and in treaties and similar instruments containing international
240
+ obligations; in the decisions and statements of an authority or other public
241
+ body; or in official translations of the above. Finlex's own FAQ
242
+ (`finlex.fi/fi/ukk`, Ministry of Justice) states published materials carry
243
+ no usage restrictions, and machine-readable open data is licensed CC BY 4.0.
244
+ EFFI's contested claim concerns the compiled database, not the statute text
245
+ §9 already excludes; Finlex's current primary statement outranks that
246
+ secondary source.
247
+
248
+ **UNTS (`en`/`fr`) — resolved, and it does not clear.** Checked the UNTS
249
+ intro and FAQ pages on treaties.un.org and the copyright and terms-of-use
250
+ pages on un.org directly; none needed a browser. No UNTS-specific rights
251
+ page exists anywhere in that set — every path leads to the same general UN
252
+ terms already found blocking CEVNI: personal, non-commercial use, with no
253
+ right to resell, redistribute or create derivative works. Confirmed
254
+ blocked, not merely ambiguous.
255
+
256
+ Per Q-7's per-language routing, `es` (BOE, cleared 2026-09-09) is the
257
+ corpus that unblocks the first non-`intl` text; `fi` is now open alongside
258
+ it. UNTS stays closed pending written UN permission or a national
259
+ republication of the authentic `en`/`fr` text.
260
+
261
+ Sources: `fi` —
262
+ <https://www.finlex.fi/fi/laki/ajantasa/1961/19610404> (§9);
263
+ <https://www.finlex.fi/fi/ukk> (usage terms, CC BY 4.0). UNTS —
264
+ <https://treaties.un.org/Pages/Content.aspx?path=DB/UNTS/pageIntro_en.xml>;
265
+ <https://treaties.un.org/Pages/Overview.aspx?path=overview/faq/page1_en.xml>;
266
+ <https://www.un.org/en/about-us/copyright>;
267
+ <https://www.un.org/en/about-us/terms-of-use>.
@@ -79,8 +79,10 @@ with BCP 47 codes, structured as three layers:
79
79
  consolidated state*: the skeleton declares, as data, the amendment state
80
80
  it consolidates, and every corpus declares the amendment state its
81
81
  source reflects (REQ-LANG-10). A mismatch is legitimate but
82
- machine-visible — declared staleness, never silence. Historical states
83
- are prior package versions, not an in-data version dimension. A
82
+ machine-visible — declared staleness, never silence. (GATE-2 adopted in
83
+ ADR 0013: `data/editions.json` now registers editions in force
84
+ *concurrently*, so "historical states are prior package versions" holds
85
+ only for a fully superseded edition, not one still in transition.) A
84
86
  renumbering amendment is a major version under REQ-PKG-4 — but it is
85
87
  resolved by *issuing new paragraph paths and deprecating the old ones*
86
88
  (REQ-MODEL-10/11), never by repointing an existing path at different
@@ -204,11 +206,10 @@ check. What was declined, and why — recorded so it isn't re-argued:
204
206
  renumbering lands — or when Q-8's check of the first national
205
207
  amalgamation shows paragraph paths do not survive it.
206
208
  - **A full temporal/legal-version model** (instrument → edition → corpus as
207
- first-class layers; GATE-2). The package models current consolidated law;
208
- history lives in package versions. The cheap 80% — declared amendment
209
- state on skeleton and corpus, machine-visible mismatch — is adopted
210
- instead. If a jurisdiction ever requires multiple concurrent editions,
211
- that is a new ADR.
209
+ first-class layers; GATE-2). Declined *here*; the cheap 80% (declared
210
+ amendment state, machine-visible mismatch) was adopted instead. **Re-taken
211
+ and adopted in ADR 0013**, on the trigger this bullet named: a
212
+ jurisdiction requiring multiple concurrent editions.
212
213
  - **`dir: ltr|rtl` metadata per language.** Derivable from the language
213
214
  tag via CLDR by any consumer that needs it; storing it invites drift.
214
215
 
@@ -183,9 +183,8 @@ trace becomes a fixture; a certified grid, a `Rule2DepartureModel`.
183
183
  2. `Trace`, `appliedConductEntries` against those fixtures — phase 3
184
184
  starts here.
185
185
  3. `evaluateConduct` with verdicts and phases; the constants above.
186
- 4. `evaluateRule2Departure` once a grid exists. Until then the name is
187
- reserved and nothing exported: a stub answering `inconclusive-in-model`
188
- is a stub wearing a status.
186
+ 4. `evaluateRule2Departure` once a grid exists. ~~Until then the name is reserved and nothing exported: a stub answering `inconclusive-in-model` is a stub wearing a status.~~
187
+ **Struck. Reserving the name was never the policy here: a name gets an export the day it is written down, throwing or answering `inconclusive-in-model`. Withholding an export to look careful is the failure mode, not the stub. — Solace, 2026-09-13**
189
188
 
190
189
  ## Register
191
190
 
@@ -200,4 +199,4 @@ trace becomes a fixture; a certified grid, a `Rule2DepartureModel`.
200
199
  | Vague-quantity constants live in colregs; `SolverParameters` on the model and echoed on the finding, `colregs_version` naming the release solved against; nothing else on the model is API | ✎ | the first constant a conduct entry reads; Q-19's sensitivity matrix |
201
200
  | `Rule2DepartureFinding` field set — `rules`, `Rule2DepartureAdvisory[]`, no banner cite (it is a function of `status`); the status alphabet is colregs' (ADR 0005 §5), not this package's to rename | ✎ | proposal v4 §4's sensitivity matrix; Q-19, Q-20 |
202
201
  | No *situation* input names a departure; the grid does, and is named in every finding | ✎ | — |
203
- | Nothing exported until a fixture backs it; exports then carry TSDoc's `@beta` release tag | ✎ | — |
202
+ | A name is exported the day it is written down, throwing or answering `inconclusive-in-model`; exports carry TSDoc's `@beta` release tag until a fixture backs them | ✎ | — |
@@ -0,0 +1,70 @@
1
+ # ADR 0013 — Rule text as corpus files under an edition registry (GATE-2 adopted)
2
+
3
+ Date: 2026-09-12
4
+ Status: accepted (2026-09-13)
5
+
6
+ ## Context
7
+
8
+ ADR 0003 made language a dimension and sketched its layout, but nothing
9
+ landed, and its GATE-2 (an edition layer between instrument and corpus) is
10
+ due for re-take *before* the first non-English corpus. Finlex (`fi`) and BOE
11
+ (`es`) are both licence-clear (ADR 0001, 2026-09-12), so the next text to
12
+ land forces the key shape. This ADR fixes the keys and leaves the words for
13
+ issue #98. A sibling proposal (branch `multi-jurisdiction-schema`, option A)
14
+ confirms GATE-2 declined instead; the two are meant to be read side by side.
15
+
16
+ ## Decision
17
+
18
+ 1. **`data/rules.json` is the skeleton.** Per paragraph: `path`, `rule`,
19
+ `jurisdiction`, `images`. No `text`, no `rule_title`, no source, and no
20
+ amendment state of its own. It gains `24(g)(i)`: the Convention has the
21
+ path; the USCG page lacks the words, which is the corpus's gap.
22
+ 2. **`data/editions.json` is the registry: jurisdiction → instrument →
23
+ editions.** An edition id is `<jurisdiction>@<tag>` (`intl@2016`,
24
+ `us/inland@2014`), carrying `amended_through`, `in_force` and optionally
25
+ `superseded_by`. **The tag is the `in_force` year, nothing else** — the
26
+ amending instrument (an IMO resolution, a Federal Register cite) belongs
27
+ in `amended_through`, never in the tag. Each jurisdiction names the
28
+ edition the skeleton consolidates. Two editions of
29
+ one jurisdiction may be registered at once, which is GATE-2's trigger
30
+ case expressed as data rather than as a diff between strings.
31
+ 3. **One file per corpus**,
32
+ `data/text/<jurisdiction>/<tag>/<language>.<source_id>.json`, identity
33
+ `<edition>.<language>.<source_id>`. A corpus names its `edition` and
34
+ nothing about jurisdiction or amendment state: both are the edition's.
35
+ CI checks the edition is registered and the filename agrees.
36
+ 4. **A corpus paragraph is `rule_title` + `text`** (or ADR 0010's withheld
37
+ fields). Corpus metadata otherwise as in option A: `tier`,
38
+ `normalization`, `source` (REQ-PROV-6), `rights` (three statements),
39
+ `gaps`, optional `translation_of`.
40
+ 5. **`data/corpora.json` indexes the files**, derived and drift-checked.
41
+ 6. **GATE-2 is re-taken and adopted.** The cost is one registry file and
42
+ one extra path segment; the gain is that "which consolidated state" is an
43
+ identifier compared by equality, not free text compared by eye, and a
44
+ stub must name an edition before it names anything else.
45
+
46
+ ## What the stubs show
47
+
48
+ Four corpora ship: `intl@2016.en-US.uscg` (today's text, moved verbatim),
49
+ `intl@2016.fi.finlex`, `intl@2016.es.boe` and `us/inland@2014.en-US.ecfr`,
50
+ the last three empty. The edition layer forces a claim option A lets a stub
51
+ defer: the Finnish and Spanish stubs assert they reflect `intl@2016` before
52
+ anyone has checked, and the `us/inland@2014` edition is recalled, not
53
+ verified, and says so. That is the honest cost of this option and the reason
54
+ to look at both.
55
+
56
+ ## Consequences
57
+
58
+ - Breaking file layout (REQ-PKG-4): `data/rules.json` no longer carries
59
+ text. colregs-engine's conformance research reads only `paragraphs` keys
60
+ and is unaffected; anything reading `.text` moves to the en-US corpus.
61
+ - ADR 0010's withheld mechanics move to the corpus paragraph, where the
62
+ text is; the skeleton has nothing to withhold.
63
+ - A new IMO amendment is a new registered edition, a new skeleton pointer,
64
+ and new corpus files under a new directory; the old ones may stay until
65
+ the last consumer moves, marked `superseded_by`. Under option A the same
66
+ event is an in-place edit of every corpus's `amendment_state`.
67
+ - REQ-LANG-1, -3, -5, -9, -10 and REQ-PROV-6 move from unimplemented to
68
+ implemented for the data on file; catalogs (REQ-LANG-6) are untouched.
69
+ - Landing Finnish or Spanish words is an edit to one file and one number in
70
+ the index, and still waits on this ADR being accepted (REQ-GATE-2).
package/docs/budgets.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "$comment": "Prose budgets enforced by prose-budget (the engine in dotfiles .local/bin), run locally by npm test and in CI by the shared workflow. Raising a number or adding an exception is a deliberate, reviewable diff.",
3
3
  "lines": {
4
- "README.md": 200,
5
- "AGENTS.md": 122,
4
+ "README.md": 360,
5
+ "AGENTS.md": 200,
6
6
  "CLAUDE.md": 10,
7
7
  "docs/requirements.md": 1500,
8
8
  "docs/identifiers.md": 450,
9
9
  "docs/part-b-invariants.md": 950,
10
+ "docs/adr/0001-name-and-jurisdiction-model.md": 280,
10
11
  "docs/adr/0007-rule26-overrides-and-aground.md": 90,
11
12
  "docs/adr/0008-mooring-buoy-modifier.md": 90,
12
13
  "docs/adr/0009-data-version-stamp.md": 90,
@@ -15,11 +16,14 @@
15
16
  "docs/adr/0012-trace-and-rule2-departure-api.md": 203,
16
17
  "docs/verification/2026-09-09-text-slug-straw-man.md": 270,
17
18
  "required": true,
18
- "pending": []
19
+ "pending": [],
20
+ "docs/adr/0013-corpus-files-with-editions.md": 95,
21
+ "docs/timeline.md": 130
19
22
  },
20
23
  "json_prose": {
21
24
  "targets": [
22
25
  "data/*.json",
26
+ "data/text/**/*.json",
23
27
  "fixtures/*.json"
24
28
  ],
25
29
  "keys": [
@@ -86,6 +90,7 @@
86
90
  "AGENTS.md",
87
91
  "CLAUDE.md",
88
92
  "data/*.json",
93
+ "data/text/**/*.json",
89
94
  "fixtures/*.json",
90
95
  "test/*.mjs",
91
96
  "docs/**/*.md"
@@ -96,6 +101,7 @@
96
101
  "AGENTS.md",
97
102
  "CLAUDE.md",
98
103
  "data/*.json",
104
+ "data/text/**/*.json",
99
105
  "fixtures/*.json",
100
106
  "test/*.mjs"
101
107
  ],
@@ -104,6 +110,7 @@
104
110
  "AGENTS.md",
105
111
  "CLAUDE.md",
106
112
  "data/*.json",
113
+ "data/text/**/*.json",
107
114
  "fixtures/*.json",
108
115
  "test/*.mjs"
109
116
  ],
@@ -112,6 +119,7 @@
112
119
  "AGENTS.md",
113
120
  "CLAUDE.md",
114
121
  "data/*.json",
122
+ "data/text/**/*.json",
115
123
  "fixtures/*.json",
116
124
  "test/*.mjs"
117
125
  ],
@@ -120,6 +128,7 @@
120
128
  "AGENTS.md",
121
129
  "CLAUDE.md",
122
130
  "data/*.json",
131
+ "data/text/**/*.json",
123
132
  "fixtures/*.json",
124
133
  "test/*.mjs"
125
134
  ]
@@ -155,6 +164,7 @@
155
164
  "CLAUDE.md",
156
165
  "docs/**/*.md",
157
166
  "data/*.json",
167
+ "data/text/**/*.json",
158
168
  "fixtures/*.json"
159
169
  ]
160
170
  },
package/docs/gates.json CHANGED
@@ -36,9 +36,9 @@
36
36
  "declined_in": "docs/adr/0003-language-as-a-dimension.md",
37
37
  "closing_event": "first-non-english-corpus",
38
38
  "trigger": "a jurisdiction publishing two editions in force concurrently",
39
- "status": "open",
40
- "settled_by": null,
41
- "note": "Due at translation #1, not at 1.0."
39
+ "status": "adopted",
40
+ "settled_by": "docs/adr/0013-corpus-files-with-editions.md",
41
+ "note": "Re-taken and adopted ahead of its due date (translation #1) — ADR 0013 introduces the edition registry directly."
42
42
  },
43
43
  {
44
44
  "id": "GATE-3",
@@ -438,8 +438,7 @@ official languages, and many states gazette their own legally binding
438
438
  translation. (Recalled, not yet verified against the primary sources — Q-6.)
439
439
  See ADR 0003.
440
440
 
441
- - **REQ-LANG-1** **(unimplemented — no language dimension exists in the
442
- data)** — Language MUST be a dimension orthogonal to jurisdiction,
441
+ - **REQ-LANG-1** — Language MUST be a dimension orthogonal to jurisdiction,
443
442
  identified by BCP 47 tags. Which body of rules applies and which text of
444
443
  them is displayed are independent questions; neither MUST ever be inferred
445
444
  from the other, and no property beyond the language of the text — not
@@ -452,8 +451,7 @@ See ADR 0003.
452
451
  and renaming an identifier is a breaking change (REQ-PKG-4). Immutability
453
452
  itself is REQ-MODEL-10; this requirement adds only that identifiers are
454
453
  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
454
+ - **REQ-LANG-3** — Rule text MUST be storable
457
455
  as a **corpus** per (jurisdiction × language × source), keyed by paragraph
458
456
  path, holding at most one text per path, with corpus-level provenance and
459
457
  one declared status tier:
@@ -468,8 +466,7 @@ See ADR 0003.
468
466
  rule applies per corpus, against that corpus's own source.
469
467
  - **REQ-LANG-4** — Adding a language MUST be additive: no schema change, no
470
468
  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
469
+ - **REQ-LANG-5** — Corpora MAY be partial. Coverage MUST be declared in
473
470
  machine-readable form, and CI MUST fail on a corpus key that does not
474
471
  resolve to a known paragraph path, and on a corpus filename that disagrees
475
472
  with the file's internal metadata. Silence MUST NOT imply coverage (the
@@ -495,15 +492,13 @@ See ADR 0003.
495
492
  - **REQ-LANG-8** — A `community`-tier corpus MUST record who produced and
496
493
  who reviewed it. Machine translation without named human review MUST NOT
497
494
  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
495
+ - **REQ-LANG-9** — Verbatim (REQ-MODEL-1) is defined at the Unicode level: each
500
496
  corpus MUST declare the normalization form applied to its text (NFC unless
501
497
  declared otherwise) and MUST NOT insert or strip bidi control characters,
502
498
  localize numerals, punctuation, units or quotation marks, or otherwise "fix"
503
499
  the source text. Rendering direction is a consumer concern and MUST stay out
504
500
  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
501
+ - **REQ-LANG-10** — The structural skeleton MUST declare, as
507
502
  data, the amendment state it consolidates (e.g. "COLREGS 72 as amended
508
503
  through …"). Every corpus MUST declare the amendment state its source
509
504
  reflects. The two MAY differ — a corpus transcribed from an older
@@ -527,8 +522,7 @@ See ADR 0003.
527
522
  - **REQ-PROV-5** — Images MUST be addressable as data: an image record per file,
528
523
  naming what it illustrates by entry id or paragraph path. Unexplained filename
529
524
  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 —
525
+ - **REQ-PROV-6** — Source identity MUST be structured data —
532
526
  publisher, title, edition, publication and effective dates, URL, retrieval
533
527
  date — not a prose string. Rights MUST be recorded separately for the source
534
528
  text, for the basis on which this package redistributes it, and for the
@@ -699,20 +693,21 @@ Each gate names the declined design, the closing event, and the trigger.
699
693
  second-jurisdiction bundle — justified by Q-11 and GATE-2, no longer by
700
694
  a cross-jurisdiction trigger route.
701
695
 
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
696
+ - ~~**GATE-2 — instrument → edition → corpus as first-class layers**~~
697
+ (ADR 0003, declined; the adopted 80% is REQ-LANG-10). **Re-taken and
698
+ adopted, ADR 0013** — ahead of its due date (translation #1): the
699
+ edition registry lands directly, rather than waiting for the trigger
700
+ below to fire.
701
+ *Closing event, as declined*: the second corpus of any one jurisdiction
702
+ — which, read against ADR 0003's sequencing, means **the first
703
+ non-English corpus**, not a distant milestone. A French or Finnish text
704
+ of `intl` is a second corpus of `intl`. With one corpus, re-homing it
705
+ under an edition parent is a single file move; the cost scales with
709
706
  corpora × languages immediately thereafter.
710
- *Trigger*: a jurisdiction publishing two editions in force
707
+ *Trigger, as declined*: a jurisdiction publishing two editions in force
711
708
  concurrently — an old and a new text running in parallel through a
712
709
  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.
710
+ pair machine-visible, which is what gave this trigger its foothold.
716
711
 
717
712
  - **GATE-3 — legal-status × translation-status as two enums**
718
713
  (ADR 0003, half-adopted: one tier for legal authority in REQ-LANG-3,
@@ -842,6 +837,14 @@ Tracked here until resolved; each becomes an ADR.
842
837
  not only as a whole: clearing one candidate source unblocks that corpus
843
838
  alone, which is the cheap path when a demo needs a specific language
844
839
  early.
840
+ **BOE (`es`) and Finlex (`fi`) verified clean, 2026-09-09 and 2026-09-12**
841
+ (ADR 0001 amendments) — both permit the reuse REQ-PROV-2 needs. The UNTS
842
+ deposit (`en`/`fr`) is confirmed **blocked**, not merely unverified: no
843
+ UNTS-specific rights statement exists, and the reachable terms are the
844
+ same personal/non-commercial, no-derivative-works terms that block CEVNI.
845
+ `es` is the cheapest language to ship the first non-`intl` corpus; UNTS
846
+ needs written UN permission or a national republication before `en`/`fr`
847
+ can use the deposit route.
845
848
  - **Q-8** — Does the paragraph path survive the first national amalgamation?
846
849
  GATE-1's accepted risk rests on paragraph paths being immutable
847
850
  (REQ-MODEL-10) — adding and deprecating are fine, but a path that keeps its
@@ -1421,16 +1424,25 @@ nothing is blocked while open.
1421
1424
  - **Q-51** — **What arms 13(d)'s latch?** *A:* 13(b)'s deeming, at the first
1422
1425
  state the geometry holds. *B:* 13(a)'s duty actually attaching. They differ
1423
1426
  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`.
1427
+ surface. Pencilled **B** ✎ (Solace, 2026-09-14): the latch arms when the
1428
+ duty attaches. KIVELI [2025] EWHC 1185 (Admlty) holds the analogous Rule 14
1429
+ latch arms on risk of collision and then persists; no authority was found on
1430
+ overtaking geometry with no risk of collision. Free to reverse: four entries
1431
+ (`13a`, `13b-*`, `13d`) and their fixtures, and nothing consumes the one
1432
+ state this changes the answer for. Settled by: a decision on Rule 13 itself,
1433
+ or Cockcroft & Lameijer on whether overtaking status needs risk of
1434
+ collision.
1427
1435
  - **Q-52** — **What does 13(d)'s latch forbid?** *Narrow:* reclassification to
1428
1436
  *crossing* only, as the paragraph says, leaving head-on to Rule 14 on the
1429
1437
  geometry of the moment. *Broad:* the encounter stays an overtaking and no
1430
1438
  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.
1439
+ on encounter type, which Rule 17's phases and 14(a) hang off.
1440
+ Pencilled **broad** ✎ (Solace, 2026-09-14), which is also the data's
1441
+ default: `13d` yields `encounter: overtaking` from history alone, `14b` and
1442
+ `15a-crossing` gate on `was_overtaking: false`. 13(a)'s "notwithstanding"
1443
+ already displaces Rule 14; eCOLREGs states the broad reading as conventional.
1444
+ Settled by: a case or commentary on an overtaking becoming a head-on; none
1445
+ found.
1434
1446
  - **Q-53** — **Does 17(a)(ii) suspend 17(a)(i)'s duty, or add an exception?**
1435
1447
  *Suspension:* "may, however" lifts the duty once non-compliance is apparent;
1436
1448
  a monitor then flags nothing. *Exception:* the duty stands and a departure is
@@ -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
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "colregs",
3
- "version": "0.2.4",
3
+ "version": "0.3.0",
4
4
  "description": "COLREGS 72 and its national amalgamations as language-neutral JSON — rule text, light definitions, and applicability predicates — with cross-implementation fixtures",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {