Monitoring: täglicher Scan aller Landtags-Adapter + Mail-Digest (kein Auto-Fetch) #135
Labels
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: tobias/gwoe-antragspruefer#135
Loading…
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Kontext
Aus Gespräch dotty 2026-04-20: wir wollen täglich einen Überblick, was sich in
allen aktiven Landtags-Datenquellen seit gestern getan hat — ohne dass
dabei Anträge automatisch gezogen oder bewertet werden. Reine Monitoring-/
"Was wäre wenn"-Phase, um zu sehen
Strikt kein Auto-Fetch, kein Auto-Analyze. Die Entscheidung, einen Antrag
zu bewerten, bleibt beim User.
Scope
In-scope:
Out-of-scope (explizit):
Datenmodell
Primary-Key-Begründung:
(bundesland, drucksache)ist eindeutig innerhalbeiner Wahlperiode. WP-Wechsel ist Randfall und wird mit
datum_antragalsTiebreaker erkannt (falls derselbe String in neuer WP auftaucht, entscheidet
das Datum).
Arbeitsschritte
Core (Must-have):
monitoring_scans+monitoring_daily_summaryinapp/database.pyapp/monitoring.py:async def daily_scan()iteriertaktive_bundeslaender(), ruftadapter.search(limit=N), UPSERT inmonitoring_scans, aggregiert inmonitoring_daily_summaryestimate_cost(new_count, avg_input_tokens, avg_output_tokens, model)— pro Modell ein statischer Preissatz inapp/config.py(Qwen-Plus: ~$0.0005/1K in, $0.0015/1K out; Qwen-Max höher)app/mail.py: neues Templatemonitoring_digest.html/.txt, empfängtMonitoringDigestDatascripts/run-monitoring-scan.shanalog zurun-digest.sh0 6 * * *(vor dem E-Mail-Digest um 7)Kennzahlen im Digest:
datum_antrag→seen_first_at(Median pro BL)Σ (est_cost_per_antrag)∑ monitoring_scans WHERE NOT is_assessedpro BL(neu)-Suffix)Nice-to-have (später, separate Tickets wenn umfangreich):
/monitoringmit Zeitreihen-Charts (Chart.js), Mail verlinkt daraufGET /api/monitoring/export.csvfür Long-Format-AnalyseGET /monitoring.rssmit neuen Anträgen (read-only, kein Assessment)Akzeptanzkriterien
/var/log/gwoe-monitoring.logmonitoring_scanswächst monoton,monitoring_daily_summaryhat einen Eintrag pro (Tag, BL)Offene Entscheidungen
search(limit=50)oder mehr? Balance zwischen Vollständigkeit und HTTP-Lastmonitoring_scansunbegrenzt behalten oder nach 1 Jahr pruneeen?Bezug
drucksache_typen.pyfür Typ-Verteilung)Initial Scan (limit=500) abgeschlossen
Erfassung: 2543 Drucksachen in
monitoring_scansDeltalogik: 2. Scan-Durchlauf zeigte
new=0für alle bereits erfassten BL — Delta-Erkennung arbeitet korrektBefunde pro BL (limit=500)
Bugs zum Fixen vor Cron-Scharfschaltung
monitoring_daily_summary.errorslanden, nicht verschwiegen werden. Root-Cause liegt im SL-Adapter (swallowt Exception und returned[])limit>50oder hat eigene Pagination-GrenzeEmpfehlung: Cron NICHT scharf schalten, bis mindestens NRW und SL sauber scannen. Sonst wird der Digest irreführend („0 neue NRW-Anträge heute" — in Wahrheit Adapter-Bug).
Delta-Metrik in der Kosten-Schätzung
Bei Cron-Scharfschaltung wird
new_totalrealistisch sein (Delta seit gestern). Im initialen Seed sind es 2543 × 4 ct = ca. 102 € fiktive Kosten — das darf einmalig im ersten Mail stehen, dann normalisiert sich das.Nächste Schritte
Cron scharf:
Läuft täglich um 06:30 (vor dem Mail-Digest 07:00). Logfile
/var/log/gwoe-monitoring.logchmod 666. Test-Lauf gestartet (~1-2 Min, scant 17 BL).Gesamte Cron-Landschaft jetzt:
0 3DB-Backup (#1.0-Release)30 6Monitoring-Scan (dieses Issue)0 7Mail-Digest (#124)Schließe.