Beim Wechsel von der Podcast-Auswahl zu einer konkreten Mindmap warf init() einen TypeError, weil showPodcastSelector() das #welcome-panel-Div ueberschrieben hatte und die anschliessende Zuweisung an dessen innerHTML auf null traf. Folge: catch in selectPodcast() loggte den Fehler, init() lief nicht zu Ende, der SVG-Bereich blieb leer.
Zwei Fixes:
- showPodcastSelector setzt die ID 'welcome-panel' beim Replace wieder.
- init() legt das Div bei Bedarf neu an, falls jemand sonst panel.innerHTML ueberschreibt.
Verifiziert via Headless-Browser (puppeteer): LdN 568 Knoten/555 Kanten, NEU DENKEN 186 Knoten/209 Kanten, force-Simulation laeuft.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- AnalysisView je Episode mit Tabs fuer Claims (#16), Questions (#17), Argumentketten (#13) und Debatten (#18).
- GapsView (#14): Leerstellen-Cluster mit Filtern (Mindestgroesse, fehlt-in-Podcast); Querverweise zu vorhandenen Beispielen.
- ShiftsView (#15): Narrative-Shift je Theme als Drift-Sequenz, Filter ueber Podcast, Theme und Mindest-Drift.
- Mindmap- und Timeline-Komponenten zeigen jetzt einen Fallback-Status statt leerem Bereich, wenn themes oder quotes fehlen (z.B. waehrend laufender Quote-Extraktion).
- Wort-Highlighting (#12): synchronisiert mit Audio-Position via /transcript/.../words-Endpoint.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- /api/podcasts/{id}/episodes/{ep}/claims: Behauptungen einer Episode, optional gefiltert nach claim_type.
- /api/podcasts/{id}/episodes/{ep}/questions: Fragen der Episode, gefiltert nach Typ und Antwort-Status.
- /api/podcasts/{id}/episodes/{ep}/analyses-summary: Zaehler fuer die UI-Buttons (claims, questions, unbeantwortet).
- /api/analyses/gaps: Leerstellen aus data/gaps_analysis.json (#14), Filter ueber min_size und missing_in.
- /api/analyses/shifts: Narrative-Shift-Drift aus data/narrative_shifts.json (#15), Filter ueber podcast, theme und min_drift.
- Wort-Timestamps via /api/podcasts/{id}/transcript/{ep}/words; Tabelle wird via _table_exists graceful behandelt.
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>
- requestAnimationFrame vor buildGraph() (DOM muss SVG erst rendern)
- Fallback W/H wenn Container noch kein Layout hat (< 100px)
- Verhindert leere Mindmap nach Podcast-Auswahl
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Der #mindmap-Container hatte overflow:hidden — die Podcast-Cards wurden
gerendert aber abgeschnitten. Jetzt overflow:auto im Selector-Modus.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Der Selector war vorher nur im 400px-Panel rechts sichtbar — auf Mobile
oder bei schmalem Fenster quasi unsichtbar. Jetzt wird er zentriert im
Mindmap-Bereich angezeigt, bis ein Podcast gewählt wird.
Co-Authored-By: Claude Opus 4.6 (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>
Phase 1:
- FastAPI-Backend (backend/app.py) mit REST-API
- SQLite-Datenbank für Podcasts, Episoden, Absätze, Zitate
- Auto-Import aus mindmap_data.json + srt_index.json beim Start
- Webapp als SPA: API-first mit Static-File-Fallback
- Audio als gemountetes Volume statt im Docker-Image
- Docker-Compose mit Traefik-Labels
Phase 2:
- Qwen text-embedding-v3 via DashScope (1024-dim Vektoren)
- Embedding aller Transkript-Absätze (728 für NEU DENKEN)
- Semantische Suche: /api/semantic-search?q=...
- Similarity-API: /api/similar/{podcast}/{episode}/{paragraph}
- Cosine-Similarity auf normalisierten Vektoren, <100ms
- Findet thematisch verwandte Stellen über Episoden hinweg,
auch bei komplett unterschiedlicher Wortwahl
Vorbereitet für Multi-Podcast (#10): Datenstruktur unterstützt
mehrere Podcasts, Cross-Podcast-Similarity ist ein Parameter.
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>
- #3: Audio startet nicht mehr durch Card-Klick. Separater Play-Button
pro Zitat, Audio-Bar mit Play/Pause. Bewusste Aktion statt Versehen.
- #4: Navigation durch Themes/Episoden stoppt laufendes Audio nicht.
Audio-State ist komplett vom Panel-State getrennt.
- #1: Transkript-Ansicht mit synchronem Mitlesen. Aktiver Absatz wird
hervorgehoben und auto-gescrollt. Klick auf Absatz springt im Audio.
- #5: Suchfeld im Header durchsucht alle Transkripte und Zitate.
Treffer mit Kontext, Klick öffnet Transkript an der Stelle.
AudioPlayer als eigenständiges Objekt, TranscriptView und Search
als separate Module. Alle dynamisch aus mindmap_data.json + srt_index.json.
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>