|
| 1 | +// SPDX-License-Identifier: PMPL-1.0-or-later |
| 2 | +// Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk> |
| 3 | += ADR-0002: data subdirectories are populated and self-documented, not removed |
| 4 | +:revdate: 2026-05-17 |
| 5 | +:status: Accepted |
| 6 | + |
| 7 | +== Status |
| 8 | + |
| 9 | +Accepted — 2026-05-17. |
| 10 | + |
| 11 | +Resolves: https://github.com/hyperpolymath/verisimdb-data/issues/5[V-L3-S1]. |
| 12 | + |
| 13 | +Builds on: xref:ADR-0001-repo-purpose.adoc[ADR-0001] (the two-purpose framing; |
| 14 | +these directories are purpose 1, the flat-file data store). |
| 15 | + |
| 16 | +== Context |
| 17 | + |
| 18 | +Issue #5 observed that `dispatch/`, `patterns/`, `recipes/`, `outcomes/`, |
| 19 | +`policy/`, `health/` and `.well-known/` looked like "mostly empty placeholder |
| 20 | +directories" and asked for a binary decision: *populate* them (one issue per |
| 21 | +subdir to make the contents concrete) or *delete* them and rebuild as content |
| 22 | +lands. |
| 23 | + |
| 24 | +That premise is now stale. ADR-0001 already declared all of these subtrees as |
| 25 | +the repository's flat-file data store, and the panic-attacker → triage → |
| 26 | +autofix pipeline has since filled every one of them with production data: |
| 27 | + |
| 28 | +* `dispatch/` — dated work-queue JSONL plus `pending.jsonl` / `held.jsonl` |
| 29 | +* `patterns/` — `registry.json` (the cross-repo pattern registry) |
| 30 | +* `recipes/` — ~46 `recipe-*.json` remediation recipes |
| 31 | +* `outcomes/` — monthly applied-fix ledgers plus a fleet import |
| 32 | +* `policy/` — `policy.ncl` (the Nickel baseline policy contract) |
| 33 | +* `health/` — `sitrep.txt` and `hypatia.json` operational telemetry |
| 34 | +* `.well-known/` — RFC 8615 web metadata (`ai.txt`, `humans.txt`, |
| 35 | + `security.txt`) |
| 36 | + |
| 37 | +There are no empty placeholder directories left in the tree. The only real |
| 38 | +gap against the issue's acceptance criteria was the absence of a per-directory |
| 39 | +README explaining what each one holds. |
| 40 | + |
| 41 | +== Decision |
| 42 | + |
| 43 | +**Populate, not remove.** The data subdirectories are a permanent, declared |
| 44 | +part of the repository (per ADR-0001) and are now backed by real, actively |
| 45 | +written content. They are *not* placeholders and must not be deleted. |
| 46 | + |
| 47 | +To make the contents concrete and self-documenting — the spirit of the issue's |
| 48 | +"one issue per subdir" alternative, achieved in one PR — each data directory |
| 49 | +carries a `README.adoc` that states: |
| 50 | + |
| 51 | +. what artefact(s) it holds and their on-disk format, |
| 52 | +. who writes it (which pipeline stage / bot) and who reads it, |
| 53 | +. whether it is append-only or rewritten in place, |
| 54 | +. its retention / `.gitkeep` behaviour. |
| 55 | + |
| 56 | +Splitting this into seven tracking issues was rejected: the directories are |
| 57 | +already populated, so seven issues would each open and immediately close as |
| 58 | +"add a README" with no design content. One ADR plus seven READMEs records the |
| 59 | +decision and discharges the acceptance criteria together. |
| 60 | + |
| 61 | +== Consequences |
| 62 | + |
| 63 | +. The `dispatch/ patterns/ recipes/ outcomes/ policy/ health/ .well-known/` |
| 64 | + directories each gain a `README.adoc`; no data files are moved or removed. |
| 65 | +. `outcomes/.gitkeep` is retained: the ledger is monthly, so the directory |
| 66 | + can legitimately contain only `.gitkeep` at the start of a month, and that |
| 67 | + is now documented rather than mistaken for an empty placeholder. |
| 68 | +. Future data directories under purpose 1 must ship with a `README.adoc` |
| 69 | + from the first commit (close the "is this a placeholder?" question at |
| 70 | + creation time). |
| 71 | +. ADR-0001's directory-layout list remains authoritative for *which* subtree |
| 72 | + serves *which* purpose; this ADR documents the *contents* of the data |
| 73 | + subtree. |
| 74 | + |
| 75 | +== Alternatives considered |
| 76 | + |
| 77 | +Delete the directories and rebuild as content lands:: |
| 78 | +Rejected. The content has already landed and is being written continuously by |
| 79 | +the ingest/triage/autofix pipeline; deleting live data sinks would break that |
| 80 | +pipeline and lose history. This alternative only made sense under the (now |
| 81 | +false) assumption that the directories were empty. |
| 82 | + |
| 83 | +One tracking issue per subdirectory:: |
| 84 | +Rejected as busywork. The directories are populated; each issue would reduce |
| 85 | +to "add a README." Folded into this single ADR + the seven READMEs instead. |
| 86 | + |
| 87 | +Move telemetry / web metadata out of the data store:: |
| 88 | +Out of scope. `health/` and `.well-known/` are small and co-located by |
| 89 | +design; relocating them is a separate decision if either grows. |
0 commit comments