colregs 0.3.2 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -26,7 +26,7 @@ See a [live demo](https://mark-brannan.github.io/searoom/) of searoom and the co
26
26
  > by the published rules.
27
27
 
28
28
  ```text
29
- data/rules.json the skeleton: paragraph paths, rule numbers, jurisdictions -- no text
29
+ data/rules.json the skeleton: paragraph paths, rule numbers, jurisdictions -- no text; non-intl jurisdictions as deltas
30
30
  data/editions.json which edition of which instrument each jurisdiction is on
31
31
  data/text/ rule text, one corpus per edition x language x source
32
32
  data/corpora.json index of those corpora and how much each covers
@@ -56,7 +56,17 @@ lights and shapes, Part D sound and light signals, and Annex I geometry.
56
56
  [`docs/requirements.md`](docs/requirements.md) is the numbered contract for
57
57
  all of it. One case the Convention cannot state, a vessel made fast to a
58
58
  mooring buoy, lives only under `us/inland`
59
- ([ADR 0008](docs/adr/0008-mooring-buoy-modifier.md)).
59
+ ([ADR 0008](docs/adr/0008-mooring-buoy-modifier.md)); two the Inland Rules
60
+ deliberately lack, Rule 28 and 23(d)(ii), are tombstoned there
61
+ ([ADR 0018](docs/adr/0018-jurisdiction-delta-is-a-merge-patch.md)); one it
62
+ spells differently, 23(d), replaces the international entry, and one it
63
+ states differently, the towing lights that replace 24(c)'s sternlight, is
64
+ tombstoned and replaced under its own id. Its Part C skeleton is a delta of
65
+ the same kind: the paths whose text differs, the paths only it has, the
66
+ three it lacks
67
+ ([ADR 0020](docs/adr/0020-skeleton-is-a-delta.md)). That is the whole of
68
+ `us/inland` today: seven records and a skeleton, not yet a model of the
69
+ Inland Rules; its text and the entries for its own paths are the next work.
60
70
 
61
71
  ## The layers
62
72
 
@@ -104,7 +114,12 @@ same thing.
104
114
 
105
115
  **Jurisdiction is a dimension, not a fork.** Every record carries a
106
116
  `jurisdiction`: `intl`, or `<country-or-body>/<waters>` as a delta on it.
107
- Entries a jurisdiction doesn't override are inherited, not restated.
117
+ Entries a jurisdiction doesn't override are inherited, not restated. The
118
+ delta is an [RFC 7396](https://www.rfc-editor.org/rfc/rfc7396) merge patch
119
+ over `intl` keyed by entry id: the jurisdiction's own entries are its keys,
120
+ its `suppressions` are the keys set to `null`, and silence inherits
121
+ ([ADR 0018](docs/adr/0018-jurisdiction-delta-is-a-merge-patch.md)). Any
122
+ conformant merge-patch library reproduces the resolved rule set.
108
123
 
109
124
  **Predicates, not enumerations.** Gates are `fact:length_m < 7`, never a
110
125
  pre-built list of configurations. Enumerated tables are where prior art
@@ -136,12 +151,12 @@ paragraphs prevails is a relation.
136
151
 
137
152
  | relation | meaning |
138
153
  |---|---|
139
- | `rel:includes` | import the referenced entry's **lights only**, never its predicate |
140
- | `rel:conditional_includes` | import lights when the stated `when` holds; `one_of` is a set of legal alternatives |
141
- | `rel:in_lieu_of` | this entry's lights replace the referenced entries' lights |
142
- | `rel:excludes` | must not be shown together: a pick-one between alternatives, never one obligation vetoing another |
143
- | `rel:exempts` | the referenced requirement does not apply (30(e)) |
144
- | `rel:overrides` | this paragraph's requirement prevails over the referenced one's when both apply (Rule 18; Rule 26(a) over Rule 30's anchor lights) |
154
+ | `rel:includes` | import the referenced entry's lights, their modality and its scalar gates — never its axes (ADR 0019) |
155
+ | `rel:conditional_includes` | import lights when the stated `when` holds; `one_of` is a set of legal alternatives, exactly one per display, or none under a `may` carrier |
156
+ | `rel:in_lieu_of` | this entry's lights replace the referenced entries' lights; two entries replacing overlapping sets are alternatives to each other |
157
+ | `rel:excludes` | must not be shown together: a pick-one between alternatives, never one obligation vetoing another; a constraint on one display, never a removal |
158
+ | `rel:exempts` | the referenced requirement does not apply (30(e)); reaches an entry in force, never an import |
159
+ | `rel:overrides` | this paragraph's requirement prevails over the referenced one's when both apply (Rule 18; Rule 26(a) over Rule 30's anchor lights); reaches an entry in force, never an import |
145
160
 
146
161
  Modality is `modality:shall`, `modality:may`, `modality:shall-if-practicable`, `modality:shall-not`,
147
162
  `modality:shall-not-impede`, or `modality:conditional` with a `modality_by` table when it turns
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "conditions": "night (Rule 20(b): sunset to sunrise), and by 20(c) in restricted visibility by day. Day shapes are not in this release.",
3
3
  "relations": {
4
- "rel:includes": "import another entry's lights only, never its predicate",
5
- "rel:conditional_includes": "import lights when the stated `when` holds; `one_of` is a set of legal alternatives among which the vessel picks one",
6
- "rel:in_lieu_of": "this entry's lights replace the referenced entries' lights",
7
- "rel:excludes": "the referenced entries must not be shown at the same time",
8
- "rel:exempts": "the referenced entries are not required",
9
- "rel:overrides": "the superiority relation: the referencing norm's obligation displaces the referenced norm's when both apply"
4
+ "rel:includes": "import another entry's lights, their modality and its scalar gates, never its axes (ADR 0019)",
5
+ "rel:conditional_includes": "import lights when the stated `when` holds; `one_of` is a set of legal alternatives among which the vessel picks exactly one, or none under a `may` carrier (ADR 0019)",
6
+ "rel:in_lieu_of": "this entry's lights replace the referenced entries' lights; two entries whose targets intersect are alternatives to each other (ADR 0019)",
7
+ "rel:excludes": "the referenced entries must not be shown at the same time; a constraint on one display, never a removal (ADR 0019)",
8
+ "rel:exempts": "the referenced entries are not required; reaches an entry in force, never an import (ADR 0019)",
9
+ "rel:overrides": "the superiority relation: the referencing norm's obligation displaces the referenced norm's when both apply; reaches an entry in force, never an import (ADR 0019)"
10
10
  },
11
11
  "modalities": {
12
12
  "modality:shall": "mandatory",
@@ -110,6 +110,16 @@
110
110
  "cite": "14(a)",
111
111
  "what": "When two power-driven vessels are meeting on reciprocal or nearly reciprocal courses so as to involve risk of collision each shall alter her course to starboard so that each shall pass on the port side of the other.",
112
112
  "why": "`category:conduct`, not `category:classification`: the paragraph states the situation in words and prescribes the action, and 14(b) is the paragraph that deems the situation to exist -- entry rule:14b cites it. The action is monitored over a trace rather than evaluated at a point (ADR 0005 sec. 1), and no conduct entry shape exists yet. Q-45."
113
+ },
114
+ {
115
+ "cite": "28",
116
+ "what": "Under us/inland a record carrying activity:cbd selects nothing: rule:28 is suppressed and the Rule 23(a) entries it imported read activity:none.",
117
+ "why": "'Constrained by her draft' is not an Inland status, so the record is out of vocabulary there and the package does not pick a reading for it; a consumer that decodes SignalK for inland waters maps it to activity:none (ADR 0018)."
118
+ },
119
+ {
120
+ "cite": "24(j)",
121
+ "what": "On the Western Rivers (and waters the Secretary specifies), a vessel pushing ahead or towing alongside shows sidelights and two towing lights only -- no masthead lights -- displacing the 24(c) chapeau this package otherwise models for all of us/inland.",
122
+ "why": "No `fact:waters` exists yet (REQ-SCOPE-5), so the Western Rivers carve-out can't be expressed as a predicate today. `rule:24c:towing_lights` therefore asserts masthead lights across all of us/inland, over-broad on those waters the same way the inherited rule:24c was before this PR replaced it -- not a regression, but the first entry sourced to 83.24(c) itself, so the gap is worth declaring rather than leaving implicit."
113
123
  }
114
124
  ],
115
125
  "represented_paragraphs": [
@@ -1343,7 +1353,8 @@
1343
1353
  "rel:overrides": [
1344
1354
  "rule:15a:keep_out_of_the_way"
1345
1355
  ],
1346
- "note": "Self is 'a power-driven vessel underway' (18(a)) that is not herself ranked by Rule 18 -- written as the negation the paragraph implies rather than as an enumeration of activity values that had to be edited every time the axis grew (Q-33). A vessel constrained by her draught and a WIG craft on the surface are both power-driven and both stay inside it, which is why the gate is `fact:propulsion` plus the negated rank and not `rule18_class:power`: 18(d) protects a CBD vessel, it does not exempt her from 18(a). Overrides `rule:15a:keep_out_of_the_way` (Q-40): self and a vessel not under command are both power-driven vessels by 3(b) whenever her machinery is in use, so 15(a) is in force between them as well and would hand the give-way role to whichever has the other on her starboard side, rank or no rank. Rule 18's opening words except Rules 9, 10 and 13 and no others, so this paragraph displaces it."
1356
+ "note": "Self is 'a power-driven vessel underway' (18(a)) that is not herself ranked by Rule 18 -- written as the negation the paragraph implies rather than as an enumeration of activity values that had to be edited every time the axis grew (Q-33). A vessel constrained by her draught and a WIG craft on the surface are both power-driven and both stay inside it, which is why the gate is `fact:propulsion` plus the negated rank and not `rule18_class:power`: 18(d) protects a CBD vessel, it does not exempt her from 18(a). Overrides `rule:15a:keep_out_of_the_way` (Q-40): self and a vessel not under command are both power-driven vessels by 3(b) whenever her machinery is in use, so 15(a) is in force between them as well and would hand the give-way role to whichever has the other on her starboard side, rank or no rank. Rule 18's opening words except Rules 9, 10 and 13 and no others, so this paragraph displaces it.",
1357
+ "gap": "Unlike `rule:13a`/`rule:15a:keep_out_of_the_way`, this entry does not gate on `other:hist:was_overtaking`, so it still names self give-way when the other vessel holds 13(d)'s overtaking history. Q-58."
1347
1358
  },
1348
1359
  {
1349
1360
  "id": "rule:18a_ii",
@@ -1373,7 +1384,8 @@
1373
1384
  "rel:overrides": [
1374
1385
  "rule:15a:keep_out_of_the_way"
1375
1386
  ],
1376
- "note": "Mine clearance (27(f)) and diving (27(e)) reach this entry through `rule18_class:ram`, which decodes them by 3(g), instead of being listed here by hand. That is the display/rank divergence Q-32 named, moved into facts.json. Overrides `rule:15a:keep_out_of_the_way` (Q-40): self and a vessel restricted in her ability to manoeuvre are both power-driven vessels by 3(b) whenever her machinery is in use, so 15(a) is in force between them as well and would hand the give-way role to whichever has the other on her starboard side, rank or no rank. Rule 18's opening words except Rules 9, 10 and 13 and no others, so this paragraph displaces it."
1387
+ "note": "Mine clearance (27(f)) and diving (27(e)) reach this entry through `rule18_class:ram`, which decodes them by 3(g), instead of being listed here by hand. That is the display/rank divergence Q-32 named, moved into facts.json. Overrides `rule:15a:keep_out_of_the_way` (Q-40): self and a vessel restricted in her ability to manoeuvre are both power-driven vessels by 3(b) whenever her machinery is in use, so 15(a) is in force between them as well and would hand the give-way role to whichever has the other on her starboard side, rank or no rank. Rule 18's opening words except Rules 9, 10 and 13 and no others, so this paragraph displaces it.",
1388
+ "gap": "Unlike `rule:13a`/`rule:15a:keep_out_of_the_way`, this entry does not gate on `other:hist:was_overtaking`, so it still names self give-way when the other vessel holds 13(d)'s overtaking history. Q-58."
1377
1389
  },
1378
1390
  {
1379
1391
  "id": "rule:18a_iii",
@@ -1403,7 +1415,8 @@
1403
1415
  "rel:overrides": [
1404
1416
  "rule:15a:keep_out_of_the_way"
1405
1417
  ],
1406
- "note": "`activity:trawling` reaches this entry through the class decode rather than by being listed beside `activity:fishing`; a fishing vessel under sail is `rule18_class:fishing` too, which is 18(c)'s reading of the axis. Overrides `rule:15a:keep_out_of_the_way` (Q-40): self and a vessel engaged in fishing are both power-driven vessels by 3(b) whenever her machinery is in use, so 15(a) is in force between them as well and would hand the give-way role to whichever has the other on her starboard side, rank or no rank. Rule 18's opening words except Rules 9, 10 and 13 and no others, so this paragraph displaces it."
1418
+ "note": "`activity:trawling` reaches this entry through the class decode rather than by being listed beside `activity:fishing`; a fishing vessel under sail is `rule18_class:fishing` too, which is 18(c)'s reading of the axis. Overrides `rule:15a:keep_out_of_the_way` (Q-40): self and a vessel engaged in fishing are both power-driven vessels by 3(b) whenever her machinery is in use, so 15(a) is in force between them as well and would hand the give-way role to whichever has the other on her starboard side, rank or no rank. Rule 18's opening words except Rules 9, 10 and 13 and no others, so this paragraph displaces it.",
1419
+ "gap": "Unlike `rule:13a`/`rule:15a:keep_out_of_the_way`, this entry does not gate on `other:hist:was_overtaking`, so it still names self give-way when the other vessel holds 13(d)'s overtaking history. Q-58."
1407
1420
  },
1408
1421
  {
1409
1422
  "id": "rule:18a_iv",
@@ -1430,7 +1443,8 @@
1430
1443
  "self": "role:give-way",
1431
1444
  "other": "role:stand-on"
1432
1445
  },
1433
- "note": "A sailing vessel that is also fishing decodes to `rule18_class:fishing` and is ranked by 18(a)(iii), so the class alone carries what the old predicate needed a propulsion gate and an activity list to say."
1446
+ "note": "A sailing vessel that is also fishing decodes to `rule18_class:fishing` and is ranked by 18(a)(iii), so the class alone carries what the old predicate needed a propulsion gate and an activity list to say.",
1447
+ "gap": "Unlike `rule:13a`/`rule:15a:keep_out_of_the_way`, this entry does not gate on `other:hist:was_overtaking`, so it still names self give-way when the other vessel holds 13(d)'s overtaking history. Q-58."
1434
1448
  },
1435
1449
  {
1436
1450
  "id": "rule:18b_i",
@@ -1455,7 +1469,8 @@
1455
1469
  "rule:12a_ii",
1456
1470
  "rule:12a_iii"
1457
1471
  ],
1458
- "note": "Self is `rule18_class:sail`, which is 3(c)'s sailing vessel and not a fishing vessel under sail -- the class carries both halves of what the propulsion gate and the activity list used to say between them. Overrides the three Rule 12 entries (Q-40): both subjects can be sailing vessels by 3(c) -- the other under sail and not under command, restricted in her ability to manoeuvre, or engaged in fishing -- so Rule 12 is in force between them too, and Rule 18's chapeau excepts only Rules 9, 10 and 13."
1472
+ "note": "Self is `rule18_class:sail`, which is 3(c)'s sailing vessel and not a fishing vessel under sail -- the class carries both halves of what the propulsion gate and the activity list used to say between them. Overrides the three Rule 12 entries (Q-40): both subjects can be sailing vessels by 3(c) -- the other under sail and not under command, restricted in her ability to manoeuvre, or engaged in fishing -- so Rule 12 is in force between them too, and Rule 18's chapeau excepts only Rules 9, 10 and 13.",
1473
+ "gap": "Unlike `rule:13a`/`rule:15a:keep_out_of_the_way`, this entry does not gate on `other:hist:was_overtaking`, so it still names self give-way when the other vessel holds 13(d)'s overtaking history. Q-58."
1459
1474
  },
1460
1475
  {
1461
1476
  "id": "rule:18b_ii",
@@ -1480,7 +1495,8 @@
1480
1495
  "rule:12a_ii",
1481
1496
  "rule:12a_iii"
1482
1497
  ],
1483
- "note": "Overrides the three Rule 12 entries (Q-40): both subjects can be sailing vessels by 3(c) -- the other under sail and not under command, restricted in her ability to manoeuvre, or engaged in fishing -- so Rule 12 is in force between them too, and Rule 18's chapeau excepts only Rules 9, 10 and 13."
1498
+ "note": "Overrides the three Rule 12 entries (Q-40): both subjects can be sailing vessels by 3(c) -- the other under sail and not under command, restricted in her ability to manoeuvre, or engaged in fishing -- so Rule 12 is in force between them too, and Rule 18's chapeau excepts only Rules 9, 10 and 13.",
1499
+ "gap": "Unlike `rule:13a`/`rule:15a:keep_out_of_the_way`, this entry does not gate on `other:hist:was_overtaking`, so it still names self give-way when the other vessel holds 13(d)'s overtaking history. Q-58."
1484
1500
  },
1485
1501
  {
1486
1502
  "id": "rule:18b_iii",
@@ -1505,7 +1521,8 @@
1505
1521
  "rule:12a_ii",
1506
1522
  "rule:12a_iii"
1507
1523
  ],
1508
- "note": "Overrides the three Rule 12 entries (Q-40): both subjects can be sailing vessels by 3(c) -- the other under sail and not under command, restricted in her ability to manoeuvre, or engaged in fishing -- so Rule 12 is in force between them too, and Rule 18's chapeau excepts only Rules 9, 10 and 13."
1524
+ "note": "Overrides the three Rule 12 entries (Q-40): both subjects can be sailing vessels by 3(c) -- the other under sail and not under command, restricted in her ability to manoeuvre, or engaged in fishing -- so Rule 12 is in force between them too, and Rule 18's chapeau excepts only Rules 9, 10 and 13.",
1525
+ "gap": "Unlike `rule:13a`/`rule:15a:keep_out_of_the_way`, this entry does not gate on `other:hist:was_overtaking`, so it still names self give-way when the other vessel holds 13(d)'s overtaking history. Q-58."
1509
1526
  },
1510
1527
  {
1511
1528
  "id": "rule:18c_i",
@@ -1531,7 +1548,8 @@
1531
1548
  "rule:12a_iii",
1532
1549
  "rule:15a:keep_out_of_the_way"
1533
1550
  ],
1534
- "note": "'so far as possible' is the practicability qualifier, so the modality is shall-if-practicable. 18(c) does not distinguish propulsion, and `rule18_class:fishing` does not either: a fishing vessel under sail is ranked here. Overrides the three Rule 12 entries (Q-40): a vessel engaged in fishing under sail is a sailing vessel by 3(c), and if the vessel she must keep out of the way of is under sail as well, Rule 12 is in force between them; Rule 18's chapeau excepts only Rules 9, 10 and 13. It overrides `rule:15a:keep_out_of_the_way` on the same ground (Q-40): a fishing vessel under power and a vessel not under command under power are two power-driven vessels by 3(b), so Rule 15 is in force between them too."
1551
+ "note": "'so far as possible' is the practicability qualifier, so the modality is shall-if-practicable. 18(c) does not distinguish propulsion, and `rule18_class:fishing` does not either: a fishing vessel under sail is ranked here. Overrides the three Rule 12 entries (Q-40): a vessel engaged in fishing under sail is a sailing vessel by 3(c), and if the vessel she must keep out of the way of is under sail as well, Rule 12 is in force between them; Rule 18's chapeau excepts only Rules 9, 10 and 13. It overrides `rule:15a:keep_out_of_the_way` on the same ground (Q-40): a fishing vessel under power and a vessel not under command under power are two power-driven vessels by 3(b), so Rule 15 is in force between them too.",
1552
+ "gap": "Unlike `rule:13a`/`rule:15a:keep_out_of_the_way`, this entry does not gate on `other:hist:was_overtaking`, so it still names self give-way when the other vessel holds 13(d)'s overtaking history. Q-58."
1535
1553
  },
1536
1554
  {
1537
1555
  "id": "rule:18c_ii",
@@ -1557,7 +1575,8 @@
1557
1575
  "rule:12a_iii",
1558
1576
  "rule:15a:keep_out_of_the_way"
1559
1577
  ],
1560
- "note": "Overrides the three Rule 12 entries (Q-40): a vessel engaged in fishing under sail is a sailing vessel by 3(c), and if the vessel she must keep out of the way of is under sail as well, Rule 12 is in force between them; Rule 18's chapeau excepts only Rules 9, 10 and 13. It overrides `rule:15a:keep_out_of_the_way` on the same ground (Q-40): a fishing vessel under power and a vessel restricted in her ability to manoeuvre under power are two power-driven vessels by 3(b), so Rule 15 is in force between them too."
1578
+ "note": "Overrides the three Rule 12 entries (Q-40): a vessel engaged in fishing under sail is a sailing vessel by 3(c), and if the vessel she must keep out of the way of is under sail as well, Rule 12 is in force between them; Rule 18's chapeau excepts only Rules 9, 10 and 13. It overrides `rule:15a:keep_out_of_the_way` on the same ground (Q-40): a fishing vessel under power and a vessel restricted in her ability to manoeuvre under power are two power-driven vessels by 3(b), so Rule 15 is in force between them too.",
1579
+ "gap": "Unlike `rule:13a`/`rule:15a:keep_out_of_the_way`, this entry does not gate on `other:hist:was_overtaking`, so it still names self give-way when the other vessel holds 13(d)'s overtaking history. Q-58."
1561
1580
  },
1562
1581
  {
1563
1582
  "id": "rule:18d_i",
@@ -1835,7 +1854,8 @@
1835
1854
  "self": "role:give-way",
1836
1855
  "other": "role:stand-on"
1837
1856
  },
1838
- "note": "Each has the wind on a different side, so the vessel with the wind on the port side keeps out of the way. Evaluated from self's side, so the mirror case -- self on starboard, other on port -- is this same entry read on the swapped situation, and it is what makes the other vessel stand-on. 'Two sailing vessels' is 3(c), so both subjects are gated on `fact:propulsion: propulsion:sail` and not on `rule18_class:sail` (Q-40): a vessel engaged in fishing under sail, or not under command under sail, is a sailing vessel by 3(c) and is inside Rule 12. Where Rule 18 also ranks the pair -- 18(b) from the ordinary sailing vessel's side, 18(c) from the fishing vessel's -- that entry carries `rel:overrides` against this one, because Rule 18's opening words except Rules 9, 10 and 13 and no others; 13(a)'s 'notwithstanding' overrides it the same way. Between two sailing vessels Rule 18 leaves unordered -- one not under command and one restricted in her ability to manoeuvre -- this entry is the only norm in force, and it lays a helm duty on a vessel that may be unable to discharge it; that is Rule 2's region and is recorded in Q-40 rather than gated away."
1857
+ "note": "Each has the wind on a different side, so the vessel with the wind on the port side keeps out of the way. Evaluated from self's side, so the mirror case -- self on starboard, other on port -- is this same entry read on the swapped situation, and it is what makes the other vessel stand-on. 'Two sailing vessels' is 3(c), so both subjects are gated on `fact:propulsion: propulsion:sail` and not on `rule18_class:sail` (Q-40): a vessel engaged in fishing under sail, or not under command under sail, is a sailing vessel by 3(c) and is inside Rule 12. Where Rule 18 also ranks the pair -- 18(b) from the ordinary sailing vessel's side, 18(c) from the fishing vessel's -- that entry carries `rel:overrides` against this one, because Rule 18's opening words except Rules 9, 10 and 13 and no others; 13(a)'s 'notwithstanding' overrides it the same way. Between two sailing vessels Rule 18 leaves unordered -- one not under command and one restricted in her ability to manoeuvre -- this entry is the only norm in force, and it lays a helm duty on a vessel that may be unable to discharge it; that is Rule 2's region and is recorded in Q-40 rather than gated away.",
1858
+ "gap": "Unlike `rule:13a`/`rule:15a:keep_out_of_the_way`, this entry does not gate on `other:hist:was_overtaking`, so it still names self give-way when the other vessel holds 13(d)'s overtaking history. Q-58."
1839
1859
  },
1840
1860
  {
1841
1861
  "id": "rule:12a_ii",
@@ -1867,7 +1887,8 @@
1867
1887
  "self": "role:give-way",
1868
1888
  "other": "role:stand-on"
1869
1889
  },
1870
- "note": "Both have the wind on the same side, so the windward vessel keeps clear. 'The same side' is a comparison between two facts and the predicate language compares a fact to a constant, so the disjunction is written out over the two values the comparison can take -- which is why `wind_side:unknown` on either subject falls through to 12(a)(iii) rather than into this entry. 'Two sailing vessels' is 3(c), so both subjects are gated on `fact:propulsion: propulsion:sail` and not on `rule18_class:sail` (Q-40): a vessel engaged in fishing under sail, or not under command under sail, is a sailing vessel by 3(c) and is inside Rule 12. Where Rule 18 also ranks the pair -- 18(b) from the ordinary sailing vessel's side, 18(c) from the fishing vessel's -- that entry carries `rel:overrides` against this one, because Rule 18's opening words except Rules 9, 10 and 13 and no others; 13(a)'s 'notwithstanding' overrides it the same way. Between two sailing vessels Rule 18 leaves unordered -- one not under command and one restricted in her ability to manoeuvre -- this entry is the only norm in force, and it lays a helm duty on a vessel that may be unable to discharge it; that is Rule 2's region and is recorded in Q-40 rather than gated away."
1890
+ "note": "Both have the wind on the same side, so the windward vessel keeps clear. 'The same side' is a comparison between two facts and the predicate language compares a fact to a constant, so the disjunction is written out over the two values the comparison can take -- which is why `wind_side:unknown` on either subject falls through to 12(a)(iii) rather than into this entry. 'Two sailing vessels' is 3(c), so both subjects are gated on `fact:propulsion: propulsion:sail` and not on `rule18_class:sail` (Q-40): a vessel engaged in fishing under sail, or not under command under sail, is a sailing vessel by 3(c) and is inside Rule 12. Where Rule 18 also ranks the pair -- 18(b) from the ordinary sailing vessel's side, 18(c) from the fishing vessel's -- that entry carries `rel:overrides` against this one, because Rule 18's opening words except Rules 9, 10 and 13 and no others; 13(a)'s 'notwithstanding' overrides it the same way. Between two sailing vessels Rule 18 leaves unordered -- one not under command and one restricted in her ability to manoeuvre -- this entry is the only norm in force, and it lays a helm duty on a vessel that may be unable to discharge it; that is Rule 2's region and is recorded in Q-40 rather than gated away.",
1891
+ "gap": "Unlike `rule:13a`/`rule:15a:keep_out_of_the_way`, this entry does not gate on `other:hist:was_overtaking`, so it still names self give-way when the other vessel holds 13(d)'s overtaking history. Q-58."
1871
1892
  },
1872
1893
  {
1873
1894
  "id": "rule:12a_iii",
@@ -1891,7 +1912,8 @@
1891
1912
  "self": "role:give-way",
1892
1913
  "other": "role:stand-on"
1893
1914
  },
1894
- "note": "The doubt case, and the one paragraph of Rule 12 that is expressible only because uncertainty is a declared value of the fact rather than the fact's absence. `wind_side:unknown` on the other subject is 'cannot determine with certainty', and an absent fact would have been the wrong model for it: absent satisfies nothing, so silence would have relieved self of a duty the paragraph imposes. This is the shape 13(c) and 14(c) would need and do not have -- Q-41. 'Two sailing vessels' is 3(c), so both subjects are gated on `fact:propulsion: propulsion:sail` and not on `rule18_class:sail` (Q-40): a vessel engaged in fishing under sail, or not under command under sail, is a sailing vessel by 3(c) and is inside Rule 12. Where Rule 18 also ranks the pair -- 18(b) from the ordinary sailing vessel's side, 18(c) from the fishing vessel's -- that entry carries `rel:overrides` against this one, because Rule 18's opening words except Rules 9, 10 and 13 and no others; 13(a)'s 'notwithstanding' overrides it the same way. Between two sailing vessels Rule 18 leaves unordered -- one not under command and one restricted in her ability to manoeuvre -- this entry is the only norm in force, and it lays a helm duty on a vessel that may be unable to discharge it; that is Rule 2's region and is recorded in Q-40 rather than gated away."
1915
+ "note": "The doubt case, and the one paragraph of Rule 12 that is expressible only because uncertainty is a declared value of the fact rather than the fact's absence. `wind_side:unknown` on the other subject is 'cannot determine with certainty', and an absent fact would have been the wrong model for it: absent satisfies nothing, so silence would have relieved self of a duty the paragraph imposes. This is the shape 13(c) and 14(c) would need and do not have -- Q-41. 'Two sailing vessels' is 3(c), so both subjects are gated on `fact:propulsion: propulsion:sail` and not on `rule18_class:sail` (Q-40): a vessel engaged in fishing under sail, or not under command under sail, is a sailing vessel by 3(c) and is inside Rule 12. Where Rule 18 also ranks the pair -- 18(b) from the ordinary sailing vessel's side, 18(c) from the fishing vessel's -- that entry carries `rel:overrides` against this one, because Rule 18's opening words except Rules 9, 10 and 13 and no others; 13(a)'s 'notwithstanding' overrides it the same way. Between two sailing vessels Rule 18 leaves unordered -- one not under command and one restricted in her ability to manoeuvre -- this entry is the only norm in force, and it lays a helm duty on a vessel that may be unable to discharge it; that is Rule 2's region and is recorded in Q-40 rather than gated away.",
1916
+ "gap": "Unlike `rule:13a`/`rule:15a:keep_out_of_the_way`, this entry does not gate on `other:hist:was_overtaking`, so it still names self give-way when the other vessel holds 13(d)'s overtaking history. Q-58."
1895
1917
  },
1896
1918
  {
1897
1919
  "id": "rule:13b",
@@ -2175,6 +2197,109 @@
2175
2197
  ],
2176
2198
  "modality": "modality:may",
2177
2199
  "note": "The under-50 m alternative, on the same 33 CFR 90.5 deeming that brings rule:30a:mooring_buoy in. It is a separate entry because widening rule:30b's predicate would edit an intl entry to carry a national delta, which REQ-SCOPE-4 forbids."
2200
+ },
2201
+ {
2202
+ "id": "rule:23d",
2203
+ "jurisdiction": "us/inland",
2204
+ "cite": "23(d)",
2205
+ "when": {
2206
+ "fact:propulsion": "propulsion:power",
2207
+ "fact:activity": "activity:none",
2208
+ "fact:position": "position:underway",
2209
+ "fact:length_m": {
2210
+ "lt": 12
2211
+ }
2212
+ },
2213
+ "lights": [
2214
+ {
2215
+ "light": "light:all_round",
2216
+ "color": "white",
2217
+ "count": 1
2218
+ },
2219
+ {
2220
+ "light": "light:sidelights"
2221
+ }
2222
+ ],
2223
+ "rel:in_lieu_of": [
2224
+ "rule:23a_i",
2225
+ "rule:23a_ii",
2226
+ "rule:23a_iii_iv"
2227
+ ],
2228
+ "modality": "modality:may",
2229
+ "images": [
2230
+ "NRHB_23_di.png"
2231
+ ],
2232
+ "note": "33 CFR 83.23(d) is the under-12 m provision as a single paragraph, not (d)(i): the norm is intl 23(d)(i), the path is not, so the intl entry is tombstoned and this one replaces it (ADR 0018 point 3, ADR 0020)."
2233
+ },
2234
+ {
2235
+ "id": "rule:24c:towing_lights",
2236
+ "jurisdiction": "us/inland",
2237
+ "cite": "24(c)",
2238
+ "when": {
2239
+ "fact:activity": "activity:pushing",
2240
+ "fact:composite_unit": false
2241
+ },
2242
+ "lights": [
2243
+ {
2244
+ "light": "light:masthead",
2245
+ "count": 2,
2246
+ "arrangement": "vertical"
2247
+ }
2248
+ ],
2249
+ "rel:in_lieu_of": [
2250
+ "rule:23a_i",
2251
+ "rule:23a_ii"
2252
+ ],
2253
+ "modality": "modality:shall",
2254
+ "note": "33 CFR 83.24(c)(iii) replaces the international sternlight with two towing lights for a vessel pushing ahead or towing alongside; masthead is unconditional like rule:24c, sidelights and towing lights join only once underway as the sibling entry rule:24c:underway_lights (own predicate, no import, so nothing double-counts), and rule:24c is suppressed and replaced here rather than edited (REQ-SCOPE-4, Q-11, ADR 0018 point 3)."
2255
+ },
2256
+ {
2257
+ "id": "rule:24c:underway_lights",
2258
+ "jurisdiction": "us/inland",
2259
+ "cite": "24(c)",
2260
+ "when": {
2261
+ "fact:activity": "activity:pushing",
2262
+ "fact:composite_unit": false,
2263
+ "fact:position": "position:underway"
2264
+ },
2265
+ "lights": [
2266
+ {
2267
+ "light": "light:sidelights"
2268
+ },
2269
+ {
2270
+ "light": "light:towing",
2271
+ "count": 2,
2272
+ "arrangement": "vertical"
2273
+ }
2274
+ ],
2275
+ "modality": "modality:shall",
2276
+ "note": "The underway-gated half of rule:24c:towing_lights's display, split out so the import reads only sidelights and towing lights, never the sternlight rule:23a_iii_iv still carries for the unreplaced intl paragraph (ADR 0019 point 3: an import reads a referenced entry's lights, never its axes, so the two must stay separate entries rather than one gated by activity elsewhere)."
2277
+ }
2278
+ ],
2279
+ "suppressions": [
2280
+ {
2281
+ "jurisdiction": "us/inland",
2282
+ "suppresses": "rule:23d_i",
2283
+ "cite": "23(d)(i)",
2284
+ "why": "33 CFR 83.23(d) has no (i); the same norm is rule:23d at bare 23(d), so this is a replace, not an absence (ADR 0018, ADR 0020)."
2285
+ },
2286
+ {
2287
+ "jurisdiction": "us/inland",
2288
+ "suppresses": "rule:28",
2289
+ "cite": "28",
2290
+ "why": "33 CFR 83.28 is [Reserved]: 'constrained by her draft' is not an Inland Rules status, so the Rule 28 signal is deliberately absent under us/inland rather than untranscribed (Q-11, ADR 0018)."
2291
+ },
2292
+ {
2293
+ "jurisdiction": "us/inland",
2294
+ "suppresses": "rule:23d_ii",
2295
+ "cite": "23(d)(ii)",
2296
+ "why": "33 CFR 83.23(d) is a single paragraph with no counterpart to the under-7 m, 7 kn exception of 23(d)(ii); the exception is deliberately absent under us/inland (Q-11, ADR 0018)."
2297
+ },
2298
+ {
2299
+ "jurisdiction": "us/inland",
2300
+ "suppresses": "rule:24c",
2301
+ "cite": "24(c)",
2302
+ "why": "33 CFR 83.24(c)(iii) replaces the international sternlight with two towing lights in a vertical line, so rule:24c does not hold as stated under us/inland; rule:24c:towing_lights is the replacement (Q-11, ADR 0018 point 3)."
2178
2303
  }
2179
2304
  ]
2180
2305
  }
package/data/corpora.json CHANGED
@@ -10,14 +10,14 @@
10
10
  "tier": "national",
11
11
  "paragraphs": 212
12
12
  },
13
- "intl@2016.fi.finlex": {
14
- "file": "text/intl/2016/fi.finlex.json",
15
- "edition": "intl@2016",
16
- "edition_status": "claimed",
13
+ "intl@1977.fi.finlex": {
14
+ "file": "text/intl/1977/fi.finlex.json",
15
+ "edition": "intl@1977",
16
+ "edition_status": "verified",
17
17
  "language": "fi",
18
18
  "source_id": "finlex",
19
19
  "tier": "national",
20
- "paragraphs": 0
20
+ "paragraphs": 194
21
21
  },
22
22
  "intl@2016.es.boe": {
23
23
  "file": "text/intl/2016/es.boe.json",
@@ -9,17 +9,22 @@
9
9
  "amended_through": "A.1085(28)",
10
10
  "in_force": "2016-01-01",
11
11
  "note": "2013 amendment (Part F) verified on imo.org; the resolution number and date are recalled, not yet verified against the resolution text -- REQ-LANG-10."
12
+ },
13
+ "intl@1977": {
14
+ "amended_through": "none (original 1972 text as promulgated)",
15
+ "in_force": "1977-07-15",
16
+ "note": "The 1972 Convention as promulgated in Finland (SopS 30/1977), before any IMO amendment. Verified against the Finlex text itself (REQ-LANG-10): it lacks Rule 3(m), 8(f), 10(d)(ii)/(k)/(l), 18(f), 22(d), 23(c), 23(d)(i)/(iii), 24(g)-(i), 27(e)(i) and 30(f); its own 23(c) is the paragraph now numbered 23(d)(ii) and its 24(g) the one now numbered 24(h). The corpus gaps say which amendment each belongs to."
12
17
  }
13
18
  }
14
19
  },
15
20
  "us/inland": {
16
21
  "instrument": "33 CFR Part 83, Inland Navigation Rules",
17
- "skeleton": null,
22
+ "skeleton": "us/inland@2014",
18
23
  "editions": {
19
24
  "us/inland@2014": {
20
25
  "amended_through": "79 FR 37898 (2014 final rule)",
21
26
  "in_force": "2014-08-01",
22
- "note": "Recalled, not verified; a stub edition so the second jurisdiction has one to name -- REQ-LANG-10."
27
+ "note": "Provisional edition id: the Part C skeleton delta was verified against current eCFR text, not the 2014 final rule. Cornell's own source credit on 83.24 runs through 84 FR 30878 (June 28, 2019); this id and amended_through are unverified against the Federal Register and will be corrected or renamed once the corpus fetch settles which amendment the text reflects -- REQ-LANG-10, ADR 0020."
23
28
  }
24
29
  }
25
30
  }
package/data/i18n/en.json CHANGED
@@ -7,21 +7,87 @@
7
7
  "reviewed_by": [
8
8
  "mark-brannan"
9
9
  ],
10
- "review_date": "2026-09-13"
10
+ "review_date": "2026-09-16"
11
11
  },
12
12
  "strings": {
13
- "light": {
13
+ "lights": {
14
14
  "light:masthead": "Masthead light",
15
+ "light:sidelights": "Sidelights",
15
16
  "light:sidelight_starboard": "Starboard sidelight",
16
17
  "light:sidelight_port": "Port sidelight",
17
18
  "light:sternlight": "Sternlight",
18
19
  "light:towing": "Towing light",
19
- "light:all_round": "All-round light"
20
+ "light:all_round": "All-round light",
21
+ "light:flashing": "Flashing light",
22
+ "light:torch": "Electric torch or lighted lantern",
23
+ "light:deck_lights": "Working or equivalent lights"
20
24
  },
21
- "modality": {
25
+ "modalities": {
22
26
  "modality:shall": "Required",
23
27
  "modality:may": "Permitted",
24
- "modality:shall-if-practicable": "Required if practicable"
28
+ "modality:shall-if-practicable": "Required if practicable",
29
+ "modality:conditional": "Conditional",
30
+ "modality:exempt": "Exempt",
31
+ "modality:shall-not": "Prohibited",
32
+ "modality:shall-not-impede": "Must not impede"
33
+ },
34
+ "roles": {
35
+ "role:give-way": "Give way",
36
+ "role:stand-on": "Stand on",
37
+ "role:shall-not-impede": "Must not impede",
38
+ "role:keep-clear": "Keep clear",
39
+ "role:none": "No role"
40
+ },
41
+ "encounters": {
42
+ "encounter:head-on": "Head-on",
43
+ "encounter:crossing": "Crossing",
44
+ "encounter:overtaking": "Overtaking",
45
+ "encounter:none": "No encounter"
46
+ },
47
+ "jurisdictions": {
48
+ "intl": "International",
49
+ "us/inland": "US Inland"
50
+ },
51
+ "facts": {
52
+ "propulsion:power": "Power-driven",
53
+ "propulsion:sail": "Sailing",
54
+ "propulsion:oars": "Oars",
55
+ "activity:none": "None",
56
+ "activity:fishing": "Fishing",
57
+ "activity:trawling": "Trawling",
58
+ "activity:towing": "Towing",
59
+ "activity:pushing": "Pushing",
60
+ "activity:being_towed": "Being towed",
61
+ "activity:nuc": "Not under command",
62
+ "activity:ram": "Restricted in her ability to manoeuvre",
63
+ "activity:ram_underwater": "Restricted in her ability to manoeuvre, engaged in underwater operations",
64
+ "activity:cbd": "Constrained by her draught",
65
+ "activity:mine": "Engaged in minesweeping",
66
+ "activity:pilot": "Engaged on pilotage duty",
67
+ "activity:diving": "Engaged in diving operations",
68
+ "position:underway": "Underway",
69
+ "position:anchored": "At anchor",
70
+ "position:aground": "Aground",
71
+ "position:moored": "Moored",
72
+ "rule18_class:nuc": "Not under command",
73
+ "rule18_class:ram": "Restricted in ability to manoeuvre",
74
+ "rule18_class:fishing": "Fishing",
75
+ "rule18_class:wig": "Wing-in-ground craft",
76
+ "rule18_class:cbd": "Constrained by draught",
77
+ "rule18_class:sail": "Sailing vessel",
78
+ "rule18_class:power": "Power-driven vessel",
79
+ "dynamics:tanker": "Tanker",
80
+ "dynamics:cargo": "Cargo ship",
81
+ "dynamics:ferry": "Ferry",
82
+ "dynamics:fishing": "Fishing vessel",
83
+ "dynamics:yacht": "Yacht",
84
+ "dynamics:rib": "RIB",
85
+ "dynamics:unknown": "Unknown",
86
+ "obstruction_side:port": "Port",
87
+ "obstruction_side:starboard": "Starboard",
88
+ "wind_side:port": "Port",
89
+ "wind_side:starboard": "Starboard",
90
+ "wind_side:unknown": "Unknown"
25
91
  }
26
92
  }
27
93
  }
package/data/i18n/fi.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "review_date": "2026-09-15"
9
9
  },
10
10
  "strings": {
11
- "light": {
11
+ "lights": {
12
12
  "light:masthead": "Mastovalo",
13
13
  "light:sidelight_starboard": "Oikea sivuvalo",
14
14
  "light:sidelight_port": "Vasen sivuvalo",
@@ -16,7 +16,7 @@
16
16
  "light:towing": "Hinausvalo",
17
17
  "light:all_round": "Ympäri näköpiirin näkyvä valo"
18
18
  },
19
- "modality": {
19
+ "modalities": {
20
20
  "modality:shall": "Pakollinen",
21
21
  "modality:may": "Sallittu",
22
22
  "modality:shall-if-practicable": "Pakollinen, jos mahdollista"
package/data/images.json CHANGED
@@ -157,10 +157,12 @@
157
157
  "Power Driven Vessel less than 12m"
158
158
  ],
159
159
  "paragraphs": [
160
- "23(d)(i)"
160
+ "23(d)(i)",
161
+ "23(d)"
161
162
  ],
162
163
  "entries": [
163
- "rule:23d_i"
164
+ "rule:23d_i",
165
+ "rule:23d"
164
166
  ],
165
167
  "depicts": "provision",
166
168
  "transcript": [
@@ -196,7 +198,10 @@
196
198
  ],
197
199
  "description": "Twenty-odd flat hatch covers fill a long straight-sided cargo deck between a forward deckhouse with bridge windows and an after machinery house with a squat funnel: a Great Lakes bulk carrier. She is drawn from above and off the starboard bow, stem to the right, the hull closed by a dashed waterline and no sea beneath. A white lobe caps the short mast on the after house, a second sits on the mast above the forward bridge, and red and green lobes stand either side of that bridge front. No day shapes or inset panels appear.",
198
200
  "shapes": [],
199
- "unmapped_reason": "illustrates a paragraph outside this release's scope (inland-only, or a rule family not in the table)"
201
+ "paragraphs": [
202
+ "23(e)"
203
+ ],
204
+ "depicts": "provision"
200
205
  },
201
206
  "NRHB_24_a.png": {
202
207
  "file": "NRHB_24_a.png",
@@ -416,7 +421,10 @@
416
421
  ],
417
422
  "description": "Square push knees on a small tug are set hard against the flat end of a long box barge, the two drawn as one unit running from upper left to lower right. The view is from above and off the port quarter, with a dashed waterline and no sea. On the tug two white lobes stand in a line on the mast, a green strip runs along the near side of her bridge and a red lobe shows beyond, and two yellow lobes burn one above the other on a staff at her stern. At the head of the tow two yellow lobes sit together with a red lobe outboard and a green lobe on the near side.",
418
423
  "shapes": [],
419
- "unmapped_reason": "illustrates a paragraph outside this release's scope (inland-only, or a rule family not in the table)"
424
+ "paragraphs": [
425
+ "24(j)"
426
+ ],
427
+ "depicts": "provision"
420
428
  },
421
429
  "NRHB_25_a.png": {
422
430
  "file": "NRHB_25_a.png",
package/data/lights.json CHANGED
@@ -8,8 +8,7 @@
8
8
  },
9
9
  "lights": {
10
10
  "light:masthead": {
11
- "name": "masthead light",
12
- "colregs_term": "masthead light",
11
+ "term": "masthead light",
13
12
  "cite": "21(a)",
14
13
  "color": "white",
15
14
  "character": "steady",
@@ -22,8 +21,7 @@
22
21
  "rule21": true
23
22
  },
24
23
  "light:sidelights": {
25
- "name": "sidelights",
26
- "colregs_term": "sidelights",
24
+ "term": "sidelights",
27
25
  "cite": "21(b)",
28
26
  "character": "steady",
29
27
  "composite": true,
@@ -36,8 +34,7 @@
36
34
  "rule21": true
37
35
  },
38
36
  "light:sidelight_starboard": {
39
- "name": "starboard sidelight",
40
- "colregs_term": "sidelight",
37
+ "term": "sidelight",
41
38
  "cite": "21(b)",
42
39
  "color": "green",
43
40
  "character": "steady",
@@ -50,8 +47,7 @@
50
47
  "rule21": true
51
48
  },
52
49
  "light:sidelight_port": {
53
- "name": "port sidelight",
54
- "colregs_term": "sidelight",
50
+ "term": "sidelight",
55
51
  "cite": "21(b)",
56
52
  "color": "red",
57
53
  "character": "steady",
@@ -64,8 +60,7 @@
64
60
  "rule21": true
65
61
  },
66
62
  "light:sternlight": {
67
- "name": "sternlight",
68
- "colregs_term": "sternlight",
63
+ "term": "sternlight",
69
64
  "cite": "21(c)",
70
65
  "color": "white",
71
66
  "character": "steady",
@@ -78,8 +73,7 @@
78
73
  "rule21": true
79
74
  },
80
75
  "light:towing": {
81
- "name": "towing light",
82
- "colregs_term": "towing light",
76
+ "term": "towing light",
83
77
  "cite": "21(d)",
84
78
  "color": "yellow",
85
79
  "character": "steady",
@@ -92,8 +86,7 @@
92
86
  "rule21": true
93
87
  },
94
88
  "light:all_round": {
95
- "name": "all-round light",
96
- "colregs_term": "all-round light",
89
+ "term": "all-round light",
97
90
  "cite": "21(e)",
98
91
  "color": null,
99
92
  "color_note": "colour is fixed by the citing paragraph, not by Rule 21",
@@ -106,8 +99,7 @@
106
99
  "rule21": true
107
100
  },
108
101
  "light:flashing": {
109
- "name": "flashing light",
110
- "colregs_term": "flashing light",
102
+ "term": "flashing light",
111
103
  "cite": "21(f)",
112
104
  "color": null,
113
105
  "color_note": "colour is fixed by the citing paragraph",
@@ -122,8 +114,7 @@
122
114
  "rule21": true
123
115
  },
124
116
  "light:torch": {
125
- "name": "electric torch or lighted lantern",
126
- "colregs_term": "electric torch or lighted lantern",
117
+ "term": "electric torch or lighted lantern",
127
118
  "cite": "25(d)(i)",
128
119
  "color": "white",
129
120
  "character": "shown in sufficient time to prevent collision",
@@ -133,8 +124,7 @@
133
124
  "note": "Not a fixed navigation light: it is held ready at hand and shown on approach. It has no prescribed arc, range or position."
134
125
  },
135
126
  "light:deck_lights": {
136
- "name": "working or equivalent lights",
137
- "colregs_term": "working or equivalent lights",
127
+ "term": "working or equivalent lights",
138
128
  "cite": "30(c)",
139
129
  "color": null,
140
130
  "character": "steady",