colregs 0.2.0 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -7
- package/data/applicability.json +98 -15
- package/data/facts.json +13 -1
- package/data/version.json +3 -0
- package/docs/adr/0007-rule26-overrides-and-aground.md +68 -0
- package/docs/adr/0008-mooring-buoy-modifier.md +87 -0
- package/docs/adr/0009-data-version-stamp.md +47 -0
- package/docs/budgets.json +163 -0
- package/docs/identifiers.md +1 -1
- package/docs/part-b-invariants.md +922 -0
- package/docs/requirements.md +135 -6
- package/fixtures/applicability-fixtures.json +156 -0
- package/fixtures/situation-fixtures.json +70 -0
- package/package.json +1 -1
- package/schema/applicability-fixtures.schema.json +2 -0
- package/schema/version.schema.json +16 -0
|
@@ -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.
|