Proefhaven test scenario — "one afternoon at the lock"
TEST DATA, NOT FOR NAVIGATION. Fictional geometry in open water (~52.00N 4.00E), deliberately overlaying no real port. Companion to ZZASI001_base.gml; poll responses in pollresponses/.
Purpose. A conformance walk, S-164-style: each step states the stream input and the single correct portrayal outcome. A viewer that renders every step correctly has implemented the portrayal guide; steps marked ⊘ MUST also fail/grey exactly as stated — they test the safety rails, which is most of the point.
The scenario runs T0–T9. Each Tn is a complete poll response (whole-state snapshot, per C1 — note that a feature absent from a snapshot has simply not changed; the responses repeat all features for readability).
| T | Event (the story) | Stream change | Correct portrayal |
|---|---|---|---|
| T0 | Quiet afternoon. Everything normal. | all features report; lock=vesselManagement, basin=operational, gates W closed/E open, spans closed, sluice not flowing (fill reports flow, not aperture), berth1 clear, berth2 taken+Bravo, anchor berth reserved, anchorage clear, fairway clear, MTI area operational, crane idle at start pos, ponton operational | lock ○white · basin ○white no » · gate W ○black, gate E ○white · spans ○black · sluice ○black no » · berth1 ○white · berth2 ○black + ⚑B · anchor berth ○orange · anchorage ○white · fairway ○white · crane ○black · ponton ○white · MTI area drawn nowhere |
| T1 | A lockage begins: W gate opens for an inbound vessel. | gate W = moving — no directionSense, a gate's leaf travel has no 2D direction | gate W ○blue, no chevron — blue alone says in transition (PG 5.2.1); everything else as T0 |
| T2 | Chamber filling toward canal level. Meanwhile the fairway reach is declared restricted, on two counts at once. | gate W closed; basin = levelling, sense=2; fairway = restricted plus operationalSubStatus 3 and 4 (depth and speed restricted — the repeatable case) | gate W ○black; basin ○blue + » pointing east (090° = against orientation) — chevron toward the level being made; fairway ○orange, no extra symbol — both restriction kinds appear only on selection (PG 4.3/4.4) |
| T3 | Crane starts a container move: slews out over the water while travelling along the quay. | crane = partsOverWater; position steps 12 m east (outside the 5 m movement buffer) — no movement state and no bearing are sent | crane ○orange + » along the course made good — orange dominates blue, and movement survives on the chevron because the client derives it from position (B2/8.3, PG 5.5) |
| T4 | ⊘ The SCADA link to the sluice dies. No sluice report arrives for > 2× updateInterval. | sluice absent past its declared 300 s | sluice ○grey. NOT red, NOT last-value — a broken sensor cannot close a waterway |
| T5 | ⊘ A corrupt source asserts an illegal value: berth1 reports operationalStatus=14 (waterManagement — not permitted for coa 8). | berth1 = 14 | berth1 ○grey (6.1b service sanity). A viewer that draws blue FAILS this step |
| T6 | The duty officer declares the lock obstructed — floating debris in the approach. | lock = obstructed (human-attributed) | lock ○red; basin, both gates and the lock's span also ○red (R41 · PG 8.1.1), each carrying the duty officer's name and a note that the obstruction was declared on the lock. No chevron on any of them. Bridge + its spans unaffected. Changed 2026-08-09: the components used to grey — which claimed not to know something that had just been declared. |
| T7 | Meanwhile the bridge keeper goes off duty; bridge not in operation. | bridge = notInOperation | bridge ○black; its spans keep their states — opening span ○black, fixed span still absent (8.1: bridge n.i.o. does NOT grey spans) |
| T8 | ⊘ Ponton Bravo breaks its mooring and drifts out of the kadezone. | ponton position outside MTI area polygon — the stream reports it honestly; the containment test is the client's | ponton not drawn at all — not at the drift position (untrusted), and not at its home position either, because the product now holds positive evidence it is not at home (PG 8.4/B3). A drifting object is S-124's business. |
| T9 | Debris cleared; the officer lifts the obstruction. Sluice link restored, spuiing seawards. | lock = vesselManagement (human clears own red); sluice = flowing, sense=1 | lock ○white; children resume live states instantly (no operator ack — 6.2); sluice ○white + » pointing seawards |
| T9b | ⊘ Regression guard: automation attempts to clear a red (replay of T6 state where a machine writes lock=vesselManagement with no human attribution). | write REJECTED at API (R37/R11) | portrayal unchanged — the write never reaches the stream. This step tests the server, not the viewer |
Coverage checklist — every load-bearing rule appears at least once: pure fill function (T0) · moving barrier draws blue with NO chevron (T1) · chevron presence/direction, both senses (T2, T9) · orange dominance (T3) · update-rate grey (T4) · illegal-value grey (T5) · parent propagation, both kinds and now distinguishable — obstructed ⇒ components RED (T6), not-in-operation ⇒ untouched spans (T7) · MTI left-area suppression (T8) · human-only red, set and clear (T6, T9, T9b) · flags essential (T0, berth2 ⚑B persists every step) · exception-only spanFixed (absent T0–T9) · MTI area never drawn (all steps) · operationalSubStatus: flag-drawing values (T0 ⚑B) and non-drawing restriction kinds, repeated on one feature (T2).
Not covered here (needs a second scenario): certificate/edition refusal at the server, service levels and tier suppression, Level 2 suppression of the charted object, two-authority boundary.
© 2026 W.D. de Pooter · Independent marine consultant and developer · fabian@maraton.consulting Licensed under Creative Commons Attribution 4.0 International. SPDX-License-Identifier: CC-BY-4.0