feat(audit-report): deterministischer Textreport je Audit (MD + PDF) + Bericht-Tab

Firmen-tauglicher Bericht aus den Snapshot-Modulergebnissen (kein Re-Crawl, kein
LLM): Einleitung, Testumfang+Methodik, Management-Summary (4-Status), Detail-
befunde je Modul, Maßnahmen, Rechtlicher Hinweis. Co-Pilot-Tonalität, Tracking-
statt Cookie-Rohzahl, Norm nur referenziert (kein Normtext).
- audit_report.py: assemble_report (pur) + render_markdown + render_pdf (reportlab)
- snapshot_check_routes: GET /report (struktur+md) + GET /report.pdf
- Frontend: AuditReportTab + Proxys (report, report/pdf) + "Bericht"-Tab
- Tests: 5 Assembler (compliance/tests → CI-geprüft) + 1 Vitest

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-06-13 14:50:45 +02:00
parent 7273245054
commit d720db07dd
8 changed files with 602 additions and 0 deletions
@@ -16,6 +16,7 @@ import { CookieDeclarationDiff } from '../../_components/CookieDeclarationDiff'
import { CookieResultView } from '../../_components/CookieResultView'
import { AgentModuleTab } from '../../_components/AgentModuleTab'
import { BrowserBehaviorView } from '../../_components/BrowserBehaviorView'
import { AuditReportTab } from '../../_components/AuditReportTab'
export default function SnapshotDetail(
{ params }: { params: Promise<{ snapshotId: string }> },
@@ -64,6 +65,7 @@ export default function SnapshotDetail(
...(hasDoc('dse') ? [{ key: 'dse', label: 'Datenschutzerklärung' }] : []),
...(hasDoc('agb') ? [{ key: 'agb', label: 'AGB' }] : []),
...(hasSite ? [{ key: 'browser', label: 'Browser-Verhalten' }] : []),
{ key: 'bericht', label: 'Bericht' },
// eslint-disable-next-line react-hooks/exhaustive-deps
], [snap])
@@ -142,6 +144,10 @@ export default function SnapshotDetail(
{tab === 'browser' && (
<BrowserBehaviorView snapshotId={snapshotId} />
)}
{tab === 'bericht' && (
<AuditReportTab snapshotId={snapshotId} />
)}
</>
)}
</div>