ledger: gate 5, and the coverage metric reads one for the first time

Fifty-four of fifty-four targets scanned, nothing missing, nothing orphaned.
Since the target set became derived rather than maintained, that number has
never been whole before.

Two of the six criteria I could not check. Grafana answers me with 401, so what
I have is that provisioning ran, read out of grafana's own log in loki —
provisioned is not rendered, and the two dashboards on ancient schema versions
only fail when somebody opens them. That is written down as a gap rather than
reported as eleven of eleven.

The counter I built the same evening turned out blind to its own case, and the
test I wrote for it could not see that, because it reimplements the arithmetic
and the faulty line never existed in the copy. Second time in two days for that
failure class, in the same project.

Also worth keeping: my filter for loki errors returned fifteen hits, thirteen of
which were loki logging my own query back at me.
This commit is contained in:
Thore Cimbal
2026-08-21 12:00:00 +00:00
parent a63c590dbd
commit c2c352f80c
@@ -2,7 +2,7 @@
type: ledger
date: 2026-08-22
size: M
status: open
status: closed
related:
- "docs/issues/0051-cve-remediation-pass.md"
- "docs/wiki/admin/cve-durchgang.md"
@@ -84,11 +84,15 @@ Minor-Sprünge ohne Zustand, der wandern müsste.
| gate | commit | approval | status | note |
|---|---|---|---|---|
| 1 | 370a678 | sorb | DONE | Umfang, sechs Abnahmekriterien, Rückweg benannt; die Ablehnung von 13.x vom Vortag als Fehlvergleich richtiggestellt. |
| 5 | PENDING | sorb | DONE_WITH_CONCERNS | Vier von sechs Kriterien gemessen erfüllt, Deckung erstmals **1,0**; ⚠️ zwei Kriterien konnte ich nicht prüfen (Grafana-API antwortet mir 401) und zwei Commits sind noch nicht ausgerollt. |
## Slices
| slice | commit | status | note |
|---|---|---|---|
| Fassungen | 3aee138 | DONE | grafana 13.2.0, loki 3.7.6, alloy v1.18.1; Migration 19 Schritte in 353 ms, `database: ok`. |
| Zähler entblindet | d689916 | DONE_WITH_CONCERNS | ⚠️ Fehler in eigenem Code vom selben Abend; wirkt erst nach dem Pull auf dem Host. |
| Zählweise dokumentiert | c7aaf38 | DONE | 162 Vorkommen = 63 Serien = 28 CVEs; auf dem Dashboard steht der Sprung als 70 → 63. |
## Ladder
@@ -98,7 +102,10 @@ Minor-Sprünge ohne Zustand, der wandern müsste.
| ob es ein neueres 12.x gibt, bevor der Major gewaehlt wird | 12.4.9 ist das Ende der Reihe (12.4.2 … 12.4.9), kein 12.5 | reused: die Messung statt der Annahme — der Major ist nicht Geschmack, sondern der einzige Weg zu 0 CRITICAL | |
| ob uns die Abschaltung der numerischen Datenquellen-IDs trifft | 702 uid-Objekte, 38 Namens-Strings, **0** Zahlen ueber alle 11 Dashboards | reused: der eigene Bestand als Pruefmassstab statt vorsorglicher Anpassungen (dieselbe Methode wie bei den Authentik-Bruchstellen) | |
| die Bruchstellen von 13.0, bevor gesprungen wird | Image-Renderer ersatzlos entfernt (nutzen wir nicht), `/api` zugunsten `/apis` veraltet, Git-Sync-Datenverlust nur in 13.0.0 | reused: die Herausgeber-Notizen; 13.2.0 laesst den fehlerhaften Zwischenstand aus | |
| ob Trivys eigene Zahl den Vergleich hergibt | nein — die Gesamtzahl vergleicht Images mit verschiedenem Inhalt; erst die Aufteilung nach Fundort (Kern vs. `plugins-bundled`) macht daraus eine Aussage | built: nichts, aber die Auswertung nach Fundort gehoert in den Runbook-Schritt „vor jedem Update das Zielimage scannen" | |
| ob Trivys eigene Zahl den Vergleich hergibt | nein — die Gesamtzahl vergleicht Images mit verschiedenem Inhalt; erst die Aufteilung nach Fundort (Kern vs. `plugins-bundled`) macht daraus eine Aussage | built: nichts, aber die Auswertung nach Fundort gehoert in den Runbook-Schritt „vor jedem Update das Zielimage scannen" | 3aee138 |
| einen Weg, Grafanas Protokoll zu lesen, obwohl die API mich mit 401 abweist | alle Container-Logs liegen ohnehin in Loki, und dorthin komme ich ueber den privaten Weg | reused: die vorhandene Log-Strecke als Zugang statt nach Zugangsdaten zu fragen — Bereitstellung, Migration und Datenquellen-Fehler stehen dort vollstaendig | c7aaf38 |
| ob der eine Bereitstellungsfehler neu ist, bevor er dem Sprung angelastet wird | dieselbe Zeile um 11:04, elf Stunden VOR dem Sprung, an einem Gameserver-Dashboard | reused: das Protokoll als Zeitachse statt einer Vermutung — dieselbe Frage, die am Vortag vier Fehldiagnosen gekostet hat | c7aaf38 |
| warum die Anlage 63 HIGH meldet, wo ich 162 gemessen hatte | Prometheus zaehlt SERIEN (CVE + Paket + Fassung je Ziel), Trivy zaehlt VORKOMMEN; dieselbe Go-stdlib wiederholt sich ueber 13 Plugin-Binaries | reused: nichts gebaut — die Zahl war nie falsch, nur die Frage. Auf dem Dashboard steht der Sprung als 70 -> 63 | c7aaf38 |
## Notes
@@ -112,3 +119,57 @@ dann ein Vergleich, wenn beide Seiten dieselbe Menge Dinge enthalten.
**Kein Issue dahinter.** Dieser Lauf entstand aus sorbs Ansage im Anschluss an
#0051, nicht aus einem Eintrag im Bestand. Ob er einen bekommt, entscheidet
sorb — ohne Zustimmung wird hier keiner angelegt.
## Gate 5 — Abnahme
| | Kriterium | Ergebnis |
|---|---|---|
| 1 | `cve_critical_offen` bleibt 0 | ✅ **0**; Soll wieder 54 |
| 2 | Alle 11 Dashboards laden | ⚠️ **nicht prüfbar** — siehe unten |
| 3 | Datenquellen zeigen Daten | ⚠️ **nicht prüfbar** — siehe unten |
| 4 | Loki nimmt Logs an | ✅ Betriebs-Host 7 s, k3s-Cluster 2 s frisch |
| 5 | Loki ≤ 8 HIGH, Alloy ≤ 14, Grafana-Kern 0 CRITICAL | ✅ **8 / 14 / 0** |
| 6 | Rückweg vor dem Start | ✗ von sorb ausdrücklich abgeräumt |
**Und eine Zahl, die es vorher nie gab:** `cve_target_coverage_ratio` steht nach
dieser Runde auf **1,0** — 54 von 54, `cve_targets_missing` 0,
`cve_targets_orphaned` 0. Seit die Zielmenge abgeleitet wird (#0106), ist das
der erste vollständig gedeckte Stand.
⚠️ **Zu 2 und 3: Ich habe sie NICHT geprüft, sondern etwas Schwächeres.** Die
Grafana-API antwortet mir mit 401; belegen kann ich nur, dass die
*Bereitstellung* durchlief — aus Grafanas Protokoll in Loki. **Bereitgestellt
ist nicht dargestellt.** Genau die beiden Dashboards mit altem Schema (12 und
32) fallen erst beim Öffnen auf, und das kann nur jemand mit Anmeldedaten. Das
gehört als Lücke benannt und nicht als „11 von 11" gemeldet.
**Der einzige Bereitstellungsfehler ist nicht unserer:**
`pterodactyl-server.json` — „A dashboard with the same uid already exists".
Dieselbe Zeile steht um 11:04 desselben Tages, elf Stunden vor dem Sprung, und
betrifft ein Gameserver-Dashboard, das ohnehin außerhalb des Auftrags liegt.
⚠️ **Zwei Commits sind noch nicht ausgerollt** (`d689916`, `c7aaf38`): Auf dem
Host laufen weiter der blinde Zähler und die zwei toten Grafana-Einträge
(`cve_entscheidungen_total` = 93 statt 86). Ein `git pull` genügt, kein
Neustart.
## Notes (Nachtrag)
⚠️ **Ein Zähler, den ich am selben Abend gebaut habe, war blind für genau
seinen Fall.** `cve_entscheidungen_ohne_befund` trug ein `and ziel in soll`
eine veraltete Entscheidung fiel also aus der Prüfung, sobald ihr Image aus dem
Bestand verschwand. Das ist der Normalfall, nicht die Ausnahme: Entscheidungen
veralten *durch* Fassungssprünge. Belegt binnen Stunden an den Einträgen zu
Grafana 12.0.0 und 12.4.9.
**Und der eigene Test konnte es nicht sehen**, weil er die Rechnung nachbaut
und die fehlerhafte Bedingung in der Kopie gar nicht vorkam — dieselbe
Fehlerklasse wie beim Scan-Loop am Vortag
(`docs/wiki/stolpersteine/nachgebauter-test-prueft-den-nachbau.md`), im selben
Projekt, innerhalb eines Tages. Die neuen Zusicherungen fahren die echte
`collect()`; die alte Fassung fällt darin durch.
**Eine Messfalle bei mir selbst:** Mein Filter „Loki-Fehler" fand 15 Treffer —
13 davon waren Lokis Protokoll **meiner eigenen Abfrage**, in der `level=error`
als Zeichenkette vorkam. Wer Logs nach Wörtern filtert, filtert auch sich
selbst.