# Changelog

Alle wichtigen Änderungen an LaWa werden hier dokumentiert.

---

## [1.8.0] - 2026-09-08

### Sicherheit und OpenAI

- Gemeinsamer KI-Dienst für MV und Bayern/BW: POST, serverseitige Session, CSRF-Schutz, Zugangscode ausschließlich aus der Umgebung.
- Fest eingebetteten OpenAI-Schlüssel entfernt; Konfiguration liest ausschließlich Umgebungsvariablen. Der bisherige Schlüssel muss im OpenAI-Konto rotiert werden.
- Wahldaten werden serverseitig geladen; frei übergebene Ergebnisdaten und Cache-Identitäten werden abgewiesen.
- Atomare Limits, begrenzte Auswahl und Promptgröße, globale Generierungssperre und Sperre je Analyse verhindern unkontrollierte Kosten und Doppelgenerierung.
- OpenAI-Fehler, Ablehnungen, abgeschnittene oder zu lange Antworten werden nicht als erfolgreiche Analyse gespeichert.
- Einheitliche Cache-Löschung; Identität berücksichtigt Auswahl, Daten, Vorwahl, Modell und Promptversion. Zusätzliche Ablaufzeit von einer Stunde.
- TLS-Verifikation, Host-Allowlist, Redirect-, Größen- und Gesamtlaufzeitgrenzen für alle Downloads; Shell-Fallbacks entfernt.
- Logs, Sessions und Caches außerhalb des Webroots; strukturierte begrenzte Logs ohne Client-IP, private Dateirechte und Wartungsbefehl.
- HTML-Ausgabe abgesichert; CSP ergänzt. Veraltete asynchrone Antworten können die aktuelle Auswahl nicht mehr überschreiben.

### Daten und Bedienung

- Bayerische Kreiskennungen mit abschließender Null korrekt zugeordnet.
- Bayerische Gesamtstimmen und ältere BW-Stimmen korrekt beschriftet; Legacy-API-Feld bleibt kompatibel.
- Nicht verfügbare BW-Absolutstimmen sind `null`; geschätzte Landesanteile werden sichtbar gekennzeichnet.
- MV-Wahlkreis-Fallback und historischer Landesvergleich korrigiert.
- Discovery aus dem Webrequest entfernt; gezielte Aktualisierung über CLI.
- Mehrfachauswahl wird beim Wahl-/Regionswechsel zurückgesetzt.

### Migration und Prüfung

- Sicherheitsbedingte API-Änderung: KI-Aktionen verwenden authentifizierte JSON-POST-Anfragen; öffentliche Datenabfragen bleiben GET.
- Lokaler Start mit `router.php`; Installationsanleitung, API-Dokumentation und Postman-Sammlung aktualisiert.
- Neue Sicherheits-, Bayern-, Frontend- und HTTP-Regressionstests ergänzen die MV-Fachtests.

---

## [1.7.0] - 2026-09-08

### Hinzugefügt

- Landtagswahl 2016 über die offiziellen LAiV-Archivdateien ergänzt (bisheriger generierter Pfad: HTTP 404).
- Quellen 2021 auf die offiziell verlinkten LAiV-Dateien umgestellt; Quellenregister und API-Aktion `quellen` ergänzt.
- 2026 als Muster dokumentiert und aus der Ergebnisliste ausgeschlossen; finale URLs noch nicht veröffentlicht.

### Korrigiert

- Bestehende Discovery-Caches werden mit belegten Quellen ergänzt; CSV-Caches berücksichtigen die URL.
- Landeserkennung präzisiert, unzulässigen Ersatz durch erste Datenzeile entfernt, leere Landesdaten abgewiesen.
- UTF-8/ANSI-Erkennung korrigiert; Wahlbezirksnummern nicht mehr als Parteistimmen gewertet; absolute Parteisummen exakt geprüft.

### Dokumentiert und geprüft

- Offline-Regressionstests und Quellenbericht ergänzt.
- README mit Quellenstatus, API-Endpunkt und Testanleitung aktualisiert; Versionsanzeige und Kurz-Changelog auf v1.7.0 angehoben.
- Plausibilitätsprüfungen für beide Stimmenarten und jeweils 36 Wahlkreise (2016/2021), API-Smoke-Tests und PHP-Syntaxprüfung erfolgreich.

---

## [1.6.0] - 2026-03-09

### Hinzugefügt
- **Landtagswahl Baden-Württemberg 2026**: Vorläufiges Landesergebnis vom 8. März 2026
- Erste BW-Landtagswahl mit Erst- und Zweitstimmen (neues Wahlrecht)
- Erststimmen-Unterstützung in allen BW-Endpoints (ergebnis, landesergebnis, zusammenfassung)
- Cache-TTL für BW-Wahlen mit Status `laufend`

### Geändert
- BW-Gebiete-Endpoint gibt leere Liste zurück wenn nur Landesergebnis verfügbar (keine Kreisdaten)
- BW-Ergebnis-Endpoint dynamisch `typ` basierend auf Gebietschlüssel (Land vs. Landkreis)

---

## [1.5.0] - 2026-03-09

### Hinzugefügt
- **Kommunalwahl Bayern 2026**: Vollständige Integration der offiziellen Ergebnisse von kommunalwahl2026.bayern.de
- XML-Parsing für Gremienwahl (Kreistag/Stadtrat) und Personenwahl (OB/Landrat)
- Alle 96 bayerischen Landkreise und kreisfreien Städte als Gebiete
- Neue Funktionen: `fetchKommunalwahlXml()`, `parseKommunalwahlGremienXml()`, `parseKommunalwahlPersonenwahlXml()`, `getKommunalwahlGebiete()`, `getKommunalwahlErgebnis()`
- KI-Zusammenfassungen für Kommunalwahl (Einzel- und Vergleichsanalyse)
- Bayernweites Landesergebnis mit Auszählungsfortschritt

### Geändert
- Summary-Cache für laufende Auszählungen mit 10-Minuten-TTL (statt permanentem Cache)
- `kw2026` Status von `geplant` auf `laufend` aktualisiert

---

## [1.4.0] - 2026-03-08

### Hinzugefügt
- **OB-Wahl München 2026**: Live-Ergebnisse der Oberbürgermeisterwahl München im Dropdown für Schwaben
- **OB-Wahl Augsburg 2026**: Live-Ergebnisse der Oberbürgermeisterwahl Augsburg im Dropdown für Schwaben
- HTML-Scraping für Votemanager-Portale (wahlen-muenchen.de, augsburg.de)
- Neue Funktionen `fetchObWahlHtml()`, `parseObWahlHtml()`, `formatObWahlErgebnis()`
- 5-Minuten-Cache für Live-Wahlergebnisse

---

## [1.3.0] - 2026-02-09

### Hinzugefügt
- **Datenverifizierung für Landtagswahlen MV**: Bei Landesergebnissen wird automatisch geprüft, ob die Summe der Parteistimmen mit den gültigen Stimmen übereinstimmt
- Grüner Badge "Dieses Ergebnis ist geprüft" wird bei erfolgreicher Verifizierung angezeigt
- Neue Funktion `verifyLandesergebnis()` in der API
- Neue Funktion `extractLandesRow()` zur Extraktion von Landesergebnissen

### Geändert
- `landesergebnis` Endpoint gibt nun `verified: true/false` zurück (nur bei Landtagswahlen MV)

---

## [1.2.0] - 2026-02-09

### Hinzugefügt
- **Vollständige API-Dokumentation** im Verzeichnis `documentation/`
- `API.md` - Technische Dokumentation aller Endpoints
- `FRONTEND.md` - Bedienungsanleitung für das Frontend
- `EXAMPLES.md` - Curl-Beispielaufrufe
- `LaWa-API.postman_collection.json` - Postman Collection mit 21 Requests
- Architektur-Übersicht mit ASCII-Diagrammen

### Dokumentiert
- KI-Zusammenfassung (Funktionsweise, Konfiguration, Prompt-Struktur)
- Caching-System (Cache-Typen, Dauer, Verzeichnisstruktur)
- Datenverifizierung (Prüfkriterien, Anzeige)
- Multi-Gebiete Vergleich

---

## [1.1.0] - 2026-02-08

### Hinzugefügt
- **Multi-Gebiete Vergleich**: Mehrere Gebiete gleichzeitig vergleichen mit KI-Analyse
- Chip-basierte Auswahl für Gebiete und Wahlbezirke
- Gecachte Multi-Vergleiche werden wiederverwendet

### Verbessert
- KI-Zusammenfassungen beinhalten jetzt historische Vergleiche zur Vorwahl
- Hinweis wenn keine historischen Daten verfügbar sind
- Responsives Design für Multi-Analyse Panel

---

## [1.0.0] - 2026-02-01

### Initial Release
- Wahlergebnisse für Mecklenburg-Vorpommern (Bundestags-, Landtags-, Europawahlen)
- Wahlergebnisse für Schwaben/Bayern/Baden-Württemberg
- Ergebnisse auf Landes-, Kreis-, Gemeinde- und Wahlbezirk-Ebene
- Erst- und Zweitstimmen Visualisierung
- KI-generierte Zusammenfassungen (OpenAI)
- Caching-System für Performance
- Responsive Web-Interface
