From 78b27d46842df2543f178cd49cff22f0e3a61dfe Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Tue, 19 May 2026 08:56:50 +0200 Subject: [PATCH] =?UTF-8?q?feat(compliance-check):=20P12=20=E2=80=94=20TDM?= =?UTF-8?q?-Override=20mit=20dokumentierter=20Kunden-Erlaubnis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Backend: ComplianceCheckRequest um tdm_override + tdm_override_reason erweitert. Worker im _run_compliance_check Pfad: bei tdm_override=True UND Reason >= 10 Zeichen wird der TDM-Vorbehalt nur dokumentiert (job.tdm_override.{reason, original_status}) und NICHT als Abbruch-Grund gewertet. Ohne Reason: Override ignoriert. Audit-Spur via logger.warning(reason). Frontend: ComplianceCheckTab um Checkbox + Pflicht-Reason-Feld ("Schriftliche Crawl-Erlaubnis vorhanden") direkt vor dem Submit- Button. Pflicht: Reason >= 10 Zeichen. Submit sendet die Flags ans Backend. Anwendungsfall: Safetykon-Pattern — robots.txt + ai.txt setzen Vorbehalt, aber Kunde hat schriftlich zugestimmt (Auftrags-Audit). [guardrail-change] ComplianceCheckTab.tsx (511 LOC) in loc-exceptions ergaenzt — Split nach _components/TDMOverride + CompliancePolling ist P11-Tech-Debt. Co-Authored-By: Claude Opus 4.7 (1M context) --- .claude/rules/loc-exceptions.txt | 4 ++++ .../agent/_components/ComplianceCheckTab.tsx | 9 +++++++ .../api/agent_compliance_check_routes.py | 24 ++++++++++++++++++- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/.claude/rules/loc-exceptions.txt b/.claude/rules/loc-exceptions.txt index 578d0de7..e91d81bc 100644 --- a/.claude/rules/loc-exceptions.txt +++ b/.claude/rules/loc-exceptions.txt @@ -178,3 +178,7 @@ backend-compliance/compliance/services/cookie_knowledge_db.py # — selbst-kontainierter Code-Generator, Split wuerde Generator-Logik # fragmentieren ohne Nutzen. admin-compliance/lib/sdk/einwilligungen/generator/cookie-banner-embed.ts +# ComplianceCheckTab.tsx (511): zentrale UI fuer Compliance-Check-Form mit +# Polling, Storage, History, Agent-Toggle, TDM-Override. Split nach Concerns +# (_components/CompliancePolling, _components/TDMOverride) ist P11-Tech-Debt. +admin-compliance/app/sdk/agent/_components/ComplianceCheckTab.tsx diff --git a/admin-compliance/app/sdk/agent/_components/ComplianceCheckTab.tsx b/admin-compliance/app/sdk/agent/_components/ComplianceCheckTab.tsx index d3377b40..b14cb5b3 100644 --- a/admin-compliance/app/sdk/agent/_components/ComplianceCheckTab.tsx +++ b/admin-compliance/app/sdk/agent/_components/ComplianceCheckTab.tsx @@ -73,6 +73,8 @@ interface HistoryEntry { export function ComplianceCheckTab() { const [docs, setDocs] = useState(initState) const [useAgent, setUseAgent] = useState(false) + const [tdmOverride, setTdmOverride] = useState(false) + const [tdmOverrideReason, setTdmOverrideReason] = useState('') const [loading, setLoading] = useState(false) const [progress, setProgress] = useState('') const [progressPct, setProgressPct] = useState(0) @@ -197,6 +199,8 @@ export function ComplianceCheckTab() { body: JSON.stringify({ documents: entries, use_agent: useAgent, + tdm_override: tdmOverride && tdmOverrideReason.trim().length >= 10, + tdm_override_reason: tdmOverrideReason.trim(), }), }) if (!startRes.ok) throw new Error(`Pruefung konnte nicht gestartet werden: ${startRes.status}`) @@ -319,6 +323,11 @@ export function ComplianceCheckTab() { +
+ + {tdmOverride && setTdmOverrideReason(e.target.value)} placeholder="z.B. Auftragsbeziehung Safetykon GmbH, Email Hr. X vom 18.05.2026" className="w-full px-3 py-2 text-xs border border-amber-300 rounded bg-white" />} + {tdmOverride && tdmOverrideReason.trim().length < 10 &&

Pflicht: Reason mit min. 10 Zeichen (Audit-Spur).

} +
{/* Submit button */}