diff --git a/docs/superpowers/specs/2026-05-06-meeting-end-auto-import-design.md b/docs/superpowers/specs/2026-05-06-meeting-end-auto-import-design.md index a896eb8..9f0ee7b 100644 --- a/docs/superpowers/specs/2026-05-06-meeting-end-auto-import-design.md +++ b/docs/superpowers/specs/2026-05-06-meeting-end-auto-import-design.md @@ -32,6 +32,7 @@ | Agenda-Rückführung | Hybrid: eindeutig auto, Grauzone zur Bestätigung | | Notiz-Merge | Mergen oder Skippen bei Duplikaten (Live-Notizen behalten) | | Serien-Link | Neues Frontmatter-Feld `o365_series_id` in Agenda.md | +| Sprecher-Mapping | Transkript-Sprecher gegen `00 Kontext/Personen/` matchen, Wikilinks setzen | ## Architektur @@ -154,7 +155,28 @@ node fetch-meeting-artifacts.js \ 6. **Bericht:** "Meeting [Serie] vom [Datum] abgeschlossen. Recap: ✓/✗. Transkript: ✓. X Topics aktualisiert (auto), Y archiviert (auto), Z postponed (auto), W brauchten Bestätigung." -### 4. Merge-Heuristik Details +### 4. Sprecher-Mapping (`scripts/lib/speaker-matcher.js`) + +**Input:** Sprecher-Liste aus Transkript (Display-Name + E-Mail aus Graph-Metadaten). + +**Match-Strategie** (analog `person-matcher.js`): +1. **E-Mail-Match:** Suche `email` im Frontmatter aller `00 Kontext/Personen/*.md`. +2. **Name-Fallback:** Vergleiche Display-Name mit `vorname` + `nachname`. +3. **Kein Match:** Display-Name als Plain Text behalten, in offene Fragen aufnehmen ("Person X anlegen?"). + +**Output:** Map `{ "Christian Kauer" → "[[00 Kontext/Personen/Christian Kauer (KRAH)]]", "Frank Herberg" → "[[00 Kontext/Personen/Frank Herberg]]", ... }`. + +**Verwendung:** +- In Notizen-Merge: Sprecher-Erwähnungen durch Wikilinks ersetzen ("Frank hat berichtet..." → "[[Frank Herberg]] hat berichtet..."). +- In Aufgaben: Owner-Namen zu Wikilinks. +- Bestehende `person-matcher.js` Logik wiederverwenden. + +**Tests:** +- E-Mail-Match +- Name-Match mit Kurzformen (Christian → Christian Kauer (KRAH)) +- Kein Match → Plain Text + Hinweis + +### 5. Merge-Heuristik Details **Notizen-Merge:** - Live-Notizen aus existierenden `## Notizen`/`## Entscheidungen`/`## Aufgaben` werden zuerst eingelesen. @@ -223,10 +245,13 @@ Claude → setzt status: abgeschlossen - Echtes Jour Fixe IT Team durchlaufen, dann `/meeting-end` - Überprüfen: Notiz-Merge sauber, Agenda korrekt fortgeschrieben, Archiv enthält erledigte Topics +## Bestätigt + +- Graph-Permissions: User ergänzt im Azure Portal. +- Teams Premium / Copilot-Lizenz vorhanden → `aiInsights` sollte funktionieren. +- Sprecher-Mapping ist Teil des Scopes. + ## Offene Fragen -- **Graph-Permissions:** Hat die bestehende Azure-App `OnlineMeetings.Read.All` + `OnlineMeetingTranscript.Read.All` und Application Access Policy auf `AZURE_USER_EMAIL`? Falls nein → Tenant-Admin Aktion erforderlich. -- **`aiInsights`-Verfügbarkeit im Tenant:** muss empirisch getestet werden (Beta-Endpoint, abhängig von Teams Premium/Copilot-Lizenz). - **Backfill von `o365_series_id`:** Einmal-Skript bauen oder lazy beim nächsten `/meeting` jeder Serie? -- **Sprecher-Mapping:** Transkript liefert E-Mail/Display-Name — sollen wir gleich gegen `00 Kontext/Personen/` matchen und Wikilinks setzen? - **Recordings:** sollen Aufzeichnungen ebenfalls verlinkt werden (Anhang im Frontmatter), oder reine Transkript+Recap-Lösung?