- M1: Removed '/' from jamulix.de exclude_paths (blockaded ALL paths via startswith)
- M2: Seed URLs now pass through should_crawl() in crawler.py
- M3: Alert deduplication via last_alert.json (hash of reasons+level+score)
- Added 11 tests for alert deduplication (277 total, all green)
Behebt vier vom Nutzer gemeldete Inkonsistenzen zwischen Report und E-Mail:
1. E-Mail ⊊ Report: Es gab zwei divergierende Renderer (alerter._format_body
und __main__._render_markdown). Jetzt EIN gemeinsamer Renderer
(scanner/report.py:render_markdown), den beide nutzen → identischer Inhalt,
keine Divergenz mehr möglich.
2. KI im Report unsichtbar: Der Report rief klartext_befunde OHNE ai_result auf
(KI-Satz fehlte im "Was bedeutet das?") und die Zusammenfassungs-Tabelle
hatte keine KI-Zeile. Jetzt: KI-Satz im Klartext + Zeilen "KI-Funde" und
"KI nicht geprüft" in der Tabelle.
3. Fehlende URL in Kommandos: approve/report/ai-dismiss standen ohne Target da
(nicht ausführbar). Neuer Helfer plain.scanner_cmd(target, rest) injiziert
das Target überall → "python -m scanner https://site approve --all".
4. "Level: YELLOW" aber "Score: 0": Der angezeigte Score war nur der Inhalts-
Diff-Score; KI-/Cloak-/Asset-Scores flossen ins Level, aber nicht in den
Score. cmd_scan/cmd_check aggregieren jetzt alle Teil-Scores → Score und
Level passen zusammen.
Tests: 254 grün (+4: Body==Report, Kommandos-mit-Target, Score-Anzeige,
Level-Badge). alerter._format_body delegiert nur noch an render_markdown.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>