- {tenant.companyName} - Procurement Alerts -
+{tenant.companyName} - Procurement Alerts
diff --git a/studio-v2/app/alerts-b2b/_components/DecisionTraceModal.tsx b/studio-v2/app/alerts-b2b/_components/DecisionTraceModal.tsx new file mode 100644 index 0000000..8fa232e --- /dev/null +++ b/studio-v2/app/alerts-b2b/_components/DecisionTraceModal.tsx @@ -0,0 +1,120 @@ +'use client' + +import { useTheme } from '@/lib/ThemeContext' +import type { B2BHit } from '@/lib/AlertsB2BContext' + +export function DecisionTraceModal({ + hit, + onClose +}: { + hit: B2BHit + onClose: () => void +}) { + const { isDark } = useTheme() + const trace = hit.decisionTrace + + return ( +
+ {trace.signals.procurementSignalsFound.join(', ')} +
++ {trace.signals.publicBuyerSignalsFound.join(', ')} +
++ {trace.signals.productSignalsFound.join(', ')} +
++ {trace.signals.negativesFound.join(', ')} +
++ Kein Decision Trace verfuegbar. +
+ )} +Keine relevanten Hits heute
++ Fuegen Sie den Inhalt einer Google Alert E-Mail ein +
++ KI-Verarbeitung +
++ Die KI analysiert den Inhalt, erkennt Beschaffungs-Signale, identifiziert + potenzielle Auftraggeber und bewertet die Relevanz fuer Ihr Unternehmen. +
++ {hit.snippet} +
+- {trace.signals.procurementSignalsFound.join(', ')} -
-- {trace.signals.publicBuyerSignalsFound.join(', ')} -
-- {trace.signals.productSignalsFound.join(', ')} -
-- {trace.signals.negativesFound.join(', ')} -
-- Kein Decision Trace verfuegbar. -
- )} -- Fuegen Sie den Inhalt einer Google Alert E-Mail ein -
-- KI-Verarbeitung -
-- Die KI analysiert den Inhalt, erkennt Beschaffungs-Signale, identifiziert - potenzielle Auftraggeber und bewertet die Relevanz fuer Ihr Unternehmen. -
-- {hit.snippet} -
-Keine relevanten Hits heute
-- {tenant.companyName} - Procurement Alerts -
+{tenant.companyName} - Procurement Alerts
Keine Hits gefunden
+ 📭Keine Hits gefunden
- Keine Topics konfiguriert. -
+Keine Topics konfiguriert.
) : (- {topic.name} -
-- {getPackageLabel(topic.package)} -
+{topic.name}
+{getPackageLabel(topic.package)}
- Im STRICT-Modus werden nur ~10% der Hits als relevant markiert. - Der Rest wird automatisch gefiltert. -
+Im STRICT-Modus werden nur ~10% der Hits als relevant markiert. Der Rest wird automatisch gefiltert.
- E-Mail erfolgreich importiert! -
-- {importSuccess.title.slice(0, 60)}... -
+E-Mail erfolgreich importiert!
+{importSuccess.title.slice(0, 60)}...
+ Basierend auf: {template.thema || template.dateiname} +
+ + {error && ( +{error}
++ {dokument.thema || dokument.aufgabentyp || dokument.dateiname} +
+Vorschau nicht verfuegbar
+ + PDF herunterladen + +{value}
+{dokument.thema}
+- {dokument.thema || dokument.aufgabentyp || dokument.dateiname} -
-Vorschau nicht verfuegbar
- - PDF herunterladen - -{dokument.fach}
-{dokument.jahr}
-{dokument.bundesland}
-{dokument.niveau}
-{dokument.thema}
-- Basierend auf: {template.thema || template.dateiname} -
- - {error && ( -{error}
-- Zentralabitur-Materialien 2021-2025 durchsuchen -
-Zentralabitur-Materialien 2021-2025 durchsuchen
Keine Dokumente gefunden
Versuchen Sie andere Filtereinstellungen
{step.desc}
+{stat.label}
+{stat.value}
+Keine geplanten Meetings
++ {recordings.length} Aufzeichnungen +
++ Starten Sie eine Aufzeichnung in einem Meeting, um sie hier zu sehen. +
++ Die Transkription wurde noch nicht gestartet oder ist in Bearbeitung. +
+{stat.label}
-{stat.value}
-Keine geplanten Meetings
-{step.desc}
-- Starten Sie eine Aufzeichnung in einem Meeting, um sie hier zu sehen. -
-- {recordings.length} Aufzeichnungen -
-- Die Transkription wurde noch nicht gestartet oder ist in Bearbeitung. -
-Noch keine Nachrichten
+Starten Sie die Konversation!
+{msg.content}
+ {msg.reactions && msg.reactions.length > 0 && ( ++ Kommunizieren Sie sicher mit Eltern und Kollegen. + Waehlen Sie eine Konversation aus der Liste oder starten Sie eine neue Unterhaltung. +
+Keine Konversationen
+Starten Sie eine neue Unterhaltung!
+0 + ? isDark ? 'text-white font-medium' : 'text-slate-900 font-medium' + : isDark ? 'text-white/60' : 'text-slate-500' + }`}> + {conv.last_message} +
+ )} +Keine Kontakte vorhanden
++ {contact.student_name} ({contact.class_name}) +
+ )} + {contact.email && ( ++ {contact.email} +
+ )} +Keine Konversationen
-Starten Sie eine neue Unterhaltung!
-0 - ? isDark ? 'text-white font-medium' : 'text-slate-900 font-medium' - : isDark ? 'text-white/60' : 'text-slate-500' - }`}> - {conv.last_message} -
- )} -Noch keine Nachrichten
-Starten Sie die Konversation!
-{msg.content}
- - {/* Reactions */} - {msg.reactions && msg.reactions.length > 0 && ( -- Kommunizieren Sie sicher mit Eltern und Kollegen. - Waehlen Sie eine Konversation aus der Liste oder starten Sie eine neue Unterhaltung. -
-Keine Kontakte vorhanden
-- {contact.student_name} ({contact.class_name}) -
- )} - {contact.email && ( -- {contact.email} -
- )} -+ Hinweis: API nicht erreichbar. Demo-Daten werden angezeigt. +
+Version: 1.0.0 | Stand: Januar 2026 | Autor: BreakPilot Development Team
++ Dieses Dokument dient als technische Dokumentation fuer das Alert-Monitoring-System der BreakPilot Plattform. + Es ist fuer Audits durch Bildungstraeger und Datenschutzbeauftragte konzipiert. +
+Das System ermoeglicht automatisierte Ueberwachung von Bildungsthemen mit:
+{ARCHITECTURE_DIAGRAM}
+
+ {/* Datenfluss */}
+ {DATAFLOW_DIAGRAM}
+
+ {/* Feed Ingestion */}
+ Die Deduplizierung verhindert doppelte Alerts durch:
+| Entscheidung | +Score-Bereich | +Bedeutung | +
|---|---|---|
| KEEP | 0.7 - 1.0 | Klar relevant, in Inbox anzeigen |
| REVIEW | 0.4 - 0.7 | Unsicher, Nutzer entscheidet |
| DROP | 0.0 - 0.4 | Irrelevant, automatisch archivieren |
Das Profil verbessert sich durch Nutzerfeedback:
+Dokumentation erstellt: Januar 2026 | Version: 1.0.0
+| {h} | + ))} +
|---|
| + {cell} + | + ))} +
| Alert | +Topic | +Score | +Decision | +Zeit | +
|---|---|---|---|---|
|
+
+ {alert.title}
+
+ {alert.snippet} + |
+ {alert.topic_name} | +{getScoreBadge(alert.relevance_score)} | +{getDecisionBadge(alert.relevance_decision)} | +{formatTimeAgo(alert.fetched_at)} | +
Alerts zu diesen Themen werden hoeher bewertet.
+Alerts zu diesen Themen werden niedriger bewertet.
+{topic.feed_url}
+GET /api/alerts/inbox - Alerts auflistenPOST /api/alerts/ingest - Alert hinzufuegenGET /api/alerts/topics - Topics auflistenPOST /api/alerts/topics - Topic erstellenGET /api/alerts/rules - Regeln auflistenPOST /api/alerts/rules - Regel erstellenGET /api/alerts/profile - Profil abrufenPUT /api/alerts/profile - Profil aktualisierenDer Alerts Agent verwendet ein Pipeline-basiertes Design:
+GET /api/alerts/inbox - Alerts auflistenPOST /api/alerts/ingest - Alert hinzufuegenGET /api/alerts/topics - Topics auflistenPOST /api/alerts/topics - Topic erstellenGET /api/alerts/rules - Regeln auflistenPOST /api/alerts/rules - Regel erstellenGET /api/alerts/profile - Profil abrufenPUT /api/alerts/profile - Profil aktualisierenDer Alerts Agent verwendet ein Pipeline-basiertes Design:
-- Hinweis: API nicht erreichbar. Demo-Daten werden angezeigt. -
-| Alert | -Topic | -Score | -Decision | -Zeit | -
|---|---|---|---|---|
|
-
- {alert.title}
-
- {alert.snippet} - |
- {alert.topic_name} | -{getScoreBadge(alert.relevance_score)} | -{getDecisionBadge(alert.relevance_decision)} | -{formatTimeAgo(alert.fetched_at)} | -
{topic.feed_url}
-Alerts zu diesen Themen werden hoeher bewertet.
-Alerts zu diesen Themen werden niedriger bewertet.
-Version: 1.0.0 | Stand: Januar 2026 | Autor: BreakPilot Development Team
-- Dieses Dokument dient als technische Dokumentation fuer das Alert-Monitoring-System der BreakPilot Plattform. - Es ist fuer Audits durch Bildungstraeger und Datenschutzbeauftragte konzipiert. -
-Das System ermoeglicht automatisierte Ueberwachung von Bildungsthemen mit:
-| Massnahme | -Umsetzung | -Wirkung | -
|---|---|---|
| 100% Self-Hosted | Alle Dienste auf eigenen Servern | Keine Cloud-Abhaengigkeit |
| Lokale KI | Ollama/vLLM on-premise | Keine Daten an OpenAI etc. |
| URL-Deduplizierung | SHA256-Hash, Tracking entfernt | Minimale Datenspeicherung |
| Soft-Delete | Archivierung statt Loeschung | Audit-Trail erhalten |
| RBAC | Rollenbasierte Zugriffskontrolle | Nur autorisierter Zugriff |
{`┌─────────────────────────────────────────────────────────────────────────────┐
-│ BreakPilot Alerts Frontend │
-│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
-│ │ Dashboard │ │ Inbox │ │ Topics │ │ Profile │ │
-│ │ (Stats) │ │ (Review) │ │ (Feeds) │ │ (Learning) │ │
-│ └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘ │
-└─────────────────────────────────┬───────────────────────────────────────────┘
- │
- v
-┌─────────────────────────────────────────────────────────────────────────────┐
-│ Ingestion Layer │
-│ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐ │
-│ │ RSS Fetcher │ │ Email Parser │ │ APScheduler │ │
-│ │ (feedparser) │ │ (geplant) │ │ (AsyncIO) │ │
-│ └───────┬────────┘ └───────┬────────┘ └───────┬────────┘ │
-│ └───────────────────┼───────────────────┘ │
-│ │ │
-│ ┌──────────────────────────────────────────────────────────────┐ │
-│ │ Deduplication (URL-Hash + SimHash) │ │
-│ └──────────────────────────────────────────────────────────────┘ │
-└─────────────────────────────────────────────────────────────────────────────┘
- │
- v
-┌─────────────────────────────────────────────────────────────────────────────┐
-│ Processing Layer │
-│ ┌────────────────────────────────────────────────────────────┐ │
-│ │ Rule Engine │ │
-│ │ Operatoren: contains, regex, gt/lt, in, starts_with │ │
-│ └────────────────────────────────────────────────────────────┘ │
-│ │ │
-│ ┌────────────────────────────────────────────────────────────┐ │
-│ │ LLM Relevance Scorer │ │
-│ │ Output: { score, decision: KEEP/DROP/REVIEW, summary } │ │
-│ └────────────────────────────────────────────────────────────┘ │
-└─────────────────────────────────────────────────────────────────────────────┘
- │
- v
-┌─────────────────────────────────────────────────────────────────────────────┐
-│ Action Layer │
-│ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐ │
-│ │ Email Action │ │ Webhook Action │ │ Slack Action │ │
-│ └────────────────┘ └────────────────┘ └────────────────┘ │
-└─────────────────────────────────────────────────────────────────────────────┘
- │
- v
-┌─────────────────────────────────────────────────────────────────────────────┐
-│ Storage Layer │
-│ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐ │
-│ │ PostgreSQL │ │ Valkey │ │ LLM Gateway │ │
-│ └────────────────┘ └────────────────┘ └────────────────┘ │
-└─────────────────────────────────────────────────────────────────────────────┘`}
-
- {/* Datenfluss */}
- {`1. APScheduler triggert Fetch (alle 60 Min. default)
- │
- v
-2. RSS Fetcher holt Feed von Google Alerts
- │
- v
-3. Deduplizierung prueft URL-Hash
- │
- ├── URL bekannt ──> Uebersprungen
- └── URL neu ──> Weiter
- │
- v
-4. Alert in Datenbank gespeichert (Status: NEW)
- │
- v
-5. Rule Engine evaluiert aktive Regeln
- │
- ├── Regel matcht ──> Aktion ausfuehren
- └── Keine Regel ──> LLM Scoring
- │
- v
-6. LLM Relevance Scorer
- │
- ├── KEEP (>= 0.7) ──> Inbox
- ├── REVIEW (0.4-0.7) ──> Inbox (Pruefung)
- └── DROP (< 0.4) ──> Archiviert
- │
- v
-7. Nutzer-Feedback ──> Profile aktualisieren`}
-
- {/* Feed Ingestion */}
- | Eigenschaft | -Wert | -Beschreibung | -
|---|---|---|
| Parser | feedparser 6.x | Standard RSS/Atom Parser |
| HTTP Client | httpx (async) | Non-blocking Fetches |
| Timeout | 30 Sekunden | Konfigurierbar |
| Parallelitaet | Ja (asyncio.gather) | Mehrere Feeds gleichzeitig |
Die Deduplizierung verhindert doppelte Alerts durch:
-| Operator | -Beschreibung | -Beispiel | -
|---|---|---|
| contains | Text enthaelt | title contains "Inklusion" |
| not_contains | Text enthaelt nicht | title not_contains "Werbung" |
| equals | Exakte Uebereinstimmung | status equals "new" |
| regex | Regulaerer Ausdruck | title regex "\\d{4}" |
| gt / lt | Groesser/Kleiner | relevance_score gt 0.8 |
| in | In Liste enthalten | title in ["KI", "AI"] |
| Feld | -Typ | -Beschreibung | -
|---|---|---|
| title | String | Alert-Titel |
| snippet | String | Textausschnitt |
| url | String | Artikel-URL |
| source | Enum | google_alerts_rss, rss_feed, manual |
| relevance_score | Float | 0.0 - 1.0 |
| relevance_decision | Enum | KEEP, DROP, REVIEW |
| Aktion | -Beschreibung | -Konfiguration | -
|---|---|---|
| keep | Als relevant markieren | - |
| drop | Archivieren | - |
| tag | Tags hinzufuegen | {"tags": ["wichtig"]} |
| E-Mail senden | {"to": "x@y.de"} | |
| webhook | HTTP POST | {"url": "https://..."} |
| slack | Slack-Nachricht | {"webhook_url": "..."} |
| Eigenschaft | -Wert | -Beschreibung | -
|---|---|---|
| Gateway URL | http://localhost:8000/llm | LLM Gateway Endpoint |
| Modell | breakpilot-teacher-8b | Fein-getuntes Llama 3.1 |
| Temperatur | 0.3 | Niedrig fuer Konsistenz |
| Max Tokens | 500 | Response-Limit |
| Entscheidung | -Score-Bereich | -Bedeutung | -
|---|---|---|
| KEEP | 0.7 - 1.0 | Klar relevant, in Inbox anzeigen |
| REVIEW | 0.4 - 0.7 | Unsicher, Nutzer entscheidet |
| DROP | 0.0 - 0.4 | Irrelevant, automatisch archivieren |
Das Profil verbessert sich durch Nutzerfeedback:
-| Prioritaet | -Gewicht | -Keywords | -
|---|---|---|
| Inklusion | 0.9 | inklusiv, Foerderbedarf, Behinderung |
| Datenschutz Schule | 0.85 | DSGVO, Schuelerfotos, Einwilligung |
| Schulrecht Bayern | 0.8 | BayEUG, Schulordnung, KM |
| Digitalisierung Schule | 0.7 | DigitalPakt, Tablet-Klasse |
| Endpoint | -Methode | -Beschreibung | -
|---|---|---|
| /api/alerts/inbox | GET | Inbox Items abrufen |
| /api/alerts/ingest | POST | Manuell Alert importieren |
| /api/alerts/run | POST | Scoring-Pipeline starten |
| /api/alerts/feedback | POST | Relevanz-Feedback geben |
| /api/alerts/stats | GET | Statistiken abrufen |
| Endpoint | -Methode | -Beschreibung | -
|---|---|---|
| /api/alerts/topics | GET | Topics auflisten |
| /api/alerts/topics | POST | Neues Topic erstellen |
| /api/alerts/topics/{id} | PUT | Topic aktualisieren |
| /api/alerts/topics/{id} | DELETE | Topic loeschen (CASCADE) |
| /api/alerts/topics/{id}/fetch | POST | Manueller Feed-Abruf |
| Endpoint | -Methode | -Beschreibung | -
|---|---|---|
| /api/alerts/rules | GET/POST | Regeln verwalten |
| /api/alerts/rules/{id} | PUT/DELETE | Regel bearbeiten/loeschen |
| /api/alerts/profile | GET | Profil abrufen |
| /api/alerts/profile | PUT | Profil aktualisieren |
| /api/alerts/scheduler/status | GET | Scheduler-Status |
| Tabelle | -Beschreibung | -Wichtige Felder | -
|---|---|---|
| alert_topics | Feed-Quellen | name, feed_url, feed_type, is_active, fetch_interval |
| alert_items | Einzelne Alerts | title, url, url_hash, relevance_score, relevance_decision |
| alert_rules | Filterregeln | name, conditions (JSON), action_type, priority |
| alert_profiles | Nutzer-Profile | priorities, exclusions, positive/negative_examples |
| Verarbeitung | -Rechtsgrundlage | -Umsetzung | -
|---|---|---|
| Feed-Abruf | Art. 6(1)(f) - Berechtigtes Interesse | Informationsbeschaffung |
| Alert-Speicherung | Art. 6(1)(f) - Berechtigtes Interesse | Nur oeffentliche Informationen |
| LLM-Scoring | Art. 6(1)(f) - Berechtigtes Interesse | On-Premise, keine PII |
| Profil-Learning | Art. 6(1)(a) - Einwilligung | Opt-in durch Nutzung |
| Komponente | -Lizenz | -Kommerziell | -
|---|---|---|
| FastAPI | MIT | Ja |
| SQLAlchemy | MIT | Ja |
| httpx | BSD-3-Clause | Ja |
| feedparser | BSD-2-Clause | Ja |
| APScheduler | MIT | Ja |
| Komponente | -Lizenz | -Kommerziell | -
|---|---|---|
| Ollama | MIT | Ja |
| Llama 3.1 | Meta Llama 3 | Ja* |
| vLLM | Apache-2.0 | Ja |
| Kontakt | -Adresse | -
|---|---|
| Technischer Support | support@breakpilot.de |
| Datenschutzbeauftragter | dsb@breakpilot.de |
| Dokumentation | docs.breakpilot.de |
| GitHub | github.com/breakpilot |
Dokumentation erstellt: Januar 2026 | Version: 1.0.0
-{item.description}
+{item.description}
-+ Das Compliance & Audit Framework ist modular aufgebaut und integriert sich nahtlos in die bestehende Breakpilot-Infrastruktur. +
+ + {/* Architecture Diagram */} +{`
+┌─────────────────────────────────────────────────────────────────────────┐
+│ COMPLIANCE FRAMEWORK │
+├─────────────────────────────────────────────────────────────────────────┤
+│ │
+│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
+│ │ Next.js │ │ FastAPI │ │ PostgreSQL │ │
+│ │ Frontend │───▶│ Backend │───▶│ Database │ │
+│ │ (Port 3000)│ │ (Port 8000)│ │ (Port 5432)│ │
+│ └─────────────┘ └─────────────┘ └─────────────┘ │
+│ │ │ │ │
+│ │ │ │ │
+│ ┌─────▼─────┐ ┌─────▼─────┐ ┌─────▼─────┐ │
+│ │ Admin UI │ │ Compliance │ │ 7 Tables │ │
+│ │ /admin/ │ │ Module │ │ compliance_│ │
+│ │compliance/│ │ /backend/ │ │ regulations│ │
+│ └───────────┘ │compliance/ │ │ _controls │ │
+│ └───────────┘ │ _evidence │ │
+│ │ _risks │ │
+│ │ ... │ │
+│ └───────────┘ │
+└─────────────────────────────────────────────────────────────────────────┘
+ `}
+ {step.title}
+{step.desc}
++ Erstellen Sie ZIP-Pakete mit allen relevanten Compliance-Daten fuer externe Pruefer. +
+ +Alle Daten inkl. Regulations, Controls, Evidence, Risks
+Control Catalogue mit Mappings
+Evidence-Dateien und Metadaten
+{`
+audit_export_2026-01-16/
+├── index.html # Navigations-Uebersicht
+├── summary.json # Maschinenlesbare Zusammenfassung
+├── regulations/
+│ ├── gdpr.json
+│ ├── aiact.json
+│ └── ...
+├── controls/
+│ ├── control_catalogue.json
+│ └── control_catalogue.xlsx
+├── evidence/
+│ ├── scan_reports/
+│ ├── policies/
+│ └── configs/
+├── risks/
+│ └── risk_register.json
+└── README.md # Erklaerung fuer Pruefer
+ `}
+ Controls ueberpruefen und Status aktualisieren
+ + +Nachweise hochladen und verwalten
+ +{step.title}
+{step.desc}
+{label}
+{error || 'Keine Daten verfuegbar'}
+{tlConfig.label}
+Erfuellungsgrad
+ {score_change !== null && ( += 0 ? 'text-green-600' : 'text-red-600'}`}> + {score_change >= 0 ? '\u2191' : '\u2193'} {Math.abs(score_change).toFixed(1)}% zum Vormonat +
+ )} +{label}
+ + + +{value}
+{detail}
+Keine offenen Risiken
+ ) : ( +{risk.title}
+{risk.owner || 'Kein Owner'}
+Keine anstehenden Fristen
+ ) : ( +{deadline.title}
+{new Date(deadline.deadline).toLocaleDateString('de-DE')}
+Keine Daten verfuegbar
+ ) : ( +Abgeschlossen
+{completedCount}
+In Bearbeitung
+{inProgressCount}
+Geplant
+{plannedCount}
+| Titel | +Kategorie | +Prioritaet | +Status | +
|---|---|---|---|
| + {item.title} + | ++ {item.category} + | ++ + {item.priority} + + | ++ + {item.status === 'completed' ? 'Fertig' : + item.status === 'in_progress' ? 'In Arbeit' : 'Geplant'} + + | +
{t.fields}
++ {dashboard?.controls_by_status?.pass || 0} von {dashboard?.total_controls || 0} Controls bestanden +
+{label}
+{value}
+{detail}
+{action.label}
+ + ))} +| Code | +Name | +Typ | +Anforderungen | +
|---|---|---|---|
| + {reg.code} + | +
+ {reg.name} + |
+ + + {reg.regulation_type === 'eu_regulation' ? 'EU-VO' : + reg.regulation_type === 'eu_directive' ? 'EU-RL' : + reg.regulation_type === 'bsi_standard' ? 'BSI' : + reg.regulation_type === 'de_law' ? 'DE' : reg.regulation_type} + + | ++ {reg.requirement_count} + | +
Keine Compliance-Daten vorhanden
-Initialisieren Sie die Datenbank mit den Seed-Daten.
-- {dashboard?.controls_by_status?.pass || 0} von {dashboard?.total_controls || 0} Controls bestanden -
-Verordnungen
-{dashboard?.total_regulations || 0}
-{dashboard?.total_requirements || 0} Anforderungen
-Controls
-{dashboard?.total_controls || 0}
-{dashboard?.controls_by_status?.pass || 0} bestanden
-Nachweise
-{dashboard?.total_evidence || 0}
-{dashboard?.evidence_by_status?.valid || 0} aktiv
-Risiken
-{dashboard?.total_risks || 0}
-- {(dashboard?.risks_by_level?.high || 0) + (dashboard?.risks_by_level?.critical || 0)} kritisch -
-Controls
- - - -Evidence
- - - -Risiken
- - - -Scraper
- - - -Export
- - - -Audit Workspace
- - - -Service Module Registry
- -| Code | -Name | -Typ | -Anforderungen | -
|---|---|---|---|
| - {reg.code} - | -
- {reg.name} - |
- - - {reg.regulation_type === 'eu_regulation' ? 'EU-VO' : - reg.regulation_type === 'eu_directive' ? 'EU-RL' : - reg.regulation_type === 'bsi_standard' ? 'BSI' : - reg.regulation_type === 'de_law' ? 'DE' : reg.regulation_type} - - | -- {reg.requirement_count} - | -
{error || 'Keine Daten verfuegbar'}
-{tlConfig.label}
-Erfuellungsgrad
- {score_change !== null && ( -= 0 ? 'text-green-600' : 'text-red-600'}`}> - {score_change >= 0 ? '↑' : '↓'} {Math.abs(score_change).toFixed(1)}% zum Vormonat -
- )} -Verordnungen
- - - -{executiveData.total_regulations}
-{executiveData.total_requirements} Anforderungen
-Massnahmen
- - - -{executiveData.total_controls}
-Technische Controls
-Offene Risiken
- - - -{executiveData.open_risks}
-Unmitigiert
-Keine offenen Risiken
- ) : ( -{risk.title}
-{risk.owner || 'Kein Owner'}
-Keine anstehenden Fristen
- ) : ( -{deadline.title}
-{new Date(deadline.deadline).toLocaleDateString('de-DE')}
-Keine Daten verfuegbar
- ) : ( -- Das Compliance & Audit Framework ist modular aufgebaut und integriert sich nahtlos in die bestehende Breakpilot-Infrastruktur. -
- - {/* Architecture Diagram */} -{`
-┌─────────────────────────────────────────────────────────────────────────┐
-│ COMPLIANCE FRAMEWORK │
-├─────────────────────────────────────────────────────────────────────────┤
-│ │
-│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
-│ │ Next.js │ │ FastAPI │ │ PostgreSQL │ │
-│ │ Frontend │───▶│ Backend │───▶│ Database │ │
-│ │ (Port 3000)│ │ (Port 8000)│ │ (Port 5432)│ │
-│ └─────────────┘ └─────────────┘ └─────────────┘ │
-│ │ │ │ │
-│ │ │ │ │
-│ ┌─────▼─────┐ ┌─────▼─────┐ ┌─────▼─────┐ │
-│ │ Admin UI │ │ Compliance │ │ 7 Tables │ │
-│ │ /admin/ │ │ Module │ │ compliance_│ │
-│ │compliance/│ │ /backend/ │ │ regulations│ │
-│ └───────────┘ │compliance/ │ │ _controls │ │
-│ └───────────┘ │ _evidence │ │
-│ │ _risks │ │
-│ │ ... │ │
-│ └───────────┘ │
-└─────────────────────────────────────────────────────────────────────────┘
- `}
+ Keine Compliance-Daten vorhanden
+Initialisieren Sie die Datenbank mit den Seed-Daten.
Regulations & Requirements
-EU-Verordnungen, BSI-Standards werden als Seed-Daten geladen
-Controls & Mappings
-Technische Controls werden Requirements zugeordnet
-Evidence Collection
-Nachweise werden manuell oder automatisiert erfasst
-Audit Export
-ZIP-Pakete fuer externe Pruefer generieren
-Abgeschlossen
-{completedCount}
-In Bearbeitung
-{inProgressCount}
-Geplant
-{plannedCount}
-| Titel | -Kategorie | -Prioritaet | -Status | -
|---|---|---|---|
| - {item.title} - | -- {item.category} - | -- - {item.priority} - - | -- - {item.status === 'completed' ? 'Fertig' : - item.status === 'in_progress' ? 'In Arbeit' : 'Geplant'} - - | -
{t.fields}
-- Erstellen Sie ZIP-Pakete mit allen relevanten Compliance-Daten fuer externe Pruefer. -
- -Alle Daten inkl. Regulations, Controls, Evidence, Risks
-Control Catalogue mit Mappings
-Evidence-Dateien und Metadaten
-{`
-audit_export_2026-01-16/
-├── index.html # Navigations-Uebersicht
-├── summary.json # Maschinenlesbare Zusammenfassung
-├── regulations/
-│ ├── gdpr.json
-│ ├── aiact.json
-│ └── ...
-├── controls/
-│ ├── control_catalogue.json
-│ └── control_catalogue.xlsx
-├── evidence/
-│ ├── scan_reports/
-│ ├── policies/
-│ └── configs/
-├── risks/
-│ └── risk_register.json
-└── README.md # Erklaerung fuer Pruefer
- `}
- Controls ueberpruefen und Status aktualisieren
- - -Nachweise hochladen und verwalten
- -Datenbank initialisieren
-Klicken Sie auf "Datenbank initialisieren" im Dashboard, um die Seed-Daten zu laden.
-Controls reviewen
-Gehen Sie zum Control Catalogue und bewerten Sie den Status jedes Controls.
-Evidence hochladen
-Laden Sie Nachweise (Scan-Reports, Policies, Screenshots) fuer Ihre Controls hoch.
-Risiken bewerten
-Dokumentieren Sie identifizierte Risiken in der Risk Matrix.
-Audit Export
-Generieren Sie ein ZIP-Paket fuer externe Pruefer.
-{label}
-{endpoint.path}
+ | Container | +Port | +Type | +Health Check | +
|---|---|---|---|
+ {service.container}
+ |
+ {service.port} | ++ + {service.type} + + | +
+ {service.healthEndpoint ? (
+
+ {service.healthEndpoint}
+
+ ) : (
+ -
+ )}
+ |
+
+ {item.cmd}
+
+
+ {env}
+
+ ))}
+ {DATAFLOW_DIAGRAM}
+ {service.technology}
+{service.description}
+ {service.connections && service.connections.length > 0 && ( +1. Request: Browser → Next.js/FastAPI Frontend
+2. API: Frontend → Python Backend / Go Microservices
+3. Auth: Keycloak/Vault fuer SSO & Secrets
+4. Data: PostgreSQL (ACID) / Redis (Cache)
+5. Search: Qdrant (Vector) / Meilisearch (Fulltext)
+6. Storage: MinIO (Files) / IPFS (Dezentral)
+Auth: JWT + Keycloak OIDC
+Secrets: HashiCorp Vault (encrypted)
+Communication: Matrix E2EE, TLS everywhere
+DSGVO: Consent Service fuer Einwilligungen
+DevSecOps: Trivy, Gitleaks, Semgrep, Bandit
+SBOM: CycloneDX fuer alle Komponenten
+{service.description}
+{service.description}
+ +localhost:{service.port}{service.healthEndpoint}
+ {` /\\
+ / \\ E2E (10%)
+ /----\\
+ / \\ Integration (20%)
+ /--------\\
+ / \\ Unit Tests (70%)
+ /--------------\\`}
+
+ {item.cmd}
+
+ OCR-Labeling-System | Version 1.0.0 | 21. Januar 2026
+
+ {children}
+
+ )
+}
diff --git a/website/app/admin/docs/audit/_components/Table.tsx b/website/app/admin/docs/audit/_components/Table.tsx
new file mode 100644
index 0000000..bbaa393
--- /dev/null
+++ b/website/app/admin/docs/audit/_components/Table.tsx
@@ -0,0 +1,33 @@
+/**
+ * Reusable table component for the audit documentation.
+ * Renders a striped HTML table with headers and rows.
+ */
+
+export function Table({ headers, rows }: { headers: string[]; rows: string[][] }) {
+ return (
+ | + {header} + | + ))} +
|---|
| + {cell} + | + ))} +
Dokumentende
+Diese Dokumentation wird jährlich oder bei wesentlichen Änderungen aktualisiert.
+Letzte Aktualisierung: 26. Januar 2026
++ Das BQAS (Breakpilot Quality Assurance System) nutzt einen lokalen Scheduler anstelle von GitHub Actions. + Dies gewährleistet, dass keine Testdaten oder Ergebnisse an externe Cloud-Dienste übertragen werden. +
++ DSGVO-Konformität: Der lokale Scheduler verarbeitet alle Testdaten ausschließlich auf dem schuleigenen Mac Mini. + Es erfolgt keine Übertragung von Schülerdaten, Testergebnissen oder Modell-Outputs an externe Server. +
+Der lokale Scheduler besteht aus folgenden Komponenten:
+Folgende Daten werden während der Test-Ausführung verarbeitet:
++ Wichtig: Die Test-Inputs (Golden Suite YAML-Dateien) enthalten keine echten Schülerdaten, + sondern ausschließlich synthetische Beispiele zur Qualitätssicherung der Intent-Erkennung und RAG-Funktionalität. +
+Das Notifier-Modul unterstützt verschiedene Benachrichtigungskanäle:
+Empfohlene Konfiguration für maximale Datenschutz-Konformität:
+Prüfung nach Anhang III der KI-Verordnung:
+Das System wird nicht für folgende Hochrisiko-Anwendungen genutzt:
++ Ergebnis: Kein Hochrisiko-KI-System nach aktuellem Stand. +
++ Ergebnis: DSFA erforderlich aufgrund KI-Einsatz und Verarbeitung von Daten Minderjähriger. +
++ Ergebnis: Art. 22 DSGVO ist nicht anwendbar, da keine automatisierte Entscheidung mit rechtlicher Wirkung erfolgt. +
+Das System implementiert obligatorische menschliche Aufsicht:
+Workflow-Garantien:
++ NEU: Das Voice Service implementiert eine Voice-First Schnittstelle fuer Lehrkraefte mit + PersonaPlex-7B (Full-Duplex Speech-to-Speech) und TaskOrchestrator (Agent-Orchestrierung). + Alle Audiodaten werden ausschliesslich transient im RAM verarbeitet und niemals persistiert. +
++ KRITISCH: Audio-Daten dürfen unter keinen Umständen persistiert werden (AUDIO_PERSISTENCE=false). + Dies ist eine harte DSGVO-Anforderung zum Schutz der Privatsphäre. +
++ Wichtig: Der Server erhält niemals den Klartext-Schlüssel. Es wird nur ein SHA-256 Hash + zur Verifizierung übermittelt. Alle sensiblen Daten werden vor der Übertragung client-seitig verschlüsselt. +
++ Compliance: Die TTL-basierte Auto-Löschung ist durch Valkey-Mechanismen sichergestellt und + erfordert keine manuelle Intervention. +
+Audit-Logs enthalten ausschließlich nicht-personenbezogene Metadaten:
++ Das OCR-Labeling-System ist eine vollständig lokal betriebene Lösung zur Digitalisierung und Auswertung handschriftlicher Schülerarbeiten (Klausuren, Aufsätze). Das System nutzt: +
+Das System erfüllt die Anforderungen der:
+Die verwendeten KI-Modelle wurden nach Datenschutzkriterien ausgewählt:
+Niedersachsen:
+Interesse-Abwägung für Training (Art. 6 Abs. 1 lit. f):
+Prüfung auf besondere Kategorien:
++ Handschriftproben könnten theoretisch Rückschlüsse auf Gesundheitszustände ermöglichen (z.B. Tremor). Dies wird wie folgt adressiert: +
++ Ergebnis: Art. 9 ist nicht anwendbar, da keine Verarbeitung besonderer Kategorien erfolgt. +
+| - {header} - | - ))} -
|---|
| - {cell} - | - ))} -
- {children}
-
- )
-}
+import { SECTIONS } from './constants'
+import { TableOfContents } from './_components/TableOfContents'
+import { AuditHeader } from './_components/AuditHeader'
+import { AuditTitleBlock } from './_components/AuditTitleBlock'
+import {
+ ManagementSummary,
+ VerarbeitungsTaetigkeiten,
+ Rechtsgrundlagen,
+ DatenschutzFolgen,
+ InformationspflichtenAndArt22,
+ PrivacyByDesignAndTOM,
+ BSIAndEUAIAct,
+ MLTrainingAndRechte,
+ SchulungReviewVorfall,
+ KontakteAndVoice,
+ BQASScheduler,
+ Anhaenge,
+} from './_components/sections'
export default function AuditDocumentationPage() {
const [showToc, setShowToc] = useState(true)
@@ -136,1124 +69,34 @@ export default function AuditDocumentationPage() {
OCR-Labeling-System | Version 1.0.0 | 21. Januar 2026
-- Das OCR-Labeling-System ist eine vollständig lokal betriebene Lösung zur Digitalisierung und Auswertung handschriftlicher Schülerarbeiten (Klausuren, Aufsätze). Das System nutzt: -
-Das System erfüllt die Anforderungen der:
-Niedersachsen:
-Interesse-Abwägung für Training (Art. 6 Abs. 1 lit. f):
-Prüfung auf besondere Kategorien:
-- Handschriftproben könnten theoretisch Rückschlüsse auf Gesundheitszustände ermöglichen (z.B. Tremor). Dies wird wie folgt adressiert: -
-- Ergebnis: Art. 9 ist nicht anwendbar, da keine Verarbeitung besonderer Kategorien erfolgt. -
-- Ergebnis: DSFA erforderlich aufgrund KI-Einsatz und Verarbeitung von Daten Minderjähriger. -
-- Ergebnis: Art. 22 DSGVO ist nicht anwendbar, da keine automatisierte Entscheidung mit rechtlicher Wirkung erfolgt. -
-Das System implementiert obligatorische menschliche Aufsicht:
-Workflow-Garantien:
-Die verwendeten KI-Modelle wurden nach Datenschutzkriterien ausgewählt:
-Prüfung nach Anhang III der KI-Verordnung:
-Das System wird nicht für folgende Hochrisiko-Anwendungen genutzt:
-- Ergebnis: Kein Hochrisiko-KI-System nach aktuellem Stand. -
-- NEU: Das Voice Service implementiert eine Voice-First Schnittstelle fuer Lehrkraefte mit - PersonaPlex-7B (Full-Duplex Speech-to-Speech) und TaskOrchestrator (Agent-Orchestrierung). - Alle Audiodaten werden ausschliesslich transient im RAM verarbeitet und niemals persistiert. -
-- KRITISCH: Audio-Daten dürfen unter keinen Umständen persistiert werden (AUDIO_PERSISTENCE=false). - Dies ist eine harte DSGVO-Anforderung zum Schutz der Privatsphäre. -
-- Wichtig: Der Server erhält niemals den Klartext-Schlüssel. Es wird nur ein SHA-256 Hash - zur Verifizierung übermittelt. Alle sensiblen Daten werden vor der Übertragung client-seitig verschlüsselt. -
-- Compliance: Die TTL-basierte Auto-Löschung ist durch Valkey-Mechanismen sichergestellt und - erfordert keine manuelle Intervention. -
-Audit-Logs enthalten ausschließlich nicht-personenbezogene Metadaten:
-- Das BQAS (Breakpilot Quality Assurance System) nutzt einen lokalen Scheduler anstelle von GitHub Actions. - Dies gewährleistet, dass keine Testdaten oder Ergebnisse an externe Cloud-Dienste übertragen werden. -
-- DSGVO-Konformität: Der lokale Scheduler verarbeitet alle Testdaten ausschließlich auf dem schuleigenen Mac Mini. - Es erfolgt keine Übertragung von Schülerdaten, Testergebnissen oder Modell-Outputs an externe Server. -
-Der lokale Scheduler besteht aus folgenden Komponenten:
-Folgende Daten werden während der Test-Ausführung verarbeitet:
-- Wichtig: Die Test-Inputs (Golden Suite YAML-Dateien) enthalten keine echten Schülerdaten, - sondern ausschließlich synthetische Beispiele zur Qualitätssicherung der Intent-Erkennung und RAG-Funktionalität. -
-Das Notifier-Modul unterstützt verschiedene Benachrichtigungskanäle:
-Empfohlene Konfiguration für maximale Datenschutz-Konformität:
-Dokumentende
-Diese Dokumentation wird jährlich oder bei wesentlichen Änderungen aktualisiert.
-Letzte Aktualisierung: 26. Januar 2026
-{`
- BreakPilot Platform - Datenfluss
-
- ┌─────────────────────────────────────────────────────────────────────────────────────────────┐
- │ FRONTEND LAYER │
- ├─────────────────────────────────────────────────────────────────────────────────────────────┤
- │ ┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐ │
- │ │ Admin Frontend │ │ Lehrer Studio │ │ Policy Vault UI │ │
- │ │ Next.js :3000 │ │ FastAPI :8000 │ │ Angular :4200 │ │
- │ └──────────┬──────────┘ └──────────┬──────────┘ └──────────┬──────────┘ │
- └─────────────┼───────────────────────────┼───────────────────────────┼────────────────────────┘
- │ │ │
- ▼ ▼ ▼
- ┌─────────────────────────────────────────────────────────────────────────────────────────────┐
- │ BACKEND LAYER │
- ├───────────────────┬───────────────────┬───────────────────┬─────────────────────────────────┤
- │ ┌───────────────┐ │ ┌───────────────┐ │ ┌───────────────┐ │ ┌───────────────┐ │
- │ │ Consent :8081 │ │ │ Billing :8083 │ │ │ School :8084 │ │ │ DSMS GW :8082 │ │
- │ │ Go/Gin │ │ │ Go/Stripe │ │ │ Go/Gin │ │ │ Go/IPFS │ │
- │ │ DSGVO Consent │ │ │ Subscriptions │ │ │ Noten/Zeugnis │ │ │ Audit Storage │ │
- │ └───────┬───────┘ │ └───────┬───────┘ │ └───────┬───────┘ │ └───────┬───────┘ │
- │ │ │ │ │ │ │ │ │
- │ ▼ │ ▼ │ ▼ │ ▼ │
- │ ┌───────────────┐ │ ┌───────────────┐ │ ┌───────────────┐ │ ┌───────────────┐ │
- │ │ Klausur :8086 │ │ │ H5P :8085 │ │ │ Policy API │ │ │ LLM Services │ │
- │ │ Python/BYOEH │ │ │ Node.js │ │ │ NestJS :3001 │ │ │ LibreChat/RAG │ │
- │ │ Abiturkorrek. │ │ │ Interaktiv │ │ │ Richtlinien │ │ │ KI-Assistenz │ │
- │ └───────┬───────┘ │ └───────┬───────┘ │ └───────┬───────┘ │ └───────┬───────┘ │
- └─────────┼─────────┴─────────┼─────────┴─────────┼─────────┴─────────┼───────────────────────┘
- │ │ │ │
- ▼ ▼ ▼ ▼
- ┌─────────────────────────────────────────────────────────────────────────────────────────────┐
- │ DATA LAYER │
- ├───────────────────┬───────────────────┬───────────────────┬─────────────────────────────────┤
- │ ┌───────────────┐ │ ┌───────────────┐ │ ┌───────────────┐ │ ┌───────────────┐ │
- │ │ PostgreSQL │◄┼►│ Redis │ │ │ Qdrant │ │ │ OpenSearch │ │
- │ │ :5432 │ │ │ :6379 Cache │ │ │ :6333 Vector │ │ │ :9200 Search │ │
- │ │ Hauptdaten │ │ │ Sessions │ │ │ RAG Embeddings│ │ │ Volltext │ │
- │ └───────────────┘ │ └───────────────┘ │ └───────────────┘ │ └───────────────┘ │
- └───────────────────┴───────────────────┴───────────────────┴─────────────────────────────────┘
- │
- ▼
- ┌─────────────────────────────────────────────────────────────────────────────────────────────┐
- │ INFRASTRUCTURE LAYER │
- ├───────────────────┬───────────────────┬───────────────────┬─────────────────────────────────┤
- │ ┌───────────────┐ │ ┌───────────────┐ │ ┌───────────────┐ │ ┌───────────────┐ │
- │ │ Vault :8200 │ │ │ Keycloak :8180│ │ │ MinIO :9000 │ │ │ IPFS :5001 │ │
- │ │ Secrets Mgmt │ │ │ SSO/OIDC Auth │ │ │ S3 Storage │ │ │ Dezentral │ │
- │ └───────────────┘ │ └───────────────┘ │ └───────────────┘ │ └───────────────┘ │
- │ ┌───────────────┐ │ ┌───────────────┐ │ ┌───────────────┐ │ │
- │ │ Matrix :8008 │ │ │ Jitsi :8443 │ │ │ ERPNext :8090 │ │ │
- │ │ E2EE Chat │ │ │ Video Calls │ │ │ Open ERP │ │ │
- │ └───────────────┘ │ └───────────────┘ │ └───────────────┘ │ │
- └───────────────────┴───────────────────┴───────────────────┴─────────────────────────────────┘
-
- ═══════════════════════════════════════════════════════════════════════════════════════════════
- Legende: ──► Datenfluss ◄──► Bidirektional │ Layer-Grenze ┌─┐ Service-Box
- ═══════════════════════════════════════════════════════════════════════════════════════════════
-`}
- {service.technology}
-{service.description}
- {service.connections && service.connections.length > 0 && ( -{selectedArchService.description}
-1. Request: Browser → Next.js/FastAPI Frontend
-2. API: Frontend → Python Backend / Go Microservices
-3. Auth: Keycloak/Vault fuer SSO & Secrets
-4. Data: PostgreSQL (ACID) / Redis (Cache)
-5. Search: Qdrant (Vector) / Meilisearch (Fulltext)
-6. Storage: MinIO (Files) / IPFS (Dezentral)
-Auth: JWT + Keycloak OIDC
-Secrets: HashiCorp Vault (encrypted)
-Communication: Matrix E2EE, TLS everywhere
-DSGVO: Consent Service fuer Einwilligungen
-DevSecOps: Trivy, Gitleaks, Semgrep, Bandit
-SBOM: CycloneDX fuer alle Komponenten
-{service.description}
- -localhost:{service.port}{service.healthEndpoint}
- {endpoint.path}
- | Container | -Port | -Type | -Health Check | -
|---|---|---|---|
- {service.container}
- |
- {service.port} | -- - {service.type} - - | -
- {service.healthEndpoint ? (
-
- {service.healthEndpoint}
-
- ) : (
- -
- )}
- |
-
- {item.cmd}
-
-
- {env}
-
- ))}
- {` /\\
- / \\ E2E (10%)
- /----\\
- / \\ Integration (20%)
- /--------\\
- / \\ Unit Tests (70%)
- /--------------\\`}
-
- {item.cmd}
-
- Validierte Referenz-Tests gegen definierte Erwartungen
+{goldenMetrics.total_tests}
+Tests
+{goldenMetrics.passed_tests}
+Bestanden
+{goldenMetrics.failed_tests}
+Fehlgeschlagen
+{goldenMetrics.avg_intent_accuracy.toFixed(0)}%
+Intent Accuracy
+{goldenMetrics.avg_composite_score.toFixed(2)}
+Composite Score
+{title}
+{value}
+ {subtitle &&{subtitle}
} +Erwartungshorizont-Retrieval, Operatoren-Alignment, Citations
+{ragMetrics.total_tests}
+Tests
+{ragMetrics.avg_faithfulness.toFixed(2)}
+Faithfulness
+{ragMetrics.avg_relevance.toFixed(2)}
+Relevance
+{(ragMetrics.safety_pass_rate * 100).toFixed(0)}%
+Safety Pass
+Noch keine RAG-Test-Ergebnisse
+Klicke "Tests starten" um die RAG-Suite auszufuehren
+{cat.desc}
+{description}
++ Der lokale BQAS Scheduler ersetzt GitHub Actions und bietet DSGVO-konforme, vollstaendig lokale Test-Ausfuehrung. +
+ +| Feature | +GitHub Actions | +Lokaler Scheduler | +
|---|---|---|
| {row.feature} | ++ {row.ghColor ? ( + + {row.gh} + + ) : ( + {row.gh} + )} + | ++ + {row.local} + + | +
{`# ~/Library/LaunchAgents/com.breakpilot.bqas.plist
+Label: com.breakpilot.bqas
+Schedule: 07:00 taeglich
+Script: /voice-service/scripts/run_bqas.sh
+Logs: /var/log/bqas/`}
+ + Der lokale BQAS Scheduler wurde entwickelt, um die gleiche Funktionalitaet wie GitHub Actions zu bieten, + aber mit dem entscheidenden Vorteil, dass alle Daten zu 100% auf dem lokalen Mac Mini verbleiben. + Dies ist besonders wichtig fuer DSGVO-Konformitaet, da keine Schuelerdaten oder Testergebnisse an externe Server uebertragen werden. +
+ +./voice-service/scripts/install_bqas_scheduler.sh install
+ LLM-generierte Variationen fuer Robustheit-Tests
+{syntheticMetrics.total_tests}
+Generierte Tests
+{syntheticMetrics.passed_tests}
+Bestanden
+{syntheticMetrics.avg_composite_score.toFixed(2)}
+Avg Score
+{syntheticMetrics.avg_coherence.toFixed(2)}
+Coherence
+Noch keine synthetischen Tests ausgefuehrt
+Klicke "Tests starten" um Variationen zu generieren
+| ID | +Zeitpunkt | +Commit | +Golden Score | +Tests | +Bestanden | +Dauer | +
|---|---|---|---|---|---|---|
| #{run.id} | ++ {new Date(run.timestamp).toLocaleString('de-DE')} + | ++ {run.git_commit?.slice(0, 7) || '-'} + | ++ = 4 ? 'text-emerald-600' : run.golden_score >= 3 ? 'text-amber-600' : 'text-red-600' + }`} + > + {run.golden_score.toFixed(2)} + + | +{run.total_tests} | ++ {run.passed_tests} + / + {run.failed_tests} + | ++ {run.duration_seconds.toFixed(1)}s + | +
{description}
+{metrics.total_tests}
+Tests
+{metrics.passed_tests}
+Bestanden
+{metrics.failed_tests}
+Fehlgeschlagen
++ Durchschnittlicher Score: {metrics.avg_composite_score.toFixed(2)} +
+Letzter Lauf: {new Date(lastRun).toLocaleString('de-DE')}
+ )} +{title}
-{value}
- {subtitle &&{subtitle}
} -{description}
-{metrics.total_tests}
-Tests
-{metrics.passed_tests}
-Bestanden
-{metrics.failed_tests}
-Fehlgeschlagen
-- Durchschnittlicher Score: {metrics.avg_composite_score.toFixed(2)} -
-Letzter Lauf: {new Date(lastRun).toLocaleString('de-DE')}
- )} -| ID | -Zeitpunkt | -Commit | -Golden Score | -Tests | -Bestanden | -Dauer | -
|---|---|---|---|---|---|---|
| #{run.id} | -- {new Date(run.timestamp).toLocaleString('de-DE')} - | -- {run.git_commit?.slice(0, 7) || '-'} - | -- = 4 ? 'text-emerald-600' : run.golden_score >= 3 ? 'text-amber-600' : 'text-red-600' - }`} - > - {run.golden_score.toFixed(2)} - - | -{run.total_tests} | -- {run.passed_tests} - / - {run.failed_tests} - | -- {run.duration_seconds.toFixed(1)}s - | -
{description}
-Validierte Referenz-Tests gegen definierte Erwartungen
-{goldenMetrics.total_tests}
-Tests
-{goldenMetrics.passed_tests}
-Bestanden
-{goldenMetrics.failed_tests}
-Fehlgeschlagen
-{goldenMetrics.avg_intent_accuracy.toFixed(0)}%
-Intent Accuracy
-{goldenMetrics.avg_composite_score.toFixed(2)}
-Composite Score
-Erwartungshorizont-Retrieval, Operatoren-Alignment, Citations
-{ragMetrics.total_tests}
-Tests
-{ragMetrics.avg_faithfulness.toFixed(2)}
-Faithfulness
-{ragMetrics.avg_relevance.toFixed(2)}
-Relevance
-{(ragMetrics.safety_pass_rate * 100).toFixed(0)}%
-Safety Pass
-Noch keine RAG-Test-Ergebnisse
-Klicke "Tests starten" um die RAG-Suite auszufuehren
-{cat.desc}
-LLM-generierte Variationen fuer Robustheit-Tests
-{syntheticMetrics.total_tests}
-Generierte Tests
-{syntheticMetrics.passed_tests}
-Bestanden
-{syntheticMetrics.avg_composite_score.toFixed(2)}
-Avg Score
-{syntheticMetrics.avg_coherence.toFixed(2)}
-Coherence
-Noch keine synthetischen Tests ausgefuehrt
-Klicke "Tests starten" um Variationen zu generieren
-- Der lokale BQAS Scheduler ersetzt GitHub Actions und bietet DSGVO-konforme, vollstaendig lokale Test-Ausfuehrung. -
- -| Feature | -GitHub Actions | -Lokaler Scheduler | -
|---|---|---|
| Taegliche Tests (07:00) | -- schedule: cron - | -- macOS launchd - | -
| Push-basierte Tests | -- on: push - | -- Git post-commit Hook - | -
| PR-basierte Tests | -- on: pull_request - | -- Nicht moeglich - | -
| Regression-Check | -- API-Call - | -- Identischer API-Call - | -
| Benachrichtigungen | -- GitHub Issues - | -- Desktop/Slack/Email - | -
| DSGVO-Konformitaet | -- Daten bei GitHub (US) - | -- 100% lokal - | -
| Offline-Faehig | -- Nein - | -- Ja - | -
{`# ~/Library/LaunchAgents/com.breakpilot.bqas.plist
-Label: com.breakpilot.bqas
-Schedule: 07:00 taeglich
-Script: /voice-service/scripts/run_bqas.sh
-Logs: /var/log/bqas/`}
- - Der lokale BQAS Scheduler wurde entwickelt, um die gleiche Funktionalitaet wie GitHub Actions zu bieten, - aber mit dem entscheidenden Vorteil, dass alle Daten zu 100% auf dem lokalen Mac Mini verbleiben. - Dies ist besonders wichtig fuer DSGVO-Konformitaet, da keine Schuelerdaten oder Testergebnisse an externe Server uebertragen werden. -
- -./voice-service/scripts/install_bqas_scheduler.sh install
- Verwaltung der indexierten Dokumentensammlungen
-Starten Sie die Ingestion oder laden Sie Dokumente hoch.
-{collection.name}
-Chunks
-- {collection.chunkCount.toLocaleString()} -
-Jahre
-- {collection.years.length > 0 - ? `${Math.min(...collection.years)}-${Math.max(...collection.years)}` - : '-' - } -
-Fächer
-- {collection.subjects.length} -
-Bundesland
-- {collection.bundesland} -
-- ZIP-Archive oder einzelne PDFs hochladen. ZIPs werden automatisch entpackt. -
-- ZIP-Datei oder Ordner hierher ziehen -
-- oder -
- -- Unterstützt: .zip, .pdf -
-{file.name}
-- {(file.size / 1024 / 1024).toFixed(2)} MB -
-- Übersicht über laufende und vergangene Indexierungsvorgänge -
-Letzte Ausführung
-- {status.lastRun - ? new Date(status.lastRun).toLocaleString('de-DE') - : '-' - } -
-Dokumente
-- {status.documentsIndexed ?? '-'} -
-Chunks
-- {status.chunksCreated ?? '-'} -
-Fehler
-0 ? 'text-red-600' : 'text-slate-900'}`}> - {status.errors.length} -
-- Testen Sie die semantische Suche und bewerten Sie die Ergebnisqualität -
-- {result.text} -
- - {/* Rating */} -Keine Ergebnisse gefunden
-- Übersicht über Retrieval-Performance und Nutzerbewertungen -
-{title}
-{value}
- {change && ( - - {change} - - )} -{label}
++ {stats.total_documents.toLocaleString()} +
+Dokumente
++ {stats.total_chunks.toLocaleString()} +
+Chunks
++ {stats.training_allowed.toLocaleString()} +
+Training erlaubt
+Schritt {step} von 3
++ Nur Bundesländer mit Training-Erlaubnis können ausgewählt werden. +
++ Hinweis: Das Training kann je nach Datenmenge und Konfiguration + mehrere Stunden dauern. Sie können den Fortschritt jederzeit überwachen. +
++ Modell: {job.model_type.charAt(0).toUpperCase() + job.model_type.slice(1)} +
+{label}
-- Modell: {job.model_type.charAt(0).toUpperCase() + job.model_type.slice(1)} -
-- {stats.total_documents.toLocaleString()} -
-Dokumente
-- {stats.total_chunks.toLocaleString()} -
-Chunks
-- {stats.training_allowed.toLocaleString()} -
-Training erlaubt
-Schritt {step} von 3
-- Nur Bundesländer mit Training-Erlaubnis können ausgewählt werden. -
-- Hinweis: Das Training kann je nach Datenmenge und Konfiguration - mehrere Stunden dauern. Sie können den Fortschritt jederzeit überwachen. -
-Überwachen und steuern Sie KI-Trainingsprozesse für Zeugnisse
@@ -943,12 +108,7 @@ export default function TrainingDashboardPage() {Starten Sie ein neues Training, um das Zeugnis-Modell zu verbessern.
+- Starten Sie ein neues Training, um das Zeugnis-Modell zu verbessern. -
-+ {isLoadingAnalytics ? 'Lade Analytics...' : 'Keine Analytics-Daten verfügbar'} +
++ Analytics werden nach abgeschlossenen Sessions verfügbar. +
+
+ {log.stack}
+
+ )}
+ Keine Logs vorhanden
+Logs erscheinen, wenn Unity Nachrichten generiert
+
+ {JSON.stringify(generatedContent, null, 2)}
+
+ )}
+ + Klicke auf "Diagnose starten" um die Szene zu prüfen +
+ ) : ( +GET /status
+ GET /logs/errors
+ GET /scene
+ POST /diagnose
+ GET /play
+ GET /stop
+ GET /screenshot
+ GET /stream/start
+ GET /stream/frame
+
+ Basis-URL: http://localhost:8090
+ (Streaming-Endpoints blau markiert)
+
{title}
+ {icon} +{value}
+{unitsError}
+
+ Backend starten: cd backend && python main.py
+
{unit.topic || unit.subject || 'Keine Beschreibung'}
+Keine Units gefunden
+Units werden unter backend/data/units/ gespeichert
+ {JSON.stringify(selectedUnit, null, 2)}
+
+ {title}
- {icon} -{value}
-
- {log.stack}
-
- )}
- Keine Logs vorhanden
-Logs erscheinen, wenn Unity Nachrichten generiert
-- Klicke auf "Diagnose starten" um die Szene zu prüfen -
- ) : ( -{error}
+{bridge.error}
Starte den Server in Unity: BreakpilotDrive → AI Bridge → Start Server
GET /status
- GET /logs/errors
- GET /scene
- POST /diagnose
- GET /play
- GET /stop
- GET /screenshot
- GET /stream/start
- GET /stream/frame
-
- Basis-URL: http://localhost:8090
- (Streaming-Endpoints blau markiert)
-
{unitsError}
-
- Backend starten: cd backend && python main.py
-
{unit.topic || unit.subject || 'Keine Beschreibung'}
-Keine Units gefunden
-Units werden unter backend/data/units/ gespeichert
- {JSON.stringify(selectedUnit, null, 2)}
-
- - {isLoadingAnalytics ? 'Lade Analytics...' : 'Keine Analytics-Daten verfügbar'} -
-- Analytics werden nach abgeschlossenen Sessions verfügbar. -
-
- {JSON.stringify(generatedContent, null, 2)}
-
- )}
-