Analysepipeline: echte Umlaute und ASCII-Bindestriche

Em-dashes und Umlaut-Umschreibungen aus den Pipeline-Aenderungen
entfernt: Tooltip-Texte, HTML-Empty-State, JS-Kommentare,
Count-Status-Platzhalter, Orchestrator-Kommentare und CSS-Kommentare.

Anstelle von typografischen Gedankenstrichen werden jetzt Kommas oder
Punkte gesetzt, "uebersprungen" -> "uebersprungen" mit echtem Umlaut,
"laeuft" usw. analog. UI-Text "— Refresh starten" wird zu zwei
Saetzen.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Dieser Commit ist enthalten in:
2026-05-01 14:16:28 +02:00
Ursprung 059a9a2dc7
Commit 7b5adccf2b
6 geänderte Dateien mit 16 neuen und 16 gelöschten Zeilen

Datei anzeigen

@@ -1292,7 +1292,7 @@ class AgentOrchestrator:
analysis, analysis_usage = analysis_result analysis, analysis_usage = analysis_result
fact_checks, fc_usage = factcheck_result fact_checks, fc_usage = factcheck_result
# Pipeline-Schritt 6: Lagebild verfassen (fertig keine Zahl, nur Status) # Pipeline-Schritt 6: Lagebild verfassen (fertig, keine Zahl, nur Status)
await _pipe_done("summary", count_value=None, count_secondary=None) await _pipe_done("summary", count_value=None, count_secondary=None)
# --- Analyse-Ergebnisse verarbeiten --- # --- Analyse-Ergebnisse verarbeiten ---
@@ -1632,15 +1632,15 @@ class AgentOrchestrator:
# Pipeline-Schritt 9: Benachrichtigen (fertig) # Pipeline-Schritt 9: Benachrichtigen (fertig)
await _pipe_done("notify", count_value=_notify_count, count_secondary=None) await _pipe_done("notify", count_value=_notify_count, count_secondary=None)
# Falls Analyse-Block uebersprungen wurde (kein neuer Artikel und Summary existiert), # Falls Analyse-Block übersprungen wurde (kein neuer Artikel und Summary existiert),
# die noch offenen Pipeline-Schritte als uebersprungen markieren. # die noch offenen Pipeline-Schritte als übersprungen markieren.
for _skipped_key in ("summary", "factcheck", "qc", "notify"): for _skipped_key in ("summary", "factcheck", "qc", "notify"):
if _skipped_key in _step_ids or _skipped_key not in {"summary", "factcheck", "qc", "notify"}: if _skipped_key in _step_ids or _skipped_key not in {"summary", "factcheck", "qc", "notify"}:
pass pass
# Saubere Variante: alle noch offenen Steps am Ende skippen # Saubere Variante: alle noch offenen Steps am Ende skippen
for _open_key in list(_step_ids.keys()): for _open_key in list(_step_ids.keys()):
await _pipe_skip(_open_key) await _pipe_skip(_open_key)
# Auch Steps die nie gestartet wurden (bei uebersprungenem Outer-If) # Auch Steps die nie gestartet wurden (bei übersprungenem Outer-If)
_started_keys = set() _started_keys = set()
try: try:
_check_cursor = await db.execute( _check_cursor = await db.execute(

Datei anzeigen

@@ -637,7 +637,7 @@ async def get_pipeline(
incident_row = await _check_incident_access(db, incident_id, current_user["id"], tenant_id) incident_row = await _check_incident_access(db, incident_id, current_user["id"], tenant_id)
is_research = (incident_row["type"] or "adhoc") == "research" is_research = (incident_row["type"] or "adhoc") == "research"
# Juengsten Refresh-Log waehlen: bevorzugt running, sonst der letzte completed # Jüngsten Refresh-Log wählen: bevorzugt running, sonst der letzte completed
cursor = await db.execute( cursor = await db.execute(
"""SELECT id, started_at, completed_at, status, retry_count """SELECT id, started_at, completed_at, status, retry_count
FROM refresh_log FROM refresh_log

Datei anzeigen

@@ -30,7 +30,7 @@ PIPELINE_STEPS = [
"key": "collect", "key": "collect",
"label": "Nachrichten sammeln", "label": "Nachrichten sammeln",
"icon": "rss", "icon": "rss",
"tooltip": "Aus den passenden Quellen werden alle relevanten Meldungen eingesammelt aus deinen RSS-Feeds, dem Web und optional Telegram-Kanälen.", "tooltip": "Aus den passenden Quellen werden alle relevanten Meldungen eingesammelt - aus deinen RSS-Feeds, dem Web und optional Telegram-Kanälen.",
}, },
{ {
"key": "dedup", "key": "dedup",
@@ -54,7 +54,7 @@ PIPELINE_STEPS = [
"key": "summary", "key": "summary",
"label": "Lagebild verfassen", "label": "Lagebild verfassen",
"icon": "file-text", "icon": "file-text",
"tooltip": "Aus allen geprüften Meldungen wird ein zusammenhängendes Lagebild geschrieben mit Quellenangaben am Text.", "tooltip": "Aus allen geprüften Meldungen wird ein zusammenhängendes Lagebild geschrieben, mit Quellenangaben am Text.",
}, },
{ {
"key": "factcheck", "key": "factcheck",
@@ -72,7 +72,7 @@ PIPELINE_STEPS = [
"key": "notify", "key": "notify",
"label": "Benachrichtigen", "label": "Benachrichtigen",
"icon": "bell", "icon": "bell",
"tooltip": "Wenn etwas Wichtiges dabei war, gehen Benachrichtigungen raus im Glockensymbol oben rechts und optional per E-Mail.", "tooltip": "Wenn etwas Wichtiges dabei war, gehen Benachrichtigungen raus, im Glockensymbol oben rechts und optional per E-Mail.",
}, },
] ]

Datei anzeigen

@@ -5994,7 +5994,7 @@ body.tutorial-active .tutorial-cursor {
} }
@media (max-width: 900px) { @media (max-width: 900px) {
/* Snake aufloesen alle Reihen werden vertikal gestapelt */ /* Snake auflösen, alle Reihen werden vertikal gestapelt */
.pipeline-row, .pipeline-row,
.pipeline-row[data-direction="rtl"] { .pipeline-row[data-direction="rtl"] {
flex-direction: column; flex-direction: column;

Datei anzeigen

@@ -290,7 +290,7 @@
</div> </div>
<div class="pipeline-body"> <div class="pipeline-body">
<div class="pipeline-stage" id="pipeline-stage" aria-label="Analysepipeline-Visualisierung"> <div class="pipeline-stage" id="pipeline-stage" aria-label="Analysepipeline-Visualisierung">
<div class="pipeline-empty" id="pipeline-empty">Noch nie aktualisiert &mdash; starte den ersten Refresh.</div> <div class="pipeline-empty" id="pipeline-empty">Noch nie aktualisiert. Starte den ersten Refresh.</div>
</div> </div>
<aside class="pipeline-sidenote" id="pipeline-sidenote" hidden> <aside class="pipeline-sidenote" id="pipeline-sidenote" hidden>
Recherche-Lagen werden mehrfach evaluiert, um das Bild Schritt für Schritt aufzubauen. Recherche-Lagen werden mehrfach evaluiert, um das Bild Schritt für Schritt aufzubauen.

Datei anzeigen

@@ -118,7 +118,7 @@ const Pipeline = {
const key = d.step_key; const key = d.step_key;
if (!key) return; if (!key) return;
// State aktualisieren letzter Pass gewinnt // State aktualisieren, letzter Pass gewinnt
const prev = this._stateByKey[key]; const prev = this._stateByKey[key];
const passNr = d.pass_number || 1; const passNr = d.pass_number || 1;
if (!prev || passNr >= (prev.pass_number || 1)) { if (!prev || passNr >= (prev.pass_number || 1)) {
@@ -177,11 +177,11 @@ const Pipeline = {
// Brandneue Lage ohne Refresh // Brandneue Lage ohne Refresh
if (!this._lastRefreshHeader) { if (!this._lastRefreshHeader) {
this._renderEmpty('Noch nie aktualisiert &mdash; starte den ersten Refresh.'); this._renderEmpty('Noch nie aktualisiert. Starte den ersten Refresh.');
return; return;
} }
// Sichtbare Blöcke (skipped komplett ausgeblendet Anforderung 4b) // Sichtbare Blöcke (skipped komplett ausgeblendet, Anforderung 4b)
const visible = (this._definition || []).filter(s => { const visible = (this._definition || []).filter(s => {
const st = this._stateByKey[s.key]; const st = this._stateByKey[s.key];
return !st || st.status !== 'skipped'; return !st || st.status !== 'skipped';
@@ -469,12 +469,12 @@ const Pipeline = {
if (status === 'done') return '<span class="count-status">erledigt</span>'; if (status === 'done') return '<span class="count-status">erledigt</span>';
if (status === 'active') return '<span class="count-status">läuft...</span>'; if (status === 'active') return '<span class="count-status">läuft...</span>';
if (status === 'error') return '<span class="count-status">Fehler</span>'; if (status === 'error') return '<span class="count-status">Fehler</span>';
return '<span class="count-status"></span>'; return '<span class="count-status">-</span>';
} }
if (status === 'pending') return '<span class="count-status"></span>'; if (status === 'pending') return '<span class="count-status">-</span>';
if (status === 'active') return '<span class="count-status">läuft...</span>'; if (status === 'active') return '<span class="count-status">läuft...</span>';
if (status === 'error') return '<span class="count-status">Fehler</span>'; if (status === 'error') return '<span class="count-status">Fehler</span>';
if (cv == null) return '<span class="count-status"></span>'; if (cv == null) return '<span class="count-status">-</span>';
switch (stepKey) { switch (stepKey) {
case 'sources_review': case 'sources_review':