From c372665e2d217cca1879d37a1b0a334cdf232c36 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:=20Gate=205=20=E2=80=94=20the=20smoke=20li?= =?UTF-8?q?st=20passed,=20and=20one=20criterion=20was=20unachievable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Federation answers, sign-in confirmed by the owner, a backup ran, ClamAV's signatures are from yesterday, the wiki returns 302 from outside. One line is not ticked: a call was not tested. Neither coturn nor the SFU was touched, so this undertaking cannot have affected calls - but that is an argument, not a test, and it stands here as the argument it is. Acceptance criterion 1 of this very document is named as wrong rather than quietly reinterpreted. It demands zero workloads left with only the broad rule, and it was written before Gate 2 introduced the class that exists to keep exactly that. What holds is what it should have said: every workload is either narrowly ruled or documented as a reasoned exception at the selector. Four remain open, all with a reason. The pattern behind every correction in this undertaking: they came from measuring, not from thinking about the plan. And four times the tool was wrong rather than the subject - /dev/tcp in an sh, no nc in alloy, find -printf in busybox, busybox TLS against Traefik. Each looked like a finding. Recorded for the next harvest: traffic to the node's own address escapes the policy entirely, so every "internal only" workload still reaches whatever the ingress publishes. Not a fault of this work, but it bounds every statement about these rules and the framework does not know the case. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01F2Q4Ri8NGwyTZzScvKnWFM --- STATUS.md | 2 +- docs/design/2026-08-21-egress-vollstaendig.md | 77 ++++++++++++++++++- 2 files changed, 75 insertions(+), 4 deletions(-) diff --git a/STATUS.md b/STATUS.md index 5573432..9ab5616 100644 --- a/STATUS.md +++ b/STATUS.md @@ -89,7 +89,7 @@ Bedeutung der Meilensteine: siehe [roadmap.md](roadmap.md). | Design | Gate | Title | |---|---|---| -| [2026-08-21-egress-vollstaendig](docs/design/2026-08-21-egress-vollstaendig.md) | gate-4 | Design: Den ausgehenden Verkehr zu Ende schließen (#0088) | +| [2026-08-21-egress-vollstaendig](docs/design/2026-08-21-egress-vollstaendig.md) | gate-5 | Design: Den ausgehenden Verkehr zu Ende schließen (#0088) | ## ADRs (25) diff --git a/docs/design/2026-08-21-egress-vollstaendig.md b/docs/design/2026-08-21-egress-vollstaendig.md index a6d8f45..1eb6315 100644 --- a/docs/design/2026-08-21-egress-vollstaendig.md +++ b/docs/design/2026-08-21-egress-vollstaendig.md @@ -1,6 +1,6 @@ --- type: design -status: gate-4 +status: gate-5 date: 2026-08-21 size: L related: @@ -595,6 +595,77 @@ auffiel, weil das Ergebnis gegen eine zweite Messung gehalten wurde. Die vier sind `synapse-main`, `coturn`, `matrix-rtc-sfu`, `clamav` — drei davon Dienstmerkmale, eines eine begründete CDN-Ausnahme. -**Status:** `DONE` — die Abnahme durch einen echten Login steht bei sorb. +**Status:** `DONE` — Login von sorb bestätigt: *„anmeldung geht."* -> **STOP — Slice-Review.** \ No newline at end of file +> **STOP — Slice-Review.** Freigegeben. + +## Gate 5 — Closeout (AAR) + +**Planned vs. actual.** Geplant waren drei Wellen; es wurden vier, weil MAS +sich im Verlauf als einschränkbar herausstellte statt unklar zu bleiben. + +| Abnahmeliste (Gate 1, Kriterium 3) | Ergebnis | +|---|---| +| Föderation | `matrix.org` antwortet, `Synapse 1.158.0` | +| Anmeldung über Authentik | von sorb bestätigt | +| Backup-Lauf | ausgelöst, Archiv geschrieben | +| ClamAV-Signaturen | `daily.cld` von gestern 17:40 | +| Wiki | von außen `HTTP 302 in 0,19 s` | +| **Ein Call** | ⚠️ **nicht getestet.** Weder `coturn` noch die SFU wurde angefasst, dieses Vorhaben kann Calls also nicht beeinflusst haben — aber das ist ein Argument, kein Test, und es steht hier als das eine. | + +**Was diese Arbeit falsch gemacht hat.** + +1. ⚠️ **Abnahmekriterium 1 dieses Dokuments ist unerfüllbar formuliert.** Es + verlangt „die Zahl derer, für die nur `egress-block-metadata` gilt, ist + **0**" — geschrieben, **bevor** Gate 2 die Klasse C einführte, die genau + das vorsieht. Erfüllt ist, was es hätte heißen müssen: *jede Arbeitslast + ist entweder eng geregelt oder als begründete Ausnahme am Selektor + dokumentiert.* Vier bleiben offen, alle mit Grund. Das Kriterium wird + hier nicht stillschweigend uminterpretiert, sondern als falsch benannt. +2. **Gate 2s Rückweg-Behauptung** („`git revert` ist ein Rückweg von + Minuten") — in Slice 1 korrigiert: es braucht zusätzlich ein Anstoßen der + Quelle. +3. **Gate 3s Einstufung von MAS** als „vorerst Klasse C" — durch Messung + überholt und in Welle 4 aufgelöst. +4. **Der Titel von #0088** („13 Ingress-Regeln, 1 Egress") war schon vor + diesem Vorhaben überholt und wurde am selben Tag korrigiert. + +**Why the difference.** Alles, was hier korrigiert wurde, kam aus einer +Messung, nicht aus dem Nachdenken über den Plan. Und viermal war nicht die +Sache falsch, sondern das **Werkzeug**: `/dev/tcp` in einer `sh`, fehlendes +`nc` in `alloy`, `find -printf` in busybox, busyboxs TLS gegen Traefik. +Jedes Mal sah das Ergebnis nach einem Befund aus. + +**Learnings.** + +- **Die Positivkontrolle ist hier nicht Kür, sondern das Einzige, was ein + „blockiert" von einem kaputten Messwerkzeug trennt.** Viermal an einem Tag + gerettet. +- **NetworkPolicies sind additiv** — der Ausschluss gehört in die breite + Regel. Die Deckungsgleichheitsprüfung vor jedem Push ist die billigste + Absicherung des Vorhabens: Ein einseitiger Eintrag öffnet einen Dienst + ganz oder schneidet ihn ganz ab, und beides ist kein Syntaxfehler. +- **Ein ephemerer Container ist der Weg zu distroless Arbeitslasten** — für + Sonden und, über `/proc//root`, sogar zum Lesen der Konfiguration. +- **Ein privater Weg schlägt eine Ausnahme nach draußen.** Der Hinweis kam + von sorb und hat eine Regel ganz entfallen lassen. + +**Harvested.** ADR-0025. Für die nächste Ernte vorgemerkt: ⚠️ **Verkehr zur +eigenen Knoten-Adresse unterliegt der Policy nicht** — jede „nur intern" +laufende Arbeitslast erreicht weiterhin alles über den Ingress +Veröffentlichte. Das ist kein Fehler dieses Vorhabens, aber es begrenzt jede +Aussage über diese Regeln und ist nirgends im Rahmenwerk vorgesehen. + +**Open uncertainties.** + +1. **Der Call ist ungetestet** (siehe oben). +2. **`clamav` bleibt die einzige breite Ausnahme, die kein Dienstmerkmal + ist.** Ein interner Signaturspiegel löst sie; ADR-0025 hält das offen. +3. **Die Klasse-A-Zuordnung der Deploy-Arbeitslasten beruht auf Zweck, nicht + auf Beobachtung.** Sie laufen nur beim Deploy — ein Fehler zeigt sich beim + nächsten ESS-Rollout, nicht heute. +4. **Die Job-artigen sind nur teilweise belegt.** Für `synapse-backup` wurde + ein Lauf ausgelöst; `wikijs-backup`, `turn-secret-rotation` und + `wikijs-config` warten auf ihren nächsten regulären Lauf. + +> **STOP — Freigabe für Gate 5.** \ No newline at end of file