Bundespolitik überprüfbar machen — Bundestags-Adapter + Grundsatzprogramm-Lookup #56

Closed
opened 2026-04-09 10:16:33 +02:00 by tobias · 1 comment
Owner

Problem

Der GWÖ-Antragsprüfer ist heute auf Landtags-Drucksachen beschränkt. Anträge des Deutschen Bundestags und der dort vertretenen Fraktionen sind nicht analysierbar, obwohl die Pipeline (Adapter → LLM → Wahlprogramm-Score → Report) generisch genug ist und die Grundsatzprogramme der Bundesparteien (CDU, SPD, GRÜNE, FDP, LINKE, AfD, BSW) bereits in embeddings.PROGRAMME als bundesweit-skalierte Programme vorliegen.

Was fehlt

  1. Bundestags-Adapter (neuer BundestagAdapter in app/parlamente.py oder app/parlamente/bundestag.py)

    • Quelle: DIP (Dokumentations- und Informationssystem) https://dip.bundestag.de/api/v1/ — offene REST-API mit gut dokumentiertem Schema, kein Scraping nötig
    • API-Key kostenlos beantragbar (siehe https://dip.bundestag.de/über-dip/hilfe/api), Rate-Limit großzügig
    • Mappt dip.vorgang-Records auf bestehende Drucksache-dataclass
    • Filtert auf vorgangstyp=Antrag (analog zur Type-Filter-Konvention der Landtags-Adapter)
  2. bundeslaender.py-Eintrag für den Bund

    • Sonder-Code BUND (oder DE) mit landtagsfraktionen = aktueller Bundestag (CDU/CSU, SPD, GRÜNE, FDP, LINKE, AfD, BSW)
    • wahlperiode_start und naechste_wahl aus den 21. Wahlperiode-Daten
    • aktive_bundeslaender() muss BUND mitliefern, oder es gibt eine separate aktive_parlamente()-Funktion (sauberer)
  3. Grundsatzprogramm-Lookup im Wahlprogramm-Resolver

    • Heute hat wahlprogramme.find_relevant_quotes(text, fraktionen, bundesland) einen harten Bundesland-Lookup. Für Bundestags-Anträge muss der Resolver auf das Grundsatzprogramm (PROGRAMME[*].bundesland is None) der Bundespartei zurückfallen.
    • In embeddings.py PROGRAMME sind die Grundsatzprogramme der Bundesparteien bereits als bundesland=None-Einträge vorhanden (laut aktive_bundeslaender-Logik). Verifikation: einmal PROGRAMME listen und prüfen, welche Grundsatzprogramme tatsächlich indexiert sind.
  4. CDU/CSU-Disambiguierung (siehe Parteinamen-Mapper-Issue)

    • Bundestagsfraktion heißt offiziell CDU/CSU, ist aber zwei Parteien mit getrennten Wahlprogrammen
    • Der Mapper braucht einen kanonischen Schlüssel CDU-CSU-FRAKTION mit Lookup-Strategie: bei Zitat-Bedarf gegen das CDU-Grundsatzprogramm primär, das CSU-Grundsatzprogramm sekundär scoren
  5. UI-Anpassung

    • Im Bundesland-Dropdown der Webapp ein Sondereintrag 'Deutscher Bundestag'
    • Im Report-Header klare Kennzeichnung 'Bundestag (21. Wahlperiode)' statt eines Bundesland-Labels

Bezug zu offenen Issues

  • Hängt am Parteinamen-Mapper (separates Issue) — CDU/CSU-Auflösung muss zentral sein
  • Bestehende Sub-Issue-A (#51) Live-Adapter-Tests müssen um den BUND-Eintrag erweitert werden
  • Bestehende Sub-Issue-D (#54) Citation-Property-Verification muss Grundsatzprogramm-Lookups tolerieren (prog_bl is None ist legitim für Bundes-Anträge)

Acceptance Criteria

  • BundestagAdapter mit DIP-API-Anbindung, Rate-Limit-handling, Type-Filter
  • BUND in bundeslaender.py als 17. 'Parlament', aktive_parlamente()-Funktion oder Erweiterung von aktive_bundeslaender()
  • find_relevant_quotes() fällt für BUND-Anträge auf Grundsatzprogramme zurück
  • CDU/CSU-Disambiguierung im Parteinamen-Mapper umgesetzt (Folge-Issue)
  • Webapp-Dropdown enthält 'Deutscher Bundestag'
  • Mindestens 1 Test-Antrag aus DIP analysiert + Report verifiziert
  • Sub-Issue-A Live-Test um BUND erweitert, Sub-Issue-B Ground-Truth-Sample für BUND kuratiert

Bewusst NICHT in scope

  • EU-Parlament / Europäische Bürgerinitiativen — separates Folge-Issue, würde mehrsprachige Wahlprogramme erfordern
  • Bundesrat-Drucksachen — sind keine politischen Anträge im Sinne der GWÖ-Bilanzierung, sondern Länderkammer-Vorlagen
  • Historische Wahlperioden des Bundestags — Pipeline läuft nur gegen die laufende WP, alte Anträge wären für GWÖ-Bilanzierung wenig relevant
## Problem Der GWÖ-Antragsprüfer ist heute auf Landtags-Drucksachen beschränkt. Anträge des Deutschen Bundestags und der dort vertretenen Fraktionen sind nicht analysierbar, obwohl die Pipeline (Adapter → LLM → Wahlprogramm-Score → Report) generisch genug ist und die Grundsatzprogramme der Bundesparteien (CDU, SPD, GRÜNE, FDP, LINKE, AfD, BSW) bereits in `embeddings.PROGRAMME` als bundesweit-skalierte Programme vorliegen. ## Was fehlt 1. **Bundestags-Adapter** (neuer `BundestagAdapter` in `app/parlamente.py` oder `app/parlamente/bundestag.py`) - Quelle: DIP (Dokumentations- und Informationssystem) https://dip.bundestag.de/api/v1/ — offene REST-API mit gut dokumentiertem Schema, kein Scraping nötig - API-Key kostenlos beantragbar (siehe https://dip.bundestag.de/über-dip/hilfe/api), Rate-Limit großzügig - Mappt `dip.vorgang`-Records auf bestehende `Drucksache`-dataclass - Filtert auf `vorgangstyp=Antrag` (analog zur Type-Filter-Konvention der Landtags-Adapter) 2. **`bundeslaender.py`-Eintrag** für den Bund - Sonder-Code `BUND` (oder `DE`) mit `landtagsfraktionen` = aktueller Bundestag (CDU/CSU, SPD, GRÜNE, FDP, LINKE, AfD, BSW) - `wahlperiode_start` und `naechste_wahl` aus den 21. Wahlperiode-Daten - `aktive_bundeslaender()` muss BUND mitliefern, oder es gibt eine separate `aktive_parlamente()`-Funktion (sauberer) 3. **Grundsatzprogramm-Lookup im Wahlprogramm-Resolver** - Heute hat `wahlprogramme.find_relevant_quotes(text, fraktionen, bundesland)` einen harten Bundesland-Lookup. Für Bundestags-Anträge muss der Resolver auf das **Grundsatzprogramm** (`PROGRAMME[*].bundesland is None`) der Bundespartei zurückfallen. - In `embeddings.py` `PROGRAMME` sind die Grundsatzprogramme der Bundesparteien bereits als `bundesland=None`-Einträge vorhanden (laut `aktive_bundeslaender`-Logik). Verifikation: einmal `PROGRAMME` listen und prüfen, welche Grundsatzprogramme tatsächlich indexiert sind. 4. **CDU/CSU-Disambiguierung** (siehe Parteinamen-Mapper-Issue) - Bundestagsfraktion heißt offiziell `CDU/CSU`, ist aber zwei Parteien mit getrennten Wahlprogrammen - Der Mapper braucht einen kanonischen Schlüssel `CDU-CSU-FRAKTION` mit Lookup-Strategie: bei Zitat-Bedarf gegen das CDU-Grundsatzprogramm primär, das CSU-Grundsatzprogramm sekundär scoren 5. **UI-Anpassung** - Im Bundesland-Dropdown der Webapp ein Sondereintrag 'Deutscher Bundestag' - Im Report-Header klare Kennzeichnung 'Bundestag (21. Wahlperiode)' statt eines Bundesland-Labels ## Bezug zu offenen Issues - Hängt am Parteinamen-Mapper (separates Issue) — CDU/CSU-Auflösung muss zentral sein - Bestehende Sub-Issue-A (#51) Live-Adapter-Tests müssen um den BUND-Eintrag erweitert werden - Bestehende Sub-Issue-D (#54) Citation-Property-Verification muss Grundsatzprogramm-Lookups tolerieren (`prog_bl is None` ist legitim für Bundes-Anträge) ## Acceptance Criteria - [ ] `BundestagAdapter` mit DIP-API-Anbindung, Rate-Limit-handling, Type-Filter - [ ] BUND in `bundeslaender.py` als 17. 'Parlament', `aktive_parlamente()`-Funktion oder Erweiterung von `aktive_bundeslaender()` - [ ] `find_relevant_quotes()` fällt für BUND-Anträge auf Grundsatzprogramme zurück - [ ] CDU/CSU-Disambiguierung im Parteinamen-Mapper umgesetzt (Folge-Issue) - [ ] Webapp-Dropdown enthält 'Deutscher Bundestag' - [ ] Mindestens 1 Test-Antrag aus DIP analysiert + Report verifiziert - [ ] Sub-Issue-A Live-Test um BUND erweitert, Sub-Issue-B Ground-Truth-Sample für BUND kuratiert ## Bewusst NICHT in scope - **EU-Parlament / Europäische Bürgerinitiativen** — separates Folge-Issue, würde mehrsprachige Wahlprogramme erfordern - **Bundesrat-Drucksachen** — sind keine politischen Anträge im Sinne der GWÖ-Bilanzierung, sondern Länderkammer-Vorlagen - **Historische Wahlperioden des Bundestags** — Pipeline läuft nur gegen die laufende WP, alte Anträge wären für GWÖ-Bilanzierung wenig relevant
Author
Owner

Erledigt durch Roadmap-Phase G / Commit 0f7d35f

  • BundestagAdapter in app/parlamente.py mit DIP-API + Origin-Header-Auth + Cursor-Pagination
  • API-Key (SbGXhWA.3cpnNdb8rkht7iWpvSgTP8XIG88LoCrGd4) aus dip-config.js gescraped — öffentlich verfügbar
  • BUND-Eintrag in bundeslaender.py als 17. Parlament-Slot, wahlperiode=21, Kabinett Merz
  • Parteinamen-Mapper aus #55 parst "Fraktion der AfD" direkt zu "AfD" — keine Adapter-spezifische Logik nötig
  • 176 Unit-Tests grün

Live verifiziert auf https://gwoe.toppyr.de:

curl /api/search-landtag?q=Klima&bundesland=BUND&limit=3
  21/4939 | [AfD]   | Antrag auf abstrakte Normenkontrolle...
  21/4952 | [GRÜNE] | E-Auto-Förderung wirksam ausrichten...
  21/4951 | [GRÜNE] | Klimaschutzprogramm als Entlastungsprogramm

Issue kann geschlossen werden. CDU/CSU-Disambiguierung im Mapper, Grundsatzprogramm-Lookup-Fallback und UI-spezifische Anpassungen für die Detail-Ansicht ("Bundestag" statt "Bundesland"-Label) sind separate Folge-Items, die nur dann Wert haben, sobald echte BUND-Anträge analysiert werden.

## Erledigt durch Roadmap-Phase G / Commit `0f7d35f` - `BundestagAdapter` in `app/parlamente.py` mit DIP-API + Origin-Header-Auth + Cursor-Pagination - API-Key (`SbGXhWA.3cpnNdb8rkht7iWpvSgTP8XIG88LoCrGd4`) aus `dip-config.js` gescraped — öffentlich verfügbar - BUND-Eintrag in `bundeslaender.py` als 17. Parlament-Slot, `wahlperiode=21`, Kabinett Merz - Parteinamen-Mapper aus #55 parst `"Fraktion der AfD"` direkt zu `"AfD"` — keine Adapter-spezifische Logik nötig - 176 Unit-Tests grün Live verifiziert auf https://gwoe.toppyr.de: ``` curl /api/search-landtag?q=Klima&bundesland=BUND&limit=3 21/4939 | [AfD] | Antrag auf abstrakte Normenkontrolle... 21/4952 | [GRÜNE] | E-Auto-Förderung wirksam ausrichten... 21/4951 | [GRÜNE] | Klimaschutzprogramm als Entlastungsprogramm ``` Issue kann geschlossen werden. CDU/CSU-Disambiguierung im Mapper, Grundsatzprogramm-Lookup-Fallback und UI-spezifische Anpassungen für die Detail-Ansicht ("Bundestag" statt "Bundesland"-Label) sind separate Folge-Items, die nur dann Wert haben, sobald echte BUND-Anträge analysiert werden.
Sign in to join this conversation.
No description provided.