drogna

A demonstration harness. Every number in it is invented.

V1 record — describes retired software; superseded for V2 by srd.md, constitution 2.0.0 and ADR-0027.

ADR-0011: The current-run pointer is a text file, not a symlink

Status: Accepted Date: 26 August 2026 Requirements: SRD FR-21, FR-30, FR-31; C-08, C-09, C-14 Raised by: features 008 and 009 disagreeing, having been built in parallel

Context

docs/architecture/delivery-plan.md put the query layer (008) and the control loop (009) in the same wave, on the reasoning that they are genuinely independent in code: the loop writes the coverage store and the query layer reads it. It named the one thing they share — "the coverage store layout convention, which 008 owns and 009 consumes" — and listed the risk of the two disagreeing, with the mitigation that 008 owns it.

They were built simultaneously and they disagreed about nearly everything: the store root, whether runs sit under a runs/ subdirectory, the run-manifest filename, the run-directory prefix, and the form of the pointer naming the current run. Feature 009's publisher wrote current as a symlink to the run directory. Feature 008's catalogue read current as text.

Every test on both sides passed. Reading a symlink-to-a-directory as a text file does not return a name, it raises — so nothing the control loop published could ever have been visible to the read path, in either direction, however the other four names were spelt.

A fifth divergence was found while reconciling, and it is the one that shows why the first four were not the real problem. The publisher moved the model runner's staging descriptor into the store unchanged, and its keys are not the manifest's keys: status, member_count, digests against schema_version, root_seed, run_sequence, generator_version, sim_time, ensemble. Correcting all four names would have left the catalogue refusing every run for a different reason.

Decision

The pointer is a text file holding one run identifier on one line, and the publisher conforms to stores/coverage/layout.md in every other respect: runs/ subdirectory, run-manifest.json, the layout's run-identifier rule, and a translation step that writes the manifest the layout describes rather than the descriptor the runner produced.

The symlink is rejected despite two genuine advantages — a reader opens the current field at a fixed path in one step, and two consumers already assumed it.

Consequences