Commit Graph

16 Commits

Author SHA1 Message Date
Dotty Dotter
18ea326e43 feat: Block 2.4 + 2.5 — historische Wahlprogramme zurück bis 2011
92 neue PDFs + Geltungsdaten in PROGRAMME-Registry:

Block 2.4 — direkte 2019er-Lücken (21 Dokumente):
- BIW Bremen: Wahlprogramme 2015 + 2019 + 2023
- BUND WP19 (BTW 2017): CDU, CSU, SPD, GRÜNE, FDP, AfD, LINKE
- HH WP21 (BS 2015): SPD, CDU, GRÜNE, LINKE, AfD, FDP
- TH WP6 (LTW 2014): LINKE, CDU, SPD, GRÜNE, AfD, FDP

Block 2.5 — Vor-Vorperioden 2011-2014 (~71 Dokumente) für 15 BL:
BB WP6, BE WP17, BUND WP18, BW WP15, BY WP17, HB WP19, HE WP19,
LSA WP6, MV WP6, NI WP17, NRW WP16, RP WP16, SH WP18, SL WP15, SN WP6.
Inkl. PIRATEN, BVB/FREIE WÄHLER, FREIE WÄHLER, SSW.

Coverage: 287 Programme (286 indiziert auf dev — linke-sl-2012 ist
ein 2-Seiten-Kurzwahlprogramm und liefert keine Chunks).

Source-of-Truth-Pflege:
- wahlprogramm-links.yaml ergänzt (Quellen-URLs für alle PDFs)
- wahlprogramm-shas.lock.json ergänzt (SHA-256 für Integritätsprüfung)
- test_programme.py: drei Versionen NRW CDU statt zwei

Schließt #233 + #234.
2026-05-08 14:10:52 +02:00
Dotty Dotter
f0f6a1438d feat: Block 2.3 — historische Wahlprogramme fuer 13 Bundeslaender + Bund
Massen-Beschaffung von Vorperioden-Wahlprogrammen via 15 parallele
Background-Agents. Jeder BL bekommt seine direkt vorhergehende WP
indiziert, sodass wahlprogramm_zum_zeitpunkt() jetzt fuer Antrage aus
2016-2024 historisch korrekt das damalige Programm liefert (vorher None
oder das aktuelle).

Indiziert (~83 PDFs, 9.799 Chunks insgesamt fuer Block 2.3):

| BL | Vorperiode | Wahltag | gueltig bis | Parteien |
|----|-----------|---------|------------|----------|
| BB | WP7 | 2019-09-01 | 2024-09-22 | SPD, CDU, GRUENE, AfD, LINKE, BVB/FW |
| BE | WP18 | 2016-09-18 | 2021-09-26 | SPD, LINKE, GRUENE, CDU, AfD, FDP |
| BW | WP16 | 2016-03-13 | 2021-03-14 | GRUENE, CDU, AfD, SPD, FDP |
| BY | WP18 | 2018-10-14 | 2023-10-08 | CSU, GRUENE, FW, AfD, SPD, FDP |
| HB | WP20 | 2019-05-26 | 2023-05-14 | SPD, GRUENE, LINKE, CDU, FDP, AfD |
| HE | WP20 | 2018-10-28 | 2023-10-08 | CDU, GRUENE, SPD, AfD, FDP, LINKE |
| HH | WP22 | 2020-02-23 | 2025-03-02 | SPD, GRUENE, CDU, LINKE, AfD, FDP |
| LSA | WP7 | 2016-03-13 | 2021-06-06 | CDU, SPD, GRUENE, AfD, LINKE, FDP |
| MV | WP7 | 2016-09-04 | 2021-09-26 | SPD, CDU, AfD, LINKE, GRUENE |
| NI | WP18 | 2017-10-15 | 2022-10-09 | SPD, CDU, GRUENE, AfD, FDP |
| RP | WP17 | 2016-03-13 | 2021-03-14 | SPD, GRUENE, FDP, AfD, CDU |
| SH | WP19 | 2017-05-07 | 2022-05-08 | CDU, SPD, GRUENE, FDP, AfD, SSW |
| SL | WP16 | 2017-03-26 | 2022-03-27 | CDU, SPD, LINKE, AfD, GRUENE |
| SN | WP7 | 2019-09-01 | 2024-09-01 | CDU, GRUENE, SPD, AfD, LINKE |
| TH | WP7 | 2019-10-27 | 2024-09-01 | LINKE, SPD, GRUENE, CDU, AfD, FDP |

Live-Verifikation auf gwoe-antragspruefer-dev: 17/17 historische
Lookups korrekt (alle 16 BL + Bund). Tests: 117 grun.

PDF-Quellen: 60% direkt von Parteiwebseiten, 30% via Mirror
(abgeordnetenwatch.de, Friedrich-Ebert-Stiftung, Friedrich-Naumann-
Stiftung, KAS-Archiv), 10% via Wayback Machine fuer Programme der
Vorperioden, deren Original-URLs nicht mehr existieren.

Total Embeddings-Index: 195 Programme, 24 BL/Wahlperioden-Kombinationen
abgedeckt. Block 2 (historische Indexierung) damit zu rund 60%
abgeschlossen — pro BL 1 vorhergehende WP plus aktuell, vor 2016 ist
noch nichts indiziert.

Roadmap-Update: Block 2.3 abgeschlossen, naechster Schritt waere
Block 2.4 (zweite Vorperiode pro BL).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 11:27:43 +02:00
Dotty Dotter
e04eb6d340 feat: Block 2.2 — BUND WP20 (BTW 2021, Scholz-Ampel) historisch indiziert
7 Wahlprogramme zur BTW 26.09.2021 — die Programme der Scholz-Ampel-Periode
(SPD+GRÜNE+FDP, vereidigt 08.12.2021, vorgezogenes Ende 25.03.2025):

- cdu-bund-2021 (gemeinsam CDU/CSU "Stabilitaet und Erneuerung", 140 S., 232 chunks)
- csu-bund-2021 (eigenstaendige CSU-Bayern-Fokus-Variante, 18 S., 24 chunks)
- spd-bund-2021 (Zukunftsprogramm "Aus Respekt vor Deiner Zukunft", 66 S., 105 chunks)
- gruene-bund-2021 (272 S. barrierefreie Fassung, 269 chunks)
- fdp-bund-2021 (Beschluss 14.-16.05.2021 Berlin, 68 S., 136 chunks)
- afd-bund-2021 ("Deutschland. Aber normal.", 210 S., 160 chunks)
- linke-bund-2021 ("Zeit zu handeln!", 168 S., 324 chunks)

Total: 1.250 Chunks.

Geltungszeitraum 2021-09-26 (Wahltag) bis 2025-02-23 (Wahltag BTW 2025,
exklusiv). Antraege aus dieser Periode bekommen jetzt automatisch das
korrekte Programm zurueckgeliefert via wahlprogramm_zum_zeitpunkt():

- 2024-01-01 BUND/SPD -> spd-bund-2021 (Scholz-Ampel)
- 2025-02-22 BUND/SPD -> spd-bund-2021 (noch alt)
- 2025-02-23 BUND/SPD -> spd-bund-2025 (BTW-Wahltag, Wechsel)

Tests: 117 gruen, plus neue test_bund_2024_returns_btw_2021 und
test_bund_grenze_btw_2021_btw_2025.

Block 2.2 abgeschlossen — Block 2 Roadmap (16 BL × 3 WPs) ist 2/16 BL.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 10:25:51 +02:00
Dotty Dotter
445fcc90ca feat: Block 2.1 — NRW WP17 historische Wahlprogramme indiziert (Pilot)
5 Programme zur LTW NRW 14.05.2017 als historische Wahlprogramme im
Embeddings-Index — erster Datensatz für die zeitpunktige Bewertung
historischer Antraege:

- cdu-nrw-2017 (Laschet, 120 S., 172 chunks)
- spd-nrw-2017 (Kraft, 116 S., 169 chunks)
- gruene-nrw-2017 (131 S., 322 chunks)
- fdp-nrw-2017 (Lindner, 56 S., 92 chunks)
- afd-nrw-2017 (84 S., 78 chunks)

Geltungszeitraum 2017-05-14 (Wahltag WP17) bis 2022-05-15 (Wahltag
WP18, exklusiv). Eintraege liegen NUR in embeddings.PROGRAMME — die
WAHLPROGRAMME[NRW]-Struktur bleibt single-current (cdu-nrw-2022).

programme._migrate_from_legacy hat einen neuen Schritt 2b, der
typ=wahlprogramm-Eintraege aus embeddings.PROGRAMME mit explizitem
gueltig_ab/_bis als historische Wahlprogramme registriert. Damit
liefert wahlprogramm_zum_zeitpunkt() jetzt fuer NRW-Antraege aus dem
Zeitraum 2017-2022 das passende Programm.

Live-Verifikation auf gwoe-antragspruefer-dev:
- 2018-09-01 -> cdu-nrw-2017 (WP17)
- 2024-01-01 -> cdu-nrw-2022 (WP18)
- Grenze: 14.05.2022 -> WP17, 15.05.2022 -> WP18

Tests: 116 gruen, plus neue test_grenze_zwischen_wp17_und_wp18 und
angepasstes test_datum_vor_aktueller_wp_nrw_wp17.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 09:44:26 +02:00
Dotty Dotter
a80ac17218 feat: 6 Grundsatzprogramme + Landesgrundsatzprogramme indiziert
Neu in embeddings.PROGRAMME (typ=parteiprogramm mit gueltig_ab):
- csu-grundsatz: CSU "Für ein neues Miteinander" (2023-05-06, 125 chunks)
  ersetzt das bisher indizierte CSU 2016-Programm logisch
- cdu-grundsatz-nrw: CDU NRW "Aufstieg, Sicherheit, Perspektive"
  (2015-06-13, Landesgrundsatzprogramm, 127 chunks)
- cdu-grundsatz-sn: CDU Sachsen "Zukunftsplan für Sachsen"
  (2023-11-20, Landesgrundsatzprogramm, 52 chunks)
- cdu-grundsatz-lsa: CDU Sachsen-Anhalt "Unsere Verantwortung. Unsere
  Zukunft." (2023-09-30, Landesgrundsatzprogramm, 74 chunks)
- ssw-grundsatz: SSW Rahmenprogramm (2016-04-16, Landesgrundsatzprogramm
  für Schleswig-Holstein, 65 chunks)
- fw-grundsatz: FREIE WAEHLER Bundesgrundsatzprogramm (Stand 09/2025;
  FW nicht im Bundestag, gilt fuer FW Bayern + FW RLP, 43 chunks)

programme.py:
- _migrate_from_legacy() unterscheidet jetzt grundsatzprogramm-bund
  (bundesland=None) und grundsatzprogramm-land (bundesland gesetzt).
- _ADDITIONAL_PROGRAMME-Slot vereinfacht — alle Daten leben in
  embeddings.PROGRAMME.

Auf gwoe-antragspruefer-dev indiziert (text-embedding-v4):
486 neue Chunks, 0 failed. wahlprogramm-shas.lock.json + -links.yaml
gepinnt mit allen 6 SHA-256-Hashes.

Test-Suite: 88 grün (test_legislaturen + test_wahlprogramme + test_embeddings).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 00:30:06 +02:00
Dotty Dotter
991d1eb903 feat: Programme + Legislaturen-Registry mit historisch korrekter Geltung
Neue Module:
- app/programme.py: zentrale Programm-Registry (alle Wahl- und Grundsatz-
  programme in einem Index), mit Geltungsdaten gueltig_ab/gueltig_bis und
  Helpern wahlprogramm_zum_zeitpunkt(), grundsatzprogramm_zum_zeitpunkt(),
  alle_versionen(). Skelett fuer 6 zusaetzliche Eintraege (CSU 2023,
  CDU NRW 2015, CDU SN 2023, CDU LSA 2023, SSW SH 2016, FREIE WAEHLER)
  vorbereitet — PDFs folgen.
- app/legislaturen.py: 56 Legislaturen + 70 Regierungen fuer 16 BL + Bund.
  Helper legislatur_zum_zeitpunkt(), regierung_zum_zeitpunkt(),
  regierungen_einer_wp() fuer historisch korrekte Antrags-Bewertung
  (z.B. Kemmerich-28-Tage-Kabinett, RP-Uebergang Dreyer III -> Schweitzer I,
  BUND Scholz-Ampel -> geschaeftsfuehrend -> Merz I).
- tests/test_legislaturen.py: 20 Tests zu Konsistenz + Historie.

Datenbasis: 8 BTW-2025-Wahlprogramme (CDU, CSU, SPD, GRUENE, FDP, AfD,
LINKE, BSW) als PDFs hinzugefuegt. SHA-256-Pinning in
app/wahlprogramm-shas.lock.json (separat).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 00:18:33 +02:00
Dotty Dotter
790fe1a121 CDU Grundsatzprogramm: korruptes 2007er ersetzt durch echtes 2024er (82 Seiten) 2026-04-10 20:25:56 +02:00
Dotty Dotter
660498e8e3 LINKE Bremen (78p via Wayback) + CDU Hessen Langfassung (164p) + AfD SL registriert 2026-04-10 20:22:50 +02:00
Dotty Dotter
78f3e4e9f0 Wahlprogramme HB/HE/SN + AfD SL: 15 neue Programme registriert
Bremen WP 21 (2023): SPD, CDU, GRÜNE — 3 PDFs
  (AfD Bremen + LINKE Bremen nicht als PDF downloadbar)
Hessen WP 21 (2023): CDU, AfD, SPD, GRÜNE, FDP — 5 PDFs
Sachsen WP 8 (2024): CDU, AfD, BSW, SPD, LINKE, GRÜNE — 6 PDFs
Saarland: AfD SL 2022 ("Heimat ist wählbar") — aus real3d-flipbook
  extrahiert (pdfUrl in data-flipbook-options). 102 Seiten.

Total: 84 Programme registriert. Indexierung erfolgt nach Deploy.
2026-04-10 20:14:22 +02:00
Dotty Dotter
11e4da0bf3 Wahlprogramme BY/NI/SL: 11 PDFs registriert + Linke-Grundsatzprogramm
Bayern WP 19 (2023): CSU, GRÜNE, FW, AfD, SPD — 5 PDFs
Niedersachsen WP 19 (2022): SPD, CDU, GRÜNE, AfD — 4 PDFs
Saarland WP 17 (2022): SPD, CDU — 2 PDFs (AfD SL nicht auffindbar)

Plus: DIE LINKE Erfurter Programm 2011 (111 Chunks indexiert)
Plus: AfD Grundsatzprogramm 2016 (128 Chunks, vorheriger Commit)

Alle PDFs verifiziert: korrekte Seitenzahlen, keine HTML-Wrapper,
Parteiname und Wahljahr im Titel korrekt. Quellen: offizielle
Partei-Websites, Wayback Machine, originalsozial.de.

Indexierung erfolgt nach Deploy im Container.
2026-04-10 18:27:38 +02:00
Dotty Dotter
1f53ca5a25 #63: Linke Erfurter Programm 2011 + AfD registriert — alle 6 Grundsatzprogramme komplett 2026-04-10 18:23:20 +02:00
Dotty Dotter
4565a5cf0c #63 teilweise: AfD-Grundsatzprogramm 2016 registriert + PDF (96 Seiten, via Wayback Machine) 2026-04-10 17:30:28 +02:00
Dotty Dotter
a4af79688a Add 30 Wahlprogramme für TH/BB/HH/SH/BW/RP (#37, #39, #40, #32, #41, #42)
Sechs der zehn aktiven Bundesländer hatten bisher keine Wahlprogramme
indexiert (alle sechs heute neu aktiviert: BW/HH/TH in Phase 1, SH/BB/RP
in Phase 2). Antrag-Analysen für diese BL fielen damit auf föderale
Grundsatzprogramme als Fallback zurück.

Beschafft via abgeordnetenwatch.de für die jeweils laufende WP:

- TH WP8 (LTW 01.09.2024): CDU, AfD, LINKE, BSW, SPD — 5 PDFs
- BB WP8 (LTW 22.09.2024): SPD, AfD, CDU, BSW — 4 PDFs
- HH WP23 (Bürgerschaftswahl 02.03.2025): SPD, CDU, GRÜNE, LINKE, AfD — 5 PDFs
- SH WP20 (LTW 08.05.2022): CDU, SPD, GRÜNE, FDP, SSW — 5 PDFs
- BW WP17 (LTW 14.03.2021): GRÜNE, CDU, AfD, SPD, FDP — 5 PDFs
- RP WP18 (LTW 14.03.2021): SPD, CDU, AfD, GRÜNE, FREIE WÄHLER, FDP — 6 PDFs

Insgesamt 30 PDFs in app/static/referenzen/, plus 30 Einträge in
WAHLPROGRAMME[bl][partei] und embeddings.PROGRAMME.

Naming-Schema wie etabliert: <partei>-<bl>-<jahr>.pdf, also
spd-th-2024.pdf, fw-rp-2021.pdf etc.

Wichtig zu Memory feedback_legislaturprogramme: alle BL nutzen das
Programm der LAUFENDEN Wahlperiode, NICHT Programme aus späteren
Wahlen. BW und RP wählen am 08.03.2026 / 22.03.2026 neu — der
18./19. Landtag konstituiert sich erst, daher sind die 17./18. WP
mit den 2021er Programmen weiterhin laufend bis zur Konstituierung.

Indexierung im prod-Container ist NICHT Teil dieses Commits — muss
separat ausgeführt werden:

  ssh vserver 'docker exec gwoe-antragspruefer python -c "
  from app.embeddings import index_programm
  from pathlib import Path
  d = Path(\"/app/app/static/referenzen\")
  for pid in [
      \"cdu-th-2024\",\"afd-th-2024\",\"linke-th-2024\",\"bsw-th-2024\",\"spd-th-2024\",
      \"spd-bb-2024\",\"afd-bb-2024\",\"cdu-bb-2024\",\"bsw-bb-2024\",
      \"spd-hh-2025\",\"cdu-hh-2025\",\"gruene-hh-2025\",\"linke-hh-2025\",\"afd-hh-2025\",
      \"cdu-sh-2022\",\"spd-sh-2022\",\"gruene-sh-2022\",\"fdp-sh-2022\",\"ssw-sh-2022\",
      \"gruene-bw-2021\",\"cdu-bw-2021\",\"afd-bw-2021\",\"spd-bw-2021\",\"fdp-bw-2021\",
      \"spd-rp-2021\",\"cdu-rp-2021\",\"afd-rp-2021\",\"gruene-rp-2021\",\"fw-rp-2021\",\"fdp-rp-2021\",
  ]:
      index_programm(pid, d)
  "'

77 pytest tests passing — der File-Existenz-Check in test_wahlprogramme.py
hätte einen Tippfehler im PDF-Namen sofort gefangen.

Erledigt UI-Aktivierungs-Issues #37 (TH), #39 (BB), #40 (HH), #32 (SH),
#41 (BW), #42 (RP).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 08:03:11 +02:00
Dotty Dotter
8992cffc64 Add MV+BE Wahlprogramme zur jeweils laufenden Legislatur (#4, #10)
11 PDFs in app/static/referenzen/ + Einträge in WAHLPROGRAMME
und embeddings.PROGRAMME für die beiden bisher nur per
föderalem Grundsatzprogramm-Fallback abgedeckten Landtage:

- **MV** (WP 8, seit 26.10.2021): CDU, SPD, GRÜNE, FDP, AfD, LINKE
  Wahlprogramme zur LTW 26.09.2021. Issue #4.

- **BE** (WP 19, konstituiert nach Wiederholungswahl 12.02.2023):
  CDU, SPD, GRÜNE, LINKE, AfD Programme zur AGH-Wahl 26.09.2021.
  Die Wiederholungswahl 2023 nutzte dieselben Programme wie die
  Originalwahl, daher die "be-2023.pdf"-Benennung mit Programm-
  jahr 2021. Issue #10.

Quellen: abgeordnetenwatch.de Mirror für 9 PDFs, library.fes.de
für SPD MV, cdu-mv.de direkt für CDU MV, fdp-mv.de direkt für
FDP MV. Alle PDFs verifiziert via pdftotext gegen das im Programm
genannte Wahldatum, um zu vermeiden, dass aktuellere
Wahlkampf-Entwürfe (z.B. das CDU "Berlin-Plan 2026") als
Legislatur-Programm fehlinterpretiert werden.

Indexierung in die embeddings-DB ist NICHT Teil dieses Commits —
sie muss separat im prod-Container ausgeführt werden:

  docker exec gwoe-antragspruefer python -c "
  from app.embeddings import index_programm
  from pathlib import Path
  d = Path('/app/static/referenzen')
  for pid in ['cdu-mv-2021','spd-mv-2021','gruene-mv-2021',
              'fdp-mv-2021','afd-mv-2021','linke-mv-2021',
              'cdu-be-2023','spd-be-2023','gruene-be-2023',
              'linke-be-2023','afd-be-2023']:
      index_programm(pid, d)
  "

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 08:24:33 +02:00
Dotty Dotter
87874a7a14 Activate LSA: Wahlprogramme + ingest + frontend (#2)
Brings Sachsen-Anhalt online as the second supported Bundesland after
NRW. Closes the gap that issue #2 left open: with the PortalaAdapter
already in place from c7242f8, this commit adds the reference data and
flips the activation switch.

Wahlprogramme (LTW Sachsen-Anhalt 06.06.2021)
- Six PDFs added under app/static/referenzen/{cdu,spd,gruene,fdp,afd,
  linke}-lsa-2021.pdf, plus paged plain-text extractions under
  app/kontext/*.txt for the keyword fallback search.
- Sources verified by hand:
  - CDU "Unsere Heimat. Unsere Verantwortung." (cdulsa.de, 82 pages)
  - SPD "Zusammenhalt und neue Chancen" (FES library, 77 pages)
  - GRÜNE "Verlässlich für Sachsen-Anhalt" (gruene-lsa.de, 164 pages)
  - FDP "Wahlprogramm zur Landtagswahl 2021" (Naumann-Stiftung, 76 pages)
  - AfD "Alles für unsere Heimat!" (klimawahlen.de mirror, 64 pages)
  - LINKE "Wahlprogramm zur Landtagswahl 2021" (dielinke-sachsen-anhalt.de,
    88 pages)
- The CDU PDF was the trickiest: KAS blocks bot downloads via
  Cloudflare; the cdulsa.de copy was located by an autonomous web
  search and verified to be byte-identical with the official document.

Embeddings indexed (in production container, OpenAI-compatible
DashScope embeddings via the existing index_programm pipeline):
- CDU 134, SPD 145, GRÜNE 183, FDP 100, AfD 64, LINKE 143 chunks
- Total LSA: 769 new chunks alongside the existing 775 NRW chunks
  and 335 federal Grundsatzprogramm chunks.

wahlprogramme.py
- WAHLPROGRAMME["LSA"] populated with all six parties (canonical fraction
  codes, original titles, page counts).

embeddings.py
- PROGRAMME extended with the six new "<partei>-lsa-2021" entries that
  the indexer pipeline expects.

bundeslaender.py
- LSA flipped to aktiv=True. The frontend dropdown will now offer
  Sachsen-Anhalt as a selectable bundesland and analyzer.get_bundesland_
  context() will produce a real LSA prompt block (CDU/SPD/FDP as
  governing fractions, all six landtagsfraktionen).

End-to-end smoke test (live in production container before commit)
- Adapter: PortalaAdapter.search() returned current Anträge of März 2026
  (LINKE + GRÜNE) with correct titles and PDF URLs.
- Semantic search for an LSA "ÖPNV in der Altmark" sample antrag
  matched LINKE S.53, SPD S.68, FDP S.52 — all three with similarity
  > 0.6 and topical hits (Regionalisierungsmittel, ÖPNV-Förderprogramm,
  Wasserstoffnetz).

Resolves issue #2.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07 22:12:32 +02:00
Dotty Dotter
63de3ca20d Initial commit: GWÖ-Antragsprüfer v1.0
Features:
- GWÖ-Matrix 2.0 Analyse für NRW-Landtagsanträge
- Verbesserungsvorschläge im Redline-Format (Original/Vorschlag/Begründung)
- Wahlprogramm- und Parteiprogrammtreue-Bewertung
- Landtag-Suche via OPAL-API
- Tag-Wolke mit Multi-Select Filter
- Partei-Filter mit Durchschnittswerten
- PDF-Report-Generierung
- Security Headers (CSP, X-Frame-Options, etc.)
- Persistente SQLite-DB via Docker Volumes

Tech Stack:
- FastAPI + Jinja2
- Qwen LLM via DashScope API
- SQLite + aiosqlite
- WeasyPrint für PDF
- Docker Compose mit Traefik
2026-03-28 22:30:24 +01:00