Auf dieser Seite
Architektureigenschaft
COADF P-6: Eine Leitplanke, die in einem Dokument steht, ist ein Ratschlag; eine Leitplanke, die in der Pipeline läuft und ein Release stoppt, ist ein Fence. Fences fallen in vier Kategorien (Daten, Architektur, Text und Prozess), jeder mit einer Kennung, einer Regel und einer Durchsetzungsmethode, und ein Fence verdient seinen Platz erst durch einen Zahnbeweis. COADF veröffentlicht das Vokabular nicht, auf das sein eigener Veröffentlichungs-Fence anschlägt, denn eine Liste dessen, was beobachtet wird, ist eine Karte dessen, was geschützt wird.
Die Eigenschaft lautet nicht „es gibt eine Prüfung“. Sie lautet, dass der verbotene Zustand einen bestimmten Punkt nicht passieren kann und dass jemand zugesehen hat, wie er dort gestoppt wurde.
Warum sie wichtig ist
Jede andere Eigenschaft in diesem Companion lässt sich einmal korrekt umsetzen und mit der nächsten Änderung wieder verlieren. Ein Fence hält eine Eigenschaft über Änderungen hinweg wahr, die niemand mit Blick auf diese Eigenschaft geprüft hat. Das Schwierige ist selten, die Prüfung zu schreiben. Es ist, die Prüfung auf den Pfad zu setzen, den der verbotene Zustand nehmen muss, und zu belegen, dass sie dort anschlägt, auf dem echten Pfad, und nicht in einem Unit-Test der Prüffunktion.
Zulässige Umsetzungsstrategien
Durchsetzungsflächen
Jede Fläche sieht etwas anderes, und jede hat eine typische Umgehung. Ein Fence gehört auf die Fläche, die den verbotenen Zustand sieht, und ist nur so stark wie die Umgehung dieser Fläche.
| Fläche | Sieht | Typische Umgehung |
|---|---|---|
| Compiler und Typprüfer | Codestruktur und deklarierte Typen | Casts, dynamische Typisierung, Reflection, generierter Code |
| Validierung in der Anwendung | Werte an einer Grenze, zur Laufzeit | Ein zweiter Einstiegspunkt: ein Batch-Job, ein Skript, eine Migration |
| Architekturtest | Den Abhängigkeitsgraphen | Laden über den Namen zur Laufzeit; ein neues Paket, das die Regel nicht nennt |
| Vertrags- und Schematest | Kompatibilität der Schnittstellen | Ein Konsument, den niemand registriert hat |
| Continuous Integration | Das Repository bei einem Commit | Eine Pflichtprüfung, die übersprungen und als Erfolg gemeldet wird |
| Merge-Gate | Welche Prüfungen vor einem Merge bestehen müssen | Administratoren, direkte Pushes, Schutzregeln, die der Hosting-Tarif nicht durchsetzt |
| Release-Pipeline | Das Artefakt, das befördert wird | Ein manueller Upload |
| Deployment-Admission | API-Objekte, die an den Cluster übermittelt werden | Eine Failure Policy, die Fehler ignoriert; Objekte, die vor der Policy existierten |
| Veröffentlichungs-Build | Die gerenderte öffentliche Ausgabe | Inhalte, die von außerhalb des Builds ausgeliefert werden |
Drei Ketten, jede endet in einem gestoppten Übergang, sind in den Profilen umgesetzt:
- Ein Architekturverstoß lässt einen Architekturtest fehlschlagen, und der Merge findet nicht statt (Python und FastAPI).
- Eine Vertragsinkompatibilität lässt eine Vertragsprüfung fehlschlagen, und das Release findet nicht statt.
- Ein synthetischer verbotener Sentinel in der gebauten Website lässt den Veröffentlichungs-Fence fehlschlagen, und die Veröffentlichung findet nicht statt (Python und FastAPI, Cloud-native).
Continuous Integration ist eine Fläche unter neun, nicht die Definition eines Fence. GitHub Actions, GitLab CI und Jenkins können einen beherbergen; ebenso ein Typprüfer, eine Admission Policy oder der Build, der eine Website rendert.
Zahnbeweis
- Einen kontrollierten, synthetischen Defekt einbauen.
- Den echten Durchsetzungspfad durchlaufen, nicht einen Unit-Test der Prüffunktion.
- Verifizieren, dass er fehlschlägt, und zwar aus dem eingebauten Grund.
- Die exakte Fixture wiederherstellen und das durch einen Vergleich des Digests vorher und nachher belegen.
- Verifizieren, dass er wieder besteht.
Vor dem Einbauen committen. Wer durch Verwerfen der Änderungen wiederherstellt, stellt den letzten Commit wieder her, und der ist auf einem Arbeitszweig womöglich nicht der Ausgangspunkt; der Beweis zerstört dann genau die Arbeit, die er schützen sollte.
Fehlermuster
Der Fence liegt auf dem falschen Pfad
Er prüft das Repository, während der verbotene Inhalt beim Build, beim Deployment oder zur Laufzeit eingeschleust wird.
Eine übersprungene Pflichtprüfung gilt als Erfolg
GitHub meldet einen übersprungenen Job als erfolgreich, und ein übersprungener Job verhindert keinen Merge, auch wenn er eine Pflichtprüfung ist. Ein Pflicht-Job, der von einem fehlgeschlagenen Fence abhängt, wird übersprungen, und der Merge geht durch. Den Fence selbst als Pflicht festlegen, oder einen Sammel-Job, der immer läuft und fehlschlägt, sofern nicht jeder Fence bestanden hat (GitHubs eigene Empfehlung für Prüfungen, die von anderen Jobs abhängen).
Durch Konfiguration zum Ratschlag gemacht
continue-on-error,allow_failure: truein GitLab CI, ein Admission-Webhook, dessen Failure Policy Fehler ignoriert, ein Gatekeeper-Constraint indryrunoderwarn: Jedes davon macht aus einem Fence einen Ratschlag, ohne dass jemand das Wort schreibt.Nichts geprüft, als sauber gemeldet
Eine leere Musterliste, eine Testauswahl, die auf nichts passt, der Scan eines leeren Verzeichnisses. Die Zahl der tatsächlich ausgeführten Prüfungen gehört ins Ergebnis, und null ist ein Fehlschlag.
Der Fence schlägt bei legitimer Arbeit an und wird abgeschaltet
Präzision hält einen Fence am Leben. Eine Regel, die auf gewöhnlichen Text anschlägt, wird eher deaktiviert als befolgt, und ein deaktivierter Fence ist schlimmer als keiner, weil alle weiterhin glauben, dass er da ist.
Die eigene Liste des Fence wird veröffentlicht
Eine öffentliche Liste beobachteter Begriffe sagt einem Leser genau, was geschützt wird.
Bestehender Zustand wird nie geprüft
Admission- und Pre-Merge-Prüfungen wirken auf Anfragen, wenn sie gestellt werden, nicht auf das, was bereits da ist. Kubernetes dokumentiert das für ein Admission-Plugin ausdrücklich: Wird eine LimitRange hinzugefügt, bleiben die bereits bestehenden Pods unverändert. Gatekeeper hat ein Audit bestehender Ressourcen genau für diese Lücke.
Grün wird als ausreichend gelesen
Eine bestandene Prüfung belegt, dass die Prüfung bestanden wurde. Ob es die richtige Prüfung ist, ist eine architektonische Frage, die keine Pipeline beantworten kann; siehe die Technologie-Notiz.
Verifikation
Architekturtest
Bestanden, wenn: Die Abhängigkeitsregel besteht auf dem aktuellen Stand.
Zahnbeweis: Den verbotenen Import einbauen: Sie schlägt fehl, und das Merge-Gate verweigert den Merge.
Vertragstest
Bestanden, wenn: Die Schemata von Produzent und Konsument sind kompatibel.
Zahnbeweis: Ein Pflichtfeld beim Produzenten entfernen: Die Prüfung schlägt fehl, und der Release-Job läuft nicht.
End-to-End-Test
Bestanden, wenn: Der Veröffentlichungs-Fence scannt die gebaute Ausgabe und besteht.
Zahnbeweis: Einen synthetischen Sentinel in die Ausgabe einbauen: Der Build schlägt fehl. Ihn entfernen, den Digest vergleichen, und der Build besteht.
Deployment- oder Admission-Test
Bestanden, wenn: Ein Objekt, das der Regel folgt, wird zugelassen.
Zahnbeweis: Eines übermitteln, das sie bricht: abgewiesen, mit der Meldung der Regel.
Manueller Nachweis
Bestanden, wenn: Beim Merge bestätigt eine namentlich benannte Person, dass jeder Fence in diesem Lauf ausgeführt wurde: Die Kennung des Laufs und die Zahl der ausgeführten Prüfungen werden festgehalten, nicht aus dem Gedächtnis angegeben.
Alternative Umsetzungen
- Pre-Commit-Hooks. Schnelle Rückmeldung, und auf dem eigenen Rechner der Entwicklerin oder des Entwicklers umgehbar: ein Ratschlag, kein Fence.
- Laufzeitwächter. Sie stoppen einen verbotenen Zustand in der Produktion statt davor. Notwendig, wo der Zustand erst zur Laufzeit existiert.
- Manuelle Gates. Eine namentlich benannte Person führt ein schriftlich festgelegtes Verfahren aus. COADF weist eine solche Kontrolle ehrlich als manuell aus, nie als durchgesetzt.
- Policy-Engines für Infrastrukturregeln. Kubernetes ValidatingAdmissionPolicy im Prozess des API-Servers, oder Open Policy Agent mit Gatekeeper, wo der verbotene Zustand ein API-Objekt ist.
Grenzen
- Ein Text-Fence kann keinen Mechanismus sehen, der über Kontrollfluss, umbenannte Bezeichner, Datenfluss oder die Geometrie eines Diagramms ausgedrückt ist. Automatisierte Wächter sind notwendig und nicht hinreichend; die menschliche Prüfung bleibt.
- Ein Fence erkennt, wofür er geschrieben wurde, und sonst nichts.
- Bestandene Fences begründen, dass die Fences bestanden wurden. Einen regulatorischen Status begründen sie nicht.
Quellen
- GitHub: Control jobs with conditions · offizielle Dokumentation · Geprüft am 2026-09-11
- GitHub: Troubleshooting required status checks · offizielle Dokumentation · Geprüft am 2026-09-11
- GitLab: CI/CD YAML: allow_failure · offizielle Dokumentation · Geprüft am 2026-09-11
- Kubernetes: Dynamic admission control: failure policy · offizielle Dokumentation · Kubernetes 1.37 · Geprüft am 2026-09-11
- Open Policy Agent Gatekeeper: Gatekeeper: enforcement actions · offizielle Dokumentation · Gatekeeper 3.23 · 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
- Kubernetes: Validating Admission Policy · offizielle Dokumentation · Kubernetes 1.37 · Geprüft am 2026-09-11
