From e0a330520af6aed7d551d965ffac0724639ed9d3 Mon Sep 17 00:00:00 2001 From: beo3000 Date: Wed, 6 May 2026 21:14:36 +0200 Subject: [PATCH] feat(meetings): rewrite /meeting-end with graph auto-import --- .claude/commands/meeting-end.md | 115 ++++++++++++++++++++++++++++---- 1 file changed, 103 insertions(+), 12 deletions(-) diff --git a/.claude/commands/meeting-end.md b/.claude/commands/meeting-end.md index b791de5..b63014b 100644 --- a/.claude/commands/meeting-end.md +++ b/.claude/commands/meeting-end.md @@ -1,13 +1,104 @@ -Schließe ein Jour-Fixe-Meeting ab und führe die Ergebnisse zurück. +Schließe ein Jour-Fixe-Meeting ab, ziehe automatisch Recap+Transkript aus Teams und führe die Ergebnisse zurück. -1. Identifiziere das aktuelle Meeting aus dem Kontext oder den Parametern: $ARGUMENTS - - Prüfe ob eine Meeting-Notiz gerade geöffnet ist (current_note) - - Oder nimm Serie + Datum aus Parametern -2. Lies die Meeting-Notiz und die zugehörige Agenda.md -3. Frage für jedes besprochene Topic: erledigt, offen (weiter), postponed, oder übersprungen? -4. Führe die Ergebnisse nach dem Jour-Fixe-Skill (jour-fixe.md) zurück: - - Historie in Agenda.md fortschreiben (Bold-Datum mit Kurzfassung) - - Erledigte Topics mit Historie ins Archiv verschieben - - Postponed Topics in ⏳ Sektion verschieben -5. Setze den Meeting-Status auf abgeschlossen -6. Bestätige mit Zusammenfassung: wie viele Topics aktualisiert, archiviert, verschoben +## Schritt 1 — Meeting-Notiz identifizieren + +- Wenn `current_note` eine Datei unter `03 Bereiche/Meetings/` ist → diese verwenden. +- Sonst: Serie und Datum aus `$ARGUMENTS` ermitteln. Pfad: `03 Bereiche/Meetings/YYYY-MM-DD .md`. +- Lies das Frontmatter: `o365_id`, `serie`, `date`. +- Wenn `o365_id` leer ist: User fragen, ob Auto-Import übersprungen werden soll (dann weiter bei Schritt 4 ohne Recap/Transkript). + +## Schritt 2 — Artifacts holen + +Führe aus: +``` +cd scripts +node fetch-meeting-artifacts.js --o365-id --out /tmp/artifacts.json +``` + +Lies das JSON. Erwartete Felder: +- `meeting.seriesMasterId` +- `transcript` (string oder null) +- `recap` (object mit `meetingNotes`, `actionItems`, `mentions` — oder null) +- `recordingUrl` (string oder null) +- `warnings` (Liste) + +Wenn `transcript === null` und `recap === null`: User fragen, ob er den Recap aus Teams einfügen will, oder ob das Meeting ohne Auto-Import abgeschlossen werden soll. + +## Schritt 3 — Sprecher-Mapping + +Sammle alle Sprecher-Namen aus `transcript` (Zeilenanfang vor `:`). +Pro Name → Wikilink über Personenmatching (siehe `00 Kontext/Personen/`) oder null. +Notiere ungematchte Sprecher als offene Punkte am Ende des Berichts. + +## Schritt 4 — Doppel-Pass-Synthese + +Lies die existierende Meeting-Notiz vollständig (Live-Notizen!). + +Doppel-Pass: +- **Aus Recap** (sofern vorhanden): Topics, Entscheidungen, offene Fragen, Tasks extrahieren. +- **Aus Transkript**: pro Recap-Aussage validieren; ergänze Details, die mehrfach im Transkript bestätigt sind aber im Recap fehlen. Sprecher als Wikilinks ersetzen. + +Schreibe Ergebnis in die Meeting-Notiz: +- `## Notizen` (gegliedert nach Topics, mit Wikilinks zu Sprechern) +- `## Entscheidungen` +- `## Offene Fragen` +- `## Aufgaben` (Owner als Wikilinks) + +**Merge-Regel mit Live-Notizen:** +- Live-Eintrag mit gleichem Aktor + gleicher Kernaussage → Recap-Eintrag SKIP. +- Live-Eintrag stub (nur Stichwort) → durch Recap-Detail ergänzen. +- Recap-Eintrag neu → unten anhängen. +- Reihenfolge: Live-Order bleibt, neue Items hinten. + +Wenn `recordingUrl` vorhanden: füge ins Frontmatter `recording_url: ` ein (oder ersetze existierenden Wert). + +## Schritt 5 — Agenda-Rückführung mit Konfidenz + +Bestimme die zugehörige Agenda: +- Aus Frontmatter `serie:` der Meeting-Notiz. +- Pfad: `03 Bereiche/Jour Fixe//Agenda*.md`. +- Verifiziere: `o365_series_id` der Agenda matched `meeting.seriesMasterId`. Mismatch → User warnen. +- Falls die Agenda kein `o365_series_id` hat und `meeting.seriesMasterId` vorhanden ist: lazy-backfill (siehe `/meeting`). + +Pro Topic der Meeting-Notiz (H3-Überschriften unter `## 📌 Dauerläufer`, `## 🆕 Neu`, `## ⏸️ Postponed`): + +| Signal in Notiz/Recap/Transkript | Konfidenz | Aktion | +|---|---|---| +| `## ⏸️ Postponed` enthält dieses Topic | HOCH | postpone → in Agenda `## ⏸️ Postponed` verschieben | +| Topic-Status aus Notiz oder Recap: "erledigt"/"abgeschlossen"/"✅" + alle Tasks done | HOCH | archivieren (mit ganzer Historie) | +| Topic erwähnt, kein Abschluss-Marker | HOCH | Historie-Eintrag in Agenda: `**YYYY-MM-DD:** Kurzfassung → [[Meeting-Notiz]]` | +| Topic in Agenda, aber nicht im Notiz-Block | HOCH | unverändert | +| Mehrdeutig | NIEDRIG | zur Bestätigung listen | + +Sammel-Bericht VOR Schreiben: +``` +Vorgesehene Aktionen: + - 5 Topics: Historie-Eintrag (auto) + - 2 Topics: archivieren (auto): X, Y + - 1 Topic: postponed (auto): Z + +Bestätigung nötig: + - "NAC-Projekt": Recap mehrdeutig — erledigt oder offen? + +Ungematchte Sprecher (Personen-Notiz fehlt): Maria Schmidt +``` + +User bestätigt einmal für HOCH-Aktionen, entscheidet pro NIEDRIG-Topic. Dann ausführen. + +## Schritt 6 — Neue Topics nach Dauerläufer + +Topics, die in `## 🆕 Neu` der Meeting-Notiz standen und nicht archiviert oder postponed wurden, in der Agenda nach `## 📌 Dauerläufer` verschieben (🆕-Emoji aus Titel entfernen). + +## Schritt 7 — Status + +In der Meeting-Notiz: `status: abgeschlossen` setzen. + +## Schritt 8 — Bericht + +Gib eine Zusammenfassung aus: +- Recap aus Graph: ja/nein +- Transkript: ja/nein +- Recording-Link: ja/nein +- X Topics aktualisiert, Y archiviert, Z postponed, W neu nach Dauerläufer +- Ungematchte Sprecher (falls vorhanden): Hinweis auf fehlende Personen-Notizen +- Warnings aus dem Fetch-Script (falls vorhanden)