Zwei weitere AARs vom 17./18., und das Muster endlich als Wiki-Seite

sorb hat zu Recht nachgehakt: Meine Aussage, nur der 19. und 20. seien
AAR-pflichtig gewesen, war unbelegt. Die Commits dieser beiden Tage zeigen
zwei weitere Vorfaelle.

1. Safari sendete nach der Freischaltung von v0.5.3 ungefiltert weiter -
   LiveKits sender?.replaceTrack uebersprang den Tausch stumm, das rohe Mikrofon
   blieb auf der Leitung. Datenschutzbezug: Wer den Filter einschaltete, durfte
   annehmen, dass genau das nicht passiert.

2. Alle geplanten Pruefungen waren dauerhaft rot und meldeten damit nichts mehr.

Beide waren in ihren Issues ausfuehrlich dokumentiert - und beide ohne AAR.

Wichtiger als die Nacharbeit: #0054 nennt den Safari-Fall selbst das VIERTE
Vorkommen des Musters 'meldet Erfolg, ist aber blind'. Viermal erkannt, nie als
eigenstaendige Lehre abgelegt - und genau deshalb bin ich am 19./20. dreimal neu
hineingelaufen. Das Muster steht jetzt als Wiki-Seite mit sieben belegten
Vorkommen, Erkennungsmerkmalen und Gegenmitteln.

Der Validator hat die Seite prompt als verwaist gemeldet, bis sie im Index
verlinkt war. Wo ein Werkzeug widerspricht, halte ich den Prozess ein - das ist
exakt der Befund aus #0040.

Nicht als Vorfall gewertet und geprueft: die Boje-Aufraeumarbeit in #0074.
This commit is contained in:
Thore Cimbal
2026-08-20 12:00:00 +00:00
parent 242e839eb6
commit 9925f279fd
5 changed files with 208 additions and 2 deletions
+3 -1
View File
@@ -119,8 +119,10 @@ _none active_
| [0022](docs/adr/0022-upstream-anschluss-durch-einmaligen-merge.md) | accepted | ADR-0022: Anschluss an Upstream durch einen einmaligen Merge, nicht durch einen geteilten Graft |
| [0023](docs/adr/0023-fremdhistorie-von-der-git-hygiene-ausnehmen.md) | accepted | ADR-0023: Fremde Historie von der Git-Hygiene ausnehmen — erklärt, nicht global |
## Open AARs (4)
## Open AARs (6)
- [AAR — Alle geplanten Prüfungen waren dauerhaft rot und meldeten damit nichts mehr](docs/aar/2026-08-18-alle-pruefungen-dauerhaft-rot.md)
- [AAR — Nach der Freischaltung sendete Safari ungefiltert weiter](docs/aar/2026-08-18-safari-sendete-ungefiltert.md)
- [AAR — `v0.6.0-rc.2` brach die Raumliste in Produktion](docs/aar/2026-08-19-rc2-raumliste-produktion.md)
- [AAR — Drei DKIM-Einträge verschwanden bei der DMARC-Härtung](docs/aar/2026-08-20-dkim-verlust-zonenaenderung.md)
- [AAR — Game-Host-Anbindung: Deploy über zwei Übergaben, Ursache war nie die Firewall](docs/aar/2026-08-20-game-host-anbindung.md)
@@ -0,0 +1,71 @@
---
type: aar
status: open
date: 2026-08-18
related:
- "docs/issues/0104-daueralarme-melden-nichts-mehr.md"
- "docs/adr/0020-bekannte-befunde-quittieren.md"
---
# AAR — Alle geplanten Prüfungen waren dauerhaft rot und meldeten damit nichts mehr
*Nachträglich erstellt am 2026-08-20.*
## 1. Was geplant war
Die Prüfungen der Stillstandsprüfungs-Familie (`gruppenpruefung`, `stillstandspruefung`,
`pruefe_upstream_drift`) sollen die Pipeline rot färben, wenn etwas nicht stimmt. AGENTS.md
sagt dazu ausdrücklich: **die rote Pipeline ist die Alarmanlage.**
## 2. Was geschah
Aufgefallen am 2026-08-18 bei der Frage nach der Produktionsreife: **Jede** geplante
Prüfung war rot, und zwar dauerhaft — 25 offene Befunde, viele davon seit Tagen bekannt,
keiner davon neu. Damit meldete keine Prüfung mehr etwas: Rot war der Normalzustand.
Zwei Ursachen kamen zusammen. Erstens echte, aber bekannte und teils bewusst
zurückgestellte Befunde ohne Mechanismus, sie als solche zu kennzeichnen. Zweitens ein
strukturelles Problem: `gitops` hatte **keinen `workflow`-Block** und legte deshalb auch
dann Pipelines an, wenn kein Job auf sie passte — rot ohne jeden Fehler.
## 3. Warum der Unterschied
**Spec issue.** Die Prüfungen kannten nur zwei Zustände: Befund oder kein Befund. Ein
dritter fehlte — „bekannt, bewertet, bewusst zurückgestellt". Ohne ihn wächst jede
Alarmanlage in die Dauer-Rotheit hinein, und zwar unabhängig davon, wie gut die einzelnen
Prüfungen sind.
Die Abstumpfung ist dabei nicht das Nebenprodukt, sondern der eigentliche Schaden: Wer sich
an rote Pipelines gewöhnt, übersieht die eine, die zählt.
## 4. Lehren
- **Eine Alarmanlage ohne Quittungsmechanismus verfällt.** Nicht weil die Prüfungen
schlecht sind, sondern weil bekannte Befunde sich ansammeln.
- **Quittungen brauchen eine Frist.** Ohne Ablaufdatum wird aus „bewusst zurückgestellt"
stillschweigend „vergessen". Deshalb ist die Frist in `quittungen.py` Pflicht und
„permanent" nur als ADR zulässig.
- **Rot ohne Fehler ist schlimmer als kein Alarm.** Eine Pipeline, die aus strukturellen
Gründen rot wird (leere Pipeline ohne Jobs), zerstört die Aussagekraft aller anderen.
- **Zuerst die Ursache, dann die Quittung.** Von den 25 Befunden wurden die meisten
behoben; genau **einer** wurde quittiert, weil er sich nicht beheben ließ.
## 5. Maßnahmen
| Maßnahme | Stand |
|---|---|
| Quittungsmechanismus mit Pflichtfrist (`quittungen.py`, ADR-0020) | erledigt |
| `workflow`-Block in `gitops` und vorbeugend in `management` | erledigt |
| 25 offene Befunde auf 0, davon 26 quittiert mit Grund und Frist | erledigt |
| #0104 als führendes Issue für das Muster angelegt und geschlossen | erledigt |
## 6. Offen
- Die Quittungen laufen ab. Läuft eine aus, ohne dass jemand hinsieht, ist der
Ausgangszustand zurück — die Prüfung meldet das dann selbst, aber nur, wenn jemand die
Meldung liest.
- ⚠️ Am 2026-08-20 kam eine neue Dauer-Rotheit derselben Klasse hinzu: Der Upstream-Merge
brachte 70.265 fremde Commits, die die Git-Hygiene-Prüfung bemängelte, ohne dass sie sich
je ändern ließen. Behoben über ADR-0023 — **zwei Tage nach diesem AAR-Anlass, dieselbe
Klasse.** Das spricht dafür, bei jeder neuen Prüfung im Voraus zu fragen, welche Befunde
sie erzeugen wird, die niemand beheben kann.
@@ -0,0 +1,75 @@
---
type: aar
status: open
date: 2026-08-18
related:
- "docs/issues/0054-ki-geraeuschunterdrueckung-element-call.md"
- "docs/adr/0018-ki-geraeuschunterdrueckung-clientseitig-opt-in.md"
---
# AAR — Nach der Freischaltung sendete Safari ungefiltert weiter
*Nachträglich erstellt am 2026-08-20. Der Vorfall war in #0054 ausführlich
dokumentiert, aber nie als AAR geerntet — obwohl er die Lehre trägt, die diese
Sitzung danach mehrfach wiederholt hat.*
## 1. Was geplant war
Mit `v0.5.3` wurde die KI-Geräuschunterdrückung freigeschaltet (ADR-0018), nachdem der
Abnahmetest im Call zu zweit am 2026-08-17 bestanden war. Erwartet: Der Filter wirkt für
alle Nutzer, die ihn einschalten.
## 2. Was geschah
sorb meldete: **Filter wirkungslos, Stärke 0100 ohne jeden Unterschied**, sauberer
Alleintest. Auf Rechnern der Chromium-Familie funktionierte derselbe Stand.
Ein lokaler Prüfstand (Playwright, echter LiveKit-`setProcessor`-Pfad, Sprachsignal mit
Klick-Transienten) zeigte: **Prozessor und Modell arbeiten korrekt** — Sprache passiert,
Klicks verschwinden. Der Fehler lag dahinter.
**Ursache:** LiveKits `setProcessor` tauscht den Sender-Track per
`this.sender?.replaceTrack(processedTrack)`. Ist der Sender in diesem Moment nicht am
Track — Safari-Timing beim `LocalTrackPublished`-Ereignis —, wird der Tausch **stumm
übersprungen**. Der Prozessor lädt seine 23 MB Modell, meldet Erfolg, und **das rohe
Mikrofon bleibt auf der Leitung**.
Behoben in `v0.5.4` (threadnet-call `fee9866`): Der Fork prüft und erzwingt den Tausch,
die Konsole weist den Sendepfad aus.
## 3. Warum der Unterschied
**Code issue in Fremdcode, aber die Fehlerklasse ist unsere.** Das `?.` verschluckt den
Fehlschlag; eine Kette, die nichts tut, ist von einer erfolgreichen nicht zu
unterscheiden.
Die Abnahme davor war nicht falsch, aber unvollständig: Sie prüfte **hörbar besser?** in
einem Chromium-Call. Sie prüfte nicht, **welcher Track tatsächlich gesendet wird**. Genau
dieser Unterschied trennt „meldet Erfolg" von „wirkt".
⚠️ Datenschutzbezug: Wer den Filter einschaltete, durfte annehmen, dass sein rohes Mikrofon
nicht mehr übertragen wird. Es wurde übertragen.
## 4. Lehren
- **`?.` und stille Fehlschläge sind dasselbe Problem.** Wo eine Bibliothek einen Schritt
optional überspringt, muss der Aufrufer nachsehen, ob er stattgefunden hat.
- **Eine Abnahme muss die Wirkung messen, nicht die Absicht.** „Klingt besser" im falschen
Browser ist kein Beleg für „der gefilterte Track geht raus".
- **Browserübergreifend prüfen.** Der frühe Freispruch dieses Verdachts kam aus einem
Chromium-Test — ein browserübergreifender Fehlschluss, im Issue ausdrücklich vermerkt.
- Das Issue nennt diesen Vorfall das **„vierte Vorkommen des Sitzungsmusters *meldet
Erfolg, ist aber blind*"**. Vier erkannte Vorkommen — und trotzdem nirgends als
eigenständige Lehre abgelegt. Siehe Maßnahmen.
## 5. Maßnahmen
| Maßnahme | Stand |
|---|---|
| Sender-Verifikation im Fork, `v0.5.4` ausgerollt | erledigt (2026-08-17) |
| Abnahme im Call zu zweit auf Safari | erledigt |
| Muster als Wiki-Seite abgelegt statt nur im Issue erwähnt | erledigt (`docs/wiki/stolpersteine/meldet-erfolg-ist-aber-blind.md`) |
## 6. Offen
- Ob weitere `?.`-Stellen in den Fork-Patches denselben stillen Pfad haben, ist ungeprüft.
+1 -1
View File
@@ -21,7 +21,7 @@ mit Inhalt. Projektfassung des neckbeard-Index (Original:
| `vision/` | Eine Datei je Linie: [axion1337.chat](vision/axion1337-chat.md) · [Homelab](vision/homelab.md) · [ThreadNet](vision/threadnet.md) | belegt |
| `user-guide/` | Für Nicht-Owner | entfällt — Gate 0: Publikum ist Owner + Sessions |
| `requirements/` | Eigenständige Anforderungssicht | nur bei echtem Bedarf |
| `faq/`, `stolpersteine/` | Nur aus AARs und geschlossenen Issues geerntet — nie auf Vorrat: [neckbeard-migration](stolpersteine/neckbeard-migration.md), [wikijs](stolpersteine/wikijs.md) | wächst im Refinement |
| `faq/`, `stolpersteine/` | Nur aus AARs und geschlossenen Issues geerntet — nie auf Vorrat: [neckbeard-migration](stolpersteine/neckbeard-migration.md), [wikijs](stolpersteine/wikijs.md), [meldet Erfolg, ist aber blind](stolpersteine/meldet-erfolg-ist-aber-blind.md) | wächst im Refinement |
## Seitenregeln
@@ -0,0 +1,58 @@
---
type: wiki-page
area: stolpersteine
sources:
- "docs/aar/2026-08-18-safari-sendete-ungefiltert.md"
- "docs/aar/2026-08-19-rc2-raumliste-produktion.md"
- "docs/aar/2026-08-20-dkim-verlust-zonenaenderung.md"
related: []
---
# „Meldet Erfolg, ist aber blind" — die häufigste Fehlerklasse dieses Projekts
Ein Schritt läuft durch, meldet Erfolg und hat nichts getan. Der Unterschied zwischen
„funktioniert" und „hat gar nicht erst geprüft" ist von außen **nicht sichtbar** — und
genau deshalb fällt diese Klasse erst auf, wenn jemand das Ergebnis anzweifelt.
Sie ist in diesem Projekt bisher **mindestens siebenmal** aufgetreten, in fünf
verschiedenen Werkzeugen. Deshalb steht sie hier und nicht in einzelnen Issues.
## Die belegten Vorkommen
| Wo | Was meldete Erfolg | Was tatsächlich geschah |
|---|---|---|
| LiveKit `setProcessor` | Prozessor geladen, 23 MB Modell aktiv | `sender?.replaceTrack` übersprang den Tausch stumm — das rohe Mikrofon blieb auf der Leitung |
| Docker-Einzeldatei-Mounts | `docker compose restart` meldet Running | Container hielt den alten Inode und fuhr alten Code |
| `git merge` gegen einen flachen Tag | „0 Konflikte" | Der Merge war nie gelaufen (`refusing to merge unrelated histories`) |
| `grep "error TS"` gegen nx-Ausgabe | keine Fehler gefunden | Farbcodes zwischen `error` und `TS` — das Muster konnte nie greifen |
| `if git … \| tail -3` | „ok" nach jeder Etappe | Geprüft wurde der Rückgabewert von `tail`, nicht der von `git` |
| `/dev/tcp` in einem dash-Container | Verbindung fehlgeschlagen | `/dev/tcp` ist eine bash-Eigenheit — meldet dort *immer* Fehlschlag |
| `dig @<autoritativer NS>` im Lab | vier übereinstimmende Antworten | Port 53 wird abgefangen; alle vier kamen vom lokalen Resolver |
## Woran man sie erkennt
- Ein Ergebnis, das **zu schnell** kommt (0 Konflikte, 0 Fehler, „ok in 0s").
- Ein Ergebnis, das **immer gleich** ist, egal was man ändert.
- Eine Prüfung, die **nie** rot war, seit sie existiert.
- Eine Kette aus mehreren Werkzeugen, bei der nur das letzte seinen Zustand meldet.
## Was dagegen hilft
**Die Positivkontrolle ist Pflicht, nicht Kür.** Wer eine Prüfung baut, muss sie einmal
absichtlich brechen und sehen, dass sie es merkt. Ein Tor, das nur grün war, ist kein
Beleg — es ist eine Vermutung.
**Die Gegenprobe gehört an den Anfang, nicht ans Ende.** `pruefe-dns.sh` prüft heute
zuerst, ob Port 53 abgefangen wird, und warnt **vor** seinen Messungen. `pruefe-ports.sh`
misst gegen einen bekannt offenen Port, bevor es „geschlossen" meldet.
**Am selben Ort und zur selben Zeit messen wie die Arbeit.** Ein `nc`-Test aus einem
anderen Pod lief zufällig nach der NetworkPolicy-Programmierung und sah sauber aus,
während der eigentliche Job scheiterte.
**Bei Ketten jedes Glied einzeln prüfen.** `set -o pipefail`, `PIPESTATUS`, oder gar nicht
erst durch eine Pipe leiten, wenn der Rückgabewert zählt.
**Erfolg ohne auswertbare Ausgabe ist ein Fehler.** Der `typecheck`-Job scheitert
ausdrücklich, wenn `tsc` gar nichts geliefert hat — sonst wäre die leere Ausgabe der
bequemste Weg zu grün.