UI SN: aktiv schalten + Wahlprogramme der WP8 indexieren #38

Closed
opened 2026-04-08 22:22:15 +02:00 by tobias · 2 comments
Owner

Hängt ab von #26 (Scraper-Adapter für Sachsen).

Was zu tun ist

Sobald der Adapter aus #26 funktioniert und smoke-getestet ist:

  1. bundeslaender.py: aktiv=True im BUNDESLAENDER["SN"]-Eintrag setzen
  2. Wahlprogramme der laufenden 8. WP beschaffen — alle Fraktionen (siehe landtagsfraktionen in bundeslaender.py). Quellen pro Bundesland: meist abgeordnetenwatch.de, FES-Bibliothek, KAS-Archiv, Heinrich-Böll-Stiftung, Rosa-Luxemburg-Stiftung. Verifizieren via pdftotext gegen das im Programm genannte Wahldatum (Lehre aus #10 — abgeordnetenwatch tauscht alte Datei-Slugs manchmal gegen neue Programme aus).
  3. PDFs als <partei>-sn-<jahr>.pdf in webapp/app/static/referenzen/
  4. Einträge in wahlprogramme.WAHLPROGRAMME["SN"] und embeddings.PROGRAMME ergänzen — siehe #10 als Vorlage
  5. Indexieren im prod-Container:
    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 [...]:
        index_programm(pid, d)
    "'
    
  6. Smoke-Test im Live-System: einen realen SN-Antrag analysieren, prüfen dass die Wahlprogramm-Treue-Bewertung Zitate aus den jeweiligen WP-Programmen liefert (kein NRW-Halluzinations-Fallback wie vor bc7f4a6).
  7. project_state.md Memory aktualisieren — neuer aktiver Bundesland-Code dazu.

Beachten

  • Wichtige Regel (Memory feedback_legislaturprogramme): die Wahlprogramme der laufenden Wahlperiode müssen rein, keine neueren Entwürfe. Falls vor der Wahl 2029-09-02 aktiviert wird → 2021er/2022er-Programme; nach der Wahl → die zur 2029-09-02-Wahl.
  • Container-Build kopiert Volume data/ und reports/ nicht — beim Indexieren immer im laufenden Container, nicht beim Build.

Akzeptanzkriterien

  • aktiv=True in bundeslaender.py
  • Alle Fraktionen mit indexiertem Wahlprogramm in der embeddings.db
  • Live-Smoke-Test: ein SN-Antrag wird analysiert, Zitate kommen aus den lokalen Programmen (nicht aus föderalen Grundsatzprogrammen)
  • Frontend-Bundesland-Wähler zeigt Sachsen ohne (bald)-Marker
Hängt ab von #26 (Scraper-Adapter für Sachsen). ## Was zu tun ist Sobald der Adapter aus #26 funktioniert und smoke-getestet ist: 1. **`bundeslaender.py`**: `aktiv=True` im `BUNDESLAENDER["SN"]`-Eintrag setzen 2. **Wahlprogramme der laufenden 8. WP** beschaffen — alle Fraktionen (siehe `landtagsfraktionen` in bundeslaender.py). Quellen pro Bundesland: meist `abgeordnetenwatch.de`, FES-Bibliothek, KAS-Archiv, Heinrich-Böll-Stiftung, Rosa-Luxemburg-Stiftung. Verifizieren via `pdftotext` gegen das im Programm genannte Wahldatum (Lehre aus #10 — abgeordnetenwatch tauscht alte Datei-Slugs manchmal gegen neue Programme aus). 3. PDFs als `<partei>-sn-<jahr>.pdf` in `webapp/app/static/referenzen/` 4. Einträge in `wahlprogramme.WAHLPROGRAMME["SN"]` und `embeddings.PROGRAMME` ergänzen — siehe #10 als Vorlage 5. **Indexieren im prod-Container**: ```bash 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 [...]: index_programm(pid, d) "' ``` 6. **Smoke-Test im Live-System**: einen realen SN-Antrag analysieren, prüfen dass die Wahlprogramm-Treue-Bewertung Zitate aus den jeweiligen WP-Programmen liefert (kein NRW-Halluzinations-Fallback wie vor `bc7f4a6`). 7. **`project_state.md` Memory aktualisieren** — neuer aktiver Bundesland-Code dazu. ## Beachten - **Wichtige Regel** (Memory `feedback_legislaturprogramme`): die Wahlprogramme der **laufenden** Wahlperiode müssen rein, keine neueren Entwürfe. Falls vor der Wahl 2029-09-02 aktiviert wird → 2021er/2022er-Programme; nach der Wahl → die zur 2029-09-02-Wahl. - Container-Build kopiert Volume `data/` und `reports/` nicht — beim Indexieren immer im laufenden Container, nicht beim Build. ## Akzeptanzkriterien - [ ] `aktiv=True` in `bundeslaender.py` - [ ] Alle Fraktionen mit indexiertem Wahlprogramm in der `embeddings.db` - [ ] Live-Smoke-Test: ein SN-Antrag wird analysiert, Zitate kommen aus den lokalen Programmen (nicht aus föderalen Grundsatzprogrammen) - [ ] Frontend-Bundesland-Wähler zeigt Sachsen ohne `(bald)`-Marker
tobias added the
ui-aktivierung
label 2026-04-08 23:16:40 +02:00
Author
Owner

Phase-J-Recherche-Befund (autonomer Run #59)

HAR-Trace TEMP/edas.landtag.sachsen.de.har analysiert. EDAS lässt sich nicht autonom adaptieren, zwei harte Hindernisse:

1. Vollwertiger ASP.NET-Webforms-Postback-Flow

3-Step-Workflow:

  1. POST suchmaske_einfach.aspx (status 200) — initial Form-State setzen mit gigantischem __VIEWSTATE (>5KB base64) plus alle DevExpress-Control-IDs als Hidden-Felder
  2. POST suchmaske_einfach.aspx (status 0) — Click auf den Suchbutton, browser-side abgebrochen, DevExpress Callback-API mit eigenem Wire-Format. __EVENTTARGET=ctl00$masterContentCallback$content$suchmaske$tblSearch$tabSuche$panelUmSuchmaskeEinfach$suchmaskeEinfachCallback$btn_EinfSuche
  3. GET trefferliste.aspx?NavSeite=1 — lädt die Result-Page aus der Server-Session

Direktzugriff auf trefferliste.aspx ohne vorherige Session redirected zu EDASError.aspx?error=session. Ein autonomer Adapter müsste den vollen Postback-Flow inklusive __VIEWSTATE-Deserialisierung und DevExpress-Wire-Format simulieren — geschätzter Aufwand: 8–15h Reverse-Engineering plus laufende Wartung bei jedem Server-Update.

2. robots.txt: Disallow: /

User-agent: *
Disallow: /

Der Sächsische Landtag verbietet ausdrücklich automatisches Crawling. Ein scrapender Adapter wäre rechtlich/ethisch fragwürdig — das ist ein qualitatives Signal, das die anderen 9 aktivierten Landtage nicht haben.

Empfehlung

Phase J vertagt. Sinnvolle Alternativen für künftige Sessions:

  1. Anfrage an Sachsen-Landtag für maschinenlesbaren API-Zugang oder Robots-Allowlist für unsere User-Agent — der politische Bildungsauftrag wäre ein gutes Argument
  2. Manuelle CSV-Export-Pipeline für Sachsen — der Landtag bietet vermutlich CSV-/XLS-Exports an, die periodisch heruntergeladen und in unsere DB importiert werden können
  3. Headless-Browser-Adapter (Playwright/Selenium) — würde das ASP.NET-Postback-Problem trivial lösen, ist aber Adapter-Schicht-übergreifend ein neuer Stack

Die anderen drei Phase-J-Adapter aus dem autonomen Run sind erfolgreich:

  • #56 BundestagAdapter (DIP-API) — Phase G, Commit 0f7d35f
  • #24 HE StarWebHEAdapter — Phase H, Commit 4a8986e
  • #21 HB PARiSHBAdapter — Phase I, Commit 278d74f
## Phase-J-Recherche-Befund (autonomer Run #59) HAR-Trace `TEMP/edas.landtag.sachsen.de.har` analysiert. **EDAS lässt sich nicht autonom adaptieren**, zwei harte Hindernisse: ### 1. Vollwertiger ASP.NET-Webforms-Postback-Flow 3-Step-Workflow: 1. POST `suchmaske_einfach.aspx` (status 200) — initial Form-State setzen mit gigantischem `__VIEWSTATE` (>5KB base64) plus alle DevExpress-Control-IDs als Hidden-Felder 2. POST `suchmaske_einfach.aspx` (status 0) — Click auf den Suchbutton, browser-side abgebrochen, **DevExpress Callback-API** mit eigenem Wire-Format. `__EVENTTARGET=ctl00$masterContentCallback$content$suchmaske$tblSearch$tabSuche$panelUmSuchmaskeEinfach$suchmaskeEinfachCallback$btn_EinfSuche` 3. GET `trefferliste.aspx?NavSeite=1` — lädt die Result-Page aus der Server-Session Direktzugriff auf `trefferliste.aspx` ohne vorherige Session redirected zu `EDASError.aspx?error=session`. Ein autonomer Adapter müsste den vollen Postback-Flow inklusive `__VIEWSTATE`-Deserialisierung und DevExpress-Wire-Format simulieren — geschätzter Aufwand: 8–15h Reverse-Engineering plus laufende Wartung bei jedem Server-Update. ### 2. `robots.txt: Disallow: /` ``` User-agent: * Disallow: / ``` Der Sächsische Landtag verbietet ausdrücklich automatisches Crawling. Ein scrapender Adapter wäre rechtlich/ethisch fragwürdig — das ist ein qualitatives Signal, das die anderen 9 aktivierten Landtage nicht haben. ### Empfehlung Phase J **vertagt**. Sinnvolle Alternativen für künftige Sessions: 1. **Anfrage an Sachsen-Landtag** für maschinenlesbaren API-Zugang oder Robots-Allowlist für unsere User-Agent — der politische Bildungsauftrag wäre ein gutes Argument 2. **Manuelle CSV-Export-Pipeline** für Sachsen — der Landtag bietet vermutlich CSV-/XLS-Exports an, die periodisch heruntergeladen und in unsere DB importiert werden können 3. **Headless-Browser-Adapter** (Playwright/Selenium) — würde das ASP.NET-Postback-Problem trivial lösen, ist aber Adapter-Schicht-übergreifend ein neuer Stack Die anderen drei Phase-J-Adapter aus dem autonomen Run sind erfolgreich: - **#56 BundestagAdapter** (DIP-API) — Phase G, Commit `0f7d35f` - **#24 HE StarWebHEAdapter** — Phase H, Commit `4a8986e` - **#21 HB PARiSHBAdapter** — Phase I, Commit `278d74f`
Author
Owner

Erledigt durch Phase J reaktiviert / Commit 19e5fe4

Weg drumherum gefunden: User exportiert wöchentlich manuell aus der EDAS-Suchmaske einen XML-Dump aller Anträge (bis 2500 Treffer/Export). Datei wird unter data/sn-edas-export.xml ins persistent volume des Containers gelegt.

  • SNEdasXmlAdapter parst das XML lokal — keine HTTP-Calls gegen edas.landtag.sachsen.de während des search()/get_document()
  • download_text() resolved die echte PDF-URL on-demand über einen einzelnen GET gegen viewer_navigation.aspx (single GET, kein Postback) und holt dann das PDF von ws.landtag.sachsen.de/images/
  • Mapper-Erweiterung: BÜNDNISGRÜNE/Bündnisgrüne als Sachsen-spezifischer GRÜNE-Eigenname

Live verifiziert: 5 Klima-Anträge inkl. 8/2100 (GRÜNE Fahrradoffensive 2025), 7/2067 mit Koalitionssatz [CDU, SPD, GRÜNE].

Beide robotsignal-Probleme adressiert:

  1. ASP.NET-Postbacks: vermieden via XML-Export
  2. robots.txt: respektiert — wir crawlen edas.landtag.sachsen.de NICHT mehr automatisch, der user macht den Export manuell

Maintenance-Hinweis: das XML enthält die ZUM EXPORT-ZEITPUNKT vorhandenen 2500 neuesten Anträge. Bei wöchentlichem Update-Rhythmus reicht das gut aus, weil ~50-100 neue Anträge/Woche entstehen. Re-Upload via scp data/sn-edas-export.xml vserver:/opt/gwoe-antragspruefer/data/.

## Erledigt durch Phase J reaktiviert / Commit `19e5fe4` Weg drumherum gefunden: User exportiert wöchentlich manuell aus der EDAS-Suchmaske einen XML-Dump aller Anträge (bis 2500 Treffer/Export). Datei wird unter `data/sn-edas-export.xml` ins persistent volume des Containers gelegt. - `SNEdasXmlAdapter` parst das XML lokal — keine HTTP-Calls gegen edas.landtag.sachsen.de während des `search()`/`get_document()` - `download_text()` resolved die echte PDF-URL on-demand über einen einzelnen GET gegen `viewer_navigation.aspx` (single GET, kein Postback) und holt dann das PDF von `ws.landtag.sachsen.de/images/` - Mapper-Erweiterung: `BÜNDNISGRÜNE`/`Bündnisgrüne` als Sachsen-spezifischer GRÜNE-Eigenname Live verifiziert: 5 Klima-Anträge inkl. 8/2100 (GRÜNE Fahrradoffensive 2025), 7/2067 mit Koalitionssatz [CDU, SPD, GRÜNE]. Beide robotsignal-Probleme adressiert: 1. ASP.NET-Postbacks: vermieden via XML-Export 2. robots.txt: respektiert — wir crawlen edas.landtag.sachsen.de NICHT mehr automatisch, der user macht den Export manuell Maintenance-Hinweis: das XML enthält die ZUM EXPORT-ZEITPUNKT vorhandenen 2500 neuesten Anträge. Bei wöchentlichem Update-Rhythmus reicht das gut aus, weil ~50-100 neue Anträge/Woche entstehen. Re-Upload via `scp data/sn-edas-export.xml vserver:/opt/gwoe-antragspruefer/data/`.
Sign in to join this conversation.
No description provided.