From 8a032d9eb86ec6f946d55ea5eba8142f09f54491 Mon Sep 17 00:00:00 2001 From: Thore Cimbal Date: Fri, 21 Aug 2026 12:00:00 +0000 Subject: [PATCH] =?UTF-8?q?docs:=20close=20#0106,=20accept=20ADR-0026=20?= =?UTF-8?q?=E2=80=94=20and=20the=20two=20AARs=20I=20had=20argued=20away?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit An AAR is not optional. AGENTS.md line 202 demands one after every deploy with a handover and after every incident, and today held both: the account without a profile row, and this deploy on the operating host. Neither existed until sorb asked. I had reasoned the first one away using a comment in the template rather than the rule itself. That is FB-01 again, one day after it was partly fixed by writing the rule into AGENTS.md — and in a sharper form. The knowledge gap was closed this time. The rule stood where it belongs and was findable. It lost anyway, because a secondary text offered a more convenient reading and nothing contradicted it. The stolperstein records that distinction, because it changes what a fix would have to do. The incident AAR carries the more useful content: four causes claimed in a row, each disproven by the next measurement, two of them stopped by sorb's objection rather than by mine. The real cause was documented ten days earlier, and its diagnostic shortcut had aged — a count of zero only catches accounts that never placed a call, and this one had twenty-one, all old. --- STATUS.md | 19 ++- ...21-clark-calls-reset-vier-fehldiagnosen.md | 115 ++++++++++++++++++ docs/aar/2026-08-21-cve-zielmenge-deploy.md | 114 +++++++++++++++++ ...fziele-werden-abgeleitet-nicht-gepflegt.md | 4 +- .../2026-08-21-cve-ziele-ableiten.md | 13 +- ...-die-haelfte-zielliste-ist-handgepflegt.md | 37 +++++- docs/ledger/2026-08-21-cve-ziele-ableiten.md | 14 ++- .../aar-pflicht-ohne-werkzeug.md | 23 ++++ .../nachgebauter-test-prueft-den-nachbau.md | 2 +- 9 files changed, 321 insertions(+), 20 deletions(-) create mode 100644 docs/aar/2026-08-21-clark-calls-reset-vier-fehldiagnosen.md create mode 100644 docs/aar/2026-08-21-cve-zielmenge-deploy.md rename docs/design/{ => done}/2026-08-21-cve-ziele-ableiten.md (98%) diff --git a/STATUS.md b/STATUS.md index 19b5f56..c460b07 100644 --- a/STATUS.md +++ b/STATUS.md @@ -2,17 +2,16 @@ -## Issues (48 open, 52 closed) +## Issues (47 open, 53 closed) -Verteilung: M1 2 · M2 16 · M3 4 · M4 11 · M5 15 +Verteilung: M1 1 · M2 16 · M3 4 · M4 11 · M5 15 Bedeutung der Meilensteine: siehe [roadmap.md](roadmap.md). -### M1 (2) +### M1 (1) | Issue | Priorität | Status | Title | |---|---|---|---| -| [0106](docs/issues/0106-cve-scan-deckt-nur-die-haelfte-zielliste-ist-handgepflegt.md) | high | open | CVE-Scan deckt 52 % — die Zielliste ist handgepflegt und läuft dem Bestand hinterher | | [0072](docs/issues/0072-gitops-34-dsgvo-datenschutz-compliance-konkretisieren.md) | low | open | DSGVO/Datenschutz-Compliance konkretisieren | ### M2 (16) @@ -82,11 +81,9 @@ Bedeutung der Meilensteine: siehe [roadmap.md](roadmap.md). | [0090](docs/issues/0090-gitops-59-kein-kubernetes-audit-log-zugriffe-an-der-api.md) | low | open | Kein Kubernetes-Audit-Log — Zugriffe an der API werden nicht protokolliert | -## Active design docs (1) +## Active design docs (0) -| Design | Gate | Title | -|---|---|---| -| [2026-08-21-cve-ziele-ableiten](docs/design/2026-08-21-cve-ziele-ableiten.md) | gate-4 | Design: Die CVE-Zielmenge ableiten statt pflegen (#0106) | +_none active_ ## ADRs (26) @@ -117,9 +114,9 @@ Bedeutung der Meilensteine: siehe [roadmap.md](roadmap.md). | [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 | | [0024](docs/adr/0024-drei-framework-dateien-erklaert-erweitert.md) | accepted | ADR-0024: Drei Framework-Dateien sind erklärt erweitert — Diff-Referenz statt Byte-Vergleich | | [0025](docs/adr/0025-egress-ausnahmen-als-cidr-ausser-hinter-cdn.md) | accepted | ADR-0025: Egress-Ausnahmen werden als CIDR gepinnt — außer hinter einem CDN | -| [0026](docs/adr/0026-pruefziele-werden-abgeleitet-nicht-gepflegt.md) | proposed | ADR-0026: Prüfziele werden abgeleitet, nicht gepflegt — und das Ausbleiben der Herleitung alarmiert | +| [0026](docs/adr/0026-pruefziele-werden-abgeleitet-nicht-gepflegt.md) | accepted | ADR-0026: Prüfziele werden abgeleitet, nicht gepflegt — und das Ausbleiben der Herleitung alarmiert | -## Open AARs (6) +## Open AARs (8) - [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) @@ -127,6 +124,8 @@ Bedeutung der Meilensteine: siehe [roadmap.md](roadmap.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) - [AAR — rohana lief voll, der ThreadNet-Web-Spiegel riss](docs/aar/2026-08-20-rohana-platte-voll-spiegel-gerissen.md) +- [AAR: Clarks Calls und Identitäts-Reset — vier Fehldiagnosen bis zur bekannten Ursache](docs/aar/2026-08-21-clark-calls-reset-vier-fehldiagnosen.md) +- [AAR: Deploy der abgeleiteten CVE-Zielmenge (#0106)](docs/aar/2026-08-21-cve-zielmenge-deploy.md) ## Fehlerklassen (18) diff --git a/docs/aar/2026-08-21-clark-calls-reset-vier-fehldiagnosen.md b/docs/aar/2026-08-21-clark-calls-reset-vier-fehldiagnosen.md new file mode 100644 index 0000000..d76a983 --- /dev/null +++ b/docs/aar/2026-08-21-clark-calls-reset-vier-fehldiagnosen.md @@ -0,0 +1,115 @@ +--- +type: aar +status: open +date: 2026-08-21 +related: + - "docs/wiki/stolpersteine/fremder-defekt-der-aenderung-angelastet.md" + - "docs/aar/2026-08-11-apo-calls-profile-zeile.md" + - "docs/issues/0088-gitops-56-networkpolicy-ausgehender-verkehr-ist-unbesch.md" +--- + +# AAR: Clarks Calls und Identitäts-Reset — vier Fehldiagnosen bis zur bekannten Ursache + +**Host/Stack:** MATRIX · **Meldender:** sorb · **Bearbeitung:** diese Sitzung +**Schwere:** MEDIUM (ein Konto ohne Calls und ohne Reset-Möglichkeit; Chat lief) + +## What was planned / expected + +Geplant war der Abschluss von #0088 (Egress-Regeln). Währenddessen meldete sorb: +Clark kann seine Identität nicht zurücksetzen und keinen Call starten — die +Seite lädt endlos, Chats laufen. Erwartet wurde eine Prüfung, ob die Egress- +Arbeit desselben Tages beteiligt ist. + +## What happened + +**Zeitachse (alles 2026-08-21, Zeiten UTC).** + +| Zeit | Ereignis | +|---|---| +| ~11:14 | Clarks `POST /keys/device_signing/upload` → 401, 60 B, `{None}` | +| 11:15:55 | Clarks Client erneuert seinen Token zum letzten Mal — danach hängt er | +| 11:20:55 | Token abgelaufen; ab hier alle Anfragen „Token is not active" | +| 11:36:05 / 11:36:44 | MAS ruft `allow_cross_signing_reset` bei Synapse auf — **2× HTTP 200** | +| ~11:55 | Profil-Zeile für `clark` eingefügt | +| 11:57:18 | Clark holt wieder OpenID-Token — **davor nichts seit 08-17 20:26** | + +**Vier Ursachen wurden nacheinander behauptet und jede durch die nächste Messung +widerlegt:** + +| # | Behauptung | Widerlegt durch | +|---|---|---| +| 1 | Fehlender `org.matrix.msc2965.authentication`-Block im `.well-known` | Synapse liefert dieselben Angaben über `/_matrix/client/v1/auth_metadata` — der Block wird nicht gebraucht | +| 2 | Geänderter Berechtigungs-Dialekt der Sitzungen | Synapse kennt **beide** Dialekte; im Quelltext des laufenden Pods nachgelesen | +| 3 | Regression in `v0.6.0` gegenüber `rc.3` | `git diff v0.6.0-rc.3..v0.6.0` — **kein Commit, keine Datei** | +| 4 | Fehlender `openid`-Umfang in neuen Sitzungen | sorb meldete sich inkognito ohne diesen Umfang an und telefonierte; 20 s später lag sein OpenID-Token vor | + +**Zwei davon wurden nicht von meiner Messung gestoppt, sondern von sorbs +Einwand** — einmal *„warum sollte es an Element Call liegen, wenn der Crypto-Reset +dasselbe Problem hat?"*, einmal *„warum konnte sich sorb gerade inkognito +anmelden und einen Call starten?"*. + +**Die tatsächliche Ursache:** `@clark` hatte **keine Zeile in Synapses +`profiles`-Tabelle**. Ohne sie bricht das Setzen des Anzeigenamens, ohne +Anzeigenamen initialisiert das Element-Call-Widget nie, ohne Widget gibt es +keinen OpenID-Token und keinen SFU-Eintritt. Messaging braucht diesen Pfad +nicht und lief weiter. + +**Der Fall war seit dem 2026-08-11 dokumentiert** — damals für `@apo`, samt Fix. +Ausgerechnet `clark` diente dort als *gesundes Referenzkonto*; seine Zeile ist +seitdem verschwunden (deaktiviert und reaktiviert; Deaktivieren löscht das +Profil, Reaktivieren legt es nicht neu an). + +**Die Gegenprobe lieferte sich selbst:** Von neun aktiven Konten ohne +Profil-Zeile waren **acht deaktiviert** — `clark` war der einzige Ausreißer. + +## Why the difference + +**Routing-Klasse: intent issue.** Kein Code war falsch, keine Spezifikation. +Falsch war die **Suchrichtung**. + +Die eigene Änderung desselben Tages war die einzige bekannte Veränderung und +zugleich die am besten durchleuchtbare — es gibt Manifeste, Commits und Regeln, +an denen sich stundenlang messen lässt. Das erzeugt Fortschrittsgefühl ohne +Fortschritt. Jede widerlegte Behauptung erzeugte sofort die nächste **innerhalb +derselben falschen Richtung**, statt die Richtung selbst zu revidieren. + +Erschwerend: Das dokumentierte Diagnose-Kürzel von 2026-08-11 lautet +`open_id_tokens = 0`. Clark hatte **21** — alle alt. Das Kürzel greift nur bei +Konten, die *nie* telefoniert haben; richtig wäre das **Datum des jüngsten** +Tokens gewesen. + +## Learnings + +- ⚠️ **Bei einer Meldung während eines laufenden Vorhabens ist die erste + Messung ein Vergleich betroffen/nicht betroffen — nicht eine Prüfung der + eigenen Änderung.** Drei Konten waren im Spiel, eines betroffen, zwei nicht. + Die entscheidende Abfrage war ein Spaltenvergleich über diese drei und hätte + am Anfang stehen können statt nach vier Stunden. +- **Eine Trennlinie muss gegen die Grundgesamtheit geprüft werden**, sonst ist + sie eine Auffälligkeit und keine Ursache. Hier: *jedes* andere Konto ohne + Profil-Zeile war deaktiviert. +- **Ein Diagnose-Kürzel altert.** `count = 0` war 2026-08-11 richtig und ist + heute falsch; wer je telefoniert hat, behält seine Einträge. +- **Serverseitiger Erfolg widerlegt eine clientseitige Ursache nicht.** MAS + meldete den Reset zweimal mit HTTP 200 an Synapse — und der Client hing + trotzdem, weil er schon vorher klemmte. +- ⚠️ **Der Einwand des Auftraggebers war zweimal das schnellere Messinstrument + als ich.** Beide Male hat er eine Behauptung gekippt, bevor sie in ein + Manifest wandern konnte. + +## Actions + +- [x] Ursache behoben: Profil-Zeile für `clark` eingefügt, Wirkung nach vier + Minuten an `open_id_tokens` belegt. +- [x] Stolperstein angelegt: + [fremder-defekt-der-aenderung-angelastet](../wiki/stolpersteine/fremder-defekt-der-aenderung-angelastet.md) + (Stand: offen, für die nächste Ernte). +- [x] Gedächtnis-Eintrag zum apo-Fall um dieses zweite Vorkommen ergänzt, samt + der Abfrage, die beim nächsten Mal zuerst laufen soll, und der Falle im + alten Diagnose-Kürzel. +- [ ] **Offen:** Es gibt keine Prüfung, die ein aktives Konto ohne Profil-Zeile + meldet. Der Fall ist jetzt zweimal aufgetreten (apo, clark), beide Male + erst nach einer Nutzermeldung. Eine Regel darauf wäre billig — gehört als + Issue vorgeschlagen, nicht hier entschieden. +- [ ] **Offen:** Ob weitere reaktivierte Konten betroffen sind, ist heute mit + **0** beziffert; es gibt aber keinen Automatismus, der das hält. diff --git a/docs/aar/2026-08-21-cve-zielmenge-deploy.md b/docs/aar/2026-08-21-cve-zielmenge-deploy.md new file mode 100644 index 0000000..085509f --- /dev/null +++ b/docs/aar/2026-08-21-cve-zielmenge-deploy.md @@ -0,0 +1,114 @@ +--- +type: aar +status: open +date: 2026-08-21 +related: + - "docs/design/done/2026-08-21-cve-ziele-ableiten.md" + - "docs/issues/0106-cve-scan-deckt-nur-die-haelfte-zielliste-ist-handgepflegt.md" + - "docs/adr/0026-pruefziele-werden-abgeleitet-nicht-gepflegt.md" + - "docs/aar/2026-08-01-cve-pipeline-gitops47.md" +--- + +# AAR: Deploy der abgeleiteten CVE-Zielmenge (#0106) + +**Host/Stack:** CFGMON, `/opt/threadnet-operating/monitoring` +**Gebaut:** diese Sitzung · **Ausgerollt:** sorb · **Stand:** `07875ba` + +## What was planned / expected + +Vier Slices sollten gebaut, in einer Deploy-Übergabe abgegeben und einzeln +verifiziert werden. Das Mengengerüst lag bei: **~65 Ziele** (statt 29), +**~90 Registry-Anfragen** je Herleitung, **bis zu 65 Meldungen** je Runde. + +Die Abnahme von Slice 1 sollte eine Zahl sein, die vorher von Hand ermittelt +war: `cve_targets_missing` **24**, `orphaned` **2**, Deckung **≈ 0,52**. + +## What happened + +sorb rollte **alle vier Slices zusammen** aus, statt Slice für Slice — auf +seinen ausdrücklichen Wunsch („gerne alles auf mal"). Der Deploy verlief ohne +Zwischenfall. + +| | erwartet | gemessen | +|---|---|---| +| Scan-Ziele | ~65 | **56** | +| Deckung | 100 % | **100 %** (`missing` 0, `orphaned` 0) | +| Dauer der ersten vollen Runde | unbekannt | **~2 Minuten** | +| Meldungen im Security-Raum | ≤ 65 | **39** (1 + 25 + 13, drei `group_interval`) | +| Drosselung (429) | Risiko laut AAR 2026-08-01 | **keine**, 39× HTTP 200 | +| Frische je Quelle | < 3600 s | 177 s | + +**Alle namentlich genannten blinden Flecken tragen jetzt einen Bericht** +(Web-Client, beide Traefik-Schichten, Registry, Wiki, Prometheus, Grafana, +Alertmanager, Trivy selbst), und beide Karteileichen sind fort +(`threadnet-web:v0.3.0`, `coturn/coturn:latest`). + +⚠️ **Ein Zwischenstand sah nach Ausfall aus und war keiner.** Vier Minuten nach +dem Deploy feuerten 44 CRITICAL-Alarme bei **einer** Meldung im Raum. Erst die +Wiederholungsmessung nach 210 s zeigte 25 und 13 weitere: Alertmanager liefert +je `group_interval` (5 min), nicht sofort. Ohne die zweite Messung wäre daraus +ein Befund geworden, den es nicht gibt. + +**Die eigentliche Nachricht:** Über 56 statt 29 Images stehen jetzt **253 +CRITICAL** (vorher 126) und **3674 HIGH** (vorher 1222). Der Zuwachs ist kein +neuer Schaden, sondern vorher unsichtbarer Bestand. + +## Why the difference + +**Routing-Klasse: spec issue** — in den Zahlen, nicht in der Sache. + +1. **„~65 Ziele" beruhte auf drei Tags je Repo.** Vier der sechs Repos haben + nur **einen**. Die Registry-Auswahl ergibt 9 statt 18; mit 51 laufenden minus + 4 Überschneidungen sind das exakt 56. Ich hatte die Reichweite geschätzt, + ohne die Tag-Zahlen je Repo dafür zu benutzen — obwohl ich sie gemessen + hatte. +2. **„≤ 65 Meldungen" war die richtige Größenordnung**, aber die tatsächlichen + 39 enthalten einen einmaligen Anteil, den ich nicht vorhergesehen hatte + (siehe 3). +3. ⚠️ **Die Normalisierung ändert jeden Alarm-Fingerabdruck.** Aus + `docker.io/postgres:17-alpine` wird `postgres:17-alpine`; damit gelten alle + bisher bekannten Alarme als aufgelöst und alle neuen als neu. Sämtliche + bekannten Befunde wurden einmalig erneut gemeldet. Gate 2 führt die + Normalisierung ausdrücklich als **Pflicht** — ihre Wirkung eine Schicht + höher, in der Alarmierung, habe ich nicht zu Ende gedacht. +4. **Die geplante Abnahme von Slice 1 war nach dem gemeinsamen Ausrollen nicht + mehr beobachtbar.** 24/2/0,52 sind Werte *vor* der ersten neuen Runde; die + lief sofort durch. Ersatzweise belegt über die namentlich genannten blinden + Flecken — ein Ersatz, kein Gleichwertiges. + +## Learnings + +- ⚠️ **Ein Zwischenstand ist kein Ergebnis.** 44 Alarme gegen 1 Meldung sah + nach kaputter Zustellung aus; es war das Zustellintervall. Vor jedem Befund + über ein zeitgesteuertes System gehört eine zweite Messung nach mindestens + einem Intervall. +- **Wer alle Slices zusammen ausrollt, verliert die Abnahme der frühen.** Das + war sorbs Entscheidung und legitim — aber es kostet den Tracer seinen Zweck, + und das gehört beim Zusammenlegen ausgesprochen, nicht nachträglich bemerkt. +- **Eine Normalisierung ist nie nur eine Normalisierung.** Sie ändert + Beschriftungen, und Beschriftungen sind Identität — für Alertmanager, + für Dedup-Zustände, für Zeitreihen-Kontinuität. +- **Die laufende Anlage ist die bessere Quelle als ihre Beschreibung.** cAdvisor + sah alle acht im Compose deklarierten Images **und vier weitere, die in keiner + unserer Compose-Dateien stehen** — darunter die Registry selbst. Eine aus dem + Compose abgeleitete Liste hätte genau die übersehen. +- **Die Aggregation aus ADR-0003 trägt auch bei doppelter Zielzahl.** Der in der + AAR vom 2026-08-01 beschriebene Flut-/429-Fall trat nicht ein. + +## Actions + +- [x] Gate 5 im Entwurf, Entwurf nach `docs/design/done/`. +- [x] **ADR-0026 angenommen** (Entscheidung sorb, 2026-08-21). +- [x] #0051 um das neue Mengengerüst ergänzt — der Remediation-Pass ist rund + doppelt so groß wie bei seiner Erstellung angenommen, und die neuen + Kandidaten sind die exponierteren. +- [x] Stolperstein + [nachgebauter-test-prueft-den-nachbau](../wiki/stolpersteine/nachgebauter-test-prueft-den-nachbau.md). +- [ ] **Offen:** Kriterium 5 (eine neue Fassung erscheint ohne Zutun) ist bis + zum nächsten `threadnet-web`-Release unbewiesen. +- [ ] **Offen:** `rohana.axion1337.de/sorb/axion-backup:v1` meldet CRITICAL, + läuft aber nirgends — er steht nur in der Menge, weil die Auswahl „letzte + drei je Repo" nimmt und das Repo zwei hat. Ein Registry-Aufräumen wäre + billiger als ein Update. +- [ ] **Offen:** Ein gerade gestoppter Dienst fehlt weiterhin still in der + Soll-Menge. Heute mit **0** beziffert, morgen nicht zwingend. diff --git a/docs/adr/0026-pruefziele-werden-abgeleitet-nicht-gepflegt.md b/docs/adr/0026-pruefziele-werden-abgeleitet-nicht-gepflegt.md index ffe264a..e4956e6 100644 --- a/docs/adr/0026-pruefziele-werden-abgeleitet-nicht-gepflegt.md +++ b/docs/adr/0026-pruefziele-werden-abgeleitet-nicht-gepflegt.md @@ -1,13 +1,13 @@ --- type: adr id: "0026" -status: proposed +status: accepted date: 2026-08-21 supersedes: null superseded_by: null related: - "docs/issues/0106-cve-scan-deckt-nur-die-haelfte-zielliste-ist-handgepflegt.md" - - "docs/design/2026-08-21-cve-ziele-ableiten.md" + - "docs/design/done/2026-08-21-cve-ziele-ableiten.md" - "docs/adr/0003-cve-meldeweg-aggregiert.md" --- diff --git a/docs/design/2026-08-21-cve-ziele-ableiten.md b/docs/design/done/2026-08-21-cve-ziele-ableiten.md similarity index 98% rename from docs/design/2026-08-21-cve-ziele-ableiten.md rename to docs/design/done/2026-08-21-cve-ziele-ableiten.md index fd9f5b1..a29f7d3 100644 --- a/docs/design/2026-08-21-cve-ziele-ableiten.md +++ b/docs/design/done/2026-08-21-cve-ziele-ableiten.md @@ -1,6 +1,6 @@ --- type: design -status: gate-4 +status: done date: 2026-08-21 size: L related: @@ -376,7 +376,7 @@ steht, wird gelöscht; bei **fehlender** `targets.txt` wird nichts gelöscht. Der Betriebs-Host ist kein Flux-Ziel; dort läuft Compose von Hand. Gemessen am 2026-08-21: `10.0.0.3:2248` ist von MATRIX aus offen, Agent-Weiterleitung funktioniert, aber der Schlüssel ist dort nicht zugelassen. Es gilt daher das -Verfahren [Deploy-Übergabe](../wiki/deployment/deploy-uebergabe.md), das nach +Verfahren [Deploy-Übergabe](../../wiki/deployment/deploy-uebergabe.md), das nach genau diesem Stack eingeführt wurde: **Wer baut, übergibt; wer ausrollt, prüft und schreibt den AAR.** @@ -710,4 +710,11 @@ nachgebaute Tests, als eigener Stolperstein. 4. **Die Auswahl „letzte drei je Repo" ist grob.** Bei `axion-backup` sind das beide Tags, auch der ungenutzte `v1` — der prompt CRITICAL meldet. -> **STOP — Freigabe für Gate 5.** +> **Gate 5 freigegeben durch sorb, 2026-08-21.** ADR-0026 angenommen. +> +> ⚠️ **Nachtrag auf sorbs Hinweis:** Ein AAR ist nicht optional. Zu diesem +> Vorhaben gehoert `docs/aar/2026-08-21-cve-zielmenge-deploy.md` (Deploy mit +> Uebergabe), zum Vorfall desselben Tages +> `docs/aar/2026-08-21-clark-calls-reset-vier-fehldiagnosen.md`. Beide fehlten +> zunaechst; ich hatte sie mit dem Kommentar der Vorlage wegargumentiert statt +> mit `AGENTS.md` Z. 202. diff --git a/docs/issues/0106-cve-scan-deckt-nur-die-haelfte-zielliste-ist-handgepflegt.md b/docs/issues/0106-cve-scan-deckt-nur-die-haelfte-zielliste-ist-handgepflegt.md index a432ac0..e9a46bb 100644 --- a/docs/issues/0106-cve-scan-deckt-nur-die-haelfte-zielliste-ist-handgepflegt.md +++ b/docs/issues/0106-cve-scan-deckt-nur-die-haelfte-zielliste-ist-handgepflegt.md @@ -1,7 +1,7 @@ --- type: issue id: "0106" -status: open +status: done created: 2026-08-21 milestone: M1 priority: high @@ -10,6 +10,9 @@ host: cfgmon related: - "docs/issues/0078-gitops-45-cve-meldeweg-v2-metriken-grafana-dashboard-al.md" - "docs/adr/0003-cve-meldeweg-aggregiert.md" + - "docs/adr/0026-pruefziele-werden-abgeleitet-nicht-gepflegt.md" + - "docs/design/done/2026-08-21-cve-ziele-ableiten.md" + - "docs/aar/2026-08-21-cve-zielmenge-deploy.md" --- # CVE-Scan deckt 52 % — die Zielliste ist handgepflegt und läuft dem Bestand hinterher @@ -107,3 +110,35 @@ Der Umfang gehört begrenzt und begründet. Nicht Teil davon: die Behebung der gefundenen CVEs (#0051), der Meldeweg selbst (#0078, erledigt) und `release-watch` (#0022). + +## Abschluss — 2026-08-21 + +**Erledigt.** Die Zielmenge wird abgeleitet statt gepflegt; `images.txt` ist +ersatzlos entfallen. Ausgerollt von sorb, danach gemessen: + +| | vorher | nachher | +|---|---|---| +| Scan-Ziele | 29 | **56** | +| Deckung | 52 % | **100 %** (`cve_targets_missing` 0) | +| Verwaiste Berichte | 2 | **0** | +| CRITICAL / HIGH | 126 / 1222 | **253 / 3674** | + +Alle im Text genannten blinden Flecken tragen jetzt einen Bericht — Web-Client, +**beide** Traefik-Schichten, die Registry, das Wiki, Prometheus, Grafana, +Alertmanager und `aquasec/trivy` selbst. `threadnet-web:v0.3.0` und +`coturn/coturn:latest` sind fort. + +Die Runde lief in **~2 Minuten**, es kamen **39** Meldungen (geschätzt waren +≤ 65), keine Drosselung. + +⚠️ **Der Zuwachs an Befunden ist kein neuer Schaden, sondern vorher unsichtbarer +Bestand.** Die 127 zusätzlichen CRITICAL gehören zu **#0051**, das um das neue +Mengengerüst ergänzt wurde. + +**Offen und ausdrücklich benannt:** Kriterium 5 (eine neue Fassung erscheint +ohne Zutun) ist bis zum nächsten Release unbewiesen; ein gerade gestoppter +Dienst fehlt weiterhin still in der Soll-Menge (heute mit 0 beziffert). + +Entwurf mit allen fünf Gates: `docs/design/done/2026-08-21-cve-ziele-ableiten.md`. +Richtungsentscheidung: **ADR-0026** (angenommen). AAR des Deploys: +`docs/aar/2026-08-21-cve-zielmenge-deploy.md`. diff --git a/docs/ledger/2026-08-21-cve-ziele-ableiten.md b/docs/ledger/2026-08-21-cve-ziele-ableiten.md index affee9c..13360d3 100644 --- a/docs/ledger/2026-08-21-cve-ziele-ableiten.md +++ b/docs/ledger/2026-08-21-cve-ziele-ableiten.md @@ -2,9 +2,9 @@ type: ledger date: 2026-08-21 size: L -status: open +status: closed related: - - "docs/design/2026-08-21-cve-ziele-ableiten.md" + - "docs/design/done/2026-08-21-cve-ziele-ableiten.md" - "docs/issues/0106-cve-scan-deckt-nur-die-haelfte-zielliste-ist-handgepflegt.md" --- @@ -14,7 +14,7 @@ related: | gate | commit | approval | status | note | |---|---|---|---|---| -| 5 | e342229 | | OPEN | Wartet auf Freigabe. Ausgerollt von sorb; 56 Ziele, Deckung 100 %, 39 Meldungen, keine Drosselung. | +| 5 | e342229 | sorb | DONE | Ausgerollt von sorb; 56 Ziele, Deckung 100 %, 39 Meldungen, keine Drosselung. ADR-0026 angenommen. | | 4 | e316193 | sorb | DONE | Fuenf Slices; Ausrollen als Deploy-Uebergabe, Mengengeruest beigelegt. | | 3 | a0cd02a | sorb | DONE | Dateien, Signaturen, Zusicherungen, Grenzen; fuenf wackelige Annahmen benannt. | | 2 | 2693a2d | sorb | DONE | Herleitung im Exporter statt drittem Dienst; ADR-0026 vorgeschlagen. | @@ -85,3 +85,11 @@ die ausgelieferte Datei kaputt ist. Nach dem Umbau auf Laden der echten `runde()` fiel binnen eines Laufs auf, dass `scan-loop.sh` seine Pfade fest setzte und die Umgebung ignorierte. Wer eine Nachbildung prueft, prueft die Nachbildung. + +⚠️ **Zwei AARs fehlten und wurden erst auf sorbs Nachfrage geschrieben** - der +Vorfall um das Konto ohne Profil-Zeile und dieser Deploy mit Uebergabe. Ich +hatte den eigenen AAR mit dem Kommentar der Vorlage wegargumentiert statt mit +`AGENTS.md` Z. 202, die ihn nach jedem Deploy mit Uebergabe und jedem Incident +verlangt. Das ist FB-01 einen Tag nach seiner Teilbehebung, in verschaerfter +Form: nicht Unwissen, sondern eine bequemere Lesart. Festgehalten in +`docs/wiki/stolpersteine/aar-pflicht-ohne-werkzeug.md`. diff --git a/docs/wiki/stolpersteine/aar-pflicht-ohne-werkzeug.md b/docs/wiki/stolpersteine/aar-pflicht-ohne-werkzeug.md index efe0968..7374c73 100644 --- a/docs/wiki/stolpersteine/aar-pflicht-ohne-werkzeug.md +++ b/docs/wiki/stolpersteine/aar-pflicht-ohne-werkzeug.md @@ -39,3 +39,26 @@ AARs in vier Tagen sind viel. ➡️ Die hier vermutete Asymmetrie ist am 2026-08-20 über den **gesamten** Regelsatz nachgemessen worden und hat sich bestätigt: **FB-11**. Dieser Befund bleibt als Einzelfall gültig; FB-11 trägt die Regelmäßigkeit. + +## ⚠️ Rueckfall am 2026-08-21 — einen Tag nach der Teilbehebung + +Am Tag nach der Aufnahme in `AGENTS.md` fehlten erneut **zwei** AARs: der +Vorfall um ein Konto ohne Profil-Zeile (Incident **und** schwere Fehldiagnose) +und der Deploy mit Uebergabe zu #0106. Beide entstanden wieder erst auf +Nachfrage von sorb. + +**Der Rueckfall verlief nicht ueber Unwissen, sondern ueber eine Begruendung.** +Die Vorlage `docs/aar/template.md` traegt den Kommentar *"Standalone AARs are +for incidents and major deviations only - normal undertakings get their AAR as +Gate 5 inside the design doc."* Daraus wurde geschlossen, ein eigener AAR waere +redundant - obwohl `AGENTS.md` Z. 202 ihn nach **jedem Deploy mit Uebergabe** +und **jedem Incident** verlangt und beides zutraf. + +**Das ist die schaerfere Form des Befundes:** Die Wissensluecke war geschlossen, +die Regel stand an der richtigen Stelle und war auffindbar - und wurde trotzdem +nicht befolgt, weil ein Nebentext eine bequemere Lesart anbot. Ein Werkzeug +haette widersprochen; ein Kommentar in einer Vorlage tut es nicht. + +Siehe auch [[regeln-ohne-widerspruch]] - dieser Fall gehoert dort hinein: Er +zeigt, dass nicht nur *fehlende* Durchsetzung, sondern auch ein **konkurrierender +Text** genuegt, damit eine unbewachte Regel unterliegt. diff --git a/docs/wiki/stolpersteine/nachgebauter-test-prueft-den-nachbau.md b/docs/wiki/stolpersteine/nachgebauter-test-prueft-den-nachbau.md index a8aa45b..37586b4 100644 --- a/docs/wiki/stolpersteine/nachgebauter-test-prueft-den-nachbau.md +++ b/docs/wiki/stolpersteine/nachgebauter-test-prueft-den-nachbau.md @@ -3,7 +3,7 @@ type: wiki-page area: stolpersteine status: open sources: - - "docs/design/2026-08-21-cve-ziele-ableiten.md" + - "docs/design/done/2026-08-21-cve-ziele-ableiten.md" related: - "docs/wiki/stolpersteine/meldet-erfolg-ist-aber-blind.md" - "docs/wiki/stolpersteine/fremder-defekt-der-aenderung-angelastet.md"