colregs 0.2.4 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/PROVENANCE.md +3 -3
  2. package/README.md +19 -10
  3. package/data/applicability.json +219 -244
  4. package/data/corpora.json +41 -0
  5. package/data/editions.json +27 -0
  6. package/data/facts.json +4 -4
  7. package/data/geometry.json +8 -8
  8. package/data/i18n/en.json +27 -0
  9. package/data/i18n/fi.json +25 -0
  10. package/data/images.json +32 -32
  11. package/data/operations.json +79 -0
  12. package/data/rules.json +176 -599
  13. package/data/text/intl/2016/en-US.uscg.json +877 -0
  14. package/data/text/intl/2016/es.boe.json +23 -0
  15. package/data/text/intl/2016/fi.finlex.json +22 -0
  16. package/data/text/us/inland/2014/en-US.ecfr.json +22 -0
  17. package/data/version.json +1 -1
  18. package/docs/adr/0001-name-and-jurisdiction-model.md +42 -2
  19. package/docs/adr/0003-language-as-a-dimension.md +8 -7
  20. package/docs/adr/0006-json-schema-and-identifier-diff.md +2 -0
  21. package/docs/adr/0011-api-shape.md +1 -1
  22. package/docs/adr/0012-trace-and-rule2-departure-api.md +3 -4
  23. package/docs/adr/0013-corpus-files-with-editions.md +70 -0
  24. package/docs/adr/0014-engine-interface-owned-by-colregs.md +103 -0
  25. package/docs/adr/0015-rule-ids-are-paragraph-keys.md +191 -0
  26. package/docs/budgets.json +17 -17
  27. package/docs/gates.json +3 -3
  28. package/docs/identifiers.md +49 -51
  29. package/docs/maritime-sources.md +58 -0
  30. package/docs/normative-language.md +103 -0
  31. package/docs/part-b-invariants.md +31 -29
  32. package/docs/requirements.md +118 -97
  33. package/docs/timeline.md +102 -0
  34. package/docs/verification/2026-09-09-text-slug-straw-man.md +3 -2
  35. package/fixtures/applicability-fixtures.json +190 -190
  36. package/fixtures/situation-fixtures.json +287 -287
  37. package/package.json +1 -1
  38. package/schema/applicability-fixtures.schema.json +4 -13
  39. package/schema/applicability.schema.json +27 -27
  40. package/schema/conduct-evaluation.schema.json +135 -0
  41. package/schema/corpora.schema.json +68 -0
  42. package/schema/corpus.schema.json +329 -0
  43. package/schema/display-evaluation.schema.json +146 -0
  44. package/schema/editions.schema.json +47 -0
  45. package/schema/encounter-evaluation.schema.json +109 -0
  46. package/schema/evaluation.schema.json +149 -0
  47. package/schema/fact-record.schema.json +30 -0
  48. package/schema/i18n-catalog.schema.json +47 -0
  49. package/schema/operations.schema.json +124 -0
  50. package/schema/rule2-departure-finding.schema.json +72 -0
  51. package/schema/rule2-departure-model.schema.json +159 -0
  52. package/schema/rules.schema.json +20 -90
  53. package/schema/situation-fixtures.schema.json +10 -146
  54. package/schema/situation.schema.json +72 -0
  55. package/schema/trace.schema.json +33 -0
  56. package/data/deprecated-identifiers.json +0 -7
  57. package/schema/deprecated-identifiers.schema.json +0 -29
@@ -11,10 +11,10 @@
11
11
  ],
12
12
  "jurisdiction": "intl",
13
13
  "expect_form": {
14
- "note": "An element of `expect` is either a bare entry id, exactly as in applicability-fixtures.json, or an object {\"entry\": <id>, \"modality\": <modality>} naming the modality that entry is expected to carry for this situation. The two forms are interchangeable and a bare id asserts nothing about modality, so the published one-subject fixtures remain valid unedited while Q-5's three modality-only gates (23a2, 26b-mast, 30c) become fixturable.",
15
- "bare": "23a1",
14
+ "note": "An element of `expect` is either a bare entry id or an object {\"entry\": <id>, \"modality\": <modality>} naming the modality that entry is expected to carry. The two forms are interchangeable and a bare id asserts nothing about modality, so the published one-subject fixtures remain valid unedited while Q-5's three modality-only gates (rule:23a_ii, rule:26b_ii, rule:30c) become fixturable.",
15
+ "bare": "rule:23a_i",
16
16
  "with_modality": {
17
- "entry": "23a2",
17
+ "entry": "rule:23a_ii",
18
18
  "modality": "may"
19
19
  }
20
20
  },
@@ -29,14 +29,14 @@
29
29
  {
30
30
  "name": "crossing: own power-driven, other fine on the starboard bow",
31
31
  "status": "binding",
32
- "narrative": "Two power-driven vessels in sight of one another, other bearing 040 relative at 3 nm on a steady bearing and crossing right to left ahead. Own has the other on her own starboard side, so own is the give-way vessel under Rule 15 and Rule 16 governs the action; the other is stand-on under Rule 17. Rule 15 is not transcribed yet, so this asserts nothing. Binding since Rules 7(d), 13, 14 and 15 landed: 15a-crossing is the encounter, 15a-give-way is the role, 7d1 is the steady bearing, and 8f3 is Rule 8(f)(iii) denying the stand-on vessel any privilege from a shall-not-impede duty she is not owed. Rules 16 and 17 are `conduct` and are still not modelled.",
32
+ "narrative": "Two power-driven vessels in sight of one another, other bearing 040 relative at 3 nm on a steady bearing and crossing right to left ahead. Own has the other on her own starboard side, so own is the give-way vessel under Rule 15 and Rule 16 governs the action; the other is stand-on under Rule 17. Rule 15 is not transcribed yet, so this asserts nothing. Binding since Rules 7(d), 13, 14 and 15 landed: rule:15a:crossing is the encounter, rule:15a:keep_out_of_the_way is the role, rule:7d_i is the steady bearing, and rule:8f_iii is Rule 8(f)(iii) denying the stand-on vessel any privilege from a shall-not-impede duty she is not owed. Rules 16 and 17 are `conduct` and are still not modelled.",
33
33
  "expect": [
34
- "4",
35
- "11",
36
- "7d1",
37
- "8f3",
38
- "15a-crossing",
39
- "15a-give-way"
34
+ "rule:4",
35
+ "rule:11",
36
+ "rule:7d_i",
37
+ "rule:8f_iii",
38
+ "rule:15a:crossing",
39
+ "rule:15a:keep_out_of_the_way"
40
40
  ],
41
41
  "situation": {
42
42
  "own": {
@@ -106,13 +106,13 @@
106
106
  {
107
107
  "name": "narrow channel: head-on round a bend, bank 100 m to starboard",
108
108
  "status": "binding",
109
- "narrative": "The R1 illustration of ADR 0005 sec. 5 and the proposal's sec. 4. Own keeps to the starboard side of a narrow channel per Rule 9(a); a vessel cuts the bend and is head-on at 800 m. Rule 14(a) requires each to alter to starboard, and the bank is 100 m to starboard of own. Every compliant plan grounds or collides; a port alteration passes starboard-to-starboard and breaches 14(a). The value of the case here is not the region finding, which belongs to colregs-engine -- it is that the situation record can carry it at all. Binding now: `pair:env:narrow_channel` is the fact the recorded gap asked for and 14b is the classification. Neither 9(b) nor 9(c) applies from own's side -- she is 24 m and power-driven -- so the narrow channel changes no entry here and is stated because it is true, not to select one. Recast on a steady bearing when the consistency check landed (Q-48): the other now bears 357 relative, three degrees on own's port bow, and has own 3.6 degrees on her own starboard bow, which at 12 and 10 knots is a collision course. The 3/8 starboard-to-starboard pair the case opened with passed at 74 m with the bearing changing four and a half degrees a minute, and no positive speeds make it steady -- two vessels each with the other to starboard are never on a collision course. The dilemma is unchanged: a starboard alteration is into the bank.",
109
+ "narrative": "The R1 illustration of ADR 0005 sec. 5 and the proposal's sec. 4. Own keeps to the starboard side of a narrow channel per Rule 9(a); a vessel cuts the bend and is head-on at 800 m. Rule 14(a) requires each to alter to starboard, and the bank is 100 m to starboard of own. Every compliant plan grounds or collides; a port alteration passes starboard-to-starboard and breaches 14(a). The value of the case here is not the region finding, which belongs to colregs-engine -- it is that the situation record can carry it at all. Binding now: `pair:env:narrow_channel` is the fact the recorded gap asked for and rule:14b is the classification. Neither 9(b) nor 9(c) applies from own's side -- she is 24 m and power-driven -- so the narrow channel changes no entry here and is stated because it is true, not to select one. Recast on a steady bearing when the consistency check landed (Q-48): the other now bears 357 relative, three degrees on own's port bow, and has own 3.6 degrees on her own starboard bow, which at 12 and 10 knots is a collision course. The 3/8 starboard-to-starboard pair the case opened with passed at 74 m with the bearing changing four and a half degrees a minute, and no positive speeds make it steady -- two vessels each with the other to starboard are never on a collision course. The dilemma is unchanged: a starboard alteration is into the bank.",
110
110
  "expect": [
111
- "4",
112
- "11",
113
- "7d1",
114
- "8f3",
115
- "14b"
111
+ "rule:4",
112
+ "rule:11",
113
+ "rule:7d_i",
114
+ "rule:8f_iii",
115
+ "rule:14b"
116
116
  ],
117
117
  "situation": {
118
118
  "own": {
@@ -186,13 +186,13 @@
186
186
  {
187
187
  "name": "13(d) latch: an overtaking whose bearing has drawn out to a crossing",
188
188
  "status": "binding",
189
- "narrative": "Own came up on the other vessel from abaft her beam and is overtaking. The bearing has since drawn out: own now bears 250 relative from the other, just outside Rule 13(b)'s 112.5-247.5 sector, so the instantaneous geometry alone would reclassify this as a crossing with the other vessel give-way. Rule 13(d) forbids exactly that, and own:hist:was_overtaking is the fact that carries it. This is the case that makes history a class rather than a note. Binding: 13d holds the classification at overtaking on the strength of the latch alone, and 15a-crossing is absent -- not because the geometry excludes it, which it does not, but because its `own:hist:was_overtaking: false` gate does. That absence is the whole content of 13(d). The pair numbers were re-derived from the kinematics when the consistency check landed (Q-48): at 400 m abeam with five knots between them the bearing is changing at 24 degrees a minute and the closest approach is already past, so 7(d)(i)'s steady-bearing ground is not available and `7d1` left the expectation. `geo:risk_of_collision` is a supplied judgement and stays true -- nothing in this package may deny a risk, and 13(d) does not read one.",
189
+ "narrative": "Own came up on the other vessel from abaft her beam and is overtaking. The bearing has since drawn out: own now bears 250 relative from the other, just outside Rule 13(b)'s 112.5-247.5 sector, so the instantaneous geometry alone would reclassify this as a crossing with the other vessel give-way. Rule 13(d) forbids exactly that, and own:hist:was_overtaking is the fact that carries it. This is the case that makes history a class rather than a note. Binding: rule:13d holds the classification at overtaking on the strength of the latch alone, and rule:15a:crossing is absent -- not because the geometry excludes it, which it does not, but because its `own:hist:was_overtaking: false` gate does. That absence is the whole content of 13(d). The pair numbers were re-derived from the kinematics when the consistency check landed (Q-48): at 400 m abeam with five knots between them the bearing is changing at 24 degrees a minute and the closest approach is already past, so 7(d)(i)'s steady-bearing ground is not available and `rule:7d_i` left the expectation. `geo:risk_of_collision` is a supplied judgement and stays true -- nothing in this package may deny a risk, and 13(d) does not read one.",
190
190
  "expect": [
191
- "4",
192
- "11",
193
- "8f3",
194
- "13a",
195
- "13d"
191
+ "rule:4",
192
+ "rule:11",
193
+ "rule:8f_iii",
194
+ "rule:13a",
195
+ "rule:13d"
196
196
  ],
197
197
  "situation": {
198
198
  "own": {
@@ -334,8 +334,8 @@
334
334
  "status": "binding",
335
335
  "narrative": "Own is power-driven; the other vessel is power-driven. Both underway and in sight of one another.",
336
336
  "expect": [
337
- "11",
338
- "4"
337
+ "rule:11",
338
+ "rule:4"
339
339
  ],
340
340
  "situation": {
341
341
  "own": {
@@ -368,9 +368,9 @@
368
368
  "status": "binding",
369
369
  "narrative": "Own is power-driven; the other vessel is sailing. Both underway and in sight of one another.",
370
370
  "expect": [
371
- "11",
372
- "18a4",
373
- "4"
371
+ "rule:11",
372
+ "rule:18a_iv",
373
+ "rule:4"
374
374
  ],
375
375
  "situation": {
376
376
  "own": {
@@ -403,9 +403,9 @@
403
403
  "status": "binding",
404
404
  "narrative": "Own is power-driven; the other vessel is fishing (power). Both underway and in sight of one another.",
405
405
  "expect": [
406
- "11",
407
- "18a3",
408
- "4"
406
+ "rule:11",
407
+ "rule:18a_iii",
408
+ "rule:4"
409
409
  ],
410
410
  "situation": {
411
411
  "own": {
@@ -438,9 +438,9 @@
438
438
  "status": "binding",
439
439
  "narrative": "Own is power-driven; the other vessel is not under command. Both underway and in sight of one another.",
440
440
  "expect": [
441
- "11",
442
- "18a1",
443
- "4"
441
+ "rule:11",
442
+ "rule:18a_i",
443
+ "rule:4"
444
444
  ],
445
445
  "situation": {
446
446
  "own": {
@@ -473,9 +473,9 @@
473
473
  "status": "binding",
474
474
  "narrative": "Own is power-driven; the other vessel is restricted in her ability to manoeuvre. Both underway and in sight of one another.",
475
475
  "expect": [
476
- "11",
477
- "18a2",
478
- "4"
476
+ "rule:11",
477
+ "rule:18a_ii",
478
+ "rule:4"
479
479
  ],
480
480
  "situation": {
481
481
  "own": {
@@ -508,12 +508,12 @@
508
508
  "status": "binding",
509
509
  "narrative": "Own is power-driven; the other vessel is constrained by her draught. Both underway and in sight of one another.",
510
510
  "expect": [
511
- "11",
511
+ "rule:11",
512
512
  {
513
- "entry": "18d1",
513
+ "entry": "rule:18d_i",
514
514
  "modality": "shall-if-practicable"
515
515
  },
516
- "4"
516
+ "rule:4"
517
517
  ],
518
518
  "situation": {
519
519
  "own": {
@@ -546,8 +546,8 @@
546
546
  "status": "binding",
547
547
  "narrative": "Own is sailing; the other vessel is power-driven. Both underway and in sight of one another.",
548
548
  "expect": [
549
- "11",
550
- "4"
549
+ "rule:11",
550
+ "rule:4"
551
551
  ],
552
552
  "situation": {
553
553
  "own": {
@@ -580,8 +580,8 @@
580
580
  "status": "binding",
581
581
  "narrative": "Own is sailing; the other vessel is sailing. Both underway and in sight of one another.",
582
582
  "expect": [
583
- "11",
584
- "4"
583
+ "rule:11",
584
+ "rule:4"
585
585
  ],
586
586
  "situation": {
587
587
  "own": {
@@ -614,9 +614,9 @@
614
614
  "status": "binding",
615
615
  "narrative": "Own is sailing; the other vessel is fishing (power). Both underway and in sight of one another.",
616
616
  "expect": [
617
- "11",
618
- "18b3",
619
- "4"
617
+ "rule:11",
618
+ "rule:18b_iii",
619
+ "rule:4"
620
620
  ],
621
621
  "situation": {
622
622
  "own": {
@@ -649,9 +649,9 @@
649
649
  "status": "binding",
650
650
  "narrative": "Own is sailing; the other vessel is not under command. Both underway and in sight of one another.",
651
651
  "expect": [
652
- "11",
653
- "18b1",
654
- "4"
652
+ "rule:11",
653
+ "rule:18b_i",
654
+ "rule:4"
655
655
  ],
656
656
  "situation": {
657
657
  "own": {
@@ -684,9 +684,9 @@
684
684
  "status": "binding",
685
685
  "narrative": "Own is sailing; the other vessel is restricted in her ability to manoeuvre. Both underway and in sight of one another.",
686
686
  "expect": [
687
- "11",
688
- "18b2",
689
- "4"
687
+ "rule:11",
688
+ "rule:18b_ii",
689
+ "rule:4"
690
690
  ],
691
691
  "situation": {
692
692
  "own": {
@@ -719,12 +719,12 @@
719
719
  "status": "binding",
720
720
  "narrative": "Own is sailing; the other vessel is constrained by her draught. Both underway and in sight of one another.",
721
721
  "expect": [
722
- "11",
722
+ "rule:11",
723
723
  {
724
- "entry": "18d1",
724
+ "entry": "rule:18d_i",
725
725
  "modality": "shall-if-practicable"
726
726
  },
727
- "4"
727
+ "rule:4"
728
728
  ],
729
729
  "situation": {
730
730
  "own": {
@@ -757,8 +757,8 @@
757
757
  "status": "binding",
758
758
  "narrative": "Own is fishing (power); the other vessel is power-driven. Both underway and in sight of one another.",
759
759
  "expect": [
760
- "11",
761
- "4"
760
+ "rule:11",
761
+ "rule:4"
762
762
  ],
763
763
  "situation": {
764
764
  "own": {
@@ -791,8 +791,8 @@
791
791
  "status": "binding",
792
792
  "narrative": "Own is fishing (power); the other vessel is sailing. Both underway and in sight of one another.",
793
793
  "expect": [
794
- "11",
795
- "4"
794
+ "rule:11",
795
+ "rule:4"
796
796
  ],
797
797
  "situation": {
798
798
  "own": {
@@ -825,8 +825,8 @@
825
825
  "status": "binding",
826
826
  "narrative": "Own is fishing (power); the other vessel is fishing (power). Both underway and in sight of one another.",
827
827
  "expect": [
828
- "11",
829
- "4"
828
+ "rule:11",
829
+ "rule:4"
830
830
  ],
831
831
  "situation": {
832
832
  "own": {
@@ -859,12 +859,12 @@
859
859
  "status": "binding",
860
860
  "narrative": "Own is fishing (power); the other vessel is not under command. Both underway and in sight of one another.",
861
861
  "expect": [
862
- "11",
862
+ "rule:11",
863
863
  {
864
- "entry": "18c1",
864
+ "entry": "rule:18c_i",
865
865
  "modality": "shall-if-practicable"
866
866
  },
867
- "4"
867
+ "rule:4"
868
868
  ],
869
869
  "situation": {
870
870
  "own": {
@@ -897,12 +897,12 @@
897
897
  "status": "binding",
898
898
  "narrative": "Own is fishing (power); the other vessel is restricted in her ability to manoeuvre. Both underway and in sight of one another.",
899
899
  "expect": [
900
- "11",
900
+ "rule:11",
901
901
  {
902
- "entry": "18c2",
902
+ "entry": "rule:18c_ii",
903
903
  "modality": "shall-if-practicable"
904
904
  },
905
- "4"
905
+ "rule:4"
906
906
  ],
907
907
  "situation": {
908
908
  "own": {
@@ -935,12 +935,12 @@
935
935
  "status": "binding",
936
936
  "narrative": "Own is fishing (power); the other vessel is constrained by her draught. Both underway and in sight of one another.",
937
937
  "expect": [
938
- "11",
938
+ "rule:11",
939
939
  {
940
- "entry": "18d1",
940
+ "entry": "rule:18d_i",
941
941
  "modality": "shall-if-practicable"
942
942
  },
943
- "4"
943
+ "rule:4"
944
944
  ],
945
945
  "situation": {
946
946
  "own": {
@@ -973,8 +973,8 @@
973
973
  "status": "binding",
974
974
  "narrative": "Own is not under command: Rule 18 ranks her below nothing, so no paragraph of it applies to her and she carries no obligation here -- including against a vessel restricted in her ability to manoeuvre, which is the unordered pair at the top of the partial order.",
975
975
  "expect": [
976
- "11",
977
- "4"
976
+ "rule:11",
977
+ "rule:4"
978
978
  ],
979
979
  "situation": {
980
980
  "own": {
@@ -1007,8 +1007,8 @@
1007
1007
  "status": "binding",
1008
1008
  "narrative": "Own is not under command: Rule 18 ranks her below nothing, so no paragraph of it applies to her and she carries no obligation here -- including against a vessel restricted in her ability to manoeuvre, which is the unordered pair at the top of the partial order.",
1009
1009
  "expect": [
1010
- "11",
1011
- "4"
1010
+ "rule:11",
1011
+ "rule:4"
1012
1012
  ],
1013
1013
  "situation": {
1014
1014
  "own": {
@@ -1041,8 +1041,8 @@
1041
1041
  "status": "binding",
1042
1042
  "narrative": "Own is not under command: Rule 18 ranks her below nothing, so no paragraph of it applies to her and she carries no obligation here -- including against a vessel restricted in her ability to manoeuvre, which is the unordered pair at the top of the partial order.",
1043
1043
  "expect": [
1044
- "11",
1045
- "4"
1044
+ "rule:11",
1045
+ "rule:4"
1046
1046
  ],
1047
1047
  "situation": {
1048
1048
  "own": {
@@ -1075,8 +1075,8 @@
1075
1075
  "status": "binding",
1076
1076
  "narrative": "Own is not under command: Rule 18 ranks her below nothing, so no paragraph of it applies to her and she carries no obligation here -- including against a vessel restricted in her ability to manoeuvre, which is the unordered pair at the top of the partial order.",
1077
1077
  "expect": [
1078
- "11",
1079
- "4"
1078
+ "rule:11",
1079
+ "rule:4"
1080
1080
  ],
1081
1081
  "situation": {
1082
1082
  "own": {
@@ -1109,8 +1109,8 @@
1109
1109
  "status": "binding",
1110
1110
  "narrative": "Own is not under command: Rule 18 ranks her below nothing, so no paragraph of it applies to her and she carries no obligation here -- including against a vessel restricted in her ability to manoeuvre, which is the unordered pair at the top of the partial order.",
1111
1111
  "expect": [
1112
- "11",
1113
- "4"
1112
+ "rule:11",
1113
+ "rule:4"
1114
1114
  ],
1115
1115
  "situation": {
1116
1116
  "own": {
@@ -1143,8 +1143,8 @@
1143
1143
  "status": "binding",
1144
1144
  "narrative": "Own is not under command: Rule 18 ranks her below nothing, so no paragraph of it applies to her and she carries no obligation here -- including against a vessel restricted in her ability to manoeuvre, which is the unordered pair at the top of the partial order.",
1145
1145
  "expect": [
1146
- "11",
1147
- "4"
1146
+ "rule:11",
1147
+ "rule:4"
1148
1148
  ],
1149
1149
  "situation": {
1150
1150
  "own": {
@@ -1177,8 +1177,8 @@
1177
1177
  "status": "binding",
1178
1178
  "narrative": "Own is restricted in her ability to manoeuvre: nothing in Rule 18 is addressed to her, including against a vessel not under command. NUC and RAM are unordered.",
1179
1179
  "expect": [
1180
- "11",
1181
- "4"
1180
+ "rule:11",
1181
+ "rule:4"
1182
1182
  ],
1183
1183
  "situation": {
1184
1184
  "own": {
@@ -1211,8 +1211,8 @@
1211
1211
  "status": "binding",
1212
1212
  "narrative": "Own is restricted in her ability to manoeuvre: nothing in Rule 18 is addressed to her, including against a vessel not under command. NUC and RAM are unordered.",
1213
1213
  "expect": [
1214
- "11",
1215
- "4"
1214
+ "rule:11",
1215
+ "rule:4"
1216
1216
  ],
1217
1217
  "situation": {
1218
1218
  "own": {
@@ -1245,8 +1245,8 @@
1245
1245
  "status": "binding",
1246
1246
  "narrative": "Own is restricted in her ability to manoeuvre: nothing in Rule 18 is addressed to her, including against a vessel not under command. NUC and RAM are unordered.",
1247
1247
  "expect": [
1248
- "11",
1249
- "4"
1248
+ "rule:11",
1249
+ "rule:4"
1250
1250
  ],
1251
1251
  "situation": {
1252
1252
  "own": {
@@ -1279,8 +1279,8 @@
1279
1279
  "status": "binding",
1280
1280
  "narrative": "Own is restricted in her ability to manoeuvre: nothing in Rule 18 is addressed to her, including against a vessel not under command. NUC and RAM are unordered.",
1281
1281
  "expect": [
1282
- "11",
1283
- "4"
1282
+ "rule:11",
1283
+ "rule:4"
1284
1284
  ],
1285
1285
  "situation": {
1286
1286
  "own": {
@@ -1313,8 +1313,8 @@
1313
1313
  "status": "binding",
1314
1314
  "narrative": "Own is restricted in her ability to manoeuvre: nothing in Rule 18 is addressed to her, including against a vessel not under command. NUC and RAM are unordered.",
1315
1315
  "expect": [
1316
- "11",
1317
- "4"
1316
+ "rule:11",
1317
+ "rule:4"
1318
1318
  ],
1319
1319
  "situation": {
1320
1320
  "own": {
@@ -1347,8 +1347,8 @@
1347
1347
  "status": "binding",
1348
1348
  "narrative": "Own is restricted in her ability to manoeuvre: nothing in Rule 18 is addressed to her, including against a vessel not under command. NUC and RAM are unordered.",
1349
1349
  "expect": [
1350
- "11",
1351
- "4"
1350
+ "rule:11",
1351
+ "rule:4"
1352
1352
  ],
1353
1353
  "situation": {
1354
1354
  "own": {
@@ -1381,8 +1381,8 @@
1381
1381
  "status": "binding",
1382
1382
  "narrative": "Own is constrained by her draught; the other vessel is power-driven. Both underway and in sight of one another.",
1383
1383
  "expect": [
1384
- "11",
1385
- "4"
1384
+ "rule:11",
1385
+ "rule:4"
1386
1386
  ],
1387
1387
  "situation": {
1388
1388
  "own": {
@@ -1415,9 +1415,9 @@
1415
1415
  "status": "binding",
1416
1416
  "narrative": "Own is constrained by her draught; the other vessel is sailing. Both underway and in sight of one another.",
1417
1417
  "expect": [
1418
- "11",
1419
- "18a4",
1420
- "4"
1418
+ "rule:11",
1419
+ "rule:18a_iv",
1420
+ "rule:4"
1421
1421
  ],
1422
1422
  "situation": {
1423
1423
  "own": {
@@ -1450,9 +1450,9 @@
1450
1450
  "status": "binding",
1451
1451
  "narrative": "Own is constrained by her draught; the other vessel is fishing (power). Both underway and in sight of one another.",
1452
1452
  "expect": [
1453
- "11",
1454
- "18a3",
1455
- "4"
1453
+ "rule:11",
1454
+ "rule:18a_iii",
1455
+ "rule:4"
1456
1456
  ],
1457
1457
  "situation": {
1458
1458
  "own": {
@@ -1485,9 +1485,9 @@
1485
1485
  "status": "binding",
1486
1486
  "narrative": "Own is constrained by her draught; the other vessel is not under command. Both underway and in sight of one another.",
1487
1487
  "expect": [
1488
- "11",
1489
- "18a1",
1490
- "4"
1488
+ "rule:11",
1489
+ "rule:18a_i",
1490
+ "rule:4"
1491
1491
  ],
1492
1492
  "situation": {
1493
1493
  "own": {
@@ -1520,9 +1520,9 @@
1520
1520
  "status": "binding",
1521
1521
  "narrative": "Own is constrained by her draught; the other vessel is restricted in her ability to manoeuvre. Both underway and in sight of one another.",
1522
1522
  "expect": [
1523
- "11",
1524
- "18a2",
1525
- "4"
1523
+ "rule:11",
1524
+ "rule:18a_ii",
1525
+ "rule:4"
1526
1526
  ],
1527
1527
  "situation": {
1528
1528
  "own": {
@@ -1555,12 +1555,12 @@
1555
1555
  "status": "binding",
1556
1556
  "narrative": "Own is constrained by her draught; the other vessel is constrained by her draught. Both underway and in sight of one another.",
1557
1557
  "expect": [
1558
- "11",
1558
+ "rule:11",
1559
1559
  {
1560
- "entry": "18d1",
1560
+ "entry": "rule:18d_i",
1561
1561
  "modality": "shall-if-practicable"
1562
1562
  },
1563
- "4"
1563
+ "rule:4"
1564
1564
  ],
1565
1565
  "situation": {
1566
1566
  "own": {
@@ -1593,12 +1593,12 @@
1593
1593
  "status": "binding",
1594
1594
  "narrative": "18(c) does not distinguish propulsion: a fishing vessel under sail is ranked by 18(c)(i), not by 18(b)(i), and both would otherwise match. This is the case that makes own's activity list, not her propulsion, the discriminator.",
1595
1595
  "expect": [
1596
- "11",
1596
+ "rule:11",
1597
1597
  {
1598
- "entry": "18c1",
1598
+ "entry": "rule:18c_i",
1599
1599
  "modality": "shall-if-practicable"
1600
1600
  },
1601
- "4"
1601
+ "rule:4"
1602
1602
  ],
1603
1603
  "situation": {
1604
1604
  "own": {
@@ -1631,8 +1631,8 @@
1631
1631
  "status": "binding",
1632
1632
  "narrative": "A fishing vessel under sail against an ordinary power-driven vessel: 18(a)(iii) gives the duty to the other vessel, so own carries none. The mirror of this case is the power-driven row.",
1633
1633
  "expect": [
1634
- "11",
1635
- "4"
1634
+ "rule:11",
1635
+ "rule:4"
1636
1636
  ],
1637
1637
  "situation": {
1638
1638
  "own": {
@@ -1665,8 +1665,8 @@
1665
1665
  "status": "binding",
1666
1666
  "narrative": "The same facts as the in-sight matrix cell, with `pair:geo:in_sight` false. Section II falls away entirely -- 18(a)(i) does not apply -- and Rule 19 takes its place. This is the scope gate, asserted rather than described.",
1667
1667
  "expect": [
1668
- "19a",
1669
- "4"
1668
+ "rule:19a",
1669
+ "rule:4"
1670
1670
  ],
1671
1671
  "situation": {
1672
1672
  "own": {
@@ -1699,8 +1699,8 @@
1699
1699
  "status": "binding",
1700
1700
  "narrative": "Section II is gated off; a sailing vessel gets no Rule 18 privilege from a vessel that cannot see her.",
1701
1701
  "expect": [
1702
- "19a",
1703
- "4"
1702
+ "rule:19a",
1703
+ "rule:4"
1704
1704
  ],
1705
1705
  "situation": {
1706
1706
  "own": {
@@ -1733,8 +1733,8 @@
1733
1733
  "status": "binding",
1734
1734
  "narrative": "18(c)(ii) is Section II and falls away with it.",
1735
1735
  "expect": [
1736
- "19a",
1737
- "4"
1736
+ "rule:19a",
1737
+ "rule:4"
1738
1738
  ],
1739
1739
  "situation": {
1740
1740
  "own": {
@@ -1767,9 +1767,9 @@
1767
1767
  "status": "binding",
1768
1768
  "narrative": "Not in sight, so Section II is gone, but Rule 4 keeps Rules 4-10 alive and 8(f)(iii) is one of them. It confers no role on either subject, which is its whole content.",
1769
1769
  "expect": [
1770
- "19a",
1771
- "4",
1772
- "8f3"
1770
+ "rule:19a",
1771
+ "rule:4",
1772
+ "rule:8f_iii"
1773
1773
  ],
1774
1774
  "situation": {
1775
1775
  "own": {
@@ -1803,10 +1803,10 @@
1803
1803
  "status": "binding",
1804
1804
  "narrative": "Own is a sailing vessel that came up on a power-driven vessel from abaft her beam, so `own:hist:was_overtaking` is latched. Read from own's side 13(a) makes her give-way. Read from the other vessel's side -- the swapped situation -- 18(a)(iv) would make the power-driven vessel give-way to a sailing vessel, and 13(a)'s rel:overrides is what resolves the pair. The conflict is only visible across the swap, because a two-subject entry is evaluated from own's side alone.",
1805
1805
  "expect": [
1806
- "11",
1807
- "13a",
1808
- "4",
1809
- "13d"
1806
+ "rule:11",
1807
+ "rule:13a",
1808
+ "rule:4",
1809
+ "rule:13d"
1810
1810
  ],
1811
1811
  "situation": {
1812
1812
  "own": {
@@ -1843,9 +1843,9 @@
1843
1843
  "status": "binding",
1844
1844
  "narrative": "A WIG craft near the surface satisfies 18(a)'s predicate too -- she is a power-driven vessel underway -- and against an ordinary power-driven vessel no 18(a) entry fires, so 18(f)(i) stands alone.",
1845
1845
  "expect": [
1846
- "11",
1847
- "18f1",
1848
- "4"
1846
+ "rule:11",
1847
+ "rule:18f_i",
1848
+ "rule:4"
1849
1849
  ],
1850
1850
  "situation": {
1851
1851
  "own": {
@@ -1878,12 +1878,12 @@
1878
1878
  {
1879
1879
  "name": "18(f)(i) overrides 18(a)(iv): a WIG craft near the surface and a sailing vessel",
1880
1880
  "status": "binding",
1881
- "narrative": "Here both fire from own's side: 18(a)(iv) would make her give-way, 18(f)(i) makes her keep clear of all vessels. 18f1's rel:overrides against 18a4 is what stops that being two different roles for one subject in one situation.",
1881
+ "narrative": "Here both fire from own's side: 18(a)(iv) would make her give-way, 18(f)(i) makes her keep clear of all vessels. rule:18f_i's rel:overrides against rule:18a_iv is what stops that being two different roles for one subject in one situation.",
1882
1882
  "expect": [
1883
- "11",
1884
- "18a4",
1885
- "18f1",
1886
- "4"
1883
+ "rule:11",
1884
+ "rule:18a_iv",
1885
+ "rule:18f_i",
1886
+ "rule:4"
1887
1887
  ],
1888
1888
  "situation": {
1889
1889
  "own": {
@@ -1918,10 +1918,10 @@
1918
1918
  "status": "binding",
1919
1919
  "narrative": "Outside a channel a power-driven vessel keeps out of the way of a sailing vessel. Inside one 9(b) reverses it: the sailing vessel shall not impede. Both halves of 9(b)'s disjunctive subject fire here because the vessel is also under 20 m.",
1920
1920
  "expect": [
1921
- "11",
1922
- "4",
1921
+ "rule:11",
1922
+ "rule:4",
1923
1923
  {
1924
- "entry": "9b",
1924
+ "entry": "rule:9b",
1925
1925
  "modality": "shall-not-impede"
1926
1926
  }
1927
1927
  ],
@@ -1961,14 +1961,14 @@
1961
1961
  "status": "binding",
1962
1962
  "narrative": "18(a)(iii) would make the power-driven vessel keep out of the way; 9(c) makes the fishing vessel not impede her. Read from the fishing vessel's side.",
1963
1963
  "expect": [
1964
- "11",
1965
- "4",
1964
+ "rule:11",
1965
+ "rule:4",
1966
1966
  {
1967
- "entry": "9b",
1967
+ "entry": "rule:9b",
1968
1968
  "modality": "shall-not-impede"
1969
1969
  },
1970
1970
  {
1971
- "entry": "9c",
1971
+ "entry": "rule:9c",
1972
1972
  "modality": "shall-not-impede"
1973
1973
  }
1974
1974
  ],
@@ -2009,15 +2009,15 @@
2009
2009
  "narrative": "The traffic-lane twin of 9(c). `pair:env:traffic_lane` is the only fact that separates them.",
2010
2010
  "expect": [
2011
2011
  {
2012
- "entry": "10i",
2012
+ "entry": "rule:10i",
2013
2013
  "modality": "shall-not-impede"
2014
2014
  },
2015
2015
  {
2016
- "entry": "10j",
2016
+ "entry": "rule:10j",
2017
2017
  "modality": "shall-not-impede"
2018
2018
  },
2019
- "11",
2020
- "4"
2019
+ "rule:11",
2020
+ "rule:4"
2021
2021
  ],
2022
2022
  "situation": {
2023
2023
  "own": {
@@ -2056,11 +2056,11 @@
2056
2056
  "narrative": "10(j)'s object is narrower than 9(b)'s -- a power-driven vessel following a traffic lane -- so `other:fact:propulsion` is read. Both halves of the disjunctive subject fire.",
2057
2057
  "expect": [
2058
2058
  {
2059
- "entry": "10j",
2059
+ "entry": "rule:10j",
2060
2060
  "modality": "shall-not-impede"
2061
2061
  },
2062
- "11",
2063
- "4"
2062
+ "rule:11",
2063
+ "rule:4"
2064
2064
  ],
2065
2065
  "situation": {
2066
2066
  "own": {
@@ -2096,12 +2096,12 @@
2096
2096
  {
2097
2097
  "name": "9(b) length boundary: 19.9 m power-driven vessel in a narrow channel",
2098
2098
  "status": "binding",
2099
- "narrative": "REQ-VERIFY-5: the `own:fact:length_m: {lt: 20}` disjunct of 9b's `any_of` subject, isolated from the `propulsion:sail` disjunct and from 18a4 by keeping both vessels power-driven -- no other predicate fires, so only the length gate decides.",
2099
+ "narrative": "REQ-VERIFY-5: the `own:fact:length_m: {lt: 20}` disjunct of rule:9b's `any_of` subject, isolated from the `propulsion:sail` disjunct and from rule:18a_iv by keeping both vessels power-driven -- no other predicate fires, so only the length gate decides.",
2100
2100
  "expect": [
2101
- "11",
2102
- "4",
2101
+ "rule:11",
2102
+ "rule:4",
2103
2103
  {
2104
- "entry": "9b",
2104
+ "entry": "rule:9b",
2105
2105
  "modality": "shall-not-impede"
2106
2106
  }
2107
2107
  ],
@@ -2139,10 +2139,10 @@
2139
2139
  {
2140
2140
  "name": "9(b) length boundary: 20.0 m power-driven vessel in a narrow channel",
2141
2141
  "status": "binding",
2142
- "narrative": "The other side of the same gate: at exactly 20 m, neither disjunct of 9b's subject holds, so 9b no longer applies and nothing else in this situation does either. `other:fact:confined_to_channel` stays true so length alone crosses the threshold.",
2142
+ "narrative": "The other side of the same gate: at exactly 20 m, neither disjunct of rule:9b's subject holds, so rule:9b no longer applies and nothing else in this situation does either. `other:fact:confined_to_channel` stays true so length alone crosses the threshold.",
2143
2143
  "expect": [
2144
- "11",
2145
- "4"
2144
+ "rule:11",
2145
+ "rule:4"
2146
2146
  ],
2147
2147
  "situation": {
2148
2148
  "own": {
@@ -2178,12 +2178,12 @@
2178
2178
  {
2179
2179
  "name": "10(j) length boundary: 19.9 m power-driven vessel in a traffic separation scheme",
2180
2180
  "status": "binding",
2181
- "narrative": "REQ-VERIFY-5: the twin gate, on 10j's `any_of` subject. Both vessels power-driven, other following the lane, so only the length disjunct decides.",
2181
+ "narrative": "REQ-VERIFY-5: the twin gate, on rule:10j's `any_of` subject. Both vessels power-driven, other following the lane, so only the length disjunct decides.",
2182
2182
  "expect": [
2183
- "11",
2184
- "4",
2183
+ "rule:11",
2184
+ "rule:4",
2185
2185
  {
2186
- "entry": "10j",
2186
+ "entry": "rule:10j",
2187
2187
  "modality": "shall-not-impede"
2188
2188
  }
2189
2189
  ],
@@ -2221,10 +2221,10 @@
2221
2221
  {
2222
2222
  "name": "10(j) length boundary: 20.0 m power-driven vessel in a traffic separation scheme",
2223
2223
  "status": "binding",
2224
- "narrative": "The other side of the same gate: at exactly 20 m, neither disjunct holds and 10j no longer applies. `other:fact:following_traffic_lane` stays true so length alone crosses the threshold.",
2224
+ "narrative": "The other side of the same gate: at exactly 20 m, neither disjunct holds and rule:10j no longer applies. `other:fact:following_traffic_lane` stays true so length alone crosses the threshold.",
2225
2225
  "expect": [
2226
- "11",
2227
- "4"
2226
+ "rule:11",
2227
+ "rule:4"
2228
2228
  ],
2229
2229
  "situation": {
2230
2230
  "own": {
@@ -2262,8 +2262,8 @@
2262
2262
  "status": "binding",
2263
2263
  "narrative": "The negative case for 10(j)'s `other:fact:propulsion` gate: the other vessel is not power-driven, so 10(j) does not fire and Rule 18 says nothing between two sailing vessels either. Rule 12 would, and is not modelled.",
2264
2264
  "expect": [
2265
- "11",
2266
- "4"
2265
+ "rule:11",
2266
+ "rule:4"
2267
2267
  ],
2268
2268
  "situation": {
2269
2269
  "own": {
@@ -2300,8 +2300,8 @@
2300
2300
  "status": "binding",
2301
2301
  "narrative": "REQ-VERIFY-5's twin for a boolean gate rather than a threshold: same subjects and channel as the first 9(b) fixture, but the other vessel is not the paragraph's protected vessel, so `other:fact:confined_to_channel` alone decides and 9(b) does not fire.",
2302
2302
  "expect": [
2303
- "11",
2304
- "4"
2303
+ "rule:11",
2304
+ "rule:4"
2305
2305
  ],
2306
2306
  "situation": {
2307
2307
  "own": {
@@ -2339,8 +2339,8 @@
2339
2339
  "status": "binding",
2340
2340
  "narrative": "The traffic-lane twin of the 9(b) case above: same subjects and scheme as the 10(j) fixture, but the other vessel is not following it, so `other:fact:following_traffic_lane` alone decides.",
2341
2341
  "expect": [
2342
- "11",
2343
- "4"
2342
+ "rule:11",
2343
+ "rule:4"
2344
2344
  ],
2345
2345
  "situation": {
2346
2346
  "own": {
@@ -2404,9 +2404,9 @@
2404
2404
  }
2405
2405
  },
2406
2406
  "expect": [
2407
- "11",
2408
- "18a2",
2409
- "4"
2407
+ "rule:11",
2408
+ "rule:18a_ii",
2409
+ "rule:4"
2410
2410
  ],
2411
2411
  "narrative": "The case Q-32 recorded as uncaught: a towing operation that severely restricts the towing vessel and her tow is restricted in her ability to manoeuvre by 27(c), so 18(a)(ii) applies -- but her `fact:activity` is `activity:towing` and no enumeration of the display axis reached her. `fact:rule18_class` decodes her to `rule18_class:ram` and the entry finds her."
2412
2412
  },
@@ -2441,8 +2441,8 @@
2441
2441
  }
2442
2442
  },
2443
2443
  "expect": [
2444
- "11",
2445
- "4"
2444
+ "rule:11",
2445
+ "rule:4"
2446
2446
  ],
2447
2447
  "narrative": "The other side of the same boolean, and the reason 27(c) needs one: most tows do not severely restrict the pair, and a tow that does not is an ordinary power-driven vessel under Rule 18. Without `fact:tow_restricts_deviation` the decode would have to choose one reading for every tow and would be wrong about most of them."
2448
2448
  },
@@ -2476,22 +2476,22 @@
2476
2476
  }
2477
2477
  },
2478
2478
  "expect": [
2479
- "11",
2480
- "18a2",
2481
- "4"
2479
+ "rule:11",
2480
+ "rule:18a_ii",
2481
+ "rule:4"
2482
2482
  ],
2483
2483
  "narrative": "3(g)(vi) names \"the towing vessel and her tow\" together, and the tow carries her own fact record -- so this side of the pair needs its own fixture: `activity:being_towed` plus `fact:tow_restricts_deviation` on her own record decodes her to `rule18_class:ram` exactly as the towing vessel's does. Before this fixture the decode row only matched `activity:towing`, and the tow herself fell through to her propulsion undetected."
2484
2484
  },
2485
2485
  {
2486
2486
  "name": "13(b) edge: own bears exactly 112.5 from the other, and is not yet overtaking",
2487
2487
  "status": "binding",
2488
- "narrative": "Own bears 112.5 relative from the other -- exactly 22.5 degrees abaft her beam, the forward edge of her sternlight arc. 13(b) says 'more than 22.5 degrees abaft her beam', so the edge itself is not an overtaking and the encounter is a crossing. The other bears 300 relative from own, on own's port bow, so own is the stand-on vessel and 15a-give-way is absent from her side; it applies to the other vessel, which is the swapped situation and not what a fixture asserts.",
2488
+ "narrative": "Own bears 112.5 relative from the other -- exactly 22.5 degrees abaft her beam, the forward edge of her sternlight arc. 13(b) says 'more than 22.5 degrees abaft her beam', so the edge itself is not an overtaking and the encounter is a crossing. The other bears 300 relative from own, on own's port bow, so own is the stand-on vessel and rule:15a:keep_out_of_the_way is absent from her side; it applies to the other vessel, which is the swapped situation and not what a fixture asserts.",
2489
2489
  "expect": [
2490
- "4",
2491
- "11",
2492
- "7d1",
2493
- "8f3",
2494
- "15a-crossing"
2490
+ "rule:4",
2491
+ "rule:11",
2492
+ "rule:7d_i",
2493
+ "rule:8f_iii",
2494
+ "rule:15a:crossing"
2495
2495
  ],
2496
2496
  "situation": {
2497
2497
  "own": {
@@ -2553,14 +2553,14 @@
2553
2553
  {
2554
2554
  "name": "13(b) edge: own bears 112.6 from the other, one tenth of a degree into the sector",
2555
2555
  "status": "binding",
2556
- "narrative": "The same edge from the other side of it. A tenth of a degree further abaft the other's beam and the encounter is an overtaking: 13b-overtaking classifies it and 13a lays the duty on own. 15a-crossing is excluded by the sector, not by a hand-written crossing sector, which is the property the partition test asserts over the whole circle.",
2556
+ "narrative": "The same edge from the other side of it. A tenth of a degree further abaft the other's beam and the encounter is an overtaking: rule:13b classifies it and rule:13a lays the duty on own. rule:15a:crossing is excluded by the sector, not by a hand-written crossing sector, which is the property the partition test asserts over the whole circle.",
2557
2557
  "expect": [
2558
- "4",
2559
- "11",
2560
- "7d1",
2561
- "8f3",
2562
- "13a",
2563
- "13b-overtaking"
2558
+ "rule:4",
2559
+ "rule:11",
2560
+ "rule:7d_i",
2561
+ "rule:8f_iii",
2562
+ "rule:13a",
2563
+ "rule:13b"
2564
2564
  ],
2565
2565
  "situation": {
2566
2566
  "own": {
@@ -2622,14 +2622,14 @@
2622
2622
  {
2623
2623
  "name": "13(b) edge: own bears exactly 247.5 from the other, the mirror of the same edge",
2624
2624
  "status": "binding",
2625
- "narrative": "The port-quarter edge, 112.5 degrees the other way round. Not overtaking, so a crossing; and the other bears 010 relative from own, on her starboard bow, so own is the give-way vessel. Own is inside the head-on cone and the other is not, which is why 14b does not apply: 14(b) is a statement about both aspects, and the `any_of` that negates it needs only one of them outside.",
2625
+ "narrative": "The port-quarter edge, 112.5 degrees the other way round. Not overtaking, so a crossing; and the other bears 010 relative from own, on her starboard bow, so own is the give-way vessel. Own is inside the head-on cone and the other is not, which is why rule:14b does not apply: 14(b) is a statement about both aspects, and the `any_of` that negates it needs only one of them outside.",
2626
2626
  "expect": [
2627
- "4",
2628
- "11",
2629
- "7d1",
2630
- "8f3",
2631
- "15a-crossing",
2632
- "15a-give-way"
2627
+ "rule:4",
2628
+ "rule:11",
2629
+ "rule:7d_i",
2630
+ "rule:8f_iii",
2631
+ "rule:15a:crossing",
2632
+ "rule:15a:keep_out_of_the_way"
2633
2633
  ],
2634
2634
  "situation": {
2635
2635
  "own": {
@@ -2693,12 +2693,12 @@
2693
2693
  "status": "binding",
2694
2694
  "narrative": "The mirror of the 112.6 case. Overtaking, and the give-way entry that applied a tenth of a degree away is gone -- the two sit either side of one number, which is the point of declaring it once.",
2695
2695
  "expect": [
2696
- "4",
2697
- "11",
2698
- "7d1",
2699
- "8f3",
2700
- "13a",
2701
- "13b-overtaking"
2696
+ "rule:4",
2697
+ "rule:11",
2698
+ "rule:7d_i",
2699
+ "rule:8f_iii",
2700
+ "rule:13a",
2701
+ "rule:13b"
2702
2702
  ],
2703
2703
  "situation": {
2704
2704
  "own": {
@@ -2760,13 +2760,13 @@
2760
2760
  {
2761
2761
  "name": "13(b): own is the vessel being overtaken, and the encounter is still an overtaking",
2762
2762
  "status": "binding",
2763
- "narrative": "The other bears 200 relative from own and is coming up fast on own's port quarter. From own's side the aspect is 005 -- she is nearly ahead of the overtaking vessel -- and reading aspect alone would have made this a crossing on own's side and an overtaking on the other's, one encounter with two names. 13b-overtaken is the second half of 13(b) and is what stops that. 13a is correctly absent: own is not the vessel that keeps out of the way.",
2763
+ "narrative": "The other bears 200 relative from own and is coming up fast on own's port quarter. The aspect is 005 -- own is nearly ahead of the other -- and reading aspect alone would have made this a crossing on own's side and an overtaking on the other's, one encounter with two names. rule:13b reads the sector on either subject, which stops that. rule:13a is correctly absent: own is not the vessel that keeps out of the way.",
2764
2764
  "expect": [
2765
- "4",
2766
- "11",
2767
- "7d1",
2768
- "8f3",
2769
- "13b-overtaken"
2765
+ "rule:4",
2766
+ "rule:11",
2767
+ "rule:7d_i",
2768
+ "rule:8f_iii",
2769
+ "rule:13b"
2770
2770
  ],
2771
2771
  "situation": {
2772
2772
  "own": {
@@ -2830,11 +2830,11 @@
2830
2830
  "status": "binding",
2831
2831
  "narrative": "Own bears 348.75 relative from the other and the other bears 011.25 from own -- both exactly at `head_on_half_angle_deg`, one point of the compass. The cone is closed at the edge, so this is a head-on situation. Courses are 000 and 202.5, twenty-two and a half degrees off reciprocal, which is the widest pair the pencilled constant admits and the fixture that will change if the constant does.",
2832
2832
  "expect": [
2833
- "4",
2834
- "11",
2835
- "7d1",
2836
- "8f3",
2837
- "14b"
2833
+ "rule:4",
2834
+ "rule:11",
2835
+ "rule:7d_i",
2836
+ "rule:8f_iii",
2837
+ "rule:14b"
2838
2838
  ],
2839
2839
  "situation": {
2840
2840
  "own": {
@@ -2896,14 +2896,14 @@
2896
2896
  {
2897
2897
  "name": "14 edge: one twentieth of a degree wider, and the same situation is a crossing",
2898
2898
  "status": "binding",
2899
- "narrative": "Own's bearing of the other moves from 11.25 to 11.3 and nothing else changes. The head-on cone no longer holds on both subjects, so 14b is gone and 15a-crossing takes it -- the residual, with no bearing left unclassified between the two fixtures. Own has the other on her starboard side, so she is give-way.",
2899
+ "narrative": "Own's bearing of the other moves from 11.25 to 11.3 and nothing else changes. The head-on cone no longer holds on both subjects, so rule:14b is gone and rule:15a:crossing takes it -- the residual, with no bearing left unclassified between the two fixtures. Own has the other on her starboard side, so she is give-way.",
2900
2900
  "expect": [
2901
- "4",
2902
- "11",
2903
- "7d1",
2904
- "8f3",
2905
- "15a-crossing",
2906
- "15a-give-way"
2901
+ "rule:4",
2902
+ "rule:11",
2903
+ "rule:7d_i",
2904
+ "rule:8f_iii",
2905
+ "rule:15a:crossing",
2906
+ "rule:15a:keep_out_of_the_way"
2907
2907
  ],
2908
2908
  "situation": {
2909
2909
  "own": {
@@ -2965,13 +2965,13 @@
2965
2965
  {
2966
2966
  "name": "7(d)(i) does not apply: the bearing is drawing out at three degrees a minute",
2967
2967
  "status": "binding",
2968
- "narrative": "The same crossing geometry as the first fixture with the bearing opening at 3 deg/min, comfortably outside `appreciable_bearing_change_deg_min`. 7d1 is absent and every other entry is unchanged: risk of collision is a supplied fact and 7(d)(i) is a second ground for it, never the only one, which is why 15a-crossing and 8f3 still apply.",
2968
+ "narrative": "The same crossing geometry as the first fixture with the bearing opening at 3 deg/min, comfortably outside `appreciable_bearing_change_deg_min`. rule:7d_i is absent and every other entry is unchanged: risk of collision is a supplied fact and 7(d)(i) is a second ground for it, never the only one, which is why rule:15a:crossing and rule:8f_iii still apply.",
2969
2969
  "expect": [
2970
- "4",
2971
- "11",
2972
- "8f3",
2973
- "15a-crossing",
2974
- "15a-give-way"
2970
+ "rule:4",
2971
+ "rule:11",
2972
+ "rule:8f_iii",
2973
+ "rule:15a:crossing",
2974
+ "rule:15a:keep_out_of_the_way"
2975
2975
  ],
2976
2976
  "situation": {
2977
2977
  "own": {
@@ -3035,8 +3035,8 @@
3035
3035
  "status": "binding",
3036
3036
  "narrative": "The same bearings again with `geo:risk_of_collision` false. Rules 14 and 15 both open on risk of collision, so neither the encounter type nor the role survives its absence, and the pair selects only the two scope entries. Rule 13 would have survived it -- 13(b) says nothing about risk -- which is why this case is a crossing geometry and not an overtaking one.",
3037
3037
  "expect": [
3038
- "4",
3039
- "11"
3038
+ "rule:4",
3039
+ "rule:11"
3040
3040
  ],
3041
3041
  "situation": {
3042
3042
  "own": {
@@ -3100,11 +3100,11 @@
3100
3100
  "status": "binding",
3101
3101
  "narrative": "Two sailing vessels approaching with the wind on different sides. Own has it on the port side and keeps out of the way. No encounter type is produced: Rules 14 and 15 are both gated on two power-driven vessels and Rule 12 has no deeming paragraph of its own, so the pair carries a role and no classification. That is a finding about the Rules rather than a gap in the data -- Q-43.",
3102
3102
  "expect": [
3103
- "4",
3104
- "11",
3105
- "7d1",
3106
- "8f3",
3107
- "12a1"
3103
+ "rule:4",
3104
+ "rule:11",
3105
+ "rule:7d_i",
3106
+ "rule:8f_iii",
3107
+ "rule:12a_i"
3108
3108
  ],
3109
3109
  "situation": {
3110
3110
  "own": {
@@ -3172,11 +3172,11 @@
3172
3172
  "status": "binding",
3173
3173
  "narrative": "The wind on the same side for both, so the windward vessel keeps clear. `geo:windward` is antisymmetric and the fixture states both halves of it, which is what makes the swapped reading -- the other vessel is not give-way -- an assertion rather than an absence.",
3174
3174
  "expect": [
3175
- "4",
3176
- "11",
3177
- "7d1",
3178
- "8f3",
3179
- "12a2"
3175
+ "rule:4",
3176
+ "rule:11",
3177
+ "rule:7d_i",
3178
+ "rule:8f_iii",
3179
+ "rule:12a_ii"
3180
3180
  ],
3181
3181
  "situation": {
3182
3182
  "own": {
@@ -3244,11 +3244,11 @@
3244
3244
  "status": "binding",
3245
3245
  "narrative": "Own has the wind on the port side, sees a vessel to windward, and cannot tell which side that vessel has the wind on. `wind_side:unknown` is a declared value and not an absent fact, which is the only reason this paragraph is expressible at all: an absent fact satisfies nothing, so silence would have relieved own of the duty the paragraph exists to impose.",
3246
3246
  "expect": [
3247
- "4",
3248
- "11",
3249
- "7d1",
3250
- "8f3",
3251
- "12a3"
3247
+ "rule:4",
3248
+ "rule:11",
3249
+ "rule:7d_i",
3250
+ "rule:8f_iii",
3251
+ "rule:12a_iii"
3252
3252
  ],
3253
3253
  "situation": {
3254
3254
  "own": {
@@ -3314,12 +3314,12 @@
3314
3314
  {
3315
3315
  "name": "12 does not apply: both on the starboard tack and own to leeward",
3316
3316
  "status": "binding",
3317
- "narrative": "The exclusion case for all three of Rule 12. Same tack rules out 12(a)(i), own to leeward rules out 12(a)(ii), and the other's tack being known rules out 12(a)(iii). The leeward vessel is stand-on and the entry that says so is 12a2 read on the swapped situation, which is why nothing appears here.",
3317
+ "narrative": "The exclusion case for all three of Rule 12. Same tack rules out 12(a)(i), own to leeward rules out 12(a)(ii), and the other's tack being known rules out 12(a)(iii). The leeward vessel is stand-on and the entry that says so is rule:12a_ii read on the swapped situation, which is why nothing appears here.",
3318
3318
  "expect": [
3319
- "4",
3320
- "11",
3321
- "7d1",
3322
- "8f3"
3319
+ "rule:4",
3320
+ "rule:11",
3321
+ "rule:7d_i",
3322
+ "rule:8f_iii"
3323
3323
  ],
3324
3324
  "situation": {
3325
3325
  "own": {
@@ -3385,13 +3385,13 @@
3385
3385
  {
3386
3386
  "name": "12 under 18(b)(iii): own fishing under sail on the port tack, the other a sailing vessel on the starboard tack",
3387
3387
  "status": "binding",
3388
- "narrative": "The same crossing as the 12(a)(i) case, with own now engaged in fishing under sail. She is a sailing vessel by 3(c) -- her machinery is not in use -- so 12(a)(i) applies from her side and would make her give way, being on the port tack. She is also a vessel engaged in fishing by 3(d), so from the other vessel's side 18(b)(iii) applies and makes the other keep out of her way. Both are in force; Rule 18's opening words except Rules 9, 10 and 13 and not Rule 12, so 18b3 carries rel:overrides against 12a1 and own resolves to stand-on. This fixture asserts applicability from own's side, which is 12a1; the resolution is asserted by the pooled-roles tests, and before this PR own was simply outside Rule 12, which was Q-40's finding.",
3388
+ "narrative": "The same crossing as the 12(a)(i) case, with own now engaged in fishing under sail. She is a sailing vessel by 3(c) -- her machinery is not in use -- so 12(a)(i) applies from her side and would make her give way, being on the port tack. She is also a vessel engaged in fishing by 3(d), so from the other vessel's side 18(b)(iii) applies and makes the other keep out of her way. Both are in force; Rule 18's opening words except Rules 9, 10 and 13 and not Rule 12, so rule:18b_iii carries rel:overrides against rule:12a_i and own resolves to stand-on. This fixture asserts applicability from own's side, which is rule:12a_i; the resolution is asserted by the pooled-roles tests, and before this PR own was simply outside Rule 12, which was Q-40's finding.",
3389
3389
  "expect": [
3390
- "4",
3391
- "11",
3392
- "7d1",
3393
- "8f3",
3394
- "12a1"
3390
+ "rule:4",
3391
+ "rule:11",
3392
+ "rule:7d_i",
3393
+ "rule:8f_iii",
3394
+ "rule:12a_i"
3395
3395
  ],
3396
3396
  "situation": {
3397
3397
  "own": {
@@ -3457,14 +3457,14 @@
3457
3457
  {
3458
3458
  "name": "13 over 12: own overtaking a windward vessel on the same tack from dead astern",
3459
3459
  "status": "binding",
3460
- "narrative": "Two sailing vessels on the starboard tack, own to leeward and coming up from dead astern at twice the other's speed. From own's side 13(a) and 13(b) apply and 12(a)(ii) does not -- own is not the windward vessel. From the other's side 12(a)(ii) does apply and would make her, the windward vessel, keep out of the way of own. 13(a) is 'notwithstanding anything contained in' the Rules of Part B Sections I and II, which is Rule 12 among others, so 13a carries rel:overrides against the three Rule 12 entries and the overtaken vessel resolves to stand-on. Steady bearing: dead ahead and dead astern, closing at three knots.",
3460
+ "narrative": "Two sailing vessels on the starboard tack, own to leeward and coming up from dead astern at twice the other's speed. From own's side 13(a) and 13(b) apply and 12(a)(ii) does not -- own is not the windward vessel. From the other's side 12(a)(ii) does apply and would make her, the windward vessel, keep out of the way of own. 13(a) is 'notwithstanding anything contained in' the Rules of Part B Sections I and II, which is Rule 12 among others, so rule:13a carries rel:overrides against the three Rule 12 entries and the overtaken vessel resolves to stand-on. Steady bearing: dead ahead and dead astern, closing at three knots.",
3461
3461
  "expect": [
3462
- "4",
3463
- "11",
3464
- "7d1",
3465
- "8f3",
3466
- "13a",
3467
- "13b-overtaking"
3462
+ "rule:4",
3463
+ "rule:11",
3464
+ "rule:7d_i",
3465
+ "rule:8f_iii",
3466
+ "rule:13a",
3467
+ "rule:13b"
3468
3468
  ],
3469
3469
  "situation": {
3470
3470
  "own": {
@@ -3530,14 +3530,14 @@
3530
3530
  {
3531
3531
  "name": "15 between two fishing vessels: both under power, the other on own's starboard side",
3532
3532
  "status": "binding",
3533
- "narrative": "Two vessels engaged in fishing, both propelled by machinery, crossing in sight on a steady bearing at 1500 m. Rule 18 orders neither of them: 18(a) speaks for a power-driven vessel that is not herself ranked by Rule 18, and 18(c) ranks a fishing vessel only against a vessel not under command and one restricted in her ability to manoeuvre. So no Rule 18 norm is in force between this pair. 15(a)'s \"two power-driven vessels\" is 3(b), and a vessel engaged in fishing whose machinery is in use is a power-driven vessel, so Rule 15 is the only norm that assigns a role here: own has the other on her own starboard side and keeps out of the way, the other stands on. Before this PR `15a-give-way` negated the four Rule 18 ranks on both subjects, so neither vessel took a helm role and the pair was ungoverned -- which is the finding this fixture was written to record.",
3533
+ "narrative": "Two vessels engaged in fishing, both propelled by machinery, crossing in sight on a steady bearing at 1500 m. Rule 18 orders neither of them: 18(a) speaks for a power-driven vessel that is not herself ranked by Rule 18, and 18(c) ranks a fishing vessel only against a vessel not under command and one restricted in her ability to manoeuvre. So no Rule 18 norm is in force between this pair. 15(a)'s \"two power-driven vessels\" is 3(b), and a vessel engaged in fishing whose machinery is in use is a power-driven vessel, so Rule 15 is the only norm that assigns a role here: own has the other on her own starboard side and keeps out of the way, the other stands on. Before this PR `rule:15a:keep_out_of_the_way` negated the four Rule 18 ranks on both subjects, so neither vessel took a helm role and the pair was ungoverned -- which is the finding this fixture was written to record.",
3534
3534
  "expect": [
3535
- "4",
3536
- "11",
3537
- "7d1",
3538
- "8f3",
3539
- "15a-crossing",
3540
- "15a-give-way"
3535
+ "rule:4",
3536
+ "rule:11",
3537
+ "rule:7d_i",
3538
+ "rule:8f_iii",
3539
+ "rule:15a:crossing",
3540
+ "rule:15a:keep_out_of_the_way"
3541
3541
  ],
3542
3542
  "situation": {
3543
3543
  "own": {
@@ -3599,14 +3599,14 @@
3599
3599
  {
3600
3600
  "name": "15 between NUC and RAM: both under power, and Rule 18 does not order them",
3601
3601
  "status": "binding",
3602
- "narrative": "The same crossing with own not under command and the other restricted in her ability to manoeuvre, both propelled by machinery. Rule 18 is a partial order and these two are its unordered pair -- neither 18(a), whose subject is a vessel Rule 18 does not rank, nor 18(c), whose subject is a fishing vessel, reaches them -- which the partial-order test already pins. Both are power-driven vessels by 3(b), so 15(a) applies and own, having the other on her own starboard side, is the give-way vessel. That lays a helm duty on a vessel which by 3(f) is unable to manoeuvre as the Rules require, and the model records it rather than gating it away: Rule 2 is what answers it (ADR 0005 sec. 5), the same position `12a1` takes for two sailing vessels Rule 18 leaves unordered. Q-40.",
3602
+ "narrative": "The same crossing with own not under command and the other restricted in her ability to manoeuvre, both propelled by machinery. Rule 18 is a partial order and these two are its unordered pair -- neither 18(a), whose subject is a vessel Rule 18 does not rank, nor 18(c), whose subject is a fishing vessel, reaches them -- which the partial-order test already pins. Both are power-driven vessels by 3(b), so 15(a) applies and own, having the other on her own starboard side, is the give-way vessel. That lays a helm duty on a vessel which by 3(f) is unable to manoeuvre as the Rules require, and the model records it rather than gating it away: Rule 2 is what answers it (ADR 0005 sec. 5), the same position `rule:12a_i` takes for two sailing vessels Rule 18 leaves unordered. Q-40.",
3603
3603
  "expect": [
3604
- "4",
3605
- "11",
3606
- "7d1",
3607
- "8f3",
3608
- "15a-crossing",
3609
- "15a-give-way"
3604
+ "rule:4",
3605
+ "rule:11",
3606
+ "rule:7d_i",
3607
+ "rule:8f_iii",
3608
+ "rule:15a:crossing",
3609
+ "rule:15a:keep_out_of_the_way"
3610
3610
  ],
3611
3611
  "situation": {
3612
3612
  "own": {
@@ -3670,13 +3670,13 @@
3670
3670
  "status": "binding",
3671
3671
  "narrative": "Own already holds 13(d)'s latch from an earlier overtaking. Since then the pair has closed again from the other direction: the other now sits dead astern of own, gaining at three knots -- 13(a)'s sector test, read on her geometry alone, would newly name her give-way too. The latch forbids it: only own, the latch-holder, gives way (Q-47).",
3672
3672
  "expect": [
3673
- "4",
3674
- "11",
3675
- "7d1",
3676
- "8f3",
3677
- "13a",
3678
- "13b-overtaken",
3679
- "13d"
3673
+ "rule:4",
3674
+ "rule:11",
3675
+ "rule:7d_i",
3676
+ "rule:8f_iii",
3677
+ "rule:13a",
3678
+ "rule:13b",
3679
+ "rule:13d"
3680
3680
  ],
3681
3681
  "situation": {
3682
3682
  "own": {
@@ -3746,6 +3746,6 @@
3746
3746
  ],
3747
3747
  "override_note": "`expect` names every entry whose predicate the situation satisfies, including entries that a rel:overrides then displaces. Applicability and resolution are two steps: 18(a)(iv) really does apply to a WIG craft near the surface -- she is a power-driven vessel underway -- and 18(f)(i) overriding it is what the engine does next. A fixture that hid the overridden entry would make the override unobservable and the relation untestable.",
3748
3748
  "expect_scope": "`expect` names the non-`display` entries a situation selects -- `scope`, `precedence` and `classification`. Display entries are deliberately out of scope here: a situation carries `own.fact`, so every Part C entry that matches that vessel would otherwise have to be repeated in every Part B fixture, and fixtures/applicability-fixtures.json is already the contract for those. A situation fixture asserts what the pair produces, not what own shows.",
3749
- "collapse_note": "Four expected ids changed in the PR that gave the predicate language `any_of` and `not`: `9b-small`/`9b-sail` collapsed to `9b` and `10j-small`/`10j-sail` to `10j`, because 9(b)'s and 10(j)'s disjunctive subjects no longer need an entry apiece. Every other expected id is unchanged. `18d1`'s expected modality moved from `shall-not-impede` to `shall-if-practicable`: the duty now lives in `effect.own` and the modality carries the 'if the circumstances of the case admit' caveat the entry used to drop.",
3750
- "geometry_note": "The bearings, headings and speeds of every case that states its kinematics are a consistent set, and since the consistency check landed (Q-48, REQ-VERIFY-8) the suite enforces that rather than trusting the author. The two relative bearings are two readings of one line of sight, so own's bearing plus own's heading plus 180 equals the aspect plus the other's heading, modulo 360; where positions are stated they reproduce the range and both bearings; and the pair's cpa, tcpa and bearing rate are the ones the two headings and speeds produce, to the tolerances `data/facts.json` declares under `situation.geometry.consistency`. Positions are still omitted from the cases added with Rules 12-15: range and bearing are given directly, inventing a latitude to derive them from would assert more than the case knows, and the heading equation checks what the case does state. When the check landed every case that stated speeds failed the motion equations -- the pair numbers had been placeholders -- and they were re-derived; the head-on case was recast on a steady bearing and the 13(d) latch case lost `7d1`, both recorded in their narratives. Everything else, and every other expected id, is unchanged."
3749
+ "collapse_note": "Four expected ids changed in the PR that gave the predicate language `any_of` and `not`: `9b-small`/`9b-sail` collapsed to `rule:9b` and `10j-small`/`10j-sail` to `rule:10j`, because 9(b)'s and 10(j)'s disjunctive subjects no longer need an entry apiece. Every other expected id is unchanged. `rule:18d_i`'s expected modality moved from `shall-not-impede` to `shall-if-practicable`: the duty now lives in `effect.own` and the modality carries the 'if the circumstances of the case admit' caveat the entry used to drop.",
3750
+ "geometry_note": "The bearings, headings and speeds of every case that states its kinematics are a consistent set, and since the consistency check landed (Q-48, REQ-VERIFY-8) the suite enforces that rather than trusting the author. The two relative bearings are two readings of one line of sight, so own's bearing plus own's heading plus 180 equals the aspect plus the other's heading, modulo 360; where positions are stated they reproduce the range and both bearings; and the pair's cpa, tcpa and bearing rate are the ones the two headings and speeds produce, to the tolerances `data/facts.json` declares under `situation.geometry.consistency`. Positions are still omitted from the cases added with Rules 12-15: range and bearing are given directly, inventing a latitude to derive them from would assert more than the case knows, and the heading equation checks what the case does state. When the check landed every case that stated speeds failed the motion equations -- the pair numbers had been placeholders -- and they were re-derived; the head-on case was recast on a steady bearing and the 13(d) latch case lost `rule:7d_i`, both recorded in their narratives. Everything else, and every other expected id, is unchanged."
3751
3751
  }