colregs 0.1.1 → 0.2.2

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 (37) hide show
  1. package/LICENSE +194 -26
  2. package/PROVENANCE.md +45 -12
  3. package/README.md +222 -23
  4. package/data/applicability.json +1252 -190
  5. package/data/deprecated-identifiers.json +7 -0
  6. package/data/facts.json +556 -113
  7. package/data/geometry.json +33 -33
  8. package/data/images.json +51 -25
  9. package/data/lights.json +35 -35
  10. package/data/rules.json +787 -3
  11. package/docs/adr/0001-name-and-jurisdiction-model.md +119 -1
  12. package/docs/adr/0003-language-as-a-dimension.md +220 -0
  13. package/docs/adr/0004-licence-layering.md +78 -0
  14. package/docs/adr/0005-rule-categories-and-the-situation-record.md +323 -0
  15. package/docs/adr/0006-json-schema-and-identifier-diff.md +95 -0
  16. package/docs/adr/0007-rule26-overrides-and-aground.md +68 -0
  17. package/docs/adr/0008-mooring-buoy-modifier.md +87 -0
  18. package/docs/budgets.json +162 -0
  19. package/docs/conventions.md +27 -0
  20. package/docs/gates.json +84 -0
  21. package/docs/identifiers.md +435 -0
  22. package/docs/part-b-invariants.md +922 -0
  23. package/docs/requirements.md +1251 -23
  24. package/docs/verification/2026-08-30-q6-q8.md +278 -0
  25. package/docs/verification/2026-09-05-rule27f-rule28-anchor-scenarios.md +330 -0
  26. package/fixtures/applicability-fixtures.json +361 -227
  27. package/fixtures/situation-fixtures.json +3673 -0
  28. package/package.json +16 -4
  29. package/schema/applicability-fixtures.schema.json +49 -0
  30. package/schema/applicability.schema.json +401 -0
  31. package/schema/deprecated-identifiers.schema.json +29 -0
  32. package/schema/facts.schema.json +793 -0
  33. package/schema/geometry.schema.json +239 -0
  34. package/schema/images.schema.json +53 -0
  35. package/schema/lights.schema.json +131 -0
  36. package/schema/rules.schema.json +50 -0
  37. package/schema/situation-fixtures.schema.json +325 -0
@@ -1,18 +1,49 @@
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
- "includes": "import another entry's lights only, never its predicate",
5
- "conditional_includes": "import lights when the stated `when` holds; `one_of` is a set of legal alternatives among which the vessel picks one",
6
- "in_lieu_of": "this entry's lights replace the referenced entries' lights",
7
- "excludes": "the referenced entries must not be shown at the same time",
8
- "exempts": "the referenced entries are not required"
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"
9
10
  },
10
11
  "modalities": {
11
12
  "shall": "mandatory",
12
13
  "may": "permitted alternative",
13
14
  "shall-if-practicable": "mandatory where practicable, with a stated fallback",
14
15
  "conditional": "modality depends on facts; see modality_by",
15
- "exempt": "the entry relieves a requirement rather than imposing one"
16
+ "exempt": "the entry relieves a requirement rather than imposing one",
17
+ "shall-not": "mandatory prohibition",
18
+ "shall-not-impede": "a distinct duty to avoid impeding another vessel, not a negated shall"
19
+ },
20
+ "categories": {
21
+ "definition": "produces vocabulary; not evaluated",
22
+ "standard": "produces technical values (ranges, heights); not evaluated",
23
+ "scope": "reads visibility, in-sight, jurisdiction; the engine derives which sections apply",
24
+ "display": "reads one vessel's facts; the engine derives signals and modality",
25
+ "classification": "reads relative geometry and history; the engine derives encounter type and risk of collision",
26
+ "precedence": "reads two vessels' facts plus encounter type; the engine derives give-way/stand-on/shall-not-impede/none",
27
+ "conduct": "reads encounter, role, phase, kinematics and observations; monitored over a trace, not evaluated at a point",
28
+ "care": "reads anything; produces residual responsibility; represented, never independently evaluated",
29
+ "meta": "reads the region state; produces a banner and advisories; computed by a solver, reviewed by humans"
30
+ },
31
+ "effects": {
32
+ "note": "What a two-subject entry produces. `effect` is {\"own\": <role>, \"other\": <role>} for a `precedence` entry, {\"part\", \"section\", \"applies_rules\"} for a `scope` entry, and for a `classification` entry exactly one of {\"encounter\": <encounter>} or {\"risk_of_collision\": true}. A `display` entry has no `effect`; its output is `lights`. Roles and encounters are closed vocabularies and are not identifiers (docs/identifiers.md, 'What is not an identifier'). Pencil: ADR 0005 and docs/identifiers.md.",
33
+ "roles": {
34
+ "give-way": "this subject shall keep out of the way of the other; Rule 16 governs the action",
35
+ "stand-on": "this subject shall keep her course and speed; Rule 17 governs, including 17(a)(ii) and 17(b)",
36
+ "shall-not-impede": "this subject shall not impede the other's passage or safe passage; Rule 8(f) governs, and by 8(f)(iii) it confers nothing on the other",
37
+ "keep-clear": "this subject shall keep well clear of the other and avoid impeding her navigation, outside the give-way/stand-on pairing (18(e), 18(f)(i))",
38
+ "none": "this paragraph confers no role on this subject. Recorded rather than omitted: `none` on the counterpart of a shall-not-impede duty is the content of 8(f)(iii), and `none` on both sides of a NUC/RAM pair is the content of Rule 18's partial order."
39
+ },
40
+ "encounters": {
41
+ "head-on": "Rule 14: two power-driven vessels meeting on reciprocal or nearly reciprocal courses",
42
+ "crossing": "Rule 15: two power-driven vessels crossing. The residual of the other three, derived with `not` rather than written as its own sector, so the four cannot drift apart",
43
+ "overtaking": "Rule 13: one vessel coming up with another from more than 22.5 degrees abaft her beam, or latched there by 13(d)",
44
+ "none": "no encounter of Section II's three types. Declared for completeness of the vocabulary; no entry produces it, because an encounter type is asserted by a paragraph and the absence of one is the absence of an entry, not an entry with a null value"
45
+ },
46
+ "classification_shape": "A classification effect carries exactly one key: `encounter`, whose value is one of `encounters` above, or `risk_of_collision`, whose value is `true`. Two shapes rather than one because Rule 7(d) and Rules 13-15 answer two different questions -- does risk exist, and what kind of encounter is this -- and ADR 0005 gives both to `classification`. A single merged shape would have made every encounter entry state a risk it does not decide."
16
47
  },
17
48
  "known_omissions": [
18
49
  {
@@ -39,21 +70,87 @@
39
70
  "cite": "31",
40
71
  "what": "Seaplanes and WIG craft show the closest practicable equivalent.",
41
72
  "why": "Not expressible as a light set."
73
+ },
74
+ {
75
+ "cite": "9(d)",
76
+ "what": "A vessel shall not cross a narrow channel or fairway if such crossing impedes the passage of a vessel which can safely navigate only within that channel.",
77
+ "why": "The duty is conditioned on own crossing the channel, which is a relation between own's heading and the channel's axis. Neither the channel's axis nor 'crossing it' is a fact this package carries, and `pair:env:narrow_channel` is a boolean about the place, not a geometry. No entry rather than an entry whose predicate is not the paragraph's."
78
+ },
79
+ {
80
+ "cite": "18(d)(ii)",
81
+ "what": "A vessel constrained by her draft shall navigate with particular caution having full regard to her special condition.",
82
+ "why": "`conduct`, not `precedence`: it prescribes a manner of navigating rather than a role in a pair, and conduct is monitored over a trace rather than evaluated at a point (ADR 0005 sec. 1). No conduct entry shape exists yet."
83
+ },
84
+ {
85
+ "cite": "18(e)",
86
+ "what": "A seaplane on the water shall in general keep well clear of all vessels and avoid impeding their navigation; where risk of collision exists she shall comply with Rules 4-19.",
87
+ "why": "There is no fact for being a seaplane. `fact:propulsion` has power, sail and oars, and Rule 3(a) makes a seaplane a vessel without giving the fact record anywhere to say so. The effect vocabulary has `keep-clear` for it; the predicate does not exist."
88
+ },
89
+ {
90
+ "cite": "18(f)(ii)",
91
+ "what": "A WIG craft operating on the water surface shall comply with Rules 4-19 as a power-driven vessel.",
92
+ "why": "Not a precedence norm: it maps a WIG on the surface onto `propulsion:power` for the rest of Part B, which is a classification or a decode-table statement rather than a role in a pair. 18(f)(i) -- the phase that does change the roles -- is entry 18f1."
93
+ },
94
+ {
95
+ "cite": "1(a), 1(b), 1(c), 1(d), 1(e), 20(b), 20(c)",
96
+ "what": "The remaining `scope` paragraphs: the waters the Rules apply to, special rules made by an authority, the adoption of traffic separation schemes, the special-construction determination, and the sunset-to-sunrise and restricted-visibility gates on the light rules.",
97
+ "why": "None of them reads a fact this package declares. 1(a) needs a fact about the waters; 1(b)/(c)/(e) are about an authority's determination, which is closer to the jurisdiction dimension of ADR 0001 than to a predicate; 1(d) is not addressed to a vessel at all; 20(b)/(c) need time of day and visibility, and applicability.json's `conditions` note already records that night is assumed rather than gated. Deferred to a later PR with 4, 11 and 19(a) landing first."
98
+ },
99
+ {
100
+ "cite": "7(d)(ii)",
101
+ "what": "Risk of collision may sometimes exist even when an appreciable bearing change is evident, particularly when approaching a very large vessel or a tow or when approaching a vessel at close range.",
102
+ "why": "Three limbs and no fact behind two of them: 'very large vessel' has no length threshold anywhere in the Rules, and 'close range' has none either, so both would have to be numbers this package invented -- unlike 7(d)(i)'s, which at least thresholds a quantity the paragraph names. The third limb, a tow, is `fact:activity: activity:towing` and could be written. It is not written alone, because the paragraph's modality is the real obstacle: 'may sometimes exist' is neither a deeming rule nor a permission, it is an instruction to the mariner's judgement, and the modality vocabulary has no value for it. Recorded whole rather than modelled in thirds. Q-42."
103
+ },
104
+ {
105
+ "cite": "13(c), 14(c)",
106
+ "what": "When a vessel is in any doubt as to whether she is overtaking, or whether a head-on situation exists, she shall assume that it is the case and act accordingly.",
107
+ "why": "Doubt is a state of the observer, not a fact of the situation, and the one thing the predicate language will not do is fire on an absent fact -- which is the nearest thing to doubt it has. Modelling these would mean either a `doubt` boolean, which asks a consumer to report a mental state, or reading absence as assertion, which reverses the rule the whole language is built on. 12(a)(iii) is the same shape and is modelled, only because 12(b) makes the uncertainty a value of a fact that is present. Q-41."
108
+ },
109
+ {
110
+ "cite": "14(a)",
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
+ "why": "`conduct`, not `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 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."
42
113
  }
43
114
  ],
115
+ "represented_paragraphs": [
116
+ {
117
+ "id": "2a",
118
+ "jurisdiction": "intl",
119
+ "cite": "2(a)",
120
+ "category": "care",
121
+ "note": "Residual responsibility for every other paragraph; nothing in this package discharges it, so it is recorded rather than dropped from the model."
122
+ },
123
+ {
124
+ "id": "2b",
125
+ "jurisdiction": "intl",
126
+ "cite": "2(b)",
127
+ "category": "meta",
128
+ "note": "Names the region where a departure from the Rules may be necessary; scoped to level-1/2 invariant violations and computed offline by a solver as a region of situation space, never evaluated here as a predicate."
129
+ }
130
+ ],
131
+ "retired_entry_ids": {
132
+ "note": "Entry ids that existed and no longer do. REQ-MODEL-10 makes an identifier immutable, which means a retired id is never reused for a different entry -- recorded here so that a later session cannot reuse one by accident. The first four retirements cost no consumer anything since nothing had shipped yet; `14a` is the first to have shipped (v0.1.3), so it is deprecated rather than dropped -- see data/deprecated-identifiers.json.",
133
+ "ids": {
134
+ "9b-small": "Collapsed into `9b` when `any_of` gave the predicate language a disjunction; 9(b)'s subject needed two entries only because a `when` was a conjunction.",
135
+ "9b-sail": "Collapsed into `9b`, same reason.",
136
+ "10j-small": "Collapsed into `10j`, same reason.",
137
+ "10j-sail": "Collapsed into `10j`, same reason.",
138
+ "14a": "Renamed `14b` when the head-on classification moved its cite from 14(a) to 14(b), the deeming paragraph it reads; 14(a) is conduct and is in known_omissions. Shipped in v0.1.3, so it is the first record in data/deprecated-identifiers.json (REQ-MODEL-11). Q-45."
139
+ }
140
+ },
44
141
  "entries": [
45
142
  {
46
143
  "id": "23a1",
47
144
  "jurisdiction": "intl",
48
145
  "cite": "23(a)(i)",
49
146
  "when": {
50
- "propulsion": "power",
51
- "activity": "none",
52
- "position": "underway"
147
+ "fact:propulsion": "propulsion:power",
148
+ "fact:activity": "activity:none",
149
+ "fact:position": "position:underway"
53
150
  },
54
151
  "lights": [
55
152
  {
56
- "light": "masthead",
153
+ "light": "light:masthead",
57
154
  "position": "forward",
58
155
  "count": 1
59
156
  }
@@ -68,13 +165,13 @@
68
165
  "jurisdiction": "intl",
69
166
  "cite": "23(a)(ii)",
70
167
  "when": {
71
- "propulsion": "power",
72
- "activity": "none",
73
- "position": "underway"
168
+ "fact:propulsion": "propulsion:power",
169
+ "fact:activity": "activity:none",
170
+ "fact:position": "position:underway"
74
171
  },
75
172
  "lights": [
76
173
  {
77
- "light": "masthead",
174
+ "light": "light:masthead",
78
175
  "position": "abaft and higher than the forward one",
79
176
  "count": 1
80
177
  }
@@ -83,7 +180,7 @@
83
180
  "modality_by": [
84
181
  {
85
182
  "when": {
86
- "length_m": {
183
+ "fact:length_m": {
87
184
  "gte": 50
88
185
  }
89
186
  },
@@ -91,7 +188,7 @@
91
188
  },
92
189
  {
93
190
  "when": {
94
- "length_m": {
191
+ "fact:length_m": {
95
192
  "lt": 50
96
193
  }
97
194
  },
@@ -107,16 +204,16 @@
107
204
  "jurisdiction": "intl",
108
205
  "cite": "23(a)(iii)-(iv)",
109
206
  "when": {
110
- "propulsion": "power",
111
- "activity": "none",
112
- "position": "underway"
207
+ "fact:propulsion": "propulsion:power",
208
+ "fact:activity": "activity:none",
209
+ "fact:position": "position:underway"
113
210
  },
114
211
  "lights": [
115
212
  {
116
- "light": "sidelights"
213
+ "light": "light:sidelights"
117
214
  },
118
215
  {
119
- "light": "sternlight"
216
+ "light": "light:sternlight"
120
217
  }
121
218
  ],
122
219
  "modality": "shall"
@@ -126,20 +223,20 @@
126
223
  "jurisdiction": "intl",
127
224
  "cite": "23(b)",
128
225
  "when": {
129
- "propulsion": "power",
130
- "activity": "none",
131
- "position": "underway",
132
- "non_displacement": true
226
+ "fact:propulsion": "propulsion:power",
227
+ "fact:activity": "activity:none",
228
+ "fact:position": "position:underway",
229
+ "fact:non_displacement": true
133
230
  },
134
231
  "lights": [
135
232
  {
136
- "light": "all_round",
233
+ "light": "light:all_round",
137
234
  "color": "yellow",
138
235
  "character": "flashing",
139
236
  "count": 1
140
237
  }
141
238
  ],
142
- "includes": [
239
+ "rel:includes": [
143
240
  "23a1",
144
241
  "23a2",
145
242
  "23a34"
@@ -155,22 +252,22 @@
155
252
  "jurisdiction": "intl",
156
253
  "cite": "23(c)",
157
254
  "when": {
158
- "propulsion": "power",
159
- "activity": "none",
160
- "position": "underway",
161
- "wig": true,
162
- "wig_near_surface": true
255
+ "fact:propulsion": "propulsion:power",
256
+ "fact:activity": "activity:none",
257
+ "fact:position": "position:underway",
258
+ "fact:wig": true,
259
+ "fact:wig_near_surface": true
163
260
  },
164
261
  "lights": [
165
262
  {
166
- "light": "all_round",
263
+ "light": "light:all_round",
167
264
  "color": "red",
168
265
  "character": "flashing",
169
266
  "intensity": "high",
170
267
  "count": 1
171
268
  }
172
269
  ],
173
- "includes": [
270
+ "rel:includes": [
174
271
  "23a1",
175
272
  "23a2",
176
273
  "23a34"
@@ -183,24 +280,24 @@
183
280
  "jurisdiction": "intl",
184
281
  "cite": "23(d)(i)",
185
282
  "when": {
186
- "propulsion": "power",
187
- "activity": "none",
188
- "position": "underway",
189
- "length_m": {
283
+ "fact:propulsion": "propulsion:power",
284
+ "fact:activity": "activity:none",
285
+ "fact:position": "position:underway",
286
+ "fact:length_m": {
190
287
  "lt": 12
191
288
  }
192
289
  },
193
290
  "lights": [
194
291
  {
195
- "light": "all_round",
292
+ "light": "light:all_round",
196
293
  "color": "white",
197
294
  "count": 1
198
295
  },
199
296
  {
200
- "light": "sidelights"
297
+ "light": "light:sidelights"
201
298
  }
202
299
  ],
203
- "in_lieu_of": [
300
+ "rel:in_lieu_of": [
204
301
  "23a1",
205
302
  "23a2",
206
303
  "23a34"
@@ -215,28 +312,28 @@
215
312
  "jurisdiction": "intl",
216
313
  "cite": "23(d)(ii)",
217
314
  "when": {
218
- "propulsion": "power",
219
- "activity": "none",
220
- "position": "underway",
221
- "length_m": {
315
+ "fact:propulsion": "propulsion:power",
316
+ "fact:activity": "activity:none",
317
+ "fact:position": "position:underway",
318
+ "fact:length_m": {
222
319
  "lt": 7
223
320
  },
224
- "max_speed_kn": {
321
+ "fact:max_speed_kn": {
225
322
  "lte": 7
226
323
  }
227
324
  },
228
325
  "lights": [
229
326
  {
230
- "light": "all_round",
327
+ "light": "light:all_round",
231
328
  "color": "white",
232
329
  "count": 1
233
330
  },
234
331
  {
235
- "light": "sidelights",
332
+ "light": "light:sidelights",
236
333
  "modality": "shall-if-practicable"
237
334
  }
238
335
  ],
239
- "in_lieu_of": [
336
+ "rel:in_lieu_of": [
240
337
  "23a1",
241
338
  "23a2",
242
339
  "23a34"
@@ -252,19 +349,19 @@
252
349
  "jurisdiction": "intl",
253
350
  "cite": "24(a)(i)",
254
351
  "when": {
255
- "activity": "towing",
256
- "tow_length_m": {
352
+ "fact:activity": "activity:towing",
353
+ "fact:tow_length_m": {
257
354
  "lte": 200
258
355
  }
259
356
  },
260
357
  "lights": [
261
358
  {
262
- "light": "masthead",
359
+ "light": "light:masthead",
263
360
  "count": 2,
264
361
  "arrangement": "vertical"
265
362
  }
266
363
  ],
267
- "in_lieu_of": [
364
+ "rel:in_lieu_of": [
268
365
  "23a1",
269
366
  "23a2"
270
367
  ],
@@ -278,19 +375,19 @@
278
375
  "jurisdiction": "intl",
279
376
  "cite": "24(a)(i)",
280
377
  "when": {
281
- "activity": "towing",
282
- "tow_length_m": {
378
+ "fact:activity": "activity:towing",
379
+ "fact:tow_length_m": {
283
380
  "gt": 200
284
381
  }
285
382
  },
286
383
  "lights": [
287
384
  {
288
- "light": "masthead",
385
+ "light": "light:masthead",
289
386
  "count": 3,
290
387
  "arrangement": "vertical"
291
388
  }
292
389
  ],
293
- "in_lieu_of": [
390
+ "rel:in_lieu_of": [
294
391
  "23a1",
295
392
  "23a2"
296
393
  ],
@@ -304,16 +401,16 @@
304
401
  "jurisdiction": "intl",
305
402
  "cite": "24(a)(ii)-(iv)",
306
403
  "when": {
307
- "activity": "towing"
404
+ "fact:activity": "activity:towing"
308
405
  },
309
406
  "lights": [
310
407
  {
311
- "light": "towing",
408
+ "light": "light:towing",
312
409
  "position": "in a vertical line above the sternlight",
313
410
  "count": 1
314
411
  }
315
412
  ],
316
- "includes": [
413
+ "rel:includes": [
317
414
  "23a34"
318
415
  ],
319
416
  "modality": "shall",
@@ -326,11 +423,11 @@
326
423
  "jurisdiction": "intl",
327
424
  "cite": "24(b)",
328
425
  "when": {
329
- "activity": "pushing",
330
- "composite_unit": true
426
+ "fact:activity": "activity:pushing",
427
+ "fact:composite_unit": true
331
428
  },
332
429
  "lights": [],
333
- "includes": [
430
+ "rel:includes": [
334
431
  "23a1",
335
432
  "23a2",
336
433
  "23a34"
@@ -346,20 +443,20 @@
346
443
  "jurisdiction": "intl",
347
444
  "cite": "24(c)",
348
445
  "when": {
349
- "activity": "pushing",
350
- "composite_unit": false
446
+ "fact:activity": "activity:pushing",
447
+ "fact:composite_unit": false
351
448
  },
352
449
  "lights": [
353
450
  {
354
- "light": "masthead",
451
+ "light": "light:masthead",
355
452
  "count": 2,
356
453
  "arrangement": "vertical"
357
454
  }
358
455
  ],
359
- "includes": [
456
+ "rel:includes": [
360
457
  "23a34"
361
458
  ],
362
- "in_lieu_of": [
459
+ "rel:in_lieu_of": [
363
460
  "23a1",
364
461
  "23a2"
365
462
  ],
@@ -371,14 +468,14 @@
371
468
  "jurisdiction": "intl",
372
469
  "cite": "24(e)",
373
470
  "when": {
374
- "activity": "being_towed"
471
+ "fact:activity": "activity:being_towed"
375
472
  },
376
473
  "lights": [
377
474
  {
378
- "light": "sidelights"
475
+ "light": "light:sidelights"
379
476
  },
380
477
  {
381
- "light": "sternlight"
478
+ "light": "light:sternlight"
382
479
  }
383
480
  ],
384
481
  "modality": "shall",
@@ -392,16 +489,16 @@
392
489
  "jurisdiction": "intl",
393
490
  "cite": "25(a)",
394
491
  "when": {
395
- "propulsion": "sail",
396
- "activity": "none",
397
- "position": "underway"
492
+ "fact:propulsion": "propulsion:sail",
493
+ "fact:activity": "activity:none",
494
+ "fact:position": "position:underway"
398
495
  },
399
496
  "lights": [
400
497
  {
401
- "light": "sidelights"
498
+ "light": "light:sidelights"
402
499
  },
403
500
  {
404
- "light": "sternlight"
501
+ "light": "light:sternlight"
405
502
  }
406
503
  ],
407
504
  "modality": "shall",
@@ -414,29 +511,29 @@
414
511
  "jurisdiction": "intl",
415
512
  "cite": "25(b)",
416
513
  "when": {
417
- "propulsion": "sail",
418
- "activity": "none",
419
- "position": "underway",
420
- "length_m": {
514
+ "fact:propulsion": "propulsion:sail",
515
+ "fact:activity": "activity:none",
516
+ "fact:position": "position:underway",
517
+ "fact:length_m": {
421
518
  "lt": 20
422
519
  }
423
520
  },
424
521
  "lights": [
425
522
  {
426
- "light": "sidelights",
523
+ "light": "light:sidelights",
427
524
  "combined": true,
428
525
  "position": "at or near the top of the mast"
429
526
  },
430
527
  {
431
- "light": "sternlight",
528
+ "light": "light:sternlight",
432
529
  "combined": true,
433
530
  "position": "at or near the top of the mast"
434
531
  }
435
532
  ],
436
- "in_lieu_of": [
533
+ "rel:in_lieu_of": [
437
534
  "25a"
438
535
  ],
439
- "excludes": [
536
+ "rel:excludes": [
440
537
  "25c"
441
538
  ],
442
539
  "modality": "may",
@@ -450,28 +547,28 @@
450
547
  "jurisdiction": "intl",
451
548
  "cite": "25(c)",
452
549
  "when": {
453
- "propulsion": "sail",
454
- "activity": "none",
455
- "position": "underway"
550
+ "fact:propulsion": "propulsion:sail",
551
+ "fact:activity": "activity:none",
552
+ "fact:position": "position:underway"
456
553
  },
457
554
  "lights": [
458
555
  {
459
- "light": "all_round",
556
+ "light": "light:all_round",
460
557
  "color": "red",
461
558
  "count": 1,
462
559
  "position": "upper, at or near the top of the mast"
463
560
  },
464
561
  {
465
- "light": "all_round",
562
+ "light": "light:all_round",
466
563
  "color": "green",
467
564
  "count": 1,
468
565
  "position": "lower, at or near the top of the mast"
469
566
  }
470
567
  ],
471
- "includes": [
568
+ "rel:includes": [
472
569
  "25a"
473
570
  ],
474
- "excludes": [
571
+ "rel:excludes": [
475
572
  "25b"
476
573
  ],
477
574
  "modality": "may",
@@ -484,22 +581,22 @@
484
581
  "jurisdiction": "intl",
485
582
  "cite": "25(d)(i)",
486
583
  "when": {
487
- "propulsion": "sail",
488
- "activity": "none",
489
- "position": "underway",
490
- "length_m": {
584
+ "fact:propulsion": "propulsion:sail",
585
+ "fact:activity": "activity:none",
586
+ "fact:position": "position:underway",
587
+ "fact:length_m": {
491
588
  "lt": 7
492
589
  }
493
590
  },
494
591
  "lights": [
495
592
  {
496
- "light": "torch",
593
+ "light": "light:torch",
497
594
  "color": "white",
498
595
  "count": 1,
499
596
  "note": "an electric torch or lighted lantern shown in sufficient time to prevent collision"
500
597
  }
501
598
  ],
502
- "in_lieu_of": [
599
+ "rel:in_lieu_of": [
503
600
  "25a",
504
601
  "25b"
505
602
  ],
@@ -514,17 +611,17 @@
514
611
  "jurisdiction": "intl",
515
612
  "cite": "25(d)(ii)",
516
613
  "when": {
517
- "propulsion": "oars"
614
+ "fact:propulsion": "propulsion:oars"
518
615
  },
519
616
  "lights": [
520
617
  {
521
- "light": "torch",
618
+ "light": "light:torch",
522
619
  "color": "white",
523
620
  "count": 1,
524
621
  "note": "an electric torch or lighted lantern shown in sufficient time to prevent collision"
525
622
  }
526
623
  ],
527
- "conditional_includes": [
624
+ "rel:conditional_includes": [
528
625
  {
529
626
  "one_of": [
530
627
  "25a",
@@ -543,23 +640,26 @@
543
640
  "jurisdiction": "intl",
544
641
  "cite": "26(b)(i)",
545
642
  "when": {
546
- "activity": "trawling"
643
+ "fact:activity": "activity:trawling",
644
+ "fact:position": {
645
+ "not": "position:aground"
646
+ }
547
647
  },
548
648
  "lights": [
549
649
  {
550
- "light": "all_round",
650
+ "light": "light:all_round",
551
651
  "color": "green",
552
652
  "count": 1,
553
653
  "position": "upper"
554
654
  },
555
655
  {
556
- "light": "all_round",
656
+ "light": "light:all_round",
557
657
  "color": "white",
558
658
  "count": 1,
559
659
  "position": "lower"
560
660
  }
561
661
  ],
562
- "excludes": [
662
+ "rel:overrides": [
563
663
  "30a",
564
664
  "30b"
565
665
  ],
@@ -567,18 +667,21 @@
567
667
  "images": [
568
668
  "NRHB_26_b.png"
569
669
  ],
570
- "notes": "Rule 26(a): a vessel engaged in fishing shall exhibit only the lights of Rule 26, whether underway or at anchor hence the exclusion of Rule 30."
670
+ "notes": "Rule 26(a) 'only the lights prescribed in this Rule' prevails over Rule 30's anchor lights underway or at anchor (rel:overrides, ADR 0007). Aground is neither (Rule 3(i)); she shows 30(d) alone."
571
671
  },
572
672
  {
573
673
  "id": "26b-mast",
574
674
  "jurisdiction": "intl",
575
675
  "cite": "26(b)(ii)",
576
676
  "when": {
577
- "activity": "trawling"
677
+ "fact:activity": "activity:trawling",
678
+ "fact:position": {
679
+ "not": "position:aground"
680
+ }
578
681
  },
579
682
  "lights": [
580
683
  {
581
- "light": "masthead",
684
+ "light": "light:masthead",
582
685
  "position": "abaft of and higher than the all-round green light",
583
686
  "count": 1
584
687
  }
@@ -587,7 +690,7 @@
587
690
  "modality_by": [
588
691
  {
589
692
  "when": {
590
- "length_m": {
693
+ "fact:length_m": {
591
694
  "gte": 50
592
695
  }
593
696
  },
@@ -595,7 +698,7 @@
595
698
  },
596
699
  {
597
700
  "when": {
598
- "length_m": {
701
+ "fact:length_m": {
599
702
  "lt": 50
600
703
  }
601
704
  },
@@ -608,11 +711,11 @@
608
711
  "jurisdiction": "intl",
609
712
  "cite": "26(b)(iii)",
610
713
  "when": {
611
- "activity": "trawling",
612
- "making_way": true
714
+ "fact:activity": "activity:trawling",
715
+ "fact:making_way": true
613
716
  },
614
717
  "lights": [],
615
- "includes": [
718
+ "rel:includes": [
616
719
  "23a34"
617
720
  ],
618
721
  "modality": "shall",
@@ -625,23 +728,26 @@
625
728
  "jurisdiction": "intl",
626
729
  "cite": "26(c)(i)",
627
730
  "when": {
628
- "activity": "fishing"
731
+ "fact:activity": "activity:fishing",
732
+ "fact:position": {
733
+ "not": "position:aground"
734
+ }
629
735
  },
630
736
  "lights": [
631
737
  {
632
- "light": "all_round",
738
+ "light": "light:all_round",
633
739
  "color": "red",
634
740
  "count": 1,
635
741
  "position": "upper"
636
742
  },
637
743
  {
638
- "light": "all_round",
744
+ "light": "light:all_round",
639
745
  "color": "white",
640
746
  "count": 1,
641
747
  "position": "lower"
642
748
  }
643
749
  ],
644
- "excludes": [
750
+ "rel:overrides": [
645
751
  "30a",
646
752
  "30b"
647
753
  ],
@@ -652,14 +758,17 @@
652
758
  "jurisdiction": "intl",
653
759
  "cite": "26(c)(ii)",
654
760
  "when": {
655
- "activity": "fishing",
656
- "gear_extent_m": {
761
+ "fact:activity": "activity:fishing",
762
+ "fact:position": {
763
+ "not": "position:aground"
764
+ },
765
+ "fact:gear_extent_m": {
657
766
  "gt": 150
658
767
  }
659
768
  },
660
769
  "lights": [
661
770
  {
662
- "light": "all_round",
771
+ "light": "light:all_round",
663
772
  "color": "white",
664
773
  "count": 1,
665
774
  "position": "in the direction of the gear"
@@ -672,11 +781,11 @@
672
781
  "jurisdiction": "intl",
673
782
  "cite": "26(c)(iii)",
674
783
  "when": {
675
- "activity": "fishing",
676
- "making_way": true
784
+ "fact:activity": "activity:fishing",
785
+ "fact:making_way": true
677
786
  },
678
787
  "lights": [],
679
- "includes": [
788
+ "rel:includes": [
680
789
  "23a34"
681
790
  ],
682
791
  "modality": "shall",
@@ -689,12 +798,12 @@
689
798
  "jurisdiction": "intl",
690
799
  "cite": "27(a)(i)",
691
800
  "when": {
692
- "activity": "nuc",
693
- "position": "underway"
801
+ "fact:activity": "activity:nuc",
802
+ "fact:position": "position:underway"
694
803
  },
695
804
  "lights": [
696
805
  {
697
- "light": "all_round",
806
+ "light": "light:all_round",
698
807
  "color": "red",
699
808
  "count": 2,
700
809
  "arrangement": "vertical"
@@ -710,11 +819,11 @@
710
819
  "jurisdiction": "intl",
711
820
  "cite": "27(a)(iii)",
712
821
  "when": {
713
- "activity": "nuc",
714
- "making_way": true
822
+ "fact:activity": "activity:nuc",
823
+ "fact:making_way": true
715
824
  },
716
825
  "lights": [],
717
- "includes": [
826
+ "rel:includes": [
718
827
  "23a34"
719
828
  ],
720
829
  "modality": "shall",
@@ -727,23 +836,23 @@
727
836
  "jurisdiction": "intl",
728
837
  "cite": "27(b)(i)",
729
838
  "when": {
730
- "activity": "ram"
839
+ "fact:activity": "activity:ram"
731
840
  },
732
841
  "lights": [
733
842
  {
734
- "light": "all_round",
843
+ "light": "light:all_round",
735
844
  "color": "red",
736
845
  "count": 1,
737
846
  "position": "upper"
738
847
  },
739
848
  {
740
- "light": "all_round",
849
+ "light": "light:all_round",
741
850
  "color": "white",
742
851
  "count": 1,
743
852
  "position": "middle"
744
853
  },
745
854
  {
746
- "light": "all_round",
855
+ "light": "light:all_round",
747
856
  "color": "red",
748
857
  "count": 1,
749
858
  "position": "lower"
@@ -757,11 +866,11 @@
757
866
  "jurisdiction": "intl",
758
867
  "cite": "27(b)(iii)",
759
868
  "when": {
760
- "activity": "ram",
761
- "making_way": true
869
+ "fact:activity": "activity:ram",
870
+ "fact:making_way": true
762
871
  },
763
872
  "lights": [],
764
- "includes": [
873
+ "rel:includes": [
765
874
  "23a1",
766
875
  "23a2",
767
876
  "23a34"
@@ -776,11 +885,11 @@
776
885
  "jurisdiction": "intl",
777
886
  "cite": "27(b)(iv)",
778
887
  "when": {
779
- "activity": "ram",
780
- "position": "anchored"
888
+ "fact:activity": "activity:ram",
889
+ "fact:position": "position:anchored"
781
890
  },
782
891
  "lights": [],
783
- "conditional_includes": [
892
+ "rel:conditional_includes": [
784
893
  {
785
894
  "one_of": [
786
895
  "30a",
@@ -798,26 +907,26 @@
798
907
  "jurisdiction": "intl",
799
908
  "cite": "27(d)",
800
909
  "when": {
801
- "activity": "ram_underwater",
802
- "obstruction_exists": true
910
+ "fact:activity": "activity:ram_underwater",
911
+ "fact:obstruction_exists": true
803
912
  },
804
913
  "lights": [
805
914
  {
806
- "light": "all_round",
915
+ "light": "light:all_round",
807
916
  "color": "red",
808
917
  "count": 2,
809
918
  "arrangement": "vertical",
810
919
  "position": "on the side on which the obstruction exists"
811
920
  },
812
921
  {
813
- "light": "all_round",
922
+ "light": "light:all_round",
814
923
  "color": "green",
815
924
  "count": 2,
816
925
  "arrangement": "vertical",
817
926
  "position": "on the side on which another vessel may pass"
818
927
  }
819
928
  ],
820
- "includes": [
929
+ "rel:includes": [
821
930
  "27b-id"
822
931
  ],
823
932
  "modality": "shall",
@@ -831,29 +940,29 @@
831
940
  "jurisdiction": "intl",
832
941
  "cite": "27(e)(i)",
833
942
  "when": {
834
- "activity": "diving"
943
+ "fact:activity": "activity:diving"
835
944
  },
836
945
  "lights": [
837
946
  {
838
- "light": "all_round",
947
+ "light": "light:all_round",
839
948
  "color": "red",
840
949
  "count": 1,
841
950
  "position": "upper"
842
951
  },
843
952
  {
844
- "light": "all_round",
953
+ "light": "light:all_round",
845
954
  "color": "white",
846
955
  "count": 1,
847
956
  "position": "middle"
848
957
  },
849
958
  {
850
- "light": "all_round",
959
+ "light": "light:all_round",
851
960
  "color": "red",
852
961
  "count": 1,
853
962
  "position": "lower"
854
963
  }
855
964
  ],
856
- "in_lieu_of": [
965
+ "rel:in_lieu_of": [
857
966
  "27d"
858
967
  ],
859
968
  "modality": "shall",
@@ -867,53 +976,62 @@
867
976
  "jurisdiction": "intl",
868
977
  "cite": "27(f)",
869
978
  "when": {
870
- "activity": "mine"
979
+ "fact:activity": "activity:mine"
871
980
  },
872
981
  "lights": [
873
982
  {
874
- "light": "all_round",
983
+ "light": "light:all_round",
875
984
  "color": "green",
876
985
  "count": 3,
877
986
  "position": "one near the foremast head and one at each end of the fore yard"
878
987
  }
879
988
  ],
880
- "includes": [
881
- "23a1",
882
- "23a2",
883
- "23a34"
884
- ],
885
- "conditional_includes": [
989
+ "rel:conditional_includes": [
990
+ {
991
+ "when": {
992
+ "fact:position": "position:underway"
993
+ },
994
+ "rel:includes": [
995
+ "23a1",
996
+ "23a2",
997
+ "23a34"
998
+ ],
999
+ "cite": "27(f)"
1000
+ },
886
1001
  {
887
1002
  "when": {
888
- "position": "anchored"
1003
+ "fact:position": "position:anchored"
889
1004
  },
890
1005
  "one_of": [
891
1006
  "30a",
892
1007
  "30b"
893
- ]
1008
+ ],
1009
+ "cite": "27(f)"
894
1010
  }
895
1011
  ],
896
1012
  "modality": "shall",
897
1013
  "images": [
898
1014
  "NRHB_27_f.png"
899
- ]
1015
+ ],
1016
+ "notes": "27(f) adds the three green lights 'to the lights prescribed for a power-driven vessel in Rule 23 or to the lights or shape prescribed for a vessel at anchor in Rule 30, as appropriate': which set is imported turns on fact:position, so both imports are gated (the 29(a) pattern). The anchored branch is genuine practice, added by A.464(XII) in 1981 — docs/verification/2026-09-05-rule27f-rule28-anchor-scenarios.md, Q1."
900
1017
  },
901
1018
  {
902
1019
  "id": "28",
903
1020
  "jurisdiction": "intl",
904
1021
  "cite": "28",
905
1022
  "when": {
906
- "activity": "cbd"
1023
+ "fact:activity": "activity:cbd",
1024
+ "fact:position": "position:underway"
907
1025
  },
908
1026
  "lights": [
909
1027
  {
910
- "light": "all_round",
1028
+ "light": "light:all_round",
911
1029
  "color": "red",
912
1030
  "count": 3,
913
1031
  "arrangement": "vertical"
914
1032
  }
915
1033
  ],
916
- "includes": [
1034
+ "rel:includes": [
917
1035
  "23a1",
918
1036
  "23a2",
919
1037
  "23a34"
@@ -922,42 +1040,42 @@
922
1040
  "images": [
923
1041
  "NRHB_28.png"
924
1042
  ],
925
- "notes": "The Rule 23(a) lights are 'shall' (she is a power-driven vessel underway); the three red lights are 'may'. International Rules only."
1043
+ "notes": "The Rule 23(a) lights are 'shall' (she is a power-driven vessel underway); the three red lights are 'may'. International Rules only. Position is pinned to underway rather than gating the Rule 23 import: 'constrained by her draught' is a status of a vessel navigating (3(h)); the standard commentary and IMO guidance treat the Rule 28 signal as shown only with the underway lights; and Annex I positions the red lights only relative to masthead lights — docs/verification/2026-09-05-rule27f-rule28-anchor-scenarios.md, Q2. A record of activity:cbd at anchor therefore gets Rule 30 alone."
926
1044
  },
927
1045
  {
928
1046
  "id": "29a",
929
1047
  "jurisdiction": "intl",
930
1048
  "cite": "29(a)",
931
1049
  "when": {
932
- "activity": "pilot"
1050
+ "fact:activity": "activity:pilot"
933
1051
  },
934
1052
  "lights": [
935
1053
  {
936
- "light": "all_round",
1054
+ "light": "light:all_round",
937
1055
  "color": "white",
938
1056
  "count": 1,
939
1057
  "position": "upper, at or near the masthead"
940
1058
  },
941
1059
  {
942
- "light": "all_round",
1060
+ "light": "light:all_round",
943
1061
  "color": "red",
944
1062
  "count": 1,
945
1063
  "position": "lower, at or near the masthead"
946
1064
  }
947
1065
  ],
948
- "conditional_includes": [
1066
+ "rel:conditional_includes": [
949
1067
  {
950
1068
  "when": {
951
- "position": "underway"
1069
+ "fact:position": "position:underway"
952
1070
  },
953
- "includes": [
1071
+ "rel:includes": [
954
1072
  "23a34"
955
1073
  ],
956
1074
  "cite": "29(a)(ii)"
957
1075
  },
958
1076
  {
959
1077
  "when": {
960
- "position": "anchored"
1078
+ "fact:position": "position:anchored"
961
1079
  },
962
1080
  "one_of": [
963
1081
  "30a",
@@ -977,17 +1095,17 @@
977
1095
  "jurisdiction": "intl",
978
1096
  "cite": "30(a)",
979
1097
  "when": {
980
- "position": "anchored"
1098
+ "fact:position": "position:anchored"
981
1099
  },
982
1100
  "lights": [
983
1101
  {
984
- "light": "all_round",
1102
+ "light": "light:all_round",
985
1103
  "color": "white",
986
1104
  "count": 1,
987
1105
  "position": "in the fore part"
988
1106
  },
989
1107
  {
990
- "light": "all_round",
1108
+ "light": "light:all_round",
991
1109
  "color": "white",
992
1110
  "count": 1,
993
1111
  "position": "at or near the stern, at a lower level than the fore one"
@@ -1003,20 +1121,20 @@
1003
1121
  "jurisdiction": "intl",
1004
1122
  "cite": "30(b)",
1005
1123
  "when": {
1006
- "position": "anchored",
1007
- "length_m": {
1124
+ "fact:position": "position:anchored",
1125
+ "fact:length_m": {
1008
1126
  "lt": 50
1009
1127
  }
1010
1128
  },
1011
1129
  "lights": [
1012
1130
  {
1013
- "light": "all_round",
1131
+ "light": "light:all_round",
1014
1132
  "color": "white",
1015
1133
  "count": 1,
1016
1134
  "position": "where it can best be seen"
1017
1135
  }
1018
1136
  ],
1019
- "in_lieu_of": [
1137
+ "rel:in_lieu_of": [
1020
1138
  "30a"
1021
1139
  ],
1022
1140
  "modality": "may"
@@ -1026,11 +1144,11 @@
1026
1144
  "jurisdiction": "intl",
1027
1145
  "cite": "30(c)",
1028
1146
  "when": {
1029
- "position": "anchored"
1147
+ "fact:position": "position:anchored"
1030
1148
  },
1031
1149
  "lights": [
1032
1150
  {
1033
- "light": "deck_lights",
1151
+ "light": "light:deck_lights",
1034
1152
  "note": "available working or equivalent lights to illuminate her decks"
1035
1153
  }
1036
1154
  ],
@@ -1038,7 +1156,7 @@
1038
1156
  "modality_by": [
1039
1157
  {
1040
1158
  "when": {
1041
- "length_m": {
1159
+ "fact:length_m": {
1042
1160
  "gte": 100
1043
1161
  }
1044
1162
  },
@@ -1046,7 +1164,7 @@
1046
1164
  },
1047
1165
  {
1048
1166
  "when": {
1049
- "length_m": {
1167
+ "fact:length_m": {
1050
1168
  "lt": 100
1051
1169
  }
1052
1170
  },
@@ -1059,10 +1177,10 @@
1059
1177
  "jurisdiction": "intl",
1060
1178
  "cite": "30(d)",
1061
1179
  "when": {
1062
- "position": "aground"
1180
+ "fact:position": "position:aground"
1063
1181
  },
1064
1182
  "lights": [],
1065
- "conditional_includes": [
1183
+ "rel:conditional_includes": [
1066
1184
  {
1067
1185
  "one_of": [
1068
1186
  "30a",
@@ -1078,14 +1196,14 @@
1078
1196
  "jurisdiction": "intl",
1079
1197
  "cite": "30(d)",
1080
1198
  "when": {
1081
- "position": "aground",
1082
- "length_m": {
1199
+ "fact:position": "position:aground",
1200
+ "fact:length_m": {
1083
1201
  "gte": 12
1084
1202
  }
1085
1203
  },
1086
1204
  "lights": [
1087
1205
  {
1088
- "light": "all_round",
1206
+ "light": "light:all_round",
1089
1207
  "color": "red",
1090
1208
  "count": 2,
1091
1209
  "arrangement": "vertical"
@@ -1102,18 +1220,962 @@
1102
1220
  "jurisdiction": "intl",
1103
1221
  "cite": "30(e)",
1104
1222
  "when": {
1105
- "position": "anchored",
1106
- "length_m": {
1223
+ "fact:position": "position:anchored",
1224
+ "fact:length_m": {
1107
1225
  "lt": 7
1108
1226
  },
1109
- "near_channel": false
1227
+ "fact:near_channel": false
1110
1228
  },
1111
1229
  "lights": [],
1112
- "exempts": [
1230
+ "rel:exempts": [
1113
1231
  "30a",
1114
1232
  "30b"
1115
1233
  ],
1116
1234
  "modality": "exempt"
1235
+ },
1236
+ {
1237
+ "id": "4",
1238
+ "jurisdiction": "intl",
1239
+ "cite": "4",
1240
+ "category": "scope",
1241
+ "subjects": 2,
1242
+ "when": {},
1243
+ "modality": "shall",
1244
+ "effect": {
1245
+ "part": "B",
1246
+ "section": "I",
1247
+ "applies_rules": [
1248
+ "4",
1249
+ "5",
1250
+ "6",
1251
+ "7",
1252
+ "8",
1253
+ "9",
1254
+ "10"
1255
+ ]
1256
+ },
1257
+ "note": "Part B Section I is ungated: the predicate is empty because 'any condition of visibility' is the absence of a condition, not a fact. A scope entry is never a display entry, so an empty `when` selects no lights."
1258
+ },
1259
+ {
1260
+ "id": "11",
1261
+ "jurisdiction": "intl",
1262
+ "cite": "11",
1263
+ "category": "scope",
1264
+ "subjects": 2,
1265
+ "when": {
1266
+ "pair:geo:in_sight": true
1267
+ },
1268
+ "modality": "shall",
1269
+ "effect": {
1270
+ "part": "B",
1271
+ "section": "II",
1272
+ "applies_rules": [
1273
+ "11",
1274
+ "12",
1275
+ "13",
1276
+ "14",
1277
+ "15",
1278
+ "16",
1279
+ "17",
1280
+ "18"
1281
+ ]
1282
+ },
1283
+ "note": "Rule 3(k)'s in-sight test is a fact of the pair, so Section II is gated on `pair:geo:in_sight` and every Rule 18 entry below repeats that gate rather than relying on the engine to apply this one."
1284
+ },
1285
+ {
1286
+ "id": "19a",
1287
+ "jurisdiction": "intl",
1288
+ "cite": "19(a)",
1289
+ "category": "scope",
1290
+ "subjects": 2,
1291
+ "when": {
1292
+ "pair:geo:in_sight": false
1293
+ },
1294
+ "modality": "shall",
1295
+ "effect": {
1296
+ "part": "B",
1297
+ "section": "III",
1298
+ "applies_rules": [
1299
+ "19"
1300
+ ]
1301
+ },
1302
+ "gap": "19(a) is 'not in sight of one another AND navigating in or near an area of restricted visibility'. Only the first conjunct is a fact; there is no fact for being in or near an area of restricted visibility, and it is a property of the water rather than of either vessel or of the pair's geometry. This entry is therefore wider than the paragraph: it selects Section III for any pair not in sight. Recorded rather than silently narrowed.",
1303
+ "note": "The complement of 11. Rule 3(l) defines restricted visibility; nothing in facts.json carries it."
1304
+ },
1305
+ {
1306
+ "id": "18a1",
1307
+ "jurisdiction": "intl",
1308
+ "cite": "18(a)(i)",
1309
+ "category": "precedence",
1310
+ "subjects": 2,
1311
+ "when": {
1312
+ "own:fact:propulsion": "propulsion:power",
1313
+ "own:fact:rule18_class": {
1314
+ "not": [
1315
+ "rule18_class:nuc",
1316
+ "rule18_class:ram",
1317
+ "rule18_class:fishing"
1318
+ ]
1319
+ },
1320
+ "own:fact:position": "position:underway",
1321
+ "other:fact:rule18_class": "rule18_class:nuc",
1322
+ "other:fact:position": "position:underway",
1323
+ "pair:geo:in_sight": true
1324
+ },
1325
+ "modality": "shall",
1326
+ "effect": {
1327
+ "own": "give-way",
1328
+ "other": "stand-on"
1329
+ },
1330
+ "rel:overrides": [
1331
+ "15a-give-way"
1332
+ ],
1333
+ "note": "Own 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 `15a-give-way` (Q-40): own 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."
1334
+ },
1335
+ {
1336
+ "id": "18a2",
1337
+ "jurisdiction": "intl",
1338
+ "cite": "18(a)(ii)",
1339
+ "category": "precedence",
1340
+ "subjects": 2,
1341
+ "when": {
1342
+ "own:fact:propulsion": "propulsion:power",
1343
+ "own:fact:rule18_class": {
1344
+ "not": [
1345
+ "rule18_class:nuc",
1346
+ "rule18_class:ram",
1347
+ "rule18_class:fishing"
1348
+ ]
1349
+ },
1350
+ "own:fact:position": "position:underway",
1351
+ "other:fact:rule18_class": "rule18_class:ram",
1352
+ "other:fact:position": "position:underway",
1353
+ "pair:geo:in_sight": true
1354
+ },
1355
+ "modality": "shall",
1356
+ "effect": {
1357
+ "own": "give-way",
1358
+ "other": "stand-on"
1359
+ },
1360
+ "rel:overrides": [
1361
+ "15a-give-way"
1362
+ ],
1363
+ "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 `15a-give-way` (Q-40): own 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."
1364
+ },
1365
+ {
1366
+ "id": "18a3",
1367
+ "jurisdiction": "intl",
1368
+ "cite": "18(a)(iii)",
1369
+ "category": "precedence",
1370
+ "subjects": 2,
1371
+ "when": {
1372
+ "own:fact:propulsion": "propulsion:power",
1373
+ "own:fact:rule18_class": {
1374
+ "not": [
1375
+ "rule18_class:nuc",
1376
+ "rule18_class:ram",
1377
+ "rule18_class:fishing"
1378
+ ]
1379
+ },
1380
+ "own:fact:position": "position:underway",
1381
+ "other:fact:rule18_class": "rule18_class:fishing",
1382
+ "other:fact:position": "position:underway",
1383
+ "pair:geo:in_sight": true
1384
+ },
1385
+ "modality": "shall",
1386
+ "effect": {
1387
+ "own": "give-way",
1388
+ "other": "stand-on"
1389
+ },
1390
+ "rel:overrides": [
1391
+ "15a-give-way"
1392
+ ],
1393
+ "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 `15a-give-way` (Q-40): own 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."
1394
+ },
1395
+ {
1396
+ "id": "18a4",
1397
+ "jurisdiction": "intl",
1398
+ "cite": "18(a)(iv)",
1399
+ "category": "precedence",
1400
+ "subjects": 2,
1401
+ "when": {
1402
+ "own:fact:propulsion": "propulsion:power",
1403
+ "own:fact:rule18_class": {
1404
+ "not": [
1405
+ "rule18_class:nuc",
1406
+ "rule18_class:ram",
1407
+ "rule18_class:fishing"
1408
+ ]
1409
+ },
1410
+ "own:fact:position": "position:underway",
1411
+ "other:fact:rule18_class": "rule18_class:sail",
1412
+ "other:fact:position": "position:underway",
1413
+ "pair:geo:in_sight": true
1414
+ },
1415
+ "modality": "shall",
1416
+ "effect": {
1417
+ "own": "give-way",
1418
+ "other": "stand-on"
1419
+ },
1420
+ "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."
1421
+ },
1422
+ {
1423
+ "id": "18b1",
1424
+ "jurisdiction": "intl",
1425
+ "cite": "18(b)(i)",
1426
+ "category": "precedence",
1427
+ "subjects": 2,
1428
+ "when": {
1429
+ "own:fact:rule18_class": "rule18_class:sail",
1430
+ "own:fact:position": "position:underway",
1431
+ "other:fact:rule18_class": "rule18_class:nuc",
1432
+ "other:fact:position": "position:underway",
1433
+ "pair:geo:in_sight": true
1434
+ },
1435
+ "modality": "shall",
1436
+ "effect": {
1437
+ "own": "give-way",
1438
+ "other": "stand-on"
1439
+ },
1440
+ "rel:overrides": [
1441
+ "12a1",
1442
+ "12a2",
1443
+ "12a3"
1444
+ ],
1445
+ "note": "Own 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."
1446
+ },
1447
+ {
1448
+ "id": "18b2",
1449
+ "jurisdiction": "intl",
1450
+ "cite": "18(b)(ii)",
1451
+ "category": "precedence",
1452
+ "subjects": 2,
1453
+ "when": {
1454
+ "own:fact:rule18_class": "rule18_class:sail",
1455
+ "own:fact:position": "position:underway",
1456
+ "other:fact:rule18_class": "rule18_class:ram",
1457
+ "other:fact:position": "position:underway",
1458
+ "pair:geo:in_sight": true
1459
+ },
1460
+ "modality": "shall",
1461
+ "effect": {
1462
+ "own": "give-way",
1463
+ "other": "stand-on"
1464
+ },
1465
+ "rel:overrides": [
1466
+ "12a1",
1467
+ "12a2",
1468
+ "12a3"
1469
+ ],
1470
+ "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."
1471
+ },
1472
+ {
1473
+ "id": "18b3",
1474
+ "jurisdiction": "intl",
1475
+ "cite": "18(b)(iii)",
1476
+ "category": "precedence",
1477
+ "subjects": 2,
1478
+ "when": {
1479
+ "own:fact:rule18_class": "rule18_class:sail",
1480
+ "own:fact:position": "position:underway",
1481
+ "other:fact:rule18_class": "rule18_class:fishing",
1482
+ "other:fact:position": "position:underway",
1483
+ "pair:geo:in_sight": true
1484
+ },
1485
+ "modality": "shall",
1486
+ "effect": {
1487
+ "own": "give-way",
1488
+ "other": "stand-on"
1489
+ },
1490
+ "rel:overrides": [
1491
+ "12a1",
1492
+ "12a2",
1493
+ "12a3"
1494
+ ],
1495
+ "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."
1496
+ },
1497
+ {
1498
+ "id": "18c1",
1499
+ "jurisdiction": "intl",
1500
+ "cite": "18(c)(i)",
1501
+ "category": "precedence",
1502
+ "subjects": 2,
1503
+ "when": {
1504
+ "own:fact:rule18_class": "rule18_class:fishing",
1505
+ "own:fact:position": "position:underway",
1506
+ "other:fact:rule18_class": "rule18_class:nuc",
1507
+ "other:fact:position": "position:underway",
1508
+ "pair:geo:in_sight": true
1509
+ },
1510
+ "modality": "shall-if-practicable",
1511
+ "effect": {
1512
+ "own": "give-way",
1513
+ "other": "stand-on"
1514
+ },
1515
+ "rel:overrides": [
1516
+ "12a1",
1517
+ "12a2",
1518
+ "12a3",
1519
+ "15a-give-way"
1520
+ ],
1521
+ "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 `15a-give-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."
1522
+ },
1523
+ {
1524
+ "id": "18c2",
1525
+ "jurisdiction": "intl",
1526
+ "cite": "18(c)(ii)",
1527
+ "category": "precedence",
1528
+ "subjects": 2,
1529
+ "when": {
1530
+ "own:fact:rule18_class": "rule18_class:fishing",
1531
+ "own:fact:position": "position:underway",
1532
+ "other:fact:rule18_class": "rule18_class:ram",
1533
+ "other:fact:position": "position:underway",
1534
+ "pair:geo:in_sight": true
1535
+ },
1536
+ "modality": "shall-if-practicable",
1537
+ "effect": {
1538
+ "own": "give-way",
1539
+ "other": "stand-on"
1540
+ },
1541
+ "rel:overrides": [
1542
+ "12a1",
1543
+ "12a2",
1544
+ "12a3",
1545
+ "15a-give-way"
1546
+ ],
1547
+ "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 `15a-give-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."
1548
+ },
1549
+ {
1550
+ "id": "18d1",
1551
+ "jurisdiction": "intl",
1552
+ "cite": "18(d)(i)",
1553
+ "category": "precedence",
1554
+ "subjects": 2,
1555
+ "when": {
1556
+ "own:fact:rule18_class": {
1557
+ "not": [
1558
+ "rule18_class:nuc",
1559
+ "rule18_class:ram"
1560
+ ]
1561
+ },
1562
+ "own:fact:position": "position:underway",
1563
+ "other:fact:rule18_class": "rule18_class:cbd",
1564
+ "other:fact:position": "position:underway",
1565
+ "pair:geo:in_sight": true
1566
+ },
1567
+ "modality": "shall-if-practicable",
1568
+ "effect": {
1569
+ "own": "shall-not-impede",
1570
+ "other": "none"
1571
+ },
1572
+ "note": "Own is the paragraph's own subject, verbatim: 'any vessel other than a vessel not under command or a vessel restricted in her ability to manoeuvre'. That is a negation, and it is now written as one (Q-33) instead of as the eight-value positive list it took before. `other` is `none` and not `stand-on`: 18(d) confers no stand-on role, which is the point 8(f)(iii) makes explicit. The modality is `shall-if-practicable` because the duty itself now lives in `effect.own` -- 'shall, if the circumstances of the case admit' is the deontic qualification and `shall-not-impede` is the role, so the two halves the paragraph carries at once are held in two fields rather than fought over in one. That closes 18(d)(i)'s half of Q-31 and leaves the general question open.",
1573
+ "gap": "18(d)(i) conditions on the CBD vessel 'exhibiting the signals in Rule 28', which is a display fact of the other vessel and is not read here; the entry is that much wider than the paragraph. Q-34."
1574
+ },
1575
+ {
1576
+ "id": "18f1",
1577
+ "jurisdiction": "intl",
1578
+ "cite": "18(f)(i)",
1579
+ "category": "precedence",
1580
+ "subjects": 2,
1581
+ "when": {
1582
+ "own:fact:rule18_class": "rule18_class:wig",
1583
+ "own:fact:position": "position:underway",
1584
+ "other:fact:position": "position:underway",
1585
+ "pair:geo:in_sight": true
1586
+ },
1587
+ "modality": "shall",
1588
+ "effect": {
1589
+ "own": "keep-clear",
1590
+ "other": "none"
1591
+ },
1592
+ "rel:overrides": [
1593
+ "18a1",
1594
+ "18a2",
1595
+ "18a3",
1596
+ "18a4",
1597
+ "18d1",
1598
+ "15a-give-way"
1599
+ ],
1600
+ "note": "`rule18_class:wig` is the decode of `fact:wig` and `fact:wig_near_surface` together, so the phase gate 18(f)(i) is scoped to is stated once in facts.json rather than as a pair of booleans in every entry that needs it. A WIG craft near the surface still satisfies 18(a)'s predicate -- she is a power-driven vessel underway and the negated rank does not exclude her -- so the rel:overrides against the 18(a) family and 18(d)(i) still carries. `keep-clear` is one effect for the paragraph's two duties, which the effect vocabulary cannot separate. It overrides `15a-give-way` as well (Q-40): a WIG craft operating on the water surface is a power-driven vessel by 3(m), so 15(a) would give her a give-way or stand-on role beside 18(f)(i)'s keep-clear duty -- two helm roles at once, which is the conflict the rank negation on `15a-give-way` used to avoid by keeping her out of Rule 15 altogether."
1601
+ },
1602
+ {
1603
+ "id": "8f3",
1604
+ "jurisdiction": "intl",
1605
+ "cite": "8(f)(iii)",
1606
+ "category": "precedence",
1607
+ "subjects": 2,
1608
+ "when": {
1609
+ "pair:geo:risk_of_collision": true
1610
+ },
1611
+ "modality": "shall",
1612
+ "effect": {
1613
+ "own": "none",
1614
+ "other": "none"
1615
+ },
1616
+ "note": "Recorded as a precedence norm rather than as a rel:overrides. It is not a superiority relation: 8(f)(ii) keeps the impeding vessel's duty alive, so nothing is displaced. What 8(f)(iii) does is deny the not-to-be-impeded vessel any role -- `none` on both sides -- so that shall-not-impede is never read as conferring stand-on.",
1617
+ "gap": "The paragraph's antecedent is 'a vessel, the passage of which is not to be impeded'. That is the output of another norm, not a fact, and a precedence predicate reads only facts. The `when` is therefore the risk-of-collision half alone, which makes this entry wider than the paragraph: it applies to any pair with risk of collision. Kept wide and recorded rather than narrowed by inventing a fact.",
1618
+ "no_gate_note": "No in-sight gate: Rule 4 puts Rules 4-10 in any condition of visibility."
1619
+ },
1620
+ {
1621
+ "id": "13a",
1622
+ "jurisdiction": "intl",
1623
+ "cite": "13(a)",
1624
+ "category": "precedence",
1625
+ "subjects": 2,
1626
+ "when": {
1627
+ "pair:geo:in_sight": true,
1628
+ "any_of": [
1629
+ {
1630
+ "other:geo:rel_bearing_deg": {
1631
+ "gt": 112.5,
1632
+ "lt": 247.5
1633
+ },
1634
+ "pair:geo:tcpa_s": {
1635
+ "gt": 0
1636
+ }
1637
+ },
1638
+ {
1639
+ "own:hist:was_overtaking": true
1640
+ }
1641
+ ],
1642
+ "other:fact:position": "position:underway"
1643
+ },
1644
+ "modality": "shall",
1645
+ "effect": {
1646
+ "own": "give-way",
1647
+ "other": "stand-on"
1648
+ },
1649
+ "rel:overrides": [
1650
+ "18a1",
1651
+ "18a2",
1652
+ "18a3",
1653
+ "18a4",
1654
+ "18b1",
1655
+ "18b2",
1656
+ "18b3",
1657
+ "18c1",
1658
+ "18c2",
1659
+ "18d1",
1660
+ "18f1",
1661
+ "12a1",
1662
+ "12a2",
1663
+ "12a3"
1664
+ ],
1665
+ "note": "Categorised `precedence`, not `classification` as ADR 0005 sec. 1 and the proposal's first-cut table have it. 13(a) is the one paragraph of Rule 13 that assigns a role, and a `classification` entry has no field to put a role in; 13(b)'s sector test is the classification and is what sets the latch. Q-14 settles membership paragraph by paragraph and this is one of them. The predicate now carries both halves of 'any vessel overtaking any other': the 13(b) sector, which 13b-overtaking classifies, and the 13(d) latch, which 13d classifies. They are a disjunction, which is what the entry could not write before the predicate language grew `any_of` (Q-33). Now also overrides the three Rule 12 entries: 'notwithstanding anything contained in' the Rules of Part B Sections I and II includes Rule 12, and two sailing vessels in an overtaking would otherwise hold 13(a)'s and 12(a)'s roles at once (Q-40).",
1666
+ "gap": "Only own's side. 13(a) lays the duty on the overtaking vessel, so this entry is directional by design and the overtaken vessel's stand-on role comes from the same entry read on the swapped situation. What it still cannot say is 13(c) -- a vessel in any doubt as to whether she is overtaking shall assume that she is -- because doubt is a state of the observer and no fact carries it; and it inherits 13b-overtaking's speed-comparison gap. Q-41, Q-46."
1667
+ },
1668
+ {
1669
+ "id": "9b",
1670
+ "jurisdiction": "intl",
1671
+ "cite": "9(b)",
1672
+ "category": "precedence",
1673
+ "subjects": 2,
1674
+ "when": {
1675
+ "pair:env:narrow_channel": true,
1676
+ "any_of": [
1677
+ {
1678
+ "own:fact:length_m": {
1679
+ "lt": 20
1680
+ }
1681
+ },
1682
+ {
1683
+ "own:fact:propulsion": "propulsion:sail"
1684
+ }
1685
+ ],
1686
+ "own:fact:position": "position:underway",
1687
+ "other:fact:position": "position:underway",
1688
+ "other:fact:confined_to_channel": true
1689
+ },
1690
+ "modality": "shall-not-impede",
1691
+ "effect": {
1692
+ "own": "shall-not-impede",
1693
+ "other": "none"
1694
+ },
1695
+ "rel:overrides": [
1696
+ "18a4"
1697
+ ],
1698
+ "note": "9(b)'s subject is disjunctive -- 'a vessel of less than 20 metres in length or a sailing vessel' -- and used to take two entries, `9b-small` and `9b-sail`, because a `when` was a conjunction. `any_of` is that disjunction (Q-33), so the paragraph is one entry again and the entry id is the plain citation-derived one. The two suffixed ids are retired and not reused (REQ-MODEL-10). The gate is `fact:propulsion` and not `rule18_class:sail`: 9(b)'s subject is a sailing vessel in the ordinary sense and 9(c) covers fishing vessels separately, so borrowing Rule 18's rank here would quietly move a fishing vessel under sail from one paragraph to the other. `other:fact:confined_to_channel` closes Q-34: the entry now reads which vessel the paragraph protects instead of assuming it from the encounter being in a channel at all."
1699
+ },
1700
+ {
1701
+ "id": "9c",
1702
+ "jurisdiction": "intl",
1703
+ "cite": "9(c)",
1704
+ "category": "precedence",
1705
+ "subjects": 2,
1706
+ "when": {
1707
+ "pair:env:narrow_channel": true,
1708
+ "own:fact:rule18_class": "rule18_class:fishing",
1709
+ "own:fact:position": "position:underway",
1710
+ "other:fact:position": "position:underway"
1711
+ },
1712
+ "modality": "shall-not-impede",
1713
+ "effect": {
1714
+ "own": "shall-not-impede",
1715
+ "other": "none"
1716
+ },
1717
+ "rel:overrides": [
1718
+ "18a3",
1719
+ "18b3"
1720
+ ],
1721
+ "note": "Reverses 18(a)(iii) and 18(b)(iii) inside a narrow channel: 9(c)'s object is 'any other vessel navigating within a narrow channel or fairway', so unlike 9(b) it needs no further fact about the other vessel."
1722
+ },
1723
+ {
1724
+ "id": "10i",
1725
+ "jurisdiction": "intl",
1726
+ "cite": "10(i)",
1727
+ "category": "precedence",
1728
+ "subjects": 2,
1729
+ "when": {
1730
+ "pair:env:traffic_lane": true,
1731
+ "own:fact:rule18_class": "rule18_class:fishing",
1732
+ "own:fact:position": "position:underway",
1733
+ "other:fact:position": "position:underway",
1734
+ "other:fact:following_traffic_lane": true
1735
+ },
1736
+ "modality": "shall-not-impede",
1737
+ "effect": {
1738
+ "own": "shall-not-impede",
1739
+ "other": "none"
1740
+ },
1741
+ "rel:overrides": [
1742
+ "18a3",
1743
+ "18b3"
1744
+ ],
1745
+ "note": "`other:fact:following_traffic_lane` closes Q-34: the entry now reads which vessel the paragraph protects instead of assuming it from the encounter being in a lane at all."
1746
+ },
1747
+ {
1748
+ "id": "10j",
1749
+ "jurisdiction": "intl",
1750
+ "cite": "10(j)",
1751
+ "category": "precedence",
1752
+ "subjects": 2,
1753
+ "when": {
1754
+ "pair:env:traffic_lane": true,
1755
+ "any_of": [
1756
+ {
1757
+ "own:fact:length_m": {
1758
+ "lt": 20
1759
+ }
1760
+ },
1761
+ {
1762
+ "own:fact:propulsion": "propulsion:sail"
1763
+ }
1764
+ ],
1765
+ "own:fact:position": "position:underway",
1766
+ "other:fact:propulsion": "propulsion:power",
1767
+ "other:fact:position": "position:underway",
1768
+ "other:fact:following_traffic_lane": true
1769
+ },
1770
+ "modality": "shall-not-impede",
1771
+ "effect": {
1772
+ "own": "shall-not-impede",
1773
+ "other": "none"
1774
+ },
1775
+ "rel:overrides": [
1776
+ "18a4"
1777
+ ],
1778
+ "note": "The same collapse as 9b, and the same disjunctive subject. 10(j)'s object is narrower than 9(b)'s -- a power-driven vessel -- so `other:fact:propulsion` is read. `10j-small` and `10j-sail` are retired and not reused. `other:fact:following_traffic_lane` closes Q-34, same as 10i."
1779
+ },
1780
+ {
1781
+ "id": "7d1",
1782
+ "jurisdiction": "intl",
1783
+ "cite": "7(d)(i)",
1784
+ "category": "classification",
1785
+ "subjects": 2,
1786
+ "when": {
1787
+ "pair:geo:bearing_change_deg_min": {
1788
+ "gt": -1.0,
1789
+ "lt": 1.0
1790
+ },
1791
+ "pair:geo:tcpa_s": {
1792
+ "gt": 0
1793
+ }
1794
+ },
1795
+ "modality": "shall",
1796
+ "effect": {
1797
+ "risk_of_collision": true
1798
+ },
1799
+ "note": "7(d)(i) is a deeming rule, not a judgement: if the compass bearing of an approaching vessel does not appreciably change, risk shall be deemed to exist. `appreciably` is a number the Rules do not give, so it is declared once in facts.json `situation.constants.appreciable_bearing_change_deg_min` and read from there; the interval is open on both sides of zero because the paragraph asks whether the bearing changes, not which way. `approaching` is `pair:geo:tcpa_s` positive -- the closest point of approach is still ahead -- which is the nearest thing in the fact vocabulary to a vessel coming on.",
1800
+ "gap": "This entry can only add risk, never deny it. 7(a) makes risk a judgement on all available means and says that in any doubt it shall be deemed to exist, so `pair:geo:risk_of_collision` stays a supplied fact and this entry's effect is a second, independent ground for the same conclusion. Nothing here writes the fact back: whether a norm may read another norm's effect is Q-35, unresolved.",
1801
+ "no_gate_note": "No in-sight gate: Rule 4 puts Rules 4-10 in any condition of visibility."
1802
+ },
1803
+ {
1804
+ "id": "12a1",
1805
+ "jurisdiction": "intl",
1806
+ "cite": "12(a)(i)",
1807
+ "category": "precedence",
1808
+ "subjects": 2,
1809
+ "when": {
1810
+ "pair:geo:in_sight": true,
1811
+ "pair:geo:risk_of_collision": true,
1812
+ "own:fact:propulsion": "propulsion:sail",
1813
+ "other:fact:propulsion": "propulsion:sail",
1814
+ "own:fact:position": "position:underway",
1815
+ "other:fact:position": "position:underway",
1816
+ "own:kin:wind_side": "wind_side:port",
1817
+ "other:kin:wind_side": "wind_side:starboard"
1818
+ },
1819
+ "modality": "shall",
1820
+ "effect": {
1821
+ "own": "give-way",
1822
+ "other": "stand-on"
1823
+ },
1824
+ "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 own's side, so the mirror case -- own 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."
1825
+ },
1826
+ {
1827
+ "id": "12a2",
1828
+ "jurisdiction": "intl",
1829
+ "cite": "12(a)(ii)",
1830
+ "category": "precedence",
1831
+ "subjects": 2,
1832
+ "when": {
1833
+ "pair:geo:in_sight": true,
1834
+ "pair:geo:risk_of_collision": true,
1835
+ "own:fact:propulsion": "propulsion:sail",
1836
+ "other:fact:propulsion": "propulsion:sail",
1837
+ "own:fact:position": "position:underway",
1838
+ "other:fact:position": "position:underway",
1839
+ "own:geo:windward": true,
1840
+ "any_of": [
1841
+ {
1842
+ "own:kin:wind_side": "wind_side:port",
1843
+ "other:kin:wind_side": "wind_side:port"
1844
+ },
1845
+ {
1846
+ "own:kin:wind_side": "wind_side:starboard",
1847
+ "other:kin:wind_side": "wind_side:starboard"
1848
+ }
1849
+ ]
1850
+ },
1851
+ "modality": "shall",
1852
+ "effect": {
1853
+ "own": "give-way",
1854
+ "other": "stand-on"
1855
+ },
1856
+ "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."
1857
+ },
1858
+ {
1859
+ "id": "12a3",
1860
+ "jurisdiction": "intl",
1861
+ "cite": "12(a)(iii)",
1862
+ "category": "precedence",
1863
+ "subjects": 2,
1864
+ "when": {
1865
+ "pair:geo:in_sight": true,
1866
+ "pair:geo:risk_of_collision": true,
1867
+ "own:fact:propulsion": "propulsion:sail",
1868
+ "other:fact:propulsion": "propulsion:sail",
1869
+ "own:fact:position": "position:underway",
1870
+ "other:fact:position": "position:underway",
1871
+ "own:kin:wind_side": "wind_side:port",
1872
+ "other:kin:wind_side": "wind_side:unknown",
1873
+ "other:geo:windward": true
1874
+ },
1875
+ "modality": "shall",
1876
+ "effect": {
1877
+ "own": "give-way",
1878
+ "other": "stand-on"
1879
+ },
1880
+ "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 own 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."
1881
+ },
1882
+ {
1883
+ "id": "13b-overtaking",
1884
+ "jurisdiction": "intl",
1885
+ "cite": "13(b)",
1886
+ "category": "classification",
1887
+ "subjects": 2,
1888
+ "when": {
1889
+ "pair:geo:in_sight": true,
1890
+ "other:geo:rel_bearing_deg": {
1891
+ "gt": 112.5,
1892
+ "lt": 247.5
1893
+ },
1894
+ "pair:geo:tcpa_s": {
1895
+ "gt": 0
1896
+ },
1897
+ "own:fact:position": "position:underway",
1898
+ "other:fact:position": "position:underway"
1899
+ },
1900
+ "modality": "shall",
1901
+ "effect": {
1902
+ "encounter": "overtaking"
1903
+ },
1904
+ "note": "own is the overtaking vessel: own bears in the other's stern sector. 13(b) is the deeming paragraph and therefore the classification, which is the half of Q-37 PR #24 left open. It is written twice, once per subject, because the encounter type is a property of the pair and not of one vessel: a vessel being overtaken is in an overtaking, and reading only `other:geo:rel_bearing_deg` would have classified her side of the same encounter as a crossing. Which vessel carries the duty is 13(a)'s question, not this one's.",
1905
+ "gap": "'Coming up with' is a comparison of the two vessels' speeds, and a predicate compares a fact to a constant, never one fact to another. `pair:geo:tcpa_s` positive stands in for it: the closest point of approach is still ahead, so the pair is closing, and closing from abaft the beam is coming up. A vessel drawing away astern is excluded, which is the case that mattered; a pair closing because the vessel ahead has stopped is not, and is classified as an overtaking. Q-46."
1906
+ },
1907
+ {
1908
+ "id": "13b-overtaken",
1909
+ "jurisdiction": "intl",
1910
+ "cite": "13(b)",
1911
+ "category": "classification",
1912
+ "subjects": 2,
1913
+ "when": {
1914
+ "pair:geo:in_sight": true,
1915
+ "own:geo:rel_bearing_deg": {
1916
+ "gt": 112.5,
1917
+ "lt": 247.5
1918
+ },
1919
+ "pair:geo:tcpa_s": {
1920
+ "gt": 0
1921
+ },
1922
+ "own:fact:position": "position:underway",
1923
+ "other:fact:position": "position:underway"
1924
+ },
1925
+ "modality": "shall",
1926
+ "effect": {
1927
+ "encounter": "overtaking"
1928
+ },
1929
+ "note": "own is the vessel being overtaken: the other bears in own's stern sector. 13(b) is the deeming paragraph and therefore the classification, which is the half of Q-37 PR #24 left open. It is written twice, once per subject, because the encounter type is a property of the pair and not of one vessel: a vessel being overtaken is in an overtaking, and reading only `other:geo:rel_bearing_deg` would have classified her side of the same encounter as a crossing. Which vessel carries the duty is 13(a)'s question, not this one's.",
1930
+ "gap": "'Coming up with' is a comparison of the two vessels' speeds, and a predicate compares a fact to a constant, never one fact to another. `pair:geo:tcpa_s` positive stands in for it: the closest point of approach is still ahead, so the pair is closing, and closing from abaft the beam is coming up. A vessel drawing away astern is excluded, which is the case that mattered; a pair closing because the vessel ahead has stopped is not, and is classified as an overtaking. Q-46."
1931
+ },
1932
+ {
1933
+ "id": "13d",
1934
+ "jurisdiction": "intl",
1935
+ "cite": "13(d)",
1936
+ "category": "classification",
1937
+ "subjects": 2,
1938
+ "when": {
1939
+ "pair:geo:in_sight": true,
1940
+ "any_of": [
1941
+ {
1942
+ "own:hist:was_overtaking": true
1943
+ },
1944
+ {
1945
+ "other:hist:was_overtaking": true
1946
+ }
1947
+ ],
1948
+ "own:fact:position": "position:underway",
1949
+ "other:fact:position": "position:underway"
1950
+ },
1951
+ "modality": "shall",
1952
+ "effect": {
1953
+ "encounter": "overtaking"
1954
+ },
1955
+ "note": "The latch, and the reason `hist` is a fact class rather than a note. Once either vessel has been the overtaking vessel the encounter stays an overtaking whatever the bearing does next, so this entry reads history alone and no geometry at all. It is the counterpart of the `hist:was_overtaking: false` gate on 14b and 15a-crossing: without both halves the drawn-out bearing would produce a head-on or a crossing beside the overtaking, which is exactly the reclassification 13(d) forbids. `pair:geo:in_sight` stays in the gate; a Rule 19(d)(i) entry reads `hist:was_overtaking` directly (Q-49).",
1956
+ "gap": "'Until she is finally past and clear' is the paragraph's own end condition and nothing in the fact vocabulary carries it, so in this model the latch never clears. A consumer sets and clears `hist:was_overtaking` itself. Recorded rather than approximated with a range or a bearing: past and clear is a seamanship judgement, and inventing a threshold for it would be the kind of number Q-40's neighbours are about. Q-47."
1957
+ },
1958
+ {
1959
+ "id": "14b",
1960
+ "jurisdiction": "intl",
1961
+ "cite": "14(b)",
1962
+ "category": "classification",
1963
+ "subjects": 2,
1964
+ "when": {
1965
+ "pair:geo:in_sight": true,
1966
+ "pair:geo:risk_of_collision": true,
1967
+ "own:fact:propulsion": "propulsion:power",
1968
+ "other:fact:propulsion": "propulsion:power",
1969
+ "own:fact:position": "position:underway",
1970
+ "other:fact:position": "position:underway",
1971
+ "own:hist:was_overtaking": false,
1972
+ "other:hist:was_overtaking": false,
1973
+ "own:geo:rel_bearing_deg": {
1974
+ "any_of": [
1975
+ {
1976
+ "lte": 11.25
1977
+ },
1978
+ {
1979
+ "gte": 348.75
1980
+ }
1981
+ ]
1982
+ },
1983
+ "other:geo:rel_bearing_deg": {
1984
+ "any_of": [
1985
+ {
1986
+ "lte": 11.25
1987
+ },
1988
+ {
1989
+ "gte": 348.75
1990
+ }
1991
+ ]
1992
+ }
1993
+ },
1994
+ "modality": "shall",
1995
+ "effect": {
1996
+ "encounter": "head-on"
1997
+ },
1998
+ "note": "14(b)'s deeming test: both vessels see the other ahead or nearly ahead. Both bearings are read, not one: a single vessel with the other fine on the bow is not a head-on situation unless she is also fine on the other's bow, and reading one bearing alone would have swallowed part of the crossing sector. The half-angle is declared once in facts.json `situation.constants.head_on_half_angle_deg`. Cites 14(b) and not 14(a) because the deeming paragraph is the classification, exactly as 13b-overtaking and 13b-overtaken cite 13(b): 14(a) states the situation in words -- 'reciprocal or nearly reciprocal courses' -- and imposes the duty, each shall alter her course to starboard, which is `conduct`, is not modelled, and is in known_omissions. Q-45.",
1999
+ "gap": "The history gates are 13(d)'s, not Rule 14's, and they are what keeps the three encounter types a partition -- their price is that a situation which omits `hist:was_overtaking` is classified as no encounter at all rather than as a head-on. Q-43."
2000
+ },
2001
+ {
2002
+ "id": "15a-crossing",
2003
+ "jurisdiction": "intl",
2004
+ "cite": "15(a)",
2005
+ "category": "classification",
2006
+ "subjects": 2,
2007
+ "when": {
2008
+ "pair:geo:in_sight": true,
2009
+ "pair:geo:risk_of_collision": true,
2010
+ "own:fact:propulsion": "propulsion:power",
2011
+ "other:fact:propulsion": "propulsion:power",
2012
+ "own:fact:position": "position:underway",
2013
+ "other:fact:position": "position:underway",
2014
+ "own:hist:was_overtaking": false,
2015
+ "other:hist:was_overtaking": false,
2016
+ "own:geo:rel_bearing_deg": {
2017
+ "not": {
2018
+ "gt": 112.5,
2019
+ "lt": 247.5
2020
+ }
2021
+ },
2022
+ "other:geo:rel_bearing_deg": {
2023
+ "not": {
2024
+ "gt": 112.5,
2025
+ "lt": 247.5
2026
+ }
2027
+ },
2028
+ "any_of": [
2029
+ {
2030
+ "own:geo:rel_bearing_deg": {
2031
+ "not": {
2032
+ "any_of": [
2033
+ {
2034
+ "lte": 11.25
2035
+ },
2036
+ {
2037
+ "gte": 348.75
2038
+ }
2039
+ ]
2040
+ }
2041
+ }
2042
+ },
2043
+ {
2044
+ "other:geo:rel_bearing_deg": {
2045
+ "not": {
2046
+ "any_of": [
2047
+ {
2048
+ "lte": 11.25
2049
+ },
2050
+ {
2051
+ "gte": 348.75
2052
+ }
2053
+ ]
2054
+ }
2055
+ }
2056
+ }
2057
+ ]
2058
+ },
2059
+ "modality": "shall",
2060
+ "effect": {
2061
+ "encounter": "crossing"
2062
+ },
2063
+ "note": "The residual, and derived rather than written as its own sector. Not overtaking is `not` over the very constraint 13b-overtaking uses, on both subjects, so the sector and its complement cannot drift apart and the 112.5 edge lands in exactly one of them. Not head-on is `not` over 14b's cone, on either subject -- the negation of a conjunction, which is why it is an `any_of` and not two constraints. Nothing here enumerates a crossing sector, and that is the point: the only way for the three encounter types to overlap or to leave a bearing unclassified is for someone to edit one of the two constraints without editing the other, and there is only one of each.",
2064
+ "gap": "15(a) says 'two power-driven vessels', which this reads as 3(b)'s definition and nothing more, so a vessel not under command is inside it -- she is power-driven. That is deliberate for the classification: the encounter really is a crossing. `15a-give-way` reads 3(b) the same way and no longer gates on rank either (Q-40): where Rule 18 ranks the pair it is the Rule 18 entry's `rel:overrides` that displaces the role, which is the half of the encounter Rule 18 reaches. The geometry is not that half, and no entry now says otherwise in two places."
2065
+ },
2066
+ {
2067
+ "id": "15a-give-way",
2068
+ "jurisdiction": "intl",
2069
+ "cite": "15(a)",
2070
+ "category": "precedence",
2071
+ "subjects": 2,
2072
+ "when": {
2073
+ "pair:geo:in_sight": true,
2074
+ "pair:geo:risk_of_collision": true,
2075
+ "own:fact:propulsion": "propulsion:power",
2076
+ "other:fact:propulsion": "propulsion:power",
2077
+ "own:fact:position": "position:underway",
2078
+ "other:fact:position": "position:underway",
2079
+ "own:hist:was_overtaking": false,
2080
+ "other:hist:was_overtaking": false,
2081
+ "own:geo:rel_bearing_deg": {
2082
+ "gt": 0,
2083
+ "lte": 112.5
2084
+ },
2085
+ "other:geo:rel_bearing_deg": {
2086
+ "not": {
2087
+ "gt": 112.5,
2088
+ "lt": 247.5
2089
+ }
2090
+ },
2091
+ "any_of": [
2092
+ {
2093
+ "own:geo:rel_bearing_deg": {
2094
+ "not": {
2095
+ "any_of": [
2096
+ {
2097
+ "lte": 11.25
2098
+ },
2099
+ {
2100
+ "gte": 348.75
2101
+ }
2102
+ ]
2103
+ }
2104
+ }
2105
+ },
2106
+ {
2107
+ "other:geo:rel_bearing_deg": {
2108
+ "not": {
2109
+ "any_of": [
2110
+ {
2111
+ "lte": 11.25
2112
+ },
2113
+ {
2114
+ "gte": 348.75
2115
+ }
2116
+ ]
2117
+ }
2118
+ }
2119
+ }
2120
+ ]
2121
+ },
2122
+ "modality": "shall",
2123
+ "effect": {
2124
+ "own": "give-way",
2125
+ "other": "stand-on"
2126
+ },
2127
+ "note": "The role half of 15(a): the vessel which has the other on her own starboard side keeps out of the way. Own's bearing constraint is the starboard half of the non-overtaking sector, and its upper edge is the same declared constant 13b reads, so it is not a hand-listed sector either; the partition test asserts that this entry selects exactly the crossings in which the other bears between 0 and 180 relative, which is what makes the shorthand checkable rather than trusted. 'Two power-driven vessels' is 3(b) and nothing more, so both subjects are gated on `fact:propulsion: propulsion:power` and on no Rule 18 rank (Q-40): a vessel engaged in fishing, not under command, restricted in her ability to manoeuvre or constrained by her draught is a power-driven vessel whenever her machinery is in use, and is inside Rule 15. Where Rule 18 also ranks the pair, that entry carries `rel:overrides` against this one -- 18(a)(i)-(iii) from the unranked vessel's side, 18(c)(i)-(ii) from the fishing vessel's, 18(f)(i) from the WIG craft's -- because Rule 18's opening words except Rules 9, 10 and 13 and no others; 13(a)'s 'notwithstanding' would override it the same way, and does not need to, because this entry's bearing gates and its `hist:was_overtaking: false` already exclude every overtaking. Where Rule 18 leaves the pair unordered -- two vessels engaged in fishing, or 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.",
2128
+ "gap": "15(a)'s second duty -- 'shall, if the circumstances of the case admit, avoid crossing ahead of the other vessel' -- is `conduct` with a practicability caveat, and neither half fits a precedence entry. It is dropped here, which is Q-31's shape again: the caveat has no field to move into unless the duty happens to be a role, and this one is an action."
2129
+ },
2130
+ {
2131
+ "id": "30a-buoy",
2132
+ "jurisdiction": "us/inland",
2133
+ "cite": "30(a)",
2134
+ "when": {
2135
+ "fact:position": "position:moored",
2136
+ "fact:on_mooring_buoy": true
2137
+ },
2138
+ "lights": [
2139
+ {
2140
+ "light": "light:all_round",
2141
+ "color": "white",
2142
+ "count": 1,
2143
+ "position": "in the fore part"
2144
+ },
2145
+ {
2146
+ "light": "light:all_round",
2147
+ "color": "white",
2148
+ "count": 1,
2149
+ "position": "at or near the stern, at a lower level than the fore one"
2150
+ }
2151
+ ],
2152
+ "modality": "shall",
2153
+ "note": "33 CFR 90.5 deems a vessel made fast to a mooring buoy to be a vessel at anchor, so Inland Rule 30(a) reaches her. The Convention has no such deeming provision: under intl she is 'moored' by Rule 3(i) and no paragraph prescribes lights for her."
2154
+ },
2155
+ {
2156
+ "id": "30b-buoy",
2157
+ "jurisdiction": "us/inland",
2158
+ "cite": "30(b)",
2159
+ "when": {
2160
+ "fact:position": "position:moored",
2161
+ "fact:on_mooring_buoy": true,
2162
+ "fact:length_m": {
2163
+ "lt": 50
2164
+ }
2165
+ },
2166
+ "lights": [
2167
+ {
2168
+ "light": "light:all_round",
2169
+ "color": "white",
2170
+ "count": 1,
2171
+ "position": "where it can best be seen"
2172
+ }
2173
+ ],
2174
+ "rel:in_lieu_of": [
2175
+ "30a-buoy"
2176
+ ],
2177
+ "modality": "may",
2178
+ "note": "The under-50 m alternative, on the same 33 CFR 90.5 deeming that brings 30a-buoy in. It is a separate entry because widening 30b's predicate would edit an intl entry to carry a national delta, which REQ-SCOPE-4 forbids."
1117
2179
  }
1118
2180
  ]
1119
2181
  }