Commit Graph

8 Commits

Author SHA1 Message Date
Dotty Dotter
b8c808cd87 #16 Claim-Match-Anzeige im Frontend (Stufe 2 Vorschau)
Backend:
- /api/podcasts/{id}/episodes/{ep}/claims liefert nun pro Claim match_counts
  (belegt/widerspricht/erweitert je Anzahl) und best_match (target_podcast,
  target_episode, target_idx, relation, reason, score).

Frontend (AnalysisView claims-Mode):
- Match-Badges in passender Farbe (gruen=belegt, rot=widerspricht, blau=erweitert)
  zeigen die Anzahl Bestaetigungen je Relation.
- Best-Match-Link unter dem Claim mit Pfeil (-> bei same-podcast, klickbar zu
  jumpAnswer; ↗ bei cross-podcast, nur als Hinweis sichtbar). Reason wird
  inline gekuerzt angezeigt.

Robustheit: alles greift nur wenn die claim_matches-Tabelle befuellt ist.
Solange match_claims.py noch nicht gelaufen ist, bleibt das UI unveraendert.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 08:00:31 +02:00
Dotty Dotter
6f53f35c09 #10 URL-Routing fuer Podcast-Tiefenlinks
Backend:
- SPA-Fallback: catch-all-Route liefert index.html, falls keine statische Datei
  matcht (mit Ausnahme von /api/* und /audio/*). Dadurch funktionieren Tiefen-
  Links wie /ldn oder /neu-denken direkt.

Frontend:
- loadApp() liest pathname und laedt den passenden Podcast direkt, falls die ID
  in /api/podcasts vorkommt; sonst klassischer Selector.
- selectPodcast() updated den Pfad per history.pushState, damit Bookmarks und
  Sharing funktionieren.
- popstate-Handler reagiert auf Browser-Back/Forward.
- showPodcastList() setzt den Pfad auf '/'.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 02:20:26 +02:00
Dotty Dotter
e1f6f18524 #14/#15/#16 Heatmaps und Drift-Kurve in den Analyse-Views
Backend:
- /api/analyses/density: Faktendichte je Episode in 20 Bins ueber die
  Paragraph-Achse, getrennt nach total und verifizierbar (#16).

Frontend:
- ShiftsView (#15): Inline-SVG-Sparkline ueber die gesamte Drift-Sequenz je Theme,
  mit Schwellen-Linie bei 50% und klickbaren Spike-Markern.
- GapsView (#14): Cluster-Heatmap mit zwei Zeilen (LdN, NEU DENKEN), Cluster-Breite
  proportional zur Cluster-Groesse, Farbe interpoliert von kuehl (geringer Anteil im
  Podcast) zu warm (hoher Anteil); Klick filtert die darunter liegende Liste.
- DensityView (#16): neue View 'Faktendichte', sortiert nach Claims/Absatz,
  pro Episode eine 20-Bin-Heatmap (gruen = verifizierbar, warm = normativ),
  Filter nach Podcast und Sortierung; Klick oeffnet die Episode.
- AnalysisView (#17 questions): zeigt jetzt 'Antwort: <Episode>@p<idx>'-Link
  fuer Fragen mit answered_by_episode; Klick navigiert zur Antwort-Stelle.
- escAttr-Helper, hide-Cascade um DensityView erweitert, Buttons in Selector
  und init() hinzugefuegt.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 02:17:31 +02:00
Dotty Dotter
b73534d1c3 #13/#18 Argumentketten- und Debatten-Views
Backend:
- /api/analyses/debates: liefert kuratierte Cross-Podcast-Gegenueberstellungen mit
  topic, agreement, divergence, insight, beiden Quellabsaetzen und Episodenmetadaten;
  Filter ueber topic, source_podcast, target_podcast.
- /api/analyses/arguments: liefert klassifizierte Argumentketten mit relation,
  confidence, explanation und beiden Quellabsaetzen; Filter ueber relation, podcast,
  episode. Wortwoertlich identische gleicher_punkt-Paare werden ausgeblendet.

Frontend:
- DebatesView: Topic-Chips als Filter, Split-Screen-Quotes je Debatte, Chips fuer
  Uebereinstimmung/Divergenz/Erkenntnis, Klick fuehrt zur Episode mit Audio-Sprung.
- ArgumentsView: farbcodierte Relations-Chips (erweitert blau, widerspricht rot,
  belegt gruen, relativiert grau, gleicher_punkt violett, kein_bezug grau), Konfidenz-
  Anzeige, Filter ueber Podcast, Klick fuehrt zur Episode-Stelle.
- escAttr-Helper fuer onclick-Werte mit Anfuehrungszeichen.
- hide-Cascade aller Views um die beiden neuen erweitert.
- Buttons in showPodcastSelector und init() fuer beide Views.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 02:04:49 +02:00
Dotty Dotter
d6ccea006a #14/#15/#16/#17 backend: Endpoints fuer Gaps, Shifts, Claims und Questions
- /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>
2026-04-28 00:31:02 +02:00
Dotty Dotter
e678f75ee1 #8 Multi-Podcast-Dashboard, #9 PWA, #10 Cross-Podcast-Links, #12 Wort-Timestamps
- 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>
2026-04-23 20:53:06 +02:00
Dotty Dotter
cb5978132c Phase 2: Vorberechnete semantische Similarity + API
- precompute.py: Berechnet paarweise Cosine-Similarity aller Absätze,
  speichert Top-10-Nachbarn pro Absatz in semantic_links Tabelle
- API: /api/similar-precomputed/{podcast}/{episode}/{idx} — liefert
  vorberechnete ähnliche Stellen in <1ms
- Getestet: 728 Absätze, 7144 Links (Threshold 0.55)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-20 21:23:31 +02:00
Dotty Dotter
b0649cea49 Phase 1+2: FastAPI-Backend, SQLite, Embeddings, Semantische Suche
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>
2026-04-20 10:24:53 +02:00