Check-Referenz

Jeder Check aus dem PR-Report im Detail — was geprüft wird, wie ein Finding aussieht und was du dann tust. Die Check-Namen im Report verlinken direkt hierher.

Universell (laufen in jedem Repo)

🛡️ secret-scan universell

Sucht in den neuen Zeilen des Diffs nach Klartext-Zugangsdaten: Passwörter, API-Keys, Tokens (inkl. bekannter Präfixe wie ghp_, sk-). Einmal gepusht = kompromittiert — auch wenn der Commit später entfernt wird.

❌ secret-scan — 2 mögliche Klartext-Secrets
WAS TUN

Secret aus dem Code nehmen (z. B. !secret/ENV/Secret-Store), und das Secret rotieren — es war öffentlich. Fehlalarm auf Beispiel-Werten? Pfad per ignore: ausnehmen.

🪢 conflict-markers universell

Findet übrig gebliebene Git-Konflikt-Marker (<<<<<<<, =======, >>>>>>>) in neuen Zeilen — die klassische Folge eines hastig gelösten Merge-Konflikts, die Configs/Code sofort bricht.

❌ conflict-markers — Konflikt-Marker in automations.yaml:88
WAS TUN

Konflikt an der Stelle sauber auflösen, Marker-Zeilen entfernen, erneut pushen.

🗂️ sensitive-files universell

Warnt, wenn sensible Dateien in den PR geraten: .env, private Keys/Zertifikate, Datenbanken, HA-.storage-Dateien. Solche Dateien gehören fast nie ins Repo.

⚠️ sensitive-files — .env im Diff — gehört das ins Repo?
WAS TUN

Datei aus dem PR entfernen + in .gitignore aufnehmen. Enthielt sie echte Secrets: rotieren.

🔍 ai-review universell

Ein LLM (aktuell Claude) liest den kompletten Diff gegen die echten Projekt-Konventionen und findet Logik-Fehler, die kein Linter sieht — Race-Conditions, Restart-Fallen, falsche Modi, vergessene Randfälle. Findings kommen als zeilengenaue Inline-Kommentare mit Begründung + Fix-Vorschlag.

⚠️ Der State-Trigger auf `to: 'off'` löst sofort beim ersten 'off' aus. Presence-Sensoren flackern jedoch häufig … Ergänze ein `for:` …
WAS TUN

Antworte direkt auf das Finding — der Bot begründet oder zieht zurück (und resolved dann den Thread). Steuerbar per ai-review.focus / ai-review.severity in der .codemole.yml.

📊 diff-size

Misst den Umfang des PRs (Zeilen/Dateien). Warnt ab +1000 Zeilen oder >30 Dateien — XXL-PRs sind schwer reviewbar und fehleranfällig.

⚠️ diff-size — Grosser Diff: +1240/-80 in 34 Dateien
WAS TUN

Wenn möglich in kleinere, thematisch getrennte PRs aufteilen.

Profil ha-config (Home-Assistant-Konfiguration)

📏 yamllint

yamllint mit HA-tauglichen Regeln — und nur auf den Zeilen, die der PR ändert. Kosmetik-Regeln (line-length, on/off-truthy, Kommentar-Stil) sind aus; echte Fehler (Parse-Fehler, doppelte Keys, Trailing Spaces) sind an. Bestands-Altlasten der Datei zählen nicht.

❌ yamllint — 2 neue Lint-Fehler in geänderten Zeilen
automations.yaml:34:5: [error] duplication of key "entity_id"
WAS TUN

Die gemeldete Zeile fixen — die Meldung enthält Datei:Zeile:Regel.

✅ ha-validate

Validiert die komplette HA-Konfiguration mit einem aktuellen HA-Core (2026.x) — Schema-Fehler, unbekannte Optionen, kaputte Automationen. Zwei-Pass: Base und Branch werden geprüft, gemeldet werden nur neue Fehler; Umgebungs-Bestandsfehler (z. B. „Unknown device", fehlende Systemlibs) zählen nicht.

❌ ha-validate — 1 neuer Validierungsfehler (hass 2026.7.1, 19 Bestandsfehler der Base ignoriert):
ERROR:…automation:Automation 'X' could not be validated: Service kaputt_ohne_domain does not match format <domain>.<name>
WAS TUN

Der Fehlertext steht im Report — genau die gemeldete Stelle korrigieren.

🔗 includes

Prüft geänderte !include/!include_dir_*-Referenzen: zeigt eine neue Referenz auf eine Datei, die es nicht gibt, startet HA mit kaputter Config.

❌ includes — Fehlende include-Dateien: packages/neu.yaml
WAS TUN

Datei anlegen oder die Referenz korrigieren.

🔐 secret-refs

Prüft neue !secret name-Referenzen gegen secrets.yaml — eine Referenz auf ein nicht definiertes Secret bricht den HA-Start.

❌ secret-refs — !secret wifi_pw2 ist in secrets.yaml nicht definiert
WAS TUN

Secret in secrets.yaml (auf der Instanz) ergänzen oder den Namen korrigieren.

♊ duplicate-ids

Findet doppelte Automation-ids und -aliase. Duplikate überschreiben sich still gegenseitig — eine der Automationen ist dann einfach weg, ohne Fehlermeldung.

❌ duplicate-ids — id "wled_treppe" doppelt vergeben (automations.yaml:120, packages/light.yaml:44)
WAS TUN

Eine der beiden umbenennen (id UND alias eindeutig halten).

⏰ automation-safety

Fängt zwei klassische HA-Fallen in geänderten Zeilen: (1) State-Trigger mit to: aber ohne from: — feuert beim HA-Neustart, weil Entities von unavailable auf ihren Zustand springen (real passierter Bug: Schlafmodus ging nachts im ganzen Haus aus). (2) device_id: statt entity_id: — überlebt keinen Geräte-Austausch.

⚠️ automation-safety — automations.yaml:34 State-Trigger mit `to:` ohne `from:` — feuert beim HA-Neustart (unavailable→on). `from:` ergänzen.
WAS TUN

from: "off" (bzw. den echten Vorzustand) ergänzen; device_id durch die entity_id ersetzen.

🆔 entity-exists opt-in

Prüft jede in neuen Zeilen referenzierte entity_id live gegen deine HA-Instanz (/api/states) — fängt Tippfehler, die häufigste Fehlerklasse überhaupt. Templates und !secret-Zeilen werden übersprungen.

⚠️ entity-exists — 1 unbekannte Entity:
automations.yaml:12 `binary_sensor.flur_obenn` existiert nicht in der HA-Instanz
AKTIVIEREN

ha_url + verschlüsselter ha_token in der .codemole.yml — Token mit dem Secrets-Tool im Browser verschlüsseln, kein Server-Zugriff nötig.

Profil ha-component (HA-Custom-Component)

🐍 python-syntax

Kompiliert jede geänderte .py-Datei (py_compile) — Syntaxfehler fliegen sofort auf, bevor HA die Integration lädt.

❌ python-syntax — Syntaxfehler in 1 Python-Datei(en)
WAS TUN

Datei lokal ausführen/kompilieren, Fehler fixen.

🐍 ruff

Ruff-Lint auf den geänderten Python-Dateien — Style, ungenutzte Importe, häufige Bugs (z. B. Blocking-Calls, die in HA in den async-Loop gehören).

⚠️ ruff — 3 Finding(s): F401 unused import; E722 bare except …
WAS TUN

ruff check --fix lokal laufen lassen, Rest manuell.

📦 manifest

Prüft die manifest.json jeder Komponente auf die HA-Pflichtfelder (domain, name, version, documentation, issue_tracker, codeowners, requirements, iot_class) + gültiges JSON.

❌ manifest — manifest.json fehlt: version iot_class
WAS TUN

Fehlende Felder ergänzen — ohne version lädt HA Custom-Components gar nicht.

📦 hacs

Prüft die hacs.json fürs HACS-Listing (mind. name-Feld). Ohne sie ist die Integration über HACS schlecht/nicht installierbar.

⚠️ hacs — hacs.json fehlt (HACS-Listing problematisch)
WAS TUN

hacs.json mit {"name": "…"} ins Repo-Root.

🌐 translations

Stellt sicher, dass translations/en.json existiert (Pflicht-Sprache) und alle anderen Sprachdateien dieselben Keys haben — fehlende Keys erscheinen im UI als rohe Platzhalter.

⚠️ translations — Translations-Key-Mismatch: de(58 vs 62)
WAS TUN

Fehlende Keys in der gemeldeten Sprache nachziehen (en.json ist die Referenz).

🧾 json-valid

Jede geänderte .json muss parsen — ein Komma zu viel in strings.json bricht sonst die ganze Integration.

❌ json-valid — strings.json: ungültiges JSON (Zeile 12)
WAS TUN

JSON an der gemeldeten Stelle reparieren.

Profil aem-eds (Adobe Edge Delivery / Frontend)

🛟 file-guard

Schlägt an, wenn Dateien gelöscht, geleert oder auffällig geschrumpft werden (>80 % weniger Zeilen) — schützt vor versehentlichem Wegwerfen von Code beim Rebase/Merge.

❌ File Guard — blocks/teaser/teaser.js: 240 → 3 Zeilen (−98 %)
WAS TUN

Prüfen, ob das Absicht war; sonst Datei wiederherstellen. Bewusste Löschungen per PR-Label/Beschreibung kenntlich machen.

📋 pr-vollständigkeit

Die PR-Beschreibung braucht die Pflicht-Abschnitte: Problem, Fix, Before-/After-URL — sonst ist der PR fürs (Kunden-)Review nicht nachvollziehbar.

❌ PR-Vollständigkeit — Fehlt: Problem-Abschnitt, Before- und After-URL
WAS TUN

Beschreibung vervollständigen (Template nutzen); der Check läuft beim nächsten Push erneut.

🧹 js-lint / css-lint

ESLint + Stylelint auf den geänderten Dateien mit dem EDS-Regelwerk (z. B. Imports mit .js-Endung, keine ungenutzten Variablen).

❌ JS Lint — In patterns/patterns.js Zeile 1181: Identifier 'telHref' has already been declared
WAS TUN

Lokal npx eslint <datei> / npx stylelint laufen lassen und fixen.

🔤 placeholder-keys

Neue i18n-Platzhalter im Code müssen in den Placeholder-Sheets (jumo.json …) existieren — sonst rendert die Seite rohe Keys.

❌ Placeholder-Keys — 2 Keys ohne Eintrag: teaser.cta.label …
WAS TUN

Keys im Sheet ergänzen (oder projektweite Ausnahme in testing-rules.json).

🧪 unit-tests

Führt die Jest-Unit-Tests der geänderten Blocks aus (tests/unit/…). Kein Test für einen geänderten Block → Skip-Hinweis.

⚪ Unit Tests — ⏭️ keine Unit-Tests für Block(s) contact-overlay-role angelegt
WAS TUN

Fehlschläge fixen; für neue Logik-Blöcke Tests anlegen.

🖼️ visual-tests

Visuelle Regression pro Block: Playwright-Screenshots gegen committete Baseline-Bilder. Atoms (button, text, image, link) triggern über block-deps.json automatisch die Tests aller Organisms, die sie einbetten.

✅ Visual Tests — 2 Spec(s) gematcht [1 Block-Default, 1 transitive Konsumenten] (via contact-overlay-role→contact-person-portrait)
WAS TUN

Diff prüfen: gewollte Änderung → Baseline aktualisieren (npm run test:visual:update + committen); ungewollt → CSS fixen. Neuen Spec anlegen: Anleitung.

🔄 merge-freshness

Misst, wie weit der Branch hinter seiner Base hängt. >10 Commits = Warnung, >30 = Fehler — je älter der Stand, desto größer das Konflikt-/Regressionsrisiko beim Merge.

❌ Merge Freshness — Branch ist 48 Commits hinter wcms-2777-tokens (bitte rebasen)
WAS TUN

git rebase origin/<base> (oder Base mergen) und pushen.

🧩 static-scans

Statische EDS-Regeln: keine Framework-Imports (React/Vue/jQuery), kein outline: none (WCAG), JS-Bundle-Zuwachs-Warnung (>10 KB) und Token-Compliance — hardcodierte Hex-/rgba-Farben statt var(--…) in neuen CSS-Zeilen (Design-Token-Pflicht).

⚠️ Static Scans — Hardcodierte Farbe statt var(--…) in teaser.css: `color: #e30613;`
WAS TUN

Farbe durch das passende Design-Token ersetzen (Token-Definitionen selbst, --x: #abc;, sind erlaubt). Opt-out projektweit: hardcoded-colors-Ausnahme in testing-rules.json.

Profil wordpress (WordPress-Theme / -Plugin)

🐘 php-lint

Prüft jede geänderte .php-Datei mit php -l auf Syntaxfehler — fällt sofort auf, bevor WordPress den fatalen Parse-Error wirft. Zeigt Datei & Zeile, auch als Inline-Kommentar.

❌ php-lint — Syntaxfehler in 1 von 2 PHP-Datei(en)
WAS TUN

Fehler an der genannten Zeile beheben (fehlendes ;, Klammer etc.).

🧹 phpcs WPCS

Prüft die geänderten .php-Dateien mit phpcs auf sicherheitsrelevante WPCS-Regeln — Output-Escaping, Nonce-Prüfung, Input-Sanitization/-Unslashing, Prepared-SQL. Zwei-Pass: nur neue/geänderte Zeilen — kein Stil-Rauschen, kein Legacy-Ballast. Funde als Inline-Kommentar (gedeckelt auf 20).

⚠️ phpcs — WPCS-Security: 2 Fund(e) auf neuen Zeilen in 1 Datei(en) — 2 inline markiert
WAS TUN

Sicherheitslücke schließen: Ausgaben escapen (esc_html()/esc_attr()), Eingaben sanitizen + wp_unslash(), Nonce prüfen, SQL via $wpdb->prepare(). Sniff-Umfang anpassen: env PHPCS_SNIFFS (leer = voller WPCS).

Opt-in / On-demand (alle Profile)

🔎 page-audit opt-in

Rendert die konfigurierten Seiten auf Base- und Branch-Preview und prüft mit axe-core (WCAG 2.1 A/AA + Best Practice): Kontrast, Button-/Formular-Labels, Landmarks, Heading-Struktur, Alt-Texte. Gemeldet werden nur neue Findings; Timing (DCL/Load/KB) läuft informativ mit.

🔎 Page-Audit — 2 neue Finding(s) gegenüber `main`:
**/de/de/** · DCL 126 ms · Load 127 ms · 6 KB
⚠️ `button-name` (critical): 3 Element(e) — Buttons must have discernible text. z. B. `button[data-action="call"]`
AKTIVIEREN

page-audit.base_url (mit {branch}-Platzhalter) + pages in der .codemole.yml — Beispiel.

⚡ lighthouse on-demand

Voller Lighthouse-Vergleich (Performance/A11y/Best-Practices/SEO + LCP/CLS) zwischen Base- und Branch-Preview. Läuft nie automatisch — nur wenn du das Label lighthouse an den PR hängst (Re-Run: Label entfernen + neu setzen). Self-hosted, keine Google-API.

⚡ Lighthouse — ✅ keine relevante Verschlechterung gegenüber `main`
| /de/de/ | Perf 88 (+11) | A11y 87 | BP 96 (+21) | SEO 61 | LCP 3760 ms · CLS 0.004 |
BEST PRACTICE

Einmal vor Review/Merge bei performance-relevanten PRs (CSS/JS/Bilder/Fonts). Scores schwanken CDN-bedingt ±2–3 Punkte. Details.