Files
grok-bot 57fce463cd chore: add mise toolchain for local Quellenatlas development
Pin Python 3.12, Node 22 and uv; add tasks for setup, dev, ingest and tests.
2026-08-21 22:46:27 +02:00

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 / changeme lokal)
  • 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; confirmed nur mit Amts-/Gerichts-/Parlamentsquelle oder confirmation_basis; care_level=high braucht accessed_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)

  1. Live-Ingest: python -m app.cli ingest (oder --slug …). Feeds können 404 sein → in data/sources.yaml status: paused oder URL korrigieren, dann sync-sources.
  2. Review-Queue unter /admin/review sichten; nichts auto-publizieren.
  3. 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.
  4. 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.
  5. 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
  • confirmed für ungerichtete Personen-Schuld setzen