Dotty Dotter
565849bd84
feat(#139,#129,#138,#141): v2-Frontend (ECOnGOOD-CD), Login-Modal, Auto-DL, OG-Cards
...
v2-Frontend (#139 , ECOnGOOD CD Manual Juni 2024):
- app/static/v2/: tokens.css, fonts.css, v2.css, Nunito-Sans woff2, Phosphor-Icons (21 SVGs)
- app/templates/v2/: base.html + 11 Screens + 8 Component-Macros
- AppShell mit Sidebar (Lesen/Pruefen/Daten/Admin), v2-Detail mit allen Features
(ScoreHero, MatrixMini, QuoteCard, Redline, Fraktions-Scores)
- v2 ist jetzt Default unter / — classic unter /classic
- Login-Modal in v2-Topbar mit Tabs Anmelden/Registrieren (#129 )
- Phosphor-Icons in Sidebar + Topbar mit dynamischem Theme-Toggle
- Keyboard-Shortcuts (j/k/Enter/Esc/?/path), Landtag-Suche, Antrag-Historie,
Sort-Dropdown, Matrix-Feld-Info-Modal, Bookmarks/Comments/Voting/Share/Re-Analyze
Backend-Erweiterungen:
- main.py: ~30 neue Routes (/v2/*, /antrag/{ds}, /api/auth/{login,refresh,logout},
/api/me/merkliste/*, /api/admin/*, /v2/admin/*, OG-Cards, etc.)
- og_card.py + og_template: Open-Graph-Bilder via Playwright (#141 )
- wahlprogramm_fetch.py + wahlprogramm-links.yaml: SHA-Gate Auto-DL (#138 )
- auswertungen.py: BL-Filter + get_wahlperioden Helper (#137 )
- auth.py: Direct-Access-Grant + Refresh-Token-Cookie
Classic-Updates:
- Header-DRY via _header.html, Auswertungen redirected, Batch-Inline raus
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 20:55:57 +02:00
Dotty Dotter
58731af83c
feat(db): Merkliste server-seitig + Monitoring-Tabellen + abgeordnetenwatch
...
- merkliste(user_id, antrag_id, created_at, notiz) (#140 Schema)
- monitoring_scans + monitoring_daily_summary (#135 )
- abgeordnetenwatch_polls + abgeordnetenwatch_votes (#106 )
- merkliste_add/remove/list/bulk_add Funktionen
- list_all_subscriptions() fuer Admin-View
- get_abstimmungsverhalten(drucksache, bundesland) JOIN-Aggregation
- merkliste, fehlende_programme, share_*, monitoring-Spalten via ALTER TABLE
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 20:55:16 +02:00
Dotty Dotter
8f0f6d6e32
refactor( #136 ): DDD-Lightweight Tag 1-4 (Ports, Adapter, Repositories, Domain-Verhalten)
...
ADR 0008: Lightweight-Migration ohne Package-Split
- ports/llm_bewerter.py: Protocol + LlmRequest-Dataclass
- adapters/qwen_bewerter.py: Qwen/DashScope-Adapter mit Retry-Loop
- repositories/{antrag,bewertung,abonnement}_repository.py: Protocol + Sqlite-Impl + InMemory-Fake
- analyzer.py refactored: nimmt Optional[LlmBewerter], AsyncOpenAI-Import raus
- models.py: 5 Domain-Methoden auf Bewertung/MatrixEntry
(ist_ablehnung, hat_fundamental_kritisches_feld, verletzt_score_cap, ...)
- analyzer loggt WARNING wenn LLM Score-Cap-Invariante verletzt
Folge-PR: Callsite-Migration in main.py (~21 direkte database.*-Aufrufe)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 20:55:16 +02:00
Dotty Dotter
2c0e94d29d
feat(#106,#135,#128): Monitoring + abgeordnetenwatch + Wahlprogramm-Check
...
- monitoring.py: taeglicher Scan-Adapter aller aktiven BL, kein Auto-Fetch (#135 )
- monitoring_digest.html: Mail-Template mit '0-Kontext'-Hinweis
- abgeordnetenwatch.py + sync_*.py: Phase 1 Roll-Call-Voting (#106 )
- 17 Parlamente (16 BL + BT)
- 9 BL-spezifische Drucksachen-Patterns + Date-Title-Fallback
- 28977 Votes fuer BUND in DB
- wahlprogramm_check.py: fehlende Programme erkennen (#128 )
- NI-Skip-Liste, NRW Empty-Query-Fallback
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 20:55:16 +02:00
Dotty Dotter
ad1db2a924
feat: 16 BL-Adapter, Drucksache-Typen, Mail-Digest, Clustering, Redline-Parser
...
- 16 aktive BL-Adapter + BUND (parlamente.py 3397 LOC)
- drucksache_typen.py: BL-spezifische Typ-Normalisierung (#127 )
- mail.py: SMTP + Daily-Digest (#124 )
- clustering.py: Embedding-Naehe-Graph + Bubble-Chart (#105 )
- redline_utils.py: §INS§/§DEL§-Parser + PDF-Cite-URL-Builder
- embeddings v3->v4 Migration (#123 , ADR 0006)
- chart.js + d3.v7 als statische Assets fuer Auswertungen-Cluster
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 20:54:50 +02:00
Dotty Dotter
4fbdc1522a
#114 Dark Mode: CSS-Variables + Toggle + prefers-color-scheme + localStorage
2026-04-10 23:56:29 +02:00
Dotty Dotter
16f8caedc1
#103 Registrierung + Admin-Freischaltung + Matrix-Modal-Fix + Issues
...
Registrierung:
- POST /api/auth/register: erstellt User in Keycloak mit enabled=false
- GET /api/auth/pending-users: Liste nicht-freigeschalteter User (Admin)
- POST /api/auth/approve-user: User freischalten (Admin)
- Registrierungs-Dialog im Hamburger-Menü
- Admin: "Freischaltungen"-Button (nur sichtbar mit admin-Rolle)
Matrix:
- Zeilen-Header klickbar → Erklärung der Berührungsgruppe mit
konkretem Lebensalltag-Beispiel
- Spalten-Header klickbar → Erklärung des Werts mit Staatsprinzip
- Feld-Erklärungen: 25 konkrete Bürger:innen-Texte (Schule, Bus,
Miete, Steuer, Spielplatz...)
- Spalten nummeriert: "1. Menschenwürde" etc.
Neue Issues angelegt:
#104 Zeitreihe, #105 Clustering, #106 Abstimmungsverhalten,
#107 Vergleichsansicht, #108 Empfehlungen, #109 Share-Buttons
2026-04-10 23:53:05 +02:00
Dotty Dotter
221d9426b7
Matrix: Header klickbar + konkrete Bürger:innen-Texte aus dem Lebensalltag
2026-04-10 23:43:57 +02:00
Dotty Dotter
632064d98f
Fix: Matrix-Modal onclick via data-Attribute statt inline JS-Quoting
2026-04-10 23:40:21 +02:00
Dotty Dotter
14e2e1eee2
Matrix klickbar: Feld-Info-Modal mit Bürger:innen-Erklärungen + Spalten nummeriert
...
Klick auf jedes Matrix-Feld öffnet ein Modal mit:
- Feld-Code + voller Name (z.B. "D4: Soziale Gestaltung")
- Zeile + Spalte in Klartext
- "Was bedeutet das für Bürger:innen?" Erklärung (25 Texte)
- Falls bewertet: Aspekt aus der LLM-Analyse + Rating-Farbe
- Falls nicht bewertet: "Dieses Feld wird vom Antrag nicht berührt"
Spaltenüberschriften: "1. Menschenwürde" statt nur "Menschenwürde"
2026-04-10 23:38:37 +02:00
Dotty Dotter
3e7154720b
Fix: PRAGMA cursor muss fetchall() vor iteration
2026-04-10 23:34:55 +02:00
Dotty Dotter
e6e8787df8
Queue-Persistenz: drucksache in jobs-Tabelle + stale Jobs nach Restart im Panel sichtbar
2026-04-10 23:32:40 +02:00
Dotty Dotter
13714410ab
Batch+Queue ins Hamburger: Overlay-Panels mit Live-Status, Queue immer sichtbar
2026-04-10 23:27:27 +02:00
Dotty Dotter
cf313bd257
#100 Sortierung: Dropdown mit 6 Optionen (Score/Datum/Nr/Titel) + localStorage-Persistenz
2026-04-10 23:26:05 +02:00
Dotty Dotter
8e19f6cffa
Batch: search-Multiplier 3x→10x — genug Anträge nach Typ-Filter
2026-04-10 23:21:32 +02:00
Dotty Dotter
f4b7b000a1
Graceful Shutdown v2: Queue sperren + nur laufende Jobs abwarten
...
- _shutting_down Flag: sperrt enqueue() bei Shutdown → User bekommt
"Server wird neu gestartet" statt stilles Einreihen in tote Queue
- graceful_shutdown wartet NUR auf processing-Jobs (nicht ganze Queue)
- Queued-Jobs bleiben in DB als stale → User kann nach Restart re-triggern
- Timeout 15 min (900s) — ein LLM-Call dauert max ~120s
- stop_grace_period: 15m in docker-compose
- get_queue_status() meldet shutting_down für UI-Feedback
2026-04-10 23:20:23 +02:00
Dotty Dotter
2dc504ffea
Graceful Shutdown: Queue wartet auf laufende Jobs + stop_grace_period 5m
2026-04-10 23:17:46 +02:00
Dotty Dotter
d24949740b
#99 Queue: 3 parallele Worker + Job-Visualisierung + Admin-Schutz
...
Queue (queue.py):
- QUEUE_CONCURRENCY ENV (default 3) statt hartcodiert 1
- N Worker-Coroutines via asyncio tasks (nicht Semaphore — jeder
Worker pickt eigenständig von der Queue)
- Per-Job-Tracking: job_id → {status, drucksache, duration, error}
- get_queue_status() liefert jobs-Array für UI-Tabelle
Visualisierung (index.html):
- Fortschrittsbalken (X/Y fertig, grün)
- Job-Tabelle: Drucksache + Status-Icon + Dauer
- Fertige Jobs klickbar → Detail-Ansicht
- Auto-Refresh alle 3s
Admin-Schutz (auth.py + main.py):
- Neue require_admin Dependency: prüft Keycloak-Rolle "admin" oder
"gwoe-admin". Im Dev-Modus durchlassen.
- Batch-Analyse, Programme-Index, Assessment-Delete: require_admin
- Einzelanalyse, Bookmarks, Kommentare: bleiben require_auth
- Keycloak: Rolle "admin" erstellt + User tobias zugewiesen
Tests: 206 passed.
Refs: #99
2026-04-10 23:15:42 +02:00
Dotty Dotter
5f5d9edf83
Batch-Analyse UI: Button im Prüfen-Tab mit BL-Auswahl + Limit + Queue-Polling
2026-04-10 23:08:49 +02:00
Dotty Dotter
cfe36cbd65
#98 GWÖ-Matrix interaktiv: volle Begriffe + Tooltips + Staatsprinzipien
...
Matrix-Tabelle:
- Zeilen-Header: volle Berührungsgruppen-Namen (statt "A: Lieferant:innen"
jetzt "A: Ausgelagerte Betriebe, Lieferant:innen")
- Spalten-Header: Mouseover zeigt Staatsprinzip + Kernfragen
(z.B. "Sozialstaatsprinzip — Gerechte Verteilung? Daseinsvorsorge?")
- Bewertete Felder: Tooltip mit Feldcode + voller Name + Aspekt aus der
Bewertung + Rating-Erklärung ("++ stark fördernd")
- Nicht-bewertete Felder: ○ mit Tooltip "Nicht bewertet (Antrag berührt
dieses Feld nicht)" statt leere Zelle
Detail-Liste:
- Feld-Labels jetzt mit vollem Namen aus MATRIX_LABELS
- Aspekt kursiv hinter dem Label
- Rating-Zahl neben dem Symbol (z.B. "++ (+5)")
Daten aus models.py::MATRIX_LABELS via Template-Variable matrix_labels.
Tests: 206 passed.
Refs: #98
2026-04-10 23:06:37 +02:00
Dotty Dotter
5d2a0338ee
Kommentar-Sichtbarkeit: Öffentlich/Angemeldete/Nur ich + Badges + Server-Filter
2026-04-10 22:40:27 +02:00
Dotty Dotter
ad97a76824
Hamburger-Menü: Auswertungen/Quellen/Methodik/Auth als Dropdown, primäre Tabs bleiben
2026-04-10 22:29:55 +02:00
Dotty Dotter
e5d4ce2553
Merkliste-Tab + Kopfzeile einheitliche Schriftgröße (0.9rem)
2026-04-10 22:25:52 +02:00
Dotty Dotter
e1deec8b53
Merkliste: eigener Tab mit Bookmark-Übersicht, klickbar zum Detail
2026-04-10 22:24:43 +02:00
Dotty Dotter
4b40de4e93
#94 Bookmarks + Kommentare: DB-Schema, API, UI
...
DB (database.py):
- bookmarks-Tabelle (user_id + drucksache, toggle)
- comments-Tabelle (user_id, user_name, drucksache, text, visibility)
- Functions: toggle_bookmark, get_bookmarks, add_comment, get_comments, delete_comment
API (main.py):
- POST /api/bookmark (toggle, Auth-pflichtig)
- GET /api/bookmarks (User-Bookmarks)
- POST /api/comment (Auth-pflichtig, max 2000 Zeichen)
- GET /api/comments?drucksache= (öffentlich)
- DELETE /api/comment/{id} (nur eigene, Auth-pflichtig)
UI (index.html):
- Bookmark-Button ("🔖 Merken" / "⭐ Gemerkt") im Detail-Footer
- Kommentar-Bereich: Liste + Eingabefeld + Senden-Button
- Kommentare laden automatisch beim Detail-Öffnen
- Eigene Kommentare löschbar (✕ Button)
- Ohne Login: "Anmelden um zu kommentieren"
Gruppen-Sichtbarkeit (visibility) ist vorbereitet aber noch nicht
im UI exponiert — kommt als separater Schritt wenn Keycloak-Gruppen
konfiguriert sind.
Tests: 206 passed.
Refs: #94
2026-04-10 22:19:46 +02:00
Dotty Dotter
5ec0b08648
Fix: normalizePartei als globale Funktion (war in updateStats scoped → ReferenceError in showDetail)
2026-04-10 22:15:13 +02:00
Dotty Dotter
b851173e6d
UI-Polish: 6 Fixes aus visuellem Review
...
1. AfD/AFD Duplikat in Partei-Stats: normalizePartei() client-seitig
2. Antragsteller:in Labels: aus item.fraktionen ableiten wenn
istAntragsteller null (LLM liefert es inconsistent)
3. Überlange Titel in Liste: auf 80 Zeichen + Ellipsis gekürzt
4. Methodik-Text: "verworfen" → "verifiziert / nicht wörtlich markiert"
5. Bewertungsdatum im Header (neben Drucksache-Nr statt nur im Footer)
6. Index-Button: Schloss-Icon + Tooltip "Erfordert Anmeldung"
2026-04-10 22:13:30 +02:00
Dotty Dotter
f1a7da8544
Hybrid-Zitate: verified/unverified statt drop + UI-Labels
...
reconstruct_zitate droppt Zitate nicht mehr bei No-Match, sondern
markiert sie als verified=false. Das ist ehrlicher: paraphrasierte
Zitate sind wertvoller Kontext, sie brauchen nur ein visuelles
Unterscheidungsmerkmal.
UI:
- Verifizierte Zitate: grüner solid Border, "✓ verifiziert"
- Paraphrasierte Zitate: gelber dashed Border, "~ paraphrasiert
(nicht wörtlich im Programm)"
- Warning-Text: "Zu diesem Themenkomplex konnten keine konkreten
Formulierungen im Wahlprogramm gefunden werden"
- Antragsteller:in / Landesregierung als farbige Badges
Zitat-Model: neues Optional[bool] Feld "verified".
Tests: 206 passed (test_drops angepasst auf neues Verhalten).
2026-04-10 21:45:36 +02:00
Dotty Dotter
9c162d14ac
UI: Warning-Text verbessert + Antragsteller:in/Landesregierung Labels als Badges
2026-04-10 21:41:15 +02:00
Dotty Dotter
49c1b92753
Fix: JWT aud=account bei Keycloak Public Clients — prüfe azp statt aud
2026-04-10 21:32:08 +02:00
Dotty Dotter
f56c2af5cd
Fix: Auth-Callback setzt Cookie via HTML-Response statt RedirectResponse
2026-04-10 21:27:32 +02:00
Dotty Dotter
0d0c06106a
Auth-UI: Logout-Button + Re-Analyze-Feedback + Uhrzeit beim Bewertungsdatum
2026-04-10 21:24:07 +02:00
Dotty Dotter
9195d976bc
Fix: httpx import in auth callback
2026-04-10 21:19:31 +02:00
Dotty Dotter
c3bcf1501d
Auth: OIDC Code→Token Exchange Callback + Cookie-basiertes Login
2026-04-10 21:18:10 +02:00
Dotty Dotter
4c8b180383
Fix: Keycloak redirect_uri http→https (Traefik TLS-Termination)
2026-04-10 21:16:15 +02:00
Dotty Dotter
f728388286
#97 Neu bewerten: manueller Re-Analyse-Button + Bewertungsdatum
...
Fußzeile unter jedem Assessment-Detail jetzt mit:
- Bewertungsdatum ("Bewertet am DD.MM.YYYY") aus updated_at
- Quelle + Modell (batch-reanalyze / webapp, qwen-plus)
- "Neu bewerten"-Button (Auth-pflichtig, ausgegraut ohne Login)
Flow: Klick → DELETE /api/assessment/delete → POST /api/analyze-drucksache
→ Queue → pollAnalysis → Detail neu laden
Neuer DELETE-Endpoint /api/assessment/delete mit require_auth.
API-Response erweitert um updatedAt, source, model für beide
Endpoints (list + single assessment).
Tests: 206 passed.
Refs: #97
2026-04-10 21:10: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
7ed2cca15f
Tests: 8 Endpoint-Smoke-Tests (queue, auth, programme, health)
2026-04-10 20:09:34 +02:00
Dotty Dotter
3b6ecacc1e
Tuning: min_similarity 0.45→0.35 + Anker 5→4 Wörter — mehr Chunks + weniger Drops
2026-04-10 20:06:35 +02:00
Dotty Dotter
14140571d8
Fix: CDU-PDF AssertionError Fallback + Kopfzeile vereinheitlicht + Fehler-Debug
2026-04-10 20:05:28 +02:00
Dotty Dotter
916b0ca643
Debug: JS-Fehler anzeigen + docker-compose version entfernt
2026-04-10 19:55:08 +02:00
Dotty Dotter
d75e9441a3
Quellen-Seite: Programme nach Bundesland gruppiert statt einer langen Liste
2026-04-10 19:10:18 +02:00
Dotty Dotter
9e341a695f
Tests: 5 queue-Tests (enqueue, position, overflow, status)
2026-04-10 19:08:59 +02:00
Dotty Dotter
ee08cb0c29
Quellen-Seite: PDF-Thumbnails der ersten Seite + Thumbnail-API-Endpoint
2026-04-10 18:40:13 +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
b6160cc6cb
#31/#34/#35: BY, NI, SL auf aktiv=True — alle 17 Parlamente jetzt im UI
2026-04-10 17:43:32 +02:00
Dotty Dotter
521d940611
#22 NI: Deduplizierung (Server liefert manche Treffer doppelt)
2026-04-10 17:40:46 +02:00