Promote develop → main (2026-07-25 13:03 UTC) #52

Zusammengeführt
IntelSight_Admin hat 8 Commits von develop nach main 2026-07-25 15:03:06 +02:00 zusammengeführt
Mitwirkender

Automatischer Promote-Trigger via AegisSight Promote-UI. Commits: 8

Automatischer Promote-Trigger via AegisSight Promote-UI. Commits: 8
IntelSight_Admin hat 8 Commits 2026-07-25 15:03:05 +02:00 hinzugefügt
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>
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>
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>
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>
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>
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>
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>
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>
IntelSight_Admin hat Commit cf567623e5 in main 2026-07-25 15:03:06 +02:00 gemerged
Anmelden, um an der Diskussion teilzunehmen.
Keine Reviewer
Kein Label
1 Beteiligte
Nachrichten
Fällig am
Kein Fälligkeitsdatum gesetzt.
Abhängigkeiten

Keine Abhängigkeiten gesetzt.

Referenz: AegisSight/AegisSight-Monitor#52