Technologie-Notizen
Kurze Korrekturen verbreiteter Kategorienfehler.
Nicht normativ
- Companion-Version
- 1.0
- Bezug zu COADF Core
- 2.2
- Status
- Aktuell
- Zuletzt geprüft
Jede Notiz korrigiert einen Kategorienfehler: zwei Dinge, die ähnlich aussehen und Verschiedenes leisten.
OpenTelemetry ist keine Prüfspur
OpenTelemetry zeichnet Ausführungskontext auf und gibt ihn weiter: welche Aufrufe eine Anfrage ausgelöst hat, wie lange sie dauerten, wo sie scheiterten. Es ist darauf ausgelegt, auf dem Weg zu einem Backend gesampelt, gefiltert und transformiert zu werden, und ein Trace, der nicht gesampelt wird, wird nicht exportiert; der Filter-Processor des Collectors verwirft passende Telemetrie per Konfiguration. Seine Identität ist eine einzelne Ausführung, getragen im W3C-Header traceparent. Eine Prüfspur beantwortet eine andere Frage über eine andere Einheit: was mit einem Geschäftsvorgang geschehen ist, wer gehandelt hat und gestützt auf welche Nachweise, vollständig und ohne nachträgliche Änderungen.
- Prüfspureinträge werden nie gesampelt, gefiltert oder durch eine Telemetrie-Pipeline geleitet.
- Beides wird korreliert: Die
trace_idder Prüfspur wird als Attribut auf Spans festgehalten. Ein Identifikator verteilter Traces wird nicht als Identität der Prüfspur wiederverwendet. - Was zur Korrelation dient, wird klassifiziert. Ein Span-Attribut verlässt den Speicher der Prüfspur in Richtung Exporter, Anbieter und einer eigenen Aufbewahrung: eine opake Referenz, niemals personenbezogene Daten oder ein Geheimnis.
- Zu erwarten ist, dass sich ein Geschäftsvorgang über mehrere verteilte Traces erstreckt: die Aufnahmeanfrage, einen asynchronen Job, eine Entscheidung, die Tage später fällt.
- OpenTelemetry: Sampling · offizielle Dokumentation · Geprüft am 2026-09-11
- OpenTelemetry: Transforming telemetry · offizielle Dokumentation · Geprüft am 2026-09-11
- W3C: Trace Context, the traceparent header · Spezifikation · W3C Recommendation, Level 1 · Geprüft am 2026-09-11
Kubernetes-Admission-Policies ersetzen keine Validierung auf Anwendungsebene
Admission Control fängt Anfragen an den Kubernetes-API-Server nach Authentifizierung und Autorisierung ab, bevor das Objekt persistiert wird. Sie sieht Deployments, Pods und ConfigMaps, und Anfragen, die diese nur lesen, umgehen sie vollständig. Sie sieht nie die HTTP-Anfragen, die ein Dienst bearbeitet, die Nachrichten, die er konsumiert, oder die Antworten, die ein Modell liefert. Sie beurteilt Anfragen, wenn sie eintreffen, was Kubernetes für ein Admission-Plugin ausdrücklich festhält: Wird eine LimitRange hinzugefügt, bleiben die bereits bestehenden Pods unverändert.
- Admission dient Eigenschaften von Workloads: per Digest fixierte Images, benannte Revisionen, fehlende Zugangsdaten dort, wo sie fehlen müssen.
- Die Validierung an der Grenze bleibt in der Anwendung, an jedem ihrer Eintrittspunkte.
- Bestehende Objekte werden gesondert auditiert, wie es das Audit von Gatekeeper tut; Admission sieht immer nur Änderungen.
- Kubernetes: Admission control: what are they · offizielle Dokumentation · Kubernetes 1.37 · Geprüft am 2026-09-11
- Kubernetes: Limit Ranges: admission-time validation · offizielle Dokumentation · Kubernetes 1.37 · Geprüft am 2026-09-11
- Open Policy Agent Gatekeeper: Gatekeeper: audit · offizielle Dokumentation · Gatekeeper 3.23 · Geprüft am 2026-09-11
Event Sourcing ist für Append-only-Nachweise nicht erforderlich
Event Sourcing macht ein Append-only-Protokoll von Ereignissen zum führenden System und leitet den Zustand daraus ab. Das ergibt konstruktionsbedingt eine vollständige Historie, zu einem erheblichen Preis: Jedes Lesemodell ist eine Projektion, und jede Änderung an der Struktur eines Ereignisses ist eine Migration der Historie. Eine Append-only-Prüfspur neben gewöhnlichem Zustand liefert, was COADF P-4 verlangt (eine Historie, die ergänzt und nie umgeschrieben wird und sich mit einer Abfrage rekonstruieren lässt), ohne zu ändern, wie der Rest des Systems seinen Zustand hält. Berechtigungen pro Operation und ablehnende Trigger genügen, um eine solche Spur in PostgreSQL aufzubauen.
- Event Sourcing wird aus Gründen der Domäne gewählt, nicht um eine Prüfspur zu erhalten.
- Eine Append-only-Tabelle mit einer Rolle, die nur einfügen darf, ablehnenden Triggern und idempotenten Schreibvorgängen verwirklicht Append-only-Nachweise ohne Event Sourcing, innerhalb der eigenen Vertrauensgrenze der Datenbank.
- In beiden Fällen wird der Eintrag in derselben Transaktion geschrieben wie die Änderung, die er festhält.
- PostgreSQL Global Development Group: Privileges · offizielle Dokumentation · PostgreSQL 18 · Geprüft am 2026-09-11
Microservices sind für probabilistische Isolation nicht erforderlich
Die probabilistische Grenze ist eine Eigenschaft von Codepfaden: Kein Pfad lässt eine Modellausgabe ohne einen expliziten, festgehaltenen Schritt zu einem maßgeblichen Objekt werden. Eine Modulgrenze, die der Build durchsetzt, hält diese Eigenschaft innerhalb eines Prozesses, mit Import-Verträgen in Python oder Architekturregeln als Unit-Tests in Java. Eine Netzwerkgrenze ergänzt eine Durchsetzung durch die Infrastruktur und bringt Vertragsversionierung, Teilausfälle, Wiederholungen und Kontextweitergabe über mehrere Hops mit sich, also neue Stellen, an denen die Eigenschaft verloren gehen kann.
- Die probabilistische Komponente wird getrennt deployt, wenn Skalierung, die Isolierung einer Anbieterbibliothek oder unabhängige Releases es verlangen, nicht weil ein Prinzip es verlangt.
- In beiden Fällen wird die Modulgrenze mit einem Architekturtest durchgesetzt.
- Ist die Grenze ein Netzwerk, wird auf der empfangenden Seite erneut validiert.
- import-linter: Contract types · offizielle Dokumentation · import-linter 2.15 · Geprüft am 2026-09-11
- ArchUnit: ArchUnit user guide · offizielle Dokumentation · ArchUnit 1.5 · Geprüft am 2026-09-11
Statische Typisierung ersetzt keine Laufzeitvalidierung an externen Grenzen
Ein Typsystem prüft den Code gegen sich selbst. An einer externen Grenze kommen die Daten von außerhalb des Codes: von einem Modell, einem Client, einer Queue. Die Typannotationen von TypeScript werden vor der Ausführung des Programms entfernt, und JSON.parse ist mit dem Rückgabetyp any deklariert; die Python-Laufzeit setzt Typannotationen nicht durch; und ein Java-Typ beschreibt, was ein Deserialisierer erzeugen sollte, nicht, was der Absender geschickt hat. Der Typ ist ein Versprechen, das die Grenze zur Laufzeit mit einem Schema einlösen muss.
- Der statische Typ wird aus dem Laufzeitschema abgeleitet, wo immer die Sprache das erlaubt.
- Validiert wird auf jeder empfangenden Seite, nicht nur am Web-Eintrittspunkt.
- Casts gehören nicht in Code an der Grenze: Ein Cast ist die Stelle, an der das Typsystem aufhört zu prüfen.
- TypeScript: The Basics: erased types · offizielle Dokumentation · Geprüft am 2026-09-11
- TypeScript: lib.es5.d.ts: JSON.parse · Projekt-Repository · Geprüft am 2026-09-11
- Python Software Foundation: typing: support for type hints · Sprachdokumentation · Python 3.14 · Geprüft am 2026-09-11
Eine grüne CI-Pipeline beweist nicht, dass eine Kontrolle architektonisch ausreicht
Eine grüne Pipeline belegt, dass die Prüfungen, die sie ausgeführt hat, bestanden wurden. Sie sagt nichts über Prüfungen, die übersprungen und als erfolgreich gemeldet wurden, über Auswahlen, auf die kein Test passte, über Fences am falschen Pfad oder über Eigenschaften, für die niemand eine Prüfung geschrieben hat. Das Modell des COADF-Kontrollberichts formuliert dieselbe Regel von der anderen Seite: Eine Kontrolle gilt nur dann als durchgesetzt, wenn ihr Nachweis im identifizierten Lauf ausgeführt wurde und bestanden hat.
- Für jeden Lauf wird festgehalten, welche Prüfungen gelaufen sind und wie viele Assertions ausgeführt wurden.
- Der Zahnbeweis jedes Fence wird auf seinem echten Pfad erbracht, und erneut, wenn sich der Pfad ändert.
- Was nicht geprüft wird, verdient dieselbe ernsthafte Prüfung wie das, was geprüft wird.
- GitHub: Control jobs with conditions · offizielle Dokumentation · Geprüft am 2026-09-11
