docs: slice 1 for #0106 — the derivation runs, and two of my own errors were caught

The slice changes no behaviour: the scanner still reads the old list. What it
adds is the ability to say how much of the estate is covered, and its acceptance
is a number already known by hand.

Both mistakes in this slice were caught by controls rather than by luck. The
counter-proof about tag ordering was itself wrong — name ordering loses v0.10.0,
not v0.8.0 — and the test failed until the reasoning was fixed. The first edit
to the compose file assumed the wrong indentation, and the assertion in front of
it stopped a half-applied change from being written.
This commit is contained in:
Thore Cimbal
2026-08-21 12:00:00 +00:00
parent e316193f9c
commit 39c8f10f20
3 changed files with 60 additions and 4 deletions
+1 -1
View File
@@ -86,7 +86,7 @@ Bedeutung der Meilensteine: siehe [roadmap.md](roadmap.md).
| Design | Gate | Title |
|---|---|---|
| [2026-08-21-cve-ziele-ableiten](docs/design/2026-08-21-cve-ziele-ableiten.md) | gate-3 | Design: Die CVE-Zielmenge ableiten statt pflegen (#0106) |
| [2026-08-21-cve-ziele-ableiten](docs/design/2026-08-21-cve-ziele-ableiten.md) | slice-1 | Design: Die CVE-Zielmenge ableiten statt pflegen (#0106) |
## ADRs (26)
+45 -2
View File
@@ -1,6 +1,6 @@
---
type: design
status: gate-4
status: slice-1
date: 2026-08-21
size: L
related:
@@ -465,4 +465,47 @@ Zeigt cAdvisor nur Laufendes, ist die Soll-Menge unvollständig und die Deckung
meldet trotzdem 100 %. Dann braucht es eine zweite Quelle für den Betriebs-Stack
— und das gehört als Befund in Gate 5, nicht stillschweigend in den Code.
> **STOP — Freigabe für Gate 4.**
> **Gate 4 freigegeben durch sorb, 2026-08-21.** Ausrollen als Deploy-Übergabe.
### Slice 1 — durchgeführt, 2026-08-21 · Commit `27770b6` (threadnet-operating)
**Status: DONE_WITH_CONCERNS** — gebaut und belegt, aber die Abnahme dieses
Slices ist erst nach dem Ausrollen messbar (siehe unten).
| Aufgabe | Beleg |
|---|---|
| 1.1 `cve/targets.py` | `py_compile` sauber; Handlauf `python3 targets.py` vorhanden |
| 1.2 `cve/test_targets.py` | **21 Zusicherungen grün** |
| 1.3 `cve-exporter.py` | Lauf gegen aufgezeichnete Quellen: fünf `cve_target_*`-Serien, `targets.txt` geschrieben |
| 1.4 `docker-compose.yml` | `docker compose config` grün; Volume `cve_targets` rw beim Exporter, **ro** beim Scanner |
**Die Testreihe kann nachweislich rot werden.** Eine gezielte Sabotage der
Normalisierung (Tag wird verworfen, alles fällt zusammen) fährt **11 von 21**
Zusicherungen rot; zurückgesetzt wieder grün. Ohne diesen Nachweis wäre „21
grün" nur eine Vermutung.
**Ein Nebenbeweis fiel im Lauf ab:** Der Testbericht trägt
`docker.io/library/postgres:17-alpine`, die Soll-Menge `postgres:17-alpine`
und `cve_targets_orphaned` blieb **0**. Die Normalisierung trägt also über die
Quellgrenze hinweg, nicht nur innerhalb einer Quelle.
⚠️ **Zwei eigene Fehler, beide von den eingebauten Kontrollen gefangen:**
1. Die Gegenprobe zur Tag-Sortierung war **selbst falsch** — sie behauptete,
eine Namenssortierung würde `v0.8.0` verlieren. Tatsächlich verliert sie
`v0.10.0` und nimmt `v0.7.0` mit. Der Test schlug fehl und hat meinen
Denkfehler korrigiert, nicht den Code.
2. Der erste Änderungsversuch am Compose ging von **6/8 Leerzeichen**
Einrückung aus; tatsächlich sind es **4/6**. Die `assert`-Zeile davor hat
verhindert, dass eine halb angewandte Änderung geschrieben wurde — die Datei
blieb unberührt. Das ist die Lehre vom 20.08. (zeilenweise, einrückungsbewusst
ändern), diesmal als Kontrolle statt als Schaden.
**Was das Verhalten der Anlage angeht: nichts.** `scan-loop.sh` ist unangetastet
und liest weiter `images.txt`. Das Volume ist beim Scanner bereits eingehängt,
damit beim Umschalten in Slice 3 kein Neustart-Rennen entsteht.
**Offen bis zum Ausrollen** (Deploy-Übergabe): Die eigentliche Abnahme ist die
Zahl. `cve_targets_missing` muss **24** ergeben, `cve_targets_orphaned` **2**,
`cve_target_coverage_ratio` **≈ 0,52** — die Werte der Handmessung. Weicht sie
ab, ist die Herleitung falsch.
+14 -1
View File
@@ -14,11 +14,17 @@ related:
| gate | commit | approval | status | note |
|---|---|---|---|---|
| 4 | | | OPEN | Fuenf Slices; Ausrollen als Deploy-Uebergabe, Mengengeruest beigelegt. |
| 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. |
| 1 | e10cd5d | sorb | DONE | Sechs Kriterien; Registry-Reichweite = Option C (Bestand + letzte drei je Repo). |
## Slices
| slice | commit | status | note |
|---|---|---|---|
| 1 | 27770b6 | DONE_WITH_CONCERNS | Herleitung + Metriken, nur beobachtend; Abnahme (24/2/0,52) erst nach dem Ausrollen messbar. |
## Ladder
| searched | found | outcome | commit |
@@ -60,3 +66,10 @@ Betriebs-Host 12), gescannt 27, Registry 36 Tags in 6 Repos davon 7
CI-Artefakte. Die volle Lesart der Anforderung ergaebe rund 83 Ziele statt 29 —
Faktor drei. Deshalb steht die Registry-Reichweite als ausdrueckliche Frage in
Gate 1 statt als stille Annahme im Entwurf.
**Zwei eigene Fehler in Slice 1, beide von eingebauten Kontrollen gefangen.**
Die Gegenprobe zur Tag-Sortierung war selbst falsch (sie behauptete den Verlust
von `v0.8.0` statt `v0.10.0`) — der Test korrigierte meinen Denkfehler, nicht
den Code. Und der erste Compose-Eingriff ging von falscher Einruckung aus; die
`assert`-Zeile davor hat verhindert, dass eine halb angewandte Aenderung
geschrieben wurde. Beide Male war die Kontrolle billiger als der Schaden.