Mehrtaegiger Sync-Stillstand hatte ueber 50 conflicted-copy-Dateien im
Working-Tree erzeugt. Die jeweils neuere Version wurde basierend auf
md5-Hash-Vergleich zum laufenden gwoe-antragspruefer-dev-Container
eingespielt.
Konsolidiert (38 modifiziert):
- analyzer.py, auswertungen.py, auth.py, config.py, database.py,
drucksache_typen.py, embeddings.py, main.py, models.py, parlamente.py,
ports/llm_bewerter.py, presse_generator.py, redline_utils.py, report.py,
validators.py, wahlprogramm_fetch.py, wahlprogramm-links.yaml,
wahlprogramm-shas.lock.json
- v2-Templates: base, components/{icon, matrix_mini, queue_widget,
result_row}, screens/{admin_queue, admin_stand, aktuelle-themen,
antrag_detail, auswertungen, cluster, landtag_suche, merkliste,
methodik, tags}, static/v2/v2.css
- Tests: test_embeddings (Strict-Mode-Drop in reconstruct_zitate),
test_endpoints_smoke, test_presse_generator, test_report,
test_wahlprogramme (mit TestRegierungsbildung-Block, +120 LOC)
- docker-compose.dev.yml, docs/adr/index.md, docs/reference/api.md, mkdocs.yml
Neuzugaenge:
- app/marker.py, app/pm_render.py — Konsistenz-Marker, PM-Render-Adapter
- app/templates/v2/screens/scorecard{,_portrait,_werkstatt}.html — Cloud-Design-Scorecard
- app/static/v3/, app/templates/v3/ — v3-Layout-Hierarchie
- docs/adr/0010-stimmverhalten-gwoe-aggregat.md
- docs/adr/0011-aktuelle-themen-pm-generator.md
- docs/adr/0012-debug-auth-token-bypass.md
- scripts/{auto-rate-orphans, pm-quality-audit, pm-sample-bundle, rotate-debug-token}.sh
- tests/e2e/test_smoke_browser.py, tests/test_{auto_rate_runs, icons,
marker, pm_render, presse_generator_style, thread_splitter,
v2_pdf_consistency}.py
Plus inhaltlich uebernommen aus dem Conflict-Stand:
- embeddings.py: fw-by-2023.partei korrigiert von "FW" zu "FREIE WAEHLER"
(war Mismatch zu wahlprogramme.py)
- embeddings.py: detailliertere Naming der BTW-2025-Wahlprogramme
Test-Suite-Stand: 1209 passed, 73 skipped (4 pre-existing failures in
test_presse_generator_style.py + 1 collection error in
integration/test_citations_substring.py — beide nicht durch dieses
Konsolidierungs-Commit verursacht).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
||
|---|---|---|
| app | ||
| docs | ||
| scripts | ||
| tests | ||
| .coveragerc | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| .tarignore | ||
| CHANGELOG.md | ||
| DATA-LICENSE | ||
| docker-compose.dev.yml | ||
| docker-compose.yml | ||
| Dockerfile | ||
| LICENSE | ||
| mkdocs.yml | ||
| pytest.ini | ||
| README.md | ||
| requirements-dev.txt | ||
| requirements.txt | ||
GWÖ-Antragsprüfer
Automatische Gemeinwohl-Bilanzierung von Parlamentsanträgen nach der GWÖ-Matrix 2.0 für Gemeinden
Live unter https://gwoe.toppyr.de/.
Was macht das Tool?
Der GWÖ-Antragsprüfer analysiert Anträge aus deutschen Landesparlamenten und dem Bundestag und bewertet sie nach den Kriterien der Gemeinwohl-Ökonomie (GWÖ):
- GWÖ-Score (0–10) — Wie gut entspricht der Antrag den GWÖ-Werten?
- Matrix-Zuordnung — Welche der 25 Felder der GWÖ-Matrix für Gemeinden werden adressiert?
- Programm-Treue — Passt der Antrag zum Wahl- und Grundsatzprogramm jeder Fraktion?
- Verbesserungsvorschläge — Konkrete Textänderungen mit GWÖ-Begründung im Redline-Format
- Zitate mit Verifikation — Belege aus den Wahl-/Grundsatzprogrammen, server-seitig gegen Original-Chunks geprüft (siehe ADR 0001)
Aktive Datenquellen (Stand Release 1.0)
16 Bundesländer + Bundestag — alle aktiven Adapter:
| BL | Wahlperiode | Quelle |
|---|---|---|
| BUND | 21 (2025–2029) | bundestag.de DIP |
| BW | 17 (2021–2026) | PARLIS |
| BY | 19 (2023–2028) | Bayern Landtag |
| BE | 19 (2023–2026) | Berlin AGH |
| BB | 8 (2024–2029) | StarWeb |
| HB | 21 (2023–2027) | ParlDok |
| HH | 23 (2025–2029) | ParlDok |
| HE | 21 (2024–2029) | Hessen Landtag |
| MV | 8 (2021–2026) | ParlDok |
| NI | — | NILAS (login-protected, deferred) |
| NRW | 18 (2022–2027) | OPAL |
| RP | 18 (2021–2026) | StarWeb |
| LSA | 8 (2021–2026) | StarWeb |
| SL | 17 (2022–2027) | Umbraco |
| SN | 8 (2024–2029) | XML-Export |
| SH | 20 (2022–2027) | Schleswig-Holstein |
| TH | 8 (2024–2029) | StarWeb |
Plus abgeordnetenwatch.de-Integration für strukturierte namentliche Abstimmungen (alle 16 BL + BT).
Features
Frontend (v2, ECOnGOOD-CD)
- Listenansicht mit Score-Band-Filter, BL-Chip-Filter, Sort-Dropdown (8 Optionen), Live-Suche
- Antragsdetail mit ScoreHero, Matrix 5×5, Zitaten, Redline-Diff, Programm-Treue pro Fraktion, Versionshistorie, namentlichem Abstimmungsverhalten (wenn vorhanden)
- Bookmark-Liste (server-seitig pro User), Kommentare, Voting, Share-Buttons (Threads/X/Mastodon mit LLM-Texten), Re-Analyze
- Auswertungen mit BL×Partei-Matrix, Themen×Fraktion-Heatmap, Cluster-Bubble-Chart
- Tag-Cloud, Cluster-Liste, Landtag-Live-Suche, Methodik, Quellen
- Admin-Panel Freischaltungen / Queue / Abos / Wahlprogramme
- Dark-Mode, Phosphor-Icons, Avenir/Nunito-Sans, Keyboard-Shortcuts (j/k/Enter/Esc/?/⏎)
Backend
- FastAPI + Jinja2 + Vanilla JS (kein Build-Tool)
- SQLite mit aiosqlite (Source of Truth)
- Qwen-Plus (DashScope) für die LLM-Bewertung — austauschbar via
LlmBewerter-Port (ADR 0008) - Embeddings v4 für die Zitat-Verifikation (ADR 0006)
- Keycloak SSO mit Direct-Access-Grant (Login-Modal in der App, kein Redirect)
- Background-Queue mit 3 parallelen Workern + Graceful Shutdown
- Daily-Digest-Mail für Abonnent:innen
- Monitoring-Scan aller Adapter mit Kosten-Schätzung — Beobachtung ohne Auto-Fetch
- OG-Cards (Open-Graph-Bilder pro Antrag, Playwright-gerendert)
- WeasyPrint für PDF-Reports
Tests
- 574 Tests, 13 skipped — Unit + Integration + Property + Bug-Regression + DDD
- Live-Adapter-Tests gegen alle 17 Quellen (
pytest -m integration) - Citation-Substring-Verification gegen Original-PDFs
- E2E-Browser-Tests via Playwright (
pytest -m e2e)
Architektur
Detailliert in docs/:
docs/adr/— Architecture Decision Records (8 ADRs)docs/analysen/ddd-bewertung.md— DDD-Analyse + Migrations-Roadmapdocs/reference/zugriffsrechte.md— 63 Routes × User-Status-Matrixdocs/reference/api.md— API-Reference
DDD-Lightweight-Migration ist Tag 1-4 abgeschlossen (Ports, Adapter, Repositories, Domain-Verhalten — siehe ADR 0008). Callsite-Migration in main.py ist Folge-PR.
Schnellstart
Voraussetzungen
- Docker + Docker Compose
- Python 3.12 (für lokale Tests)
- DashScope API-Key (Qwen)
- Keycloak (optional, für Login)
Installation
git clone https://repo.toppyr.de/tobias/gwoe-antragspruefer
cd gwoe-antragspruefer/webapp
cp .env.example .env # API-Keys eintragen
docker compose up -d --build
App auf http://localhost:8000.
Tests
python3 -m pytest tests/ -q # Unit-Suite (574 Tests, < 2 s)
python3 -m pytest tests/ -m integration # Live-Adapter-Tests (langsam)
./scripts/smoke-test.sh # Gesamt-Funktionsprüfung gegen Live
Deploy (Server)
./scripts/deploy.sh # mit Uptime-Kuma-Wartungsmodus
./scripts/run-digest.sh # Daily-Mail-Digest (Cron 07:00)
./scripts/run-monitoring-scan.sh # Monitoring-Scan (manuell oder Cron)
Lizenz
Zwei getrennte Lizenzen:
- Quellcode — MIT
- Bewertungs-Daten und -Berichte (Assessments, Matrix-Zuordnungen, Verbesserungsvorschläge, Themen-Tags etc.) — CC BY 4.0
Wahlprogramme und Antrags-PDFs der Parlamente unterliegen der jeweiligen Urheber-Lizenz der Quelle und werden hier nur zur Verifikation referenziert.
Mitwirken
Issues unter https://repo.toppyr.de/tobias/gwoe-antragspruefer. Pull Requests willkommen — beachte ADR 0004 (Deployment-Workflow) und die Test-Konventionen in pytest.ini.
Statistiken (Stand Release 1.0)
- 16 BL + Bundestag aktiv
- 85 Wahlprogramme indexiert (Embeddings v4)
- 71 produktive Bewertungen in der Live-DB
- 28 977 abgeordnetenwatch-Votes (BUND)
- 11 789 LOC Python in
app/