colregs 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/LICENSE +194 -26
  2. package/PROVENANCE.md +45 -12
  3. package/README.md +212 -19
  4. package/data/applicability.json +1189 -189
  5. package/data/deprecated-identifiers.json +7 -0
  6. package/data/facts.json +543 -112
  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/conventions.md +27 -0
  17. package/docs/gates.json +84 -0
  18. package/docs/identifiers.md +435 -0
  19. package/docs/requirements.md +1121 -22
  20. package/docs/verification/2026-08-30-q6-q8.md +278 -0
  21. package/docs/verification/2026-09-05-rule27f-rule28-anchor-scenarios.md +330 -0
  22. package/fixtures/applicability-fixtures.json +254 -227
  23. package/fixtures/situation-fixtures.json +3603 -0
  24. package/package.json +16 -4
  25. package/schema/applicability-fixtures.schema.json +47 -0
  26. package/schema/applicability.schema.json +401 -0
  27. package/schema/deprecated-identifiers.schema.json +29 -0
  28. package/schema/facts.schema.json +793 -0
  29. package/schema/geometry.schema.json +239 -0
  30. package/schema/images.schema.json +53 -0
  31. package/schema/lights.schema.json +131 -0
  32. package/schema/rules.schema.json +50 -0
  33. 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."
113
+ }
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."
42
129
  }
43
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,23 @@
543
640
  "jurisdiction": "intl",
544
641
  "cite": "26(b)(i)",
545
642
  "when": {
546
- "activity": "trawling"
643
+ "fact:activity": "activity:trawling"
547
644
  },
548
645
  "lights": [
549
646
  {
550
- "light": "all_round",
647
+ "light": "light:all_round",
551
648
  "color": "green",
552
649
  "count": 1,
553
650
  "position": "upper"
554
651
  },
555
652
  {
556
- "light": "all_round",
653
+ "light": "light:all_round",
557
654
  "color": "white",
558
655
  "count": 1,
559
656
  "position": "lower"
560
657
  }
561
658
  ],
562
- "excludes": [
659
+ "rel:excludes": [
563
660
  "30a",
564
661
  "30b"
565
662
  ],
@@ -574,11 +671,11 @@
574
671
  "jurisdiction": "intl",
575
672
  "cite": "26(b)(ii)",
576
673
  "when": {
577
- "activity": "trawling"
674
+ "fact:activity": "activity:trawling"
578
675
  },
579
676
  "lights": [
580
677
  {
581
- "light": "masthead",
678
+ "light": "light:masthead",
582
679
  "position": "abaft of and higher than the all-round green light",
583
680
  "count": 1
584
681
  }
@@ -587,7 +684,7 @@
587
684
  "modality_by": [
588
685
  {
589
686
  "when": {
590
- "length_m": {
687
+ "fact:length_m": {
591
688
  "gte": 50
592
689
  }
593
690
  },
@@ -595,7 +692,7 @@
595
692
  },
596
693
  {
597
694
  "when": {
598
- "length_m": {
695
+ "fact:length_m": {
599
696
  "lt": 50
600
697
  }
601
698
  },
@@ -608,11 +705,11 @@
608
705
  "jurisdiction": "intl",
609
706
  "cite": "26(b)(iii)",
610
707
  "when": {
611
- "activity": "trawling",
612
- "making_way": true
708
+ "fact:activity": "activity:trawling",
709
+ "fact:making_way": true
613
710
  },
614
711
  "lights": [],
615
- "includes": [
712
+ "rel:includes": [
616
713
  "23a34"
617
714
  ],
618
715
  "modality": "shall",
@@ -625,23 +722,23 @@
625
722
  "jurisdiction": "intl",
626
723
  "cite": "26(c)(i)",
627
724
  "when": {
628
- "activity": "fishing"
725
+ "fact:activity": "activity:fishing"
629
726
  },
630
727
  "lights": [
631
728
  {
632
- "light": "all_round",
729
+ "light": "light:all_round",
633
730
  "color": "red",
634
731
  "count": 1,
635
732
  "position": "upper"
636
733
  },
637
734
  {
638
- "light": "all_round",
735
+ "light": "light:all_round",
639
736
  "color": "white",
640
737
  "count": 1,
641
738
  "position": "lower"
642
739
  }
643
740
  ],
644
- "excludes": [
741
+ "rel:excludes": [
645
742
  "30a",
646
743
  "30b"
647
744
  ],
@@ -652,14 +749,14 @@
652
749
  "jurisdiction": "intl",
653
750
  "cite": "26(c)(ii)",
654
751
  "when": {
655
- "activity": "fishing",
656
- "gear_extent_m": {
752
+ "fact:activity": "activity:fishing",
753
+ "fact:gear_extent_m": {
657
754
  "gt": 150
658
755
  }
659
756
  },
660
757
  "lights": [
661
758
  {
662
- "light": "all_round",
759
+ "light": "light:all_round",
663
760
  "color": "white",
664
761
  "count": 1,
665
762
  "position": "in the direction of the gear"
@@ -672,11 +769,11 @@
672
769
  "jurisdiction": "intl",
673
770
  "cite": "26(c)(iii)",
674
771
  "when": {
675
- "activity": "fishing",
676
- "making_way": true
772
+ "fact:activity": "activity:fishing",
773
+ "fact:making_way": true
677
774
  },
678
775
  "lights": [],
679
- "includes": [
776
+ "rel:includes": [
680
777
  "23a34"
681
778
  ],
682
779
  "modality": "shall",
@@ -689,12 +786,12 @@
689
786
  "jurisdiction": "intl",
690
787
  "cite": "27(a)(i)",
691
788
  "when": {
692
- "activity": "nuc",
693
- "position": "underway"
789
+ "fact:activity": "activity:nuc",
790
+ "fact:position": "position:underway"
694
791
  },
695
792
  "lights": [
696
793
  {
697
- "light": "all_round",
794
+ "light": "light:all_round",
698
795
  "color": "red",
699
796
  "count": 2,
700
797
  "arrangement": "vertical"
@@ -710,11 +807,11 @@
710
807
  "jurisdiction": "intl",
711
808
  "cite": "27(a)(iii)",
712
809
  "when": {
713
- "activity": "nuc",
714
- "making_way": true
810
+ "fact:activity": "activity:nuc",
811
+ "fact:making_way": true
715
812
  },
716
813
  "lights": [],
717
- "includes": [
814
+ "rel:includes": [
718
815
  "23a34"
719
816
  ],
720
817
  "modality": "shall",
@@ -727,23 +824,23 @@
727
824
  "jurisdiction": "intl",
728
825
  "cite": "27(b)(i)",
729
826
  "when": {
730
- "activity": "ram"
827
+ "fact:activity": "activity:ram"
731
828
  },
732
829
  "lights": [
733
830
  {
734
- "light": "all_round",
831
+ "light": "light:all_round",
735
832
  "color": "red",
736
833
  "count": 1,
737
834
  "position": "upper"
738
835
  },
739
836
  {
740
- "light": "all_round",
837
+ "light": "light:all_round",
741
838
  "color": "white",
742
839
  "count": 1,
743
840
  "position": "middle"
744
841
  },
745
842
  {
746
- "light": "all_round",
843
+ "light": "light:all_round",
747
844
  "color": "red",
748
845
  "count": 1,
749
846
  "position": "lower"
@@ -757,11 +854,11 @@
757
854
  "jurisdiction": "intl",
758
855
  "cite": "27(b)(iii)",
759
856
  "when": {
760
- "activity": "ram",
761
- "making_way": true
857
+ "fact:activity": "activity:ram",
858
+ "fact:making_way": true
762
859
  },
763
860
  "lights": [],
764
- "includes": [
861
+ "rel:includes": [
765
862
  "23a1",
766
863
  "23a2",
767
864
  "23a34"
@@ -776,11 +873,11 @@
776
873
  "jurisdiction": "intl",
777
874
  "cite": "27(b)(iv)",
778
875
  "when": {
779
- "activity": "ram",
780
- "position": "anchored"
876
+ "fact:activity": "activity:ram",
877
+ "fact:position": "position:anchored"
781
878
  },
782
879
  "lights": [],
783
- "conditional_includes": [
880
+ "rel:conditional_includes": [
784
881
  {
785
882
  "one_of": [
786
883
  "30a",
@@ -798,26 +895,26 @@
798
895
  "jurisdiction": "intl",
799
896
  "cite": "27(d)",
800
897
  "when": {
801
- "activity": "ram_underwater",
802
- "obstruction_exists": true
898
+ "fact:activity": "activity:ram_underwater",
899
+ "fact:obstruction_exists": true
803
900
  },
804
901
  "lights": [
805
902
  {
806
- "light": "all_round",
903
+ "light": "light:all_round",
807
904
  "color": "red",
808
905
  "count": 2,
809
906
  "arrangement": "vertical",
810
907
  "position": "on the side on which the obstruction exists"
811
908
  },
812
909
  {
813
- "light": "all_round",
910
+ "light": "light:all_round",
814
911
  "color": "green",
815
912
  "count": 2,
816
913
  "arrangement": "vertical",
817
914
  "position": "on the side on which another vessel may pass"
818
915
  }
819
916
  ],
820
- "includes": [
917
+ "rel:includes": [
821
918
  "27b-id"
822
919
  ],
823
920
  "modality": "shall",
@@ -831,29 +928,29 @@
831
928
  "jurisdiction": "intl",
832
929
  "cite": "27(e)(i)",
833
930
  "when": {
834
- "activity": "diving"
931
+ "fact:activity": "activity:diving"
835
932
  },
836
933
  "lights": [
837
934
  {
838
- "light": "all_round",
935
+ "light": "light:all_round",
839
936
  "color": "red",
840
937
  "count": 1,
841
938
  "position": "upper"
842
939
  },
843
940
  {
844
- "light": "all_round",
941
+ "light": "light:all_round",
845
942
  "color": "white",
846
943
  "count": 1,
847
944
  "position": "middle"
848
945
  },
849
946
  {
850
- "light": "all_round",
947
+ "light": "light:all_round",
851
948
  "color": "red",
852
949
  "count": 1,
853
950
  "position": "lower"
854
951
  }
855
952
  ],
856
- "in_lieu_of": [
953
+ "rel:in_lieu_of": [
857
954
  "27d"
858
955
  ],
859
956
  "modality": "shall",
@@ -867,53 +964,62 @@
867
964
  "jurisdiction": "intl",
868
965
  "cite": "27(f)",
869
966
  "when": {
870
- "activity": "mine"
967
+ "fact:activity": "activity:mine"
871
968
  },
872
969
  "lights": [
873
970
  {
874
- "light": "all_round",
971
+ "light": "light:all_round",
875
972
  "color": "green",
876
973
  "count": 3,
877
974
  "position": "one near the foremast head and one at each end of the fore yard"
878
975
  }
879
976
  ],
880
- "includes": [
881
- "23a1",
882
- "23a2",
883
- "23a34"
884
- ],
885
- "conditional_includes": [
977
+ "rel:conditional_includes": [
886
978
  {
887
979
  "when": {
888
- "position": "anchored"
980
+ "fact:position": "position:underway"
981
+ },
982
+ "rel:includes": [
983
+ "23a1",
984
+ "23a2",
985
+ "23a34"
986
+ ],
987
+ "cite": "27(f)"
988
+ },
989
+ {
990
+ "when": {
991
+ "fact:position": "position:anchored"
889
992
  },
890
993
  "one_of": [
891
994
  "30a",
892
995
  "30b"
893
- ]
996
+ ],
997
+ "cite": "27(f)"
894
998
  }
895
999
  ],
896
1000
  "modality": "shall",
897
1001
  "images": [
898
1002
  "NRHB_27_f.png"
899
- ]
1003
+ ],
1004
+ "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
1005
  },
901
1006
  {
902
1007
  "id": "28",
903
1008
  "jurisdiction": "intl",
904
1009
  "cite": "28",
905
1010
  "when": {
906
- "activity": "cbd"
1011
+ "fact:activity": "activity:cbd",
1012
+ "fact:position": "position:underway"
907
1013
  },
908
1014
  "lights": [
909
1015
  {
910
- "light": "all_round",
1016
+ "light": "light:all_round",
911
1017
  "color": "red",
912
1018
  "count": 3,
913
1019
  "arrangement": "vertical"
914
1020
  }
915
1021
  ],
916
- "includes": [
1022
+ "rel:includes": [
917
1023
  "23a1",
918
1024
  "23a2",
919
1025
  "23a34"
@@ -922,42 +1028,42 @@
922
1028
  "images": [
923
1029
  "NRHB_28.png"
924
1030
  ],
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."
1031
+ "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
1032
  },
927
1033
  {
928
1034
  "id": "29a",
929
1035
  "jurisdiction": "intl",
930
1036
  "cite": "29(a)",
931
1037
  "when": {
932
- "activity": "pilot"
1038
+ "fact:activity": "activity:pilot"
933
1039
  },
934
1040
  "lights": [
935
1041
  {
936
- "light": "all_round",
1042
+ "light": "light:all_round",
937
1043
  "color": "white",
938
1044
  "count": 1,
939
1045
  "position": "upper, at or near the masthead"
940
1046
  },
941
1047
  {
942
- "light": "all_round",
1048
+ "light": "light:all_round",
943
1049
  "color": "red",
944
1050
  "count": 1,
945
1051
  "position": "lower, at or near the masthead"
946
1052
  }
947
1053
  ],
948
- "conditional_includes": [
1054
+ "rel:conditional_includes": [
949
1055
  {
950
1056
  "when": {
951
- "position": "underway"
1057
+ "fact:position": "position:underway"
952
1058
  },
953
- "includes": [
1059
+ "rel:includes": [
954
1060
  "23a34"
955
1061
  ],
956
1062
  "cite": "29(a)(ii)"
957
1063
  },
958
1064
  {
959
1065
  "when": {
960
- "position": "anchored"
1066
+ "fact:position": "position:anchored"
961
1067
  },
962
1068
  "one_of": [
963
1069
  "30a",
@@ -977,17 +1083,17 @@
977
1083
  "jurisdiction": "intl",
978
1084
  "cite": "30(a)",
979
1085
  "when": {
980
- "position": "anchored"
1086
+ "fact:position": "position:anchored"
981
1087
  },
982
1088
  "lights": [
983
1089
  {
984
- "light": "all_round",
1090
+ "light": "light:all_round",
985
1091
  "color": "white",
986
1092
  "count": 1,
987
1093
  "position": "in the fore part"
988
1094
  },
989
1095
  {
990
- "light": "all_round",
1096
+ "light": "light:all_round",
991
1097
  "color": "white",
992
1098
  "count": 1,
993
1099
  "position": "at or near the stern, at a lower level than the fore one"
@@ -1003,20 +1109,20 @@
1003
1109
  "jurisdiction": "intl",
1004
1110
  "cite": "30(b)",
1005
1111
  "when": {
1006
- "position": "anchored",
1007
- "length_m": {
1112
+ "fact:position": "position:anchored",
1113
+ "fact:length_m": {
1008
1114
  "lt": 50
1009
1115
  }
1010
1116
  },
1011
1117
  "lights": [
1012
1118
  {
1013
- "light": "all_round",
1119
+ "light": "light:all_round",
1014
1120
  "color": "white",
1015
1121
  "count": 1,
1016
1122
  "position": "where it can best be seen"
1017
1123
  }
1018
1124
  ],
1019
- "in_lieu_of": [
1125
+ "rel:in_lieu_of": [
1020
1126
  "30a"
1021
1127
  ],
1022
1128
  "modality": "may"
@@ -1026,11 +1132,11 @@
1026
1132
  "jurisdiction": "intl",
1027
1133
  "cite": "30(c)",
1028
1134
  "when": {
1029
- "position": "anchored"
1135
+ "fact:position": "position:anchored"
1030
1136
  },
1031
1137
  "lights": [
1032
1138
  {
1033
- "light": "deck_lights",
1139
+ "light": "light:deck_lights",
1034
1140
  "note": "available working or equivalent lights to illuminate her decks"
1035
1141
  }
1036
1142
  ],
@@ -1038,7 +1144,7 @@
1038
1144
  "modality_by": [
1039
1145
  {
1040
1146
  "when": {
1041
- "length_m": {
1147
+ "fact:length_m": {
1042
1148
  "gte": 100
1043
1149
  }
1044
1150
  },
@@ -1046,7 +1152,7 @@
1046
1152
  },
1047
1153
  {
1048
1154
  "when": {
1049
- "length_m": {
1155
+ "fact:length_m": {
1050
1156
  "lt": 100
1051
1157
  }
1052
1158
  },
@@ -1059,10 +1165,10 @@
1059
1165
  "jurisdiction": "intl",
1060
1166
  "cite": "30(d)",
1061
1167
  "when": {
1062
- "position": "aground"
1168
+ "fact:position": "position:aground"
1063
1169
  },
1064
1170
  "lights": [],
1065
- "conditional_includes": [
1171
+ "rel:conditional_includes": [
1066
1172
  {
1067
1173
  "one_of": [
1068
1174
  "30a",
@@ -1078,14 +1184,14 @@
1078
1184
  "jurisdiction": "intl",
1079
1185
  "cite": "30(d)",
1080
1186
  "when": {
1081
- "position": "aground",
1082
- "length_m": {
1187
+ "fact:position": "position:aground",
1188
+ "fact:length_m": {
1083
1189
  "gte": 12
1084
1190
  }
1085
1191
  },
1086
1192
  "lights": [
1087
1193
  {
1088
- "light": "all_round",
1194
+ "light": "light:all_round",
1089
1195
  "color": "red",
1090
1196
  "count": 2,
1091
1197
  "arrangement": "vertical"
@@ -1102,18 +1208,912 @@
1102
1208
  "jurisdiction": "intl",
1103
1209
  "cite": "30(e)",
1104
1210
  "when": {
1105
- "position": "anchored",
1106
- "length_m": {
1211
+ "fact:position": "position:anchored",
1212
+ "fact:length_m": {
1107
1213
  "lt": 7
1108
1214
  },
1109
- "near_channel": false
1215
+ "fact:near_channel": false
1110
1216
  },
1111
1217
  "lights": [],
1112
- "exempts": [
1218
+ "rel:exempts": [
1113
1219
  "30a",
1114
1220
  "30b"
1115
1221
  ],
1116
1222
  "modality": "exempt"
1223
+ },
1224
+ {
1225
+ "id": "4",
1226
+ "jurisdiction": "intl",
1227
+ "cite": "4",
1228
+ "category": "scope",
1229
+ "subjects": 2,
1230
+ "when": {},
1231
+ "modality": "shall",
1232
+ "effect": {
1233
+ "part": "B",
1234
+ "section": "I",
1235
+ "applies_rules": [
1236
+ "4",
1237
+ "5",
1238
+ "6",
1239
+ "7",
1240
+ "8",
1241
+ "9",
1242
+ "10"
1243
+ ]
1244
+ },
1245
+ "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."
1246
+ },
1247
+ {
1248
+ "id": "11",
1249
+ "jurisdiction": "intl",
1250
+ "cite": "11",
1251
+ "category": "scope",
1252
+ "subjects": 2,
1253
+ "when": {
1254
+ "pair:geo:in_sight": true
1255
+ },
1256
+ "modality": "shall",
1257
+ "effect": {
1258
+ "part": "B",
1259
+ "section": "II",
1260
+ "applies_rules": [
1261
+ "11",
1262
+ "12",
1263
+ "13",
1264
+ "14",
1265
+ "15",
1266
+ "16",
1267
+ "17",
1268
+ "18"
1269
+ ]
1270
+ },
1271
+ "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."
1272
+ },
1273
+ {
1274
+ "id": "19a",
1275
+ "jurisdiction": "intl",
1276
+ "cite": "19(a)",
1277
+ "category": "scope",
1278
+ "subjects": 2,
1279
+ "when": {
1280
+ "pair:geo:in_sight": false
1281
+ },
1282
+ "modality": "shall",
1283
+ "effect": {
1284
+ "part": "B",
1285
+ "section": "III",
1286
+ "applies_rules": [
1287
+ "19"
1288
+ ]
1289
+ },
1290
+ "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.",
1291
+ "note": "The complement of 11. Rule 3(l) defines restricted visibility; nothing in facts.json carries it."
1292
+ },
1293
+ {
1294
+ "id": "18a1",
1295
+ "jurisdiction": "intl",
1296
+ "cite": "18(a)(i)",
1297
+ "category": "precedence",
1298
+ "subjects": 2,
1299
+ "when": {
1300
+ "own:fact:propulsion": "propulsion:power",
1301
+ "own:fact:rule18_class": {
1302
+ "not": [
1303
+ "rule18_class:nuc",
1304
+ "rule18_class:ram",
1305
+ "rule18_class:fishing"
1306
+ ]
1307
+ },
1308
+ "own:fact:position": "position:underway",
1309
+ "other:fact:rule18_class": "rule18_class:nuc",
1310
+ "other:fact:position": "position:underway",
1311
+ "pair:geo:in_sight": true
1312
+ },
1313
+ "modality": "shall",
1314
+ "effect": {
1315
+ "own": "give-way",
1316
+ "other": "stand-on"
1317
+ },
1318
+ "rel:overrides": [
1319
+ "15a-give-way"
1320
+ ],
1321
+ "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."
1322
+ },
1323
+ {
1324
+ "id": "18a2",
1325
+ "jurisdiction": "intl",
1326
+ "cite": "18(a)(ii)",
1327
+ "category": "precedence",
1328
+ "subjects": 2,
1329
+ "when": {
1330
+ "own:fact:propulsion": "propulsion:power",
1331
+ "own:fact:rule18_class": {
1332
+ "not": [
1333
+ "rule18_class:nuc",
1334
+ "rule18_class:ram",
1335
+ "rule18_class:fishing"
1336
+ ]
1337
+ },
1338
+ "own:fact:position": "position:underway",
1339
+ "other:fact:rule18_class": "rule18_class:ram",
1340
+ "other:fact:position": "position:underway",
1341
+ "pair:geo:in_sight": true
1342
+ },
1343
+ "modality": "shall",
1344
+ "effect": {
1345
+ "own": "give-way",
1346
+ "other": "stand-on"
1347
+ },
1348
+ "rel:overrides": [
1349
+ "15a-give-way"
1350
+ ],
1351
+ "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."
1352
+ },
1353
+ {
1354
+ "id": "18a3",
1355
+ "jurisdiction": "intl",
1356
+ "cite": "18(a)(iii)",
1357
+ "category": "precedence",
1358
+ "subjects": 2,
1359
+ "when": {
1360
+ "own:fact:propulsion": "propulsion:power",
1361
+ "own:fact:rule18_class": {
1362
+ "not": [
1363
+ "rule18_class:nuc",
1364
+ "rule18_class:ram",
1365
+ "rule18_class:fishing"
1366
+ ]
1367
+ },
1368
+ "own:fact:position": "position:underway",
1369
+ "other:fact:rule18_class": "rule18_class:fishing",
1370
+ "other:fact:position": "position:underway",
1371
+ "pair:geo:in_sight": true
1372
+ },
1373
+ "modality": "shall",
1374
+ "effect": {
1375
+ "own": "give-way",
1376
+ "other": "stand-on"
1377
+ },
1378
+ "rel:overrides": [
1379
+ "15a-give-way"
1380
+ ],
1381
+ "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."
1382
+ },
1383
+ {
1384
+ "id": "18a4",
1385
+ "jurisdiction": "intl",
1386
+ "cite": "18(a)(iv)",
1387
+ "category": "precedence",
1388
+ "subjects": 2,
1389
+ "when": {
1390
+ "own:fact:propulsion": "propulsion:power",
1391
+ "own:fact:rule18_class": {
1392
+ "not": [
1393
+ "rule18_class:nuc",
1394
+ "rule18_class:ram",
1395
+ "rule18_class:fishing"
1396
+ ]
1397
+ },
1398
+ "own:fact:position": "position:underway",
1399
+ "other:fact:rule18_class": "rule18_class:sail",
1400
+ "other:fact:position": "position:underway",
1401
+ "pair:geo:in_sight": true
1402
+ },
1403
+ "modality": "shall",
1404
+ "effect": {
1405
+ "own": "give-way",
1406
+ "other": "stand-on"
1407
+ },
1408
+ "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."
1409
+ },
1410
+ {
1411
+ "id": "18b1",
1412
+ "jurisdiction": "intl",
1413
+ "cite": "18(b)(i)",
1414
+ "category": "precedence",
1415
+ "subjects": 2,
1416
+ "when": {
1417
+ "own:fact:rule18_class": "rule18_class:sail",
1418
+ "own:fact:position": "position:underway",
1419
+ "other:fact:rule18_class": "rule18_class:nuc",
1420
+ "other:fact:position": "position:underway",
1421
+ "pair:geo:in_sight": true
1422
+ },
1423
+ "modality": "shall",
1424
+ "effect": {
1425
+ "own": "give-way",
1426
+ "other": "stand-on"
1427
+ },
1428
+ "rel:overrides": [
1429
+ "12a1",
1430
+ "12a2",
1431
+ "12a3"
1432
+ ],
1433
+ "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."
1434
+ },
1435
+ {
1436
+ "id": "18b2",
1437
+ "jurisdiction": "intl",
1438
+ "cite": "18(b)(ii)",
1439
+ "category": "precedence",
1440
+ "subjects": 2,
1441
+ "when": {
1442
+ "own:fact:rule18_class": "rule18_class:sail",
1443
+ "own:fact:position": "position:underway",
1444
+ "other:fact:rule18_class": "rule18_class:ram",
1445
+ "other:fact:position": "position:underway",
1446
+ "pair:geo:in_sight": true
1447
+ },
1448
+ "modality": "shall",
1449
+ "effect": {
1450
+ "own": "give-way",
1451
+ "other": "stand-on"
1452
+ },
1453
+ "rel:overrides": [
1454
+ "12a1",
1455
+ "12a2",
1456
+ "12a3"
1457
+ ],
1458
+ "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."
1459
+ },
1460
+ {
1461
+ "id": "18b3",
1462
+ "jurisdiction": "intl",
1463
+ "cite": "18(b)(iii)",
1464
+ "category": "precedence",
1465
+ "subjects": 2,
1466
+ "when": {
1467
+ "own:fact:rule18_class": "rule18_class:sail",
1468
+ "own:fact:position": "position:underway",
1469
+ "other:fact:rule18_class": "rule18_class:fishing",
1470
+ "other:fact:position": "position:underway",
1471
+ "pair:geo:in_sight": true
1472
+ },
1473
+ "modality": "shall",
1474
+ "effect": {
1475
+ "own": "give-way",
1476
+ "other": "stand-on"
1477
+ },
1478
+ "rel:overrides": [
1479
+ "12a1",
1480
+ "12a2",
1481
+ "12a3"
1482
+ ],
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."
1484
+ },
1485
+ {
1486
+ "id": "18c1",
1487
+ "jurisdiction": "intl",
1488
+ "cite": "18(c)(i)",
1489
+ "category": "precedence",
1490
+ "subjects": 2,
1491
+ "when": {
1492
+ "own:fact:rule18_class": "rule18_class:fishing",
1493
+ "own:fact:position": "position:underway",
1494
+ "other:fact:rule18_class": "rule18_class:nuc",
1495
+ "other:fact:position": "position:underway",
1496
+ "pair:geo:in_sight": true
1497
+ },
1498
+ "modality": "shall-if-practicable",
1499
+ "effect": {
1500
+ "own": "give-way",
1501
+ "other": "stand-on"
1502
+ },
1503
+ "rel:overrides": [
1504
+ "12a1",
1505
+ "12a2",
1506
+ "12a3",
1507
+ "15a-give-way"
1508
+ ],
1509
+ "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."
1510
+ },
1511
+ {
1512
+ "id": "18c2",
1513
+ "jurisdiction": "intl",
1514
+ "cite": "18(c)(ii)",
1515
+ "category": "precedence",
1516
+ "subjects": 2,
1517
+ "when": {
1518
+ "own:fact:rule18_class": "rule18_class:fishing",
1519
+ "own:fact:position": "position:underway",
1520
+ "other:fact:rule18_class": "rule18_class:ram",
1521
+ "other:fact:position": "position:underway",
1522
+ "pair:geo:in_sight": true
1523
+ },
1524
+ "modality": "shall-if-practicable",
1525
+ "effect": {
1526
+ "own": "give-way",
1527
+ "other": "stand-on"
1528
+ },
1529
+ "rel:overrides": [
1530
+ "12a1",
1531
+ "12a2",
1532
+ "12a3",
1533
+ "15a-give-way"
1534
+ ],
1535
+ "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."
1536
+ },
1537
+ {
1538
+ "id": "18d1",
1539
+ "jurisdiction": "intl",
1540
+ "cite": "18(d)(i)",
1541
+ "category": "precedence",
1542
+ "subjects": 2,
1543
+ "when": {
1544
+ "own:fact:rule18_class": {
1545
+ "not": [
1546
+ "rule18_class:nuc",
1547
+ "rule18_class:ram"
1548
+ ]
1549
+ },
1550
+ "own:fact:position": "position:underway",
1551
+ "other:fact:rule18_class": "rule18_class:cbd",
1552
+ "other:fact:position": "position:underway",
1553
+ "pair:geo:in_sight": true
1554
+ },
1555
+ "modality": "shall-if-practicable",
1556
+ "effect": {
1557
+ "own": "shall-not-impede",
1558
+ "other": "none"
1559
+ },
1560
+ "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.",
1561
+ "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."
1562
+ },
1563
+ {
1564
+ "id": "18f1",
1565
+ "jurisdiction": "intl",
1566
+ "cite": "18(f)(i)",
1567
+ "category": "precedence",
1568
+ "subjects": 2,
1569
+ "when": {
1570
+ "own:fact:rule18_class": "rule18_class:wig",
1571
+ "own:fact:position": "position:underway",
1572
+ "other:fact:position": "position:underway",
1573
+ "pair:geo:in_sight": true
1574
+ },
1575
+ "modality": "shall",
1576
+ "effect": {
1577
+ "own": "keep-clear",
1578
+ "other": "none"
1579
+ },
1580
+ "rel:overrides": [
1581
+ "18a1",
1582
+ "18a2",
1583
+ "18a3",
1584
+ "18a4",
1585
+ "18d1",
1586
+ "15a-give-way"
1587
+ ],
1588
+ "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."
1589
+ },
1590
+ {
1591
+ "id": "8f3",
1592
+ "jurisdiction": "intl",
1593
+ "cite": "8(f)(iii)",
1594
+ "category": "precedence",
1595
+ "subjects": 2,
1596
+ "when": {
1597
+ "pair:geo:risk_of_collision": true
1598
+ },
1599
+ "modality": "shall",
1600
+ "effect": {
1601
+ "own": "none",
1602
+ "other": "none"
1603
+ },
1604
+ "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.",
1605
+ "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.",
1606
+ "no_gate_note": "No in-sight gate: Rule 4 puts Rules 4-10 in any condition of visibility."
1607
+ },
1608
+ {
1609
+ "id": "13a",
1610
+ "jurisdiction": "intl",
1611
+ "cite": "13(a)",
1612
+ "category": "precedence",
1613
+ "subjects": 2,
1614
+ "when": {
1615
+ "pair:geo:in_sight": true,
1616
+ "any_of": [
1617
+ {
1618
+ "other:geo:rel_bearing_deg": {
1619
+ "gt": 112.5,
1620
+ "lt": 247.5
1621
+ },
1622
+ "pair:geo:tcpa_s": {
1623
+ "gt": 0
1624
+ }
1625
+ },
1626
+ {
1627
+ "own:hist:was_overtaking": true
1628
+ }
1629
+ ],
1630
+ "other:fact:position": "position:underway"
1631
+ },
1632
+ "modality": "shall",
1633
+ "effect": {
1634
+ "own": "give-way",
1635
+ "other": "stand-on"
1636
+ },
1637
+ "rel:overrides": [
1638
+ "18a1",
1639
+ "18a2",
1640
+ "18a3",
1641
+ "18a4",
1642
+ "18b1",
1643
+ "18b2",
1644
+ "18b3",
1645
+ "18c1",
1646
+ "18c2",
1647
+ "18d1",
1648
+ "18f1",
1649
+ "12a1",
1650
+ "12a2",
1651
+ "12a3"
1652
+ ],
1653
+ "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).",
1654
+ "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."
1655
+ },
1656
+ {
1657
+ "id": "9b",
1658
+ "jurisdiction": "intl",
1659
+ "cite": "9(b)",
1660
+ "category": "precedence",
1661
+ "subjects": 2,
1662
+ "when": {
1663
+ "pair:env:narrow_channel": true,
1664
+ "any_of": [
1665
+ {
1666
+ "own:fact:length_m": {
1667
+ "lt": 20
1668
+ }
1669
+ },
1670
+ {
1671
+ "own:fact:propulsion": "propulsion:sail"
1672
+ }
1673
+ ],
1674
+ "own:fact:position": "position:underway",
1675
+ "other:fact:position": "position:underway",
1676
+ "other:fact:confined_to_channel": true
1677
+ },
1678
+ "modality": "shall-not-impede",
1679
+ "effect": {
1680
+ "own": "shall-not-impede",
1681
+ "other": "none"
1682
+ },
1683
+ "rel:overrides": [
1684
+ "18a4"
1685
+ ],
1686
+ "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."
1687
+ },
1688
+ {
1689
+ "id": "9c",
1690
+ "jurisdiction": "intl",
1691
+ "cite": "9(c)",
1692
+ "category": "precedence",
1693
+ "subjects": 2,
1694
+ "when": {
1695
+ "pair:env:narrow_channel": true,
1696
+ "own:fact:rule18_class": "rule18_class:fishing",
1697
+ "own:fact:position": "position:underway",
1698
+ "other:fact:position": "position:underway"
1699
+ },
1700
+ "modality": "shall-not-impede",
1701
+ "effect": {
1702
+ "own": "shall-not-impede",
1703
+ "other": "none"
1704
+ },
1705
+ "rel:overrides": [
1706
+ "18a3",
1707
+ "18b3"
1708
+ ],
1709
+ "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."
1710
+ },
1711
+ {
1712
+ "id": "10i",
1713
+ "jurisdiction": "intl",
1714
+ "cite": "10(i)",
1715
+ "category": "precedence",
1716
+ "subjects": 2,
1717
+ "when": {
1718
+ "pair:env:traffic_lane": true,
1719
+ "own:fact:rule18_class": "rule18_class:fishing",
1720
+ "own:fact:position": "position:underway",
1721
+ "other:fact:position": "position:underway",
1722
+ "other:fact:following_traffic_lane": true
1723
+ },
1724
+ "modality": "shall-not-impede",
1725
+ "effect": {
1726
+ "own": "shall-not-impede",
1727
+ "other": "none"
1728
+ },
1729
+ "rel:overrides": [
1730
+ "18a3",
1731
+ "18b3"
1732
+ ],
1733
+ "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."
1734
+ },
1735
+ {
1736
+ "id": "10j",
1737
+ "jurisdiction": "intl",
1738
+ "cite": "10(j)",
1739
+ "category": "precedence",
1740
+ "subjects": 2,
1741
+ "when": {
1742
+ "pair:env:traffic_lane": true,
1743
+ "any_of": [
1744
+ {
1745
+ "own:fact:length_m": {
1746
+ "lt": 20
1747
+ }
1748
+ },
1749
+ {
1750
+ "own:fact:propulsion": "propulsion:sail"
1751
+ }
1752
+ ],
1753
+ "own:fact:position": "position:underway",
1754
+ "other:fact:propulsion": "propulsion:power",
1755
+ "other:fact:position": "position:underway",
1756
+ "other:fact:following_traffic_lane": true
1757
+ },
1758
+ "modality": "shall-not-impede",
1759
+ "effect": {
1760
+ "own": "shall-not-impede",
1761
+ "other": "none"
1762
+ },
1763
+ "rel:overrides": [
1764
+ "18a4"
1765
+ ],
1766
+ "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."
1767
+ },
1768
+ {
1769
+ "id": "7d1",
1770
+ "jurisdiction": "intl",
1771
+ "cite": "7(d)(i)",
1772
+ "category": "classification",
1773
+ "subjects": 2,
1774
+ "when": {
1775
+ "pair:geo:bearing_change_deg_min": {
1776
+ "gt": -1.0,
1777
+ "lt": 1.0
1778
+ },
1779
+ "pair:geo:tcpa_s": {
1780
+ "gt": 0
1781
+ }
1782
+ },
1783
+ "modality": "shall",
1784
+ "effect": {
1785
+ "risk_of_collision": true
1786
+ },
1787
+ "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.",
1788
+ "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.",
1789
+ "no_gate_note": "No in-sight gate: Rule 4 puts Rules 4-10 in any condition of visibility."
1790
+ },
1791
+ {
1792
+ "id": "12a1",
1793
+ "jurisdiction": "intl",
1794
+ "cite": "12(a)(i)",
1795
+ "category": "precedence",
1796
+ "subjects": 2,
1797
+ "when": {
1798
+ "pair:geo:in_sight": true,
1799
+ "pair:geo:risk_of_collision": true,
1800
+ "own:fact:propulsion": "propulsion:sail",
1801
+ "other:fact:propulsion": "propulsion:sail",
1802
+ "own:fact:position": "position:underway",
1803
+ "other:fact:position": "position:underway",
1804
+ "own:kin:wind_side": "wind_side:port",
1805
+ "other:kin:wind_side": "wind_side:starboard"
1806
+ },
1807
+ "modality": "shall",
1808
+ "effect": {
1809
+ "own": "give-way",
1810
+ "other": "stand-on"
1811
+ },
1812
+ "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."
1813
+ },
1814
+ {
1815
+ "id": "12a2",
1816
+ "jurisdiction": "intl",
1817
+ "cite": "12(a)(ii)",
1818
+ "category": "precedence",
1819
+ "subjects": 2,
1820
+ "when": {
1821
+ "pair:geo:in_sight": true,
1822
+ "pair:geo:risk_of_collision": true,
1823
+ "own:fact:propulsion": "propulsion:sail",
1824
+ "other:fact:propulsion": "propulsion:sail",
1825
+ "own:fact:position": "position:underway",
1826
+ "other:fact:position": "position:underway",
1827
+ "own:geo:windward": true,
1828
+ "any_of": [
1829
+ {
1830
+ "own:kin:wind_side": "wind_side:port",
1831
+ "other:kin:wind_side": "wind_side:port"
1832
+ },
1833
+ {
1834
+ "own:kin:wind_side": "wind_side:starboard",
1835
+ "other:kin:wind_side": "wind_side:starboard"
1836
+ }
1837
+ ]
1838
+ },
1839
+ "modality": "shall",
1840
+ "effect": {
1841
+ "own": "give-way",
1842
+ "other": "stand-on"
1843
+ },
1844
+ "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."
1845
+ },
1846
+ {
1847
+ "id": "12a3",
1848
+ "jurisdiction": "intl",
1849
+ "cite": "12(a)(iii)",
1850
+ "category": "precedence",
1851
+ "subjects": 2,
1852
+ "when": {
1853
+ "pair:geo:in_sight": true,
1854
+ "pair:geo:risk_of_collision": true,
1855
+ "own:fact:propulsion": "propulsion:sail",
1856
+ "other:fact:propulsion": "propulsion:sail",
1857
+ "own:fact:position": "position:underway",
1858
+ "other:fact:position": "position:underway",
1859
+ "own:kin:wind_side": "wind_side:port",
1860
+ "other:kin:wind_side": "wind_side:unknown",
1861
+ "other:geo:windward": true
1862
+ },
1863
+ "modality": "shall",
1864
+ "effect": {
1865
+ "own": "give-way",
1866
+ "other": "stand-on"
1867
+ },
1868
+ "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."
1869
+ },
1870
+ {
1871
+ "id": "13b-overtaking",
1872
+ "jurisdiction": "intl",
1873
+ "cite": "13(b)",
1874
+ "category": "classification",
1875
+ "subjects": 2,
1876
+ "when": {
1877
+ "pair:geo:in_sight": true,
1878
+ "other:geo:rel_bearing_deg": {
1879
+ "gt": 112.5,
1880
+ "lt": 247.5
1881
+ },
1882
+ "pair:geo:tcpa_s": {
1883
+ "gt": 0
1884
+ },
1885
+ "own:fact:position": "position:underway",
1886
+ "other:fact:position": "position:underway"
1887
+ },
1888
+ "modality": "shall",
1889
+ "effect": {
1890
+ "encounter": "overtaking"
1891
+ },
1892
+ "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.",
1893
+ "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."
1894
+ },
1895
+ {
1896
+ "id": "13b-overtaken",
1897
+ "jurisdiction": "intl",
1898
+ "cite": "13(b)",
1899
+ "category": "classification",
1900
+ "subjects": 2,
1901
+ "when": {
1902
+ "pair:geo:in_sight": true,
1903
+ "own:geo:rel_bearing_deg": {
1904
+ "gt": 112.5,
1905
+ "lt": 247.5
1906
+ },
1907
+ "pair:geo:tcpa_s": {
1908
+ "gt": 0
1909
+ },
1910
+ "own:fact:position": "position:underway",
1911
+ "other:fact:position": "position:underway"
1912
+ },
1913
+ "modality": "shall",
1914
+ "effect": {
1915
+ "encounter": "overtaking"
1916
+ },
1917
+ "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.",
1918
+ "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."
1919
+ },
1920
+ {
1921
+ "id": "13d",
1922
+ "jurisdiction": "intl",
1923
+ "cite": "13(d)",
1924
+ "category": "classification",
1925
+ "subjects": 2,
1926
+ "when": {
1927
+ "pair:geo:in_sight": true,
1928
+ "any_of": [
1929
+ {
1930
+ "own:hist:was_overtaking": true
1931
+ },
1932
+ {
1933
+ "other:hist:was_overtaking": true
1934
+ }
1935
+ ],
1936
+ "own:fact:position": "position:underway",
1937
+ "other:fact:position": "position:underway"
1938
+ },
1939
+ "modality": "shall",
1940
+ "effect": {
1941
+ "encounter": "overtaking"
1942
+ },
1943
+ "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.",
1944
+ "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."
1945
+ },
1946
+ {
1947
+ "id": "14b",
1948
+ "jurisdiction": "intl",
1949
+ "cite": "14(b)",
1950
+ "category": "classification",
1951
+ "subjects": 2,
1952
+ "when": {
1953
+ "pair:geo:in_sight": true,
1954
+ "pair:geo:risk_of_collision": true,
1955
+ "own:fact:propulsion": "propulsion:power",
1956
+ "other:fact:propulsion": "propulsion:power",
1957
+ "own:fact:position": "position:underway",
1958
+ "other:fact:position": "position:underway",
1959
+ "own:hist:was_overtaking": false,
1960
+ "other:hist:was_overtaking": false,
1961
+ "own:geo:rel_bearing_deg": {
1962
+ "any_of": [
1963
+ {
1964
+ "lte": 11.25
1965
+ },
1966
+ {
1967
+ "gte": 348.75
1968
+ }
1969
+ ]
1970
+ },
1971
+ "other:geo:rel_bearing_deg": {
1972
+ "any_of": [
1973
+ {
1974
+ "lte": 11.25
1975
+ },
1976
+ {
1977
+ "gte": 348.75
1978
+ }
1979
+ ]
1980
+ }
1981
+ },
1982
+ "modality": "shall",
1983
+ "effect": {
1984
+ "encounter": "head-on"
1985
+ },
1986
+ "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.",
1987
+ "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."
1988
+ },
1989
+ {
1990
+ "id": "15a-crossing",
1991
+ "jurisdiction": "intl",
1992
+ "cite": "15(a)",
1993
+ "category": "classification",
1994
+ "subjects": 2,
1995
+ "when": {
1996
+ "pair:geo:in_sight": true,
1997
+ "pair:geo:risk_of_collision": true,
1998
+ "own:fact:propulsion": "propulsion:power",
1999
+ "other:fact:propulsion": "propulsion:power",
2000
+ "own:fact:position": "position:underway",
2001
+ "other:fact:position": "position:underway",
2002
+ "own:hist:was_overtaking": false,
2003
+ "other:hist:was_overtaking": false,
2004
+ "own:geo:rel_bearing_deg": {
2005
+ "not": {
2006
+ "gt": 112.5,
2007
+ "lt": 247.5
2008
+ }
2009
+ },
2010
+ "other:geo:rel_bearing_deg": {
2011
+ "not": {
2012
+ "gt": 112.5,
2013
+ "lt": 247.5
2014
+ }
2015
+ },
2016
+ "any_of": [
2017
+ {
2018
+ "own:geo:rel_bearing_deg": {
2019
+ "not": {
2020
+ "any_of": [
2021
+ {
2022
+ "lte": 11.25
2023
+ },
2024
+ {
2025
+ "gte": 348.75
2026
+ }
2027
+ ]
2028
+ }
2029
+ }
2030
+ },
2031
+ {
2032
+ "other:geo:rel_bearing_deg": {
2033
+ "not": {
2034
+ "any_of": [
2035
+ {
2036
+ "lte": 11.25
2037
+ },
2038
+ {
2039
+ "gte": 348.75
2040
+ }
2041
+ ]
2042
+ }
2043
+ }
2044
+ }
2045
+ ]
2046
+ },
2047
+ "modality": "shall",
2048
+ "effect": {
2049
+ "encounter": "crossing"
2050
+ },
2051
+ "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.",
2052
+ "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."
2053
+ },
2054
+ {
2055
+ "id": "15a-give-way",
2056
+ "jurisdiction": "intl",
2057
+ "cite": "15(a)",
2058
+ "category": "precedence",
2059
+ "subjects": 2,
2060
+ "when": {
2061
+ "pair:geo:in_sight": true,
2062
+ "pair:geo:risk_of_collision": true,
2063
+ "own:fact:propulsion": "propulsion:power",
2064
+ "other:fact:propulsion": "propulsion:power",
2065
+ "own:fact:position": "position:underway",
2066
+ "other:fact:position": "position:underway",
2067
+ "own:hist:was_overtaking": false,
2068
+ "other:hist:was_overtaking": false,
2069
+ "own:geo:rel_bearing_deg": {
2070
+ "gt": 0,
2071
+ "lte": 112.5
2072
+ },
2073
+ "other:geo:rel_bearing_deg": {
2074
+ "not": {
2075
+ "gt": 112.5,
2076
+ "lt": 247.5
2077
+ }
2078
+ },
2079
+ "any_of": [
2080
+ {
2081
+ "own:geo:rel_bearing_deg": {
2082
+ "not": {
2083
+ "any_of": [
2084
+ {
2085
+ "lte": 11.25
2086
+ },
2087
+ {
2088
+ "gte": 348.75
2089
+ }
2090
+ ]
2091
+ }
2092
+ }
2093
+ },
2094
+ {
2095
+ "other:geo:rel_bearing_deg": {
2096
+ "not": {
2097
+ "any_of": [
2098
+ {
2099
+ "lte": 11.25
2100
+ },
2101
+ {
2102
+ "gte": 348.75
2103
+ }
2104
+ ]
2105
+ }
2106
+ }
2107
+ }
2108
+ ]
2109
+ },
2110
+ "modality": "shall",
2111
+ "effect": {
2112
+ "own": "give-way",
2113
+ "other": "stand-on"
2114
+ },
2115
+ "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.",
2116
+ "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."
1117
2117
  }
1118
2118
  ]
1119
2119
  }