# Modus Audit — Webseiten-Audit-Ergebnisbericht als Präsentation

Du erzeugst aus einem fertigen Webseiten-Audit (siehe Skill `webseiten-audit`) eine HTML-Präsentation, die den Audit-Bericht in der vereinbarten Slide-Choreographie aufbereitet. Dieser Modus ist **additiv** zu Modus Neu/Update/Echo und wird nur aktiviert, wenn der User-Prompt auf einen Audit-Ordner zeigt.

## Trigger-Erkennung

Audit-Modus aktiv, sobald **eines** der folgenden Pattern im User-Prompt erkannt wird:

1. Pfad-Pattern: `<webseiten-audit-root>/<domain>_<datum>[_<suffix>]/`
   - Beispiele: `<webseiten-audit-root>/example.com_2026-05-12/`, `<webseiten-audit-root>/example.de_2026-05-10_v2/`, `<webseiten-audit-root>/example.org_2026-05-08_smoke/`
   - Suffix ist optional und frei alphanumerisch (Versions-Tag wie `_v2`, Status-Tag wie `_smoke`, Domain-Erweiterung wie `_dev`).
   - **Slash-Normalisierung Pflicht:** Anwender tippt unter Windows auch Backslashes (`<webseiten-audit-root>\…`). Vor dem Pattern-Match alle Backslashes im User-Prompt auf Forward-Slashes normalisieren.
2. Wort „Webseiten-Audit" (oder „Audit-Bericht", „Audit-Ergebnis", „Audit-Präsentation") **plus** Domain (`*.de`, `*.com`, `*.at`, etc.) **plus** Datum (`YYYY-MM-DD` oder `DD.MM.YYYY`).

Bei Match: Audit-Ordner als `<audit_dir>` festhalten und mit den Pflicht-Reads dieses Modus weitermachen — die sieben Standard-Klärungsfragen aus Modus Neu werden übersprungen (siehe „Skip der Standard-Fragen" unten).

**Nicht-Trigger:** „Slides für ein Audit-Gespräch", „Pitch zum Thema Audits" ohne konkreten Audit-Ordner — das ist Modus Neu.

## Pflicht-Reads (zusätzlich zu den Skill-globalen Pflicht-Reads)

In einem einzigen parallelen Tool-Block laden, **nachdem** die globalen Pflicht-Reads geladen sind:

1. `<audit_dir>/Audit-Manifest.json` — Pflicht-Datenquelle, enthält den Block `praesentation_hinweise` mit `roadmap`, `heatmap_daten`, `staerken`, `befunde_gruppen` (`kritisch`, `hoch_top`, `hoch_rest`, `mittel`, `niedrig`)
2. `<audit_dir>/Master-Report.md` — Score, Qualitäts-Urteil, Methodik-Block, Stärken, Befunde, Roadmap
3. `<webseiten-audit-skill>/references/praesentation-bauplan.md` — verbindliche Slide-Choreographie
4. `<webseiten-audit-skill>/references/methodik-story.md` — Methodik-Bullets für Slide 3

Wenn eine dieser Dateien fehlt: harter Stopp mit präzisem Fehler („Datei X im Audit-Ordner Y nicht gefunden — Audit-Modus kann nicht erfüllt werden, bitte Audit-Ordner prüfen oder Audit erneut laufen lassen.").

**Hinweis seit v2.4-66:** Wenn ausschließlich `Audit-Manifest.json` fehlt, der Audit-Ordner ansonsten aber vollständig wirkt (Master-Report.md vorhanden, Subagent-Outputs unter `01_Subagents/` vorhanden), ist Phase 5d des Audit-Laufs noch nicht abgeschlossen. Vor dem Präsentations-Bau muss Phase 5d laufen: `cd <webseiten-audit-skill> && python -m helpers.audit_manifest --audit-dir <audit_dir>`. Phase 5c rendert seit v2.4-66 nur noch `Master-Report.md`, die Manifest-Schreibung wandert in Phase 5d zusammen mit `audit_log_review`.

## Skip der Standard-Klärungsfragen

Die folgenden sechs Fragen aus Modus Neu werden im Audit-Modus **nicht** gestellt, weil die Antworten aus dem Audit-Manifest und der Vault-Konvention stammen:

| Frage Modus Neu | Audit-Modus Default | Quelle |
|---|---|---|
| Frage 1 — Format | **HTML-Präsentation** | Audit-Default |
| Frage 2 — Designsystem | **Warm Navigator** | Bauplan referenziert Stefans Designsystem |
| Frage 3 — Titel | **`Webseiten-Audit <domain> — <audit_date>`** | aus Manifest (`domain`, `audit_date`) |
| Frage 4 — Ablage-Kategorie | **projektnah zum Audit-Ordner** | siehe Ablage-Logik unten |
| Frage 6 — Anlass | **Webseiten-Audit-Ergebnisbericht** | gesetzt |
| Inhalts-Skizze | **Bauplan-Reihenfolge** | `praesentation-bauplan.md` verbatim |

**Ablage-Logik (ersetzt Frage 4/5/6/7 als einmalige stille Entscheidung):**

1. Wenn ein laufendes Beratungsprojekt zum Audit existiert (z.B. `<projekt-beratung>/<Mandat>/`, das die Audit-Domain referenziert): Bundle in `<projekt-beratung>/<Mandat>/Praesentationen/<YYYY-MM-DD>_Audit-<domain>/` ablegen.
2. Sonst: Bundle direkt im Audit-Ordner unter `<audit_dir>/Praesentation/` ablegen.

Die Zielpfad-Entscheidung wird Stefan **einmal kurz zur Bestätigung** vorgelegt (Frage 7 aus Modus Neu bleibt — Pfad-Bestätigung ist Pflicht). Auf „anderer Pfad" reagiert der Modus mit Freitext-Eingabe wie in Modus Neu.

## Bleibende Klärungsfrage — Empfänger

**Vor der Frage prüfen (seit v2.4-70, State-Pass-Through Audit → /neue-praesentation):** Enthält `Audit-Manifest.json::praesentation_empfaenger` bereits einen Wert? Falls ja: Wert übernehmen, Frage überspringen, Stefan kurz informieren: „Empfänger aus dem Manifest übernommen: <wert>." Nur wenn das Feld fehlt oder Stefan explizit „anderen Empfänger" nennt, Frage erneut stellen. Hintergrund: Stefan wird im Audit-Klärungsdialog bereits einmal nach dem Empfänger gefragt (`helpers/audit_init.py::--empfaenger`), der Wert wandert über `audit-config.json::empfaenger` ins Manifest und ist hier verfügbar — die Doppelfrage aus Modus-Audit-Live-Test 2026-05-17 ist damit geheilt (Spec H-4).

Wenn das Manifest-Feld fehlt, genau **eine** Frage via `AskUserQuestion` (Schema bei Bedarf per ToolSearch `select:AskUserQuestion` laden):

**Frage:** „Wer bekommt diesen Audit-Bericht?"

**Optionen:**

- **Kunde direkt** — Ton höflich-professionell. Schadensszenarien werden deutlich, aber konstruktiv formuliert. Schlussslide (Slide 12) als Angebot „Nächste Schritte" mit Stefans Kontakt-Block.
- **Stefans Vorbereitung** — Ton kompakt-faktisch. Schadensszenarien blunter, weil Stefan die Folien selbst nutzt. Schlussslide als Pitch-Stichworte für Stefans Vortrag, ohne Kontakt-Block.

**Wirkung:** Diese Antwort beeinflusst **ausschließlich** den Ton der Empfehlungs-Slides (Slide 8 „Roadmap" und Befund-Slides mit Empfehlungs-Sektion) sowie die Schluss-Slide. Die Slide-Choreographie und der Befund-Block bleiben gleich.

## Slide-Choreographie (verbatim aus praesentation-bauplan.md)

Der Skill folgt der Choreographie aus `<webseiten-audit-skill>/references/praesentation-bauplan.md` **eins zu eins**. Kein eigener Aufbau, keine kreative Umsortierung. Konkret:

- **12 Rahmen-Slides** in fester Reihenfolge: Cover, Auditrahmen, Methodik, Score, Pflicht-Resolver, Heatmap, Stärken, Roadmap, Coverage, Audit-Log-Hinweise und Validator-Drops, Anhänge, Schluss. Slide 10 zeigt **vier** Selbst-Auskunfts-Quellen, sobald eine davon befüllt ist: (a) `audit_log_review_warnings` (Hard-Logging-Drift, Phasen-Marker fehlend) und (b) `validator_dropped_befunde` plus `validator_dropped_count` (wegen Schema-Bruch gedroppte Befunde, pro Drop `id` und `reason`) und (c) eines der drei whitelisted Provenance-Felder (`audit_log_review_status`, `pflicht_resolver_resultat_status`, `tools_versions_status`) trägt einen Wert `!= "loaded"` (seit v2.4-68). Whitelist als `frozenset` in `helpers/audit_manifest.py.SLIDE_10_TRIGGER_FIELDS`, der Helper `fill_audit_slides.py` importiert diese Konstante. Sind alle Quellen sauber, entfällt die Slide. Manifeste vor v2.4-68 ohne Status-Felder: implizit `loaded`, Slide 10 entfällt rückwärtskompatibel.
- **Dynamischer Befund-Block** zwischen Slide 6 (Heatmap) und Slide 7 (Stärken):
  - **kritisch-Einzelslides** — jeder kritische Befund bekommt eine eigene Slide.
  - **hoch-Top-3-Einzelslides** — die Top-3-Befunde mit Schwere `hoch` (`hoch_top`) bekommen jeweils eine eigene Slide.
  - **hoch-Rest-Bullet-Slide** — restliche `hoch`-Befunde (`hoch_rest`) als Bullet-Slide(s).
  - **mittel-Bullet-Slides** — max. 8 Bullets pro Slide. Bei mehr als 8 mittel-Befunden splittet der Skill auf zwei (oder mehr) Bullet-Slides auf.
  - **niedrig-Tabelle** — alle niedrig-Befunde in einer kompakten Tabellen-Slide.

**Single Source of Truth für Pflicht-Anchor pro Bucket: die Anchor-Tabelle in `praesentation-bauplan.md` Abschnitt „Anchor pro Bucket".** Diese Modus-Karte fasst nur zusammen, was aus dem Manifest-Block direkt verfügbar ist:

- `praesentation_hinweise.befunde_gruppen[*].beleg_auszug` liefert den **Beleg-Volltext** verbatim (nicht umformulieren, nicht trunkieren). Stefan-Hartregel seit v2.4-60: **niemals mit „…" abkürzen** — Konsolidator und Subagent liefern bereits kompakt-formulierte Texte für Geschäftsführer und Fachbereichsleiter (idealerweise unter ca. 800 Zeichen, menschlich verständlich, nicht-technisch). Bei sehr langen Belegen Folge-Slide oder kleinere Schrift wählen, aber **nicht** trunkieren.
- `praesentation_hinweise.befunde_gruppen[*].beleg_volltext_in_befunde_json` bleibt im Schema, ist seit v2.4-60 konstant `false` (kein zweiter Lookup mehr nötig). Flag-Bereinigung in späterem Sprint.

Bei Konflikt zwischen dieser Karte und der Bauplan-Anchor-Tabelle gilt **der Bauplan**. Vor dem Befüllen jedes Buckets: Anchor-Tabelle im Bauplan kurz nachsehen, was Pflicht-Element ist.

**Cross-Dimension-Markierung:**

- In Bullet-Slides: `[Dim+]`-Präfix vor Bullets, die mehrere Audit-Dimensionen treffen.
- In Einzelslides: Dimensions-Tag-Zeile unter der Headline, die **primäre** Dimension fett, weitere Dimensionen regulär.
- In der niedrig-Tabelle: eigene Spalte „Cross" mit allen weiteren Dimensionen.

## Pflicht-Gates (geerbt vom Skill, kein Bypass)

Audit-Modus erbt **alle** Pflicht-Gates des Skills `neue-praesentation` ohne Ausnahme:

- **Natur-Sprech-Check** — jeder Slide-Text ist externe Kommunikation und triggert automatisch Modus B des Skills `natur-sprech-check` (siehe Skill-Hauptdatei Abschnitt „Natur-Sprech-Pflicht"). Beleg-Auszüge aus dem Manifest sind Zitate und davon ausgenommen, müssen aber als Zitat (Kursiv, Quelle) erkennbar sein.
- **Glossar-Check** — jeder Personenname, Firmenname, Fachbegriff gegen `{context}/Glossar` prüfen, bevor er in eine Slide kommt. Auch Domain-Eigentümer und Geschäftsführer-Namen aus dem Audit.
- **Designsystem-Pflicht** — `globals.css` ist Source of Truth, Pflicht-Klassen (`.gold-dot`, `.eyebrow`, `.headline-display`, `.btn-primary`, `.sig-line`) verwenden, Verbots-Liste einhalten (kein reines `#FFFFFF` als Card-Background, keine Tailwind-Slate-Neutrals, kein Manrope, keine Teal-Buchstaben-Punkte).
- **Echte Umlaute** — `ä ö ü Ä Ö Ü ß` in jedem Slide-Text. Nach esbuild per Grep prüfen.

## Drei-Schritte-Pipeline (Pflicht-Reihenfolge, seit 2026-05-15)

Modus-Audit-Befüllung läuft in **drei expliziten Schritten**. Schritt 2 ist die Wand, an der Session 33 ohne diese Doku gescheitert ist — Helper `neue-praesentation.py` kopiert nur das Master-Template, er liest **kein** Audit-Manifest und befüllt **keine** Slides. Wer den Schritt überspringt, bekommt ein generisches Financial-Navigator-Demo-Bundle in den Audit-Ordner gelegt (Bug-Klasse „Template-Default verdeckt Audit-Inhalt", Stefan-Eskalation 2026-05-15).

### Schritt 1 — Bundle initialisieren

```
python "<SKILL_ROOT>/scripts/neue_praesentation.py" \
  --zielordner "<bestätigter Zielpfad>" \
  --titel "Webseiten-Audit <domain>" \
  --designsystem "warm-navigator" \
  --datum "<audit_date>"
```

Ergebnis: leeres Bundle mit Master-Template-Slides (Cover „Vom Kapitalmarktrauschen zur klaren Navigation", fingierte Mandantenfamilie usw.). **Das ist NICHT der Audit-Bericht** — das ist die Rohform.

### Schritt 2 — Slide-Inhalte aus Manifest und Bauplan einsetzen (PFLICHT)

**Seit v2.4-69 deterministischer Code-Pfad:** Helper `fill_audit_slides.py` ersetzt die manuelle LLM-Schreibung. Hauptagent ruft den Helper auf, **keine** eigene JSX-Schreibung mehr (Session-33-Eskalation: nicht-deterministisch, langsam, Marker-Drift-Quelle).

```
cd <webseiten-audit-skill> && python -m helpers.fill_audit_slides \
  --audit-dir "<audit_dir>" \
  --bundle-dir "<bestätigter Zielpfad>" \
  --empfaenger {kunde,stefan}
```

Der Helper liest `Audit-Manifest.json` (Block `praesentation_hinweise` plus Root-Felder), `references/methodik-story.md` (neun Bullets verbatim) und die Master-Atom-Schicht aus `<BUNDLE_ROOT>/_lib/designsystem/templates/praesentation/slides-a.js`. Er schreibt anschließend atomar die drei JSX-Dateien:

- `_runtime/src/slides-a.jsx` — **Atom-Schicht 1:1 aus Master** (Wordmark, Chrome, Placeholder, VideoPlaceholder, SigLine, EyebrowDot, LOGO-Helper plus `Object.assign(window, {...})`-Footer) plus **max. 12 Slide-Funktionen** (Master-Schema-Grenze): Rahmen-Slides 1–6 plus erste Befund-Slots bis Slot 12 nach Priorität kritisch → hoch-Top-3 → hoch-Rest → mittel-Chunks → niedrig.
- `_runtime/src/slides-b.jsx` — alle restlichen Audit-Slide-Funktionen plus `SlideAuditHealth`-Stencil. SlideAuditHealth wird **immer** definiert (Idempotenz), der TEMPLATES-Array-Eintrag dafür ist konditional über das `slide_10_aktiv`-Flag.
- `_runtime/src/app.jsx` — EDITMODE-Block (TWEAK_DEFAULTS, alle 6 Master-Keys: `dark`, `accent`, `fontScale`, `footerOn`, `logoOn`, `animOn`) bleibt verbatim erhalten (Schnittstelle zu `update-praesentation-lint.py`), `window.AUDIT_DATA = {...}` mit den Manifest-Daten, `window.TEMPLATES`-Array nach Master-Schema (`{ id, comp: 'SlideAuditXxx' (String!), label, type, defaultDark }`). **Kein props-Channel** — für indexierte Befund-Slides schreibt der Helper eigene Slide-Funktionen je Index (`SlideAuditBefundHochTop0`, `SlideAuditBefundHochTop1`, …).

**Empfänger-Param Pflicht:** `--empfaenger kunde` höflich-professioneller Ton mit Stefans Kontakt-Block. `--empfaenger stefan` kompakt-faktischer Ton mit Pitch-Stichworten ohne Kontakt-Block.

**Exit-Codes:** 0 = drei JSX-Dateien überschrieben · 1 = audit_dir/bundle_dir/Manifest fehlt oder corrupt · 2 = argparse-Standard.

**Anti-Pattern:** Keine f-string- oder Template-String-Konstruktion von JSX-Source mehr. AUDIT_DATA-Pattern v3 trennt Daten (`window.AUDIT_DATA`) und Stencils (Slide-Funktionen) strukturell — eliminiert Escape-Probleme und Marker-Drift.

**Pflicht-Datenquellen pro Slide** (zur Kontrolle nach Helper-Lauf):

| Slide | Quelle |
|---|---|
| Cover | Manifest-Root `domain`, `audit_date`, `skill_version_full` |
| Auditrahmen | Manifest-Root `url`, `chosen_locale`, `tools_versions`, `dimensionen` |
| Methodik | `references/methodik-story.md` (neun Bullets verbatim — Helper parsed die Bullet-Liste und übernimmt jeden Schritt wortgleich, kein Kürzen, kein Umformulieren) |
| Gesamtbewertung | Manifest-Root `score`, `score_bucket.label`, `score_bucket.beschreibung` |
| Pflicht-Resolver | Manifest-Root `pflicht_resolver_resultat` |
| Heatmap | `praesentation_hinweise.heatmap_daten` |
| Befund-Block | `praesentation_hinweise.befunde_gruppen.{kritisch,hoch_top,hoch_rest,mittel,niedrig}`, Beleg-Volltext verbatim aus `beleg_auszug` (v2.4-60: niemals trunkieren) |
| Stärken | `praesentation_hinweise.staerken` |
| Roadmap | `praesentation_hinweise.roadmap.{quick_wins,strategisch,kosmetik,nachrangig}` |
| Coverage | Master-Report Crawl-Coverage-Block |
| Audit-Log+Validator-Drops | Manifest-Root `audit_log_review_warnings`, `validator_dropped_befunde`, plus die drei Provenance-Status-Felder `audit_log_review_status`, `pflicht_resolver_resultat_status`, `tools_versions_status` (seit v2.4-70 — SlideAuditHealth zeigt bei `!= "loaded"` die konkrete Ursache statt Fallback-Text, Spec H-9 / K-3). Slide entfällt, wenn alle drei Status `loaded` sind und `audit_log_review_warnings` plus `validator_dropped_befunde` leer sind. |
| Anhänge | Dateiliste des Audit-Ordners |
| Schluss | Empfänger-Antwort: bei „Kunde direkt" Stefans Kontakt-Block, bei „Stefans Vorbereitung" Pitch-Stichworte |

**Anti-Pattern: NICHT** `neue-praesentation.py` aufrufen und direkt zu Schritt 3 (Verifikation) gehen. Der Helper hat keine Audit-Logik, das Bundle wäre leer. **Pendant seit v2.4-69:** Auch nicht `fill_audit_slides.py` überspringen — ohne diesen Helper bleibt das Bundle Template-Default und Marker-Gate (Schritt 3) schlägt mit Exit 7.

### Schritt 3 — Verifikation und Build (Pflicht-Gate, seit 2026-05-15)

Vor `build.cmd`/`build.sh` zwingend der **Marker-Check-Gate** gegen Template-Default-Reste:

```
python "<SKILL_ROOT>/scripts/check_audit_bundle_filled.py" \
  "<bundle-zielordner>"
```

Verhalten:

- **Exit 0** — Bundle ist befüllt, keine Template-Default-Marker mehr in den JSX-Quellen. Weiter mit Build.
- **Exit 7** — Bundle enthält noch Template-Marker (z.B. „Independent Financial Navigator", „Familie M.", „Mareike Sander"). **Skill ist NICHT fertig — Schritt 2 wurde übersprungen oder unvollständig durchgezogen.** Stdout listet pro Marker die Treffer-Datei. Befüllung nachholen, Gate erneut laufen lassen.
- **Exit 1** — Bundle-Struktur unvollständig (keine JSX-Quellen). Schritt 1 nicht sauber durchgelaufen.

Erst nach **Exit 0** läuft Build und die weiteren Greps:

```
cd <bundle-zielordner>/_runtime && bash build.sh   # bzw. build.cmd auf Windows
```

- Glossar-Grep gegen die JSX-Dateien (Personennamen, Firmennamen)
- Natur-Sprech-Grep (`grep -nE ', (und|oder)\b'`, `grep -nE '[a-zäöü]+: [a-zäöüA-ZÄÖÜ]'`)
- Umlaut-Grep nach `ae|oe|ue|ss`-Verdachtsmustern in deutschen Wörtern (false positives manuell prüfen)

## Fertig-Kriterium Modus Audit

- Bundle liegt im bestätigten Zielordner.
- Alle 12 Rahmen-Slides plus dynamischer Befund-Block aus Manifest sind befüllt.
- Empfänger-Antwort (Kunde direkt vs. Stefans Vorbereitung) ist auf Slide 8 und Slide 12 sichtbar umgesetzt.
- **Marker-Check-Gate `check-audit-bundle-filled.py` liefert Exit 0** (deterministische Wand gegen Template-Default-Drift).
- Pflicht-Gates (Natur-Sprech, Glossar, Designsystem, Umlaute) sind durchlaufen.
- Stefan hat den Pfad bestätigt bekommen.

## Verknüpfungen

- Skill `webseiten-audit` (Anwender-Vault, separate Dokumentation)
- `<webseiten-audit-skill>/references/praesentation-bauplan.md`
- `<webseiten-audit-skill>/references/methodik-story.md`
- [modus-neu.md](modus-neu.md) — Modus Neu im gleichen Skill
