colregs 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,922 @@
1
+ # Part B invariants — Rules 13–19
2
+
3
+ Status: **sketch** (P4.1 of the formal-methods epic,
4
+ [colregs-engine#1](https://github.com/mark-brannan/colregs-engine/issues/1)).
5
+ Bound by `REQ-INV-1`–`REQ-INV-7` in `docs/requirements.md` §4.2. Everything
6
+ here is `✎` **pencil** under `docs/conventions.md` unless a block says
7
+ otherwise.
8
+
9
+ Prose invariants over the *situation record* of `REQ-CAT-4`, extended to a
10
+ trace, written so a TLA+ or Rocq formalisation can be built from them without
11
+ the rule text; where temporal, each says what is remembered and over what
12
+ window, which is what P4.2 and P4.3 build on. Not `data/applicability.json`
13
+ (an entry says which norms a *state* selects; an invariant, what holds of a
14
+ *trace*), and not a restatement of the rules: what is not formalised is listed
15
+ in [Not formalised here](#not-formalised-here), so Goal 4's coverage claim is
16
+ auditable. **No maritime doctrine**: every proposition is the rule text,
17
+ arithmetic over it, or a decision recorded as such; two readings are both
18
+ recorded and the choice is a `Q-` in §11.
19
+
20
+ ---
21
+
22
+ ## The identifier scheme `✎`
23
+
24
+ `INV-` plus the entry-id derivation of the paragraph path (`docs/identifiers.md`
25
+ §"Entry ids") plus, where one paragraph yields several invariants, a hyphenated
26
+ suffix naming what distinguishes them.
27
+
28
+ | paragraph | invariant id |
29
+ |---|---|
30
+ | `13(d)` | `INV-13d` |
31
+ | `17(a)(ii)` | `INV-17a2-trigger`, `INV-17a2-permission` |
32
+ | `16` | `INV-16` |
33
+
34
+ - Insertion appends a suffix and never renumbers; a suffix names something and
35
+ is not an ordinal (`REQ-INV-2`).
36
+ - The paragraph is the unit (ADR 0001): an invariant reading several takes the
37
+ id of the one stating its operative content, as entry `14b` does.
38
+ - `INV-` is a type prefix on a citation-derived name — the one departure from
39
+ `docs/identifiers.md`, because `13a` is already an entry id. Jurisdiction is a
40
+ dimension (`REQ-SCOPE-2`, `Q-8`); only `intl` is populated.
41
+
42
+ ---
43
+
44
+ ## The model these invariants are stated over `✎`
45
+
46
+ A **situation** is the record of `REQ-CAT-4` and `REQ-CAT-6`: two per-vessel
47
+ fact records, a kinematic state each, relative geometry, history and the
48
+ environment, addressed as `<subject>:<class>:<key>`, subject in
49
+ `own`/`other`/`pair`. A **trace** is a sequence of situations for one ordered
50
+ pair, sampled at *t*₀ < *t*₁ < … . Each invariant is a property of one state
51
+ ("at every state") or relates two or more ("at every state after", "from the
52
+ first state at which") — the whole content of §4.1's `conduct` category, and
53
+ why an entry, evaluated at a point, cannot carry it.
54
+
55
+ An **encounter** is a maximal segment of a trace in which the two vessels are
56
+ in a relationship the Rules reach. Where it begins and ends is `Q-47`'s
57
+ question; invariants scoped to "the same encounter" make a formalisation choose
58
+ a segmentation explicitly.
59
+
60
+ **Roles** are `data/applicability.json`'s closed `effects.roles`: `give-way`,
61
+ `stand-on`, `shall-not-impede`, `keep-clear`, `none`. **Encounter types** are
62
+ `head-on`, `crossing`, `overtaking`, `none`. **Sections**: I is Rules 4–10, II
63
+ is Rules 11–18, III is Rule 19; which governs a pair is `INV-19a-scope`.
64
+
65
+ ---
66
+
67
+ # Rule 13 — Overtaking
68
+
69
+ 13(a) assigns a role, 13(b) deems the encounter, 13(c) resolves doubt, 13(d)
70
+ latches the result against the geometry that follows.
71
+
72
+ ### INV-13b — the overtaking deeming test
73
+
74
+ `13(b)` under 11 · classification · single-state · `✎`
75
+
76
+ **Invariant.** At any state at which the two vessels are in sight of one
77
+ another and both underway, own is deemed to be overtaking other exactly when
78
+ own is coming up with other and own bears, from other, more than 22.5° abaft
79
+ other's beam — `other:geo:rel_bearing_deg` strictly inside (112.5°, 247.5°).
80
+ The sector is open at both ends (*more than* 22.5°: a vessel on the edge is
81
+ not overtaking); its edges are the forward edges of Rule 21(c)'s sternlight
82
+ arc, which 13(b)'s second limb states in light terms.
83
+
84
+ - **Undetermined term.** "Coming up with" is a speed comparison the model cannot
85
+ express (`Q-46`); `13b-overtaking` substitutes `pair:geo:tcpa_s > 0`, which
86
+ admits a pair closing because the vessel ahead stopped. This states the rule.
87
+ - **Not stated by 13(b).** Risk of collision: `Q-50`.
88
+ - Entries: `13b-overtaking`, `13b-overtaken`;
89
+ `situation.constants.overtaking_sector_from_deg`/`_to_deg` (ink). Settled by
90
+ P2.2's Alloy sector model: a partition, or a bearing that falls in both.
91
+
92
+ ### INV-13b-pair — overtaking is a property of the pair
93
+
94
+ `13(b)` · classification, derived · single-state · `✎`
95
+
96
+ **Invariant.** Where `INV-13b` holds of own with respect to other, the
97
+ encounter type of the pair is `overtaking` read from *either* subject: the
98
+ vessel being overtaken is in an overtaking, not a crossing, though the
99
+ overtaking vessel bears forward of her beam.
100
+
101
+ - **Why separate.** A formalisation carrying encounter type per vessel
102
+ classifies the overtaken side as a crossing, two types on one pair.
103
+ - Entries: `13b-overtaking`, `13b-overtaken`, each other's `when` with subjects
104
+ swapped. Settled by P4.2 carrying the type on the pair and TLC finding no
105
+ state where the subjects disagree.
106
+
107
+ ### INV-13a — the overtaking vessel keeps out of the way
108
+
109
+ `13(a)` · precedence · single-state · `✎`
110
+
111
+ **Invariant.** At every state at which the encounter type is `overtaking`, the
112
+ overtaking vessel holds `give-way`, the overtaken vessel `stand-on`, and these
113
+ roles displace any role Rules 4–18 would otherwise assign to either vessel.
114
+ "Notwithstanding anything contained in the Rules 4-18" — the USCG rendering of
115
+ "part B, sections I and II", the same span — reaches Rule 12 and Rule 18 as
116
+ well as Rules 14 and 15.
117
+
118
+ - **Not stated by 13(a).** Risk of collision: `Q-50`.
119
+ - Entries: `13a`, overriding all eleven Rule 18 and all three Rule 12 entries.
120
+ Settled by P4.2's role assignment: the override is or is not needed to keep
121
+ "never both give-way" true.
122
+
123
+ ### INV-13d — the latch: the classification survives the geometry
124
+
125
+ `13(d)` · classification · temporal, a state to every later state of the
126
+ encounter · `✎`
127
+
128
+ **Invariant.** Let *s* be the first state of an encounter at which own is
129
+ deemed to be overtaking other. At every state of that encounter after *s*,
130
+ until own is finally past and clear, the encounter type of the pair is
131
+ `overtaking` whatever the relative bearings then are; in particular it is not
132
+ `crossing`, and the tests of Rules 14 and 15 do not apply to the pair.
133
+
134
+ - **State remembered.** One directional boolean per subject per encounter (own
135
+ was, earlier in this encounter, the overtaking vessel), plus the time of *s*
136
+ for a monitor that says when the duty attached; window *s* to finally past and
137
+ clear. Reading only the current state is wrong in the direction the paragraph
138
+ forbids: an overtaking drawn out on the bow reads *crossing*, and hands
139
+ give-way to the wrong vessel.
140
+ - **Undetermined term.** "Finally past and clear" has no fact and no threshold;
141
+ the data's latch is consumer-cleared and never self-clears (`Q-47`), a trace
142
+ model's is its segmentation, and no bearing or range is invented here.
143
+ - **Readings in doubt.** Two: what arms the latch, `Q-51`; what it forbids,
144
+ `Q-52`.
145
+ - Entries: `13d`, reading `own`/`other:hist:was_overtaking` and no geometry; the
146
+ `was_overtaking: false` gates on `14b`, `15a-crossing`, `15a-give-way`
147
+ implement `Q-52`'s *broad* reading. Settled by `Q-51`, `Q-52`, then TLC on a
148
+ three-state trace of an overtaking drawing out onto the bow.
149
+
150
+ ### INV-13d-duty — the duty survives the geometry
151
+
152
+ `13(d)` second limb · precedence · temporal, as `INV-13d` · `✎`
153
+
154
+ **Invariant.** With *s* as in `INV-13d`, at every state after *s* until own is
155
+ finally past and clear, own holds `give-way` and other `stand-on`, whatever the
156
+ bearings. Separate from `INV-13d` because the two limbs come apart: a reading
157
+ on which 13(d) forbids only the *crossing* reclassification still preserves
158
+ the duty by its second clause, and a formalisation deriving role from encounter
159
+ type alone cannot distinguish `Q-52`'s readings.
160
+
161
+ - **State remembered.** As `INV-13d`.
162
+ - Entries: `13a`'s `any_of` second limb, `own:hist:was_overtaking: true` — role
163
+ asserted from the latch directly, keeping the limbs separable. Settled by
164
+ `Q-52`.
165
+
166
+ ---
167
+
168
+ # Rule 14 — Head-on situation
169
+
170
+ ### INV-14b — the head-on deeming test
171
+
172
+ `14(b)` reading 14(a)'s conditions · classification · single-state · `✎`
173
+
174
+ **Invariant.** At any state at which two power-driven vessels are in sight,
175
+ both underway, with risk of collision, and neither latched under `INV-13d`, a
176
+ head-on situation is deemed to exist exactly when each sees the other ahead or
177
+ nearly ahead: `own:geo:rel_bearing_deg` and `other:geo:rel_bearing_deg` each
178
+ in [0°, 11.25°] ∪ [348.75°, 360°).
179
+
180
+ - **Both bearings, not one.** 14(b)'s lights limb is a statement about the
181
+ *other* vessel's aspect; one bearing alone swallows part of the crossing
182
+ sector.
183
+ - **Undetermined term.** "Ahead or nearly ahead" has no angle;
184
+ `situation.constants.head_on_half_angle_deg` pencils 11.25° (one compass
185
+ point; 13(b)'s 22.5° is two), wider than the usual 5°–6° because 14(c) errs
186
+ that way.
187
+ - **Not formalised.** The night and day observation limbs are stated as the
188
+ geometry they encode; a vessel that cannot see the lights has 14(c).
189
+ - Entries: `14b`. Settled by `INV-13b`'s partition sweep plus a decision on the
190
+ constant.
191
+
192
+ ### INV-14a — both vessels alter to starboard
193
+
194
+ `14(a)` · conduct · temporal, a trace segment · `✎`
195
+
196
+ **Invariant.** From the first state at which a head-on situation is deemed
197
+ under `INV-14b`, each vessel shall alter her course to starboard so that each
198
+ passes on the port side of the other. Neither is directed to keep out of the
199
+ way; both are directed to act, and the duty is symmetric.
200
+
201
+ - **State remembered.** Each vessel's heading when the situation was first
202
+ deemed, and the sign of the alteration, observable only across states. 8(b)'s
203
+ "readily apparent" gives no magnitude; the sign and outcome (starboard,
204
+ port-to-port) are fixed.
205
+ - **Why it matters formally.** The one Section II encounter with no `stand-on`
206
+ vessel, and why `INV-17a1-scope` has content.
207
+ - Entries: none; `conduct`, in `known_omissions`, no conduct shape (`Q-45`);
208
+ `14a` is retired in `data/deprecated-identifiers.json`. Settled by the first
209
+ conduct monitor.
210
+
211
+ ---
212
+
213
+ # Rule 15 — Crossing situation
214
+
215
+ ### INV-15a-crossing — the crossing classification is the residual
216
+
217
+ `15(a)` · classification · single-state · `✎`
218
+
219
+ **Invariant.** At any state at which two power-driven vessels are in sight,
220
+ both underway, with risk of collision, and neither latched under `INV-13d`, the
221
+ encounter type is `crossing` exactly when it is neither `overtaking` under
222
+ `INV-13b` nor `head-on` under `INV-14b`.
223
+
224
+ - **Derived, not enumerated.** Enumerating the sector gives two statements of
225
+ one boundary, and the partition's only failure mode is editing one;
226
+ `REQ-CAT-9` requires this of the data, this of any formalisation. The
227
+ partition property is `INV-PB-partition`.
228
+ - **Known incompleteness.** Two sailing vessels get no encounter type (Rules 14
229
+ and 15 are gated on power, Rule 12 has no deeming paragraph): the Rules'. A
230
+ pair with the history fact absent gets none: the model's (`Q-43`).
231
+ - Entries: `15a-crossing`.
232
+
233
+ ### INV-15a-give-way — the vessel with the other to starboard gives way
234
+
235
+ `15(a)` · precedence · single-state · `✎`
236
+
237
+ **Invariant.** At every state at which the encounter type is `crossing`, the
238
+ vessel which has the other on her own starboard side holds `give-way` and the
239
+ other holds `stand-on`.
240
+
241
+ - **Undetermined term.** "On her own starboard side" has no sector in the
242
+ paragraph; the data reads `own:geo:rel_bearing_deg` in (0°, 112.5°], its upper
243
+ edge 13(b)'s constant, so it is checkable against the partition.
244
+ - Entries: `15a-give-way`, plus six `rel:overrides` from Rule 18 entries, since
245
+ Rule 18's chapeau excepts Rules 9, 10 and 13 and no others.
246
+
247
+ ### INV-15a-single — at most one give-way vessel in a crossing
248
+
249
+ `15(a)` · precedence, derived · single-state · `✎`, asserted over steady
250
+ bearings only
251
+
252
+ **Invariant.** No state assigns `give-way` to both vessels of a crossing pair
253
+ under `INV-15a-give-way`.
254
+
255
+ - **Why it is not free.** Both-starboard is a consistent *record* and an
256
+ impossible *situation* on a steady bearing: own's speed times the sine of her
257
+ relative bearing equals minus other's speed times the sine of the aspect, so
258
+ the bearings lie on opposite sides. A theorem at zero bearing rate, an
259
+ observation elsewhere.
260
+ - **Where it fails.** Non-zero bearing rate: 7(d)(i)'s pencilled 1°/min deems
261
+ risk of collision on a slow, close starboard-to-starboard passing just outside
262
+ the head-on cone, and both are give-way. 14(c)'s doubt case; `Q-41`.
263
+ - Entries: none; `REQ-VERIFY-8`'s steady-bearing sweep, both-starboard pinned as
264
+ rejected.
265
+
266
+ ### INV-15a-not-ahead — avoid crossing ahead
267
+
268
+ `15(a)` second limb · conduct · temporal, a trace segment · `✎`
269
+
270
+ **Invariant.** The give-way vessel of a crossing shall, if the circumstances of
271
+ the case admit, avoid crossing ahead of the stand-on vessel: from the state at
272
+ which the role attached to the state at which the two are past and clear, her
273
+ track does not pass through the region ahead of the stand-on vessel's
274
+ advancing position.
275
+
276
+ - **State remembered.** The stand-on vessel's positions and headings over the
277
+ segment ("ahead of" a moving vessel), and the state the role attached.
278
+ - **Undetermined term.** "If the circumstances of the case admit" has nowhere to
279
+ live — `modality` is one closed value, an action has no `effect` — `Q-31`.
280
+ - Entries: none; a `gap` on `15a-give-way`.
281
+
282
+ ---
283
+
284
+ # Rule 16 — Action by the give-way vessel
285
+
286
+ ### INV-16 — early and substantial action to keep well clear
287
+
288
+ `16` · conduct · temporal, a trace segment · `✎`
289
+
290
+ **Invariant.** From the state at which a vessel takes `give-way` in a pair,
291
+ she shall, so far as possible, take early and substantial action to keep well
292
+ clear of the other vessel.
293
+
294
+ - **State remembered.** The state the role attached with course and speed there,
295
+ and every later course and speed. "Early" bounds elapsed time to the action,
296
+ "substantial" the magnitude of the change, "well clear" the separation.
297
+ - **Undetermined terms — all three.** No number for any; 8(b)'s "readily
298
+ apparent" is nearest to *substantial* and is a judgement. Parameterise all
299
+ three and report sensitivity, or check only the qualitative form (an action in
300
+ the direction that increases separation). The separation is `Q-17`'s *d*,
301
+ `colregs-engine`'s to fix.
302
+ - Entries: none; `conduct`.
303
+
304
+ ### INV-16-scope — Rule 16 attaches to the role, not the rule that assigned it
305
+
306
+ `16` · conduct, derived · `✎`
307
+
308
+ **Invariant.** `INV-16` binds any vessel holding `give-way`, whichever norm
309
+ assigned it — 13(a), 15(a), 12(a), or any limb of 18(a)–(c): "every vessel
310
+ which is directed to keep out of the way" is another norm's *output*, not a
311
+ fact.
312
+
313
+ - **Why separate.** The precedence–conduct join, `Q-35`'s shape (a norm reading
314
+ a norm's effect): two evaluation passes or effect-reading predicates. Also why
315
+ `give-way` is one role and not four.
316
+ - **Not covered.** `shall-not-impede` (8(f)(i) binds her, more weakly) and
317
+ `keep-clear` (18(e), 18(f)(i)); the three non-`none` roles are three duties.
318
+
319
+ ---
320
+
321
+ # Rule 17 — Action by the stand-on vessel
322
+
323
+ The obligation changes in stages with different modalities; each is stated
324
+ separately so a formalisation must make the ordering explicit.
325
+
326
+ ### INV-17a1-scope — Rule 17 needs exactly one give-way vessel
327
+
328
+ `17(a)(i)` · precedence, derived · single-state · `✎`, a derivation, not a
329
+ citation
330
+
331
+ **Invariant.** Rule 17 binds a pair at a state only where one vessel is
332
+ directed to keep out of the way of the other and the other is not. Where
333
+ neither is, or both are, Rule 17 has no subject and neither holds `stand-on`.
334
+
335
+ - **The derivation.** "Where one of two vessels is to keep out of the way" fails
336
+ on a pair in which both are directed to act. Rule 14 directs both to alter and
337
+ does not say "keep out of the way" of either, so Rules 16 and 17 are not
338
+ engaged by Rule 14 alone; likewise Rule 19, `INV-19a-noroles`.
339
+ - **Why stated.** A formalisation assigning `stand-on` as `give-way`'s
340
+ complement assigns it in a head-on situation, where no paragraph does;
341
+ `REQ-CAT-8`'s constraint exists for this.
342
+ - Settled by the maintainer ratifying or rejecting the derivation; no
343
+ counter-reading is cited.
344
+
345
+ ### INV-17a1 — phase 1: the stand-on vessel keeps her course and speed
346
+
347
+ `17(a)(i)` · conduct · temporal, a trace segment · `✎`
348
+
349
+ **Invariant.** From the state a vessel takes `stand-on` to the earliest state
350
+ at which `INV-17a2-trigger` or `INV-17b`'s condition holds, she shall keep her
351
+ course and speed: at every state her heading and speed through the water are
352
+ those she held when the role attached.
353
+
354
+ - **State remembered.** Heading and speed at attachment, for the segment — the
355
+ reference the Rules never name.
356
+ - **Reading in doubt.** The baseline: `Q-57`.
357
+ - **Not stated.** Through the water or over the ground; the record has
358
+ `kin:sog_kn` and no set or drift (`situation.geometry.consistency`), so a
359
+ formalisation inherits over-the-ground.
360
+ - Entries: none; Rule 17 is `conduct` throughout.
361
+
362
+ ### INV-17a2-trigger — phase 2 begins when non-compliance becomes apparent
363
+
364
+ `17(a)(ii)` · conduct · temporal, a state to the states before it · `✎`
365
+
366
+ **Invariant.** Phase 2 begins, for the stand-on vessel, at the earliest state
367
+ at which it becomes apparent to her that the give-way vessel is not taking
368
+ appropriate action in compliance with these Rules.
369
+
370
+ - **State remembered.** Everything observed of the give-way vessel since the
371
+ role attached — track, course and speed changes, magnitude and direction. "Is
372
+ not taking appropriate action" is about a trace: a vessel not yet altered may
373
+ be about to; one altered the wrong way has already breached.
374
+ - **Undetermined terms — two.** "Appropriate action" is Rule 16 from the other
375
+ side, inheriting `INV-16`'s three terms, with no elapsed time after which
376
+ inaction is non-compliance. "Becomes apparent to her" is epistemic — the
377
+ record has no observation class — 13(c)/14(c)'s wall (`Q-41`) with polarity
378
+ reversed: there absence of knowledge fires a duty, here its arrival fires a
379
+ permission. Three honest options: perfect observation (overstates the
380
+ permission), a free input (understates the constraint), or an observation lag
381
+ parameter. P4.2 must choose and say which.
382
+
383
+ ### INV-17a2-permission — phase 2 is a permission, and is unilateral
384
+
385
+ `17(a)(ii)` · conduct · temporal · `✎`
386
+
387
+ **Invariant.** In phase 2 the stand-on vessel **may** take action to avoid
388
+ collision by her manoeuvre alone. Permissive: an invariant may not require it,
389
+ and a checker flagging a stand-on vessel for holding course in phase 2 is
390
+ wrong. "By her manoeuvre alone" constrains the action: it must avoid collision
391
+ without further action by the give-way vessel.
392
+
393
+ - **Formally.** Reachability over the stand-on vessel's manoeuvring envelope:
394
+ `Safe(s, σ_own, σ_other)` of ADR 0005 §5 with the give-way strategy set
395
+ unconstrained — the first Part B invariant needing `kin:dynamics`.
396
+ - **Reading in doubt.** Suspension or exception: `Q-53`.
397
+
398
+ ### INV-17b — phase 3: the stand-on vessel shall act
399
+
400
+ `17(b)` · conduct · temporal · `✎`
401
+
402
+ **Invariant.** At every state at which the vessel required to keep her course
403
+ and speed finds herself so close that collision cannot be avoided by the action
404
+ of the give-way vessel alone, she **shall** take such action as will best aid
405
+ to avoid collision. Obligation, not permission; 17(a)(i)'s duty is displaced.
406
+
407
+ - **State remembered.** Strictly none (the trigger is the current state and two
408
+ envelopes), but the phase is carried: `INV-17c` scopes on it and `Q-54` asks
409
+ whether it can be left.
410
+ - **Formally.** The dual of `INV-17a2-permission`: *no* give-way action avoids
411
+ collision against the stand-on vessel holding on. Reachability over
412
+ `kin:dynamics`, not geometry; a distance threshold is a substitute, which is
413
+ why P4.4 and P4.5 are necessary.
414
+ - **Undetermined terms.** "From any cause" admits the stand-on vessel's own
415
+ contribution; "best aid to avoid collision" ranks by an undefined objective.
416
+
417
+ ### INV-17c — no turn to port, in phase 2 only
418
+
419
+ `17(c)` · conduct · temporal · `✎`
420
+
421
+ **Invariant.** Where the stand-on vessel and the other are power-driven, the
422
+ encounter is a crossing, and the action is taken in phase 2 — in accordance
423
+ with 17(a)(ii) — she shall, if the circumstances of the case admit, not alter
424
+ course to port for a vessel on her own port side.
425
+
426
+ - **All four conditions are load-bearing.** 17(c) names 17(a)(ii), not 17(b), so
427
+ it does not constrain phase 3: a vessel at 17(b) may alter to port for a
428
+ vessel on her port side if that best aids. Whether the Rules intend that is
429
+ not answered here; applying 17(c) to all stand-on action states what the
430
+ paragraph does not.
431
+ - **State remembered.** Which phase the action was taken in; the phase is
432
+ carried state, not only a derived label.
433
+
434
+ ### INV-17d — Rule 17 never relieves the give-way vessel
435
+
436
+ `17(d)` · precedence · temporal · `✎`
437
+
438
+ **Invariant.** At every state of an encounter in which one vessel holds
439
+ `give-way`, she holds it, with `INV-16` in force, regardless of the stand-on
440
+ vessel's phase or action; phase 2 and 3 action does not transfer, share or
441
+ discharge her obligation.
442
+
443
+ - **Why separate.** The natural automaton takes the give-way duty as an input to
444
+ its transitions; 17(d) says the arrow does not run back, so model two
445
+ obligations holding concurrently, not one machine with one obligation.
446
+ - Entries: none; nearest is 8(f)(ii)'s parallel for `shall-not-impede`, `8f3`.
447
+
448
+ ### INV-17-phases — the phase structure
449
+
450
+ `17(a)(i)`, `17(a)(ii)`, `17(b)` · conduct, derived · temporal · `✎`
451
+
452
+ **Invariant.** For a pair under Rule 17 (`INV-17a1-scope`), the stand-on vessel
453
+ is at each state in exactly one of three phases:
454
+
455
+ | phase | condition | modality on the stand-on vessel |
456
+ |---|---|---|
457
+ | 1 | neither of the below | **shall** keep course and speed (`INV-17a1`) |
458
+ | 2 | non-compliance apparent (`INV-17a2-trigger`), not yet phase 3 | **may** act, by her manoeuvre alone (`INV-17a2-permission`), subject to `INV-17c` |
459
+ | 3 | collision cannot be avoided by the give-way vessel alone (`INV-17b`) | **shall** act as will best aid to avoid collision |
460
+
461
+ Phase 3 dominates phase 2: an obligation is not qualified by a permission.
462
+
463
+ - **Reading in doubt.** Monotone or not: `Q-54`.
464
+ - **State remembered.** If monotone, one three-valued latch per stand-on vessel
465
+ per encounter; if not, no latch but `INV-17c` still needs the phase of each
466
+ action. TLC distinguishes them: under monotone a late-complying give-way
467
+ vessel still leaves stand-on action permitted; under reversible it does not.
468
+
469
+ ---
470
+
471
+ # Rule 18 — Responsibilities between vessels
472
+
473
+ The *shape* of the order is stated, not its eleven limbs: the shape is what a
474
+ formalisation gets wrong.
475
+
476
+ ### INV-18-except — Rule 18 yields to Rules 9, 10 and 13, and to nothing else
477
+
478
+ `18` chapeau · precedence · single-state · `✎`
479
+
480
+ **Invariant.** Every role Rule 18 assigns is displaced by a role Rules 9, 10 or
481
+ 13 assigns to the same pair at the same state, and by no other rule. Rule 18's
482
+ roles are *not* subordinate to Rules 12, 14 or 15: where both speak, Rule 18
483
+ governs.
484
+
485
+ - **Why both directions.** "To nothing else" is what runs the `rel:overrides`
486
+ edges from Rule 18 *to* Rules 12 and 15; got wrong once, found by a sweep
487
+ (`Q-40`).
488
+ - Entries: overrides on `13a` against all Rule 18 and Rule 12 entries; on
489
+ `18a1`–`18a3`, `18c1`–`18c2`, `18f1` against `15a-give-way`; on the Rule 18
490
+ entries that can meet two sailing vessels against `12a1`–`12a3`; a derived
491
+ check asserts the hand-list of six against Rule 15 is complete.
492
+
493
+ ### INV-18-order — the rank order
494
+
495
+ `18(a)`, `18(a)(i)–(iv)`, `18(b)`, `18(b)(i)–(iii)`, `18(c)`, `18(c)(i)–(ii)` ·
496
+ precedence · single-state · `✎`
497
+
498
+ **Invariant.** At every state at which the two vessels are in sight and both
499
+ underway, subject to `INV-18-except`:
500
+
501
+ | subject | keeps out of the way of | cite |
502
+ |---|---|---|
503
+ | a power-driven vessel | a vessel not under command; a vessel restricted in her ability to manoeuvre; a vessel engaged in fishing; a sailing vessel | 18(a)(i)–(iv) |
504
+ | a sailing vessel | a vessel not under command; a vessel restricted in her ability to manoeuvre; a vessel engaged in fishing | 18(b)(i)–(iii) |
505
+ | a vessel engaged in fishing when underway | a vessel not under command; a vessel restricted in her ability to manoeuvre | 18(c)(i)–(ii) |
506
+
507
+ The subject holds `give-way`; the object `stand-on`.
508
+
509
+ - **The classes.** 3(b), 3(c) and the rest of Rule 3; `fact:rule18_class`
510
+ (`Q-32`) is the model's decode onto these ranks. A vessel constrained by her
511
+ draught is a power-driven vessel for 18(a) and is ranked by it.
512
+ - **Not stated by Rule 18.** Risk of collision and encounter type: `Q-50`.
513
+ - Entries: `18a1`–`18a4`, `18b1`–`18b3`, `18c1`–`18c2`.
514
+
515
+ ### INV-18-partial — the order is partial, and the gaps are the Rules'
516
+
517
+ `18(a)–(c)` · precedence, derived · single-state · `✎`
518
+
519
+ **Invariant.** `INV-18-order` is a strict partial order, not total: it does not
520
+ order a vessel not under command against one restricted in her ability to
521
+ manoeuvre (neither paragraph names the other), nor two vessels of the same
522
+ rank. Such a pair gets no role from Rule 18; outside Rules 12–15 too, no
523
+ Section II norm assigns one, and a formalisation must be able to say so.
524
+
525
+ - **What it leaves.** Inside Rule 12 or 15 — two fishing vessels under power, or
526
+ a vessel not under command crossing one restricted in her ability to
527
+ manoeuvre, under power — the crossing or sailing rule lays a helm duty on a
528
+ vessel that may be unable to discharge it: Rule 2's region (ADR 0005 §5),
529
+ recorded, not gated (`Q-40`).
530
+ - Entries: none; the steady-bearing and sailing-fleet sweeps ("never both
531
+ give-way, never both stand-on, no two helm roles after resolution").
532
+
533
+ ### INV-18c-practicable — 18(c)'s qualification is on the duty, not the rank
534
+
535
+ `18(c)` · precedence · `✎`
536
+
537
+ **Invariant.** "So far as possible" qualifies the fishing vessel's performance
538
+ of the duty, not whether it attaches: she holds `give-way` against a vessel
539
+ not under command or one restricted in her ability to manoeuvre at every state
540
+ `INV-18-order` reaches the pair, and the qualification bears on what
541
+ discharging `INV-16` requires of her.
542
+
543
+ - **Why stated.** Read as a condition on the antecedent, it gives a roleless
544
+ pair exactly when compliance is hard and the roles matter.
545
+ - Entries: `18c1`, `18c2`, modality `shall-if-practicable` with effect
546
+ `give-way`/`stand-on` — `Q-31`'s shape, resolved only because the duty is a
547
+ role.
548
+
549
+ ### INV-18d1 — the constrained-by-draught duty confers nothing
550
+
551
+ `18(d)(i)` with 8(f)(iii) · precedence · single-state · `✎`
552
+
553
+ **Invariant.** At every state at which a vessel other than one not under
554
+ command or restricted in her ability to manoeuvre is in sight of, and underway
555
+ with, a vessel constrained by her draught exhibiting the signals in Rule 28,
556
+ the first holds `shall-not-impede` and shall, if the circumstances of the case
557
+ admit, avoid impeding her safe passage. The vessel constrained by her draught
558
+ holds `none` — not `stand-on`; approaching so as to involve risk of collision
559
+ she remains fully obliged under Rules 4–19 (8(f)(iii)), and the impeding vessel
560
+ is not relieved (8(f)(ii)).
561
+
562
+ - **Why `none`.** Read as a give-way role, `shall-not-impede` would give the
563
+ protected vessel a Rule 17 duty no paragraph confers — 8(f)(iii)'s content,
564
+ and why `none` is explicit.
565
+ - **Undetermined term.** "Exhibiting the signals in Rule 28" is a
566
+ display-compliance fact `18d1` does not read; the entry is wider (`Q-34`).
567
+ - Entries: `18d1`, `8f3`.
568
+
569
+ ### INV-18f1 — the WIG craft keeps well clear
570
+
571
+ `18(f)(i)` · precedence · single-state · `✎`
572
+
573
+ **Invariant.** At every state at which a WIG craft is taking off, landing, or
574
+ in flight near the surface, she holds `keep-clear` with respect to every other
575
+ vessel — keeps well clear and avoids impeding their navigation — and the other
576
+ holds `none`. `keep-clear` is outside the give-way/stand-on pairing and Rule 16.
577
+
578
+ - Entries: `18f1`.
579
+
580
+ ---
581
+
582
+ # Rule 19 — Conduct of vessels in restricted visibility
583
+
584
+ A **ruleset switch**, not an encounter type: for a pair it reaches it replaces
585
+ Section II entirely, and give-way and stand-on do not apply.
586
+
587
+ ### INV-19a-scope — the ruleset switch
588
+
589
+ `19(a)` with 11 and 4 · scope · single-state · `✎`
590
+
591
+ **Invariant.** At every state, for every pair: Section I (Rules 4–10) applies
592
+ in any condition of visibility (Rule 4); Section II (Rules 11–18) applies
593
+ exactly when the two are in sight of one another, by 3(k) when one can be
594
+ observed visually from the other (Rule 11); Rule 19 applies exactly when they
595
+ are **not** in sight **and** are navigating in or near an area of restricted
596
+ visibility (19(a)). II and III are mutually exclusive by the in-sight test and
597
+ not jointly exhaustive (`INV-19a-third-state`); Rule 19 supplements Section I
598
+ (19(c): "when complying with Rules 4-10").
599
+
600
+ - **Temporal note.** The switch is a function of the current state; a pair may
601
+ cross it and back inside one encounter, and no paragraph says what becomes of
602
+ a 13(d) latch or a Rule 17 phase: `Q-55`.
603
+ - **Undetermined term.** "In or near an area of restricted visibility" has no
604
+ fact (3(l)'s atmospheric condition is nowhere in `data/facts.json`), so `19a`
605
+ selects Section III for any pair not in sight — wider — and records a gap.
606
+ - Entries: `11`, `19a`, complementary on `pair:geo:in_sight`.
607
+
608
+ ### INV-19a-noroles — Section III has no give-way and no stand-on vessel
609
+
610
+ `19(a)` with 11 · precedence, derived · single-state · `✎`
611
+
612
+ **Invariant.** Where Rule 19 applies, neither vessel holds `give-way` or
613
+ `stand-on`; Rules 16 and 17 have no subject. Every Rule 19 duty falls on both
614
+ symmetrically and independently: each acts on her own appraisal, neither may
615
+ expect the other to hold her course, and no rule allocates the manoeuvre.
616
+
617
+ - **Consequence.** A role variable must hold "no role" distinguishably from "no
618
+ encounter" — `Q-43`'s distinction from a second direction, for
619
+ `colregs-engine`'s status alphabet.
620
+ - Entries: none produce a role under `in_sight: false`; every Section II
621
+ `precedence` entry gates on `in_sight: true`. By construction, not asserted.
622
+
623
+ ### INV-19a-third-state — not in sight, and not in restricted visibility
624
+
625
+ `19(a)` with 11 and 4 · scope, derived · single-state · `✎`, states a gap and
626
+ does not close it
627
+
628
+ **Invariant.** There are states at which two vessels are not in sight and not
629
+ in or near restricted visibility — beyond visual range in clear weather, or
630
+ aware of each other by radar or AIS alone on a clear night. There Rule 11
631
+ excludes Section II, 19(a) excludes Rule 19, and only Section I governs.
632
+
633
+ - **Why written down.** A hole forced by both scope paragraphs, which "not
634
+ Section II, so Section III" will not have. The model closes it by dropping
635
+ 19(a)'s second conjunct — a decision, not a reading: `Q-56`.
636
+ - Entries: `19a`'s `gap`.
637
+
638
+ ### INV-19b — safe speed, and engines ready
639
+
640
+ `19(b)` · conduct · first limb single-state, second a property of the
641
+ machinery · `✎`
642
+
643
+ **Invariant.** At every state at which Rule 19 applies, every vessel proceeds
644
+ at a safe speed adapted to the prevailing circumstances and conditions of
645
+ restricted visibility, and a power-driven vessel has her engines ready for
646
+ immediate manoeuvre.
647
+
648
+ - **Undetermined term.** "Safe speed" is Rule 6: factors, no number.
649
+ Formalisable without inventing one: the *comparison* — safe speed under Rule
650
+ 19 is not greater than in the same geometry in clear visibility, since 19(b)
651
+ adds to Rule 6's list and removes nothing. Assert the monotonicity, decline
652
+ the value.
653
+ - **Not formalisable from the record.** "Engines ready" is a fact about the
654
+ machinery, in neither the fact record nor `kin`, and of no pair.
655
+
656
+ ### INV-19c — due regard when complying with Rules 4–10
657
+
658
+ `19(c)` · conduct · `✎`
659
+
660
+ **Invariant.** At every state at which Rule 19 applies, every vessel has due
661
+ regard to the prevailing circumstances and conditions of restricted visibility
662
+ when complying with Rules 4 to 10.
663
+
664
+ - **Undetermined modality.** "Shall have due regard to" is neither obligation
665
+ nor permission but a manner of complying with other rules; no modality value
666
+ (7(d)(ii)'s obstacle, `Q-42`). Covered, not checkable.
667
+
668
+ ### INV-19d-determine — the radar-alone determination
669
+
670
+ `19(d)` first sentence · conduct · temporal, discharged over a segment · `✎`
671
+
672
+ **Invariant.** At every state at which Rule 19 applies and a vessel has
673
+ detected another **by radar alone**, she shall determine whether a
674
+ close-quarters situation is developing and whether risk of collision exists.
675
+
676
+ - **State remembered.** "Developing" needs the ranges and bearings since
677
+ detection; 7(b)'s "radar plotting or equivalent systematic observation" is the
678
+ operation, `kin:position` cited to it.
679
+ - **The antecedent.** "By radar alone" restricts: a vessel with a fog signal and
680
+ no radar contact is under 19(e), not 19(d), so the means of detection must be
681
+ carried, and the record has no observation class.
682
+ - **Undetermined term.** "Close-quarters situation": undefined, no distance.
683
+
684
+ ### INV-19d-action — avoiding action in ample time
685
+
686
+ `19(d)` second sentence · conduct · temporal · `✎`
687
+
688
+ **Invariant.** Where `INV-19d-determine` finds a close-quarters situation
689
+ developing, or risk of collision, or both, the vessel shall take avoiding
690
+ action in ample time.
691
+
692
+ - **State remembered.** The state at which the determination was or should have
693
+ been made ("ample time" runs from it), and course and speed there.
694
+ - **Undetermined term.** "Ample time" has no figure; P4.4's timed model against
695
+ `kin:dynamics`' stopping distance and turning circle computes it, which is
696
+ better than choosing it.
697
+
698
+ ### INV-19d1 — no alteration to port for a vessel forward of the beam
699
+
700
+ `19(d)(i)` · conduct · temporal · `✎`
701
+
702
+ **Invariant.** Where `INV-19d-action`'s action is an alteration of course,
703
+ then so far as possible the vessel shall not alter course to port for a vessel
704
+ forward of her beam — `own:geo:rel_bearing_deg` in (270°, 360°) ∪ [0°, 90°) —
705
+ other than for a vessel being overtaken.
706
+
707
+ - **The exception reaches across the switch.** "A vessel being overtaken" is
708
+ Rule 13's classification inside Section III, where Rule 13 does not apply: the
709
+ classification layer cannot be gated on `pair:geo:in_sight` if 19(d)(i) is to
710
+ be expressible. The entries today are so gated.
711
+ - **Undetermined term.** "So far as possible": `Q-31` again.
712
+
713
+ ### INV-19d2 — no alteration toward a vessel abeam or abaft the beam
714
+
715
+ `19(d)(ii)` · conduct · temporal · `✎`
716
+
717
+ **Invariant.** Where `INV-19d-action`'s action is an alteration of course,
718
+ then so far as possible the vessel shall not alter course toward a vessel
719
+ abeam or abaft her beam — `own:geo:rel_bearing_deg` in [90°, 270°].
720
+
721
+ - **"Toward"** is the sign of the alteration against the other's bearing, not
722
+ the resulting heading: toward when it reduces her relative bearing off the bow
723
+ on the side she lies. The resulting-heading form is wrong for a vessel nearly
724
+ astern.
725
+
726
+ ### INV-19e — reduce to steerage way
727
+
728
+ `19(e)` · conduct · temporal · `✎`
729
+
730
+ **Invariant.** At every state at which Rule 19 applies and a vessel either
731
+ hears, apparently forward of her beam, the fog signal of another vessel, or
732
+ cannot avoid a close-quarters situation with another vessel forward of her
733
+ beam, she shall — except where it has been determined that risk of collision
734
+ does not exist — reduce her speed to the minimum at which she can be kept on
735
+ her course; shall if necessary take all her way off; and shall in any event
736
+ navigate with extreme caution until danger of collision is over.
737
+
738
+ - **State remembered.** The segment ends "until danger of collision is over", so
739
+ both bounds are undefined; the exception clause carries `INV-19d-determine`'s
740
+ determination forward, state a monitor holds, not recomputes.
741
+ - **Its subject is not a pair.** A fog signal's source may not be a tracked
742
+ vessel; the record is a record of a *pair*, and 19(e) is the clearest Part B
743
+ paragraph that does not fit it — an observation class or an "unidentified
744
+ contact" subject is needed. Recorded, not resolved.
745
+ - **Undetermined terms.** "Apparently forward of her beam" (an observation of
746
+ unstated accuracy), "close-quarters situation", "the minimum at which she can
747
+ be kept on her course", "extreme caution", "until danger of collision is over"
748
+ — five, so this states the paragraph and formalises none.
749
+
750
+ ---
751
+
752
+ # Cross-rule invariants
753
+
754
+ Asserted by a checker over the whole of Section II; derived, stated by no
755
+ paragraph of its own.
756
+
757
+ ### INV-PB-roles-exclusive — never both give-way, never both stand-on
758
+
759
+ `13(a)`, `15(a)`, `12(a)`, `18(a)–(c)` with 18's chapeau · precedence, derived
760
+ · single-state · `✎`, asserted over consistent steady bearings only
761
+ (`REQ-VERIFY-8`)
762
+
763
+ **Invariant.** At every state, after every `rel:overrides` is applied, no pair
764
+ holds `give-way` on both subjects, and none holds `stand-on` on both.
765
+
766
+ - **Known exception, pinned.** Not a theorem at non-zero bearing rate:
767
+ `INV-15a-single`.
768
+ - Entries: none; the sailing-fleet and power-fleet sweeps in
769
+ `test/data.test.mjs`, where removing any of the six Rule 18 → Rule 15
770
+ overrides fails the sweep.
771
+
772
+ ### INV-PB-partition — exactly one encounter type
773
+
774
+ `13(b)`, `13(d)`, `14(b)`, `15(a)` · classification, derived · single-state ·
775
+ `✎`
776
+
777
+ **Invariant.** For any pair the three deeming tests all reach, exactly one of
778
+ `overtaking`, `head-on` and `crossing` holds — never two, never none.
779
+ `REQ-CAT-9`'s partition as an invariant; the natural first Alloy invariant for
780
+ P2.2.
781
+
782
+ - **What "all reach" excludes.** Two sailing vessels, no risk of collision, not
783
+ in sight (the Rules); `hist:was_overtaking` absent (the model, `Q-43`).
784
+
785
+ ### INV-PB-one-role-source — a vessel holds one helm role at a time
786
+
787
+ `13(a)`, `18` chapeau, with 16 and 17 · precedence, derived · single-state · `✎`
788
+
789
+ **Invariant.** After every `rel:overrides` is applied, no vessel holds both
790
+ `give-way` and `stand-on` with respect to the same other vessel at the same
791
+ state.
792
+
793
+ - **Known exception, recorded as a finding.** A sailing vessel meeting a vessel
794
+ constrained by her draught holds `stand-on` (18(a)(iv)) and `shall-not-impede`
795
+ (18(d)(i)) at once; not two helm roles, so the invariant survives, and the
796
+ pairing is pinned as `Q-36`, not overridden.
797
+
798
+ ---
799
+
800
+ ## Not formalised here
801
+
802
+ Goal 4 of the epic is legal traceability: a paragraph with a switchable effect
803
+ is either covered or explicitly excluded, and an unmentioned paragraph is a
804
+ hole. Every `data/rules.json` path in 13–19 appears exactly once below;
805
+ `REQ-INV-3`'s test enforces it.
806
+
807
+ ### Coverage
808
+
809
+ | paragraph | disposition |
810
+ |---|---|
811
+ | 13(a) | `INV-13a` |
812
+ | 13(b) | `INV-13b`, `INV-13b-pair` |
813
+ | 13(c) | **not formalised** — doubt |
814
+ | 13(d) | `INV-13d`, `INV-13d-duty` |
815
+ | 14(a) | `INV-14a` |
816
+ | 14(b) | `INV-14b` |
817
+ | 14(c) | **not formalised** — doubt |
818
+ | 15(a) | `INV-15a-crossing`, `INV-15a-give-way`, `INV-15a-single`, `INV-15a-not-ahead` |
819
+ | 16 | `INV-16`, `INV-16-scope` |
820
+ | 17(a)(i) | `INV-17a1-scope`, `INV-17a1`, `INV-17-phases` |
821
+ | 17(a)(ii) | `INV-17a2-trigger`, `INV-17a2-permission` |
822
+ | 17(b) | `INV-17b` |
823
+ | 17(c) | `INV-17c` |
824
+ | 17(d) | `INV-17d` |
825
+ | 18 (chapeau) | `INV-18-except` |
826
+ | 18(a) (chapeau) | `INV-18-order`, `INV-18-partial` — read with 18(a)(i)–(iv) |
827
+ | 18(a)(i) | `INV-18-order` |
828
+ | 18(a)(ii) | `INV-18-order` |
829
+ | 18(a)(iii) | `INV-18-order` |
830
+ | 18(a)(iv) | `INV-18-order` |
831
+ | 18(b) (chapeau) | `INV-18-order` — read with 18(b)(i)–(iii) |
832
+ | 18(b)(i) | `INV-18-order` |
833
+ | 18(b)(ii) | `INV-18-order` |
834
+ | 18(b)(iii) | `INV-18-order` |
835
+ | 18(c) (chapeau) | `INV-18-order`, `INV-18c-practicable` |
836
+ | 18(c)(i) | `INV-18-order` |
837
+ | 18(c)(ii) | `INV-18-order` |
838
+ | 18(d)(i) | `INV-18d1` |
839
+ | 18(d)(ii) | **not formalised** — conduct, no shape |
840
+ | 18(e) | **not formalised** — no seaplane fact |
841
+ | 18(f)(i) | `INV-18f1` |
842
+ | 18(f)(ii) | **not formalised** — a decode statement |
843
+ | 19(a) | `INV-19a-scope`, `INV-19a-noroles`, `INV-19a-third-state` |
844
+ | 19(b) | `INV-19b` |
845
+ | 19(c) | `INV-19c` |
846
+ | 19(d) | `INV-19d-determine`, `INV-19d-action` |
847
+ | 19(d)(i) | `INV-19d1` |
848
+ | 19(d)(ii) | `INV-19d2` |
849
+ | 19(e) | `INV-19e` |
850
+
851
+ Thirty-nine paths; thirty-four covered, five excluded. Forty invariants, the
852
+ three `INV-PB-` ones cross-rule and against no single paragraph.
853
+
854
+ ### Excluded paragraphs, with reasons
855
+
856
+ - **13(c)** and **14(c)** — a duty firing on the *absence* of knowledge; it
857
+ needs a `doubt` boolean (a reported mental state) or reads an absent fact as
858
+ an assertion, reversing the predicate language's one firm commitment
859
+ (`Q-33`). In `known_omissions`; `Q-41`. These two make the Rules' errors
860
+ *conservative*, so excluding them makes any conclusion drawn here less
861
+ cautious than the Rules — the direction an exclusion must not be silent about.
862
+ - **18(d)(ii)** — "particular caution having full regard to her special
863
+ condition": conduct, undefined standard, no counterparty; `known_omissions`.
864
+ - **18(e)** — no seaplane fact: `fact:propulsion` has power, sail and oars, and
865
+ 3(a) makes a seaplane a vessel with nowhere to say so; `keep-clear` exists,
866
+ the predicate does not. In `known_omissions`.
867
+ - **18(f)(ii)** — a WIG on the surface "as a power-driven vessel" is a decode
868
+ onto `propulsion:power`, not a norm about a pair. In `known_omissions`;
869
+ 18(f)(i) is `INV-18f1`.
870
+
871
+ ### Terms named inside a covered invariant and not formalised
872
+
873
+ Listed so that "covered" is not read as "checkable"; each is a term the Rules
874
+ use and do not define.
875
+
876
+ | term | paragraph | invariant |
877
+ |---|---|---|
878
+ | "coming up with" (a speed comparison) | 13(b) | `INV-13b` |
879
+ | "finally past and clear" | 13(d) | `INV-13d` |
880
+ | "ahead or nearly ahead" (an angle) | 14(b) | `INV-14b` |
881
+ | the night and day observation limbs | 14(b) | `INV-14b` |
882
+ | "on her own starboard side" (a sector) | 15(a) | `INV-15a-give-way` |
883
+ | "if the circumstances of the case admit" | 15(a), 17(c), 18(d)(i) | `INV-15a-not-ahead`, `INV-17c`, `INV-18d1` |
884
+ | "early", "substantial", "well clear" | 16 | `INV-16` |
885
+ | the baseline for "course and speed" | 17(a)(i) | `INV-17a1` |
886
+ | "becomes apparent to her" (epistemic) | 17(a)(ii) | `INV-17a2-trigger` |
887
+ | "appropriate action" | 17(a)(ii) | `INV-17a2-trigger` |
888
+ | "so close that collision cannot be avoided" | 17(b) | `INV-17b` |
889
+ | "such action as will best aid to avoid collision" | 17(b) | `INV-17b` |
890
+ | "exhibiting the signals in Rule 28" | 18(d)(i) | `INV-18d1` |
891
+ | "in or near an area of restricted visibility" | 19(a) | `INV-19a-scope` |
892
+ | "safe speed"; "engines ready for immediate manoeuvre" | 19(b) | `INV-19b` |
893
+ | "due regard to" (a modality) | 19(c) | `INV-19c` |
894
+ | "close-quarters situation" | 19(d), 19(e) | `INV-19d-determine`, `INV-19e` |
895
+ | "ample time" | 19(d) | `INV-19d-action` |
896
+ | "so far as possible" | 16, 19(d)(i), 19(d)(ii) | `INV-16`, `INV-19d1`, `INV-19d2` |
897
+ | "apparently forward of her beam"; "the minimum at which she can be kept on her course"; "extreme caution"; "until danger of collision is over" | 19(e) | `INV-19e` |
898
+
899
+ Three have a `situation.constants` stand-in: the overtaking sector's edges
900
+ (ink, from 13(b)), the head-on half-angle (pencil), 7(d)(i)'s appreciable
901
+ bearing change (pencil). The rest have none: parameterise and report
902
+ sensitivity, or check only qualitatively.
903
+
904
+ ### Rules outside 13–19 that these invariants read
905
+
906
+ Not excluded, and not this file's to state: Rule 3 (3(b), 3(c), 3(k)), Rule 4
907
+ (Section I's scope), Rule 5, Rule 6 (safe speed), Rule 7 (risk of collision),
908
+ Rule 8 and particularly 8(b) and 8(f), Rules 9 and 10 (excepted by Rule 18's
909
+ chapeau), Rule 11 (Section II's scope), Rule 12 (two sailing vessels), Rule
910
+ 21(c) (the sternlight arc, 13(b)'s sector).
911
+
912
+ Rule 2 is absent from every invariant: ADR 0005 §5 makes it a region computed
913
+ offline, a compliance invariant citing it would be circular, and pointers into
914
+ that region above are recorded, never gated.
915
+
916
+ ---
917
+
918
+ ## Open questions raised by this file
919
+
920
+ `Q-50`–`Q-57` in `docs/requirements.md` §11, "From the Part B invariants
921
+ (P4.1)": each a place where the text admits two readings and this file declines
922
+ to choose.