Commits vergleichen

...

4 Commits

Autor SHA1 Nachricht Datum
8b8e31e3cd Promote develop → main (2026-05-01 20:17 UTC) 2026-05-01 22:17:42 +02:00
26fac0e824 Analysepipeline: Reset auf "pending" beim Refresh-Start
Beim ersten Schritt (sources_review) eines neuen Refreshs werden alle
nachfolgenden Schritte sichtbar auf "pending" (grau) zurückgesetzt.
Vorher hingen sie weiterhin als "done" vom letzten Refresh in grün
herum, während die Pipeline schon einen neuen Durchlauf zeigte.

- Bedingung in pipeline.js entschärft: nicht mehr nur bei
  pass_number > 1 (Multi-Pass), sondern bei jedem ersten Schritt-Active
- Bei Reset wird das ganze Stage neu gezeichnet (nicht nur der einzelne
  Block), damit die zurückgesetzten Schritte tatsächlich grau erscheinen
- Greift sowohl bei normalem Refresh als auch bei Multi-Pass-Wechsel
  einer Research-Lage

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 22:06:06 +02:00
62c0be64ee Analysepipeline: Reihenfolge "Fakten prüfen" vor "Lagebild verfassen"
Reihenfolge in der Pipeline-Anzeige getauscht — passt zur perspektivischen
Backend-Umstellung (Faktencheck-Output soll als Kontext ins Lagebild
einfließen, statt parallel zu generieren). Backend läuft aktuell noch
parallel; sobald die sequenzielle Variante mit Kontext-Übergabe steht,
stimmt die Anzeige mit dem realen Flow überein.

Im 3x3-Snake-Layout liegt jetzt:
  Reihe 2: Relevanz bewerten → Orte erkennen → Fakten prüfen
  Reihe 3: Lagebild verfassen → Qualitätscheck → Benachrichtigen

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 21:59:46 +02:00
8c4ef6b2cf CATEGORY_REPUTATION: Schlüssel an aktuelle DB-Werte angepasst
Die Reputation-Map nutzte veraltete Schlüssel (presseagenturen,
behoerden, nachrichten_de/int), die nirgends in der DB vorkamen — die
DB hat nachrichtenagentur, behoerde, oeffentlich-rechtlich,
qualitaetszeitung, think-tank, regional, telegram, boulevard. Folge
war ein stiller Bug: alle hochwertigen Quellen (Reuters, ZDF,
tagesschau, Spiegel, FAZ, BMI etc.) bekamen den Default-Score 0.4 wie
"sonstige" und wurden in der Relevanz-Sortierung nicht bevorzugt.

Map jetzt vollständig auf aktuelle Kategorie-Werte:
- nachrichtenagentur, behoerde:    1.00
- oeffentlich-rechtlich:           0.95
- qualitaetszeitung, think-tank:   0.85
- fachmedien:                      0.80
- international:                   0.75
- regional:                        0.65
- telegram:                        0.50
- sonstige:                        0.40
- boulevard:                       0.30

Test mit 200 zufälligen Artikeln aus der Live-DB:
155 besser bewertet, 0 schlechter, 45 unverändert.
Stärkster Effekt bei ÖR (+0.165), Nachrichtenagenturen (+0.18),
Qualitätszeitungen (+0.135).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 18:52:02 +02:00
4 geänderte Dateien mit 36 neuen und 21 gelöschten Zeilen

Datei anzeigen

@@ -21,15 +21,21 @@ from source_rules import (
logger = logging.getLogger("osint.orchestrator") logger = logging.getLogger("osint.orchestrator")
# Reputations-Score nach Quellenkategorie (für Relevanz-Scoring) # Reputations-Score nach Quellenkategorie (fuer Relevanz-Scoring).
# Keys muessen mit den tatsaechlichen DB-Werten in sources.category uebereinstimmen
# (siehe DOMAIN_CATEGORY_MAP in source_rules.py).
CATEGORY_REPUTATION = { CATEGORY_REPUTATION = {
"nachrichten_de": 0.9, "nachrichtenagentur": 1.0, # Reuters, AP, dpa, AFP — Primärquellen
"nachrichten_int": 0.9, "behoerde": 1.0, # BMI, BSI, Europol — offizielle Quellen
"presseagenturen": 1.0, "oeffentlich-rechtlich": 0.95, # tagesschau, ZDF, ARD, BBC, ORF
"behoerden": 1.0, "qualitaetszeitung": 0.85, # Spiegel, Zeit, FAZ, NZZ, Süddeutsche
"fachmedien": 0.8, "think-tank": 0.85, # SWP, IISS, Brookings, Chatham House
"international": 0.7, "fachmedien": 0.8, # heise, golem, netzpolitik, Handelsblatt
"sonstige": 0.4, "international": 0.75, # CNN, Guardian, NYT, Al Jazeera, France24
"regional": 0.65, # regionale Tageszeitungen
"telegram": 0.5, # OSINT-Kanaele — gemischte Qualitaet
"sonstige": 0.4, # unkategorisiert
"boulevard": 0.3, # Bild, Sun etc.
} }
# Research-Modus: Automatisch 3 Durchläufe für optimale Ergebnisse # Research-Modus: Automatisch 3 Durchläufe für optimale Ergebnisse

Datei anzeigen

@@ -50,18 +50,18 @@ PIPELINE_STEPS = [
"icon": "map-pin", "icon": "map-pin",
"tooltip": "Aus den Meldungen werden Ortsangaben erkannt und auf der Karte verortet.", "tooltip": "Aus den Meldungen werden Ortsangaben erkannt und auf der Karte verortet.",
}, },
{
"key": "summary",
"label": "Lagebild verfassen",
"icon": "file-text",
"tooltip": "Aus allen geprüften Meldungen wird ein zusammenhängendes Lagebild geschrieben, mit Quellenangaben am Text.",
},
{ {
"key": "factcheck", "key": "factcheck",
"label": "Fakten prüfen", "label": "Fakten prüfen",
"icon": "shield", "icon": "shield",
"tooltip": "Behauptungen aus den Meldungen werden gegeneinander abgeglichen: Bestätigt? Umstritten? Noch unklar?", "tooltip": "Behauptungen aus den Meldungen werden gegeneinander abgeglichen: Bestätigt? Umstritten? Noch unklar?",
}, },
{
"key": "summary",
"label": "Lagebild verfassen",
"icon": "file-text",
"tooltip": "Aus allen geprüften Meldungen wird ein zusammenhängendes Lagebild geschrieben, mit Quellenangaben am Text.",
},
{ {
"key": "qc", "key": "qc",
"label": "Qualitätscheck", "label": "Qualitätscheck",

Datei anzeigen

@@ -646,7 +646,7 @@
<script src="/static/js/ws.js?v=20260316b"></script> <script src="/static/js/ws.js?v=20260316b"></script>
<script src="/static/js/components.js?v=20260427a"></script> <script src="/static/js/components.js?v=20260427a"></script>
<script src="/static/js/layout.js?v=20260316b"></script> <script src="/static/js/layout.js?v=20260316b"></script>
<script src="/static/js/pipeline.js?v=20260501a"></script> <script src="/static/js/pipeline.js?v=20260501i"></script>
<script src="/static/js/app.js?v=20260501h"></script> <script src="/static/js/app.js?v=20260501h"></script>
<script src="/static/js/cluster-data.js?v=20260322f"></script> <script src="/static/js/cluster-data.js?v=20260322f"></script>
<script src="/static/js/tutorial.js?v=20260316z"></script> <script src="/static/js/tutorial.js?v=20260316z"></script>

Datei anzeigen

@@ -141,20 +141,29 @@ const Pipeline = {
} }
} }
// Wenn ein neuer Pass startet (pass_number > prev und status="active" beim ERSTEN step): // Wenn der ERSTE Schritt (sources_review) auf "active" geht, beginnt ein neuer
// alle Schritte zurück auf pending setzen, damit die Animation neu durchläuft. // Refresh oder ein neuer Multi-Pass-Durchlauf — alle nachfolgenden Schritte auf
// "pending" (grau) zuruecksetzen, damit der User sieht: das ist neu und
// noch nicht durchlaufen. Sonst stehen sie als "done" vom letzten Mal da.
let didReset = false;
if (d.status === 'active' && this._definition && this._definition.length if (d.status === 'active' && this._definition && this._definition.length
&& key === this._definition[0].key && passNr > 1 && (!prev || prev.pass_number < passNr)) { && key === this._definition[0].key) {
// Alle anderen Steps in "pending" zurueck (visuell), Werte behalten wir
this._definition.forEach(s => { this._definition.forEach(s => {
if (s.key !== key && this._stateByKey[s.key]) { if (s.key !== key && this._stateByKey[s.key]) {
this._stateByKey[s.key].status = 'pending'; this._stateByKey[s.key].status = 'pending';
didReset = true;
} }
}); });
} }
this._patchBlock(key); if (didReset) {
this._patchMiniBlock(key); // Beim Reset alle Bloecke neu zeichnen, nicht nur den aktuellen
this._render();
this._renderMini();
} else {
this._patchBlock(key);
this._patchMiniBlock(key);
}
}, },
_onRefreshDone(msg) { _onRefreshDone(msg) {