Compare commits

...

3 Commits

Author SHA1 Message Date
Benjamin Admin a2f8366171 improve: Drittlandtransfer hint mentions Privacy Shield invalidity
Build + Deploy / build-admin-compliance (push) Successful in 2m23s
Build + Deploy / build-backend-compliance (push) Successful in 3m32s
Build + Deploy / build-ai-sdk (push) Successful in 57s
Build + Deploy / build-developer-portal (push) Successful in 1m22s
Build + Deploy / build-tts (push) Successful in 1m35s
Build + Deploy / build-document-crawler (push) Successful in 39s
Build + Deploy / build-dsms-gateway (push) Successful in 26s
Build + Deploy / build-dsms-node (push) Successful in 11s
CI / branch-name (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / loc-budget (push) Failing after 19s
CI / secret-scan (push) Has been skipped
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / nodejs-build (push) Successful in 3m22s
CI / dep-audit (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / test-go (push) Failing after 50s
CI / test-python-backend (push) Successful in 45s
CI / test-python-document-crawler (push) Successful in 33s
CI / test-python-dsms-gateway (push) Successful in 26s
CI / validate-canonical-controls (push) Successful in 19s
Build + Deploy / trigger-orca (push) Successful in 3m16s
Hint now explicitly warns that EU-US Privacy Shield is invalid since
Schrems II (July 2020) and recommends DPF or SCC as replacements.
This is the kind of specific, actionable feedback that makes the tool
valuable — catching outdated legal references no human would spot
in under a minute.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-07 17:01:56 +02:00
Benjamin Admin a3671d4a06 fix: Massnahmen-Layout proportional statt fix
2fr:1fr statt 1fr:200px — skaliert auf allen Bildschirmgroessen.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-07 16:48:42 +02:00
Benjamin Admin cd5f986489 fix: Massnahmen-Tabelle Layout — volle Textbreite statt truncate
Grid-Layout statt flex mit fixen Breiten. Texte umbrechen
statt abschneiden. Gefaehrdung-Spalte 200px, Status 80px.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-07 16:35:09 +02:00
2 changed files with 15 additions and 15 deletions
@@ -174,33 +174,33 @@ export default function MitigationsPage() {
{isExpanded && items.length > 0 && (
<div className="border-t border-gray-100 dark:border-gray-700">
{/* Table header */}
<div className="flex items-center gap-2 px-4 py-2 bg-gray-50 dark:bg-gray-750 text-xs font-medium text-gray-500 uppercase tracking-wider">
<div className="w-6">
<div className="grid grid-cols-[24px_2fr_1fr_80px] gap-2 px-4 py-2 bg-gray-50 dark:bg-gray-750 text-xs font-medium text-gray-500 uppercase tracking-wider">
<div>
<input type="checkbox" checked={allSelected} onChange={() => selectAllInType(type)}
className="accent-purple-600" title="Alle auswaehlen" />
</div>
<div className="flex-1">Massnahme</div>
<div className="w-24">Status</div>
<div className="w-32">Gefaehrdung</div>
<div>Massnahme</div>
<div>Gefaehrdung</div>
<div>Status</div>
</div>
{/* Rows */}
{items.map((m) => (
<div key={m.id}
className={`flex items-center gap-2 px-4 py-2 border-t border-gray-50 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-750 transition-colors ${selected.has(m.id) ? 'bg-purple-50 dark:bg-purple-900/10' : ''}`}>
<div className="w-6">
className={`grid grid-cols-[24px_2fr_1fr_80px] gap-2 px-4 py-2 border-t border-gray-50 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-750 transition-colors ${selected.has(m.id) ? 'bg-purple-50 dark:bg-purple-900/10' : ''}`}>
<div className="pt-0.5">
<input type="checkbox" checked={selected.has(m.id)} onChange={() => toggleSelect(m.id)}
className="accent-purple-600" />
</div>
<div className="flex-1 min-w-0">
<div className="text-sm text-gray-900 dark:text-white truncate">{m.title || ''}</div>
{m.description && <div className="text-xs text-gray-400 truncate">{m.description}</div>}
<div className="min-w-0">
<div className="text-sm text-gray-900 dark:text-white">{m.title || ''}</div>
{m.description && <div className="text-xs text-gray-400 mt-0.5">{m.description}</div>}
</div>
<div className="w-24">
<StatusBadge status={m.status} />
</div>
<div className="w-32 text-xs text-gray-500 truncate">
<div className="text-xs text-gray-500">
{(m.linked_hazard_names || []).join(', ') || '-'}
</div>
<div>
<StatusBadge status={m.status} />
</div>
</div>
))}
</div>
@@ -236,7 +236,7 @@ ART13_CHECKLIST = [
r"art\.\s*4[5-9]",
],
"severity": "MEDIUM",
"hint": "Bei Drittlandtransfers muss der konkrete Schutzmechanismus benannt werden: Angemessenheitsbeschluss (Art. 45), Standardvertragsklauseln/SCC (Art. 46(2)(c)) oder EU-US Data Privacy Framework. Ohne Angabe ist der Transfer nicht DSGVO-konform dokumentiert.",
"hint": "Bei Drittlandtransfers muss der konkrete Schutzmechanismus benannt werden. Hinweis: Das EU-US Privacy Shield ist seit dem EuGH-Urteil 'Schrems II' (Juli 2020) ungueltig. Aktualisieren Sie auf: EU-US Data Privacy Framework/DPF (Angemessenheitsbeschluss seit Juli 2023) oder Standardvertragsklauseln/SCC (Art. 46(2)(c) DSGVO).",
},
# ── L1: Speicherdauer ─────────────────────────────────────────────