Aktuelle-Themen-Dashboard: RND-News × Anträge × Pressemitteilungs-Vorschläge #170

Closed
opened 2026-05-03 12:20:09 +02:00 by tobias · 1 comment
Owner

Idee

Politisches Dashboard im GWÖ-Antragsprüfer, das aus drei Komponenten besteht:

  1. Top-Themen-Tracker — verfolgt die bundespolitisch dominanten Themen über die Zeit, mit Bewertung aus GWÖ-Sicht.
  2. Themen × Anträge-Matching — verknüpft pressetechnisch aktuelle Themen mit den vorhandenen Anträgen auf den Servern. „Welcher unserer ~35 bewerteten Anträge passt zur aktuellen Debatte über X?"
  3. Pressemitteilungs-Vorschläge — LLM-generierter Vorschlag für eine GWÖ-Pressemitteilung, die einen aktuellen Antrag in den Kontext eines aktuellen Top-Themas stellt.

User-Frage: „Welche spannenden Aussagen könnten aus diesem Kontext entstehen?"

Datenquelle

RND (Radionetzwerk Deutschland) Abo — Login-Credentials liegen lokal in ~/.claude/.rnd-credentials (chmod 600), nicht im Repo. Der Implementer muss die per Umgebungsvariable in den Container hieven (analog zu qwen_api_key etc., siehe app/config.py).

Alternative/Zusatz-Quellen falls RND nicht ausreicht oder per-API zu sperrig: Bundespressekonferenz-Feed, Tagesschau-API, dpa-Auszüge.

Architektur-Skizze

A. Themen-Aggregator (neuer Worker)

  • app/news_aggregator.py — täglicher Cron, der RND-Front-Page (oder Such-API falls verfügbar) scrapt
  • Pro Artikel: Titel, Zusammenfassung, Datum, URL, extrahierte Tags
  • Persistenz in neuer Tabelle news_articles(url, titel, summary, datum, themen JSON, source, fetched_at)
  • Theme-Extraction per LLM oder bestehender Embeddings-Pipeline (siehe app/embeddings.py)
  • Anti-Pattern: nicht jeden RND-Artikel ingestieren, sondern nur die Top-N (Frontpage / Spitzen-Topics)

B. Themen × Anträge Matching

  • app/themen_matching.py — pro News-Artikel und pro Antrag jeweils Embeddings haben (Anträge haben das schon: summary_embedding)
  • Cosine-Similarity News-Embedding × Assessment-Summary-Embedding → Top-K Match
  • API-Endpoint: GET /api/aktuelle-themen?limit=10 — liefert pro Top-Thema eine Liste der dazu passendsten Anträge mit GWÖ-Score
  • Cacheing: Top-Themen werden 1× täglich berechnet, nicht live

C. Pressemitteilungs-Generator

  • app/presse_generator.py — LLM-Call mit Prompt-Template:
    • Input: aktueller News-Artikel + Top-1-Antrag-Match aus GWÖ-DB
    • Output: 200-Wort-Pressemitteilung, die den Antrag in den News-Kontext stellt
    • Tonalität: GWÖ-Sicht, nicht parteipolitisch
  • Manueller Trigger via UI-Button („Pressemitteilung generieren") — kein Auto-Versand
  • Speicherung in neuer Tabelle presse_drafts für Review

D. Dashboard-View

  • Neue Route /aktuelle-themen — separate View, nicht in /auswertungen (passt thematisch nicht zum Auswertungs-Aggregat)
  • Linke Nav: neuer Eintrag „Aktuelle Themen" oder „Presse"
  • Charts:
    • Themen-Verlauf: Stacked-Area-Chart pro Top-Thema über die letzten N Tage
    • Top-Themen-Liste: pro Thema 1-3 passende Anträge mit GWÖ-Score-Badge
    • Generierte Pressemitteilungen: Liste mit Datum, Thema, Antrag, Volltext
  • Reuse: Chart.js ist eingebunden, app/templates/v2/base.html hat das Layout-Pattern

Mögliche spannende Aussagen

  • „GWÖ-Score 8+ Antrag X passt zum aktuellen Top-Thema Y, niemand hat ihn aber im Plenum aufgegriffen"
  • „Die letzten 10 RND-Artikel zum Thema Wohnen referenzieren keinen einzigen Antrag mit GWÖ-Score >7 — Lücke zwischen öffentlicher Debatte und parlamentarischer Praxis"
  • „Pressemitteilungs-Vorschläge sammeln sich in einem Backlog, das einmal pro Woche manuell durchgesehen wird"
  • Kreuztabelle: Welche Fraktionen reagieren in ihren Anträgen auf welche RND-Themen? (verbindet das Stimmverhalten-Feature aus #165 mit Aktualität)

Mehrwert

  • Politische Aktivierung — der Antragsprüfer wird vom Archiv zum Werkzeug. Nicht nur „was wurde bewertet", sondern „was ist gerade relevant".
  • Pressemitteilungs-Qualität — wer GWÖ-Argumente in einem Newsraum bringen will, hat einen vorgenerierten Anker statt einer leeren Seite.
  • Daten-Triangulation — RND-Themen + GWÖ-Bewertung + Stimmverhalten ergibt Aussagen, die kein Einzelsystem liefert.

Implementation-Reihenfolge (Vorschlag)

  1. Phase 1 — RND-Auth + Aggregator-Skelett: Login-Flow, 1 Artikel pro Tag in DB, manueller Trigger.
  2. Phase 2 — Themen × Anträge: Embeddings-Match, einfache Top-K-Liste als JSON-Endpoint.
  3. Phase 3 — Dashboard-View: Themen-Verlauf-Chart + Antrags-Match-Liste.
  4. Phase 4 — Pressemitteilungs-Generator: LLM-Prompt + UI-Button + Drafts-Tabelle.

Phase 1 + 2 sind notwendig, Phase 3 + 4 darauf aufbauend.

Sicherheit / Compliance

  • RND-Login-Daten: nicht ins Repo, nicht in Logs, nicht in Issues. Liegen nur lokal beim Maintainer.
  • Robots.txt von RND prüfen: scrape mit ehrlichem User-Agent, max 1 Request pro Minute, niemals parallel
  • Rechtsfrage: RND-Artikel-Snippets in eigenem Dashboard zeigen ist potentiell urheberrechtlich problematisch. Daher in der UI nur Titel + URL + Datum zeigen, nicht den Volltext. Volltext wird nur intern für Embeddings/Matching verwendet, nicht persistiert oder angezeigt.
  • Pressemitteilungs-Drafts sind ausdrücklich Vorschläge zur Bearbeitung, nicht zum Auto-Versand.

Aufwand (AI-Zeit)

  • Phase 1: kurz (Login-Flow + 1 Tabelle + Cron-Eintrag)
  • Phase 2: mittel (Embeddings-Pipeline anbinden, Threshold-Tuning)
  • Phase 3: mittel (Charts + Templates)
  • Phase 4: kurz (Prompt-Template + Endpoint, Reuse von qwen_bewerter.py)

Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com

## Idee Politisches Dashboard im GWÖ-Antragsprüfer, das aus drei Komponenten besteht: 1. **Top-Themen-Tracker** — verfolgt die bundespolitisch dominanten Themen über die Zeit, mit Bewertung aus GWÖ-Sicht. 2. **Themen × Anträge-Matching** — verknüpft pressetechnisch aktuelle Themen mit den vorhandenen Anträgen auf den Servern. „Welcher unserer ~35 bewerteten Anträge passt zur aktuellen Debatte über X?" 3. **Pressemitteilungs-Vorschläge** — LLM-generierter Vorschlag für eine GWÖ-Pressemitteilung, die einen aktuellen Antrag in den Kontext eines aktuellen Top-Themas stellt. User-Frage: „Welche spannenden Aussagen könnten aus diesem Kontext entstehen?" ## Datenquelle **RND (Radionetzwerk Deutschland) Abo** — Login-Credentials liegen lokal in `~/.claude/.rnd-credentials` (chmod 600), nicht im Repo. Der Implementer muss die per Umgebungsvariable in den Container hieven (analog zu `qwen_api_key` etc., siehe `app/config.py`). Alternative/Zusatz-Quellen falls RND nicht ausreicht oder per-API zu sperrig: Bundespressekonferenz-Feed, Tagesschau-API, dpa-Auszüge. ## Architektur-Skizze ### A. Themen-Aggregator (neuer Worker) - `app/news_aggregator.py` — täglicher Cron, der RND-Front-Page (oder Such-API falls verfügbar) scrapt - Pro Artikel: Titel, Zusammenfassung, Datum, URL, extrahierte Tags - Persistenz in neuer Tabelle `news_articles(url, titel, summary, datum, themen JSON, source, fetched_at)` - Theme-Extraction per LLM oder bestehender Embeddings-Pipeline (siehe `app/embeddings.py`) - Anti-Pattern: nicht jeden RND-Artikel ingestieren, sondern nur die Top-N (Frontpage / Spitzen-Topics) ### B. Themen × Anträge Matching - `app/themen_matching.py` — pro News-Artikel und pro Antrag jeweils Embeddings haben (Anträge haben das schon: `summary_embedding`) - Cosine-Similarity News-Embedding × Assessment-Summary-Embedding → Top-K Match - API-Endpoint: `GET /api/aktuelle-themen?limit=10` — liefert pro Top-Thema eine Liste der dazu passendsten Anträge mit GWÖ-Score - Cacheing: Top-Themen werden 1× täglich berechnet, nicht live ### C. Pressemitteilungs-Generator - `app/presse_generator.py` — LLM-Call mit Prompt-Template: - Input: aktueller News-Artikel + Top-1-Antrag-Match aus GWÖ-DB - Output: 200-Wort-Pressemitteilung, die den Antrag in den News-Kontext stellt - Tonalität: GWÖ-Sicht, nicht parteipolitisch - Manueller Trigger via UI-Button („Pressemitteilung generieren") — kein Auto-Versand - Speicherung in neuer Tabelle `presse_drafts` für Review ### D. Dashboard-View - Neue Route `/aktuelle-themen` — separate View, nicht in `/auswertungen` (passt thematisch nicht zum Auswertungs-Aggregat) - Linke Nav: neuer Eintrag „Aktuelle Themen" oder „Presse" - Charts: - **Themen-Verlauf**: Stacked-Area-Chart pro Top-Thema über die letzten N Tage - **Top-Themen-Liste**: pro Thema 1-3 passende Anträge mit GWÖ-Score-Badge - **Generierte Pressemitteilungen**: Liste mit Datum, Thema, Antrag, Volltext - Reuse: Chart.js ist eingebunden, `app/templates/v2/base.html` hat das Layout-Pattern ## Mögliche spannende Aussagen - „GWÖ-Score 8+ Antrag X passt zum aktuellen Top-Thema Y, niemand hat ihn aber im Plenum aufgegriffen" - „Die letzten 10 RND-Artikel zum Thema Wohnen referenzieren keinen einzigen Antrag mit GWÖ-Score >7 — Lücke zwischen öffentlicher Debatte und parlamentarischer Praxis" - „Pressemitteilungs-Vorschläge sammeln sich in einem Backlog, das einmal pro Woche manuell durchgesehen wird" - Kreuztabelle: Welche Fraktionen reagieren in ihren Anträgen auf welche RND-Themen? (verbindet das Stimmverhalten-Feature aus #165 mit Aktualität) ## Mehrwert - **Politische Aktivierung** — der Antragsprüfer wird vom Archiv zum Werkzeug. Nicht nur „was wurde bewertet", sondern „was ist gerade relevant". - **Pressemitteilungs-Qualität** — wer GWÖ-Argumente in einem Newsraum bringen will, hat einen vorgenerierten Anker statt einer leeren Seite. - **Daten-Triangulation** — RND-Themen + GWÖ-Bewertung + Stimmverhalten ergibt Aussagen, die kein Einzelsystem liefert. ## Implementation-Reihenfolge (Vorschlag) 1. **Phase 1 — RND-Auth + Aggregator-Skelett**: Login-Flow, 1 Artikel pro Tag in DB, manueller Trigger. 2. **Phase 2 — Themen × Anträge**: Embeddings-Match, einfache Top-K-Liste als JSON-Endpoint. 3. **Phase 3 — Dashboard-View**: Themen-Verlauf-Chart + Antrags-Match-Liste. 4. **Phase 4 — Pressemitteilungs-Generator**: LLM-Prompt + UI-Button + Drafts-Tabelle. Phase 1 + 2 sind notwendig, Phase 3 + 4 darauf aufbauend. ## Sicherheit / Compliance - **RND-Login-Daten**: nicht ins Repo, nicht in Logs, nicht in Issues. Liegen nur lokal beim Maintainer. - **Robots.txt von RND** prüfen: scrape mit ehrlichem User-Agent, max 1 Request pro Minute, niemals parallel - **Rechtsfrage**: RND-Artikel-Snippets in eigenem Dashboard zeigen ist potentiell urheberrechtlich problematisch. Daher in der UI nur **Titel + URL + Datum** zeigen, nicht den Volltext. Volltext wird nur intern für Embeddings/Matching verwendet, nicht persistiert oder angezeigt. - **Pressemitteilungs-Drafts** sind ausdrücklich Vorschläge zur Bearbeitung, nicht zum Auto-Versand. ## Aufwand (AI-Zeit) - Phase 1: kurz (Login-Flow + 1 Tabelle + Cron-Eintrag) - Phase 2: mittel (Embeddings-Pipeline anbinden, Threshold-Tuning) - Phase 3: mittel (Charts + Templates) - Phase 4: kurz (Prompt-Template + Endpoint, Reuse von qwen_bewerter.py) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Author
Owner

Vollständig implementiert in commit d54ce23

Alle 4 Phasen ausgeliefert + auf dev deployed.

Live-Stand auf gwoe-dev.toppyr.de

  • 251 News-Artikel ingestiert (Tagesschau 206, Bundestag-aktuell/hib/presse je 15)
  • 251 von 251 mit qwen-v4-Embeddings (alle gematcht)
  • 8 neue API-Endpoints unter /api/aktuelle-themen/...
  • Linke Nav: „Aktuelle Themen" zwischen Auswertungen und Export

Quellen-Auswahl statt RND

Statt RND.de (robots.txt bannt explizit ClaudeBot, GPTBot, CCBot, ChatGPT-User, Google-Extended) werden ausschließlich AI-erlaubende Quellen verwendet:

  • Tagesschau-API (/api2u/news?ressort=inland|ausland|wirtschaft|wissen)
  • Bundestag-RSS (aktuellethemen.rss, pressemitteilungen.rss, hib.rss)

Compliance dokumentiert in app/news_aggregator.py Modul-Docstring.

Erste Live-Aussage

Beispiel-Match aus dev:

[tagesschau/ausland] „Immer mehr unter Druck — Appelle für freien Journalismus"
  → DS 21/4757  GWÖ 9.0/10  sim 0.339  Natur, Klima und Zivilgesellschaft schützen
  → DS 19/2606  GWÖ 9.0/10  sim 0.323  Menstruation enttabuisieren

Cron-Setup auf Server

Neuer Cron-Eintrag fertig in scripts/auto-fetch-news.sh. Vorschlag fürs crontab (auf vserver):

0 5 * * * /opt/gwoe-antragspruefer-dev/scripts/auto-fetch-news.sh gwoe-antragspruefer-dev >> /var/log/gwoe-fetch-news.log 2>&1

Tests

43 neue Tests, Suite jetzt 1048 grün.

Closing.

## Vollständig implementiert in commit d54ce23 Alle 4 Phasen ausgeliefert + auf dev deployed. ### Live-Stand auf gwoe-dev.toppyr.de - **251 News-Artikel** ingestiert (Tagesschau 206, Bundestag-aktuell/hib/presse je 15) - **251 von 251** mit qwen-v4-Embeddings (alle gematcht) - **8 neue API-Endpoints** unter `/api/aktuelle-themen/...` - **Linke Nav:** „Aktuelle Themen" zwischen Auswertungen und Export ### Quellen-Auswahl statt RND Statt RND.de (robots.txt bannt explizit ClaudeBot, GPTBot, CCBot, ChatGPT-User, Google-Extended) werden ausschließlich AI-erlaubende Quellen verwendet: - Tagesschau-API (`/api2u/news?ressort=inland|ausland|wirtschaft|wissen`) - Bundestag-RSS (`aktuellethemen.rss`, `pressemitteilungen.rss`, `hib.rss`) Compliance dokumentiert in `app/news_aggregator.py` Modul-Docstring. ### Erste Live-Aussage Beispiel-Match aus dev: ``` [tagesschau/ausland] „Immer mehr unter Druck — Appelle für freien Journalismus" → DS 21/4757 GWÖ 9.0/10 sim 0.339 Natur, Klima und Zivilgesellschaft schützen → DS 19/2606 GWÖ 9.0/10 sim 0.323 Menstruation enttabuisieren ``` ### Cron-Setup auf Server Neuer Cron-Eintrag fertig in `scripts/auto-fetch-news.sh`. Vorschlag fürs crontab (auf vserver): ``` 0 5 * * * /opt/gwoe-antragspruefer-dev/scripts/auto-fetch-news.sh gwoe-antragspruefer-dev >> /var/log/gwoe-fetch-news.log 2>&1 ``` ### Tests 43 neue Tests, Suite jetzt **1048 grün**. Closing.
Sign in to join this conversation.
No description provided.