feat: Drafting Agent Kompetenzbereich erweitert — alle 18 Dokumenttypen, Gap-Banner, Redirect-Logic
All checks were successful
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / test-go-ai-compliance (push) Successful in 35s
CI / test-python-backend-compliance (push) Successful in 32s
CI / test-python-document-crawler (push) Successful in 24s
CI / test-python-dsms-gateway (push) Successful in 23s

- DOCUMENT_SDK_STEP_MAP: 12 kaputte URLs korrigiert (z.B. /sdk/loeschkonzept → /sdk/loeschfristen)
- Go Backend: iace_ce_assessment zur validTypes-Whitelist hinzugefuegt
- SOUL-Datei: von 17 auf ~80 Zeilen erweitert (18 draftbare Typen, Redirects, operative Module)
- Intent Classifier: 10 fehlende Dokumenttyp-Patterns + 5 Redirect-Patterns (Impressum/AGB/Widerruf → Document Generator)
- State Projector: getExistingDocumentTypes von 6 auf 11 Checks erweitert (risks, escalations, iace, obligations, dsr)
- DraftingEngineWidget: Gap-Banner fuer kritische Luecken mit Analysieren-Button
- Cross-Validation: 4 neue deterministische Regeln (DSFA-NO-VVT, DSFA-NO-TOM, DSI-NO-LF, AV-NO-VVT)
- Prose Blocks: 5 neue Dokumenttypen (av_vertrag, betroffenenrechte, risikoanalyse, notfallplan, iace_ce_assessment)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-03-05 09:07:07 +01:00
parent 6e0e9cd3cf
commit 274dc68e24
9 changed files with 343 additions and 13 deletions

View File

@@ -13,4 +13,87 @@ Konsistenz zwischen Dokumenten sicherzustellen.
- Fuelle fehlende Informationen mit [PLATZHALTER: ...] Markierung
## Kompetenzbereich
DSGVO, BDSG, AI Act, TTDSG, DSK-Kurzpapiere, SDM V3.0, BSI-Grundschutz, ISO 27001/27701, EDPB Guidelines, WP248
DSGVO, BDSG, AI Act (EU 2024/1689), TTDSG, DDG (§5 Impressum),
DSK-Kurzpapiere, SDM V3.0, BSI-Grundschutz (IT-Grundschutz-Kompendium),
ISO 27001/27701, EDPB Guidelines, WP248,
EN-Normen (EN 13849, EN 62443), BGB §305ff (AGB),
Standard Contractual Clauses (SCC, 2021/914/EU)
## Draftbare Dokumenttypen (18)
| Typ | Label | Rechtsgrundlage |
|-----|-------|-----------------|
| vvt | Verarbeitungsverzeichnis | Art. 30 DSGVO |
| tom | Technisch-Organisatorische Massnahmen | Art. 32 DSGVO |
| dsfa | Datenschutz-Folgenabschaetzung | Art. 35 DSGVO |
| dsi | Datenschutzerklaerung | Art. 13/14 DSGVO |
| lf | Loeschfristen/Loeschkonzept | Art. 17 DSGVO |
| av_vertrag | Auftragsverarbeitungsvertrag | Art. 28 DSGVO |
| betroffenenrechte | Betroffenenrechte-Konzept | Art. 15-22 DSGVO |
| einwilligung | Einwilligungsmanagement | Art. 6 Abs. 1a / Art. 7 DSGVO |
| daten_transfer | Drittlandtransfer / SCC | Art. 44-49 DSGVO |
| datenpannen | Datenpannen-Meldekonzept | Art. 33/34 DSGVO |
| vertragsmanagement | Vertragsmanagement-Richtlinie | Art. 28 DSGVO |
| schulung | Schulungskonzept Datenschutz | Art. 39 DSGVO |
| audit_log | Audit- und Protokollierungskonzept | Art. 5 Abs. 2 DSGVO |
| risikoanalyse | Risikoanalyse | Art. 32 / Art. 35 DSGVO |
| notfallplan | Notfall- und Krisenmanagement | Art. 32 Abs. 1c DSGVO |
| zertifizierung | Zertifizierungskonzept | Art. 42/43 DSGVO, ISO 27001 |
| datenschutzmanagement | DSMS-Konzept | §§ 38, 64 BDSG |
| iace_ce_assessment | IACE CE-Bewertung | AI Act (EU 2024/1689), EN-Normen |
## NICHT draftbare Dokumente — Weiterleitung
Folgende Dokumente werden NICHT vom Drafting Agent erstellt. Verweise stattdessen auf das passende Modul:
| Anfrage | Antwort / Weiterleitung |
|---------|------------------------|
| Impressum (DDG §5) | "Impressum-Templates finden Sie unter /sdk/document-generator → Kategorie 'Impressum'." |
| AGB (BGB §305ff) | "AGB-Vorlagen erstellen Sie im Document Generator unter /sdk/document-generator → Kategorie 'AGB'." |
| Widerrufsbelehrung | "Widerrufs-Templates finden Sie unter /sdk/document-generator → Kategorie 'Widerruf'." |
| NDA / Geheimhaltung | "NDA-Vorlagen finden Sie unter /sdk/document-generator." |
| SLA / Dienstleistungsvertrag | "SLA-Vorlagen finden Sie unter /sdk/document-generator." |
## Operative Module — Erklaeren, nicht Entwerfen
Folgende Module sind operative Tools. Im explain-Modus erklaeren, im ask-Modus auf Luecken hinweisen, aber KEINE Entwuerfe erstellen:
| Modul | SDK-Pfad | Erklaerung |
|-------|----------|------------|
| DSR (Betroffenenanfragen) | /sdk/dsr | Anfragen-Management nach Art. 15-22 DSGVO. Konfiguration im DSR-Modul. |
| E-Mail-Templates | /sdk/dsr | E-Mail-Vorlagen fuer Betroffenenanfragen. Teil des DSR-Moduls. |
| Banner/Consent | /sdk/cookie-banner | Cookie-Banner-Konfiguration. Einstellungen unter Consent-Management. |
| Einwilligungsverwaltung | /sdk/einwilligungen | Verwaltung erteilter Einwilligungen. Operatives Dashboard. |
## Luecken-Kommunikation (Ask-Modus)
Wenn der Nutzer nach Luecken fragt oder kritische Gaps existieren:
1. **Prioritaet**: Zeige zuerst CRITICAL/HIGH Gaps, dann MEDIUM
2. **Link**: Verweise auf den passenden SDK-Schritt (DOCUMENT_SDK_STEP_MAP)
3. **Begruendung**: Erklaere WARUM das Dokument fehlt (Rechtsgrundlage)
4. **Aufwand**: Nenne den geschaetzten Aufwand aus der Scope-Matrix
5. **Reihenfolge**: Empfehle eine sinnvolle Bearbeitungsreihenfolge:
VVT → TOM → Loeschfristen → DSFA → AVV → Risikoanalyse → Rest
## Modus-Verhalten
### explain
- Erklaere Compliance-Konzepte sachlich und verstaendlich
- Verweise auf Rechtsgrundlagen und SDK-Module
- Bei operativen Modulen: erklaere Funktion + verweise auf SDK-Pfad
### ask
- Analysiere Luecken im Compliance-Profil
- Zeige fehlende Pflichtdokumente nach Scope-Level
- Gib priorisierte Handlungsempfehlungen
### draft
- Erstelle strukturierte Dokumententwuerfe
- Halte die Tiefe strikt am Scope-Level
- Verwende [PLATZHALTER: ...] fuer fehlende Informationen
### validate
- Pruefe Cross-Dokument-Konsistenz
- Melde Scope-Verletzungen und fehlende Referenzen
- Schlage konkrete Korrekturen vor

View File

@@ -204,6 +204,27 @@ const DOCUMENT_PROSE_BLOCKS: Record<string, Array<{ blockId: string; blockType:
{ blockId: 'lf-intro', blockType: 'introduction', sectionName: 'Einleitung Loeschfristen', targetWords: 100 },
{ blockId: 'lf-conclusion', blockType: 'conclusion', sectionName: 'Fazit Loeschfristen', targetWords: 60 },
],
av_vertrag: [
{ blockId: 'av-intro', blockType: 'introduction', sectionName: 'Einleitung Auftragsverarbeitung', targetWords: 130 },
{ blockId: 'av-conclusion', blockType: 'conclusion', sectionName: 'Fazit Auftragsverarbeitung', targetWords: 80 },
],
betroffenenrechte: [
{ blockId: 'betr-intro', blockType: 'introduction', sectionName: 'Einleitung Betroffenenrechte', targetWords: 120 },
{ blockId: 'betr-conclusion', blockType: 'conclusion', sectionName: 'Fazit Betroffenenrechte', targetWords: 80 },
],
risikoanalyse: [
{ blockId: 'risk-intro', blockType: 'introduction', sectionName: 'Einleitung Risikoanalyse', targetWords: 130 },
{ blockId: 'risk-conclusion', blockType: 'conclusion', sectionName: 'Fazit Risikoanalyse', targetWords: 80 },
],
notfallplan: [
{ blockId: 'notfall-intro', blockType: 'introduction', sectionName: 'Einleitung Notfallplan', targetWords: 120 },
{ blockId: 'notfall-conclusion', blockType: 'conclusion', sectionName: 'Fazit Notfallplan', targetWords: 80 },
],
iace_ce_assessment: [
{ blockId: 'iace-intro', blockType: 'introduction', sectionName: 'Einleitung IACE CE-Bewertung', targetWords: 150 },
{ blockId: 'iace-appreciation', blockType: 'appreciation', sectionName: 'Wuerdigung bestehender Konformitaetsbewertung', targetWords: 60 },
{ blockId: 'iace-conclusion', blockType: 'conclusion', sectionName: 'Fazit IACE CE-Bewertung', targetWords: 100 },
],
}
function buildV2SystemPrompt(

View File

@@ -84,6 +84,66 @@ function deterministicCheck(
})
}
// Check 5: DSFA ohne VVT-Grundlage
if (documentType === 'dsfa' && validationContext.crossReferences.vvtCategories.length === 0) {
findings.push({
id: 'DET-DSFA-NO-VVT',
severity: 'error',
category: 'cross_reference',
title: 'DSFA ohne VVT-Grundlage',
description: 'Eine DSFA setzt ein Verarbeitungsverzeichnis voraus. Ohne VVT fehlt die Uebersicht ueber die betroffenen Verarbeitungstaetigkeiten.',
documentType: 'dsfa',
crossReferenceType: 'vvt',
legalReference: 'Art. 35 i.V.m. Art. 30 DSGVO',
suggestion: 'Zuerst ein VVT erstellen, dann die DSFA darauf aufbauen.',
})
}
// Check 6: DSFA ohne TOM-Massnahmen
if (documentType === 'dsfa' && validationContext.crossReferences.tomControls.length === 0) {
findings.push({
id: 'DET-DSFA-NO-TOM',
severity: 'error',
category: 'cross_reference',
title: 'DSFA ohne TOM-Massnahmen',
description: 'Eine DSFA muss Abhilfemassnahmen enthalten. Ohne TOM-Katalog koennen keine Schutzmassnahmen referenziert werden.',
documentType: 'dsfa',
crossReferenceType: 'tom',
legalReference: 'Art. 35 Abs. 7d DSGVO',
suggestion: 'TOM-Massnahmen definieren, bevor die DSFA erstellt wird.',
})
}
// Check 7: Datenschutzerklaerung ohne Loeschfristen
if (documentType === 'dsi' && validationContext.crossReferences.retentionCategories.length === 0) {
findings.push({
id: 'DET-DSI-NO-LF',
severity: 'warning',
category: 'cross_reference',
title: 'Datenschutzerklaerung ohne Loeschfristen',
description: 'Die Datenschutzerklaerung muss Angaben zur Speicherdauer enthalten. Ohne definierte Loeschfristen fehlt diese Information.',
documentType: 'dsi',
crossReferenceType: 'lf',
legalReference: 'Art. 13 Abs. 2a DSGVO',
suggestion: 'Loeschfristen definieren und in der Datenschutzerklaerung referenzieren.',
})
}
// Check 8: AVV ohne VVT-Kontext
if (documentType === 'av_vertrag' && validationContext.crossReferences.vvtCategories.length === 0) {
findings.push({
id: 'DET-AV-NO-VVT',
severity: 'warning',
category: 'cross_reference',
title: 'AVV ohne VVT-Kontext',
description: 'Ein Auftragsverarbeitungsvertrag sollte auf den im VVT dokumentierten Verarbeitungstaetigkeiten basieren.',
documentType: 'av_vertrag',
crossReferenceType: 'vvt',
legalReference: 'Art. 28 Abs. 3 i.V.m. Art. 30 DSGVO',
suggestion: 'VVT erstellen, um die betroffenen Verarbeitungstaetigkeiten fuer den AVV zu identifizieren.',
})
}
return findings
}

View File

@@ -231,6 +231,32 @@ export function DraftingEngineWidget({
</div>
)}
{/* Gap Banner */}
{(() => {
const gaps = state.complianceScope?.decision?.gaps?.filter(
(g: { severity: string }) => g.severity === 'HIGH' || g.severity === 'CRITICAL'
) ?? []
if (gaps.length > 0) {
return (
<div className="mx-3 mt-2 px-3 py-2 bg-amber-50 border border-amber-200 rounded-lg flex items-center justify-between">
<div className="flex items-center gap-2 text-xs text-amber-800">
<svg className="w-4 h-4 text-amber-500 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z" />
</svg>
<span className="font-medium">{gaps.length} kritische Luecke{gaps.length !== 1 ? 'n' : ''} erkannt</span>
</div>
<button
onClick={() => handleSendMessage('Was fehlt noch in meinem Compliance-Profil?')}
className="text-xs font-medium text-amber-700 hover:text-amber-900 px-2 py-0.5 rounded hover:bg-amber-100 transition-colors"
>
Analysieren
</button>
</div>
)
}
return null
})()}
{/* Error Banner */}
{engine.error && (
<div className="mx-3 mt-2 px-3 py-2 bg-red-50 border border-red-200 rounded-lg text-xs text-red-700 flex items-center justify-between">

View File

@@ -1307,21 +1307,21 @@ export const DOCUMENT_SCOPE_MATRIX: Record<ScopeDocumentType, DocumentScopeRequi
*/
export const DOCUMENT_SDK_STEP_MAP: Partial<Record<ScopeDocumentType, string>> = {
vvt: '/sdk/vvt',
lf: '/sdk/loeschkonzept',
lf: '/sdk/loeschfristen',
tom: '/sdk/tom',
av_vertrag: '/sdk/auftragsverarbeitung',
dsi: '/sdk/datenschutzinformation',
betroffenenrechte: '/sdk/betroffenenrechte',
av_vertrag: '/sdk/vendor-compliance',
dsi: '/sdk/consent',
betroffenenrechte: '/sdk/dsr',
dsfa: '/sdk/dsfa',
daten_transfer: '/sdk/drittland',
datenpannen: '/sdk/datenpanne',
einwilligung: '/sdk/einwilligung',
vertragsmanagement: '/sdk/vertragsmanagement',
schulung: '/sdk/schulung',
audit_log: '/sdk/audit-logging',
risikoanalyse: '/sdk/risikoanalyse',
daten_transfer: '/sdk/vendor-compliance',
datenpannen: '/sdk/incidents',
einwilligung: '/sdk/einwilligungen',
vertragsmanagement: '/sdk/workflow',
schulung: '/sdk/training',
audit_log: '/sdk/audit-checklist',
risikoanalyse: '/sdk/risks',
notfallplan: '/sdk/notfallplan',
zertifizierung: '/sdk/zertifizierung',
zertifizierung: '/sdk/iace',
datenschutzmanagement: '/sdk/dsms',
iace_ce_assessment: '/sdk/iace',
};

View File

@@ -142,6 +142,125 @@ const DOCUMENT_TYPE_PATTERNS: Array<{
/\bcookie/i,
],
},
{
type: 'datenpannen',
patterns: [
/\bdatenpanne/i,
/\bdata\s*breach/i,
/\bart\.?\s*33\b/i,
/\bsicherheitsvorfall/i,
/\bincident/i,
/\bmelde.*vorfall/i,
],
},
{
type: 'daten_transfer',
patterns: [
/\bdrittland/i,
/\btransfer/i,
/\bscc\b/i,
/\bstandardvertragsklausel/i,
/\bart\.?\s*44\b/i,
],
},
{
type: 'vertragsmanagement',
patterns: [
/\bvertragsmanagement/i,
/\bcontract\s*management/i,
],
},
{
type: 'schulung',
patterns: [
/\bschulung/i,
/\btraining/i,
/\bawareness/i,
/\bmitarbeiterschulung/i,
],
},
{
type: 'audit_log',
patterns: [
/\baudit/i,
/\blogging\b/i,
/\bprotokollierung/i,
/\bart\.?\s*5\s*abs\.?\s*2\b/i,
],
},
{
type: 'risikoanalyse',
patterns: [
/\brisikoanalyse/i,
/\brisk\s*assessment/i,
/\brisikobewertung/i,
],
},
{
type: 'notfallplan',
patterns: [
/\bnotfallplan/i,
/\bkrisenmanagement/i,
/\bbusiness\s*continuity/i,
/\bnotfall/i,
],
},
{
type: 'zertifizierung',
patterns: [
/\bzertifizierung/i,
/\biso\s*27001\b/i,
/\biso\s*27701\b/i,
/\bart\.?\s*42\b/i,
],
},
{
type: 'datenschutzmanagement',
patterns: [
/\bdsms\b/i,
/\bdatenschutzmanagement/i,
/\bpdca/i,
],
},
{
type: 'iace_ce_assessment',
patterns: [
/\biace\b/i,
/\bce[\s-]?kennzeichnung/i,
/\bai\s*act\b/i,
/\bki[\s-]?verordnung/i,
],
},
]
// ============================================================================
// Redirect Patterns (nicht-draftbare Dokumente → Document Generator)
// ============================================================================
const REDIRECT_PATTERNS: Array<{
pattern: RegExp
response: string
}> = [
{
pattern: /\bimpressum\b/i,
response: 'Impressum-Templates finden Sie unter /sdk/document-generator → Kategorie "Impressum". Der Drafting Agent erstellt keine Impressen, da diese nach DDG §5 unternehmensspezifisch sind.',
},
{
pattern: /\b(agb|allgemeine.?geschaefts)/i,
response: 'AGB-Vorlagen erstellen Sie im Document Generator unter /sdk/document-generator → Kategorie "AGB". Der Drafting Agent erstellt keine AGB, da diese nach BGB §305ff individuell gestaltet werden muessen.',
},
{
pattern: /\bwiderruf/i,
response: 'Widerrufs-Templates finden Sie unter /sdk/document-generator → Kategorie "Widerruf".',
},
{
pattern: /\bnda\b/i,
response: 'NDA-Vorlagen finden Sie unter /sdk/document-generator.',
},
{
pattern: /\bsla\b/i,
response: 'SLA-Vorlagen finden Sie unter /sdk/document-generator.',
},
]
// ============================================================================
@@ -158,6 +277,19 @@ export class IntentClassifier {
*/
classify(input: string): IntentClassification {
const normalized = this.normalize(input)
// Redirect-Check: Nicht-draftbare Dokumente → Document Generator
for (const redirect of REDIRECT_PATTERNS) {
if (redirect.pattern.test(normalized)) {
return {
mode: 'explain',
confidence: 0.90,
matchedPatterns: [redirect.pattern.source],
suggestedResponse: redirect.response,
}
}
}
let bestMatch: IntentClassification = {
mode: 'explain',
confidence: 0.3,

View File

@@ -300,6 +300,11 @@ export class StateProjector {
if (state.documents?.length) types.push('dsi')
if (state.consents?.length) types.push('einwilligung')
if (state.cookieBanner) types.push('einwilligung')
if (state.risks?.length) types.push('risikoanalyse')
if (state.escalationWorkflows?.length) types.push('datenpannen')
if (state.iaceProjects?.length) types.push('iace_ce_assessment')
if (state.obligations?.length) types.push('zertifizierung')
if (state.dsrConfig) types.push('betroffenenrechte')
return types
}

View File

@@ -33,6 +33,8 @@ export interface IntentClassification {
matchedPatterns: string[]
/** Falls Draft oder Validate: erkannter Dokumenttyp */
detectedDocumentType?: ScopeDocumentType
/** Vorgeschlagene Antwort fuer Redirect-Szenarien (z.B. Document Generator) */
suggestedResponse?: string
}
// ============================================================================

View File

@@ -107,6 +107,7 @@ func (h *DraftingHandlers) DraftDocument(c *gin.Context) {
"daten_transfer": true, "datenpannen": true, "vertragsmanagement": true,
"schulung": true, "audit_log": true, "risikoanalyse": true,
"notfallplan": true, "zertifizierung": true, "datenschutzmanagement": true,
"iace_ce_assessment": true,
}
if !validTypes[req.DocumentType] {
c.JSON(http.StatusBadRequest, gin.H{"error": "invalid document_type"})