4.4 KiB
HANDOFF — Quellenatlas
Stand: 2026-08-21. Neue Session hier ansetzen, Architektur nicht neu aufrollen.
Repo
| Pfad | /Volumes/SSD2TB/work/cdu |
| Remote | http://10.27.27.139:3000/admin/cdu-vorfaelle.git |
| Branch | main = origin/main |
| Commit | 872f836 — feat: add Quellenatlas knowledge base (103 Dateien) |
| Produktname | Quellenatlas (nicht „cdu“ — Ordnername ist Zufall, keine Parteikategorie) |
.env ist gitignored. Vorlage: .env.example.
Was das System ist
Private, selbst gehostete Knowledge Base für quellenbasierte Dokumentation politischer/gesellschaftlicher Auffälligkeiten. Kein öffentliches Portal, kein Meinungsprodukt.
Schwerpunkte von Anfang an: Ursula von der Leyen (Sorgfalts-Cluster, keine Schuldzuschreibung), Ukraine-Vorgänge, DACH + EU.
Festgelegte Entscheidungen (nicht wieder öffnen)
- Zugang: privat, Login Pflicht (
admin/changemelokal) - Stack: FastAPI + SQLAlchemy 2 + Alembic + PostgreSQL 16 + Next.js
- Ingest v1: nur RSS/API →
SourceEntry+ReviewItem. Nie Cases. Kein HTML-Scraping. - Graph: SQL-abgeleiteter
/api/v1/graph, kein Neo4j - UI: Deutsch
- Ethik im Code (
backend/app/core/ethics.py): Claim ≥ 1 Quelle; Case ≥ 1 Quelle;confirmednur mit Amts-/Gerichts-/Parlamentsquelle oderconfirmation_basis;care_level=highbrauchtaccessed_at; Summary-Lint gegen Werturteile - Admin nur über dieselben Services (kein SQLAdmin, damit Ethik nicht umgangen wird)
- Postgres-Port lokal 5433 (5432 ist von einer anderen lokalen Postgres belegt). In Docker intern weiter 5432.
Laufender Stand
v1 ist implementiert und gepusht:
- Docs:
docs/architecture.md,data-model.md,ethics.md,adding-sources.md - Schema + Migration
backend/alembic/versions/a2bddb90c586_initial_schema.py - Katalog: 30 Quellen in
data/sources.yaml - Seed: 24 Fälle, 39 Entitäten, 2 Promises (
data/seed/) - Tests: 30 pytest grün (Docker-Postgres auf 5433 nötig)
- Frontend: Login, Hierarchie, Suche, Cluster VdL/Ukraine, Falldetail, Review-Queue, Quellen, Fall-Editor
Seed-Cluster (API-verifiziert nach python -m app.cli seed):
- vdl (4):
ombudsman-sms-transparenz,bmvg-beratervertraege,vdl-dissertation-2015(disputed),orgenesis-interessenkonflikt(allegation) - ukraine (5):
eca-ukraine-facility-opinion,eu-mfa-ukraine,nabu-mandate,opensanctions-ukraine-peps,zeitenwende-militaerhilfe(disputed/partial)
Status bewusst konservativ: Ombudsmann-Fall ist confirmed für Transparenzmangel, nicht für Korruption.
Starten
Toolchain: mise.toml (Python 3.12, Node 22, uv). Venv: backend/.venv.
mise install
mise run setup # Postgres :5433, migrate, admin, sources, seed
mise run dev # API :8000 + UI :3000
mise run test
Oder: docker compose up --build (Backend-DATABASE_URL in Compose zeigt auf Host postgres).
Nächste sinnvolle Schritte (in dieser Reihenfolge)
- Live-Ingest:
python -m app.cli ingest(oder--slug …). Feeds können 404 sein → indata/sources.yamlstatus: pausedoder URL korrigieren, dannsync-sources. - Review-Queue unter
/admin/reviewsichten; nichts auto-publizieren. - Seed-URL-Triage: einige Seed-Links sind Katalog-/Themenseiten, nicht Primärdokumente (z. B. Orgenesis → Politico-Homepage, NABU-Feed). 404 ersetzen oder Fall nicht seeden.
- Frontend nicht im Browser E2E verifiziert (kein Browser-Tool in der Build-Session). Manuell: Login → Cluster VdL/Ukraine → Fallseite mit Zitaten → Editor lehnt Claim ohne Quelle ab.
- Optional später: Neo4j-Read-Model, mehr Adapter, härtere
confirmed-Regel auf Claim-Ebene.
Wichtige Pfade
| Pfad | Rolle |
|---|---|
docs/ethics.md |
Verbindliche Status-/Neutralitätsregeln |
backend/app/core/ethics.py |
Durchsetzung |
backend/app/services/cases.py |
Case-Write inkl. Validation |
backend/app/ingest/runner.py |
RSS/API, Dedup, Keyword-Priority |
data/sources.yaml |
Kanonischer Quellenkatalog |
data/seed/cases.yaml |
24 Seed-Fälle |
data/seed/cases/_template.yaml |
Vorlage neuer Fälle |
Nicht tun
- Öffentlich ohne Auth ausliefern
- LLM-Summaries in die KB schreiben
- HTML-Crawler gegen Medien
- Architektur (Django/Neo4j/Scraping) neu diskutieren, solange v1-Ziele gelten
confirmedfür ungerichtete Personen-Schuld setzen