drogna

A demonstration harness. Every number in it is invented.

ADR 0027 — Version 2 is a client-side rewrite behind a wire-protocol seam

Status: Accepted, 29 August 2026, with the adoption of constitution 2.0.0. The number was assigned at adoption: the two V1 pull requests that each claimed ADR-0027 (#44, #46) closed without merging — their findings were carried into the plan as E-items instead — so 0027 was free on the default branch. Date: 29 August 2026

Context

Version 1 delivered what it set out to prove: seventeen features, all four acceptance criteria passing, the control loop wired live and watched turning. It also accumulated the costs that motivate this record, both named by the author in the planning interviews of 29 August 2026:

  1. Pace, caused by reviewability. The backend is twelve services across Python, SQL, nginx configuration and Compose. Reviewing a change means reasoning across containers, and the traps section of CLAUDE.md is a catalogue of what that surface cost: bind-mount semantics that differ by host OS, health checks naming programs images do not carry, per-image ignore files, TLS interception in build contexts, a broker dying on file ownership only on Linux, a proxy credential fault invisible until the first cleared request in the repository's history. Each lesson was real and each was paid for in time the demonstration did not need to spend.
  2. Divergence. Requirements were identified as understanding grew — the SRD went from four sections to thirteen, 23 specs and 25 ADRs — and the artefact set no longer reads as one coherent system.

A rewrite was therefore considered, with the question being its shape. The plan this record accompanies (docs/v2/plan.md) was developed by structured interview, swept the six open pull requests for emergent requirements, and was endorsed by the author on 29 August 2026.

Decision

Version 2 is a pure client-side TypeScript single-page application. The backend components — clock, generator, broker, sensors, stores, loop, planner, query — are genuine programs running in the browser, separated from the front-end by a wire-protocol seam: HTTP answered by an interception layer with genuine (subsetted) OGC API-EDR and SensorThings JSON, and pub/sub through a broker component with MQTT topic semantics whose wire shape is MQTT-over-WebSocket. Version 3 replaces the in-browser components with a real backend by configuration — a base URL and a broker URL — with the recorded seam-traffic corpus as its conformance suite (AT-05).

The consequential decisions taken with it, each an explicit interview answer recorded in the plan (D1–D17, §9):

Alternatives rejected

Consequences