code / werkzeug
Code Guard
Ein Script, das nach jeder Code-Änderung entscheidet, ob eine Aufgabe fertig ist. Nicht das Modell entscheidet das, sondern der Exit-Code.
KI-Agenten schreiben schnell Code, und sie melden genauso schnell „alles grün“, auch wenn es nicht stimmt. Deshalb nehme ich ihnen dieses Urteil ab. Nach jeder Änderung, egal ob sie von mir oder von einem Modell stammt, läuft der Code Guard. Erst wenn er durchläuft, gilt die Aufgabe bei mir als erledigt.
Was er macht
- Er erkennt selbst, welche Prüfungen ein Projekt hat, und fährt die verfügbaren Standardprüfungen in fester Reihenfolge: PHPStan, phpcs, Tests,
composer auditund mehr. Teure Prüfungen laufen nur mit--full. - Dazu kommen eigene Prüfskripte. Jedes ist aus einem Fehler entstanden, den ich irgendwann gemacht oder gefunden habe: Secrets im Repo, riskante Migrationen, Schriften von fremden Servern, veraltete Rechtstexte.
- Was einem Projekt fehlt, meldet er als
MISSING, statt zu raten. - Das Ergebnis landet maschinenlesbar in
docs/.guard/results.json, damit ein Agent seine eigenen Fehler abarbeiten kann. - Er ändert keinen Projektcode. Er prüft nur.
So sieht ein Befund aus
Die Ausgabe hier ist ein vereinfachtes Beispiel aus der Startseite. Drei Prüfungen
bestehen, eine findet Geheimnisse im Repo. Deshalb steht am Ende FAIL
mit Exit-Code 1. Erst nach dem Beheben des Befunds und einem neuen Lauf
kann der Exit-Code 0 sein. Ein Agent kann das Ergebnis zusätzlich in
docs/.guard/results.json lesen; zu jeder Prüfung gibt es ein eigenes Log.
$ code-guard
PASS Statische Analyse
PASS Tests
FAIL Geheimnisse im Repo
PASS Rechtstexte
VERDIKT: FAIL · exit 1
Installation und Aufruf
Das GitHub-Repository enthält das Installationsskript. Nach dem Klonen kannst du
mit --dry-run zuerst sehen, welche Verknüpfungen es anlegen würde.
./install.sh verlinkt den Code Guard anschließend in dein Benutzerkonto.
Bereits vorhandene Dateien werden laut Installationsskript in
~/.claude-config-backups/ gesichert. Das Werkzeug erwartet in meinen
Projekten ein Makefile und einen Docker-Compose-Service namens php.
git clone https://github.com/dasdomaindepot/ddd-code-guard.git
cd ddd-code-guard
./install.sh --dry-run
./install.sh
Im Projektverzeichnis startet der erste Befehl die verfügbaren Standardprüfungen.
Mit --list siehst du vorab, welche Prüfungen erkannt wurden und welche
als MISSING gelten. --install-make ergänzt ein
make guard-Target im Makefile des Projekts. Für die zusätzlichen,
zeitaufwendigen Prüfungen wie Coverage und Mutation Testing gibt es --full.
~/.claude/skills/code-quality/bin/code-guard
~/.claude/skills/code-quality/bin/code-guard --list
~/.claude/skills/code-quality/bin/code-guard --install-make
~/.claude/skills/code-quality/bin/code-guard --full
Welche Prüfungen sind dabei?
Das Inventar hängt vom Projekt ab. Für PHP-Projekte erkennt das Script unter
anderem Composer-Validierung und Sicherheitsaudit, PHPStan, phpcs und Tests.
Falls entsprechende Targets vorhanden sind, kommen Deptrac, Linter, Coverage,
Infection und End-to-End-Tests hinzu. Bei Frontend-Projekten erkennt es
npm-Skripte für Linting, Typprüfung, Tests und Build. Eine nicht vorhandene
Prüfung wird im Inventar als MISSING angezeigt.
Die eigenen Checks suchen beispielsweise nach Geheimnissen in versionierten
Dateien, riskanten neuen Migrationen, abgeschwächten Qualitätsregeln und
statisch erkennbaren Fehlern in Anwendung und Konfiguration. Ist eine lokale
Web-Instanz erreichbar, prüfen weitere Checks unter anderem Sicherheits-Header,
unbeabsichtigte Datei-Freigaben, Seiteninhalt, externe Ressourcen und deutsche
Rechtstexte. Diese Web-Prüfungen brauchen eine passende lokale URL; ohne sie
erscheinen sie im Inventar als MISSING.
Der Exit-Code ist das Urteil
0 alles erfüllt, weiter · 1 Befunde, beheben und neu fahren · 3 unerwartete Nebenwirkung, sofort anhalten
Häufige Fragen
Was bedeutet MISSING?
Der Code Guard hat die Voraussetzungen für diese Prüfung im Projekt nicht
gefunden. --list zeigt das Inventar und den jeweiligen Grund.
Er erfindet keinen Ersatz für ein fehlendes Make-Target oder eine lokale Webseite.
Wann brauche ich --full?
Der normale Aufruf führt die verfügbaren Standardprüfungen aus.
--full nimmt zusätzlich teure Checks wie Coverage, Infection,
End-to-End-Tests und den Asset-Build dazu. Das dauert entsprechend länger.
Was mache ich bei Exit-Code 1?
Lies den gemeldeten Befund und das zugehörige Log, behebe die Ursache und
starte den Code Guard erneut. Die Zusammenfassung liegt maschinenlesbar in
docs/.guard/results.json; die einzelnen Logs stehen unter
docs/.guard/logs/.
Was bedeutet Exit-Code 3?
Der Guard hat eine unerwartete Nebenwirkung im Worktree entdeckt. Halte an
und prüfe die Änderung, bevor du weitere Schritte ausführst. Dieser Code
ist kein gewöhnlicher Prüfungsbefund wie Exit-Code 1.
Zusätzlich gibt es einen Review-Agenten für Claude Code und opencode. Er fährt dasselbe Script und liest danach den Diff auf das, was kein Werkzeug findet: Erfüllt die Änderung die Anforderung? Erfindet sie Services oder Umgebungsvariablen? Ist die Berechtigung auf Objektebene geprüft?
Der Code Guard ist auf meine Projekte zugeschnitten: Symfony, Docker, Makefile, deutsche Rechtslage. Nimm ihn als Anregung, wie du deine eigenen Fehler in Prüfungen verwandelst. Wie das im Alltag aussieht, steht im Beitrag Ein guter Entwickler ist ein fauler Entwickler. Auch mit KI.
Zum Projekt auf GitHub