/** * Terminology Guide & Style Contract — Konsistente Fachbegriffe * * Stellt sicher, dass alle Prosa-Bloecke eines Dokuments * dieselben Fachbegriffe und denselben Schreibstil verwenden. * * 100% deterministisch. */ // ============================================================================ // Terminology Guide // ============================================================================ export interface TerminologyGuide { /** DSGVO-Begriffe */ dsgvo: Record /** TOM-Begriffe */ tom: Record /** Allgemeine Compliance-Begriffe */ general: Record } export const DEFAULT_TERMINOLOGY: TerminologyGuide = { dsgvo: { controller: 'Verantwortlicher', processor: 'Auftragsverarbeiter', data_subject: 'betroffene Person', processing: 'Verarbeitung', personal_data: 'personenbezogene Daten', consent: 'Einwilligung', dpia: 'Datenschutz-Folgenabschaetzung (DSFA)', legitimate_interest: 'berechtigtes Interesse', data_breach: 'Verletzung des Schutzes personenbezogener Daten', dpo: 'Datenschutzbeauftragter (DSB)', supervisory_authority: 'Aufsichtsbehoerde', ropa: 'Verzeichnis von Verarbeitungstaetigkeiten (VVT)', retention_period: 'Aufbewahrungsfrist', erasure: 'Loeschung', restriction: 'Einschraenkung der Verarbeitung', portability: 'Datenportabilitaet', third_country: 'Drittland', adequacy_decision: 'Angemessenheitsbeschluss', scc: 'Standardvertragsklauseln (SCC)', }, tom: { access_control: 'Zutrittskontrolle', access_management: 'Zugangskontrolle', authorization: 'Zugriffskontrolle', encryption: 'Verschluesselung', pseudonymization: 'Pseudonymisierung', availability: 'Verfuegbarkeitskontrolle', resilience: 'Belastbarkeit', recoverability: 'Wiederherstellbarkeit', audit_logging: 'Protokollierung', separation: 'Trennungsgebot', input_control: 'Eingabekontrolle', transport_control: 'Weitergabekontrolle', order_control: 'Auftragskontrolle', }, general: { risk_assessment: 'Risikobewertung', audit_trail: 'Pruefpfad', compliance_level: 'Compliance-Tiefe', gap_analysis: 'Lueckenanalyse', remediation: 'Massnahmenplan', incident_response: 'Vorfallreaktion', business_continuity: 'Geschaeftskontinuitaet', vendor_management: 'Dienstleistermanagement', awareness_training: 'Sensibilisierungsschulung', }, } // ============================================================================ // Style Contract // ============================================================================ export interface StyleContract { /** Anrede-Stil */ addressing: '3rd_person_company' /** Tonalitaet */ tone: 'formal_legal_plain' /** Verbotene Formulierungen */ forbid: string[] } export const DEFAULT_STYLE_CONTRACT: StyleContract = { addressing: '3rd_person_company', tone: 'formal_legal_plain', forbid: [ 'Denglisch', 'Marketing-Sprache', 'Superlative', 'Direkte Ansprache', 'Umgangssprache', 'Konjunktiv-Ketten', ], } /** Konkrete Regex-Muster fuer verbotene Formulierungen */ export const STYLE_VIOLATION_PATTERNS: Array<{ name: string; pattern: RegExp }> = [ { name: 'Direkte Ansprache', pattern: /\b(Sie|Ihr|Ihnen|Ihrem|Ihrer)\b/ }, { name: 'Superlative', pattern: /\b(bestmoeglich|hoechstmoeglich|optimal|perfekt|einzigartig)\b/i }, { name: 'Marketing-Sprache', pattern: /\b(revolutionaer|bahnbrechend|innovativ|fuehrend|erstklassig)\b/i }, { name: 'Umgangssprache', pattern: /\b(super|toll|mega|krass|cool|easy)\b/i }, { name: 'Denglisch', pattern: /\b(State of the Art|Best Practice|Compliance Journey|Data Driven)\b/i }, ] // ============================================================================ // Serialization // ============================================================================ /** * Serialisiert den Terminology Guide fuer den LLM-Prompt. * Gibt nur die haeufigsten Begriffe aus (Token-Budget). */ export function terminologyToPromptString(guide: TerminologyGuide = DEFAULT_TERMINOLOGY): string { const keyTerms = [ ...Object.entries(guide.dsgvo).slice(0, 10), ...Object.entries(guide.tom).slice(0, 6), ...Object.entries(guide.general).slice(0, 4), ] return keyTerms.map(([key, value]) => ` ${key}: "${value}"`).join('\n') } /** * Serialisiert den Style Contract fuer den LLM-Prompt. */ export function styleContractToPromptString(style: StyleContract = DEFAULT_STYLE_CONTRACT): string { return [ `Anrede: Dritte Person ("Die [Firmenname]...", NICHT "Sie...")`, `Ton: Professionell, juristisch korrekt, aber verstaendlich`, `Verboten: ${style.forbid.join(', ')}`, ].join('\n') } // ============================================================================ // Validation // ============================================================================ /** * Prueft einen Text auf Style-Verstoesse. * Gibt eine Liste der gefundenen Verstoesse zurueck. */ export function checkStyleViolations(text: string): string[] { const violations: string[] = [] for (const { name, pattern } of STYLE_VIOLATION_PATTERNS) { if (pattern.test(text)) { violations.push(`Style-Verstoss: ${name}`) } } return violations } /** * Prueft ob die Terminologie korrekt verwendet wird. * Gibt Warnungen zurueck wenn falsche Begriffe erkannt werden. */ export function checkTerminologyUsage( text: string, guide: TerminologyGuide = DEFAULT_TERMINOLOGY ): string[] { const warnings: string[] = [] const lower = text.toLowerCase() // Prüfe ob englische Begriffe statt deutscher verwendet werden const termChecks: Array<{ wrong: string; correct: string }> = [ { wrong: 'data controller', correct: guide.dsgvo.controller }, { wrong: 'data processor', correct: guide.dsgvo.processor }, { wrong: 'data subject', correct: guide.dsgvo.data_subject }, { wrong: 'personal data', correct: guide.dsgvo.personal_data }, { wrong: 'data breach', correct: guide.dsgvo.data_breach }, { wrong: 'encryption', correct: guide.tom.encryption }, { wrong: 'pseudonymization', correct: guide.tom.pseudonymization }, { wrong: 'risk assessment', correct: guide.general.risk_assessment }, ] for (const { wrong, correct } of termChecks) { if (lower.includes(wrong.toLowerCase())) { warnings.push(`Englischer Begriff "${wrong}" gefunden — verwende "${correct}"`) } } return warnings }