Commit graph

615 Commits

Autor SHA1 Nachricht Datum
claude-dev
896791608a refactor(studio): Automatisch aktualisieren raus aus dem Startdialog
Die Wahl war keine Startaktion, sondern eine Einstellung, die nebenbei einen
Lauf auslöste. Damit stand sie neben zwei echten Alternativen und beantwortete
eine andere Frage als die gestellte.

Das Intervall samt Startzeit steht im Reiter Einstellungen des Falls, dort
gehört es hin und dort lässt es sich auch wieder ändern. Im Startdialog
bleiben zwei Alternativen, die sich wirklich ausschließen. Den Fall aus dem
Netz aufbauen oder mit eigenem Material beginnen.

Fünf Prüfungen halten das fest, darunter der Nachweis, dass die automatische
Aktualisierung im Einstellungen-Reiter erreichbar bleibt.

Cache-Buster auf 20260802d.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 19:36:50 +00:00
claude-dev
bd35e25121 test(studio): Zugriffe auf nicht vorhandene Elemente werden geprüft
Nachtrag aus der Endkontrolle nach dem Umbau der Bausteinspalte. Ein
getElementById auf ein entferntes Element scheitert still, genau das wäre
beim Entfernen der Artefakt-Karten leicht passiert. Die Strukturprüfung
gleicht jetzt jede gesuchte ID gegen das Dokument ab, inklusive der zur
Laufzeit erzeugten.

Für studio.js sind alle 109 Zugriffe sauber. In app.js sind fünf Verweise
ins Leere aufgefallen, alle aus der Domain-Sperrliste im Quellen-Modal und
alle hinter einer Existenzprüfung, showBlockDomainDialog kehrt bei fehlendem
Formular sofort zurück. Kein Absturzrisiko, aber toter Code. Sie stehen als
bekannte Altlast in der Prüfung, werden gemeldet und zählen nicht als
Fehler. Ein neuer Fall fällt weiterhin auf.

Dazu ein Kommentar am Label der Netzwerkanalyse, das ohne zugehörige Karte
stehen bleibt, damit später niemand rätselt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 19:32:17 +00:00
claude-dev
f8d32b1d18 fix(studio): Lauf-Anzeige ohne geöffneten Fall zurücksetzen
Nachtrag zu ffbdd51. _renderLauf lief nur über _stagesIdle, und das wiederum
nur beim Laden eines Falls. Schloss man den Fall oder öffnete das Studio ohne
Fall, blieb der Stand-Kasten mit den Angaben des zuletzt geöffneten Falls
stehen, beim allerersten Aufruf war er leer.

Zwei Absicherungen. Der Leerzustand setzt Fall und Frischedaten zurück und
zeichnet die Spalte einmal neu, und das Dokument bringt den Ausgangstext
bereits mit.

Sechs Prüfungen dafür.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 19:28:39 +00:00
claude-dev
ffbdd5170c refactor(studio): ein Startpunkt statt sechs, Schritte werden zur Anzeige
Die Bausteinspalte mischte vier Dinge in einem Kartenlayout. Ergebnisse zum
Anschauen, Erzeuger zum Starten, ein Artefakt ohne Erzeuger und reine
Aktionen. In jeder Karte lagen Öffnen und Neurechnen wenige Pixel
auseinander, beide mit demselben Kreispfeil-Symbol. Dazu kamen sechs Stellen,
an denen ein Lauf beginnen konnte, verteilt über zwei Spalten.

Jetzt drei getrennte Bereiche. Oben wird gearbeitet, in der Mitte werden
Ergebnisse angesehen, unten stehen die Fall-Aktionen.

Gearbeitet wird über genau einen Knopf, dessen Beschriftung sich am Zustand
ausrichtet. Beim leeren Fall Lauf starten, bei einer Recherche Recherche
starten, bei veralteten Ergebnissen Jetzt aktualisieren, sonst Erneut
durchlaufen, während eines abbrechbaren Laufs Abbrechen. Darüber steht, was
gerade zu tun ist, etwa die Zahl der neuen Artikel seit dem letzten Bericht.

Darunter die vier Schritte als Kette mit Zustand. Sie starten nichts,
Aufklappen erklärt nur, was ein Schritt tut. Damit fällt auch eine
Kostenfalle weg. Ein einzeln gestartetes Sammeln buchte denselben Satz wie
der komplette Lauf, wer danach Lagebild und Faktencheck einzeln nachzog,
zahlte 69 statt 45 Credits, ohne dass die Oberfläche darauf hinwies.

Benannt wird ab jetzt das Ergebnis statt des Erzeugers. Artikel holen,
Lagebild schreiben, Fakten prüfen, Orte erkennen. Bei Recherche-Lagen heißt
der zweite Schritt Recherchebericht schreiben. Die Wörter Baustein,
Geoparsing und Analyse verschwinden aus der Oberfläche.

Weiter entfernt sind die Karte Netzwerkanalyse, solange es den Baustein im
Server nicht gibt, der Sammeln-Knopf aus der Quellenspalte und die Wahl
Nur Quellen sammeln im Startdialog.

Der Server behält seine Schnittstelle für einzelne Bausteine. Die Anzeige
eines so gestarteten Laufs bleibt erhalten, er kann aus der klassischen
Ansicht kommen. Ein solcher Lauf wird beim Abbruch auch als der Schritt
abgebrochen, der wirklich läuft, nicht pauschal als kompletter Lauf.

51 tote CSS-Regeln entfernt. Prüfungen ohne Browser, 59 neue Fälle für die
Lauf-Anzeige plus 12 in der Strukturprüfung, die festhalten, dass es im
ganzen Dokument genau ein Element gibt, das einen Lauf starten kann.

Die Anzeige der Credits am Knopf kommt später, sie ist bewusst nicht Teil
dieser Änderung.

Cache-Buster auf 20260802c.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 19:26:27 +00:00
claude-dev
4ba66cb510 feat(studio): Einstellungen-Reiter je Fall, KI-Weg wählbar und sichtbar
Das Studio konnte Fälle bisher nur anlegen, nicht bearbeiten. Es gab kein
Einstellungs-Panel, alle Felder waren nach dem Anlegen eingefroren. Wer etwas
ändern wollte, musste zurück in die klassische Ansicht. Für die geplante
Ablösung der klassischen Ansicht ist das der erste Blocker.

Neuer Reiter Einstellungen in der Fallnavigation, unter Export. Er führt alle
Felder des klassischen Bearbeiten-Modals: Titel, Beschreibung, die drei
Quellenschalter, Sichtbarkeit, KI-Verarbeitung, Aktualisierung mit Intervall
und Startzeit, Aufbewahrung und die drei E-Mail-Benachrichtigungen.

Gespeichert wird nur, was sich geändert hat. Zwei Gründe. Der Server
aktualisiert feldweise, unverändert zurückgereichte Werte würden trotzdem
geschrieben. Und eine unbeabsichtigte Änderung am Intervall kann einen
laufenden Zeitplan verstellen.

Die Wahl des KI-Wegs, also Anthropic gegen die EU-Fassung über Bedrock
Frankfurt, fehlte im Studio vollständig. Sie steht jetzt im Reiter und im
Anlege-Dialog, wortgleich zur klassischen Ansicht. Beim Umstellen erscheint
ein Hinweis, dass bereits erzeugte Inhalte auf dem bisherigen Weg entstanden
sind und die Änderung ab dem nächsten Lauf greift. Läuft gerade ein Schritt,
sagt der Reiter das ebenfalls.

Dazu die Kennzeichen EU und Anthropic in Fallliste und Kopfzeile. Sie
erscheinen nur, wenn der Fall ausdrücklich auf einen Weg gestellt ist. Ohne
Angabe gilt die Vorgabe der Organisation, dann bleibt es unbeschriftet.

Zwei Feinheiten. Das Intervall wird in der größten glatt aufgehenden Einheit
gezeigt, 1440 Minuten also als ein Tag. Und der X-Schalter bleibt bedienbar,
wenn der Fall X bereits nutzt, sonst ließe er sich nach dem Wegfall des
letzten Zugangs nicht mehr abschalten.

Prüfungen ohne Browser und ohne Netzzugriff. 57 Fälle für den Reiter, dazu 29
für die Struktur beider Oberflächen, die prüfen, dass jedes onclick auf eine
vorhandene Methode zeigt, dass keine ID doppelt vergeben ist und dass jedes
Design-Token ohne Fallback auch definiert ist.

Cache-Buster auf 20260802b.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 18:30:27 +00:00
claude-dev
c09c2a49b9 feat(ui): Sammelaktionen auch in der klassischen Ansicht, mit Lucide-Icons
Im Studio lassen sich mehrere Faelle auf einmal archivieren oder loeschen, in
der klassischen Ansicht ging das nur einzeln ueber die Aktionsleiste. Wer dort
zehn alte Lagen wegraeumen wollte, musste jede einzeln oeffnen.

Die Seitenleiste bekommt deshalb dieselbe Bedienung wie das Studio. Unten
stehen zwei Knoepfe, Archivieren und Loeschen. Der erste Klick schaltet den
Auswahlmodus ein, erst dann erscheinen Haken in der Lagenliste, an Stelle des
Statuspunktes. Ein Klick auf eine Zeile waehlt dann aus, statt die Lage zu
oeffnen. Bestaetigt wird in der Leiste darunter, die mitzaehlt und nur
anbietet, was zur Auswahl passt. Sind nur aktive Lagen gewaehlt, erscheint
kein Aktivieren-Knopf, im Loeschmodus keiner der beiden anderen.

"Alle sichtbaren" beruecksichtigt den Filter der Seitenleiste, waehlt also bei
aktivem Eigene-Filter nur die eigenen Lagen aus. Das Loeschen fragt vorher nach
und nennt Titel und Artikelzahl, weil es nicht rueckgaengig zu machen ist. Die
Aktionen laufen nacheinander ueber die normalen Endpunkte, damit deren
Rechtepruefung greift, und Fehlschlaege werden mit Nummer gemeldet statt still
verschluckt. War die offene Lage dabei, springt die Ansicht zurueck.

Dazu Lucide-Icons fuer Archivieren, Aktivieren, Loeschen und Abbrechen, in
beiden Ansichten. Im Studio setzte _renderBulkBar die Beschriftung bisher ueber
textContent des Knopfes, was das Icon bei jedem Neuzeichnen entfernt haette.
Die Beschriftung liegt jetzt in einer eigenen span.

Cache-Buster auf 20260802a, sonst laden Browser die alten Skripte weiter.

Neu sind 34 Pruefungen, sie laufen ohne Browser gegen ein DOM-Double.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 12:19:52 +00:00
claude-dev
e440ef93d1 fix(faktencheck): Zahl der Faktenaussagen richtet sich nach dem Material
In allen Auftraegen stand fest "5-10 wichtigste Faktenaussagen", bei der
Aktualisierung "3-5 neue". Die Zahl hatte damit nichts mit der Menge des
Materials zu tun. Aus 16 Meldungen wurden genauso viele Fakten wie aus 91.

Beide Wege lasen dieselbe Vorgabe verschieden. Der Weg ueber die Anthropic-CLI
behandelte sie als Richtwert und lag zwischen 9 und 21 Fakten, ueberschritt die
Zehn also regelmaessig. Das Modell auf dem EU-Weg las sie als Zielvorgabe und
traf sie in neun von siebzehn Laeufen exakt. Daher wirkten die EU-Berichte so
gleichfoermig, nicht die Lage bestimmte den Umfang, sondern die Zahl im Text.

Bei der Ceuta-Lage bedeutete das, dass zehn Punkte eine europaweite Krise
abbilden mussten, in der Opferzahlen, die schwimmende Barriere, das
Sondertreffen der Innenminister, Italiens Schengen-Aussetzung, der offene Brief
von 22 Staaten, die Rueckfuehrungen und mehrere Regierungsaeusserungen
vorkamen.

faktenspanne() berechnet den Richtwert jetzt aus der Zahl der Meldungen, grob
eine Aussage je fuenf Meldungen, begrenzt auf 5 bis 20 bei der Erstpruefung und
3 bis 10 bei der Aktualisierung. 16 Meldungen ergeben weiterhin 5 bis 10, 88
Meldungen ergeben 9 bis 18. Alle Werte sind ueber Umgebungsvariablen
einstellbar.

Dazu die Formulierung. Die Spanne ist jetzt ausdruecklich als Richtwert und
nicht als Zielvorgabe bezeichnet, mit der Erlaubnis, weniger zu nennen wenn das
Material nicht mehr hergibt, und mehr wenn sonst wichtige Punkte fehlen wuerden.
Betroffen sind die vier Faktencheck-Vorlagen und die Triage.

Neu sind 25 Pruefungen, insgesamt laufen 279 ohne Netzzugriff und ohne Kosten.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 11:47:56 +00:00
claude-dev
b00076d320 fix(eu): Belastungsprobe folgt auch auf eine erfolgreiche Nachbelegung
Der erste Lauf mit den Gegenproben (Lage 64) zeigte, dass der Faktencheck
selbst jetzt ehrlich arbeitet. Der erste Durchgang liess 3 von 10 Behauptungen
offen, also 30 Prozent und damit genau das Niveau des Anthropic-Wegs. Vorher
waren es acht Laeufe hintereinander null.

Danach hob die Nachhak-Runde alle drei wieder auf bestaetigt, und der Lauf
endete erneut ohne eine einzige Unsicherheit.

Ursache war ein Denkfehler im Aufbau. Die zweite Runde war ein Entweder-oder.
Entweder wurde nachbelegt oder es lief die Belastungsprobe. Sobald nachbelegt
wurde, stand am Ende wieder alles auf bestaetigt und niemand prueft das nach.

Jetzt laufen beide Schritte nacheinander. Erst wird nachbelegt, danach greift
die Belastungsprobe, wenn kaum noch etwas offen ist. Sie prueft damit genau die
frisch vergebenen Bestaetigungen. Damit sie wirklich neu sucht, meldet die
Nachhak-Runde ihre Anfragen zurueck und die Belastungsprobe meidet auch diese.

Der Weg ueber die Anthropic-CLI bleibt unveraendert. 254 Pruefungen laufen ohne
Netzzugriff und ohne Kosten.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 11:27:17 +00:00
claude-dev
d948e3a7f4 feat(eu): Faktencheck weist Unsicherheit aus statt alles zu bestaetigen
Der EU-Faktencheck bestaetigte praktisch jede Behauptung. Ueber alle Laeufe
seit Lage 42 lag der Anteil offener Punkte bei 6 Prozent, beim Weg ueber die
Anthropic-CLI bei 31 Prozent. In acht aufeinanderfolgenden Laeufen zur
Ceuta-Lage war er exakt null, achtmal zehn Behauptungen, zehnmal bestaetigt.

Bei derselben Lage bewerteten beide Wege dieselben Aussagen verschieden. Der
Anthropic-Weg stufte "22 EU-Laender kritisieren Spanien" mit sechs Quellen als
unbestaetigt ein, der EU-Weg dieselbe Aussage mit vier Quellen als bestaetigt.
Mehr Quellen und trotzdem vorsichtiger, das ist kein Zufall, sondern Bauart.

Drei Ursachen, drei Aenderungen.

1. Die Belegsuche kannte nur Bestaetigung. Alle Anfragen waren stuetzend
   formuliert, wer so sucht findet auch nur Stuetzendes. Ein Anteil der
   Anfragen (EU_VERIFY_COUNTER_SHARE, Vorgabe 0.3) ist jetzt eine Gegenprobe
   und sucht gezielt nach Dementi, Richtigstellung, abweichenden Angaben und
   der Darstellung der Gegenseite. Die Treffer sind im Kontext als
   [GEGENPROBE] gekennzeichnet.

2. Das Modell konnte Belege nicht wirklich pruefen. Die Belegsuche lief mit
   abgeschaltetem Volltext, das Modell sah je Treffer nur Ueberschrift und
   Auszug. Ein Artikel zum Thema wurde damit zum Beleg fuer eine konkrete
   Zahl. Bis zu EU_VERIFY_FULLTEXT_QUERIES Anfragen holen jetzt den
   Artikeltext. Dazu die Ansage, dass ein Treffer, der nur das Thema erwaehnt,
   kein Beleg ist, und dass eine Angabe, die praeziser ist als ihre Quelle,
   nicht traegt.

3. Die zweite Runde lief nur in eine Richtung. Sie belegte offene Punkte nach,
   und wenn nichts offen war, lief sie gar nicht. Ausgerechnet der Fall "alles
   bestaetigt" blieb ungeprueft. Jetzt folgt dort eine Belastungsprobe. Sie
   sucht ausschliesslich Gegenproben zu den staerksten Behauptungen und darf
   Bestaetigungen zuruecknehmen, aber niemals vergeben. Zurueckgestuft wird
   bei Widerspruch, bei Dementi, wenn die Belege die konkrete Angabe gar nicht
   nennen, wenn die Behauptung praeziser ist als ihre Quellen, oder wenn nur
   eine einzige Stelle berichtet. Ausserdem darf die Nachhak-Runde einen Status
   jetzt auch absenken, wenn die Nachrecherche der Behauptung widerspricht.

Dabei fiel ein Robustheitsmangel auf. Scheiterte die zweite Runde, etwa weil
die Suche nicht erreichbar war, ging der gesamte Faktencheck verloren statt nur
die Zusatzpruefung. Die zweite Runde ist jetzt gekapselt, das Ergebnis des
ersten Durchgangs bleibt in jedem Fall erhalten.

Der Weg ueber die Anthropic-CLI bleibt unveraendert. Neu sind 26 Pruefungen,
insgesamt laufen 250 ohne Netzzugriff und ohne Kosten.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 11:10:43 +00:00
claude-dev
5a75f0fb15 fix(faktencheck): keine Wertung in der Behauptung, Korrekturen als Verlauf
Drei Befunde aus dem Bericht zu Lage 60 vom 02.08.2026, alle in der Semantik
von Faktencheck und Lagebild.

1. Eine Behauptung trug eine Wertung, die das eigene Lagebild widerlegt. Im
   Faktencheck stand bestaetigt, die Migranten haetten Ceuta "freiwillig"
   verlassen. Drei Zeilen darueber berichtet dasselbe Dokument, dass die
   Behoerden zur Umkehr aufforderten, mit Abschiebung drohten und Soldaten
   verbliebene Personen zusammentrieben. Wertende Zusaetze gehoeren jetzt nur
   in die Behauptung, wenn genau dieser Zusatz belegt ist.

2. Eine korrigierte Zahl stand als Spanne. "Mindestens 57 bis 67 Tote"
   praesentiert einen ersetzten und einen aktuellen Stand als gleichwertige
   Bandbreite. Der Bericht vom Vortag hatte denselben Sachverhalt noch als
   Verlauf aufgeloest, was methodisch richtig ist. Korrigierte Werte werden
   jetzt als Zeitreihe dargestellt; eine Spanne bleibt der Fall, in dem
   verschiedene Stellen gleichzeitig verschiedene Werte erheben, dann mit
   Zuordnung. Die Regel steht auch in den drei Analyse-Vorlagen und in der
   Kachel Neueste Entwicklungen, weil die Formulierung dort entsteht.

3. Der Faktencheck bestaetigte zehn von zehn Behauptungen. Ein Raster, das nie
   zu einem anderen Ergebnis kommt, transportiert keine Pruefinformation. Der
   Auftrag verlangt jetzt, auch strittige, schwach belegte oder unterschiedlich
   dargestellte Aussagen aufzunehmen, ohne dazu etwas zu erfinden.

Neu sind 4 Pruefungen, insgesamt laufen 224 ohne Netzzugriff und ohne Kosten.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 01:47:19 +02:00
claude-dev
695983245d fix(bericht): keine Doppelverweise und keine Platzhalter im Quellenverzeichnis
Zwei Befunde aus dem Bericht zu Lage 60 vom 02.08.2026.

1. Doppelte Verweise, ein Folgefehler des Dubletten-Zusammenfuehrens. Zeigten
   zwei Nummern auf dieselbe Adresse, wurden beide Verweise auf dieselbe neue
   Nummer umgeschrieben und standen dann nebeneinander: "[24][24]". Im Bericht
   kam das dreimal vor, in der gespeicherten Fassung nicht. Aufeinanderfolgende
   Verweise auf dieselbe Nummer werden jetzt zusammengezogen.

2. Platzhalter ohne Adresse. Das Modell hatte einen Eintrag {"nr": 12, "name":
   "Quelle", "url": ""} erzeugt. Der Bericht druckte ihn als "12 Quelle" ohne
   Adresse und die Statistik fuehrte ein Medium namens "Quelle". Ein Eintrag
   ohne Adresse ist kein pruefbarer Beleg und kommt nicht mehr ins
   Verzeichnis; der Verweis darauf wird wie ein verwaister behandelt und
   entfernt.

Gegenprobe an Lage 60: aus 30 Eintraegen werden 26 (drei doppelte Adressen
zusammengefuehrt, ein Platzhalter entfernt), die Zaehlung bleibt lueckenlos,
kein doppelter Verweis mehr im Text.

Neu sind 4 Pruefungen, insgesamt laufen 220 ohne Netzzugriff und ohne Kosten.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 01:41:28 +02:00
claude-dev
e2638ce9d5 fix(eu): Vertiefungsrunde der Recherche faellt nicht mehr aus
Die Suchphase endete in jedem beobachteten Lauf mit "Treffer-Obergrenze 60
erreicht" nach Runde 2. Die ersten beiden Runden erfassen breit und fuellten
den Korb, die dritte Runde, die gezielt Luecken schliessen soll, lief damit
nie. Genau diese Runde bringt aber das, was in den Berichten fehlte: die
Position des eigenen Landes, die Reaktion der Institutionen, den rechtlichen
Rahmen.

Der harte Gesamtstopp war eine Ueberkorrektur. Er kam aus einem frueheren Fix
gegen Leerrunden: War der Korb voll, befragte die Schleife weiter das teuerste
Modell, ohne noch etwas aufnehmen zu koennen. Das Problem war aber nicht die
Rundenzahl, sondern dass spaete Runden keinen Platz mehr hatten.

Jetzt drei Aenderungen:

1. Kontingent je Runde (EU_RESEARCH_MAX_NEW_PER_ROUND, Vorgabe 25). Die frueher
   Runden koennen den Korb nicht mehr allein fuellen, fuer die spaeteren bleibt
   Platz frei.

2. Verdraengung statt Abbruch. Ist der Korb voll und eine spaetere, gezieltere
   Runde bringt einen Treffer, weicht der schwaechste Treffer einer frueheren
   Runde: ohne Volltext, ohne Textauszug, aus der fruehesten Runde. Treffer mit
   Volltext werden nie verdraengt.

3. Abbruch nur noch bei echter Saettigung. Bringt eine ganze Runde keinen
   einzigen neuen Treffer, ist das Thema ausgeschoepft und die Schleife endet.
   Der Kostenschutz des frueheren Fixes bleibt damit erhalten, ohne die
   Vertiefung zu verhindern.

Dazu bekommt die dritte Adhoc-Runde einen eigenen Auftrag. Bisher wiederholte
sie den Text der zweiten ("Luecken schliessen und vertiefen"), jetzt fragt sie
ausdruecklich nach der fehlenden Seite der Lage und verbietet die Wiederholung
des Hauptereignisses.

Neu sind 10 Pruefungen, darunter der Regressionsschutz gegen Leerrunden in
neuer Form. Insgesamt laufen 216 ohne Netzzugriff und ohne Kosten.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 01:15:32 +02:00
claude-dev
9868a9748a fix(recherche): Suchbegriffe treffen wieder, Verzeichnis ohne Dubletten
Vier Befunde aus dem Vergleich vom 02.08.2026, sortiert nach Wirkung.

1. Mehrwort-Suchbegriffe fielen im RSS-Abgleich durch. Dieselbe Lage lieferte
   je nach Titel 79 oder 17 Treffer. Die Keyword-Erzeugung liefert bei
   politisch formulierten Titeln Phrasen ("migrationskrise spanien",
   "aufnahmeverfahren eu"), das Matching verglich sie als starre Zeichenfolge.
   Die Schlagzeile "Migrationskrise in Spanien" enthaelt "migrationskrise
   spanien" nicht, wegen des Wortes dazwischen. Aus 53 Artikeln wurden so 16.
   Eine Phrase trifft jetzt, wenn alle ihre Bestandteile im Text vorkommen,
   unabhaengig von Reihenfolge und Abstand. Die Genauigkeit bleibt erhalten,
   nur die starre Reihenfolge faellt weg.

   Dazu der Auftrag an die Keyword-Erzeugung: Einzelwoerter statt Phrasen, und
   die harten Eigennamen der Lage sind Pflicht. Bei den betroffenen Laeufen
   fehlte "ceuta" komplett, dafuer stand "europol migration" in der Liste, was
   den Europol-Feed anzog und sieben themenfremde Pressemitteilungen
   einbrachte, die der Topic-Filter danach wieder aussortieren musste.

2. Dubletten im Quellenverzeichnis. Lage 56 fuehrte 30 Eintraege fuer 28
   Adressen, zweimal dieselbe tagesschau-Meldung unter je zwei Nummern.
   Ausgerechnet die strittigste Behauptung, der offene Brief der 22 Staaten,
   stuetzte sich damit auf "3 Quellen", von denen zwei derselbe Artikel waren.
   Gleiche Adresse heisst jetzt ein Eintrag, Verweise auf die entfernte Nummer
   werden auf den behaltenen umgebogen. Verglichen wird ohne Schema, www und
   Endschraegstrich.

3. Die Zeitleiste wird deterministisch sortiert. Im selben Bericht sprang der
   letzte Eintrag von 12:44 zurueck auf 17:47. Der Auftrag verlangt die
   Sortierung zwar vom Modell, im prominentesten Kapitel darf sie aber nicht
   von dessen Sorgfalt abhaengen. Gegenprobe an Lage 56: 23:23, 22:09, 17:47,
   16:58 statt des Sprungs ans Ende.

4. Weiterleitungen zaehlen als ein Beleg. Sie verbergen ihr Zielmedium, also
   laesst sich nicht behaupten, dass dahinter verschiedene Redaktionen stehen.
   Die bisherige Einzelzaehlung stellte den Anthropic-Weg rechnerisch besser:
   in Lage 57 standen 10 ausgewiesene Belege fuer 7 Haeuser, weil vier der elf
   Adressen news.google.com-Weiterleitungen waren.

Gegenprobe an beiden gespeicherten Laeufen: Lage 56 zeigt 28 statt 30
Verzeichniseintraege, beide Berichte zaehlen lueckenlos, die Zeitleiste ist
sortiert.

Neu sind 26 Pruefungen, insgesamt laufen 206 ohne Netzzugriff und ohne Kosten.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-02 00:43:28 +02:00
claude-dev
de3cb7223f fix(ui): Knopf "Beschreibung generieren" verschwindet im Hellmodus beim Hover
Der Knopf griff auf die Variable --accent-primary zu, die es im Stylesheet
nicht gibt: fuenf Verwendungen, null Definitionen. Die Akzentfarbe heisst
--accent.

Wirkung im Hover. `background: var(--accent-primary)` ist damit ungueltig und
faellt auf den Anfangswert transparent zurueck, waehrend `color: #fff`
gueltig bleibt. Auf der weissen Modalflaeche des Hellmodus stand also weisse
Schrift auf weissem Grund, der Knopf war unsichtbar. Im Dunkelmodus fiel es
nicht auf, weil die Flaeche dort dunkel ist.

Im Ruhezustand war nur die Farbe betroffen: Schrift und Rahmen waren nicht
gold, sondern geerbt. Deshalb faellt der Fehler erst beim Hover auf.

Alle fuenf Fundstellen sind auf --accent umgestellt, betroffen waren neben
dem Knopf auch die Durchlauf-Anzeige im Fortschrittsfenster und der kleine
Lade-Ring, die beide ihre Akzentfarbe nicht bekamen.

Hinweis zum Kontrast: Weiss auf Gold (#96791A) liegt bei rund 4,1 zu 1 und
damit knapp unter der WCAG-AA-Schwelle fuer kleine Schrift. Das ist dieselbe
Kombination, die .btn-primary im ganzen Dashboard verwendet, deshalb hier
bewusst konsistent gehalten statt einzeln abweichend geloest.

Offen: Die Aenderung ist noch nicht in den Lokal-Fork portiert.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-01 23:19:18 +02:00
claude-dev
0154c0f575 fix(eu): Kapazitaetsengpaesse bei Bedrock aussitzen statt Schritte verlieren
Am 01.08.2026 lieferte Bedrock waehrend eines Laufs ServiceUnavailableException.
Botocore versuchte es dreimal in fuenf Sekunden und gab auf, die
Web-Source-Selektion fiel ersatzlos aus. Im Bericht war davon nichts zu sehen,
der Lauf galt als vollstaendig. Gemessen sind es zwei betroffene Aufrufe bei
rund 340, also 0,6 Prozent, aber jeder Vorfall kostet einen ganzen
Pipeline-Schritt.

Der Fehler ist auch keiner unserer Quote. ServiceUnavailableException ist ein
503, AWS hat also gerade keine Kapazitaet fuer das Modell. Unsere Meldung
sagte trotzdem "Rate-Limit", weil der Code beide Faelle in einen Topf warf.

Aendert sich damit:

1. Geduldiges Wiederholen. Kapazitaets- (503), Kontingent- (429) und
   Verbindungsfehler werden nach 5, 15 und 30 Sekunden erneut versucht. Diese
   Dellen dauern typischerweise unter einer Minute, unsere bisherigen fuenf
   Sekunden lagen genau im ungeguenstigsten Fenster. Stufen ueber
   BEDROCK_RETRY_WAITS einstellbar.

2. Zwei Bremsen gegen lange Laeufe. Gewartet wird nur, wenn die Wartezeit ins
   Zeitbudget des Aufrufs passt (die Wartezeit zaehlt gegen dasselbe
   asyncio-Budget, und die Haiku-Planungsaufrufe haben nur 120 Sekunden), und
   nur solange das Wartebudget des Refreshs reicht (BEDROCK_RETRY_BUDGET_S,
   Vorgabe 120 Sekunden). Ein Lauf kann sich dadurch um hoechstens zwei
   Minuten verlaengern.

3. Ursachen werden getrennt benannt. Im Log steht jetzt "hat keine freie
   Kapazitaet" oder "meldet ausgeschoepftes Kontingent" statt pauschal
   "Rate-Limit". Nach aussen bleibt beides die Kategorie rate_limit, damit die
   Retry-Steuerung des Orchestrators unveraendert greift.

4. Stoerungen werden sichtbar. Waehrend einer Wartezeit meldet die Oberflaeche
   "KI-Dienst hat keine freie Kapazitaet, neuer Versuch in 15 Sekunden", sonst
   sieht die stehende Anzeige wie ein Haenger aus. Nach dem Lauf steht eine
   Zusammenfassung im Refresh-Protokoll, auch wenn der Lauf sonst glatt
   durchlief.

5. botocore laeuft im Modus 'adaptive' statt 'standard'. Es bremst sich bei
   Drosselung selbst ein und deckt die Sekunden ab, unsere Schleife die
   Zehnersekunden.

Zeitliche Wirkung, gemessen am EU-Lauf der Ceuta-Lage (252 Sekunden, 15
Bedrock-Aufrufe): im stoerungsfreien Fall null, im betroffenen Lauf rund eine
Minute mehr. Bei 0,6 Prozent Fehlerrate je Aufruf trifft das etwa jeden
elften Lauf, im Mittel ueber alle Laeufe rund zwei Prozent.

Gegenprobe mit einem echten Bedrock-Aufruf ueber den geaenderten Pfad: Antwort,
Verbrauch und Kosten unveraendert, keine Stoerung protokolliert.

Neu sind 23 Pruefungen, insgesamt laufen 179 ohne Netzzugriff und ohne Kosten.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-01 22:58:50 +02:00
claude-dev
3495409377 fix(faktencheck): Belegtiefe zaehlt Medienhaeuser, Widerspruch ist keine Widerlegung
Block 2 der Auswertung des Ceuta-Vergleichs vom 01.08.2026. Der Faktencheck der
EU-Fassung zeigte dort drei Fehler, die alle dieselbe Wurzel haben: Der Status
behauptete eine Belegtiefe, die niemand nachgerechnet hat.

1. Die Zaehlung war kaputt. Das Muster fuer die Quellenzaehlung war
   r'https?://' ohne den Rest der Adresse, findall lieferte also eine Liste aus
   "https://"-Bruchstuecken und len(set(...)) ergab immer 1 oder 2. Daher stand
   im Bericht eine Behauptung als BESTAETIGT mit 1 Quelle, obwohl vier Haeuser
   in der Evidenz standen, und der gesamte Faktencheck der Anthropic-Fassung
   wies durchgehend 1 bis 2 Quellen aus. Die Adresse wird jetzt vollstaendig
   erfasst.

2. Gezaehlt wird nach Medienhaus, nicht nach Fundstelle. Sechs France24-Treffer,
   davon vier Videofassungen derselben Meldung, sind ein Haus. Grundlage ist die
   registrierbare Domain aus services/media_registry.py. Weiterleitungsportale
   bekommen keine gemeinsame Identitaet, hinter news.google.com koennen
   beliebige Zeitungen stecken. Nachgerechnet an Lage 53 sinken die Angaben von
   9 auf 6, von 8 auf 4 und von 7 auf 5 Belege.

3. Neue Nachbedingung. pruefe_belegtiefe stuft jeden Fakt ab, dessen Status mehr
   behauptet als vorliegt: confirmed braucht zwei, established drei unabhaengige
   Haeuser. Ein Primaerbeleg (Originalzitat im Interview, amtliche Mitteilung,
   Urteil) traegt allein, dafuer liefert das Modell jetzt "evidence_type". Damit
   verschwindet auch die Unterkonfidenz der Gegenprobe, in der ein ZDF-Interview
   als unbestaetigt galt, obwohl der Kritisierte dort selbst spricht.

4. Die Nachhak-Runde stuft "developing" nicht mehr hoch. Sie hatte die
   Behauptung "Der Ausloeser ist weiterhin unklar" auf BESTAETIGT gesetzt, weil
   developing in der Statusordnung die niedrigste Stufe ist. Eine Unklarheit
   laesst sich nicht bestaetigen. Ausserdem rechnet die Runde die Belegzahl nach
   dem Hochstufen neu und nimmt die Stufe zurueck, wenn die Belege sie nicht
   decken.

5. Widerspruch und Widerlegung sind getrennt. "contradicted" meint laut Auftrag
   Belege, die einander widersprechen, wurde aber als "Widerlegt" angezeigt. Im
   Bericht stand deshalb die sachlich zutreffende Spanne von 50.000 bis 60.000
   Grenzuebertritten als widerlegt, obwohl die Evidenz woertlich sagt "Die
   Zahlen variieren je nach Quelle". Jetzt: contradicted = "Widersprüchlich",
   der neue Status "false" = "Widerlegt" und setzt einen entkraeftenden Beleg
   voraus. Angepasst in Bericht, Oberflaeche, beiden Sprachdateien, Farben und
   Statusordnung.

6. Ein verbindlicher Regelblock haengt an jedem Faktencheck-Auftrag
   (bewertungsregeln()): Unabhaengigkeit heisst verschiedene Medienhaeuser,
   Agenturuebernahmen zaehlen einmal, unterschiedliche Zahlen verschiedener
   Erhebungsstellen sind kein Widerspruch sondern eine Spanne mit Zuordnung,
   und Aussagen ueber den Kenntnisstand ("Der Ausloeser ist unklar") sind keine
   pruefbaren Behauptungen und gehoeren nicht in den Faktencheck.

Die Aenderungen wirken auf beide Modellwege. Die Fixtures in test_eu_factcheck
liefern jetzt Belege aus mehreren Haeusern, weil eine einzelne Quelle keine
Bestaetigung mehr traegt.

Nachgerechnet an beiden gespeicherten Laeufen: kein Fakt wird durch die neue
Nachbedingung abgestuft, die Belegzahlen werden aber durchgehend ehrlicher.

Neu sind 27 Pruefungen, insgesamt laufen 156 ohne Netzzugriff und ohne Kosten.

Offen: Die Oberflaechen-Aenderungen (components.js, app.js, style.css, i18n)
sind noch nicht in den Lokal-Fork portiert.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-01 22:01:30 +02:00
claude-dev
f87d377082 fix(bericht): lueckenlose Quellennummern, Medienname statt Feed-Name
Nachtrag zum Quellenverzeichnis, aufgefallen am Export der EU-Lage 53 vom
01.08.2026.

1. Lueckenlose Zaehlung im Bericht. Das Modell nummeriert alle vorgelegten
   Meldungen durch, zitiert aber nur einen Teil. Das Verzeichnis sprang
   dadurch von 20 auf 22, 24, 26, was fachlich stimmt, beim Leser aber wie
   ein Fehler aussieht. Export und Text werden jetzt gemeinsam auf 1 bis n
   umgeschrieben. Die gespeicherten Nummern bleiben unangetastet, damit sie
   ueber Folge-Refreshes stabil bleiben. Verweise, fuer die es keinen
   Verzeichniseintrag gibt, werden dabei entfernt statt verschoben: nach einer
   Umnummerierung wuerden sie sonst auf einen fremden Eintrag zeigen.

2. Der kuratierte Medienname schlaegt den Feed-Namen. Bisher gewann der
   haeufigste gelieferte Name, und das war der Name des RSS-Feeds. Im Bericht
   stand deshalb "Guardian World", "NYT Top Stories", "BBC Europe" und
   "FT Europe". Jetzt: The Guardian, New York Times, BBC, Financial Times.

3. Weiterleitungsportale werden nicht mehr zusammengefasst. Die Gruppierung
   nach Domain warf in der Anthropic-Fassung vier Zeitungen zusammen, weil
   Deutschlandfunk, Kurier, SZ.de und tagesschau.de dort alle als
   news.google.com-Link vorliegen. Der Umweg wird jetzt in der Statistik
   offen ausgewiesen, statt die Medien zu verschmelzen.

4. Ein Quelleneintrag zerfaellt nicht mehr ueber die Seitengrenze. Nummer und
   Name standen am Fuss der einen, die Adresse am Kopf der naechsten Seite.

Gegenprobe an beiden Laeufen des Ceuta-Vergleichs: Lage 53 zeigt 25 Quellen
lueckenlos von 1 bis 25, Lage 52 22 von 1 bis 22, in beiden Faellen loest
jeder Verweis im Text auf und kein Eintrag zerfaellt ueber eine Seite.

Neu sind 11 Pruefungen, insgesamt laufen 129 ohne Netzzugriff und ohne Kosten.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-01 21:50:38 +02:00
claude-dev
58aec2edd5 fix(bericht): Quellenverzeichnis gibt die Nummern aus dem Lagebild wieder
Der Vergleich zweier Berichte zur selben Lage (Ceuta, 01.08.2026) zeigte in
beiden Fassungen Textverweise, die im gedruckten Verzeichnis nicht auftauchten.
Die EU-Fassung zitierte bis [28] bei 25 aufgefuehrten Quellen, die
Anthropic-Fassung bis [29] bei 22.

Ursache war nicht die Analyse. In der Datenbank passen Text und Liste in beiden
Laeufen exakt zusammen, keine einzige Referenz ohne Eintrag. Das PDF-Template
druckte jedoch die laufende Zeilennummer (loop.index) statt der Quellennummer
aus dem Lagebild (src.nr). Sobald die Nummern Luecken haben, und das ist der
Normalfall, weil nicht jede gesammelte Meldung zitiert wird, verschiebt sich
ab der ersten Luecke jeder Beleg. Lage 53 hat die Nummern 1 bis 20, 22, 24, 26,
27, 28: gedruckt wurde 1 bis 25, aus Quelle 28 wurde Zeile 25.

Behoben:

1. Das Verzeichnis druckt src.nr. Gegenprobe an den echten Daten beider Laeufe:
   vorher fehlten in Lage 53 die Verweise [22] bis [28], jetzt loest jede der
   25 Referenzen auf, in Lage 52 alle 22.

2. Keine Kappung des Verzeichnisses mehr. Im Umfang "Bericht" wurde bei 30
   Eintraegen abgeschnitten, hoehere Referenzen im Text waren damit
   grundsaetzlich unaufloesbar.

3. Die Word-Ausgabe bekommt ueberhaupt erst ein Quellenverzeichnis. Bisher
   verwies der Text dort auf [1], [2], ohne dass die Datei die Nummern
   irgendwo aufloeste.

4. Die Quellenstatistik bezieht sich jetzt auf dieselbe Grundmenge wie das
   Verzeichnis. Vorher zaehlte sie alle gesammelten Artikel (49) und stand
   damit neben einem Verzeichnis mit 25 Eintraegen, was wie eine Aufwertung
   der Quellenbasis wirkte. Die Summe der Spalte Belege entspricht jetzt der
   Zahl der Eintraege, ein Hinweis nennt zusaetzlich die insgesamt
   ausgewerteten Meldungen.

5. Ein Verlag wird unter einem Namen gefuehrt. Bisher trennte der Bericht
   "Guardian UK", "Guardian World" und "The Guardian" oder "tagesschau" und
   "tagesschau.de" in eigene Zeilen und blaehte damit die Vielfaltsstatistik
   auf. Die neue services/media_registry.py bestimmt die Identitaet ueber die
   registrierbare Domain und waehlt den haeufigsten Namen. Aus 20
   Statistikzeilen der EU-Fassung werden so 11 echte Medien. Sie kennt
   ausserdem Weiterleitungsportale und liest die Sprache aus der Adresse,
   sodass english.elpais.com nicht mehr als DE gefuehrt wird.

Neu sind 22 Pruefungen, insgesamt laufen 118 ohne Netzzugriff und ohne Kosten.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-01 21:41:38 +02:00
claude-dev
bf967216de fix(analyse): vollstaendigen Bericht nehmen, wenn das Modell sich selbst korrigiert
Der Recherchebericht der EU-Fassung enthielt seit zwei Laeufen nur noch den
Abschnitt ZUSAMMENFASSUNG, 1513 statt der ueblichen mehreren tausend Zeichen.
Die Abschnitte HINTERGRUND, AKTEURE, AKTUELLE LAGE, EINSCHAETZUNG und
QUELLENQUALITAET fehlten vollstaendig.

Ursache. Das Modell lieferte zuerst ein knappes JSON, bemerkte den Fehler
selbst ("Wait, I need to include the full briefing content in the summary
field. Let me redo this properly with all sections") und haengte danach eine
zweite, vollstaendige Fassung an. Unsere Auswertung nahm das erste Objekt und
verwarf alles danach. Der Bericht war also da, wir haben ihn weggeworfen.

Behoben. json_utils bekommt extract_json_objects und extract_json_arrays, die
alle vollstaendigen Bloecke einer Antwort liefern statt nur den ersten. Der
Analyzer waehlt daraus den Bericht mit dem laengsten summary, der Faktencheck
die Liste mit den meisten Fakten. Beide protokollieren, wenn mehrere Fassungen
auftauchen, damit der Fall sichtbar bleibt. Die bisherigen Einzelabfragen
extract_json_object und extract_json_array bleiben unveraendert, damit sich an
den uebrigen Aufrufstellen nichts aendert.

Gegenprobe an der echten Antwort aus Lauf 50. Vorher 1513 Zeichen mit einem
Abschnitt, jetzt 8189 Zeichen mit allen sechs.

Neu sind 16 Pruefungen, insgesamt laufen 96 ohne Netzzugriff und ohne Kosten.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-01 13:49:15 +00:00
claude-dev
5a08507217 docs: Testordner in der Projektstruktur ergaenzen
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-01 13:27:25 +00:00
claude-dev
0f39154e39 fix(eu): drei Fehler beheben, die den Ertrag des Faktenchecks aufzehrten
Der Vergleichslauf zur Innenministerkonferenz (Lage 49) zeigte, dass der
verbesserte Faktencheck zwar zehn Fakten lieferte, davon aber nur drei
uebrig blieben. Die Ursachen lagen in drei nachgelagerten Stellen.

1. Quellenzuordnung stufte alle zehn Fakten herab.
   Durch den groesseren Belegblock stuetzt das Modell seine Fakten jetzt
   staerker auf die europaeische Suche als auf die gespeicherten Meldungen.
   Es zitiert dabei die Belegnummern statt vollstaendiger Adressen. Die
   Quellenzuordnung suchte daraufhin vergeblich nach passenden Meldungen und
   stufte jeden Fakt herab. Im Vergleich: Lauf 45 hatte null Herabstufungen,
   Lauf 44 eine, Lauf 49 zehn von zehn.
   Behoben an zwei Stellen. Die Belegsuche gibt die gefundenen Quellen jetzt
   einzeln zurueck, der Faktencheck reicht sie an die Zuordnung durch, und
   der Auftrag verlangt ausdruecklich die vollstaendige Adresse je Beleg.

2. Duplikatpruefung loeschte sieben von zehn Fakten.
   Das Clustering warf inhaltlich verschiedene Beschluesse in eine Gruppe,
   weil viele Behauptungen gleich beginnen. Es gab keinerlei Absicherung, bei
   kleinen Faktenmengen entschied das Modell sogar voellig allein.
   Zwei Sicherungen greifen jetzt. Eine Gruppe, die mehr als 40 Prozent aller
   Fakten umfasst, wird verworfen. Und jeder Loeschkandidat muss dem
   behaltenen Fakt auch rechnerisch aehnlich sein, Grenze 0,55 im selben Mass
   wie im Vorfilter. Beide Werte sind ueber Umgebungsvariablen einstellbar.

3. Leerrunden in der Recherche.
   War die Treffer-Obergrenze erreicht, brach nur die innere Schleife ab. Die
   Rundenschleife lief bis zum Ende weiter und befragte jedes Mal das teuerste
   Modell, ohne noch eine einzige Suche auszufuehren. Das kostete rund 0,17
   USD je Durchgang, bei drei Durchgaengen etwa 0,50 USD pro Aktualisierung.

Der Weg ueber die Anthropic-CLI bleibt unveraendert. Neu sind 16 Pruefungen,
darunter der nachgebildete Fall aus Lage 49, insgesamt laufen jetzt 80
Pruefungen ohne Netzzugriff und ohne Kosten.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-01 13:26:32 +00:00
claude-dev
c4e19777f9 feat(eu): Faktencheck der EU-Fassung sucht breiter, gezielter und hakt nach
Der Faktencheck ueber Bedrock und staan lieferte spuerbar weniger belegte
Fakten als der bisherige Weg ueber die Anthropic-CLI. Ursache war die Bauart.
Der bisherige Weg sucht waehrend der Pruefung selbst und kann bei duenner
Beleglage nachfassen, die EU-Fassung bekam dagegen einen festen, vorab
beschafften Stapel Belege und hatte genau einen Versuch.

Drei Aenderungen schliessen die Luecke.

1. Mehr Belege je Pruefung. Statt 3 Anfragen mit je 3 Treffern laufen jetzt
   7 Anfragen mit je 6 Treffern, und bis zu 14 statt 8 Pruefpunkte gehen in
   die Planung ein. Gleiche Quellen werden nur einmal in den Kontext gelegt.

2. Punktbezogene Planung. Das planende Modell ordnet jeder Suchanfrage zu,
   welche Behauptung sie belegen soll, statt allgemein zum Thema zu suchen.

3. Echte Nachhak-Runde. Bleiben nach der Pruefung mindestens zwei
   Behauptungen unbelegt, wird fuer genau diese noch einmal gesucht, mit
   anderen Anfragen als zuvor, und nur diese Punkte werden neu bewertet.
   Ein Status wird dabei nur angehoben, nie gesenkt, und faellt die Runde
   aus, bleiben die Fakten unveraendert.

Die Nachhak-Runde greift in allen drei Pruefwegen, also bei der Erstpruefung,
der inkrementellen Pruefung und der Pruefung in Themengruppen. Gruppen nutzen
kleinere Suchmengen, da sie parallel laufen und je nur ein Teilthema abdecken.
Alle Mengen sind ueber Umgebungsvariablen einstellbar.

Der Weg ueber die Anthropic-CLI bleibt unveraendert, das sichern sechs
Regressionstests ab. Neu sind zwei Testdateien mit zusammen 55 Pruefungen,
die ohne Netzzugriff und ohne Kosten laufen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-01 12:59:26 +00:00
claude-dev
768150c302 fix(agents): nicht maskierte Anfuehrungszeichen in Modell-JSON reparieren
Beobachtet am 31.07.2026 auf Staging: Modelle schliessen deutsche Zitate
gelegentlich mit einem geraden Anfuehrungszeichen, das das JSON an dieser
Stelle bricht. Die Folgen waren still und teuer:
  - Lagebild von Lage 47 brach mitten im Satz ab (738 statt ~4000 Zeichen),
    weil der Regex-Fallback nur bis zum Stoerzeichen rettete
  - ein kompletter Recherche-Durchlauf von Lage 45 ging verloren
  - sechs weitere Durchlaeufe fielen auf die verlustbehaftete
    Einzelobjekt-Rettung zurueck
Betroffen war vor allem der EU-Weg (Opus 4.6), der CLI-Weg aber ebenfalls.

Neu: src/json_utils.py repariert solche Antworten, indem es beim Durchlauf
mitfuehrt, ob eine Zeichenkette offen ist, und ein Anfuehrungszeichen maskiert,
auf das kein gueltiger JSON-Fortsetzer folgt (Komma nur dann als Ende, wenn
danach wirklich ein Wert oder Schluessel beginnt). Roh eingebettete
Zeilenumbrueche werden ebenfalls maskiert. Repariert wird ausschliesslich als
Rueckfallebene, nachdem der normale Parser gescheitert ist, gueltiges JSON
bleibt unangetastet.

Eingebunden in analyzer, factchecker und researcher. Zusaetzlich meldet der
Analyzer jetzt als ERROR, wenn der letzte Fallback ein erkennbar
abgeschnittenes Lagebild liefert, statt das still hinzunehmen.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-01 11:32:35 +00:00
claude-dev
b7a2a120cd feat(ui): KI-Weg wird fuer beide Wege gekennzeichnet
Bisher zeigte nur der EU-Weg ein Kennzeichen, Lagen auf dem Anthropic-Weg
blieben unbeschriftet und waren dadurch nicht von der Standardvorgabe zu
unterscheiden. Jetzt tragen beide ausdruecklich gesetzten Wege ein Kennzeichen
(gruen 'EU', grau 'Anthropic'), sowohl in der Lagen-Kopfzeile als auch in der
Seitenleiste. Ohne ausdrueckliche Wahl bleibt es unbeschriftet, dort gilt die
Vorgabe der Organisation.

Cache-Stempel von app.js UND components.js hochgezaehlt.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 22:04:57 +00:00
claude-dev
cd50cd8430 fix(ui): Versionsstempel von app.js hochgezaehlt
Der KI-Weg-Umschalter kam beim Anlegen nicht an: das Formular war neu, der
Browser lieferte aber die zwischengespeicherte alte app.js aus, weil der
Cache-Buster unveraendert blieb. Dadurch wurde ai_backend nicht mitgesendet
und Lagen landeten still auf dem Standard.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 21:46:09 +00:00
claude-dev
fb15f3ac8d docs: UI-Sync um den KI-Weg-Umschalter ergaenzt (online-only)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 21:27:37 +00:00
claude-dev
8f5c0e9e5d feat(eu-umbau): Umschalter fuer den KI-Weg in der Oberflaeche
Im Anlege- und Bearbeiten-Dialog einer Lage laesst sich jetzt waehlen, ob sie
ueber den heutigen Weg (Anthropic) oder den EU-Weg (Bedrock Frankfurt + staan)
laeuft; Standard bleibt die Vorgabe der Organisation. Dazu ai_backend in den
Schemas und den Lagen-Endpunkten (Create, Update, Ausgabe), Leerstring setzt
bewusst auf Standard zurueck. In der Lagen-Kopfzeile zeigt ein Kennzeichen
'EU' an, dass die Verarbeitung europaeisch laeuft.

UI-Sync: bewusst NUR online. Der Lokal-Fork hat kein Bedrock-Backend, dort
waere das Feld funktionslos (wie X-Zugaenge und Studio-Gating).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 21:25:59 +00:00
claude-dev
b32c54b22c feat(eu-umbau): Faktencheck und Lagebild auf die EU-Suche umgestellt (Phase 3)
Im EU-Modus laufen jetzt auch Faktencheck und Lagebild komplett ueber Bedrock,
damit gibt es dort keine CLI-Aufrufe mehr. Der Faktenchecker bekommt vorab
eine gezielte staan-Stuetzsuche (eu_call_with_search: Haiku plant
Verifikations-Queries zu offenen Behauptungen, Treffer wandern als
Kontextblock in den Prompt und werden als Zweitquellen zitiert). Das Lagebild
arbeitet im EU-Modus rein auf dem Meldungsbestand, die EU-Recherche hat
unmittelbar davor gesammelt. Alle fuenf Aufrufstellen (Erst-/inkrementeller
Faktencheck, Gruppen-Verifikation, Erst-/inkrementelle Analyse) haben die
Weiche, der CLI-Modus bleibt unveraendert.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 21:08:34 +00:00
claude-dev
676741b1c4 fix(eu-umbau): SQLite-Parallelitaet der Doppelspur abgesichert
busy_timeout von 5s auf 30s (zwei gleichzeitig schreibende Lanes) und
'database is locked' im Orchestrator als transienter Fehler mit Retry
statt als permanenter Abbruch. Gefunden im Doppelspur-Paralleltest
(Lage-Summary-Update kollidierte mit der Schreiblast der zweiten Lane).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 20:39:41 +00:00
claude-dev
5fffca614a fix(eu-umbau): Bedrock-Standardprofil auf Opus 4.6, Profile per ENV uebersteuerbar
Das AWS-Konto darf die neuesten Modelle (Opus 4.7/5, Sonnet 5) auf Bedrock
noch nicht aufrufen (AccessDeniedException, separate Freischaltung noetig).
Die EU-Recherche laeuft deshalb auf Opus 4.6 (gleicher Listenpreis). Nach der
Freischaltung genuegt BEDROCK_PROFILE_STANDARD in der .env.

Ausserdem akzeptiert der staan-Client jetzt HTTP 201 (POST-Antwort der API).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 20:27:26 +00:00
claude-dev
a7f1aa29ab feat(eu-umbau): staan-Recherche-Schleife und Doppelspur (Phase 2)
Im EU-Modus laeuft die Recherche jetzt europaeisch: agents/eu_researcher.py
steuert eine Schleife aus Bedrock-Planung (Opus, EU-Profile) und staan-Suchen
(services/staan_client.py, Suche + Volltexte via full_content=markdown,
Pflicht-Domain-Ausschlussliste je Anfrage). Bildet die 4-Phasen-Tiefenrecherche
nach und liefert exakt das JSON der bisherigen CLI-WebSearch, Parsing und
Filter in researcher.search bleiben unveraendert. Anti-Halluzination: nur URLs
aus echten staan-Treffern werden akzeptiert; published_at nur wenn aus Inhalt
oder URL ableitbar (staan liefert keine Daten).

Doppelspur im Orchestrator: Lane-Schluessel ist jetzt (Organisation, Backend),
Aufloesung zentral in _resolve_ai_backend (Lage > Org-Setting > ENV). CLI- und
EU-Lauf derselben Organisation laufen gleichzeitig, gleiche Backends seriell.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 20:12:31 +00:00
claude-dev
e0edac2a18 docs: veralteten TaskMate-Changelog-Workflow aus CLAUDE.md entfernt
Die Changelog-Kategorien existieren in der aktuellen TaskMate-Instanz nicht
mehr (Wissensdatenbank enthaelt keine Changelog-Kategorien, letzter Eintrag
Mai 2026). Die Commit-und-Push-Pflicht steht weiterhin im Abschnitt Regeln.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 19:59:29 +00:00
claude-dev
fc33cccd44 feat(eu-umbau): Bedrock als zweiter KI-Modellweg (Phase 1)
Zweiter Modellweg ueber AWS Bedrock (EU-Inferenzprofile Frankfurt), umschaltbar
je Lage (incidents.ai_backend) > Organisation (org_setting ai_backend) > global
(ENV AI_BACKEND, Default cli). Neue Datei agents/bedrock_client.py (Converse
API, nur eu.-Profile, Token-zu-USD-Umrechnung ueber BEDROCK_PRICING, gleiche
Fehlerkategorien wie das CLI). Routing zentral in call_claude; Aufrufe mit
WebSearch/WebFetch laufen bis zur staan-Schleife (Phase 2) weiter uebers CLI.
Migration: Spalte incidents.ai_backend. requirements: boto3.
Hinweis Promote: boto3 muss im Live-venv installiert werden.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 19:48:52 +00:00
59cd97adac Release-Notes: Interne Verbesserungen 2026-07-26 04:18:41 +02:00
claude-dev
4c024cd470 docs: CLAUDE.md auf den echten Stand gebracht
Korrigiert: DB-Pfad (/home/claude-dev/osint-data, nicht /mnt/gitea),
Dienstname aegis-monitor.service, Ein-Prozess-Hinweis, Scheduler-Jobs
vollstaendig, Pipeline-Reihenfolge (Faktencheck VOR Lagebild),
Reiter-Ansicht statt gridstack, Tabellenliste vervollstaendigt
(keine feedback-Tabelle, dafuer refresh_pipeline_steps, incident_events,
fact_check_runs, billing_tariff, user_activity_days, system_status u.a.),
Mandantentrennungs-Aussage praezisiert, Staging-DB-Pfad + .env-Realitaet,
veralteter Workflow-Abschnitt ersetzt (Auto-Deploy laeuft laengst),
erledigte offene Punkte raus, stattdessen ehrliche Baustellen-Liste
Stand 26.07.2026, UI-Sync-Unterschiede in beide Richtungen aktualisiert.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-26 02:10:04 +00:00
444241c7d3 Release-Notes: Abrechnung, Budget-Warnung & Telegram-Verbesserungen 2026-07-26 01:31:17 +02:00
claude-dev
f8499c4e40 feat(abrechnung): Credits-Uebertrag in den Folgemonat entfernt
Produktentscheidung 07/2026: ungenutzte Credits verfallen zum
Periodenende, es gilt der harte Monatsdeckel wie verkauft. Der
Uebertrag (credits_rollover/credits_carried) fliegt komplett raus:
roll_credit_period setzt nur noch Verbrauch + Warnflag zurueck,
check_license rechnet verfuegbar = credits_total, die Migration legt
die beiden Spalten gar nicht erst an (Live hat sie nie bekommen, die
Promote-Warteschlange enthielt sie noch). ABRECHNUNG.md angepasst.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 21:45:15 +00:00
claude-dev
5450fd25ae feat(system): Telefonnummer in der Telegram-Status-Meldung
Ergaenzt phone im telegram_session-Status, damit das Portal die
Telegram-Zeile im Reiter Recherche-Zugaenge vollstaendig fuellen kann.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 19:15:56 +00:00
claude-dev
7dae63ebf9 feat(system): Telegram-Session-Status in system_status melden
Neue Key-Value-Tabelle system_status (idempotente Migration). Der Monitor
prueft die Telethon-Session beim Start und taeglich um 04:30 (eigener
Scheduler-Job) und schreibt ok/account/error unter dem Key
telegram_session. Das Verwaltungsportal zeigt den Eintrag im Reiter
Recherche-Zugaenge an, damit ein Session-Ausfall sichtbar wird statt
nur im Server-Log zu stehen. Fehler beim Pruefen stoeren den Betrieb
nie (try/except, eigene DB-Connection wie beim Health-Nachtjob).

Promote-Reihenfolge wie gehabt: Monitor VOR Verwaltung (Migration).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 19:04:46 +00:00
claude-dev
17b1886f25 fix(abrechnung): Warnschwelle 0 schaltet die Budget-Warnung aus
Bisher fiel eine 0 durch das or-80-Muster still auf die Voreinstellung
zurück, ein Abschalten der Warnung war unmöglich. Jetzt gilt, 0 = aus,
NULL = Voreinstellung 80, alles andere wie gehabt. Das Verwaltungsportal
bietet die 0 in seinen Formularen an.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 15:51:45 +00:00
claude-dev
d367c60b26 feat(statistik): Aktivitäts-Tage je Nutzer erfassen (MAU/DAU-Grundlage)
Neue Tabelle user_activity_days (user_id, day, tenant_id, ein Eintrag je
Nutzer und Kalendertag), angelegt per idempotenter Startup-Migration.
Geschrieben wird sie in get_current_user bei jeder authentifizierten
Nutzung, ein In-Memory-Tagesmerker begrenzt das auf einen INSERT OR
IGNORE je Nutzer und Tag, Fehler werden geschluckt und blockieren nie
eine Anfrage. Gelesen wird die Tabelle nur vom Verwaltungsportal für
die neue MAU/DAU-Statistik. Ein reines Login-Protokoll wäre zu grob,
weil das JWT 24 Stunden hält.

Getestet gegen eine DB-Kopie, Tabelle entsteht, je Nutzer und Tag
genau ein Eintrag trotz Mehrfachaufruf.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 15:01:00 +00:00
claude-dev
027244ada5 feat(abrechnung): pflegbare Preistabelle billing_tariff als Quelle der Sätze
Die Credits-Sätze je Aktion stehen jetzt in der geteilten Tabelle
billing_tariff statt nur in der Konfiguration. Die Migration legt die
Tabelle an und befüllt sie einmalig mit den wirksamen CREDIT_TARIFF-
Werten, danach liest _charge_credits() bei jeder Buchung die Tabelle,
fehlende Schlüssel oder eine fehlende Tabelle fallen auf die
Konfiguration zurück. Damit können Monitor und Verwaltungsportal
dieselben Sätze anzeigen und das Portal kann sie künftig pflegen,
eine Preisänderung braucht keinen Server-Eingriff mehr.

Getestet gegen eine Kopie der Staging-DB. Seed mit 7 Sätzen (45/40/
12/12/1/1/1), Buchung nach Tabelle, Tabellenänderung greift sofort,
Rückfall auf die Konfiguration ohne Tabelle.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 14:28:09 +00:00
claude-dev
ec3843bbe3 docs(ui-sync): Stand nach Abrechnungs-Port aktualisiert
Die Credits-Abrechnung ist jetzt auf beiden Seiten, offen aus dem Fork
bleiben die Takt-Features (5b0b578). Zeilenenden-Hinweis präzisiert,
src/static ist CRLF, die Python-Dateien dieses Repos sind LF.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 12:28:55 +00:00
claude-dev
1bbbd891ef feat(abrechnung): Monatskontingent in Credits mit festen Sätzen, Hard-Stop und Warnschwelle
Portierung aus dem Lokal-Fork (AegisSight-Monitor-Local, Commit d2b9168,
per Cherry-Pick übernommen und an den Server-Stand angepasst).

- Feste Sätze je Aktion (BILLING_MODE=flat) statt echter Kosten geteilt
  durch cost_per_credit. Sätze auf die am 23.07.2026 beschlossenen
  Verkaufswerte gesetzt. Live-Lauf 45, Recherche je Durchlauf 40,
  Studio-Bausteine 12, Chat/Beschreibung/Globe 1. Per ENV überschreibbar,
  der alte Modus bleibt als BILLING_MODE=actual erhalten.
- Abrechnungsperiode. licenses.credits_period trennt monthly von total,
  träger Monatsreset bei der nächsten Lizenzprüfung, optionaler Übertrag
  (credits_rollover, gedeckelt auf ein Monatskontingent). Bestandslizenzen
  ohne Periodenmarke behalten ihren Verbrauch.
- Hard-Stop gegen das verfügbare Monatskontingent (Kontingent plus
  Übertrag) statt gegen das Lebenszeit-Total.
- Warnschwelle budget_warning_percent (Default 80 Prozent) wird erstmals
  ausgewertet, einmalige Meldung an alle aktiven Nutzer der Organisation.
- DB-Migration additiv und idempotent (credits_period, credits_period_start,
  credits_rollover, credits_carried, budget_warning_sent, unlimited_budget).
- /api/auth/me liefert credits_available als Bezugsgröße plus
  credits_period, das Credits-Widget zeigt "Credits diesen Monat".
- Wortlaut überall Credits (nicht Guthaben/Einheiten), docs/ABRECHNUNG.md
  auf den Online-Stand gebracht.

Abweichungen zur Fork-Vorlage. Die Takt-Änderungen (Untergrenze 30 Min,
Kostenvorschau im Anlege-Dialog, Fork-Commit 5b0b578) sind bewusst NICHT
enthalten, die Sätze stehen auf 45/40 statt der Fork-Defaults 24/33.

Getestet gegen eine Kopie der Staging-DB, 20 Prüfungen bestanden.
Migration, Flat-Buchung adhoc/research/chat, Warnschwelle einmalig,
Hard-Stop, Monatsreset, Übertrag gedeckelt, Bestandslizenz ohne Marke.
Die vier Live-Lizenzen stehen auf unlimited_budget und sind unbeeinflusst.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 12:26:54 +00:00
claude-dev
ecfc208f22 docs(ui-sync): verbindliche UI-Sync-Regel mit dem Lokal-Fork
Neuer CLAUDE.md-Abschnitt legt fest, dass jede Änderung unter src/static
noch in derselben Sitzung ins jeweils andere Repo portiert wird.
Dokumentiert die gewollten Unterschiede, den einheitlichen
Credits-Wortlaut, den Cherry-Pick-Weg über Cross-Remotes und die
CRLF-Stolperfalle. Der Drift-Check liegt im Lokal-Fork unter
scripts/ui-drift-check.sh.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 11:57:17 +00:00
claude-dev
421c7c6cd3 fix(studio): "Klassische Ansicht" nach rechts neben "Abmelden" verschoben
Der Knopf für den Ansichtswechsel steht jetzt links neben "Abmelden" am
Ende der Kopfzeile statt an erster Stelle. Reihenfolge oben rechts damit
Barrierefreiheit, Theme, Konto, Klassische Ansicht, Abmelden.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 11:43:53 +00:00
claude-dev
26b2c08138 fix(studio): Kopfzeile und Fall-Auswahl an die klassische Ansicht angeglichen
Portierung aus dem Lokal-Fork (AegisSight-Monitor-Local, Commit 9613610).
Vier Angleichungen an das klassische Dashboard.

1. "Klassische Ansicht" ist jetzt derselbe Knopf wie "Studio-Ansicht" im
   Dashboard, mit Symbol, an erster Stelle im rechten Kopfzeilen-Block.
2. Oben rechts fehlten Barrierefreiheit, Konto-Menü und Abmelden. Der
   A11yManager liegt jetzt in js/a11y.js und wird von beiden Oberflächen
   eingebunden, denn das Studio lädt app.js nicht. Konto-Menü (Organisation,
   Lizenz, Credits, Über KI-Inhalte) und Abmelden nachgezogen, der
   Theme-Schalter ist derselbe Schiebeschalter wie im Dashboard.
3. Die Fall-Liste hat jetzt die Umschaltung "Alle" / "Eigene" in der
   Knopf-Optik der klassischen Seitenleiste, der Reiter-Zähler zieht mit.
4. Der Hinweis "Wähle links einen Fall aus" endet vor der Bausteine-Spalte
   statt am Fensterrand, im gestapelten Layout nimmt er die volle Breite.

Das info@-Gating des Studios bleibt unverändert bestehen.
Versionsmarker der angefassten Dateien auf 20260725a angehoben.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 11:39:25 +00:00
claude-dev
ee31702015 feat(studio): Phase 3 - Fall-Chat (RAG) mit Guardrails, Timeline, Recherche-Angebot
Fall-Chat und Ereignis-Timeline, alles ueber Claude, strikt fallorientiert.

incidents.py:
- GET /{id}/events: Aktivitaets-Timeline (article_ingest/refresh/analysis/chat_qa/source_change)
- POST /{id}/ask: Fall-Chat/RAG mit Guardrails:
  * tools=None (kein Netz/kein Werkzeug) = zentrale Anti-Exfil-Abwehr (GitLost)
  * nur Materialien DIESES Falls (scope=alle entfaellt), [n]-Zitate, strikt aus Materialien
  * Claude-Vorauswahl der relevanten Artikel statt lokalem Embedding (kein lokales Modell)
  * _escape_prompt_content + Ausgabe-Leak-Filter + EchoLeak-Haertung (externe Bilder/Links/URLs raus)
  * Verbotsliste: kein Backend/App/Modell/Anbieter, kein Fremd-Fall
  * chat_qa in incident_events protokolliert
- Recherche-Angebot: liefert die Materialien die Frage nicht, haengt der Analyst einen
  needs_research-Block an (focus + description_addition, NUR aus der Frage abgeleitet).
- POST /{id}/clarify (nur auf Nutzer-Bestaetigung): Beschreibung ergaenzen + fokussierte
  Folge-Recherche AUSSCHLIESSLICH zur Frage (Researcher title=focus/description=frage),
  url-dedupliziert in den Fall. Laeuft als Hintergrund-Job (stage_runners.start_job).

stage_runners.py: generischer start_job() fuer Hintergrund-Jobs (run-status-sichtbar).
api.js: clarify(). studio.js + studio.css: Angebot rendern, bestaetigen, run-status pollen.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-24 23:34:52 +02:00
claude-dev
b686685f43 feat(studio): Phase 2 - Studio-Bausteine, Backend-Kern (Sammeln/Analyse/Faktencheck)
Backend fuer die modularen Studio-Pipeline-Bausteine, alles ueber Claude.

DB (additiv, idempotent):
- Tabellen incident_events + fact_check_runs (+ Indizes)
- Funktion log_incident_event()
- Spalten incidents.summary_at, incidents.executive_summary, articles.geoparsed_at

agents/stage_runners.py (neu): isolierte Bausteine analyze + factcheck auf dem
vorhandenen Bestand, komplett neu, Historie bleibt (Snapshot/fact_check_runs).

orchestrator.py: collect_only in die Lane-Multi-Tenant-Queue eingebaut (enqueue_refresh
4-Tupel, _worker-Entpacken, Multi-Pass-Gate, _run_refresh-Signatur + Analyse/FC-Skip).
Zusaetzlich summary_at beim Schreiben des Lagebilds gestempelt (Studio-Freshness).

incidents.py: Endpunkte POST /{id}/run/{stage} (collect|analyze|factcheck),
GET /{id}/run-status, GET /{id}/freshness, GET /{id}/factcheck-runs[/{run_id}].
Busy-Check auf Online-Orchestrator (_current_tasks), Tenant-Zugriffspruefung.

Kein lokaler LLM-Unterbau, kein lokales Modell. /ask + /events folgen in Phase 3.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-24 23:18:15 +02:00
claude-dev
4bc842ca1c feat(studio): Phase 1 - Studio-Ansicht online erreichbar + info@-Gating
Portiert das experimentelle Studio-Frontend aus der lokalen Variante in den
Online-Monitor, parallel zur klassischen Ansicht. Nur Geruest + Toggle:

- static/studio.html, css/studio.css, js/studio.js kopiert (Claude-basiert,
  ohne lokalen LLM-Unterbau)
- main.py: Route GET /studio liefert studio.html aus
- api.js: fehlende Studio-Methoden ergaenzt (events, ask, uploads, run/stage,
  run-status, freshness, search-status, factcheck-runs, x-accounts); Online-
  exportReport-Signatur unangetastet
- dashboard.html + app.js: Header-Button "Studio" nur fuer info@aegis-sight.de
  sichtbar
- studio.js: init() leitet fremde Logins auf /dashboard um (View-Gating)

Studio-spezifische Backend-Endpunkte folgen in Phase 2/3; fehlende liefern
vorerst 404, studio.js faengt das ab. Read-only Teile (Faelle, Artikel,
Faktenchecks, Karte, Snapshots) laufen ueber vorhandene Online-Endpunkte.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-24 22:43:17 +02:00