refactor(developer-portal): split iace, docs, byoeh pages

Extract each page into colocated _components/ sections to bring
page.tsx files from 1008/891/769 LOC down to 57/23/21 LOC,
well within the 500-line hard cap.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Sharang Parnerkar
2026-04-18 08:45:13 +02:00
parent a7fe32fb82
commit 9ec72ed681
25 changed files with 2182 additions and 2614 deletions

View File

@@ -0,0 +1,149 @@
'use client'
import { ApiEndpoint, CodeBlock, InfoBox } from '@/components/DevPortalLayout'
export function AuditRagSdkSection() {
return (
<>
<h2>Audit Trail</h2>
<p>Lueckenloser Audit-Trail aller Projektaenderungen fuer Compliance-Nachweise.</p>
<ApiEndpoint method="GET" path="/sdk/v1/iace/projects/:id/audit-trail" description="Projekt-Audit-Trail abrufen" />
<CodeBlock language="bash" filename="cURL">
{`curl -X GET "https://api.breakpilot.io/sdk/v1/iace/projects/proj_a1b2c3d4/audit-trail" \\
-H "Authorization: Bearer YOUR_API_KEY"`}
</CodeBlock>
<h3>Response (200 OK)</h3>
<CodeBlock language="json" filename="Response">
{`{
"success": true,
"data": [
{ "id": "aud_001", "action": "hazard_created", "entity_type": "hazard", "entity_id": "haz_5678", "user_id": "user_abc", "changes": { "title": "Quetschgefahr durch Linearantrieb", "severity": "high" }, "timestamp": "2026-03-16T10:15:00Z" },
{ "id": "aud_002", "action": "risk_assessed", "entity_type": "hazard", "entity_id": "haz_5678", "user_id": "user_abc", "changes": { "inherent_risk": 12, "risk_level": "high" }, "timestamp": "2026-03-16T10:20:00Z" },
{ "id": "aud_003", "action": "tech_file_section_approved", "entity_type": "tech_file", "entity_id": "risk_assessment", "user_id": "user_def", "changes": { "status": "approved", "approved_by": "Dr. Mueller" }, "timestamp": "2026-03-16T15:00:00Z" }
]
}`}
</CodeBlock>
<h2>RAG Library Search</h2>
<p>
Semantische Suche in der Compliance-Bibliothek via RAG (Retrieval-Augmented Generation).
Ermoeglicht kontextbasierte Anreicherung von Tech-File-Abschnitten.
</p>
<ApiEndpoint method="POST" path="/sdk/v1/iace/library-search" description="Compliance-Bibliothek via RAG durchsuchen" />
<CodeBlock language="bash" filename="cURL">
{`curl -X POST "https://api.breakpilot.io/sdk/v1/iace/library-search" \\
-H "Authorization: Bearer YOUR_API_KEY" \\
-H "Content-Type: application/json" \\
-d '{
"query": "Schutzeinrichtungen fuer Industrieroboter Maschinenverordnung",
"top_k": 5
}'`}
</CodeBlock>
<h3>Response (200 OK)</h3>
<CodeBlock language="json" filename="Response">
{`{
"success": true,
"data": {
"query": "Schutzeinrichtungen fuer Industrieroboter Maschinenverordnung",
"results": [
{ "id": "mr-annex-iii-1.1.4", "title": "Maschinenverordnung Anhang III 1.1.4 — Schutzmassnahmen", "content": "Trennende Schutzeinrichtungen muessen fest angebracht oder verriegelt sein...", "source": "machinery_regulation", "score": 0.93 }
],
"total_results": 5,
"search_time_ms": 38
}
}`}
</CodeBlock>
<ApiEndpoint method="POST" path="/sdk/v1/iace/projects/:id/tech-file/:section/enrich" description="Tech-File-Abschnitt mit RAG-Kontext anreichern" />
<CodeBlock language="bash" filename="cURL">
{`curl -X POST "https://api.breakpilot.io/sdk/v1/iace/projects/proj_a1b2c3d4/tech-file/safety_requirements/enrich" \\
-H "Authorization: Bearer YOUR_API_KEY"`}
</CodeBlock>
<h3>Response (200 OK)</h3>
<CodeBlock language="json" filename="Response">
{`{
"success": true,
"data": {
"section": "safety_requirements",
"enriched_content": "... (aktualisierter Abschnitt mit Regulierungsreferenzen) ...",
"citations_added": 4,
"sources": [
{ "id": "mr-annex-iii-1.1.4", "title": "Maschinenverordnung Anhang III 1.1.4", "relevance_score": 0.93 }
]
}
}`}
</CodeBlock>
<h2>SDK Integration</h2>
<p>Beispiel fuer die Integration der IACE-API in eine Anwendung:</p>
<CodeBlock language="typescript" filename="iace-workflow.ts">
{`import { getSDKBackendClient } from '@breakpilot/compliance-sdk'
const client = getSDKBackendClient()
// 1. Projekt erstellen
const project = await client.post('/iace/projects', {
machine_name: 'RoboArm X500',
machine_type: 'Industrieroboter',
manufacturer: 'TechCorp GmbH'
})
// 2. Aus Firmenprofil initialisieren
await client.post(\`/iace/projects/\${project.id}/init-from-profile\`)
// 3. Komponenten hinzufuegen
await client.post(\`/iace/projects/\${project.id}/components\`, {
name: 'Servo-Antrieb Achse 1',
component_type: 'actuator',
is_safety_relevant: true
})
// 4. Regulierungen klassifizieren
const classifications = await client.post(\`/iace/projects/\${project.id}/classify\`)
// 5. Pattern-Matching ausfuehren
const patterns = await client.post(\`/iace/projects/\${project.id}/match-patterns\`)
console.log(\`\${patterns.matches} Gefahren erkannt von \${patterns.total_patterns_checked} Patterns\`)
// 6. Erkannte Patterns als Gefahren uebernehmen
await client.post(\`/iace/projects/\${project.id}/apply-patterns\`)
// 7. Risiken bewerten
for (const hazard of await client.get(\`/iace/projects/\${project.id}/hazards\`)) {
await client.post(\`/iace/projects/\${project.id}/hazards/\${hazard.id}/assess\`, {
severity: 3, exposure: 2, probability: 2, avoidance: 2
})
}
// 8. Tech File generieren
const techFile = await client.post(\`/iace/projects/\${project.id}/tech-file/generate\`)
console.log(\`\${techFile.sections_generated} Abschnitte generiert\`)
// 9. PDF exportieren
const pdf = await client.get(\`/iace/projects/\${project.id}/tech-file/export?format=pdf\`)
`}
</CodeBlock>
<InfoBox type="warning" title="Rate Limits &amp; LLM-Kosten">
LLM-basierte Endpoints (Tech-File-Generierung, Hazard-Suggest, RAG-Enrichment)
verbrauchen LLM-Tokens. Professional-Plan: 50 Generierungen/Tag.
Enterprise-Plan: unbegrenzt. Implementieren Sie Caching fuer wiederholte Anfragen.
</InfoBox>
<InfoBox type="success" title="Human Oversight">
Alle LLM-generierten Inhalte muessen vor der Freigabe manuell geprueft werden.
Die API erzwingt dies ueber den Approve-Workflow: generierte Abschnitte haben
den Status &quot;generated&quot; und muessen explizit auf &quot;approved&quot; gesetzt werden.
</InfoBox>
</>
)
}

View File

@@ -0,0 +1,52 @@
'use client'
import { ApiEndpoint, CodeBlock, ParameterTable } from '@/components/DevPortalLayout'
export function ComponentsSection() {
return (
<>
<h2>Components</h2>
<p>Verwalten Sie die Komponenten einer Maschine oder eines Produkts.</p>
<ApiEndpoint method="POST" path="/sdk/v1/iace/projects/:id/components" description="Komponente hinzufuegen" />
<h3>Request Body</h3>
<ParameterTable
parameters={[
{ name: 'name', type: 'string', required: true, description: 'Komponentenname' },
{ name: 'component_type', type: 'string', required: true, description: 'Typ (z.B. "actuator", "sensor", "controller", "structural")' },
{ name: 'is_safety_relevant', type: 'boolean', required: false, description: 'Sicherheitsrelevante Komponente (default: false)' },
]}
/>
<CodeBlock language="bash" filename="cURL">
{`curl -X POST "https://api.breakpilot.io/sdk/v1/iace/projects/proj_a1b2c3d4/components" \\
-H "Authorization: Bearer YOUR_API_KEY" \\
-H "Content-Type: application/json" \\
-d '{
"name": "Servo-Antrieb Achse 1",
"component_type": "actuator",
"is_safety_relevant": true
}'`}
</CodeBlock>
<h3>Response (201 Created)</h3>
<CodeBlock language="json" filename="Response">
{`{
"success": true,
"data": {
"id": "comp_1234abcd",
"name": "Servo-Antrieb Achse 1",
"component_type": "actuator",
"is_safety_relevant": true,
"created_at": "2026-03-16T10:05:00Z"
}
}`}
</CodeBlock>
<ApiEndpoint method="GET" path="/sdk/v1/iace/projects/:id/components" description="Alle Komponenten des Projekts auflisten" />
<ApiEndpoint method="PUT" path="/sdk/v1/iace/projects/:id/components/:cid" description="Komponente aktualisieren" />
<ApiEndpoint method="DELETE" path="/sdk/v1/iace/projects/:id/components/:cid" description="Komponente loeschen" />
</>
)
}

View File

@@ -0,0 +1,78 @@
'use client'
import { ApiEndpoint, CodeBlock } from '@/components/DevPortalLayout'
export function EvidenceVerificationSection() {
return (
<>
<h2>Evidence</h2>
<p>Evidenz-Dateien hochladen und verwalten (Pruefberichte, Zertifikate, Fotos, etc.).</p>
<ApiEndpoint method="POST" path="/sdk/v1/iace/projects/:id/evidence" description="Evidenz-Datei hochladen" />
<CodeBlock language="bash" filename="cURL">
{`curl -X POST "https://api.breakpilot.io/sdk/v1/iace/projects/proj_a1b2c3d4/evidence" \\
-H "Authorization: Bearer YOUR_API_KEY" \\
-F "file=@pruefbericht_schutzgitter.pdf" \\
-F "title=Pruefbericht Schutzgitter ISO 14120" \\
-F "evidence_type=test_report" \\
-F "linked_mitigation_id=mit_abcd1234"`}
</CodeBlock>
<h3>Response (201 Created)</h3>
<CodeBlock language="json" filename="Response">
{`{
"success": true,
"data": {
"id": "evi_xyz789",
"title": "Pruefbericht Schutzgitter ISO 14120",
"evidence_type": "test_report",
"file_name": "pruefbericht_schutzgitter.pdf",
"file_size": 245760,
"linked_mitigation_id": "mit_abcd1234",
"created_at": "2026-03-16T12:00:00Z"
}
}`}
</CodeBlock>
<ApiEndpoint method="GET" path="/sdk/v1/iace/projects/:id/evidence" description="Alle Evidenzen des Projekts auflisten" />
<h2>Verification Plans</h2>
<p>Verifizierungsplaene erstellen und abarbeiten.</p>
<ApiEndpoint method="POST" path="/sdk/v1/iace/projects/:id/verification-plan" description="Verifizierungsplan erstellen" />
<CodeBlock language="bash" filename="cURL">
{`curl -X POST "https://api.breakpilot.io/sdk/v1/iace/projects/proj_a1b2c3d4/verification-plan" \\
-H "Authorization: Bearer YOUR_API_KEY" \\
-H "Content-Type: application/json" \\
-d '{
"title": "Schutzgitter-Verifizierung",
"description": "Pruefung der Schutzgitter nach ISO 14120",
"method": "inspection",
"linked_mitigation_id": "mit_abcd1234",
"planned_date": "2026-04-15T00:00:00Z"
}'`}
</CodeBlock>
<h3>Response (201 Created)</h3>
<CodeBlock language="json" filename="Response">
{`{
"success": true,
"data": {
"id": "vp_plan001",
"title": "Schutzgitter-Verifizierung",
"method": "inspection",
"status": "planned",
"linked_mitigation_id": "mit_abcd1234",
"planned_date": "2026-04-15T00:00:00Z",
"created_at": "2026-03-16T12:30:00Z"
}
}`}
</CodeBlock>
<ApiEndpoint method="PUT" path="/sdk/v1/iace/verification-plan/:vid" description="Verifizierungsplan aktualisieren" />
<ApiEndpoint method="POST" path="/sdk/v1/iace/verification-plan/:vid/complete" description="Verifizierung abschliessen" />
</>
)
}

View File

@@ -0,0 +1,95 @@
'use client'
import { ApiEndpoint, CodeBlock, InfoBox } from '@/components/DevPortalLayout'
export function HazardsSection() {
return (
<>
<h2>Hazards &amp; Pattern Matching</h2>
<p>
Gefahrenanalyse nach ISO 12100 mit 102 Hazard-Patterns. Die Pattern-Matching-Engine
erkennt automatisch Gefahren basierend auf Maschinentyp, Komponenten und Energiequellen.
</p>
<InfoBox type="info" title="102 Hazard-Patterns">
Die Engine enthaelt 102 vordefinierte Gefahrenmuster (HP001-HP102), die nach
ISO 12100 Anhang A kategorisiert sind: mechanisch, elektrisch, thermisch, Laerm,
Vibration, Strahlung, Materialien/Substanzen und ergonomisch.
</InfoBox>
<ApiEndpoint method="POST" path="/sdk/v1/iace/projects/:id/hazards" description="Neue Gefahr erstellen" />
<ApiEndpoint method="GET" path="/sdk/v1/iace/projects/:id/hazards" description="Alle Gefahren des Projekts auflisten" />
<ApiEndpoint method="PUT" path="/sdk/v1/iace/projects/:id/hazards/:hid" description="Gefahr aktualisieren" />
<ApiEndpoint method="POST" path="/sdk/v1/iace/projects/:id/hazards/suggest" description="KI-gestuetzte Gefahrenvorschlaege generieren" />
<CodeBlock language="bash" filename="cURL">
{`curl -X POST "https://api.breakpilot.io/sdk/v1/iace/projects/proj_a1b2c3d4/hazards/suggest" \\
-H "Authorization: Bearer YOUR_API_KEY"`}
</CodeBlock>
<h3>Response (200 OK)</h3>
<CodeBlock language="json" filename="Response">
{`{
"success": true,
"data": {
"suggestions": [
{
"hazard_type": "mechanical",
"title": "Quetschgefahr durch bewegliche Roboterarme",
"description": "Unkontrollierte Bewegung der Achsen kann zu Quetschungen fuehren",
"iso_reference": "ISO 12100 Anhang A.1",
"severity": "high",
"confidence": 0.91
},
{
"hazard_type": "electrical",
"title": "Stromschlaggefahr bei Wartungsarbeiten",
"description": "Zugang zu spannungsfuehrenden Teilen bei geoeffnetem Schaltschrank",
"iso_reference": "ISO 12100 Anhang A.2",
"severity": "critical",
"confidence": 0.87
}
]
}
}`}
</CodeBlock>
<ApiEndpoint method="POST" path="/sdk/v1/iace/projects/:id/match-patterns" description="Pattern-Matching-Engine ausfuehren (102 Patterns)" />
<CodeBlock language="bash" filename="cURL">
{`curl -X POST "https://api.breakpilot.io/sdk/v1/iace/projects/proj_a1b2c3d4/match-patterns" \\
-H "Authorization: Bearer YOUR_API_KEY"`}
</CodeBlock>
<h3>Response (200 OK)</h3>
<CodeBlock language="json" filename="Response">
{`{
"success": true,
"data": {
"total_patterns_checked": 102,
"matches": 14,
"results": [
{
"pattern_id": "HP003",
"title": "Crushing hazard from linear actuator",
"category": "mechanical",
"match_score": 0.94,
"matched_components": ["Servo-Antrieb Achse 1", "Linearfuehrung"],
"matched_energy_sources": ["EN03"],
"suggested_hazard": {
"title": "Quetschgefahr durch Linearantrieb",
"severity": "high"
}
}
]
}
}`}
</CodeBlock>
<ApiEndpoint method="POST" path="/sdk/v1/iace/projects/:id/apply-patterns" description="Pattern-Matching-Ergebnisse als Gefahren uebernehmen" />
<ApiEndpoint method="POST" path="/sdk/v1/iace/projects/:id/hazards/:hid/suggest-measures" description="Massnahmenvorschlaege fuer eine Gefahr generieren" />
<ApiEndpoint method="POST" path="/sdk/v1/iace/projects/:id/mitigations/:mid/suggest-evidence" description="Evidenz-Vorschlaege fuer eine Massnahme generieren" />
</>
)
}

View File

@@ -0,0 +1,93 @@
'use client'
import { ApiEndpoint, CodeBlock, ParameterTable } from '@/components/DevPortalLayout'
export function MitigationsSection() {
return (
<>
<h2>Mitigations</h2>
<p>
Massnahmenverwaltung nach der 3-Stufen-Hierarchie gemaess ISO 12100:
</p>
<ol>
<li><strong>Design</strong> Inherent Safe Design (Gefahrenbeseitigung durch Konstruktion)</li>
<li><strong>Protective</strong> Schutzeinrichtungen und technische Schutzmassnahmen</li>
<li><strong>Information</strong> Benutzerinformation (Warnhinweise, Anleitungen, Schulungen)</li>
</ol>
<ApiEndpoint method="POST" path="/sdk/v1/iace/projects/:id/hazards/:hid/mitigations" description="Massnahme erstellen (3-Stufen-Hierarchie: design, protective, information)" />
<h3>Request Body</h3>
<ParameterTable
parameters={[
{ name: 'title', type: 'string', required: true, description: 'Titel der Massnahme' },
{ name: 'description', type: 'string', required: true, description: 'Beschreibung der Massnahme' },
{ name: 'hierarchy_level', type: 'string', required: true, description: '"design" | "protective" | "information"' },
{ name: 'responsible', type: 'string', required: false, description: 'Verantwortliche Person oder Rolle' },
{ name: 'deadline', type: 'string (ISO 8601)', required: false, description: 'Umsetzungsfrist' },
]}
/>
<CodeBlock language="bash" filename="cURL">
{`curl -X POST "https://api.breakpilot.io/sdk/v1/iace/projects/proj_a1b2c3d4/hazards/haz_5678/mitigations" \\
-H "Authorization: Bearer YOUR_API_KEY" \\
-H "Content-Type: application/json" \\
-d '{
"title": "Schutzgitter mit Sicherheitsschalter",
"description": "Installation eines trennenden Schutzgitters mit Verriegelung nach ISO 14120",
"hierarchy_level": "protective",
"responsible": "Sicherheitsingenieur",
"deadline": "2026-04-30T00:00:00Z"
}'`}
</CodeBlock>
<h3>Response (201 Created)</h3>
<CodeBlock language="json" filename="Response">
{`{
"success": true,
"data": {
"id": "mit_abcd1234",
"hazard_id": "haz_5678",
"title": "Schutzgitter mit Sicherheitsschalter",
"hierarchy_level": "protective",
"status": "planned",
"verified": false,
"created_at": "2026-03-16T11:00:00Z"
}
}`}
</CodeBlock>
<ApiEndpoint method="PUT" path="/sdk/v1/iace/mitigations/:mid" description="Massnahme aktualisieren" />
<ApiEndpoint method="POST" path="/sdk/v1/iace/mitigations/:mid/verify" description="Massnahme als verifiziert markieren" />
<ApiEndpoint method="POST" path="/sdk/v1/iace/projects/:id/validate-mitigation-hierarchy" description="3-Stufen-Hierarchie validieren" />
<CodeBlock language="bash" filename="cURL">
{`curl -X POST "https://api.breakpilot.io/sdk/v1/iace/projects/proj_a1b2c3d4/validate-mitigation-hierarchy" \\
-H "Authorization: Bearer YOUR_API_KEY"`}
</CodeBlock>
<h3>Response (200 OK)</h3>
<CodeBlock language="json" filename="Response">
{`{
"success": true,
"data": {
"valid": false,
"violations": [
{
"hazard_id": "haz_5678",
"hazard_title": "Quetschgefahr durch Linearantrieb",
"issue": "Nur Information-Massnahmen vorhanden. Design- oder Schutzmassnahmen muessen vorrangig angewendet werden.",
"missing_levels": ["design", "protective"]
}
],
"summary": {
"total_hazards_with_mitigations": 12,
"hierarchy_compliant": 9,
"hierarchy_violations": 3
}
}
}`}
</CodeBlock>
</>
)
}

View File

@@ -0,0 +1,98 @@
'use client'
import { ApiEndpoint, CodeBlock } from '@/components/DevPortalLayout'
export function MonitoringLibrariesSection() {
return (
<>
<h2>Monitoring</h2>
<p>Post-Market-Surveillance: Monitoring-Ereignisse erfassen und verfolgen.</p>
<ApiEndpoint method="POST" path="/sdk/v1/iace/projects/:id/monitoring" description="Monitoring-Ereignis erstellen" />
<CodeBlock language="bash" filename="cURL">
{`curl -X POST "https://api.breakpilot.io/sdk/v1/iace/projects/proj_a1b2c3d4/monitoring" \\
-H "Authorization: Bearer YOUR_API_KEY" \\
-H "Content-Type: application/json" \\
-d '{
"event_type": "incident",
"title": "Schutzgitter-Sensor Fehlausloesung",
"description": "Sicherheitssensor hat ohne erkennbaren Grund ausgeloest",
"severity": "medium",
"occurred_at": "2026-03-15T14:30:00Z"
}'`}
</CodeBlock>
<h3>Response (201 Created)</h3>
<CodeBlock language="json" filename="Response">
{`{
"success": true,
"data": {
"id": "mon_evt001",
"event_type": "incident",
"title": "Schutzgitter-Sensor Fehlausloesung",
"severity": "medium",
"status": "open",
"occurred_at": "2026-03-15T14:30:00Z",
"created_at": "2026-03-16T08:00:00Z"
}
}`}
</CodeBlock>
<ApiEndpoint method="GET" path="/sdk/v1/iace/projects/:id/monitoring" description="Monitoring-Ereignisse auflisten" />
<ApiEndpoint method="PUT" path="/sdk/v1/iace/projects/:id/monitoring/:eid" description="Monitoring-Ereignis aktualisieren" />
<h2>Libraries (projektunabhaengig)</h2>
<p>
Stammdaten-Bibliotheken fuer die Gefahrenanalyse. Diese Endpoints sind
projektunabhaengig und liefern die Referenzdaten fuer die gesamte IACE-Engine.
</p>
<ApiEndpoint method="GET" path="/sdk/v1/iace/hazard-library" description="Gefahrenbibliothek (102 Eintraege)" />
<CodeBlock language="bash" filename="cURL">
{`curl -X GET "https://api.breakpilot.io/sdk/v1/iace/hazard-library" \\
-H "Authorization: Bearer YOUR_API_KEY"`}
</CodeBlock>
<h3>Response (200 OK)</h3>
<CodeBlock language="json" filename="Response">
{`{
"success": true,
"data": [
{
"id": "HP001",
"title": "Crushing hazard from closing mechanisms",
"category": "mechanical",
"iso_reference": "ISO 12100 Anhang A.1",
"typical_components": ["actuator", "press", "clamp"],
"severity_range": "medium-critical"
},
{
"id": "HP045",
"title": "Electric shock from exposed conductors",
"category": "electrical",
"iso_reference": "ISO 12100 Anhang A.2",
"typical_components": ["power_supply", "motor", "controller"],
"severity_range": "high-critical"
}
],
"meta": {
"total": 102,
"categories": { "mechanical": 28, "electrical": 15, "thermal": 10, "noise": 8, "vibration": 7, "radiation": 9, "materials": 12, "ergonomic": 13 }
}
}`}
</CodeBlock>
<ApiEndpoint method="GET" path="/sdk/v1/iace/controls-library" description="Controls-Bibliothek" />
<ApiEndpoint method="GET" path="/sdk/v1/iace/component-library" description="Komponentenbibliothek (C001-C120)" />
<ApiEndpoint method="GET" path="/sdk/v1/iace/energy-sources" description="Energiequellen (EN01-EN20)" />
<ApiEndpoint method="GET" path="/sdk/v1/iace/lifecycle-phases" description="ISO 12100 Lebenszyklusphasen" />
<ApiEndpoint method="GET" path="/sdk/v1/iace/roles" description="Betroffene Personenrollen" />
<ApiEndpoint method="GET" path="/sdk/v1/iace/evidence-types" description="Evidenz-Typen" />
<ApiEndpoint method="GET" path="/sdk/v1/iace/protective-measures-library" description="Schutzmassnahmen-Bibliothek" />
<ApiEndpoint method="GET" path="/sdk/v1/iace/hazard-patterns" description="Hazard-Pattern-Katalog" />
<ApiEndpoint method="GET" path="/sdk/v1/iace/tags" description="Tag-Taxonomie" />
</>
)
}

View File

@@ -0,0 +1,57 @@
'use client'
import { ApiEndpoint, CodeBlock } from '@/components/DevPortalLayout'
export function OnboardingSection() {
return (
<>
<h2>Onboarding</h2>
<p>Initialisierung aus Firmenprofil und Vollstaendigkeitspruefung.</p>
<ApiEndpoint method="POST" path="/sdk/v1/iace/projects/:id/init-from-profile" description="Projekt aus Company Profile und Compliance Scope initialisieren" />
<CodeBlock language="bash" filename="cURL">
{`curl -X POST "https://api.breakpilot.io/sdk/v1/iace/projects/proj_a1b2c3d4/init-from-profile" \\
-H "Authorization: Bearer YOUR_API_KEY"`}
</CodeBlock>
<h3>Response (200 OK)</h3>
<CodeBlock language="json" filename="Response">
{`{
"success": true,
"data": {
"initialized_fields": ["manufacturer", "description", "machine_type"],
"suggested_regulations": ["machinery_regulation", "low_voltage", "emc"],
"message": "Projekt aus Firmenprofil initialisiert. 3 Felder uebernommen."
}
}`}
</CodeBlock>
<ApiEndpoint method="POST" path="/sdk/v1/iace/projects/:id/completeness-check" description="Vollstaendigkeitspruefung (25 Gates) durchfuehren" />
<CodeBlock language="bash" filename="cURL">
{`curl -X POST "https://api.breakpilot.io/sdk/v1/iace/projects/proj_a1b2c3d4/completeness-check" \\
-H "Authorization: Bearer YOUR_API_KEY"`}
</CodeBlock>
<h3>Response (200 OK)</h3>
<CodeBlock language="json" filename="Response">
{`{
"success": true,
"data": {
"score": 72,
"total_gates": 25,
"passed_gates": 18,
"gates": [
{ "id": "G01", "name": "Maschinenidentifikation", "status": "passed" },
{ "id": "G02", "name": "Komponentenliste", "status": "passed" },
{ "id": "G03", "name": "Regulatorische Klassifizierung", "status": "passed" },
{ "id": "G04", "name": "Gefahrenanalyse", "status": "warning", "message": "3 Gefahren ohne Massnahmen" },
{ "id": "G05", "name": "Risikobewertung", "status": "failed", "message": "5 Gefahren nicht bewertet" }
]
}
}`}
</CodeBlock>
</>
)
}

View File

@@ -0,0 +1,88 @@
'use client'
import { ApiEndpoint, CodeBlock, ParameterTable } from '@/components/DevPortalLayout'
export function ProjectManagementSection() {
return (
<>
<h2>Project Management</h2>
<p>Erstellen und verwalten Sie IACE-Projekte fuer einzelne Maschinen oder Produkte.</p>
<ApiEndpoint method="POST" path="/sdk/v1/iace/projects" description="Neues IACE-Projekt erstellen" />
<h3>Request Body</h3>
<ParameterTable
parameters={[
{ name: 'machine_name', type: 'string', required: true, description: 'Name der Maschine / des Produkts' },
{ name: 'machine_type', type: 'string', required: true, description: 'Maschinentyp (z.B. "CNC-Fraesmaschine", "Industrieroboter")' },
{ name: 'manufacturer', type: 'string', required: false, description: 'Hersteller-Name' },
{ name: 'description', type: 'string', required: false, description: 'Beschreibung des Produkts und seiner Einsatzzwecke' },
]}
/>
<CodeBlock language="bash" filename="cURL">
{`curl -X POST "https://api.breakpilot.io/sdk/v1/iace/projects" \\
-H "Authorization: Bearer YOUR_API_KEY" \\
-H "Content-Type: application/json" \\
-d '{
"machine_name": "RoboArm X500",
"machine_type": "Industrieroboter",
"manufacturer": "TechCorp GmbH",
"description": "6-Achsen-Industrieroboter fuer Montagearbeiten"
}'`}
</CodeBlock>
<h3>Response (201 Created)</h3>
<CodeBlock language="json" filename="Response">
{`{
"success": true,
"data": {
"id": "proj_a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"machine_name": "RoboArm X500",
"machine_type": "Industrieroboter",
"manufacturer": "TechCorp GmbH",
"description": "6-Achsen-Industrieroboter fuer Montagearbeiten",
"status": "draft",
"completeness_score": 0,
"created_at": "2026-03-16T10:00:00Z"
}
}`}
</CodeBlock>
<ApiEndpoint method="GET" path="/sdk/v1/iace/projects" description="Alle Projekte des Tenants auflisten" />
<CodeBlock language="bash" filename="cURL">
{`curl -X GET "https://api.breakpilot.io/sdk/v1/iace/projects" \\
-H "Authorization: Bearer YOUR_API_KEY"`}
</CodeBlock>
<h3>Response (200 OK)</h3>
<CodeBlock language="json" filename="Response">
{`{
"success": true,
"data": [
{
"id": "proj_a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"machine_name": "RoboArm X500",
"machine_type": "Industrieroboter",
"status": "in_progress",
"completeness_score": 72,
"hazard_count": 14,
"created_at": "2026-03-16T10:00:00Z"
}
]
}`}
</CodeBlock>
<ApiEndpoint method="GET" path="/sdk/v1/iace/projects/:id" description="Projektdetails inkl. Komponenten und Klassifizierungen laden" />
<CodeBlock language="bash" filename="cURL">
{`curl -X GET "https://api.breakpilot.io/sdk/v1/iace/projects/proj_a1b2c3d4" \\
-H "Authorization: Bearer YOUR_API_KEY"`}
</CodeBlock>
<ApiEndpoint method="PUT" path="/sdk/v1/iace/projects/:id" description="Projektfelder aktualisieren" />
<ApiEndpoint method="DELETE" path="/sdk/v1/iace/projects/:id" description="Projekt archivieren (Soft Delete)" />
</>
)
}

View File

@@ -0,0 +1,54 @@
'use client'
import { ApiEndpoint, CodeBlock } from '@/components/DevPortalLayout'
export function RegulatoryClassificationSection() {
return (
<>
<h2>Regulatory Classification</h2>
<p>Automatische Klassifizierung nach anwendbaren Regulierungen (Maschinenverordnung, Niederspannung, EMV, etc.).</p>
<ApiEndpoint method="POST" path="/sdk/v1/iace/projects/:id/classify" description="Alle anwendbaren Regulierungen klassifizieren" />
<CodeBlock language="bash" filename="cURL">
{`curl -X POST "https://api.breakpilot.io/sdk/v1/iace/projects/proj_a1b2c3d4/classify" \\
-H "Authorization: Bearer YOUR_API_KEY"`}
</CodeBlock>
<h3>Response (200 OK)</h3>
<CodeBlock language="json" filename="Response">
{`{
"success": true,
"data": {
"classifications": [
{
"regulation": "machinery_regulation",
"title": "Maschinenverordnung (EU) 2023/1230",
"applicable": true,
"confidence": 0.95,
"reason": "Industrieroboter faellt unter Annex I der Maschinenverordnung"
},
{
"regulation": "low_voltage",
"title": "Niederspannungsrichtlinie 2014/35/EU",
"applicable": true,
"confidence": 0.88,
"reason": "Betriebsspannung 400V AC"
},
{
"regulation": "ai_act",
"title": "AI Act (EU) 2024/1689",
"applicable": false,
"confidence": 0.72,
"reason": "Keine KI-Komponente identifiziert"
}
]
}
}`}
</CodeBlock>
<ApiEndpoint method="GET" path="/sdk/v1/iace/projects/:id/classifications" description="Klassifizierungsergebnisse abrufen" />
<ApiEndpoint method="POST" path="/sdk/v1/iace/projects/:id/classify/:regulation" description="Einzelne Regulierung klassifizieren" />
</>
)
}

View File

@@ -0,0 +1,95 @@
'use client'
import { ApiEndpoint, CodeBlock, ParameterTable } from '@/components/DevPortalLayout'
export function RiskAssessmentSection() {
return (
<>
<h2>Risk Assessment</h2>
<p>
4-Faktor-Risikobewertung nach ISO 12100 mit den Parametern Schwere (S),
Exposition (E), Eintrittswahrscheinlichkeit (P) und Vermeidbarkeit (A).
</p>
<ApiEndpoint method="POST" path="/sdk/v1/iace/projects/:id/hazards/:hid/assess" description="Risiko bewerten (S/E/P/A, Inherent Risk, C_eff, Residual Risk)" />
<h3>Request Body</h3>
<ParameterTable
parameters={[
{ name: 'severity', type: 'number (1-4)', required: true, description: 'Schwere: 1=gering, 2=mittel, 3=schwer, 4=toedlich' },
{ name: 'exposure', type: 'number (1-4)', required: true, description: 'Exposition: 1=selten, 2=gelegentlich, 3=haeufig, 4=dauernd' },
{ name: 'probability', type: 'number (1-4)', required: true, description: 'Eintrittswahrscheinlichkeit: 1=unwahrscheinlich, 2=moeglich, 3=wahrscheinlich, 4=sehr wahrscheinlich' },
{ name: 'avoidance', type: 'number (1-4)', required: true, description: 'Vermeidbarkeit: 1=leicht, 2=moeglich, 3=schwer, 4=unmoeglich' },
]}
/>
<CodeBlock language="bash" filename="cURL">
{`curl -X POST "https://api.breakpilot.io/sdk/v1/iace/projects/proj_a1b2c3d4/hazards/haz_5678/assess" \\
-H "Authorization: Bearer YOUR_API_KEY" \\
-H "Content-Type: application/json" \\
-d '{
"severity": 4,
"exposure": 3,
"probability": 2,
"avoidance": 3
}'`}
</CodeBlock>
<h3>Response (200 OK)</h3>
<CodeBlock language="json" filename="Response">
{`{
"success": true,
"data": {
"hazard_id": "haz_5678",
"severity": 4,
"exposure": 3,
"probability": 2,
"avoidance": 3,
"inherent_risk": 12,
"risk_level": "high",
"c_eff": 0.65,
"residual_risk": 4.2,
"residual_risk_level": "medium",
"risk_acceptable": false,
"recommendation": "Zusaetzliche Schutzmassnahmen erforderlich. 3-Stufen-Hierarchie anwenden."
}
}`}
</CodeBlock>
<ApiEndpoint method="GET" path="/sdk/v1/iace/projects/:id/risk-summary" description="Aggregierte Risikouebersicht des Projekts" />
<CodeBlock language="bash" filename="cURL">
{`curl -X GET "https://api.breakpilot.io/sdk/v1/iace/projects/proj_a1b2c3d4/risk-summary" \\
-H "Authorization: Bearer YOUR_API_KEY"`}
</CodeBlock>
<h3>Response (200 OK)</h3>
<CodeBlock language="json" filename="Response">
{`{
"success": true,
"data": {
"total_hazards": 14,
"assessed": 12,
"unassessed": 2,
"risk_distribution": {
"critical": 1,
"high": 4,
"medium": 5,
"low": 2
},
"residual_risk_distribution": {
"critical": 0,
"high": 1,
"medium": 3,
"low": 8
},
"average_c_eff": 0.71,
"overall_risk_acceptable": false
}
}`}
</CodeBlock>
<ApiEndpoint method="POST" path="/sdk/v1/iace/projects/:id/hazards/:hid/reassess" description="Risiko nach Massnahmen-Umsetzung neu bewerten" />
</>
)
}

View File

@@ -0,0 +1,72 @@
'use client'
import { ApiEndpoint, CodeBlock, InfoBox, ParameterTable } from '@/components/DevPortalLayout'
export function TechFileSection() {
return (
<>
<h2>CE Technical File</h2>
<p>
LLM-gestuetzte Generierung der Technischen Dokumentation (CE Technical File).
Die API generiert alle erforderlichen Abschnitte basierend auf den Projektdaten.
</p>
<InfoBox type="info" title="LLM-Generierung">
Die Generierung verwendet einen LLM-Service (qwen3:30b-a3b oder claude-sonnet-4-5)
fuer kontextbasierte Texterstellung. Alle generierten Abschnitte muessen vor der
Freigabe manuell geprueft werden (Human Oversight).
</InfoBox>
<ApiEndpoint method="POST" path="/sdk/v1/iace/projects/:id/tech-file/generate" description="Alle Tech-File-Abschnitte generieren (LLM-basiert)" />
<CodeBlock language="bash" filename="cURL">
{`curl -X POST "https://api.breakpilot.io/sdk/v1/iace/projects/proj_a1b2c3d4/tech-file/generate" \\
-H "Authorization: Bearer YOUR_API_KEY"`}
</CodeBlock>
<h3>Response (200 OK)</h3>
<CodeBlock language="json" filename="Response">
{`{
"success": true,
"data": {
"sections_generated": 8,
"sections": [
{ "section": "general_description", "title": "Allgemeine Beschreibung", "status": "generated", "word_count": 450 },
{ "section": "risk_assessment", "title": "Risikobeurteilung", "status": "generated", "word_count": 1200 },
{ "section": "safety_requirements", "title": "Sicherheitsanforderungen", "status": "generated", "word_count": 800 },
{ "section": "verification_results", "title": "Verifizierungsergebnisse", "status": "generated", "word_count": 600 }
],
"total_word_count": 4850,
"generation_time_ms": 12500
}
}`}
</CodeBlock>
<ApiEndpoint method="GET" path="/sdk/v1/iace/projects/:id/tech-file" description="Alle Tech-File-Abschnitte auflisten" />
<ApiEndpoint method="PUT" path="/sdk/v1/iace/projects/:id/tech-file/:section" description="Abschnitt-Inhalt manuell aktualisieren" />
<ApiEndpoint method="POST" path="/sdk/v1/iace/projects/:id/tech-file/:section/approve" description="Abschnitt freigeben (Human Oversight)" />
<ApiEndpoint method="POST" path="/sdk/v1/iace/projects/:id/tech-file/:section/generate" description="Einzelnen Abschnitt (neu) generieren via LLM" />
<ApiEndpoint method="GET" path="/sdk/v1/iace/projects/:id/tech-file/export?format=pdf|xlsx|docx|md|json" description="Tech File exportieren" />
<h3>Export-Formate</h3>
<ParameterTable
parameters={[
{ name: 'format', type: 'string', required: true, description: 'Export-Format: "pdf", "xlsx", "docx", "md", "json"' },
]}
/>
<CodeBlock language="bash" filename="cURL">
{`# PDF Export
curl -X GET "https://api.breakpilot.io/sdk/v1/iace/projects/proj_a1b2c3d4/tech-file/export?format=pdf" \\
-H "Authorization: Bearer YOUR_API_KEY" \\
-o technical-file.pdf
# Markdown Export
curl -X GET "https://api.breakpilot.io/sdk/v1/iace/projects/proj_a1b2c3d4/tech-file/export?format=md" \\
-H "Authorization: Bearer YOUR_API_KEY" \\
-o technical-file.md`}
</CodeBlock>
</>
)
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,123 @@
import { InfoBox } from '@/components/DevPortalLayout'
export function AuditApiSummarySection() {
return (
<>
<h2 id="audit">10. Audit-Trail: Vollstaendige Nachvollziehbarkeit</h2>
<p>
Jede Aktion im Namespace wird revisionssicher im <strong>Audit-Log</strong> gespeichert.
</p>
<div className="not-prose my-4 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Event</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Was protokolliert wird</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr><td className="px-4 py-3 font-medium">upload</td><td className="px-4 py-3">Dokument hochgeladen (Dateigroesse, Metadaten, Zeitstempel)</td></tr>
<tr><td className="px-4 py-3 font-medium">index</td><td className="px-4 py-3">Referenzdokument indexiert (Anzahl Chunks, Dauer)</td></tr>
<tr><td className="px-4 py-3 font-medium">rag_query</td><td className="px-4 py-3">RAG-Suchanfrage ausgefuehrt (Query-Hash, Anzahl Ergebnisse)</td></tr>
<tr><td className="px-4 py-3 font-medium">analyze</td><td className="px-4 py-3">KI-Verarbeitung gestartet (Dokument-Token, Modell, Dauer)</td></tr>
<tr><td className="px-4 py-3 font-medium">share</td><td className="px-4 py-3">Namespace mit anderem Nutzer geteilt (Empfaenger, Rolle)</td></tr>
<tr><td className="px-4 py-3 font-medium">revoke_share</td><td className="px-4 py-3">Zugriff widerrufen (wer, wann)</td></tr>
<tr><td className="px-4 py-3 font-medium">decrypt</td><td className="px-4 py-3">Ergebnis entschluesselt (durch wen, Zeitstempel)</td></tr>
<tr><td className="px-4 py-3 font-medium">delete</td><td className="px-4 py-3">Dokument geloescht (Soft Delete, bleibt in Logs)</td></tr>
</tbody>
</table>
</div>
<h2 id="api">11. API-Endpunkte (SDK-Referenz)</h2>
<p>Authentifizierung erfolgt ueber API-Key + JWT-Token.</p>
<h3>11.1 Namespace-Verwaltung</h3>
<div className="not-prose my-4 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Methode</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Endpunkt</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Beschreibung</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr><td className="px-4 py-3"><span className="px-2 py-0.5 rounded bg-blue-100 text-blue-800 text-xs font-bold">POST</span></td><td className="px-4 py-3 font-mono text-sm">/api/v1/namespace/upload</td><td className="px-4 py-3">Verschluesseltes Dokument hochladen</td></tr>
<tr><td className="px-4 py-3"><span className="px-2 py-0.5 rounded bg-green-100 text-green-800 text-xs font-bold">GET</span></td><td className="px-4 py-3 font-mono text-sm">/api/v1/namespace/documents</td><td className="px-4 py-3">Eigene Dokumente auflisten</td></tr>
<tr><td className="px-4 py-3"><span className="px-2 py-0.5 rounded bg-green-100 text-green-800 text-xs font-bold">GET</span></td><td className="px-4 py-3 font-mono text-sm">/api/v1/namespace/documents/{'{id}'}</td><td className="px-4 py-3">Einzelnes Dokument abrufen</td></tr>
<tr><td className="px-4 py-3"><span className="px-2 py-0.5 rounded bg-red-100 text-red-800 text-xs font-bold">DELETE</span></td><td className="px-4 py-3 font-mono text-sm">/api/v1/namespace/documents/{'{id}'}</td><td className="px-4 py-3">Dokument loeschen (Soft Delete)</td></tr>
</tbody>
</table>
</div>
<h3>11.2 Referenzdokumente &amp; RAG</h3>
<div className="not-prose my-4 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Methode</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Endpunkt</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Beschreibung</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr><td className="px-4 py-3"><span className="px-2 py-0.5 rounded bg-blue-100 text-blue-800 text-xs font-bold">POST</span></td><td className="px-4 py-3 font-mono text-sm">/api/v1/namespace/references/upload</td><td className="px-4 py-3">Referenzdokument hochladen</td></tr>
<tr><td className="px-4 py-3"><span className="px-2 py-0.5 rounded bg-blue-100 text-blue-800 text-xs font-bold">POST</span></td><td className="px-4 py-3 font-mono text-sm">/api/v1/namespace/references/{'{id}'}/index</td><td className="px-4 py-3">Referenz fuer RAG indexieren</td></tr>
<tr><td className="px-4 py-3"><span className="px-2 py-0.5 rounded bg-blue-100 text-blue-800 text-xs font-bold">POST</span></td><td className="px-4 py-3 font-mono text-sm">/api/v1/namespace/rag-query</td><td className="px-4 py-3">RAG-Suchanfrage ausfuehren</td></tr>
<tr><td className="px-4 py-3"><span className="px-2 py-0.5 rounded bg-blue-100 text-blue-800 text-xs font-bold">POST</span></td><td className="px-4 py-3 font-mono text-sm">/api/v1/namespace/analyze</td><td className="px-4 py-3">KI-Verarbeitung anstossen</td></tr>
</tbody>
</table>
</div>
<h3>11.3 Key Sharing</h3>
<div className="not-prose my-4 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Methode</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Endpunkt</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Beschreibung</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr><td className="px-4 py-3"><span className="px-2 py-0.5 rounded bg-blue-100 text-blue-800 text-xs font-bold">POST</span></td><td className="px-4 py-3 font-mono text-sm">/api/v1/namespace/share</td><td className="px-4 py-3">Namespace mit anderem Nutzer teilen</td></tr>
<tr><td className="px-4 py-3"><span className="px-2 py-0.5 rounded bg-green-100 text-green-800 text-xs font-bold">GET</span></td><td className="px-4 py-3 font-mono text-sm">/api/v1/namespace/shares</td><td className="px-4 py-3">Aktive Shares auflisten</td></tr>
<tr><td className="px-4 py-3"><span className="px-2 py-0.5 rounded bg-red-100 text-red-800 text-xs font-bold">DELETE</span></td><td className="px-4 py-3 font-mono text-sm">/api/v1/namespace/shares/{'{shareId}'}</td><td className="px-4 py-3">Zugriff widerrufen</td></tr>
<tr><td className="px-4 py-3"><span className="px-2 py-0.5 rounded bg-green-100 text-green-800 text-xs font-bold">GET</span></td><td className="px-4 py-3 font-mono text-sm">/api/v1/namespace/shared-with-me</td><td className="px-4 py-3">Mit mir geteilte Namespaces</td></tr>
</tbody>
</table>
</div>
<h2 id="zusammenfassung">12. Zusammenfassung: Compliance-Garantien</h2>
<div className="not-prose my-6 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Garantie</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Wie umgesetzt</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Regelwerk</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr><td className="px-4 py-3 font-medium">Keine PII verlaesst das Kundensystem</td><td className="px-4 py-3">Header-Redaction + verschluesselte Identity-Map</td><td className="px-4 py-3">DSGVO Art. 4 Nr. 5</td></tr>
<tr><td className="px-4 py-3 font-medium">Betreiber kann nicht mitlesen</td><td className="px-4 py-3">Client-seitige AES-256-GCM Verschluesselung</td><td className="px-4 py-3">DSGVO Art. 32</td></tr>
<tr><td className="px-4 py-3 font-medium">Kein Zugriff durch andere Kunden</td><td className="px-4 py-3">Tenant-Isolation (Namespace) auf allen 3 Ebenen</td><td className="px-4 py-3">DSGVO Art. 25</td></tr>
<tr><td className="px-4 py-3 font-medium">Kein KI-Training mit Kundendaten</td><td className="px-4 py-3"><code>training_allowed: false</code> auf allen Vektoren</td><td className="px-4 py-3">AI Act Art. 10</td></tr>
<tr><td className="px-4 py-3 font-medium">Alles nachvollziehbar</td><td className="px-4 py-3">Vollstaendiger Audit-Trail aller Aktionen</td><td className="px-4 py-3">DSGVO Art. 5 Abs. 2</td></tr>
<tr><td className="px-4 py-3 font-medium">Kunde behaelt volle Kontrolle</td><td className="px-4 py-3">Jederzeitiger Widerruf, Loeschung, Datenexport</td><td className="px-4 py-3">DSGVO Art. 17, 20</td></tr>
</tbody>
</table>
</div>
<InfoBox type="success" title="Das Wichtigste in einem Satz">
Die Namespace-Technologie ermoeglicht KI-gestuetzte Datenverarbeitung in der Cloud, bei der
<strong> keine personenbezogenen Daten das Kundensystem verlassen</strong>, alle Daten
<strong> Ende-zu-Ende verschluesselt</strong> sind, jeder Kunde seinen
<strong> eigenen abgeschotteten Namespace</strong> hat, und ein
<strong> vollstaendiger Audit-Trail</strong> jede Aktion dokumentiert.
</InfoBox>
</>
)
}

View File

@@ -0,0 +1,86 @@
import { CodeBlock, InfoBox } from '@/components/DevPortalLayout'
export function ByoehIntroSection() {
return (
<>
<h2 id="einfuehrung">1. Was ist die Namespace-Technologie?</h2>
<p>
Unsere <strong>Namespace-Technologie</strong> (intern BYOEH -- Bring Your Own Expectation Horizon)
ist eine Privacy-First-Architektur, die es Geschaeftskunden ermoeglicht, <strong>sensible Daten
anonym und verschluesselt</strong> von KI-Services in der Cloud verarbeiten zu lassen -- ohne dass
personenbezogene Informationen jemals den Client verlassen.
</p>
<blockquote>
<em>&ldquo;Daten gehen pseudonymisiert und verschluesselt in die Cloud, werden dort
von KI verarbeitet, und kommen verarbeitet zurueck. Nur der Kunde kann die Ergebnisse
wieder den Originaldaten zuordnen -- denn nur sein System hat den Schluessel dafuer.&rdquo;</em>
</blockquote>
<p>Die Architektur basiert auf vier Bausteinen:</p>
<ol>
<li><strong>Pseudonymisierung:</strong> Personenbezogene Daten werden durch zufaellige Tokens ersetzt. Nur der Kunde kennt die Zuordnung.</li>
<li><strong>Client-seitige Verschluesselung:</strong> Alle Daten werden <em>auf dem System des Kunden</em> verschluesselt, bevor sie die Infrastruktur verlassen.</li>
<li><strong>Namespace-Isolation:</strong> Jeder Kunde erhaelt einen eigenen, vollstaendig abgeschotteten Namespace.</li>
<li><strong>KI-Verarbeitung in der Cloud:</strong> Die KI arbeitet mit den pseudonymisierten Daten. Ergebnisse gehen zurueck an den Kunden zur lokalen Entschluesselung.</li>
</ol>
<InfoBox type="info" title="Kern-Designprinzip: Operator Blindness">
<strong>Breakpilot kann die Kundendaten nicht lesen.</strong> Der Server sieht nur
verschluesselte Blobs und einen Schluessel-Hash (nicht den Schluessel selbst). Die
Passphrase zum Entschluesseln existiert <em>ausschliesslich</em> auf dem System des Kunden.
</InfoBox>
<h2 id="anwendungsfaelle">2. Typische Anwendungsfaelle</h2>
<div className="not-prose my-6 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Branche</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Anwendungsfall</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Sensible Daten</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr><td className="px-4 py-3 font-medium">Bildung</td><td className="px-4 py-3">KI-gestuetzte Klausurkorrektur</td><td className="px-4 py-3">Schuelernamen, Noten, Leistungsdaten</td></tr>
<tr><td className="px-4 py-3 font-medium">Gesundheitswesen</td><td className="px-4 py-3">Medizinische Befundanalyse</td><td className="px-4 py-3">Patientennamen, Diagnosen, Befunde</td></tr>
<tr><td className="px-4 py-3 font-medium">Recht</td><td className="px-4 py-3">Vertragsanalyse, Due Diligence</td><td className="px-4 py-3">Mandantendaten, Vertragsinhalte</td></tr>
<tr><td className="px-4 py-3 font-medium">Personalwesen</td><td className="px-4 py-3">Bewerbungsscreening, Zeugnisanalyse</td><td className="px-4 py-3">Bewerberdaten, Gehaltsinformationen</td></tr>
<tr><td className="px-4 py-3 font-medium">Finanzwesen</td><td className="px-4 py-3">Dokumentenpruefung, Compliance-Checks</td><td className="px-4 py-3">Kontodaten, Transaktionen, Identitaeten</td></tr>
</tbody>
</table>
</div>
<h2 id="ablauf">3. Der komplette Ablauf im Ueberblick</h2>
<CodeBlock language="text" filename="Workflow: Vom Quelldokument zur KI-verarbeiteten Ausgabe">
{`SCHRITT 1: DOKUMENTE ERFASSEN & PSEUDONYMISIEREN
SDK empfaengt Dokumente (PDF, Bild, Text)
→ Personenbezogene Daten werden erkannt (Header, Namen, IDs)
→ PII wird durch zufaellige Tokens ersetzt (doc_token, UUID4)
→ Zuordnung "Token → Originalname" wird lokal gesichert
SCHRITT 2: CLIENT-SEITIGE VERSCHLUESSELUNG
Kunde konfiguriert eine Passphrase im SDK
→ SDK leitet daraus einen 256-Bit-Schluessel ab (PBKDF2, 100k Runden)
→ Dokumente werden mit AES-256-GCM verschluesselt
→ Nur der Hash des Schluessels wird an den Server gesendet
SCHRITT 3: IDENTITAETS-MAP SICHERN
→ Nur mit der Passphrase des Kunden rekonstruierbar
SCHRITT 4: UPLOAD IN DEN KUNDEN-NAMESPACE
→ Jeder Kunde hat eine eigene tenant_id
→ Daten werden in MinIO (Storage) + Qdrant (Vektoren) gespeichert
SCHRITT 5: KI-VERARBEITUNG IN DER CLOUD
→ RAG-System durchsucht Referenzdokumente des Kunden
→ KI generiert Ergebnisse basierend auf Kundenkontext
SCHRITT 6: ERGEBNISSE ZURUECK
→ SDK entschluesselt die Ergebnisse mit der Passphrase
SCHRITT 7: RE-IDENTIFIZIERUNG & FINALISIERUNG
→ Identitaets-Map wird entschluesselt
→ Tokens werden wieder den echten Datensaetzen zugeordnet`}
</CodeBlock>
</>
)
}

View File

@@ -0,0 +1,110 @@
import { CodeBlock, InfoBox } from '@/components/DevPortalLayout'
export function EncryptionNamespaceSection() {
return (
<>
<h2 id="verschluesselung">6. Ende-zu-Ende-Verschluesselung</h2>
<p>
Die Verschluesselung findet <strong>vollstaendig auf dem System des Kunden</strong> statt --
der Cloud-Server bekommt nur verschluesselte Daten zu sehen.
</p>
<h3>6.1 Der Verschluesselungsvorgang</h3>
<CodeBlock language="text" filename="Client-seitige Verschluesselung (im SDK)">
{`┌─────────────────────────────────────────────────────────────────┐
│ System des Kunden (SDK) │
├─────────────────────────────────────────────────────────────────┤
│ 1. Kunde konfiguriert Passphrase im SDK │
│ → Passphrase bleibt hier -- wird NIE gesendet │
│ │
│ 2. Schluessel-Ableitung: │
│ PBKDF2-SHA256(Passphrase, zufaelliger Salt, 100.000 Runden) │
│ → Ergebnis: 256-Bit-Schluessel (32 Bytes) │
│ │
│ 3. Verschluesselung: │
│ AES-256-GCM(Schluessel, zufaelliger IV, Dokument) │
│ → GCM: Garantiert Integritaet (Manipulation erkennbar) │
│ │
│ 4. Schluessel-Hash: │
│ SHA-256(abgeleiteter Schluessel) → Hash fuer Verifikation │
│ → Vom Hash kann der Schluessel NICHT zurueckberechnet werden│
│ │
│ 5. Upload: Nur diese Daten gehen an den Cloud-Server: │
│ • Verschluesselter Blob • Salt • IV • Schluessel-Hash │
│ │
│ Was NICHT an den Server geht: │
│ ✗ Passphrase ✗ Abgeleiteter Schluessel ✗ Klartext │
└─────────────────────────────────────────────────────────────────┘`}
</CodeBlock>
<h3>6.2 Sicherheitsgarantien</h3>
<div className="not-prose my-6 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Angriffsszenario</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Was der Angreifer sieht</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Ergebnis</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr><td className="px-4 py-3 font-medium">Cloud-Server wird gehackt</td><td className="px-4 py-3">Verschluesselte Blobs + Hashes</td><td className="px-4 py-3 text-green-700 font-medium">Keine lesbaren Dokumente</td></tr>
<tr><td className="px-4 py-3 font-medium">Datenbank wird geleakt</td><td className="px-4 py-3">encrypted_identity_map (verschluesselt)</td><td className="px-4 py-3 text-green-700 font-medium">Keine personenbezogenen Daten</td></tr>
<tr><td className="px-4 py-3 font-medium">Netzwerkverkehr abgefangen</td><td className="px-4 py-3">Verschluesselte Daten (TLS + AES)</td><td className="px-4 py-3 text-green-700 font-medium">Doppelt verschluesselt</td></tr>
<tr><td className="px-4 py-3 font-medium">Betreiber (Breakpilot) will mitlesen</td><td className="px-4 py-3">Verschluesselte Blobs, kein Schluessel</td><td className="px-4 py-3 text-green-700 font-medium">Operator Blindness</td></tr>
<tr><td className="px-4 py-3 font-medium">Anderer Kunde versucht Zugriff</td><td className="px-4 py-3">Nichts (Tenant-Isolation)</td><td className="px-4 py-3 text-green-700 font-medium">Namespace blockiert</td></tr>
</tbody>
</table>
</div>
<h2 id="namespace">7. Namespace-Isolation: Jeder Kunde hat seinen eigenen Bereich</h2>
<p>
Ein <strong>Namespace</strong> ist ein vollstaendig abgeschotteter Bereich im System -- wie
<strong> separate Tresorraeume in einer Bank</strong>. Jeder Kunde hat seinen eigenen Raum,
und kein Schluessel passt in einen anderen.
</p>
<CodeBlock language="text" filename="Tenant-Isolation in der Vektordatenbank (Qdrant)">
{`Kunde A (tenant_id: "firma-alpha-001")
├── Dokument 1 (verschluesselt)
└── Referenz: Pruefkriterien 2025
Kunde B (tenant_id: "firma-beta-002")
└── Referenz: Compliance-Vorgaben 2025
Suchanfrage von Kunde A:
→ Suche NUR in tenant_id = "firma-alpha-001"
→ Kunde B's Daten sind UNSICHTBAR
Jede Qdrant-Query hat diesen Pflichtfilter:
must_conditions = [
FieldCondition(key="tenant_id", match="firma-alpha-001")
]`}
</CodeBlock>
<h3>7.2 Drei Ebenen der Isolation</h3>
<div className="not-prose my-6 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Ebene</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">System</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Isolation</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr><td className="px-4 py-3 font-medium">Dateisystem</td><td className="px-4 py-3">MinIO (S3-Storage)</td><td className="px-4 py-3">Eigener Bucket/Pfad pro Kunde</td></tr>
<tr><td className="px-4 py-3 font-medium">Vektordatenbank</td><td className="px-4 py-3">Qdrant</td><td className="px-4 py-3">Pflichtfilter <code>tenant_id</code> bei jeder Suche</td></tr>
<tr><td className="px-4 py-3 font-medium">Metadaten-DB</td><td className="px-4 py-3">PostgreSQL</td><td className="px-4 py-3">Jede Tabelle hat <code>tenant_id</code> als Pflichtfeld</td></tr>
</tbody>
</table>
</div>
<InfoBox type="warning" title="Kein Training mit Kundendaten">
Auf allen Vektoren in Qdrant ist das Flag <code>training_allowed: false</code> gesetzt.
Kundeninhalte werden <strong>ausschliesslich fuer RAG-Suchen</strong> innerhalb des
Kunden-Namespace verwendet.
</InfoBox>
</>
)
}

View File

@@ -0,0 +1,100 @@
import { CodeBlock } from '@/components/DevPortalLayout'
export function RagKeySharingSection() {
return (
<>
<h2 id="rag-pipeline">8. RAG-Pipeline: KI-Verarbeitung mit Kundenkontext</h2>
<p>
Die KI nutzt die vom Kunden hochgeladenen Referenzdokumente als Wissensbasis.
Dieser Prozess heisst <strong>RAG (Retrieval Augmented Generation)</strong>.
</p>
<h3>8.1 Indexierung der Referenzdokumente</h3>
<CodeBlock language="text" filename="Indexierung: Vom Upload zum durchsuchbaren Referenzdokument">
{`Referenzdokument (verschluesselt auf Server)
|
v
┌────────────────────────────────────┐
│ 1. Passphrase-Verifikation │ ← SDK sendet Schluessel-Hash
└──────────┬─────────────────────────┘
v
┌────────────────────────────────────┐
│ 2. Entschluesselung │ ← Temporaer im Arbeitsspeicher
└──────────┬─────────────────────────┘
v
┌────────────────────────────────────┐
│ 3. Text-Extraktion │ ← PDF → Klartext
└──────────┬─────────────────────────┘
v
┌────────────────────────────────────┐
│ 4. Chunking │ ← ~1.000-Zeichen-Abschnitte
└──────────┬─────────────────────────┘
v
┌────────────────────────────────────┐
│ 5. Embedding │ ← Text → 1.536 Zahlen
└──────────┬─────────────────────────┘
v
┌────────────────────────────────────┐
│ 6. Re-Encryption │ ← Jeder Chunk wird erneut verschluesselt
└──────────┬─────────────────────────┘
v
┌────────────────────────────────────┐
│ 7. Qdrant-Indexierung │ ← Vektor + verschluesselter Chunk
│ tenant_id: "firma-alpha-001" │ mit Tenant-Filter gespeichert
│ training_allowed: false │
└────────────────────────────────────┘`}
</CodeBlock>
<h3>8.2 Wie die KI eine Anfrage bearbeitet (RAG-Query)</h3>
<ol>
<li><strong>Anfrage formulieren:</strong> Das SDK sendet eine Suchanfrage mit dem zu verarbeitenden Dokument.</li>
<li><strong>Semantische Suche:</strong> Die Anfrage wird in einen Vektor umgewandelt und gegen die Referenz-Vektoren in Qdrant gesucht -- <em>nur im Namespace des Kunden</em>.</li>
<li><strong>Entschluesselung:</strong> Die gefundenen Chunks werden mit der Passphrase des Kunden entschluesselt.</li>
<li><strong>KI-Antwort:</strong> Die entschluesselten Referenzpassagen werden als Kontext an die KI uebergeben.</li>
</ol>
<h2 id="key-sharing">9. Key Sharing: Zusammenarbeit ermoeglichen</h2>
<p>
Das Key-Sharing-System ermoeglicht es dem Eigentuemer, seinen Namespace sicher mit
anderen zu teilen (z.B. fuer Vier-Augen-Prinzip, Qualitaetskontrolle oder externe Audits).
</p>
<h3>9.1 Einladungs-Workflow</h3>
<CodeBlock language="text" filename="Key Sharing: Sicheres Teilen zwischen Bearbeitern">
{`Eigentuemer Server Eingeladener
│ │ │
│ 1. Einladung senden │ │
│─────────────────────────────────▶ │
│ │ 2. Einladung erstellt │
│ │ (14 Tage gueltig) │
│ │ 3. Benachrichtigung ──────▶│
│ │ 4. Einladung annehmen
│ │◀─────────────────────────────│
│ │ 5. Key-Share erstellt │
│ │ 6. Eingeladener kann ──────▶│
│ │ Daten im Namespace │
│ │ abfragen │
│ 7. Zugriff widerrufen │ │
│─────────────────────────────────▶ Share deaktiviert │`}
</CodeBlock>
<h3>9.2 Rollen beim Key-Sharing</h3>
<div className="not-prose my-4 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Rolle</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Typischer Nutzer</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Rechte</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr><td className="px-4 py-3 font-medium">Owner</td><td className="px-4 py-3">Projektverantwortlicher</td><td className="px-4 py-3">Vollzugriff, kann teilen &amp; widerrufen</td></tr>
<tr><td className="px-4 py-3 font-medium">Reviewer</td><td className="px-4 py-3">Qualitaetssicherung</td><td className="px-4 py-3">Lesen, RAG-Queries, eigene Anmerkungen</td></tr>
<tr><td className="px-4 py-3 font-medium">Auditor</td><td className="px-4 py-3">Externer Pruefer</td><td className="px-4 py-3">Nur Lesen (Aufsichtsfunktion)</td></tr>
</tbody>
</table>
</div>
</>
)
}

View File

@@ -0,0 +1,113 @@
import { CodeBlock, InfoBox } from '@/components/DevPortalLayout'
export function SdkPseudonymSection() {
return (
<>
<h2 id="sdk-integration">4. SDK-Integration</h2>
<CodeBlock language="typescript" filename="Beispiel: SDK-Integration (TypeScript)">
{`import { BreakpilotSDK, NamespaceClient } from '@breakpilot/compliance-sdk'
// 1. SDK initialisieren mit API-Key
const sdk = new BreakpilotSDK({
apiKey: process.env.BREAKPILOT_API_KEY,
endpoint: 'https://api.breakpilot.de'
})
// 2. Namespace-Client erstellen (pro Mandant/Abteilung)
const namespace = sdk.createNamespace({
tenantId: 'kunde-firma-abc',
passphrase: process.env.ENCRYPTION_PASSPHRASE // Bleibt lokal!
})
// 3. Dokument pseudonymisieren & verschluesselt hochladen
const result = await namespace.upload({
file: documentBuffer,
metadata: { type: 'vertrag', category: 'due-diligence' },
pseudonymize: true,
headerRedaction: true
})
// result.docToken = "a7f3c2d1-4e9b-4a5f-8c7d-..."
// 4. Referenzdokument hochladen (z.B. Pruefkriterien)
await namespace.uploadReference({
file: referenceBuffer,
title: 'Pruefkriterien Vertrag Typ A'
})
// 5. KI-Verarbeitung anstossen
const analysis = await namespace.analyze({
docToken: result.docToken,
prompt: 'Pruefe den Vertrag gegen die Referenzkriterien',
useRAG: true
})
// 6. Ergebnisse entschluesseln (passiert automatisch im SDK)
console.log(analysis.findings)
console.log(analysis.score)
// 7. Re-Identifizierung (Token → Originalname)
const identityMap = await namespace.getIdentityMap()
const originalName = identityMap[result.docToken]`}
</CodeBlock>
<InfoBox type="success" title="Zero-Knowledge-Architektur">
Die Passphrase verlässt niemals das System des Kunden. Das SDK verschluesselt
und entschluesselt <strong>ausschliesslich lokal</strong>.
</InfoBox>
<h2 id="pseudonymisierung">5. Pseudonymisierung: Wie personenbezogene Daten entfernt werden</h2>
<h3>5.1 Der doc_token: Ein zufaelliger Identifikator</h3>
<p>
Jedes Dokument erhaelt einen <strong>doc_token</strong> -- einen 128-Bit-Zufallscode im
UUID4-Format. Dieser Token ist <strong>kryptographisch zufaellig</strong>, kann
<strong> nicht zurueckgerechnet</strong> werden und dient als <strong>eindeutiger Schluessel</strong>
fuer die spaetere Re-Identifizierung.
</p>
<h3>5.2 Header-Redaction: PII wird entfernt</h3>
<div className="not-prose my-6 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Methode</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Wie es funktioniert</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Wann verwenden</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr>
<td className="px-4 py-3 font-medium">Einfache Redaction</td>
<td className="px-4 py-3">Definierter Bereich des Dokuments wird entfernt</td>
<td className="px-4 py-3">Standardisierte Formulare mit festem Layout</td>
</tr>
<tr>
<td className="px-4 py-3 font-medium">Smarte Redaction</td>
<td className="px-4 py-3">OpenCV/NER erkennt Textbereiche mit PII und entfernt gezielt</td>
<td className="px-4 py-3">Freitext-Dokumente, variable Layouts</td>
</tr>
</tbody>
</table>
</div>
<h3>5.3 Die Identitaets-Map: Nur der Kunde kennt die Zuordnung</h3>
<CodeBlock language="text" filename="Datenmodell: Namespace-Session (vereinfacht)">
{`NamespaceSession
├── tenant_id = "kunde-firma-abc" ← Pflichtfeld (Isolation)
├── encrypted_identity_map = [verschluesselte Bytes] ← Nur mit Passphrase lesbar
├── identity_map_iv = "a3f2c1..."
└── PseudonymizedDocument (pro Dokument)
├── doc_token = "a7f3c2d1-..." ← Zufaelliger Token (Primary Key)
├── session_id = [Referenz]
└── (Kein Name, keine personenbezogenen Daten)`}
</CodeBlock>
<InfoBox type="success" title="DSGVO Art. 4 Nr. 5 konform">
Die Pseudonymisierung erfuellt die Definition der DSGVO: Personenbezogene Daten
koennen <strong>ohne Hinzuziehung zusaetzlicher Informationen</strong>
(der verschluesselten Identitaets-Map + der Passphrase) nicht mehr einer bestimmten Person zugeordnet werden.
</InfoBox>
</>
)
}

View File

@@ -1,4 +1,9 @@
import { DevPortalLayout, CodeBlock, InfoBox } from '@/components/DevPortalLayout'
import { DevPortalLayout } from '@/components/DevPortalLayout'
import { ByoehIntroSection } from './_components/ByoehIntroSection'
import { SdkPseudonymSection } from './_components/SdkPseudonymSection'
import { EncryptionNamespaceSection } from './_components/EncryptionNamespaceSection'
import { RagKeySharingSection } from './_components/RagKeySharingSection'
import { AuditApiSummarySection } from './_components/AuditApiSummarySection'
export default function BYOEHDocsPage() {
return (
@@ -6,764 +11,11 @@ export default function BYOEHDocsPage() {
title="Namespace-Technologie fuer Geschaeftskunden"
description="Wie das SDK sensible Daten anonymisiert, verschluesselt und sicher in der Cloud verarbeiten laesst -- ohne dass der Betreiber Zugriff auf Klartext hat."
>
{/* ============================================================ */}
{/* 1. EINLEITUNG */}
{/* ============================================================ */}
<h2 id="einfuehrung">1. Was ist die Namespace-Technologie?</h2>
<p>
Unsere <strong>Namespace-Technologie</strong> (intern BYOEH -- Bring Your Own Expectation Horizon)
ist eine Privacy-First-Architektur, die es Geschaeftskunden ermoeglicht, <strong>sensible Daten
anonym und verschluesselt</strong> von KI-Services in der Cloud verarbeiten zu lassen -- ohne dass
personenbezogene Informationen jemals den Client verlassen.
</p>
<blockquote>
<em>&ldquo;Daten gehen pseudonymisiert und verschluesselt in die Cloud, werden dort
von KI verarbeitet, und kommen verarbeitet zurueck. Nur der Kunde kann die Ergebnisse
wieder den Originaldaten zuordnen -- denn nur sein System hat den Schluessel dafuer.&rdquo;</em>
</blockquote>
<p>
Das SDK loest ein grundlegendes Problem fuer Unternehmen: <strong>KI-gestuetzte
Datenverarbeitung ohne Datenschutzrisiko</strong>. Die Architektur basiert auf vier Bausteinen:
</p>
<ol>
<li>
<strong>Pseudonymisierung:</strong> Personenbezogene Daten werden durch zufaellige
Tokens ersetzt. Nur der Kunde kennt die Zuordnung.
</li>
<li>
<strong>Client-seitige Verschluesselung:</strong> Alle Daten werden <em>auf dem System
des Kunden</em> verschluesselt, bevor sie die Infrastruktur verlassen. Der Cloud-Server
sieht nur verschluesselte Blobs.
</li>
<li>
<strong>Namespace-Isolation:</strong> Jeder Kunde erhaelt einen eigenen, vollstaendig
abgeschotteten Namespace. Kein Kunde kann auf Daten eines anderen zugreifen.
</li>
<li>
<strong>KI-Verarbeitung in der Cloud:</strong> Die KI arbeitet mit den pseudonymisierten
Daten und den vom Kunden bereitgestellten Referenzdokumenten. Ergebnisse gehen zurueck
an den Kunden zur lokalen Entschluesselung und Re-Identifizierung.
</li>
</ol>
<InfoBox type="info" title="Kern-Designprinzip: Operator Blindness">
<strong>Breakpilot kann die Kundendaten nicht lesen.</strong> Der Server sieht nur
verschluesselte Blobs und einen Schluessel-Hash (nicht den Schluessel selbst). Die
Passphrase zum Entschluesseln existiert <em>ausschliesslich</em> auf dem System des Kunden
und wird niemals uebertragen. Selbst ein Angriff auf die Cloud-Infrastruktur wuerde keine
Klartextdaten preisgeben.
</InfoBox>
{/* ============================================================ */}
{/* 2. ANWENDUNGSFAELLE */}
{/* ============================================================ */}
<h2 id="anwendungsfaelle">2. Typische Anwendungsfaelle</h2>
<p>
Die Namespace-Technologie ist ueberall einsetzbar, wo sensible Daten von einer KI
verarbeitet werden sollen, ohne den Datenschutz zu gefaehrden:
</p>
<div className="not-prose my-6 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Branche</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Anwendungsfall</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Sensible Daten</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr>
<td className="px-4 py-3 font-medium">Bildung</td>
<td className="px-4 py-3">KI-gestuetzte Klausurkorrektur</td>
<td className="px-4 py-3">Schuelernamen, Noten, Leistungsdaten</td>
</tr>
<tr>
<td className="px-4 py-3 font-medium">Gesundheitswesen</td>
<td className="px-4 py-3">Medizinische Befundanalyse</td>
<td className="px-4 py-3">Patientennamen, Diagnosen, Befunde</td>
</tr>
<tr>
<td className="px-4 py-3 font-medium">Recht</td>
<td className="px-4 py-3">Vertragsanalyse, Due Diligence</td>
<td className="px-4 py-3">Mandantendaten, Vertragsinhalte</td>
</tr>
<tr>
<td className="px-4 py-3 font-medium">Personalwesen</td>
<td className="px-4 py-3">Bewerbungsscreening, Zeugnisanalyse</td>
<td className="px-4 py-3">Bewerberdaten, Gehaltsinformationen</td>
</tr>
<tr>
<td className="px-4 py-3 font-medium">Finanzwesen</td>
<td className="px-4 py-3">Dokumentenpruefung, Compliance-Checks</td>
<td className="px-4 py-3">Kontodaten, Transaktionen, Identitaeten</td>
</tr>
</tbody>
</table>
</div>
{/* ============================================================ */}
{/* 3. DER KOMPLETTE ABLAUF */}
{/* ============================================================ */}
<h2 id="ablauf">3. Der komplette Ablauf im Ueberblick</h2>
<p>
Der Prozess laesst sich in sieben Schritte unterteilen. Die gesamte
Pseudonymisierung und Verschluesselung geschieht auf dem System des Kunden,
bevor Daten in die Cloud gesendet werden:
</p>
<CodeBlock language="text" filename="Workflow: Vom Quelldokument zur KI-verarbeiteten Ausgabe">
{`SCHRITT 1: DOKUMENTE ERFASSEN & PSEUDONYMISIEREN
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
SDK empfaengt Dokumente (PDF, Bild, Text)
→ Personenbezogene Daten werden erkannt (Header, Namen, IDs)
→ PII wird durch zufaellige Tokens ersetzt (doc_token, UUID4)
→ Zuordnung "Token → Originalname" wird lokal gesichert
SCHRITT 2: CLIENT-SEITIGE VERSCHLUESSELUNG
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Kunde konfiguriert eine Passphrase im SDK
→ SDK leitet daraus einen 256-Bit-Schluessel ab (PBKDF2, 100k Runden)
→ Dokumente werden mit AES-256-GCM verschluesselt
→ Nur der Hash des Schluessels wird an den Server gesendet
→ Passphrase und Schluessel verlassen NIEMALS das Kundensystem
SCHRITT 3: IDENTITAETS-MAP SICHERN
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Die Zuordnung "Token → Originaldaten" wird verschluesselt gespeichert:
→ Nur mit der Passphrase des Kunden rekonstruierbar
→ Ohne Passphrase ist keine Re-Identifizierung moeglich
SCHRITT 4: UPLOAD IN DEN KUNDEN-NAMESPACE
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Verschluesselte Dateien gehen in den isolierten Namespace:
→ Jeder Kunde hat eine eigene tenant_id
→ Daten werden in MinIO (Storage) + Qdrant (Vektoren) gespeichert
→ Server sieht: verschluesselter Blob + Schluessel-Hash + Salt
SCHRITT 5: KI-VERARBEITUNG IN DER CLOUD
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
KI verarbeitet die pseudonymisierten Daten:
→ RAG-System durchsucht Referenzdokumente des Kunden
→ KI generiert Ergebnisse basierend auf Kundenkontext
→ Ergebnisse sind an den Namespace gebunden
SCHRITT 6: ERGEBNISSE ZURUECK
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
KI-Ergebnisse gehen an das Kundensystem:
→ SDK entschluesselt die Ergebnisse mit der Passphrase
→ Kunde sieht aufbereitete Ergebnisse im Klartext
SCHRITT 7: RE-IDENTIFIZIERUNG & FINALISIERUNG
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Kunde ordnet Ergebnisse den Originaldaten zu:
→ Identitaets-Map wird entschluesselt
→ Tokens werden wieder den echten Datensaetzen zugeordnet
→ Fertige Ergebnisse stehen im Originalsystem bereit`}
</CodeBlock>
{/* ============================================================ */}
{/* 4. SDK-INTEGRATION */}
{/* ============================================================ */}
<h2 id="sdk-integration">4. SDK-Integration</h2>
<p>
Die Integration in bestehende Systeme erfolgt ueber unser SDK. Nachfolgend ein
vereinfachtes Beispiel, wie ein Kunde das SDK nutzt:
</p>
<CodeBlock language="typescript" filename="Beispiel: SDK-Integration (TypeScript)">
{`import { BreakpilotSDK, NamespaceClient } from '@breakpilot/compliance-sdk'
// 1. SDK initialisieren mit API-Key
const sdk = new BreakpilotSDK({
apiKey: process.env.BREAKPILOT_API_KEY,
endpoint: 'https://api.breakpilot.de'
})
// 2. Namespace-Client erstellen (pro Mandant/Abteilung)
const namespace = sdk.createNamespace({
tenantId: 'kunde-firma-abc',
passphrase: process.env.ENCRYPTION_PASSPHRASE // Bleibt lokal!
})
// 3. Dokument pseudonymisieren & verschluesselt hochladen
const result = await namespace.upload({
file: documentBuffer,
metadata: { type: 'vertrag', category: 'due-diligence' },
pseudonymize: true, // PII automatisch ersetzen
headerRedaction: true // Kopfbereich entfernen
})
// result.docToken = "a7f3c2d1-4e9b-4a5f-8c7d-..."
// 4. Referenzdokument hochladen (z.B. Pruefkriterien)
await namespace.uploadReference({
file: referenceBuffer,
title: 'Pruefkriterien Vertrag Typ A'
})
// 5. KI-Verarbeitung anstossen
const analysis = await namespace.analyze({
docToken: result.docToken,
prompt: 'Pruefe den Vertrag gegen die Referenzkriterien',
useRAG: true
})
// 6. Ergebnisse entschluesseln (passiert automatisch im SDK)
console.log(analysis.findings) // Klartext-Ergebnisse
console.log(analysis.score) // Bewertung
// 7. Re-Identifizierung (Token → Originalname)
const identityMap = await namespace.getIdentityMap()
const originalName = identityMap[result.docToken]`}
</CodeBlock>
<InfoBox type="success" title="Zero-Knowledge-Architektur">
Die Passphrase verlässt niemals das System des Kunden. Das SDK verschluesselt
und entschluesselt <strong>ausschliesslich lokal</strong>. Breakpilot hat zu keinem
Zeitpunkt Zugriff auf Klartextdaten oder den Verschluesselungsschluessel.
</InfoBox>
{/* ============================================================ */}
{/* 5. PSEUDONYMISIERUNG */}
{/* ============================================================ */}
<h2 id="pseudonymisierung">5. Pseudonymisierung: Wie personenbezogene Daten entfernt werden</h2>
<p>
Pseudonymisierung bedeutet: personenbezogene Daten werden durch <strong>zufaellige
Tokens</strong> ersetzt, sodass ohne Zusatzinformation kein Rueckschluss auf die Person
moeglich ist. Das SDK bietet zwei Mechanismen:
</p>
<h3>5.1 Der doc_token: Ein zufaelliger Identifikator</h3>
<p>
Jedes Dokument erhaelt einen <strong>doc_token</strong> -- einen 128-Bit-Zufallscode im
UUID4-Format (z.B. <code>a7f3c2d1-4e9b-4a5f-8c7d-6b2e1f0a9d3c</code>). Dieser Token:
</p>
<ul>
<li>Ist <strong>kryptographisch zufaellig</strong> -- es gibt keinen Zusammenhang zwischen
Token und Originaldatensatz</li>
<li>Kann <strong>nicht zurueckgerechnet</strong> werden -- auch mit Kenntnis des Algorithmus
ist kein Rueckschluss moeglich</li>
<li>Dient als <strong>eindeutiger Schluessel</strong>, um Ergebnisse spaeter dem
Originaldokument zuzuordnen</li>
</ul>
<h3>5.2 Header-Redaction: PII wird entfernt</h3>
<p>
Bei Dokumenten mit erkennbarem Kopfbereich (Namen, Adressen, IDs) kann das SDK diesen
Bereich <strong>automatisch entfernen</strong>. Die Entfernung ist <strong>permanent</strong>:
Die Originaldaten werden nicht an den Server uebermittelt.
</p>
<div className="not-prose my-6 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Methode</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Wie es funktioniert</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Wann verwenden</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr>
<td className="px-4 py-3 font-medium">Einfache Redaction</td>
<td className="px-4 py-3">Definierter Bereich des Dokuments wird entfernt</td>
<td className="px-4 py-3">Standardisierte Formulare mit festem Layout</td>
</tr>
<tr>
<td className="px-4 py-3 font-medium">Smarte Redaction</td>
<td className="px-4 py-3">OpenCV/NER erkennt Textbereiche mit PII und entfernt gezielt</td>
<td className="px-4 py-3">Freitext-Dokumente, variable Layouts</td>
</tr>
</tbody>
</table>
</div>
<h3>5.3 Die Identitaets-Map: Nur der Kunde kennt die Zuordnung</h3>
<p>
Die Zuordnung <em>doc_token Originaldaten</em> wird als <strong>verschluesselte Tabelle</strong>
gespeichert. Das Datenmodell sieht vereinfacht so aus:
</p>
<CodeBlock language="text" filename="Datenmodell: Namespace-Session (vereinfacht)">
{`NamespaceSession
├── tenant_id = "kunde-firma-abc" ← Pflichtfeld (Isolation)
├── encrypted_identity_map = [verschluesselte Bytes] ← Nur mit Passphrase lesbar
├── identity_map_iv = "a3f2c1..." ← Initialisierungsvektor (fuer AES)
└── PseudonymizedDocument (pro Dokument)
├── doc_token = "a7f3c2d1-..." ← Zufaelliger Token (Primary Key)
├── session_id = [Referenz]
└── (Kein Name, keine personenbezogenen Daten)`}
</CodeBlock>
<InfoBox type="success" title="DSGVO Art. 4 Nr. 5 konform">
Die Pseudonymisierung erfuellt die Definition der DSGVO: Personenbezogene Daten
koennen <strong>ohne Hinzuziehung zusaetzlicher Informationen</strong>
(der verschluesselten Identitaets-Map + der Passphrase des Kunden) nicht mehr einer
bestimmten Person zugeordnet werden.
</InfoBox>
{/* ============================================================ */}
{/* 6. VERSCHLUESSELUNG */}
{/* ============================================================ */}
<h2 id="verschluesselung">6. Ende-zu-Ende-Verschluesselung</h2>
<p>
Die Verschluesselung ist das Herzstueck des Datenschutzes. Sie findet <strong>vollstaendig
auf dem System des Kunden</strong> statt -- der Cloud-Server bekommt nur verschluesselte
Daten zu sehen.
</p>
<h3>6.1 Der Verschluesselungsvorgang</h3>
<CodeBlock language="text" filename="Client-seitige Verschluesselung (im SDK)">
{`┌─────────────────────────────────────────────────────────────────┐
│ System des Kunden (SDK) │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. Kunde konfiguriert Passphrase im SDK │
│ │ ↑ │
│ │ │ Passphrase bleibt hier -- wird NIE gesendet │
│ ▼ │
│ 2. Schluessel-Ableitung: │
│ PBKDF2-SHA256(Passphrase, zufaelliger Salt, 100.000 Runden) │
│ │ │
│ │ → Ergebnis: 256-Bit-Schluessel (32 Bytes) │
│ │ → 100.000 Runden machen Brute-Force unpraktikabel │
│ ▼ │
│ 3. Verschluesselung: │
│ AES-256-GCM(Schluessel, zufaelliger IV, Dokument) │
│ │ │
│ │ → AES-256: Militaerstandard, 2^256 moegliche Schluessel │
│ │ → GCM: Garantiert Integritaet (Manipulation erkennbar) │
│ ▼ │
│ 4. Schluessel-Hash: │
│ SHA-256(abgeleiteter Schluessel) → Hash fuer Verifikation │
│ │ │
│ │ → Server speichert nur diesen Hash │
│ │ → Damit kann geprueft werden ob die Passphrase stimmt │
│ │ → Vom Hash kann der Schluessel NICHT zurueckberechnet │
│ │ werden │
│ ▼ │
│ 5. Upload: Nur diese Daten gehen an den Cloud-Server: │
│ • Verschluesselter Blob (unlesbar ohne Schluessel) │
│ • Salt (zufaellige Bytes, harmlos) │
│ • IV (Initialisierungsvektor, harmlos) │
│ • Schluessel-Hash (zur Verifikation, nicht umkehrbar) │
│ │
│ Was NICHT an den Server geht: │
│ ✗ Passphrase │
│ ✗ Abgeleiteter Schluessel │
│ ✗ Unverschluesselter Klartext │
└─────────────────────────────────────────────────────────────────┘`}
</CodeBlock>
<h3>6.2 Sicherheitsgarantien</h3>
<div className="not-prose my-6 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Angriffsszenario</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Was der Angreifer sieht</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Ergebnis</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr>
<td className="px-4 py-3 font-medium">Cloud-Server wird gehackt</td>
<td className="px-4 py-3">Verschluesselte Blobs + Hashes</td>
<td className="px-4 py-3 text-green-700 font-medium">Keine lesbaren Dokumente</td>
</tr>
<tr>
<td className="px-4 py-3 font-medium">Datenbank wird geleakt</td>
<td className="px-4 py-3">encrypted_identity_map (verschluesselt)</td>
<td className="px-4 py-3 text-green-700 font-medium">Keine personenbezogenen Daten</td>
</tr>
<tr>
<td className="px-4 py-3 font-medium">Netzwerkverkehr abgefangen</td>
<td className="px-4 py-3">Verschluesselte Daten (TLS + AES)</td>
<td className="px-4 py-3 text-green-700 font-medium">Doppelt verschluesselt</td>
</tr>
<tr>
<td className="px-4 py-3 font-medium">Betreiber (Breakpilot) will mitlesen</td>
<td className="px-4 py-3">Verschluesselte Blobs, kein Schluessel</td>
<td className="px-4 py-3 text-green-700 font-medium">Operator Blindness</td>
</tr>
<tr>
<td className="px-4 py-3 font-medium">Anderer Kunde versucht Zugriff</td>
<td className="px-4 py-3">Nichts (Tenant-Isolation)</td>
<td className="px-4 py-3 text-green-700 font-medium">Namespace blockiert</td>
</tr>
</tbody>
</table>
</div>
{/* ============================================================ */}
{/* 7. NAMESPACE / TENANT-ISOLATION */}
{/* ============================================================ */}
<h2 id="namespace">7. Namespace-Isolation: Jeder Kunde hat seinen eigenen Bereich</h2>
<p>
Ein <strong>Namespace</strong> (auch &ldquo;Tenant&rdquo; genannt) ist ein vollstaendig
abgeschotteter Bereich im System. Man kann es sich wie <strong>separate Tresorraeume
in einer Bank</strong> vorstellen: Jeder Kunde hat seinen eigenen Raum, und kein Schluessel
passt in einen anderen.
</p>
<h3>7.1 Wie die Isolation funktioniert</h3>
<p>
Jeder Kunde erhaelt eine eindeutige <code>tenant_id</code>. Diese ID wird
bei <strong>jeder einzelnen Datenbankabfrage</strong> als Pflichtfilter verwendet:
</p>
<CodeBlock language="text" filename="Tenant-Isolation in der Vektordatenbank (Qdrant)">
{`Kunde A (tenant_id: "firma-alpha-001")
├── Dokument 1 (verschluesselt)
├── Dokument 2 (verschluesselt)
└── Referenz: Pruefkriterien 2025
Kunde B (tenant_id: "firma-beta-002")
├── Dokument 1 (verschluesselt)
└── Referenz: Compliance-Vorgaben 2025
Suchanfrage von Kunde A:
"Welche Klauseln weichen von den Referenzkriterien ab?"
→ Suche NUR in tenant_id = "firma-alpha-001"
→ Kunde B's Daten sind UNSICHTBAR
Jede Qdrant-Query hat diesen Pflichtfilter:
must_conditions = [
FieldCondition(key="tenant_id", match="firma-alpha-001")
]
Es gibt KEINE Abfrage ohne tenant_id-Filter.`}
</CodeBlock>
<h3>7.2 Drei Ebenen der Isolation</h3>
<div className="not-prose my-6 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Ebene</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">System</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Isolation</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr>
<td className="px-4 py-3 font-medium">Dateisystem</td>
<td className="px-4 py-3">MinIO (S3-Storage)</td>
<td className="px-4 py-3">Eigener Bucket/Pfad pro Kunde: <code>/tenant-id/doc-id/encrypted.bin</code></td>
</tr>
<tr>
<td className="px-4 py-3 font-medium">Vektordatenbank</td>
<td className="px-4 py-3">Qdrant</td>
<td className="px-4 py-3">Pflichtfilter <code>tenant_id</code> bei jeder Suche</td>
</tr>
<tr>
<td className="px-4 py-3 font-medium">Metadaten-DB</td>
<td className="px-4 py-3">PostgreSQL</td>
<td className="px-4 py-3">Jede Tabelle hat <code>tenant_id</code> als Pflichtfeld</td>
</tr>
</tbody>
</table>
</div>
<InfoBox type="warning" title="Kein Training mit Kundendaten">
Auf allen Vektoren in Qdrant ist das Flag <code>training_allowed: false</code> gesetzt.
Kundeninhalte werden <strong>ausschliesslich fuer RAG-Suchen</strong> innerhalb des
Kunden-Namespace verwendet und <strong>niemals zum Trainieren</strong> eines KI-Modells
eingesetzt.
</InfoBox>
{/* ============================================================ */}
{/* 8. RAG-PIPELINE */}
{/* ============================================================ */}
<h2 id="rag-pipeline">8. RAG-Pipeline: KI-Verarbeitung mit Kundenkontext</h2>
<p>
Die KI nutzt die vom Kunden hochgeladenen Referenzdokumente als Wissensbasis.
Dieser Prozess heisst <strong>RAG (Retrieval Augmented Generation)</strong>:
Die KI &ldquo;liest&rdquo; zuerst die relevanten Referenzen und generiert dann
kontextbezogene Ergebnisse.
</p>
<h3>8.1 Indexierung der Referenzdokumente</h3>
<CodeBlock language="text" filename="Indexierung: Vom Upload zum durchsuchbaren Referenzdokument">
{`Referenzdokument (verschluesselt auf Server)
|
v
┌────────────────────────────────────┐
│ 1. Passphrase-Verifikation │ ← SDK sendet Schluessel-Hash
│ Hash pruefen │ Server vergleicht mit gespeichertem Hash
└──────────┬─────────────────────────┘
|
v
┌────────────────────────────────────┐
│ 2. Entschluesselung │ ← Temporaer im Arbeitsspeicher
│ AES-256-GCM Decrypt │ (wird nach Verarbeitung geloescht)
└──────────┬─────────────────────────┘
|
v
┌────────────────────────────────────┐
│ 3. Text-Extraktion │ ← PDF → Klartext
│ Tabellen, Listen, Absaetze │
└──────────┬─────────────────────────┘
|
v
┌────────────────────────────────────┐
│ 4. Chunking │ ← Text in ~1.000-Zeichen-Abschnitte
│ Ueberlappung: 200 Zeichen │ (mit Ueberlappung fuer Kontexterhalt)
└──────────┬─────────────────────────┘
|
v
┌────────────────────────────────────┐
│ 5. Embedding │ ← Jeder Abschnitt wird in einen
│ Text → 1.536 Zahlen │ Bedeutungsvektor umgewandelt
└──────────┬─────────────────────────┘
|
v
┌────────────────────────────────────┐
│ 6. Re-Encryption │ ← Jeder Chunk wird ERNEUT verschluesselt
│ AES-256-GCM pro Chunk │ bevor er gespeichert wird
└──────────┬─────────────────────────┘
|
v
┌────────────────────────────────────┐
│ 7. Qdrant-Indexierung │ ← Vektor + verschluesselter Chunk
│ tenant_id: "firma-alpha-001" │ werden mit Tenant-Filter gespeichert
│ training_allowed: false │
└────────────────────────────────────┘`}
</CodeBlock>
<h3>8.2 Wie die KI eine Anfrage bearbeitet (RAG-Query)</h3>
<ol>
<li>
<strong>Anfrage formulieren:</strong> Das SDK sendet eine Suchanfrage mit dem
zu verarbeitenden Dokument und den gewuenschten Kriterien.
</li>
<li>
<strong>Semantische Suche:</strong> Die Anfrage wird in einen Vektor umgewandelt und
gegen die Referenz-Vektoren in Qdrant gesucht -- <em>nur im Namespace des Kunden</em>.
</li>
<li>
<strong>Entschluesselung:</strong> Die gefundenen Chunks werden mit der Passphrase
des Kunden entschluesselt.
</li>
<li>
<strong>KI-Antwort:</strong> Die entschluesselten Referenzpassagen werden als Kontext
an die KI uebergeben, die daraus ein Ergebnis generiert.
</li>
</ol>
{/* ============================================================ */}
{/* 9. KEY SHARING */}
{/* ============================================================ */}
<h2 id="key-sharing">9. Key Sharing: Zusammenarbeit ermoeglichen</h2>
<p>
In vielen Geschaeftsprozessen muessen mehrere Personen oder Abteilungen auf die gleichen
Daten zugreifen -- z.B. fuer Vier-Augen-Prinzip, Qualitaetskontrolle oder externe Audits.
Das Key-Sharing-System ermoeglicht es dem Eigentuemer, seinen Namespace sicher mit
anderen zu teilen.
</p>
<h3>9.1 Einladungs-Workflow</h3>
<CodeBlock language="text" filename="Key Sharing: Sicheres Teilen zwischen Bearbeitern">
{`Eigentuemer Server Eingeladener
│ │ │
│ 1. Einladung senden │ │
│ (E-Mail + Rolle + Scope) │ │
│─────────────────────────────────▶ │
│ │ │
│ │ 2. Einladung erstellt │
│ │ (14 Tage gueltig) │
│ │ │
│ │ 3. Benachrichtigung ──────▶│
│ │ │
│ │ 4. Einladung annehmen
│ │◀─────────────────────────────│
│ │ │
│ │ 5. Key-Share erstellt │
│ │ (verschluesselte │
│ │ Passphrase) │
│ │ │
│ │ 6. Eingeladener kann ──────▶│
│ │ jetzt Daten im │
│ │ Namespace abfragen │
│ │ │
│ 7. Zugriff widerrufen │ │
│ (jederzeit moeglich) │ │
│─────────────────────────────────▶ │
│ │ Share deaktiviert │`}
</CodeBlock>
<h3>9.2 Rollen beim Key-Sharing</h3>
<div className="not-prose my-4 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Rolle</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Typischer Nutzer</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Rechte</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr><td className="px-4 py-3 font-medium">Owner</td><td className="px-4 py-3">Projektverantwortlicher</td><td className="px-4 py-3">Vollzugriff, kann teilen &amp; widerrufen</td></tr>
<tr><td className="px-4 py-3 font-medium">Reviewer</td><td className="px-4 py-3">Qualitaetssicherung</td><td className="px-4 py-3">Lesen, RAG-Queries, eigene Anmerkungen</td></tr>
<tr><td className="px-4 py-3 font-medium">Auditor</td><td className="px-4 py-3">Externer Pruefer</td><td className="px-4 py-3">Nur Lesen (Aufsichtsfunktion)</td></tr>
</tbody>
</table>
</div>
{/* ============================================================ */}
{/* 10. AUDIT-TRAIL */}
{/* ============================================================ */}
<h2 id="audit">10. Audit-Trail: Vollstaendige Nachvollziehbarkeit</h2>
<p>
Jede Aktion im Namespace wird revisionssicher im <strong>Audit-Log</strong> gespeichert.
Das ist essenziell fuer Compliance-Anforderungen und externe Audits.
</p>
<div className="not-prose my-4 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Event</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Was protokolliert wird</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr><td className="px-4 py-3 font-medium">upload</td><td className="px-4 py-3">Dokument hochgeladen (Dateigroesse, Metadaten, Zeitstempel)</td></tr>
<tr><td className="px-4 py-3 font-medium">index</td><td className="px-4 py-3">Referenzdokument indexiert (Anzahl Chunks, Dauer)</td></tr>
<tr><td className="px-4 py-3 font-medium">rag_query</td><td className="px-4 py-3">RAG-Suchanfrage ausgefuehrt (Query-Hash, Anzahl Ergebnisse)</td></tr>
<tr><td className="px-4 py-3 font-medium">analyze</td><td className="px-4 py-3">KI-Verarbeitung gestartet (Dokument-Token, Modell, Dauer)</td></tr>
<tr><td className="px-4 py-3 font-medium">share</td><td className="px-4 py-3">Namespace mit anderem Nutzer geteilt (Empfaenger, Rolle)</td></tr>
<tr><td className="px-4 py-3 font-medium">revoke_share</td><td className="px-4 py-3">Zugriff widerrufen (wer, wann)</td></tr>
<tr><td className="px-4 py-3 font-medium">decrypt</td><td className="px-4 py-3">Ergebnis entschluesselt (durch wen, Zeitstempel)</td></tr>
<tr><td className="px-4 py-3 font-medium">delete</td><td className="px-4 py-3">Dokument geloescht (Soft Delete, bleibt in Logs)</td></tr>
</tbody>
</table>
</div>
{/* ============================================================ */}
{/* 11. API-ENDPUNKTE */}
{/* ============================================================ */}
<h2 id="api">11. API-Endpunkte (SDK-Referenz)</h2>
<p>
Die folgenden Endpunkte sind ueber das SDK oder direkt via REST ansprechbar.
Authentifizierung erfolgt ueber API-Key + JWT-Token.
</p>
<h3>11.1 Namespace-Verwaltung</h3>
<div className="not-prose my-4 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Methode</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Endpunkt</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Beschreibung</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr><td className="px-4 py-3"><span className="px-2 py-0.5 rounded bg-blue-100 text-blue-800 text-xs font-bold">POST</span></td><td className="px-4 py-3 font-mono text-sm">/api/v1/namespace/upload</td><td className="px-4 py-3">Verschluesseltes Dokument hochladen</td></tr>
<tr><td className="px-4 py-3"><span className="px-2 py-0.5 rounded bg-green-100 text-green-800 text-xs font-bold">GET</span></td><td className="px-4 py-3 font-mono text-sm">/api/v1/namespace/documents</td><td className="px-4 py-3">Eigene Dokumente auflisten</td></tr>
<tr><td className="px-4 py-3"><span className="px-2 py-0.5 rounded bg-green-100 text-green-800 text-xs font-bold">GET</span></td><td className="px-4 py-3 font-mono text-sm">/api/v1/namespace/documents/{'{id}'}</td><td className="px-4 py-3">Einzelnes Dokument abrufen</td></tr>
<tr><td className="px-4 py-3"><span className="px-2 py-0.5 rounded bg-red-100 text-red-800 text-xs font-bold">DELETE</span></td><td className="px-4 py-3 font-mono text-sm">/api/v1/namespace/documents/{'{id}'}</td><td className="px-4 py-3">Dokument loeschen (Soft Delete)</td></tr>
</tbody>
</table>
</div>
<h3>11.2 Referenzdokumente &amp; RAG</h3>
<div className="not-prose my-4 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Methode</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Endpunkt</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Beschreibung</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr><td className="px-4 py-3"><span className="px-2 py-0.5 rounded bg-blue-100 text-blue-800 text-xs font-bold">POST</span></td><td className="px-4 py-3 font-mono text-sm">/api/v1/namespace/references/upload</td><td className="px-4 py-3">Referenzdokument hochladen</td></tr>
<tr><td className="px-4 py-3"><span className="px-2 py-0.5 rounded bg-blue-100 text-blue-800 text-xs font-bold">POST</span></td><td className="px-4 py-3 font-mono text-sm">/api/v1/namespace/references/{'{id}'}/index</td><td className="px-4 py-3">Referenz fuer RAG indexieren</td></tr>
<tr><td className="px-4 py-3"><span className="px-2 py-0.5 rounded bg-blue-100 text-blue-800 text-xs font-bold">POST</span></td><td className="px-4 py-3 font-mono text-sm">/api/v1/namespace/rag-query</td><td className="px-4 py-3">RAG-Suchanfrage ausfuehren</td></tr>
<tr><td className="px-4 py-3"><span className="px-2 py-0.5 rounded bg-blue-100 text-blue-800 text-xs font-bold">POST</span></td><td className="px-4 py-3 font-mono text-sm">/api/v1/namespace/analyze</td><td className="px-4 py-3">KI-Verarbeitung anstossen</td></tr>
</tbody>
</table>
</div>
<h3>11.3 Key Sharing</h3>
<div className="not-prose my-4 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Methode</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Endpunkt</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Beschreibung</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr><td className="px-4 py-3"><span className="px-2 py-0.5 rounded bg-blue-100 text-blue-800 text-xs font-bold">POST</span></td><td className="px-4 py-3 font-mono text-sm">/api/v1/namespace/share</td><td className="px-4 py-3">Namespace mit anderem Nutzer teilen</td></tr>
<tr><td className="px-4 py-3"><span className="px-2 py-0.5 rounded bg-green-100 text-green-800 text-xs font-bold">GET</span></td><td className="px-4 py-3 font-mono text-sm">/api/v1/namespace/shares</td><td className="px-4 py-3">Aktive Shares auflisten</td></tr>
<tr><td className="px-4 py-3"><span className="px-2 py-0.5 rounded bg-red-100 text-red-800 text-xs font-bold">DELETE</span></td><td className="px-4 py-3 font-mono text-sm">/api/v1/namespace/shares/{'{shareId}'}</td><td className="px-4 py-3">Zugriff widerrufen</td></tr>
<tr><td className="px-4 py-3"><span className="px-2 py-0.5 rounded bg-green-100 text-green-800 text-xs font-bold">GET</span></td><td className="px-4 py-3 font-mono text-sm">/api/v1/namespace/shared-with-me</td><td className="px-4 py-3">Mit mir geteilte Namespaces</td></tr>
</tbody>
</table>
</div>
{/* ============================================================ */}
{/* 12. ZUSAMMENFASSUNG */}
{/* ============================================================ */}
<h2 id="zusammenfassung">12. Zusammenfassung: Compliance-Garantien</h2>
<div className="not-prose my-6 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Garantie</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Wie umgesetzt</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Regelwerk</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr>
<td className="px-4 py-3 font-medium">Keine PII verlaesst das Kundensystem</td>
<td className="px-4 py-3">Header-Redaction + verschluesselte Identity-Map</td>
<td className="px-4 py-3">DSGVO Art. 4 Nr. 5</td>
</tr>
<tr>
<td className="px-4 py-3 font-medium">Betreiber kann nicht mitlesen</td>
<td className="px-4 py-3">Client-seitige AES-256-GCM Verschluesselung</td>
<td className="px-4 py-3">DSGVO Art. 32</td>
</tr>
<tr>
<td className="px-4 py-3 font-medium">Kein Zugriff durch andere Kunden</td>
<td className="px-4 py-3">Tenant-Isolation (Namespace) auf allen 3 Ebenen</td>
<td className="px-4 py-3">DSGVO Art. 25</td>
</tr>
<tr>
<td className="px-4 py-3 font-medium">Kein KI-Training mit Kundendaten</td>
<td className="px-4 py-3"><code>training_allowed: false</code> auf allen Vektoren</td>
<td className="px-4 py-3">AI Act Art. 10</td>
</tr>
<tr>
<td className="px-4 py-3 font-medium">Alles nachvollziehbar</td>
<td className="px-4 py-3">Vollstaendiger Audit-Trail aller Aktionen</td>
<td className="px-4 py-3">DSGVO Art. 5 Abs. 2</td>
</tr>
<tr>
<td className="px-4 py-3 font-medium">Kunde behaelt volle Kontrolle</td>
<td className="px-4 py-3">Jederzeitiger Widerruf, Loeschung, Datenexport</td>
<td className="px-4 py-3">DSGVO Art. 17, 20</td>
</tr>
</tbody>
</table>
</div>
<InfoBox type="success" title="Das Wichtigste in einem Satz">
Die Namespace-Technologie ermoeglicht KI-gestuetzte Datenverarbeitung in der Cloud, bei der
<strong> keine personenbezogenen Daten das Kundensystem verlassen</strong>, alle Daten
<strong> Ende-zu-Ende verschluesselt</strong> sind, jeder Kunde seinen
<strong> eigenen abgeschotteten Namespace</strong> hat, und ein
<strong> vollstaendiger Audit-Trail</strong> jede Aktion dokumentiert.
</InfoBox>
<ByoehIntroSection />
<SdkPseudonymSection />
<EncryptionNamespaceSection />
<RagKeySharingSection />
<AuditApiSummarySection />
</DevPortalLayout>
)
}

View File

@@ -0,0 +1,119 @@
import { CodeBlock, InfoBox } from '@/components/DevPortalLayout'
export function ComplianceEngineSection() {
return (
<>
<h2 id="compliance-engine">4. Die Compliance Engine: Wie Bewertungen funktionieren</h2>
<p>
Das Kernmodul des Compliance Hub ist die <strong>UCCA Engine</strong> (Unified Compliance
Control Assessment). Sie bewertet, ob ein geplanter KI-Anwendungsfall zulaessig ist.
</p>
<h3>4.1 Der Fragebogen (Use Case Intake)</h3>
<div className="not-prose my-4 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Bereich</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Typische Fragen</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Warum relevant?</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr><td className="px-4 py-3 font-medium">Datentypen</td><td className="px-4 py-3">Werden personenbezogene Daten verarbeitet? Besondere Kategorien (Art. 9)?</td><td className="px-4 py-3">Art. 9-Daten (Gesundheit, Religion, etc.) erfordern besondere Schutzmassnahmen</td></tr>
<tr><td className="px-4 py-3 font-medium">Verarbeitungszweck</td><td className="px-4 py-3">Wird Profiling betrieben? Scoring? Automatisierte Entscheidungen?</td><td className="px-4 py-3">Art. 22 DSGVO schuetzt vor vollautomatischen Entscheidungen</td></tr>
<tr><td className="px-4 py-3 font-medium">Modellnutzung</td><td className="px-4 py-3">Wird das Modell nur genutzt (Inference) oder mit Nutzerdaten trainiert (Fine-Tuning)?</td><td className="px-4 py-3">Training mit personenbezogenen Daten erfordert besondere Rechtsgrundlage</td></tr>
<tr><td className="px-4 py-3 font-medium">Automatisierungsgrad</td><td className="px-4 py-3">Assistenzsystem, teil- oder vollautomatisch?</td><td className="px-4 py-3">Vollautomatische Systeme unterliegen strengeren Auflagen</td></tr>
<tr><td className="px-4 py-3 font-medium">Datenspeicherung</td><td className="px-4 py-3">Wie lange werden Daten gespeichert? Wo?</td><td className="px-4 py-3">DSGVO Art. 5: Speicherbegrenzung / Zweckbindung</td></tr>
<tr><td className="px-4 py-3 font-medium">Hosting-Standort</td><td className="px-4 py-3">EU, USA, oder anderswo?</td><td className="px-4 py-3">Drittlandtransfers erfordern zusaetzliche Garantien (SCC, DPF)</td></tr>
<tr><td className="px-4 py-3 font-medium">Branche</td><td className="px-4 py-3">Gesundheit, Finanzen, Bildung, Automotive, ...?</td><td className="px-4 py-3">Bestimmte Branchen unterliegen zusaetzlichen Regulierungen</td></tr>
<tr><td className="px-4 py-3 font-medium">Menschliche Aufsicht</td><td className="px-4 py-3">Gibt es einen Human-in-the-Loop?</td><td className="px-4 py-3">AI Act fordert menschliche Aufsicht fuer Hochrisiko-KI</td></tr>
</tbody>
</table>
</div>
<h3>4.2 Die Pruefregeln (Policy Engine)</h3>
<p>
Die Antworten des Fragebogens werden gegen ein <strong>Regelwerk von ueber 45 Regeln</strong>
geprueft. Jede Regel ist in einer YAML-Datei definiert. Die Regeln sind in <strong>10 Kategorien</strong> organisiert:
</p>
<div className="not-prose my-4 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Kategorie</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Regel-IDs</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Prueft</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Beispiel</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr><td className="px-4 py-3 font-medium">A. Datenklassifikation</td><td className="px-4 py-3">R-001 bis R-006</td><td className="px-4 py-3">Welche Daten werden verarbeitet?</td><td className="px-4 py-3">R-001: Werden personenbezogene Daten verarbeitet? &rarr; +10 Risiko</td></tr>
<tr><td className="px-4 py-3 font-medium">B. Zweck &amp; Kontext</td><td className="px-4 py-3">R-010 bis R-013</td><td className="px-4 py-3">Warum und wie werden Daten genutzt?</td><td className="px-4 py-3">R-011: Profiling? &rarr; DSFA empfohlen</td></tr>
<tr><td className="px-4 py-3 font-medium">C. Automatisierung</td><td className="px-4 py-3">R-020 bis R-025</td><td className="px-4 py-3">Wie stark ist die Automatisierung?</td><td className="px-4 py-3">R-023: Vollautomatisch? &rarr; Art. 22 Risiko</td></tr>
<tr><td className="px-4 py-3 font-medium">D. Training vs. Nutzung</td><td className="px-4 py-3">R-030 bis R-035</td><td className="px-4 py-3">Wird das Modell trainiert?</td><td className="px-4 py-3">R-035: Training + Art. 9-Daten? &rarr; BLOCK</td></tr>
<tr><td className="px-4 py-3 font-medium">E. Speicherung</td><td className="px-4 py-3">R-040 bis R-042</td><td className="px-4 py-3">Wie lange werden Daten gespeichert?</td><td className="px-4 py-3">R-041: Unbegrenzte Speicherung? &rarr; WARN</td></tr>
<tr><td className="px-4 py-3 font-medium">F. Hosting</td><td className="px-4 py-3">R-050 bis R-052</td><td className="px-4 py-3">Wo werden Daten gehostet?</td><td className="px-4 py-3">R-051: Hosting in USA? &rarr; SCC/DPF pruefen</td></tr>
<tr><td className="px-4 py-3 font-medium">G. Transparenz</td><td className="px-4 py-3">R-060 bis R-062</td><td className="px-4 py-3">Werden Nutzer informiert?</td><td className="px-4 py-3">R-060: Keine Offenlegung? &rarr; AI Act Verstoss</td></tr>
<tr><td className="px-4 py-3 font-medium">H. Branchenspezifisch</td><td className="px-4 py-3">R-070 bis R-074</td><td className="px-4 py-3">Gelten Sonderregeln fuer die Branche?</td><td className="px-4 py-3">R-070: Gesundheitsbranche? &rarr; zusaetzliche Anforderungen</td></tr>
<tr><td className="px-4 py-3 font-medium">I. Aggregation</td><td className="px-4 py-3">R-090 bis R-092</td><td className="px-4 py-3">Meta-Regeln ueber andere Regeln</td><td className="px-4 py-3">R-090: Zu viele WARN-Regeln? &rarr; Gesamtrisiko erhoeht</td></tr>
<tr><td className="px-4 py-3 font-medium">J. Erklaerung</td><td className="px-4 py-3">R-100</td><td className="px-4 py-3">Warum hat das System so entschieden?</td><td className="px-4 py-3">Automatisch generierte Begruendung</td></tr>
</tbody>
</table>
</div>
<InfoBox type="info" title="Warum YAML-Regeln statt Code?">
Die Regeln sind bewusst in YAML-Dateien definiert: (1) Sie sind fuer Nicht-Programmierer
lesbar und damit <strong>auditierbar</strong>. (2) Sie koennen <strong>versioniert</strong>
werden -- wenn sich ein Gesetz aendert, wird die Regelaenderung im Versionsverlauf sichtbar.
</InfoBox>
<h3>4.3 Das Ergebnis: Die Compliance-Bewertung</h3>
<div className="not-prose my-4 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Ergebnis</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Beschreibung</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr>
<td className="px-4 py-3 font-medium">Machbarkeit</td>
<td className="px-4 py-3">
<span className="inline-block px-2 py-0.5 rounded bg-green-100 text-green-800 text-xs font-bold mr-1">YES</span>
<span className="inline-block px-2 py-0.5 rounded bg-yellow-100 text-yellow-800 text-xs font-bold mr-1">CONDITIONAL</span>
<span className="inline-block px-2 py-0.5 rounded bg-red-100 text-red-800 text-xs font-bold">NO</span>
</td>
</tr>
<tr><td className="px-4 py-3 font-medium">Risikoscore</td><td className="px-4 py-3">0-100 Punkte. Je hoeher, desto mehr Massnahmen sind erforderlich.</td></tr>
<tr><td className="px-4 py-3 font-medium">Risikostufe</td><td className="px-4 py-3">MINIMAL / LOW / MEDIUM / HIGH / UNACCEPTABLE</td></tr>
<tr><td className="px-4 py-3 font-medium">Ausgeloeste Regeln</td><td className="px-4 py-3">Liste aller Regeln, die angeschlagen haben, mit Schweregrad und Gesetzesreferenz</td></tr>
<tr><td className="px-4 py-3 font-medium">Erforderliche Controls</td><td className="px-4 py-3">Konkrete Massnahmen, die umgesetzt werden muessen</td></tr>
<tr><td className="px-4 py-3 font-medium">DSFA erforderlich?</td><td className="px-4 py-3">Ob eine Datenschutz-Folgenabschaetzung nach Art. 35 DSGVO durchgefuehrt werden muss</td></tr>
</tbody>
</table>
</div>
<CodeBlock language="text" filename="Beispiel: Bewertung eines Chatbots mit Kundendaten">
{`Anwendungsfall: "Chatbot fuer Kundenservice mit Zugriff auf Bestellhistorie"
Machbarkeit: CONDITIONAL (bedingt zulaessig)
Risikoscore: 35/100 (LOW)
Ausgeloeste Regeln:
R-001 WARN Personenbezogene Daten werden verarbeitet (Art. 6 DSGVO)
R-010 INFO Verarbeitungszweck: Kundenservice (Art. 5 DSGVO)
R-060 WARN Nutzer muessen ueber KI-Nutzung informiert werden (AI Act Art. 52)
Erforderliche Controls:
C_EXPLICIT_CONSENT Einwilligung fuer Chatbot-Nutzung einholen
C_TRANSPARENCY Hinweis "Sie sprechen mit einer KI"
C_DATA_MINIMIZATION Nur notwendige Bestelldaten abrufen
DSFA erforderlich: Nein (Risikoscore unter 40)
Eskalation: E0 (keine manuelle Pruefung noetig)`}
</CodeBlock>
</>
)
}

View File

@@ -0,0 +1,101 @@
import { CodeBlock } from '@/components/DevPortalLayout'
export function EscalationControlsSection() {
return (
<>
<h2 id="eskalation">5. Das Eskalations-System: Wann Menschen entscheiden</h2>
<p>
Nicht jede Bewertung ist eindeutig. Fuer heikle Faelle gibt es ein abgestuftes
Eskalations-System, das sicherstellt, dass die richtigen Menschen die endgueltige
Entscheidung treffen.
</p>
<div className="not-prose my-6 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Stufe</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Wann?</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Wer prueft?</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Frist (SLA)</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Beispiel</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr className="bg-green-50"><td className="px-4 py-3 font-bold text-green-800">E0</td><td className="px-4 py-3">Nur INFO-Regeln, Risiko &lt; 20</td><td className="px-4 py-3">Niemand (automatisch freigegeben)</td><td className="px-4 py-3">--</td><td className="px-4 py-3">Spam-Filter ohne personenbezogene Daten</td></tr>
<tr className="bg-yellow-50"><td className="px-4 py-3 font-bold text-yellow-800">E1</td><td className="px-4 py-3">WARN-Regeln, Risiko 20-39</td><td className="px-4 py-3">Teamleiter</td><td className="px-4 py-3">24 Stunden</td><td className="px-4 py-3">Chatbot mit Kundendaten</td></tr>
<tr className="bg-orange-50"><td className="px-4 py-3 font-bold text-orange-800">E2</td><td className="px-4 py-3">Art. 9-Daten ODER Risiko 40-59 ODER DSFA empfohlen</td><td className="px-4 py-3">Datenschutzbeauftragter (DSB)</td><td className="px-4 py-3">8 Stunden</td><td className="px-4 py-3">KI-System, das Gesundheitsdaten verarbeitet</td></tr>
<tr className="bg-red-50"><td className="px-4 py-3 font-bold text-red-800">E3</td><td className="px-4 py-3">BLOCK-Regel ODER Risiko &ge; 60 ODER Art. 22-Risiko</td><td className="px-4 py-3">DSB + Rechtsabteilung</td><td className="px-4 py-3">4 Stunden</td><td className="px-4 py-3">Vollautomatische Kreditentscheidung</td></tr>
</tbody>
</table>
</div>
<h2 id="controls">6. Controls, Nachweise und Risiken</h2>
<h3>6.1 Was sind Controls?</h3>
<p>
Ein <strong>Control</strong> ist eine konkrete Massnahme, die eine Organisation umsetzt,
um ein Compliance-Risiko zu beherrschen. Es gibt drei Arten:
</p>
<ul>
<li><strong>Technische Controls:</strong> Verschluesselung, Zugangskontrollen, Firewalls, Pseudonymisierung</li>
<li><strong>Organisatorische Controls:</strong> Schulungen, Richtlinien, Verantwortlichkeiten, Audits</li>
<li><strong>Physische Controls:</strong> Zutrittskontrolle zu Serverraeumen, Schliesssysteme</li>
</ul>
<p>
Der Compliance Hub verwaltet einen <strong>Katalog von ueber 100 vordefinierten Controls</strong>,
die in 9 Domaenen organisiert sind:
</p>
<div className="not-prose my-4">
<div className="grid grid-cols-3 gap-2">
{[
{ code: 'AC', name: 'Zugriffsmanagement', desc: 'Wer darf was?' },
{ code: 'DP', name: 'Datenschutz', desc: 'Schutz personenbezogener Daten' },
{ code: 'NS', name: 'Netzwerksicherheit', desc: 'Sichere Kommunikation' },
{ code: 'IR', name: 'Incident Response', desc: 'Reaktion auf Sicherheitsvorfaelle' },
{ code: 'BC', name: 'Business Continuity', desc: 'Geschaeftskontinuitaet' },
{ code: 'VM', name: 'Vendor Management', desc: 'Dienstleister-Steuerung' },
{ code: 'AM', name: 'Asset Management', desc: 'Verwaltung von IT-Werten' },
{ code: 'CR', name: 'Kryptographie', desc: 'Verschluesselung & Schluessel' },
{ code: 'PS', name: 'Physische Sicherheit', desc: 'Gebaeude & Hardware' },
].map(d => (
<div key={d.code} className="border border-gray-200 rounded-lg p-3 text-sm">
<div className="font-bold text-blue-600">{d.code}</div>
<div className="font-medium">{d.name}</div>
<div className="text-gray-500 text-xs">{d.desc}</div>
</div>
))}
</div>
</div>
<h3>6.2 Wie Controls mit Gesetzen verknuepft sind</h3>
<CodeBlock language="text" filename="Beispiel: Control-Mapping">
{`Control: AC-01 (Zugriffskontrolle)
├── DSGVO Art. 32 → "Sicherheit der Verarbeitung"
├── NIS2 Art. 21 → "Massnahmen zum Management von Cyberrisiken"
└── ISO 27001 A.9 → "Zugangskontrolle"
Control: DP-03 (Datenverschluesselung)
├── DSGVO Art. 32 → "Verschluesselung personenbezogener Daten"
└── NIS2 Art. 21 → "Einsatz von Kryptographie"`}
</CodeBlock>
<h3>6.3 Evidence (Nachweise)</h3>
<p>Nachweis-Typen, die das System verwaltet:</p>
<ul>
<li><strong>Zertifikate:</strong> ISO 27001-Zertifikat, SOC2-Report</li>
<li><strong>Richtlinien:</strong> Interne Datenschutzrichtlinie, Passwort-Policy</li>
<li><strong>Audit-Berichte:</strong> Ergebnisse interner oder externer Pruefungen</li>
<li><strong>Screenshots / Konfigurationen:</strong> Nachweis technischer Umsetzung</li>
</ul>
<p>Jeder Nachweis hat ein <strong>Ablaufdatum</strong>. Das System warnt automatisch, wenn Nachweise bald ablaufen.</p>
<h3>6.4 Risikobewertung</h3>
<p>
Risiken werden in einer <strong>5x5-Risikomatrix</strong> dargestellt. Die beiden Achsen sind
Eintrittswahrscheinlichkeit und Auswirkung. Aus der Kombination ergibt sich die Risikostufe:
<em> Minimal</em>, <em>Low</em>, <em>Medium</em>, <em>High</em> oder <em>Critical</em>.
</p>
</>
)
}

View File

@@ -0,0 +1,97 @@
import { CodeBlock, InfoBox } from '@/components/DevPortalLayout'
export function IntroArchitectureSection() {
return (
<>
<h2 id="einfuehrung">1. Was ist der Compliance Hub?</h2>
<p>
Der <strong>BreakPilot Compliance Hub</strong> ist ein System, das Organisationen dabei
unterstuetzt, gesetzliche Vorschriften einzuhalten. Er beantwortet die zentrale Frage:
</p>
<blockquote>
<em>&ldquo;Duerfen wir das, was wir vorhaben, ueberhaupt so machen -- und wenn ja, welche
Auflagen muessen wir dafuer erfuellen?&rdquo;</em>
</blockquote>
<p>
Konkret geht es um EU- und deutsche Gesetze, die fuer den Umgang mit Daten und
kuenstlicher Intelligenz relevant sind: die <strong>DSGVO</strong>, den <strong>AI Act</strong>,
die <strong>NIS2-Richtlinie</strong> und viele weitere Regelwerke. Das System hat vier
Hauptaufgaben:
</p>
<ol>
<li><strong>Wissen bereitstellen:</strong> Hunderte Rechtstexte sind eingelesen und durchsuchbar -- nicht nur per Stichwort, sondern nach Bedeutung (semantische Suche).</li>
<li><strong>Bewerten:</strong> Wenn ein Nutzer einen geplanten KI-Anwendungsfall beschreibt, bewertet das System automatisch, ob er zulaessig ist, welches Risiko besteht und welche Massnahmen noetig sind.</li>
<li><strong>Dokumentieren:</strong> Das System erzeugt die Dokumente, die Aufsichtsbehoerden verlangen: Datenschutz-Folgenabschaetzungen (DSFA), technisch-organisatorische Massnahmen (TOM), Verarbeitungsverzeichnisse (VVT) und mehr.</li>
<li><strong>Nachweisen:</strong> Jede Bewertung, jede Entscheidung und jeder Zugriff wird revisionssicher protokolliert -- als Nachweis gegenueber Pruefer und Behoerden.</li>
</ol>
<InfoBox type="info" title="Kern-Designprinzip">
<strong>Die KI ist nicht die Entscheidungsinstanz.</strong> Alle
Compliance-Entscheidungen (zulaessig / bedingt zulaessig / nicht zulaessig) trifft ein
deterministisches Regelwerk. Das LLM (Sprachmodell) wird ausschliesslich dafuer verwendet,
Ergebnisse verstaendlich zu <em>erklaeren</em> -- niemals um sie zu <em>treffen</em>.
</InfoBox>
<h2 id="architektur">2. Architektur im Ueberblick</h2>
<p>
Das System besteht aus mehreren Bausteinen, die jeweils eine klar abgegrenzte Aufgabe haben.
Man kann es sich wie ein Buero vorstellen:
</p>
<div className="not-prose my-6 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Baustein</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Analogie</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Technologie</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Aufgabe</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr><td className="px-4 py-3 font-medium">API-Gateway</td><td className="px-4 py-3">Empfang / Rezeption</td><td className="px-4 py-3">Go (Gin)</td><td className="px-4 py-3">Nimmt alle Anfragen entgegen, prueft Identitaet und leitet weiter</td></tr>
<tr><td className="px-4 py-3 font-medium">Compliance Engine (UCCA)</td><td className="px-4 py-3">Sachbearbeiter</td><td className="px-4 py-3">Go</td><td className="px-4 py-3">Bewertet Anwendungsfaelle gegen 45+ Regeln und berechnet Risikoscore</td></tr>
<tr><td className="px-4 py-3 font-medium">RAG Service</td><td className="px-4 py-3">Rechtsbibliothek</td><td className="px-4 py-3">Python (FastAPI)</td><td className="px-4 py-3">Durchsucht Gesetze semantisch und beantwortet Rechtsfragen</td></tr>
<tr><td className="px-4 py-3 font-medium">Legal Corpus</td><td className="px-4 py-3">Gesetzesbuecher im Regal</td><td className="px-4 py-3">YAML/JSON + Qdrant</td><td className="px-4 py-3">Enthaelt alle Rechtstexte als durchsuchbare Wissensbasis</td></tr>
<tr><td className="px-4 py-3 font-medium">Policy Engine</td><td className="px-4 py-3">Regelbuch des Sachbearbeiters</td><td className="px-4 py-3">YAML-Dateien</td><td className="px-4 py-3">45+ auditierbare Pruefregeln in maschinenlesbarer Form</td></tr>
<tr><td className="px-4 py-3 font-medium">Eskalations-System</td><td className="px-4 py-3">Chef-Unterschrift</td><td className="px-4 py-3">Go + PostgreSQL</td><td className="px-4 py-3">Leitet kritische Faelle an menschliche Pruefer weiter</td></tr>
<tr><td className="px-4 py-3 font-medium">Admin Dashboard</td><td className="px-4 py-3">Schreibtisch</td><td className="px-4 py-3">Next.js</td><td className="px-4 py-3">Benutzeroberflaeche fuer alle Funktionen</td></tr>
<tr><td className="px-4 py-3 font-medium">PostgreSQL</td><td className="px-4 py-3">Aktenschrank</td><td className="px-4 py-3">SQL-Datenbank</td><td className="px-4 py-3">Speichert Assessments, Eskalationen, Controls, Audit-Trail</td></tr>
<tr><td className="px-4 py-3 font-medium">Qdrant</td><td className="px-4 py-3">Suchindex der Bibliothek</td><td className="px-4 py-3">Vektordatenbank</td><td className="px-4 py-3">Ermoeglicht semantische Suche ueber Rechtstexte</td></tr>
</tbody>
</table>
</div>
<h3>Wie die Bausteine zusammenspielen</h3>
<CodeBlock language="text" filename="Datenfluss: Vom Benutzer zur Compliance-Bewertung">
{`Benutzer (Browser)
|
v
┌─────────────────────────────┐
│ API-Gateway (Port 8080) │ ← Authentifizierung, Rate-Limiting, Tenant-Isolation
│ "Wer bist du? Darfst du?" │
└──────────┬──────────────────┘
|
┌─────┼──────────────────────────────┐
v v v
┌─────────────┐ ┌──────────────┐ ┌──────────────┐
│ Compliance │ │ RAG Service │ │ Security │
│ Engine │ │ (Bibliothek)│ │ Scanner │
│ (Bewertung) │ │ │ │ │
└──────┬───┬──┘ └──────┬───────┘ └──────────────┘
| | |
| | ┌──────┴───────┐
| | │ Qdrant │ ← Vektordatenbank mit allen Rechtstexten
| | │ (Suchindex) │
| | └──────────────┘
| |
| └──────────────────────┐
v v
┌──────────────┐ ┌──────────────┐
│ PostgreSQL │ │ Eskalation │
│ (Speicher) │ │ (E0-E3) │
└──────────────┘ └──────────────┘`}
</CodeBlock>
</>
)
}

View File

@@ -0,0 +1,145 @@
import { CodeBlock, InfoBox } from '@/components/DevPortalLayout'
export function LegalCorpusSection() {
return (
<>
<h2 id="katalogmanager">3. Der Katalogmanager: Die Wissensbasis</h2>
<p>
Das Herzstueck des Systems ist seine <strong>Wissensbasis</strong> -- eine Sammlung aller
relevanten Rechtstexte, die das System kennt und durchsuchen kann. Wir nennen das den
<strong> Legal Corpus</strong> (wörtlich: &ldquo;Rechtlicher Koerper&rdquo;).
</p>
<h3>3.1 Welche Dokumente sind enthalten?</h3>
<p>Der Legal Corpus ist in zwei Hauptbereiche gegliedert: <strong>EU-Recht</strong> und <strong> deutsches Recht</strong>.</p>
<h4>EU-Verordnungen und -Richtlinien</h4>
<div className="not-prose my-4 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-blue-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-700">Regelwerk</th>
<th className="px-4 py-3 text-left font-medium text-gray-700">Abkuerzung</th>
<th className="px-4 py-3 text-left font-medium text-gray-700">Artikel</th>
<th className="px-4 py-3 text-left font-medium text-gray-700">Gueltig seit</th>
<th className="px-4 py-3 text-left font-medium text-gray-700">Thema</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr><td className="px-4 py-3 font-medium">Datenschutz-Grundverordnung</td><td className="px-4 py-3">DSGVO</td><td className="px-4 py-3">99</td><td className="px-4 py-3">25.05.2018</td><td className="px-4 py-3">Schutz personenbezogener Daten</td></tr>
<tr><td className="px-4 py-3 font-medium">KI-Verordnung</td><td className="px-4 py-3">AI Act</td><td className="px-4 py-3">113</td><td className="px-4 py-3">01.08.2024</td><td className="px-4 py-3">Regulierung kuenstlicher Intelligenz</td></tr>
<tr><td className="px-4 py-3 font-medium">Netz- und Informationssicherheit</td><td className="px-4 py-3">NIS2</td><td className="px-4 py-3">46</td><td className="px-4 py-3">18.10.2024</td><td className="px-4 py-3">Cybersicherheit kritischer Infrastrukturen</td></tr>
<tr><td className="px-4 py-3 font-medium">ePrivacy-Verordnung</td><td className="px-4 py-3">ePrivacy</td><td className="px-4 py-3">--</td><td className="px-4 py-3">in Arbeit</td><td className="px-4 py-3">Vertraulichkeit elektronischer Kommunikation</td></tr>
<tr><td className="px-4 py-3 font-medium">Cyber Resilience Act</td><td className="px-4 py-3">CRA</td><td className="px-4 py-3">--</td><td className="px-4 py-3">2024</td><td className="px-4 py-3">Cybersicherheit von Produkten mit digitalen Elementen</td></tr>
<tr><td className="px-4 py-3 font-medium">Data Act</td><td className="px-4 py-3">DA</td><td className="px-4 py-3">--</td><td className="px-4 py-3">2024</td><td className="px-4 py-3">Zugang und Nutzung von Daten</td></tr>
<tr><td className="px-4 py-3 font-medium">Digital Markets Act</td><td className="px-4 py-3">DMA</td><td className="px-4 py-3">--</td><td className="px-4 py-3">2023</td><td className="px-4 py-3">Regulierung digitaler Gatekeeper</td></tr>
</tbody>
</table>
</div>
<h4>Deutsches Recht</h4>
<div className="not-prose my-4 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-green-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-700">Gesetz</th>
<th className="px-4 py-3 text-left font-medium text-gray-700">Abkuerzung</th>
<th className="px-4 py-3 text-left font-medium text-gray-700">Thema</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr><td className="px-4 py-3 font-medium">Telekommunikation-Digitale-Dienste-Datenschutz-Gesetz</td><td className="px-4 py-3">TDDDG</td><td className="px-4 py-3">Datenschutz bei Telekommunikation und digitalen Diensten</td></tr>
<tr><td className="px-4 py-3 font-medium">Bundesdatenschutzgesetz</td><td className="px-4 py-3">BDSG</td><td className="px-4 py-3">Nationale Ergaenzung zur DSGVO</td></tr>
<tr><td className="px-4 py-3 font-medium">IT-Sicherheitsgesetz</td><td className="px-4 py-3">IT-SiG</td><td className="px-4 py-3">IT-Sicherheit kritischer Infrastrukturen</td></tr>
<tr><td className="px-4 py-3 font-medium">BSI-KritisV</td><td className="px-4 py-3">KritisV</td><td className="px-4 py-3">BSI-Verordnung fuer kritische Infrastrukturen</td></tr>
</tbody>
</table>
</div>
<h4>Standards und Normen</h4>
<div className="not-prose my-4 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-purple-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-700">Standard</th>
<th className="px-4 py-3 text-left font-medium text-gray-700">Thema</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr><td className="px-4 py-3 font-medium">ISO 27001</td><td className="px-4 py-3">Informationssicherheits-Managementsystem (ISMS)</td></tr>
<tr><td className="px-4 py-3 font-medium">SOC2</td><td className="px-4 py-3">Trust Service Criteria (Sicherheit, Verfuegbarkeit, Vertraulichkeit)</td></tr>
<tr><td className="px-4 py-3 font-medium">BSI Grundschutz</td><td className="px-4 py-3">IT-Grundschutz des BSI</td></tr>
<tr><td className="px-4 py-3 font-medium">BSI TR-03161</td><td className="px-4 py-3">Technische Richtlinie fuer Anforderungen an Anwendungen im Gesundheitswesen</td></tr>
<tr><td className="px-4 py-3 font-medium">SCC (Standard Contractual Clauses)</td><td className="px-4 py-3">Standardvertragsklauseln fuer Drittlandtransfers</td></tr>
</tbody>
</table>
</div>
<h3>3.2 Wie werden Rechtstexte gespeichert?</h3>
<p>
Jeder Rechtstext durchlaeuft eine <strong>Verarbeitungspipeline</strong>, bevor er im
System durchsuchbar ist. Der Vorgang laesst sich mit dem Erstellen eines
Bibliothekskatalogs vergleichen:
</p>
<ol>
<li><strong>Erfassung (Ingestion):</strong> Der Rechtstext wird als Dokument (PDF, Markdown oder Klartext) in das System geladen. Fuer jede Verordnung gibt es eine <code>metadata.json</code>-Datei.</li>
<li><strong>Zerkleinerung (Chunking):</strong> Lange Gesetzestexte werden in kleinere Abschnitte von ca. 512 Zeichen zerlegt. Dabei ueberlappen sich die Abschnitte um 50 Zeichen.</li>
<li><strong>Vektorisierung (Embedding):</strong> Jeder Textabschnitt wird vom Embedding-Modell <strong>BGE-M3</strong> in einen <em>Vektor</em> umgewandelt -- eine Liste von 1.024 Zahlen.</li>
<li><strong>Indexierung:</strong> Die Vektoren werden in der Vektordatenbank <strong>Qdrant</strong> gespeichert. Zusammen mit jedem Vektor werden Metadaten hinterlegt.</li>
</ol>
<CodeBlock language="text" filename="Verarbeitungspipeline: Vom Gesetzestext zur Suche">
{`Rechtstext (z.B. DSGVO Art. 32)
|
v
┌────────────────────────┐
│ 1. Einlesen │ ← PDF/Markdown/Klartext + metadata.json
└──────────┬─────────────┘
v
┌────────────────────────┐
│ 2. Chunking │ ← Text in 512-Zeichen-Abschnitte zerlegen
└──────────┬─────────────┘
v
┌────────────────────────┐
│ 3. Embedding │ ← BGE-M3 wandelt Text in 1024 Zahlen um
└──────────┬─────────────┘
v
┌────────────────────────┐
│ 4. Qdrant speichern │ ← Vektor + Metadaten werden indexiert
└────────────────────────┘`}
</CodeBlock>
<InfoBox type="success" title="Aktueller Bestand">
Der Legal Corpus enthaelt derzeit ca. <strong>2.274 Textabschnitte</strong> aus ueber
400 Gesetzesartikeln. Darunter 99 DSGVO-Artikel, 85 AI-Act-Artikel, 46 NIS2-Artikel,
86 BDSG-Paragraphen sowie zahlreiche Artikel aus TDDDG, CRA, Data Act und weiteren Regelwerken.
</InfoBox>
<h3>3.3 Wie funktioniert die semantische Suche?</h3>
<p>
Klassische Suchmaschinen suchen nach <em>Woertern</em>. Unsere semantische Suche
funktioniert anders: Sie sucht nach <em>Bedeutung</em>.
</p>
<p>
<strong>Beispiel:</strong> Wenn Sie fragen &ldquo;Wann muss ich den Nutzer um Erlaubnis
bitten?&rdquo;, findet das System Art. 7 DSGVO (Bedingungen fuer die Einwilligung), obwohl
Ihre Frage das Wort &ldquo;Einwilligung&rdquo; gar nicht enthaelt.
</p>
<h3>3.4 Der KI-Rechtsassistent (Legal Q&amp;A)</h3>
<p>Ueber die reine Suche hinaus kann das System auch <strong>Fragen beantworten</strong>:</p>
<ol>
<li><strong>Suche:</strong> Das System findet die 5 relevantesten Gesetzesabschnitte zur Frage.</li>
<li><strong>Kontext-Erstellung:</strong> Diese Abschnitte werden mit der Frage an das Sprachmodell (Qwen 2.5 32B) uebergeben.</li>
<li><strong>Antwort-Generierung:</strong> Das Modell formuliert eine verstaendliche Antwort auf Deutsch und zitiert die verwendeten Rechtsquellen.</li>
<li><strong>Quellenangabe:</strong> Jede Antwort enthaelt exakte Zitate mit Artikelangaben.</li>
</ol>
<InfoBox type="warning" title="Wichtige Einschraenkung">
Der Rechtsassistent gibt <strong>keine Rechtsberatung</strong>. Er hilft, relevante
Gesetzespassagen zu finden und verstaendlich zusammenzufassen. Die Antworten enthalten
immer einen Confidence-Score (0-1).
</InfoBox>
</>
)
}

View File

@@ -0,0 +1,129 @@
import { CodeBlock, InfoBox } from '@/components/DevPortalLayout'
export function MultiTenancyLlmAuditSection() {
return (
<>
<h2 id="multi-tenancy">9. Multi-Tenancy und Zugriffskontrolle</h2>
<p>
Das System ist <strong>mandantenfaehig</strong> (Multi-Tenant): Mehrere Organisationen
koennen es gleichzeitig nutzen, ohne dass sie gegenseitig auf ihre Daten zugreifen koennen.
</p>
<h3>9.1 Rollenbasierte Zugriffskontrolle (RBAC)</h3>
<div className="not-prose my-4 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Rolle</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Darf</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr><td className="px-4 py-3 font-medium">Mitarbeiter</td><td className="px-4 py-3">Anwendungsfaelle einreichen, eigene Bewertungen einsehen</td></tr>
<tr><td className="px-4 py-3 font-medium">Teamleiter</td><td className="px-4 py-3">E1-Eskalationen pruefen, Team-Assessments einsehen</td></tr>
<tr><td className="px-4 py-3 font-medium">DSB (Datenschutzbeauftragter)</td><td className="px-4 py-3">E2/E3-Eskalationen pruefen, alle Assessments einsehen, Policies aendern</td></tr>
<tr><td className="px-4 py-3 font-medium">Rechtsabteilung</td><td className="px-4 py-3">E3-Eskalationen pruefen, Grundsatzentscheidungen</td></tr>
<tr><td className="px-4 py-3 font-medium">Administrator</td><td className="px-4 py-3">System konfigurieren, Nutzer verwalten, LLM-Policies festlegen</td></tr>
</tbody>
</table>
</div>
<h3>9.2 PII-Erkennung und -Schutz</h3>
<p>
Bevor Texte an ein Sprachmodell gesendet werden, durchlaufen sie eine automatische
<strong> PII-Erkennung</strong>. Das System erkennt ueber 20 Arten personenbezogener Daten
(E-Mail-Adressen, Telefonnummern, Namen, IP-Adressen, etc.).
Je nach Konfiguration werden erkannte PII-Daten <strong>geschwuerzt</strong>, <strong>maskiert</strong>
oder nur im Audit-Log <strong>markiert</strong>.
</p>
<h2 id="llm-nutzung">10. Wie das System KI nutzt (und wie nicht)</h2>
<div className="not-prose my-6 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Aufgabe</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Entschieden von</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Rolle der KI</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr><td className="px-4 py-3">Machbarkeit (YES/CONDITIONAL/NO)</td><td className="px-4 py-3 font-medium">Deterministische Regeln</td><td className="px-4 py-3 text-gray-400">Keine</td></tr>
<tr><td className="px-4 py-3">Risikoscore berechnen</td><td className="px-4 py-3 font-medium">Regelbasierte Berechnung</td><td className="px-4 py-3 text-gray-400">Keine</td></tr>
<tr><td className="px-4 py-3">Eskalation ausloesen</td><td className="px-4 py-3 font-medium">Schwellenwerte + Regellogik</td><td className="px-4 py-3 text-gray-400">Keine</td></tr>
<tr className="bg-blue-50"><td className="px-4 py-3">Ergebnis erklaeren</td><td className="px-4 py-3 text-gray-400">--</td><td className="px-4 py-3 font-medium text-blue-800">LLM + RAG-Kontext</td></tr>
<tr className="bg-blue-50"><td className="px-4 py-3">Rechtsfragen beantworten</td><td className="px-4 py-3 text-gray-400">--</td><td className="px-4 py-3 font-medium text-blue-800">LLM + RAG (Rechtskorpus)</td></tr>
<tr className="bg-blue-50"><td className="px-4 py-3">Dokumente generieren (DSFA, TOM, VVT)</td><td className="px-4 py-3 text-gray-400">--</td><td className="px-4 py-3 font-medium text-blue-800">LLM + Vorlagen</td></tr>
</tbody>
</table>
</div>
<h3>LLM-Provider und Fallback</h3>
<ol>
<li><strong>Primaer: Ollama (lokal)</strong> -- Qwen 2.5 32B bzw. Mistral, laeuft direkt auf dem Server. Keine Daten verlassen das lokale Netzwerk.</li>
<li><strong>Fallback: Anthropic Claude</strong> -- Wird nur aktiviert, wenn das lokale Modell nicht verfuegbar ist.</li>
</ol>
<h2 id="audit-trail">11. Audit-Trail: Alles wird protokolliert</h2>
<p>Saemtliche Aktionen im System werden revisionssicher protokolliert:</p>
<ul>
<li>Jede Compliance-Bewertung mit allen Ein- und Ausgaben</li>
<li>Jede Eskalationsentscheidung mit Begruendung</li>
<li>Jeder LLM-Aufruf (wer hat was wann gefragt, welches Modell wurde verwendet)</li>
<li>Jede Aenderung an Controls, Evidence und Policies</li>
<li>Jeder Login und Daten-Export</li>
</ul>
<InfoBox type="info" title="Datenschutz des Audit-Trails">
Der Use-Case-Text wird <strong>nur mit Einwilligung des Nutzers</strong> gespeichert.
Standardmaessig wird nur ein SHA-256-Hash des Textes gespeichert.
</InfoBox>
<h2 id="security">12. Security Scanner: Technische Sicherheitspruefung</h2>
<ul>
<li><strong>Container-Scanning (Trivy):</strong> Prueft Docker-Images auf bekannte Schwachstellen (CVEs)</li>
<li><strong>Statische Code-Analyse (Semgrep):</strong> Sucht im Quellcode nach Sicherheitsluecken</li>
<li><strong>Secret Detection (Gitleaks):</strong> Findet versehentlich eingecheckte Passwoerter, API-Keys und Tokens</li>
<li><strong>SBOM-Generierung:</strong> Erstellt eine vollstaendige Liste aller verwendeten Bibliotheken und deren Lizenzen</li>
</ul>
<h2 id="zusammenfassung">13. Zusammenfassung: Der komplette Datenfluss</h2>
<CodeBlock language="text" filename="Der komplette Compliance-Workflow">
{`SCHRITT 1: FAKTEN SAMMELN
Nutzer fuellt Fragebogen aus: Welche Daten? Welcher Zweck? Welche Branche? Wo gehostet?
SCHRITT 2: ANWENDBARKEIT PRUEFEN
Obligations Framework: DSGVO? AI Act? NIS2?
SCHRITT 3: REGELN PRUEFEN (45+ Regeln)
R-001 (WARN): Personenbezogene Daten +10 Risiko
R-060 (WARN): KI-Transparenz fehlt +15 Risiko
→ Gesamt-Risikoscore: 35/100 (LOW), Machbarkeit: CONDITIONAL
SCHRITT 4: CONTROLS ZUORDNEN
C_EXPLICIT_CONSENT, C_TRANSPARENCY, C_DATA_MINIMIZATION
SCHRITT 5: ESKALATION (bei Bedarf)
Score 35 → Stufe E1 → Teamleiter, SLA 24h
SCHRITT 6: ERKLAERUNG GENERIEREN
LLM + RAG: Gesetzesartikel suchen, Erklaerungstext generieren
SCHRITT 7: DOKUMENTATION
DSFA, TOM, VVT, Compliance-Report (PDF/ZIP/JSON)
SCHRITT 8: MONITORING
Controls regelmaessig pruefen, Nachweise auf Ablauf ueberwachen`}
</CodeBlock>
<InfoBox type="success" title="Das Wichtigste in einem Satz">
Der Compliance Hub nimmt die Beschreibung eines KI-Vorhabens entgegen, prueft es gegen
ueber 45 deterministische Regeln und 400+ Gesetzesartikel, berechnet ein Risiko, ordnet
Massnahmen zu, eskaliert bei Bedarf an menschliche Pruefer und dokumentiert alles
revisionssicher -- wobei die KI nur fuer Erklaerungen und Zusammenfassungen eingesetzt wird,
niemals fuer die eigentliche Compliance-Entscheidung.
</InfoBox>
</>
)
}

View File

@@ -0,0 +1,81 @@
import { CodeBlock } from '@/components/DevPortalLayout'
export function ObligationsDsgvoSection() {
return (
<>
<h2 id="obligations">7. Pflichten-Ableitung: Welche Gesetze gelten fuer mich?</h2>
<p>
Nicht jedes Gesetz gilt fuer jede Organisation. Das <strong>Obligations Framework</strong>
ermittelt automatisch, welche konkreten Pflichten sich aus der Situation einer Organisation
ergeben.
</p>
<h3>Beispiel: NIS2-Anwendbarkeit</h3>
<CodeBlock language="text" filename="Entscheidungsbaum: Gilt NIS2 fuer mein Unternehmen?">
{`Ist Ihr Unternehmen in einem der NIS2-Sektoren taetig?
(Energie, Transport, Banken, Gesundheit, Wasser, Digitale Infrastruktur, ...)
├── Nein → NIS2 gilt NICHT fuer Sie
└── Ja → Wie gross ist Ihr Unternehmen?
├── >= 250 Mitarbeiter ODER >= 50 Mio. EUR Umsatz
│ → ESSENTIAL ENTITY (wesentliche Einrichtung)
│ → Volle NIS2-Pflichten, strenge Aufsicht
│ → Bussgelder bis 10 Mio. EUR oder 2% Jahresumsatz
├── >= 50 Mitarbeiter ODER >= 10 Mio. EUR Umsatz
│ → IMPORTANT ENTITY (wichtige Einrichtung)
│ → NIS2-Pflichten, reaktive Aufsicht
│ → Bussgelder bis 7 Mio. EUR oder 1,4% Jahresumsatz
└── Kleiner → NIS2 gilt grundsaetzlich NICHT`}
</CodeBlock>
<h2 id="dsgvo-module">8. DSGVO-Compliance-Module im Detail</h2>
<p>Fuer die Einhaltung der DSGVO bietet der Compliance Hub spezialisierte Module:</p>
<h3>8.1 Consent Management (Einwilligungsverwaltung)</h3>
<p>
Verwaltet die Einwilligung von Nutzern gemaess Art. 6/7 DSGVO. Jede Einwilligung wird
protokolliert: wer hat wann, auf welchem Kanal, fuer welchen Zweck zugestimmt (oder abgelehnt)?
</p>
<p>
<strong>Zwecke:</strong> Essential (funktionsnotwendig), Functional, Analytics, Marketing,
Personalization, Third-Party.
</p>
<h3>8.2 DSR Management (Betroffenenrechte)</h3>
<p>
Verwaltet Antraege betroffener Personen nach Art. 15-21 DSGVO: Auskunft, Berichtigung,
Loeschung, Datenportabilitaet, Einschraenkung und Widerspruch. Das System ueberwacht die
<strong> 30-Tage-Frist</strong> (Art. 12) und eskaliert automatisch bei drohenden Fristverstossen.
</p>
<h3>8.3 VVT (Verzeichnis von Verarbeitungstaetigkeiten)</h3>
<p>
Dokumentiert alle Datenverarbeitungen gemaess Art. 30 DSGVO: Welche Daten werden fuer
welchen Zweck, auf welcher Rechtsgrundlage, wie lange und von wem verarbeitet?
</p>
<h3>8.4 DSFA (Datenschutz-Folgenabschaetzung)</h3>
<p>
Wenn eine Datenverarbeitung voraussichtlich ein hohes Risiko fuer die Rechte natuerlicher
Personen mit sich bringt, ist eine DSFA nach Art. 35 DSGVO Pflicht.
</p>
<h3>8.5 TOM (Technisch-Organisatorische Massnahmen)</h3>
<p>
Dokumentiert die Schutzmassnahmen nach Art. 32 DSGVO. Fuer jede Massnahme wird erfasst:
Kategorie (z.B. Verschluesselung, Zugriffskontrolle), Status, Verantwortlicher und Nachweise.
</p>
<h3>8.6 Loeschkonzept</h3>
<p>
Verwaltet Aufbewahrungsfristen und automatische Loeschung gemaess Art. 5/17 DSGVO.
Fuer jede Datenkategorie wird definiert: wie lange darf sie gespeichert werden, wann muss
sie geloescht werden und wie (z.B. Ueberschreiben, Schluesselloeschung).
</p>
</>
)
}

View File

@@ -1,4 +1,10 @@
import { DevPortalLayout, CodeBlock, InfoBox } from '@/components/DevPortalLayout'
import { DevPortalLayout } from '@/components/DevPortalLayout'
import { IntroArchitectureSection } from './_components/IntroArchitectureSection'
import { LegalCorpusSection } from './_components/LegalCorpusSection'
import { ComplianceEngineSection } from './_components/ComplianceEngineSection'
import { EscalationControlsSection } from './_components/EscalationControlsSection'
import { ObligationsDsgvoSection } from './_components/ObligationsDsgvoSection'
import { MultiTenancyLlmAuditSection } from './_components/MultiTenancyLlmAuditSection'
export default function ComplianceServiceDocsPage() {
return (
@@ -6,886 +12,12 @@ export default function ComplianceServiceDocsPage() {
title="Wie funktioniert der Compliance Service?"
description="Eine umfassende Erklaerung des gesamten Systems -- vom Rechtstext bis zur Compliance-Bewertung."
>
{/* ============================================================ */}
{/* 1. EINLEITUNG */}
{/* ============================================================ */}
<h2 id="einfuehrung">1. Was ist der Compliance Hub?</h2>
<p>
Der <strong>BreakPilot Compliance Hub</strong> ist ein System, das Organisationen dabei
unterstuetzt, gesetzliche Vorschriften einzuhalten. Er beantwortet die zentrale Frage:
</p>
<blockquote>
<em>&ldquo;Duerfen wir das, was wir vorhaben, ueberhaupt so machen -- und wenn ja, welche
Auflagen muessen wir dafuer erfuellen?&rdquo;</em>
</blockquote>
<p>
Konkret geht es um EU- und deutsche Gesetze, die fuer den Umgang mit Daten und
kuenstlicher Intelligenz relevant sind: die <strong>DSGVO</strong>, den <strong>AI Act</strong>,
die <strong>NIS2-Richtlinie</strong> und viele weitere Regelwerke. Das System hat vier
Hauptaufgaben:
</p>
<ol>
<li>
<strong>Wissen bereitstellen:</strong> Hunderte Rechtstexte sind eingelesen und
durchsuchbar -- nicht nur per Stichwort, sondern nach Bedeutung (semantische Suche).
</li>
<li>
<strong>Bewerten:</strong> Wenn ein Nutzer einen geplanten KI-Anwendungsfall beschreibt,
bewertet das System automatisch, ob er zulaessig ist, welches Risiko besteht und welche
Massnahmen noetig sind.
</li>
<li>
<strong>Dokumentieren:</strong> Das System erzeugt die Dokumente, die Aufsichtsbehoerden
verlangen: Datenschutz-Folgenabschaetzungen (DSFA), technisch-organisatorische Massnahmen
(TOM), Verarbeitungsverzeichnisse (VVT) und mehr.
</li>
<li>
<strong>Nachweisen:</strong> Jede Bewertung, jede Entscheidung und jeder Zugriff wird
revisionssicher protokolliert -- als Nachweis gegenueber Pruefer und Behoerden.
</li>
</ol>
<InfoBox type="info" title="Kern-Designprinzip">
<strong>Die KI ist nicht die Entscheidungsinstanz.</strong> Alle
Compliance-Entscheidungen (zulaessig / bedingt zulaessig / nicht zulaessig) trifft ein
deterministisches Regelwerk. Das LLM (Sprachmodell) wird ausschliesslich dafuer verwendet,
Ergebnisse verstaendlich zu <em>erklaeren</em> -- niemals um sie zu <em>treffen</em>.
</InfoBox>
{/* ============================================================ */}
{/* 2. ARCHITEKTUR-UEBERSICHT */}
{/* ============================================================ */}
<h2 id="architektur">2. Architektur im Ueberblick</h2>
<p>
Das System besteht aus mehreren Bausteinen, die jeweils eine klar abgegrenzte Aufgabe haben.
Man kann es sich wie ein Buero vorstellen:
</p>
<div className="not-prose my-6 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Baustein</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Analogie</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Technologie</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Aufgabe</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr><td className="px-4 py-3 font-medium">API-Gateway</td><td className="px-4 py-3">Empfang / Rezeption</td><td className="px-4 py-3">Go (Gin)</td><td className="px-4 py-3">Nimmt alle Anfragen entgegen, prueft Identitaet und leitet weiter</td></tr>
<tr><td className="px-4 py-3 font-medium">Compliance Engine (UCCA)</td><td className="px-4 py-3">Sachbearbeiter</td><td className="px-4 py-3">Go</td><td className="px-4 py-3">Bewertet Anwendungsfaelle gegen 45+ Regeln und berechnet Risikoscore</td></tr>
<tr><td className="px-4 py-3 font-medium">RAG Service</td><td className="px-4 py-3">Rechtsbibliothek</td><td className="px-4 py-3">Python (FastAPI)</td><td className="px-4 py-3">Durchsucht Gesetze semantisch und beantwortet Rechtsfragen</td></tr>
<tr><td className="px-4 py-3 font-medium">Legal Corpus</td><td className="px-4 py-3">Gesetzesbuecher im Regal</td><td className="px-4 py-3">YAML/JSON + Qdrant</td><td className="px-4 py-3">Enthaelt alle Rechtstexte als durchsuchbare Wissensbasis</td></tr>
<tr><td className="px-4 py-3 font-medium">Policy Engine</td><td className="px-4 py-3">Regelbuch des Sachbearbeiters</td><td className="px-4 py-3">YAML-Dateien</td><td className="px-4 py-3">45+ auditierbare Pruefregeln in maschinenlesbarer Form</td></tr>
<tr><td className="px-4 py-3 font-medium">Eskalations-System</td><td className="px-4 py-3">Chef-Unterschrift</td><td className="px-4 py-3">Go + PostgreSQL</td><td className="px-4 py-3">Leitet kritische Faelle an menschliche Pruefer weiter</td></tr>
<tr><td className="px-4 py-3 font-medium">Admin Dashboard</td><td className="px-4 py-3">Schreibtisch</td><td className="px-4 py-3">Next.js</td><td className="px-4 py-3">Benutzeroberflaeche fuer alle Funktionen</td></tr>
<tr><td className="px-4 py-3 font-medium">PostgreSQL</td><td className="px-4 py-3">Aktenschrank</td><td className="px-4 py-3">SQL-Datenbank</td><td className="px-4 py-3">Speichert Assessments, Eskalationen, Controls, Audit-Trail</td></tr>
<tr><td className="px-4 py-3 font-medium">Qdrant</td><td className="px-4 py-3">Suchindex der Bibliothek</td><td className="px-4 py-3">Vektordatenbank</td><td className="px-4 py-3">Ermoeglicht semantische Suche ueber Rechtstexte</td></tr>
</tbody>
</table>
</div>
<h3>Wie die Bausteine zusammenspielen</h3>
<CodeBlock language="text" filename="Datenfluss: Vom Benutzer zur Compliance-Bewertung">
{`Benutzer (Browser)
|
v
┌─────────────────────────────┐
│ API-Gateway (Port 8080) │ ← Authentifizierung, Rate-Limiting, Tenant-Isolation
│ "Wer bist du? Darfst du?" │
└──────────┬──────────────────┘
|
┌─────┼──────────────────────────────┐
v v v
┌─────────────┐ ┌──────────────┐ ┌──────────────┐
│ Compliance │ │ RAG Service │ │ Security │
│ Engine │ │ (Bibliothek)│ │ Scanner │
│ (Bewertung) │ │ │ │ │
└──────┬───┬──┘ └──────┬───────┘ └──────────────┘
| | |
| | ┌──────┴───────┐
| | │ Qdrant │ ← Vektordatenbank mit allen Rechtstexten
| | │ (Suchindex) │
| | └──────────────┘
| |
| └──────────────────────┐
v v
┌──────────────┐ ┌──────────────┐
│ PostgreSQL │ │ Eskalation │
│ (Speicher) │ │ (E0-E3) │
└──────────────┘ └──────────────┘`}
</CodeBlock>
{/* ============================================================ */}
{/* 3. DER KATALOGMANAGER / LEGAL CORPUS */}
{/* ============================================================ */}
<h2 id="katalogmanager">3. Der Katalogmanager: Die Wissensbasis</h2>
<p>
Das Herzstueck des Systems ist seine <strong>Wissensbasis</strong> -- eine Sammlung aller
relevanten Rechtstexte, die das System kennt und durchsuchen kann. Wir nennen das den
<strong> Legal Corpus</strong> (wörtlich: &ldquo;Rechtlicher Koerper&rdquo;).
</p>
<h3>3.1 Welche Dokumente sind enthalten?</h3>
<p>
Der Legal Corpus ist in zwei Hauptbereiche gegliedert: <strong>EU-Recht</strong> und
<strong> deutsches Recht</strong>.
</p>
<h4>EU-Verordnungen und -Richtlinien</h4>
<div className="not-prose my-4 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-blue-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-700">Regelwerk</th>
<th className="px-4 py-3 text-left font-medium text-gray-700">Abkuerzung</th>
<th className="px-4 py-3 text-left font-medium text-gray-700">Artikel</th>
<th className="px-4 py-3 text-left font-medium text-gray-700">Gueltig seit</th>
<th className="px-4 py-3 text-left font-medium text-gray-700">Thema</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr><td className="px-4 py-3 font-medium">Datenschutz-Grundverordnung</td><td className="px-4 py-3">DSGVO</td><td className="px-4 py-3">99</td><td className="px-4 py-3">25.05.2018</td><td className="px-4 py-3">Schutz personenbezogener Daten</td></tr>
<tr><td className="px-4 py-3 font-medium">KI-Verordnung</td><td className="px-4 py-3">AI Act</td><td className="px-4 py-3">113</td><td className="px-4 py-3">01.08.2024</td><td className="px-4 py-3">Regulierung kuenstlicher Intelligenz</td></tr>
<tr><td className="px-4 py-3 font-medium">Netz- und Informationssicherheit</td><td className="px-4 py-3">NIS2</td><td className="px-4 py-3">46</td><td className="px-4 py-3">18.10.2024</td><td className="px-4 py-3">Cybersicherheit kritischer Infrastrukturen</td></tr>
<tr><td className="px-4 py-3 font-medium">ePrivacy-Verordnung</td><td className="px-4 py-3">ePrivacy</td><td className="px-4 py-3">--</td><td className="px-4 py-3">in Arbeit</td><td className="px-4 py-3">Vertraulichkeit elektronischer Kommunikation</td></tr>
<tr><td className="px-4 py-3 font-medium">Cyber Resilience Act</td><td className="px-4 py-3">CRA</td><td className="px-4 py-3">--</td><td className="px-4 py-3">2024</td><td className="px-4 py-3">Cybersicherheit von Produkten mit digitalen Elementen</td></tr>
<tr><td className="px-4 py-3 font-medium">Data Act</td><td className="px-4 py-3">DA</td><td className="px-4 py-3">--</td><td className="px-4 py-3">2024</td><td className="px-4 py-3">Zugang und Nutzung von Daten</td></tr>
<tr><td className="px-4 py-3 font-medium">Digital Markets Act</td><td className="px-4 py-3">DMA</td><td className="px-4 py-3">--</td><td className="px-4 py-3">2023</td><td className="px-4 py-3">Regulierung digitaler Gatekeeper</td></tr>
</tbody>
</table>
</div>
<h4>Deutsches Recht</h4>
<div className="not-prose my-4 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-green-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-700">Gesetz</th>
<th className="px-4 py-3 text-left font-medium text-gray-700">Abkuerzung</th>
<th className="px-4 py-3 text-left font-medium text-gray-700">Thema</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr><td className="px-4 py-3 font-medium">Telekommunikation-Digitale-Dienste-Datenschutz-Gesetz</td><td className="px-4 py-3">TDDDG</td><td className="px-4 py-3">Datenschutz bei Telekommunikation und digitalen Diensten</td></tr>
<tr><td className="px-4 py-3 font-medium">Bundesdatenschutzgesetz</td><td className="px-4 py-3">BDSG</td><td className="px-4 py-3">Nationale Ergaenzung zur DSGVO</td></tr>
<tr><td className="px-4 py-3 font-medium">IT-Sicherheitsgesetz</td><td className="px-4 py-3">IT-SiG</td><td className="px-4 py-3">IT-Sicherheit kritischer Infrastrukturen</td></tr>
<tr><td className="px-4 py-3 font-medium">BSI-KritisV</td><td className="px-4 py-3">KritisV</td><td className="px-4 py-3">BSI-Verordnung fuer kritische Infrastrukturen</td></tr>
</tbody>
</table>
</div>
<h4>Standards und Normen</h4>
<div className="not-prose my-4 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-purple-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-700">Standard</th>
<th className="px-4 py-3 text-left font-medium text-gray-700">Thema</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr><td className="px-4 py-3 font-medium">ISO 27001</td><td className="px-4 py-3">Informationssicherheits-Managementsystem (ISMS)</td></tr>
<tr><td className="px-4 py-3 font-medium">SOC2</td><td className="px-4 py-3">Trust Service Criteria (Sicherheit, Verfuegbarkeit, Vertraulichkeit)</td></tr>
<tr><td className="px-4 py-3 font-medium">BSI Grundschutz</td><td className="px-4 py-3">IT-Grundschutz des BSI</td></tr>
<tr><td className="px-4 py-3 font-medium">BSI TR-03161</td><td className="px-4 py-3">Technische Richtlinie fuer Anforderungen an Anwendungen im Gesundheitswesen</td></tr>
<tr><td className="px-4 py-3 font-medium">SCC (Standard Contractual Clauses)</td><td className="px-4 py-3">Standardvertragsklauseln fuer Drittlandtransfers</td></tr>
</tbody>
</table>
</div>
<h3>3.2 Wie werden Rechtstexte gespeichert?</h3>
<p>
Jeder Rechtstext durchlaeuft eine <strong>Verarbeitungspipeline</strong>, bevor er im
System durchsuchbar ist. Der Vorgang laesst sich mit dem Erstellen eines
Bibliothekskatalogs vergleichen:
</p>
<ol>
<li>
<strong>Erfassung (Ingestion):</strong> Der Rechtstext wird als Dokument (PDF, Markdown
oder Klartext) in das System geladen. Fuer jede Verordnung gibt es eine
<code>metadata.json</code>-Datei, die beschreibt, um welches Gesetz es sich handelt,
wie viele Artikel es hat und welche Schluesselbegriffe relevant sind.
</li>
<li>
<strong>Zerkleinerung (Chunking):</strong> Lange Gesetzestexte werden in kleinere
Abschnitte von ca. 512 Zeichen zerlegt. Dabei ueberlappen sich die Abschnitte um
50 Zeichen, damit kein Kontext verloren geht. Stellen Sie sich vor, Sie zerschneiden
einen langen Brief in Absaetze, wobei jeder Absatz die letzten zwei Zeilen des
vorherigen enthaelt.
</li>
<li>
<strong>Vektorisierung (Embedding):</strong> Jeder Textabschnitt wird vom
Embedding-Modell <strong>BGE-M3</strong> in einen <em>Vektor</em> umgewandelt -- eine
Liste von 1.024 Zahlen, die die <em>Bedeutung</em> des Textes repraesentieren. Texte
mit aehnlicher Bedeutung haben aehnliche Vektoren, unabhaengig von der Wortwahl.
</li>
<li>
<strong>Indexierung:</strong> Die Vektoren werden in der Vektordatenbank
<strong> Qdrant</strong> gespeichert. Zusammen mit jedem Vektor werden Metadaten
hinterlegt: zu welchem Gesetz der Text gehoert, welcher Artikel es ist und welcher
Paragraph.
</li>
</ol>
<CodeBlock language="text" filename="Verarbeitungspipeline: Vom Gesetzestext zur Suche">
{`Rechtstext (z.B. DSGVO Art. 32)
|
v
┌────────────────────────┐
│ 1. Einlesen │ ← PDF/Markdown/Klartext + metadata.json
│ Metadaten zuordnen │
└──────────┬─────────────┘
|
v
┌────────────────────────┐
│ 2. Chunking │ ← Text in 512-Zeichen-Abschnitte zerlegen
│ Ueberlappung: 50 Zch. │ (mit 50 Zeichen Ueberlappung)
└──────────┬─────────────┘
|
v
┌────────────────────────┐
│ 3. Embedding │ ← BGE-M3 wandelt Text in 1024 Zahlen um
│ Text → Vektor │ (Bedeutungs-Repraesentation)
└──────────┬─────────────┘
|
v
┌────────────────────────┐
│ 4. Qdrant speichern │ ← Vektor + Metadaten werden indexiert
│ Sofort durchsuchbar │ (~2.274 Chunks insgesamt)
└────────────────────────┘`}
</CodeBlock>
<InfoBox type="success" title="Aktueller Bestand">
Der Legal Corpus enthaelt derzeit ca. <strong>2.274 Textabschnitte</strong> aus ueber
400 Gesetzesartikeln. Darunter 99 DSGVO-Artikel, 85 AI-Act-Artikel, 46 NIS2-Artikel,
86 BDSG-Paragraphen sowie zahlreiche Artikel aus TDDDG, CRA, Data Act und weiteren
Regelwerken.
</InfoBox>
<h3>3.3 Wie funktioniert die semantische Suche?</h3>
<p>
Klassische Suchmaschinen suchen nach <em>Woertern</em>. Wenn Sie &ldquo;Einwilligung&rdquo;
eingeben, finden sie nur Texte, die genau dieses Wort enthalten. Unsere semantische Suche
funktioniert anders: Sie sucht nach <em>Bedeutung</em>.
</p>
<p>
<strong>Beispiel:</strong> Wenn Sie fragen &ldquo;Wann muss ich den Nutzer um Erlaubnis
bitten?&rdquo;, findet das System Art. 7 DSGVO (Bedingungen fuer die Einwilligung), obwohl
Ihre Frage das Wort &ldquo;Einwilligung&rdquo; gar nicht enthaelt. Das funktioniert, weil
die Bedeutungsvektoren von &ldquo;um Erlaubnis bitten&rdquo; und &ldquo;Einwilligung&rdquo;
sehr aehnlich sind.
</p>
<p>Der Suchvorgang im Detail:</p>
<ol>
<li>Ihre Suchanfrage wird vom gleichen Modell (BGE-M3) in einen Vektor umgewandelt.</li>
<li>Qdrant vergleicht diesen Vektor mit allen gespeicherten Vektoren (Kosinus-Aehnlichkeit).</li>
<li>Die aehnlichsten Textabschnitte werden zurueckgegeben, sortiert nach Relevanz (Score 0-1).</li>
<li>Optional kann nach bestimmten Gesetzen gefiltert werden (nur DSGVO, nur AI Act, etc.).</li>
</ol>
<h3>3.4 Der KI-Rechtsassistent (Legal Q&amp;A)</h3>
<p>
Ueber die reine Suche hinaus kann das System auch <strong>Fragen beantworten</strong>.
Dabei wird die semantische Suche mit einem Sprachmodell kombiniert:
</p>
<ol>
<li><strong>Suche:</strong> Das System findet die 5 relevantesten Gesetzesabschnitte zur Frage.</li>
<li><strong>Kontext-Erstellung:</strong> Diese Abschnitte werden zusammen mit der Frage an das Sprachmodell (Qwen 2.5 32B) uebergeben.</li>
<li><strong>Antwort-Generierung:</strong> Das Modell formuliert eine verstaendliche Antwort auf Deutsch und zitiert die verwendeten Rechtsquellen.</li>
<li><strong>Quellenangabe:</strong> Jede Antwort enthaelt exakte Zitate mit Artikelangaben, damit die Aussagen nachpruefbar sind.</li>
</ol>
<InfoBox type="warning" title="Wichtige Einschraenkung">
Der Rechtsassistent gibt <strong>keine Rechtsberatung</strong>. Er hilft, relevante
Gesetzespassagen zu finden und verstaendlich zusammenzufassen. Die Antworten enthalten
immer einen Confidence-Score (0-1), der angibt, wie sicher sich das System ist. Bei
niedrigem Score wird explizit auf die Unsicherheit hingewiesen.
</InfoBox>
{/* ============================================================ */}
{/* 4. DIE COMPLIANCE ENGINE (UCCA) */}
{/* ============================================================ */}
<h2 id="compliance-engine">4. Die Compliance Engine: Wie Bewertungen funktionieren</h2>
<p>
Das Kernmodul des Compliance Hub ist die <strong>UCCA Engine</strong> (Unified Compliance
Control Assessment). Sie bewertet, ob ein geplanter KI-Anwendungsfall zulaessig ist.
</p>
<h3>4.1 Der Fragebogen (Use Case Intake)</h3>
<p>
Alles beginnt mit einem strukturierten Fragebogen. Der Nutzer beschreibt seinen geplanten
Anwendungsfall, indem er Fragen zu folgenden Bereichen beantwortet:
</p>
<div className="not-prose my-4 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Bereich</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Typische Fragen</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Warum relevant?</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr><td className="px-4 py-3 font-medium">Datentypen</td><td className="px-4 py-3">Werden personenbezogene Daten verarbeitet? Besondere Kategorien (Art. 9)?</td><td className="px-4 py-3">Art. 9-Daten (Gesundheit, Religion, etc.) erfordern besondere Schutzmassnahmen</td></tr>
<tr><td className="px-4 py-3 font-medium">Verarbeitungszweck</td><td className="px-4 py-3">Wird Profiling betrieben? Scoring? Automatisierte Entscheidungen?</td><td className="px-4 py-3">Art. 22 DSGVO schuetzt vor vollautomatischen Entscheidungen</td></tr>
<tr><td className="px-4 py-3 font-medium">Modellnutzung</td><td className="px-4 py-3">Wird das Modell nur genutzt (Inference) oder mit Nutzerdaten trainiert (Fine-Tuning)?</td><td className="px-4 py-3">Training mit personenbezogenen Daten erfordert besondere Rechtsgrundlage</td></tr>
<tr><td className="px-4 py-3 font-medium">Automatisierungsgrad</td><td className="px-4 py-3">Assistenzsystem, teil- oder vollautomatisch?</td><td className="px-4 py-3">Vollautomatische Systeme unterliegen strengeren Auflagen</td></tr>
<tr><td className="px-4 py-3 font-medium">Datenspeicherung</td><td className="px-4 py-3">Wie lange werden Daten gespeichert? Wo?</td><td className="px-4 py-3">DSGVO Art. 5: Speicherbegrenzung / Zweckbindung</td></tr>
<tr><td className="px-4 py-3 font-medium">Hosting-Standort</td><td className="px-4 py-3">EU, USA, oder anderswo?</td><td className="px-4 py-3">Drittlandtransfers erfordern zusaetzliche Garantien (SCC, DPF)</td></tr>
<tr><td className="px-4 py-3 font-medium">Branche</td><td className="px-4 py-3">Gesundheit, Finanzen, Bildung, Automotive, ...?</td><td className="px-4 py-3">Bestimmte Branchen unterliegen zusaetzlichen Regulierungen</td></tr>
<tr><td className="px-4 py-3 font-medium">Menschliche Aufsicht</td><td className="px-4 py-3">Gibt es einen Human-in-the-Loop?</td><td className="px-4 py-3">AI Act fordert menschliche Aufsicht fuer Hochrisiko-KI</td></tr>
</tbody>
</table>
</div>
<h3>4.2 Die Pruefregeln (Policy Engine)</h3>
<p>
Die Antworten des Fragebogens werden gegen ein <strong>Regelwerk von ueber 45 Regeln</strong>
geprueft. Jede Regel ist in einer YAML-Datei definiert und hat folgende Struktur:
</p>
<ul>
<li><strong>Bedingung:</strong> Wann greift die Regel? (z.B. &ldquo;Art. 9-Daten werden verarbeitet&rdquo;)</li>
<li><strong>Schweregrad:</strong> INFO (Hinweis), WARN (Risiko, aber loesbar) oder BLOCK (grundsaetzlich nicht zulaessig)</li>
<li><strong>Auswirkung:</strong> Was passiert, wenn die Regel greift? (Risikoerhoehung, zusaetzliche Controls, Eskalation)</li>
<li><strong>Gesetzesreferenz:</strong> Auf welchen Artikel bezieht sich die Regel?</li>
</ul>
<p>Die Regeln sind in <strong>10 Kategorien</strong> organisiert:</p>
<div className="not-prose my-4 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Kategorie</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Regel-IDs</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Prueft</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Beispiel</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr><td className="px-4 py-3 font-medium">A. Datenklassifikation</td><td className="px-4 py-3">R-001 bis R-006</td><td className="px-4 py-3">Welche Daten werden verarbeitet?</td><td className="px-4 py-3">R-001: Werden personenbezogene Daten verarbeitet? &rarr; +10 Risiko</td></tr>
<tr><td className="px-4 py-3 font-medium">B. Zweck &amp; Kontext</td><td className="px-4 py-3">R-010 bis R-013</td><td className="px-4 py-3">Warum und wie werden Daten genutzt?</td><td className="px-4 py-3">R-011: Profiling? &rarr; DSFA empfohlen</td></tr>
<tr><td className="px-4 py-3 font-medium">C. Automatisierung</td><td className="px-4 py-3">R-020 bis R-025</td><td className="px-4 py-3">Wie stark ist die Automatisierung?</td><td className="px-4 py-3">R-023: Vollautomatisch? &rarr; Art. 22 Risiko</td></tr>
<tr><td className="px-4 py-3 font-medium">D. Training vs. Nutzung</td><td className="px-4 py-3">R-030 bis R-035</td><td className="px-4 py-3">Wird das Modell trainiert?</td><td className="px-4 py-3">R-035: Training + Art. 9-Daten? &rarr; BLOCK</td></tr>
<tr><td className="px-4 py-3 font-medium">E. Speicherung</td><td className="px-4 py-3">R-040 bis R-042</td><td className="px-4 py-3">Wie lange werden Daten gespeichert?</td><td className="px-4 py-3">R-041: Unbegrenzte Speicherung? &rarr; WARN</td></tr>
<tr><td className="px-4 py-3 font-medium">F. Hosting</td><td className="px-4 py-3">R-050 bis R-052</td><td className="px-4 py-3">Wo werden Daten gehostet?</td><td className="px-4 py-3">R-051: Hosting in USA? &rarr; SCC/DPF pruefen</td></tr>
<tr><td className="px-4 py-3 font-medium">G. Transparenz</td><td className="px-4 py-3">R-060 bis R-062</td><td className="px-4 py-3">Werden Nutzer informiert?</td><td className="px-4 py-3">R-060: Keine Offenlegung? &rarr; AI Act Verstoss</td></tr>
<tr><td className="px-4 py-3 font-medium">H. Branchenspezifisch</td><td className="px-4 py-3">R-070 bis R-074</td><td className="px-4 py-3">Gelten Sonderregeln fuer die Branche?</td><td className="px-4 py-3">R-070: Gesundheitsbranche? &rarr; zusaetzliche Anforderungen</td></tr>
<tr><td className="px-4 py-3 font-medium">I. Aggregation</td><td className="px-4 py-3">R-090 bis R-092</td><td className="px-4 py-3">Meta-Regeln ueber andere Regeln</td><td className="px-4 py-3">R-090: Zu viele WARN-Regeln? &rarr; Gesamtrisiko erhoeht</td></tr>
<tr><td className="px-4 py-3 font-medium">J. Erklaerung</td><td className="px-4 py-3">R-100</td><td className="px-4 py-3">Warum hat das System so entschieden?</td><td className="px-4 py-3">Automatisch generierte Begruendung</td></tr>
</tbody>
</table>
</div>
<InfoBox type="info" title="Warum YAML-Regeln statt Code?">
Die Regeln sind bewusst in YAML-Dateien definiert und nicht im Programmcode versteckt.
Das hat zwei Vorteile: (1) Sie sind fuer Nicht-Programmierer lesbar und damit
<strong> auditierbar</strong>, d.h. ein Datenschutzbeauftragter oder Wirtschaftspruefer kann
pruefen, ob die Regeln korrekt sind. (2) Sie koennen <strong>versioniert</strong> werden --
wenn sich ein Gesetz aendert, wird die Regelaenderung im Versionsverlauf sichtbar.
</InfoBox>
<h3>4.3 Das Ergebnis: Die Compliance-Bewertung</h3>
<p>
Nach der Pruefung aller Regeln erhaelt der Nutzer eine strukturierte Bewertung:
</p>
<div className="not-prose my-4 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Ergebnis</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Beschreibung</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr>
<td className="px-4 py-3 font-medium">Machbarkeit</td>
<td className="px-4 py-3">
<span className="inline-block px-2 py-0.5 rounded bg-green-100 text-green-800 text-xs font-bold mr-1">YES</span>
<span className="inline-block px-2 py-0.5 rounded bg-yellow-100 text-yellow-800 text-xs font-bold mr-1">CONDITIONAL</span>
<span className="inline-block px-2 py-0.5 rounded bg-red-100 text-red-800 text-xs font-bold">NO</span>
</td>
</tr>
<tr><td className="px-4 py-3 font-medium">Risikoscore</td><td className="px-4 py-3">0-100 Punkte. Je hoeher, desto mehr Massnahmen sind erforderlich.</td></tr>
<tr><td className="px-4 py-3 font-medium">Risikostufe</td><td className="px-4 py-3">MINIMAL / LOW / MEDIUM / HIGH / UNACCEPTABLE</td></tr>
<tr><td className="px-4 py-3 font-medium">Ausgeloeste Regeln</td><td className="px-4 py-3">Liste aller Regeln, die angeschlagen haben, mit Schweregrad und Gesetzesreferenz</td></tr>
<tr><td className="px-4 py-3 font-medium">Erforderliche Controls</td><td className="px-4 py-3">Konkrete Massnahmen, die umgesetzt werden muessen (z.B. Verschluesselung, Einwilligung einholen)</td></tr>
<tr><td className="px-4 py-3 font-medium">Empfohlene Architektur</td><td className="px-4 py-3">Technische Muster, die eingesetzt werden sollten (z.B. On-Premise statt Cloud)</td></tr>
<tr><td className="px-4 py-3 font-medium">Verbotene Muster</td><td className="px-4 py-3">Technische Ansaetze, die vermieden werden muessen</td></tr>
<tr><td className="px-4 py-3 font-medium">DSFA erforderlich?</td><td className="px-4 py-3">Ob eine Datenschutz-Folgenabschaetzung nach Art. 35 DSGVO durchgefuehrt werden muss</td></tr>
</tbody>
</table>
</div>
<CodeBlock language="text" filename="Beispiel: Bewertung eines Chatbots mit Kundendaten">
{`Anwendungsfall: "Chatbot fuer Kundenservice mit Zugriff auf Bestellhistorie"
Machbarkeit: CONDITIONAL (bedingt zulaessig)
Risikoscore: 35/100 (LOW)
Risikostufe: LOW
Ausgeloeste Regeln:
R-001 WARN Personenbezogene Daten werden verarbeitet (Art. 6 DSGVO)
R-010 INFO Verarbeitungszweck: Kundenservice (Art. 5 DSGVO)
R-020 INFO Assistenzsystem (nicht vollautomatisch) (Art. 22 DSGVO)
R-060 WARN Nutzer muessen ueber KI-Nutzung informiert werden (AI Act Art. 52)
Erforderliche Controls:
C_EXPLICIT_CONSENT Einwilligung fuer Chatbot-Nutzung einholen
C_TRANSPARENCY Hinweis "Sie sprechen mit einer KI"
C_DATA_MINIMIZATION Nur notwendige Bestelldaten abrufen
DSFA erforderlich: Nein (Risikoscore unter 40)
Eskalation: E0 (keine manuelle Pruefung noetig)`}
</CodeBlock>
{/* ============================================================ */}
{/* 5. DAS ESKALATIONS-SYSTEM */}
{/* ============================================================ */}
<h2 id="eskalation">5. Das Eskalations-System: Wann Menschen entscheiden</h2>
<p>
Nicht jede Bewertung ist eindeutig. Fuer heikle Faelle gibt es ein abgestuftes
Eskalations-System, das sicherstellt, dass die richtigen Menschen die endgueltige
Entscheidung treffen.
</p>
<div className="not-prose my-6 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Stufe</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Wann?</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Wer prueft?</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Frist (SLA)</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Beispiel</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr className="bg-green-50"><td className="px-4 py-3 font-bold text-green-800">E0</td><td className="px-4 py-3">Nur INFO-Regeln, Risiko &lt; 20</td><td className="px-4 py-3">Niemand (automatisch freigegeben)</td><td className="px-4 py-3">--</td><td className="px-4 py-3">Spam-Filter ohne personenbezogene Daten</td></tr>
<tr className="bg-yellow-50"><td className="px-4 py-3 font-bold text-yellow-800">E1</td><td className="px-4 py-3">WARN-Regeln, Risiko 20-39</td><td className="px-4 py-3">Teamleiter</td><td className="px-4 py-3">24 Stunden</td><td className="px-4 py-3">Chatbot mit Kundendaten (unser Beispiel oben)</td></tr>
<tr className="bg-orange-50"><td className="px-4 py-3 font-bold text-orange-800">E2</td><td className="px-4 py-3">Art. 9-Daten ODER Risiko 40-59 ODER DSFA empfohlen</td><td className="px-4 py-3">Datenschutzbeauftragter (DSB)</td><td className="px-4 py-3">8 Stunden</td><td className="px-4 py-3">KI-System, das Gesundheitsdaten verarbeitet</td></tr>
<tr className="bg-red-50"><td className="px-4 py-3 font-bold text-red-800">E3</td><td className="px-4 py-3">BLOCK-Regel ODER Risiko &ge; 60 ODER Art. 22-Risiko</td><td className="px-4 py-3">DSB + Rechtsabteilung</td><td className="px-4 py-3">4 Stunden</td><td className="px-4 py-3">Vollautomatische Kreditentscheidung</td></tr>
</tbody>
</table>
</div>
<p>
<strong>Zuweisung:</strong> Die Zuweisung erfolgt automatisch an den Pruefer mit der
geringsten aktuellen Arbeitslast (Workload-basiertes Round-Robin). Jeder Pruefer hat eine
konfigurierbare Obergrenze fuer gleichzeitige Reviews (z.B. 10 fuer Teamleiter, 5 fuer DSB,
3 fuer Rechtsabteilung).
</p>
<p>
<strong>Entscheidung:</strong> Der Pruefer kann den Anwendungsfall <em>freigeben</em>,
<em>ablehnen</em>, <em>mit Auflagen freigeben</em> oder <em>weiter eskalieren</em>.
Jede Entscheidung wird mit Begruendung im Audit-Trail gespeichert.
</p>
{/* ============================================================ */}
{/* 6. CONTROLS, EVIDENCE & RISIKEN */}
{/* ============================================================ */}
<h2 id="controls">6. Controls, Nachweise und Risiken</h2>
<h3>6.1 Was sind Controls?</h3>
<p>
Ein <strong>Control</strong> ist eine konkrete Massnahme, die eine Organisation umsetzt,
um ein Compliance-Risiko zu beherrschen. Es gibt drei Arten:
</p>
<ul>
<li><strong>Technische Controls:</strong> Verschluesselung, Zugangskontrollen, Firewalls, Pseudonymisierung</li>
<li><strong>Organisatorische Controls:</strong> Schulungen, Richtlinien, Verantwortlichkeiten, Audits</li>
<li><strong>Physische Controls:</strong> Zutrittskontrolle zu Serverraeumen, Schliesssysteme</li>
</ul>
<p>
Der Compliance Hub verwaltet einen <strong>Katalog von ueber 100 vordefinierten Controls</strong>,
die in 9 Domaenen organisiert sind:
</p>
<div className="not-prose my-4">
<div className="grid grid-cols-3 gap-2">
{[
{ code: 'AC', name: 'Zugriffsmanagement', desc: 'Wer darf was?' },
{ code: 'DP', name: 'Datenschutz', desc: 'Schutz personenbezogener Daten' },
{ code: 'NS', name: 'Netzwerksicherheit', desc: 'Sichere Kommunikation' },
{ code: 'IR', name: 'Incident Response', desc: 'Reaktion auf Sicherheitsvorfaelle' },
{ code: 'BC', name: 'Business Continuity', desc: 'Geschaeftskontinuitaet' },
{ code: 'VM', name: 'Vendor Management', desc: 'Dienstleister-Steuerung' },
{ code: 'AM', name: 'Asset Management', desc: 'Verwaltung von IT-Werten' },
{ code: 'CR', name: 'Kryptographie', desc: 'Verschluesselung & Schluessel' },
{ code: 'PS', name: 'Physische Sicherheit', desc: 'Gebaeude & Hardware' },
].map(d => (
<div key={d.code} className="border border-gray-200 rounded-lg p-3 text-sm">
<div className="font-bold text-blue-600">{d.code}</div>
<div className="font-medium">{d.name}</div>
<div className="text-gray-500 text-xs">{d.desc}</div>
</div>
))}
</div>
</div>
<h3>6.2 Wie Controls mit Gesetzen verknuepft sind</h3>
<p>
Jeder Control ist mit einem oder mehreren Gesetzesartikeln verknuepft. Diese
<strong> Mappings</strong> machen sichtbar, warum eine Massnahme erforderlich ist:
</p>
<CodeBlock language="text" filename="Beispiel: Control-Mapping">
{`Control: AC-01 (Zugriffskontrolle)
├── DSGVO Art. 32 → "Sicherheit der Verarbeitung"
├── NIS2 Art. 21 → "Massnahmen zum Management von Cyberrisiken"
├── ISO 27001 A.9 → "Zugangskontrolle"
└── BSI Grundschutz → "ORP.4 Identitaets- und Berechtigungsmanagement"
Control: DP-03 (Datenverschluesselung)
├── DSGVO Art. 32 → "Verschluesselung personenbezogener Daten"
├── DSGVO Art. 34 → "Benachrichtigung ueber Datenverletzung" (Ausnahme bei Verschluesselung)
└── NIS2 Art. 21 → "Einsatz von Kryptographie"`}
</CodeBlock>
<h3>6.3 Evidence (Nachweise)</h3>
<p>
Ein Control allein genuegt nicht -- man muss auch <strong>nachweisen</strong>, dass er
umgesetzt wurde. Das System verwaltet verschiedene Nachweis-Typen:
</p>
<ul>
<li><strong>Zertifikate:</strong> ISO 27001-Zertifikat, SOC2-Report</li>
<li><strong>Richtlinien:</strong> Interne Datenschutzrichtlinie, Passwort-Policy</li>
<li><strong>Audit-Berichte:</strong> Ergebnisse interner oder externer Pruefungen</li>
<li><strong>Screenshots / Konfigurationen:</strong> Nachweis technischer Umsetzung</li>
</ul>
<p>
Jeder Nachweis hat ein <strong>Ablaufdatum</strong>. Das System warnt automatisch,
wenn Nachweise bald ablaufen (z.B. ein ISO-Zertifikat, das in 3 Monaten erneuert werden muss).
</p>
<h3>6.4 Risikobewertung</h3>
<p>
Risiken werden in einer <strong>5x5-Risikomatrix</strong> dargestellt. Die beiden Achsen sind:
</p>
<ul>
<li><strong>Eintrittswahrscheinlichkeit:</strong> Wie wahrscheinlich ist es, dass das Risiko eintritt?</li>
<li><strong>Auswirkung:</strong> Wie schwerwiegend waeren die Folgen?</li>
</ul>
<p>
Aus der Kombination ergibt sich die Risikostufe: <em>Minimal</em>, <em>Low</em>,
<em>Medium</em>, <em>High</em> oder <em>Critical</em>. Fuer jedes identifizierte Risiko
wird dokumentiert, welche Controls es abmildern und wer dafuer verantwortlich ist.
</p>
{/* ============================================================ */}
{/* 7. OBLIGATIONS FRAMEWORK */}
{/* ============================================================ */}
<h2 id="obligations">7. Pflichten-Ableitung: Welche Gesetze gelten fuer mich?</h2>
<p>
Nicht jedes Gesetz gilt fuer jede Organisation. Das <strong>Obligations Framework</strong>
ermittelt automatisch, welche konkreten Pflichten sich aus der Situation einer Organisation
ergeben. Dafuer werden &ldquo;Fakten&rdquo; ueber die Organisation gesammelt und gegen die
Anwendbarkeitsbedingungen der einzelnen Gesetze geprueft.
</p>
<h3>Beispiel: NIS2-Anwendbarkeit</h3>
<CodeBlock language="text" filename="Entscheidungsbaum: Gilt NIS2 fuer mein Unternehmen?">
{`Ist Ihr Unternehmen in einem der NIS2-Sektoren taetig?
(Energie, Transport, Banken, Gesundheit, Wasser, Digitale Infrastruktur, ...)
├── Nein → NIS2 gilt NICHT fuer Sie
└── Ja → Wie gross ist Ihr Unternehmen?
├── >= 250 Mitarbeiter ODER >= 50 Mio. EUR Umsatz
│ → ESSENTIAL ENTITY (wesentliche Einrichtung)
│ → Volle NIS2-Pflichten, strenge Aufsicht
│ → Bussgelder bis 10 Mio. EUR oder 2% Jahresumsatz
├── >= 50 Mitarbeiter ODER >= 10 Mio. EUR Umsatz
│ → IMPORTANT ENTITY (wichtige Einrichtung)
│ → NIS2-Pflichten, reaktive Aufsicht
│ → Bussgelder bis 7 Mio. EUR oder 1,4% Jahresumsatz
└── Kleiner → NIS2 gilt grundsaetzlich NICHT
(Ausnahmen fuer bestimmte Sektoren moeglich)`}
</CodeBlock>
<p>
Aehnliche Entscheidungsbaeume existieren fuer DSGVO (Verarbeitung personenbezogener Daten?),
AI Act (KI-System im Einsatz? Welche Risikokategorie?) und alle anderen Regelwerke.
Das System leitet daraus konkrete Pflichten ab -- z.B. &ldquo;Meldepflicht bei
Sicherheitsvorfaellen innerhalb von 72 Stunden&rdquo; oder &ldquo;Ernennung eines
Datenschutzbeauftragten&rdquo;.
</p>
{/* ============================================================ */}
{/* 8. DSGVO-MODULE */}
{/* ============================================================ */}
<h2 id="dsgvo-module">8. DSGVO-Compliance-Module im Detail</h2>
<p>
Fuer die Einhaltung der DSGVO bietet der Compliance Hub spezialisierte Module:
</p>
<h3>8.1 Consent Management (Einwilligungsverwaltung)</h3>
<p>
Verwaltet die Einwilligung von Nutzern gemaess Art. 6/7 DSGVO. Jede Einwilligung wird
protokolliert: wer hat wann, auf welchem Kanal, fuer welchen Zweck zugestimmt (oder
abgelehnt)? Einwilligungen koennen jederzeit widerrufen werden, der Widerruf wird ebenfalls
dokumentiert.
</p>
<p>
<strong>Zwecke:</strong> Essential (funktionsnotwendig), Functional, Analytics, Marketing,
Personalization, Third-Party.
</p>
<h3>8.2 DSR Management (Betroffenenrechte)</h3>
<p>
Verwaltet Antraege betroffener Personen nach Art. 15-21 DSGVO: Auskunft, Berichtigung,
Loeschung, Datenportabilitaet, Einschraenkung und Widerspruch. Das System ueberwacht die
<strong> 30-Tage-Frist</strong> (Art. 12) und eskaliert automatisch, wenn Fristen drohen
zu verstreichen.
</p>
<h3>8.3 VVT (Verzeichnis von Verarbeitungstaetigkeiten)</h3>
<p>
Dokumentiert alle Datenverarbeitungen gemaess Art. 30 DSGVO: Welche Daten werden fuer
welchen Zweck, auf welcher Rechtsgrundlage, wie lange und von wem verarbeitet? Jede
Verarbeitungstaetigkeit wird mit ihren Datenkategorien, Empfaengern und
Loeschfristen erfasst.
</p>
<h3>8.4 DSFA (Datenschutz-Folgenabschaetzung)</h3>
<p>
Wenn eine Datenverarbeitung voraussichtlich ein hohes Risiko fuer die Rechte natuerlicher
Personen mit sich bringt, ist eine DSFA nach Art. 35 DSGVO Pflicht. Das System unterstuetzt
den Prozess: Risiken identifizieren, bewerten, Gegenmassnahmen definieren und das Ergebnis
dokumentieren.
</p>
<h3>8.5 TOM (Technisch-Organisatorische Massnahmen)</h3>
<p>
Dokumentiert die Schutzmassnahmen nach Art. 32 DSGVO. Fuer jede Massnahme wird erfasst:
Kategorie (z.B. Verschluesselung, Zugriffskontrolle), Status (implementiert / in
Bearbeitung / geplant), Verantwortlicher und Nachweise.
</p>
<h3>8.6 Loeschkonzept</h3>
<p>
Verwaltet Aufbewahrungsfristen und automatische Loeschung gemaess Art. 5/17 DSGVO.
Fuer jede Datenkategorie wird definiert: wie lange darf sie gespeichert werden, wann muss
sie geloescht werden und wie (z.B. Ueberschreiben, Schluesselloeschung bei verschluesselten
Daten).
</p>
{/* ============================================================ */}
{/* 9. MULTI-TENANCY & ZUGRIFFSKONTROLLE */}
{/* ============================================================ */}
<h2 id="multi-tenancy">9. Multi-Tenancy und Zugriffskontrolle</h2>
<p>
Das System ist <strong>mandantenfaehig</strong> (Multi-Tenant): Mehrere Organisationen
koennen es gleichzeitig nutzen, ohne dass sie gegenseitig auf ihre Daten zugreifen koennen.
Jede Anfrage enthaelt eine Tenant-ID, und die Datenbank-Abfragen filtern automatisch nach
dieser ID.
</p>
<h3>9.1 Rollenbasierte Zugriffskontrolle (RBAC)</h3>
<p>
Innerhalb eines Mandanten gibt es verschiedene Rollen mit unterschiedlichen Berechtigungen:
</p>
<div className="not-prose my-4 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Rolle</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Darf</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr><td className="px-4 py-3 font-medium">Mitarbeiter</td><td className="px-4 py-3">Anwendungsfaelle einreichen, eigene Bewertungen einsehen</td></tr>
<tr><td className="px-4 py-3 font-medium">Teamleiter</td><td className="px-4 py-3">E1-Eskalationen pruefen, Team-Assessments einsehen</td></tr>
<tr><td className="px-4 py-3 font-medium">DSB (Datenschutzbeauftragter)</td><td className="px-4 py-3">E2/E3-Eskalationen pruefen, alle Assessments einsehen, Policies aendern</td></tr>
<tr><td className="px-4 py-3 font-medium">Rechtsabteilung</td><td className="px-4 py-3">E3-Eskalationen pruefen, Grundsatzentscheidungen</td></tr>
<tr><td className="px-4 py-3 font-medium">Administrator</td><td className="px-4 py-3">System konfigurieren, Nutzer verwalten, LLM-Policies festlegen</td></tr>
</tbody>
</table>
</div>
<h3>9.2 PII-Erkennung und -Schutz</h3>
<p>
Bevor Texte an ein Sprachmodell gesendet werden, durchlaufen sie eine automatische
<strong> PII-Erkennung</strong> (Personally Identifiable Information). Das System erkennt
ueber 20 Arten personenbezogener Daten:
</p>
<ul>
<li>E-Mail-Adressen, Telefonnummern, Postanschriften</li>
<li>Sozialversicherungsnummern, Kreditkartennummern</li>
<li>Personennamen, IP-Adressen</li>
<li>und weitere...</li>
</ul>
<p>
Je nach Konfiguration werden erkannte PII-Daten <strong>geschwuerzt</strong> (durch
Platzhalter ersetzt), <strong>maskiert</strong> (nur Anfang/Ende sichtbar) oder nur im
Audit-Log <strong>markiert</strong>.
</p>
{/* ============================================================ */}
{/* 10. LLM-NUTZUNG */}
{/* ============================================================ */}
<h2 id="llm-nutzung">10. Wie das System KI nutzt (und wie nicht)</h2>
<p>
Der Compliance Hub setzt kuenstliche Intelligenz gezielt und kontrolliert ein. Es gibt
eine klare Trennung zwischen dem, was die KI tut, und dem, was sie nicht tun darf:
</p>
<div className="not-prose my-6 overflow-x-auto">
<table className="min-w-full divide-y divide-gray-200 text-sm">
<thead className="bg-gray-50">
<tr>
<th className="px-4 py-3 text-left font-medium text-gray-500">Aufgabe</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Entschieden von</th>
<th className="px-4 py-3 text-left font-medium text-gray-500">Rolle der KI</th>
</tr>
</thead>
<tbody className="divide-y divide-gray-200">
<tr><td className="px-4 py-3">Machbarkeit (YES/CONDITIONAL/NO)</td><td className="px-4 py-3 font-medium">Deterministische Regeln</td><td className="px-4 py-3 text-gray-400">Keine</td></tr>
<tr><td className="px-4 py-3">Risikoscore berechnen</td><td className="px-4 py-3 font-medium">Regelbasierte Berechnung</td><td className="px-4 py-3 text-gray-400">Keine</td></tr>
<tr><td className="px-4 py-3">Eskalation ausloesen</td><td className="px-4 py-3 font-medium">Schwellenwerte + Regellogik</td><td className="px-4 py-3 text-gray-400">Keine</td></tr>
<tr><td className="px-4 py-3">Controls zuordnen</td><td className="px-4 py-3 font-medium">Regel-zu-Control-Mapping</td><td className="px-4 py-3 text-gray-400">Keine</td></tr>
<tr className="bg-blue-50"><td className="px-4 py-3">Ergebnis erklaeren</td><td className="px-4 py-3 text-gray-400">--</td><td className="px-4 py-3 font-medium text-blue-800">LLM + RAG-Kontext</td></tr>
<tr className="bg-blue-50"><td className="px-4 py-3">Verbesserungsvorschlaege</td><td className="px-4 py-3 text-gray-400">--</td><td className="px-4 py-3 font-medium text-blue-800">LLM</td></tr>
<tr className="bg-blue-50"><td className="px-4 py-3">Rechtsfragen beantworten</td><td className="px-4 py-3 text-gray-400">--</td><td className="px-4 py-3 font-medium text-blue-800">LLM + RAG (Rechtskorpus)</td></tr>
<tr className="bg-blue-50"><td className="px-4 py-3">Dokumente generieren (DSFA, TOM, VVT)</td><td className="px-4 py-3 text-gray-400">--</td><td className="px-4 py-3 font-medium text-blue-800">LLM + Vorlagen</td></tr>
</tbody>
</table>
</div>
<h3>LLM-Provider und Fallback</h3>
<p>
Das System unterstuetzt mehrere KI-Anbieter mit automatischem Fallback:
</p>
<ol>
<li><strong>Primaer: Ollama (lokal)</strong> -- Qwen 2.5 32B bzw. Mistral, laeuft direkt auf dem Server. Keine Daten verlassen das lokale Netzwerk.</li>
<li><strong>Fallback: Anthropic Claude</strong> -- Wird nur aktiviert, wenn das lokale Modell nicht verfuegbar ist.</li>
</ol>
<p>
Jeder LLM-Aufruf wird im Audit-Trail protokolliert: Prompt-Hash (SHA-256), verwendetes
Modell, Antwortzeit und ob PII erkannt wurde.
</p>
{/* ============================================================ */}
{/* 11. AUDIT-TRAIL */}
{/* ============================================================ */}
<h2 id="audit-trail">11. Audit-Trail: Alles wird protokolliert</h2>
<p>
Saemtliche Aktionen im System werden revisionssicher protokolliert:
</p>
<ul>
<li>Jede Compliance-Bewertung mit allen Ein- und Ausgaben</li>
<li>Jede Eskalationsentscheidung mit Begruendung</li>
<li>Jeder LLM-Aufruf (wer hat was wann gefragt, welches Modell wurde verwendet)</li>
<li>Jede Aenderung an Controls, Evidence und Policies</li>
<li>Jeder Login und Daten-Export</li>
</ul>
<p>
Der Audit-Trail kann als <strong>PDF, CSV oder JSON</strong> exportiert werden und dient als
Nachweis gegenueber Aufsichtsbehoerden, Wirtschaftspruefern und internen Revisoren.
</p>
<InfoBox type="info" title="Datenschutz des Audit-Trails">
Der Use-Case-Text (die Beschreibung des Anwendungsfalls) wird
<strong> nur mit Einwilligung des Nutzers</strong> gespeichert. Standardmaessig wird nur
ein SHA-256-Hash des Textes gespeichert -- damit kann nachgewiesen werden, <em>dass</em>
ein bestimmter Text bewertet wurde, ohne den Text selbst preiszugeben.
</InfoBox>
{/* ============================================================ */}
{/* 12. SECURITY SCANNER */}
{/* ============================================================ */}
<h2 id="security">12. Security Scanner: Technische Sicherheitspruefung</h2>
<p>
Ergaenzend zur rechtlichen Compliance prueft der Security Scanner die
<strong> technische Sicherheit</strong>:
</p>
<ul>
<li><strong>Container-Scanning (Trivy):</strong> Prueft Docker-Images auf bekannte Schwachstellen (CVEs)</li>
<li><strong>Statische Code-Analyse (Semgrep):</strong> Sucht im Quellcode nach Sicherheitsluecken (SQL Injection, XSS, etc.)</li>
<li><strong>Secret Detection (Gitleaks):</strong> Findet versehentlich eingecheckte Passwoerter, API-Keys und Tokens</li>
<li><strong>SBOM-Generierung:</strong> Erstellt eine Software Bill of Materials -- eine vollstaendige Liste aller verwendeten Bibliotheken und deren Lizenzen</li>
</ul>
<p>
Gefundene Schwachstellen werden nach Schweregrad (Critical, High, Medium, Low) klassifiziert
und koennen direkt im System nachverfolgt und behoben werden.
</p>
{/* ============================================================ */}
{/* 13. ZUSAMMENFASSUNG */}
{/* ============================================================ */}
<h2 id="zusammenfassung">13. Zusammenfassung: Der komplette Datenfluss</h2>
<p>
Hier ist der gesamte Prozess von Anfang bis Ende:
</p>
<CodeBlock language="text" filename="Der komplette Compliance-Workflow">
{`SCHRITT 1: FAKTEN SAMMELN
━━━━━━━━━━━━━━━━━━━━━━━━
Nutzer fuellt Fragebogen aus:
→ Welche Daten? Welcher Zweck? Welche Branche? Wo gehostet?
SCHRITT 2: ANWENDBARKEIT PRUEFEN
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Obligations Framework ermittelt:
→ DSGVO betroffen? → Ja (personenbezogene Daten)
→ AI Act betroffen? → Ja (KI-System)
→ NIS2 betroffen? → Nein (< 50 Mitarbeiter, kein KRITIS-Sektor)
SCHRITT 3: REGELN PRUEFEN
━━━━━━━━━━━━━━━━━━━━━━━━
Policy Engine wertet 45+ Regeln aus:
→ R-001 (WARN): Personenbezogene Daten +10 Risiko
→ R-020 (INFO): Assistenzsystem +0 Risiko
→ R-060 (WARN): KI-Transparenz fehlt +15 Risiko
→ ...
→ Gesamt-Risikoscore: 35/100 (LOW)
→ Machbarkeit: CONDITIONAL
SCHRITT 4: CONTROLS ZUORDNEN
━━━━━━━━━━━━━━━━━━━━━━━━━━━
Jede ausgeloeste Regel triggert Controls:
→ C_EXPLICIT_CONSENT: Einwilligung einholen
→ C_TRANSPARENCY: KI-Nutzung offenlegen
→ C_DATA_MINIMIZATION: Datenminimierung
SCHRITT 5: ESKALATION (bei Bedarf)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Score 35 → Stufe E1 → Teamleiter wird benachrichtigt
→ SLA: 24 Stunden fuer Pruefung
→ Entscheidung: Freigabe mit Auflagen
SCHRITT 6: ERKLAERUNG GENERIEREN
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
LLM + RAG erstellen verstaendliche Erklaerung:
→ Suche relevante Gesetzesartikel (Qdrant)
→ Generiere Erklaerungstext (Qwen 2.5)
→ Fuege Zitate und Quellen hinzu
SCHRITT 7: DOKUMENTATION
━━━━━━━━━━━━━━━━━━━━━━━
System erzeugt erforderliche Dokumente:
→ DSFA (falls empfohlen)
→ TOM-Dokumentation
→ VVT-Eintrag
→ Compliance-Report (PDF/ZIP/JSON)
SCHRITT 8: MONITORING
━━━━━━━━━━━━━━━━━━━━
Laufende Ueberwachung:
→ Controls werden regelmaessig geprueft
→ Nachweise werden auf Ablauf ueberwacht
→ Gesetzesaenderungen fliessen in den Corpus ein`}
</CodeBlock>
<InfoBox type="success" title="Das Wichtigste in einem Satz">
Der Compliance Hub nimmt die Beschreibung eines KI-Vorhabens entgegen, prueft es gegen
ueber 45 deterministische Regeln und 400+ Gesetzesartikel, berechnet ein Risiko, ordnet
Massnahmen zu, eskaliert bei Bedarf an menschliche Pruefer und dokumentiert alles
revisionssicher -- wobei die KI nur fuer Erklaerungen und Zusammenfassungen eingesetzt wird,
niemals fuer die eigentliche Compliance-Entscheidung.
</InfoBox>
<IntroArchitectureSection />
<LegalCorpusSection />
<ComplianceEngineSection />
<EscalationControlsSection />
<ObligationsDsgvoSection />
<MultiTenancyLlmAuditSection />
</DevPortalLayout>
)
}