diff --git a/src/agents/orchestrator.py b/src/agents/orchestrator.py
index e8cc76d..72bb3a1 100644
--- a/src/agents/orchestrator.py
+++ b/src/agents/orchestrator.py
@@ -21,15 +21,21 @@ from source_rules import (
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 = {
- "nachrichten_de": 0.9,
- "nachrichten_int": 0.9,
- "presseagenturen": 1.0,
- "behoerden": 1.0,
- "fachmedien": 0.8,
- "international": 0.7,
- "sonstige": 0.4,
+ "nachrichtenagentur": 1.0, # Reuters, AP, dpa, AFP — Primärquellen
+ "behoerde": 1.0, # BMI, BSI, Europol — offizielle Quellen
+ "oeffentlich-rechtlich": 0.95, # tagesschau, ZDF, ARD, BBC, ORF
+ "qualitaetszeitung": 0.85, # Spiegel, Zeit, FAZ, NZZ, Süddeutsche
+ "think-tank": 0.85, # SWP, IISS, Brookings, Chatham House
+ "fachmedien": 0.8, # heise, golem, netzpolitik, Handelsblatt
+ "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
diff --git a/src/services/pipeline_tracker.py b/src/services/pipeline_tracker.py
index 27bf724..5ec0e82 100644
--- a/src/services/pipeline_tracker.py
+++ b/src/services/pipeline_tracker.py
@@ -50,18 +50,18 @@ PIPELINE_STEPS = [
"icon": "map-pin",
"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",
"label": "Fakten prüfen",
"icon": "shield",
"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",
"label": "Qualitätscheck",
diff --git a/src/static/dashboard.html b/src/static/dashboard.html
index ecee0b2..2b4921a 100644
--- a/src/static/dashboard.html
+++ b/src/static/dashboard.html
@@ -646,7 +646,7 @@
-
+
diff --git a/src/static/js/pipeline.js b/src/static/js/pipeline.js
index 0f3551b..a4b184b 100644
--- a/src/static/js/pipeline.js
+++ b/src/static/js/pipeline.js
@@ -141,20 +141,29 @@ const Pipeline = {
}
}
- // Wenn ein neuer Pass startet (pass_number > prev und status="active" beim ERSTEN step):
- // alle Schritte zurück auf pending setzen, damit die Animation neu durchläuft.
+ // Wenn der ERSTE Schritt (sources_review) auf "active" geht, beginnt ein neuer
+ // 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
- && key === this._definition[0].key && passNr > 1 && (!prev || prev.pass_number < passNr)) {
- // Alle anderen Steps in "pending" zurueck (visuell), Werte behalten wir
+ && key === this._definition[0].key) {
this._definition.forEach(s => {
if (s.key !== key && this._stateByKey[s.key]) {
this._stateByKey[s.key].status = 'pending';
+ didReset = true;
}
});
}
- this._patchBlock(key);
- this._patchMiniBlock(key);
+ if (didReset) {
+ // Beim Reset alle Bloecke neu zeichnen, nicht nur den aktuellen
+ this._render();
+ this._renderMini();
+ } else {
+ this._patchBlock(key);
+ this._patchMiniBlock(key);
+ }
},
_onRefreshDone(msg) {