The framework audit found this missing. Acknowledging known findings is a process decision about how the alarm system treats exceptions, and AGENTS.md is explicit that documenting an exception instead of deciding it is itself the error. It lived only inside #0104 and #0105, which are issues, not decision records. The ADR carries the reasoning the issues could not: why option C beat working the backlog down first or tolerating red, and why the obvious objection - an exception list is a candidate for the next blind spot - is answered by the three rules rather than waved away. It also records what is deliberately not acknowledged, the transient mirror divergence, because that message is the only signal if a mirror truly stops. One consequence is stated plainly rather than discovered later: acknowledgements bind to substrings of the finding text, so fixing or moving a cause can change the wording and require the entry to follow. Stable finding IDs would avoid that and would make the file unreadable without special knowledge; the trade is taken knowingly. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
4.3 KiB
type, id, status, date, supersedes, superseded_by, related
| type | id | status | date | supersedes | superseded_by | related | ||
|---|---|---|---|---|---|---|---|---|
| adr | 0020 | accepted | 2026-08-18 | null | null |
|
ADR-0020: Bekannte Befunde werden quittiert, damit Rot wieder etwas bedeutet
Kontext
Das Alarmprinzip der Gruppe steht in AGENTS.md: „Seine rote Pipeline ist der
Alarm — es gibt bewusst keinen zweiten Meldeweg." Am 2026-08-18 zeigte die
Messung, dass alle drei geplanten Prüfungen dauerhaft rot standen:
gruppenpruefung mit 20 Befunden (17 davon von sorb bewusst vertagt, #0053),
stillstandspruefung mit fehlendem GITEA_TOKEN, und canonize_rotation seit
neun Tagen an einem liegengebliebenen Rotationszweig.
Der canonize-Fall ist der Beleg, nicht die Anekdote: Neun Tage lang scheiterte
der Job an einem Konflikt, der coturn-secret.yaml, synapse-turn-secret.yaml
und element-server-suite.yaml betraf — und niemand bemerkte es, weil ein rotes
Kreuz mehr zwischen roten Kreuzen unsichtbar ist. Gefunden wurde es nur, weil
jemand aus anderem Anlass hinsah.
Damit war die Regel faktisch außer Kraft: Eine Prüfung, die nur noch rot sein kann, meldet nichts. Gleichzeitig ist das Vertagen selbst legitim — #0053 ist eine bewusste Entscheidung, kein Versäumnis, und sie soll die Alarmfähigkeit nicht als Geisel nehmen.
Optionen
A: Vertagtes abarbeiten, bis alles grün ist. Ehrlich, aber es macht die Alarmfähigkeit von Aufräumarbeit abhängig, die bewusst niedrige Priorität trägt — und liefert für die Zwischenzeit keinen funktionierenden Meldeweg.
B: Rot tolerieren und die Läufe von Hand lesen. Der Ist-Zustand. Er hat neun Tage lang einen echten Ausfall verdeckt; genau diese Klasse soll die Stillstandsprüfungs-Familie ja finden.
C: Bekannte Befunde quittieren. Eine gepflegte Liste nimmt Bekanntes aus der
Rot-Wertung, ohne es zu verstecken. Rot bleibt dem Neuen vorbehalten.
Einwand — und er wiegt: Eine Ausnahmeliste ist selbst ein Kandidat für die nächste
Blindstelle, dieselbe Klasse wie der mrtc-Record.
Entscheidung
Option C, mit drei Regeln, die den Einwand konstruktiv beantworten
(scripts/quittungen.py, scripts/befund_quittungen.tsv):
- Quittiertes verschwindet nicht. Es erscheint weiterhin in der Ausgabe, mit Grund und Frist. Quittieren heißt „bekannt", nicht „weg".
- Jede Zeile trägt eine Frist. Läuft sie ab, quittiert die Zeile nicht mehr und meldet sich selbst; der Befund zählt wieder. Es gibt keine stille Ewigkeit.
- „Dauerhaft" ist ausschließlich als ADR-Verweis formulierbar. Eine dauerhafte Ausnahme ohne Entscheidungs-Record ist nach AGENTS.md ohnehin ein Fehler — hier lässt sie sich technisch nicht einmal hinschreiben. Wer Dauer will, muss entscheiden.
- Wirkungslose Zeilen melden sich. Eine Quittung, auf die kein Befund mehr passt, wird ausgegeben, damit die Datei nicht Zeilen für längst gelöste Probleme sammelt.
Quittiert wird pro Befund, nicht per Sammelmuster: Die 17 Commit-Hygiene-Funde
aus #0053 stehen einzeln mit ihrer SHA, weil ein Muster wie : Echtzeit-Stempel
jeden künftigen Verstoß mitverschluckt hätte.
Nicht quittiert werden flüchtige Befunde, deren Meldung anderswo gebraucht wird. Beispiel: „Mirror auseinander" erscheint bei jedem Lauf kurz nach einem Push, ist aber der einzige Hinweis, wenn ein Spiegel wirklich stehenbleibt (#0028). Ein kurzfristig roter Lauf ist der geringere Preis.
Konsequenzen
- Grün ist wieder erreichbar und bedeutet „nichts Neues". Nachgewiesen am 2026-08-18: beide Prüfungen von 25 offenen Befunden auf 0, während ein absichtlich eingefügter neuer Befund weiterhin rot färbt.
- Die Quittungsdatei wird Teil der Refinement-Pflege: abgelaufene und wirkungslose Zeilen sind Arbeitsvorrat, kein Rauschen.
- Quittungen binden an Teilzeichenketten des Befundtextes. Wer eine Ursache behebt oder verschiebt, ändert damit unter Umständen den Text und muss die Quittung nachziehen. Das ist bewusst in Kauf genommen: Die Alternative wären stabile Befund-IDs, die die Datei ohne Spezialwissen unlesbar machen würden.
- Die Bedingung, unter der „rote Pipeline = Alarm" trägt, gehört neben die Regel selbst in AGENTS.md. Diese Änderung ist mit sorb abzustimmen und daher hier nur vermerkt, nicht vollzogen (#0104).