scripts/cluster_themes.py:
- Berechnet Embeddings je Theme (label + description), single-linkage Clustering
ueber Cosinus-Schwelle (default 0.55) ueber Podcast-Grenzen hinweg.
- Output: data/theme_clusters.json mit Cluster-Liste, je Cluster Mitglieder
(podcast_id, theme_id, label) und Cross-Flag.
Backend:
- /api/analyses/cross-themes: liefert die Cluster-Datei aus.
Frontend (CrossMindmapView):
- Force-Graph mit zwei Podcast-Hubs (links/rechts), je Themen radial drumherum,
Cross-Cluster-Member als gestrichelte gelbe Verbindungslinien mit Cluster-Label.
- Panel: Cross-Cluster oben (klickbar zur Episode), Solo-Cluster darunter.
- Klick auf Theme oeffnet den jeweiligen Podcast.
- 'Cross-Mindmap'-Button im Selector.
Initiales Cluster-Ergebnis: 13 Cluster aus 14 Themen, 1 Cross-Cluster
('Trump-USA' x 'Plattformmacht/Debattenkultur').
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
scripts/match_answers.py (#17):
- Laedt offene Fragen (genuine, follow_up; answered='no').
- Embedded jede Frage und sucht den besten Kandidat-Absatz aus einer anderen
Episode (optional cross-podcast) per Cosinus-Aehnlichkeit ueber die paragraph-
embeddings.
- Bei score >= 0.55: Qwen-Verifikation 'Beantwortet B die Frage in A?'
(yes/partial/no), bei yes/partial wird answered + answered_by_* in der
questions-Tabelle gesetzt.
- Hard-Budget 1,50 USD, --rerun setzt bestehende Matches neu.
scripts/match_claims.py (#16 Stufe 2):
- Analoge Mechanik fuer claims: Embedding, Cosinus-Suche, Qwen-Verifikation
in der vier-stufigen Skala 'belegt' / 'widerspricht' / 'erweitert' / 'kein_bezug'.
- Schreibt Treffer (ohne 'kein_bezug') in neue Tabelle claim_matches.
- Default nur verifizierbare Claims (--include-non-verifiable kippt das),
--cross-podcast erlaubt Cross-Podcast-Treffer.
Beide Skripte nutzen json_utils.parse_llm_json fuer robustes Parsing und sind
gegen NaN-Vektoren in den Embeddings abgesichert.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Pro Episode: Paragraphen mit [P0]-Markern an qwen-plus, Antwort 3-5 markante Zitate als JSON-Array (para_idx, text, verbatim, speaker, is_top, themes).
- Theme-IDs werden gegen die in der DB hinterlegten themes-Liste validiert; unbekannte Themes fallen auf das leere Array zurueck.
- Audio-Timestamps kommen aus der paragraphs-Tabelle ueber para_idx, dadurch keine SRT-Reparsing-Schritte noetig.
- Hard-Budget 1,50 USD je Lauf, Skip vorhandener Episoden, Crash-Sicherheit durch Commit nach jeder Episode.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- scripts/json_utils.py: parse_llm_json() mit Codefence-Strip, balanced-brace-Extractor, Truncation-Repair, Inner-Quote-Escape und Trailing-Comma-Strip.
- scripts/analyse_arguments.py + scripts/curate_debates.py: nutzen den neuen Parser, drei Retries bei Netz/Rate-Limit, --rerun-errors-Pfad fuer das Reparieren bestehender error-Records, busy_timeout=60s gegen SQLite-Locks.
- scripts/rerun_errors.py: Standalone-Re-Runner fuer beide Tabellen (debates.topic='error' und argument_links.relation='error') mit Budget-Limit, behaelt IDs via UPDATE.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Backend: /api/compare Endpoint für Podcast-Vergleich (Stats, gemeinsame Topics,
Top-Querverbindungen), /api/.../words Endpoint für Wort-Timestamps
- Frontend: Podcast-Vergleichsansicht mit Statistiken und Cross-Links,
Cross-Podcast-Suche-Toggle, semantische Links im Transkript (lazy-loaded),
Podcast-Switcher mit Zurück-Navigation
- PWA: manifest.json, Service Worker (stale-while-revalidate für Assets,
network-first für API, cache-on-success für Audio), Icons
- Scripts: transcribe_words.py (mlx-whisper Batch-Transkription mit Wort-Timestamps),
import_words.py (Wort-Timestamps in DB importieren)
- Dockerfile: PWA-Assets in Container kopieren
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- #2: Topic-Tags pro Transkript-Absatz (27 Themen-Taxonomie),
Backlinks zu verwandten Stellen in anderen Episoden.
Neues Script: scripts/index_topics.py
- #6: Audio-Clip-Export direkt im Browser (Web Audio API → WAV).
Kein serverseitiges ffmpeg nötig.
- #7: Timeline-Ansicht als Alternative zur Mindmap.
Staffeln → Episoden → Zitate auf Zeitachse.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Generic tool for building interactive mindmap visualizations from podcast transcripts.
Includes: audio download, SRT conversion, quote-timestamp matching, D3.js mindmap webapp.
Configurable via project.yaml — no podcast-specific content.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>