# Changelog All notable changes to this project are documented in this file. ## [1.125.2] - 2026-09-12 ### Fixed - v1.125.1s `if: ${{ secrets.SONAR_TOKEN != '' }}` machte den Workflow bei GitHub selbst ungültig (0-Sekunden-Fehlschlag ohne Job-Log, "likely failed because of a workflow file issue") — live im Actions-Lauf verifiziert, nicht nur vermutet. Ersetzt durch reines `continue-on-error: true` auf dem Sonar-Schritt, ohne Bedingung. Erreicht dasselbe Ziel (fehlendes Secret reißt den Workflow nicht mit runter) ohne den ungültigen Ausdruck. ## [1.125.1] - 2026-09-12 ### Fixed - **`.github/workflows/sonarqube.yml` war seit dem 02.09. dauerhaft rot** — nicht mehr wegen Typecheck/Lint (die sind seit Block C1 grün), sondern weil `SONAR_TOKEN` als Repo-Secret nie gesetzt wurde. Der Sonar-Schritt läuft jetzt nur noch, wenn das Secret existiert, und ist zusätzlich `continue-on-error`, damit ein nicht erreichbarer selbst gehosteter SonarQube-Server nicht den ganzen Workflow mit runterreißt. Ergänzt: ein Unit-Test-Schritt (`npm run test:unit`), der bislang trotz des Workflow-Namens „Test and SonarQube" komplett fehlte. - **Der lokale nächtliche SonarQube-Scan auf dem Spark lief seit mindestens dem 09.09. jede Nacht fehl** (`ERROR: no readable token at ~/.sonar-token` — die Datei war schlicht weg), unbemerkt mangels Alarmierung. Kein Code-Fix hierfür möglich: braucht ein frisches Sonar-Token vom Besitzer (Login unter https://sq.martin-bierschenk.de), um sowohl `~/.sonar-token` auf dem Spark als auch das GitHub-Secret wiederherzustellen. ## [1.125.0] - 2026-09-12 ### Security - **Content-Security-Policy ergänzt, vorerst als `Content-Security-Policy-Report-Only`.** Blockiert nichts, meldet aber jeden Verstoß an den neuen Endpunkt `POST /api/csp-report` (loggt über `console.error`/PM2). Die Whitelist ist aus dem tatsächlichen Code abgeleitet: `fonts.googleapis.com`/`fonts.gstatic.com` für zur Laufzeit nachgeladene Schriftarten (`FontPicker.tsx`, `WeeklyView.tsx`), `'unsafe-inline'` für Next.js' App-Router-Hydration und den einen `dangerouslySetInnerHTML`-Block. Kein `