Sauberer Code mit Claude Code:
14 Verträge mit 201 Regeln
Wie stellt man sicher, dass KI-generierter Code den eigenen Qualitätsstandards entspricht? Das Vertragssystem validiert jeden Code automatisch gegen 82 kritische Sicherheitsregeln und 119 weitere Qualitätsregeln. Problematischer Code wird blockiert, bevor er geschrieben wird.
Was ist das Vertragssystem?
Stell Dir vor, Du arbeitest mit einem brillanten Entwickler zusammen. Er schreibt Code schneller als jeder Mensch, kennt Dutzende Programmiersprachen und hat Zugriff auf das gesamte Wissen der Software-Entwicklung. Es gibt nur ein Problem: Manchmal schreibt er Code, der zwar funktioniert, aber gegen Eure internen Standards verstößt. Vielleicht eine Sicherheitslücke. Vielleicht ein Architektur-Pattern, das Ihr längst aufgegeben habt.
Das Vertragssystem löst dieses Problem. Es definiert Regeln, die jeder Code erfüllen muss, bevor er geschrieben wird. Nicht nachträglich. Nicht als Empfehlung. Sondern als harte Bedingung, die bei Verstoß den Schreibvorgang blockiert.
Die Grundidee ist einfach: Anstatt Code-Reviews durchzuführen und Fehler zu korrigieren, verhindern wir problematischen Code von vornherein. Das spart Zeit, reduziert Fehler und stellt sicher, dass niemand aus Versehen eine kritische Sicherheitslücke einführt.
Verträge und Regeln
Ein Vertrag ist eine thematische Sammlung von Regeln. Der PHP Security Contract enthält alle Regeln zur PHP-Sicherheit. Der SQL Security Contract alle Regeln zur Datenbank-Sicherheit. Der Code Quality Standards Contract Regeln zur allgemeinen Code-Qualität.
Jede Regel prüft ein spezifisches Pattern im Code:
- Forbidden: Dieses Pattern darf nicht im Code vorkommen. Wird es gefunden, wird der Code blockiert.
- Required: Dieses Pattern muss im Code vorkommen. Fehlt es, wird der Code blockiert.
- Warning: Ein Hinweis ohne Blockierung. Der Code wird geschrieben, aber Claude erhält eine Warnung zur Kenntnisnahme.
Vier Schweregrade
Nicht jede Regelverletzung ist gleich kritisch. Deshalb gibt es vier Schweregrade:
- Critical: Blockiert die Aktion. Der Code wird nicht geschrieben, bis das Problem behoben ist. Das sind typischerweise Sicherheitslücken.
- Major: Warnung im System. Die Aktion wird ausgeführt, aber das Problem sollte beachtet werden. Das sind meist Architektur- oder Qualitätsprobleme.
- Minor: Leichter Hinweis für Best Practices. Wird angezeigt, aber nicht hervorgehoben.
- Info: Rein informativer Hinweis. Wird nur geloggt, keine Anzeige. Für optionale Empfehlungen wie "Tabellen könnten Suchfelder haben".
Warum funktioniert das?
Das System nutzt eine Eigenschaft von KI-Assistenten: Sie reagieren auf Feedback. Wenn Claude Code schreibt und dieser blockiert wird, erhält Claude eine detaillierte Fehlermeldung mit der betroffenen Zeile, der verletzten Regel und einem Vorschlag zur Behebung. Claude korrigiert den Code und versucht es erneut. Innerhalb einer Arbeitssitzung passt sich Claude an die Regeln an. Für sitzungsübergreifende Konsistenz werden die wichtigsten Regeln zusätzlich in der Projektkonfiguration hinterlegt, die Claude bei jedem Start liest.
Das Ergebnis: Sauberer Code von Anfang an, ohne manuelle Reviews.
Wichtiger Hinweis
Diese Seite zeigt echte Verträge und Regeln aus der Praxis. Sie dienen als Referenz und Inspiration. Für den Einsatz in eigenen Projekten müssen die Verträge und Regeln jedoch spezifisch angepasst werden: Andere Projekte haben andere Anforderungen, andere Architektur-Entscheidungen, andere Sicherheitsanforderungen. Was hier als kritisch eingestuft ist, kann in einem anderen Kontext irrelevant sein, und umgekehrt.
Wie funktioniert der Validierungsprozess?
Der Prozess ist dreistufig: Proaktive Guidance, reaktive Validierung und Nachverarbeitung. Alle Stufen laufen in wenigen Millisekunden ab, vollständig automatisch.
┌─────────────────────────────────────────────────────────────────┐ │ DREISTUFIGER VALIDIERUNGSPROZESS │ └─────────────────────────────────────────────────────────────────┘ ┌─────────────┐ │ User │ │ Prompt │ └──────┬──────┘ │ "Erstelle eine SQL-Abfrage..." │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ STUFE 1: PROAKTIVE GUIDANCE │ │ UserPromptSubmit + PreToolUse/Read Hooks │ │ │ │ A) Trigger-Keywords im Prompt: │ │ "SQL" → DB Security | "API" → API Contract | "CSS" → CSS │ │ │ │ B) Beim Lesen von Code-Dateien: │ │ View/*.php → VIEW-, FRB-, NAV- Rules │ │ Controller/* → CQ-, ARCH- Rules │ │ Repository/* → SQL-SEC-, DB- Rules │ │ │ │ Zeigt häufig verletzte Rules aus Analytics (letzte 7 Tage) │ └───────────────────────────────┬─────────────────────────────────┘ │ Claude schreibt Code... │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ STUFE 2: REAKTIVE VALIDIERUNG │ │ PreToolUse Hook (Edit/Write) │ │ │ │ Contract Validator: │ │ • forbidden → Pattern darf NICHT vorkommen │ │ • required → Pattern MUSS vorkommen │ │ • warning → Hinweis ohne Blockierung │ │ │ │ CRITICAL→BLOCK MAJOR→WARN MINOR→INFO INFO→LOG │ └───────────────────────────────┬─────────────────────────────────┘ │ ┌───────────────┴───────────────┐ │ │ ▼ ▼ BLOCK PASS Code wird Code wird NICHT geschrieben geschrieben │ │ │ ▼ │ ┌─────────────────────────────────────────────────────────────────┐ │ │ STUFE 3: NACHVERARBEITUNG │ │ │ PostToolUse Hook │ │ │ │ │ │ • code_analyzer → Extrahiert Code-Entities │ │ │ • fix_permissions → Setzt www-data Berechtigungen │ │ │ • quality_validator → Nachträgliche Qualitätsprüfung │ │ │ • complexity_warning → Warnt bei hoher Komplexität │ │ │ • doku_reminder → Erinnert an Doku-Updates │ │ └─────────────────────────────────────────────────────────────────┘ │ │ └───────────────┬───────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ FEEDBACK AN CLAUDE │ │ • Betroffene Zeile und Regel-ID │ │ • Beschreibung des Problems │ │ • Vorschlag zur Behebung │ │ • Hinweise aus Nachverarbeitung │ └─────────────────────────────────────────────────────────────────┘
Was passiert bei einem kritischen Verstoß?
Nehmen wir an, Claude generiert PHP-Code mit einem eval($userInput). Das ist eine bekannte Sicherheitslücke. Der Validator erkennt das Pattern, blockiert den Schreibvorgang und sendet eine Nachricht zurück:
BLOCKED by PHP-SEC-001 (critical) Violation: eval() function detected Line: 42 Pattern: eval\s*\( Fix: Use json_decode() for data parsing, or a proper template engine for dynamic code. The code was NOT written. Please fix and retry.
Claude erhält diese Information, korrigiert den Code automatisch und versucht es erneut. Innerhalb der Sitzung merkt sich Claude diese Korrekturen und vermeidet die gleichen Fehler.
Das Ergebnis
Sauberer, sicherer Code von Anfang an. Keine manuellen Reviews für bekannte Probleme. Die Regeln werden einmal definiert und dann bei jedem Schreibvorgang automatisch durchgesetzt.
Inhaltsverzeichnis
Grundlagen
- Was ist das Vertragssystem?
- Wie funktioniert der Validierungsprozess?
- Fazit: Verträge als Qualitätsgarantie
Verträge und Regeln
-
API Response Contract
9 Regeln
- api-error-structure major
- api-json-response-required major
- api-no-html-in-json major
- api-pagination-meta major
- http-error-codes-required major
- api-no-die-function critical
- api-no-stack-trace critical
- api-success-field-required critical
- json-content-type-required critical
-
Architecture Gate Contract
8 Regeln
- arch-interface-segregation minor
- arch-no-circular-deps major
- arch-no-raw-sql-in-controllers major
- arch-database-factory-restricted critical
- arch-no-direct-repos-in-controllers critical
- arch-no-domain-infra-dependency critical
- arch-no-infra-in-controllers critical
- arch-strict-types-required critical
-
Bash Security Contract
9 Regeln
- sh-trap-cleanup minor
- sh-use-set-e minor
- sh-no-backticks major
- sh-no-chmod-777 major
- sh-no-hardcoded-paths major
- sh-quote-variables major
- sh-no-curl-pipe-bash critical
- sh-no-eval critical
- sh-no-rm-rf critical
-
CSS Contract
10 Regeln
- css-no-hardcoded-colors minor
- css-no-z-index-magic minor
- css-use-rem-not-px minor
- a11y-focus-styles-required major
- css-min-font-size-16px major
- css-no-id-selectors major
- css-no-inline-styles major
- css-no-white-text-no-bg major
- css-no-dark-text-light-bg critical
- css-no-important critical
-
HTML Security Contract
10 Regeln
- html-charset-utf8 minor
- html-meta-viewport minor
- html-require-button-type minor
- html-require-lang minor
- html-no-http-links major
- html-no-inline-style major
- html-no-target-blank major
- html-require-alt major
- html-require-form-labels major
- html-no-inline-script critical
-
HTML Tables Contract
10 Regeln
- col-search-field-optional info
- str-table-controls-optional info
- tab-data-sortable-optional info
- col-sortable-required major
- js-event-delegation-required major
- htmx-csrf-token-required critical
- js-es-modules-required critical
- nav-no-action-column critical
- nav-no-details-url-pattern critical
- nav-no-modals-for-details critical
-
Htmx Patterns Contract
10 Regeln
- htmx-no-onclick-handlers major
- htmx-prefer-over-fetch major
- form-htmx-required-no-post critical
- htmx-delete-confirm-required critical
- htmx-delete-confirm-required-strict critical
- htmx-delete-csrf-required critical
- htmx-destructive-confirm-required critical
- htmx-patch-csrf-required critical
- htmx-post-csrf-required critical
- htmx-put-csrf-required critical
-
JavaScript Security Contract
18 Regeln
- js-no-console-prod info
- ts-strict-null-checks info
- js-location-href-redirect-check minor
- js-no-atob-sensitive minor
- js-no-insertAdjacentHTML major
- js-no-json-parse-unvalidated major
- js-no-open-redirect major
- js-no-outerhtml major
- js-no-prototype-pollution major
- js-postmessage-origin-check major
- js-no-dangerouslySetInnerHTML critical
- js-no-document-write critical
- js-no-eval critical
- js-no-innerhtml critical
- js-no-javascript-url critical
- js-no-new-function critical
- js-no-setinterval-string critical
- js-no-settimeout-string critical
-
PHP Security Contract
31 Regeln
- php-use-strict-types info
- php-no-global-keyword minor
- php-no-short-tags minor
- php-no-chmod-variable major
- php-no-deprecated-ereg major
- php-no-deprecated-mysql major
- php-no-error-suppression major
- php-no-file-put-contents-user major
- php-no-header-injection major
- php-no-mail-injection major
- php-no-unlink-variable major
- php-popen-validate major
- php-proc-open-validate major
- php-ssrf-validation-warning major
- php-strong-password-hashing-warning major
- php-no-assert-string critical
- php-no-backtick critical
- php-no-create-function critical
- php-no-dynamic-include critical
- php-no-echo-user-input critical
- php-no-eval critical
- php-no-exec-user-input critical
- php-no-exec-concat critical
- php-no-extract-user-input critical
- php-no-parse-str-single critical
- php-no-passthru critical
- php-no-preg-replace-e critical
- php-no-shell-exec critical
- php-no-sql-concat critical
- php-no-system critical
- php-no-unserialize critical
-
Python Contract
50 Regeln
- py-bool-comparison info
- py-no-hardcoded-ip info
- py-no-hardcoded-paths info
- py-no-lambda-assignment info
- py-todo-comment info
- py-use-builtin-generics info
- py-use-enumerate info
- py-use-fstrings info
- py-use-in-operator info
- py-use-pathlib info
- py-use-self-type info
- py-avoid-any-type minor
- py-complex-boolean minor
- py-context-manager-files minor
- py-deprecated-unittest minor
- py-fixme-comment minor
- py-hack-comment minor
- py-no-ambiguous-names minor
- py-no-debug-mode minor
- py-no-deep-nesting minor
- py-no-ftp minor
- py-no-generic-exception minor
- py-no-md5-hash minor
- py-no-sha1-hash minor
- py-none-comparison minor
- py-pascal-case-classes minor
- py-snake-case-functions minor
- py-specify-encoding minor
- py-use-isinstance minor
- py-use-logging-not-print minor
- py-use-union-not-optional minor
- py-no-dynamic-import major
- py-no-importlib major
- py-no-mutable-defaults major
- py-no-relative-imports major
- py-no-silent-failures major
- py-no-ssl-unverified major
- py-no-telnet major
- py-no-unsafe-xml major
- py-typed-collections-required major
- py-no-bare-except critical
- py-no-eval-exec critical
- py-no-hardcoded-credentials critical
- py-no-os-popen critical
- py-no-os-system critical
- py-no-pickle-marshal critical
- py-no-sql-fstring-injection critical
- py-no-subprocess-shell-true critical
- py-no-unsafe-yaml critical
- py-no-wildcard-imports critical
-
SQL Security Contract
10 Regeln
- sql-limit-offset-params-warning minor
- sql-no-select-star major
- sql-orderby-params-warning major
- sql-query-with-variable critical
- sql-no-delete-without-where critical
- sql-no-direct-user-input critical
- sql-no-drop-table critical
- sql-no-string-concat critical
- sql-no-truncate critical
- sql-no-update-without-where critical
-
Text Quality Standards
13 Regeln
- txt-max-sentence-length minor
- txt-no-filler-words minor
- txt-no-clickbait-style major
- txt-no-gerne-phrase major
- txt-no-groundbreaking major
- txt-no-revolutionary major
- txt-no-selbstverstaendlich major
- txt-no-clickbait critical
- txt-no-emojis critical
- txt-no-meta-content-refs critical
- txt-no-meta-documents critical
- txt-no-meta-sources critical
- txt-no-ascii-umlauts major
-
View Structure Contract
8 Regeln
- view-index-table-required major
- url-no-create-use-new critical
- url-no-update-delete-use-methods critical
- view-no-badges critical
- view-no-cards critical
- view-no-cards-container critical
- view-no-form-action critical
- view-no-stats-cards-yagni critical
-
YAML Security Contract
5 Regeln
- yaml-indent-2-spaces minor
- yaml-max-nesting minor
- yaml-no-anchors-aliases major
- yaml-no-duplicate-keys major
- yaml-no-unsafe-load critical
Du kannst Dir die Aufzeichnung hier ansehen:
Als Mitglied der KI-Gemeinschaft kannst Du Dir die vollständige Aufzeichnung ansehen und auf alle 14 Verträge mit 201 Regeln zugreifen.