[{"id": 2176, "title": "Maintenance-Modus der Website per SDR steuerbar (animiert, Bypass, Countdown)", "desc": "## Ziel\n\nDie senity-website bekommt einen Maintenance-Modus, der im SDRv4-Admin-UI (Bereich \"Webseite\") ein- und ausgesc", "pk": "SWS", "tc": "FEAT"}, {"id": 2175, "title": "Windows: Tray-Linksklick öffnet Settings nicht", "desc": "## Problem\nLinksklick auf das Senity-Speech-Flow Tray-Icon öffnet die Einstellungen nicht.\n\n## Root Cause\npystray's `def", "pk": "SPEECH", "tc": "BUG"}, {"id": 2174, "title": "neu-Modus: {{SPRACHE}}-Platzhalter nutzt ASR-Eingangssprache statt Zielsprache Englisch", "desc": "## Problem\n\nDer `neu`-Modus (\"Übersetzung (Englisch)\") übersetzt flaky: manchmal DE→EN, oft DE→DE, einmal EN→DE.\n\n**Ursa", "pk": "SPEECH", "tc": "BUG"}, {"id": 2173, "title": "cloud_vision-Default False verwirft Screenshots am Vision-faehigen Senity-Backend", "desc": "Allgemeines Risiko fuer ALLE Nutzer: llm.supports_images() gibt fuer das Cloud/Senity-Backend cloud_vision (Default Fals", "pk": "SPEECH", "tc": "BUG"}, {"id": 2172, "title": "Jarvis: Kalender-Events löschen können", "desc": "Webhook erweitern um Tool delete_calendar_event. Aktuell kann Jarvis nur lesen und erstellen, nicht löschen. Gleiche Log", "pk": "CLI", "tc": "FEAT"}, {"id": 2171, "title": "TTS-Server: 3 von 5 user_voices im Listing aber 404 bei /api/tts/stream (Cloning-Daten fehlen)", "desc": "Befund (2026-06-24, via x-api-key Christoph gegen sdr.senity.ai): GET /api/tts/voices listet 5 user_voices, aber POST /a", "pk": "SPEECH", "tc": "BUG"}, {"id": 2170, "title": "Hero vereinheitlicht: gemeinsame Hero-Komponente fuer alle 8 Seiten (Refactor) - deployt", "desc": "Refactor: Statt pro Seite eigenem Hero-Markup gibt es jetzt eine gemeinsame, wiederverwendbare Komponente components/blo", "pk": "INFRA", "tc": "IMP"}, {"id": 2169, "title": "CLAUDE.md verschlanken: Build-Historie nach BUILDS.md (3-Runden-Review)", "desc": "Root-CLAUDE.md von 50672 auf 24720 B (-51%) durch Auslagerung der Build-Slot-Historie (22 Absaetze) in neue BUILDS.md. 3", "pk": "SPEECH", "tc": "CHO"}, {"id": 2168, "title": "Workspace-Submodul-Keys nicht ausgeliefert: Gitea-Submodule im cli-ws nicht klon-/push-fähig", "desc": "## Symptom (Timo, Senity Operativ, 2026-06-24)\nAus dem Workspace-Container heraus nicht initialisierbar: `projects/senit", "pk": "CLI", "tc": "BUG"}, {"id": 2167, "title": "Unterseiten-Hero auf Vollbild (volle Hoehe + Breite) wie Startseite - umgesetzt + deployt", "desc": "Wunsch: Der Hero-Bereich der Unterseiten soll den kompletten Bildschirm einnehmen (volle Hoehe UND Breite) wie auf der S", "pk": "INFRA", "tc": "IMP"}, {"id": 2166, "title": "Hero-Inhalt linksbuendig statt zentriert (VideoBackground-Wrapper) - gefixt + deployt", "desc": "Bug: Auf den Flex-Hero-Seiten (senity-workspace, gastro, communication-hub, speech-flow) stand der Hero-/Banner-Inhalt l", "pk": "INFRA", "tc": "BUG"}, {"id": 2165, "title": "Website senity.ai neu deployt (origin/main 9f68ef3) + Dockerfile-Registry-Token", "desc": "Marketing-Website senity.ai/www auf neueste Version redeployt.\n\nAblauf:\n- Klon /opt/senity/core/senity-website per Fast-", "pk": "INFRA", "tc": "CHO"}, {"id": 2164, "title": "Radial-Menue: picker_during_recording standardmaessig auf True", "desc": "User-Befund: Radial-Menue laesst sich in v137 nicht oeffnen. Ursache: picker_during_recording war False (Default seit #1", "pk": "SPEECH", "tc": "BUG"}, {"id": 2163, "title": "Einstellungen-öffnen aus unknown_key-Dialog schliesst App ohne Relaunch", "desc": "## Problem\n\nNach Eingabe eines API-Keys, den das Backend nicht kennt (HTTP 401 → `unknown_key`), zeigt `_show_block_dial", "pk": "SPEECH", "tc": "BUG"}, {"id": 2162, "title": "Cross-Plattform-Update-Verifikation: E2E-Auto-Update auf mac-silicon, mac-intel, windows", "desc": "Sicherstellen, dass die Auto-Update-Funktion auf ALLEN Systemen zuverlaessig laeuft (User-Prioritaet). Pro Plattform ein", "pk": "SPEECH", "tc": "CHO"}, {"id": 2161, "title": "Willkommens-E-Mail nach Speech-Flow-Registrierung (Zugangsdaten + SDR/Lizenz/Download-Links)", "desc": "## Kontext\n\nDie neue Senity-Webseite hat den externen Calendly-Flow durch eine eigene Speech-Flow-Registrierung ersetzt ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 2160, "title": "feat(sdr-mini): Auto-Pipeline-Flag in Board-Karte und Ticket-Overlay anzeigen", "desc": "## Problem\\nDas `auto`-Feld (Migration 097, `auto INTEGER NOT NULL DEFAULT 0`) wurde am 2026-06-22 zur `tickets`-Tabelle", "pk": "SDRv4", "tc": "FEAT"}, {"id": 2159, "title": "[Brainstorming] Claude Code Session-Tracking + Konsolen-Bubble im SDR Chat", "desc": "## Ziel\n\nClaude Code Sessions im SDR Chat persistent tracken und als resizeable/scrollbare Konsolen-Bubble im Chat darst", "pk": "SDRv4", "tc": "FEAT"}, {"id": 2158, "title": "KNOWLEDGE: _node_at cur-Schwelle blockiert Klicks während Öffnungsanimation", "desc": "## Problem\n\nRadial-Fan öffnet sich, Nutzer klickt sofort auf einen Modus – Auswahl wird still verworfen. Erst beim zweit", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 2157, "title": "BoardTicketOverlay: Markdown-Rendering, Speichern-Button, Edit-Toggle", "desc": "## Problem\n\nDas Ticket-Detail-Overlay (`components/boards/BoardTicketOverlay.tsx`) zeigte die Beschreibung als rohen Mar", "pk": "SDRv4", "tc": "BUG"}, {"id": 2156, "title": "fix: Radial-Modus-Auswahl schlägt beim ersten Öffnen fehl (cur < 0.95 Animation-Guard)", "desc": "## Problem\n\nWenn der Nutzer auf den Radial-Kreis klickt, der Fan öffnet sich, und er einen Modus wählt, wird die Auswahl", "pk": "SPEECH", "tc": "BUG"}, {"id": 2155, "title": "Wissenstest: Senity SDR, Workspace, Speechflow, Git-Workflow (50 Fragen, Multiple-Choice)", "desc": "## Ziel dieses Tickets\n\nTimo bearbeitet 50 Multiple-Choice-Fragen zu den Themen Senity SDR, Senity Workspace, Senity Spe", "pk": "TMO", "tc": "RESEARCH"}, {"id": 2154, "title": "senity-webseite: Chat-TTS-Route, SpeakableProvider, Logo-Aspect-Ratio & npm-Vulnerabilities gefixt", "desc": "## Kontext\n\nNach erfolgreichem Browser-CLI-Test der senity-webseite (Next.js 15, @murc134/chat 1:1 eingebettet) blieben ", "pk": "SWS", "tc": "IMP"}, {"id": 2153, "title": "Windows-Hotkey-Hook: ctypes-argtypes-Konflikt mit pynput (54x in v104) - TDD: erst Regressionstest, dann Fix", "desc": "Telemetrie-Befund (logs.senity.ai, project SPEECH): mit Abstand haeufigster Fehler in freier Wildbahn - 54 von 77 Events", "pk": "SPEECH", "tc": "BUG"}, {"id": 2152, "title": "Ticket-Audit SPEECH: Konsistenz-Check offene/in-progress Tickets", "desc": "## Kontext\n\nChristoph hat einen Ticket-Audit fuer das SPEECH-Projekt angefragt. Ziel: alle offenen/in-progress Tickets a", "pk": "SPEECH", "tc": "CHO"}, {"id": 2151, "title": "Senity Speech Flow Installations-Handbuch (Windows + macOS, Clean-Install-Test)", "desc": "## Auftrag (Chris, Voice 2401, 2026-06-23)\n\nTimo schreibt ein vollstaendiges Installations-Handbuch fuer Senity Speech F", "pk": "SPEECH", "tc": "CHO"}, {"id": 2150, "title": "WinError 1401: Tray-Icon erscheint nicht (3-stufige pystray-Menü-Verschachtelung)", "desc": "## Problem\n\nAuf Windows startet die App (v104) nicht: PyInstaller zeigt einen Crash-Dialog:\n\n```\nFailed to execute scrip", "pk": "SPEECH", "tc": "BUG"}, {"id": 2149, "title": "Windows-Release v105: neue Mode-Prompts + Output-Guard-Fix bauen + publizieren", "desc": "Windows haengt auf Build v104 (Code-Stand 3b7e431), das ist VOR den finalen live-optimierten Mode-Prompts (SPEECH-2134) ", "pk": "SPEECH", "tc": "CHO"}, {"id": 2148, "title": "Senity Speech Flow End-to-End-Test (aktuelle + abwaertskompatible Version) inkl. Bugfixing via Claude Code", "desc": "## Auftrag (Chris, Voice 2386, 2026-06-23)\n\nTimo testet Senity Speech Flow auf Herz und Nieren. Ziel: Stabilitaets-, Fun", "pk": "SPEECH", "tc": "RESEARCH"}, {"id": 2147, "title": "Welche Senity Speech Flow Version ist universell stabil? (Klärung für Kundengespräche)", "desc": "## Kontext\n\nMarco fragt im Namen von Timo: Timo geht gleich in ein Gespräch mit einem potenziellen Kunden und braucht ei", "pk": "SPEECH", "tc": "RESEARCH"}, {"id": 2146, "title": "Senity-Website (Next.js) unter senity.ai + www.senity.ai online schalten", "desc": "## Ziel (User, 2026-06-23)\n\nDie Marketing-Website aus `git.senity.ai/senity-admin/Senity_Website` (Next.js 15.1.3 / Reac", "pk": "INFRA", "tc": "FEAT"}, {"id": 2145, "title": "Download-Seite: macOS Installations- und Weitergabe-Anleitung ergaenzen", "desc": "## Anforderung (User, 2026-06-23)\n\nAuf der SDR-Download-Seite (`/downloads`, SpeechFlowDownloads) soll fuer macOS eine I", "pk": "SDRv4", "tc": "FEAT"}, {"id": 2144, "title": "Mac-Verteilung: build.sh 3 Signing-Modi (dev/adhoc/developerid) + Notarisierung-ready", "desc": "Dev-Cert ist auf fremden Macs ungueltig -> TCC verweigert (SPEECH-2135-Befund bei Allen/Yannik). Fix: SPEECHFLOW_SIGN=de", "pk": "SPEECH", "tc": "CHO"}, {"id": 2143, "title": "Ticket-Zeitstempel in Berliner Zeit anzeigen (Europe/Berlin statt UTC)", "desc": "## Problem (gemeldet von Timo)\n\nDie Uhrzeiten/Datumsangaben aller Tickets werden im Web (tickets.senity.ai) falsch darge", "pk": "STS", "tc": "BUG"}, {"id": 2142, "title": "Voice-Tester-Rolle konsolidieren: Portal-Zugang + speechflow_customer entfernen", "desc": "## Kontext\n\nBeim Self-Service-Register (`app/api/public/register/route.ts`) bekommt ein Kunde genau **eine** Rolle: `Voi", "pk": "SDRv4", "tc": "IMP"}, {"id": 2141, "title": "Registrierungsseite: fehlende Pflichtfeld-Sterne + Telefonnummer als Pflichtfeld", "desc": "## Kontext\n\nGemeldet von Timo am 2026-06-23 in Telegram (Senity Operativ), Nachfolge-Ticket zu #2138 (Registrierungsseit", "pk": "SDRv4", "tc": "BUG"}, {"id": 2140, "title": "Registrierung: fehlende Pflichtfeld-Markierungen + Telefonnummer als Pflichtfeld", "desc": "Gemeldet von Timo (Telegram, Senity Operativ, message_id 696, 2026-06-23).\n\n## Problem\n\nAuf der Registrierungsseite (SDR", "pk": "SDRv4", "tc": "BUG"}, {"id": 2139, "title": "v104: Senity-Symbol erscheint nicht nach Lizenz-Key-Eingabe + Einstellungen-Button ohne Reaktion", "desc": "Gemeldet von Timo am 2026-06-23 (Telegram).\n\n## Build\nSpeech Flow v104 (allerneueste Version).\n\n## Symptome\n1. Nach Eing", "pk": "SPEECH", "tc": "BUG"}, {"id": 2138, "title": "Registrierungsseite laggt stark + kleine Verbesserungsideen", "desc": "Gemeldet von Timo am 2026-06-23 (Telegram).\n\n## Symptom\nDie Registrierungsseite (SDRv4) laggt bei Timo stark.\n\n## Verbes", "pk": "SDRv4", "tc": "BUG"}, {"id": 2137, "title": "Windows Build v104 + Release", "desc": "Windows Release-Build v104 aus aktuellem `dev`-Stand.\n\n## Inhalt gegenüber v103\n\n3 neue Commits auf `dev` seit dem letzt", "pk": "SPEECH", "tc": "CHO"}, {"id": 2136, "title": "Radiales Overlay (Kreis): Modus-/Kontext-Klick erst beim 2.-3. Mal angenommen + falscher Modus angewendet", "desc": "## Problem\n\nBeim Auswaehlen eines Modus oder Kontexts ueber das radiale Overlay (Kreis-Menue) auf Windows zwei zusammenh", "pk": "SPEECH", "tc": "BUG"}, {"id": 2135, "title": "Output-Guard verwirft legitime Diktate mit Meta-Prefix (Ich wuerde/glaube/habe)", "desc": "Befund aus der Prompt-Optimierung (SPEECH-2134): _validate_llm_output / _LLM_META_PREFIXES in speechflow/main.py behande", "pk": "SPEECH", "tc": "BUG"}, {"id": 2134, "title": "DEFAULT_MODES: 5 reale Modi als Auslieferungs-Defaults + iterativ optimierte Prompts", "desc": "Christophs 5 konfigurierte Modi (Diktat, Nachricht, Verbessern, Befehl, Uebersetzung) werden die DEFAULT_MODES. Prompts ", "pk": "SPEECH", "tc": "IMP"}, {"id": 2133, "title": "DPI-Awareness ist Pflicht VOR dem ersten tk.Tk()/ctk.CTk() in JEDEM Fenster-Subprozess (sonst unscharfe Icons/Bitmaps auf Windows >100%)", "desc": "## Problem\n\nFenster-Icons (logo.ico) und overrideredirect-Bitmaps werden auf Windows bei Anzeige-Skalierung >100% unscha", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 2132, "title": "History-Fenster: Senity-Icon unscharf auf Windows >100% Skalierung (fehlende DPI-Awareness im --history-Subprozess)", "desc": "## Problem\n\nDas Senity-Logo/Icon im History-Fenster (\"Senity Speechflow History\") ist auf Windows bei Anzeige-Skalierung", "pk": "SPEECH", "tc": "BUG"}, {"id": 2131, "title": "[Brainstorming] Dashboard Admin: User-Switch + Global Usage Dashboard", "desc": "## Ziel\n\nZwei zusammenhängende Features:\n\n1. **Dashboard Admin Capability** -- privilegierte User können das Dashboard e", "pk": "SDRv4", "tc": "FEAT"}, {"id": 2130, "title": "[Brainstorming] Registrierbares Google-Konto + spawnbarer Google-Worker-Container (Gmail/Drive/Kalender MCP) mit Live-Mail-Reaktion", "desc": "**Vision des Users:** In SDR soll man ein Google-Konto registrieren koennen. Pro Konto wird ein wiederholt spawnbarer Do", "pk": "SDRv4", "tc": "FEAT"}, {"id": 2129, "title": "Controlled Tiptap-Editor: prop-&gt;state-Sync clobbert lokale Edits, echo-guard via lastEmittedRef", "desc": "## Problem\n\n`TTSMarkdownTextArea` (`@murc134/ui-kit`) liess sich im Chat-Composer nicht zuverlaessig zwischen visuellem ", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 2128, "title": "LiveKit 7880 oeffentlich exponiert (am nginx-proxy vorbei, ohne TLS)", "desc": "## Befund (Orchestrator-Diagnose 2026-06-22)\n\nDer LiveKit-Stack veroeffentlicht den Signalling-Port 7880 direkt auf die ", "pk": "INFRA", "tc": "BUG"}, {"id": 2127, "title": "TTSMarkdownTextArea: visual↔markdown-code Toggle bricht, Formatierung wird nicht übernommen (Chat-Composer)", "desc": "## Symptom\n\nIm Chat-Composer (`TTSChatComposer`, /chat) lässt sich im `TTSMarkdownTextArea` nicht zuverlässig zwischen v", "pk": "SDRv4", "tc": "BUG"}, {"id": 2126, "title": "Security-Layer: Prompt-Injection-Check + Anhang-Scan fuer untrusted Inputs", "desc": "## Ziel\n\nGenerischer Security-Layer, der **untrusted Eingaben** (Mail-Bodies, Attachments, eventuell auch Telegram-Forwa", "pk": "SWS", "tc": "FEAT"}, {"id": 2125, "title": "E-Mail-Auto-Reply-Loop fuer Workspace-Gmail", "desc": "## Ziel\n\nAuto-Reply-Loop, die regelmaessig Chris' (bzw. die jeweilige Workspace-Nutzer-) Gmail-Inbox abruft, jede Mail b", "pk": "SWS", "tc": "FEAT"}, {"id": 2124, "title": "Email-Loop: Google-Drive-Mails lesen, prüfen, automatisch beantworten oder weiterleiten", "desc": "**Ziel:** Workspace-Agent liest periodisch E-Mails aus Chris' Google Drive (bzw. dort hinterlegtem Mail-Export), bewerte", "pk": "SWS", "tc": "FEAT"}, {"id": 2123, "title": "Workspace-Deploy-Keys nicht in Gitea autorisiert (blockt Submodule-Init für 4 Repos)", "desc": "## Symptom\n\nIm Senity-Workspace-Container (`/workspace`) schlaegt `git submodule update --init --recursive` fuer vier Su", "pk": "STS", "tc": "BUG"}, {"id": 2122, "title": "Attachments: E2E-Tests + Rollout-Doku", "desc": "Parent: #2114 (Datei-Anhänge bei Tickets). Backend: #2117. Client: #2118. Upload-UI: #2119. Anzeige+Share: #2120. Auto-K", "pk": "STS", "tc": "CHO"}, {"id": 2121, "title": "Attachments: Workspace Auto-Konsum-Layer (Vision, PDF-Extract, ASR)", "desc": "Parent: #2114 (Datei-Anhänge bei Tickets). Decisions in comment #2059. Backend: #2117. Client: #2118.\n\n## Scope (lebt im", "pk": "SWS", "tc": "FEAT"}, {"id": 2120, "title": "Attachments: Mini-SDR Anzeige + Preview + Signed-URL-Share-Button (3 Views)", "desc": "Parent: #2114 (Datei-Anhänge bei Tickets). Decisions in comment #2059. Backend: #2117. Upload-UI: #2119.\n\n## Scope (lebt", "pk": "SDRv4", "tc": "FEAT"}, {"id": 2119, "title": "Attachments: Mini-SDR Upload-UI (Drag&Drop, Ticket + Comment)", "desc": "Parent: #2114 (Datei-Anhänge bei Tickets). Decisions in comment #2059. Backend: #2117.\n\n## Scope (lebt im SDRv4-Repo, Br", "pk": "SDRv4", "tc": "FEAT"}, {"id": 2118, "title": "Attachments: Workspace-Client (ticketing-client.ts erweitern)", "desc": "Parent: #2114 (Datei-Anhänge bei Tickets). Decisions in comment #2059. Backend: #2117.\n\n## Scope\nlib/ticketing-client.ts", "pk": "SWS", "tc": "FEAT"}, {"id": 2117, "title": "Attachments: STS-Backend (DB-Migration, Supabase-Bucket, API-Routen)", "desc": "Parent: #2114 (Datei-Anhänge bei Tickets). Decisions in comment #2059.\n\n## Scope\n\n### DB-Migration (services/ticketing-s", "pk": "STS", "tc": "FEAT"}, {"id": 2116, "title": "Workspace-Container: SSH-Host-Aliases für senity-workspace-Submodules nachziehen", "desc": "## Problem\n\nDer Workspace-Container hat aktuell nur zwei SSH-Host-Einträge in `~/.ssh/config`:\n\n- `git.senity.ai` (Port ", "pk": "CORE", "tc": "BUG"}, {"id": 2115, "title": "Dateianhänge an Tickets (Upload + Übergabe an Claude Code)", "desc": "Anforderung von Christoph (Voice 2277, 2279 vom 2026-06-22):\n\nTickets sollen Dateianhänge bekommen können. Use Case: bei", "pk": "STS", "tc": "FEAT"}, {"id": 2114, "title": "Datei-Anhänge bei Tickets: Upload im UI plus API-Support", "desc": "**Quelle:** Voice 2277 von Chris (2026-06-22, chat_id 36833276, session 62).\n\n**Originalwortlaut:**\n\n> Also, was ich mac", "pk": "STS", "tc": "FEAT"}, {"id": 2113, "title": "Onboarding-Handbuch/Wiki: Delegator-Skills (Arbor, Codex, Gemini, Senity, MSH) als nutzbare Werkzeuge dokumentieren", "desc": "Das Onboarding-Handbuch bzw. die interne Wiki-Seite soll spaeter einen Abschnitt bekommen, der erklaert, dass die Delega", "pk": "CLI", "tc": "CHO"}, {"id": 2112, "title": "Voice-Consent Client-Check: status[type].active lesen, nicht hasConsent", "desc": "## Problem\n\nIm Speech-Flow-Chat erschien `VOICE_CONSENT_REQUIRED` auch dann, wenn der User die Einwilligung zur Stimmver", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 2111, "title": "Voice-Consent im Chat-Mic: freundlicher Dialog statt Console-Error + Contract-Mismatch bei bereits gegebenem Consent", "desc": "## Symptom\n\nBeim Start des Chat-Mic (Live-ASR) im Speech-Flow-Portal:\n\n**Facet A (UX):** Fehlt der Voice-Consent, wird e", "pk": "SDRv4", "tc": "BUG"}, {"id": 2110, "title": "BUG: TTSActionPicker Dropdown weißer Hintergrund im AI Workspace (CLI-Mode)", "desc": "## Problem\\n\\nIm AI Workspace (CLI-Mode, `chatMode === 'cli'`) erscheint das TTSActionPicker-Dropdown mit weißem Hinterg", "pk": "SDRv4", "tc": "BUG"}, {"id": 2109, "title": "Systemprompt-Ueberarbeitung: Transkript-Validierung + Identitaet + individuelle Modi", "desc": "Globaler Systemprompt.md ueberarbeitet: (1) Transkript-Validierungs-Block - bei Kauderwelsch/Erkennungsfehler/leerem/fal", "pk": "SPEECH", "tc": "IMP"}, {"id": 2108, "title": "Voice Studio: WebSocket-Features (Live-Mikro/Sprach-Chat) extern kaputt - WS-Resolver haengt :3002/:3003 statt 443/nginx an", "desc": "## Symptom\nVoice Studio meldet roten Fehler-Toast bei WebSocket-Features (Live-Mikro/ASR-Stream, Sprach-Chat), reproduzi", "pk": "SDRv4", "tc": "BUG"}, {"id": 2107, "title": "ImmoScout-Kampagne aufsetzen — Absender-E-Mail von Ben liegt vor", "desc": "Ben von Wahl Immobilien hat die Absender-E-Mail-Adresse fuer die ImmoScout-Kampagne geliefert. Naechster Schritt: Kampag", "pk": "CLI", "tc": "FEAT"}, {"id": 2106, "title": "ImmoScout-Kampagne aufsetzen (Absender von Ben geliefert)", "desc": "Duplikat von CLI-2107 — geschlossen.", "pk": "CLI", "tc": "FEAT"}, {"id": 2105, "title": "Prozess-Isolation des In-Process-LLM (C7) - mp.Process fuer terminierbare Inferenz", "desc": "Folge aus SPEECH-2076 (Offline-Haertung, PR7b). Das In-Process-LLM (llama-cpp) laeuft synchron im Tray-Hauptprozess unte", "pk": "SPEECH", "tc": "IMP"}, {"id": 2104, "title": "Settings-Subprozess haengt im Lade-Splash (Modi werden geladen) bei ~127% CPU", "desc": "Reproduzierbar auf aktuellem dev (Mac-Build v131, arm64): Beim Start oeffnet die App automatisch Settings (autostart/Reo", "pk": "SPEECH", "tc": "BUG"}, {"id": 2103, "title": "Modi-Tab lässt sich bei schmalem Settings-Fenster nicht zuverlässig scrollen", "desc": "Im Einstellungen-Tab \"Modi\" sind bei schmalerer Fensterbreite nicht alle Mode-Karten erreichbar. Der Bereich fällt trotz", "pk": "SPEECH", "tc": "BUG"}, {"id": 2102, "title": "Diktat-Ziel: eigene Fenster per PID statt Bundle-ID ausschliessen (Settings/History diktierbar, Kreis nicht)", "desc": "Bug: Diktat versagt, wenn ein Speech-Flow-eigenes Fenster im Vordergrund ist. Ursache (macOS): _capture_target_app_pid s", "pk": "SPEECH", "tc": "BUG"}, {"id": 2101, "title": "Recherche: Rust als Python-Alternative für Senity Speech Flow", "desc": "Christoph hat ein Fireship-Video geteilt (\"The most trusted code on Earth is being rewritten in Rust\", Sntj4HmuykI, hand", "pk": "AI", "tc": "RESEARCH"}, {"id": 2100, "title": "Migration 191 (website_config) auf test + live ausführen + Marker setzen", "desc": "## Aufgabe\nMigration `191_2026-06-21-website-navigation-config.sql` (Singleton-Tabelle `website_config` zur SDRv4-seitig", "pk": "SDRv4", "tc": "CHO"}, {"id": 2099, "title": "Settings-Fenster oeffnet nicht (Dual-Tk-Root-Hang im frozen Build, Regression von Splash SPEECH-2094)", "desc": "## Symptom\n\nAuf Windows (frozen onedir, v102/v103) oeffnet sich das Settings-Fenster nicht mehr. `app.log` zeigt `===== ", "pk": "SPEECH", "tc": "BUG"}, {"id": 2098, "title": "Speech-Flow Release-Manifest: Windows-EXE-Name ins signierte Payload (Vertrag mit updater.py apply_update)", "desc": "## Ziel\n\nDer Speech-Flow-Updater (`updater.py apply_update`) braucht für Windows-Releases den exakten EXE-Namen aus dem ", "pk": "SDRv4", "tc": "IMP"}, {"id": 2097, "title": "Strang 1 Verifikation: Update-Button + Tray-Linksklick bereits vorhanden", "desc": "## Auftrag\n\nAus dem Feature-Buendel (6 Punkte) Strang 1 verifizieren: (1) „Nach Updates suchen\"-Button im Tray, (2) Tray", "pk": "SPEECH", "tc": "RESEARCH"}, {"id": 2096, "title": "ASR-Error-Toast: bei Nicht-JSON/HTML nur Statuscode + Kurztext statt roher Server-HTML", "desc": "## Problem\n\nBei einem ASR-Fehler mit Nicht-200-Status baut `transcriber._transcribe_once` die Exception-Message aus `sni", "pk": "SPEECH", "tc": "IMP"}, {"id": 2095, "title": "Toast-IPC zerbricht bei CRLF im Body (502-HTML fragmentiert die IPC-Zeile)", "desc": "## Problem\n\nUser-Report \"aktuelle speech flow version funktioniert nicht siehe logs\" (Slot v102 Windows).\n\nIm Log (`dist", "pk": "SPEECH", "tc": "BUG"}, {"id": 2094, "title": "Settings-Fenster: Ladebalken/Splash beim Öffnen (Cold-Start-Feedback)", "desc": "## Ziel\n\nDas Settings-Fenster braucht mehrere Sekunden bis es sichtbar ist (Subprozess-Cold-Start: Interpreter-Boot + `_", "pk": "SPEECH", "tc": "FEAT"}, {"id": 2093, "title": "Tray-Menü: „Nach Updates suchen\"-Eintrag per Rechtsklick", "desc": "## Feature\n\nRechtsklick auf das Tray-Icon soll neben den bestehenden Einträgen auch „Nach Updates suchen\" anbieten. Klic", "pk": "SPEECH", "tc": "FEAT"}, {"id": 2092, "title": "Live-/Test-/interne Supabase-URLs der SDRv4-Deployments (verifiziert aus Laufzeit-Env)", "desc": "Verbindliche Referenz fuer Ticket + Runbook. Werte verifiziert am 2026-06-20 direkt aus der Laufzeit-Env des laufenden C", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 2091, "title": "SpeechFlow-Lizenz gültig bis 30.09.2026 auf Test und Live ausstellen/verifizieren", "desc": "## Kontext\n\nAus der Orchestrator-Session (2026-06-20, ticketing-MCP global verdrahtet) als offener Punkt mitgenommen: ei", "pk": "SDRv4", "tc": "CHO"}, {"id": 2090, "title": "Server-Deploy + DB-Migrationen fuer #2088 (Download hinter Login) auf Test und Live", "desc": "## Ziel\n\nDen auf `main` integrierten Stand (inkl. #2088: Download-Seite zurueck hinter Login in die echte SDR-Shell) auf", "pk": "SDRv4", "tc": "CHO"}, {"id": 2089, "title": "Lizenzen-Seite konsequent auf FlexibleJSTools (DataTable) umstellen", "desc": "## Kontext\n\nUser-Anforderung (mit Live-Screenshot): \"hier muss flexible js tools konsequent verwendet werden https://sdr", "pk": "SDRv4", "tc": "IMP"}, {"id": 2088, "title": "Download-Seite als regulaere SDR-Seite mit Login-Zwang (nur /register bleibt oeffentlich)", "desc": "## Ziel (neue Richtung, ersetzt #2083)\n\nChristoph: `https://sdr.senity.ai/de/download` soll **keine oeffentliche Landing", "pk": "SDRv4", "tc": "FEAT"}, {"id": 2087, "title": "Design-Varianten als Unterseiten unter /varianten + Nav-Eintrag (Schritt 1), danach SDRv4-Menueverwaltung (Schritt 2)", "desc": "## Kontext\n\nTimo moechte die drei Webseiten-Design-Varianten direkt anschaubar machen. Statt sie auf separaten Branches ", "pk": "SWS", "tc": "FEAT"}, {"id": 2084, "title": "History-Fenster aktualisiert sich nicht automatisch bei neuen Einträgen", "desc": "## Problem\n\nWenn das History-Fenster geöffnet ist und eine neue Aufnahme gemacht wird, erscheint der neue Eintrag **nich", "pk": "SPEECH", "tc": "BUG"}, {"id": 2082, "title": "Orphaned Subprozesse nach Non-interaktivem Singleton-Replace (Windows)", "desc": "## Problem\n\nWenn eine neue App-Instanz (z.B. v95) eine laufende Vorinstanz (v93) via Non-interaktivem Singleton-Replace ", "pk": "SPEECH", "tc": "BUG"}, {"id": 2081, "title": "Branch-Code selektiert noch nicht deployte Migrations-Spalten bricht Login auf Ziel-DB still", "desc": "## Problem\n\nLogin lieferte auf dem lokalen Dev-Server (zeigt via .env.local auf `api-sdr-test.senity.ai`) für JEDEN auth", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 2080, "title": "#2042 (Migration 183 Soft-Delete) nicht auf Live deployed — Code+Migration zusammen ausrollen", "desc": "## Problem\n\nBei der Live-Login-Diagnose (#2078) festgestellt: Die in #2042 eingeführte Migration **183** (DSGVO-Art-18 S", "pk": "SDRv4", "tc": "CHO"}, {"id": 2078, "title": "Live-SDR: GoTrue-SMTP kaputt — Passwort-Reset-Mails schlagen fehl (Produktions-Incident)", "desc": "## Symptom\n\nAuf Live (sdr.senity.ai) schlaegt jeder Passwort-Reset fehl. GoTrue `/recover` liefert HTTP 500. Betrifft ec", "pk": "SDRv4", "tc": "BUG"}, {"id": 2077, "title": "Tag-getriggerter Windows-Build via GitHub Actions (Gitea-Mirror)", "desc": "Hybrid-CI fuer Windows-Builds: Gitea (GTR) spiegelt Tags per Push-Mirror nach GitHub; ein Tag build-v<N> triggert .githu", "pk": "SPEECH", "tc": "CHO"}, {"id": 2076, "title": "Offline-Haertung & Performance: Metal-Offload, Fokus-Gate, ASR-only, lokale Prompt-Architektur", "desc": "Sammel-Ticket aus Extended Review (Codex+Gemini+MSH-Ersatz+Opus, 20 Findings). Lebender Plan: docs/plans/2026-06-20-offl", "pk": "SPEECH", "tc": "IMP"}, {"id": 2075, "title": "Riesige Luecke im KI-&-Modelle-Settings-Tab zwischen ASR-Dropdown und LLM-Sektion", "desc": "## Symptom\n\nIm Settings-Tab „KI & Modelle\" klafft eine grosse leere Luecke (~200 px, auf HiDPI visuell ~400 px) zwischen", "pk": "SPEECH", "tc": "BUG"}, {"id": 2074, "title": "Tray-Icon unscharf auf HiDPI-Displays (Windows): Haupt-/Tray-Prozess DPI-unaware", "desc": "## Symptom\n\nDas Tray-Icon (Logo) wird auf HiDPI-Windows-Displays (Skalierung > 100 %, z.B. 150 %) unscharf/verwaschen da", "pk": "SPEECH", "tc": "BUG"}, {"id": 2073, "title": "Kanal-spezifische System-Prompts + kanal-gefilterte History + Voice-Gespraechsverlauf", "desc": "Drei zusammenhaengende Features:\n\n1. Kanal-spezifische System-Prompts: Neben dem globalen Systemprompt.md gibt es jetzt ", "pk": "SPEECH", "tc": "FEAT"}, {"id": 2072, "title": "pre-commit-Hook: MERGE_HEAD-Ausnahme fuer .tasks-Block (False-Positive bei dev-Merges)", "desc": "## Problem\n\n`scripts/hooks/pre-commit` blockt das Committen von `.tasks/`-Dateien in Git-Worktrees (Check `[ \"$GIT_DIR\" ", "pk": "SDRv4", "tc": "CHO"}, {"id": 2071, "title": "Voice/TTS nutzt immer Server-TTS - tts_backend fehlt im Job-Snapshot", "desc": "Symptom (v128, offline + TTS=Lokal/Piper): Beim Vorlesen erscheint Offline Server hat nicht geantwortet (online HTTP 404", "pk": "SPEECH", "tc": "BUG"}, {"id": 2070, "title": "Settings KI-&-Modelle-Tab aufraeumen + Modi-Tab Scroll-Bug", "desc": "Vier UI-Fixes in speechflow/settings.py (vom User in v127 gemeldet):\n1) KI-Tab Reihenfolge: Whisper-(ASR-)Modelle erschi", "pk": "SPEECH", "tc": "BUG"}, {"id": 2069, "title": "Recherche: Rust als Alternative zu Python für Senity Speech Flow (Fireship-Video Sntj4HmuykI)", "desc": "Anlass\n\nChris hat das Fireship-Video \"The most trusted code on Earth is being rewritten in Rust\" (https://youtu.be/Sntj4", "pk": "AI", "tc": "RESEARCH"}, {"id": 2068, "title": "Artikel über Senity Speedstop bei der Berliner Zeitung als Autoren posten", "desc": "Wir wollen als Senity einen Artikel über Senity Speedstop bei der Berliner Zeitung publizieren (Autoren-Posting). Aufgab", "pk": "CORE", "tc": "FEAT"}, {"id": 2067, "title": "Gastartikel bei Berliner Zeitung über Senity Speedstop platzieren", "desc": "Auftrag von Chris (Telegram msg 2240, 2026-06-19):\n\n> Machen wir bitte ein Ticket dafür, dass wir bei der Berliner Zeitu", "pk": "SWS", "tc": "CHO"}, {"id": 2066, "title": "Gastartikel bei Berliner Zeitung über Senity Speedstop platzieren", "desc": "Auftrag von Chris (Telegram msg 2240, 2026-06-19):\n\n> Machen wir bitte ein Ticket dafür, dass wir bei der Berliner Zeitu", "pk": "SWS", "tc": "CHO"}, {"id": 2065, "title": "Deploy-Keys / Read-Zugriff für alle in den Workspace eingebundenen Repos sicherstellen", "desc": "Der Workspace-Container braucht Lese-Zugriff (Fetch/Clone) auf jedes Repo, das er einbindet oder im Auftrag des Users be", "pk": "SWS", "tc": "CHO"}, {"id": 2064, "title": "Lokales LLM (Polish/Voice-Prompt) tot im Frozen-Build: pickletools fehlt im PyInstaller-Bundle", "desc": "Symptom (v124 Mac arm64, beim User reproduziert): Jedes Diktat im Polish-Modus und jede Voice-/Vorlesen-Aktion (voice_mo", "pk": "SPEECH", "tc": "BUG"}, {"id": 2063, "title": "Bestaetigungs-E-Mail mit API-Key nach Self-Service-Registrierung", "desc": "Nach der oeffentlichen Kunden-Registrierung (/register) soll der Kunde eine E-Mail erhalten: eine Registrierungs-Bestaet", "pk": "SDRv4", "tc": "FEAT"}, {"id": 2062, "title": "Fragebogen-System: Erstellung, Auswertung und Anzeige im Frontend und auf der Webseite", "desc": "## Anforderung\n\nIm SDRv4 soll ein Fragebogen-System implementiert werden. Use Cases sind z.B. Kunden-Onboarding, Bedarfs", "pk": "SDRv4", "tc": "FEAT"}, {"id": 2061, "title": "Audio-Geraet als NAME statt PortAudio-Index speichern (Settings-Test ok, Hotkey nutzt falsches Mikro)", "desc": "User Martin Schoepker (Windows): Im Audio-/ASR-Test (Settings-Subprozess) funktioniert das gewaehlte Mikro + Transkripti", "pk": "SPEECH", "tc": "BUG"}, {"id": 2060, "title": "Telemetrie: Nutzer identifizierbar machen (application + api_key) + Crash-Sicherheit bei totem Logging-Server", "desc": "Bisher waren Telemetrie-Events nur an eine anonyme installation_id gebunden -> Support konnte einen Fehler keinem Nutzer", "pk": "SPEECH", "tc": "FEAT"}, {"id": 2059, "title": "Lizenz-Client ruft /api/license/activate nie auf (Backend-Vertrag erwartet activate nach 401/404 + Erststart)", "desc": "Vertragsbruch Client<->Backend. Das SDRv4-Backend (app/api/license/activate/route.ts, lib/licenses/verify-handler.ts) do", "pk": "SPEECH", "tc": "IMP"}, {"id": 2058, "title": "Update-Check vor/neben das Lizenz-Gate ziehen (Gate-Block darf Auto-Update nicht brechen)", "desc": "Problem (aus SPEECH-2057, Olli-Intel-Bug): Der Auto-Update-Check laeuft erst NACH dem Lizenz-Gate. In main.main() blocki", "pk": "SPEECH", "tc": "IMP"}, {"id": 2057, "title": "Intel-Build: Lizenz-Gate blockt trotz gueltigem Key (cryptography/OpenSSL-Symbol-Mismatch)", "desc": "User Olli Hassing: Intel-Mac zeigt keine Lizenz trotz eingetragenem api_key. app.log: cryptography nicht verfuegbar -> E", "pk": "SPEECH", "tc": "BUG"}, {"id": 2055, "title": "Consent- und Lizenz-Dialog: Theming auf CTk/Senity umstellen", "desc": "## Problem\n\n`speechflow/consent.py` (`_show_dialog_tk`) und `speechflow/license.py` (`_show_block_dialog_tk`) nutzten ba", "pk": "SPEECH", "tc": "IMP"}, {"id": 2054, "title": "X-Forwarded-For Hop-Count-Resolver: korrekte Formel idx = chain.length - hops", "desc": "## Problem\nBei der Haertung von getClientIp gegen X-Forwarded-For-Spoofing (SDRv4-2035, @murc134/core) enthielt der ursp", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 2053, "title": "license_type.key ist produktbasiert, nicht tier-basiert (Seed-Falle)", "desc": "## Problem\nBeim Hinzufuegen eines tier-Werts (free/pro/enterprise) zu license_type wurde im Plan ein Seed mit `WHERE key", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 2052, "title": "match_embeddings_for_session: scoped-Client liefert 0 Chunks (RAG-Ausfall bei RLS-Sanierung)", "desc": "## Problem (Sub-Aspekt von #2018 RLS-Fundament, Befund 10-B)\n\n`match_embeddings_for_session` (db/001:1364-1392, SECURITY", "pk": "SDRv4", "tc": "BUG"}, {"id": 2051, "title": "Settings-UI/UX-Review: KI-Einstellungen bündeln, Struktur verbessern", "desc": "## Problem\n\nDer Settings-Dialog hat strukturelle UX-Mängel:\n\n1. **Allgemein-Tab**: ASR-Auswahl → LLM-Auswahl → dann plöt", "pk": "SPEECH", "tc": "IMP"}, {"id": 2050, "title": "Runtime-Wheel-Token: cp-Segment kommt vom LAUFENDEN Python (3.11), nicht von der CI (cp313)", "desc": "## Problem\n\nDer SpeechFlow-Client lädt die native `llama-cpp-python`-Runtime aus dem signierten `runtime.json` über das ", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 2049, "title": "CI-Pipeline senity-llama-wheels: minos-11 Wheels (mac arm64/x86_64, win, linux) via GitHub Actions", "desc": "Eigenes Build-Fabrik-Repo fuer die nativen llama-cpp-python-Wheels des signierten Runtime-Katalogs (runtime.json, Dach-T", "pk": "SPEECH", "tc": "FEAT"}, {"id": 2048, "title": "AGB-Klausel: kundeninitiierte Selbst-Loeschung (Soft-Delete) fuer Speech-Flow-Kundenportal", "desc": "## Auftrag\n\nEntwurf einer rechtssicheren AGB-Klausel (plus ggf. Anpassung Datenschutzerklaerung) fuer die **kundeninitii", "pk": "SWS", "tc": "RESEARCH"}, {"id": 2046, "title": "LLM-Output-Guard kontext-bewusst machen (Voice-Antworten nicht mehr verwerfen)", "desc": "## Problem\n\nDer lokale LLM-Output-Guard (_validate_llm_output in speechflow/main.py, #1519) ist kontext-blind. Er feuert", "pk": "SPEECH", "tc": "BUG"}, {"id": 2045, "title": "Deploy Wave-B-Fixes: dev->main Sync + prod/test + prod/live + Migration 177 (generated-images privat)", "desc": "## Ziel\nWave-B-Sicherheitsfixes (allen voran #2038 IDOR generated-images) auf Test- und Live-Server ausrollen. Umfasst d", "pk": "SDRv4", "tc": "CHO"}, {"id": 2044, "title": "Image-Routes Token-Wallet: assertTokenBudget Pre-Check + debitTokens(category:'image') fire-and-forget", "desc": "## Problem\nDie Image-Werkzeug-Routes (generate/edit/upscale/background-removal) belasteten die Senity-Token-Wallet nicht", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 2043, "title": "Zwei getrennte Image-Buckets (generated-images vs chat-generated-images) + signierte-URL-Persistenz-Pattern", "desc": "## Problem\nSenity hat ZWEI Storage-Buckets fuer KI-Bilder, die leicht verwechselt werden:\n- `chat-generated-images` (Cha", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 2042, "title": "Speech-Flow-Kundenportal: DSGVO-Self-Service (Lizenzen, Stammdaten, Löschung ohne Refund)", "desc": "## Ziel\n\nEigene, admin-freischaltbare Übersichtsseite im SDR fuer Kunden, die zwar als Benutzer angelegt sind, den SDR a", "pk": "SDRv4", "tc": "FEAT"}, {"id": 2041, "title": "Settings: Schließen-Button entfernen, Speichern startet App neu + öffnet Einstellungen wieder", "desc": "## Anforderung (User, Christoph)\n\n> mir ist leider negativ aufgefallen, dass SpeechFlow sich schließt, wenn ich auf den ", "pk": "SPEECH", "tc": "FEAT"}, {"id": 2039, "title": "Windows-Lizenzdialog: API-Key-Eingabe + Auto-Start, Senity-Logo app-weit", "desc": "## Kontext\n\nDer Lizenz-Block-Dialog auf Windows (`license._show_block_dialog_tk`) bietet aktuell nur „Einstellungen oeff", "pk": "SPEECH", "tc": "FEAT"}, {"id": 2037, "title": "[Wave-B] Voice session/persist akzeptiert client-kontrollierten tier - Retention-Eskalation", "desc": "## Problem\napp/api/voice/session/persist/route.ts:67 liest rawTier = form.get('tier') aus dem Multipart-Body. tier steue", "pk": "SDRv4", "tc": "BUG"}, {"id": 2036, "title": "[Wave-B] NON_COMPLIANT_PROVIDERS nur in production gefiltert - DSGVO greift in dev/staging nicht", "desc": "## Problem\nlib/llm/fallback-resolver.ts:21 NON_COMPLIANT_PROVIDERS = Set(['meta','kimi','puter']). Die Filterung steht N", "pk": "SDRv4", "tc": "BUG"}, {"id": 2034, "title": "[Wave-B] debit_tokens DB-RPC ohne Negativ-Guard - negativer Betrag erhoeht Guthaben", "desc": "## Problem\ndebit_tokens (DB-RPC, SECURITY DEFINER) faengt keinen negativen p_total_cost_st ab:\n- db/001_database_initial", "pk": "SDRv4", "tc": "BUG"}, {"id": 2030, "title": "API-Route-Audit: wiederkehrende Security-Muster (Column-Leak, .or()-Injection, Rate-/Input-Limits)", "desc": "## Problem\nWiederkehrende Security-Muster, die beim API-Route-Audit (SDRv4-2012, Runde 10) projektweit auftraten und nic", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 2029, "title": "Lizenz-Dialog: Cmd+V fuegt im Inline-Key-Feld nicht ein (kein Edit-Menue)", "desc": "Im macOS-Lizenz-Aktivierungsdialog (NSAlert mit Inline-NSTextField, SPEECH-2025) fuegt Cmd+V den Key nicht ein - nur Rec", "pk": "SPEECH", "tc": "BUG"}, {"id": 2028, "title": "Tests schreiben in echte ~/.senity-speechflow/config.json (fehlende CONFIG_DIR-Isolation)", "desc": "conftest.py mockt customtkinter global als MagicMock. Tests, die einen Settings-Save-Pfad anfassen, schreiben dadurch ue", "pk": "SPEECH", "tc": "BUG"}, {"id": 2027, "title": "Opt-in-Einwilligung fuer anonyme Telemetrie + Settings-Toggle", "desc": "Speech Flow fragt beim ersten Start (Opt-in), ob anonyme Fehlerberichte/Nutzungsdaten mit Senity geteilt werden duerfen.", "pk": "SPEECH", "tc": "FEAT"}, {"id": 2026, "title": "Download-Seite fuer SpeechFlow-Verteilung (OS-Auto-Erkennung + alle Plattformen/Versionen)", "desc": "Ziel: Eine teilbare Download-Seite (auf sdr.senity.ai / SDRv4, Next.js), um SpeechFlow an Interessenten zu verteilen.\n\nA", "pk": "SPEECH", "tc": "FEAT"}, {"id": 2025, "title": "Lizenz-Aktivierung: API-Key direkt im Block-Dialog eingeben (Inline-Feld)", "desc": "Bei fehlendem api_key (reason=no_api_key) zeigte der Lizenz-Dialog bisher nur den Button \"Einstellungen oeffnen\". Wunsch", "pk": "SPEECH", "tc": "FEAT"}, {"id": 2024, "title": "Settings-Sidebar bleibt im kollabierten Zustand zu breit", "desc": "Manuel meldet: das linke Side-Menu im Settings-Fenster ist im kollabierten (gecropten) Zustand viel zu breit. Ursache: d", "pk": "SPEECH", "tc": "BUG"}, {"id": 2023, "title": "jose jwtVerify ohne algorithms-Liste akzeptiert jeden Token-Header-Algorithmus (alg-Confusion)", "desc": "## Problem\n\n`jwtVerify(token, key, options)` aus der `jose`-Library akzeptiert ohne explizite `algorithms`-Liste in den ", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 2022, "title": "console.log-Bereinigung in Chat-Komponenten (TTSChatComposer u.a.)", "desc": "## Problem (R6-M1)\n\nVerbliebene `console.log`-Debug-Ausgaben in Chat-Komponenten (u.a. components/chat/TTSChatComposer.t", "pk": "SDRv4", "tc": "CHO"}, {"id": 2021, "title": "file-extractors: Zip-Bomb-Schutz + Groessenlimits (Package @murc134/file-extractors)", "desc": "## Problem (MUSS verifiziert werden)\n\nDie File-Extractors (RAG-Upload, 10 Dateitypen, lib/file-extractors/) entpacken/pa", "pk": "SDRv4", "tc": "IMP"}, {"id": 2020, "title": "Budget-Enforcement verifizieren: ai-logger.ts loggt, blockiert aber ggf. nicht bei Ueberschreitung", "desc": "## Problem (R2-C1, MUSS verifiziert werden)\n\nReviewer vermutet, dass `ai-logger.ts` AI-Usage zwar protokolliert und Budg", "pk": "SDRv4", "tc": "IMP"}, {"id": 2019, "title": "SSRF: image-generation-tools.ts nutzt rohes fetch statt safeFetch (lib/ssrf-guard.ts)", "desc": "## Problem (R10-H1, MUSS verifiziert werden)\n\n`lib/chat/tools/image-generation-tools.ts` (oder verwandter Bildgenerierun", "pk": "SDRv4", "tc": "BUG"}, {"id": 2018, "title": "Multi-Tenant-Isolation projektweit: RLS-GUC nie gesetzt, Service-Role-Read-Bypass, Auth-Gate Default-Allow", "desc": "## Problem (aus 10-Reviewer-Runde, MUSS verifiziert werden)\n\nMehrere Reviewer fanden systemische Tenant-Isolation-Luecke", "pk": "SDRv4", "tc": "BUG"}, {"id": 2017, "title": "Review-Runde Chat-CLI + Projekt: 4 sichere Quick-Fixes (i18n, Timer-Leak, localStorage, JWT-alg-Pinning)", "desc": "## Kontext\n\nErgebnis der 10-Reviewer-Runde (Extended Review Chat-CLI, danach projektweit). Vier verifizierte, lokal sich", "pk": "SDRv4", "tc": "IMP"}, {"id": 2016, "title": "CLI-Chat: Auth-Defense-in-Depth (Session-Ownership prompt-stream-Route, cliToken verpflichtend)", "desc": "## Problem\n\nAus 2012-Review (Security): die prompt-/stream-Route fuer den CLI-Chat prueft keine Session-Ownership (IDOR-", "pk": "SDRv4", "tc": "BUG"}, {"id": 2015, "title": "CLI-Chat: token-weises Thinking-Streaming (--include-partial-messages + thinking_delta-Parser)", "desc": "## Problem\n\nAus 2012-Review: der Reasoning-/Thinking-Block wird aktuell erst als kompletter Block am Ende einer Nachrich", "pk": "SDRv4", "tc": "IMP"}, {"id": 2014, "title": "CLI-Chat: Zombie-Prozess-Kill + eventBuffers-Cap im Cancel-Pfad", "desc": "## Problem\n\nAus 2012-Review: beim Abbrechen einer CLI-Chat-Anfrage (Client schliesst SSE, AbortSignal) wird der gespawnt", "pk": "SDRv4", "tc": "BUG"}, {"id": 2013, "title": "CLI-Bridge: toten Code entfernen (cli-runner.ts streamMessage)", "desc": "## Problem\n\nIm 2012-Review als CRITICAL gelistet: `services/cli-bridge-api/src/cli-runner.ts` `streamMessage` (ca. Z.289", "pk": "SDRv4", "tc": "CHO"}, {"id": 2012, "title": "CLI-Chat: Thinking-Tokens als Reasoning-Block trennen + Extended Review", "desc": "## Auftrag\n\nExtended Review der Chat-CLI inkl. Browser-Test. Sicherstellen, dass die Claude-Code-Session ihr Reasoning v", "pk": "SDRv4", "tc": "BUG"}, {"id": 2011, "title": "Mac-Arch-Split (mac-silicon/mac-intel): SDRv4-Release-Enum muss zum Client-Token passen", "desc": "## Problem\n\nDer SpeechFlow-Auto-Updater trennt macOS-Builds seit SPEECH-1981 nach CPU-Arch: `speechflow/updater.py:115 p", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 2010, "title": "Extended Review senity-speech-flow im Kontext SDRv4-Backend (10-Runden, autonom)", "desc": "## Auftrag\n\nUser (Christoph) abwesend, autonomer Auftrag: Extended Review ueber senity-speech-flow, **im Kontext zum SDR", "pk": "SPEECH", "tc": "RESEARCH"}, {"id": 2009, "title": "Lokales Piper-TTS \"geht nicht / Cloud spricht\" - Diagnose-Checkliste (tts_backend + Modell-Install)", "desc": "## Problem\n\nUser meldet: lokales Piper-TTS greift nicht, stattdessen spricht die Senity-Cloud (Qwen3/Till). Schnell als ", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 2008, "title": "Lokales Piper-TTS griff nicht: Cloud/Till statt Piper (config tts_backend fehlte + DE-Modell nicht installiert)", "desc": "## Symptom (gemeldet vom User)\n\n\"Piper TTS lokal funktioniert nicht, es wird das online Qwen3-TTS-Modul mit der Till-Sti", "pk": "SPEECH", "tc": "BUG"}, {"id": 2007, "title": "PyInstaller + gebundletes pip: distlib-Finder fuer Frozen-Loader registrieren (Unable to locate finder)", "desc": "## Problem\n\nEin gebundletes pip (PyInstaller onedir, `--collect-all pip`), das zur Laufzeit ueber `runpy.run_module(\"pip", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 2006, "title": "Failsafe-Timeout (#1431) feuert irrefuehrend \"Server\"-Timeout im Offline-Modus", "desc": "## Problem\n\nIm Offline-Modus (lokales Whisper, `asr_backend=local`) erscheint trotzdem der Toast „Server antwortet langs", "pk": "SPEECH", "tc": "BUG"}, {"id": 2005, "title": "Offline-Runtime-Install crasht in pip._vendor.distlib (gebundletes pip, frozen Build)", "desc": "## Problem\n\nBeim Installieren der lokalen Engine-Runtime (`llama-cpp-python` fuers In-Process-LLM bzw. `faster-whisper` ", "pk": "SPEECH", "tc": "BUG"}, {"id": 2004, "title": "llama-cpp-python crasht mit 0xc000001d auf Alder-Lake — abetlen-Wheel nutzt AVX-512, das Consumer-12th-gen fehlt", "desc": "## Problem\n\nIn-Process-LLM (#1955/#1987): nach `python -m speechflow --pip-install llama-cpp-python` (Wheel vom abetlen-", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 2003, "title": "Remember-Me: @supabase/ssr Cookie-Lebensdauer ueber setAll + Steuer-Cookie", "desc": "## Problem\n\nCookie-Lebensdauer fuer ein Remember-Me-Feature laesst sich bei `@supabase/ssr` nicht direkt am Client konfi", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 2002, "title": "Lokales LLM: pip-Install scheitert dauerhaft an korruptem llama-cpp-python-Wheel im Cache (Bad CRC-32 libggml-base.0.dylib)", "desc": "v117-mac-arm64: Beim Installieren der lokalen LLM-Engine (llama-cpp-python) bricht das Entpacken mit zipfile.BadZipFile:", "pk": "SPEECH", "tc": "BUG"}, {"id": 2001, "title": "Arbor installieren + Probelauf (Lead-Scoring-PoC) gegen GPU-Backend", "desc": "## Ziel\n\nArbor (RUC-NLPIR/Arbor, PyPI `arbor-agent`) sauber installieren und einen echten Probelauf fahren, um den Forsc", "pk": "SWS", "tc": "RESEARCH"}, {"id": 2000, "title": "Supabase self-hosted: Migrationen als supabase_admin ausfuehren + REVOKE/GRANT-Pflicht (anon-Schreibfalle)", "desc": "## Problem\nNeue Tabellen via Migration in self-hosted Supabase (SDRv4) anlegen schlug fehl bzw. wurde unsicher:\n(a) Als ", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1999, "title": "Offline-KI-Stack zum Download bereitstellen (ASR/TTS/LLM gespiegelt + Typ-API + Hardware-Benchmark)", "desc": "Ziel: den kompletten Offline-KI-Stack (ASR Whisper, TTS Piper, LLM llama.cpp) zum Download anbieten, statt zur Laufzeit ", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1998, "title": "Shop M9: DSGVO Stripe (AVV abschliessen, VVT-Eintrag, Klaerungsbedarf.md) - BLOCKER vor Live", "desc": "## Ziel\nStripe ist US-Konzern (EU-Entity Irland). Vor Go-Live rechtlich absichern.\n\n## Scope\n- AVV/DPA mit Stripe abschl", "pk": "SDRv4", "tc": "CHO"}, {"id": 1997, "title": "Shop M8: Fraud-Schutz + B2C-Recht (Stripe Radar, Token-Freischaltung nach Zahlung, Widerruf)", "desc": "## Ziel\nOffener B2C-Self-Service + Prepaid-Token = Betrugsziel (Card-Fraud -> Token -> Verbrauch -> Chargeback). Absiche", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1996, "title": "Shop M7: Abo-Verwaltung via Stripe Customer Portal (Kuendigung, Zahlungsmittel, Rechnungen)", "desc": "## Ziel\nSelf-Service-Verwaltung laufender Abos ohne Eigenbau-UI.\n\n## Scope\n- Stripe Customer Portal Session erzeugen + e", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1995, "title": "Shop M6: Webhook-Provisioning (Lizenz signieren + Token gutschreiben, idempotent)", "desc": "## Ziel\nStripe-Webhook setzt Kaeufe in Entitlements um. Herzstueck der Integration.\n\n## Scope\n- POST /api/shop/stripe/we", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1994, "title": "Shop M5: Checkout-UI (Plan-Auswahl, Token-Pakete, Stripe Checkout Session)", "desc": "## Ziel\nKauf-Frontend: Abo-Plaene (McDonald's-Menue-Prinzip, #279) + Token-Pakete waehlen, Stripe Checkout Session start", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1993, "title": "Shop M4: Stripe-Integration Setup (Billing, Tax, Invoicing, Customer, Webhook-Secret)", "desc": "## Ziel\nStripe-Account und SDK-Anbindung. Stripe ist Source of Truth fuer Zahlung/Abo/Rechnung, Senity fuer Entitlements", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1992, "title": "Shop M3: Oeffentliche Self-Service-Registrierung (B2B+B2C, Mail-Verifikation)", "desc": "## Ziel\nOeffentlicher Signup-Flow auf der neuen Senity-Webseite: jeder kann sich registrieren und wird app_user mit Pers", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1991, "title": "Shop M2: Admin-UI Produktverwaltung (Produkte anlegen, eindeutige ID, license_type koppeln)", "desc": "## Ziel\nAdmin kann im SDR Produkte CRUD-en. Jedes Produkt bekommt eine eindeutige ID (product.id) + sku. Pro Produkt wer", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1990, "title": "Shop M1: Produkt-Datenmodell (product, product_price, product<->license_type, Token-Pakete)", "desc": "## Ziel\nNeues Datenmodell fuer verkaeufliche Produkte, sauber an das bestehende license_type / token-System angedockt.\n\n", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1989, "title": "Senity Shop: Self-Service Lizenz- und Token-Verkauf (Stripe + Eigenbau-Checkout)", "desc": "Epic fuer den oeffentlichen Senity-Shop. Kunden registrieren sich selbst (B2B+B2C) und kaufen Lizenzen (Senity Code/Work", "pk": "SDRv4", "tc": "EPIC"}, {"id": 1988, "title": "macOS Auto-Install: .app-Bundle-Swap (Pendant zum Windows-EXE-Swap, #1956)", "desc": "apply_update war Windows-only (return False auf mac/linux). macOS-Auto-Install implementiert: _apply_update_macos entpac", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1987, "title": "Lokale LLM-Engine + Modell installieren und für Kunden über Senity/Gitea verteilen", "desc": "## Ausgangslage / Symptom\n\nIm Settings-Dialog (Tab Textverarbeitung, Offline-Pfad) zeigt der Engine-Picker **\"(keine Eng", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1986, "title": "Boot-Chime (senity.wav) schweigt in jedem gebauten Build (Default False + Seeding migriert Key nicht)", "desc": "## Problem\n\nIm gebauten Windows-Build (v84) spielt beim Start kein Boot-Chime (`senity.wav`) mehr. Symptom vom Owner gem", "pk": "SPEECH", "tc": "BUG"}, {"id": 1985, "title": "Codex-Projektsetup aus Claude-Regeln ableiten", "desc": "Codex soll zusätzlich zu Claude repo-lokal eingerichtet werden. Grundlage sind die globale Claude-Konfiguration, alle CL", "pk": "SPEECH", "tc": "IMP"}, {"id": 1984, "title": "Paralleler CLI-Review: --full-auto deprecated + jede Task-Output einzeln pruefen", "desc": "## Problem\n\nBeim parallelen Adversarial-Review des Skills `arbor-delegator` (Plan docs/plans/2026-06-15-arbor-delegator-", "pk": "SWS", "tc": "KNOWLEDGE"}, {"id": 1983, "title": "macOS: App haengt (Beachball) nach Lizenz-Dialog -> Einstellungen oeffnen (Tray-Hauptprozess endet nicht sauber)", "desc": "User-Report (v111): Beim Start ohne api_key erscheint der Lizenz-/Aktivierungsdialog (NSAlert, SPEECH-1974). Klick auf \"", "pk": "SPEECH", "tc": "BUG"}, {"id": 1982, "title": "Windows-Release-Matrix prüfen (x64 / ARM64 / Min-OS), Universal-Frage klären", "desc": "## Kontext\n\nFolgeticket aus #1956 (Auto-Update). Analog zur Mac-Arch-Frage (#Mac-Split) muss geklärt werden, welche Wind", "pk": "SPEECH", "tc": "RESEARCH"}, {"id": 1981, "title": "Mac-Release nach Architektur splitten (Apple Silicon arm64 + Intel x86_64)", "desc": "## Kontext\n\nFolgeticket aus #1956 (Auto-Update). Der Mac-Build ist heute single-arch (kein `--target-arch` in `build.sh`", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1980, "title": "[FEAT] Workspace-API-Key-UI in envsys (erzeugen/auflisten/widerrufen)", "desc": "Workstream aus Epic #1971 (\"API-Key-Auth fuer Workspaces\"). Ziel: in der envsys-UI (SDRv4 apps/envsys-ui) einen API-Key ", "pk": "env-system", "tc": "FEAT"}, {"id": 1979, "title": "Gitea Attachment-Limit + nginx client_max_body_size anheben (git.senity.ai)", "desc": "Release-Attachments scheitern an zwei Limits in Reihe:\n1. Gitea [attachment] MAX_SIZE nicht gesetzt -> Default 4 MiB.\n2.", "pk": "INFRA", "tc": "CHO"}, {"id": 1978, "title": "Commit-System-Trailer + System-Registry pro User (systeme.md)", "desc": "## Kontext\nDas Team arbeitet auf heterogener Hardware (Christoph: Windows + macOS; Timo, Marco: je eigene Systeme). Dami", "pk": "SPEECH", "tc": "CHO"}, {"id": 1977, "title": "Login: Checkbox \"Logindaten speichern\" (Remember-Me)", "desc": "## Idee (von Christoph)\n\nAuf der Login-Seite eine Checkbox \"Logindaten speichern\" ergaenzen.\n\n## Entscheidung (2026-06-1", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1976, "title": "Test: aktuelle main im lokalen Mini-SDR mergen und Voice-Changer + Nav-Icons prüfen (#1959, #1975)", "desc": "## Ziel\n\nTimo testet die frisch auf `dev` gepushten SDR-Fixes in seinem lokalen Workspace, indem er den Mini-SDR startet", "pk": "SWS", "tc": "CHO"}, {"id": 1974, "title": "macOS Defense-in-Depth: Lizenz-Block-Dialog via NSAlert statt in-Prozess tk.Tk() (SPEECH-1972 Follow-up)", "desc": "Empfehlung aus den Fix-Reviews zu SPEECH-1972 (Gemini + Codex). show_block_dialog() baut aktuell ein in-Prozess tk.Tk();", "pk": "SPEECH", "tc": "IMP"}, {"id": 1973, "title": "macOS: overlay/picker Tk-Fallback kann nach plain NSApplication crashen (gleiche Crashklasse wie SPEECH-1972)", "desc": "Folge-Finding aus dem Fix-Review zu SPEECH-1972 (Codex). overlay_macos.py und picker_macos.py fallen bei einem Fehler im", "pk": "SPEECH", "tc": "BUG"}, {"id": 1972, "title": "macOS-Startcrash bei Empfaengern: -[NSApplication macOSVersion] unrecognized selector (Lizenz-Block-Dialog)", "desc": "Jeder Empfaenger ohne eigenen api_key in der config crasht beim Start mit EXC_CRASH (SIGABRT), Reason -[NSApplication ma", "pk": "SPEECH", "tc": "BUG"}, {"id": 1971, "title": "[Epic] env-system zum zentralen Secret-Tresor ausbauen (ersetzt 1Password)", "desc": "## Ausgangslage (Voice 2185, 2026-06-16)\n\nChris hat im sdr-mini bereits ein envsys-UI gebaut (Variables, Projects, Sourc", "pk": "env-system", "tc": "EPIC"}, {"id": 1970, "title": "Code-Signing + Notarisierung: Mac Gatekeeper / Windows SmartScreen Flagging beseitigen", "desc": "## Problem\n\nDie ausgelieferten Builds werden auf beiden Plattformen als \"potenziell gefaehrlich\" geflagt:\n\n- **macOS (Ga", "pk": "SPEECH", "tc": "RESEARCH"}, {"id": 1968, "title": "Voice-Tester-Onboarding: 18 MSH/Raumfabrik-Kontakte + Rolle + Speech-Flow-Lizenz auf Test & Live", "desc": "## Aufgabe\n\nAus `~/Downloads/MSH_Raumfabrik_Kontakte_angereichert.xlsx` (18 Kontakte) je einen User auf **sdr-test.senit", "pk": "SDRv4", "tc": "CHO"}, {"id": 1967, "title": "History-Fenster crasht beim Oeffnen - kein Log/Crash-Report (Diagnose-Logging)", "desc": "## Symptom\n\nUser-Report (2026-06-16, v105 Mac): Beim Oeffnen der History stuerzt das Programm ab. Im app.log steht KEIN ", "pk": "SPEECH", "tc": "BUG"}, {"id": 1965, "title": "Voice-Keys (SEEDVC/Q3TTS/Q3ASR) in lokales .env-Setup-Skript bündeln, damit sie bei .env-Resets nicht verloren gehen", "desc": "## Problem\n\n`SEEDVC_API_KEY` (und potenziell weitere Voice-Keys) gehen in der lokalen, gitignored `.env.local` nach Rese", "pk": "SDRv4", "tc": "CHO"}, {"id": 1963, "title": "Overlay verschwindet bei mehreren/ueberlappenden Aufnahmen in Folge", "desc": "## Problem\n\nMacht der User mehrere Aufnahmen schnell hintereinander (besonders wenn sie sich zeitlich ueberlappen), wird", "pk": "SPEECH", "tc": "BUG"}, {"id": 1962, "title": "Abgebrochener Whisper-Download wird als vollstaendig erkannt -> ctranslate2 'Unable to open file model.bin'", "desc": "## Problem\n\nLokale Transkription scheitert mit Fehler-Toast 'Transkription fehlgeschlagen - Unable to open file model.bi", "pk": "SPEECH", "tc": "BUG"}, {"id": 1961, "title": "Settings: Speichern soll Dialog offen lassen, Schliessen separat", "desc": "## Wunsch (User Christoph)\n\nDer globale Speichern-Button im Einstellungen-Dialog soll die Einstellungen NUR uebernehmen ", "pk": "SPEECH", "tc": "IMP"}, {"id": 1960, "title": "Controlled-&lt;select&gt; Null-State + Slider-Legenden-Skalen-Täuschung (React/Tailwind)", "desc": "## Problem\n\nZwei wiederkehrende Frontend-Defekte, beide aus SDRv4-1959 (Voice Changer).\n\n**1. Controlled-`<select>` Null", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1958, "title": "Token-Markup in Lizenz (Speech Flow): Bedeutung und Wirkung in der Abrechnung", "desc": "## Frage\n\nWas bedeutet der \"token markup\" in der Lizenz von Speech Flow?\n\n## Befund (Code-Recherche)\n\n`license.token_mar", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 1957, "title": "win-key-hook-Thread crasht im Frozen-Build (ctypes WinFunctionType)", "desc": "## Problem\n\nIm Windows-Frozen-Build (PyInstaller, verifiziert in v80) stirbt der `win-key-hook`-Thread sofort beim Start", "pk": "SPEECH", "tc": "BUG"}, {"id": 1956, "title": "Auto-Update V2: Download + Installation (Windows zuerst, Helper-Swap, Gitea, Ed25519-signiert)", "desc": "## Ziel\n\nEchtes Auto-Update mit Herunterladen UND Installieren, aufbauend auf der Hinweis-only-Stufe #1563 (done). User-", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1955, "title": "Offline-LLM im ausgelieferten Build nutzbar: LLM-Modell-Builds in der UI auswaehlen + herunterladen", "desc": "## Kontext\nNach dem v79-Build (Piper-TTS waehlbar) meldet der User: Offline-Modus weiterhin nicht moeglich, weil kein lo", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1954, "title": "CLI Chat local workspace: Thinking-Token-Anzeige verifizieren", "desc": "## Ziel\n\nIm CLI Chat (local workspace, runner='local') verifizieren, dass die Claude-Code-Ausgabe korrekt in den Chat-St", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 1953, "title": "sts-api: toter HMAC-verifyTokenHash-Pfad neben SHA-256-Lookup + falsch beschriftetes Secret-File", "desc": "## Kontext\n\nAufgefallen bei der Verifikation der Ticketing-MCP-Anbindung im Projekt senity-speech-flow (SPEECH). Der Tok", "pk": "STS", "tc": "CHO"}, {"id": 1952, "title": "Dedupe: dreifach duplizierte hashToken vereinheitlichen, totes HMAC-Modul (token-crypto) als deprecated markieren", "desc": "## Befund (Diagnose 2026-06-15)\n\nAuth-Token-Hashing ist im laufenden sts-api an DREI Stellen identisch dupliziert (jewei", "pk": "STS", "tc": "CHO"}, {"id": 1951, "title": "BUG: Radialer Picker schaltet Modus unzuverlaessig um + Kontext (Screenshot/Auswahl/Clipboard) wird nie erfasst", "desc": "## Symptom (User, 2026-06-15, gegen v77 / main nach #1923-Merge)\n\nZwei zusammenhaengende Defekte im gemergten Stand von ", "pk": "SPEECH", "tc": "BUG"}, {"id": 1950, "title": "Vorlesen-Modus: markierten Text per Hotkey (ctrl+shift) per TTS vorlesen (macOS zuerst)", "desc": "## Anforderung (User, 2026-06-15)\n\nSpeechFlow soll markierten Text vorlesen koennen. Der User moechte das als eigenen Vo", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1949, "title": "Hotkey reagiert nach Standby/Resume nicht mehr (kein Listener-Watchdog)", "desc": "## Problem\n\nGemeldet von **Marco** (auf v50, aber strukturell versionsunabhaengig): Wenn der Rechner eine Zeit lang unge", "pk": "SPEECH", "tc": "BUG"}, {"id": 1948, "title": "Spike: Lokales TTS Piper vs Kokoro (Performance + Qualitaet)", "desc": "## Ziel\nPraktischer Vergleich zweier kommerziell-freundlicher lokaler TTS-Engines fuer mehrsprachige Sprachausgabe (Ziel", "pk": "SPEECH", "tc": "RESEARCH"}, {"id": 1946, "title": "Aufnahme bricht bei gehaltenen Tasten ab (Hotkey-Release-Gate-Asymmetrie)", "desc": "## Symptom\n\nUser-Report: Beim Diktieren bricht die Aufnahme immer wieder ab, obwohl der Hotkey durchgehend gehalten wird", "pk": "SPEECH", "tc": "BUG"}, {"id": 1945, "title": "NotebookLM-Wissen in die Mini-SDR-Doku-Webseite anbinden (Wissensdatenbank im Frontend)", "desc": "## Ziel\n\n> Vorbedingung: **TMO-003** (NotebookLM lernen + Notebook mit Senity-Wissen) und **TMO-001** (Doku-Seite im Min", "pk": "SWS", "tc": "FEAT"}, {"id": 1944, "title": "Tutorial: Senity Code, die hauseigene Entwicklungsumgebung", "desc": "## Was ist das System?\n\nSenity Code (`D:/Devel/NodeJS/SDRv5/senity-code`) ist das hauseigene Code-/Tooling-Repo, das **C", "pk": "SWS", "tc": "FEAT"}, {"id": 1943, "title": "Tutorial: Senity Speechflow, der Voice-Microservice", "desc": "## Was ist das System?\n\nSenity Speechflow ist der Microservice rund um Sprache: **Text-zu-Sprache (TTS)**, **Spracherken", "pk": "SWS", "tc": "FEAT"}, {"id": 1942, "title": "Tutorial: SDRv4 / Communication Hub, unser Hauptprodukt", "desc": "## Was ist das System?\n\nSDRv4 (der Communication Hub) ist das **Hauptprodukt** von Senity: die App fuer Inbound- und Out", "pk": "SWS", "tc": "FEAT"}, {"id": 1941, "title": "Tutorial: Der Senity Workspace, dein taegliches Cockpit", "desc": "## Was ist das System?\n\nDer Senity Workspace ist dieses Repo (`senity-workspace`): das KI-Cockpit der Mitarbeitenden. Es", "pk": "SWS", "tc": "FEAT"}, {"id": 1940, "title": "Tutorial: Claude Code von Null verstehen (das Werkzeug fuer alles)", "desc": "## Was ist das System?\n\nClaude Code ist das Programm, mit dem Timo kuenftig arbeitet. Man tippt in normaler Sprache, was", "pk": "SWS", "tc": "FEAT"}, {"id": 1939, "title": "Tutorial-Wiki fuer Timo: Bedienungsanleitung fuer Claude Code, SDRv4, Senity Workspace, Senity Code und Senity Speechflow", "desc": "## Vision\n\nTimo bekommt eine komplette, kinderleichte Bedienungsanleitung fuer unsere wichtigsten Systeme. Das Ziel ist ", "pk": "SWS", "tc": "EPIC"}, {"id": 1938, "title": "NotebookLM lernen und kostenlos an die Konsole anbinden (NotebookLM-Doku)", "desc": "## Ziel\n\nTimo lernt **NotebookLM** (Google) kennen und bindet es **kostenlos** an seine Claude-Code-Konsole an, um damit", "pk": "SWS", "tc": "FEAT"}, {"id": 1937, "title": "Diktat-Insert: immer ein abschliessendes Leerzeichen anhaengen", "desc": "## Anforderung\nDer per Diktat eingefuegte Text klebt aktuell direkt am bereits vorhandenen Text bzw. am naechsten Diktat", "pk": "SPEECH", "tc": "IMP"}, {"id": 1936, "title": "dots.tts (rednote-hilab) als lokale TTS: Modell-Fakten & System-Requirements", "desc": "## Erkenntnis\n\ndots.tts (rednote-hilab, Apache-2.0) als Kandidat fuer lokale TTS evaluiert. Modell-Fakten + System-Requi", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 1935, "title": "Lokale TTS via dots.tts (rednote-hilab) evaluieren (Sidecar-Spike)", "desc": "## Frage\n\nMacht es Sinn, dots.tts (rednote-hilab, https://github.com/rednote-hilab/dots.tts) als lokale TTS-Engine einzu", "pk": "SPEECH", "tc": "RESEARCH"}, {"id": 1934, "title": "browser-use CLI auf Windows: UTF-8-Env + Supabase-Cookie-Import als Auth-Bypass fuer lokale Layout-Tests", "desc": "## Problem\n\nLokaler Layout-Test einer geschuetzten Route (z.B. Boards-Overlay) mit dem browser-use CLI-Skill schlaegt au", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1933, "title": "CLI Chat: Terminal-Ausgabe der Claude-Code-Instanz als Thinking-/Console-Sprechblase (senity/Qwen-Pfad)", "desc": "## Problem\n\nIm CLI Chat (AI Workspace / Local Workspace) wurde auf dem senity/Qwen-Pfad (\"Msh/qwen3.6@coder-agent\") nur ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1932, "title": "System einrichten, Git lernen und Anbindung pruefen (Setup vor der Doku-Arbeit)", "desc": "## Ziel\n\n**Allererster Schritt fuer Timo, bevor TMO-001 und TMO-002 starten.** Timo hat noch keine Erfahrung mit Claude ", "pk": "SWS", "tc": "CHO"}, {"id": 1931, "title": "SDR Seite-fuer-Seite mit Timo testen (angeleitetes CRUD-Onboarding)", "desc": "## Ziel\n\nFolge-Ticket zu **TMO-001** (Doku-Seite + Claude-Code-Onboarding). Nachdem Timo die Systeme verstanden und die ", "pk": "SWS", "tc": "IMP"}, {"id": 1930, "title": "Doku-Seite im Mini-SDR aufbauen + Claude-Code-Onboarding (Extended Brainstorming mit Profiler)", "desc": "## Ziel\n\n> Vorbedingung: **TMO-000** (System-Setup, Git-Grundlagen) muss zuerst erledigt sein.\n\nTimo baut sich im Mini-S", "pk": "SWS", "tc": "FEAT"}, {"id": 1928, "title": "theme-preview.html zeigt nicht alle Container-Farben (21 geerbte base-dark Tokens fehlen)", "desc": "## Problem\n\n`theme-preview.html` (Senity Theme Designer) zeigt nur die 49 Tokens, die `senity-theme.json` aktiv uebersch", "pk": "CLI", "tc": "BUG"}, {"id": 1927, "title": "Offline-Schalter waehlt nicht installierte lokale Engine statt laufendem Ollama", "desc": "## Problem\n\nBeim Umschalten auf den Offline-Modus meldet die App \"keine lokale Engine installiert / Mini-Projekt nach mo", "pk": "SPEECH", "tc": "BUG"}, {"id": 1926, "title": "Voice-Changer 500 \"Ein unerwarteter Fehler\" = maskierter HTTP 401 von Seed-VC (fehlender SEEDVC_API_KEY)", "desc": "## Problem\n\n/de/voice/clone im Voice-Changer-Modus (\"Stimme umwandeln\") schlug mit der generischen Meldung \"Ein unerwart", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1925, "title": "CLI-Chat: Thinking-Block leer im Bridge-Proxy-Pfad (reasoning-Feld fehlte im SSE-Frame)", "desc": "## Problem\n\nIm CLI-Workspace-Chat wird der Thinking-/Reasoning-Trace nicht als kollabierbarer Thinking-Block angezeigt, ", "pk": "SDRv4", "tc": "BUG"}, {"id": 1923, "title": "Modi-Tab: symmetrische Default-Modi (Text + Voice) und Per-Modus-Kontext statt Output-Override", "desc": "## Anforderung (User-Feedback 2026-06-14, zwei Screenshots)\n\nZwei zusammenhaengende UX-Korrekturen am Modi-Tab und am Mo", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1922, "title": "CLI-Workspaces: HTTP 502 nach Rebuild, cli-ws-Container und cli-data-Volumes entfernt, kein Recreate-Pfad", "desc": "## Symptom\n\nBeim Wechsel zwischen CLI-Workspaces sind nur noch 2 Workspaces erreichbar. Die Auswahl der uebrigen (z.B. \"", "pk": "SDRv4", "tc": "BUG"}, {"id": 1921, "title": "Boards-Ticketing-Microservice: limit max 500 (limit>500 -> HTTP 400 -> leere Boards), Offset-Loop noetig", "desc": "## Problem\n\nBoards-Uebersicht (/de/boards) kam leer zurueck, sobald viele Tickets geladen werden sollten. Ursache: der z", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1920, "title": "Seed-VC Real-time-Streaming-Endpoint (timbre-treuer Live-Voice-Changer)", "desc": "## Ziel\n\nEchter Live-Voice-Changer mit erhaltener Prosodie/Timbre-Übertragung (Seed-VC), nicht der ASR -> Text -> TTS-Um", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1919, "title": "Settings-Dialog: Offline-Schalter nach oben, Modell-Details direkt darunter", "desc": "## Anforderung\n\nIm Allgemein-Tab des Settings-Dialogs soll der Online/Offline-Master-Schalter an den Anfang des Tabs wan", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1918, "title": "Lokale ASR/LLM-Modelle verschwinden bei jedem neuen Windows-Build-Slot (portabler data/-Ordner #1615)", "desc": "## Problem\n\nNach einem neuen Windows-Build (hier v71) meldet die App alle lokalen Engines als nicht verfuegbar:\n- LLM-Dr", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 1916, "title": "Zentraler CLI-Orchestrator (Port 3200) als Multi-System-Dienst", "desc": "## Ziel\nEin zentraler, von allen Systemen (mini-sdr-Workspace, SDRv4, kuenftig senity-speech-flow) ansprechbarer CLI-Die", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1915, "title": "Senity-Code Ebene-2-Theming: natives Custom-Theme statt Bundle-Patch (Binary-Reality)", "desc": "## Problem\n\nDie CLI-Farb-Token (Ebene 2) wurden ursprünglich per `patch-claude-header.js` ins `cli.js`-Bundle gepatcht (", "pk": "CLI", "tc": "KNOWLEDGE"}, {"id": 1914, "title": "Thread-Sicherheit & Robustheit: Hotkey-Gate-Selbstheilung, set_combo-Cleanup, Paste-Seq-Lock, Job-Queue _busy", "desc": "Aus dem 4-Reviewer-Durchlauf nach den v67-Bugfixes (#1908/#1909) gesammeltes Robustheits-Paket (Paket C der konsolidiert", "pk": "SPEECH", "tc": "IMP"}, {"id": 1913, "title": "claude-code-singleton (Bridge-API) lokal als Docker-Singleton starten", "desc": "## Problem\nDie CLI-Bridge (services/cli-bridge-api, Port 3100) startet lokal nicht ohne Vorarbeit. Sie ist als Docker-Si", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1912, "title": "Theme-Designer unvollständig: fehlende CLI-Token (link) + tote Preview-Token", "desc": "## Problem\n\nIm Browser-Designer `theme-preview.html` tauchen viele CLI-Farb-Token nicht auf (User-Beobachtung: u.a. die ", "pk": "CLI", "tc": "BUG"}, {"id": 1911, "title": "i18n: is_offered vs has_catalog - angebotene Sprache kann katalog-los sein (stiller Deutsch-Fallback)", "desc": "## Problem\nEine UI-Sprache kann *angeboten* sein, ohne einen Uebersetzungs-Katalog zu haben. Das fuehrt zu einem stillen", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 1910, "title": "i18n: angebotene UI-Sprache ohne Katalog (z.B. Spanisch) zeigt still Deutsch", "desc": "## Symptom\nDie Oberflaeche ist in den Einstellungen auf Spanisch gestellt, wird aber auf Deutsch angezeigt. Der User bek", "pk": "SPEECH", "tc": "BUG"}, {"id": 1909, "title": "Radial-Menue: persistierten Default-Modus visuell vom temporaer gewaehlten unterscheiden", "desc": "Beobachtet in v66 (Windows).\n\n## Anforderung\nDer aktuell persistierte Default-Modus muss im Radial-Faecher visuell hervo", "pk": "SPEECH", "tc": "IMP"}, {"id": 1908, "title": "Radial-Menue: erste Linksklick-Auswahl wird nicht angenommen (Fokus-Regression)", "desc": "Beobachtet in v66 (Windows).\n\n## Symptom\nBeim Oeffnen des Radial-Faechers (Logo-Klick im IDLE-Zustand) wird das ERSTE Au", "pk": "SPEECH", "tc": "BUG"}, {"id": 1907, "title": "dev-Build-Wiederherstellung: CLI Runner-Override Hook + Queue-Composer-Props", "desc": "## Problem\n\nDer Branch `dev` war nicht baubar (`next.config.ts` hat `typescript.ignoreBuildErrors: false`). Ursache: ein", "pk": "SDRv4", "tc": "BUG"}, {"id": 1906, "title": "Committeter Merge-Konflikt in package-lock.json -> JSON.parse SyntaxError beim Start (Diagnose + Fix)", "desc": "## Problem\nEin Git-Merge-Konflikt in `package-lock.json` (oder jeder anderen getrackten JSON)\nkann unbemerkt committet w", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1904, "title": "GET /api/tickets: DataTable-Sort-Contract (sort/dir) zusaetzlich zu sort_by unterstuetzen", "desc": "## Problem\n\n`@murc134/datatable` (`BaseDataTable`) fetcht serverseitig gegen `GET /api/${slug}` und sendet Sortierung al", "pk": "STS", "tc": "IMP"}, {"id": 1903, "title": "Git loose-ref Korruption (badRefContent) reparieren ohne Datenverlust", "desc": "## Problem\n\n`git status` meldet `No commits yet`, `git log`/`git rev-parse HEAD` scheitern mit `fatal: failed to resolve", "pk": "SWS", "tc": "KNOWLEDGE"}, {"id": 1902, "title": "Boards-Listenansicht (DataTable) mit Kanban/Liste-Toggle", "desc": "## Ziel\n\nNeben dem bestehenden Kanban bekommt das Boards-Feature eine Listenansicht auf Basis von `@murc134/datatable`. ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1901, "title": "Marker-basierte Inhalts-Extraktion muss zeilenverankert sein, nicht str.find", "desc": "## Problem\n\nWenn man Inhalt zwischen Text-Markern (z.B. `<!-- BEGIN-PROMPT -->` / `<!-- END-PROMPT -->`) aus einer Datei", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 1900, "title": "senity-mcps als Submodule in Workspace einbinden + .mcp.json-Wiring", "desc": "## Kontext\n\n`senity-mcps` (Sammelrepo: `ticketing-mcp`, `mail-mcp`, `google-workspace`) war **nicht** an den Workspace a", "pk": "SWS", "tc": "RESEARCH"}, {"id": 1898, "title": "bg-cbr-bg unsafe fuer Overlays im workspace-theme, bg-cbr-bg-surface nutzen", "desc": "## Problem\nIm Workspace-Theme (dunkler Hintergrund, [data-workspace-theme]-Scope) waren Dropdown- und Overlay-Labels uns", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1897, "title": "Verbessern-Button: LLM liefert Kommentar, Code-Fences und Umbau statt nur den verbesserten Prompt", "desc": "## Problem\n\nDer \"Verbessern\"-Button im Mode-Editor (Settings -> Modi) soll den eingegebenen Mode-Prompt nur sprachlich s", "pk": "SPEECH", "tc": "BUG"}, {"id": 1895, "title": "CLI-Chat: interaktive Shell/Terminal im Chat-Fenster starten (RCE-gated)", "desc": "## Anforderung (User, verbatim)\n\"ich muss dort auch so wie du hier eine shell starten koennen\"\n\n## Interpretation\nIm CLI", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1894, "title": "CLI-Chat: Play-Button zum direkten Ausfuehren von Konsolen-Befehlen (RCE-gated)", "desc": "## Anforderung (User, verbatim)\n\"kannst du das ausserdem so machen, dass wenn claude consolenbefehle schreibt, dass ich ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1893, "title": "CLI-Chat: Agent-Antworten als einzelne Sprechblasen, Denken als Thinking-Block", "desc": "## Anforderung (User, verbatim)\n\"Cooler waere wenn die Nachrichten als einzelne chat sprechblasen kommen wuerden nicht a", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1891, "title": "i18n: Voice-Komponenten-Strings (AsrLiveMicButton aria-Labels + Consent-Text) migrieren/entscheiden", "desc": "## Kontext\n\nBeim Gruenmachen der dev-Test-Suite (SDRv4-1880) hat der i18n-Coverage-Test (#898,\ntests/lib/voice/i18n-cove", "pk": "SDRv4", "tc": "IMP"}, {"id": 1890, "title": "Singleton greift nicht versionsuebergreifend: mehrere Build-Versionen (v62/v65/v66) laufen parallel", "desc": "## Symptom\n\nUser-Report (2026-06-14, v66 Windows): Das Radial-Overlay flackert (geht staendig an und aus), ist gelb, das", "pk": "SPEECH", "tc": "BUG"}, {"id": 1887, "title": "Dev-Server crasht auf Apple Silicon unter x86-node (Rosetta): Turbopack qfilter bmi2-Panic -> Loesung: next dev --webpack", "desc": "## Problem / Symptom\n\n`npm run dev` (Next.js 16.2, Turbopack) startet, wird \"Ready\", crasht aber wiederholt kurz danach.", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1886, "title": "SpeechFlow: get_logger() ist parameterlos (kein __name__-Argument)", "desc": "**Problem:** `from speechflow.log import get_logger` + `get_logger(__name__)` wirft `TypeError: get_logger() takes 0 pos", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1884, "title": "Ticket-Status-Review: Stale In-Progress und Review-Tickets klaeren (Mac-Session)", "desc": "## Hintergrund\n\nAutomatischer Ticket-Audit (2026-06-14) hat folgende Gruppen als klaerungsbeduerftig markiert. Diese Tic", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 1882, "title": "Polish-Prompt gegen ASR/LLM-Fehler härten (Frage-beantworten, Eigennamen, Anrede)", "desc": "## Befund (aus History-Analyse)\n\nAnalyse der lokalen Polish-History (transcript vs. final_text) zeigt drei wiederkehrend", "pk": "SPEECH", "tc": "IMP"}, {"id": 1881, "title": "SpeechFlow: Stream Replacements greifen nicht (TTS läuft über /api/tts/stream ohne Replacement-Layer)", "desc": "**Befund (Diagnose 2026-06-14)**\n\nFrage: Greifen die Stream Replacements (Aussprachekorrektur, FEAT-046 / SDRv4-991) auc", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1879, "title": "Q3ASR-Bridge crasht beim Autostart: leerer LOG_LEVEL aus .env.local wird an Python-Spawn vererbt", "desc": "## Problem\n\nDie Q3ASR-Stream-Bridge crasht beim Autostart (`Q3ASR_BRIDGE_AUTOSTART=true`) sofort beim Import:\n\n```\nFile ", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1877, "title": "API: User-Default-Persönlichkeit in /api/chat/personalities ausweisen (für SpeechFlow-Mode-Picker)", "desc": "## Kontext\n\nSpeechFlow (SPEECH-1866) lässt den User pro Mode eine SDR-Chatpersönlichkeit auswählen. Die Liste kommt aus ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1876, "title": "Prompt-ID-Tracking in der lokalen History", "desc": "## Anforderung\n\nJeder History-Eintrag soll lokal nachvollziehbar machen, mit welchem Prompt-Stand der LLM-Final-Text erz", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1875, "title": "Turbopack cached 'Module not found' weiter aus, bis .next geloescht wird", "desc": "## Problem\n\nEine fehlende Modul-Datei (`@/lib/...`) wurde wiederhergestellt (physisch ins Dateisystem zurueckgelegt), ab", "pk": "SWS", "tc": "KNOWLEDGE"}, {"id": 1874, "title": "Module not found '@/lib/api-handler' + '@/lib/supabase/server' nach Auslagern in backup/", "desc": "## Problem\n\nDev-Server (Next.js 16.2.7, Turbopack, Port 4000) brach mit Build Error ab:\n\n```\nModule not found: Can't res", "pk": "SWS", "tc": "BUG"}, {"id": 1873, "title": "Radial-Overlay: Zeit UND Senity-Logo gleichzeitig im Medaillon (Logo nie ueberdeckt)", "desc": "## Anforderung (User, 2026-06-13)\n\nIm kleinen Radial-Overlay sollen waehrend der Aufnahme SOWOHL die verstrichene Zeit A", "pk": "SPEECH", "tc": "IMP"}, {"id": 1872, "title": "Mehrsprachige UI (i18n) Deutsch+Englisch, erweiterbar aus JSON-Katalog + lokalisierte Exception-Strings", "desc": "## Anforderung (User-Wunsch aus SPEECH-1866-Session)\n\nDie UI-Sprache der App soll umstellbar sein, Start mit Deutsch + E", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1871, "title": "[SPEECH-1866 Review] ComboBox-Suchfilter nach Auswahl + play_offline-Kommentar (P2/P3)", "desc": "Folge aus dem Codex+Gemini-Review von SPEECH-1866 (siehe #1866 Kommentar vom 2026-06-13).\n\n## Problem\n\n**[P2] _on_search", "pk": "SPEECH", "tc": "IMP"}, {"id": 1870, "title": "[SPEECH-1866 Review] personalities_local.py: Path-Traversal + YAML-Injection", "desc": "Folge aus dem Codex+Gemini-Review von SPEECH-1866 (siehe #1866 Kommentar vom 2026-06-13).\n\n## Problem\n\n**[P0] Path-Trave", "pk": "SPEECH", "tc": "BUG"}, {"id": 1869, "title": "[SPEECH-1866 Review] Offline-Erkennung haerten: _is_reachable-Block, 4xx-False-Positive, leere History", "desc": "Folge aus dem Codex+Gemini-Review von SPEECH-1866 (siehe #1866 Kommentar vom 2026-06-13).\n\n## Problem (gebÃ¼ndelt, alles", "pk": "SPEECH", "tc": "BUG"}, {"id": 1868, "title": "CI: GitHub Actions von Node 20 auf Node 24 (v6) anheben", "desc": "## Hintergrund\n\nDer Publish-Lauf v0.21.16 (run 27474525350) warnte: actions/checkout@v4, actions/setup-node@v4 und pnpm/", "pk": "FLEX", "tc": "CHO"}, {"id": 1867, "title": "Fn-Taste laesst sich nicht als Hotkey belegen", "desc": "## Symptom\nUser meldet: die Fn-Taste laesst sich im Settings-Hotkey-Capture nicht (mehr) belegen. Beim Druecken der Fn-T", "pk": "SPEECH", "tc": "BUG"}, {"id": 1866, "title": "[Brainstorming] Voice-Modus / Text-Modus Trennung + Such-Dropdown fuer SDRv4-Persoenlichkeiten", "desc": "Brainstorming-Session 2026-06-13.\n\nIdee: Modi-Tab aufteilen in zwei strikt getrennte Bereiche:\n- Text-Modus: klassische ", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1865, "title": "Selbst-Auslösungs-Kaskade bei Mehrfach-Diktat (macOS): App triggert sich über simulierte Tastatur selbst", "desc": "Beim Mehrfach-Diktat-Test (#1864) triggerte sich die App auf macOS bei schnellem Hotkey-Drücken selbst: Emoji-Viewer (Ct", "pk": "SPEECH", "tc": "BUG"}, {"id": 1864, "title": "Aufnahme-Finalisierung erst im Worker-Thread: Folge-Diktate werden verlängert / paralleler Mic-Stream", "desc": "Bei mehreren Diktaten in schneller Folge wurde die zweite Aufnahme verlängert (Stille/Hintergrund am Ende), im Extremfal", "pk": "SPEECH", "tc": "BUG"}, {"id": 1863, "title": "Auto-Updater: Windows-Apply (Helper-Batch, onedir-Replace, Relaunch)", "desc": "## Ziel\n\nWindows-Seite des Auto-Updater-Apply (Folgeticket zu SPEECH-1424, dort ist macOS fertig). Check/Dialog/Download", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1861, "title": "Telefonie-/SMS-Zugangsdaten hinterlegen für Unified Channel Chat (Live-E2E)", "desc": "Folgearbeit zu #1850 (Unified Channel Chat, Epic #1811). Der Code für Telefonate, Meetings und SMS ist gemergt und auf s", "pk": "SDRv4", "tc": "CHO"}, {"id": 1860, "title": "[Marketing] Positionierung Speech Flow als Kampagnen-Fundament", "desc": "## Ziel\nPositionierung von Senity Speech Flow als Grundlage fuer die erste Marketingkampagne erarbeiten. Markt, Probleme", "pk": "SPEECH", "tc": "RESEARCH"}, {"id": 1859, "title": "Ticket-Audit: implementierte aber noch offene Tickets identifizieren und Status synchronisieren", "desc": "User-Auftrag (2026-06-12): Alle nicht abgeschlossenen SDRv4-Tickets (922 Stück: 65 draft, 281 open, 448 backlog, 4 pendi", "pk": "SDRv4", "tc": "CHO"}, {"id": 1858, "title": "Ollama-Backend nicht auswaehlbar obwohl installiert: Sichtbarkeit haengt an fragiler async Server-Probe", "desc": "## Problem\n\nDie Option Ollama (extern) im LLM-Backend-Dropdown erscheint nur, wenn (a) llm_backend bereits ollama ist od", "pk": "SPEECH", "tc": "BUG"}, {"id": 1857, "title": "MCP-Server für Ticketing-System (mcp__ticketing__*) bereitstellen und auf dem Mac registrieren", "desc": "Auf dem Mac-Entwicklungsrechner fehlen die in CLAUDE.md vorausgesetzten mcp__ticketing__*-Tools: Es ist kein MCP-Server ", "pk": "SDRv4", "tc": "CHO"}, {"id": 1856, "title": "Seed-VC im Docker-Container: Checkpoints landen in ./checkpoints statt HF_HOME, webrtcvad braucht build-essential", "desc": "## Problem\n\nBeim Containerisieren von Seed-VC (Plachtaa/seed-vc) für senity-seedvc traten zwei nicht offensichtliche Pro", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1855, "title": "Voice Changer (Seed-VC) in Voice Studio integrieren: Route /api/tts/voice-convert + UI-Modus + Dev-Tunnel", "desc": "Prosodie-erhaltender Voice Changer für das Voice Studio: User nimmt Audio auf, die Aufnahme wird mit erhaltener Betonung", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1854, "title": "Singleton bricht bei Zombie-Prozess ab: <defunct>-Vorinstanz gilt als lebend und ist nicht killbar", "desc": "## Problem\n\nBeim v97-Instanz-Tausch (2026-06-11, 16:58) brach die neue Instanz ab: \"Vorinstanz(en) [24207] konnten nicht", "pk": "SPEECH", "tc": "BUG"}, {"id": 1853, "title": "Externe Personality-API fuer SpeechFlow: GET /api/chat/personalities + Sessions-Dual-Auth + channel_type speechflow", "desc": "Gegenstueck zu SPEECH-1851 (SpeechFlow-Modes mit SDR-Chat-Persoenlichkeiten).\n\n## Anforderung\n\n1. **GET /api/chat/person", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1852, "title": "KNOWLEDGE: Q3TTS via public HTTPS erreichbar — kein SSH-Tunnel nötig", "desc": "## Problem\n\nQ3TTS-Dienst war lokal nur über SSH-Tunnel (`scripts/voice-tunnel.sh`, Port 8880) erreichbar, da der Docker-", "pk": "STS", "tc": "KNOWLEDGE"}, {"id": 1851, "title": "[Brainstorming] SDR-v4-Chatpersoenlichkeiten im Mode-Editor (Prompt ODER Personality, Dropdown per API-Key)", "desc": "Brainstorming-Session 2026-06-11.\n\nIdee: Per API-Key freigeschaltete Chat-Persoenlichkeiten aus dem SDR v4 abrufen und i", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1850, "title": "Unified Channel Chat: einheitliche Persistenz + kanalbewusste UI (P0-P5)", "desc": "Umsetzung des Plans docs/plans/2026-06-11-unified-channel-chat-ui.md (Epic #1811).\n\nJeder Chat (Telegram, Telefon, SMS, ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1849, "title": "Google Workspace Calendar: externe Freigabe-Policy blockt Marcos Privat-Gmail", "desc": "Chris hat Marcos Voice 2111 und Screenshot 2112 reingereicht. Marco kann auf seinem Senity-Google-Kalender im 'Geteilt m", "pk": "INFRA", "tc": "CHO"}, {"id": 1848, "title": "[Brainstorming] Sprachauswahl: {{SPRACHE}}-Platzhalter im Systemprompt + durchsuchbares Sprach-Dropdown in Settings", "desc": "Brainstorming-Session 2026-06-11.\n\nIdee: Im LLM-Systemprompt ist die Zielsprache hart auf Deutsch verdrahtet. Stattdesse", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1847, "title": "Terminal 5: Multi-Channel Admin-UI (Twilio-Status, Nummern-Mapping, chat_channel-CRUD)", "desc": "## Terminal 5: Multi-Channel Admin-UI\n\nLetzter offener Baustein des Multi-Channel-Plans (docs/plans/2026-06-10-multi-cha", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1846, "title": "Inbetriebnahme Multi-Channel: Konfiguration aller neuen Kanaele (SMS/Phone/Meeting/Telegram)", "desc": "## Inbetriebnahme Multi-Channel-Kommunikation (Konfiguration)\n\nDer Code fuer SMS/MMS (Twilio), Telefonie/SIP (LiveKit) u", "pk": "SDRv4", "tc": "CHO"}, {"id": 1845, "title": "Vitest-Tests gruen trotz fehlender i18n-Texte: stale core-dist maskiert neue Keys, Bruch erst nach Rebuild", "desc": "## Problem\n\nIm Monorepo FlexibleNodeJSTools laufen ui-kit-Tests gegen das **gebaute dist** von `@murc134/core` (workspac", "pk": "FLEX", "tc": "KNOWLEDGE"}, {"id": 1844, "title": "Unicode-Escapes beim Datei-Schreiben: \\u-Sequenzen koennen als echte Combining-Chars materialisieren", "desc": "## Problem\n\nBeim Schreiben eines Regex mit Unicode-Escapes (.replace(/[̀-ͯ]/g, '') fuer Diakritika-Strip nach NFKD) land", "pk": "CLI", "tc": "KNOWLEDGE"}, {"id": 1843, "title": "CLI files-Route: PUT-Validierung muss Save ODER Rename ODER Mkdir akzeptieren", "desc": "## Problem\n\nDie PUT-Validierung in app/api/cli/servers/[id]/files/route.ts pruefte urspruenglich nur auf das content-Fel", "pk": "CLI", "tc": "KNOWLEDGE"}, {"id": 1842, "title": "cli-bridge-api: Express-Routen /git und /files/content muessen VOR /files/:fileId registriert werden", "desc": "## Problem\n\nBeim Erweitern der cli-bridge-api um neue Endpunkte (/workspaces/:slug/git, /workspaces/:slug/files/content)", "pk": "CLI", "tc": "KNOWLEDGE"}, {"id": 1841, "title": "cli-bridge-api: Responses sind verschachtelt als { data: {...} }, Konsumenten muessen unwrappen", "desc": "## Problem\n\nDie cli-bridge-api (Port 3100) liefert alle Erfolgs-Responses verschachtelt als { \"data\": { ... } }. Wer im ", "pk": "CLI", "tc": "KNOWLEDGE"}, {"id": 1840, "title": "@murc134/datatable: hideBulkActions und onRowClick existieren nicht als DataTable-Props", "desc": "## Problem\n\nBeim Bau der File-Explorer-Listenansicht (#1836) wurden der DataTable aus @murc134/datatable die Props hideB", "pk": "FLEX", "tc": "KNOWLEDGE"}, {"id": 1839, "title": "FlexibleJSTools hat keinen WaveFormEditor und @murc134/chat keinen Audio-Player-Export", "desc": "## Problem\n\nBei der Umsetzung des Workspace File Explorers (#1836) sollte laut User-Anforderung der \"WaveFormEditor aus ", "pk": "FLEX", "tc": "KNOWLEDGE"}, {"id": 1838, "title": "vi.mock-Factory referenziert top-level const: ReferenceError, Fix via vi.hoisted", "desc": "## Problem\n\nIn einem Vitest-Route-Test sollte der Adapter-Handler bzw. der Supabase-Client gemockt werden. Die Mock-Funk", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1837, "title": "cmd /c build.bat schlägt fehl: NoDefaultCurrentDirectoryInExePath=1 in der Claude-Code-Tool-Umgebung", "desc": "## Problem\nBeim Versuch, den Windows-Build zu starten, schlug `cmd /c build.bat` wiederholt fehl mit: \"Der Befehl build.", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 1836, "title": "File Browser im AI Workspace Chat: 3 Ansichten (DataTable-Liste, Mosaik-Grid, Explorer-Grid) + Audio-Playback", "desc": "## Anforderung (Christoph, 2026-06-10)\n\nDer bestehende Chat/Files-Umschalter im AI Workspace Chat (CliChatOverride.tsx, ", "pk": "CLI", "tc": "FEAT"}, {"id": 1835, "title": "Code-Review AudioEditor (WaveFormEditor) in ui-kit/voice + Brainstorming Audio/Video-Editor-Ausbau", "desc": "## Kontext\n\nUser wünscht kritische Review des `AudioEditor`-Components (umgangssprachlich \"WaveFormEditor\") aus `Flexibl", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 1834, "title": "Code-Review-Agents ohne DB-Migration im Kontext erzeugen Schema-False-Positives", "desc": "## Problem\n\nBei einem Adversarial-Code-Review (#1816) bekamen die Reviewer (Opus, Codex, qwen3.6) nur die exportierten T", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1833, "title": "Codex CLI haengt bei codex exec ohne geschlossenes stdin (< /dev/null Pflicht)", "desc": "## Problem\n\n`codex exec \"<prompt>\"` (auch mit --cd / --skip-git-repo-check) wartet endlos auf stdin, wenn der Eingabestr", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1832, "title": "SMS/MMS-Webhook Security- und Robustheits-Hardening (Adversarial-Review #1816)", "desc": "## Kontext\n\nErgebnis der Adversarial-Review-Kette (Gemini-Ersatz/Opus, Codex gpt-5.5 xhigh, Senity/qwen3.6) zu Terminal ", "pk": "SDRv4", "tc": "BUG"}, {"id": 1831, "title": "Vitest 4: Konstruktor-Mocks (new SipClient()) brauchen Klassen-Mock, Arrow-Function bricht", "desc": "## Problem\n\nBeim Mocken eines per `new` instanziierten SDK-Clients (z.B. `new SipClient(url, key, secret)` aus livekit-s", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1830, "title": "npm E401 auf @murc134/* im Worktree: GitHub-Packages-Token tot, Workaround robocopy + --package-lock-only", "desc": "## Problem\n\n`npm install` in einem frischen Git-Worktree schlaegt mit `E401 Unauthorized` auf allen `@murc134/*`-Package", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1828, "title": "Responsives Layout: Buttons und Eingabefelder in History und Settings stets sichtbar", "desc": "## Problem\n\nUser-Befunde mit Screenshots (#1823, Befunde 1, 2, 5): In der History verschwinden die Kopieren-/Löschen-But", "pk": "SPEECH", "tc": "IMP"}, {"id": 1827, "title": "Windows-Taste während Push-to-Talk unterdrücken (prevent default, Startmenü/Suche öffnet sich)", "desc": "## Problem\n\nUser-Report mit Screenshot (2026-06-10): Während der Hotkey (Strg + Windows-Taste) für die Aufnahme gehalten", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1826, "title": "Umlaut-Mojibake in Radial-Tooltips und Transkript-Preview: Subprozess-stdin dekodiert cp1252 statt UTF-8", "desc": "## Problem\n\nUmlaute werden nicht überall korrekt dargestellt (User-Report mit Screenshots, 2026-06-10): In den Mode-Tool", "pk": "SPEECH", "tc": "BUG"}, {"id": 1825, "title": "Parallel-Terminals teilen Working Tree: Branch-Hijack, Branch-Check vor jedem Commit Pflicht", "desc": "## Problem\n\nWenn mehrere Claude-/Terminal-Sessions im SELBEN Working Tree (z.B. D:/Devel/NodeJS/SDRv4) parallel arbeiten", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1824, "title": "npm.pkg.github.com 401 (abgelaufener Token) blockiert npm install, Workaround SDK-frei via fetch", "desc": "## Problem\n\n`npm install twilio` (und potenziell jedes andere npm install im SDRv4-Repo) schlaegt mit HTTP 401 auf npm.p", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1823, "title": "UI/UX-Layout-Überarbeitung: Bestandsaufnahme + Redesign-Plan (Settings, Picker, Radial-Overlay, Toasts, History)", "desc": "## Ziel\n\nVollständige Überarbeitung des UI-Layouts, ausgehend von den UX-Findings aus dem Projekt-Review #1813 (Settings", "pk": "SPEECH", "tc": "IMP"}, {"id": 1822, "title": "Vitest auf dev hat 45 vorbestehende Failures in 25 Files (Stand 2026-06-10)", "desc": "## Problem\n\n`npm run test` schlaegt auf `dev` mit Exit 1 fehl: 25 Test-Files / 45 Tests rot (von 180 Files / 2311 Tests)", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1821, "title": "[Multi-Channel] Terminal 4B Runde 2 -- Meeting-Bot Deployment (SERVER)", "desc": "**Abhaengigkeiten:**\n- Terminal 4A vollstaendig abgeschlossen (alle 6 Tasks)\n- Terminal 4B Runde 1 (PoC-Test) muss OK ge", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1820, "title": "[Multi-Channel] Terminal 4B Runde 1 -- Meeting-Bot PoC-Test (SERVER)", "desc": "**Abhaengigkeiten:** Terminal 4A Task 1 (PoC-Container) muss committed sein\n**Folgeticket bei Erfolg:** Terminal 4B Rund", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1818, "title": "[Multi-Channel] Terminal 3B -- Phone Deployment (SERVER)", "desc": "**Abhaengigkeiten:** Terminal 3A (Phone Code) muss committed sein\n**Folgeticket:** keines -- Phone ist dann live\n\n**Was ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1817, "title": "[Multi-Channel] Terminal 3A -- Phone Infrastructure Code (LOCAL)", "desc": "**Abhaengigkeiten:** Terminal 1 (Foundation) muss abgeschlossen sein\n**Parallel zu:** Terminal 2 (SMS/MMS)\n**Folgeticket", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1816, "title": "[Multi-Channel] Terminal 2 -- SMS/MMS Channel Adapter", "desc": "**Abhaengigkeiten:** Terminal 1 (Foundation) muss abgeschlossen sein\n**Parallel zu:** Terminal 3A (Phone Infrastructure ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1815, "title": "[Multi-Channel] Terminal 1 -- DB-Migration + Interfaces (Foundation)", "desc": "**Abhaengigkeiten:** keine -- muss als ERSTES abgeschlossen werden\n\n**Folgetickets (starten parallel nach Abschluss):**\n", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1813, "title": "Projekt-Review 2026-06-10: Optimierung, UX/UI-Layout im Senity-Theme, Feature- und Prompt-Ideen", "desc": "## Auftrag (Christoph, 2026-06-10)\n\nDreiteiliger Review-Auftrag:\n1. Gesamtes Projekt auf Optimierungspotenzial untersuch", "pk": "SPEECH", "tc": "RESEARCH"}, {"id": 1812, "title": "PuTTY: Einfuegen schlaegt fehl, Strg+V wird als Steuerzeichen in die Session injiziert", "desc": "## Problem\n\nIn PuTTY funktioniert Senity Speech Flow nicht: Das Transkript landet zwar im Windows-Clipboard, aber das sy", "pk": "SPEECH", "tc": "BUG"}, {"id": 1811, "title": "[Brainstorming] Multi-Channel Communication", "desc": "Brainstorming-Session: Implementierungsreihenfolge fuer Multi-Channel Communication in Senity SDR.\n\n## Geplante Kanaele ", "pk": "SDRv4", "tc": "EPIC"}, {"id": 1810, "title": "KNOWLEDGE: macOS-Tk-Overlay korrekt aufsetzen (Sichtbarkeit + Fokus) — Lehren aus der v70-v78-Debugging-Session", "desc": "Erkenntnisse vom 2026-06-10 (Radial-Overlay-Portierung auf macOS, 3-Monitor-Setup). Drei unabhängige Fehler erzeugten zu", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 1809, "title": "Datei-/Bild-Anhaenge im local_cli-Chat (Mini-SDR) durchreichen", "desc": "Der lokale CLI-Chat (workspace_type=local_cli) reicht Attachments nicht an die Claude Code Instanz durch. Attach-Button ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1807, "title": "@murc134/ui-kit/preset: DataTableFilter-Triplikat aufloesen + fehlende Theme-Tokens + Palettenfarben", "desc": "Aus Review #1770. (1) DataTableFilter dreifach (ui-kit 500, datatable 1320, SDRv4-Kopie) divergiert - datatable als alle", "pk": "SDRv4", "tc": "IMP"}, {"id": 1806, "title": "@murc134/ui-kit/datatable: Datetime-TZ-Bug, fixedFilterParams-Refetch, negatePostgrest-Syntax", "desc": "Aus Review #1770. (1) FormOverlay.tsx:305 datetime-Roundtrip verschiebt Timestamps um TZ-Offset (UTC in datetime-local) ", "pk": "SDRv4", "tc": "BUG"}, {"id": 1805, "title": "@murc134/chat: i18n-Sweep, Auto-Scroll, Inaktivitaets-Timeout, Bubble-Duplikat", "desc": "Aus Review #1770. (1) ~15 hardcodierte deutsche Strings trotz t()/tp() (ChatProvider, ChatMessageBubble:617, ChatInterfa", "pk": "SDRv4", "tc": "IMP"}, {"id": 1804, "title": "@murc134/chat: Tool-Confirm-Follow-up nicht persistiert + Regex-Sanitizer (XSS)", "desc": "Aus Review #1770. (1) handleToolConfirm (useChatStream.ts:678-850) ruft nie persistAssistantMessage; finally setzt strea", "pk": "SDRv4", "tc": "BUG"}, {"id": 1803, "title": "@murc134/chat: Stream wird bei Session-Wechsel in falsche Session persistiert", "desc": "Aus Review #1770. useChatSession.ts:99-105 inkrementiert Epoch nur bei sessionId===null. Session-Wechsel waehrend Stream", "pk": "SDRv4", "tc": "BUG"}, {"id": 1802, "title": "@murc134/llm: fuenffach duplizierten Fallback-Walker konsolidieren + per-Hop-Timeout", "desc": "Aus Review #1770. registry.ts:281-417/419-571/632-721/730-825/830-929 wiederholen Chain-Logik. Fix: generischer runFallb", "pk": "SDRv4", "tc": "IMP"}, {"id": 1801, "title": "@murc134/llm: AnthropicProvider ignoriert params.tools, Katalog mit toten Modell-IDs und falschem Pricing", "desc": "Aus Review #1770. (1) anthropic.ts:139-185 uebersetzt params.tools nicht (stilles Droppen), role:'tool' wird falsch geca", "pk": "SDRv4", "tc": "BUG"}, {"id": 1800, "title": "@murc134/llm: mapMessages verliert tool_calls und tool_call_id", "desc": "Aus Review #1770. openai-compatible.ts:284-292 reduziert Messages auf {role,content}; OpenAI lehnt Tool-Results ohne too", "pk": "SDRv4", "tc": "BUG"}, {"id": 1799, "title": "@murc134/llm: AbortSignal nicht durchgereicht (8 Provider verbrennen Tokens bei Stop)", "desc": "Aus Review #1770 (FNT). openai-compatible.ts:206-215/187-196/294-306 ruft create({...}) ohne {signal}-RequestOptions; Ab", "pk": "SDRv4", "tc": "BUG"}, {"id": 1798, "title": "Lizenz-Hygiene: doppelte Migration 153, RLS-GUC-Konsistenz, int4-Overflow, signature", "desc": "Aus Review #1770 (LOW-Bundle). (1) Doppelte Migrationsnummer 153 (license-audit-enum + remove-vertrieb-module) - eine um", "pk": "SDRv4", "tc": "CHO"}, {"id": 1797, "title": "Lizenz-Ausstellung: keine Seat-/Mehrfach-Begrenzung, max_containers nicht durchgesetzt", "desc": "Aus Review #1770. licenses/route.ts:117-198 prueft nicht gegen bestehende aktive Lizenzen desselben app_user_id+license_", "pk": "SDRv4", "tc": "IMP"}, {"id": 1796, "title": "PostgREST-Filter-Injection in der Lizenz-Suche", "desc": "Aus Review #1770. licenses/route.ts:65-94 interpoliert search ungeprueft in PostgREST-.or()-Strings (name.ilike.%${searc", "pk": "SDRv4", "tc": "BUG"}, {"id": 1795, "title": "Lizenzsystem ohne Laufzeitwirkung: valid_until, is_active und license_type_item nie durchgesetzt", "desc": "Aus Review #1770 (Domaene Lizenzen). (1) valid_until wird serverseitig nie geprueft (nur UI-Badge) - abgelaufene Lizenz ", "pk": "SDRv4", "tc": "BUG"}, {"id": 1794, "title": "Retention fuer background_jobs und activity_log (DSGVO)", "desc": "Aus Review #1770. retention_policy-Seeds (002_seed_data.sql:362-369) enthalten weder background_jobs noch activity_log; ", "pk": "SDRv4", "tc": "IMP"}, {"id": 1793, "title": "cleanup-Route: jeder User kann fremde Jobs global stoppen", "desc": "Aus Review #1770. cleanup/route.ts:16-26 requireAnyRole + Admin-Client + Update ohne app_user_id-Filter. Fix: requireCap", "pk": "SDRv4", "tc": "BUG"}, {"id": 1792, "title": "Kein Cleanup verwaister running-Jobs (pg_cron fehlt)", "desc": "Aus Review #1770. Bei Crash zwischen createJob(running) und Status-Update bleibt der Job ewig running -> dauerhaftes 5s-", "pk": "SDRv4", "tc": "BUG"}, {"id": 1791, "title": "Activity-Log-Endpoint ohne Pagination/Limit", "desc": "Aus Review #1770. route.ts:46-52 ohne limit/range; langlebige Entitaeten sammeln tausende Audit-Zeilen, CommentModule la", "pk": "SDRv4", "tc": "IMP"}, {"id": 1790, "title": "Activity-Log umgeht CRM-Row-Scoping (Feld-Historie fremder Kontakte lesbar)", "desc": "Aus Review #1770 (Domaene Jobs). /api/activity-log/[entityType]/[entityId]:29,46 prueft nur requireAuth und liest mit cr", "pk": "SDRv4", "tc": "BUG"}, {"id": 1789, "title": "001_database_initial.sql mit Migration 151 (local_cli) synchronisieren + withErrorHandler-Migration", "desc": "Aus Review #1770. (1) workspace_type-CHECK in 001:2761 enthaelt local_cli nicht (Migration 151:20) - Fresh-Setup wuerde ", "pk": "SDRv4", "tc": "CHO"}, {"id": 1788, "title": "DELETE-Cleanup: tote Spalten -> Branch-Archivierung und Port-Release laufen nie", "desc": "Aus Review #1770. [id]/route.ts:628-641 liest customer_slug/environment von cli_server, die Spalten existieren nur auf w", "pk": "SDRv4", "tc": "BUG"}, {"id": 1787, "title": "CLI-Streaming: SecurityLayer/Token im wakeAndPrompt + Stream-Timeout + Kill-Guard", "desc": "Aus Review #1770. (1) wakeAndPrompt (request-router.ts:661-703) umgeht security.check und jwtVerify(cliToken) - gemeinsa", "pk": "SDRv4", "tc": "IMP"}, {"id": 1786, "title": "Geteiltes Telegram-Inbox-Volume ueber alle Container", "desc": "Aus Review #1770. docker-manager.ts:340-354 bindet denselben Host-Pfad TELEGRAM_INBOX_HOST_DIR in jeden Container nach /", "pk": "SDRv4", "tc": "BUG"}, {"id": 1785, "title": "Caddy-Generator entfernen/auf Nginx umstellen (Projektregel-Verstoss)", "desc": "Aus Review #1770. lib/workspace/caddy-generator.ts + /api/cli/workspaces/caddy-config:4-11 verstossen gegen docs/CRITICA", "pk": "SDRv4", "tc": "CHO"}, {"id": 1784, "title": "Geteilte Git-SSH-Private-Keys in jedem Workspace-Container (Cross-Tenant)", "desc": "Aus Review #1770. docker-manager.ts:356-368 mountet dieselben Host-SSH-Keys read-only in alle Workspaces, init.sh kopier", "pk": "SDRv4", "tc": "BUG"}, {"id": 1783, "title": "resource_limits komplett unvalidiert -> Host-DoS", "desc": "Aus Review #1770. POST (route.ts:180,435,506) und PATCH ([id]/route.ts:187-189) reichen resource_limits ungeprueft durch", "pk": "SDRv4", "tc": "BUG"}, {"id": 1782, "title": "PATCH-Recreate hardcodet host.docker.internal (Regression BUG-318)", "desc": "Aus Review #1770. [id]/route.ts:491 setzt fest ANTHROPIC_BASE_URL host.docker.internal:3000/api/claude-proxy ohne Env-Ov", "pk": "SDRv4", "tc": "BUG"}, {"id": 1781, "title": "Webhook schreibt error_reason in nicht existierende Spalte -> Error-Status geht verloren", "desc": "Aus Review #1770. webhook/[id]/route.ts:114-118 setzt updateData.error_reason, die Spalte existiert in keiner Migration.", "pk": "SDRv4", "tc": "BUG"}, {"id": 1780, "title": "CLI-Server-Webhook ist fail-open ohne ORCHESTRATOR_AUTH_TOKEN + nicht timing-safe", "desc": "Aus Review #1770 (Domaenen Server + CLI, 2x gefunden). webhook/[id]/route.ts:34-42: Auth nur in if(authToken){}, ohne ge", "pk": "SDRv4", "tc": "BUG"}, {"id": 1779, "title": "Telegram-Robustheit: 429-Handling, MarkdownV2-Chunking, IP-Rate-Limit, Multi-Bot-Commands", "desc": "Aus Review #1770 (MEDIUM-Bundle). (1) callTelegramApi wertet retry_after nicht aus (telegram.ts:149-161,225-235) - bei 4", "pk": "SDRv4", "tc": "IMP"}, {"id": 1778, "title": "Keine update_id-Dedup im Bot-Pfad: doppelte Transkription/ASR-Abrechnung", "desc": "Aus Review #1770. update_id-Dedup greift nur im CLI-Routing-Pfad; regulaerer Bot-Pfad (Consent, Voice 599-698, processIn", "pk": "SDRv4", "tc": "BUG"}, {"id": 1777, "title": "activateChannel() registriert Webhook ohne secret_token -> Bot wird taub", "desc": "Aus Review #1770. adapters/telegram.ts:374-386 ruft setWebhook ohne secret_token, der Endpoint verwirft aber alle Update", "pk": "SDRv4", "tc": "BUG"}, {"id": 1776, "title": "Consent-Parser wertet 'Ich stimme nicht zu' als Zustimmung (DSGVO)", "desc": "Aus Review #1770. affirmative-Liste wird per txt.includes(w) VOR der Negativ-Liste geprueft (webhook/[id]/route.ts:358-3", "pk": "SDRv4", "tc": "BUG"}, {"id": 1775, "title": "Session-Exfiltration: Kanal-Bindung ohne Ownership-Check + bot_token im Klartext", "desc": "Aus Review #1770 (Domaene Kanaele). POST /api/sessions/[id]/channels:89 verlangt nur requireAnyRole, kein Ownership-Chec", "pk": "SDRv4", "tc": "BUG"}, {"id": 1774, "title": "Chat: Kontextfenster/Vision nutzen falsches Modell, Auto-Summary-Defaults und Loesch-Race", "desc": "Aus Review #1770 (MEDIUM-Bundle). (1) lookupContextWindow/inferCapabilities nutzen personality.chat_model statt chain[0]", "pk": "SDRv4", "tc": "IMP"}, {"id": 1773, "title": "Agentic-Stream: Setup-Fehler erzeugen keinen SSE-Error-Frame", "desc": "Aus Review #1770. runVisionOCR() und startChatCompletion() laufen vor dem try-Block (route.ts:1413-1427). Provider-Fehle", "pk": "SDRv4", "tc": "BUG"}, {"id": 1772, "title": "personality-test/send umgeht Model-Visibility, DSGVO-Block und Token-Abrechnung", "desc": "Aus Review #1770. /api/chat/personality-test/send nutzt client-gelieferte provider/model direkt als Chain (route.ts:30,8", "pk": "SDRv4", "tc": "BUG"}, {"id": 1771, "title": "IDOR in /api/chat/send: kein Session-Participant-Check", "desc": "Aus Review #1770 (Domaene Chat). /api/chat/send akzeptiert sessionId vom Client ohne Pruefung der Teilnahme (route.ts:52", "pk": "SDRv4", "tc": "BUG"}, {"id": 1770, "title": "Multi-Agent Code-Review: Jobs/Aktivitäten, Chat-API, CLI-Workspace, Server-Provisioning, Lizenzen, Kanäle/Telegram, FlexibleNodeJSTools", "desc": "Paralleles Read-Only-Review mit 9 spezialisierten Fable-Agenten (6 SDRv4-Domänen + 3 FlexibleNodeJSTools-Packages) am 20", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 1769, "title": "Magic MCP component_builder liefert \"[object Object]\" statt Komponenten-Code", "desc": "## Problem\nBeim Senity-Website-Redesign (Pass 2-4, Ticket #1729) sollte `mcp__magic__21st_magic_component_builder` ferti", "pk": "WEB", "tc": "KNOWLEDGE"}, {"id": 1768, "title": "[Brainstorming] Lizenz-System vollständig implementieren (Phase 2+3)", "desc": "Brainstorming für die verbleibenden offenen Punkte im Lizenz-System: (1) cli_server.license_id entfernen, (2) license_ty", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1766, "title": "ui-ux-pro-max search.py: SKILL.md-Basispfad existiert nicht, Script braucht cwd im scripts-Ordner", "desc": "## Problem\nDer ui-ux-pro-max-Skill (Plugin v2.5.0) verweist in SKILL.md auf das Script-Verzeichnis `...\\2.5.0\\.claude\\sk", "pk": "WEB", "tc": "KNOWLEDGE"}, {"id": 1765, "title": "Tkinter: root.after() aus fremdem Thread deadlockt unter Windows bei busy Mainloop, IPC via Queue + Tk-seitigem Drain-Loop", "desc": "## Problem\n\nEin stdin-Reader-Daemon-Thread, der pro IPC-Kommando `root.after(0, callback)` aufruft, friert unter Windows", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 1764, "title": "ASR-Stille-Halluzination: Silence-Gate vor Dispatch noetig, VAD war nur visuell", "desc": "## Problem\nBei sehr leisen oder sehr kurzen Aufnahmen (z.B. durch Hotkey-Prellen ausgeloeste Phantom-Aufnahmen) halluzin", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 1763, "title": "Radial-Overlay friert ein beim Logo-Klick während laufender Aufnahme (v58-Hang)", "desc": "## Symptom\n\nBuild v58: Klick auf das Senity-Logo-Medaillon während einer laufenden Aufnahme friert das Radial-Overlay ko", "pk": "SPEECH", "tc": "BUG"}, {"id": 1762, "title": "Speech-Flow-Client: Lizenz-Prüfung beim Start gegen /api/license/verify (Ed25519, Sliding-Window, Offline-Grace)", "desc": "## Kontext (für die Speech-Flow-Session, eigenständig lesbar)\n\nAuf SDRv4-Seite ist das produktübergreifende Lizenz-Daten", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1761, "title": "Stille-Halluzination + Hotkey-Prellen: leere Phantom-Aufnahmen werden als chinesischer Muell gepastet", "desc": "## Symptom (Marco, app.log 2026-06-09, v50)\n\nMarco meldet \"heute Probleme\". Im app.log zeigen sich drei zusammenhaengend", "pk": "SPEECH", "tc": "BUG"}, {"id": 1760, "title": "Lokaler LLM-Sidecar (llamacpp-sidecar) implementieren - das 'gebackene' LLM zum Laufen bringen", "desc": "## Problem\n\nDer LLM-Backend-Schalter (`llm_backend`) kennt drei Werte: `senity` (Cloud-Proxy), `ollama` (externes Ollama", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1759, "title": "Chat-Attachments werden nicht persistiert und sind dem Modell nicht zugänglich", "desc": "## Problem\n\nIm AI-Workspace-Chat (Gespraech mit Container oder lokaler Instanz) koennen Dateien angehaengt werden, aber ", "pk": "CLI", "tc": "FEAT"}, {"id": 1758, "title": "@murc134/llm: detectCapabilities unter-erkennt Vision für Claude/GPT-4o/Gemini, inferCapabilities(provider, model) nutzen", "desc": "## Problem\n\n`detectCapabilities(providerId, modelId)` aus `@murc134/llm` (src/capabilities.ts) liefert für moderne Multi", "pk": "FLEX", "tc": "KNOWLEDGE"}, {"id": 1757, "title": "Native Vision im Chat: Bild-Anhänge direkt an vision-fähiges Chat-Modell durchreichen", "desc": "## Ziel\n\nBild-Anhänge im SDR-Chat sollen, wenn das konfigurierte Chat-Modell selbst Vision-fähig ist (Claude 3+, GPT-4o+", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1756, "title": "local_cli: Detail-Overlay + Settings-Tab an lokalen Charakter angepasst", "desc": "## Ziel\n\nNach der Anlage- und Laufzeit-Stabilisierung von local_cli (siehe #1749, #1752) spiegelte das Detail-Overlay ei", "pk": "CLI", "tc": "IMP"}, {"id": 1755, "title": "Selfhost-Supabase: RLS-Policy fuer service_role ist KEIN Table-GRANT", "desc": "## Problem\n\nPostgREST liefert `permission denied for table <X>` obwohl der service_role-Key benutzt wird UND eine RLS-Po", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1754, "title": "Admin-UI: license_type-Katalog konfigurierbar machen (anlegen/bearbeiten/deaktivieren)", "desc": "## Anforderung\n\nUser: \"license types nicht konfigurierbar\". Aktuell gibt es nur die Lizenz-Ausstellungs-UI (#1735), die ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1753, "title": "Lizenz-Seite /einstellungen/licenses komplett kaputt: 2x HTTP 500 + fehlender i18n-Key", "desc": "## Problem\n\nDie Seite `/einstellungen/licenses` (Admin-UI aus #1735) zeigt beim Laden zwei Fehler-Toasts und ist unbenut", "pk": "SDRv4", "tc": "BUG"}, {"id": 1752, "title": "local_cli Laufzeit: OAuth statt API-Key, falscher Agent-Name, 502 auf /projects", "desc": "## Problem\n\nNach erfolgreicher Anlage eines local_cli-Servers (siehe #1749) traten im CLI-Chat des Mini-SDR drei Laufzei", "pk": "CLI", "tc": "KNOWLEDGE"}, {"id": 1751, "title": "Hold-Timer im Radial-Overlay: Aufnahmedauer anzeigen", "desc": "## Anforderung\n\n**User (v54 Live-Test):** \"Ich moechte ausserdem einen Timer haben, der anzeigt, wie lange ich die Taste", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1750, "title": "Chat-Persistenz: drei getrennte Systeme, `source` ist Rolle nicht Herkunft, Web-Chat schreibt channel_type=NULL", "desc": "## Problem\n\nFrage: \"Werden Chats über die Senity-API (Telegram, CLI-Console, Web) gespeichert, und vor allem mit `source", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1749, "title": "local_cli CLI-Server: Credential-Pflicht + tts-diag Fast-Refresh removeChild-Crash", "desc": "## Problem\n\nZwei verschraenkte Befunde beim Anlegen eines lokalen Claude-Code-Servers (workspace_type='local_cli') im Mi", "pk": "CLI", "tc": "KNOWLEDGE"}, {"id": 1748, "title": "local_cli-Server-Anlage scheitert: Migration 151 nicht auf Test-DB eingespielt (Constraint blockiert)", "desc": "## Problem\n\nAnlegen eines lokalen CLI-Servers (Checkbox \"Lokale Claude Code Instanz (Mini-SDR)\", `workspace_type='local_", "pk": "CLI", "tc": "KNOWLEDGE"}, {"id": 1747, "title": "Vertrieb-Modul komplett aus Mini-SDR entfernen (Nav + Apps + Pages/API + Components + DB-Drop)", "desc": "## Auftrag\n\nUser (Christoph): \"wir muessen unseren mini sdr aufraeumen und 'vertrieb' komplett aus der liste entfernen i", "pk": "SDRv4", "tc": "CHO"}, {"id": 1746, "title": "Boot-Chime stumm im Build: geseedete config startup_sound_enabled=false, kein PortAudio-Race", "desc": "## Problem\nIm gebauten Build (EXE) blieb der Boot-Chime (senity.wav) stumm, obwohl er im Dev-Start (`python -m speechflo", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 1745, "title": "Deploy: Lizenz-Migrationen 153 + 154 gegen Produktion ausfuehren (bisher nur api-sdr-test)", "desc": "## Kontext\n\nDie Lizenz-Admin-UI (#1735, Phase 4 von #1712) ist in `main` gemergt (Commit 1554ea3f). Die zugehoerigen DB-", "pk": "SDRv4", "tc": "CHO"}, {"id": 1744, "title": "Security: /api/licenses GET umgeht RLS (Tenant-Leak) + /api/licenses/check kaputtes Schema, beide Alt-Routen loeschen", "desc": "## Kontext\n\nGefunden im 5-Modell-Review von #1735 (License-Admin-UI). Zwei Alt-Welt-Routen sind kaputt bzw. unsicher und", "pk": "SDRv4", "tc": "BUG"}, {"id": 1743, "title": "Assignee-Tracking-Lücke: SDRv4 hat keinen /api/users-Endpoint, alle Tickets assignee_id=null", "desc": "## Problem\n\nBei der Audit-Arbeit rund um #1735 (License-Admin-UI) ist aufgefallen: **alle SDRv4-Tickets haben `assignee_", "pk": "SDRv4", "tc": "IMP"}, {"id": 1742, "title": "gdpr_audit_action: DB-Enum schmaler als TS-Union, fehlende Werte werden still verworfen", "desc": "## Problem\n\nDas DB-Enum `gdpr_audit_action` ist schmaler als die TypeScript-Union `GdprAuditAction` in `lib/audit.ts`. `", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1741, "title": "Radial-Overlay/Picker klaut beim Klick den Fokus, Paste landet nicht im Ziel-Eingabefeld", "desc": "## Problem\n\nUser-Report: Das neue radiale Overlay (#1721) uebernimmt beim Anklicken eines Mode-Segments den Fokus und gi", "pk": "SPEECH", "tc": "BUG"}, {"id": 1740, "title": "SDRv4-Chat als globales Overlay in Next-16-Server-Layout mounten (dynamic ssr:false braucht Client-Boundary, useToast braucht Provider)", "desc": "## Problem\n\nBeim 1:1-Port des SDRv4-Chats nach mini-sdr (FEAT #1737) traten beim Mounten des `ChatProvider` als globales", "pk": "SDRL", "tc": "KNOWLEDGE"}, {"id": 1739, "title": "faster-whisper als zweiten ASR-Provider in die Fallback-Chain aufnehmen (wählbar pro ASR-Endpoint)", "desc": "## Ziel\n\nfaster-whisper (large-v3, beste Qualitaetsvariante) zusaetzlich zu Q3ASR (Qwen3-ASR-1.7B) auf dem GPU-Server in", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1738, "title": "[Brainstorming] Senity-Website Produktseiten auf Positionierung v7.6 aktualisieren", "desc": "Befund: Website (senity-next) zeigt 2 Produkte (Communication Hub + Social Growth System). Aktuelle offizielle Positioni", "pk": "CORE", "tc": "IMP"}, {"id": 1737, "title": "SDRv4-Chat 1:1 nach mini-sdr portieren (voller Port inkl. CLI/Voice/Podcast)", "desc": "## Ziel\n\nDie `/chat`-Seite in mini-sdr (senity-sdr-local) ist aktuell eine bespoke Neuinterpretation (Supabase-Message-B", "pk": "SDRL", "tc": "FEAT"}, {"id": 1736, "title": "Aktuelle DE/EU-Rechtsnormen für Website-Impressum + Datenschutz (Stand 2025/2026)", "desc": "## Problem\n\nBeim Erstellen von Impressum + Datenschutzerklärung für eine deutsche Website werden häufig veraltete Normen", "pk": "WEB", "tc": "KNOWLEDGE"}, {"id": 1735, "title": "Admin-UI: Lizenzen an Kunden ausstellen und sperren (license_type wählen, Gültigkeit, app_user-Bindung) (Phase 4 von #1712)", "desc": "## Kontext\n\nPhase 4 des produktübergreifenden Lizenz-Datenmodells (#1712). Liefert das Admin-UI auf dem neuen Modell (`l", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1734, "title": "Lizenz-Cleanup: Phantom-API + tote Migration 090 entfernen, cli_server.license_id droppen, Alt-Pläne nach license_type migrieren (Phase 2 von #1712)", "desc": "## Kontext\n\nPhase 2 (Cleanup) des produktübergreifenden Lizenz-Datenmodells (#1712). Setzt voraus, dass Phase 1 (Migrati", "pk": "SDRv4", "tc": "CHO"}, {"id": 1733, "title": "@murc134/ui-kit-Barrel bricht mit @tiptap v3 (fehlende Default-Exports) -> HTTP 500 beim Import von PasswordField/EmailInput", "desc": "## Problem\n\nNach Portierung der SDRv4-Login-Seite (Import von `PasswordField` aus `@murc134/ui-kit` und transitiv `Email", "pk": "SDRL", "tc": "KNOWLEDGE"}, {"id": 1732, "title": "Globale Design-System-Spezifikation fuer senity.net Rebrand (senity-next)", "desc": "## Kontext\nRebrand der alten Duda-Website senity.net als eigenstaendiges Next.js (App Router) + Tailwind Projekt unter `", "pk": "SDRv5", "tc": "FEAT"}, {"id": 1731, "title": "middleware -> proxy umbenennen (Next.js 16 Deprecation)", "desc": "## Problem\n\nNext.js 16 markiert die `middleware`-Datei-Konvention als deprecated. Beim Dev-Start erscheint:\n\n```\n⚠ The \"", "pk": "SDRL", "tc": "CHO"}, {"id": 1730, "title": "turbopack.root in next.config.ts setzen (Multiple-Lockfiles-Warning beim Dev-Start)", "desc": "## Problem\n\nBeim Start des Dev-Servers (`npm run dev`, Port 4000) gibt Next.js 16 / Turbopack eine Warning aus:\n\n```\n⚠ W", "pk": "SDRL", "tc": "CHO"}, {"id": 1729, "title": "senity.net als Duda-freies Next.js-Template neu aufbauen", "desc": "## Kontext\n\n`senity.net` wurde von einem Kollegen aus dem live ausgelieferten **Duda-Baukasten** gescraped (kein lizenzi", "pk": "WEB", "tc": "EPIC"}, {"id": 1728, "title": "Login auf localhost:4000 brach mit Redirect-Loop ab (middleware JWKS-Verifikation gegen leeres Key-Set)", "desc": "## Kontext\n\nhttp://localhost:4000/login warf den User nach erfolgreichem Login sofort zurueck auf die Login-Seite (Redir", "pk": "SDRL", "tc": "BUG"}, {"id": 1727, "title": "Login-Redirect-Loop: api-sdr-test signiert JWTs per HS256, JWKS ist leer -> asymmetrische Verifikation unmoeglich", "desc": "## Problem\n\nLogin auf http://localhost:4000/login schlug fehl mit Redirect-Loop: POST /api/auth/login lieferte 200 (Prox", "pk": "SDRL", "tc": "KNOWLEDGE"}, {"id": 1726, "title": "Autostart-Angebot nach signierter EXE (Senity Speech Flow beim Login starten)", "desc": "## Ziel\nSobald ein signiertes Build-Artefakt existiert (kein SmartScreen-/AV-Block mehr), soll die App dem User aktiv an", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1725, "title": "build-project Skill: Build-Optionen (Dev vs. Release) abfragen + v52 Tracking", "desc": "Lokaler Projekt-Skill .claude/skills/build-project, der vor jedem PyInstaller-Build die sicherheitsrelevante Option abfr", "pk": "SPEECH", "tc": "CHO"}, {"id": 1724, "title": "Handwerker-Kampagne: Liste-Qualität + Landing-Page Conversion", "desc": "Handwerker-Kampagne Analyse (KW23):\n- 813 E-Mails versendet\n- 509 nicht zustellbar (62% Bounce) — Liste veraltet oder Fi", "pk": "CLI", "tc": "IMP"}, {"id": 1723, "title": "Apps-System portieren: 4 TypeScript-Gotchas (RouteHandler-Signatur, types.ts, Update-PK, Dirent-Overload)", "desc": "## Problem\n\nBeim Portieren des SDRv4-`apps/`-Systems ins Mini-SDR (senity-workspace) blockierten vier nicht-offensichtli", "pk": "SWS", "tc": "KNOWLEDGE"}, {"id": 1722, "title": "PyInstaller --windowed: sys.stdout/stderr=None crasht Whisper-Download (huggingface_hub/tqdm)", "desc": "## Problem\nIm PyInstaller `--windowed`/`--noconsole`-Build (Tray-App ohne Konsole) sind `sys.stdout`, `sys.stderr` und `", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 1721, "title": "Radiales Overlay-Redesign: Vollkreis-Menue, SVG-only, Click-to-open, Skalierung + Overlay-States (#1436)", "desc": "## Kontext\n\nDas aktuelle Aufnahme-Overlay (`speechflow/overlay.py`, Pille unten rechts) wird unscharf dargestellt, weil ", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1720, "title": "\"Nicht authentifiziert\" beim Login: generischer Wrapper, echte Ursache nur in detail; \"Kein App-Benutzer\" feuert auch bei Select-Fehler", "desc": "## Problem\n\nLogin-Route gab \"Nicht authentifiziert\" zurück, obwohl Zugangsdaten korrekt waren. Schwer zu diagnostizieren", "pk": "SWS", "tc": "KNOWLEDGE"}, {"id": 1719, "title": "huggingface_hub 1.x: tqdm_class wird von hf-xet umgangen, Download-Progress ueber Disk-Polling", "desc": "## Problem\nFortschrittsbalken fuer einen huggingface-Modell-Download (snapshot_download) blieb bei 0% und sprang dann au", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 1718, "title": "local_cli / Mini-SDR MVP: Review-Befund (3 Modelle) + Fix-Plan vor Merge", "desc": "## Kontext\n\nFeature local_cli (Mini-SDR): Das Senity-Workspace-Web-Frontend chattet mit einer LOKAL gestarteten Claude-C", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1717, "title": "Offline-Modus: Whisper-Modell-Download-Manager (Small/Turbo/Max) + Multi-Provider-LLM", "desc": "## Ziel\nVoll offline nutzbares Diktat: lokale ASR (faster-whisper, bereits in transcriber.py als LocalWhisperTranscriber", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1716, "title": "CLAUDE.md: Multi-User-Bug entschaerfen (Verweis auf nicht geteilte ~/.claude/CLAUDE.md)", "desc": "## Problem\n\nDie SDRv4 `CLAUDE.md` (Zeile 150) verweist fuer den KNOWLEDGE-Workflow auf eine\n\"Globale Quelle: `~/.claude/", "pk": "SDRv4", "tc": "CHO"}, {"id": 1715, "title": "Mini-SDR: schlankes Frontend im SDRv4-Look (Greenfield)", "desc": "## Ziel\n\nDas alte Workspace-Frontend (oranges Theme, profil/projects-Hub/admin) wurde nach `backup/` weggesichert (gitig", "pk": "SWS", "tc": "FEAT"}, {"id": 1712, "title": "Produktübergreifendes Lizenz-Datenmodell: license_type-Katalog + license als Pro-Kunde-Ausstellung", "desc": "## Ziel\n\nSchlankes, produktübergreifendes Lizenz-Datenmodell. Der Kunde kauft eine **Lizenz** (Ausstellung) mit Einricht", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1711, "title": "Senity Speech Flow Mobile: eigene Tastatur / Add-on für Android und iOS", "desc": "Idee von Chris (2026-06-08, Telegram Voice 2083): Mobile-Diktier-Erlebnis auf Senity-Speech-Flow-Basis, analog WisprFlow", "pk": "AI", "tc": "RESEARCH"}, {"id": 1710, "title": "Voice-Messages von Chris kommen nicht beim Workspace-Agent an", "desc": "Chris meldet, dass seine Sprachnachrichten an den Workspace-Telegram-Channel (chat_id 36833276, channel 3c9e547c-56be-4a", "pk": "AI", "tc": "BUG"}, {"id": 1709, "title": "Outbound-Calling / Cold-Call-Automatisierung fuer Jarvis", "desc": "Ziel: Marco soll keine Cold-Calls mehr selbst fuehren muessen — Jarvis uebernimmt die ausgehende Telefon-Akquise automat", "pk": "CLI", "tc": "FEAT"}, {"id": 1708, "title": "Jarvis: Webseiten live analysieren und crawlen können", "desc": "Jarvis soll URLs öffnen und analysieren können — nicht raten.\n\nKonkrete Use Cases:\n- Competitor-Analyse (Feature-Gap erk", "pk": "CLI", "tc": "FEAT"}, {"id": 1707, "title": "Jarvis vs. ScaleTalk: Feature-Gap schließen", "desc": "ScaleTalk (scaletalk.ai) ist ein direkter Wettbewerber im Bereich Voice AI. Analyse ergab folgende Features die Jarvis n", "pk": "CLI", "tc": "IMP"}, {"id": 1706, "title": "WhatsApp-Integration für Jarvis (erstes Hand-Tool)", "desc": "Umsetzung des ersten \"Hand\"-Tools aus dem Gehirn-Stimme-Hand-Audit (CLI-1705).\n\nZIEL: Jarvis bekommt Zugriff auf WhatsAp", "pk": "None", "tc": "None"}, {"id": 1705, "title": "Jarvis-Architektur nach \"Gehirn-Stimme-Hand\"-Prinzip schärfen", "desc": "AUDIT (08.06.2026) — Gehirn / Stimme / Hand bei Jarvis (Telegram-Agent)\n\n## GEHIRN (Wissen + Kontext) — gut ausgebaut\nTi", "pk": "CLI", "tc": "IMP"}, {"id": 1704, "title": "YouTube-Analyse: yt-dlp haengt, Cookie-Credentials pruefen", "desc": "GELOEST (08.06.2026):\n\n1. Marco hat frische youtube-cookies.txt exportiert und hochgeladen -> Cookie-Block (\"Sign in to ", "pk": "CLI", "tc": "BUG"}, {"id": 1703, "title": "Senity Speech Flow: lokale Transkriptions-Modelle (Gemma 3n E2B + Qwen3 1.7B)", "desc": "Setup für die lokale Transkript-Korrektur ohne Internet auf fremder, teils schwacher Hardware (auch Smartphone-Niveau). ", "pk": "AI", "tc": "FEAT"}, {"id": 1702, "title": "ECC Plugin auf Jarvis Code installieren + erstes Test-Feature", "desc": "ECC-Plugin von Affaan Mustafa (https://github.com/affaan-m/ECC) auf Jarvis Code installieren.\n\nSchritte:\n1. /plugin mark", "pk": "CLI", "tc": "FEAT"}, {"id": 1701, "title": "Telegram-Bot: Datei-Upload empfangen & analysieren (PDF, Bilder, Docs)", "desc": "Aktuell empfängt der Telegram-Bot nur Text. Marco kann Dateien (PDF, Bilder, Word-Docs) im Chat anhängen — diese werden ", "pk": "CLI", "tc": "FEAT"}, {"id": 1700, "title": "WhatsApp Business API anbinden (DVAG/Kapitalanlage)", "desc": "WhatsApp Business API anbinden für automatisierte Lead-Kommunikation im DVAG/Kapitalanlage-Projekt. Inhalt: Provider-Wah", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1699, "title": "Jarvis-Webseite: lokal-Horst-Inhalte durch Domain und echte Inhalte ersetzen", "desc": "Die Jarvis-Webseite zeigt noch Platzhalter-Inhalte. Die Domain jarvis.visioncare-s-c.de ist bereits aktiv. Alle Platzhal", "pk": "CLI", "tc": "FEAT"}, {"id": 1698, "title": "Dashboard: Titelsuche fuer Spotify einbauen", "desc": "Im JARVIS-Dashboard kann aktuell nicht nach einem Songtitel gesucht werden. Die Spotify-Sektion muss um ein Suchfeld erw", "pk": "CLI", "tc": "FEAT"}, {"id": 1697, "title": "JARVIS-Agent Live-Visibility auf Claude Code Aktivität", "desc": "PROBLEM:\nDer JARVIS-Telegram-Agent (Claude/Sonnet) hat aktuell keine Sicht darauf, ob Claude Code gerade an einem Ticket", "pk": "CLI", "tc": "FEAT"}, {"id": 1696, "title": "E-Mail-Inbox-Integration: Antworten erkennen & melden", "desc": "JARVIS hat aktuell keinen Zugriff auf Marcos E-Mail-Postfach und bekommt daher nicht mit, wenn auf von ihm versendete E-", "pk": "CLI", "tc": "FEAT"}, {"id": 1695, "title": "send_email: Versand-Bestätigung & Status-Rückgabe einbauen", "desc": "Aktuell weiß JARVIS nach Freigabe einer E-Mail nicht, ob der Versand technisch erfolgreich war.\n\nAnforderung:\n- send_ema", "pk": "CLI", "tc": "FEAT"}, {"id": 1694, "title": "Zentrales Kosten-Dashboard für alle Tools & APIs", "desc": "Ziel: Vollständige Kostentransparenz über alle eingesetzten Tools und APIs an einem Ort.\n\nAktuell zeigt get_usage_stats ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1693, "title": "90-Tage-Angebots-Template fuer AI Employee Layer erstellen", "desc": "Vorlage fuer ein Kundenangebot mit 90-Tage-Ergebnis-Garantie. Basiert auf dem AI-Employee-Layer-Modell (Video fLgKYFvuL9", "pk": "CLI", "tc": "CHO"}, {"id": 1692, "title": "Telegram-Bot: Leere/weiße Antwort nach E-Mail-Versand (kein Feedback sichtbar)", "desc": "Nach dem Senden einer E-Mail über den Telegram-Bot wird keine sichtbare Bestätigung angezeigt — der Bot gibt eine leere/", "pk": "CLI", "tc": "BUG"}, {"id": 1691, "title": "Telegram-Bot: Leere/weiße Rückmeldung nach E-Mail-Versand", "desc": "Nach dem Bestätigen einer E-Mail im Telegram-Bot wird keine sichtbare Erfolgsmeldung angezeigt — die Antwort erscheint l", "pk": "CLI", "tc": "BUG"}, {"id": 1690, "title": "Telegram-Agent: Fehlende Schnittstellen anbinden (Chat-Verlauf, Dokumente, Tagesprotokoll)", "desc": "Der Telegram-Bot (Marco-Assistent) hat aktuell keinen Zugriff auf Chat-Verläufe, Dokumente oder Tagesfortschritte. Schni", "pk": "CLI", "tc": "IMP"}, {"id": 1689, "title": "JARVIS: Text-to-Speech Qualität verbessern - langsamer sprechen, Zahlen ausschreiben, Sprach-Mix vermeiden", "desc": "Marco hat beobachtet, dass JARVIS beim Sprechen manchmal:\n- Zahlen undeutlich ausspricht\n- Englisch mit Deutsch mischt\n-", "pk": "CLI", "tc": "FEAT"}, {"id": 1686, "title": "SpeechFlow-Backend: Lizenz-Endpoints (activate/verify, Ed25519-signiert) + Auto-Update-Manifest (/api/speechflow/latest)", "desc": "## Ziel\n\nBackend-Gegenstück zum SpeechFlow-Client-Feature (Repo `senity-speech-flow`, project_key `SPEECH`): zwei neue E", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1685, "title": "CLI Web-Chat: lokale Claude-Code-Instanz ohne Container ansprechen (MVP + Tabs + CLI-Call-Tool)", "desc": "## Ziel\n\nDen bestehenden CLI Web-Chat (SDRv4, `/api/cli/servers/[id]/...`) so erweitern, dass er aus dem lokal gestartet", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1684, "title": "chat-personalities: created_at/updated_at in Tabelle anzeigen, sortier- und filterbar", "desc": "## Anforderung\n\nAuf https://sdr.senity.ai/de/chat-personalities sollen die Spalten `created_at` und `updated_at` in der ", "pk": "SDRv4", "tc": "IMP"}, {"id": 1683, "title": "Login-Maske: CSS-Pipeline reparieren + 1:1 nach SDRv4 nachbauen", "desc": "## Symptom\n\nFrontend (`localhost:4000/login`) wurde komplett ungestyled angezeigt (Browser-Default-HTML, kein CSS). Soll", "pk": "SWS", "tc": "BUG"}, {"id": 1682, "title": "Burger Bulle Bestellbot stürzt ab und funktioniert nicht mehr", "desc": "Bug-Report aus Senity Operativ (Telegram).\n\nMelder: Timo (via Chris)\nDatum: 2026-06-04\n\n**Symptom (laut Timo):**\nDer Bur", "pk": "SDRv4", "tc": "BUG"}, {"id": 1681, "title": "Recherche Peptide & Ozempic (Wirkstoffe, Studien, Risiken)", "desc": "## Auftrag (aus Voice 1931, Chris an Daniel-Gespräch)\n\nChris sitzt mit Daniel zusammen und diskutiert Peptide / GLP-1-Ag", "pk": "CORE", "tc": "RESEARCH"}, {"id": 1680, "title": "Markdown-Wiki als persistenter Wissensspeicher (Obsidian-Pattern) evaluieren", "desc": "## Ausgangspunkt\n\nChris hat ueber Voice 1915 nachgefragt, ob Obsidian sinnvoll fuer den Workspace waere. Hintergrund: Ka", "pk": "CORE", "tc": "RESEARCH"}, {"id": 1679, "title": "EU AI Act Compliance Check für alle Senity-Programme", "desc": "Voice 1920 von Chris (2026-06-04):\n\n„Es gibt einen Compliance Checker für den EU AI Act. Da müssen wir unbedingt mal drü", "pk": "CORE", "tc": "RESEARCH"}, {"id": 1678, "title": "Dashboard: Neue Farbveränderungen implementieren", "desc": "Farbschema des Dashboards überarbeiten und modernisieren mit neuen Farbveränderungen. Umsetzung mit hoher Priorität.", "pk": "CLI", "tc": "FEAT"}, {"id": 1677, "title": "Dashboard: Neue Farbveränderungen implementieren", "desc": "Neue Farbschema für das Dashboard. Spezifische Farben und Design-Vorgaben folgen.", "pk": "CLI", "tc": "FEAT"}, {"id": 1676, "title": "Dashboard modernisieren - Design wie im Video-Beispiel", "desc": "Dashboard UI/UX erneuern mit modernerem Design, ähnlich dem in dem Video gezeigten Beispiel vom Jungen. Referenz-Design ", "pk": "CLI", "tc": "FEAT"}, {"id": 1675, "title": "JARVIS: Begrüßung nur beim Morning-Start, nicht bei jedem Aufruf", "desc": "JARVIS soll \"Guten Morgen, ich bin Ihr persönlicher Assistent\" nur einmal am Morgen beim ersten Start sagen. Im Laufe de", "pk": "CLI", "tc": "FEAT"}, {"id": 1674, "title": "JARVIS: ImmoScout24 Baufinanzierung Monitoring - Benachrichtigung bei neuen Anfragen", "desc": "Sobald eine neue Finanzierungsanfrage von ImmoScout24 Baufinanzierung in marco.escribano33@gmail.com ankommt, sofort Mar", "pk": "CLI", "tc": "FEAT"}, {"id": 1673, "title": "JARVIS: Begrüßung beim Aktivieren anpassen", "desc": "Bei jeder Aktivierung von JARVIS soll die Begrüßung lauten: \"Guten Morgen, ich bin Ihr persönlicher Assistent.\"", "pk": "CLI", "tc": "FEAT"}, {"id": 1672, "title": "Monitoring: ImmoScout24 Baufinanzierung E-Mails an 33@gmail.com", "desc": "Marco möchte sofort benachrichtigt werden, sobald eine neue Finanzierungsanfrage von ImmoScout24 Baufinanzierung in sein", "pk": "CLI", "tc": "FEAT"}, {"id": 1671, "title": "JARVIS: Text-to-Speech Engine optimieren für klarere und schnellere Sprachausgabe", "desc": "Optimierung der TTS-Engine für saubere, klare und schnellere Sprachausgabe. Parameter anpassen oder bessere TTS-Engine e", "pk": "CLI", "tc": "FEAT"}, {"id": 1670, "title": "Dashboard: Manuelles Eingabefeld direkt einbinden", "desc": "Marco möchte sein manuelles Eingabe-Dashboard direkt in das JARVIS-Dashboard integrieren. Damit er direkt hier schreiben", "pk": "CLI", "tc": "FEAT"}, {"id": 1669, "title": "CLI-1668 als behoben markieren / schließen", "desc": "Marco hat bestätigt, dass das Problem behoben ist — JARVIS öffnet keine weiteren Fenster mehr beim Aufruf. Ticket CLI-16", "pk": "CLI", "tc": "FEAT"}, {"id": 1668, "title": "JARVIS öffnet bei jedem Aufruf ein neues Fenster statt bestehende Instanz zu nutzen", "desc": "Bei jedem Gespräch mit JARVIS öffnet sich ein neues Fenster, anstatt die bereits laufende Instanz zu verwenden. Der Proz", "pk": "CLI", "tc": "FEAT"}, {"id": 1667, "title": "JARVIS Tool Calls Test erfolgreich", "desc": "", "pk": "CLI", "tc": "FEAT"}, {"id": 1666, "title": "Handbuch erstellen: SDR, Workspace mit/ohne KI, Burger Bulle, Senity Speech Flow (alle Systeme)", "desc": "Übergreifendes Senity-Handbuch nach Anleitung + Fragenkatalog von Timo (per Mail an Chris).\n\nScope (laut Timo, 2026-06-0", "pk": "CORE", "tc": "IMP"}, {"id": 1665, "title": "Aufnahme-UX: Startup-Sound aus, Picker aus, Mini-Logo-Indikator unten rechts", "desc": "User-Wunsch (Owner):\n1. Startup-Stimme (senity.wav, \"Senity\") beim Programmstart entfernen -> startup_sound_enabled Defa", "pk": "SPEECH", "tc": "IMP"}, {"id": 1664, "title": "[Brainstorming] Maus-Button als Hotkey + Toggle-Aufnahme (einmal druecken statt halten)", "desc": "## Ausgangslage\n\nUser moechte (a) einen Maus-Button als Aufnahme-Hotkey vergeben koennen und (b) eine Toggle-Semantik: e", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1663, "title": "Developer-ID-Signierung + Notarisierung fuer macOS-Build (Release-Gate)", "desc": "macOS-Build ist aktuell nur ad-hoc signiert. Auf fremden Macs blockt Gatekeeper (\"Apple konnte nicht ueberpruefen ob fre", "pk": "SPEECH", "tc": "CHO"}, {"id": 1660, "title": "Aufnahme-Pille (Overlay) auf Windows unsichtbar, auf macOS sichtbar", "desc": "## Symptom\n\nDie Aufnahme-Pille (Recording-Overlay, `speechflow/overlay.py`, frameless topmost Toplevel) erscheint auf ma", "pk": "SPEECH", "tc": "BUG"}, {"id": 1659, "title": "KNOWLEDGE: senity-sdrv4-test baut aus Worktree-Bind-Mount, nicht aus Docker-Image", "desc": "## Problem\n\nFixes wurden ins Docker-Image `core-sdrv4:latest` gebaut (Image-Rebuild) und der Container neu gestartet. Tr", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1658, "title": "Architektur-Hardening Backlog (Projekt-Review Codex+Gemini)", "desc": "## Kontext\n\nSammelticket fuer reale, aber nicht-dringende Architektur-Befunde aus dem adversarialen Gesamt-Projekt-Revie", "pk": "SPEECH", "tc": "RESEARCH"}, {"id": 1657, "title": "Audio-/Transkriptions-Pfad: blockierendes IPC aus Audio-Thread loesen", "desc": "## Problem (Gemini KRITISCH 1, Projekt-Review)\n\nIm Audio-/Aufnahme-Pfad laeuft blockierendes IPC (Subprozess-/Netz-I/O) ", "pk": "SPEECH", "tc": "IMP"}, {"id": 1656, "title": "Settings-Subprozess propagiert voice_mode_id nicht live", "desc": "## Problem (Codex, Projekt-Review)\n\nWird voice_mode_id im laufenden Settings-Subprozess geaendert, sieht der Main-Prozes", "pk": "SPEECH", "tc": "IMP"}, {"id": 1655, "title": "Review-Nacharbeiten #1647 (Codex+Gemini adversarial): 7 Verbesserungen", "desc": "## Kontext\n\nAdversariales Review der #1647-Implementierung (getrennter Default-Modus je Aufnahme-Kanal) plus Gesamt-Proj", "pk": "SPEECH", "tc": "IMP"}, {"id": 1654, "title": "Brainstorm: Tree-Search-Pattern für Code-Evolution mit Knowledge-DB", "desc": "Brainstorming-Thread aus Telegram-Voices 1884/1886/1888 mit Chris.\n\n## Ausgangsidee (Chris, Voice 1884)\n\nClaude bekommt ", "pk": "CORE", "tc": "RESEARCH"}, {"id": 1652, "title": "Picker-Overlay und Settings-Dialog laufen bei geteilten Werten auseinander (Sync-Gap + Save-Clobber)", "desc": "## Problem\n\nDie Werte, die das Picker-Overlay anzeigt, und die im Settings-Dialog laufen auseinander. Sie sollen immer d", "pk": "SPEECH", "tc": "BUG"}, {"id": 1651, "title": "KI-Rechtsberatung + Lead-Scraper aus SDRv4 entfernen", "desc": "## Ziel\n\nZwei deprecated Module vollstaendig aus dem SDRv4 entfernen:\n\n1. **KI-Rechtsberatung** (Legal Advice) — `lib/re", "pk": "SDRv4", "tc": "CHO"}, {"id": 1650, "title": "/api/senity-delegator/chat Proxy bauen (Kopie msh-delegator, Senity-Ollama-Upstream)", "desc": "## Kontext\n\nDer Skill `senity-delegator` (murc134/Claude-Skills, im Container unter .claude/skills/intern) soll wie `msh", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1648, "title": "AUTO-WAKEUP Telegram/YouTube-Pipeline laeuft nur im Container, nicht auf Windows-Host", "desc": "## Problem\n\nEin AUTO-WAKEUP wollte die Pipeline ausfuehren: (1) Telegram-Vorab-Text an Chris, (2) Transkript via SDRv4 /", "pk": "CLI", "tc": "KNOWLEDGE"}, {"id": 1647, "title": "Getrennter Default-Modus je Kanal: text_mode_id + voice_mode_id", "desc": "## Ziel\n\nText-Aufnahme (PTT-/Clipboard-Hotkey) und Voice-Aufnahme (Audioausgabe-Hotkey) brauchen unterschiedliche Defaul", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1646, "title": "HTTP /api/chat/tts acquired voiceGpuSemaphore NICHT (nur WS + VRAM-Switch)", "desc": "## Problem\n\nAnnahme war, dass jeder TTS-Pfad den GPU-Semaphor (`voiceGpuSemaphore`, `MAX_GPU_CONCURRENT=1`) belegt und p", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1645, "title": "Shared Workspace Management UI — Member Invite + CLI Key anzeigen", "desc": "Implementierung des im Brainstorming FEAT-1622 genehmigten Designs.\n\n## Was gebaut wird\n\n**Backend:**\n- Neuer Endpoint G", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1644, "title": "IT-Inventar-Modul (it-inventar) vollständig aus SDRv4 entfernen", "desc": "## Ziel\n\nDas Feature-Paket **IT-Inventar** (App `it-inventar`) gehört nicht in SDRv4 und wird vollständig entfernt. Anal", "pk": "SDRv4", "tc": "CHO"}, {"id": 1643, "title": "Schlanker Launcher: Subprozess-Kaltstart durch Lazy-Imports beschleunigen + async Mikrofon-Enumeration", "desc": "## Problem\nDer PyInstaller-Build und python -m speechflow liefen bisher ueber speechflow.main, dessen Top-Level-Importe ", "pk": "SPEECH", "tc": "IMP"}, {"id": 1642, "title": "Chat-Bubble-TTS: hohe Latenz, fuehlt sich nicht wie Streaming an (q3tts buffert evtl. ganzen Satz vor erstem Byte)", "desc": "## Beobachtung (Christoph, verbatim paraphrasiert)\n\nNach dem Rausch-Fix (#1632) ist die Stimme sauber, aber die Wiederga", "pk": "SDRv4", "tc": "BUG"}, {"id": 1641, "title": "Mp3FrameAligner auf q3tts-PCM erzeugt Rauschen (Aligner-Branch fuer Streaming-Provider gaten)", "desc": "## Problem\n\nChat-Bubble-TTS produzierte Rauschen. Symptom: Stimme komplett verrauscht, unverstaendlich. Andere Audio-Pfa", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1640, "title": "Custom-Modus verschwindet nach Neustart (Editor-Save schreibt keine user-Prompt-Datei)", "desc": "## Symptom\n\nUser legt im Mode-Editor einen eigenen Modus an, bekommt ihn als gespeichert angezeigt. Nach App-Beenden + N", "pk": "SPEECH", "tc": "BUG"}, {"id": 1639, "title": "Prompt-Verbesserer: Meta-Prompt entschaerfen + in externe Datei auslagern", "desc": "## Kontext\n\nDer \"Verbessern\"-Button im Mode-Editor (#1629) erzeugt schlechten Output. Bei klarem Input baut der Meta-Pro", "pk": "SPEECH", "tc": "IMP"}, {"id": 1638, "title": "Modus l�sst sich nicht speichern, wenn die ID Umlaute enth�lt (Fehler unsichtbar)", "desc": "## Problem\nIm v45-Build konnte ein neuer Modus im \"Neuer Modus\"-Dialog nicht gespeichert werden. Reproduktion: Name \"�be", "pk": "SPEECH", "tc": "BUG"}, {"id": 1637, "title": "Workspace-Login repariert: falsches Supabase-Backend + fehlender Session-Refresh", "desc": "## Kontext / Wunsch des Users\n\nChristoph wollte sich lokal gegen das SDR-Auth-Backend anmelden und danach ein eigenes lo", "pk": "CORE", "tc": "IMP"}, {"id": 1636, "title": "Modi-Tab: Mode-Editor speichert direkt, globaler Speichern-Button im Modi-Tab ausblenden", "desc": "## Problem / Wunsch (User)\n\nZwei UX-Aergernisse im Settings-Dialog, Bereich „Modi\":\n\n1. Beim Bearbeiten eines Modus und ", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1635, "title": "Build-Migration: eigene user-Prompts (prompts/user/*.md) in neuen Slot mitnehmen", "desc": "## Problem\nDie Versionssprung-Migration (#1624) in scripts/seed_data_dir.py uebernimmt beim neuen Build-Slot nur ausgewa", "pk": "SPEECH", "tc": "IMP"}, {"id": 1634, "title": "google-workspace-mcp `auth` ignoriert MCP-env-Vars, braucht credentials.json", "desc": "## Problem\n\n`npx @danielrosehill/google-workspace-mcp auth` im Terminal bricht ab mit `GoogleAuthError / OAUTH_NOT_CONFI", "pk": "CLI", "tc": "KNOWLEDGE"}, {"id": 1633, "title": "load_config-Migration: DEFAULT_CONFIG fuellt Keys VOR der Migrationslogik, also rohes data pruefen statt cfg", "desc": "## Problem\n\nBeim Umzug der Picker-Combo auf `voice_hotkey` (#1631) schlug `test_load_config_migrates_picker_hotkey_to_vo", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 1632, "title": "Chat-Bubble-TTS Rauschen: Multi-Model-Root-Cause-Analyse (Codec vs Underrun) + Test-Pipeline", "desc": "## Problem\n\nChat-Bubble-TTS (Pfad: SDRv4-990, `/api/chat/tts` mit `stream:true` → `audio/pcm` 24kHz → `StreamingAudioPla", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1631, "title": "Mode-Picker-Hotkey entfernen, shift+cmd auf Audioausgabe legen, PDR-Häkchen zum Default-Output verschieben", "desc": "## Anforderung (User Christoph)\n\n> Also der Modepicker-Hotkey soll komplett raus, und auf der Tastenkombination, wo jetz", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1629, "title": "Modus-Editor: Verbessern-Button optimiert Prompt via LLM (+ Rueckgaengig)", "desc": "Im Modus-Editor (speechflow/settings.py:_open_mode_dialog) soll neben dem Prompt-Feld ein Button \"Verbessern\" sitzen. Be", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1628, "title": "Modus-Editor: Senity-Logo im Fenster-Titel fehlt (blaues CTk-Default-Icon)", "desc": "Im Dialog \"Modus bearbeiten\" / \"Neuer Modus\" (speechflow/settings.py:_open_mode_dialog) zeigt der Fenster-Titel oben lin", "pk": "SPEECH", "tc": "BUG"}, {"id": 1627, "title": "PyInstaller onedir: EXE aus dist starten, nicht aus build (Failed to load Python DLL)", "desc": "## Problem\n\nNach build.bat (PyInstaller --onedir) liegt im Zwischen-Arbeitsordner build\\Senity Speech Flow v<N>\\ ebenfal", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 1626, "title": "google-workspace MCP team-weit verfuegbar machen (self-hosted ins senity-mcps Repo)", "desc": "## Ziel\n\nDen Google-Workspace-MCP (Drive, Gmail, Calendar) team-weit nutzbar machen, ohne Secrets ins Repo zu legen.\n\n##", "pk": "CLI", "tc": "FEAT"}, {"id": 1625, "title": "Picker-Overlay: Default-Output nicht synchron mit Einstellungen", "desc": "## Problem\n\nBeim Testen fiel auf, dass die im Picker-Overlay vor-selektierten Standardeinstellungen (insbesondere der Ou", "pk": "SPEECH", "tc": "BUG"}, {"id": 1624, "title": "Versionssprung verliert User-Config (api_key/voice_id) - seed_data_dir seedet leeren data-Ordner", "desc": "## Problem\n\nSeit #1615 lesen frozen Builds ihre Config aus dem portablen Ordner `<exe-dir>/data/config.json` neben der E", "pk": "SPEECH", "tc": "BUG"}, {"id": 1623, "title": "Forced-Output-Hotkeys: separat bindbare Voice- und Clipboard-Hotkeys (Picker-Bypass)", "desc": "Zwei neue, optionale, standardmaessig deaktivierte Hotkeys zusaetzlich zu PTT und Picker:\n\n- voice_hotkey -> startet PTT", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1622, "title": "[Brainstorming] Shared Workspace Management UI - Member Invite + API Key anzeigen", "desc": "Brainstorming für neues Feature: Member-Einladung und API-Key-Verwaltung im ServerDetailOverlay des SDRv4. User sollen W", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1621, "title": "TTS-Test-Audio im Audio-Tab als Live-Waveform visualisieren", "desc": "## Anforderung (Christoph, 2026-05-31)\n\nWenn im Settings-Audio-Tab die TTS-Probe (Voice-Test) abgespielt wird, soll das ", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1620, "title": "Output-Reversion: Mode-Level output-Override schlaegt default_output - Precedence-Falle", "desc": "## Problem\nGespeicherter Standard-Output (`default_output=paste`, im Picker als \"Einfuegen\" gewaehlt und im Footer als g", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 1619, "title": "Modi aktiv/inaktiv: Settings-UI (Toggle pro Modus im Modi-Tab)", "desc": "## Anforderung\n\nUI-Teil von #1616. Im Settings-Dialog (Modi-Tab, `speechflow/settings.py`) soll pro Modus-Karte ein Akti", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1618, "title": "Output springt zurueck auf Audioausgabe trotz gespeichertem Standard 'Einfuegen'", "desc": "## Symptom (Christoph, 2026-05-31)\n\nDie Speicherung des Output-Status ist nicht korrekt. Sowohl mit Links- als auch mit ", "pk": "SPEECH", "tc": "BUG"}, {"id": 1617, "title": "Voice-Wiedergabe via Escape abbrechen + laufende Wiedergabe stoppbar machen", "desc": "## Anforderung (Christoph, 2026-05-31)\n\nIm Voice-Modus muss eine laufende TTS-Wiedergabe abbrechbar sein, am besten uebe", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1616, "title": "Modi aktiv/inaktiv schaltbar (enabled-Flag pro Modus)", "desc": "## Anforderung\n\nModi sollen einzeln auf aktiv/inaktiv gesetzt werden koennen, ohne sie loeschen zu muessen. Ein deaktivi", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1615, "title": "Portabler data-Ordner neben EXE: config.json + Prompts (system/user, Agent-Style) ausserhalb _internal", "desc": "## Ziel\n\nAlle Laufzeit-Daten (config.json, Prompts, history.db, app.log, Lockfile, Offline-Queue, installation_id) solle", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1614, "title": "Audio-Tab: Mikrofon-Selbsttest mit Aufnahme-Wiedergabe + ASR/Diktat-Transkript", "desc": "## Kontext\n\nTester Timo meldet per WhatsApp-Sprachnachrichten zwei Probleme im laufenden Betrieb:\n\n1. **LLM-Fehlermeldun", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1613, "title": "sdr-local Auth via Voll-Proxy zu SDRv4 (kein eigener Supabase-Zugriff)", "desc": "## Kontext\n\nsenity-sdr-local (neues Workspace-Frontend, localhost:4000) soll sich NICHT mehr direkt gegen Supabase authe", "pk": "CLI", "tc": "FEAT"}, {"id": 1612, "title": "Telemetrie meldet keine Unraisable-Exceptions (cffi-Callback-Crashes gingen am Logging vorbei)", "desc": "## Problem\n\nDer Tray-Crash aus #1611 (WinError 1402 im sounddevice-Callback) ist **nicht** im Logging-System (logs.senit", "pk": "SPEECH", "tc": "IMP"}, {"id": 1611, "title": "Tray-Icon-Crash: WinError 1402 aus Audio-Callback-Thread (pystray nicht thread-safe)", "desc": "## Problem\n\nBeim v38-Smoke-Test ist die App mit einer \"Python-CFFI error\"-MessageBox abgestuerzt:\n\n```\nException ignored", "pk": "SPEECH", "tc": "BUG"}, {"id": 1610, "title": "Mailversand-Fähigkeit: google-workspace-mcp remote anbinden (google-mcp.senity.ai/sse + Bearer-Auth)", "desc": "## Ziel\n\nDer senity-workspace Main-Agent (und perspektivisch Marco + Timo) sollen echte Mails senden koennen, nicht nur ", "pk": "INFRA", "tc": "FEAT"}, {"id": 1609, "title": "google-workspace MCP (Drive/Gmail/Calendar) via OAuth einrichten — lokal + Server", "desc": "## Ziel\n\nVollwertiger Google-Workspace-Zugriff (Drive, Gmail inkl. echtem Send, Calendar) via OAuth-MCP `@danielrosehill", "pk": "CLI", "tc": "CHO"}, {"id": 1608, "title": "Build-Version-Indicator im Settings-Header + identische release ans Logging", "desc": "## Anforderung\nDas Einstellungs-Fenster soll anzeigen, welche Build-Version gerade laeuft. Dieselbe Version muss ans Log", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1607, "title": "Fehler-Telemetrie an logs.senity.ai scharfgeschaltet: Token-Quelle .env.local + gen_telemetry_key.py Build-Hook", "desc": "## Problem\n\nDie App war code-seitig bereits an das Senity-Logging-System (`https://logs.senity.ai`, Endpoint `/api/event", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 1606, "title": "Nachgezogene Migrationen auf Bestands-DB: Schema-Drift, app_module NOT-NULL, Reihenfolge-Artefakt bei RLS-Policies", "desc": "## Problem\n\nBeim Nachziehen alter, blockierter Migrationen (092 + container-manager install.sql + 141) auf eine Bestands", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1605, "title": "Gmail-SMTP-Absender senity.workspace@gmail.com auf dem Server (Online-Instanz) einrichten", "desc": "## Ziel\n\nDer lokale Workspace-Container kann seit Ticket #1506 via Gmail-SMTP als `senity.workspace@gmail.com` senden (A", "pk": "CLI", "tc": "CHO"}, {"id": 1604, "title": "Settings-Toggles: weisse Switch-Kugel unsichtbar auf weissem Hintergrund", "desc": "## Problem\n\nIm Settings-Dialog (General-Tab) sind die CTkSwitch-Toggles (Audio-Cues, Boot-Chime, Settings-Autostart, Zie", "pk": "SPEECH", "tc": "BUG"}, {"id": 1603, "title": "RBAC-Migrationen nutzen nicht-existente Tabellen/Spalten (app_role, capability.code)", "desc": "## Problem\n\nMehrere G8-RBAC-Migrationen wurden gegen ein RBAC-Schema geschrieben, das in der Senity-DB (verifiziert auf ", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1602, "title": "Offene DB-Migrationen (126-148) auf api-sdr-test anwenden", "desc": "## Auftrag\n\nUser: \"Bitte alle Migrationen auf die Datenbank anwenden.\"\n\nTarget via AskUserQuestion geklaert: **api-sdr-t", "pk": "SDRv4", "tc": "CHO"}, {"id": 1601, "title": "Taskbar/Alt-Tab zeigt Python-Logo statt Senity-Logo (fehlende AppUserModelID)", "desc": "## Symptom\n\nUser (Screenshot, Dev-Modus): Taskbar/Alt-Tab-Icon der SpeechFlow-Fenster ist das generische Python-Logo sta", "pk": "SPEECH", "tc": "BUG"}, {"id": 1600, "title": "Verifikation: Docker-Registry-Auto-Update fuer senity-CLI (git.senity.ai)", "desc": "## Kontext\n\nUser-Wunsch: \"auf unserem Server ein Docker-Repo hosten, wo der Kunde sich immer das aktuelle Image zieht, d", "pk": "SDRv5", "tc": "RESEARCH"}, {"id": 1599, "title": "Inno-Setup-Installer (.exe) fuer senity-CLI inkl. Uninstall", "desc": "## Ziel\n\nDer globale `senity`-CLI-Wrapper (`senity-cli/senity.ps1` + `.sh`) soll auf Windows ueber ein richtiges Setup a", "pk": "SDRv5", "tc": "FEAT"}, {"id": 1598, "title": "Push-to-Talk-Latenz: parallele Instanzen (Singleton-Lock versagt) + Cue-Stream pro play()", "desc": "## Symptom\n\nUser-Report (#1576-Folgesession): \"Die Performance ist wirklich nicht gut. Es dauert relativ lange, bis sich", "pk": "SPEECH", "tc": "BUG"}, {"id": 1597, "title": "Logging-System auf Server hosten (Provisioning, DNS, TLS, docker compose)", "desc": "Konkrete Server-Bereitstellung des Logging-/Error-Tracking-Microservice. Christoph hostet selbst. Unterticket zur Deploy", "pk": "LOG", "tc": "CHO"}, {"id": 1596, "title": "Task 12: Konfigurationsseite (.env.local Viewer/Editor, localhost-only)", "desc": "## Aufgabe\n\nLokaler `.env.local` Viewer/Editor fuer senity-sdr-local (Next.js 16). Scope strikt nur `.env.local`, alle K", "pk": "CLI", "tc": "FEAT"}, {"id": 1595, "title": "time-now Skill: Datum/Uhrzeit-Abruf", "desc": "Neuer Skill .claude/skills/time-now/SKILL.md.\n\nLiefert: UTC, Berlin-Lokalzeit (CEST/CET), Wochentag, ISO-8601, Unix-Time", "pk": "CORE", "tc": "FEAT"}, {"id": 1593, "title": "msh-delegator-Skill entfernen, senity-delegator als alleinigen Delegator etablieren", "desc": "Christoph (2026-05-30): 'msh-delegator muss auch raus, stattdessen brauchen wir einen senity delegator der über die seni", "pk": "INFRA", "tc": "FEAT"}, {"id": 1592, "title": "MSH-Spezifika aus Senity-Projekten entfernen (musikproduktion, doccreator, coach, CLAUDE.md)", "desc": "Mission-Starkes-Handwerk-spezifische Inhalte stecken in mehreren Senity-Projekten und müssen raus. Christoph (2026-05-30", "pk": "CORE", "tc": "CHO"}, {"id": 1591, "title": "projects/leadscraper/ komplett aus Workspace entfernen (Raumfabrik/MSH-Altlast)", "desc": "projects/leadscraper/ ist laut eigener CLAUDE.md 'Lead Scraper für Mission Starkes Handwerk', hat keinen Senity-Bezug. C", "pk": "CLI", "tc": "CHO"}, {"id": 1590, "title": "Raumfabrik-Adresse adminki@raumfabrik.de aus Workspace-Defaults entfernen", "desc": "Adresse adminki@raumfabrik.de gehört nicht zu Senity und muss aus allen Workspace-Defaults raus. Christoph (2026-05-30):", "pk": "CLI", "tc": "CHO"}, {"id": 1589, "title": "senity-delegator: Auf Senity-API mit Fallback-Chain umstellen (Ersatz für entfernten msh-delegator)", "desc": "Kontext\n\nAm 2026-05-30 wurde der msh-delegator Skill auf Anweisung von Chris aus dem Workspace entfernt (Voice 1720/1724", "pk": "CLI", "tc": "FEAT"}, {"id": 1588, "title": "check_last_admin_capability() wirft faelschlich bei CASCADE-DELETE von Capabilities (NULL-Name durch deferred Trigger)", "desc": "## Problem\n\nDer Constraint-Trigger `check_last_admin_capability()` auf `role_capability` ist `DEFERRABLE INITIALLY DEFER", "pk": "SDRv4", "tc": "BUG"}, {"id": 1586, "title": "Cluster 2 entfernen: MSH-Spezifika aus Senity-Projekten purgen", "desc": "Auftrag aus Telegram-Voice 1720 (Chris, 2026-05-30): jede Information von Mission Starkes Handwerk aus Workspace und Sen", "pk": "CORE", "tc": "CHO"}, {"id": 1585, "title": "Cluster 1 entfernen: Raumfabrik-Reste aus Workspace und Server purgen", "desc": "Auftrag aus Telegram-Voice 1720 (Chris, 2026-05-30): jede Information von Raumfabrik aus Workspace und Server entfernen.", "pk": "CORE", "tc": "CHO"}, {"id": 1584, "title": "Claude-Zugriff auf logs.senity.ai via curl-Skill (statt MCP)", "desc": "## Ziel\n\nClaude soll in einer Session die Fehler-Issues des Logging-Systems anschauen und\ntriagieren koennen, ohne dass ", "pk": "LOG", "tc": "FEAT"}, {"id": 1583, "title": "Deploy Logging-System auf logs.senity.ai (Production)", "desc": "## Ziel\n\nDen Logging-/Error-Tracking-Microservice (`D:/Devel/NodeJS/SDRv5/logging-system`) produktiv unter `https://logs", "pk": "LOG", "tc": "FEAT"}, {"id": 1582, "title": "Pro-Projekt-API-Keys + service/pid/executable-Tracking + Fingerprint-Trennung + lokale Postgres", "desc": "## Kontext\n\nErste substanzielle Feature-Iteration des Logging-/Error-Tracking-Microservice (`D:/Devel/NodeJS/SDRv5/loggi", "pk": "LOG", "tc": "FEAT"}, {"id": 1581, "title": "Ticket-IDs nie vor dem Anlegen raten: server-vergebene IDs erst aus create_ticket-Response übernehmen", "desc": "## Problem\n\nBeim Anlegen mehrerer verknüpfter Tickets habe ich die ID des noch nicht erstellten Folgetickets im Body/Kom", "pk": "SDRv5", "tc": "KNOWLEDGE"}, {"id": 1580, "title": "claude-local-Launcher: Proxy-Key per E-Mail/Passwort-Login holen statt manueller .env-Eingabe", "desc": "## Ziel\n\nDer claude-local-Launcher (`claude-senity.ps1` / `.sh` / `.bat`) soll den Senity-Chat-Proxy-Key nicht mehr manu", "pk": "SDRv5", "tc": "FEAT"}, {"id": 1579, "title": "Key-Verteilung & Self-Service-Provisioning für Senity-Chat-Proxy / CLI", "desc": "## Zweck\n\nSammel-EPIC für das wiederkehrende Thema **Verteilung, User-Bindung und Self-Service-Provisioning von Senity-C", "pk": "SDRv4", "tc": "EPIC"}, {"id": 1578, "title": "Deferred Constraint-Trigger check_last_admin_capability wirft NULL bei capability-DELETE via CASCADE", "desc": "## Problem\n\n`DELETE FROM capability WHERE name IN (...)` schlaegt fehl mit `23000: Letzte Rolle mit Capability \"<NULL>\" ", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1577, "title": "CLI-Auth-API: Proxy-Key per E-Mail/Passwort-Login statt manueller Aushändigung", "desc": "## Ziel\n\nEin dedizierter SDRv4-Endpoint, über den sich der Senity-Code-Launcher (claude-local, `.ps1`/`.sh`/`.bat`) per ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1576, "title": "Picker-Overlay: \"Als Standard speichern\"-Button persistiert aktuelle Auswahl als Default", "desc": "## Anforderung\n\nOwner-Wunsch: Im Picker-Overlay (Live-Picker waehrend der Aufnahme bzw. ueber Picker-Hotkey/Tray geoeffn", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1575, "title": "Tray- & Overlay-UX: Linksklick öffnet Settings, Overlay-Schnell-Toggle, Picker-während-Aufnahme-Option, Switch→Checkbox", "desc": "## Kontext\n\nDer Press-Overlay-Toggle existiert bereits vollständig (Settings → General → \"Press-Overlay\", `overlay_enabl", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1573, "title": "Machbarkeit: Proxy-Key automatisch per Supabase/SDRv4-Login abrufen statt manueller .env-Eingabe", "desc": "## Frage / Kontext\n\nIm claude-local Docker-Wrapper (`D:/Devel/NodeJS/SDRv5/claude-local`) fragt der Launcher (`claude-se", "pk": "SDRv5", "tc": "RESEARCH"}, {"id": 1572, "title": "Owner-Produktivkonfig als ausgelieferter Default (4 Modi + Umlaut-Prompts)", "desc": "## Ziel\n\nEine frische Installation soll exakt die Owner-Produktivkonfiguration als Default schreiben, statt der bisherig", "pk": "SPEECH", "tc": "IMP"}, {"id": 1571, "title": "Voice/self-hosted Provider nicht im Wallet getrackt: zwei Tracking-Systeme + cost-0-skip", "desc": "## Problem\n\nSenity hat ZWEI getrennte Tracking-Systeme, die leicht verwechselt werden:\n\n1. `ai_usage_monthly` (Admin-Das", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1570, "title": "Pfand-Auszahlungspflicht bei Getränkeverkäufern (Tuttolotto-Laden)", "desc": "Christoph: war in einem Tuttolotto-Laden, der Getränke (Flaschen, Dosen) verkauft. Pfand sollte er in eine Kiste werfen,", "pk": "CORE", "tc": "RESEARCH"}, {"id": 1569, "title": "Auto-generierte Projekt-UIs im Workspace-Frontend (User lässt sich eigene Nutzerinterfaces generieren)", "desc": "## Idee\n\nIm neuen Workspace-Web-Frontend (siehe #1567) soll der User sich pro Projekt eigene Nutzerinterfaces generieren", "pk": "CLI", "tc": "FEAT"}, {"id": 1568, "title": "TTS/ASR-Nutzung wird nicht im Token-Wallet getrackt (nur Chat) - Web + Telegram", "desc": "## Symptom\n\nIm User-Dashboard unter \"TOKEN-VERBRAUCH\" erscheint nur `category='chat'` (Top-Modell: qwen3.6:35b). Trotz i", "pk": "SDRv4", "tc": "BUG"}, {"id": 1567, "title": "[Brainstorming] Neues Workspace-Web-Frontend (Ablösung des bestehenden Next.js-Frontends)", "desc": "## Ausgangslage\n\nDer Senity-Workspace hat bereits ein vollständiges Next.js-16-Frontend (App Router, React 19, Tailwind ", "pk": "CLI", "tc": "IMP"}, {"id": 1566, "title": "Module Veranstaltungen, Termine, Anmeldungen und Terminarten ersatzlos entfernen", "desc": "## Ziel\n\nDie Module **Veranstaltungen** (`event`), **Termine** (`event_session`), **Anmeldungen** (`event_registration`)", "pk": "SDRv4", "tc": "CHO"}, {"id": 1565, "title": "Timos Workflow eingerichtet: Ticketing-Loop + Auto-Git (Commit/Push auf Branch, Auto-Merge aus main)", "desc": "Timos Workflow an Christophs angeglichen, im User-Mode auf Branch timo-mitgrnder.\n\nEingerichtet (2026-05-30):\n\n1) Ticket", "pk": "CORE", "tc": "CHO"}, {"id": 1564, "title": "Installer (Inno Setup/MSI) statt nacktem onedir-ZIP", "desc": "## Problem\n\nAktuelle Verteilung = onedir-Ordner als ZIP. Stolperfalle: User muss den GANZEN Ordner entpacken (nur die `.", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1563, "title": "Auto-Updater: Versionscheck beim Start gegen Release-Ort + Update-Hinweis", "desc": "## Problem\n\nJeder neue Build heisst aktuell \"ZIP neu verschicken\". Fuer ein Team-Tool fehlt ein Update-Weg - User laufen", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1562, "title": "Code-Signing fuer SpeechFlow-EXE (SmartScreen/AV-False-Positive beseitigen)", "desc": "## Problem\n\nDie EXE ist unsigniert. Windows SmartScreen + manche AV-Scanner warnen bei jeder unsignierten EXE, unabhaeng", "pk": "SPEECH", "tc": "CHO"}, {"id": 1561, "title": "EPIC: SpeechFlow out-of-the-box-Distribution (Signing, Updater, Installer)", "desc": "## Ziel\n\nSpeechFlow muss bei JEDEM Team-Mitglied out of the box laufen: Doppelklick, startet, keine AV-/SmartScreen-Warn", "pk": "SPEECH", "tc": "EPIC"}, {"id": 1559, "title": "Settings-Fenster oeffnet im EXE-Build nicht (customtkinter-Assets fehlen) + AV-False-Positive", "desc": "## Symptom\n\nBei Marco und Timo (gebaute Onefile-EXE) oeffnet sich der Mode-Picker, aber das Settings-Fenster nicht. Komm", "pk": "SPEECH", "tc": "BUG"}, {"id": 1558, "title": "Wo liegen Config + Modes lokal: ~/.senity-speechflow/config.json", "desc": "## Problem\nFrage: Wo werden die App-Einstellungen (inkl. Mode-Definitionen) lokal gespeichert?\n\n## Lösung\nAlle Einstellu", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 1557, "title": "Voice Chat-TTS: Audio-Quality-Haertung (24kHz-AudioContext, Raised-Cosine-Fade, adaptives Re-Buffering)", "desc": "## Kontext\nQuality-Verbesserungen aus dem 3-Reviewer-Voice-Streaming-Review (#1552). Diese loesen das Knacken NICHT alle", "pk": "SDRv4", "tc": "IMP"}, {"id": 1556, "title": "Voice Chat-TTS: Saetze server-seitig prefetchen statt sequenzieller Per-Satz-Roundtrips (echter Knack-Fix)", "desc": "## Problem\nDas Chat-Bubble-TTS-Knacken (#1547/#1552) entsteht durch einen garantierten Mehr-Sekunden-Ringbuffer-Underrun", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1555, "title": "Voice Chat-TTS: AudioWorklet-Underrun-Telemetrie (verify-first vor Prefetch-Fix)", "desc": "## Kontext\nFolgeticket aus dem 3-Reviewer-Voice-Streaming-Review (Codex/Gemini/Opus 4.7, dokumentiert in #1552). Bevor d", "pk": "SDRv4", "tc": "IMP"}, {"id": 1554, "title": "Redesign Picker + Aufnahme-Pille + Settings-Modi-Tab im Senity/SDR-V4-Stil", "desc": "## Ziel\n\nDie schwebende/visuelle UI von Speech Flow wird komplett im Senity/SDR-V4-Stil ueberarbeitet. Owner bewertet IS", "pk": "SPEECH", "tc": "IMP"}, {"id": 1553, "title": "Codex CLI `exec` haengt im Hintergrund, wenn Prompt als Argument statt via stdin uebergeben wird", "desc": "## Problem\n\n`codex exec \"$PROMPT\"` als Background-Task (z.B. via Claude-Code Bash `run_in_background` oder eine detached", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 1552, "title": "Chat-Bubble-TTS-Knacken = AudioWorklet-Underrun ohne Fade-Out (nicht Interleaving); zwei Playback-Pfade trennen", "desc": "## Problem\nTTS-Knacken/Rauschen ausschliesslich in den Chat-Bubbles (Auto-Vorlese + manueller Lautsprecher-Button), waeh", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1551, "title": "Modi-Editor: Live-Icon-Vorschau im Mode-Bearbeiten-Dialog", "desc": "## Problem\n\nIm Settings-Dialog (Modi-Tab → Modus bearbeiten) gibt es ein Icon-Feld als Dropdown + Entry, aber keine Vors", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1550, "title": "Overlay/Picker Redesign im Senity-Stil (SDR-V4-Anlehnung) inkl. Codex+Gemini Design-Review", "desc": "## Kontext\n\nDer User bewertet das schwebende UI von Speech Flow (Mode-Picker `picker.py` \"Modus/Output/Kontext\" und Aufn", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1548, "title": "MCP tools.ts: ToolSpec-Generic muss <I extends z.ZodTypeAny> sein, nicht <I=unknown>", "desc": "## Problem\n\nBeim Bau von mail-mcp (gleiches Muster wie ticketing-mcp) warf `npm run typecheck` TS2322 fuer jeden Eintrag", "pk": "STS", "tc": "KNOWLEDGE"}, {"id": 1547, "title": "Chat-Bubble-TTS-Knacken: AudioWorklet-Underrun ohne Fade-Out (kein Interleaving)", "desc": "## Problem\nDie TTS-Wiedergabe rauscht im Browser bei mehrteiligen (>1 Satz) Antworten (#1538). Root-Cause via Roundtrip ", "pk": "SDRv4", "tc": "BUG"}, {"id": 1541, "title": "Mail-MCP (IMAP/SMTP) fuer die KI an alle Senity-Systeme anbinden", "desc": "## Ziel\n\nDie Claude-Code-/senity-code-Instanzen sollen selbst E-Mails lesen und senden koennen (KI-faehig), provider-una", "pk": "STS", "tc": "EPIC"}, {"id": 1538, "title": "TTS-Wiedergabe rauscht im Browser, serverseitiger + JS-Pfad nachweislich sauber (ASR-verifiziert)", "desc": "## Symptom\nTTS liefert im Browser nur noch Rauschen. User-Verdacht: Sample-Rate/Hz-Fehlkonfiguration wie bei einem fruhe", "pk": "SDRv4", "tc": "BUG"}, {"id": 1537, "title": "Frage Senity Modus funktioniert in v19 nicht mehr (Voice-Output stumm)", "desc": "## Symptom\n\nUser-Report v19: Modus \"Frage Senity\" reagiert nach Aufnahme nicht mehr. Kein TTS-Audio, keine Antwort.\nVorh", "pk": "SPEECH", "tc": "BUG"}, {"id": 1536, "title": "G6-X: chat_personality Zugriffspruefung fehlt (visibility/created_by nicht validiert)", "desc": "## Problem\n/api/chat/send laedt chat_personality per createAdminClient() (Service-Role, RLS-Bypass) direkt per personali", "pk": "SDRv4", "tc": "BUG"}, {"id": 1535, "title": "Externe Chat-API: Persoenlichkeit per personalityId + User-API-Key (SSE jetzt, OpenAI-kompat spaeter)", "desc": "## Ziel\nExterne / programmatische Clients sollen den SDR-Chat mit einer bestimmten Chat-Persoenlichkeit nutzen, indem si", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1534, "title": "Paste landet nicht in Notepad++ (vermutlich UIPI/Admin), funktioniert in Claude Code Konsole, WhatsApp, Telegram", "desc": "## Symptom\n\nUser beobachtet, dass SpeechFlow den fertigen Text in einige Ziel-Apps nicht eingefuegt bekommt:\n\n- **Nicht ", "pk": "SPEECH", "tc": "BUG"}, {"id": 1533, "title": "Mode und Output entkoppeln: jeder Mode ist ein Prompt, Output (paste/clipboard/voice) wird eigene Achse", "desc": "## Problem\n\nAktuell klebt `action` (paste | clipboard | voice) am Mode-Objekt. Das verheiratet zwei orthogonale Achsen:\n", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1532, "title": "Waveform Visual Level-Feedback Color-Coding", "desc": "## Problem\n\nWaveform (#1481) zeigt nur Amplitude. Keine visuelle Rueckmeldung ob Pegel optimal (gruen), niedrig (gelb) o", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1531, "title": "History-Detailansicht Raw vs Final Diff", "desc": "## Problem\n\nHistory speichert raw + final (#1509), zeigt aber nur final. User sieht nicht, was die LLM-Korrektur am Orig", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1530, "title": "Adaptive Paste-Delay Calibration", "desc": "## Problem\n\n#1491 hat adaptive Paste-Delay (Base 50ms + 1ms/char, cap 1500ms). Wert ist heuristisch. Auf langsamen Masch", "pk": "SPEECH", "tc": "IMP"}, {"id": 1529, "title": "Audio-Device Heartbeat Signal-Check", "desc": "## Problem\n\nNach Recovery (#1512) kennen wir das neue Device, aber wenn das Device \"stumm\" liefert (z.B. Mute, falscher ", "pk": "SPEECH", "tc": "IMP"}, {"id": 1528, "title": "LLM Dynamic Timeout + Jitter-Retry", "desc": "## Problem\n\nLLM-Timeout ist statisch (8s). Bei langen Diktaten reicht der Timeout nicht, bei kurzen sitzen wir unnoetig.", "pk": "SPEECH", "tc": "IMP"}, {"id": 1527, "title": "VAD-Silence-Trim als ASR-Preprocessing", "desc": "## Problem\n\nAudio enthaelt regelmaessig 1-2 s Stille vor dem ersten Wort und Atem-Pausen mitten im Diktat. Schickt unnoe", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1526, "title": "ASR Initial-Prompt fuer Kontext-Kontinuitaet", "desc": "## Problem\n\nSenity Qwen3-ASR kann mit \"initial_prompt\" optional auf Style/Domain bias werden. Wir senden den nicht. Folg", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1525, "title": "Voice-Mode TTS-Playback-Queue", "desc": "## Problem\n\nIn Voice-Mode (Mode mit TTS-Output) ueberlappen aufeinanderfolgende Playbacks, weil keine Queue. Letzter Job", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1524, "title": "Stop-Path Recorder-Speedup", "desc": "## Problem\n\nRecorder.stop() blockiert auf Stream-Close laenger als noetig. Latenz Release -> Transkription-Start ist 100", "pk": "SPEECH", "tc": "IMP"}, {"id": 1523, "title": "VAD-Icon-Debounce gegen Flackern", "desc": "## Problem\n\nVAD-Indicator (Overlay) wechselt bei kurzen Sprechpausen Frame-fuer-Frame. Optisch unruhig.\n\n## Loesung\n\nDeb", "pk": "SPEECH", "tc": "IMP"}, {"id": 1522, "title": "Contextual LLM Polish History-Awareness", "desc": "## Problem\n\nPolish-Calls behandeln jedes Diktat isoliert. Korrektur-Befehle (\"mach das foermlicher\", \"verkuerze\") koenne", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1521, "title": "Audio Tail-Buffer 300ms nach Release", "desc": "## Problem\n\nRecorder stoppt unmittelbar mit Hotkey-Release. Wenn der User das letzte Wort noch ausspricht, faellt das Ta", "pk": "SPEECH", "tc": "BUG"}, {"id": 1520, "title": "Config atomic write + Recovery aus .bak", "desc": "## Problem\n\n`save_config()` schreibt direkt mit `json.dump(open(path, \"w\"))`. Bei Crash oder Power-Loss mitten im Schrei", "pk": "SPEECH", "tc": "IMP"}, {"id": 1519, "title": "LLM-Output-Guard nach Polish-Step", "desc": "## Problem\n\nLLM-Polish kann pathologische Outputs erzeugen: leer, Meta-Text (\"Ich habe es korrigiert: ...\"), 5x Expansio", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1518, "title": "ASR-Fehler typisieren + transient Retry", "desc": "## Problem\n\n`transcriber.transcribe()` faengt alle Exceptions generisch. Netz-Timeouts, 429 Rate-Limits, 502/503/504 Gat", "pk": "SPEECH", "tc": "IMP"}, {"id": 1517, "title": "Mode-Snapshot pro Diktat-Job (Race-Fix)", "desc": "## Problem\n\nBeim Hotkey-Press wird der aktive Mode aus `self._config` live gelesen. Wenn der User waehrend einer laufend", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1516, "title": "SQLite hat kein ALTER TABLE ADD COLUMN IF NOT EXISTS - PRAGMA-Pattern nutzen", "desc": "## Problem\n\nBei Schema-Migrationen wie #1509 (neue Spalten `final_text`, `mode_id`, `action`, `llm_status` in `transcrip", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 1515, "title": "LLM-Fehler-Toast differenziert (API-Key / Rate-Limit / Netz / Timeout)", "desc": "## Problem\nBei LLM-Fehler im Polish-Pfad ([#1457] / [#1480]) zeigt die App aktuell einen generischen Toast \"Polish fehlg", "pk": "SPEECH", "tc": "IMP"}, {"id": 1514, "title": "Smart-Insert Hybrid-Modus (Typing vs. Pasting fuer kurze Texte)", "desc": "## Problem\nAktuell wird jeder Output via Clipboard + Ctrl+V eingefuegt. Das ist robust, aber: (a) Clipboard-Overwrite is", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1513, "title": "Predictive LLM Pre-Warming bei Hotkey-Press", "desc": "## Problem\nLLM-Polish-Calls haben eine merkbare Latenz (300-1500ms) zwischen ASR-Antwort und Paste, weil die HTTP-Verbin", "pk": "SPEECH", "tc": "IMP"}, {"id": 1512, "title": "Hot-Plug Audio-Device Recovery (Re-Init bei Disconnect)", "desc": "## Problem\nWird das gewaehlte Eingabe-Geraet (`config.input_device`) waehrend die App laeuft entfernt (USB-Mic abgezogen", "pk": "SPEECH", "tc": "BUG"}, {"id": 1511, "title": "Overlay + Toasts Multi-Monitor + DPI-aware", "desc": "## Problem\n`speechflow/overlay.py` und `speechflow/toasts.py` positionieren sich an `winfo_screenwidth()`/`winfo_screenh", "pk": "SPEECH", "tc": "IMP"}, {"id": 1509, "title": "History mit raw_text + final_text + mode_id + action", "desc": "## Problem\nHistory speichert aktuell nur den urspruenglichen ASR-Text (`_history.insert(text=<asr-output>)`). Nach Polis", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1507, "title": "Dev Telegram Bot mit Christophs lokaler Claude-Code-Instanz verbinden", "desc": "Ziel: separater Telegram Bot (Dev-Variante) der Nachrichten direkt an die lokale Claude-Code-Instanz auf Christophs Rech", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1506, "title": "[LOKALE INSTANZ] E-Mail-Adresse senity.workspace@gmail.com einrichten und im lokalen Workspace verankern", "desc": "Referenz: lokale Instanz\nPrio: sehr wichtig (Chris ausdruecklich)\n\n## Auftrag von Chris (Voice 1590, 2026-05-29)\n\nDieses", "pk": "CLI", "tc": "CHO"}, {"id": 1505, "title": "Senity Workspace auch online verfügbar machen (parallel zur lokalen Instanz)", "desc": "Chris hat den Senity Workspace aktuell lokal auf seinem PC laufen (Container, voller Mount-Zugriff). Anforderung: zusätz", "pk": "CORE", "tc": "FEAT"}, {"id": 1504, "title": "adminki@raumfabrik.de als hinterlegte E-Mail überall durch Senity-Adresse ersetzen", "desc": "## Problem\n\nIm Workspace-Kontext (`userEmail`) ist `adminki@raumfabrik.de` als E-Mail-Adresse des AI-Assistenten hinterl", "pk": "senity-code", "tc": "CHO"}, {"id": 1503, "title": "adminki@raumfabrik.de als hinterlegte E-Mail überall durch Senity-Adresse ersetzen", "desc": "## Problem\n\nIm Workspace-Kontext (`userEmail`) ist `adminki@raumfabrik.de` als E-Mail-Adresse des AI-Assistenten hinterl", "pk": "CM", "tc": "CHO"}, {"id": 1502, "title": "adminki@raumfabrik.de als hinterlegte E-Mail überall durch Senity-Adresse ersetzen", "desc": "## Problem\n\nIm Workspace-Kontext (`userEmail`) ist `adminki@raumfabrik.de` als E-Mail-Adresse des AI-Assistenten hinterl", "pk": "FLEX", "tc": "CHO"}, {"id": 1501, "title": "adminki@raumfabrik.de als hinterlegte E-Mail überall durch Senity-Adresse ersetzen", "desc": "## Problem\n\nIm Workspace-Kontext (`userEmail`) ist `adminki@raumfabrik.de` als E-Mail-Adresse des AI-Assistenten hinterl", "pk": "SPEECH", "tc": "CHO"}, {"id": 1500, "title": "adminki@raumfabrik.de als hinterlegte E-Mail überall durch Senity-Adresse ersetzen", "desc": "## Problem\n\nIm Workspace-Kontext (`userEmail`) ist `adminki@raumfabrik.de` als E-Mail-Adresse des AI-Assistenten hinterl", "pk": "INFRA", "tc": "CHO"}, {"id": 1499, "title": "adminki@raumfabrik.de als hinterlegte E-Mail überall durch Senity-Adresse ersetzen", "desc": "## Problem\n\nIm Workspace-Kontext (`userEmail`) ist `adminki@raumfabrik.de` als E-Mail-Adresse des AI-Assistenten hinterl", "pk": "CLI", "tc": "CHO"}, {"id": 1498, "title": "adminki@raumfabrik.de als hinterlegte E-Mail überall durch Senity-Adresse ersetzen", "desc": "## Problem\n\nIm Workspace-Kontext (`userEmail`) ist `adminki@raumfabrik.de` als E-Mail-Adresse des AI-Assistenten hinterl", "pk": "AI", "tc": "CHO"}, {"id": 1497, "title": "adminki@raumfabrik.de als hinterlegte E-Mail überall durch Senity-Adresse ersetzen", "desc": "## Problem\n\nIm Workspace-Kontext (`userEmail`) ist `adminki@raumfabrik.de` als E-Mail-Adresse des AI-Assistenten hinterl", "pk": "STS", "tc": "CHO"}, {"id": 1496, "title": "adminki@raumfabrik.de als hinterlegte E-Mail überall durch Senity-Adresse ersetzen", "desc": "## Problem\n\nIm Workspace-Kontext (`userEmail`) ist `adminki@raumfabrik.de` als E-Mail-Adresse des AI-Assistenten hinterl", "pk": "SDRv5", "tc": "CHO"}, {"id": 1495, "title": "adminki@raumfabrik.de als hinterlegte E-Mail überall durch Senity-Adresse ersetzen", "desc": "## Problem\n\nIm Workspace-Kontext (`userEmail`) ist `adminki@raumfabrik.de` als E-Mail-Adresse des AI-Assistenten hinterl", "pk": "SDRv4", "tc": "CHO"}, {"id": 1494, "title": "adminki@raumfabrik.de als hinterlegte E-Mail überall durch Senity-Adresse ersetzen", "desc": "## Problem\n\nIm Workspace-Kontext (`userEmail`) ist `adminki@raumfabrik.de` als E-Mail-Adresse des AI-Assistenten hinterl", "pk": "CORE", "tc": "CHO"}, {"id": 1493, "title": "Smart-Insert: Hybrid-Modus (Typing fuer kurze Texte)", "desc": "## Problem (Gemini-Review v14)\n\n`speechflow/inserter.py` `paste_text()` macht immer Clipboard+Paste, selbst fuer \"Ja, da", "pk": "SPEECH", "tc": "IMP"}, {"id": 1491, "title": "Paste robuster gegen langsame Ziel-Apps", "desc": "## Problem (Codex-Review v14)\n\n`speechflow/inserter.py` `paste_text()` (~Z. 19-51) stellt das Clipboard nach fixen 100ms", "pk": "SPEECH", "tc": "IMP"}, {"id": 1490, "title": "Wake-Word-Parser im Dispatch verdrahten", "desc": "## Problem (Codex-Review v14)\n\n`speechflow/wake_word.py` `parse_wake_word()` existiert mit fertiger Mode-/Action-Erkennu", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1485, "title": "Readiness-Gate vor Aufnahme (API + Mic Check)", "desc": "## Problem (Codex-Review v14)\n\n`speechflow/main.py` `_on_hotkey_press()` (~Z. 195-249) startet den Recorder ohne zu prue", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1484, "title": "Max-Recording-Dauer + Live-Warnung gegen Endlos-Aufnahme", "desc": "## Problem (Codex-Review v14)\n\n`speechflow/recorder.py` `Recorder._on_chunk()` / `get_wav_bytes()` (~Z. 75-112) wachsen ", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1483, "title": "Transkriptions-Jobs serialisieren (Queue + Sequenz)", "desc": "## Problem (Codex-Review v14)\n\n`speechflow/main.py` `_on_hotkey_release()` (~Z. 282-329) und `_dispatch_action()` (~Z. 1", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1482, "title": "Active-Window-Context als LLM-Prompt-Injection", "desc": "## Problem (Gemini-Review v14)\n\n`speechflow/main.py` `_apply_mode_prompt()` schickt User-Input ohne Wissen ueber die Zie", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1481, "title": "Reaktive Audio-Waveform / Pegelbalken im Overlay", "desc": "## Problem (Gemini-Review v14)\n\nDie Overlay-Pille zeigt aktuell keinen Live-Audio-Pegel. Der Recorder liefert bereits ei", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1480, "title": "Polish-Mode produktisieren: erweiterter System-Prompt", "desc": "## Problem (Codex-Review v14)\n\n`speechflow/config.py` `DEFAULT_MODES` Polish-Eintrag und `_apply_mode_prompt()` in `main", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1479, "title": "Legale TTS-Stimme beschaffen - till_talk = Till Hagen (Kevin-Spacey-Synchronsprecher), kein Lizenzrecht", "desc": "Problem:\n\nDie aktuelle Default-Voice im Senity Voice Studio / Voice Flow heisst `till_talk` und ist eine geklonte Stimme", "pk": "AI", "tc": "BUG"}, {"id": 1478, "title": "pystray update_menu aus Background-Thread nicht thread-safe", "desc": "## Problem\n\n`_reload_config()` wird im daemon-Thread aufgerufen, der `_settings_proc.wait()` macht. Im selben Thread lae", "pk": "SPEECH", "tc": "BUG"}, {"id": 1477, "title": "Voice-Soft-Delete: dangling provider_fallback.voice-Referenzen bereinigen/umbiegen", "desc": "## Problem\n\nBeim Soft-Delete einer Voice (voice_file.deleted_at) bleiben Referenzen in provider_fallback.voice (UUID-Str", "pk": "SDRv4", "tc": "IMP"}, {"id": 1476, "title": "Voice-Mode 502: chat_tts-Fallback zeigt auf geloeschte Voice (tomas), Resolution faellt durch zu Vivian-Preset", "desc": "## Problem\n\nVoice-Mode im SDRv4-Frontend liefert \"TTS API error: 502\" auf /api/chat/tts. Ein externer Python-Client empf", "pk": "SDRv4", "tc": "BUG"}, {"id": 1475, "title": "Boot-Chime delayed: erst nach Tray-Ready abspielen", "desc": "## Problem\nCodex P2 (`main.py:1007`): Chime laeuft direkt nach Prewarm-Threads, vor `tray.run()`. Erster `sounddevice`-P", "pk": "SPEECH", "tc": "IMP"}, {"id": 1474, "title": "Audio-Cues -> \"Hotkey-Sounds\" Rename + LLM-Fehler-Toast deutlicher", "desc": "## Punkte\n- Gemini P2: Toggle \"Audio-Cues\" ist vage. Besser \"Hotkey-Sounds abspielen\".\n- Gemini P2: LLM-Fehler -> Raw-Te", "pk": "SPEECH", "tc": "IMP"}, {"id": 1473, "title": "Window responsive: kleinere minsize + Sidebar-Collapse unter Breakpoint", "desc": "## Problem\nCodex P2 (`settings.py:109`): `860x780` mit `minsize(820, 720)` ist auf 1366x768-Laptops oder 125-150% DPI zu", "pk": "SPEECH", "tc": "IMP"}, {"id": 1472, "title": "Sidebar-Icons: monochrome CTkImage statt Standard-Emojis", "desc": "## Problem\nCodex + Gemini P2: Emoji-Icons (⚙ 🎧 ✨) rendern OS-abhaengig (Win Color-Emoji vs. macOS Apple-Emoji vs. Linux ", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1471, "title": "Sidebar grid sticky=nsw fuellt 208px-Spalte nicht zuverlaessig", "desc": "## Problem\nCodex P2 (`settings.py:135`): Sidebar wird mit `sticky=\"nsw\"` gegrided. Auf manchen DPI-Stufen / Fenstergroes", "pk": "SPEECH", "tc": "BUG"}, {"id": 1470, "title": "Voice-Listing lazy: erst bei Audio-Tab-Open laden, nicht bei Window-Open", "desc": "## Problem\nCodex P2 (`settings.py:1552`): Voices werden 200ms nach Window-Open via `after()` automatisch geladen. Bei je", "pk": "SPEECH", "tc": "IMP"}, {"id": 1469, "title": "Settings-Autostart: First-Run-Flag statt jeden Start", "desc": "## Problem\nCodex + Gemini bemaengeln: Settings-Window oeffnet bei jedem Tray-Start. Power-User finden das invasiv.\n\n## A", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1468, "title": "Startup-Chime respektiert separaten Toggle (startup_sound_enabled)", "desc": "## Problem\n`play_startup()` ignoriert `set_enabled(False)` (siehe `speechflow/sounds.py:195`). Wer Audio-Cues abschaltet", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1467, "title": "Mode-ID Auto-Slugify aus Name (Advanced-Edit nur in Expert-Section)", "desc": "## Problem\nNeuer Mode erfordert manuelle Eingabe einer kebab-case ID. Technische Huerde, bricht UX.\n\n## Vorschlag\n- Mode", "pk": "SPEECH", "tc": "IMP"}, {"id": 1466, "title": "Mic-Empfindlichkeit: 0-100% Skala statt 0.005-0.1 Float", "desc": "## Problem\nDer Empfindlichkeits-Slider zeigt Floats von 0.005 bis 0.1. Normalnutzer koennen damit nichts anfangen.\n\n## V", "pk": "SPEECH", "tc": "IMP"}, {"id": 1465, "title": "LLM-Strict-Wrap optional pro Mode (Kreativ-Modi brauchen Freiheit)", "desc": "## Problem\n`_apply_mode_prompt` haengt hart \"KEIN Vorwort, KEINE Erklaerung, Antworte AUSSCHLIESSLICH gemaess ANWEISUNG\"", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1464, "title": "Hotkey-Capture UX: 8s Timeout + Abbrechen-Button", "desc": "## Problem\nDer Hotkey-Capture-Modus haengt 15s, bis der User aufgibt. Wenn man sich verklickt hat, fuehlt sich das wie e", "pk": "SPEECH", "tc": "IMP"}, {"id": 1463, "title": "Voices auto-refresh nach API-Key-Eingabe (Debounce)", "desc": "## Problem\nWenn der User einen neuen API-Key in den Settings eingibt, bleibt die Voice-Liste leer/stale, bis \"Voices neu", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1462, "title": "Senity HUD: Settings-Dialog Sidebar-Layout statt CTkTabview", "desc": "## Ziel\nSettings-Window haptisch hochwertiger machen: weg vom Standard-CTkTabview, hin zum Senity-HUD-Layout mit Sidebar", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1461, "title": "Startup-Sequenz: senity.wav Boot-Chime + Settings-Autostart", "desc": "## Ziel\nSenity-Branding beim App-Start: senity.wav als Boot-Chime spielen, gleichzeitig Settings-Window oeffnen, damit d", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1460, "title": "Senity-Claude-Proxy ignoriert client-seitigen `system`-Block", "desc": "## Problem\n\nMode-Prompts wirkten im laufenden Build nicht. Beispiel: Polish-Mode-Prompt `\"Schreib immer hallo egal was d", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 1459, "title": "[BUG] TTS: Voice-Mode schneidet Anfang und Ende der Sprachausgabe ab", "desc": "## Problem\n\nUser-Report 2026-05-29: \"Wenn ich den Voice Modus mache, wird am Anfang der Nachricht ein kleiner Teil abges", "pk": "SPEECH", "tc": "BUG"}, {"id": 1458, "title": "[BUG] ASR: Erste Worte bei Diktat-Start werden abgeschnitten (Recorder.start-Latenz)", "desc": "## Problem\n\nUser-Report 2026-05-29: \"Am Anfang wird ein kleiner Teil abgeschnitten.\" Sowohl im `diktat`- als auch im `as", "pk": "SPEECH", "tc": "BUG"}, {"id": 1457, "title": "[SPEECH] LLM-Step fehlt: Mode-Prompt wird nicht auf ASR-Text angewendet", "desc": "## Problem\n\nBuild v9 (Mode-Dispatcher) ruft im voice-Mode `synthesize(text)` mit dem Roh-ASR-Text auf. Die TTS spielt de", "pk": "SPEECH", "tc": "BUG"}, {"id": 1456, "title": "[SPEECH] active_mode_id Dispatch fehlt - main.py ruft immer paste_text()", "desc": "## Problem\n\nUser-Report (Build v9, 2026-05-29): \"Egal welcher Modus aktiv ist, bei mir ist immer Paste.\"\n\nIm Tray-Menue ", "pk": "SPEECH", "tc": "BUG"}, {"id": 1455, "title": "Settings-Dialog: Card-Layout statt vertikalem Stack", "desc": "## Problem\n\nSettings-Tabs (General/Audio/History/Logging/Modi) stapeln Inputs senkrecht ohne visuelle Gruppierung. Dicht", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1454, "title": "Recorder.stop() optimieren: Stream-Close async, WAV-Encoding lazy", "desc": "## Problem\n\n`speechflow/recorder.py:stop()` blockiert 20-80ms beim Schliessen des sounddevice-Streams. Anschliessend wir", "pk": "SPEECH", "tc": "IMP"}, {"id": 1453, "title": "Theme-Tokens: Primary-Scala, Radius- und Shadow-Tokens fuer Premium-Polish", "desc": "## Problem\n\n`speechflow/theme.py` kennt aktuell nur einen Single-Hex pro Rolle (PRIMARY, ACCENT, BG). Keine Scala (50/10", "pk": "SPEECH", "tc": "IMP"}, {"id": 1452, "title": "Tray-Icon: State-Differenzierung Idle/Recording/Processing/Error", "desc": "## Problem\n\nAktuelle Tray-Icons (`speechflow/icons.py`) generieren simple Farb-Kreise programmatisch (gruen/rot/grau). O", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1451, "title": "Voice-Onboarding-Gap: TTS 502 wenn keine Custom-Voice ausgewaehlt", "desc": "## Problem\n\nAudio-Tab behandelt `default_voice_id` als optional, aber das aktuelle Senity-Container-Base-Modell `Qwen3-T", "pk": "SPEECH", "tc": "BUG"}, {"id": 1450, "title": "Toast-Notification-Layer für Failure-States (Recorder/Transcription/Paste)", "desc": "## Problem\n\nDrei kritische Failure-Pfade haben aktuell kein sichtbares User-Feedback:\n- **E1:** Recorder-Start-Failure (", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1449, "title": "Overlay-Pille: echte Capsule + Glow + farbliche State-Differenzierung", "desc": "## Problem\n\nAktuelle Aufnahme-Pille wirkt scharfkantig/rechteckig statt als echte Capsule, kein Glow/Shadow. Recording v", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1448, "title": "paste_text-Restore-Delay blockiert Hot-Thread (100ms perceived latency)", "desc": "## Problem\n\n`speechflow/inserter.py:49` blockiert nach `Ctrl+V` per `time.sleep(0.1)` bevor das ursprüngliche Clipboard ", "pk": "SPEECH", "tc": "BUG"}, {"id": 1447, "title": "Overlay-Leak nach Recorder-Start-Failure (Test-Befund #1446)", "desc": "## Problem\n\nBeim Test-Harness-Aufbau (#1446) ist ein UX-Bug aufgefallen:\n\nWenn `_start_recorder` (Thread, gespawnt von `", "pk": "SPEECH", "tc": "BUG"}, {"id": 1446, "title": "Test-Harness fuer main.py Hot-Path (tests/test_main_hot_path.py) anlegen", "desc": "## Problem\n\n`speechflow/main.py` enthaelt den kritischen Hot-Path (Hotkey-Press -> Recorder -> Transkription -> Paste ->", "pk": "SPEECH", "tc": "IMP"}, {"id": 1445, "title": "input_device Config-Default fehlt (stiller None-Fallback statt explizitem Default-Device)", "desc": "## Problem\n\n`_config.get(\"input_device\")` (in `_on_hotkey_press` nach #1432) gibt bei frischer Config ohne Migration `No", "pk": "SPEECH", "tc": "BUG"}, {"id": 1444, "title": "audio/trial-Bubble-Sounds aufraeumen (eine Signature-Variante pro Cue)", "desc": "## Problem\n\nGemini-Review weist auf `audio/trial/` mit mehreren fast identischen Pop-Sound-Varianten hin. Build-Groesse,", "pk": "SPEECH", "tc": "CHO"}, {"id": 1443, "title": "Mode/Picker/Wake-Word verdrahten oder verstecken (Sichtbarkeit ohne Effekt)", "desc": "## Problem\n\nCodex-Review-Finding (Vereinfachen #1): `active_mode_id`, `speechflow/picker.py`, `speechflow/wake_word.py` ", "pk": "SPEECH", "tc": "RESEARCH"}, {"id": 1442, "title": "Auto-Updater: Hintergrund-Check + In-App-Notification", "desc": "## Problem\n\nAktuell muss der User manuell pruefen ob eine neue `Senity Speech Flow vN.exe` im Gitea-Release oder Senity-", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1441, "title": "Quick-History im Tray-Menue: letzte 3 Transkripte zum Re-Copy", "desc": "## Problem\n\nWenn das Zielfenster den Fokus verliert (z.B. Notification poppt auf), pastet `paste_text` in das falsche Fe", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1440, "title": "Audio Ducking: System-Audio waehrend Aufnahme leiser stellen", "desc": "## Problem\n\nBeim Diktat laeuft Musik/Video oft weiter, fuehrt zu Echo-Interferenz im Mikrofon und User-Ablenkung. Gemini", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1439, "title": "macOS-Polish-Bundle: visibleFrame, Click-through, NSStatusWindowLevel, App-Nap Recovery", "desc": "## Problem\n\nBuild v7 ist Windows-EXE; mehrere macOS-Touchpoints sind im Overlay-Code noch nicht abgedeckt. Codex + Gemin", "pk": "SPEECH", "tc": "IMP"}, {"id": 1438, "title": "Sound-Scapes: Success-Pling + Error-Thud trennen (statt nur On/Off-Cue)", "desc": "## Problem\n\nAktuell spielen `play_on()` (Press) und `play_off()` (Release) - es gibt keinen klanglichen Unterschied zwis", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1437, "title": "Smart Spacing: Space vor/nach Paste pruefen (wortwort + doppelte Spaces vermeiden)", "desc": "## Problem\n\n`paste_text()` schreibt rohen Text per Clipboard+Ctrl+V. Wenn der Cursor mitten in einem Wort steht oder vor", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1436, "title": "Overlay-States: recording (VU) / processing (3-Dot) / success / error visuell trennen", "desc": "## Problem\n\nAktuell (Build v7) wechselt das Overlay nur den Text zwischen \"Aufnahme / laeuft\" und \"Verarbeite / Transkri", "pk": "SPEECH", "tc": "IMP"}, {"id": 1435, "title": "Recorder-Warm-State: sounddevice-Stream im Standby halten statt pro Press neu oeffnen", "desc": "## Problem\n\n`Recorder.start()` ruft pro Hotkey-Press `sd.InputStream(...).start()`. Device-Handshake/Stream-Open kostet ", "pk": "SPEECH", "tc": "IMP"}, {"id": 1434, "title": "Tap-Race: kurzer Hotkey-Tap verliert Aufnahme (_recorder=None bei Release)", "desc": "## Problem\n\n`_on_hotkey_press()` setzt `_hotkey_active=True` synchron, startet aber den `Recorder` in einem Thread. Wenn", "pk": "SPEECH", "tc": "BUG"}, {"id": 1433, "title": "paste_text muss vor _history.insert laufen (sichtbarer Erfolg priorisieren)", "desc": "## Problem\n\nIn `_on_hotkey_press()._transcribe()` (`speechflow/main.py`) wird nach erfolgreicher Transkription erst `_hi", "pk": "SPEECH", "tc": "BUG"}, {"id": 1432, "title": "input_device aus Settings wird nicht an Recorder durchgereicht", "desc": "## Problem\n\n`_on_hotkey_press()` in `speechflow/main.py` baut den `Recorder` ohne `device`-Argument:\n\n```python\nrec = Re", "pk": "SPEECH", "tc": "BUG"}, {"id": 1431, "title": "Failsafe-Timeout im Processing-State: >8s -> \"Server antwortet langsam\", >15s -> Abbruch + Toast", "desc": "## Problem\n\nAus #1410 ausgeklammerter Akzeptanz-Punkt: wenn der ASR-Roundtrip ungewoehnlich lange dauert (Backend laggy,", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1430, "title": "Overlay-Subprozess-IPC: PROCESSING-State braucht finally-Handoff im Worker-Thread", "desc": "## Problem\n\nWenn die Aufnahme-Pille beim Hotkey-Release sofort versteckt wird, sieht der User waehrend des 300-600ms ASR", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 1429, "title": "requests.Session-Prewarm via HEAD gegen Host-Root senkt First-Call-Latenz", "desc": "## Problem\n\n`requests.post(url, ...)` ohne Session-Reuse zahlt bei jedem Call den vollen TCP+TLS-Handshake (~200-800ms R", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 1428, "title": "Contextual Dictation: App-Name des aktiven Fensters als Kontext-Hint an ASR/Polish-LLM", "desc": "## Problem\n\nDiktat in VS Code (Code-Kommentare) braucht anderes Vokabular als Outlook (Business-Floskeln) oder Teams (Ca", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1427, "title": "Custom Dictionary: User-spezifische Begriffe (Namen, Akronyme, Marken) ans ASR-Backend", "desc": "## Problem\n\nEigennamen (Marco, Senity, Qwen3), Tech-Akronyme (PTT, VAD, ASR) und firmenspezifische Begriffe werden vom Q", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1426, "title": "Smart-Correction / Re-Speak: letzte Phrase per neuem Sprachbefehl ueberschreiben", "desc": "## Problem\n\nWenn das Transkript einen Fehler enthaelt (falsches Wort, falsche Zahl), muss der User aktuell:\n\n1. Komplett", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1425, "title": "Hands-Free Toggle-Mode: PTT als Toggle statt Hold (Settings-Switch)", "desc": "## Problem\n\nPTT (Hold-to-Talk) ist ergonomisch problematisch bei langen Diktaten (Email, Memo). Finger ermuedet, Hotkey-", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1424, "title": "Auto-Updater: In-App Update-Check + Download + Apply", "desc": "## Problem\n\nAktuell muss der User manuell zur Gitea-Release-Seite, neue Version laden, alte stoppen, neue starten. Premi", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1423, "title": "Offline-Queue: Aufnahmen bei Netzfehler lokal puffern + Retry", "desc": "## Problem\n\nAktuell bei API-Failure (`speechflow/transcriber.py`): Toast \"Fehler\", Audio weg. User verliert das Diktat k", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1422, "title": "Live-Waveform im Overlay statt statischer Pille", "desc": "## Problem\n\nDas Overlay (`speechflow/overlay.py`) zeigt waehrend der Aufnahme eine statische Pille mit rotierendem Logo.", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1421, "title": "Native Windows-Paste via SendMessage statt PyAutoGUI-Hotkey", "desc": "## Problem\n\n`speechflow/inserter.py:47` nutzt PyAutoGUI fuer Ctrl+V-Emulation. Das kostet ~50-100ms und ist anfaellig fu", "pk": "SPEECH", "tc": "IMP"}, {"id": 1420, "title": "Onboarding-Wizard: First-Run-Setup (Mic-Test, Hotkey-Choose, API-Key, Permission-Walkthrough)", "desc": "## Problem\n\nNeuer User startet die App -> Tray-Icon erscheint, Hotkey ist `ctrl` (kollidiert mit alles), keine API-Key, ", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1419, "title": "History-UI: durchsuchbare Liste der letzten Transkripte (Settings-Tab)", "desc": "## Problem\n\n`speechflow/history.py` schreibt Transkripte in SQLite, aber es gibt kein UI zum Browsen/Suchen. User kann n", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1418, "title": "Local VAD vor ASR-Upload: stille Hintergrund-Trims (Privacy + Latency)", "desc": "## Problem\n\nAktuelles `speechflow/recorder.py` schickt die komplette Aufnahme zum Server. Bei Hotkey-Hold-Patterns gibt ", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1417, "title": "Diff-Preview-Overlay: Transkript vor Paste bestaetigen lassen (Opt-In)", "desc": "## Problem\n\nAktuell wird das Transkript ohne User-Review direkt eingefuegt. Bei kritischen Texten (Email an Vorstand, Co", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1416, "title": "Undo-Hotkey: letzten Paste rueckgaengig + Clipboard-Restore", "desc": "## Problem\n\nBeim Diktieren passieren Fehler (falsche Mode-Wahl, ASR-Halluzination, Cursor-Position nicht erwartet). Aktu", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1415, "title": "Streaming-ASR: Chunked-Upload waehrend Aufnahme statt After-Stop", "desc": "## Problem\n\n`speechflow/transcriber.py` postet das gesamte WAV nach Aufnahmeende. Bei 10s Aufnahme heisst das: 10s Aufna", "pk": "SPEECH", "tc": "RESEARCH"}, {"id": 1414, "title": "Polish-Mode: LLM-Refinement-Pille nach Paste (Professionalisieren, Kuerzen, Listen)", "desc": "## Problem\n\nNach dem Paste ist das Diktat \"fertig\", obwohl User oft Korrektur-Wuensche haben:\n\n- Roh-Diktat ist umgangss", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1413, "title": "Mode-Icons: Icon-Map fuer Picker (statt Text-Strings)", "desc": "## Problem\n\nIm Picker (`settings.py:452` zeigt die Tabellen-Definition, `picker.py` rendert) werden Modi nur als Text-St", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1412, "title": "Font-Tokens in theme.py zentralisieren (Segoe-UI-Hardcodes entfernen)", "desc": "## Problem\n\n`speechflow/overlay.py:175` setzt `font=(\"Segoe UI\", 13, \"bold\")` hardcoded. `theme.py` definiert Farben, ab", "pk": "SPEECH", "tc": "IMP"}, {"id": 1411, "title": "Mode-Picker auf customtkinter migrieren (UI-Kohaerenz mit Settings/Overlay)", "desc": "## Problem\n\n`speechflow/picker.py:27` rendert den Mode-Picker mit pure Tkinter, waehrend Settings + Overlay bereits auf ", "pk": "SPEECH", "tc": "IMP"}, {"id": 1410, "title": "Processing-State im Overlay nach Hotkey-Release (sichtbares Warten waehrend ASR-Roundtrip)", "desc": "## Problem\n\nBeim Loslassen des Hotkeys verschwindet das Aufnahme-Overlay sofort (`speechflow/main.py:83`), waehrend im H", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1409, "title": "HTTP-Keep-Alive + Recorder-Pre-Warm: Perceived Latency um 200-800ms senken", "desc": "## Problem\n\nIm Hot-Path (Hotkey -> Aufnahme -> ASR -> Paste) gibt es drei kalt-gestartete Komponenten, die jeweils 50-30", "pk": "SPEECH", "tc": "IMP"}, {"id": 1408, "title": "TTS Voice-API Endpunkte (SDRv4) -- Referenz fuer Custom-Voice-Cloning mit Base-Modell", "desc": "## Kontext\n\nDas laufende Q3TTS-Modell ist `Qwen/Qwen3-TTS-12Hz-1.7B-Base`. Dieses Modell unterstuetzt **kein Preset-Voic", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1407, "title": "Windows-Build: `cmd /c build.bat` ueber Sub-Shell schluckt Output silent, build laeuft gar nicht", "desc": "## Problem\n\n`cmd /c build.bat` aus einer aufrufenden Shell (Git-Bash / WSL / Bash-Wrapper) ergibt:\n- Exit-Code 0 (faelsc", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 1406, "title": "Settings-UI: stray copy-paste `return` in _build_*_tab crasht erst beim Oeffnen, nicht beim Import", "desc": "## Problem\n\n`speechflow/settings.py` `_build_audio_tab(...)` enthielt am Ende `return result[\"value\"]` (Copy-Paste-Leich", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 1405, "title": "TTS API error: 502 = erschöpfte Fallback-Chain (ExternalServiceError hardcoded 502), nicht Upstream-Down", "desc": "## Problem\n\nBrowser-Console zeigt `TTS API error: 502` (Quelle: `@murc134/ui-kit/dist/index.js` AudioController, `consol", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1404, "title": "Q3ASR-Stream-Bridge: WebSocket faellt sporadisch mit Code 1006 (Reconnect-Flapping)", "desc": "## Symptom\n\nIm Live-ASR faellt der WebSocket zur Q3ASR-Stream-Bridge (Port 8891) sporadisch mit Code 1006 (abnormal clos", "pk": "SDRv4", "tc": "BUG"}, {"id": 1403, "title": "Doppel-VAD-Konflikt bei simuliertem Streaming-ASR: flush-Control + Indikator-Entkopplung", "desc": "## Problem\n\nQ3ASR (Qwen3-ASR) ist ein Batch/Offline-Modell, kein natives Streaming-ASR. Das \"Streaming\" wird durch wiede", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1402, "title": "Live-Probe SDRv4 API: ASR ok, Chat/TTS auth-gesperrt", "desc": "## Auftrag\n\nUser: \"teste die api endpoints chat, tts und asr von dem sdrv4 live von deinem code aus\"\n\nSpeechFlow nutzt p", "pk": "SPEECH", "tc": "RESEARCH"}, {"id": 1401, "title": "Visuelles Redesign: Senity-Window-Icon + Light-Theme (Lila/Magenta)", "desc": "## Ziel\n\nVisuelles Redesign aller customtkinter-Fenster (Settings, History, Picker, Overlay) angelehnt an die SDRv4-Webs", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1400, "title": "ASR-Streaming: kurze Aufnahmen überschreiben sich (Sliding-Window-Partials), nur lange werden korrekt eingefügt", "desc": "## Symptom\n\nIm Live-ASR (Q3ASR-Stream-Bridge) überschreibt sich bei KURZEN Aufnahmen der angezeigte Text wiederholt selb", "pk": "SDRv4", "tc": "BUG"}, {"id": 1399, "title": "Voice-Test-Modus: Settings-Tab \"Audio\" mit Mic-Pegel + ASR-Roundtrip (TTS-Slot pending #1385)", "desc": "## Ziel\n\nTest-Komponente im Settings-Dialog, mit der der User Mikrofon, ASR-Pipeline und (spaeter) TTS-Roundtrip verifiz", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1398, "title": "Doku: MSH-Inferenz auf vLLM (qwen3.6) umstellen in CLAUDE.md / docs", "desc": "## Kontext\n\nUser: \"bitte update deine claude md files dass wir jetzt vllm nutzen. schaue auf den msh server welches mode", "pk": "SDRv4", "tc": "CHO"}, {"id": 1397, "title": "Picker: Context-Override mit Merken-Button", "desc": "## Ziel\n\nMode-Picker-Overlay (#1389) wird erweitert um pro-Aufruf-Context-Override plus Persistierung via \"Merken\"-Butto", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1396, "title": "Multi-Hotkey-Support: PTT + Picker-Trigger parallel", "desc": "## Ziel\n\nHotkeyManager unterstuetzt zwei voneinander unabhaengige globale Hotkey-Combos parallel:\n\n- **PTT-Hotkey** (Def", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1395, "title": "Q3ASR-Bridge WS-URL: Env-Var-Namens-Drift Q3ASR_BRIDGE_WS_URL vs Q3ASR_STREAM_WS_URL (+ falscher Pfad in .env.example)", "desc": "## Problem\n\nLive-ASR (Mikrofon-Streaming im Chat/Voice-Studio) wirft `UPSTREAM_UNAVAILABLE` sowohl lokal als auch in Pro", "pk": "SDRv4", "tc": "KNOWLEDGE"}, {"id": 1394, "title": "Bildschirm-Screenshot als LLM-Context an Mode uebergeben", "desc": "## Ziel\n\nVollbild-Screenshot wird als Bild an Vision-faehigen Mode mitgegeben. User-Flow: \"Hey Senity, was siehst du?\" -", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1393, "title": "Q3ASR-Bridge Autostart-Skills (rebuild + start-dev) + Bridge-Deployment auf Hetzner verifizieren", "desc": "## Kontext\n\nLive-ASR im Chat (TTSChatComposer / useAsrStream) wirft `UPSTREAM_UNAVAILABLE`, weil die Q3ASR-Stream-Bridge", "pk": "SDRv4", "tc": "IMP"}, {"id": 1392, "title": "Markierten Text als LLM-Context an Mode uebergeben", "desc": "## Ziel\n\nWenn User Text markiert hat und Hotkey drueckt, wird die Selection als LLM-Context an Mode-Prompt angehaengt.\n\n", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1391, "title": "Voice-Auswahl pro Mode aus User-Whitelist (TTS-Voice-Picker)", "desc": "## Ziel\n\nDer User soll pro Mode (oder global als Fallback) eine TTS-Stimme auswaehlen koennen. Die Auswahl beschraenkt s", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1390, "title": "tests/test_config.py: right_alt-Default-Annahmen modernisieren (vorbestand)", "desc": "## Problem\n\n`tests/test_config.py::test_default_config_values` und `test_partial_config_fills_defaults` erwarten weiterh", "pk": "SPEECH", "tc": "CHO"}, {"id": 1389, "title": "Picker-Overlay: Mode-Auswahl per Hotkey (Mausrad/Pfeile/Ziffern/Tab)", "desc": "## Scope (Phase 1.3)\n\nZweiter Hotkey (Default `ctrl+shift`) oeffnet ein Picker-Overlay (eigener Subprozess analog #1382 ", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1388, "title": "Wake-Word-Parser: speechflow/wake_word.py (7 Grammatik-Faelle, Fuzzy-Match, Switch-Phrase)", "desc": "## Scope (Phase 1.2)\n\nPure Modul `speechflow/wake_word.py` mit `parse_wake_word(transcript, modes, default_mode_id) -> P", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1387, "title": "Datenmodell: modes[] + default/active mode_id in config.py inkl. Migration", "desc": "## Scope (Phase 1.1)\n\n`speechflow/config.py` um Mode-Datenmodell erweitern. Migration von Alt-Configs ohne `modes`-Schlu", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1386, "title": "Context-Erkennung: Foreground-App als Mode-Hint (cross-platform)", "desc": "## Ziel\n\nSpeechFlow erkennt, in welcher App / welchem Textfeld der Cursor steht, und nutzt das fuer:\n1. **Auto-Mode-Hint", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1385, "title": "SDRv4 Chat-Persoenlichkeit als SpeechFlow-LLM-Backend (Routen, Auth, Schema)", "desc": "## Ziel\n\nKlaeren wie SpeechFlow eine SDRv4-seitige Chat-Persoenlichkeit als LLM-Backend nutzen kann, statt selbst Provid", "pk": "SPEECH", "tc": "RESEARCH"}, {"id": 1384, "title": "Mode-Manager Settings-UI: responsive Cards mit Default-Mode-Marker + Tray-Submenu", "desc": "## Scope\n\nSub-Ticket von #1383. Settings-Oberflaeche fuer CRUD von Modi PLUS Tray-Submenu-Erweiterung fuer schnellen Mod", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1383, "title": "Mode-System: konfigurierbare Voice-Pipelines (Senity-Chat-Persona-Backend)", "desc": "## Vision\n\nSpeechFlow wird zur Voice-Workbench: User legt mehrere Modi an, jeder mit eigenem System-Prompt + Output-Acti", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1382, "title": "Press-Overlay: visuelles Feedback waehrend Hotkey gehalten wird", "desc": "## Problem\n\nDer Tray-Icon-State (`yellow`/`green`/`red`) ist auf Windows oft unsichtbar: das Icon haengt im Overflow-Ber", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1381, "title": "Sound-Toggle + Senity-Theme + Logo-Header für Settings & History", "desc": "## Anforderung\n\nUser wünscht zwei Änderungen am Settings/UI-Layer:\n\n1. **Sound On/Off Toggle:** Schalter in den Settings", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1380, "title": "Hotkey-Mapping erweitern: Windows-Taste, Numpad, Sondertasten + Multi-Key-Combos", "desc": "## Problem\n\nIm Settings-Dialog kann der User aktuell viele Tasten nicht als Hotkey festlegen, obwohl die zugrundeliegend", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1379, "title": "Chris: Term Sheet Abi reviewen (IP, Buy-out, Plattformgebühr) + kianwalt-Prozess anstoßen", "desc": "## Auftrag (Marco an Chris, Telegram Senity Gesellschafter, 2026-05-28)\n\nDas von Timo erstellte Term Sheet (siehe Schwes", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1378, "title": "Timo: Term Sheet Abi-Zusammenarbeit aus 12-Punkte-Feedback bauen", "desc": "## Auftrag (Marco an Timo, Telegram Senity Gesellschafter, 2026-05-28)\n\nDas eigene Dokument \"Abi Zusammenarbeit.docx\" (G", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1377, "title": "EPIC: E-Mail + WhatsApp Outreach-Funnel im Communication Hub (personalisierter Massen-Outreach)", "desc": "## Hintergrund\n\nMarco nutzt aktuell fuer MODULEFORM einen Lead-Funnel, der Kontakte mit Einwilligung generiert. Diese we", "pk": "SDRv4", "tc": "EPIC"}, {"id": 1376, "title": "[CLAUDE.md] knowledge-capture Skill-Referenz in alle NodeJS-Projekt-CLAUDE.md eintragen", "desc": "## Problem\n\nDer globale Skill `knowledge-capture` (~/.claude/skills/knowledge-capture/SKILL.md) und die zugehörige Regel", "pk": "SDRv4", "tc": "CHO"}, {"id": 1375, "title": "Server-side done-Gate: status_code=done erfordert Vorgaenger marco_review (HTTP 400 DONE_REQUIRES_MARCO_REVIEW)", "desc": "## Problem\n\nEin PATCH `/api/tickets/:id` mit `status_code=\"done\"` aus einem anderen Status als `marco_review` (z.B. `rev", "pk": "STS", "tc": "KNOWLEDGE"}, {"id": 1374, "title": "OAuth-Zugriff der Claude-Connectors auf c4rtwork@gmail.com widerrufen", "desc": "## Hintergrund\n\nBeim Setup des Workspace-Google-Accounts (Ticket #1371) lief der erste OAuth-Flow versehentlich auf `c4r", "pk": "CORE", "tc": "CHO"}, {"id": 1373, "title": "Pillow lädt aus Multi-Frame .ico den 8-bpp-Frame statt des 24-bpp-PNG-Frames", "desc": "## Problem\n\nBeim Versuch, eine Windows-`.ico`-Datei mit `PIL.Image.open(path).convert(\"RGBA\")` als Tray-Icon-Basis zu la", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 1372, "title": "Tray-Icon: logo.ico statt programmgenerierter Kreis verwenden", "desc": "## Scope\n\nDas Tray-Icon der App wird aktuell zur Laufzeit als einfacher farbiger Kreis generiert (`speechflow/icons.py::", "pk": "SPEECH", "tc": "FEAT"}, {"id": 1371, "title": "Google-Account für Workspace-Agent einrichten (Mail/Drive/Calendar via MCP)", "desc": "## Ziel\n\nEigener Google-Account für den Senity Workspace-Agent, damit ich (Claude) eigenständig auf Gmail, Google Drive ", "pk": "CORE", "tc": "CHO"}, {"id": 1370, "title": "Windows-Build von senity-speechflow: Python 3.11 nutzen + audio-Asset in build.bat ergänzen", "desc": "## Problem\n\nBeim Aufbau von senity-speechflow auf Windows (von Mac portiert) sind zwei nicht-offensichtliche Stolperstei", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 1369, "title": "EPIC: Notification & Read-Receipt System (Telegram + Multi-Channel)", "desc": "## Ziel\n\nPush-Notifications fuer Ticket-Events an die zugeordneten User. Erster Channel: Telegram. Tracking ob die Info ", "pk": "STS", "tc": "EPIC"}, {"id": 1368, "title": "Neue Status `timo_review` + `marco_review` mit Auto-Assign (Workflow: review → timo_review → marco_review → done)", "desc": "## Ziel\n\nZwei neue Workflow-Schritte fuer mehrstufigen Final-Review.\n\n**Workflow:** `review` (technischer Review) → `tim", "pk": "STS", "tc": "FEAT"}, {"id": 1367, "title": "Globale CLAUDE.md: Session-Start erweitert (User-Filter + Tickets-vs-Prompt-Frage)", "desc": "## Ziel\n\nSession-Start-Listing in der globalen `C:\\Users\\c4rtw\\.claude\\CLAUDE.md` so erweitern, dass:\n\n1. Default-Filter", "pk": "CLI", "tc": "CHO"}, {"id": 1366, "title": "Gitea Deploy Key wird ignoriert, wenn Original-URL statt SSH-Host-Alias benutzt wird", "desc": "## Problem\n\n`git clone ssh://git@git.senity.ai:2200/senity-admin/senity-speechflow.git` schlägt mit `Permission denied (", "pk": "SPEECH", "tc": "KNOWLEDGE"}, {"id": 1365, "title": "KNOWLEDGE: STS DB-Seed hatte lowercase Type-Codes vs. uppercase in Live-DB", "desc": "## Entdeckung (2026-05-26)\n\nBei der Arbeit an Ticket #1358 (KNOWLEDGE-Type einführen) wurde ein Drift zwischen dem Schem", "pk": "STS", "tc": "KNOWLEDGE"}, {"id": 1363, "title": "Inventory + Rollout-Plan für alle 22 NodeJS-Projekte", "desc": "## Scope\n\nInventory aller Projekte unter `D:/Devel/NodeJS` (inkl. SDRv5/*):\n\n**Top-Level:** AI Lawyer, AssalscherLeadScr", "pk": "CLI", "tc": "RESEARCH"}, {"id": 1362, "title": "senity-speech-flow initialisieren (git + CLAUDE.md + project_key SPEECH)", "desc": "## Scope\n\n`D:/Devel/senity-speech-flow` ist aktuell ein leerer Ordner.\n\n- `git init` (main als Default-Branch)\n- `.gitig", "pk": "SPEECH", "tc": "CHO"}, {"id": 1361, "title": "Projekt-Template _TEMPLATE_CLAUDE.md + Init-Skript", "desc": "## Scope\n\nTemplate-Datei `D:/Devel/NodeJS/_TEMPLATE_PROJECT_CLAUDE.md` mit Platzhaltern: `{{PROJECT_KEY}}`, `{{PROJECT_N", "pk": "CLI", "tc": "FEAT"}, {"id": 1360, "title": "Globale ~/.claude/CLAUDE.md: Knowledge-Workflow + Session-Start-Listing + NodeJS-Pflicht", "desc": "## Scope\n\n`C:/Users/c4rtw/.claude/CLAUDE.md` um vier Blöcke erweitern:\n\n1. **Knowledge-Ticket-Workflow:** sobald ich (Cl", "pk": "CLI", "tc": "CHO"}, {"id": 1359, "title": "MCP-Server: KNOWLEDGE im TicketCodeEnum + Build + Restart-Hinweis", "desc": "## Scope\n\n`D:/Devel/NodeJS/SDRv5/senity-mcps/ticketing-mcp/src/tools.ts`:\n\n- `TicketCodeEnum` um `KNOWLEDGE` erweitern\n-", "pk": "CLI", "tc": "FEAT"}, {"id": 1358, "title": "KNOWLEDGE-Ticket-Type im DB-Seed + Live-DB anlegen", "desc": "## Scope\n\n`services/ticketing-system/db/schema.sqlite.sql` und `services/ticketing-system/src/db/schema.sqlite.sql` (Bui", "pk": "STS", "tc": "FEAT"}, {"id": 1357, "title": "EPIC: Knowledge-Ticket-Type + Ticketing-Pflicht für alle D:\\Devel\\NodeJS Projekte", "desc": "## Ziel\n\nNeuen Ticket-Type `KNOWLEDGE` einführen + Ticketing-Pflicht auf alle Projekte unter `D:/Devel/NodeJS` ausweiten", "pk": "STS", "tc": "EPIC"}, {"id": 1356, "title": "Brainstorming: Lokales ASR-Modul fuer Senity Voice Flow (Mega-ASR vs faster-whisper vs Qwen3-ASR)", "desc": "## Idee (Chris, 2026-05-26)\n\nWir koennten den GPU-Server entlasten, indem ein ASR-Modul lokal beim Voice-Flow-Endpunkt l", "pk": "AI", "tc": "RESEARCH"}, {"id": 1355, "title": "Ticket-System: Priorisierungs- und Reihenfolge-Mechanik erweitern (Bugs zuerst)", "desc": "## Kontext\n\nChris hat in Telegram am 2026-05-26 festgehalten: Bug-Tickets sind immer besonders wichtig und müssen zuerst", "pk": "STS", "tc": "FEAT"}, {"id": 1353, "title": "cli-channels send-endpoint liefert INTERNAL_ERROR (500) bei /send", "desc": "## Symptom\n\nDer Workspace bekommt beim Senden von Nachrichten ueber den cli-channels Send-Endpoint (POST /api/cli-channe", "pk": "SDRv4", "tc": "BUG"}, {"id": 1352, "title": "Workspace muss DMs an alle Founder ueber Bot-Channels schicken koennen", "desc": "## Problem\n\nDer senity-workspace hat heute genau einen cli-channel angebunden, naemlich den zu Christoph (channel_id 3c9", "pk": "CORE", "tc": "FEAT"}, {"id": 1351, "title": "Chat-Memory-Service: workspace-tauglicher Lese-Endpoint fuer Chat-Historie", "desc": "## Kontext\n\nTelegram- und Chat-Konversationen aus SDRv4 laufen vollstaendig in die Supabase-DB (cli-channels-Pipeline, s", "pk": "CORE", "tc": "FEAT"}, {"id": 1350, "title": "Chat-Memory-Service: Workspace-Lesezugriff auf SDR-Telegram-History", "desc": "Kontext: Telegram-Chats laufen ueber die SDRv4 cli-channels-Pipeline und werden vollstaendig in der SDR-Supabase persist", "pk": "CORE", "tc": "FEAT"}, {"id": 1349, "title": "Block 4: Senity Voice Desktop (Tray-Client, Whisper-Flow-Konkurrent) (Senity-Strategie)", "desc": "Sub-Ticket zum Epic #1345.\n\n## Kontext\nNativer Desktop-Client (Windows/macOS/Linux) als Tray-Icon. Drei Funktionen:\n1. D", "pk": "CORE", "tc": "RESEARCH"}, {"id": 1348, "title": "Block 3: Token-Oekonomie, Marktplatz, Drittanbieter-Store (Senity-Strategie)", "desc": "Sub-Ticket zum Epic #1345.\n\n## Kontext\nEine einzige interne Waehrung: Senity-Token. Jedes Produkt im Haus wird in Token ", "pk": "CORE", "tc": "RESEARCH"}, {"id": 1347, "title": "Block 2: Plattform-Architektur, Multi-LLM, Persona-Splitting (Senity-Strategie)", "desc": "Sub-Ticket zum Epic #1345.\n\n## Kontext\nHeute haengt der Workspace an CLAUDE.md plus Skill-/Agent-Ordner (Claude-spezifis", "pk": "CORE", "tc": "RESEARCH"}, {"id": 1346, "title": "Block 1: Eintrittstuer / Voucher-only Onboarding (Senity-Strategie)", "desc": "Sub-Ticket zum Epic #1345 (Senity Strategie-Marschroute).\n\n## Kontext\nJeder neue Senity-Nutzer bekommt beim Onboarding s", "pk": "CORE", "tc": "RESEARCH"}, {"id": 1345, "title": "Senity Strategie-Marschroute (Brainstorming Mai 2026)", "desc": "Telegram-Brainstorming zwischen Chris und Claude (Sessions 1328-1383+, Mai 2026), in dem die strategische Marschroute fu", "pk": "CORE", "tc": "EPIC"}, {"id": 1343, "title": "G10 R7 — Docker/Deploy Audit: Token-Leak im Image + Image-Pinning", "desc": "## G10 R7 — Docker/Deploy-Config Audit, Runde 7\n\nSequentielle Audit-Runde nach #1342. Inventory: top-level Dockerfile, d", "pk": "SDRv4", "tc": "CHO"}, {"id": 1342, "title": "G10 R6: scripts/ + Deploy-Skripte Audit-Findings (F44-F53)", "desc": "G10 R6 (Codebase-Audit, Deploy-Skripte + Compose-Restbestand).\n\n## Findings\n\n**F44 (LOW)** — `scripts/ollama-auth-proxy.", "pk": "SDRv4", "tc": "CHO"}, {"id": 1341, "title": "G10 R5 docker-compose Hygiene + Limits + Healthchecks", "desc": "## Kontext\n\nG10 Runde 5: docker-compose.yml (Root), docker/docker-compose.claude-code.yml, docker/docker-compose.orchest", "pk": "SDRv4", "tc": "CHO"}, {"id": 1340, "title": "G10 R4 non-Root Dockerfiles + .dockerignore Hardening", "desc": "## Kontext\n\nG10 Runde 4: docker/Dockerfile.orchestrator + services/cli-workspace/Dockerfile + .dockerignore tiefer.\n\n## ", "pk": "SDRv4", "tc": "CHO"}, {"id": 1339, "title": "G10 R3 Deploy-Config Hardening: Root-Dockerfile + voice-ci Workflow", "desc": "## Kontext\n\nG10 Runde 3 des autonomen Codebase-Audits, Scope Deploy-Config:\n- Root `Dockerfile` (production multi-stage)", "pk": "SDRv4", "tc": "CHO"}, {"id": 1338, "title": "G10 R2 docker/ Hardening: claude-code compose version-Feld + q3asr-bridge non-root", "desc": "## Kontext\n\nG10 Runde 2 des autonomen Codebase-Audits (docker/-Cluster). Inventory aller 6 docker/-Files plus 2 services", "pk": "SDRv4", "tc": "CHO"}, {"id": 1337, "title": "docker-compose.yml Cleanup: JWT-Secret-Default, Node 20, dead ticketing-mount, version deprecated", "desc": "## Kontext\n\nG10 (docker/ + Deploy-Config) R1 Audit. 4 Findings im `docker-compose.yml`.\n\n## Findings\n\n### F1 (CRITICAL, ", "pk": "SDRv4", "tc": "CHO"}, {"id": 1336, "title": "[G9 R7] tests/CLAUDE.md — e2e/-Root-Liste vervollständigen + voice/-Beschreibung erweitern", "desc": "## Kontext\n\nG9 (tests/) R7 Audit-Findings für `tests/CLAUDE.md`:\n\n### Findings\n\n1. **e2e/ Root-Liste unvollständig** (Li", "pk": "SDRv4", "tc": "CHO"}, {"id": 1335, "title": "G9 R6: openapi.test.ts Event/Event-Session Schema-Lookup an i18n-Drift anpassen (Veranstaltung/Termin)", "desc": "## Befund\n\n3 Tests in `tests/lib/openapi.test.ts` schlagen pre-existing fehl. Root-Cause: i18n-Migration in lib/table-co", "pk": "SDRv4", "tc": "BUG"}, {"id": 1334, "title": "G9 R5: tests/CLAUDE.md Zaehl-Drift (180 statt 195 Vitest, 16 statt 17 voice/, 6 statt 5 Sub-Specs)", "desc": "## Befund\n\nG9 R5 (tests/ Audit, 2026-05-26): Drei Zaehl-Drifts in `tests/CLAUDE.md` nach Realitaets-Check.\n\n### F1 Total", "pk": "SDRv4", "tc": "CHO"}, {"id": 1333, "title": "G9 R4: vitest.config.ts Cleanup (Dead @cbr Aliases, tests/load Exclude, Coverage-Block fehlt)", "desc": "## Befund\n\nG9 R4 (tests/ Audit, 2026-05-26): Drei Drift-Punkte in `vitest.config.ts`.\n\n### F1 Dead-Code: `@cbr/*` Aliase", "pk": "SDRv4", "tc": "CHO"}, {"id": 1332, "title": "Sprint-Cleanup: 8 stale Review-Tickets aus Voice-DSGVO/Chat-Stream-Cluster aelter als 7 Tage", "desc": "## Befund\n\nSprint-Manager-Audit 2026-05-26 (Run a29c2d7d): 8 Tickets sind seit mehr als 7 Tagen in `review`, kein Merge-", "pk": "SDRv4", "tc": "CHO"}, {"id": 1331, "title": "G9 R3: tests/CLAUDE.md Doku-Drift bei hooks/ (kein @testing-library/react, nur Helper-Tests)", "desc": "## Befund\n\nG9 R3 Audit (2026-05-26): `tests/CLAUDE.md` Zeile 66-67 behauptet:\n\n> `hooks/` (10) — useKeyboardShortcuts un", "pk": "SDRv4", "tc": "CHO"}, {"id": 1330, "title": "G9 R2 Folge: CurrencyDisplay Async-Race in 3 Tests fixen (await waitFor statt sync getByTestId)", "desc": "## Befund (Folge von #1329)\n\nNach Setup-Fix #1329 laden beide Currency-Tests. 14/17 gruen, 3 mit echter Logik-Problem:\n\n", "pk": "SDRv4", "tc": "BUG"}, {"id": 1329, "title": "G9 R2: tests/components/ui/CurrencyDisplay + lib/currency/currency-context - @testing-library/react fehlt als Dependency", "desc": "## Befund\n\nG9 R2 (vitest.config + Setup-Audit, 2026-05-26): Zwei Test-Files importieren `@testing-library/react`, aber d", "pk": "SDRv4", "tc": "BUG"}, {"id": 1328, "title": "G9 R1: tests/CLAUDE.md Doku-Drift (195 Test-Files, ~25 Sub-Dirs, CLAUDE.md listet nur ~8 Bereiche)", "desc": "## Befund\n\nG9 R1 (tests/ Topographie-Audit, 2026-05-26) zeigt tests/CLAUDE.md beschreibt nur ca. 30% der realen Test-Sui", "pk": "SDRv4", "tc": "CHO"}, {"id": 1327, "title": "Em-Dash-Sweep: 4 Ticket-Descriptions mit Em-Dash-Verstoss", "desc": "## Befund\n\nSprint-Manager-Audit 2026-05-26 hat 4 Ticket-Descriptions mit Em-Dash (`—`) gefunden, verstoesst gegen CLAUDE", "pk": "SDRv4", "tc": "CHO"}, {"id": 1326, "title": "Sprint-Cleanup: 44 Tickets mit metadata.branch=\"dev\" Pseudo-Wert", "desc": "## Befund\n\nSprint-Manager-Audit 2026-05-26 hat 44 Tickets in `in_progress`/`review` mit `metadata.branch=\"dev\"` identifi", "pk": "SDRv4", "tc": "CHO"}, {"id": 1325, "title": "G8 R4: Tier-Plausibilitaets-Review (admin/container-manager/envsys-ui/ki-und-chat)", "desc": "## Kontext\n\nG8 R4 (Manifest-Tier-Audit, 2026-05-26) hat alle 16 apps/*/manifest.json gegen die \"Tier\"-Angaben in apps/*/", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 1324, "title": "G8 R3: apps/*/CLAUDE.md API-Routes-Drift fixen", "desc": "## Kontext\n\nAudit-Folge zu #1323 (G8 R2: CLAUDE.md+manifest Schema-Drift). In R2 wurden DB-Tabellen-Listen pro App vs. m", "pk": "SDRv4", "tc": "CHO"}, {"id": 1323, "title": "G8 D: apps/*/CLAUDE.md Doku-Drift gegen Schema (7 Apps)", "desc": "## G8 Inhaltlicher Drift-Check apps/*/CLAUDE.md vs install.sql / db/001_database_initial.sql\n\nAudit-Befund 2026-05-26 14", "pk": "SDRv4", "tc": "CHO"}, {"id": 1322, "title": "G8 B: apps/*/CLAUDE.md Em-Dash-Sweep (14 Files, 116 Treffer)", "desc": "## Problem\n\nGlobal-CLAUDE.md verbietet Em-Dashes (`—`) explizit auch in Dokumentation:\n\n> \"Niemals den Em-Dash (`—`) ver", "pk": "SDRv4", "tc": "CHO"}, {"id": 1321, "title": "G8 B: apps/it-inventar/CLAUDE.md Doku-Drift gegen install.sql", "desc": "## Problem\n\n`apps/it-inventar/CLAUDE.md` Tabellen-Liste (Zeilen 17-23) driftet gegen die echte Schema-Realitaet in `apps", "pk": "SDRv4", "tc": "CHO"}, {"id": 1320, "title": "Legacy-Storage-Objekte auf Tenant-Praefix migrieren (destruktiv)", "desc": "Folge-Ticket zu #1313 (G8 B-F3).\n\n## Kontext\n\nMit #1313 wurden RLS-Policies + Code-Fix fuer Tenant-Praefix-Pflicht ausge", "pk": "SDRv4", "tc": "CHO"}, {"id": 1317, "title": "G8 C-F5: DSGVO-Doku-Gap in Lead-Apps (Art. 6 Legitimes Interesse fehlt)", "desc": "## Problem\n\nLead-Scraper, vertrieb, legal-advice verarbeiten personenbezogene Daten Dritter ohne Einwilligung (B2B-Konte", "pk": "SDRv4", "tc": "IMP"}, {"id": 1316, "title": "G8 C-F4: scopedReadTables-Allowlist unvollstaendig", "desc": "## Problem\n\n`lib/supabase/crm-rls.ts:scopedReadTables` listet nicht alle Tabellen, die per Owner-Filter laufen sollen. F", "pk": "SDRv4", "tc": "IMP"}, {"id": 1315, "title": "G8 B-F5: Pricing-Tier-Bypass in Media-Apps (kein Token-Wallet-Check)", "desc": "## Problem\n\nimage-generation und youtube-summarizer rufen Generation-Endpoints ohne Token-Wallet-Check auf. User mit lee", "pk": "SDRv4", "tc": "BUG"}, {"id": 1314, "title": "G8 B-F4: voice-studio Manifest-Drift (manifest.json vs. Code-Tools)", "desc": "## Problem\n\n`apps/voice-studio/manifest.json` listet Tools/Permissions/Routes, die nicht mehr im Code existieren oder um", "pk": "SDRv4", "tc": "IMP"}, {"id": 1313, "title": "G8 B-F3: Storage-Bucket-Naming ohne Tenant-Praefix", "desc": "## Problem\n\nMehrere Buckets (image-generation, youtube-summarizer, knowledge) verwenden flache Pfade `{bucket}/{id}.{ext", "pk": "SDRv4", "tc": "IMP"}, {"id": 1312, "title": "G8 B-F2: AppUserId-Filter-Pattern (Media-Apps verwenden inkonsistente Filter-Keys)", "desc": "## Problem\n\nInkonsistenz in Filter-Keys: mal `created_by_user_id`, mal `owner_user_id`, mal `user_id`. Erschwert Code-Re", "pk": "SDRv4", "tc": "IMP"}, {"id": 1311, "title": "G8 A5: apps/_core/MIGRATION_TEMPLATE.md (Pattern fuer apps mit eigenen Types/Sequences/Roles)", "desc": "## Re-Scope 2026-05-26\n\nUrsprungs-Befund \"ticketing-system Uninstall-Leak\" ist **nicht reproduzierbar**:\n\n- `apps/ticket", "pk": "SDRv4", "tc": "IMP"}, {"id": 1310, "title": "G8 A4: agent-db Token-Cache (long-lived Bearer ohne TTL-Refresh)", "desc": "## Problem\n\nagent-db cached den Service-Bearer-Token in einer Module-Level-Variable ohne TTL. Bei Token-Rotation auf dem", "pk": "SDRv4", "tc": "IMP"}, {"id": 1309, "title": "G8 A3: RBAC-Doku-Drift in Batch A (admin, ticketing-system, agent-db, _core)", "desc": "## Problem\n\n`docs/RBAC.md` und die Doku in den Sub-Apps stimmen nicht mit den tatsaechlichen Permission-Checks im Code u", "pk": "SDRv4", "tc": "IMP"}, {"id": 1308, "title": "G8 D-4: RevealDialog Clipboard-Leak (Plaintext im React-State)", "desc": "## Problem\n\n`RevealDialog` (container-manager Secrets-Reveal) haelt Plaintext-Werte im React-State, nachdem User auf \"Ko", "pk": "SDRv4", "tc": "BUG"}, {"id": 1307, "title": "G8 D-3: container-manager Audit-Trail-Gap (kein app_user_id im Action-Log)", "desc": "## Problem\n\nAction-Logs des container-managers (start/stop/restart/exec/inspect) speichern keinen `app_user_id`. Forensi", "pk": "SDRv4", "tc": "IMP"}, {"id": 1306, "title": "G8 A2: Meta-Table RLS-Folge aus G2/G6 (Konfig-Tabellen ohne RLS)", "desc": "## Problem\n\nBatch A (admin, ticketing-system, agent-db, _core) hat mehrere Konfigurations-Tabellen, fuer die G2/G6 RLS e", "pk": "SDRv4", "tc": "IMP"}, {"id": 1305, "title": "G8 C-F3: Lead-Scraper Admin-Client umgeht RLS", "desc": "## Problem (Variation des G1-Patterns)\n\n`app/api/lead-scraper/leads/route.ts` und `app/api/lead-scraper/execute/route.ts", "pk": "SDRv4", "tc": "BUG"}, {"id": 1304, "title": "G8 A1: Em-Dash-Sweep ueber apps/ und Migrations", "desc": "## Problem\n\nBestandscode und Migrations enthalten Em-Dashes (Unicode 2014) in Comments und String-Literals. Verletzt die", "pk": "SDRv4", "tc": "IMP"}, {"id": 1303, "title": "G8 B-F1: Media-RLS-Gap (generated_image, youtube_job, knowledge_document)", "desc": "## Problem (Variation des G2-Patterns)\n\nDrei Media-Tabellen haben RLS aktiviert, aber keine `authenticated`-Policies def", "pk": "SDRv4", "tc": "BUG"}, {"id": 1302, "title": "G8 D-2: Container-Registry Owner-Gap (kein owner_user_id, keine Pre-Action-Checks)", "desc": "## Problem (NEU)\n\n`container_registry` Tabelle hat keine `owner_user_id`-Spalte. Die Handler in `apps/container-manager/", "pk": "SDRv4", "tc": "BUG"}, {"id": 1301, "title": "G8 D-1: RLS USING(true) in it-inventar + container-manager install.sql", "desc": "## Problem (Variation des G2-Patterns)\n\nZwei Sub-App-Installer liefern `USING (true)`-RLS-Policies, d.h. RLS aktiviert a", "pk": "SDRv4", "tc": "BUG"}, {"id": 1300, "title": "G8 C-F2: Sales-Script Cross-Tenant-Write (Body-ID UPDATE ohne Owner-Check)", "desc": "## Problem (NEU, kein direkter Vorgaenger)\n\n`app/api/sales-scripts/summarize/route.ts:28-99` erlaubt UPDATE eines belieb", "pk": "SDRv4", "tc": "BUG"}, {"id": 1299, "title": "G8 C-F1: Deal Multi-Tenant Leak (Service-Role + Body-Trust beim Owner-Reassign)", "desc": "## Problem (Variation des G1-Patterns)\n\nService-Role-Client in `app/api/deals/*` liest und schreibt Deals ohne explizite", "pk": "SDRv4", "tc": "BUG"}, {"id": 1298, "title": "G8: Sub-Apps Audit (apps/) Pattern-Roll-Up", "desc": "## G8 Codebase-Audit: Sub-Apps unter `apps/`\n\nSequenzieller Codebase-Audit G1 bis G10. G8 deckt alle 16 Senity Sub-Apps ", "pk": "SDRv4", "tc": "EPIC"}, {"id": 1297, "title": "G7-P11: hooks/CLAUDE.md Doc-Drift + localStorage Multi-Tab-Sync", "desc": "## Problem\n\n1. `hooks/CLAUDE.md` Tabelle listet 7 Hooks nicht: `useAgentAnalytics`, `useAsrStream`, `useInstalledAppNavE", "pk": "SDRv4", "tc": "CHO"}, {"id": 1296, "title": "G7-P10: Legacy-Hook Dead Code Cleanup (Debounce/LongPress/Resizable)", "desc": "## Problem\n\n3 lokale Hooks werden nirgendwo importiert, weil App auf `@murc134/ui-kit` migriert hat:\n\n- `hooks/useDeboun", "pk": "SDRv4", "tc": "CHO"}, {"id": 1295, "title": "G7-P9: Event-Listener-Cleanup-Luecken (Drag/Timeout)", "desc": "## Problem\n\nGlobale Event-Listener (mousemove, mouseup, setTimeout) werden in Edge-Cases nicht geraeumt: wenn Component ", "pk": "SDRv4", "tc": "BUG"}, {"id": 1294, "title": "G7-P8: Race-Conditions Polling+Realtime + Token-Balance Debit", "desc": "## Problem\n\n1. `useTokenBalance` pollt alle N Sekunden parallel zu Realtime-Subscribe. Bei Debit-Race kann das Polling d", "pk": "SDRv4", "tc": "BUG"}, {"id": 1293, "title": "G7-P7: AbortController-Coverage-Luecken in Fetch-Hooks", "desc": "## Problem\n\nFetch-Calls in Hooks haben keinen AbortController. Bei Unmount oder Dependency-Change laufen Requests weiter", "pk": "SDRv4", "tc": "IMP"}, {"id": 1292, "title": "G7-P6: Stale-Closures + Callback-Ref-Pattern in Realtime-Hooks", "desc": "## Problem\n\nMehrere Hooks registrieren Callbacks in WebSocket/Realtime-Subscriptions, die Stale-Closures auf State erzeu", "pk": "SDRv4", "tc": "BUG"}, {"id": 1291, "title": "G7-P5: Client-Side RBAC-Bypass in Nav-Disclosure", "desc": "## Problem\n\n`useNavDisclosure` und `useInstalledAppNavEntries` filtern Capabilities ausschliesslich client-seitig. Serve", "pk": "SDRv4", "tc": "BUG"}, {"id": 1289, "title": "G7-P3: Consent-Gate fehlt in usePcmCapture (DSGVO Art. 9)", "desc": "## Problem\n\n`hooks/usePcmCapture.ts:62-90` ruft `getUserMedia({ audio: true })` ohne vorherigen Consent-Check. Voice-Auf", "pk": "SDRv4", "tc": "BUG"}, {"id": 1288, "title": "G7-P2: WebSocket/EventSource Cleanup-Leaks in Voice/Streaming-Hooks", "desc": "## Problem\n\nVoice- und Streaming-Hooks schliessen WebSockets/EventSources nicht zuverlaessig bei Unmount, Reconnect oder", "pk": "SDRv4", "tc": "BUG"}, {"id": 1285, "title": "G6-15: Index-Coverage-Audit RLS-Predicates + Enum-vs-CHECK + Smell-Sweep", "desc": "## Performance/Robustness-Sub-Audit\n\n### Sub-Aufgabe A: RLS-Predicate-Indexes (Batch A M8)\nAudit auf `(company_id)` / `(", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 1284, "title": "G6-14: Migrations-Template + Pre-Commit-Lint", "desc": "## Default-Template verhindert Wiederholung von RLS-/GRANT-Lücken\n\n### Begründung\nG6-1 (USING(true) + fehlende RLS) und ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1283, "title": "G6-13: youtube_*-Status-Lookup-Konsolidierung + gdpr_audit_action erweitern", "desc": "## Drei unterschiedliche youtube_*-Status-Enums\n\n### Befund (Batch C M4)\n- `db/110_*.sql:33` `youtube_download_job.statu", "pk": "SDRv4", "tc": "IMP"}, {"id": 1282, "title": "G6-12: Marker-Sweep + MIGRATIONS.md/SCHEMA_STATE.md Doc-Cleanup", "desc": "## Marker-Drift + tote Doc-Files\n\n### Befund A: Fehlende `#ausgeführt`-Marker (Batch C M1)\n- `db/128_2026-05-21-youtube-", "pk": "SDRv4", "tc": "CHO"}, {"id": 1281, "title": "G6-11: Cronjobs 001/003 idempotent + voice-retention batch", "desc": "## pg_cron-Jobs ohne Idempotenz + Voice-Retention blockt INSERTs\n\n### Befund A: 001/003 nicht idempotent (Batch C M5)\n- ", "pk": "SDRv4", "tc": "BUG"}, {"id": 1280, "title": "G6-10: CASCADE auf Audit-Trail durch SET NULL/Soft-Delete ersetzen", "desc": "## Audit-Trail wird mit User-Löschung gelöscht\n\n### Befund (Batch A H6)\n- `db/001_database_initial.sql:9894`: `ai_usage_", "pk": "SDRv4", "tc": "BUG"}, {"id": 1279, "title": "G6-9: Board-Sync-Cron-Job-Cleanup nach #108 drop-board-tables", "desc": "## Orphan-Cron-Jobs feuern täglich ~1776× ins Leere\n\n### Befund (Batch B H3)\n`db/037_sync_cron_jobs.sql` registriert 3 p", "pk": "SDRv4", "tc": "BUG"}, {"id": 1278, "title": "G6-8: Migrations-Duplikat-Prefix-Renumbering (9 Konflikte)", "desc": "## Alphabetische Apply-Order ist ambig\n\n### Befund (Batch B H1)\nAuf Selfhost-Supabase werden Migrationen alphabetisch so", "pk": "SDRv4", "tc": "CHO"}, {"id": 1277, "title": "G6-7: db/2026-03-27-voice-visibility.sql Sonder-File aufräumen", "desc": "## Datums-Prefix-File ohne Nummer mutiert Schema\n\n### Befund (Batch C H5)\n`db/2026-03-27-voice-visibility.sql`: trägt KE", "pk": "SDRv4", "tc": "CHO"}, {"id": 1276, "title": "G6-6: OAuth/API-Tokens verschlüsseln + Key-Rotation-Pfad", "desc": "## DSGVO Art-32: Credentials im Klartext / ohne Rotation\n\n### Befund A: trello_connection unverschlüsselt (Batch A H2)\n`", "pk": "SDRv4", "tc": "BUG"}, {"id": 1275, "title": "G6-5: Voice-Stack 122-127 + 133 auf PROD nachfahren + RLS-Style vereinheitlichen", "desc": "## Voice-Streaming-Stack auf Prod unvollständig + Style-Drift\n\n### Befund A: Pending-Status (Batch C H2+H3)\n- `db/122_20", "pk": "SDRv4", "tc": "BUG"}, {"id": 1274, "title": "G6-4: youtube_translation_job RLS+Policies+GRANTs nachziehen (#138)", "desc": "## DSGVO-Leak: User-Transkripte ohne RLS\n\n### Befund (Batch C H1)\n`db/138_2026-05-24-youtube-translation-job.sql:18-92`:", "pk": "SDRv4", "tc": "BUG"}, {"id": 1273, "title": "G6-3: Schema-weite GRANTs + ALTER DEFAULT PRIVILEGES für Selfhost-Supabase", "desc": "## PostgREST \"permission denied\" auf Selfhost ohne explizite GRANTs\n\n### Befund (Batch A H4, Batch B M1)\n`db/001_databas", "pk": "SDRv4", "tc": "BUG"}, {"id": 1272, "title": "G6-2: SECURITY DEFINER search_path-Hardening Sweep (26+ Functions)", "desc": "## CVE-2018-1058-Klasse: Privilege-Escalation via search_path-Hijack\n\n### Befund (Batch A H3 + Batch B H2)\n26 von 27 SEC", "pk": "SDRv4", "tc": "BUG"}, {"id": 1271, "title": "G6-1: RLS Multi-Tenant-Breach Sweep (USING(true) + fehlende RLS)", "desc": "## Multi-Tenant-Isolation komplett gebrochen\n\n**Status quo:** Effektiv KEINE Multi-Tenant-Trennung. Jeder authenticated ", "pk": "SDRv4", "tc": "BUG"}, {"id": 1269, "title": "[G5-S15] G5-Cleanup-Sammelticket: 23 LOW-Findings (Tests, Comments, Naming, Minor-Hardening)", "desc": "## Problem\n\nSammelticket fuer alle 23 LOW-Findings aus G5-R1, die nicht in S1-S14 abgehandelt sind.\n\n**Orchestrator (A-L", "pk": "SDRv4", "tc": "CHO"}, {"id": 1268, "title": "[G5-S14] Architektur-Smells services/: server.ts-Split + buildPrompt-Dedup + Structured Logging + ESLint-Rules", "desc": "## Problem (Wartbarkeit)\n\n**1. server.ts ~700 Zeilen Mega-Datei**\n- `services/cli-bridge-api/src/server.ts`: Routing, Mi", "pk": "SDRv4", "tc": "CHO"}, {"id": 1267, "title": "[G5-S13] Q3ASR-Client Retry + Timeout-Separation + httpx Connection-Pool + webrtcvad Error-Handling", "desc": "## Problem (Voice-Resilience)\n\n**1. Kein Retry bei Q3ASR-Upstream-Failure (C-M2)**\n- `services/q3asr-stream-bridge/q3asr", "pk": "SDRv4", "tc": "IMP"}, {"id": 1266, "title": "[G5-S12] Stream-Bus Memory-Leak + Encryption-Versioning + File-Manager Index-Map", "desc": "## Problem (Memory + Wartbarkeit)\n\n**1. stream-bus Memory-Leak (B-M4)**\n- `services/cli-bridge-api/src/stream-bus.ts`: M", "pk": "SDRv4", "tc": "IMP"}, {"id": 1265, "title": "[G5-S11] Bridge Error-Detail-Leak + Orchestrator Helmet/CORS + Workspace-App Security-Headers", "desc": "## Problem\n\n**1. Error-Detail-Leak Bridge + Orchestrator (A-M6, B-M1)**\n- `services/cli-orchestrator/src/request-router.", "pk": "SDRv4", "tc": "IMP"}, {"id": 1264, "title": "[G5-S10] Container-Hardening: Init=true + PidsLimit + Git-Token-Persistenz + MIME-Validation", "desc": "## Problem (Container-Defense-in-Depth)\n\n**1. HostConfig fehlt Hardening (A-L3)**\n- `services/cli-orchestrator/src/docke", "pk": "SDRv4", "tc": "IMP"}, {"id": 1263, "title": "[G5-S9] Workspace-Locking + Concurrent-Init/Send Atomic-Guard", "desc": "## Problem (B-M3)\n\n`services/cli-bridge-api/src/workspace-manager.ts:36-58` und `cli-runner.ts:140-170`: zwei parallele ", "pk": "SDRv4", "tc": "BUG"}, {"id": 1262, "title": "[G5-S8] Voice-Bridge Logging-PII (Client-IP-Anonymisierung) + Error-Detail-Maskierung", "desc": "## Problem (DSGVO, Voice-DSGVO-Review-Top-3-Risiko)\n\n**1. Client-IP in jeder Log-Zeile (C-M5)**\n- `services/q3asr-stream", "pk": "SDRv4", "tc": "BUG"}, {"id": 1261, "title": "[G5-S7] Webhook HMAC-Signing + SSRF-Whitelist + SSE-Backpressure/Heartbeat", "desc": "## Problem (Webhook + Streaming)\n\n**1. SSRF in webhook-client (A-M3)**\n- `services/cli-orchestrator/src/webhook-client.t", "pk": "SDRv4", "tc": "IMP"}, {"id": 1260, "title": "[G5-S6] VAD continue_utterance + Partial-Race-Cancellation + Finalize-Cancel", "desc": "## Problem (Voice-Transkript-Korrektheit)\n\n**1. VAD-State-Loss nach Force-Finalize (C-H3)**\n- `services/q3asr-stream-bri", "pk": "SDRv4", "tc": "BUG"}, {"id": 1259, "title": "[G5-S5] Rate-Limit-Schichtung per-IP + per-Token-Hash + Upload-Stream Hard-Limit", "desc": "## Problem (HIGH-MEDIUM, Bypass + DoS)\n\n**1. Rate-Limit nur per workspaceId (A-H2)**\n- `services/cli-orchestrator/src/se", "pk": "SDRv4", "tc": "IMP"}, {"id": 1258, "title": "[G5-S4] JWT algorithms-Allowlist + timingSafeEqual Hash-Pad + unhandledRejection-Shutdown", "desc": "## Problem (Auth/Crypto-Hygiene)\n\n**1. JWT-Verifikation ohne algorithms-Allowlist (A-H3)**\n- `services/cli-orchestrator/", "pk": "SDRv4", "tc": "IMP"}, {"id": 1257, "title": "[G5-S3] q3asr-Bridge WS-Auth + Origin-Check + Idle-Timeout + Control-Payload-Size", "desc": "## Problem (HIGH, Voice-Bridge DoS + DSGVO-Vektor)\n\n**1. WebSocket akzeptiert jeden Connect ohne Auth/Origin (C-H1)**\n- ", "pk": "SDRv4", "tc": "BUG"}, {"id": 1256, "title": "[G5-S2] Mount-Replikation Allowlist + setFolderOwnership-Pfadtiefe + subfolder-Allowlist", "desc": "## Problem (HIGH, drei Path/Mount-Lücken)\n\n**1. Mount-Replikation kann Host-Pfade exfiltrieren (A-H4)**\n- `services/cli-", "pk": "SDRv4", "tc": "BUG"}, {"id": 1255, "title": "[G5-S1] CLI-Runner bypassPermissions-Default + Untrusted Skill/Agent-Content + Prompt-Injection-Schutz", "desc": "## Problem (HIGH, kritischste Schwachstelle der Bridge)\n\nDrei Findings bilden zusammen einen RCE-fähigen Indirect-Prompt", "pk": "SDRv4", "tc": "BUG"}, {"id": 1253, "title": "G4 R1 Cleanup-Sammelticket (TopMenu, NotificationPanel, Drawer-Virt, MediaEditor blob, Index-key, Misc)", "desc": "## Sammlung kleinerer Findings aus G4 R1 (alle MEDIUM/LOW)\n\n### Batch A\n- `components/layout/TopMenu.tsx:630-642` (F5): ", "pk": "SDRv4", "tc": "CHO"}, {"id": 1252, "title": "G4 R1 A11Y-6: Skip-Link + Charts-Alt + Tooltip-Keyboard", "desc": "## Problem\n- Kein Skip-Link \"Zum Hauptinhalt\" am Page-Anfang (`app/[locale]/layout.tsx`/`(dashboard)/layout.tsx`).\n- Rec", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1251, "title": "G4 R1 A11Y-5: Status-Badges + Voice-Mic + Skeletons (Color-Only → Text/Icon/ARIA)", "desc": "## Problem\n- `HardwareStatusBadge`, `HandoverStatusBadge`, `VerdictBadge`, `LogsTable LevelBadge`: Status nur als farbig", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1250, "title": "G4 R1 A11Y-4: prefers-reduced-motion globaler Switch fuer animate-spin/pulse", "desc": "## Problem\n158 Vorkommen von `animate-spin`/`animate-pulse` ohne globalen `prefers-reduced-motion`-Switch. Vestibulaere ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1249, "title": "G4 R1 A11Y-3: Live-Regions fuer Chat/CLI/Job-Streams (aria-live)", "desc": "## Problem\nNur 24 von 246 Component-Files nutzen `aria-live`/`role=status`/`role=alert`. Streaming-Bubbles, CLI-Output u", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1248, "title": "G4 R1 A11Y-2: Forms aria-invalid + aria-describedby + fieldset/legend", "desc": "## Problem\n246 Component-Files, nur 2 Vorkommen von `aria-invalid`/`aria-describedby`. Screen-Reader bekommt kein Feedba", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1247, "title": "G4 R1 A11Y-1: Generisches Modal mit Focus-Trap, ESC, role=dialog, Backdrop-Keyboard", "desc": "## Problem\n15+ Custom-Modals haben `<div onClick={close}>` als Backdrop ohne Keyboard-Equivalent (Tab-Reihenfolge bleibt", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1246, "title": "G4 R1: God-Components Refactor (ChatProvider 1607, KnowledgeBaseManager 1703, AudioPlayer 1057, RechtsberatungPage 1150)", "desc": "## Fundstellen\n- `components/chat/ChatProvider.tsx` (~1607 LOC, Context-Re-Render-Storm)\n- `components/chat/KnowledgeBas", "pk": "SDRv4", "tc": "CHO"}, {"id": 1245, "title": "G4 R1: VoiceConsentDialog Server-Persist (DSGVO-Audit-Trail)", "desc": "## Fundstelle\n`components/voice/VoiceConsentDialog.tsx` (Consent nur in `localStorage` oder UI-State, kein Server-Roundt", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1244, "title": "G4 R1: Senity-Konvention-Sweep (native input/select/a → @murc134/ui-kit + next/Link + DataTable)", "desc": "## Fundstellen\n- `components/lead-scraper/LeadTable.tsx` (eigene Table-Impl statt `@murc134/datatable`)\n- `components/le", "pk": "SDRv4", "tc": "CHO"}, {"id": 1243, "title": "G4 R1: i18n-Coverage-Sweep components/ (hardcoded DE-Strings → useT)", "desc": "## Fundstellen (Stichprobe, gegrept ~50 Vorkommen in components/)\n- `components/chat/PodcastController.tsx`, `ChatTermin", "pk": "SDRv4", "tc": "CHO"}, {"id": 1242, "title": "G4 R1: console.* in Client-Components migrieren auf edge-logger", "desc": "## Fundstellen\n- `components/voice/AsrLiveMicButton.tsx:175, 249` (`console.error`)\n- Diverse weitere `console.*`-Aufruf", "pk": "SDRv4", "tc": "CHO"}, {"id": 1241, "title": "G4 R1: AbortController-Sweep components/ (FkSelect, Drawer, Polling, CliChat)", "desc": "## Fundstellen (gegrept, nicht erschoepfend)\n- `components/ui/selects/FkSelect.tsx` (14 `fetch`-Calls ohne `signal`)\n- `", "pk": "SDRv4", "tc": "CHO"}, {"id": 1240, "title": "G4 R1: RechtsberatungPage Polling-Race (Doppel-Interval) + AbortController fehlt", "desc": "## Fundstellen\n- `components/rechtsberatung/RechtsberatungPage.tsx:296-312` (Polling-Race)\n- `components/rechtsberatung/", "pk": "SDRv4", "tc": "BUG"}, {"id": 1239, "title": "G4 R1: BoardKanban Optimistic DnD ohne Rollback bei Non-2xx", "desc": "## Fundstelle\n`components/boards/BoardKanban.tsx:66-77`\n\n## Problem\nDrag-Drop setzt State sofort auf `newStatus`. Wenn d", "pk": "SDRv4", "tc": "BUG"}, {"id": 1238, "title": "G4 R1: AuthContext Race (fetchUser ohne AbortController) + i18n-Hard-Redirect", "desc": "## Fundstellen\n- `components/auth/AuthContext.tsx:44-65` (fetchUser ohne AbortController)\n- `components/auth/AuthContext", "pk": "SDRv4", "tc": "BUG"}, {"id": 1237, "title": "G4 R1: URL-Sanitisierung Sweep (safeHref-Helper, javascript:-Injection, window.open noopener)", "desc": "## Fundstellen\n- `components/lead-scraper/LeadTable.tsx:171-177` (User-/Scraper-Content, `javascript://example.com` schl", "pk": "SDRv4", "tc": "BUG"}, {"id": 1236, "title": "G4 R1: Admin-Token im sessionStorage (XSS-exfiltrierbar, Privilege-Escalation)", "desc": "## Fundstelle\n`components/logs/LogsTable.tsx:285-310, 345`\n\n## Problem\nAdmin-Token wird im `sessionStorage` unter `logs-", "pk": "SDRv4", "tc": "BUG"}, {"id": 1235, "title": "Epic G4: components/ Extended-Review-Audit (Frontend Security + a11y + Performance)", "desc": "## G4 Scope\n\n`components/`-Tree (alle UI-Komponenten ausserhalb `@murc134/*`-Packages). Audit-Schwerpunkte:\n\n1. **Securi", "pk": "SDRv4", "tc": "EPIC"}, {"id": 1234, "title": "withAuditedHandler-HOF einfuehren (Auth + Cap-Check + Audit-Pflicht via Type-System)", "desc": "## Finding (G3 R7 F26 / Design-Strang)\n\nR5+R6+R7 haben kumuliert ~24 privilegierte Mutations-Routen ohne `logAuditEvent`", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1233, "title": "gdpr_audit_action-Enum erweitern (data_creation, data_shared, data_unshared, password_reset, token_rotation, vram_profile_switch, app_install, app_uninstall)", "desc": "## Finding (G3 R7 F25 + abgeleitet aus R6)\n\n`gdpr_audit_action`-Enum unvollstaendig. F4 (POST data creation) und F13 (Sh", "pk": "SDRv4", "tc": "IMP"}, {"id": 1232, "title": "gdpr_audit_log Retention-Policy fehlt (Art. 5(1)(e) Speicherbegrenzung)", "desc": "## Finding (G3 R7 F23)\n\n`gdpr_audit_log` waechst unbegrenzt. Kein TTL, kein Archivierungsjob. DSGVO Art. 5(1)(e) (Speich", "pk": "SDRv4", "tc": "IMP"}, {"id": 1231, "title": "logAuditEvent-Signatur unvollstaendig (request_id/user_agent/actor_role/resource_path fehlen)", "desc": "## Finding (G3 R7 F21)\n\n`lib/audit.ts:75-82` und `lib/cbr-init.ts:136`: `AuditLogEntry` uebergibt nur `action`/`actorUse", "pk": "SDRv4", "tc": "IMP"}, {"id": 1230, "title": "gdpr_audit_log fehlende Spalten (user_agent, request_id, actor_role, resource_path)", "desc": "## Finding (G3 R7 F20)\n\n`gdpr_audit_log` fehlen 4 Spalten fuer DSGVO-konforme Forensik:\n\n| Spalte | Typ | Zweck | DSGVO-", "pk": "SDRv4", "tc": "IMP"}, {"id": 1229, "title": "[table]-Handler Cap-Granularitaet (manage_users als universelles Write-Gate fuer alle PII-Tabellen)", "desc": "## Finding (G3 R7 F17)\n\n`app/api/[table]/route.ts:210,270` + `[table]/[id]/route.ts:150` haengen alle Schreibwege an `ma", "pk": "SDRv4", "tc": "IMP"}, {"id": 1228, "title": "Address-Cleanup Cap-Drift (manage_users statt delete_addresses)", "desc": "## Finding (G3 R7 F16)\n\n`app/api/addresses/cleanup/route.ts:72` (DELETE) verwendet `manage_users` als Cap-Gate fuer Adre", "pk": "SDRv4", "tc": "BUG"}, {"id": 1227, "title": "Chat-Session Sharing (Participants POST/DELETE) ohne logAuditEvent (PII-Freigabe an Dritte)", "desc": "## Finding (G3 R7 F13+F14)\n\n- **F13** `app/api/chat/sessions/[id]/participants/route.ts:94-211` (POST): Sharing einer Se", "pk": "SDRv4", "tc": "BUG"}, {"id": 1226, "title": "Chat-Session PUT/DELETE ohne logAuditEvent (PII in Chat-Inhalten)", "desc": "## Finding (G3 R7 F11+F12)\n\n- **F11** `app/api/chat/sessions/[id]/route.ts:222-273` (DELETE): cascade-Loeschung Messages", "pk": "SDRv4", "tc": "BUG"}, {"id": 1225, "title": "Addresses DELETE + Bulk-Cleanup ohne logAuditEvent (PII Standortdaten)", "desc": "## Finding (G3 R7 F9+F10)\n\n- **F9** `app/api/addresses/[id]/route.ts:109-137` (DELETE): Single-DELETE ohne Audit\n- **F10", "pk": "SDRv4", "tc": "BUG"}, {"id": 1223, "title": "User-PATCH/PUT ohne logAuditEvent (PII + Rollen-Aenderung ohne Spur)", "desc": "## Finding (G3 R7 F6)\n\n`app/api/users/[id]/route.ts:101-328` (PATCH/PUT) updated PII (E-Mail, Telefon, Geburtsdatum, Adr", "pk": "SDRv4", "tc": "BUG"}, {"id": 1222, "title": "User-DELETE (Art. 17) ohne logAuditEvent (Account-Loeschung ohne Rechenschaftsspur)", "desc": "## Finding (G3 R7 F5)\n\n`app/api/users/[id]/route.ts:343-379` (DELETE) ruft `supabase.auth.admin.deleteUser(authUserId)` ", "pk": "SDRv4", "tc": "BUG"}, {"id": 1221, "title": "Generischer [table]-Handler ohne logAuditEvent (POST/PUT/PATCH/DELETE fuer 9 PII-Tabellen)", "desc": "## Finding (G3 R7 F1-F4)\n\n`app/api/[table]/route.ts` + `app/api/[table]/[id]/route.ts` (generischer CRUD) hat 0 `logAudi", "pk": "SDRv4", "tc": "BUG"}, {"id": 1220, "title": "gdpr_audit_log: keine RLS-Policy fuer Art. 15 Self-Read (User kann eigene Audit-Eintraege nicht direkt einsehen)", "desc": "## Finding (G3 R6 F12)\n\n`db/001_database_initial.sql:12239,12651-12652`: `gdpr_audit_log` hat RLS enabled, aber nur \"Ser", "pk": "SDRv4", "tc": "BUG"}, {"id": 1219, "title": "gdpr_audit_log Tabelle hat KEINEN Append-Only-Schutz (UPDATE/DELETE moeglich, Audit forensisch wertlos)", "desc": "## Finding (G3 R6 F11)\n\n`db/001_database_initial.sql:3304-3313` (Tabellen-Definition) + `:12239` (RLS aktiviert, nur Ser", "pk": "SDRv4", "tc": "BUG"}, {"id": 1218, "title": "License-Creation (POST /api/licenses) ohne logAuditEvent (Lizenz-Pool-Manipulation nicht nachvollziehbar)", "desc": "## Finding (G3 R6 F10)\n\n`app/api/licenses/route.ts:93-148` (POST) erstellt `license` + `license_included_item`. Cap-Gate", "pk": "SDRv4", "tc": "BUG"}, {"id": 1217, "title": "Apps Install/Uninstall ohne logAuditEvent (cleanDatabase=true ist faktische DSGVO-Loeschung)", "desc": "## Finding (G3 R6 F9)\n\n`app/api/apps/[id]/install/route.ts:10-30` + `uninstall/route.ts:14-48` delegieren an `installApp", "pk": "SDRv4", "tc": "BUG"}, {"id": 1216, "title": "text-transform-actions Mutationen ohne logAuditEvent (Chat-Output-Maskierung manipulierbar)", "desc": "## Finding (G3 R6 F8)\n\n`app/api/text-transform-actions/route.ts` (POST) + `[id]/route.ts` (PUT/DELETE) mutieren `text_tr", "pk": "SDRv4", "tc": "BUG"}, {"id": 1215, "title": "Translations-Mutationen + i18n-File-Writes ohne logAuditEvent (Rollen-Namen-Verschleierung)", "desc": "## Finding (G3 R6 F7)\n\n`app/api/translations/route.ts:194-241` (PATCH) + `[id]/route.ts` PATCH updaten `translations` JS", "pk": "SDRv4", "tc": "BUG"}, {"id": 1214, "title": "VRAM-Profil-Switch (POST /api/voice/vram-profile) ohne logAuditEvent (Voice-Stack-Wechsel ohne Spur)", "desc": "## Finding (G3 R6 F6)\n\n`app/api/voice/vram-profile/route.ts:62-83` (POST) wechselt VRAM-Profil (System-weite GPU-Stack-A", "pk": "SDRv4", "tc": "BUG"}, {"id": 1213, "title": "Globale Settings (PUT /api/settings) ohne logAuditEvent + falsches Cap-Gate (manage_users statt manage_settings)", "desc": "## Finding (G3 R6 F5)\n\n`app/api/settings/route.ts:45-136` (PUT) aendert `chat_global_config` Singleton (`id=1`): `global", "pk": "SDRv4", "tc": "BUG"}, {"id": 1212, "title": "Role-Nav-Permissions PUT ohne logAuditEvent (inkonsistent zu role-capabilities)", "desc": "## Finding (G3 R6 F4)\n\n`app/api/role-nav-permissions/route.ts:43-106` (PUT) macht DELETE + INSERT auf `role_nav_permissi", "pk": "SDRv4", "tc": "BUG"}, {"id": 1211, "title": "API-Token-Regeneration ohne logAuditEvent (Session-Invalidierung ohne Spur)", "desc": "## Finding (G3 R6 F3)\n\n`app/api/users/[id]/regenerate-token/route.ts:1-60` erzeugt neuen API-Token und ueberschreibt `to", "pk": "SDRv4", "tc": "BUG"}, {"id": 1210, "title": "Passwort-Reset (POST /api/users/[id]/reset-password) ohne logAuditEvent", "desc": "## Finding (G3 R6 F2)\n\n`app/api/users/[id]/reset-password/route.ts:1-60` setzt Passwort eines fremden Users via `supabas", "pk": "SDRv4", "tc": "BUG"}, {"id": 1209, "title": "User-Anlage (POST /api/users) ohne logAuditEvent (Art. 5(2) Rechenschaftspflicht)", "desc": "## Finding (G3 R6 F1)\n\n`app/api/users/route.ts:179-376` (POST) erstellt Auth-User via `supabase.auth.admin.createUser`, ", "pk": "SDRv4", "tc": "BUG"}, {"id": 1208, "title": "app/(dashboard)/dsgvo/page.tsx liegt ausserhalb [locale]/ und ist effektiv tot (404 nach Locale-Redirect)", "desc": "## Finding (G3 R5 F7)\n\n`app/(dashboard)/dsgvo/page.tsx:1` liegt unter `app/(dashboard)/`, NICHT unter `app/[locale]/(das", "pk": "SDRv4", "tc": "BUG"}, {"id": 1207, "title": "gdpr/delete/[userId]: Path-Traversal-Schutz via process.cwd() zu schwach (Projekt-Dateien loeschbar)", "desc": "## Finding (G3 R5 F6)\n\n`app/api/gdpr/delete/[userId]/route.ts:77-79`:\n```ts\nconst absolutePath = path.resolve(process.cw", "pk": "SDRv4", "tc": "BUG"}, {"id": 1206, "title": "gdpr/delete/[userId]: Voice-File Filesystem-Delete schluckt Fehler still (Art. 17 Loeschungs-Luecke)", "desc": "## Finding (G3 R5 F5)\n\n`app/api/gdpr/delete/[userId]/route.ts:75-85`: Schleife `for (const storagePath of allPaths)` loe", "pk": "SDRv4", "tc": "BUG"}, {"id": 1205, "title": "Privileged Mutations-Routen ohne logAuditEvent (users/tokens/capabilities)", "desc": "## Finding (G3 R5 F4)\n\nGrep `logAuditEvent` in `app/api/users/` und `app/api/tokens/` ergibt 0 Treffer trotz privilegier", "pk": "SDRv4", "tc": "BUG"}, {"id": 1204, "title": "consent_log: append-only nur Konvention, RLS FOR ALL erlaubt UPDATE/DELETE durch Admin", "desc": "## Finding (G3 R5 F3)\n\n`db/001_database_initial.sql:3036,12193,12396` (Tabelle, RLS-Enable, Policy).\n\n- `consent_log` is", "pk": "SDRv4", "tc": "BUG"}, {"id": 1203, "title": "execute_retention_cleanup schreibt keinen gdpr_audit_log (Art. 5(2)/30 Nachweispflicht verletzt)", "desc": "## Finding (G3 R5 F2)\n\n`db/001_database_initial.sql:871-902`: Funktion fuehrt `DELETE FROM <table>` aus, updated `retent", "pk": "SDRv4", "tc": "BUG"}, {"id": 1202, "title": "execute_retention_cleanup mit GRANT ALL fuer anon/authenticated (unauth. DELETE-Trigger via PostgREST)", "desc": "## Finding (G3 R5 F1)\n\n`db/001_database_initial.sql:871-902` (Definition), `db/backups/2026-04-13-pre-ticket-board-merge", "pk": "SDRv4", "tc": "BUG"}, {"id": 1201, "title": "dsgvo_document_history Insert-Fehler werden geschluckt (silent audit-gap)", "desc": "## Finding (G3 R4 F6)\n\n`app/api/gdpr/documents/[id]/route.ts:44-49` und `app/api/gdpr/documents/[id]/upload/route.ts:69-", "pk": "SDRv4", "tc": "BUG"}, {"id": 1200, "title": "GDPR-Documents GET: Auto-Expire-Schreibvorgang ohne Audit-Trail (Side-Effect im GET)", "desc": "## Finding (G3 R4 F5)\n\n`app/api/gdpr/documents/route.ts:18-25`: GET mutiert `status` auf `expired` wenn `review_due` abg", "pk": "SDRv4", "tc": "BUG"}, {"id": 1199, "title": "GDPR-Document Download ohne Audit-Log + nur requireAuth (AVV/DSFA fuer jeden Login sichtbar)", "desc": "## Finding (G3 R4 F4)\n\n`app/api/gdpr/documents/[id]/download/route.ts:11-52`: liefert signierte Storage-URL (60 Min) ode", "pk": "SDRv4", "tc": "BUG"}, {"id": 1198, "title": "dsgvo_document.approved_by ist TEXT statt FK auf app_user (Genehmiger-Name faelschbar)", "desc": "## Finding (G3 R4 F3, Schema-Ebene zu #1188)\n\n`db/036_2026-03-30-dsgvo-documents.sql:19`: `approved_by TEXT` ist Free-Te", "pk": "SDRv4", "tc": "BUG"}, {"id": 1197, "title": "dsgvo_document_history nicht append-only erzwungen (Service-Role kann UPDATE/DELETE, CASCADE-Falle)", "desc": "## Finding (G3 R4 F2)\n\n`db/036_2026-03-30-dsgvo-documents.sql:43-79`: `dsgvo_document_history` hat keine UPDATE/DELETE-V", "pk": "SDRv4", "tc": "BUG"}, {"id": 1196, "title": "GDPR PATCH: Transition-Map fehlt + Race-Condition + storage_path-Check vor approved", "desc": "## Finding (G3 R4 F1, vertieft R3 #1189)\n\n`app/api/gdpr/documents/[id]/route.ts:21-31`: PATCH validiert nur das Status-E", "pk": "SDRv4", "tc": "BUG"}, {"id": 1195, "title": "logs/page.tsx: Server-Component OHNE requireCapability (Info Disclosure Stack-Traces/PII)", "desc": "## Finding (G3 R3 F8)\n\n`app/[locale]/(dashboard)/logs/page.tsx:8`: Server-Component (kein `'use client'`), aber KEIN `re", "pk": "SDRv4", "tc": "BUG"}, {"id": 1194, "title": "einstellungen/ki/rate-limits/page.tsx: Client-only fuer User-Rate-Limits (Cost-Control)", "desc": "## Finding (G3 R3 F7)\n\n`app/[locale]/(dashboard)/einstellungen/ki/rate-limits/page.tsx:1-10`: User-spezifische Rate-Limi", "pk": "SDRv4", "tc": "BUG"}, {"id": 1193, "title": "servers/page.tsx: Client-only fuer CLI-Server-Lifecycle-Verwaltung", "desc": "## Finding (G3 R3 F6)\n\n`app/[locale]/(dashboard)/servers/page.tsx:1-12`: Verwaltet CLI-Server-Lifecycle (creating/runnin", "pk": "SDRv4", "tc": "BUG"}, {"id": 1192, "title": "agent-registry/agents/agent-analytics/agent-performance: 4 Pages Client-only ohne Server-Wrapper", "desc": "## Finding (G3 R3 F5)\n\nVier admin-nahe Pages exposen Agenten-/Skills-Management ohne Server-Wrapper:\n- `app/[locale]/(da", "pk": "SDRv4", "tc": "BUG"}, {"id": 1191, "title": "settings/ticketing/page.tsx: Client-only ohne Server-Gate fuer API-Token-Generator", "desc": "## Finding (G3 R3 F4)\n\n`app/[locale]/(dashboard)/settings/ticketing/page.tsx:1-9`: Generiert API-Token fuer ticketing.se", "pk": "SDRv4", "tc": "BUG"}, {"id": 1190, "title": "einstellungen/tokens/page.tsx: Client-only ohne Server-Gate fuer Token-Konfiguration", "desc": "## Finding (G3 R3 F3)\n\n`app/[locale]/(dashboard)/einstellungen/tokens/page.tsx:1`: `'use client'`, kein Server-Wrapper. ", "pk": "SDRv4", "tc": "BUG"}, {"id": 1189, "title": "GDPR PATCH: keine Status-Transition-Validation (pending -> approved Direkt-Sprung moeglich)", "desc": "## Finding (G3 R3 F2)\n\n`app/api/gdpr/documents/[id]/route.ts:22-31`: Status-Lifecycle laut `docs/CLAUDE.md` ist `pending", "pk": "SDRv4", "tc": "BUG"}, {"id": 1188, "title": "GDPR PATCH approved_by client-controlled (DSB-Spoofing, Audit-Manipulation)", "desc": "## Finding (G3 R3 F1)\n\n`app/api/gdpr/documents/[id]/route.ts:16-29`: `updates.approved_by = approved_by || null` ueberni", "pk": "SDRv4", "tc": "BUG"}, {"id": 1187, "title": "envsys-Proxy [...path]/route.ts: nur requireAuth, kein Capability-Check, kein Workspace-Header", "desc": "## Finding (G3 R2 F5)\n\n`app/api/envsys/[...path]/route.ts` (121 Zeilen, Zeile 92/100/107/115):\n- Catch-All-Proxy zum env", "pk": "SDRv4", "tc": "BUG"}, {"id": 1186, "title": "users/page.tsx: Client-only Auth fuer User-CRUD + Token-Top-Up-UI", "desc": "## Finding (G3 R2 F4)\n\n`app/[locale]/(dashboard)/users/page.tsx` (1312 Zeilen):\n- Komplette Datei `'use client'`, kein S", "pk": "SDRv4", "tc": "BUG"}, {"id": 1185, "title": "einstellungen/capabilities/page.tsx: Client-only Auth-Gate fuer RBAC-Matrix-UI", "desc": "## Finding (G3 R2 F3)\n\n`app/[locale]/(dashboard)/einstellungen/capabilities/page.tsx` (539 Zeilen):\n- Komplette Datei `'", "pk": "SDRv4", "tc": "BUG"}, {"id": 1184, "title": "GDPR Documents Listing + Download: nur requireAuth statt requireCapability (Insider-Threat)", "desc": "## Finding (G3 R2 F2)\n\n- `GET /api/gdpr/documents/route.ts:7-28`: nur `await requireAuth()`, kein Capability-Check\n- `GE", "pk": "SDRv4", "tc": "BUG"}, {"id": 1183, "title": "dsgvo/page.tsx: Locale-Bypass + Client-only Auth fuer DSGVO-Dokumenten-UI", "desc": "## Finding (G3 R2 F1)\n\n`app/(dashboard)/dsgvo/page.tsx` (254 Zeilen) liegt **ausserhalb** des `[locale]/`-Trees und ist ", "pk": "SDRv4", "tc": "BUG"}, {"id": 1182, "title": "voice/chat-stream Page: localhost:3000 als WS-Origin-Fallback in SSR", "desc": "## Finding (G3 R1)\n\n`app/[locale]/(dashboard)/voice/chat-stream/page.tsx:67,72` `typeof window !== 'undefined' ? window.", "pk": "SDRv4", "tc": "BUG"}, {"id": 1181, "title": "handover-protocols/[id]: Number(params.id) ohne Validation triggert fetch mit NaN", "desc": "## Finding (G3 R1)\n\n`app/[locale]/(dashboard)/handover-protocols/[id]/page.tsx:68-72` `Number(params.id)` produziert `Na", "pk": "SDRv4", "tc": "BUG"}, {"id": 1180, "title": "[table]/page.tsx: getTableConfig-Loader-Pfad lockert XSS-Risiko bei DB-hydratisierten Tabellen-Configs", "desc": "## Finding (G3 R1)\n\n`app/[locale]/(dashboard)/[table]/page.tsx:14-22` rendert `config.displayNamePlural` als h1 + via `t", "pk": "SDRv4", "tc": "BUG"}, {"id": 1179, "title": "envsys/login Page: Redirect ohne Locale-Prefix erzeugt Doppel-Redirect", "desc": "## Finding (G3 R1)\n\n`app/[locale]/(dashboard)/envsys/login/page.tsx:25` `router.push('/envsys/variables')` ohne Locale-P", "pk": "SDRv4", "tc": "BUG"}, {"id": 1178, "title": "envsys/(protected)/layout.tsx: Auth-Gate prueft nur Cookie-Existenz, kein Token-Verify", "desc": "## Finding (G3 R1)\n\n`app/[locale]/(dashboard)/envsys/(protected)/layout.tsx:20-22` prueft nur `cookieStore.get('envsys_t", "pk": "SDRv4", "tc": "BUG"}, {"id": 1177, "title": "envsys-Proxy-Pages: params.id ohne Validation in Backend-URL (CRLF/Path-Injection)", "desc": "## Finding (G3 R1)\n\n`app/[locale]/(dashboard)/envsys/(protected)/variables/[id]/page.tsx:17,28` und `projects/[id]/page.", "pk": "SDRv4", "tc": "BUG"}, {"id": 1176, "title": "envsys-Pages: async params nicht awaited (Next.js 16 contract break), IDOR-Risiko", "desc": "## Finding (G3 R1)\n\n`app/[locale]/(dashboard)/envsys/(protected)/projects/[id]/page.tsx:37-40` und `variables/[id]/page.", "pk": "SDRv4", "tc": "BUG"}, {"id": 1175, "title": "CLAUDE.md Doku-Drift: middleware.ts vs. proxy.ts, fehlende Defense-in-Depth in Server-Components", "desc": "## Finding (G3 R1)\n\n`app/CLAUDE.md` und `app/[locale]/(dashboard)/CLAUDE.md` beschreiben `middleware.ts` als JWT-Check-S", "pk": "SDRv4", "tc": "BUG"}, {"id": 1174, "title": "Extended Review G3: app/[locale]/ Pages + Dashboard Audit", "desc": "## Extended Review Gruppe 3\n\n**Scope:** `app/[locale]/` Pages, Layouts, Dashboard, Tools, Server-Components, Server-Acti", "pk": "SDRv4", "tc": "EPIC"}, {"id": 1173, "title": "gdpr/documents/[id] PATCH: approved_by Free-Text, Audit-Integrity gebrochen", "desc": "## Finding (G2 R5)\n\n`app/api/gdpr/documents/[id]/route.ts:16,28` `approved_by` kommt aus Body als String, wird unvalidie", "pk": "SDRv4", "tc": "BUG"}, {"id": 1172, "title": "chat/send + chat/image-generate: kein User-Rate-Limit, Cost-DoS", "desc": "## Finding (G2 R5)\n\n`app/api/chat/send/route.ts:237-244` und `app/api/chat/image-generate/route.ts:12` haben kein per-Us", "pk": "SDRv4", "tc": "BUG"}, {"id": 1171, "title": "voice/session/persist: kein Audio/Transcript-Size-Cap + MIME-Spoof", "desc": "## Finding (G2 R5)\n\n`app/api/voice/session/persist/route.ts:75-101` weder `audio` (Opus) noch `transcript` (JSON) haben ", "pk": "SDRv4", "tc": "BUG"}, {"id": 1170, "title": "voice/session/persist: Tier-Spoofing via Client-Form-Field", "desc": "## Finding (G2 R5)\n\n`app/api/voice/session/persist/route.ts:63,71-74` `tier` wird aus Multipart-Form gelesen. Free-User ", "pk": "SDRv4", "tc": "BUG"}, {"id": 1169, "title": "gdpr/documents/[id]/upload: kein Magic-Byte-Check + Filename-Injection", "desc": "## Finding (G2 R5)\n\n`app/api/gdpr/documents/[id]/upload/route.ts:23-25,40-41,58,69-75` zwei Vektoren:\n\n### MIME-Spoof\n`A", "pk": "SDRv4", "tc": "BUG"}, {"id": 1168, "title": "chat/upload: kein File-Size-Cap, DoS via Mega-File", "desc": "## Finding (G2 R5)\n\n`app/api/chat/upload/route.ts:23-48` kein `MAX_FILE_SIZE`-Check. `await file.arrayBuffer()` laedt ko", "pk": "SDRv4", "tc": "BUG"}, {"id": 1167, "title": "chat/upload: personalityId ohne Ownership-Check, Knowledge-Poisoning", "desc": "## Finding (G2 R5)\n\n`app/api/chat/upload/route.ts:34-36,82-90,145-155,167` Client liefert `personalityId` frei. Endpoint", "pk": "SDRv4", "tc": "BUG"}, {"id": 1166, "title": "voice/duplex: Adapter-WS-URL direkt an Client ohne Token-Bindung + Prompt-Injection", "desc": "## Finding (G2 R5)\n\n`app/api/voice/duplex/route.ts:62-83` liefert rohe WebSocket-URL des PersonaPlex-Adapters (`ws://per", "pk": "SDRv4", "tc": "BUG"}, {"id": 1165, "title": "gdpr/documents/[id]/download: Path-Traversal + zu schwacher Auth + Header-Injection", "desc": "## Finding (G2 R5)\n\n`app/api/gdpr/documents/[id]/download/route.ts:33-39,51` mehrere Vektoren:\n\n1. `path.join(process.cw", "pk": "SDRv4", "tc": "BUG"}, {"id": 1164, "title": "LOW-Sammel R4d: activity-log Doku-Drift, rechtsberatung mkdir 0o777", "desc": "## LOW-Findings (G2 R4d)\n\n### 1. activity-log Capability-Drift Doku vs. Code\n- `app/api/activity-log/[entityType]/[entit", "pk": "SDRv4", "tc": "CHO"}, {"id": 1163, "title": "custom-attributes/save: Single-Capability zu breit, Cross-Domain-Schreibrecht", "desc": "## Finding (G2 R4d)\n\n`app/api/custom-attributes/save/route.ts:13` prueft `manage_contacts`, erlaubt aber Schreiben in `a", "pk": "SDRv4", "tc": "BUG"}, {"id": 1162, "title": "comments POST: kein Content-Length-Cap, DoS via 10-MB-Comment", "desc": "## Finding (G2 R4d)\n\n`app/api/comments/[entityType]/[entityId]/route.ts:118-123` validiert `content` nur auf nicht-leer.", "pk": "SDRv4", "tc": "BUG"}, {"id": 1161, "title": "locales/[code]/translate-all: kein Concurrency-Lock, Token-Verschwendung + Race", "desc": "## Finding (G2 R4d)\n\n`app/api/locales/[code]/translate-all/route.ts:63` iteriert sequenziell ueber alle Lookup-Tabellen ", "pk": "SDRv4", "tc": "BUG"}, {"id": 1160, "title": "gdpr/delete: Capability-Drift manage_users statt manage_gdpr", "desc": "## Finding (G2 R4d)\n\n`app/api/gdpr/delete/[userId]/route.ts:184` prueft `manage_users`. CLAUDE.md (Doku) und der GDPR-Wo", "pk": "SDRv4", "tc": "BUG"}, {"id": 1159, "title": "GDPR-Routes: ValidationError (400) statt AuthorizationError (403) bei IDOR-Block", "desc": "## Finding (G2 R4d)\n\nGDPR-Routes werfen bei Authorization-Failures `ValidationError` (HTTP 400) statt `AuthorizationErro", "pk": "SDRv4", "tc": "BUG"}, {"id": 1157, "title": "bot/telegram/setup: webhookUrl ohne Schema/Host-Allowlist + Token-Leak im Log", "desc": "## Finding (G2 R4d)\n\n`app/api/bot/telegram/setup/route.ts:23-27,50` Admin kann beliebige `webhookUrl` setzen. Kein Schem", "pk": "SDRv4", "tc": "BUG"}, {"id": 1155, "title": "[Brainstorming] WhisperFlow-Client: Hotkey-Aufnahme + ASR + Cursor-Einfuegen", "desc": "Brainstorming: Lokaler Client (Windows/Mac), der per Hotkey eine Aufnahme startet, diese an den Senity Qwen3-ASR-Server ", "pk": "None", "tc": "None"}, {"id": 1154, "title": "G2 R4c: users/[id]/regenerate-token kein Audit-Log (LOW)", "desc": "## Finding (Extended Review G2 R4c, LOW)\n\n`app/api/users/[id]/regenerate-token/route.ts`. Token-Regeneration nicht im Au", "pk": "SDRv4", "tc": "CHO"}, {"id": 1153, "title": "G2 R4c: container-manager containerAction action-Param Allowlist (SUSPECTED MEDIUM)", "desc": "## Finding (Extended Review G2 R4c, SUSPECTED MEDIUM)\n\n`apps/container-manager/api/containers/handlers.ts:110-131` (cont", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 1152, "title": "G2 R4c: Password-Min-Length Drift (reset=8, setup=12) (MEDIUM)", "desc": "## Finding (Extended Review G2 R4c, MEDIUM)\n\nPassword-Min-Length inkonsistent:\n- `app/api/users/[id]/reset-password/rout", "pk": "SDRv4", "tc": "BUG"}, {"id": 1151, "title": "G2 R4c: users/[id]/reset-password keine Session-Invalidierung (MEDIUM)", "desc": "## Finding (Extended Review G2 R4c, MEDIUM)\n\n`app/api/users/[id]/reset-password/route.ts`. Admin setzt Password fuer Tar", "pk": "SDRv4", "tc": "BUG"}, {"id": 1150, "title": "G2 R4c: app/api/memory Platform-Global Memory Cross-Tenant-IDOR (MEDIUM)", "desc": "## Finding (Extended Review G2 R4c, MEDIUM)\n\n`app/api/memory/route.ts:103-117` (GET wings), `:173-188` (GET facts). Wenn", "pk": "SDRv4", "tc": "BUG"}, {"id": 1149, "title": "G2 R4b: logs/client-errors unauthenticated ohne IP-Rate-Limit (LOW)", "desc": "## Finding (Extended Review G2 R4b, LOW)\n\n`app/api/logs/client-errors/route.ts` ist per Design unauthenticated (Client-E", "pk": "SDRv4", "tc": "CHO"}, {"id": 1147, "title": "G2 R4b: app/api/fk/[table] expose all columns via Admin-Client (MEDIUM)", "desc": "## Finding (Extended Review G2 R4b, MEDIUM)\n\n`app/api/fk/[table]/route.ts:34-38`. `select('*')` mit `createAdminClient()", "pk": "SDRv4", "tc": "BUG"}, {"id": 1146, "title": "G2 R4a: admin/ LOW-Sammel (NaN-Drift, ORDER BY, ILIKE-DoS, Size-Caps)", "desc": "## Findings (Extended Review G2 R4a, LOW konsolidiert)\n\n### L7 NaN-Drift bei Number(idStr)\n`Number(\"abc\")=NaN`, `Number(", "pk": "SDRv4", "tc": "CHO"}, {"id": 1145, "title": "G2 R4a: admin/recommendations/compute entity_type ohne Allowlist (SQL-Injection-Risk)", "desc": "## Finding (Extended Review G2 R4a, MEDIUM)\n\n`app/api/admin/agent-analytics/recommendations/compute/route.ts:18-38`. `en", "pk": "SDRv4", "tc": "BUG"}, {"id": 1144, "title": "G2 R4a: admin/agents/sync stderr-Leak + ENV-Inheritance + kein Lock (MEDIUM)", "desc": "## Findings (Extended Review G2 R4a, 2 MEDIUM konsolidiert)\n\n### M4 Information-Disclosure via stderr\n\n`app/api/admin/ag", "pk": "SDRv4", "tc": "BUG"}, {"id": 1143, "title": "G2 R4a: admin/agent-analytics PII-Capability-Drift (manage_agent_skills sieht PII)", "desc": "## Finding (Extended Review G2 R4a, MEDIUM, DSGVO-relevant)\n\n`agent-analytics/users/route.ts:91-100`, `users/[userId]/ro", "pk": "SDRv4", "tc": "BUG"}, {"id": 1142, "title": "G2 R4a: admin/bot-user-mappings OR-Capability Privilege-Escalation (MEDIUM)", "desc": "## Finding (Extended Review G2 R4a, MEDIUM)\n\n`app/api/admin/bot-user-mappings/[id]/route.ts:131-194` PATCH nutzt `requir", "pk": "SDRv4", "tc": "BUG"}, {"id": 1141, "title": "G2 R4a: admin/agent-analytics/offers Mass-Notification ohne Audit/Rate-Limit (HIGH)", "desc": "## Finding (Extended Review G2 R4a, HIGH)\n\n`app/api/admin/agent-analytics/offers/route.ts:68-176` (POST) + `resolveNotif", "pk": "SDRv4", "tc": "BUG"}, {"id": 1140, "title": "BUG: Middleware-Bypass fehlt fuer /api/youtube-translator (Container-Auth 401)", "desc": "Der proxy.ts-Middleware-Bypass [IMP-650] deckt nur /api/youtube-summarizer ab, nicht /api/youtube-translator. Container-", "pk": "None", "tc": "None"}, {"id": 1139, "title": "G2 R3: app/api/ LOW-Sammel (hardware Mass-Assignment, photo MIME, stream Body-Cap)", "desc": "## Findings (Extended Review G2 R3, LOW konsolidiert)\n\n### L1, `app/api/hardware/handover/route.ts:59-84` Mass-Assignmen", "pk": "SDRv4", "tc": "CHO"}, {"id": 1138, "title": "G2 R3: CLI files PUT/DELETE Path-Traversal-Check fehlt (nur GET prueft)", "desc": "## Finding (Extended Review G2 R3, MEDIUM)\n\n`app/api/cli/servers/[id]/files/route.ts:437, 514` (PUT, DELETE) reichen `pa", "pk": "SDRv4", "tc": "BUG"}, {"id": 1137, "title": "G2 R3: fk/[table] Select * Mass-Data-Exposure (auth_user_id, Tokens, internal_notes)", "desc": "## Finding (Extended Review G2 R3, MEDIUM)\n\n`app/api/fk/[table]/route.ts:36` nutzt `select('*')` ueber Whitelist-Tabelle", "pk": "SDRv4", "tc": "BUG"}, {"id": 1136, "title": "G2 R3: sales-scripts/download IDOR (signed URL ohne Ownership-Check)", "desc": "## Finding (Extended Review G2 R3, MEDIUM)\n\n`app/api/sales-scripts/download/route.ts:21-26` selektiert `file_path` per I", "pk": "SDRv4", "tc": "BUG"}, {"id": 1135, "title": "G2 R3: CLI Webhook Auth-Bypass-Fail-Open bei fehlender ORCHESTRATOR_AUTH_TOKEN", "desc": "## Finding (Extended Review G2 R3, HIGH)\n\n`app/api/cli/servers/[id]/webhook/route.ts:34-42` prueft Bearer-Token nur wenn", "pk": "SDRv4", "tc": "BUG"}, {"id": 1133, "title": "G2 R2: app/api/ LOW-Sammel (GDPR-upload path, Bot HTML, Token limit NaN)", "desc": "## Findings (Extended Review G2 R2, LOW konsolidiert)\n\n### L1, `app/api/gdpr/documents/[id]/upload/route.ts:41` storageP", "pk": "SDRv4", "tc": "CHO"}, {"id": 1132, "title": "G2 R2: Image-Generate referenceImages ohne Size/Count-Cap (Heap-DoS)", "desc": "## Finding (Extended Review G2 R2, MEDIUM)\n\n`app/api/image/generate/route.ts:123-127` decoded `referenceImages.map(ref =", "pk": "SDRv4", "tc": "BUG"}, {"id": 1131, "title": "G2 R2: Image-Edit Haertung (MIME, Size, Modell-Whitelist, Error-Leak)", "desc": "## Finding (Extended Review G2 R2, MEDIUM)\n\n`app/api/image/edit/route.ts` schwaecher gehaertet als `image/generate`:\n\n- ", "pk": "SDRv4", "tc": "BUG"}, {"id": 1130, "title": "G2 R2: appUserId ?? 0 Fallback bei Pending-Nonce-Owner-Match (Cross-User Konsumtion)", "desc": "## Finding (Extended Review G2 R2, MEDIUM)\n\n`app/api/chat/tool-confirm/route.ts:79` und `app/api/chat/send/route.ts:1577", "pk": "SDRv4", "tc": "BUG"}, {"id": 1129, "title": "G2 R2: Token Fire-and-Forget-Debit ohne Pre-Check (Debt-Accumulation)", "desc": "## Finding (Extended Review G2 R2, MEDIUM)\n\n`app/api/chat/send/route.ts:1146-1155` ruft `debitTokens` erst NACH Abschlus", "pk": "SDRv4", "tc": "BUG"}, {"id": 1128, "title": "G2 R2: Voice Duplex Adapter-WS-URL-Exposure an Client", "desc": "## Finding (Extended Review G2 R2, MEDIUM)\n\n`app/api/voice/duplex/route.ts:60-66` gibt interne PersonaPlex-WS-URL (`ws:/", "pk": "SDRv4", "tc": "BUG"}, {"id": 1127, "title": "G2 R1: app/api/ LOW-Sammel (PostgREST-Interpolation, Password-Policy, auth/check, currency, voice replacement)", "desc": "## Findings (Extended Review G2 R1, LOW konsolidiert)\n\n### L9, `app/api/[table]/route.ts:89-90` PostgREST-`.or()`-Builde", "pk": "SDRv4", "tc": "CHO"}, {"id": 1126, "title": "G2 R1: admin/agent-registry HTTPS-Enforce fuer remote PostgREST", "desc": "## Finding (Extended Review G2 R1, MEDIUM)\n\n`app/api/admin/agent-registry/route.ts:151-162` sendet Service-Role-Key im A", "pk": "SDRv4", "tc": "BUG"}, {"id": 1125, "title": "G2 R1: GDPR Delete Path-Traversal-Defense schwach (process.cwd-Prefix-Check)", "desc": "## Finding (Extended Review G2 R1, MEDIUM)\n\n`app/api/gdpr/delete/[userId]/route.ts:77-79` nutzt `absolutePath.startsWith", "pk": "SDRv4", "tc": "BUG"}, {"id": 1124, "title": "G2 R1: Trello-Webhook HMAC ohne Replay-Protection", "desc": "## Finding (Extended Review G2 R1, MEDIUM)\n\n`app/api/boards/webhooks/trello/route.ts:23-51` verifiziert SHA1-HMAC, aber ", "pk": "SDRv4", "tc": "BUG"}, {"id": 1123, "title": "G2 R1: GDPR Documents Download Path-Traversal via template_path", "desc": "## Finding (Extended Review G2 R1, HIGH)\n\n`app/api/gdpr/documents/[id]/download/route.ts:32-34` baut `path.join(process.", "pk": "SDRv4", "tc": "BUG"}, {"id": 1122, "title": "G2 R1: Generic-CRUD-Handler app/api/[table]/ Mass-Assignment + IDOR + OR-Filter-Injection", "desc": "## Findings (Extended Review G2 R1, 2 HIGH + 2 MEDIUM konsolidiert)\n\nVier Findings im Generic-CRUD-Handler teilen Archit", "pk": "SDRv4", "tc": "BUG"}, {"id": 1121, "title": "G1 R8: lib/ LOW-Sammel (token-crypto length-check, handoff-token JSON-guard + clock-skew)", "desc": "## Findings (Extended Review G1 R8, LOW konsolidiert)\n\nR8 hat 0 HIGH und 0 MEDIUM gefunden. Drei reine Robustness-Punkte", "pk": "SDRv4", "tc": "CHO"}, {"id": 1120, "title": "G1 R7: lib/ LOW-Sammel (yt-dlp-validation, JWT-zod, TOML-newline, realpath, control-chars)", "desc": "## Findings (Extended Review G1 R7, LOW konsolidiert)\n\n### L1, `lib/youtube/downloader.ts:239,247-249` yt-dlp output-tem", "pk": "SDRv4", "tc": "CHO"}, {"id": 1119, "title": "G1 R7: Image-Storage MIME-XSS via untyped format-string (lib/image/image-storage.ts)", "desc": "## Finding (Extended Review G1 R7, MEDIUM)\n\n`lib/image/image-storage.ts:17,23,32` nimmt `format: string` ohne Allowlist ", "pk": "SDRv4", "tc": "BUG"}, {"id": 1118, "title": "G1 R7: Codex-Spawn ohne --Separator (argv-injection-class in lead-scraper/process-manager.ts)", "desc": "## Finding (Extended Review G1 R7, MEDIUM)\n\n`lib/lead-scraper/process-manager.ts:205-214` (codex) und `:215-224` (codex-", "pk": "SDRv4", "tc": "BUG"}, {"id": 1117, "title": "G1 R7: ssrf-guard CIDR-Gaps + fehlender DNS-Pin (zentrale SSRF-Library)", "desc": "## Finding (Extended Review G1 R7, MEDIUM)\n\n`lib/ssrf-guard.ts` ist der zentrale SSRF-Validator. Validiert nicht alle pr", "pk": "SDRv4", "tc": "BUG"}, {"id": 1116, "title": "G1 R7: Caddy-Generator (Nginx-Mandate-Violation + Subdomain-Injection + Caddyfile-Injection)", "desc": "## Findings (Extended Review G1 R7, 2 HIGH + 1 MEDIUM)\n\n`lib/workspace/caddy-generator.ts` existiert als aktiver Codepfa", "pk": "SDRv4", "tc": "BUG"}, {"id": 1115, "title": "G1 R6: lib/ LOW-Sammel (MPEG-TS-Check, dead-MAGIC_BYTES, Blob-MIME, system-prompts replaceAll, litellm-pricing-fetch, override_key-logging)", "desc": "## Findings (Extended Review G1 R6, LOW konsolidiert)\n\n### L1, `lib/voice/file-security.ts:58-63` MPEG-TS-Magic permissi", "pk": "SDRv4", "tc": "CHO"}, {"id": 1114, "title": "G1 R6: Path-Traversal in lib/llm/registry.ts (storage_path) und lib/youtube/pipeline.ts (file_prefix/filename_slug)", "desc": "## Findings (Extended Review G1 R6, 2 MEDIUM, gemeinsamer Fix-Pfad)\n\n### M1, `lib/llm/registry.ts:123` (+ Reads bei Z.26", "pk": "SDRv4", "tc": "BUG"}, {"id": 1113, "title": "G1 R5: lib/ LOW-Sammel (PostgREST .or()-Injection, Auth-Oracle, scrypt-N, MarkdownV2-URL)", "desc": "## Findings (Extended Review G1 R5, LOW konsolidiert)\n\n### L1, `lib/filter-parser.ts:320,291,309,340,374,422`\n`sanitizeV", "pk": "SDRv4", "tc": "CHO"}, {"id": 1112, "title": "G1 R5: Path-Traversal in saveOrderSummary via LLM-controlled datum/uhrzeit (bot/message-handler.ts)", "desc": "## Finding (Extended Review G1 R5, MEDIUM)\n\n`lib/bot/message-handler.ts:22-49` `saveOrderSummary` baut Filename aus LLM-", "pk": "SDRv4", "tc": "BUG"}, {"id": 1111, "title": "G1 R5: LLM-gesteuerter Personality-Switch ohne Allow-List (channels/router.ts)", "desc": "## Finding (Extended Review G1 R5, MEDIUM)\n\n`lib/channels/router.ts:818-825` parst `[[ROUTE:N]]` aus LLM-Output und schr", "pk": "SDRv4", "tc": "BUG"}, {"id": 1110, "title": "G1 R5: SSRF-Cluster in Webhooks, Website-Checker und URL-Safety (DNS-blind + Redirect-Follow)", "desc": "## Findings (Extended Review G1 R5, 2 HIGH + 1 MEDIUM, gemeinsamer Fix-Pfad)\n\nDrei SSRF-Vektoren mit gemeinsamer Ursache", "pk": "SDRv4", "tc": "BUG"}, {"id": 1109, "title": "G1 R4: lib/ Robustness-Sammel (Locale-URL, TOCTOU Photo-Quota, Classifier-Race, Trim-Temp-Collisions)", "desc": "## Finding (Extended Review G1 R4, LOW konsolidiert)\n\nVier kleine Robustness-Schwaechen aus G1 R4. Keine Security-Critic", "pk": "SDRv4", "tc": "CHO"}, {"id": 1108, "title": "G1 R4: lib/comments.ts enrichWithCommentCounts umgeht RLS via Service-Role", "desc": "## Finding (Extended Review G1 R4, MEDIUM)\n\n`lib/comments.ts:34-56` `enrichWithCommentCounts` nutzt `createAdminClient()", "pk": "SDRv4", "tc": "BUG"}, {"id": 1107, "title": "G1 R3: Code-Quality Sweep (Em-Dash, content-type, dev-detail-leak, papa-import)", "desc": "## Cluster aus G1 R3 Review (Reviewer #1)\n\n### Findings\n\n**P3-1: Em-Dash in Code-Comments / LLM-Prompts**\n- `lib/lead-sc", "pk": "SDRv4", "tc": "CHO"}, {"id": 1106, "title": "G1 R3: Robustness-Bugs (chunking-loop, image-LLM, searxng-prompt-injection, lead-scraper-fallback)", "desc": "## Cluster aus G1 R3 Review (R1 + R2)\n\n### Findings\n\n**P1-4 (R1): chunking.ts Infinite-Loop**\n- File: `lib/chunking.ts:5", "pk": "SDRv4", "tc": "BUG"}, {"id": 1105, "title": "G1 R3: Voice-Consent expires_at + DSGVO-Re-Konfirmierung (12 Monate)", "desc": "## Finding aus G1 R3 (Reviewer #2)\n\n**MEDIUM-3: Voice-Cloning-Consent ohne Ablauf**\n- File: `lib/voice/voice-auth.ts:34-", "pk": "SDRv4", "tc": "IMP"}, {"id": 1104, "title": "G1 R3: PII-Leakage in Logs (notifications/db + supabase/query-logger)", "desc": "## Cluster aus G1 R3 Review (Reviewer #2 Security Engineer)\n\n### Findings\n\n**MEDIUM-1: notifications/db.ts loggt komplet", "pk": "SDRv4", "tc": "BUG"}, {"id": 1102, "title": "G1 R3: File-Extractor Haertung (ZIP-Slip/Bomb, Filesize, Timeouts, Email/RTF/PDF)", "desc": "## Cluster aus G1 R3 Review (Reviewer #1 Code Reviewer)\n\n### Findings\n\n**P0-2: ZIP-Slip + ZIP-Bomb in pptx.ts/epub.ts**\n", "pk": "SDRv4", "tc": "BUG"}, {"id": 1101, "title": "G1 R3: SSRF-Haertung url-safety + page-fetcher + SEARXNG_URL + ffmpeg-Argv", "desc": "## Cluster aus G1 R3 Review (Reviewer #1 Code Reviewer + #2 Security)\n\n### Findings\n\n**P0-1 (R1): DNS-Rebinding und unvo", "pk": "SDRv4", "tc": "BUG"}, {"id": 1100, "title": "G1 R2 P2: AI-Pattern-Replacer Safety (ReDoS + Marker-Replace-Order)", "desc": "## Findings\n\n1. **ReDoS via DB-konfigurierbare Regex-Patterns** (`lib/ai-pattern-replacer/processor.ts:88`): `pattern.re", "pk": "SDRv4", "tc": "BUG"}, {"id": 1099, "title": "G1 R2 P2: Codex-Spawn + CLI-Proxy Robustness (lazy-getter, ring-buffer, rate-limit, mojibake)", "desc": "## Findings (4 Robustness-Issues)\n\n1. **CLI_PROXY_URL Module-Load-Frozen** (`lib/cli-proxy/client.ts:11`): `const CLI_PR", "pk": "SDRv4", "tc": "IMP"}, {"id": 1098, "title": "G1 R2 P2: Defense-in-Depth Input-Guards (slug, integer-scope, branch-name)", "desc": "## Findings (3 Defense-in-Depth-Guards)\n\n1. **ensureProjectDir Slug-Guard** (`lib/cli/project-init.ts:71-72`): `path.joi", "pk": "SDRv4", "tc": "IMP"}, {"id": 1097, "title": "G1 R2 P1: Auth-Hygiene Quick-Fixes (status-oracle, scryptSync, JWT-cast, logger, audit-metric)", "desc": "## Findings (5 trivial Fixes)\n\n1. **Container-Auth Status-Oracle** (`lib/cli/container-auth.ts:284`): `authenticateConta", "pk": "SDRv4", "tc": "BUG"}, {"id": 1096, "title": "G1 R2 P1: Token-Crypto Key-Separation (3 Purposes auf 1 Env-Key)", "desc": "## Finding\n\n`TOKEN_ENCRYPTION_KEY` dient gleichzeitig als:\n- AES-256-GCM-Key in `encryptToken` (`lib/token-crypto.ts`)\n-", "pk": "SDRv4", "tc": "IMP"}, {"id": 1095, "title": "G1 R2 P1: Background-Jobs Tenant-Scope (updateJobStatusByProcessId + getJob IDOR)", "desc": "## Findings\n\n`lib/background-jobs/db.ts` hat zwei Tenant-Isolations-Luecken:\n\n1. **Cross-Tenant-Mutation** (`db.ts:134-1", "pk": "SDRv4", "tc": "BUG"}, {"id": 1094, "title": "G1 R2 P1: SSRF-Allowlist fuer externe URLs (callback, LITELLM, OLLAMA, MSH)", "desc": "## Findings\n\nVier Surface-Points akzeptieren URLs/Endpoints ohne Schema- oder Host-Validation:\n\n1. **CLI-Proxy Callback-", "pk": "SDRv4", "tc": "BUG"}, {"id": 1093, "title": "G1 R2 P0: Codex-Sandbox-Bypass + cwd-Allowlist + Lead-Prompt-Injection", "desc": "## Findings\n\n`lib/cli-spawn/codex-spawner.ts:148` setzt fest `--dangerously-bypass-approvals-and-sandbox`. Kombiniert mi", "pk": "SDRv4", "tc": "BUG"}, {"id": 1092, "title": "[G1-P1] checkBudget Nondeterminismus + filter-parser composite-negate", "desc": "## Findings (G1 R1, Reviewer: Code Reviewer)\n\n### F1: ai-usage.ts checkBudget Rollen-Pick nondeterministisch\n`lib/ai-usa", "pk": "SDRv4", "tc": "BUG"}, {"id": 1091, "title": "[G1-P1] Tools-Layer Hygiene (Repository-Pattern, RegisteredTool, zirkulaere Imports)", "desc": "## Findings (G1 R1, Reviewer: Backend Architect + Code Reviewer)\n\n### F1: tool-executor mischt Admin- und User-Client\n`l", "pk": "SDRv4", "tc": "IMP"}, {"id": 1090, "title": "[G1-P1] Chat-Adapter-Pattern-Drift + HMR-Singleton-Copy-Paste", "desc": "## Findings (G1 R1, Reviewer: Backend Architect)\n\n### F1: Adapter-Pattern-Drift\n`lib/chat/sdr-chat-adapter.ts` ist Singl", "pk": "SDRv4", "tc": "IMP"}, {"id": 1089, "title": "[G1-P1] Prompt-Injection via [[ROUTE:N]] in channels/router", "desc": "## Finding (G1 R1, Reviewer: Security Engineer + Backend Architect)\n\n**Pfad:** `lib/channels/router.ts:818-825`\n\n**Issue", "pk": "SDRv4", "tc": "BUG"}, {"id": 1088, "title": "[G1-P1] Auth-Adapter Hygiene (Timing-Leak, service_role, Roles-Cache)", "desc": "## Findings (G1 R1, Reviewer: Security Engineer)\n\n### F1: Timing-Leak in internal-auth.ts:26-32\nLength-Check VOR `timing", "pk": "SDRv4", "tc": "BUG"}, {"id": 1087, "title": "[G1-P1] XFF-Spoofing in Rate-Limit + Audit (3 Files)", "desc": "## Finding (G1 R1, Reviewer: Security Engineer)\n\n**Pfade:**\n- `lib/audit.ts:120-126`\n- `lib/auth-rate-limiter.ts:25`\n- `", "pk": "SDRv4", "tc": "BUG"}, {"id": 1086, "title": "[G1-P0] caddy-generator entfernen (Nginx-only-Regel)", "desc": "## Finding (G1 R1, Reviewer: Code Reviewer)\n\n**Pfad:** `lib/workspace/caddy-generator.ts`\n\n**Issue:** Caddy-Config-Gener", "pk": "SDRv4", "tc": "CHO"}, {"id": 1085, "title": "[G1-P0] sprint-tools.ts verstoesst gegen .tasks/-Verbot", "desc": "## Finding (G1 R1, Reviewer: Code Reviewer + Backend Architect)\n\n**Pfad:** `lib/chat/sprint-tools.ts:1-585` (komplettes ", "pk": "SDRv4", "tc": "BUG"}, {"id": 1084, "title": "[G1-P0] JWT-Signatur-Verifikation fehlt in supabase-auth-adapter", "desc": "## Finding (G1 R1, Reviewer: Security Engineer)\n\n**Pfad:** `lib/adapters/supabase-auth-adapter.ts:82-105`\n\n**Issue:** `d", "pk": "SDRv4", "tc": "BUG"}, {"id": 1083, "title": "[EPIC] Codebase-weiter Extended-Review-Audit (10 Gruppen × 30 Runden)", "desc": "## Ziel\n\nKomplette SDRv4-Codebase systematisch auditieren. User-Vorgabe: 10 Gruppen, je 30 Runden Extended-Review (4 Rev", "pk": "SDRv4", "tc": "EPIC"}, {"id": 1082, "title": "@murc134/core GdprAuditAction: youtube_translation_job_* Aktionen nachpflegen", "desc": "## Problem\n\nDas Package `@murc134/core` (`node_modules/@murc134/core/dist/index.d.ts:248`) definiert den Union-Type `Gdp", "pk": "SDRv4", "tc": "BUG"}, {"id": 1081, "title": "Dev-Bot @SenityDevBot an senity-workspace cli_server binden", "desc": "## Kontext\n\nStufe 0 (STS-1067) liefert einen funktionalen Telegram-Webhook fuer @SenityDevBot. Aktuell ist der Channel `", "pk": "STS", "tc": "FEAT"}, {"id": 1080, "title": "senity-workspace Voice-Skills Audit (Telegram-Bot Stufe 0 Folge)", "desc": "## Kontext\n\nVorbereitung für Telegram-Bot-Modi A/B/C/D: Bot @SenityDevBot (Channel `d24eab89-c620-497c-a59d-250198432a4d", "pk": "STS", "tc": "CHO"}, {"id": 1078, "title": "VAD-Indikator + 3s-Stille-Countdown + Auto-Send im TTSChatComposer", "desc": "## Ziel\n\nDer Chat-Composer-Mic-Button (TTSChatComposer + TTSMarkdownTextArea/streamMic) bekommt das gleiche visuelle Fee", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1076, "title": "PoC-Abschluss + Rechtssicherheit-Planung (Telegram-Voice-Bot)", "desc": "## Trigger\n\nGreift nach Abschluss von Mode D (Telegram-Voice-Bot-PoC EPIC). Vorher backlog.\n\n## Scope\n\nDSGVO-Reifung des", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 1075, "title": "Telegram-Voice-Bot-PoC v2 (Stage 0-D)", "desc": "## Ziel\n\nProof of Concept fuer Telegram-Voice-Bot mit 4 Modi:\n\n- **Mode A:** Text-In, Voice-Out (Hello-World-Reply via `", "pk": "STS", "tc": "EPIC"}, {"id": 1074, "title": "Skill telegram-voice-clone-multi-turn: State-Machine Sample-Sammlung (Mode D)", "desc": "## Scope (Plan v2 §6.3)\n\nNeuer Workspace-Skill fuer Multi-Turn Voice-Cloning ueber Telegram.\n\n## Flow\n\n1. Trigger via Us", "pk": "STS", "tc": "FEAT"}, {"id": 1073, "title": "Skill telegram-send-voice-tts: voiceId-Param Erweiterung (Mode C)", "desc": "## Scope (Plan v2 §6.2)\n\nBestehenden Skill um optionalen `voiceId`-Param erweitern.\n\n## Aenderungen\n\n- `D:/Devel/NodeJS/", "pk": "STS", "tc": "IMP"}, {"id": 1072, "title": "Skill telegram-voice-translate: ASR + qwen3.6 + voice-tts Orchestrierung (Mode B)", "desc": "## Scope (Plan v2 §6.1)\n\nNeuer Workspace-Skill der Voice-In, LLM-Translation und Voice-Out kombiniert.\n\n## Flow\n\n1. `asr", "pk": "STS", "tc": "FEAT"}, {"id": 1071, "title": "Em-Dash-Cleanup: voice/tts/cli-channels Files", "desc": "## Scope (Plan v2 §5.5)\n\nEm-Dash-Verbot projektweit (siehe global CLAUDE.md). Sweep der Voice-Bot-relevanten Files.\n\n## ", "pk": "SDRv4", "tc": "CHO"}, {"id": 1070, "title": "Slug-Backfill voice_file: einheitliches Schema name-uID-uuid12", "desc": "## Scope (Plan v2 §5.2)\n\nVoice-Slug-Schema vereinheitlichen: `<name>-u<user_id>-<uuid12>` (substr UUID 1,12).\n\n## Aufgab", "pk": "SDRv4", "tc": "CHO"}, {"id": 1069, "title": "voice-clone-sample: Multi-Turn-Cloning-Endpoint in cli-channels/send (Mode D)", "desc": "## Scope (Plan v2 §5.3 + §5.4)\n\nMulti-Turn-Voice-Cloning via Telegram, State-Maschine in chat_session.metadata.\n\n## Aend", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1068, "title": "voice-tts: voiceId-Param in /api/cli-channels/[channelId]/send (Mode C+D)", "desc": "## Scope (Plan v2 §5.1)\n\nVoice-Override-Endpoint fuer Telegram-Bot-Modes C (per-Message-Override) und D (Result von Mult", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1067, "title": "Telegram Dev-Bot Setup + Cloudflared-Tunnel-Doku (Stufe 0)", "desc": "## Scope (Plan v2 §4 + §6.4)\n\nStufe-0-Voraussetzung des Telegram-Voice-Bot-PoC. Blockt alle weiteren Modi.\n\n## Aufgaben\n", "pk": "STS", "tc": "CHO"}, {"id": 1065, "title": "[Gitea OAuth] OAuth2-Application \"Senity CLI\" in Gitea registrieren", "desc": "## Ziel\nEinmalige Admin-Aufgabe: OAuth2-Application in `git.senity.ai` registrieren, die als Public Client den Device Au", "pk": "SDRv4", "tc": "CHO"}, {"id": 1063, "title": "Gitea-API-Wrapper fuer Claude-Code (Actions-Trigger, Status, Logs)", "desc": "## Kontext\n\nClaude-Code-Sessions sollen die Gitea-Actions-Pipeline (build.yml im Repo `senity-admin/senity-claude-code`)", "pk": "senity-code", "tc": "CHO"}, {"id": 1062, "title": "Chat-Composer auf TTSMarkdownTextArea umstellen (mit AI-Tools)", "desc": "## Ziel\n\nDen Default-Chat-Composer (aktuell `ChatStreamingInput` -> `StreamingTTSArea`, einfaches Textarea mit ASR-Overl", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1060, "title": "[Gitea OAuth] E2E-Tests Device-Flow", "desc": "## Ziel\nEnd-to-End-Tests für CLI Device-Flow gegen Gitea-Test-Instanz.\n\n## Test-Szenarien\n\n**Happy-Path**\n1. CLI startet", "pk": "SDRv4", "tc": "CHO"}, {"id": 1053, "title": "[Gitea OAuth R4] Device-Flow Parameter-Set finalisieren", "desc": "## Frage\nWelche OAuth2-Device-Flow-Parameter werden im CLI hardcoded vs. konfigurierbar?\n\n## Entscheidung (2026-05-24)\n\n", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 1049, "title": "Server-Spawn-Logik (/de/servers) auf versionierte senity-code-Images umstellen", "desc": "## Kontext\n\nArchitektur-Shift im Senity-Code-Ecosystem (SDRv5 #1030, #1031, #1041):\n\nBisher war der \"AI-Workspace-Contai", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1048, "title": "OAuth2 Device-Flow Gitea-Auth für senity-code Container", "desc": "## Kontext\n\nDas Senity-Workspace-Container-Setup (Repo `senity/senity-code`, Master-Epic STS-1030) verteilt das Containe", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1047, "title": "API-Key-Auth-Layer fuer /api/tts/* (Service-Token-Bearer)", "desc": "## Problem\n\nDie externen Voice-Skills (`voice-cloning`, `voice-list`, `voice-tts`) und der `voice-pipeline-agent` aus de", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1046, "title": "Remote-Push von commit 64b21e3 nach senity-admin/senity-claude-code main (+ Tag v0.1.0)", "desc": "## Kontext\n\nCommit `64b21e3` (Image-Distribution #1031 + senity-CLI #1041 + SDRv4-Prompt + CLAUDE.md Worktree-Regel) wur", "pk": "senity-code", "tc": "CHO"}, {"id": 1044, "title": "senity-code Image bauen und v0.1.0 als erstes Tag-Release publishen", "desc": "## Kontext\n\nSub-Ticket zu #1031 (Image-Distribution). Die Gitea-Actions-Pipeline (`.gitea/workflows/build.yml`) ist seit", "pk": "senity-code", "tc": "CHO"}, {"id": 1043, "title": "Voice-Skill-Trio + Voice Pipeline Agent (senity-workspace)", "desc": "## Ziel\n\nIm senity-workspace (`D:/Devel/NodeJS/SDRv5/senity-workspace`) drei Skills plus einen Orchestrator-Agent anlege", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1041, "title": "Globaler CLI-Alias `senity`: ad-hoc Workspace-Container im aktuellen Verzeichnis starten", "desc": "**Idee:** Ein global installierter CLI-Befehl `senity` (analog zu `claude`, `codex`, `gemini`), der den Senity-Workspace", "pk": "SDRv5", "tc": "FEAT"}, {"id": 1040, "title": "Streaming-ASR als TTS-Action in @murc134/ui-kit", "desc": "## Hintergrund\n\nVorherige Implementation (Slot-Override `ChatStreamingInput` + Mode-Toggle \"transcribe/stream\" am Mic-Bu", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1039, "title": "Telegram-Bot Retest plus yt-dlp Bot-Detection fuer YouTube-Downloads", "desc": "## Scope\n\nAusgekoppelt aus #1037 Task #4. Zwei eng verwandte Themen die nach Abschluss der Async-Tool-Pipeline retestet ", "pk": "SDRv4", "tc": "BUG"}, {"id": 1038, "title": "Shared Projekt-Kontext für Claude/Codex/Gemini via Mount-Verdopplung", "desc": "## Idee\n\nStatt CLAUDE.md, AGENTS.md und GEMINI.md mit überlappendem Inhalt parallel zu pflegen, eine einzige Source-Date", "pk": "STS", "tc": "FEAT"}, {"id": 1037, "title": "Telegram-Bot YouTube: async Tool-Handler + Auto-/process + videoQuality-Mapping", "desc": "## Symptom (zusammengefasst aus 2026-05-24 00:37 UTC Incident)\n\nTelegram `senity_workspace_bot` schickt YouTube-Summariz", "pk": "SDRv4", "tc": "BUG"}, {"id": 1036, "title": ".bindings → compose.generated.yml-Generator", "desc": "## Kontext\nSub-Ticket zu #1031.\n\nDer Customer pflegt nur `.bindings` (Mount-Konfig im einfachen Key-Value-Format), nicht", "pk": "senity-code", "tc": "FEAT"}, {"id": 1035, "title": "Ticket-Schema: strukturierte Felder + JSON-Attribute + Notify-System (inkl. Bot-Targets)", "desc": "## Kontext\n\nAus Diskussion 2026-05-24 (Reaffirm \"Konversations-Tickets\"-Workflow): Tickets sollen kein Plain-Text-Contai", "pk": "STS", "tc": "FEAT"}, {"id": 1034, "title": "Customer-Onboarding-Pain reduzieren (WSL/Docker-Bootstrap härten)", "desc": "## Kontext\nSub-Ticket zu #1030.\n\nMarco und Timo hatten beim Aufsetzen des aktuellen Launchers erhebliche Probleme. Ohne ", "pk": "senity-code", "tc": "RESEARCH"}, {"id": 1033, "title": "Codex/Gemini Host-Login-Helper (senity-login)", "desc": "## Kontext\nSub-Ticket zu #1030.\n\nCodex- und Gemini-CLI brauchen OAuth-Login im Container. Aktuell muss der User im zweit", "pk": "senity-code", "tc": "FEAT"}, {"id": 1032, "title": "Hetzner-Results-Storage mit Pro-User-SFTP-Chroot", "desc": "## Kontext\nSub-Ticket zu #1030.\n\nHetzner-Server als zentrale RW-Ergebnis-Ablage pro Customer. Container mountet `/worksp", "pk": "senity-code", "tc": "FEAT"}, {"id": 1031, "title": "Image+Compose-Distribution statt Repo-Klon", "desc": "## Kontext\nSub-Ticket zu #1030.\n\nAktuell muss der Customer das `senity-workspace`-Repo klonen und den Container lokal ba", "pk": "senity-code", "tc": "FEAT"}, {"id": 1030, "title": "Container-Setup-Refactor für Customer-Tauglichkeit", "desc": "## Ziel\n\n`senity-workspace` Docker-Wrapper so umbauen, dass nicht-technische Customer (Marco, Timo, …) ihn ohne fremde H", "pk": "senity-code", "tc": "EPIC"}, {"id": 1029, "title": "YouTube Summarizer: HTTP 500 auf Remote (sdr.senity.ai) + Telegram-Bot-Workflow reparieren", "desc": "## Symptom\n\nTelegram senity_workspace_bot meldet beim Verarbeiten von https://youtu.be/nDoER71XnNo:\n- POST https://sdr.s", "pk": "SDRv4", "tc": "BUG"}, {"id": 1028, "title": "Workflow-Regel reaffirmed: Ticket pro Thema + Live-Kommentare", "desc": "## Anweisung\n\nUser-Reaffirmation 2026-05-24: „Jedes Mal, wenn wir ein neues Thema anschneiden, erstellst du ein Ticket. ", "pk": "SDRv4", "tc": "CHO"}, {"id": 1027, "title": "ASR-Stream im Chat tot: Q3ASR-Bridge auf 8891 nicht erreichbar", "desc": "## Symptom\n\nUser-Report 2026-05-24: „asr stream im chat funktioniert nicht mehr\". Console-Hinweis `usePcmCapture.ts:91 [", "pk": "SDRv4", "tc": "BUG"}, {"id": 1026, "title": "User-spezifische Skills/Agents-Auslieferung über SDRv4-API für senity-claude-Container", "desc": "## Kontext\n\nAktuell werden Skills und Agents im `senity-claude`-Docker-Container (Repo `senity-workspace`) bei jedem Con", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1024, "title": "Direkte Q3TTS-Aufrufe in /api/tts/* umgehen Fallback-Chain und Token-Counting", "desc": "## Problem\n\nMehrere TTS-API-Routes rufen `${Q3TTS_BASE_URL}/v1/audio/*` direkt per `fetch()` auf und umgehen damit den z", "pk": "SDRv4", "tc": "BUG"}, {"id": 1023, "title": "[Brainstorming] VAD-basierte Sprech-Anzeige im Chat-Voicestream", "desc": "## Ziel\n\nWenn der User im Chat den Voicestream aktiv hat, soll das System Voice Activity Detection (VAD) machen und visu", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1022, "title": "Voice-Original-Download im Voice Studio", "desc": "## Kontext\n\nIm Voice Studio (`/de/voice/voices`) sind hochgeladene Voices aktuell nur als Streaming-Quelle nutzbar (Vorh", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1021, "title": "Auto-Transcribe Voice-Uploads via Q3ASR (Fire-and-Forget)", "desc": "## Kontext\n\nIm Voice Studio (`/de/voice/voices`) bekommt jede hochgeladene Stimme nur dann das Badge **\"ICL bereit\"**, w", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1020, "title": "Bestellbot Cart-Integrity: Tool-Layer-Bugs (P0-0741a aus Session 72)", "desc": "# Sechs P0 Cart-Integrity-Findings auf Tool-Execution-Ebene\n\nDas Findings-Report Session 72 (#756) nennt unter P0-0741a ", "pk": "None", "tc": "BUG"}, {"id": 1019, "title": "Bestellbot Tonfall- und State-Containment-Block (von Migration 118 nicht abgedeckt)", "desc": "# Sechs Tonfall/State-Findings ohne Schutz in Migration 118\n\nDas Audit-Comment auf #754 nennt sechs Findings, die der Bo", "pk": "None", "tc": "FEAT"}, {"id": 1018, "title": "Bestellbot User-Statement-Containment: P0-67 / P0-93 / P0-95 (von Migration 118 nicht abgedeckt)", "desc": "# Drei Halluzinations-Patterns ohne Schutz in Migration 118\n\nDas v6.3-Audit zu #753 nennt drei Halluzinations-Patterns, ", "pk": "None", "tc": "FEAT"}, {"id": 1017, "title": "Migration 118 Whitelist-Korrektur: 'Smash Fire Burger' ist reales Item, kein Halluzinations-Beispiel", "desc": "# Aktiver Fehler im BB v6.3 System-Prompt\n\nMigration `db/118_2026-05-13-bb-v6.3-prompt-fixes.sql` listet in Zeile 231 (B", "pk": "None", "tc": "IMP"}, {"id": 1016, "title": "Migration 118 Drift-Fix: BB v6.3 Personality auf api-sdr-test deployen", "desc": "# Migration 118 traf falsches DB-Target\n\nMigration `db/118_2026-05-13-bb-v6.3-prompt-fixes.sql` wurde via `supabase db q", "pk": "None", "tc": "BUG"}, {"id": 1015, "title": "Voice chat-stream Hook-Extraktion Re-Refactoring (Regression nach #905)", "desc": "# Re-Refactoring nach Regression\n\nNach Sub-Ticket #905 (done) ist app/[locale]/(dashboard)/voice/chat-stream/page.tsx wi", "pk": "None", "tc": "IMP"}, {"id": 1014, "title": "[CLEANUP] #531 Verification Test (delete me)", "desc": "Test if project_key+type_code persist", "pk": "INFRA", "tc": "BUG"}, {"id": 1013, "title": "Migration 128 Duplikat: podcast-mode-and-active-replacement-set vs youtube-vision-fields", "desc": "## Problem\n\nIm Verzeichnis db/ existieren zwei Migrationen mit der gleichen Nummer 128:\n\n- db/128_2026-05-21-podcast-mod", "pk": "SDRv4", "tc": "BUG"}, {"id": 1010, "title": "Voice-Mode-Toggle in ChatInterface-Toolbar verschieben (neben Prompt)", "desc": "Der Auto-Vorlese-Toggle ist aktuell in einer eigenen Bar oberhalb des Chats (lokal in components/chat/ChatProvider.tsx).", "pk": "None", "tc": "FEAT"}, {"id": 1009, "title": "ChatComposer: gepinnte Symbole (Mikrofon, Code, Sparkle) werden nicht gerendert", "desc": "Im Default-Chat-Composer (@murc134/chat) erscheinen aktuell nur Sparkle + Send-Button. Im Pin-Menue sind 'Spracheingabe'", "pk": "None", "tc": "BUG"}, {"id": 1008, "title": "Auto-Deploy via Gitea-Webhook für main (Live) und dev (Test)", "desc": "## Ziel\n\nAutomatischer Deploy auf die Senity-Server, sobald ein Push auf `main` (Live) bzw. `dev` (Test) auf `git.senity", "pk": "SDRv4", "tc": "FEAT"}, {"id": 1007, "title": "Canva-Integration: Flyer und Visitenkarten via Claude erstellen", "desc": "Canva API-Integration in den Senity Workspace. Marco nutzt Canva fuer Flyer und Visitenkarten. Ziel: Claude soll Designs", "pk": "CLI", "tc": "FEAT"}, {"id": 1006, "title": "Gamma-Integration: Praesentationen und Pitch Decks via Claude erstellen", "desc": "Gamma (gamma.app) API-Integration in den Senity Workspace. Marco nutzt Gamma fuer Praesentationen und Pitch Decks. Ziel:", "pk": "CLI", "tc": "FEAT"}, {"id": 1005, "title": "E-Mail Setup: gescribano@gmx.de", "desc": "IMAP/SMTP-Zugang einrichten fuer gescribano@gmx.de (GMX, privat). App-Passwort oder IMAP-Freischaltung in GMX-Einstellun", "pk": "CLI", "tc": "FEAT"}, {"id": 1004, "title": "E-Mail Setup: marco.escribano.guuerero@senity.net", "desc": "IMAP/SMTP-Zugang einrichten fuer marco.escribano.guuerero@senity.net (Google Workspace, Senity). Hinweis: Tippfehler in ", "pk": "CLI", "tc": "FEAT"}, {"id": 1003, "title": "E-Mail Setup: team@oneandhivenetworks.de", "desc": "IMAP/SMTP-Zugang einrichten fuer team@oneandhivenetworks.de (Google Workspace, One & Hive Networks). App-Passwort erstel", "pk": "CLI", "tc": "FEAT"}, {"id": 1002, "title": "E-Mail Setup: maresconia33@gmail.com", "desc": "IMAP/SMTP-Zugang einrichten fuer maresconia33@gmail.com (Gmail, persoenlich/allgemein). App-Passwort erstellen, in .env.", "pk": "CLI", "tc": "FEAT"}, {"id": 1001, "title": "E-Mail Setup: marco.escribano@chance-medizin.de", "desc": "IMAP/SMTP-Zugang einrichten fuer marco.escribano@chance-medizin.de (Google Workspace, Chance Medizin). App-Passwort erst", "pk": "CLI", "tc": "FEAT"}, {"id": 1000, "title": "E-Mail-Integration Marco: IMAP/SMTP-MCP f�r alle 5 Konten", "desc": "Aufbau eines einheitlichen MCP-Servers (mcp-servers/email/) der alle 5 E-Mail-Konten von Marco via IMAP/SMTP anbindet. C", "pk": "CLI", "tc": "EPIC"}, {"id": 999, "title": "Voice-Integration M4: E2E-Tests + Performance-Messung + Doku", "desc": "Abschluss-Milestone des Voice-Epics SDRv4-989 (Default-Chat Voice-Integration).\n\nNach erfolgreichem Merge der Milestones", "pk": "SDRv4", "tc": "FEAT"}, {"id": 997, "title": "YouTube-Summarizer Rate-Limit fuer Founder-Accounts auf 500/h heben", "desc": "Aktuell HTTP 429 ab dem 5. Job pro Stunde, Detail-Message \"Rate-Limit ueberschritten: maximal 5 Jobs pro Stunde\". Die Za", "pk": "SDRv4", "tc": "FEAT"}, {"id": 996, "title": "Rate-Limit YouTube-Summarizer auf 500/Stunde für Founder", "desc": "Das Rate-Limit der YouTube-Summarizer-Route (bzw. der zugrundeliegenden Limiter-Middleware) soll für die vier Senity-Fou", "pk": "SDRv4", "tc": "IMP"}, {"id": 995, "title": "Voice-Cloning + Voice-Auswahl im voice-tts-Endpoint exponieren", "desc": "## Ziel\nDie Voice-Generierung über `/api/cli-channels/:id/send` (`type:\"voice-tts\"`) erlaubt aktuell nur eine hardcoded ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 994, "title": "TTS Voice-Cloning per SDRv4-Endpoint prüfen und ggf. ergänzen", "desc": "Kontext\n\nChris fragt: ist es möglich, über die SDRv4-Voice/TTS-Route eine fremde Stimme zu klonen (Reference-Voice-Cloni", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 993, "title": "ui-kit stream-Prop nativ + ChatComposer-Migration weg von SDRv4-Wrappern", "desc": "## Ziel\n\nDie in SDRv4-992 angelegten lokalen Wrapper components/voice/StreamingTTSField.tsx und StreamingTTSArea.tsx sin", "pk": "SDRv4", "tc": "FEAT"}, {"id": 992, "title": "ASR-Button auf Live-Stream + stream-Prop für TTSField/TTSArea/MarkdownField", "desc": "## Ziel\n\nDer bestehende ASR-Button im Chat-Composer wird von Batch-Recording (MediaRecorder + Upload) auf echten **Live-", "pk": "SDRv4", "tc": "FEAT"}, {"id": 991, "title": "Stream-Replace-Toggle neben Prompt-Button im Default-Chat", "desc": "## Ziel\n\nButton neben dem Podcast-Mode-Toggle, blendet sich nur ein, wenn Podcast-Mode aktiv ist. Aktiviert die Stream-R", "pk": "SDRv4", "tc": "FEAT"}, {"id": 990, "title": "Podcast-Mode: Auto-TTS-Stream aller Chat-Bubbles", "desc": "## Ziel\n\nIm Default-Chat wird ein **Podcast-Mode-Toggle** in der Chat-Toolbar (neben dem bestehenden `Prompt`-Button) ei", "pk": "SDRv4", "tc": "FEAT"}, {"id": 989, "title": "Default-Chat Voice-Integration (Podcast-Mode + Stream-Replace + Live-ASR)", "desc": "## Ziel\n\nDer Default-Chat (qwen3.6:35b + Personalities) bekommt drei eng verzahnte Voice-Features. Sub-Tickets siehe `me", "pk": "SDRv4", "tc": "EPIC"}, {"id": 988, "title": "PoC: Frame-Vision-Pipeline für YouTube-Summarizer (Upload + YouTube unified)", "desc": "## Ziel\n\nMinimaler Proof of Concept: YouTube-Summarizer soll für **uploaded Videos** und **YouTube-Videos gleichermaßen*", "pk": "SDRv4", "tc": "FEAT"}, {"id": 987, "title": "Ernährungscoach: Initial-Anamnese mit Christoph durchführen und Gesundheitsakte anlegen", "desc": "## Kontext\n\nMit Ticket #986 wurde die Coach-Persönlichkeit, die Mission und die Multi-Reviewer-Pipeline in `projects/ern", "pk": "CORE", "tc": "CHO"}, {"id": 986, "title": "Ernährungscoach: Persönlichkeit + Multi-Reviewer-Pipeline in CLAUDE.md verankert", "desc": "## Kontext\n\nDas Ernährungscoach-Projekt (`projects/ernaehrungscoach/`) hatte zwar eine Persona-Datei (`agents/coach.md`)", "pk": "CORE", "tc": "FEAT"}, {"id": 985, "title": "Locale-Lock je Personality: Sprach-Anker im System-Prompt + chat_personality.locale-Spalte", "desc": "## Problem\n\nVoice + Web-Chat antworten in CJK oder Englisch, obwohl die UI auf Deutsch laeuft und der User auf Deutsch s", "pk": "SDRv4", "tc": "BUG"}, {"id": 984, "title": "Q3ASR-Bridge-Parser verliert Daten bei mehreren `&lt;asr_text&gt;`-Markern in einer Response", "desc": "## Symptom\n\nQ3ASR liefert in manchen Faellen mehrere Transkript-Segmente in einer einzelnen Response, getrennt durch wie", "pk": "SDRv4", "tc": "BUG"}, {"id": 983, "title": "Q3TTS Eigennamen-Aussprache: \"Burger Bulle\" wird als \"Burger Bullet\" gesprochen", "desc": "## Symptom\n\nQ3TTS spricht den Markennamen \"Burger Bulle\" als \"Burger Bullet\" aus (englisch, mit gesprochenem End-T). Kli", "pk": "SDRv4", "tc": "BUG"}, {"id": 982, "title": "Voice-Chat-Stream verarbeitet zweiten User-Turn nicht (Conversation bricht ab)", "desc": "## Symptom\n\nNach dem ersten erfolgreichen Voice-Turn (User spricht, Bot antwortet via TTS) verarbeitet der Voice-Chat-St", "pk": "SDRv4", "tc": "BUG"}, {"id": 981, "title": "Voice-Stream Sanitization (ASR CJK-Filter + TTS Emoji-Cleaning + Personality Voice-Suffix)", "desc": "## Kontext\n\nIm Voice-Chat-Stream treten zwei reproduzierbare Defekte auf (Repro: test voicebot.mp4, 2026-05-20):\n\n1. **A", "pk": "SDRv4", "tc": "FEAT"}, {"id": 980, "title": "Workspace-Identität: Wie soll sich der Senity Workspace bei Usern vorstellen?", "desc": "Hallo Timo,\n\nich bin der Senity Workspace, das interne KI-Cockpit, mit dem Du, Christoph, Marco und Rick arbeitet. Chris", "pk": "CORE", "tc": "RESEARCH"}, {"id": 979, "title": "MSH-Status-Agent für parallele Chat-Updates während längerer Tool-Ketten (Variante A)", "desc": "Hintergrund\n\nIn Telegram fühlt sich Stille während längerer Tool-Ketten wie ein Hänger an (Voice 1036/1038/1042, Chris, ", "pk": "CORE", "tc": "FEAT"}, {"id": 978, "title": "Telegram-Download-Verzeichnis: Group-Write fehlt, ASR-Cleanup schlägt still fehl", "desc": "Symptom\n\nDer asr-transcribe-Skill versucht nach jeder Voice-Transkription die Original-Audio-Datei aus /data/downloads/t", "pk": "INFRA", "tc": "BUG"}, {"id": 977, "title": "KI nimmt an Google Meet teil (eigener Account + Voice Stream)", "desc": "Idee von Chris (Telegram Voice 999 + 1001, 2026-05-20).\n\nZiel: Die KI tritt einem Google-Meet-Meeting wie ein normaler T", "pk": "CLI", "tc": "FEAT"}, {"id": 976, "title": "SDRv4: Google Calendar an User-Accounts anbinden", "desc": "Anbindung von Google Calendar an SDRv4 für User-Accounts. Auth-Flow (OAuth), Multi-Account-Handling, Refresh-Token-Speic", "pk": "SDRv4", "tc": "FEAT"}, {"id": 975, "title": "Senity Cloud Code Client: GitHub Read-Only Sync + eigener Google-Account fuer KI", "desc": "Geaendert am 2026-05-20 (Telegram Voice 1001 von Chris): Google-Anbindung NICHT mehr ueber Chris-Accounts, sondern ueber", "pk": "CLI", "tc": "FEAT"}, {"id": 974, "title": "Eigener Google-Account fuer die KI (statt Chris-Accounts anbinden)", "desc": "Geaendert am 2026-05-20 auf Anweisung von Chris (Telegram Voice 1001).\n\nNEUER ANSATZ (ersetzt den vorherigen Plan, Chris", "pk": "CLI", "tc": "FEAT"}, {"id": 973, "title": "GitHub Read-Only-Sync von senity-workspace nach Google Drive", "desc": "Auto-Sync des senity-workspace Git-Repos zu Google Drive, damit der Workspace-Stand dort immer aktuell verfuegbar ist.\n\n", "pk": "CLI", "tc": "FEAT"}, {"id": 972, "title": "Voice Chat-Stream Test-Skripte: voice-stream-e2e + silence + repeat (Plan v2.1 Task D)", "desc": "## Kontext\n\nPlan v2.1 Phase 2 Task D: Drei dedizierte Test-Skripte unter scripts/voice/ fuer reproduzierbare Sanity-Chec", "pk": "SDRv4", "tc": "CHO"}, {"id": 971, "title": "Voice Chat-Stream Language-Dropdown (Plan v2.1 Task B)", "desc": "## Kontext\n\nPlan v2.1 Phase 2 Task B: UI-Dropdown auf /voice/chat-stream zum Umschalten der ASR-Spracherkennung (Auto / ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 970, "title": "Voice Mode im Default-Chat (Integration nach chat-stream Test-Page)", "desc": "Sobald /de/voice/chat-stream stabil l�uft: Voice-Mode-Button in den Default-Chat integrieren.\n\n## Kontext\n- Test-Page /d", "pk": "STS", "tc": "None"}, {"id": 969, "title": "[Brainstorming] Partnerprojekt Senity x Samim � Marke Weltverbesserer", "desc": "Gemeinsames Brainstorming f�r ein Partnerprojekt zwischen Senity und Samim. Ziel: gemeinsame Marke und gemeinsames Produ", "pk": "CORE", "tc": "FEAT"}, {"id": 968, "title": "Voice Concurrency-Test: Multi-Session GPU-Semaphore-Load", "desc": "Plan v2 Phase 0/C: Load-Test fuer GPU-Semaphore (max 1 ASR + 1 TTS gleichzeitig pro VRAM-Profil).\n\nScope:\n- N parallele ", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 967, "title": "Voice SIP-Probe: LiveKit-Bridge fuer Telefonie-Eingang", "desc": "Plan v2 Phase 0/E: SIP-Telefonie-Eingang via LiveKit-Bridge (oder Alternative) zum Voice-Chat-Stream. Heute browser-only", "pk": "SDRv4", "tc": "FEAT"}, {"id": 966, "title": "Voice Chat-Stream Marktreife-Sweep (Pentest + Sec-Audit extern)", "desc": "Plan v2 Phase 0/D: Externer Pentest + Security-Audit fuer Voice-Stack (WS-Endpoints, Consent-Flow, Voice-Print, EU-Allow", "pk": "SDRv4", "tc": "CHO"}, {"id": 965, "title": "Voice Chat-Stream E2E-Suite mit Fake-Audio (Playwright)", "desc": "Plan v2 Phase 2: Browser-Use / Playwright E2E-Test fuer `/de/voice/chat-stream` mit Fake-Audio-Stream (chrome `--use-fak", "pk": "SDRv4", "tc": "FEAT"}, {"id": 964, "title": "Voice Chat-Stream URL-Resolver + WS-Ports (Phase 1 v2)", "desc": "Voice Chat-Stream Page (`/de/voice/chat-stream`) hat falsche WS-URLs: Fallback nutzt Port 3000 statt 3002 (ASR) und 3003", "pk": "SDRv4", "tc": "BUG"}, {"id": 963, "title": "useVoiceStream: Controller stale orchestrator.voiceId Closure-Bug", "desc": "## Symptom\n\nAuf `/voice/chat-stream` wirft `start()` den Fehler `voice_id_missing: voiceId required: no voice selected f", "pk": "SDRv4", "tc": "BUG"}, {"id": 961, "title": "[Voice-Ops] Migration 126 + 127 Deploy auf Selfhost-Supabase", "desc": "**Op-Ticket für Migration-Deploy nach Welle 3+4**\n\nZwei Migrationen liegen committet aber nicht ausgeführt:\n\n**Migration", "pk": "SDRv4", "tc": "CHO"}, {"id": 960, "title": "[Voice-Sub-9b] rnnoise.wasm Binary-Lieferung + Glue ohne STUB", "desc": "**Follow-up zu #890**\n\n#890 hat die RNNoise-Pipeline + AudioWorklet-Stage + Settings-Toggle ausgeliefert, aber `public/a", "pk": "SDRv4", "tc": "FEAT"}, {"id": 959, "title": "[Voice-Sub-8b] Opus-Pfad in useAsrStream aktivieren + 3G/4G-Lasttest + A/B PCM16 vs Opus auf Hardware", "desc": "**Vorbedingung:** #889 erledigt (Opus-Codec, Wire-Format, Encoder-Worker, Bridge-Decode-Pfad, 25 Vitest gruen).\n\n**Pendi", "pk": "SDRv4", "tc": "FEAT"}, {"id": 958, "title": "[Voice-Security] F-CACHE-1: ws-auth Allowlist-Cache hat keinen Reset-Pfad bei Env-Reload", "desc": "## Finding aus #894 Voice-Sub-13 Pen-Test\n\n**Quelle:** `docs/security/voice-streaming-pentest-2026-05-17.md` F-CACHE-1\n\n", "pk": "SDRv4", "tc": "CHO"}, {"id": 957, "title": "[Voice-Security] F-JWT-LOG-1: JWT-Inhalte in Edge-Logs bei Fehlerfaellen (Token-Leak)", "desc": "## Finding aus #894 Voice-Sub-13 Pen-Test\n\n**Quelle:** `docs/security/voice-streaming-pentest-2026-05-17.md` F-JWT-LOG-1", "pk": "SDRv4", "tc": "BUG"}, {"id": 956, "title": "[Voice-DSGVO] F-VOICEPRINT-1: Voice-Print-Persistenz braucht expliziten Consent-Scope (Art. 9 DSGVO)", "desc": "## Finding aus #894 Voice-Sub-13 DSGVO-Audit\n\n**Quelle:** `docs/legal/voice-streaming-dsgvo-audit-2026-05-17.md` F-VOICE", "pk": "SDRv4", "tc": "FEAT"}, {"id": 955, "title": "[Voice-Security] F-AUDIO-1: Magic-Byte-Validierung nur Header-basiert (Polyglot-Bypass moeglich)", "desc": "## Finding aus #894 Voice-Sub-13 Pen-Test\n\n**Quelle:** `docs/security/voice-streaming-pentest-2026-05-17.md` F-AUDIO-1\n*", "pk": "SDRv4", "tc": "BUG"}, {"id": 954, "title": "[Voice-Security] F-CSWSH-1: Origin=undefined in Non-Prod akzeptiert (CSWSH-Risiko bei Misconfig)", "desc": "## Finding aus #894 Voice-Sub-13 Pen-Test\n\n**Quelle:** `docs/security/voice-streaming-pentest-2026-05-17.md` F-CSWSH-1\n*", "pk": "SDRv4", "tc": "BUG"}, {"id": 953, "title": "Voice-Lasttest tatsächlich ausführen (k6 install + Schwellen-Validierung #950 AK7)", "desc": "Follow-up zu #950 AK7: Lasttest-Skripte sind committet (`tests/load/voice-streaming.k6.js`), aber k6/Artillery sind wede", "pk": "SDRv4", "tc": "CHO"}, {"id": 952, "title": "Regression-Tests für envsys-Proxy + find-env-files Walker", "desc": "Follow-up aus Verifikation #900 (P0 done). Beide Findings sind funktional sauber, aber Regression-Tests fehlen.\n\n## Test", "pk": "SDRv4", "tc": "CHO"}, {"id": 951, "title": "Test-Failure-Cluster: 13 pre-existing Test-Files failen auf main + dev (nav-disclosure, table-config, openapi, currency, parse-target-mount, edge-compat, middleware, tts-asr-fallback, boards-proxy, voice/generate)", "desc": "## Kontext\n\nWährend P0-Mergewelle-Triage (2026-05-17) entdeckt: 13 Test-Files failen sowohl auf `dev` (Voice-Stack) als ", "pk": "SDRv4", "tc": "BUG"}, {"id": 950, "title": "Voice-Performance-Hardening: Backpressure drain-Event, doppelte Audit-Inserts, MP3-Aligner Ring-Buffer, First-Sentence-Latency", "desc": "## Kontext\n\nCluster C6 Performance-Audit (Zyklus 6). Pre-Beta-Latenz-Hebel.\n\n## Findings\n\n**C6-3 (P1) Backpressure-Polli", "pk": "SDRv4", "tc": "IMP"}, {"id": 949, "title": "Voice-WS Hardening: JTI-Cache, Revocation-Realtime-Invalidation, Audit-Schema-Erweiterung", "desc": "## Kontext\n\nCluster B6 Security-Audit (Zyklus 6). Hardening-Backlog.\n\n## Findings\n\n**B6-F4 (P2) Kein JTI/Nonce-Cache**, ", "pk": "SDRv4", "tc": "IMP"}, {"id": 948, "title": "Voice-WS Helper-Konsolidierung: JWKS, decodeCookieJson, cookie-reader-Fallbacks dedupen", "desc": "## Kontext\n\nCluster A6 Code-Review (Zyklus 6). Restliche Duplikate aus #933/#934-Refactor.\n\n## Findings\n\n**A6-F3 (P2)**,", "pk": "SDRv4", "tc": "IMP"}, {"id": 947, "title": "Server-side MIME-Whitelist + Magic-Byte-Validation für /api/chat/asr", "desc": "## Kontext\n\nCluster D6 Reality-Check (Zyklus 6). `app/api/asr/transcribe/route.ts` hat `ALLOWED_MIME_SET` + `validateAud", "pk": "SDRv4", "tc": "BUG"}, {"id": 946, "title": "Q3ASR/Q3TTS Host-Region-Pinning + EU-Allow-List Boot-Time-Validation", "desc": "## Kontext\n\nCluster B6 Security/DSGVO-Audit (Zyklus 6). Cross-Border-Risiko Art. 44 ff. DSGVO.\n\n## Problem\n\n`lib/voice-c", "pk": "SDRv4", "tc": "IMP"}, {"id": 945, "title": "E2E-Test mid-stream consent-revoke + Voice-Conversation Happy-Path", "desc": "## Kontext\n\nCluster B6 (DSGVO Audit-Beweispflicht) + D6 (Reality-Check) Zyklus 6.\n\n## Problem\n\n`tests/e2e/` enthält wede", "pk": "SDRv4", "tc": "CHO"}, {"id": 944, "title": "Consent-Watcher fail-CLOSED Polling-Fallback statt fail-OPEN bei Channel-Error", "desc": "## Kontext\n\nCluster B6 Security/DSGVO-Audit (Zyklus 6). Inkonsistenz zu #935 fail-CLOSED-Pattern (VoiceRevocationMarkerE", "pk": "SDRv4", "tc": "BUG"}, {"id": 943, "title": "Q3ASR-Backpressure: Sequence-Tracking + Client-Pause statt Silent-Drop", "desc": "## Kontext\n\nCluster C6 Performance-Audit (Zyklus 6). Marktreife-Blocker für Q3ASR-Qualität.\n\n## Problem\n\n`lib/voice/asr-", "pk": "SDRv4", "tc": "IMP"}, {"id": 942, "title": "Realtime-Channel-Skalierung: Singleton-Watcher statt 1 Channel pro Stream", "desc": "## Kontext\n\nCluster C6 Performance-Audit (Zyklus 6). Skalierungs-Cap bei 100+ concurrent Voice-Sessions.\n\n## Problem\n\n`l", "pk": "SDRv4", "tc": "IMP"}, {"id": 941, "title": "verifyClient 4 DB-Round-Trips pre-upgrade konsolidieren (Combined-RPC + Consent-Cache)", "desc": "## Kontext\n\nCluster C6 Performance-Audit (Zyklus 6). TTFB-Blocker für Voice-MVP-GA-Ziel (<800 ms).\n\n## Problem\n\n`verifyC", "pk": "SDRv4", "tc": "IMP"}, {"id": 940, "title": "TTS-WS Drift-Cleanup: handleProtocols-Echo, ctx.closed-Pattern, Audit-Status-Drift", "desc": "## Kontext\n\nCluster A6 Code-Review (Zyklus 6) nach Merge #934/#933/#935/#932 auf `dev`. Drift zwischen TTS-WS-Handler un", "pk": "SDRv4", "tc": "IMP"}, {"id": 939, "title": "Test-Suite Drift Sammler: 13 Non-Voice-Test-Files mit pre-existing Failures", "desc": "## Kontext\n\nVerifiziert per `git stash`-Baseline-Run vor #932-Arbeit (2026-05-17): 13 Test-Files / 16 Tests failen berei", "pk": "SDRv4", "tc": "BUG"}, {"id": 938, "title": "Scope-Drift Cleanup: company-groups und perspective Cast", "desc": "## Kontext\n\nSub-Finding aus Multi-Modell-Review #909 (Code MINOR #1). Parent: #698.\n\n## Problem\n\nWährend des #909-Refact", "pk": "SDRv4", "tc": "IMP"}, {"id": 937, "title": "Fail-closed Re-Eval für Multi-Replica + DSGVO Art. 7 Abs. 3", "desc": "## Kontext\n\nSub-Finding aus Multi-Modell-Review #909 (Sec#3 + Sec#4). Parent: #698.\n\n## Fragestellung\n\nAktueller fail-cl", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 936, "title": "RLS select_self-Policy auf voice_session_revocation entfernen", "desc": "## Kontext\n\nSub-Finding aus Multi-Modell-Review #909 (Sec#6). Parent: #698.\n\n## Problem\n\nMigration 123 enthält `select_s", "pk": "SDRv4", "tc": "IMP"}, {"id": 935, "title": "revokeMarkerError löst falschen Status-Wechsel aus", "desc": "## Kontext\n\nSub-Finding aus Multi-Modell-Review #909 (Sec#7). Parent: #698.\n\n## Problem\n\nWenn `getVoiceRevocationMarker`", "pk": "SDRv4", "tc": "BUG"}, {"id": 934, "title": "Cookie-Reader-Dedup als shared util extrahieren", "desc": "## Kontext\n\nSub-Finding aus Multi-Modell-Review #909 (Code MAJOR #2). Parent: #698.\n\n## Problem\n\nCookie-Reader-Logik (Ch", "pk": "SDRv4", "tc": "IMP"}, {"id": 933, "title": "ws-tts-handler: verifyClient auf verifyVoiceWsToken umstellen", "desc": "## Kontext\n\nSub-Finding aus Multi-Modell-Review #909 (Code MAJOR #3). Parent: #698.\n\n## Problem\n\n`ws-tts-handler` nutzt ", "pk": "SDRv4", "tc": "IMP"}, {"id": 932, "title": "Voice-Test-Suite: Mock-Lücken aus #908 Realtime-Watcher-Integration schließen", "desc": "## Problem\n\nNach Merge von #908 (Voice-Consent-Realtime-Watcher) failen 18 Test-Files mit zwei Hauptursachen:\n\n1. **`Typ", "pk": "SDRv4", "tc": "BUG"}, {"id": 931, "title": "Voice-Orchestrator WS-Handler (Cluster C: C5+C6)", "desc": "## Kontext\n\nSub-Ticket unter Voice-Stream-Plan #698, Cluster C (Orchestrator). Trackt die Tasks C5 (WS-Handler) und C6 (", "pk": "SDRv4", "tc": "FEAT"}, {"id": 930, "title": "Q3ASR Streaming-Bridge bauen (Pre-Cluster zu #698)", "desc": "Q3ASR-Backend hat nur `/v1/audio/transcriptions` (HTTP Batch). Voice-Streaming-Plan #698 braucht WebSocket-Streaming. Di", "pk": "SDRv4", "tc": "FEAT"}, {"id": 929, "title": "Audit-Cycle 6, Cluster D6 DB (8 Findings, 2× P0)", "desc": "## Cluster D6, DB-Audit Findings\n\nParent-Epic: #925\n\n### Findings\n\n**F1 P0, Migration-Nummer 116 doppelt**\n- Dateien: `d", "pk": "SDRv4", "tc": "IMP"}, {"id": 928, "title": "Audit-Cycle 6, Cluster C6 Frontend (8 Findings)", "desc": "## Cluster C6, Frontend-Audit Findings\n\nParent-Epic: #925\n\n### Findings\n\n**F1 P1, Stale-Closure useCallback empty deps**", "pk": "SDRv4", "tc": "IMP"}, {"id": 927, "title": "Audit-Cycle 6, Cluster B6 Backend (8 Findings)", "desc": "## Cluster B6, Backend-Audit Findings\n\nParent-Epic: #925\n\n### Findings\n\n**F1 P1, YouTube N+1-Update-Loop**\n- Datei: `lib", "pk": "SDRv4", "tc": "IMP"}, {"id": 926, "title": "Audit-Cycle 6, Cluster A6 Security (5 Findings)", "desc": "## Cluster A6, Security-Audit Findings\n\nParent-Epic: #925\n\n### Findings\n\n**F1 P1, SSRF via Redirect-Follow**\n- Datei: `a", "pk": "SDRv4", "tc": "IMP"}, {"id": 925, "title": "Audit-Cycle 6, Master-Epic (4 parallele Audits, 24 Findings)", "desc": "## Kontext\nZweiter autonomer Review-Zyklus nach Cycle 5 (Epic #899). 4 parallele Audits durchgeführt:\n- Cluster A6: Secu", "pk": "SDRv4", "tc": "EPIC"}, {"id": 924, "title": "claude-msh: Welcome-Box-Title \"Claude Code v1.0\" auf \"Senity Wksp\" patchen", "desc": "## Problem\nWelcome-Box-Header rendert `╭─── Claude Code v1.0 ───...╮` trotz mehrfacher String-Patches im claude-Binary. ", "pk": "CORE", "tc": "CHO"}, {"id": 923, "title": "claude-msh: ASCII-Mascot in Welcome-Box ausfiltern", "desc": "## Problem\nWelcome-Box im Senity Workspace zeigt grossen ASCII-Art-Mascot (Anthropic-Llama + Wolken + Buchstaben). Bishe", "pk": "CORE", "tc": "CHO"}, {"id": 922, "title": "Senity Chat Proxy: Claude-Identity-System-Prompt strippen/umschreiben", "desc": "## Problem\nClaude Code CLI im Senity Workspace Container routet ueber `https://sdr.senity.ai/api/claude-proxy` (Backend:", "pk": "CORE", "tc": "BUG"}, {"id": 921, "title": "Investor-Exposé Slide 7: Pricing-Cost-Story (Option A/B/C entscheiden)", "desc": "**Kontext:** Slide 7 des Investor-Exposé v4.1 zeigt nackt 199/449/749 € MRR mit 369 € Blended und 4.270 € ARR. Chris hat", "pk": "CORE", "tc": "FEAT"}, {"id": 920, "title": "Investor-Exposé v4: Bio-CV prior stations", "desc": "**Kontext:** Senity Voice-AI Investor-Exposé v4 (`build/expose/senity-expose-v4.pdf`, Slide 10 „Team\").\n\n**TODO Rick:**\n", "pk": "CORE", "tc": "FEAT"}, {"id": 919, "title": "Investor-Exposé v4: orderbird-Vorsprung schriftlich + Bio-CV", "desc": "**Kontext:** Senity Voice-AI Investor-Exposé v4 (`build/expose/senity-expose-v4.pdf`, Slide 5 „Produkt\" + Slide 9 „Roadm", "pk": "CORE", "tc": "FEAT"}, {"id": 918, "title": "Investor-Exposé v4: Voice-Stack-Independence bestätigen + Bio-CV", "desc": "**Kontext:** Senity Voice-AI Investor-Exposé v4 (`build/expose/senity-expose-v4.pdf`, Slide 11 „Risiken\").\n\n**TODO Chris", "pk": "CORE", "tc": "FEAT"}, {"id": 917, "title": "Investor-Exposé v4: Review + Trattoria-Pilot-Zitat + Bio-CV", "desc": "**Kontext:** Senity Voice-AI Investor-Exposé v4 ist gerendert (`build/expose/senity-expose-v4.pdf`, 12 Slides A4 Querfor", "pk": "CORE", "tc": "FEAT"}, {"id": 916, "title": "FlexibleNodeJSTools: pnpm install fehlt", "desc": "C:/Users/Timo/Documents/Senity Workspace/FlexibleNodeJSTools hat package.json + pnpm-lock.yaml aber kein node_modules. p", "pk": "FLEX", "tc": "CHO"}, {"id": 915, "title": "SDRv4 lokal installierbar machen", "desc": "Bei Timo fehlt node_modules und .env.local unter C:/Users/Timo/Documents/Senity Workspace/sdrv4. npm install + .env.loca", "pk": "SDRv4", "tc": "CHO"}, {"id": 914, "title": "GitHub CLI (gh) auf Timos Rechner installieren", "desc": "gh-CLI fehlt im PATH. Wird in CLAUDE.md / Workspace-Workflows fuer PR-Handling und Repo-Operationen vorausgesetzt. Senit", "pk": "INFRA", "tc": "CHO"}, {"id": 913, "title": "Docker Desktop auf Timos Rechner installieren", "desc": "docker-CLI ist auf Timos Windows nicht im PATH (weder als docker noch ueber WSL). Damit faellt jede Microservice-Arbeit ", "pk": "INFRA", "tc": "CHO"}, {"id": 911, "title": "Pre-existing Test-Failures: parse-target-mount semantics drift", "desc": "## Kontext\n`tests/services/cli-orchestrator/parse-target-mount.test.ts` failt aktuell mit 16 Failures. Die Failures sind", "pk": "SDRv4", "tc": "BUG"}, {"id": 910, "title": "RLS-Fallback-Strict: createScopedClient ohne Session-JWT muss AuthError werfen statt anon", "desc": "## Kontext\n\nAus Review #903 (Cluster 4 Audit-Runde, 2026-05-16), Sub-Ticket unter Voice-Stream-Plan #698.\n\n## Problem\n\n`", "pk": "SDRv4", "tc": "BUG"}, {"id": 909, "title": "Consent-Token-Revoke: JWT-Blacklist oder Revocation-Tabelle für widerrufene Tokens", "desc": "## Kontext\n\nAus Review #903 (Cluster 4 Audit-Runde, 2026-05-16), Sub-Ticket unter Voice-Stream-Plan #698.\n\n## Problem\n\nV", "pk": "SDRv4", "tc": "FEAT"}, {"id": 908, "title": "Voice-Stream-Revoke-Race: laufende Streams bei Consent-Widerruf sofort abbrechen", "desc": "## Kontext\n\nAus Review #903 (Cluster 4 Audit-Runde, 2026-05-16), Sub-Ticket unter Voice-Stream-Plan #698.\n\nDSGVO Art. 7 ", "pk": "SDRv4", "tc": "BUG"}, {"id": 907, "title": "Audit Cluster 3 Round B, Health-Check ohne AbortSignal + Service-Boundary Senity-Schema", "desc": "## Kontext\nCycle-5-Audit Cluster 3 Round B, die zwei verbleibenden MED-Findings im Backend-Cluster (#899). Round A ist a", "pk": "SDRv4", "tc": "BUG"}, {"id": 906, "title": "Audit Cluster 3 Round A, Locale-Race + Avatar-N+1 + XLSX-File-Race", "desc": "## Kontext\n\nCycle-5-Audit Cluster 3 Round A, drei HIGH-Findings aus dem Backend-Cluster, die parallel zu #902 (P0-Backen", "pk": "SDRv4", "tc": "BUG"}, {"id": 905, "title": "Voice Hook-Extraktion (useChunkedRecorder / useV2VPipeline / useAutoTTSQueue)", "desc": "## Kontext\n\nAusgegliedert aus #901 (Audit Cluster 2, Voice). Round A (AudioContext-Leak P0-C) und Round B (Stale-Closure", "pk": "SDRv4", "tc": "IMP"}, {"id": 904, "title": "Audit Cluster 5, Migrations: Doppelter Pfad db/migrations vs supabase/migrations", "desc": "Audit-#899 Cluster 5.\n\n## P0-L: Migrations-Drift\n- `db/migrations/*` (118 Files), historischer Pfad\n- `supabase/migratio", "pk": "SDRv4", "tc": "IMP"}, {"id": 903, "title": "Audit Cluster 4, Compliance: RLS-Bypass + Path-Traversal in Voice-Consent", "desc": "Audit-#899 Cluster 4, `app/api/voice/consent/route.ts`.\n\n## P0-G: RLS-Bypass im DELETE-Pfad\nZeilen 234, 260, 265, 287, 2", "pk": "SDRv4", "tc": "BUG"}, {"id": 902, "title": "Audit Cluster 3, Backend: Race, Health-Check, N+1, Service-Boundary", "desc": "Audit-#899 Cluster 3.\n\n## P0-E: Port-Registry Race\n`lib/workspace/port-registry.ts:18-74`, `assignPort` SELECT MAX + INS", "pk": "SDRv4", "tc": "BUG"}, {"id": 901, "title": "Audit Cluster 2, Voice: AudioContext-Leak, Stale-Closure, God-Component", "desc": "Audit-#899 Cluster 2, `app/[locale]/(dashboard)/voice/chat-stream/page.tsx` (1485 LOC).\n\n## P0-C: AudioContext-Leak bei ", "pk": "SDRv4", "tc": "BUG"}, {"id": 900, "title": "Audit Cluster 1, Security: envsys-Proxy Auth + .env.local Build-Leak", "desc": "Audit-#899 Cluster 1.\n\n## P0-A: envsys-Proxy ohne Auth\n`app/api/envsys/[...path]/route.ts`, Anonymer Passthrough zu `env", "pk": "SDRv4", "tc": "BUG"}, {"id": 899, "title": "Projekt-Audit 2026-05-16, 13 P0 / 31 P1 / 29 P2 Findings", "desc": "## Audit-Report 2026-05-16\n\nKomplett-Review (Code/Security/Performance/Architecture) der SDRv4-Codebasis via 4 parallele", "pk": "SDRv4", "tc": "EPIC"}, {"id": 898, "title": "[Voice-Sub-17] i18n DE/EN Voice-UI-Strings (murc134-Pattern)", "desc": "**R3-Bereich:** i18n\n\nAlle Voice-UI-Strings über murc134-Pattern in DE/EN.\n\n**Strings:**\n- „Aufnahme starten/stoppen\", „", "pk": "SDRv4", "tc": "FEAT"}, {"id": 897, "title": "[Voice-Sub-16] User-Doku + Admin-Doku + Operator-Runbook", "desc": "**R3-Bereich:** Documentation\n\nDrei Doku-Stränge:\n1. **User-Doku** (DE/EN, in-App + Wissens-Datenbank): „So nutze ich Vo", "pk": "SDRv4", "tc": "CHO"}, {"id": 896, "title": "[Voice-Sub-15] Browser-Use E2E Matrix (Chrome/Firefox/Safari/iOS/Android)", "desc": "**R3-Bereich:** QA\n\nBrowser-Use E2E-Matrix:\n- Chrome (Desktop) + `--use-fake-ui-for-media-stream` + WAV-Fixtures\n- Firef", "pk": "SDRv4", "tc": "CHO"}, {"id": 895, "title": "[Voice-Sub-14] A11y-Audit WCAG AA (Karaoke aria-mirror, Keyboard, Reduced-Motion)", "desc": "**R3-Bereich:** A11y\n\nWCAG AA Compliance für Voice-UI.\n\n**DoD:**\n- `aria-live=\"off\"` auf Karaoke + separater `polite`-Mi", "pk": "SDRv4", "tc": "CHO"}, {"id": 894, "title": "[Voice-Sub-13] Pen-Test + DSGVO-Audit (CSWSH, JWT-Replay, Consent-Bypass, Audio-Persistenz)", "desc": "**R3-Bereich:** Security\n\nExterner Pen-Test auf Voice-Streaming-Pfad. Test-Matrix:\n- CSWSH (Cross-Site WebSocket Hijacki", "pk": "SDRv4", "tc": "CHO"}, {"id": 893, "title": "[Voice-Sub-12] Load-Test (k6, 1000 parallele Sessions) + Chaos-Suite (6 Failure-Modes)", "desc": "**R3-Bereich:** Performance\n\nk6-Load-Test 1000 parallele WS-Sessions gegen Staging-Q3ASR. CI-Gate erzwingt p95 <2s. Chao", "pk": "SDRv4", "tc": "CHO"}, {"id": 892, "title": "[Voice-Sub-11] Observability, 10 Prometheus-Metriken + OTel-Traces + Synthetic-Monitor", "desc": "**R3-Bereich:** Observability\n\n**Metriken (10):** `voice_stream_active_sessions{type,user_tier}`, `voice_stream_frame_dr", "pk": "SDRv4", "tc": "CHO"}, {"id": 891, "title": "[Voice-Sub-10] Session-Persistenz (Audio + Transkript speichern mit Consent)", "desc": "**R3-Bereich:** Retention\n\nOptionale Session-Persistenz: Audio + Transkript bei explizitem User-Consent speichern, sonst", "pk": "SDRv4", "tc": "FEAT"}, {"id": 890, "title": "[Voice-Sub-9] RNNoise im AudioWorklet (WASM, Default-on, Settings-Toggle)", "desc": "**R3-Bereich:** Denoising\n\nRNNoise im AudioWorklet (WASM, ~80 KB). On-by-default für laute Umgebungen, User-Toggle in Se", "pk": "SDRv4", "tc": "FEAT"}, {"id": 889, "title": "[Voice-Sub-8] Opus-Encode Client→Bridge (mobiles Release, 16× Bandbreite)", "desc": "**R3-Bereich:** Bandwidth\n\nPCM16-Frames sind ~32 KB/s. Opus@16kbps reduziert WS-Bandbreite um 16×. Q3ASR akzeptiert nur ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 888, "title": "[Voice-Sub-7] Migration voice_session_log + voice_consent-GRANT-Fix", "desc": "**R3-Bereich:** DB\n\nMigration für `voice_session_log` (neu) + `voice_consent`-GRANT-Fix (anon).\n\n**Schema:**\n- `voice_se", "pk": "SDRv4", "tc": "CHO"}, {"id": 887, "title": "[Voice-Sub-6] lib/voice/ws-asr-handler.ts + instrumentation.ts Multi-WS-Dispatcher", "desc": "**R3-Bereich:** Backend-Bridge\n\n`lib/voice/ws-asr-handler.ts` analog zu `lib/voice/ws-tts-handler.ts`. `instrumentation.", "pk": "SDRv4", "tc": "FEAT"}, {"id": 886, "title": "[Voice-Sub-5] AudioSource/AudioSink-Interfaces (SIP-Interop No-Regrets)", "desc": "**R3-Bereich:** SIP-Interop\n\n`AudioSource`/`AudioSink`-Interfaces als No-Regrets-Abstraktion. SIP-Interop (Epic FEAT-348", "pk": "SDRv4", "tc": "FEAT"}, {"id": 885, "title": "[Voice-Sub-4] Echo-Loop Mitigation (Mic-Mute-during-TTS + AEC-Baseline)", "desc": "**R3-Bereich:** AEC (Acoustic Echo Cancellation)\n\n`getUserMedia({audio:{echoCancellation:true,noiseSuppression:true,auto", "pk": "SDRv4", "tc": "FEAT"}, {"id": 884, "title": "[Voice-Sub-3] Sentence-Buffer Flush-Trigger-Matrix (5 Trigger) + Confidence-Filter", "desc": "**R3-Bereich:** Token+TTS-Interleave\n\nSentence-Buffer flusht bei: Satzende ODER Komma+400ms ODER 8 Wörter+600ms ODER 25 ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 883, "title": "[Voice-Sub-2] WS-Reconnect 3-stufig + Pending-Sentence-Discard + Resume-Hint", "desc": "**R3-Bereich:** Reconnect-Replay\n\nWS-Disconnect mitten in Aufnahme: 3-stufiger Reconnect (1s/3s/9s), Pending-Satz verwer", "pk": "SDRv4", "tc": "FEAT"}, {"id": 882, "title": "[Voice-Sub-1] AudioWorklet PCM16 16kHz Resampling (Client-Side 48k→16k, SOX-Lanczos)", "desc": "**R3-Bereich:** Audio-Resampling\n\nBrowser liefert 48kHz, Q3ASR braucht 16kHz. AudioWorklet muss client-side resamplen. S", "pk": "SDRv4", "tc": "FEAT"}, {"id": 881, "title": "Voice Chat-Stream Theme-Compliance-Fix (cbr-Tokens, Em-Dash, StatusBadge, lucide-react)", "desc": "## Ziel\n\n`app/[locale]/(dashboard)/voice/chat-stream/page.tsx` (1485 Zeilen) auf Senity-Theme-Compliance ziehen. Aktuell", "pk": "SDRv4", "tc": "IMP"}, {"id": 880, "title": "Voice chat-stream: Echte Live-Stream-Architektur evaluieren (ChatGPT-Bericht)", "desc": "## Kontext\n\n`CHATGPT_BERICHT.md` (Root, untracked, 2026-05-16) analysiert die aktuelle voice/chat-stream-Implementierung", "pk": "SDRv4", "tc": "FEAT"}, {"id": 879, "title": "Build-Fehler: lib/channels/router.ts, \"Identifier 'mainDb' has already been declared\"", "desc": "## Symptom\n\nTurbopack-Build wirft SyntaxError im generierten Chunk fuer `lib/channels/router.ts`:\n\n```\nSyntaxError: Iden", "pk": "SDRv4", "tc": "BUG"}, {"id": 878, "title": "proxy.ts: JWKS-Endpoint api-sdr-test.senity.ai liefert 401 (No API key found)", "desc": "## Symptom\n\nBeim Aufruf von Voice/Chat-Stream (und anderen authentifizierten Routes lokal gegen api-sdr-test.senity.ai) ", "pk": "SDRv4", "tc": "BUG"}, {"id": 877, "title": "chat-stream: Voice-Sample-Preview unter Voice-Selector", "desc": "## Feature\n\nUnter dem Voice-Selector in `chat-stream/page.tsx` einen Audio-Preview-Player anzeigen, damit Nutzer die gew", "pk": "SDRv4", "tc": "FEAT"}, {"id": 876, "title": "voice-clone: Mode B nutzt findVoiceFile statt storage_path aus DB (gleicher Bug wie #875)", "desc": "## Bug\n\n`/api/tts/voice-clone` Mode B (gespeicherte Voice) hat denselben Root-Cause wie #875:\n\n- DB-Select fehlt `storag", "pk": "SDRv4", "tc": "BUG"}, {"id": 875, "title": "BUG: audio-to-audio Voice-Datei nicht gefunden (500), storage_path statt UUID-Pfad verwenden", "desc": "## Problem\n\n`POST /api/tts/audio-to-audio` gibt HTTP 500 (\"Ein unerwarteter Fehler\") zurück wenn eine Custom-Voice ausge", "pk": "SDRv4", "tc": "BUG"}, {"id": 874, "title": "Voice Rate-Limiter: Vitest-Unit-Tests fuer audio-to-audio Bucket", "desc": "## Problem\n\n`lib/voice/rate-limiter.ts` hat Vitest-Tests fuer generische Limit-Pruefung, aber kein Test assertiert den k", "pk": "SDRv4", "tc": "CHO"}, {"id": 873, "title": "Voice Chat-Stream: aria-live-Region fuer V2V-Fehler (Accessibility)", "desc": "## Problem\n\nFehler aus der V2V-Pipeline (429 Rate-Limit, ValidationError, Timeout) werden in der Chunk-Tabelle visuell a", "pk": "SDRv4", "tc": "IMP"}, {"id": 872, "title": "Extended Review Runde 5: Security/DSGVO + CB + TS + Performance + Audio, P0/P1/P2 Fixes", "desc": "5 parallele Review-Agents haben kritische Findings identifiziert:\n\nP0 (1): Pyannote redundanter Guard-Cast\nP1 (8): setTi", "pk": "SDRv4", "tc": "None"}, {"id": 870, "title": "Voice Stack Sprint 4: P0+P1 Fixes (Dead Code, Warmup, Hostname, DSGVO, OOM)", "desc": "Sprint 4 des Voice Stacks. Behebt kritische P0/P1 Befunde aus 13-Agent Sprint-1-Review:\n- Subtask 1: SentenceBuffer-Bugs", "pk": "None", "tc": "None"}, {"id": 869, "title": "Voice Stack Sprint 3: DB-Query-Optimierungen & Retry-After", "desc": "M-Items aus Scaling-Review.\n1. Single-Flight für Fallback-Cache (kein DB-Stampede bei parallelen Cold-Cache-Requests)\n2.", "pk": "None", "tc": "None"}, {"id": 866, "title": "Voice Stack Sprint 2: OOM-Schutz & Multi-User-Fairness", "desc": "Skalierungs-Fixes basierend auf 7-Agenten Scaling-Review.\n\n1. Semaphore maxQueueSize=15 + Queue-Timeout → kein OOM bei G", "pk": "SDRv4", "tc": "IMP"}, {"id": 865, "title": "Voice Stack Sprint 1: 7 Quick Wins (Markdown, GDPR, AudioEnhance, Rate-Limit, CB-Timeout)", "desc": "Sofort-Verbesserungen am Voice Stack basierend auf 25-Agenten-Review. Alle Änderungen sind unabhängig, risikoarm und in ", "pk": "SDRv4", "tc": "IMP"}, {"id": 864, "title": "Voice/Chat-Stream: ASR immer \"Externer Dienst nicht erreichbar\", 4 Root Causes behoben", "desc": "## Problem\n\nAlle ASR-Chunks in `/voice/chat-stream` schlugen mit \"Ein externer Dienst ist momentan nicht erreichbar\" feh", "pk": "SDRv4", "tc": "BUG"}, {"id": 863, "title": "Login-Screen: Security-Fixes aus Extended Review (P0+P1)", "desc": "## Kontext\n\nExtended Review (4-Reviewer-Chain) des Login-Screens ergab 3 P0-Sicherheitsprobleme und mehrere P1-Robusthei", "pk": "SDRv4", "tc": "BUG"}, {"id": 862, "title": "Workspace-Container: poppler-utils + Python-PDF-Libs fehlen, PDF-Reviews unmoeglich", "desc": "**Problem:** Im Workspace-Container (cli-ws-marco / Telegram-Bot-Container) ist kein PDF-Tooling installiert. Konkret fe", "pk": "CLI", "tc": "BUG"}, {"id": 861, "title": "Klaus Bauprojekt: Brainstorming starten sobald er sich meldet", "desc": "Chris hat Klaus gebeten, sich direkt beim Senity-Assistant zu melden (Klaus ist Chris privater Freund, kein Senity-Mitar", "pk": "CLI", "tc": "FEAT"}, {"id": 860, "title": "CORE: Onboarding-Brainstorming Timo Schulz (PO/Founder)", "desc": "Brainstorming und Onboarding mit Timo Schulz (Founder & Product Owner, seit 2026-04-26 in PO-Rolle).\n\nInhalt:\n1. Status-", "pk": "CORE", "tc": "FEAT"}, {"id": 859, "title": "CORE: Onboarding-Brainstorming Marco Escribano Guerrero (CEO/Founder)", "desc": "Brainstorming und Onboarding mit Marco Escribano Guerrero (Founder & CEO).\n\nInhalt:\n1. Status-Update an Marco senden (Te", "pk": "CORE", "tc": "FEAT"}, {"id": 858, "title": "Onboarding-Brainstorming mit Marco beim ersten Workspace-Kontakt", "desc": "Sobald Marco Escribano Guerrero (Founder & CEO) das erste Mal aktiv im Senity-Workspace chattet, soll der Main-Agent ein", "pk": "CORE", "tc": "FEAT"}, {"id": 857, "title": "SocialMediaSection: EntityId-zu-number Typfehler behebt Crash-Loop in sdrv4-live", "desc": "SocialMediaSection.tsx Zeile 271: EntityPicker.onChange liefert EntityId (string), aber setNewPortalId erwartet number |", "pk": "SDRv4", "tc": "BUG"}, {"id": 856, "title": "Login bricht bei selfhost-Supabase: Middleware fordert JWKS, Token ist HS256", "desc": "## Problem\nNach erfolgreichem `POST /api/auth/login` (200 OK) bleibt das Frontend bei \"Wird angemeldet…\" hängen und wird", "pk": "SDRv5", "tc": "BUG"}, {"id": 855, "title": "EntityPicker: staticOptions als initial-cache seed auch bei fetchUrl", "desc": "## Bug\n\n`EntityPicker` (`@murc134/ui-kit`, v0.21.0) ignoriert die `options`-Prop sobald `fetchUrl` gesetzt ist (`EntityP", "pk": "SDRv5", "tc": "BUG"}, {"id": 854, "title": "Voice-Services Bearer-Auth: Q3ASR + Q3TTS + AudioEnhance gegen Internet-Missbrauch absichern", "desc": "## Symptom\n\nDrei selbst-gehostete Voice-Microservices auf GEX44 (`188.40.130.177`) sind **ohne Auth** öffentlich erreich", "pk": "SDRv5", "tc": "BUG"}, {"id": 853, "title": "Voice-UI: Phantom-Token bg-cbr-card → Migration auf bg-cbr-bg via @murc134/ui-kit@0.21.4", "desc": "## Symptom\n\nVoice-Chat-Stream-Seite (`/voice/chat-stream`): Zielstimme-Dropdown rendert **transparent** — Hintergrund-El", "pk": "SDRv5", "tc": "BUG"}, {"id": 852, "title": "parent_scope-Feld in cli_agent_skill — Workspace-Bezug für Sub-Projekte", "desc": "## Kontext\n\n`source_root` enthält absolute Pfade. Für Sub-Projekt-Scopes (z.B. `sdrv5-coach`, `burgerbulle-doccreator`) ", "pk": "SDRv5", "tc": "FEAT"}, {"id": 851, "title": "agent-db: category + source_root in discovery+upsert befüllen", "desc": "## Kontext\n\n`cli_agent_skill.category` und `cli_agent_skill.source_root` waren bisher leer:\n- `source_root` war hardgeco", "pk": "SDRv5", "tc": "IMP"}, {"id": 850, "title": "Override-Dialog: UUID-Inputs durch EntityPicker ersetzen", "desc": "## Kontext\n\n`components/admin/agent-analytics/AgentDetailDrawer.tsx` Zeile 381-397 verlangt UUID-Eingabe per `<input typ", "pk": "SDRv5", "tc": "IMP"}, {"id": 849, "title": "EntityPicker — generische Search-Combobox in @murc134/ui-kit", "desc": "## Kontext\n\nIn SDRv4 `components/admin/agent-analytics/AgentDetailDrawer.tsx` (Override-Dialog) wird die Entity-ID (User", "pk": "SDRv5", "tc": "FEAT"}, {"id": 848, "title": "Voice/Chat-Stream: Playwright-E2E mit gemocktem getUserMedia + Backend-Stubs", "desc": "## Kontext (aus FEAT-826, Final Reality Check Runde 10, FOLLOW-7)\n\nTest-Plan dokumentiert 14 manuelle Tests. Für CI-Regr", "pk": "SDRv4", "tc": "CHO"}, {"id": 847, "title": "Voice/Chat-Stream: Dedizierter 429-Status-Pill mit Backoff-Countdown", "desc": "## Kontext (aus FEAT-826, Final Reality Check Runde 10, FOLLOW-6 / B7)\n\nV2V-Endpoint hat Rate-Limit 3/min. Bei Überschre", "pk": "SDRv4", "tc": "IMP"}, {"id": 846, "title": "Voice/Chat-Stream: Transkript-Export (.txt) + V2V-Audio-ZIP-Download", "desc": "## Kontext (aus FEAT-826, Final Reality Check Runde 10, FOLLOW-5 / B6)\n\nNach Aufnahme hat der User Transkript + V2V-Audi", "pk": "SDRv4", "tc": "FEAT"}, {"id": 845, "title": "Voice/Chat-Stream: visibilitychange-Option \"Bei Tab-Wechsel pausieren\"", "desc": "## Kontext (aus FEAT-826, Final Reality Check Runde 10, FOLLOW-4 / B4)\n\nAktuell läuft die Aufnahme bei Tab-Wechsel weite", "pk": "SDRv4", "tc": "IMP"}, {"id": 844, "title": "Voice/Chat-Stream: MAX_CHUNKS + MAX_TRANSCRIPT_CHARS Caps + Warn-Banner", "desc": "## Kontext (aus FEAT-826, Final Reality Check Runde 10, FOLLOW-3 / B3)\n\nBei einer >30-Minuten-Aufnahme wachsen `chunks[]", "pk": "SDRv4", "tc": "IMP"}, {"id": 843, "title": "Voice-API-Routes: Server-side MIME-Whitelist + Magic-Bytes-Validierung", "desc": "## Kontext (aus FEAT-826, Final Reality Check Runde 10, FOLLOW-2 / B2)\n\n`/api/asr/transcribe` und `/api/tts/audio-to-aud", "pk": "SDRv4", "tc": "CHO"}, {"id": 842, "title": "Voice/Chat-Stream: AbortController-Bündel an Recording-Session (Lifecycle)", "desc": "## Kontext (aus FEAT-826, Final Reality Check Runde 10, FOLLOW-1 / B1)\n\nAktuell hat jeder fetch-Call seinen eigenen Abor", "pk": "SDRv4", "tc": "IMP"}, {"id": 841, "title": "lib/audio/client-mime.ts: pickSupportedMime zentralisieren", "desc": "## Kontext (aus FEAT-826, Reuse-Audit Runde 9, IMP-E)\n\n`MediaRecorder.isTypeSupported`-Probing für client-side Recording", "pk": "SDRv4", "tc": "IMP"}, {"id": 840, "title": "components/voice/HealthBanner.tsx mit Loading-State + i18n", "desc": "## Kontext (aus FEAT-826, Reuse-Audit Runde 9, IMP-D)\n\nHealth-Banner (Q3ASR/Q3TTS offline + Loading-State + i18n-Parts-L", "pk": "SDRv4", "tc": "IMP"}, {"id": 839, "title": "lib/voice/api-client.ts für /api/asr/transcribe + /api/tts/audio-to-audio", "desc": "## Kontext (aus FEAT-826, Reuse-Audit Runde 9, IMP-C)\n\nVoice-API-Calls (`/api/asr/transcribe`, `/api/tts/audio-to-audio`", "pk": "SDRv4", "tc": "IMP"}, {"id": 838, "title": "@murc134/llm.sanitizeErrorMessage um Control-Char-Stripping erweitern", "desc": "## Kontext (aus FEAT-826, Reuse-Audit Runde 9, IMP-B)\n\nDie Page `voice/chat-stream` sanitized Error-Messages lokal (Cont", "pk": "SDRv4", "tc": "IMP"}, {"id": 837, "title": "Voice/Chat-Stream: ToggleRow nach @murc134/ui-kit exportieren", "desc": "## Kontext (aus FEAT-826, Reuse-Audit Runde 9, IMP-A)\n\nDie Page `app/[locale]/(dashboard)/voice/chat-stream/page.tsx` de", "pk": "SDRv4", "tc": "IMP"}, {"id": 836, "title": "Apply-Endpoint dediziertes Rate-Limit-Bucket", "desc": "## Kontext\n\nAus Extended-Review Runde 10 (Opus Final) zum .env-Upload-Feature (FEAT-001, Ticket #720):\n\n> **R10-4 — Appl", "pk": "env-system", "tc": "IMP"}, {"id": 835, "title": "Audit-Log Hash-Chain / Append-Only-Trigger Hardening", "desc": "## Kontext\n\nAus Extended-Review Runde 10 (Opus Final) zum .env-Upload-Feature (FEAT-001, Ticket #720):\n\n> **R10-1 — Audi", "pk": "env-system", "tc": "IMP"}, {"id": 834, "title": "STS-829: Ticketing Vitest devDependency fehlt", "desc": "Follow-up aus STS-829-FOLLOWUP-VITEST. vitest.config.ts importiert @vitejs/plugin-react ohne entsprechendes devDependenc", "pk": "None", "tc": "FEAT"}, {"id": 833, "title": "STS-829: Ticketing API-Client localStorage-Sync", "desc": "Follow-up aus STS-829-FOLLOWUP-API-CONFIG. lib/api-client.ts API_URL ist Modul-Konstante (process.env). Settings-Page sc", "pk": "None", "tc": "FEAT"}, {"id": 832, "title": "STS-829: Ticketing Kanban Keyboard-A11y", "desc": "Follow-up aus STS-829-FOLLOWUP-A11Y-KEYBOARD. Kanban-Board reine Tastatur-Bedienung (Move-Mode mit Pfeiltasten f�r Statu", "pk": "None", "tc": "FEAT"}, {"id": 831, "title": "STS-829: BB-Workspace API/Storage TS-Errors (Pre-existing)", "desc": "Follow-up aus STS-829. 90 pre-existing TypeScript-Fehler in app/api/storage/** wurden w�hrend des Rollouts entdeckt, abe", "pk": "None", "tc": "FEAT"}, {"id": 830, "title": "STS-829: BB-Workspace Pattern-C-Vollmigration", "desc": "Follow-up aus STS-829. burgerbulle-workspace bekam in der Rollout-Phase nur Token-Refactor + a11y. Noch ausstehend: TTSF", "pk": "None", "tc": "FEAT"}, {"id": 829, "title": "SDRv5 Cross-Repo Rollout: FlexibleJSTools Pflicht + SDRv4 Design-Anweisungen", "desc": "Alle Projekte unter D:/Devel/NodeJS/SDRv5/ auf SDRv4-Standard bringen:\n\n1. FlexibleJSTools (@murc134/*) als Pflicht-Pake", "pk": "None", "tc": "None"}, {"id": 828, "title": "@murc134/datatable@0.4: UUID-Support + props-data-Mode + Auth-Provider", "desc": "Voraussetzung um EnvsysDataTable durch @murc134/datatable zu ersetzen (aus STS-825 ausgeklammert).\n\n**Anforderungen:**\n-", "pk": "None", "tc": "None"}, {"id": 827, "title": "YouTube-Summarizer: MediaCutter+MediaEditor UX/UI-Refactor (Sub-Ticket von 824)", "desc": "Aus STS-824 ausgeklammert wegen Gr��e (>2000 LOC zusammen) und 4 pre-existing React-Hooks-Errors.\n\n**Scope:**\n- componen", "pk": "None", "tc": "None"}, {"id": 826, "title": "Voice Chat-Stream Testseite, V2V + Live-Transkription (OpenAI-Realtime-Style)", "desc": "## Kontext\n\nDer Podcast-Mode hat eine Basisimplementierung (`components/chat/PodcastController.tsx` + `chatStreamingAudi", "pk": "SDRv4", "tc": "FEAT"}, {"id": 825, "title": "Envsys-UI: UX/UI-Refactor + DataTable-Pflicht auf SDRv4-Standard", "desc": "Komplette �berarbeitung der Sub-App apps/envsys-ui auf SDRv4-Pattern.\n\n**Ziel:**\n- FlexibleJSTools (@murc134/*) als einz", "pk": "SDRv4", "tc": "IMP"}, {"id": 824, "title": "YouTube-Summarizer: UX/UI-Refactor auf SDRv4-Standard", "desc": "Komplette �berarbeitung der Page /de/youtube-summarizer mit Design-Team analog STS-823.\n\n**Ziel:**\n- Layout exakt nach S", "pk": "SDRv4", "tc": "IMP"}, {"id": 823, "title": "YouTube-Downloader: UX/UI-Refactor auf SDRv4-Standard", "desc": "Komplette �berarbeitung der Page /de/youtube-downloader mit Design-Team (UI Designer + UX Architect).\n\n**Ziel:**\n- Layou", "pk": "SDRv4", "tc": "IMP"}, {"id": 822, "title": "[BB v6.3] Migration 114 — Tool-Calling, Demo-Disclaimer & Allergie-Refusal beheben", "desc": "## Kontext\n\nSmoke-Sim BB v6.3 (`personality_id=32`) gegen `http://localhost:3000` am 2026-05-11:\n- 6 Chats × 4 Turns = 2", "pk": "SDRv5", "tc": "BUG"}, {"id": 821, "title": "Admin-UI: Fallback-Chain Editor um vision-Service-Type erweitern", "desc": "## Ziel\n\nAdmin-UI `provider_fallback`-Editor um den neuen ServiceType `'vision'` erweitern + **Dropdown für Max-Image-Ed", "pk": "SDRv4", "tc": "IMP"}, {"id": 819, "title": "CLI Call Tool — E2E Test (Qwen3.6 → cli_call → Orchestrator → Webhook → Status)", "desc": "## Ziel\nE2E-Test der CLI-Call-Pipeline: Chat-Persönlichkeit → Tool-Call → Container-Job → Status-Polling → Result.\n\n## T", "pk": "SDRv5", "tc": "CHO"}, {"id": 818, "title": "CLI Call Tool — Chat-Personality \"Senity Workspace Operator\" (Seed)", "desc": "## Ziel\nNeue Chat-Personality auf dev/local, die das CLI Call Tool + Ticketing-Tool aktiv nutzt. Kommunikations-Pattern:", "pk": "SDRv5", "tc": "FEAT"}, {"id": 817, "title": "CLI Call Tool — DB-driven Personality-Tool-Binding (Hybrid mit Code-Registry)", "desc": "# DB-driven Personality-Tool-Binding (Hybrid)\n\n**Brainstorming abgeschlossen:** 2026-05-11\n**Design-Doc:** `docs/brainst", "pk": "SDRv5", "tc": "FEAT"}, {"id": 816, "title": "CLI Call Tool — Ticketing Chat-Tool (Microservice-Wrapper)", "desc": "## Ziel\nChat-Tool das qwen3.6 direkten Zugriff auf das Ticketing-System gibt. **NICHT** direkter DB-Zugriff — über exist", "pk": "SDRv5", "tc": "FEAT"}, {"id": 815, "title": "CLI Call Tool — cli_call + cli_call_status + Webhook-Receiver", "desc": "## Ziel\nCore-Tools für Chat → CLI-Workspace-Delegation. Async-Flow mit Job-Persistierung.\n\n## Deliverables\n1. `lib/chat/", "pk": "SDRv5", "tc": "FEAT"}, {"id": 814, "title": "CLI Call Tool — Workspace Metadata Auto-Discovery (Probe + Lazy-Sync)", "desc": "## Ziel\nCLI-Workspaces (cli_server) automatisch mit Capability-Beschreibung + Tags ausstatten. LLM kann dann anhand der ", "pk": "SDRv5", "tc": "FEAT"}, {"id": 813, "title": "CLI Call Tool — DB-Migration (cli_server Metadaten + cli_job + chat_personality.tools)", "desc": "## Ziel\nSchema-Grundlage für CLI Call Tool + Ticketing-Tool. Drei Migrationen in einem Sweep.\n\n## Migrationen\n\n### 1. `c", "pk": "SDRv5", "tc": "CHO"}, {"id": 812, "title": "FEAT-794 Follow-up: A11y-Sweep (PillGroup Keyboard-Nav + Tabs aria-controls + Shimmer-Keyframe)", "desc": "Aus Codex+Gemini-Review von Commit `5ede0981`, A11y-Lücken und Code-Hygiene.\n\n## Findings\n\n### PillGroup ohne echte Radi", "pk": "SDRv4", "tc": "IMP"}, {"id": 811, "title": "FEAT-794 Follow-up: Realtime-Konsistenz (handleDelete-Override + detailsJob-Snapshot + canSubmit-Race)", "desc": "Aus Codex-Review von Commit `5ede0981`, drei zusammenhängende Realtime/Race-Bugs.\n\n## Findings\n\n### Bug 1: handleDelete ", "pk": "SDRv4", "tc": "BUG"}, {"id": 810, "title": "FEAT-794 Follow-up: i18n-Locale-Sweep (formatDate/formatBytes/Log-Levels/Placeholder)", "desc": "Aus Codex+Gemini-Review von Commit `5ede0981`.\n\n## Problem\n\nMehrere sichtbare Strings/Formatierungen sind locale-locked ", "pk": "SDRv4", "tc": "BUG"}, {"id": 809, "title": "FEAT-794 Follow-up: window.confirm durch Senity-DialogOverlay ersetzen", "desc": "Aus Codex+Gemini-Review von Commit `5ede0981`.\n\n## Problem\n\nBestätigungs-Modals laufen über `window.confirm`, bricht Sen", "pk": "SDRv4", "tc": "BUG"}, {"id": 808, "title": "FEAT-794 Follow-up: Senity-Theme-Konformität (Hex/RGBA/white-Bypass + role=group-Konflikt)", "desc": "Aus Codex+Gemini-Review von Commit `5ede0981` (Branch `feat-794-youtube-downloader-redesign`).\n\n## Problem\n\nDas Redesign", "pk": "SDRv4", "tc": "BUG"}, {"id": 807, "title": "YouTube-Summarizer multimodal via Qwen3.6-35B-A3B", "desc": "## Kontext\n\nAktuelle Pipeline (`lib/youtube/pipeline.ts`) ist **audio-only**: Video → ffmpeg-Audio-Extract → Whisper-Chu", "pk": "SDRv5", "tc": "FEAT"}, {"id": 806, "title": "Quickfilter-Bar oberhalb DataTable (chat-personalities, generisch via TableConfig)", "desc": "## Kontext\n\nAktuell hat `components/ui/DataTable.tsx` Filter nur als kleines Trichter-Icon im Spaltenheader (`DataTableF", "pk": "SDRv5", "tc": "IMP"}, {"id": 805, "title": "BBE-Pilot: Präsentation für Abi-Termin (3-4 Slides)", "desc": "Hängt am Epic #778 (BBE/Abi Pilot).\n\n## Aufgabe\nKurze, entscheider-taugliche Präsentation für den Folgetermin mit Abi. B", "pk": "SDRv4", "tc": "FEAT"}, {"id": 804, "title": "BBE-Pilot: Folgetermin mit Abi koordinieren", "desc": "Hängt am Epic #778 (BBE/Abi Pilot).\n\n## Aufgabe\nNach Finalisierung des Angebots (#783, Deadline Sonntag 2026-05-10) den ", "pk": "CORE", "tc": "CHO"}, {"id": 803, "title": "Vertriebsstruktur mit Beteiligungsmodellen aufbauen", "desc": "Hängt am Epic #778 (BBE/Abi Pilot) als strategische Grundsatz-Aufgabe.\n\n## Aufgabe\nSenity kann aktuell keine festen Gehä", "pk": "CORE", "tc": "FEAT"}, {"id": 802, "title": "Hardware für Timo besorgen (Leihe oder Grover-Miete)", "desc": "Hängt am Epic #778 (BBE/Abi Pilot).\n\n## Aufgabe\nTimo benötigt arbeitsfähige Hardware, um produktiv am Pilot mitarbeiten ", "pk": "CORE", "tc": "CHO"}, {"id": 801, "title": "BBE-Pilot: Kassensystem-Anbindung Recherche + Fallback-Architektur", "desc": "Hängt am Epic #778 (BBE/Abi Pilot).\n\n## Aufgabe\nKritischer Erfolgsfaktor laut Gesellschafterversammlung 2026-05-09: Anbi", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 800, "title": "Gesellschafterversammlung 2026-05-09: Abi-Pilot 5.000 € abstimmen", "desc": "Bezug: Epic #778 (BBE/Abi Pilot)\n\nMarco hat von Abi eine Investitionszusage über 5.000 € für einen 1-Monats-Pilot erhalt", "pk": "CORE", "tc": "CHO"}, {"id": 799, "title": "Burger Bulle V6.1 + Speisekarten-Inquisitor (Tester-Bot)", "desc": "Iteration auf v6 anhand 432 simulierter Chats (12 Personas � 3 Modelle � 3 Temps � 4 Reps) auf MSH-Gateway.\n\n## Findings", "pk": "SDRv4", "tc": "FEAT"}, {"id": 798, "title": "YouTube Summarizer: Vision-Modus mit Smart-Frame-Dedup (Qwen3.6 + pHash)", "desc": "## Ziel\n\nDen YouTube Summarizer um optionale visuelle Analyse erweitern. Frames werden via **Perceptual Hashing** dedupl", "pk": "SDRv4", "tc": "FEAT"}, {"id": 797, "title": "CLAUDE.md projektweit aktualisieren + Topic-Extraktion (Context-Optimierung)", "desc": "88 produktive CLAUDE.md-Dateien projektweit aktualisieren. Themen-Gruppen in eigene .md-Dateien extrahieren. CLAUDE.md w", "pk": "SDRv4", "tc": "IMP"}, {"id": 796, "title": "Dashboard /api/dashboard/today: stale .from('ticket') auf api-sdr-test umstellen", "desc": "Dashboard-Endpoint liest aus Legacy-Tabelle 'ticket' (singular). Auf api-sdr-test existiert nur 'tickets' (Migration 090", "pk": "SDRv4", "tc": "BUG"}, {"id": 795, "title": "Dashboard /api/dashboard/today: stale .from('ticket') auf api-sdr-test → auf 'tickets' umstellen", "desc": "## Problem\nDer Dashboard-Endpoint `app/api/dashboard/today/route.ts` (Zeile 50) liest aus der Tabelle `ticket` (Singular", "pk": "SDRv4", "tc": "BUG"}, {"id": 794, "title": "YouTube Downloader App (Werkzeuge), Wiederverwendung Downloader-Core", "desc": "Neue App **YouTube Downloader** unter Navigation **Werkzeuge**, parallel zum bestehenden YouTube Summarizer.\n\n## Ziel\nBe", "pk": "SDRv4", "tc": "FEAT"}, {"id": 793, "title": "v5-Session-Audit: Anti-Pattern-Frequenz über alle Sessions", "desc": "Quervergleich aller chat_session mit personality_id=16. Welche Anti-Patterns A1-A12 (siehe .tmp/persona-prompts/_BRIEFIN", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 792, "title": "Test-Personalities Pack: 10 Kunden + Real-User-Pack (Marc/Christoph/Timo)", "desc": "Hard-Mode-erweiterte Test-Personas als chat_personality.personality_type='tester'. Basis: 10 Kunden aus SDRv5/burgerbull", "pk": "SDRv4", "tc": "FEAT"}, {"id": 791, "title": "Tool bb_unlock_discount (rein-konversationelle Gating)", "desc": "Neuer Chat-Tool-Call bb_unlock_discount. Prompt-Constraint: nur aufrufen, nachdem Kunde Like+3-Tags konversationell best", "pk": "SDRv4", "tc": "FEAT"}, {"id": 790, "title": "Burger Bulle v6 Personality (Social-Phase + Marco-Findings)", "desc": "Neue Chat-Personality 'Burger Bulle v6' als Nachfolger von id=16 (v5). Änderungen ggü. v5:\n\n- **Social-Discount-Phase (N", "pk": "SDRv4", "tc": "FEAT"}, {"id": 789, "title": "@murc134/llm 0.14.1 + package.json Sortierung", "desc": "## Ziel\n\n`@murc134/llm` von `^0.14.0` auf `^0.14.1` bumpen und `lucide-react` alphabetisch in `package.json` einsortiere", "pk": "SDRv4", "tc": "CHO"}, {"id": 788, "title": "Chat-Persönlichkeitstyp als Enum (chatbot/cli/tester)", "desc": "## Ziel\n\nNeues Feld `personality_type` auf `chat_personality` als PostgreSQL-Enum mit den Werten `chatbot`, `cli`, `test", "pk": "SDRv4", "tc": "FEAT"}, {"id": 787, "title": "Tickets-UI: kein Workspace-Selector, keine Auth-Anzeige, kaputtes Mobile-Layout, irrefuehrender Empty-State", "desc": "Befund (basierend auf Screenshot von tickets.senity.ai, mobile View) am 2026-05-07.\n\nVier Probleme:\n\n1) **Mobile-Layout ", "pk": "STS", "tc": "BUG"}, {"id": 786, "title": "[Brainstorming] Rot/Blau-Eliminations-Lottospiel", "desc": "Voice-Idee von Christoph (2026-05-07, Voice 574, ~3:20 Min).\n\n## Mechanik (laut Voice)\n- Spieler kauft Los/Abo (1-5 EUR/", "pk": "CORE", "tc": "FEAT"}, {"id": 785, "title": "Chat-Input: Mikrofon-Symbol fehlt + Persönlichkeitstest hat unvollständige KI-Texttools", "desc": "Zwei UI-Bugs:\n\n1. **Mikrofon-Symbol fehlt im Chat-Input** (`/de/chat`): Die TTSArea im Chat-Input (ChatInterface.tsx, pe", "pk": "SDRv4", "tc": "BUG"}, {"id": 784, "title": "bb_* Tools: personalityId===10 Hardcode in chat-bridge.ts durch allowed_tools-Check ersetzen", "desc": "Der Telegram-Channel-Pfad (processBotMessage in chat-bridge.ts) pruefte bb_*-Tools mit personalityId===10 statt ueber pe", "pk": "SDRv4", "tc": "BUG"}, {"id": 782, "title": "Hardware im Gesundheitswesen: Marco-Input nachfordern", "desc": "Platzhalter-Ticket.\n\n## Kontext\nMarco hat am 2026-05-06 im Telegram-Chat 'Senity Operativ' den Satz geschrieben: \"Das zu", "pk": "CORE", "tc": "RESEARCH"}, {"id": 781, "title": "BBE-Demo Freitag: Bot-Prompt und Logik stabilisieren", "desc": "Hängt am Epic #778 (BBE/Abi Pilot).\n\n## Problem\nBot zeigt aktuell kritische Fehler und Inkonsistenzen: falsche Preise, L", "pk": "SDRv4", "tc": "BUG"}, {"id": 780, "title": "BBE-Pilot: Vollständige Kostenaufstellung Server + Cloud + Modell-Routing", "desc": "Hängt am Epic #778 (BBE/Abi Pilot).\n\n## Aufgabe\nVollständige, transparente Kostenaufstellung für den BBE-Pilot und die l", "pk": "SDRv4", "tc": "FEAT"}, {"id": 779, "title": "BBE-Pilot: Marktanalyse Pricing + Wettbewerbsvergleich", "desc": "Hängt am Epic #778 (BBE/Abi Pilot).\n\n## Aufgabe\nMarktanalyse für Pricing und Wettbewerbsvergleich. Ergebnis fließt in de", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 777, "title": "BBE/Abi Pilot, Pricing, Phasenmodell, Demo", "desc": "Kundenprojekt BBE/Abi (Burger-Bulle Endkunde / Abi). Konsolidiertes Epic für Pricing-Findung, Phasenmodell und die Demo ", "pk": "SDRv4", "tc": "EPIC"}, {"id": 776, "title": "DSGVO-Bug: bb_profil_loeschen loescht display_name nicht aus bot_user_mapping", "desc": "Nach DSGVO-Loeschanfrage ueber den Burger Bulle Bestellbot wird der Anzeigename des Nutzers weiterhin verwendet, da bot_", "pk": "SDRv4", "tc": "BUG"}, {"id": 775, "title": "TypeScript-Fehler in envsys projects/[id]/page.tsx behoben, await in non-async authHeader", "desc": "Production-Ausfall: sdrv4-live crashte wegen await cookies() in einer nicht-async Funktion authHeader(). Fix: Funktion a", "pk": "SDRv4", "tc": "BUG"}, {"id": 774, "title": "Chat leeren funktioniert nicht, Race-Condition zwischen Remount-Key und Unmount-Cleanup", "desc": "## Symptom\n\nKlick auf rotes Trash-Icon im Chat-Header öffnet Bestätigungs-Banner. Klick auf „Ja\" / „Bestätigen\", **es pa", "pk": "SDRv4", "tc": "BUG"}, {"id": 773, "title": "MSH/vLLM Reasoning erreicht Frontend nicht, OpenAI SDK strippt `reasoning` Delta-Feld", "desc": "## Symptom\n\nIm SDRv4-Chat bleibt das Reasoning-Feld leer, obwohl das Frontend `thinkingEffort != none` und damit `chat_t", "pk": "SDRv4", "tc": "BUG"}, {"id": 772, "title": "[Extended Brainstorming] env-system UI — SDRv4-Integration, FlexibleJsTools-Regeln, Theme-Updates", "desc": "## Ziel\nExtended Brainstorming (Codex → Gemini → Opus) für:\n1. env-system UI (Tabellen, Filter, CRUD, n:m Zuweisung, SDR", "pk": "None", "tc": "FEAT"}, {"id": 771, "title": "BB-Bot: CRM-Tools blockieren BB-Tool-Aufrufe", "desc": "BB-Bot (personality_id=10) bekommt ~72 CRM-CRUD-Tools neben 6 BB-Tools. Modell ruft bb_speisekarte_suche nicht auf. Fix:", "pk": "SDRv4", "tc": "BUG"}, {"id": 770, "title": "iPad: Fullscreen schließen nicht möglich + Eingabefeld außerhalb sichtbarem Bereich", "desc": "Auf iPad (iOS Safari) zwei Probleme:\n1. Chat-Eingabefeld rutscht beim Öffnen der Tastatur aus dem sichtbaren Bereich (10", "pk": "None", "tc": "None"}, {"id": 769, "title": "Chat leeren stellt alte Nachrichten wieder her (messagesRef Cleanup-Race)", "desc": "**Bug:** Nach dem Bestätigen von \"Chat leeren\" erscheinen die Nachrichten sofort wieder.\n\n**Ursache:** In `ChatInterface", "pk": "FLEX", "tc": "BUG"}, {"id": 768, "title": "Chat: Context-Window-Highlight + Thinking-Effort-Selector", "desc": "## Beschreibung\n\nZwei neue Features im Chat-Header (Server-Modus):\n\n**1. Context-Window-Highlight-Toggle**\nEin Button im", "pk": "SDRv4", "tc": "FEAT"}, {"id": 767, "title": "CLAUDE.md Ticketing-Aktualisierung: alle 5 Projekte auf sts-api Stand gebracht", "desc": "Alle CLAUDE.md-Dateien in SDRv4, Container-Management, senity-workspace, burger-bulle-workspace und senity-ticketing-sys", "pk": "CORE", "tc": "CHO"}, {"id": 766, "title": "Voice-Cloning: Upload-Pfade im Standalone-Build falsch + fehlendes Volume in sdrv4-test", "desc": "Zwei Bugs blockieren das Voice-Cloning (TTS-Vorlesen im Chat):\n\n1. sdrv4-test hat kein ./sdrv4/uploads:/app/uploads Volu", "pk": "SDRv4", "tc": "BUG"}, {"id": 765, "title": "Bot-Konversations-Übersicht im Browser", "desc": "## Ziel\n\nEine dedizierte Seite unter `/bots/[id]/conversations` implementieren, auf der alle Chat-Verläufe mit einem Bot", "pk": "SDRv4", "tc": "FEAT"}, {"id": 764, "title": "SDRv4: Internes Ticketing durch sts-api Microservice ersetzen", "desc": "app/api/api-tickets/* auf ticketing-client.ts (sts-api Proxy) umstellen. services/ticketing-system/ und apps/ticketing-s", "pk": "SDRv4", "tc": "CHO"}, {"id": 760, "title": "Git Workflow Agent Ökosystem, Implementierungsplan", "desc": "", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 759, "title": "Design: Git Workflow Agent Ökosystem v2", "desc": "", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 758, "title": "Lead-Scraper Bugfixes & Architektur-Überarbeitung", "desc": "", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 757, "title": "[Brainstorming] Boards-Feature auf Ticketing-System-API umstellen", "desc": "## Brainstorming Q&A Log\n\n**Q1:** Was sollen Boards nach der Umstellung konkret darstellen?\n**A1:** Das Ticketing-System", "pk": "SDRv4", "tc": "IMP"}, {"id": 756, "title": "Bestellbot QA — konsolidierter Findings-Report Session 72", "desc": "104 Findings (Finding 102 gestrichen — Namenswechsel zu Andreas ist erwartetes Verhalten bei bewusst geleertem Profil, v", "pk": "AI", "tc": "None"}, {"id": 755, "title": "Bestellbot Personalisierungs- und Profil-Daten, Sub von #750", "desc": "Sub-Ticket zu #750 (Master).\n\n## Symptom\nHausnummer trotz Vollangabe wiederholt erfragt. Default-Naming für leere Profil", "pk": "SDRv4", "tc": "None"}, {"id": 754, "title": "Bestellbot Tonfall- und State-Konsistenz, Sub von #750", "desc": "Sub-Ticket zu #750 (Master).\n\n## Symptom\nBot wechselt zwischen Über-Vorsicht, Verharmlosung und aggressivem Upsell inner", "pk": "SDRv4", "tc": "None"}, {"id": 753, "title": "Bestellbot Halluzinations-Containment, Sub von #750", "desc": "Sub-Ticket zu #750 (Master).\n\n## Symptom\nBot erfindet Items (Fire Bull), User-Aussagen (‚3 Tage nichts gegessen‘), würfe", "pk": "SDRv4", "tc": "None"}, {"id": 752, "title": "Bestellbot Allergen-Safety, schärfstes Sub von #750", "desc": "Sub-Ticket zu #750 (Master). Schärfstes Sub-Ticket der Session.\n\n## Symptom\nBot oszilliert zwischen Über-Vorsicht (112 r", "pk": "SDRv4", "tc": "None"}, {"id": 751, "title": "Bestellbot Cart-Integrity (Wipes + Auto-Add), Sub von #750", "desc": "Sub-Ticket zu #750 (Master).\n\n## Symptom\nCart-State nicht persistent. Items verschwinden, tauchen wieder auf, Auto-Add o", "pk": "SDRv4", "tc": "None"}, {"id": 750, "title": "Bestellbot QA Session 72, 104 Findings, 27 P0 (Sofort-Stopp empfohlen)", "desc": "## Kontext\n\nQA-Test-Session 72 am 2026-05-05 mit Tester Timo (simulierter Neukunde, Profil bewusst geleert). Telegram-Ch", "pk": "SDRv4", "tc": "None"}, {"id": 749, "title": "[Brainstorming] env-system Web-UI — Browser-Verwaltung von Secrets + Drag-&-Drop .env-Import", "desc": "Phase-2-Erweiterung zum env-system Microservice (#720). Browser-Frontend zur Verwaltung von Secrets ohne CLI-Zwang.\n\n## ", "pk": "env-system", "tc": "FEAT"}, {"id": 743, "title": "Migration 008 (pgvector + Marketplace) auf senity-agents-db anwenden + RENDERER_DB_PG_URL bereitstellen", "desc": "## Auftrag\n\nMigration 008 (`migrations/008_pgvector_and_marketplace.sql` im Repo `senity/agent-db`, Branch `feat/imp-337", "pk": "agent-db", "tc": "None"}, {"id": 741, "title": "Persönlichkeit bei Route-Wechsel tatsächlich switchen + Blink-Animation", "desc": "Nach [[ROUTE:N]] wurde die Persönlichkeit im Selector nicht gewechselt, nur Overlay-Hinweis wurde gezeigt.\n\nFix: route:c", "pk": "SDRv4", "tc": "BUG"}, {"id": 740, "title": "[[ROUTE:N]] aus SSE-Stream strippen + Overlay-Hinweis im Chat", "desc": "LLM emittiert [[ROUTE:N]] Token um Persönlichkeitswechsel zu signalisieren. Token wurde im Browser angezeigt statt verar", "pk": "SDRv4", "tc": "BUG"}, {"id": 739, "title": "Senity LLM-Provider aus Chat-UI entfernen", "desc": "Senity Ollama Cloud ist obsolet. Provider aus FallbackChainEditor und UnifiedModelManagementClient entfernt, nicht mehr ", "pk": "SDRv4", "tc": "CHO"}, {"id": 738, "title": "API Keys Sektion im Benutzer-Edit-Overlay", "desc": "Im Edit-Overlay der Benutzerverwaltung eine \"API Keys\"-Sektion hinzufügen. Zeigt den Chat-API-Token des Users (masked), ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 737, "title": "[[ROUTE:N]] Token erscheint roh im Web-Chat statt als Routing-Sprechblase", "desc": "Der Burger Bulle Greeter emittiert [[ROUTE:10]] am Ende seiner Antwort. Im Web-Chat wird dieses Control-Token roh als Te", "pk": "SDRv4", "tc": "BUG"}, {"id": 736, "title": "Thematische Chat-Gruppierung + Qwen3-Zusammenfassung für Context-Management", "desc": "Statt 80 rohe Nachrichten in den Context zu laden: Ältere Nachrichten werden thematisch gruppiert (BEGRÜSSUNG, BESTELLUN", "pk": "SDRv4", "tc": "IMP"}, {"id": 735, "title": "Burger Bulle, Produkt-DB + User-Taste-Profile mit pgvector", "desc": "Produktdatenbank für Burger Bulle in Supabase mit pgvector-Embeddings. Speisekarte + Allergene als strukturierte Daten s", "pk": "SDRv4", "tc": "None"}, {"id": 734, "title": "Middleware: HS256-Fallback fuer Self-Host Supabase", "desc": "## Problem\n\nMiddleware nutzt ausschliesslich `createRemoteJWKSet` von jose. Self-Host Supabase liefert leeres JWKS (HS25", "pk": "SDRv4", "tc": "BUG"}, {"id": 733, "title": "Smart Context-Filter für Chat-History (Relevanz-Scoring)", "desc": "Intelligenter Mechanismus der Chat-History nach Relevanz filtert: Unwichtige Nachrichten (Begrüßungen, Smalltalk, Kurzbe", "pk": "SDRv4", "tc": "IMP"}, {"id": 732, "title": "Phase-2 Hardening: Path-Traversal, JSON-Safety, Array-Aliasing", "desc": "## Kontext\n\nWährend des Reviews der 6 Phase-2-Tasks (Render Engine) für FEAT-344 wurden vier Nits gefunden, alles defens", "pk": "SDRv4", "tc": "CHO"}, {"id": 731, "title": "Login-Fenster zentrieren und Senity-Logo entfernen", "desc": "Login-Seite (`app/[locale]/(auth)/login/page.tsx`) hat aktuell ein zweispaltiges Layout mit lila Branding-Panel links (4", "pk": "SDRv4", "tc": "None"}, {"id": 730, "title": "Tisch-Reservierungs-Route entfernen, root-protected Files & DB-Cleanup", "desc": "## Kontext\n\nChris hat entschieden, die Tischreservierungs-Route aus dem Voice-Bot komplett zu entfernen. Nur noch Essens", "pk": "SDRv4", "tc": "None"}, {"id": 729, "title": "Supabase-Senity Template-Container Multi-Project Stack", "desc": "## Ziel\n\nDen `supabase-senity` Self-Host-Stack von einer Single-Stack-Deployment in ein Template-Container Multi-Project", "pk": "SDRv4", "tc": "None"}, {"id": 728, "title": "Asset-Ingest-Pipeline, Claude-Skills vom Filesystem in Supabase Storage uploaden", "desc": "## Auslöser\n\nWährend FEAT-344 Task 1.4 (downloadAssetFiles Integration-Test) kam heraus:\n- `cli_agent_skill` hat 67 Rows", "pk": "SDRv4", "tc": "IMP"}, {"id": 727, "title": "Bugfix: Telegram-Bot antwortet nicht, MarkdownV2-Escaping + Logging-Lücke", "desc": "## Problem\n\nBei Live-Tests kommt keine Antwort vom Telegram-Bot, obwohl die LLM-Pipeline durchläuft (channelId: 1, qwen3", "pk": "SDRv4", "tc": "None"}, {"id": 726, "title": "Sprint-Manager-Agent auf zentrale tickets-Tabelle umstellen (kein .tasks/-Fallback)", "desc": "# CHO-342: Sprint-Manager-Agent auf zentrale tickets-Tabelle umstellen\n\n**Parent:** workflow/tooling hygiene (kein Epic)", "pk": "SDRv4", "tc": "CHO"}, {"id": 725, "title": "Workspace-Asset-Selection (Container-Baukasten-Backend)", "desc": "# FEAT-346: Workspace-Asset-Selection\n\n**Epic:** EPIC-316\n**Typ:** feature | **Prio:** P1 | **Status:** draft\n**Abhängig", "pk": "SDRv4", "tc": "FEAT"}, {"id": 724, "title": "Multi-Host Asset-Sync (lokal + Server)", "desc": "# FEAT-345: Multi-Host Asset-Sync\n\n**Epic:** EPIC-316\n**Typ:** feature | **Prio:** P2 | **Status:** draft\n**Abhängig von", "pk": "SDRv4", "tc": "FEAT"}, {"id": 723, "title": "Named-Volume Live-Distribution für Kundencontainer", "desc": "# FEAT-344: Named-Volume Live-Distribution\n\n**Epic:** EPIC-316\n**Typ:** feature | **Prio:** P1 | **Status:** draft\n**Abh", "pk": "SDRv4", "tc": "FEAT"}, {"id": 722, "title": "pgvector-Embedding-Pipeline für Agent/Skill-Content", "desc": "# FEAT-343: pgvector-Embedding-Pipeline\n\n**Epic:** EPIC-316\n**Typ:** feature | **Prio:** P1 | **Status:** draft\n**Abhäng", "pk": "SDRv4", "tc": "FEAT"}, {"id": 721, "title": "Asset-Management-Microservice, Claude-Code-Assets zentral, pgvector, Volume-Distribution", "desc": "# [Epic] Asset-Management-Microservice\n\n**Typ:** Epic\n**Status:** draft\n**Priorität:** P1\n**Erstellt:** 2026-04-24\n**Bra", "pk": "SDRv4", "tc": "EPIC"}, {"id": 720, "title": "[Brainstorming] env-system Microservice — zentrale Secret-Verwaltung", "desc": "## Kontext\n\nNeuer Microservice zur zentralen Verwaltung von API-Keys, DB-Passwörtern und sonstigen Secrets. Löst das man", "pk": "env-system", "tc": "FEAT"}, {"id": 718, "title": "Bestell-Bot: Phone-Gate wirft normale Bestell-Intents raus, UX-Killer", "desc": "## Problem\n\nDer Telegram-Bot `@senity_burgerbulle_bot` startet jede neue Session mit einem harten Phone-Number-Gate: sol", "pk": "SDRv4", "tc": "None"}, {"id": 717, "title": "Schema-Konsolidierung: db/001_database_initial.sql idempotent aus pg_dump neu generieren", "desc": "# Schema-Konsolidierung, Initial-SQL idempotent from-scratch\n\n**Typ:** Improvement · **Prioritaet:** P1 · **Komplexitaet", "pk": "SDRv4", "tc": "None"}, {"id": 716, "title": "Bestell-Flow: am Ende immer Lieferadresse erfragen (Datengewinnung)", "desc": "Feedback von Marco Escribano (via Telegram-Voice, 24.04.2026):\n\n> „Wichtig ist halt, dass man immer, wenn jemand eine Be", "pk": "SDRv4", "tc": "None"}, {"id": 711, "title": "Frontend-Chat: Browser-Kontext als Chat-Kontext reinreichen (aktueller Browser-View)", "desc": "## Idee (Voice #420)\n\nWenn der eigene Frontend-Chat (aus #696 Phase 3) gebaut ist, soll er optional **den aktuellen Brow", "pk": "SDRv4", "tc": "None"}, {"id": 710, "title": ".env-Dateien aufsplitten: pro Service/Container getrennt, pro Umgebung getrennt", "desc": "## Problem\n\nAktuell gibt es eine zentrale `.env.local` mit allen Secrets aus allen Kontexten (TTS, ASR, OpenAI, Claude, ", "pk": "SDRv4", "tc": "None"}, {"id": 709, "title": "Hotfix Chatbot: Lockup bei Aktionen, die User-Permission brauchen (explizit erlauben oder verbieten)", "desc": "## Problem\n\nDer Workspace-Chatbot (Main-Agent) friert bzw. blockiert den Dialog, sobald er auf eine Aktion stößt, für di", "pk": "SDRv4", "tc": "None"}, {"id": 708, "title": "Abrechnung: pro Character statt pro Token (TTS/ASR-Services)", "desc": "## Idee\n\nAbrechnungs-Einheit der Senity-Voice-Services (insbesondere TTS, evtl. auch ASR) nicht auf Tokens, sondern auf ", "pk": "SDRv4", "tc": "None"}, {"id": 707, "title": "TTS-Streaming-Testseite: Live-Playback mit Text-Highlight, Scrub-Seek und Stream/File-Modus", "desc": "## Ausgangslage\n\nSub-Ticket zu #696 (Phase 1, Voice-Services). Während der TTS-Service als Microservice aus SDRv4 rausge", "pk": "SDRv4", "tc": "None"}, {"id": 706, "title": "[Brainstorming] Senity Identity-Service + Workspace-Plugin-Architektur (2-Tier, SSO, Apps)", "desc": "# Brainstorming: Senity Identity-Service + Workspace-Architektur\n\n**Datum:** 2026-04-24\n**Status:** Brainstorming abgesc", "pk": "SDRv4", "tc": "None"}, {"id": 705, "title": "Feature: Chat-Fenster erhält Browser-Kontext (aktuell angezeigte Seite)", "desc": "Feature-Idee vom 23.04.2026 (Telegram): Das CLI-Chat-Fenster/eigene Chatfenster kann einen 'Jet Context' bekommen, den K", "pk": "SDRv4", "tc": "None"}, {"id": 704, "title": ".env Dateien nach Service aufteilen: .env.general, .env.tts, .env.asr, .env.claude etc.", "desc": "Feature-Idee vom 23.04.2026 (Telegram): Statt einer monolithischen .env Datei pro Umgebung (Server/lokal/Container) soll", "pk": "SDRv4", "tc": "None"}, {"id": 702, "title": "Überlegung: Abrechnung pro Character statt pro Token", "desc": "Idee vom 23.04.2026 (Telegram): Abrechnung für KI-Nutzung könnte auf Basis von Characters statt Tokens erfolgen. Vorteil", "pk": "SDRv4", "tc": "None"}, {"id": 701, "title": "CLI Bridge-API Timeout zu kurz, Nachrichten nach 2 Min abgebrochen (exit 143)", "desc": "DEFAULT_TIMEOUT_MS war 120s statt 10 Min. IMP-651 hatte nur SDRv4+Orchestrator korrigiert, Bridge-API vergessen. Fix dep", "pk": "SDRv4", "tc": "None"}, {"id": 700, "title": "Brainstorming: TTS-Streaming-Testseite mit Live-Highlight, Scrub-Playback und Qualitäts-Threshold", "desc": "## Kontext\n\nAls sichtbares Produkt-Feature des künftigen **tts-service** (siehe #696 Phase 1) soll eine Testseite entste", "pk": "SDRv4", "tc": "None"}, {"id": 697, "title": "Brainstorming: Eigene Chat-API, Neuimplementierung als Normal-Chat mit Tool-Calling inkl. Claude-Code-Anbindung", "desc": "## Ausgangslage\n\nAus Brainstorm-Session am 2026-04-23 (Chris via Telegram Voice-Memos).\n\nGeplant ist eine komplette Neui", "pk": "SDRv4", "tc": "None"}, {"id": 696, "title": "Brainstorming: Service-Landschaft → Chat-System → Frontend-Chat mit CLI-Delegation", "desc": "## Ausgangslage\n\nDie Claude-Code-CLI im Workspace ist extrem mächtig (Sub-Agents, Worktrees, Skills, Codebase-Zugriff), ", "pk": "SDRv4", "tc": "None"}, {"id": 695, "title": "Qwen3-ASR / Qwen3-TTS: Streaming-Fähigkeit klären", "desc": "## Kontext\n\nFrage von Christoph (Telegram, 2026-04-23): Wir nutzen Qwen3-ASR und Qwen3-TTS (self-hosted auf MSH-GPU). Si", "pk": "SDRv4", "tc": "None"}, {"id": 694, "title": "Brainstorming: Multi-User Gmail/Kalender-Anbindung via Senity-OAuth-App", "desc": "## Ziel\nChris, Timo und Marco (und perspektivisch Team-Mitglieder/Kunden) sollen ihr Gmail-Postfach und Google Calendar ", "pk": "SDRv4", "tc": "None"}, {"id": 693, "title": "Container Permissions: Read/Write/Delete in /data/downloads/telegram/ fixen", "desc": "## Problem\nDer CLI-Workspace-Container hat aktuell **nur Leserechte** auf `/data/downloads/telegram/<channel_id>/`. Beim", "pk": "SDRv4", "tc": "None"}, {"id": 692, "title": "Brainstorming: Container-Baukasten, pro Container auswählbare Agents/Skills mit Price-Tag", "desc": "## Kontext\nWorkspace-übergreifendes Thema, nicht Burger-Bulle-spezifisch, sondern grundsätzliche Architektur-Frage für a", "pk": "SDRv4", "tc": "None"}, {"id": 691, "title": "Permissions Denied: Agent-Container braucht Schreib-/Lese-/Loeschrechte auf /data/downloads/telegram/", "desc": "**Problem:** Der CLI-Workspace-Container kann die heruntergeladenen Telegram-Audio-Files nach erfolgreicher ASR-Transkri", "pk": "SDRv4", "tc": "None"}, {"id": 690, "title": "auto-model Skill aus Burger-Bulle-Projekt entfernen / feste Modell-Einstellung", "desc": "**Problem:** Im Workspace production/burgerbulle ist der auto-model Skill aktiv und darf hier NICHT drin sein. Er schalt", "pk": "SDRv4", "tc": "None"}, {"id": 688, "title": "Brainstorming: Skills kaufbar machen, Marketplace mit Price Tags pro Container", "desc": "**Idee (Chris, 2026-04-23 via Telegram):**\n\nSkills sollen zu einem kaufbaren Produkt werden. User (Container-Betreiber /", "pk": "SDRv4", "tc": "None"}, {"id": 687, "title": "Telefon-Voice-Bot: End-to-End-Latenz zu hoch (36s), Hybrid-Modell-Architektur nötig", "desc": "## Problem\n\nTest am 2026-04-23 über Telegram-Voice-Workflow: Verarbeitungszeit pro Turn ~36 Sekunden (ASR + Opus-Reasoni", "pk": "SDRv4", "tc": "None"}, {"id": 686, "title": "Voice-Bot Latenz: Telefon-Hybrid aus schnellem + großem Modell evaluieren", "desc": "**Problem:** Aktuelle Verarbeitung (Voice-Input → ASR → LLM-Reasoning → Voice-Output) dauert im Testing 30–40 Sekunden p", "pk": "SDRv4", "tc": "None"}, {"id": 685, "title": "Telefon-Usecase: Zwei-Tier-Modell-Setup fuer Low-Latency Voice-Bot", "desc": "## Problem\nOpus 4.7 (1M Kontext) braucht fuer die naechste Antwort ca. 30-45s Verarbeitungszeit (inkl. ASR+Routing). Fue", "pk": "SDRv4", "tc": "None"}, {"id": 684, "title": "Brainstorming: Product-Owner-Rolle von Timo definieren", "desc": "Ziel: Rolle und Erwartungshaltung an Timo Schulz als Product Owner klar definieren und schriftlich festhalten.\n\nKontext:", "pk": "SDRv4", "tc": "None"}, {"id": 682, "title": "MSH/Qwen3: Thinking-Modus nicht deaktivierbar", "desc": "openaiChatStream und chatCompletion in msh.ts übergeben think-Parameter nicht. claude-proxy proxyToOpenAICompat fehlt th", "pk": "SDRv4", "tc": "None"}, {"id": 679, "title": "Evaluierung: ASR/TTS Mehrsprachigkeit für Burger-Bulle-Bot (Arabisch, Türkisch)", "desc": "Der Burger-Bulle-Bot soll Kunden in Arabisch und Tuerkisch bedienen. Textbasierter Chat funktioniert bereits. Offen: ob ", "pk": "AI", "tc": "RESEARCH"}, {"id": 678, "title": "[APP-IDEE] Web-Chat-Widget auf burger-bulle.de � Senity-Sales an Abi", "desc": "Senity-Sales-Offerte an Abi: Den Chat-Agent aus Ticket #657 nicht nur als Telegram, sondern auch als eingebettetes Web-W", "pk": "SDRv4", "tc": "None"}, {"id": 677, "title": "Chat-Message-Persistenz (WP1) + CLI-Proxy-Modus (workspace_type cli_proxy)", "desc": "(1) Chat-Nachrichten werden fire-and-forget in chat_message persistiert (User + Assistenten). (2) CLI-Proxy-Modus: works", "pk": "SDRv4", "tc": "None"}, {"id": 676, "title": "Telegram DSGVO-Consent-Flow: kein PII vor Einwilligung speichern", "desc": "Neuer Consent-Flow für Telegram-Kanäle: Neue Nutzer erhalten zunächst eine Einwilligungsanfrage (3 Punkte). Erst nach Ja", "pk": "SDRv4", "tc": "None"}, {"id": 675, "title": "Nav-Permissions: UNION statt OVERRIDE, fehlende Seiten in Navigation", "desc": "nav-permissions Route lieferte OVERRIDE statt UNION: capabilities-basierte Nav-Slugs wurden durch DB-Einträge überschrie", "pk": "SDRv4", "tc": "None"}, {"id": 674, "title": "[BB] Abi-Vertrieb läuft ausschließlich über Timo, Rollenklarheit", "desc": "Rick hat Christoph nach dem Kickoff-Meeting 2026-04-05 explizit gesagt: Abi versucht unterschwellig eine Partnerrolle zu", "pk": "SDRv4", "tc": "None"}, {"id": 673, "title": "[BB] Live-Bestell-Preview für Abi, \"wer bestellt gerade was\"", "desc": "Meeting-Idee: Im Backend sieht Abi/Filiale live, welcher Kunde gerade was im Warenkorb hat und wie hoch die Abschluss-Wa", "pk": "SDRv4", "tc": "None"}, {"id": 672, "title": "[BB] 3CX-Voice-Integration für Telefon-Kanal", "desc": "Abi nutzt 3CX für Anruf-Routing (Weiterleitung an ihn, wenn Filiale nicht abnimmt). Senity nutzt 3CX auch (Rick: \"von Te", "pk": "SDRv4", "tc": "None"}, {"id": 671, "title": "[BB] Lieferando / Uber Eats / Wolt, Partner-API-Anbindung", "desc": "Große Plattformen haben Partner-APIs für Listings/Bestellungen. Ziel: Ein Pflegepunkt für Abi statt doppelte Arbeit in m", "pk": "SDRv4", "tc": "None"}, {"id": 670, "title": "[BB] Social-Media-Automation via Chat-Interface + Ad-hoc-Kampagnen", "desc": "Abi-Pain (Meeting 2026-04-05): Lieferando zwingt 5-6 Wochen Vorlauf für Kampagnen. Abi will ad-hoc reagieren (Schalke-Sp", "pk": "SDRv4", "tc": "None"}, {"id": 669, "title": "[BB] Fahrer-App mit GPS-Tracking + Liefer-Bestätigung", "desc": "Fahrer bestätigt Auslieferung in App. GPS-Tracking misst Lieferzeit. Backend analysiert Verkehrs-/Mitarbeiter-/Routen-Pe", "pk": "SDRv4", "tc": "None"}, {"id": 668, "title": "[BB] Routenplanung via Google Maps API + Bestell-Bündelung", "desc": "Fahrer-Routen optimieren:\n- Google Maps Directions API + Distance Matrix\n- Mehrere Bestellungen gleiche Straße → ein Fah", "pk": "SDRv4", "tc": "None"}, {"id": 667, "title": "[BB] Pizza-Hut-Modell, prädiktive Bestellung bei Stammkunden", "desc": "Abi-Anekdote Meeting 2026-04-05: Pizza Hut berechnet bei Online-Anmeldung die Wahrscheinlichkeit der Stammbestellung. Be", "pk": "SDRv4", "tc": "None"}, {"id": 666, "title": "[BB] Bonuspunkte / Treueaktionen, personalisierte Rabatte", "desc": "Meeting-Idee (Pizza-Hut-Beispiel): \"Du hast schon 10 Margaritas bestellt, hier 10 % auf die nächste\".\n\nMechanik:\n- Punkt", "pk": "SDRv4", "tc": "None"}, {"id": 665, "title": "[BB] AGB / Haftung für Voice-Bot-Bestellungen + Allergen-Disclaimer", "desc": "Haftungsrisiken bei Bestellannahme per Bot:\n- Allergen-Auskunft falsch → Anaphylaxie\n- Falscher Preis kommuniziert\n- Bes", "pk": "SDRv4", "tc": "None"}, {"id": 664, "title": "[BB] DSGVO + Datenschutz für Kundendatenbank", "desc": "Kundenprofile mit Präferenzen, Bestellhistorie, Adressen sind personenbezogene Daten.\n\nPflichten:\n- Rechtsgrundlage (Art", "pk": "SDRv4", "tc": "None"}, {"id": 663, "title": "[BB] Zahlungs-Integration, Stripe + PayPal + Zahl-Link", "desc": "Abi will Barzahlung möglichst vermeiden (Fake-Risiko, manuelle Abrechnung).\n\nUmsetzung:\n- Stripe (Karte, SEPA, Klarna, A", "pk": "SDRv4", "tc": "None"}, {"id": 662, "title": "[BB] Mehrsprachigkeit, DE / EN / AR / TR (Arabisch priorisiert)", "desc": "Laut Abi (Meeting 2026-04-05): Viele Restaurantbesitzer und Mitarbeiter in der Gastro-Szene sprechen Arabisch oder Türki", "pk": "SDRv4", "tc": "None"}, {"id": 661, "title": "[BB] Kundendatenbank mit Präferenzen + personalisierte Empfehlungen", "desc": "Pro Telefon-Nummer/Email ein Kundenprofil speichern:\n- Lieblingsgerichte, Allergien, Ernährungs-Profile (siehe wissensda", "pk": "SDRv4", "tc": "None"}, {"id": 660, "title": "[BB] Multi-Brand-Architektur (mehrere Gastro-Konzepte eines Betreibers)", "desc": "Abi betreibt Burger Bulle + Dönerladen (Podolski-Franchise) + Frühstückscafé + Kaiserschmann + Belladen (Meeting 2026-04", "pk": "SDRv4", "tc": "None"}, {"id": 659, "title": "[BB] Drucker-Anbindung, Bestellungen als Papier-Bon in die Küche", "desc": "Abis Drucker hängt an der Webseite, druckt aktuell Online-Bestellungen automatisch. Muss als Ausgabe-Kanal bestehen blei", "pk": "SDRv4", "tc": "None"}, {"id": 658, "title": "[BB] Anti-Fake-Bestellung, Verifikations-Code via SMS/WhatsApp/Telegram", "desc": "Abi hat Telefonbestellungen wegen zu vieler Fake-Bestellungen eingestellt (60-70€ Verluste).\n\nLösung (Meeting 2026-04-05", "pk": "SDRv4", "tc": "None"}, {"id": 657, "title": "[BB] MVP Chat-Agent mit Speisekarten-Wissen + Upselling", "desc": "Kern-MVP laut Meeting 2026-04-05 und Strategie-Entscheidung aus Ticket #653.\n\nKanäle: Telegram + Web-Chat auf burger-bul", "pk": "SDRv4", "tc": "None"}, {"id": 656, "title": "[BB] Kontakt zu Abis IT-Team herstellen, Bestellsystem-Audit", "desc": "Abi hat sein Online-Bestellsystem von externem IT-Team bauen lassen, aktuell Modernisierung laufend.\n\nAufgabe: Direkter ", "pk": "SDRv4", "tc": "None"}, {"id": 655, "title": "[BB] Abi-Discovery: Marken- und Standort-Inventur", "desc": "Abi betreibt lt. Kickoff-Meeting ~6 Filialen (nicht nur 3 Burger Bulle) in ~500m Radius Gelsenkirchen. Genannt: Burger B", "pk": "SDRv4", "tc": "None"}, {"id": 654, "title": "[BB] Speisekarten + Marketingmaterial von Abi einholen", "desc": "Vorbedingung für MVP. Wir brauchen:\n- Speisekarten aller Filialen als PDF/Excel (digital, nicht Papier)\n- Marketingmater", "pk": "SDRv4", "tc": "None"}, {"id": 653, "title": "[Meeting 22.04.2026] Burger Bulle / Abi – Produktstrategie, Demo-Vorbereitung, Pricing", "desc": "Teilnehmer: Marco Escribano, Christoph Brucksch\n\nKernentscheidungen:\n- Strategiewechsel: VoiceBot → modularer AI Workspa", "pk": "SDRv4", "tc": "None"}, {"id": 651, "title": "[Brainstorming] Telegram-Registrierungsflow + verschlüsselte CLAUDE_*.md Personas", "desc": "## Idee\n\nNutzer die über Telegram schreiben, werden mit einem zeitlimitierten HMAC-Link auf eine öffentliche Registrieru", "pk": "SDRv4", "tc": "None"}, {"id": 650, "title": "Message Persistence für alle LLM-Calls in /api/chat/send", "desc": "Alle Nachrichten die durch /api/chat/send gehen in chat_message speichern:\n- User-Message vor dem LLM-Call speichern (we", "pk": "SDRv4", "tc": "None"}, {"id": 649, "title": "Admin Telegram Bot mit CLI-Proxy verdrahten", "desc": "Admin-Bot (bot_config id=5) mit cli-proxy-Container verbinden:\n- cli_server-Eintrag für cli-proxy erstellen (workspace_t", "pk": "SDRv4", "tc": "None"}, {"id": 648, "title": "Workspace-Container fehlt TICKETING_MICROSERVICE_AUTH_TOKEN", "desc": "Der cli-ws-* Workspace-Container hat keinen Zugriff auf das Ticketing-System, weil TICKETING_MICROSERVICE_AUTH_TOKEN und", "pk": "SDRv4", "tc": "None"}, {"id": 647, "title": "YouTube-Summarizer Bugfixes: Timeout, videoQuality und language", "desc": "Drei Bugs beim YouTube-Summarizer behoben:\n\n1. **Orchestrator-Timeout zu kurz**: PROXY_REQUEST_TIMEOUT_MS war 120s (2 mi", "pk": "SDRv4", "tc": "IMP"}, {"id": 646, "title": "Dedizierten Gitea-SSH-Key fuer senity-admin einrichten (Hetzner -> git.senity.ai)", "desc": "# Gitea-SSH-Zugang fuer senity-admin vom Hetzner-Server\n\n## Kontext\nAm 2026-04-22 wurde das private Gitea-Repo `senity-a", "pk": "CORE", "tc": "CHO"}, {"id": 645, "title": "Allen Senity-Mitarbeitern kostenlose Claude-Code-Instanz (via Senity-Ollama-Gateway) anbieten", "desc": "# Internes Angebot: Kostenlose Claude Code für alle Senity-Mitarbeiter\n\n## Idee\nSenity betreibt einen eigenen Ollama-GPU", "pk": "CORE", "tc": "FEAT"}, {"id": 644, "title": "claude-msh auch auf Windows-Rechner (Christoph) einrichten", "desc": "# claude-msh Setup auf Windows-Arbeitsrechner\n\n## Kontext\nAuf dem Hetzner-Server (opus / senity-hetzner) wurde am 2026-0", "pk": "CORE", "tc": "CHO"}, {"id": 642, "title": "Telegram Gruppen-Fix: channel_post + my_chat_member + allowed_updates vollständig", "desc": "Fix A+B+C aus Multi-Modell-Review:\n\nA) channel_post / edited_channel_post als gültige Update-Typen aufgenommen (Telegram", "pk": "SDRv4", "tc": "None"}, {"id": 640, "title": "Bot-Broadcast: Claude kann an bekannte Telegram-Kontakte on-demand Nachrichten senden", "desc": "PS-Frage von Christoph: Kann Claude sich Kontakte merken und ihnen on-demand Nachrichten senden? Antwort: ja, mit kleine", "pk": "SDRv4", "tc": "FEAT"}, {"id": 639, "title": "cli-workspace: Default-Claude-Settings ins Image backen", "desc": "Headless-Betrieb (Telegram-Webhook, kein UI) braucht defaultMode=acceptEdits + Allow-Liste fuer git/curl/ffmpeg/etc., so", "pk": "SDRv4", "tc": "CHO"}, {"id": 638, "title": "Telegram-Gruppen: @mention-Filter + Sender-Identitaet im Claude-Prompt", "desc": "Zwei Luecken im Webhook fuer Gruppen-Chats:\n\n(1) @mention-Filter: Aktuell triggert jede Message im Chat die komplette Pi", "pk": "SDRv4", "tc": "FEAT"}, {"id": 637, "title": "Outbound Media ueber Telegram: Datei-Versand + TTS-Voice aus CLI-Chat", "desc": "Gegenstueck zu FEAT-337 (Inbound-Media): CLI-Chat soll Dateien und TTS-Sprachnachrichten ueber Telegram *ausgehend* vers", "pk": "SDRv4", "tc": "FEAT"}, {"id": 636, "title": "Skill asr-transcribe fuer CLI-Workspaces", "desc": "Neuer Skill unter .claude/skills/asr-transcribe/SKILL.md (global, per Dockerfile in senity/cli-workspace-Image gebaken).", "pk": "SDRv4", "tc": "FEAT"}, {"id": 635, "title": "cli-orchestrator: telegram-inbox Bind-Mount an alle cli-ws-Container anhaengen", "desc": "docker-manager.ts: beim createWorkspace() zusaetzlich zu cli-data-Volume + targetMount immer den Bind /opt/senity/core/d", "pk": "SDRv4", "tc": "CHO"}, {"id": 634, "title": "Telegram-Webhook: Voice/Audio/Document/Photo-Download via getFile", "desc": "Webhook-Erweiterung in app/api/cli-channels/webhook/[channelId]/route.ts. Beim Eintreffen von msg.voice/audio/document/p", "pk": "SDRv4", "tc": "FEAT"}, {"id": 633, "title": "senity-workspace Container: chown -R 1001:1001 nach git pull, damit cli-ws Bots schreiben koennen", "desc": "Workspace-Container clont/pullt als root und hinterlaesst alle Files root-owned. Cli-ws-senity-workspace laeuft als seni", "pk": "INFRA", "tc": "CHO"}, {"id": 632, "title": "BotUserMappingAdminClient: apiCall-Response nicht unwrapped + TTSField-Signature", "desc": "TypeScript-Build schlaegt fehl: apiCall<T>() liefert ApiResponse<T> (= {data:T, ...}), der Client las T direkt. 4 Stelle", "pk": "SDRv4", "tc": "BUG"}, {"id": 631, "title": "Migration 101 scheitert mit 22P02 wenn board_provider_type kein 'asana' mehr hat", "desc": "DELETE FROM board_provider_connection WHERE provider='asana' castet das Literal zum ENUM board_provider_type. Wenn der E", "pk": "SDRv4", "tc": "BUG"}, {"id": 630, "title": "Skill-basierte Media-Verarbeitung fuer CLI-Workspaces (Telegram+Web)", "desc": "Umgewidmet: statt zentrale Server-Pipeline arbeitet Claude im cli-ws-Container on-demand mit Skills. Webhook downloaded ", "pk": "SDRv4", "tc": "EPIC"}, {"id": 629, "title": "Admin-UI: bot_user_mapping-Overview + Link/Unlink + Soft-Delete", "desc": "Neue Admin-Seite oder Tab in Contact-Detail-Ansicht: Liste aller bot_user_mapping-Eintraege (verlinkt/unverlinkt), manue", "pk": "SDRv4", "tc": "FEAT"}, {"id": 628, "title": "Bot-Onboarding-Conversation: request_contact + Email + 3x Consent", "desc": "Neuer User bekommt nach erster Nachricht gefuehrte Onboarding-Sequenz: (1) Tel-Nr via request_contact-Button, (2) Email ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 627, "title": "Webhook-Hook: bot_user_mapping-Upsert + Auto-Contact-Create bei neuen Telegram-Usern", "desc": "Bei jedem POST /api/cli-channels/webhook/[channelId]/route.ts wird msg.from.id als external_user_id in bot_user_mapping ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 626, "title": "DB+API: consent_type-Enum um email_marketing, phone_call_marketing, sms_marketing erweitern", "desc": "Erweitert das consent_type-Enum und die /api/gdpr/consent-Route um drei Marketing-Typen. Contact-Tabelle bekommt keine n", "pk": "SDRv4", "tc": "FEAT"}, {"id": 625, "title": "Telegram-User-Identity: persistente Zuordnung per Telegram-ID, E-Mail und Telefonnummer", "desc": "Ziel: Ein Telegram-Nutzer, der mit einem SDRv4-CLI-Channel chattet, wird persistent einem app_user bzw. contact zugeordn", "pk": "SDRv4", "tc": "EPIC"}, {"id": 624, "title": "cli-orchestrator: removeWorkspace loescht cli-data-Volume", "desc": "OAuth/State geht beim Recreate verloren.", "pk": "SDRv4", "tc": "BUG"}, {"id": 623, "title": "cli-bridge-api: package-lock.json mit package.json synchronisieren", "desc": "ws + @types/ws sind aus package.json entfernt, aber die Lockfile hatte die Einträge noch. npm ci in CI würde deswegen fe", "pk": "SDRv4", "tc": "CHO"}, {"id": 622, "title": "cli-bridge-api: honor BRIDGE_PROJECT_ROOT for targetMount-based single-project workspaces", "desc": "## Kontext\nDie AI-Workspace-Container (cli-ws-*) mounten den Code des jeweiligen Live-Containers via FEAT-299 `targetMou", "pk": "SDRv4", "tc": "FEAT"}, {"id": 621, "title": "Telegram-Kanäle an CLI-Container anbinden (test/live/workspace)", "desc": "Drei Telegram-Bots (@senity_test_bot, @senity_live_bot, @senity_workspace_bot) als cli_server_channel-Einträge anlegen u", "pk": "SDRv4", "tc": "CHO"}, {"id": 620, "title": "claude-proxy/Gemini: Tool-Schema enthält $schema/additionalProperties, von Gemini abgelehnt", "desc": "# Gemini-Provider lehnt Tool-Calls wegen Schema-Metadata-Feldern ab\n\n## Symptom\n```\n[middleware:error] [claude-proxy] Ge", "pk": "SDRv4", "tc": "BUG"}, {"id": 619, "title": "claude-proxy/MSH: Em-Dash (-) im Header sprengt ByteString-Encoding", "desc": "# claude-proxy MSH-Provider crasht bei Unicode in Header\n\n## Symptom\n```\n[middleware:error] [claude-proxy] Alle Chain-En", "pk": "SDRv4", "tc": "BUG"}, {"id": 618, "title": "CliChat: activeSessionId beim Server-Wechsel resetten, sonst CLI-Session-Mismatch-Fehler", "desc": "# Bug: CliChat schickt Session-ID vom alten Server\n\n## Symptom\nBackend wirft `NotFoundError: CLI-Session 48 gehört nicht", "pk": "SDRv4", "tc": "BUG"}, {"id": 617, "title": "CLI-Server Create: Auto-Start nach Container-Create + Git-Clone in start.sh überspringen wenn /workspace bereits gemountet", "desc": "# Zwei Findings beim Anlegen neuer CLI-Server (Development-Container)\n\n## Finding 1: Container bleibt nach Create im Sta", "pk": "SDRv4", "tc": "BUG"}, {"id": 615, "title": "db/101 drop-asana: COMMENT ON TABLE ticket nicht durch IF EXISTS geschützt", "desc": "# Bug: db/101_2026-04-22-drop-asana.sql crasht wenn `ticket`-Tabelle fehlt\n\n## Symptom\n\nUser-Report beim Ausführen der M", "pk": "SDRv4", "tc": "BUG"}, {"id": 614, "title": "SDRv4 Legacy-api_ticket*-Tabellen entfernen + /api/api-tickets-Routen auf sts-api umstellen", "desc": "Mehrstufiger Cleanup der alten Ticket-Infrastruktur in SDRv4. Ziel: die Pre-Schema-v2-Tabellen (`api_ticket`, `api_ticke", "pk": "SDRv4", "tc": "CHO"}, {"id": 613, "title": "Lokale .tasks/-Archive aus SDRv4 komplett entfernt, Online-Ticketing ist Source of Truth", "desc": "Am 2026-04-22 wurden alle 116 Dateien im `.tasks/`-Verzeichnis von SDRv4 gelöscht (110 .md-Tickets, 1 .docx-Doku, 2 Coun", "pk": "SDRv4", "tc": "CHO"}, {"id": 612, "title": "CLI-Chat Context-Limit: hardcoded 20 durch Konstante ersetzen", "desc": "# CLI-Chat Context-Limit als Konstante\n\n## Problem\n\nIn `app/api/cli/servers/[id]/messages/route.ts` ist das Kontext-Fens", "pk": "SDRv4", "tc": "IMP"}, {"id": 611, "title": "[Brainstorming] Chat-API als eigenständiger Microservice + intelligentes Context-Ranking", "desc": "# Chat-API als eigenständiger Microservice + intelligentes Context-Ranking\n\n## Motivation\n\nDie Chat-Logik steckt aktuell", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 610, "title": "sts-api Lookup-Endpoints (/api/ticket-type, -priority, -status) liefern 404", "desc": "Die in CLAUDE.md dokumentierten Lookup-Endpoints antworten in Production mit HTTP 404.\n\n**Beobachtet:** 2026-04-22 — GET", "pk": "ticketing-system", "tc": "BUG"}, {"id": 609, "title": "sts-api POST /api/tickets ignoriert type_code und metadata", "desc": "Der sts-api POST-Endpoint verwirft `type_code` und `metadata` aus dem Request-Body.\nNur Basic-Felder (title, description", "pk": "ticketing-system", "tc": "BUG"}, {"id": 608, "title": "Setup Guide - EventHandler API", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\setup-guide-legacy.md am 2026-04-22, Legacy-Archiv-Migration.\n\n# Se", "pk": "SDRv4", "tc": "CHO"}, {"id": 607, "title": "RES-003: MSH ↔ SDRv4 Feature-Matrix & Sync-Plan", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\reports\\2026-04-03-msh-sdrv4-feature-matrix.md am 2026-04-22, Legac", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 606, "title": "DEBUG_MODE System, Technisches Design", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\reports\\2026-04-01-head4-debug-mode-design.md am 2026-04-22, Legacy", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 605, "title": "Frontend Audit Report, 2026-04-01", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\reports\\2026-04-01-head3-frontend-audit.md am 2026-04-22, Legacy-Ar", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 604, "title": "Libraries Audit Report, 2026-04-01", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\reports\\2026-04-01-head2-libraries-audit.md am 2026-04-22, Legacy-A", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 603, "title": "API Routes Log-Audit Report", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\reports\\2026-04-01-head1-api-routes-log-audit.md am 2026-04-22, Leg", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 602, "title": "Log-Qualitätsanalyse, SDRv4", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\reports\\2026-04-01-gemini2-log-quality.md am 2026-04-22, Legacy-Arc", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 601, "title": "Bug-Hunting Report - SDRv4", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\reports\\2026-04-01-gemini1-bug-hunting.md am 2026-04-22, Legacy-Arc", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 600, "title": "Final Review Report, 2026-04-01", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\reports\\2026-04-01-final-review-gemini.md am 2026-04-22, Legacy-Arc", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 599, "title": "Final Review, Codex (gpt-5.4) + Claude Senior Review", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\reports\\2026-04-01-final-review-codex.md am 2026-04-22, Legacy-Arch", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 598, "title": "Log-Qualitätsanalyse", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\reports\\2026-04-01-codex2-log-quality.md am 2026-04-22, Legacy-Arch", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 597, "title": "Bug-Hunting Report - SDRv4", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\reports\\2026-04-01-codex1-bug-hunting.md am 2026-04-22, Legacy-Arch", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 596, "title": "Token Economy Design, Senity Tokens (ST)", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\plans\\2026-04-03-token-economy-design.md am 2026-04-22, Legacy-Arch", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 595, "title": "LiveKit Voice-Chat MVP, Implementierungsplan v2", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\plans\\2026-04-03-livekit-voice-chat-mvp.md am 2026-04-22, Legacy-Ar", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 594, "title": "Git Workflow Agent Ökosystem, Implementierungsplan", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\plans\\2026-04-02-git-workflow-agent-ecosystem-impl.md am 2026-04-22", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 593, "title": "Design: Git Workflow Agent Ökosystem v2", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\plans\\2026-04-02-git-workflow-agent-ecosystem-design.md am 2026-04-", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 592, "title": "AI Management & Billing System, Implementation Plan", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\plans\\2026-04-02-ai-management-billing-impl.md am 2026-04-22, Legac", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 591, "title": "AI Management & Billing System, Design", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\plans\\2026-04-02-ai-management-billing-design.md am 2026-04-22, Leg", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 590, "title": "Design: Agent/Skill-Layering, Override & Addon Pattern", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\plans\\2026-04-02-agent-layering-design.md am 2026-04-22, Legacy-Arc", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 589, "title": "\"Wunsch dir was\" Implementation Plan", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\plans\\2026-04-01-wunsch-dir-was-impl.md am 2026-04-22, Legacy-Archi", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 588, "title": "Design: \"Wunsch dir was\", Feature-Request-System mit KI-Ticket-Bewertung", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\plans\\2026-04-01-wunsch-dir-was-design.md am 2026-04-22, Legacy-Arc", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 587, "title": "Supabase Admin Agent, Design", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\plans\\2026-04-01-supabase-admin-agent-design.md am 2026-04-22, Lega", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 586, "title": "Logging & Security Hardening, Implementation Plan", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\plans\\2026-04-01-logging-security-hardening-impl.md am 2026-04-22, ", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 585, "title": "Datenmodell-Refactoring: Unternehmensprofil auflösen + Entity-Lookups + Bankdaten + UI-Angleichung", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\plans\\2026-04-01-datenmodell-refactoring-design.md am 2026-04-22, L", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 584, "title": "Codex Unified CLI Migration, Implementierungsplan", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\plans\\2026-04-01-codex-unified-cli-migration.md am 2026-04-22, Lega", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 583, "title": "Multi-Value E-Mails, Telefonnummern & Adressen, Implementation Plan", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\plans\\2026-03-31-multi-value-contact-data-impl.md am 2026-04-22, Le", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 582, "title": "Security Hardening Implementation Plan", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\plans\\2026-03-30-security-hardening.md am 2026-04-22, Legacy-Archiv", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 581, "title": "DSGVO-Dokumenten-Verwaltung, Design", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\plans\\2026-03-30-dsgvo-documents-page-design.md am 2026-04-22, Lega", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 580, "title": "DSGVO-Dokumenten-Verwaltung, Implementierungsplan", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\plans\\2026-03-30-dsgvo-documents-impl.md am 2026-04-22, Legacy-Arch", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 579, "title": "Company Groups, Konsolidierter Implementierungsplan", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\plans\\2026-03-30-company-groups-consolidated-impl.md am 2026-04-22,", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 578, "title": "Lead-Scraper Bugfixes & Architektur-Überarbeitung", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\plans\\2026-03-29-lead-scraper-bugfixes-impl.md am 2026-04-22, Legac", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 577, "title": "Plan: Full RLS Security Update", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\plans\\2026-03-29-full-rls-security-impl.md am 2026-04-22, Legacy-Ar", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 576, "title": "Company Groups: Schrittweiser Implementierungsplan", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\plans\\2026-03-29-company-groups-ux-ui-impl.md am 2026-04-22, Legacy", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 575, "title": "Implementierungsplan: Company Groups Phase 2, Matching-Algorithmus + Review-Queue", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\plans\\2026-03-29-company-groups-phase2-matching-impl.md am 2026-04-", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 574, "title": "Implementierungsplan: Company Groups Phase 1, DB-Schema + API-Endpoints", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\plans\\2026-03-29-company-groups-phase1-schema-api-impl.md am 2026-0", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 573, "title": "Implementierungsplan: Company Groups DSGVO, Phase 0 + Phase 1", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\plans\\2026-03-29-company-groups-dsgvo-phase01-impl.md am 2026-04-22", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 572, "title": "Implementierungsplan: Company Groups & CRM-Integration", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\plans\\2026-03-29-company-groups-crm-integration-impl.md am 2026-04-", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 571, "title": "Company-Based Data Isolation Plan, Codex Review", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\plans\\2026-03-29-company-data-isolation-review-codex.md am 2026-04-", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 570, "title": "AI Runtime Isolation Report für SDRv4", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\plans\\2026-03-29-ai-runtime-isolation-report.md am 2026-04-22, Lega", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 569, "title": "Plan: Agentic Workflow, CLI Tools im Docker Container mit API Keys", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\plans\\2026-03-29-agentic-workflow-docker-impl.md am 2026-04-22, Leg", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 568, "title": "Full RLS Security Update, Future Plan", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\archiv\\full-rls-security-update.md am 2026-04-22, Legacy-Archiv-Mig", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 567, "title": "Brainstorming: Agentic Workflow, CLI Tools im Docker Container mit API Keys", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\archiv\\brainstorming_agentic_workflow.md am 2026-04-22, Legacy-Arch", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 566, "title": "Token Conter (2026-03-30)", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\archiv\\2026-03-30-token_conter.md am 2026-04-22, Legacy-Archiv-Migr", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 565, "title": "Unternehmensgruppen: Ausführlicher UX/UI-Implementierungsplan", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\archiv\\2026-03-29-company-groups-ux-ui-plan.md am 2026-04-22, Legac", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 564, "title": "Implementierungsplan: Unternehmensgruppen / Konzernstrukturen", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\archiv\\2026-03-29-company-groups-schema-api-plan.md am 2026-04-22, ", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 563, "title": "DSGVO-Compliance-Plan: Unternehmensgruppen (Company Groups)", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\archiv\\2026-03-29-company-groups-dsgvo-plan.md am 2026-04-22, Legac", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 562, "title": "Company Groups & CRM-Integration Plan", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\archiv\\2026-03-29-company-groups-crm-integration-plan.md am 2026-04", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 561, "title": "Company-Based Data Isolation, Implementation Plan", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\archiv\\2026-03-27-company-data-isolation-plan.md am 2026-04-22, Leg", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 560, "title": "Company-Based Data Isolation, Design Document", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\archiv\\2026-03-27-company-data-isolation-design.md am 2026-04-22, L", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 559, "title": "Consolidated Review: faster-qwen3-tts Migration Plan", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\archiv\\2026-03-26-faster-qwen3-tts-review-consolidated.md am 2026-0", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 558, "title": "Review: `faster-qwen3-tts` Migration Plan", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\archiv\\2026-03-26-faster-qwen3-tts-review-codex.md am 2026-04-22, L", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 557, "title": "Image Generation with Fallback Chain — Implementation Plan", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\archiv\\2026-03-22-image-generation-plan.md am 2026-04-22 — Legacy-A", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 556, "title": "Design: Bildgenerierung mit Fallback-Chain", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\archiv\\2026-03-22-image-generation-design.md am 2026-04-22 — Legacy", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 555, "title": "Chat ↔ Lead Scraper Integration Re-Review", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\archiv\\2026-03-22-chat-lead-scraper-integration-review2-codex.md am", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 554, "title": "Re-Review: Chat ↔ Lead Scraper Integration", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\archiv\\2026-03-22-chat-lead-scraper-integration-review2-GEMINI.md a", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 553, "title": "Review: Chat ↔ Lead Scraper Integration Design", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\archiv\\2026-03-22-chat-lead-scraper-integration-review.md am 2026-0", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 552, "title": "Chat ↔ Lead Scraper Integration Review", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\archiv\\2026-03-22-chat-lead-scraper-integration-review-codex.md am ", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 551, "title": "Chat ↔ Lead Scraper Integration — Implementierungsplan", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\archiv\\2026-03-22-chat-lead-scraper-integration-plan.md am 2026-04-", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 550, "title": "Implementierungsplan: Chat ↔ Lead Scraper Integration", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\archiv\\2026-03-22-chat-lead-scraper-integration-plan-gemini.md am 2", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 549, "title": "Chat <-> Lead Scraper Integration - Implementierungsplan", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\archiv\\2026-03-22-chat-lead-scraper-integration-plan-codex.md am 20", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 548, "title": "Chat ↔ Lead Scraper Integration — Design", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\archiv\\2026-03-22-chat-lead-scraper-integration-design.md am 2026-0", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 547, "title": "Usability-Verbesserungen: Design-Dokument", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\archiv\\2026-03-21-usability-improvements-design.md am 2026-04-22 — ", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 546, "title": "Usability-Verbesserungen: Implementierungsplan", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\archiv\\2026-03-21-usability-implementation-plan.md am 2026-04-22 — ", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 545, "title": "Dokumentations-Status (Audit 2026-03-29)", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\STATUS-legacy.md am 2026-04-22 — Legacy-Archiv-Migration.\n\n# Dokume", "pk": "SDRv4", "tc": "CHO"}, {"id": 544, "title": "Server-Audit Hetzner GEX44 — 2026-04-20", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\SERVER-AUDIT-2026-04-20.md am 2026-04-22 — Legacy-Archiv-Migration.", "pk": "SDRv4", "tc": "CHO"}, {"id": 543, "title": "Offene Rücksprache-Punkte", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\RUECKSPRACHE-OFFEN.md am 2026-04-22 — Legacy-Archiv-Migration.\n\n# O", "pk": "SDRv4", "tc": "CHO"}, {"id": 542, "title": "Backlog + Ideen", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\BACKLOG.md am 2026-04-22 — Legacy-Archiv-Migration.\n\n# Backlog + Id", "pk": "SDRv4", "tc": "CHO"}, {"id": 541, "title": "Backlog — Aktive Tickets", "desc": "> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\BACKLOG.md am 2026-04-22 — Legacy-Archiv-Migration.\n\n# Backlog — Aktive Ti", "pk": "SDRv4", "tc": "EPIC"}, {"id": 538, "title": "Profiler-Agent: Always-on-Workflow + Findings-Dokumentation", "desc": "Der Profiler-Agent soll in jeder Session durchgehend mitlaufen und User-Beobachtungen (DISC-Profil, Kommunikationsstil, ", "pk": "SDRv4", "tc": "None"}, {"id": 533, "title": "[SDRv4] Deploy: dev → production/live + production/test", "desc": "Worktrees live-live und test-live auf dev-Spitze ziehen (aktuell 2 Commits behind), Container rebuild.", "pk": "SDRv4", "tc": "None"}, {"id": 532, "title": "[INFRA] senity-workspace: busybox httpd 404 auf / (unhealthy)", "desc": "Der senity-workspace Container ist unhealthy, weil busybox httpd auf / 404 liefert (kein index.html im Repo, Directory-L", "pk": "SDRv4", "tc": "None"}, {"id": 530, "title": "senity-workspace Container: Remote-URL + SSH-Key umstellen", "desc": "Das Gitea-Repo senity-workspace wurde von senity-admin/ nach senity/ verschoben. Der laufende senity-workspace Container", "pk": "SDRv4", "tc": "None"}, {"id": 529, "title": "sts-api: Token-effiziente Shortcut-Endpoints für Status-Updates (LLM-friendly)", "desc": "Ziel: Die sts-api so gestalten, dass LLMs (Claude, Codex, Gemini) mit **minimalem Token-Verbrauch** Status-Änderungen un", "pk": "SDRv4", "tc": "FEAT"}, {"id": 528, "title": "sts-api: Endpoint für nächste Ticket-Nummer (next-code)", "desc": "Problem: Beim Anlegen neuer Tickets muss aktuell manuell die nächste freie Code-Nummer pro (project_key, type_code) gesu", "pk": "SDRv4", "tc": "FEAT"}, {"id": 526, "title": "Senity-Workflow-Doku im senity-ticketing-system Repo konsolidieren", "desc": "Ziel: Das externe Repo senity-ticketing-system (D:\\Devel\\NodeJS\\SDRv5\\ticketing-system, git@git.senity.ai-sts:senity/sen", "pk": "SDRv4", "tc": "CHO"}, {"id": 525, "title": "Ticketing-Workflow-Doku aus SDRv4 extrahieren + Pflicht-Klausel", "desc": "Ziel: SDRv4 enthält aktuell umfangreiche Ticketing-Workflow-Doku (Ticket-Pflicht, sts-api-Calls, Status-IDs, Type-Codes,", "pk": "SDRv4", "tc": "CHO"}, {"id": 524, "title": "ERNIE Image-Generation Support via MSH-Gateway", "desc": "Retrospektiv angelegt für Commit fb14ae0f (aktuell mit unsauberer Message 'ernie' — Rebase-Rename geplant).\n\nErweitert d", "pk": "SDRv4", "tc": "FEAT"}, {"id": 523, "title": "MSH GPU-Server als LLM/TTS/ASR/Image-Provider integriert (DSGVO-konform, self-hosted)", "desc": "Retrospektiv angelegt für Commit c2693c5b.\n\nNeuer self-hosted Provider lib/llm/providers/msh.ts (569 Zeilen) — zielt auf", "pk": "SDRv4", "tc": "FEAT"}, {"id": 522, "title": "Orchestrator DELETE /workspaces/:id aktualisiert cli_server-DB nicht", "desc": "Session 2026-04-21: cli-ws Container via Orchestrator DELETE entfernt. Response war 200/deleted, aber in cli_server blie", "pk": "SDRv4", "tc": "BUG"}, {"id": 521, "title": "Compose sdrv4-live/-test auf Standalone-Startup umstellen", "desc": "Deprecation-Warnung in Next.js 16: `next start` funktioniert nicht mit `output: standalone`. Wird laut Release-Notes in ", "pk": "SDRv4", "tc": "IMP"}, {"id": 520, "title": "HOTFIX: MSH-Provider Type-Error blockt prod Build", "desc": "Build schlägt fehl: lib/llm/providers/msh.ts:208 — mapMessages returnt Array<{ role: string; content ... }> statt ChatCo", "pk": "SDRv4", "tc": "BUG"}, {"id": 519, "title": "ServerSettings.tsx: Target-Container/-Path/-MountPoint editierbar machen", "desc": "IMP-329 hat den Backend-Teil umgesetzt — PATCH /api/cli/servers/[id] akzeptiert jetzt target_container, target_path, mou", "pk": "SDRv4", "tc": "IMP"}, {"id": 518, "title": "PATCH /api/cli/servers/[id]: target_container/target_path/mount_point nachträglich editierbar", "desc": "Aktuell akzeptiert der PATCH-Endpoint nur name, description, resource_limits, idle_timeout_min, auth_type, api_key, sdr_", "pk": "SDRv4", "tc": "IMP"}, {"id": 516, "title": "CreateServerDialog: Ziel-Pfade auf replizierbare Mounts filtern", "desc": "UX-Verbesserung. Beim Auswählen eines Target-Containers im CreateServerDialog sollen im Pfad-Dropdown nur Pfade erschein", "pk": "SDRv4", "tc": "IMP"}, {"id": 515, "title": "SSO-Handoff SDRv4 → Ticketing-UI implementieren", "desc": "Das App-Manifest apps/ticketing-system/manifest.json deklariert ssoHandoff:true, aber die Implementierung fehlt auf beid", "pk": "SDRv4", "tc": "FEAT"}, {"id": 514, "title": "sts-web Frontend: @murc134-Migration 0.2 → aktuelle Versionen + Standalone-Build", "desc": "Frontend-Container sts-web baut nicht mehr weil @murc134@0.2.0-Versionen aus dem Registry verschwunden sind. SDRv4 läuft", "pk": "SDRv4", "tc": "FEAT"}, {"id": 513, "title": "CHO-299 Nachbesserung: api-tickets/[ref]-Routen, dual-auth, Agent-Configs", "desc": "Nach CHO-299 Abschluss: noch offene Umbauten auf die neue tickets-Tabelle bzw. sts-api.\n\nScope:\n1. app/api/api-tickets/[", "pk": "SDRv4", "tc": "CHO"}, {"id": 512, "title": "Per-Container Provider-Keys (Gemini / Anthropic / OpenAI)", "desc": "Ziel: User kann pro CLI-Container einen eigenen Provider-Key hinterlegen statt zentrale Fallback-Chain zu nutzen.\n\nUX:\n-", "pk": "SDRv4", "tc": "FEAT"}, {"id": 511, "title": "ServerDetail: Overlay-Refactor mit Tabs, /servers/[id] entfernen", "desc": "Ziel: Konsistenz mit Senity-weiter Navigation-Regel (Details nur in Overlays, keine separaten Detail-Seiten).\n\nScope:\n- ", "pk": "SDRv4", "tc": "IMP"}, {"id": 510, "title": "Next.js Route-Konflikt: apps/[id] vs apps/[appId]", "desc": "Build scheiterte mit \"You cannot use different slug names for the same dynamic path (appId !== id)\". FEAT-323 legte app/", "pk": "SDRv4", "tc": "BUG"}, {"id": 509, "title": "sts-api GET /api/tickets: flexible Filter + Freitext-Suche + Multi-Sort", "desc": "Die sts-api Liste-Endpoint muss um folgende Filter erweitert werden: project_key, type_code, code/code_prefix, created_b", "pk": "SDRv4", "tc": "CHO"}, {"id": 508, "title": "SDR-Code und Agents auf neues Ticketing-System (sts-api / tickets-Tabelle) umstellen", "desc": "Nach Migration von api_ticket → tickets (siehe db/094) müssen alle Code-Referenzen auf api_ticket* und die alten Embedde", "pk": "SDRv4", "tc": "CHO"}, {"id": 507, "title": "ServerDetailOverlay: Link zur Detail-Seite fehlt", "desc": "Overlay hatte keinen Weg zur /servers/[id] Full-Detail mit Tabs. Fix: Prominenter Link-Button im Footer.", "pk": "SDRv4", "tc": "BUG"}, {"id": 92, "title": "Container-Settings: Beschreibung editierbar", "desc": "ServerSettings soll Beschreibung unterstützen. Name und Modell sind bereits editierbar. Slug bleibt read-only (Rename wä", "pk": "SDRv4", "tc": "IMP"}, {"id": 91, "title": "App-Framework: Manifest mount+navEntry, dynamische Sidebar + SSO-Handoff für externe Apps", "desc": "Erweitert das bestehende App-Modul-System (FEAT-279/284) um zwei Felder im AppManifest:\n\n- mount: { type: 'redirect', ur", "pk": "SDRv4", "tc": "FEAT"}, {"id": 90, "title": "CreateServerDialog UX: Passwort-Bestaetigung, target_path /app Default, mount_point Advanced", "desc": "Drei UX-Verbesserungen nach Live-Test auf sdr-test: (1) Passwort muss 2x eingegeben werden (Match-Check wie bei User-Ers", "pk": "SDRv4", "tc": "IMP"}, {"id": 89, "title": "DSGVO-Consent-Flow Telegram — Text-basierte Zustimmung mit Drittland-Hinweis", "desc": "## Problem\n\nSenity speichert bei Telegram-Interaktionen personenbezogene Daten (Username, Telefonnummer, Chat-Inhalte). ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 88, "title": "Telegram-User-Identity: Tabelle, Mapping, Darstellung in Chats", "desc": "## Scope\n\nFuer Telegram-Chat-Teilnehmer (insb. Group-Chats mit mehreren Personen) Identity-Daten persistieren und im Sen", "pk": "SDRv4", "tc": "FEAT"}, {"id": 87, "title": "Erweitertes Message-Rendering: Kategorien, Kanal-Badges, Stream-Events, Filter", "desc": "## Scope\n\nChat-Nachrichten bekommen strukturierte Metadaten und entsprechendes UI-Rendering. Drei Dimensionen pro Messag", "pk": "SDRv4", "tc": "FEAT"}, {"id": 86, "title": "CLI-Workspace erreicht Senity-Claude-Proxy nicht (Linux-Server-Netz)", "desc": "Symptom: 'KI schreibt ...' ohne Response. Ursache: Workspace-Container ist nur in senity-cli-net; SDRv4 laeuft in senity", "pk": "SDRv4", "tc": "BUG"}, {"id": 84, "title": "Modell-Auswahl: Default (Fallback-Chain) als erste Option", "desc": "CreateServerDialog + ServerSettings erzwingen bisher eine explizite Modell-Auswahl (erstes Modell aus Liste wird auto-se", "pk": "SDRv4", "tc": "IMP"}, {"id": 83, "title": "CreateServerDialog: dangling label htmlFor bei conditional rendering", "desc": "Chrome DevTools a11y-Warnung: target-container-btn-Label dangelt im Manual-Mode, server-model-btn-Label dangelt bei leer", "pk": "SDRv4", "tc": "BUG"}, {"id": 82, "title": "Scope-basiertes Secret-Management: App-Integrations mit Tenant/User-Overrides", "desc": "## Problem\n\nAktuell ist .env.local eine Monolith-Datei mit 100+ Zeilen Secrets fuer alle Integrationen (Anthropic, OpenA", "pk": "SDRv4", "tc": "EPIC"}, {"id": 81, "title": "CLI-Server API-Key Regenerate mit Container-Sync", "desc": "Regenerate-Flow fuer ANTHROPIC_API_KEY + SDR_API_KEY bestehender CLI-Server. Herausforderung: Container hat den Key als ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 80, "title": "CLI-Server API-Key UX: Copy-Zwang entschaerfen + nachtraegliches Anzeigen", "desc": "## Kontext\n\nBei CLI-Server-Erstellung wird der ANTHROPIC_API_KEY einmalig im Klartext an das Frontend geliefert. DB spei", "pk": "SDRv4", "tc": "IMP"}, {"id": 79, "title": "CreateServerDialog: Ziel-Mount-Pfad aus Docker-Inspect ableiten bzw. auswaehlbar machen", "desc": "## Problem\n\nUser muss aktuell target_path als Freitext eingeben. Gueltig sind aber nur Pfade die im Ziel-Container als H", "pk": "SDRv4", "tc": "FEAT"}, {"id": 78, "title": "cli/servers POST: Orchestrator-Validierungsfehler als 400 durchreichen statt 502", "desc": "## Ist\n\napp/api/cli/servers/route.ts:516-519 wraped jeden nicht-2xx Orchestrator-Response in ExternalServiceError mit de", "pk": "SDRv4", "tc": "IMP"}, {"id": 77, "title": "CreateServerDialog: spezifische Fehlermeldung wird vom generischen 502-Fallback verdeckt", "desc": "## Symptom\n\nBeim Container-Erstellen via sdr-test.senity.ai/de/servers zeigt die UI bei jedem 502-Response die generisch", "pk": "SDRv4", "tc": "BUG"}, {"id": 76, "title": "CLI-Server: Settings-Tab im ServerDetail einhängen", "desc": "## Symptom\n\nDas KI-Modell eines CLI-Servers kann nach dem Anlegen nicht über die UI geändert werden. Weitere vom Setting", "pk": "SDRv4", "tc": "BUG"}, {"id": 75, "title": "Claude-CLI-Alias-System: claude + claude-senity mit zentraler Token-Metrik", "desc": "## Idee\n\nZwei Wrapper-Binaries im cli-workspace:\n- **claude** — normale Claude-CLI mit User-OAuth (claude login). User-T", "pk": "SDRv4", "tc": "EPIC"}, {"id": 73, "title": "Container-Manager als Single Source of Truth für den Senity-Stack", "desc": "## Ziel\n\nDer Container-Manager-Microservice wird Single Source of Truth für die Container-Infrastruktur des Senity-Serve", "pk": "SDRv4", "tc": "EPIC"}, {"id": 72, "title": "Container-Manager-Microservice als Submodule integrieren", "desc": "Ziel: Das Dropdown Ziel-Container auf /de/servers wieder befüllen.\n\nAusgangslage: /api/containers proxyt an CONTAINER_MA", "pk": "SDRv4", "tc": "FEAT"}, {"id": 71, "title": "System-Container in /servers für Admins sichtbar machen", "desc": "Die GET-Route /api/cli/servers filtert aktuell via cli_server_member!inner — System-Container (source_type='system', is_", "pk": "SDRv4", "tc": "CHO"}, {"id": 70, "title": "Migration: api_ticket stilllegen → sts-api als Single Source of Truth", "desc": "Komplette Ablösung des internen api_ticket Systems (Migration 075) durch das sts-api Microservice (tickets Tabelle, Migr", "pk": "SDRv4", "tc": "FEAT"}, {"id": 68, "title": "Kanäle als eigenständige Entität (Channel-Architektur)", "desc": "Trennt Kanäle (Telegram, WhatsApp, Web, ...) vom cli_server. Container-Löschung darf den Kanal nicht mitnehmen — der Kan", "pk": "SDRv4", "tc": "FEAT"}, {"id": 69, "title": "Telegram-Webhook-Endpoint + setWebhook-Setup", "desc": "Eigentliche Telegram-Integration — baut auf der Channel-Architektur aus FEAT-302 auf.\n\nUmfang:\n- SDRv4 API-Route /api/te", "pk": "SDRv4", "tc": "FEAT"}, {"id": 67, "title": "Zwei Telegram-Bots mit CLI-Container-Integration pro SDRv4-Env", "desc": "Je ein Telegram-Bot für senity-sdrv4-live und senity-sdrv4-test. Eingehende Nachrichten werden über den Webhook /api/cha", "pk": "SDRv4", "tc": "FEAT"}, {"id": 47, "title": "CHO-297-git-branch-tree-ticketing", "desc": "# Git Branch Tree im Ticketing-System\n\n**Anfrage:** Im Ticketing-System den Git-Branch-Tree von GitHub einblendet, mit B", "pk": "SDRv4", "tc": "CHO"}, {"id": 27, "title": "FEAT-283-app-module-in-db-initial: \"`app_module` + RPC in `db/001_database_initial.sql` einarbeiten\"", "desc": "[SDRv4] # FEAT-283 — `app_module` + RPC in `db/001_database_initial.sql` einarbeiten\n\n**Status:** review\n**Prio:** P1\n**", "pk": "SDRv4", "tc": "None"}, {"id": 26, "title": "FEAT-282-manifest-sync-bootstrap: \"Manifest-Sync beim App-Bootstrap\"", "desc": "[SDRv4] # FEAT-282 — Manifest-Sync beim App-Bootstrap\n\n**Status:** review\n**Prio:** P1\n**Typ:** Feature\n**Branch:** `aut", "pk": "SDRv4", "tc": "None"}, {"id": 11, "title": "FEAT-284-granulares-uninstall-tabellen-auslagerung: \"App-Modul Granulares Uninstall-System + Tabellen-Auslagerung\"", "desc": "[SDRv4] # FEAT-284 — App-Modul Granulares Uninstall-System + Tabellen-Auslagerung\n\n## Beschreibung\n\nZweistufiges Feature", "pk": "SDRv4", "tc": "None"}, {"id": 42, "title": "@murc134/datatable 0.2.2 → 0.2.3", "desc": "# CHO-285: @murc134/datatable Version-Bump\n\n`@murc134/datatable` in `package.json` von `^0.2.2` auf `^0.2.3` gehoben (fi", "pk": "SDRv4", "tc": "CHO"}, {"id": 43, "title": "Ticketing-System Agents & Skills (Phase 4)", "desc": "# CHO-292: Ticketing-System Agents & Skills [Phase 4]\n\n**Status:** pending  \n**Owner:** —  \n**Phase:** 4 (Automation & O", "pk": "SDRv4", "tc": "CHO"}, {"id": 44, "title": "Supabase.com: Migrations 088–092 für Ticketing-System anwenden", "desc": "# CHO-295 — Supabase.com: Ticketing-System Migrations anwenden\n\n> **Hinweis:** Der Self-Hosted-Weg (lokaler Postgres-Con", "pk": "SDRv4", "tc": "CHO"}, {"id": 45, "title": "Server Supabase Self-Hosted Migration (post-MVP)", "desc": "# CHO-296 — Server Supabase Self-Hosted Migration (post-MVP)\n\n- **ID:** CHO-296\n- **Typ:** chore\n- **Status:** pending\n-", "pk": "SDRv4", "tc": "CHO"}, {"id": 46, "title": "Docker Deployment auf Hetzner Server (188.40.130.177:2222)", "desc": "# CHO-297 — Docker Deployment auf Hetzner Server\n\n> **Abhängigkeit:** CHO-295 (Supabase-Migrations ✅)  \n> **Ziel:** Seni", "pk": "SDRv4", "tc": "CHO"}, {"id": 48, "title": "CLI-Workspace: Full-Stack Dev Container (Agenten + Skills)", "desc": "# CHO-298 — CLI-Workspace: Full-Stack Dev Container (Agenten + Skills)\n\n## Beschreibung\n\nUmstelle CLI-Workspace-Containe", "pk": "SDRv4", "tc": "CHO"}, {"id": 60, "title": "Container Management System — Docker + Supabase + Templates + API", "desc": "# FEAT-286 — Container Management System — Docker + Supabase + Templates + API\n\n## Beschreibung\n\nNeuer Microservice zur ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 61, "title": "Claude Code Singleton Container Registry", "desc": "# FEAT-291 — Claude Code Singleton Container Registry\n\n## Status\n\n**Phase 3 Integration abgeschlossen:**\n- API-Routes im", "pk": "SDRv4", "tc": "FEAT"}, {"id": 62, "title": "Ticketing-System-Zentralisierung — DB als Single Source of Truth, .tasks/ abschaffen", "desc": "# FEAT-298 — Ticketing-System-Zentralisierung\n\n## Ziel\n\nDas Ticketing-System vom SDRv4 aus zentralisieren. Statt `.tasks", "pk": "SDRv4", "tc": "FEAT"}, {"id": 63, "title": "CLI-Container-Server mit Container-Mount-Zuweisung + persistente Browser-Session", "desc": "# FEAT-299 — CLI-Container-Server mit Container-Mount-Zuweisung + persistente Browser-Session\n\n## Zusammenfassung\n\nErwei", "pk": "SDRv4", "tc": "FEAT"}, {"id": 64, "title": "Ziel-Container-Datei-Browser im CreateServerDialog", "desc": "# FEAT-300 — Ziel-Container-Datei-Browser im CreateServerDialog\n\n## Zusammenfassung\n\nNachdem FEAT-299 die Ziel-Container", "pk": "SDRv4", "tc": "FEAT"}, {"id": 66, "title": "Ticketing-System: Embedded Frontend (Option B) — Sub-Route Integration", "desc": "# IMP-293 — Ticketing-System Embedded Frontend (Option B)\n\n## Beschreibung\n\nNach MVP-Release von FEAT-291 (Option A: Sta", "pk": "SDRv4", "tc": "IMP"}, {"id": 59, "title": "App-Modul Granulares Uninstall-System + Tabellen-Auslagerung", "desc": "# FEAT-284 — App-Modul Granulares Uninstall-System + Tabellen-Auslagerung\n\n## Beschreibung\n\nZweistufiges Feature:\n\n**Tei", "pk": "SDRv4", "tc": "FEAT"}, {"id": 53, "title": "API-Architektur-Refactoring (portiert aus Main FEAT-013)", "desc": "# FEAT-271 — API-Architektur-Refactoring (portiert aus Main FEAT-013)\n\n## Kontext\n\nIm Schwesterprojekt **Main** (EventHa", "pk": "SDRv4", "tc": "FEAT"}, {"id": 55, "title": "App-Verwaltung UI", "desc": "# FEAT-280 — App-Verwaltung UI\n\n**Status:** review\n**Prio:** P1\n**Typ:** Feature\n**Branch:** `dev` (3 Commits ab `auto`)", "pk": "SDRv4", "tc": "FEAT"}, {"id": 56, "title": "Pilot-Migration: it-inventar Physical Code-Move", "desc": "# FEAT-281 — Pilot-Migration: it-inventar Physical Code-Move\n\n**Status:** backlog\n**Prio:** P2\n**Typ:** Feature\n**Branch", "pk": "SDRv4", "tc": "FEAT"}, {"id": 57, "title": "Manifest-Sync beim App-Bootstrap", "desc": "# FEAT-282 — Manifest-Sync beim App-Bootstrap\n\n**Status:** review\n**Prio:** P1\n**Typ:** Feature\n**Branch:** `auto`\n**Ers", "pk": "SDRv4", "tc": "FEAT"}, {"id": 58, "title": "`app_module` + RPC in `db/001_database_initial.sql` einarbeiten", "desc": "# FEAT-283 — `app_module` + RPC in `db/001_database_initial.sql` einarbeiten\n\n**Status:** review\n**Prio:** P1\n**Typ:** C", "pk": "SDRv4", "tc": "FEAT"}, {"id": 96, "title": "FEAT-130 Leftover-Konflikte in manifest.json aufräumen", "desc": "5 manifest.json Dateien in apps/ hatten unresolvierte HEAD-Marker aus merge commit d5a997be (2026-04-11).\n\nBetroffen:\n- ", "pk": "SDRv4", "tc": "CHO"}, {"id": 110, "title": "Input-Validation Branch-Namen: leer/Whitespace/Path-Escaping (FEAT-267 R2-G11)", "desc": "## Problem\nFEAT-267 Review R2 Finding G11: Branch-Namen (z.B. in createWorkspaceBranch, Container-Erstellung) werden nic", "pk": "SDRv4", "tc": "BUG"}, {"id": 94, "title": "i18n für Container-Clone-Flow UI-Texte (FEAT-267 R2-G4)", "desc": "## Kontext\nIm Zuge von FEAT-267 (Container SDRv4-Clone) sind neue UI-Texte entstanden, die aktuell hardcoded auf Deutsch", "pk": "SDRv4", "tc": "IMP"}, {"id": 270, "title": "Telegram-Webhook: env-token fallback überspringt CLI-Routing (botConfig=null)", "desc": "In app/api/telegram/webhook/[id]/route.ts (Zeilen 121-134) wird bei usedEnvFallback=true der botConfig auf null belassen", "pk": "SDRv4", "tc": "BUG"}, {"id": 272, "title": "claude-proxy /v1/messages liefert systematisch 502 + edgeLog.warn erscheint nicht in dev-server.log", "desc": "## Problem\n\nAlle Calls gegen `POST /api/claude-proxy/v1/messages` liefern aktuell `502 Bad Gateway`. Die Route läuft im ", "pk": "SDRv4", "tc": "BUG"}, {"id": 275, "title": "CLI-Chat UI zeigt hardcoded selected_model_id statt tatsächlich antwortendes Modell", "desc": "## Problem\n\nDie Modell-Anzeige im CLI-Chat Label (Header/Message-Badge) zeigt den Wert von `selected_model_id` aus der C", "pk": "SDRv4", "tc": "BUG"}, {"id": 263, "title": "Docstring — sync/route.ts und sync-files/route.ts sind bewusst User-only", "desc": "Follow-Up aus FEAT-267 Review (Finding #35, INFO).\n\nProblem: app/api/api-tickets/sync/route.ts und sync-files/route.ts a", "pk": "SDRv4", "tc": "CHO"}, {"id": 258, "title": "request-router — Content-Disposition in proxyFileDownload filtern", "desc": "Follow-Up aus FEAT-267 Review (Finding #34, INFO).\n\nProblem: services/cli-bridge-api/request-router.ts proxyFileDownload", "pk": "SDRv4", "tc": "CHO"}, {"id": 257, "title": "Orchestrator-Hardening — SDRV4_REPO_TOKEN nach Clone aus Env entfernen (start.sh)", "desc": "Follow-Up aus FEAT-267 Review (Finding #32, INFO).\n\nProblem: services/cli-workspace/start.sh behält SDRV4_REPO_TOKEN in ", "pk": "SDRv4", "tc": "CHO"}, {"id": 38, "title": "provider_fallback cli_chat: phantom model gemini-3.1-flash-lite-preview entfernen", "desc": "# BUG-273 — provider_fallback cli_chat: phantom model gemini-3.1-flash-lite-preview entfernen\n\n## Problem\n\nIn der Tabell", "pk": "SDRv4", "tc": "BUG"}, {"id": 39, "title": "Milestone-Done-Verifikation erzwingen (Definition of Done für Container-Tickets)", "desc": "# BUG-276 — Milestone-Done-Verifikation erzwingen\n\n## Problem\n\nMeilensteine M1 und M2 von FEAT-267 waren als done markie", "pk": "SDRv4", "tc": "BUG"}, {"id": 41, "title": "Windows-Pfade in Docker-Mounts und Env-Vars quoten", "desc": "# CHO-275 — Windows-Pfade in Docker-Mounts und Env-Vars quoten\n\n## Problem\n\nWindows-Pfade (z.B. `C:\\Devel\\...`) werden u", "pk": "SDRv4", "tc": "CHO"}, {"id": 49, "title": "Container SDRv4-Clone + Ticketing-Gateway", "desc": "# FEAT-267 — Container SDRv4-Clone + Ticketing-Gateway\n\n## Beschreibung\n\nContainer-MVP braucht vollständiges SDRv4-Repo ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 50, "title": "Globale Claude-Agents + Skills in SDR-Container provisionieren", "desc": "# FEAT-268 — Globale Claude-Agents + Skills in SDR-Container provisionieren\n\n## Beschreibung\n\nSDR-Container braucht Zugr", "pk": "SDRv4", "tc": "FEAT"}, {"id": 51, "title": "CLI_TOKEN_HMAC_KEY Key-Separation (Token-Encryption vs JWT-Signing)", "desc": "# FEAT-269 — CLI_TOKEN_HMAC_KEY Key-Separation (Token-Encryption vs JWT-Signing)\n\n## Problem\n\nTOKEN_ENCRYPTION_KEY wird ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 52, "title": "Dual-API-Key für CLI-Container (Proxy + Tickets getrennt)", "desc": "# FEAT-270 — Dual-API-Key für CLI-Container (Proxy + Tickets getrennt)\n\n## Problem\n\nAktuell teilt der CLI-Container eine", "pk": "SDRv4", "tc": "FEAT"}, {"id": 54, "title": "App-Modul-Registry Foundation", "desc": "# FEAT-279 — App-Modul-Registry Foundation\n\n**Status:** review\n**Prio:** P1\n**Typ:** Feature\n**Branch:** `auto`\n**Erstel", "pk": "SDRv4", "tc": "FEAT"}, {"id": 255, "title": "Webhook-Endpoint /api/cli/servers/[id]/webhook durch Auth-Middleware geblockt", "desc": "Der Telegram-Webhook-Endpoint /api/cli/servers/[id]/webhook wurde von der globalen Auth-Middleware abgefangen und mit 40", "pk": "SDRv4", "tc": "BUG"}, {"id": 254, "title": "ReadonlyRootfs für MVP deaktivieren — services/cli-orchestrator/docker-manager.ts", "desc": "Für MVP-Betrieb soll ReadonlyRootfs in services/cli-orchestrator/src/docker-manager.ts deaktiviert werden. Grund: Claude", "pk": "SDRv4", "tc": "CHO"}, {"id": 253, "title": "Kanal-Channel-Bridge — cli_server_channel-Inserts spiegeln automatisch in bot_config", "desc": "Gap zwischen FEAT-238 (cli_server_channel) und FEAT-102 (bot_config.cli_server_id): Telegram-Webhook routet aktuell nur ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 251, "title": "Agent/Skill-Konsolidierung: Performance 5->2, Security 2->1, Archive-Skills 6->1", "desc": "Performance-Agents (observer/auditor/mediator/jury/judge) zu 2 konsolidieren. Security-Agents (auditor/engineer) zu 1 me", "pk": "SDRv4", "tc": "IMP"}, {"id": 252, "title": "Telegram-CLI Routing: 4 kritische Bugs (Token-Encryption, Doppel-Save, Idempotenz, File-Auth)", "desc": "K1: botConfig.bot_token ist AES-verschluesselt, wird aber direkt an sendTelegramText() uebergeben. K2: Doppel-Speicherun", "pk": "SDRv4", "tc": "BUG"}, {"id": 250, "title": "Ecosystem-Cleanup: 18 redundante Memory-Dateien + CLAUDE.md-Widersprueche", "desc": "18 Memory-Dateien loeschen die redundant zu CLAUDE.md sind. Context-Management-Widerspruch aufloesen (Global vs Projekt ", "pk": "SDRv4", "tc": "IMP"}, {"id": 248, "title": "Token-Symbol ST -> Senity-Zeichen + Zahlenformatierung Mio/Tsd", "desc": "Alle Vorkommen des Token-Symbols ST in der UI durch das korrekte Senity-Token-Zeichen ersetzen. Zahlenformatierung auf d", "pk": "SDRv4", "tc": "IMP"}, {"id": 247, "title": "Overlay-Standardisierung -- DialogOverlay in @murc134/ui-kit + Migration aller Custom-Overlays", "desc": "20+ verschiedene Overlay-Implementierungen im Projekt. ServerDetailOverlay zu schmal + kein Scroll. Ziel: Generische Dia", "pk": "SDRv4", "tc": "IMP"}, {"id": 240, "title": "CLI Container Modell nachträglich änderbar (PATCH + Container-Recreation)", "desc": "Aktuell wird das Modell (selected_model_id) nur bei Container-Erstellung als CLAUDE_DEFAULT_MODEL Env-Var gesetzt. Nacht", "pk": "SDRv4", "tc": "FEAT"}, {"id": 239, "title": "Token-Tracking: Keine Buchungen bei echten Chat-Sessions", "desc": "Dashboard zeigt 0 Token-Verbrauch. Root Cause: .select(id, email) auf app_user - Spalte email existiert nicht, Supabase ", "pk": "SDRv4", "tc": "BUG"}, {"id": 238, "title": "RotorQuant KV Cache Quantization - Upstream-Adoption tracken", "desc": "**Milestone:** post-mvp\n\nRotorQuant (github.com/scrya-com/rotorquant) ist ein KV Cache Quantization Framework für LLM-In", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 233, "title": "CLI Chat: Offline-State wird nicht korrekt erkannt", "desc": "Wenn der CLI-Orchestrator oder Container nicht erreichbar ist, erkennt der CLI-Chat den Offline-Zustand nicht sauber. De", "pk": "SDRv4", "tc": "BUG"}, {"id": 232, "title": "Ollama Provider: LOCAL_OLLAMA_URL Env-Variable fehlt", "desc": "Der Ollama-Provider nutzt LOCAL_OLLAMA_URL als Basis-URL, aber die Variable war in .env.local nicht definiert. Dadurch s", "pk": "SDRv4", "tc": "BUG"}, {"id": 231, "title": "Fallback-Chain: Kosten/Preise fehlen bei Einträgen ohne Pricing-Daten", "desc": "Im Fallback-Reihenfolge-Screen zeigen manche Einträge (z.B. Local Ollama) keine Kosten an, während andere (z.B. Anthropi", "pk": "SDRv4", "tc": "BUG"}, {"id": 228, "title": "Fallback-Chain zeigt nicht-installierte Ollama-Modelle ohne Warnung", "desc": "Im CLI-LLM Fallback-Reihenfolge-Screen (FallbackChainEditor) werden Ollama-Modelle angezeigt die auf dem lokalen Ollama ", "pk": "SDRv4", "tc": "BUG"}, {"id": 225, "title": "Token-Page — Verbrauchsübersicht mit Modell-Aufschlüsselung und EUR-Kosten", "desc": "User-sichtbare Token-Seite unter /einstellungen/tokens. Inhalte: (1) Balance-Karte mit aktuellem Guthaben in ST + EUR-Ge", "pk": "SDRv4", "tc": "FEAT"}, {"id": 224, "title": "Lizenz-Token-Pool — Admin verteilt Tokens aus Firmen-Pool an User", "desc": "Übergeordnete Lizenz-Ebene für Token-Verwaltung. Eine Firma/Lizenz kauft ein Token-Kontingent (Pool). Der Admin verteilt", "pk": "SDRv4", "tc": "FEAT"}, {"id": 223, "title": "BYOK — Bring Your Own Key mit 10% Plattform-Fee", "desc": "User können eigene LLM-API-Keys hinterlegen (OpenAI, Anthropic, etc.). Senity berechnet 10% Plattform-Fee auf den tatsäc", "pk": "SDRv4", "tc": "FEAT"}, {"id": 219, "title": "CLI Chat Header Redesign — Container-Dropdown & Mode-Toggle visuell überarbeiten", "desc": "Das CLI Chat Header-Bar sieht visuell schlecht aus. Hauptprobleme:\n1. Container-Dropdown (FkSelect) wirkt wie ein Fremdk", "pk": "SDRv4", "tc": "IMP"}, {"id": 214, "title": "Dev Mode - Container mit Direct Auth (eigene OAuth-Anmeldung)", "desc": "Container koennen mit auth_mode='direct' erstellt werden. Dabei werden ANTHROPIC_BASE_URL und ANTHROPIC_API_KEY NICHT in", "pk": "SDRv4", "tc": "FEAT"}, {"id": 211, "title": "CLI-Chat: createSession-Response-Format + pending sessionId für ersten Stream", "desc": "Zwei Fehler im CLI-Chat-Adapter (lib/chat/cli-chat-adapter.ts) behoben:\n\n**Bug 1:** createSession gab rohen Session-Row ", "pk": "SDRv4", "tc": "BUG"}, {"id": 148, "title": "CLI-Chat: Orchestrator-URL nutzt serverId statt slug - 502 Bad Gateway", "desc": "Die API-Routes GET /api/cli/servers/[id]/projects, GET/POST/PUT/DELETE /api/cli/servers/[id]/files und POST /api/cli/ser", "pk": "SDRv4", "tc": "BUG"}, {"id": 122, "title": "api_ticket Branch-Sync + created_at-Backfill fehlt", "desc": "# BUG-039: api_ticket Branch-Sync + created_at-Backfill fehlt\n\n| Feld | Wert |\n|------|------|\n| Typ | bug |\n| Prio | P2", "pk": "SDRv4", "tc": "BUG"}, {"id": 121, "title": "CreateServerDialog zeigt generische Fehlermeldung statt Server-Detail bei Username-Validierung", "desc": "## Problem\n\nBeim Versuch einen Container mit dem Benutzernamen `c.bruckschi@googlemail.com` (Email-Adresse) zu erstellen", "pk": "SDRv4", "tc": "BUG"}, {"id": 116, "title": "CLI Server Dialog + Overlay Design Review Fixes — alle Phasen", "desc": "Implementierung abgeschlossen. Merge auf dev. 4 Review-Runden (Codex-Gemini-Opus x2) abgeschlossen. Stash-Improvements p", "pk": "SDRv4", "tc": "IMP"}, {"id": 98, "title": "App-Installation/Deinstallation System mit Hook-Integration", "desc": "App-Installation und Deinstallation ueber CLI-Command mit automatischer DB-Migration und Hook-Integration.", "pk": "SDRv4", "tc": "FEAT"}, {"id": 212, "title": "branch-manager.ts — execFileSync durch async execFile ersetzen + REPO_ROOT via ENV konfigurierbar", "desc": "lib/workspace/branch-manager.ts nutzt synchrones execFileSync (blockiert Event-Loop) und process.cwd() als REPO_ROOT (ka", "pk": "SDRv4", "tc": "IMP"}, {"id": 206, "title": "Supabase-Types regenerieren — as any Casts in port-registry.ts entfernen", "desc": "lib/workspace/port-registry.ts nutzt 6x (supabase.from('workspace_port') as any) weil workspace_port-Tabelle fehlt in ge", "pk": "SDRv4", "tc": "CHO"}, {"id": 192, "title": "workspace_port.assignPort Race-Condition — Advisory Lock + UNIQUE Constraint", "desc": "Race Condition in lib/workspace/port-registry.ts: SELECT MAX(port) + INSERT ist nicht atomar. Bei parallelen Server-Crea", "pk": "SDRv4", "tc": "BUG"}, {"id": 157, "title": "DB-Migration 082 — 'building' Status zur api_ticket CHECK-Constraint hinzufügen", "desc": "Die Supabase-Tabelle `api_ticket` hat eine CHECK-Constraint auf dem `status`-Feld, die den neuen Status `building` noch ", "pk": "SDRv4", "tc": "CHO"}, {"id": 249, "title": "Container stoppen/löschen schlägt fehl wenn Orchestrator nicht erreichbar", "desc": "Auf der /servers-Seite konnten Container weder gestoppt noch gelöscht werden, wenn der Orchestrator-Service (Port 3200) ", "pk": "SDRv4", "tc": "BUG"}, {"id": 267, "title": "Tool-Use Übersetzung Anthropic↔OpenAI für Ollama-Pfad", "desc": "# FEAT-245: Tool-Use Übersetzung Anthropic↔OpenAI für Ollama-Pfad\n\n**Typ:** feature\n**Prio:** P1\n**Status:** done\n**Erst", "pk": "SDRv4", "tc": "FEAT"}, {"id": 268, "title": "claude-proxy Multi-Provider Routing + Gemini-Translator + 429-Passthrough", "desc": "# FEAT-246: claude-proxy Multi-Provider Routing + Gemini-Translator + 429-Passthrough\n\n**Typ:** feature\n**Prio:** P1\n**S", "pk": "SDRv4", "tc": "FEAT"}, {"id": 278, "title": "Preise & Kosten im Fallback-Reihenfolge-Screen editierbar machen", "desc": "## Problem\n\nIm Model-Management unter \"Chat LLM — Fallback-Reihenfolge\" sind Kosten und Preise der Provider aktuell nur ", "pk": "SDRv4", "tc": "IMP"}, {"id": 260, "title": "CLI Workspace Container — Git Worktree pro Container unter container/NAME.EXT", "desc": "# FEAT-249 — [Brainstorming] CLI Workspace Container — Git Worktree pro Container unter container/NAME.EXT\n\n**Typ:** fea", "pk": "SDRv4", "tc": "FEAT"}, {"id": 349, "title": "Northdata.de — Evaluation & Entscheidung (Rick)", "desc": "# RES-027: Northdata.de — Evaluation & Entscheidung (Rick)\n\n**Typ:** research\n**Priorität:** P1\n**Status:** backlog\n**Er", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 343, "title": "DSGVO-Audit — Custom Fields (FEAT-221)", "desc": "# RES-026: DSGVO-Audit — Custom Fields (FEAT-221)\n\n**Typ:** research\n**Priorität:** P2\n**Status:** backlog\n**Erstellt:**", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 150, "title": "[Brainstorming] Voice-Kanal Architektur", "desc": "# Voice-Kanal Architektur\n\n## Beschreibung\n\nArchitektur-Design für Voice-Kommunikation über Kanäle. Zwei klar unterschie", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 143, "title": "[Brainstorming] Kalender-Integration (Cal.com + Open Web Calendar)", "desc": "# Kalender-Integration (Cal.com + Open Web Calendar)\n\n## Beschreibung\n\nIntegration von Cal.com als Terminbuchungs-System", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 292, "title": "[Brainstorming] Mail-Integration (IMAP/SMTP, DSGVO, MCP Tool)", "desc": "# Mail-Integration (IMAP/SMTP, DSGVO, MCP Tool)\n\n## Beschreibung\n\nVollständiger Posteingang/Ausgang auf der Senity-Platt", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 291, "title": "[Brainstorming] App Store + Payment-Integration", "desc": "# App Store + Payment-Integration\n\n## Beschreibung\n\nDesign eines vollständigen App-Store-Systems mit integrierter Zahlun", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 289, "title": "[Brainstorming] Container-Sharing via QR-Code", "desc": "# Container-Sharing via QR-Code\n\n## Beschreibung\n\nUX- und Security-Design für das Einladen weiterer User in einen Contai", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 288, "title": "[Brainstorming] App/Modul-Taxonomie & Admin-UI-Restrukturierung", "desc": "# App/Modul-Taxonomie & Admin-UI-Restrukturierung\n\n## Kontext\n\nZwei zusammengehörende Aufgaben werden hier konsolidiert:", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 287, "title": "[Brainstorming] User-Directory-Struktur im Container", "desc": "# User-Directory-Struktur im Container\n\n## Beschreibung\n\nDesign der Verzeichnisstruktur pro Container und der dazugehöri", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 290, "title": "[Brainstorming] KeyVault, Encryption & Lizenz-Key-Architektur", "desc": "# KeyVault, Encryption & Lizenz-Key-Architektur\n\n## Kontext\n\nDrei eng verwandte Problemräume werden hier konsolidiert:\n1", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 348, "title": "CLI-Chat-Override — Design-Fragen & Lösungsvorschläge", "desc": "# RES-017: CLI-Chat-Override — Design-Fragen & Lösungsvorschläge\n\n**Typ:** Research\n**Prio:** P1\n**Status:** done\n**Erst", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 286, "title": "[Research] Lieferando-Schnittstelle für Gastro-Produkt", "desc": "# Lieferando-Schnittstelle für Gastro-Produkt\n\n## Kontext\nAus Gesprächsprotokoll vom 2026-04-05. Burger Bulle macht ~150", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 284, "title": "[Research] 3CX-Telefonanlage Integration für Gastro-Bots", "desc": "# 3CX-Telefonanlage Integration für Gastro-Bots\n\n## Kontext\nAus Gesprächsprotokoll vom 2026-04-05. Burger Bulle nutzt 3C", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 283, "title": "[Brainstorming] Container-Billing: Awake-Zeit + Token + Flatrate-Pakete + BYOK", "desc": "# Container-Billing: Awake-Zeit + Token + Flatrate-Pakete + BYOK\n\n## Kontext\n\nContainer-Abrechnung hat drei Säulen, die ", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 282, "title": "[Brainstorming] Git-Worktree-basierte Container-Architektur & Observability", "desc": "# Git-Worktree-basierte Container-Architektur & Observability\n\n## Kontext\n\nJeder Kunden-Container hat einen eigenen Git-", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 281, "title": "[Brainstorming] Container-Lifecycle & Auto-Shutdown-Architektur", "desc": "# Container-Lifecycle & Auto-Shutdown-Architektur\n\n## Kontext\n\nAdmin erstellt/schließt Container aus der SDR-Zentrale. C", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 285, "title": "[ZUSAMMENGEFÜHRT] Private-Key vs. Zero-Knowledge", "desc": "# RES-011: [ZUSAMMENGEFÜHRT] Private-Key vs. Zero-Knowledge\n\n**Status:** closed\n**Zusammengeführt in:** RES-018 (KeyVaul", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 280, "title": "[Brainstorming] Container-Hardening & Sandbox-Sicherheit", "desc": "# Container-Hardening & Sandbox-Sicherheit\n\n## Kontext\n\nDrei KI-Reviews (Senity, Codex, Gemini) des App-Architektur-Desi", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 256, "title": "Samim Coach OS: Technische Machbarkeitsanalyse", "desc": "# RES-009 — Samim Coach OS: Technische Machbarkeitsanalyse\n\n- **Typ:** Research\n- **Prio:** P1\n- **Status:** done\n- **Er", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 503, "title": "Brainstorming — Pricing-Staffelung, Rabatte & Vertragsbedingungen", "desc": "# RES-008: Brainstorming — Pricing-Staffelung, Rabatte & Vertragsbedingungen\n\n**Typ:** research / brainstorming\n**Priori", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 502, "title": "Brainstorming — Self-Service Shop vs. Admin-Only Produktverwaltung", "desc": "# RES-007: Brainstorming — Self-Service Shop vs. Admin-Only Produktverwaltung\n\n**Typ:** research / brainstorming\n**Prior", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 501, "title": "Brainstorming — Token-Pakete vs. Produkte — Architektur-Entscheidung", "desc": "# RES-006: Brainstorming — Token-Pakete vs. Produkte — Architektur-Entscheidung\n\n**Typ:** research / brainstorming\n**Pri", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 279, "title": "Brainstorming — Produkttypen & Preismodelle für Senity", "desc": "# RES-005: Brainstorming — Produkttypen & Preismodelle für Senity\n\n**Typ:** research / brainstorming\n**Priorität:** P1\n*", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 140, "title": "Claude Code als Codex-Alternative: Machbarkeit + Unsloth/llama.cpp Eval", "desc": "# RES-004 — Claude Code als Codex-Alternative: Machbarkeit + Unsloth/llama.cpp Eval\n\n**Typ:** research | **Prio:** P1 | ", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 499, "title": "MSH ↔ SDRv4 Feature-Crawl & Sync-Plan", "desc": "# RES-003: MSH ↔ SDRv4 Feature-Crawl & Sync-Plan\n\n**Typ:** research\n**Priorität:** P1\n**Status:** done\n**Abhängigkeiten:", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 498, "title": "Legacy-Projekt Feature-Crawl (Senity Independent API)", "desc": "# RES-002: Legacy-Projekt Feature-Crawl (Senity Independent API)\n\n**Typ:** research\n**Priorität:** P1\n**Status:** backlo", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 297, "title": "Research: Open Claw Agent + Telegram-Integration", "desc": "# RES-001: Open Claw Agent + Telegram\n\n**Ziel:** Machbarkeit prüfen — Open Claw Agent auf Senity-Server, verbunden mit T", "pk": "SDRv4", "tc": "RESEARCH"}, {"id": 340, "title": "Memory Auto-Save Hooks (PreCompact + Session-End)", "desc": "# IMP-038: Memory Auto-Save Hooks (PreCompact + Session-End)\n\n- **Typ:** improvement\n- **Prio:** P1\n- **Status:** done\n-", "pk": "SDRv4", "tc": "IMP"}, {"id": 296, "title": "Worktree .tasks/ Sync — Pre-Commit Hook + Sync-Script", "desc": "## Beschreibung\n\nZuverlässiges Script-basiertes System, damit Worktree-Branches keine `.tasks/`-Konflikte verursachen.\n\n", "pk": "SDRv4", "tc": "IMP"}, {"id": 277, "title": "[Brainstorming] Extended Brainstorming Skill — Codex → Gemini → Opus Multi-Model Q&A", "desc": "# IMP-040 — [Brainstorming] Extended Brainstorming Skill — Codex → Gemini → Opus Multi-Model Q&A\n\n**Typ:** improvement\n*", "pk": "SDRv4", "tc": "IMP"}, {"id": 276, "title": "FkSelect dark-Mode Prop in @murc134/ui-kit", "desc": "## Beschreibung\n\n`FkSelect` aus `@murc134/ui-kit` besitzt keine `variant=\"dark\"` oder `buttonClassName`-Prop. Als Workar", "pk": "SDRv4", "tc": "IMP"}, {"id": 497, "title": "Lead Scraper — Handelsregister als primäre Quelle + Fehlerfix", "desc": "# IMP-038: Lead Scraper — Handelsregister als primäre Quelle + Fehlerfix\n\n**Typ:** improvement\n**Priorität:** P0\n**Statu", "pk": "SDRv4", "tc": "IMP"}, {"id": 496, "title": "Memory System Upgrade — Progressive Loading + Temporal/Domain Tags", "desc": "# IMP-037: Memory System Upgrade — Progressive Loading + Temporal/Domain Tags\n\n- **Typ:** improvement\n- **Prio:** P1\n- *", "pk": "SDRv4", "tc": "IMP"}, {"id": 495, "title": "Workflow-Improver-Referenz in CLAUDE.md + Scheduled Review", "desc": "# IMP-036: Workflow-Improver-Referenz in CLAUDE.md + Scheduled Review\n\n- **Typ:** improvement\n- **Priorität:** P2\n- **St", "pk": "SDRv4", "tc": "IMP"}, {"id": 295, "title": "CLI Chat — stream-json Thinking-Tokens + typisierte Events", "desc": "## Problem\n\n`cli-runner.ts` verwendet `claude --print -p \"prompt\"` — gibt nur finalen Textoutput.\nThinking-Tokens werden", "pk": "SDRv4", "tc": "IMP"}, {"id": 294, "title": "CLI Chat — Markdown-Rendering im Dark Mode + isStreaming-Prop", "desc": "## Problem\n\n`MarkdownMessage` aus `@murc134/chat` ist bereits eingebunden, hat aber zwei Bugs im CLI-Chat-Kontext:\n\n1. *", "pk": "SDRv4", "tc": "IMP"}, {"id": 147, "title": "Persistente Claude Code Instanz per Workspace (statt one-shot --print)", "desc": "## Problem\n\nAktuell startet die Bridge-API für jede Nachricht einen neuen Claude Code Prozess:\n```bash\nclaude --print -p", "pk": "SDRv4", "tc": "IMP"}, {"id": 494, "title": "Rename cli_server → cli_workspace", "desc": "# IMP-031: Rename cli_server → cli_workspace\n\n## Beschreibung\n\nTerminologie-Alignment: Die DB-Tabelle `cli_server` und a", "pk": "SDRv4", "tc": "IMP"}, {"id": 274, "title": "EU Cross-Region Inference Setup (AWS Bedrock)", "desc": "# EU Cross-Region Inference Setup (AWS Bedrock)\n\n## Beschreibung\n\nAWS Bedrock EU Cross-Region Inference (CRIS) einrichte", "pk": "SDRv4", "tc": "IMP"}, {"id": 493, "title": "AI-Usage Dashboard — Chart-Überarbeitung", "desc": "# IMP-029: AI-Usage Dashboard — Chart-Überarbeitung\n\n**Status:** review\n**Priorität:** P1\n**Branch:** feat/imp-029-ai-us", "pk": "SDRv4", "tc": "IMP"}, {"id": 492, "title": "Workflow-Integration (Review → Audit, Ticket-Kommentare)", "desc": "# IMP-028: Workflow-Integration (Review → Audit, Ticket-Kommentare)\n\n**Typ:** improvement\n**Prio:** P1\n**Status:** done\n", "pk": "SDRv4", "tc": "IMP"}, {"id": 337, "title": "Performance Observer Upgrade (neue API anbinden)", "desc": "# IMP-027: Performance Observer Upgrade (neue API anbinden)\n\n**Typ:** improvement\n**Prio:** P1\n**Status:** done\n**Commit", "pk": "SDRv4", "tc": "IMP"}, {"id": 491, "title": "CLI Orchestrator Protocol-Fix + Build-Ready", "desc": "# IMP-026: CLI Orchestrator Protocol-Fix + Build-Ready\n\n**Typ:** improvement\n**Prio:** P1\n**Status:** review\n**Branch:**", "pk": "SDRv4", "tc": "IMP"}, {"id": 347, "title": "Ticket-Filter-API für .tasks/ System", "desc": "# IMP-025: Ticket-Filter-API für .tasks/ System\n\n**Typ:** improvement\n**Prio:** P1\n**Status:** backlog\n**Erstellt:** 202", "pk": "SDRv4", "tc": "IMP"}, {"id": 342, "title": "Work-Log Skill — Live-Changelog für parallele Agenten [Brainstorming]", "desc": "# IMP-024: Work-Log Skill — Live-Changelog für parallele Agenten [Brainstorming]\n\n**Typ:** Improvement\n**Prio:** P2\n**St", "pk": "SDRv4", "tc": "IMP"}, {"id": 490, "title": "Skill `/setup-local-db` — Lokales Supabase Setup", "desc": "# IMP-023: Skill `/setup-local-db` — Lokales Supabase Setup\n\n**Typ:** improvement\n**Prio:** P1\n**Status:** backlog\n**Ers", "pk": "SDRv4", "tc": "IMP"}, {"id": 489, "title": "Performance Observer — Modell/Agent-Performance-Tracking", "desc": "# IMP-022: Performance Observer — Modell/Agent-Performance-Tracking\n\n**Typ:** improvement\n**Priorität:** P1\n**Status:** ", "pk": "SDRv4", "tc": "IMP"}, {"id": 351, "title": "/ticket-audit Skill — Automatisches Ticket-Review", "desc": "# IMP-021: /ticket-audit Skill — Automatisches Ticket-Review\n\n**Typ:** improvement\n**Priorität:** P1\n**Status:** done\n**", "pk": "SDRv4", "tc": "IMP"}, {"id": 158, "title": "Transcript Analyzer Agent — Gesprächsprotokolle → Kontakte + Kommentare", "desc": "# Transcript Analyzer Agent — Gesprächsprotokolle → Kontakte + Kommentare\n\n## Kontext\n\nNeuer Feature-Agent der Gesprächs", "pk": "SDRv4", "tc": "IMP"}, {"id": 470, "title": "Workflow — Ticket-Pflicht + Worktree-Isolation + Dev-Branch-Schutz", "desc": "# IMP-017: Workflow — Ticket-Pflicht + Worktree-Isolation + Dev-Branch-Schutz\n\n**Typ:** improvement\n**Priorität:** P0\n**", "pk": "SDRv4", "tc": "IMP"}, {"id": 146, "title": "VoiceBot Feedback Cedric — Kritische Qualitätsprobleme", "desc": "# IMP-016: VoiceBot Feedback Cedric — Kritische Qualitätsprobleme\n\n**Typ:** improvement\n**Priorität:** P0\n**Status:** cl", "pk": "SDRv4", "tc": "IMP"}, {"id": 336, "title": "VoiceBot Feedback Timo — Kritische Qualitätsprobleme", "desc": "# IMP-015: VoiceBot Feedback Timo — Kritische Qualitätsprobleme\n\n**Typ:** improvement\n**Priorität:** P0\n**Status:** clos", "pk": "SDRv4", "tc": "IMP"}, {"id": 350, "title": "Git-Grep als Secret-Orakel — LLM kann nach Secrets suchen", "desc": "# IMP-014: Git-Grep als Secret-Orakel — LLM kann nach Secrets suchen\n\n**Typ:** improvement\n**Priorität:** P2 (MEDIUM)\n**", "pk": "SDRv4", "tc": "IMP"}, {"id": 469, "title": "Model-ID Regex erlaubt Path-Traversal-Zeichen", "desc": "# IMP-013: Model-ID Regex erlaubt Path-Traversal-Zeichen\n\n**Typ:** improvement\n**Priorität:** P2 (MEDIUM)\n**Status:** ba", "pk": "SDRv4", "tc": "IMP"}, {"id": 152, "title": "Prompt Injection Defense Layering", "desc": "# IMP-012: Prompt Injection Defense Layering\n\n**Typ:** improvement\n**Priorität:** P2 (MEDIUM)\n**Status:** backlog\n**Erst", "pk": "SDRv4", "tc": "IMP"}, {"id": 145, "title": "Ollama Auth Proxy Security Hardening", "desc": "# IMP-011: Ollama Auth Proxy Security Hardening\n\n**Typ:** improvement\n**Priorität:** P1 (HIGH)\n**Status:** backlog\n**Ers", "pk": "SDRv4", "tc": "IMP"}, {"id": 488, "title": "CLI Sandbox Hardening Bundle", "desc": "# IMP-010: CLI Sandbox Hardening Bundle\n\n**Typ:** improvement\n**Priorität:** P1 (HIGH)\n**Status:** backlog\n**Erstellt:**", "pk": "SDRv4", "tc": "IMP"}, {"id": 486, "title": "i18n Hardcoded Strings Audit", "desc": "# IMP-009: i18n Hardcoded Strings Audit\n\n**Typ:** improvement\n**Priorität:** P3\n**Status:** backlog\n**Erstellt:** 2026-0", "pk": "SDRv4", "tc": "IMP"}, {"id": 346, "title": "CLAUDE.md Audit", "desc": "# IMP-008: CLAUDE.md Audit\n\n**Typ:** improvement\n**Priorität:** P3\n**Status:** backlog\n**Erstellt:** 2026-04-03\n\n## Besc", "pk": "SDRv4", "tc": "IMP"}, {"id": 476, "title": "Full RLS Security", "desc": "# IMP-007: Full RLS Security\n\n**Typ:** improvement\n**Priorität:** P1\n**Status:** done\n**Erstellt:** 2026-04-03\n**Abgesch", "pk": "SDRv4", "tc": "IMP"}, {"id": 475, "title": "Supabase Admin Agent", "desc": "# IMP-006: Supabase Admin Agent\n\n**Typ:** improvement\n**Priorität:** P2\n**Status:** done\n**Erstellt:** 2026-04-03\n**Abge", "pk": "SDRv4", "tc": "IMP"}, {"id": 465, "title": "Git Workflow Agent Ecosystem", "desc": "# IMP-005: Git Workflow Agent Ecosystem\n\n**Typ:** improvement\n**Priorität:** P2\n**Status:** done\n**Erstellt:** 2026-04-0", "pk": "SDRv4", "tc": "IMP"}, {"id": 459, "title": "Agent/Skill-Layering (Override & Addon Pattern)", "desc": "# IMP-004: Agent/Skill-Layering (Override & Addon Pattern)\n\n**Typ:** improvement\n**Priorität:** P2\n**Status:** done\n**Er", "pk": "SDRv4", "tc": "IMP"}, {"id": 452, "title": "Security Hardening", "desc": "# IMP-003: Security Hardening\n\n**Typ:** improvement\n**Priorität:** P1\n**Status:** backlog\n**Erstellt:** 2026-04-03\n\n## B", "pk": "SDRv4", "tc": "IMP"}, {"id": 264, "title": "Stream Voice überprüfen (User-Review)", "desc": "# IMP-002: Stream Voice überprüfen (User-Review)\n\n**Typ:** improvement\n**Priorität:** P1\n**Status:** waiting\n**Erstellt:", "pk": "SDRv4", "tc": "IMP"}, {"id": 151, "title": "Coach-Agent erstellen", "desc": "# IMP-001: Coach-Agent\n\n**Ziel:** Universeller Coach-Agent der strategisch challengt, priorisiert und Over-Engineering e", "pk": "SDRv4", "tc": "IMP"}, {"id": 138, "title": "DB-basiertes Ticket-System — Single Source of Truth", "desc": "# FEAT-248 — [Brainstorming] DB-basiertes Ticket-System — Single Source of Truth\n\n## Beschreibung\n\nAblösung des `.tasks/", "pk": "SDRv4", "tc": "FEAT"}, {"id": 266, "title": "[Brainstorming] Claude Code Container — Modell-Auswahl + Public/Company/Personal Workspace + Chat-Integration", "desc": "# FEAT-247 — [Brainstorming] Claude Code Container — Modell-Auswahl + Public/Company/Personal Workspace + Chat-Integrati", "pk": "SDRv4", "tc": "FEAT"}, {"id": 487, "title": "Handelsregister Lead-Search Skill (Claude Code)", "desc": "# FEAT-244: Handelsregister Lead-Search Skill (Claude Code)\n\n**Typ:** feature\n**Priorität:** P1\n**Status:** done\n**Erste", "pk": "SDRv4", "tc": "FEAT"}, {"id": 155, "title": "Anthropic-kompatibler Proxy-Endpoint für Claude Code CLI", "desc": "# FEAT-243: Anthropic-kompatibler Proxy-Endpoint für Claude Code CLI\n\n**Typ:** feature\n**Priorität:** P1\n**Status:** rev", "pk": "SDRv4", "tc": "FEAT"}, {"id": 261, "title": "Veranstaltungen-Umbau + Terminart-System", "desc": "## Ziel\nEvents → Veranstaltungen umbenennen, Event-Sessions → Termine, event_type entfernen, terminart als konfigurierba", "pk": "SDRv4", "tc": "FEAT"}, {"id": 335, "title": "[ZUSAMMENGEFÜHRT] Lizenz-gebundene Docker-Container-Verschlüsselung", "desc": "# FEAT-240: [ZUSAMMENGEFÜHRT] Lizenz-gebundene Docker-Container-Verschlüsselung\n\n**Status:** closed\n**Zusammengeführt in", "pk": "SDRv4", "tc": "FEAT"}, {"id": 259, "title": "Kanal — Arbeitsverzeichnis pro Kanal konfigurierbar", "desc": "Bereits implementiert via scope_type ('all'|'project') + scope_folder in cli_server_channel. UI in ServerChannels.tsx ha", "pk": "SDRv4", "tc": "FEAT"}, {"id": 162, "title": "Server-Kanäle: Telegram/WhatsApp direkt am CLI-Container konfigurieren", "desc": "# FEAT-238 — Server-Kanäle: Telegram/WhatsApp direkt am CLI-Container konfigurieren\n\n**Typ:** feature\n**Priorität:** P1\n", "pk": "SDRv4", "tc": "FEAT"}, {"id": 134, "title": "Lead Scraper — Import Pipeline Endpoint", "desc": "# FEAT-237: Lead Scraper — Import Pipeline Endpoint\n\n| Feld | Wert |\n|------|------|\n| Typ | feature |\n| Prio | P0 |\n| S", "pk": "SDRv4", "tc": "FEAT"}, {"id": 485, "title": "CLI Chat: \"Add Context\" — Element-Picker & Full-Page Screenshot", "desc": "# FEAT-236: CLI Chat: \"Add Context\" — Element-Picker & Full-Page Screenshot\n\n**Typ:** feature\n**Priorität:** P2\n**Status", "pk": "SDRv4", "tc": "FEAT"}, {"id": 484, "title": "[Brainstorming] Browser-Steuerung via browser-use CLI — Override-Modus", "desc": "# FEAT-235: [Brainstorming] Browser-Steuerung via browser-use CLI — Override-Modus\n\n**Typ:** feature\n**Priorität:** P2\n*", "pk": "SDRv4", "tc": "FEAT"}, {"id": 483, "title": "[Brainstorming] Self-hosted Browser-Isolation — Browserless/Steel.dev auf Hetzner", "desc": "# FEAT-234: [Brainstorming] Self-hosted Browser-Isolation — Browserless/Steel.dev auf Hetzner\n\n**Typ:** FEAT\n**Priorität", "pk": "SDRv4", "tc": "FEAT"}, {"id": 482, "title": "[Brainstorming] Control-Handover-Logik — Claude vs. User-Steuerung, Race Conditions vermeiden", "desc": "# FEAT-233: [Brainstorming] Control-Handover-Logik — Claude vs. User-Steuerung, Race Conditions vermeiden\n\n**Typ:** FEAT", "pk": "SDRv4", "tc": "FEAT"}, {"id": 481, "title": "[Brainstorming] Interaktive Browser-Steuerung via WebSocket — User steuert Browser im Frontend", "desc": "# FEAT-232: [Brainstorming] Interaktive Browser-Steuerung via WebSocket — User steuert Browser im Frontend\n\n**Typ:** FEA", "pk": "SDRv4", "tc": "FEAT"}, {"id": 480, "title": "[Brainstorming] Browser-Streaming via WebSocket + CDP — CLI-Browser auf Website streamen", "desc": "# FEAT-231: [Brainstorming] Browser-Streaming via WebSocket + CDP — CLI-Browser auf Website streamen\n\n**Typ:** FEAT\n**Pr", "pk": "SDRv4", "tc": "FEAT"}, {"id": 142, "title": "Agent Analytics — Dashboard mit Recommendations + Offer Engine", "desc": "# FEAT-230 — Agent Analytics — Dashboard mit Recommendations + Offer Engine\n\n**Typ:** feature\n**Priorität:** P1\n**Status", "pk": "SDRv4", "tc": "FEAT"}, {"id": 479, "title": "Gantt Chart / Timeline UI für Tickets", "desc": "# FEAT-229: Gantt Chart / Timeline UI für Tickets\n\n- **Typ:** feature\n- **Priorität:** P2\n- **Status:** backlog\n- **Erst", "pk": "SDRv4", "tc": "FEAT"}, {"id": 345, "title": "Ticket-Hash-Sync-Mechanismus", "desc": "# FEAT-228: Ticket-Hash-Sync-Mechanismus\n\n- **Typ:** feature\n- **Priorität:** P1\n- **Status:** backlog\n- **Erstellt:** 2", "pk": "SDRv4", "tc": "FEAT"}, {"id": 341, "title": "Ticket-Datenbank-Schema (project_ticket)", "desc": "# FEAT-227: Ticket-Datenbank-Schema (project_ticket)\n\n- **Typ:** feature\n- **Priorität:** P1\n- **Status:** backlog\n- **E", "pk": "SDRv4", "tc": "FEAT"}, {"id": 149, "title": "Admin UI: Agent Usage Analytics", "desc": "# FEAT-226 — Admin UI: Agent Usage Analytics\n\n**Typ:** feature\n**Priorität:** P1\n**Status:** replaced\n**Ersetzt durch:**", "pk": "SDRv4", "tc": "FEAT"}, {"id": 141, "title": "Admin UI: Agent Registry Modul", "desc": "# FEAT-225 — Admin UI: Agent Registry Modul\n\n**Typ:** feature\n**Priorität:** P1\n**Status:** replaced\n**Ersetzt durch:** ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 169, "title": "Agent/Skill Registry API", "desc": "# FEAT-224 — Agent/Skill Registry API\n\n**Typ:** feature\n**Priorität:** P1\n**Status:** review\n**Epic:** Agent Registry (F", "pk": "SDRv4", "tc": "FEAT"}, {"id": 161, "title": "Agent/Skill Registry DB-Erweiterung", "desc": "# FEAT-223 — Agent/Skill Registry DB-Erweiterung\n\n**Typ:** feature\n**Priorität:** P1\n**Status:** review\n**Epic:** Agent ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 153, "title": "CLI Chat — Cronjob-gesteuerte Loop-Prompts (unabhängig von Claude Code)", "desc": "## Idee\n\nIn der Weboberfläche können Cronjobs konfiguriert werden, die:\n1. Einen vordefinierten Prompt feuern\n2. Eine **", "pk": "SDRv4", "tc": "FEAT"}, {"id": 339, "title": "Custom Fields — Contact, Company, Sales List", "desc": "# FEAT-221: Custom Fields — Contact, Company, Sales List\n\n**Typ:** feature\n**Priorität:** P1\n**Status:** done\n**Erstellt", "pk": "SDRv4", "tc": "FEAT"}, {"id": 504, "title": "Telegram → CLI-Container MVP", "desc": "# FEAT-220: Telegram → CLI-Container MVP\n\n**Status:** review\n**Priorität:** P0\n**Erstellt:** 2026-04-08\n**Branch:** feat", "pk": "SDRv4", "tc": "FEAT"}, {"id": 478, "title": "Workspace-Credentials (Username/Passwort) + Filesystem-Isolation", "desc": "# FEAT-219: Workspace-Credentials (Username/Passwort) + Filesystem-Isolation\n\n**Typ:** feature\n**Priorität:** P1\n**Statu", "pk": "SDRv4", "tc": "FEAT"}, {"id": 344, "title": "Next.js Frontend + API-Routen im CLI-Workspace-Container", "desc": "# FEAT-218: Next.js Frontend + API-Routen im CLI-Workspace-Container\n\n**Typ:** feature\n**Priorität:** P1\n**Status:** don", "pk": "SDRv4", "tc": "FEAT"}, {"id": 156, "title": "Chat-Interaktionen: Reactions, Markierungen, Antworten & Weiterleiten", "desc": "# FEAT-217: Chat-Interaktionen — Reactions, Markierungen, Antworten & Weiterleiten\n\n## Beschreibung\n\nErweiterte Nachrich", "pk": "SDRv4", "tc": "FEAT"}, {"id": 338, "title": "Music Making App (Open Source Models)", "desc": "# FEAT-216: Music Making App (Open Source Models)\n\n## Beschreibung\n\nEine installierbare App im AI Workspace Container, d", "pk": "SDRv4", "tc": "FEAT"}, {"id": 137, "title": ".md Dateien als ausführbare CLI-Sessions", "desc": "# FEAT-215: .md Dateien als ausführbare CLI-Sessions\n\n## Beschreibung\n\n`.md`-Dateien im File Explorer sind \"ausführbar\" ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 220, "title": "OS-like File Explorer im Content-Bereich", "desc": "# FEAT-214: OS-like File Explorer im Content-Bereich\n\n## Beschreibung\n\nDer Content-Bereich im AI Workspace wird multimod", "pk": "SDRv4", "tc": "FEAT"}, {"id": 477, "title": "AI Workspace Chat-Integration (MVP UI)", "desc": "# FEAT-213: AI Workspace Chat-Integration (MVP UI)\n\n## Beschreibung\n\nDer AI Workspace ist **kein separater Screen** — er", "pk": "SDRv4", "tc": "FEAT"}, {"id": 474, "title": "Senity-Key-Injection & Token-Budget mit Fallback-Chain", "desc": "# FEAT-212: Senity-Key-Injection & Token-Budget mit Fallback-Chain\n\n## Beschreibung\n\nIm MVP stellt Senity den API-Key be", "pk": "SDRv4", "tc": "FEAT"}, {"id": 271, "title": "Telegram-Bot pro Projekt — Zentrales Hosting in SDRv4", "desc": "# FEAT-211: Telegram-Bot pro Projekt — Zentrales Hosting in SDRv4\n\n## Beschreibung\n\nJeder Workspace-Raum (App) kann eine", "pk": "SDRv4", "tc": "FEAT"}, {"id": 473, "title": "Workspace-Terminologie & Datenmodell", "desc": "# FEAT-210: Workspace-Terminologie & Datenmodell\n\n## Beschreibung\n\nVereinheitlicht die Terminologie für den AI Workspace", "pk": "SDRv4", "tc": "FEAT"}, {"id": 472, "title": "[Brainstorming] Chat↔CLI Hybrid-Modus (Skill-basierte Delegation)", "desc": "# FEAT-209: [Brainstorming] Chat↔CLI Hybrid-Modus (Skill-basierte Delegation)\n\n**Typ:** feature\n**Priorität:** P3\n**Stat", "pk": "SDRv4", "tc": "FEAT"}, {"id": 471, "title": "[Brainstorming] Webpage-Context an CLI (DOM + Screenshot)", "desc": "# FEAT-208: [Brainstorming] Webpage-Context an CLI (DOM + Screenshot)\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** ba", "pk": "SDRv4", "tc": "FEAT"}, {"id": 334, "title": "[Brainstorming] Custom Theme Premium", "desc": "# FEAT-207: [Brainstorming] Custom Theme Premium\n\n**Typ:** feature\n**Priorität:** P3\n**Status:** backlog\n**Erstellt:** 2", "pk": "SDRv4", "tc": "FEAT"}, {"id": 321, "title": "[Brainstorming] App: Audio Editor (Waveform)", "desc": "# FEAT-206: [Brainstorming] App: Audio Editor (Waveform)\n\n**Typ:** feature\n**Priorität:** P3\n**Status:** backlog\n**Erste", "pk": "SDRv4", "tc": "FEAT"}, {"id": 468, "title": "[Brainstorming] App: Foto Editor", "desc": "# FEAT-205: [Brainstorming] App: Foto Editor\n\n**Typ:** feature\n**Priorität:** P3\n**Status:** backlog\n**Erstellt:** 2026-", "pk": "SDRv4", "tc": "FEAT"}, {"id": 467, "title": "[Brainstorming] App: Maps KI-Routenplaner", "desc": "# FEAT-204: [Brainstorming] App: Maps KI-Routenplaner\n\n**Typ:** feature\n**Priorität:** P3\n**Status:** backlog\n**Erstellt", "pk": "SDRv4", "tc": "FEAT"}, {"id": 466, "title": "[Brainstorming] App: Browser-Use im Container", "desc": "# FEAT-203: [Brainstorming] App: Browser-Use im Container\n\n**Typ:** feature\n**Priorität:** P3\n**Status:** backlog\n**Erst", "pk": "SDRv4", "tc": "FEAT"}, {"id": 464, "title": "[ZUSAMMENGEFÜHRT] Admin-App Restrukturierung", "desc": "# FEAT-202: [ZUSAMMENGEFÜHRT] Admin-App Restrukturierung\n\n**Status:** closed\n**Zusammengeführt in:** RES-020 (App/Modul-", "pk": "SDRv4", "tc": "FEAT"}, {"id": 463, "title": "[Brainstorming] BYOK im Container (eigene API-Keys)", "desc": "# FEAT-201: [Brainstorming] BYOK im Container (eigene API-Keys)\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog\n", "pk": "SDRv4", "tc": "FEAT"}, {"id": 462, "title": "[Brainstorming] Voice-Kanal für Chat + CLI", "desc": "# FEAT-200: [Brainstorming] Voice-Kanal für Chat + CLI\n\n**Typ:** feature\n**Priorität:** P2\n**2026-04-09 — P1→P2 herabges", "pk": "SDRv4", "tc": "FEAT"}, {"id": 461, "title": "Telegram Bot: Forward, Reactions & Antwort-Optionen", "desc": "# FEAT-199: Telegram Bot: Forward, Reactions & Antwort-Optionen\n\n**Typ:** feature\n**Priorität:** P2\n**2026-04-09 — P1→P2", "pk": "SDRv4", "tc": "FEAT"}, {"id": 460, "title": "Modell-Konfiguration pro Container (Senity Model Selection)", "desc": "# FEAT-198: Modell-Konfiguration pro Container (Senity Model Selection)\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 326, "title": "Container Aufweck-Flow & Senity API Credential Injection", "desc": "# FEAT-197: Container Aufweck-Flow & Senity API Credential Injection\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** bac", "pk": "SDRv4", "tc": "FEAT"}, {"id": 458, "title": "[Brainstorming] Container-Setup-Script & Subdomain-Routing", "desc": "# FEAT-196: [Brainstorming] Container-Setup-Script & Subdomain-Routing\n\n**Typ:** feature\n**Priorität:** P2\n**2026-04-09 ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 457, "title": "User-App-Publishing — Eigene Apps veröffentlichen/verkaufen", "desc": "# FEAT-195: User-App-Publishing — Eigene Apps veröffentlichen/verkaufen\n\n**Typ:** feature\n**Priorität:** P3\n**Status:** ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 456, "title": "Theme-Marketplace — Vorkonfigurierte Designs", "desc": "# FEAT-194: Theme-Marketplace — Vorkonfigurierte Designs\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog\n**Erste", "pk": "SDRv4", "tc": "FEAT"}, {"id": 455, "title": "Container-Templates — Nackte Next.js/SDR-Instanz als Startpunkt", "desc": "# FEAT-193: Container-Templates — Nackte Next.js/SDR-Instanz als Startpunkt\n\n**Typ:** feature\n**Priorität:** P2\n**2026-0", "pk": "SDRv4", "tc": "FEAT"}, {"id": 454, "title": "App Store Engine — Install/Uninstall/Manifest-System", "desc": "# FEAT-192: App Store Engine — Install/Uninstall/Manifest-System\n\n**Typ:** feature\n**Priorität:** P2\n**2026-04-09 — P1→P", "pk": "SDRv4", "tc": "FEAT"}, {"id": 453, "title": "Thinking-Stufen — Abgestufte Denktiefe pro Provider", "desc": "# FEAT-191: Thinking-Stufen — Abgestufte Denktiefe pro Provider\n\n**Typ:** feature\n**Priorität:** P2\n**2026-04-09 — P1→P2", "pk": "SDRv4", "tc": "FEAT"}, {"id": 451, "title": "AI Workspace UI-Shell — Chat-Modus + Pins + File Explorer + App Store UI", "desc": "# FEAT-190: AI Workspace UI-Shell — Chat-Modus + Pins + File Explorer + App Store UI\n\n**Typ:** feature\n**Priorität:** P1", "pk": "SDRv4", "tc": "FEAT"}, {"id": 450, "title": "Multimodaler File-Browser Overlay im Chat", "desc": "# FEAT-189: Multimodaler File-Browser Overlay im Chat\n\n**Status:** review\n**Notiz:** Vollständig auf dev implementiert, ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 449, "title": "Agent/Skill-Registry — Dateisystem-Sync + App-Bundles", "desc": "# FEAT-188: Agent/Skill-Registry — Dateisystem-Sync + App-Bundles\n\n**Typ:** feature\n**Prio:** P1\n**Status:** review\n**Er", "pk": "SDRv4", "tc": "FEAT"}, {"id": 325, "title": "CLI User-Authority-Chain — Einbahnstraße der Autorität", "desc": "# FEAT-187: CLI User-Authority-Chain — Einbahnstraße der Autorität\n\n**Typ:** feature\n**Prio:** P1\n**Status:** review\n**E", "pk": "SDRv4", "tc": "FEAT"}, {"id": 448, "title": "CLI-Server Status-Webhooks", "desc": "# FEAT-186: CLI-Server Status-Webhooks\n\n**Typ:** feature\n**Prio:** P1\n**Status:** review\n**Erstellt:** 2026-04-06\n**Bran", "pk": "SDRv4", "tc": "FEAT"}, {"id": 410, "title": "Podcast-Modus als Adapter-Override [Brainstorming]", "desc": "# FEAT-185: Podcast-Modus als Adapter-Override [Brainstorming]\n\n**Typ:** feature\n**Prio:** P3\n**Status:** backlog\n**Erst", "pk": "SDRv4", "tc": "FEAT"}, {"id": 305, "title": "LaTeX/Math Rendering in Chat [Brainstorming]", "desc": "# FEAT-184: LaTeX/Math Rendering in Chat [Brainstorming]\n\n**Typ:** feature\n**Prio:** P3\n**Status:** backlog\n**Erstellt:*", "pk": "SDRv4", "tc": "FEAT"}, {"id": 388, "title": "Mermaid-Diagramme in Chat-Nachrichten [Brainstorming]", "desc": "# FEAT-183: Mermaid-Diagramme in Chat-Nachrichten [Brainstorming]\n\n**Typ:** feature\n**Prio:** P3\n**Status:** backlog\n**E", "pk": "SDRv4", "tc": "FEAT"}, {"id": 374, "title": "MarkdownMessage Upgrade (ChatGPT-Niveau)", "desc": "# FEAT-182: MarkdownMessage Upgrade (ChatGPT-Niveau)\n\n**Typ:** feature\n**Prio:** P2\n**Status:** done\n**Erstellt:** 2026-", "pk": "SDRv4", "tc": "FEAT"}, {"id": 429, "title": "Chat-Adapter Override-System (renderConfig)", "desc": "# FEAT-181: Chat-Adapter Override-System (renderConfig)\n\n**Typ:** feature\n**Prio:** P1\n**Status:** done\n**Erstellt:** 20", "pk": "SDRv4", "tc": "FEAT"}, {"id": 447, "title": "Sprach-Farbkodierung (Flag-Colors)", "desc": "# FEAT-180: Sprach-Farbkodierung (Flag-Colors)\n\n**Typ:** feature\n**Prio:** P2\n**Status:** done\n**Erstellt:** 2026-04-06\n", "pk": "SDRv4", "tc": "FEAT"}, {"id": 446, "title": "KI Code-Formatierung AI-Aktion", "desc": "# FEAT-179: KI Code-Formatierung AI-Aktion\n\n**Typ:** feature\n**Prio:** P1\n**Status:** done\n**Erstellt:** 2026-04-06\n**De", "pk": "SDRv4", "tc": "FEAT"}, {"id": 445, "title": "Chat-Input CodeMirror 6 Hybrid", "desc": "# FEAT-178: Chat-Input CodeMirror 6 Hybrid\n\n**Typ:** feature\n**Prio:** P1\n**Status:** done\n**Erstellt:** 2026-04-06\n**De", "pk": "SDRv4", "tc": "FEAT"}, {"id": 444, "title": "CLI Chat → Twin des Default-Chats (ChatInterface + CLI-Adapter)", "desc": "# FEAT-177: CLI Chat → Twin des Default-Chats (ChatInterface + CLI-Adapter)\n\n**Typ:** feature\n**Prio:** P1\n**Status:** r", "pk": "SDRv4", "tc": "FEAT"}, {"id": 443, "title": "KI-basierte Chat-Compaction & Auto-Cleanup", "desc": "# FEAT-176: KI-basierte Chat-Compaction & Auto-Cleanup\n\n**Typ:** feature\n**Prio:** P2\n**Status:** backlog\n**Erstellt:** ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 442, "title": "Empfehlungs-Engine (Cold-Start + Score-basiert)", "desc": "# FEAT-175: Empfehlungs-Engine (Cold-Start + Score-basiert)\n\n**Typ:** feature\n**Prio:** P2\n**Status:** done\n**Commits:**", "pk": "SDRv4", "tc": "FEAT"}, {"id": 441, "title": "UI — Analytics Dashboard + Gesamtkosten", "desc": "# FEAT-174: UI — Analytics Dashboard + Gesamtkosten\n\n**Typ:** feature\n**Prio:** P1\n**Status:** done\n**Commits:** aaeba07", "pk": "SDRv4", "tc": "FEAT"}, {"id": 440, "title": "UI — Audit History + Transkript-Viewer", "desc": "# FEAT-173: UI — Audit History + Transkript-Viewer\n\n**Typ:** feature\n**Prio:** P1\n**Status:** done\n**Commits:** f3eedd1,", "pk": "SDRv4", "tc": "FEAT"}, {"id": 439, "title": "UI — Leaderboard + Agent-Detail (Radar-Chart)", "desc": "# FEAT-172: UI — Leaderboard + Agent-Detail (Radar-Chart)\n\n**Typ:** feature\n**Prio:** P1\n**Status:** done\n**Commits:** 4", "pk": "SDRv4", "tc": "FEAT"}, {"id": 438, "title": "Audit-Scheduling (pg_cron + Remote Agent Schedule)", "desc": "# FEAT-171: Audit-Scheduling (pg_cron + Remote Agent Schedule)\n\n**Typ:** feature\n**Prio:** P1\n**Status:** done\n**Commits", "pk": "SDRv4", "tc": "FEAT"}, {"id": 437, "title": "Judicial Review Agents (Mediator, Jury-Panel, Richter)", "desc": "# FEAT-170: Judicial Review Agents (Mediator, Jury-Panel, Richter)\n\n**Typ:** feature\n**Prio:** P1\n**Status:** backlog\n**", "pk": "SDRv4", "tc": "FEAT"}, {"id": 420, "title": "API-Endpoints — Runs, Reviews, Analytics, Recommendations", "desc": "# FEAT-169: API-Endpoints — Runs, Reviews, Analytics, Recommendations\n\n**Typ:** feature\n**Prio:** P1\n**Status:** done\n**", "pk": "SDRv4", "tc": "FEAT"}, {"id": 430, "title": "DB-Migration — Performance-Tabellen + pg_cron Aggregation", "desc": "# FEAT-168: DB-Migration — Performance-Tabellen + pg_cron Aggregation\n\n**Typ:** feature\n**Prio:** P1\n**Status:** done\n**", "pk": "SDRv4", "tc": "FEAT"}, {"id": 425, "title": "Seed-Import Script (manifest.json → DB + Storage)", "desc": "# FEAT-167: Seed-Import Script (manifest.json → DB + Storage)\n\n**Typ:** feature\n**Prio:** P1\n**Status:** backlog\n**Erste", "pk": "SDRv4", "tc": "FEAT"}, {"id": 436, "title": "Agent Performance Benchmarking System (Epic)", "desc": "# FEAT-166: Agent Performance Benchmarking System (Epic)\n\n**Typ:** feature\n**Prio:** P1\n**Status:** backlog\n**Erstellt:*", "pk": "SDRv4", "tc": "FEAT"}, {"id": 435, "title": "Chat Input Responsive + UI Fixes", "desc": "# FEAT-165: Chat Input Responsive + UI Fixes\n\n**Typ:** feature\n**Prio:** P1\n**Status:** review\n**Branch:** feat/165-chat", "pk": "SDRv4", "tc": "FEAT"}, {"id": 434, "title": "CLI-Chat-Override MVP", "desc": "# FEAT-164: CLI-Chat-Override MVP\n\n**Typ:** Feature\n**Prio:** P1\n**Status:** review\n**Erstellt:** 2026-04-06\n**Branch:**", "pk": "SDRv4", "tc": "FEAT"}, {"id": 241, "title": "Chat als Hub — Kanal-Integration (Telegram, WhatsApp, Web)", "desc": "# Chat als Hub — Kanal-Integration (Telegram, WhatsApp, Web)\n\n## Kontext\n\nTelegram/WhatsApp sind **Kanäle**, keine Bots.", "pk": "SDRv4", "tc": "FEAT"}, {"id": 236, "title": "Social Media Automation Gastro — Event-basierte Kampagnen", "desc": "# Social Media Automation Gastro — Event-basierte Kampagnen\n\n## Kontext\nAus Gesprächsprotokoll vom 2026-04-05. Burger Bu", "pk": "SDRv4", "tc": "FEAT"}, {"id": 235, "title": "Bestellpreview — Live-Anzeige laufender Bestellungen im Backend", "desc": "# Bestellpreview — Live-Anzeige laufender Bestellungen im Backend\n\n## Kontext\nAus Gesprächsprotokoll vom 2026-04-05. Ins", "pk": "SDRv4", "tc": "FEAT"}, {"id": 115, "title": "Voice-Kanal Gastro — KI-Telefonbestellungen", "desc": "# Voice-Kanal Gastro — KI-Telefonbestellungen\n\n## Kontext\n\nDas langfristige Hauptziel von Burger Bulle: KI nimmt Telefon", "pk": "SDRv4", "tc": "FEAT"}, {"id": 111, "title": "Fahrer-Tracking & Lieferbestätigung", "desc": "# Fahrer-Tracking & Lieferbestätigung\n\n## Kontext\n\nBurger Bulle will wissen: Wie lange braucht eine Bestellung von Einga", "pk": "SDRv4", "tc": "FEAT"}, {"id": 135, "title": "Routenplanung & Bestellungsbündelung — Google Maps API", "desc": "# Routenplanung & Bestellungsbündelung — Google Maps API\n\n## Kontext\n\nBurger Bulle hat 6 Filialen in Gelsenkirchen, alle", "pk": "SDRv4", "tc": "FEAT"}, {"id": 132, "title": "Multilingual Gastro — Arabisch, Türkisch, europäische Sprachen", "desc": "# Multilingual Gastro — Arabisch, Türkisch, europäische Sprachen\n\n## Kontext\n\nBurger Bulle: \"Arabisch ist sehr sehr inte", "pk": "SDRv4", "tc": "FEAT"}, {"id": 124, "title": "Payment-Integration Gastro — Stripe/PayPal für Bestellungen", "desc": "# Payment-Integration Gastro — Stripe/PayPal für Bestellungen\n\n## Kontext\n\nBurger Bulle will weg von Barzahlung (Fake-Be", "pk": "SDRv4", "tc": "FEAT"}, {"id": 245, "title": "Bestellsystem-Anbindung — Integration Burger Bulle Backend", "desc": "# Bestellsystem-Anbindung — Integration Burger Bulle Backend\n\n## Kontext\n\nBestellungen müssen im bestehenden System von ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 246, "title": "Kundenprofil & Präferenzen — Personalisierte Empfehlungen", "desc": "# Kundenprofil & Präferenzen — Personalisierte Empfehlungen\n\n## Kontext\n\nInspiriert vom Pizza Hut Modell: System kennt B", "pk": "SDRv4", "tc": "FEAT"}, {"id": 244, "title": "Bestellverifikation — Anti-Fake-Mechanismus", "desc": "# Bestellverifikation — Anti-Fake-Mechanismus\n\n## Kontext\n\nBurger Bulle hat massive Probleme mit Fake-Bestellungen bei B", "pk": "SDRv4", "tc": "FEAT"}, {"id": 105, "title": "Burger Bulle Multi-Channel — Telegram + Website-Chat", "desc": "# Burger Bulle Multi-Channel — Telegram + Website-Chat\n\n## Kontext\n\nDer Chatbot (FEAT-151) muss über mehrere Kanäle erre", "pk": "SDRv4", "tc": "FEAT"}, {"id": 243, "title": "Burger Bulle Chatbot MVP — Speisekarten-Wissen + Upselling", "desc": "# Burger Bulle Chatbot MVP — Speisekarten-Wissen + Upselling\n\n## Kontext\n\nErster Baustein des Gastro-MVPs für Burger Bul", "pk": "SDRv4", "tc": "FEAT"}, {"id": 433, "title": "Registry UI — Verwaltungsoberfläche für Agents/Skills", "desc": "# FEAT-150: Registry UI — Verwaltungsoberfläche für Agents/Skills\n\n**Typ:** feature\n**Prio:** P2\n**Status:** review\n**Er", "pk": "SDRv4", "tc": "FEAT"}, {"id": 432, "title": "Registry-Sync — Agents/Skills aus Dateisystem katalogisieren", "desc": "# FEAT-149: Registry-Sync — Agents/Skills aus Dateisystem katalogisieren\n\n**Typ:** feature\n**Prio:** P2\n**Status:** revi", "pk": "SDRv4", "tc": "FEAT"}, {"id": 431, "title": "Agent/Skill DB-Schema", "desc": "# FEAT-148: Agent/Skill DB-Schema\n\n**Typ:** feature\n**Prio:** P2\n**Status:** review\n**Hinweis:** Replaced by FEAT-223 — ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 428, "title": "Lizenz-Check API", "desc": "# FEAT-147: Lizenz-Check API\n\n**Typ:** feature\n**Prio:** P2\n**Status:** backlog\n**Erstellt:** 2026-04-06\n**Epic:** App-A", "pk": "SDRv4", "tc": "FEAT"}, {"id": 427, "title": "Lizenzverwaltung UI", "desc": "# FEAT-146: Lizenzverwaltung UI\n\n**Typ:** feature\n**Prio:** P2\n**Status:** backlog\n**Erstellt:** 2026-04-06\n**Epic:** Ap", "pk": "SDRv4", "tc": "FEAT"}, {"id": 426, "title": "Lizenz-Tabellen + API", "desc": "# FEAT-145: Lizenz-Tabellen + API\n\n**Typ:** feature\n**Prio:** P2\n**Status:** backlog\n**Erstellt:** 2026-04-06\n**Epic:** ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 424, "title": "Capability adjust_model_pricing", "desc": "# FEAT-144: Capability adjust_model_pricing\n\n**Typ:** feature\n**Prio:** P2\n**2026-04-09 — P1→P2 herabgestuft (Ticket-Aud", "pk": "SDRv4", "tc": "FEAT"}, {"id": 423, "title": "Pricing-UI in Modelleinstellungen", "desc": "# FEAT-143: Pricing-UI in Modelleinstellungen\n\n**Typ:** feature\n**Prio:** P2\n**2026-04-09 — P1→P2 herabgestuft (Ticket-A", "pk": "SDRv4", "tc": "FEAT"}, {"id": 422, "title": "model_pricing Tabelle + Seed-Daten", "desc": "# FEAT-142: model_pricing Tabelle + Seed-Daten\n\n**Typ:** feature\n**Prio:** P2\n**2026-04-09 — P1→P2 herabgestuft (Ticket-", "pk": "SDRv4", "tc": "FEAT"}, {"id": 421, "title": "Components den Apps zuordnen", "desc": "# FEAT-141: Components den Apps zuordnen\n\n**Typ:** feature\n**Prio:** P2\n**2026-04-09 — P1→P2 herabgestuft (Ticket-Audit)", "pk": "SDRv4", "tc": "FEAT"}, {"id": 415, "title": "Pages den Apps zuordnen", "desc": "# FEAT-140: Pages den Apps zuordnen\n\n**Typ:** feature\n**Prio:** P2\n**2026-04-09 — P1→P2 herabgestuft (Ticket-Audit).**\n*", "pk": "SDRv4", "tc": "FEAT"}, {"id": 419, "title": "API-Routes den Apps zuordnen", "desc": "# FEAT-139: API-Routes den Apps zuordnen\n\n**Typ:** feature\n**Prio:** P2\n**2026-04-09 — P1→P2 herabgestuft (Ticket-Audit)", "pk": "SDRv4", "tc": "FEAT"}, {"id": 418, "title": "Schema-Validierung auf Testdatenbank", "desc": "# FEAT-138: Schema-Validierung auf Testdatenbank\n\n**Typ:** feature\n**Prio:** P2\n**2026-04-09 — P1→P2 herabgestuft (Ticke", "pk": "SDRv4", "tc": "FEAT"}, {"id": 417, "title": "Migrations-Runner bauen", "desc": "# FEAT-137: Migrations-Runner bauen\n\n**Typ:** feature\n**Prio:** P2\n**2026-04-09 — P1→P2 herabgestuft (Ticket-Audit).**\n*", "pk": "SDRv4", "tc": "FEAT"}, {"id": 416, "title": "App-Migrationen extrahieren", "desc": "# FEAT-136: App-Migrationen extrahieren\n\n**Typ:** feature\n**Prio:** P2\n**2026-04-09 — P1→P2 herabgestuft (Ticket-Audit).", "pk": "SDRv4", "tc": "FEAT"}, {"id": 414, "title": "Core-Schema extrahieren", "desc": "# FEAT-135: Core-Schema extrahieren\n\n**Typ:** feature\n**Prio:** P2\n**2026-04-09 — P1→P2 herabgestuft (Ticket-Audit).**\n*", "pk": "SDRv4", "tc": "FEAT"}, {"id": 413, "title": "Manifest-Schema definieren", "desc": "# FEAT-134: Manifest-Schema definieren\n\n**Typ:** feature\n**Prio:** P2\n**2026-04-09 — P1→P2 herabgestuft (Ticket-Audit).*", "pk": "SDRv4", "tc": "FEAT"}, {"id": 139, "title": "App-Ordnerstruktur anlegen", "desc": "# FEAT-133: App-Ordnerstruktur anlegen\n\n**Typ:** feature\n**Prio:** P2\n**2026-04-09 — P1→P2 herabgestuft (Ticket-Audit).*", "pk": "SDRv4", "tc": "FEAT"}, {"id": 412, "title": "DB-Modularisierung — Übergeordnetes Epic", "desc": "# FEAT-132: DB-Modularisierung — Übergeordnetes Epic\n\n**Typ:** feature\n**Priorität:** P1\n**Status:** in_progress\n**Notiz", "pk": "SDRv4", "tc": "FEAT"}, {"id": 411, "title": "Container & Kanäle — Übergeordnetes Epic", "desc": "# FEAT-131: Container & Kanäle — Übergeordnetes Epic\n\n**Typ:** feature\n**Priorität:** P0\n**Status:** in_progress\n**Notiz", "pk": "SDRv4", "tc": "FEAT"}, {"id": 298, "title": "Währungsanzeige-Infrastruktur", "desc": "# FEAT-130: Währungsanzeige-Infrastruktur\n\n## Beschreibung\n\nBasisinfrastruktur für einheitliche Währungsanzeige im Front", "pk": "SDRv4", "tc": "FEAT"}, {"id": 379, "title": "Benutzerrollen — Konsolidierte Verwaltung mit Berechtigungs-Tabs", "desc": "# FEAT-129: Benutzerrollen — Konsolidierte Verwaltung mit Berechtigungs-Tabs\n\n**Typ:** feature\n**Priorität:** P1\n**Statu", "pk": "SDRv4", "tc": "FEAT"}, {"id": 409, "title": "Enhanced Create-Server-Dialog", "desc": "# FEAT-128: Enhanced Create-Server-Dialog\n\n**Typ:** feature\n**Priorität:** P1\n**Status:** backlog\n**Abhängigkeiten:** FE", "pk": "SDRv4", "tc": "FEAT"}, {"id": 408, "title": "Project Templates / Blueprints", "desc": "# FEAT-127: Project Templates / Blueprints\n\n**Typ:** feature\n**Priorität:** P1\n**Status:** backlog\n**Abhängigkeiten:** F", "pk": "SDRv4", "tc": "FEAT"}, {"id": 237, "title": "Server File Browser + Upload", "desc": "# FEAT-126: Server File Browser + Upload\n\n**Typ:** feature\n**Priorität:** P0\n**Status:** done\n**superseded_by:** FEAT-19", "pk": "SDRv4", "tc": "FEAT"}, {"id": 324, "title": "Agent Self-Generated Frontend", "desc": "# FEAT-121: Agent Self-Generated Frontend\n\n- **Typ:** feature\n- **Prio:** P2\n- **Status:** backlog\n- **Epic:** Agent Tea", "pk": "SDRv4", "tc": "FEAT"}, {"id": 320, "title": "CLI-Bot Self-Orchestration — Autonomes Session-Management", "desc": "# FEAT-120: CLI-Bot Self-Orchestration — Autonomes Session-Management\n\n- **Typ:** feature\n- **Prio:** P1\n- **Status:** b", "pk": "SDRv4", "tc": "FEAT"}, {"id": 378, "title": "Self-Managing Memory System für CLI-Container", "desc": "# FEAT-119: Self-Managing Memory System für CLI-Container\n\n- **Typ:** feature\n- **Prio:** P1\n- **Status:** backlog\n- **E", "pk": "SDRv4", "tc": "FEAT"}, {"id": 222, "title": "BYOK Key-Management UI", "desc": "# FEAT-118: BYOK Key-Management UI\n\n- **Typ:** feature\n- **Prio:** P2\n- **Status:** backlog\n- **Epic:** Agent Teams Phas", "pk": "SDRv4", "tc": "FEAT"}, {"id": 221, "title": "BYOK per Company — Firmenweit geteilter API-Key", "desc": "# FEAT-117: BYOK per Company — Firmenweit geteilter API-Key\n\n- **Typ:** feature\n- **Prio:** P2\n- **Status:** backlog\n- *", "pk": "SDRv4", "tc": "FEAT"}, {"id": 323, "title": "BYOK per User — Eigene API-Keys hinterlegen", "desc": "# FEAT-116: BYOK per User — Eigene API-Keys hinterlegen\n\n- **Typ:** feature\n- **Prio:** P2\n- **Status:** backlog\n- **Epi", "pk": "SDRv4", "tc": "FEAT"}, {"id": 319, "title": "CLI-Persönlichkeit im Senity Website-Chat", "desc": "# FEAT-115: CLI-Persönlichkeit im Senity Website-Chat\n\n- **Typ:** feature\n- **Prio:** P3\n- **Status:** done\n- **supersed", "pk": "SDRv4", "tc": "FEAT"}, {"id": 311, "title": "Passwortschutz & E2E-Verschlüsselung für CLI-Chats", "desc": "# FEAT-114: Passwortschutz & E2E-Verschlüsselung für CLI-Chats\n\n- **Typ:** feature\n- **Prio:** P3\n- **Status:** backlog\n", "pk": "SDRv4", "tc": "FEAT"}, {"id": 304, "title": "LiveKit Voice-Kanal pro Projekt", "desc": "# FEAT-113: LiveKit Voice-Kanal pro Projekt\n\n- **Typ:** feature\n- **Prio:** P3\n- **Status:** backlog\n- **Epic:** Agent T", "pk": "SDRv4", "tc": "FEAT"}, {"id": 333, "title": "SMS-Kanal für CLI-Projekte", "desc": "# FEAT-112: SMS-Kanal für CLI-Projekte\n\n- **Typ:** feature\n- **Prio:** P3\n- **Status:** backlog\n- **Epic:** Agent Teams ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 130, "title": "WhatsApp-Kanal für CLI-Projekte", "desc": "# FEAT-111: WhatsApp-Kanal für CLI-Projekte\n\n- **Typ:** feature\n- **Prio:** P2\n- **Status:** backlog\n- **Epic:** Agent T", "pk": "SDRv4", "tc": "FEAT"}, {"id": 318, "title": "Trello/Asana-Sync pro Projekt", "desc": "# FEAT-110: Trello/Asana-Sync pro Projekt\n\n- **Typ:** feature\n- **Prio:** P2\n- **Status:** backlog\n- **Epic:** Agent Tea", "pk": "SDRv4", "tc": "FEAT"}, {"id": 310, "title": "Email-Integration (Gmail, SMTP, SendGrid)", "desc": "# FEAT-109: Email-Integration (Gmail, SMTP, SendGrid)\n\n- **Typ:** feature\n- **Prio:** P2\n- **Status:** backlog\n- **Epic:", "pk": "SDRv4", "tc": "FEAT"}, {"id": 303, "title": "Kalender-Integration (Calendly + Google Calendar)", "desc": "# FEAT-108: Kalender-Integration (Calendly + Google Calendar)\n\n- **Typ:** feature\n- **Prio:** P2\n- **Status:** backlog\n-", "pk": "SDRv4", "tc": "FEAT"}, {"id": 332, "title": "App-Store Infrastruktur — Integrationen als Apps", "desc": "# FEAT-107: App-Store Infrastruktur — Integrationen als Apps\n\n- **Typ:** feature\n- **Prio:** P2\n- **Status:** backlog\n- ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 129, "title": "Dedicated Container (Premium)", "desc": "# FEAT-106: Dedicated Container (Premium)\n\n- **Typ:** feature\n- **Prio:** P3\n- **Status:** backlog\n- **Epic:** Agent Tea", "pk": "SDRv4", "tc": "FEAT"}, {"id": 317, "title": "Datei-Generierung & Versand", "desc": "# FEAT-105: Datei-Generierung & Versand\n\n- **Typ:** feature\n- **Prio:** P2\n- **Status:** backlog\n- **Epic:** Agent Teams", "pk": "SDRv4", "tc": "FEAT"}, {"id": 97, "title": "White-Label Modelle — Eigene Modellnamen", "desc": "# FEAT-104: White-Label Modelle — Eigene Modellnamen\n\n- **Typ:** feature\n- **Prio:** P2\n- **Status:** backlog\n- **Epic:*", "pk": "SDRv4", "tc": "FEAT"}, {"id": 302, "title": "Container-Frontend auf eigener Subdomain", "desc": "# FEAT-103: Container-Frontend auf eigener Subdomain\n\n- **Typ:** feature\n- **Prio:** P2\n- **Status:** backlog\n- **Epic:*", "pk": "SDRv4", "tc": "FEAT"}, {"id": 331, "title": "Agent Teams MVP — Isolierte CLI-Container als Produkt", "desc": "# FEAT-102: Agent Teams MVP — Isolierte CLI-Container als Produkt\n\n- **Typ:** feature\n- **Prio:** P0\n- **Status:** backl", "pk": "SDRv4", "tc": "FEAT"}, {"id": 407, "title": "Abo-Konfigurator UI — McDonald's-Style Paket-Builder", "desc": "# FEAT-101: Abo-Konfigurator UI — McDonald's-Style Paket-Builder\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog", "pk": "SDRv4", "tc": "FEAT"}, {"id": 316, "title": "Add-on & Upgrade System — Modulare Extras (McDonald's \"Dazu bestellen\")", "desc": "# FEAT-100: Add-on & Upgrade System — Modulare Extras (McDonald's \"Dazu bestellen\")\n\n**Typ:** feature\n**Priorität:** P2\n", "pk": "SDRv4", "tc": "FEAT"}, {"id": 308, "title": "Feature-Module System — Freischaltbare Funktions-Bausteine", "desc": "# FEAT-099: Feature-Module System — Freischaltbare Funktions-Bausteine\n\n**Typ:** feature\n**Priorität:** P1\n**Status:** b", "pk": "SDRv4", "tc": "FEAT"}, {"id": 301, "title": "Abo-System Core — Subscription Plans mit Feature-Gating & Vertragsbedingungen", "desc": "# FEAT-098: Abo-System Core — Subscription Plans mit Feature-Gating & Vertragsbedingungen\n\n**Typ:** feature\n**Priorität:", "pk": "SDRv4", "tc": "FEAT"}, {"id": 406, "title": "Native Anbindung von SendEmail, Terminvergabe und SMS", "desc": "# FEAT-097: Native Anbindung von SendEmail, Terminvergabe und SMS\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlo", "pk": "SDRv4", "tc": "FEAT"}, {"id": 405, "title": "Voicebots optimieren (Stimme, LLM Performance, Wartezeit)", "desc": "# FEAT-096: Voicebots optimieren (Stimme, LLM Performance, Wartezeit)\n\n**Typ:** feature\n**Priorität:** P1\n**Status:** ba", "pk": "SDRv4", "tc": "FEAT"}, {"id": 398, "title": "Sprachassistent Senity Prompt bearbeiten", "desc": "# FEAT-095: Sprachassistent Senity Prompt bearbeiten\n\n**Typ:** feature\n**Priorität:** P1\n**Status:** backlog\n**Abhängigk", "pk": "SDRv4", "tc": "FEAT"}, {"id": 404, "title": "Round Robin Modell für API Keys (Puter)", "desc": "# FEAT-094: Round Robin Modell für API Keys (Puter)\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog\n**Abhängigke", "pk": "SDRv4", "tc": "FEAT"}, {"id": 403, "title": "Lead Scraper Vor- und Nachname korrekt extrahieren", "desc": "# FEAT-093: Lead Scraper Vor- und Nachname korrekt extrahieren\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog\n*", "pk": "SDRv4", "tc": "FEAT"}, {"id": 330, "title": "Lead Scraper Fortschrittsbalken", "desc": "# FEAT-092: Lead Scraper Fortschrittsbalken\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog\n**Abhängigkeiten:** ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 402, "title": "Chat Tool-Calling für Lead Scraper und Rechtsberatung prüfen", "desc": "# FEAT-091: Chat Tool-Calling für Lead Scraper und Rechtsberatung prüfen\n\n**Typ:** feature\n**Priorität:** P1\n**Status:**", "pk": "SDRv4", "tc": "FEAT"}, {"id": 401, "title": "Anzeige x von y Leads gefunden im Lead Scraper", "desc": "# FEAT-090: Anzeige x von y Leads gefunden im Lead Scraper\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog\n**Abh", "pk": "SDRv4", "tc": "FEAT"}, {"id": 400, "title": "Lizenzmanagement", "desc": "# FEAT-089: Lizenzmanagement\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog\n**Abhängigkeiten:** FEAT-021, FEAT-", "pk": "SDRv4", "tc": "FEAT"}, {"id": 399, "title": "Affiliate Program (Kunden-Anmeldung, Affiliate-Links, Provision)", "desc": "# FEAT-088: Affiliate Program (Kunden-Anmeldung, Affiliate-Links, Provision)\n\n**Typ:** feature\n**Priorität:** P3\n**Statu", "pk": "SDRv4", "tc": "FEAT"}, {"id": 397, "title": "Kunde per SMS oder Email über Gespräche informieren", "desc": "# FEAT-087: Kunde per SMS oder Email über Gespräche informieren\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog\n", "pk": "SDRv4", "tc": "FEAT"}, {"id": 396, "title": "Kunde darf LLM-Auswahl nicht sehen + Einstellungen eingeschränkt", "desc": "# FEAT-086: Kunde darf LLM-Auswahl nicht sehen + Einstellungen eingeschränkt\n\n**Typ:** feature\n**Priorität:** P1\n**Statu", "pk": "SDRv4", "tc": "FEAT"}, {"id": 395, "title": "Kostenaufschlüsselung nicht für Kunden sichtbar (nur eigene Kosten, EUR statt USD)", "desc": "# FEAT-085: Kostenaufschlüsselung nicht für Kunden sichtbar (nur eigene Kosten, EUR statt USD)\n\n**Typ:** feature\n**Prior", "pk": "SDRv4", "tc": "FEAT"}, {"id": 394, "title": "Logging — Transkribieren von Telefongesprächen und Auswertungen", "desc": "# FEAT-084: Logging — Transkribieren von Telefongesprächen und Auswertungen\n\n**Typ:** feature\n**Priorität:** P2\n**Status", "pk": "SDRv4", "tc": "FEAT"}, {"id": 393, "title": "Prompt Generator für Voicebots — Standardisierung", "desc": "# FEAT-083: Prompt Generator für Voicebots — Standardisierung\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog\n**", "pk": "SDRv4", "tc": "FEAT"}, {"id": 392, "title": "Produkt-Token-Integration — Abrechnung beim Produktkauf", "desc": "# FEAT-082: Produkt-Token-Integration — Abrechnung beim Produktkauf\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** back", "pk": "SDRv4", "tc": "FEAT"}, {"id": 391, "title": "Produkt-Admin UI — CRUD für Produkte & Preise", "desc": "# FEAT-081: Produkt-Admin UI — CRUD für Produkte & Preise\n\n**Typ:** feature\n**Priorität:** P1\n**Status:** backlog\n**Abhä", "pk": "SDRv4", "tc": "FEAT"}, {"id": 322, "title": "KI-Telefonagent für Bestellungen (Gastronomie)", "desc": "# FEAT-080: KI-Telefonagent für Bestellungen (Gastronomie)\n\n| Feld | Wert |\n|------|------|\n| Typ | feature |\n| Prio | P", "pk": "SDRv4", "tc": "FEAT"}, {"id": 95, "title": "Codex-Reste entfernen — Cleanup", "desc": "# FEAT-079 — Codex-Reste entfernen — Cleanup\n\n**Typ:** feature | **Prio:** P2 | **Status:** backlog\n**Erstellt:** 2026-0", "pk": "SDRv4", "tc": "FEAT"}, {"id": 229, "title": "CLI-Provider-Routing — Unified Spawner mit 4 Providern", "desc": "# FEAT-078 — CLI-Provider-Routing — Unified Spawner mit 4 Providern\n\n**Typ:** feature | **Prio:** P2 | **Status:** backl", "pk": "SDRv4", "tc": "FEAT"}, {"id": 230, "title": "Claude-Delegator Skill — Claude Code als Cross-Check-Alternative", "desc": "# FEAT-077 — Claude-Delegator Skill — Claude Code als Cross-Check-Alternative\n\n**Typ:** feature | **Prio:** P1 | **Statu", "pk": "SDRv4", "tc": "FEAT"}, {"id": 227, "title": "Unsloth/llama.cpp Local Model Server", "desc": "# FEAT-076 — Unsloth/llama.cpp Local Model Server\n\n**Typ:** feature | **Prio:** P2 | **Status:** backlog\n**Erstellt:** 2", "pk": "SDRv4", "tc": "FEAT"}, {"id": 309, "title": "Agent Creator — Selbst-konfigurierende KI-Agenten mit Wissensdatenbank", "desc": "# FEAT-074: Agent Creator — Selbst-konfigurierende KI-Agenten mit Wissensdatenbank\n\n**Typ:** feature\n**Prio:** P1\n**Stat", "pk": "SDRv4", "tc": "FEAT"}, {"id": 390, "title": "Implementation Bot — Telegram → Brainstorming + Code-Ausführung", "desc": "# FEAT-073: Implementation Bot — Telegram → Brainstorming + Code-Ausführung\n\n**Typ:** feature\n**Prio:** P2\n**Status:** r", "pk": "SDRv4", "tc": "FEAT"}, {"id": 389, "title": "KI-Rechtsberatung via Telegram — mit Dokument-Upload", "desc": "# FEAT-072: KI-Rechtsberatung via Telegram — mit Dokument-Upload\n\n**Typ:** feature\n**Prio:** P2\n**Status:** replaced\n**E", "pk": "SDRv4", "tc": "FEAT"}, {"id": 387, "title": "Bug-Report Bot — Telegram → Ticket-Erstellung + Auto-Fix", "desc": "# FEAT-071: Bug-Report Bot — Telegram → Ticket-Erstellung + Auto-Fix\n\n**Typ:** feature\n**Prio:** P2\n**Status:** replaced", "pk": "SDRv4", "tc": "FEAT"}, {"id": 315, "title": "Self-Service Bot-Erstellung", "desc": "# FEAT-070: Self-Service Bot-Erstellung\n\n**Typ:** feature\n**Priorität:** medium\n**Status:** replaced\n**Ersetzt durch:** ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 307, "title": "Chat-Verschlüsselung & Kommunikationssicherheit", "desc": "# FEAT-069: Chat-Verschlüsselung & Kommunikationssicherheit\n\n**Typ:** feature\n**Priorität:** medium\n**Status:** backlog\n", "pk": "SDRv4", "tc": "FEAT"}, {"id": 103, "title": "Automatische Eskalations-Regeln", "desc": "# FEAT-068: Automatische Eskalations-Regeln\n\n**Typ:** feature\n**Priorität:** medium\n**Status:** backlog\n**Abhängigkeiten", "pk": "SDRv4", "tc": "FEAT"}, {"id": 386, "title": "Bot-Analytics — Metriken pro Bot", "desc": "# FEAT-067: Bot-Analytics — Metriken pro Bot\n\n**Typ:** feature\n**Priorität:** low\n**Status:** replaced\n**Ersetzt durch:*", "pk": "SDRv4", "tc": "FEAT"}, {"id": 128, "title": "Microservice-Extraktion Bot-Engine", "desc": "# FEAT-066: Microservice-Extraktion Bot-Engine\n\n**Typ:** feature\n**Priorität:** low\n**Status:** backlog\n**Abhängigkeiten", "pk": "SDRv4", "tc": "FEAT"}, {"id": 384, "title": "Slack-Adapter — Slack Bot Integration", "desc": "# FEAT-064: Slack-Adapter — Slack Bot Integration\n\n**Typ:** feature\n**Priorität:** low\n**Status:** backlog\n**Abhängigkei", "pk": "SDRv4", "tc": "FEAT"}, {"id": 383, "title": "WhatsApp-Adapter — WhatsApp Business API Integration", "desc": "# FEAT-063: WhatsApp-Adapter — WhatsApp Business API Integration\n\n**Typ:** feature\n**Priorität:** medium\n**Status:** bac", "pk": "SDRv4", "tc": "FEAT"}, {"id": 329, "title": "Bot-Plattform MVP — Multi-Owner Bot-System", "desc": "# FEAT-062: Bot-Plattform MVP — Multi-Owner Bot-System\n\n**Typ:** feature\n**Priorität:** high\n**Status:** done\n**Abhängig", "pk": "SDRv4", "tc": "FEAT"}, {"id": 131, "title": "AI Pattern Generator — API-only Regel-Generierung + Validierung", "desc": "# FEAT-061: AI Pattern Generator — API-only Regel-Generierung + Validierung\n\n**Typ:** feature\n**Priorität:** P1\n**Status", "pk": "SDRv4", "tc": "FEAT"}, {"id": 314, "title": "AI Pattern Custom Rules — Benutzerdefinierte KI-Muster", "desc": "# FEAT-060: AI Pattern Custom Rules — Benutzerdefinierte KI-Muster\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backl", "pk": "SDRv4", "tc": "FEAT"}, {"id": 306, "title": "AI Pattern Built-in Types — Vorgefertigte Aussprachregeln", "desc": "# FEAT-059: AI Pattern Built-in Types — Vorgefertigte Aussprachregeln\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** ba", "pk": "SDRv4", "tc": "FEAT"}, {"id": 109, "title": "AI Pattern Replacement Engine — Kontextabhängige Aussprachkorrektur", "desc": "# FEAT-058: AI Pattern Replacement Engine — Kontextabhängige Aussprachkorrektur\n\n**Typ:** feature\n**Priorität:** P1\n**St", "pk": "SDRv4", "tc": "FEAT"}, {"id": 382, "title": "Bot Token Billing — Budget & Owner/Requester", "desc": "# FEAT-057: Bot Token Billing — Budget & Owner/Requester\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog\n**Abhän", "pk": "SDRv4", "tc": "FEAT"}, {"id": 381, "title": "Multi-Currency Display — Exchange Rates", "desc": "# FEAT-056: Multi-Currency Display — Exchange Rates\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog\n**Abhängigke", "pk": "SDRv4", "tc": "FEAT"}, {"id": 380, "title": "Token Dashboard — Admin & User UI", "desc": "# FEAT-055: Token Dashboard — Admin & User UI\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog\n**Abhängigkeiten:*", "pk": "SDRv4", "tc": "FEAT"}, {"id": 375, "title": "Token Packages — Kauf & Gutschriften", "desc": "# FEAT-054: Token Packages — Kauf & Gutschriften\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog\n**Abhängigkeite", "pk": "SDRv4", "tc": "FEAT"}, {"id": 377, "title": "Token Model Pricing — Tiers & Per-Model Preise", "desc": "# FEAT-053: Token Model Pricing — Tiers & Per-Model Preise\n\n**Typ:** feature\n**Priorität:** P1\n**Status:** backlog\n**Abh", "pk": "SDRv4", "tc": "FEAT"}, {"id": 376, "title": "Token Economy Core — Accounts, Transactions, Debit Pipeline", "desc": "# FEAT-052: Token Economy Core — Accounts, Transactions, Debit Pipeline\n\n**Typ:** feature\n**Priorität:** P1\n**Status:** ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 218, "title": "Ticket → Asana + Trello Bidirektional Sync", "desc": "# FEAT-051: Ticket → Asana + Trello Bidirektional Sync\n\n**Typ:** feature\n**Priorität:** P1\n**Status:** backlog\n**Abhängi", "pk": "SDRv4", "tc": "FEAT"}, {"id": 313, "title": "AI Voice Bot Testing Arena (Multi-Modell Simulation)", "desc": "# FEAT-050: AI Voice Bot Testing Arena (Multi-Modell Simulation)\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog", "pk": "SDRv4", "tc": "FEAT"}, {"id": 373, "title": "Lead-Scraper — Öffnungszeiten ermitteln", "desc": "# FEAT-049: Lead-Scraper — Öffnungszeiten ermitteln\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog\n**Abhängigke", "pk": "SDRv4", "tc": "FEAT"}, {"id": 372, "title": "Öffnungszeiten für Unternehmen", "desc": "# FEAT-048: Öffnungszeiten für Unternehmen\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog\n**Abhängigkeiten:** —", "pk": "SDRv4", "tc": "FEAT"}, {"id": 210, "title": "Custom Fields komplett (UI + alle Entities + Import)", "desc": "# FEAT-047: Custom Fields komplett (UI + alle Entities + Import)\n\n**Typ:** feature\n**Priorität:** P1\n**Status:** done\n**", "pk": "SDRv4", "tc": "FEAT"}, {"id": 217, "title": "Stream Replace — LLM-Stream Aussprachkorrektur", "desc": "# FEAT-046: Stream Replace — LLM-Stream Aussprachkorrektur\n\n**Typ:** feature\n**Priorität:** P1\n**Status:** done\n**Abhäng", "pk": "SDRv4", "tc": "FEAT"}, {"id": 209, "title": "Universal Import/Export Engine", "desc": "# FEAT-045: Universal Import/Export Engine\n\n**Typ:** feature\n**Priorität:** P1\n**Status:** backlog\n**Abhängigkeiten:** —", "pk": "SDRv4", "tc": "FEAT"}, {"id": 216, "title": "i18n Language Installer — KI-gestützte Sprachgenerierung", "desc": "# FEAT-044: i18n Language Installer — KI-gestützte Sprachgenerierung\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** bac", "pk": "SDRv4", "tc": "FEAT"}, {"id": 108, "title": "Bot Entities — Multi-Bot Management", "desc": "# FEAT-043: Bot Entities — Multi-Bot Management\n\n**Typ:** feature\n**Priorität:** P1\n**Status:** replaced\n**Ersetzt durch", "pk": "SDRv4", "tc": "FEAT"}, {"id": 299, "title": "Channel Adapter: Telegram", "desc": "# FEAT-039: Channel Adapter: Telegram\n\n**Typ:** feature\n**Priorität:** P1\n**Status:** done\n**Abhängigkeiten:** FEAT-038,", "pk": "SDRv4", "tc": "FEAT"}, {"id": 107, "title": "Chat Channels — Abstraktion & Message Routing", "desc": "# FEAT-038: Chat Channels — Abstraktion & Message Routing\n\n**Typ:** feature\n**Priorität:** P1\n**Status:** done\n**Abhängi", "pk": "SDRv4", "tc": "FEAT"}, {"id": 213, "title": "Claude Sprint Partner Bot", "desc": "# FEAT-037: Claude Sprint Partner Bot\n\n**Typ:** feature\n**Priorität:** P1\n**Status:** replaced\n**Ersetzt durch:** FEAT-1", "pk": "SDRv4", "tc": "FEAT"}, {"id": 127, "title": "Produktkatalog & Produktgruppen", "desc": "# FEAT-036: Produktkatalog & Produktgruppen\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog\n**Abhängigkeiten:** ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 312, "title": "Third-Party API Compliance & Disclaimer System", "desc": "# FEAT-035: Third-Party API Compliance & Disclaimer System\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog\n**Abh", "pk": "SDRv4", "tc": "FEAT"}, {"id": 114, "title": "BYOK Pricing — Platform Fee Modell", "desc": "# FEAT-034: BYOK Pricing — Platform Fee Modell\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog\n**Abhängigkeiten:", "pk": "SDRv4", "tc": "FEAT"}, {"id": 102, "title": "Custom Provider Endpoints", "desc": "# FEAT-033: Custom Provider Endpoints\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog\n**Abhängigkeiten:** FEAT-0", "pk": "SDRv4", "tc": "FEAT"}, {"id": 328, "title": "BYOK — Bring Your Own API Keys", "desc": "# FEAT-032: BYOK — Bring Your Own API Keys\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog\n**Abhängigkeiten:** F", "pk": "SDRv4", "tc": "FEAT"}, {"id": 126, "title": "Payment Gateway & Credit Purchase (Multi-Provider)", "desc": "# FEAT-031: Payment Gateway & Credit Purchase (Multi-Provider)\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog\n*", "pk": "SDRv4", "tc": "FEAT"}, {"id": 370, "title": "WhatsApp Voice Calls (LiveKit-Fallback)", "desc": "# FEAT-030: WhatsApp Voice Calls (LiveKit-Fallback)\n\n**Typ:** feature\n**Priorität:** P3\n**Status:** backlog\n**Abhängigke", "pk": "SDRv4", "tc": "FEAT"}, {"id": 369, "title": "Telegram Voice Calls (tgcalls + LiveKit)", "desc": "# FEAT-029: Telegram Voice Calls (tgcalls + LiveKit)\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog\n**Abhängigk", "pk": "SDRv4", "tc": "FEAT"}, {"id": 368, "title": "Unified AI Gateway", "desc": "# FEAT-028: Unified AI Gateway\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog\n**Abhängigkeiten:** —\n**Epic:** A", "pk": "SDRv4", "tc": "FEAT"}, {"id": 215, "title": "WhatsApp Bot Channel", "desc": "# FEAT-027: WhatsApp Bot Channel\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog\n**Abhängigkeiten:** FEAT-024, F", "pk": "SDRv4", "tc": "FEAT"}, {"id": 208, "title": "Bot Voice Messages (ASR + TTS + Transkription)", "desc": "# FEAT-026: Bot Voice Messages (ASR + TTS + Transkription)\n\n**Typ:** feature\n**Priorität:** P1\n**Status:** backlog\n**Abh", "pk": "SDRv4", "tc": "FEAT"}, {"id": 202, "title": "Chat-Sync Bidirektional (Telegram ↔ Senity Dashboard)", "desc": "# FEAT-025: Chat-Sync Bidirektional (Telegram ↔ Senity Dashboard)\n\n**Typ:** feature\n**Priorität:** P1\n**Status:** backlo", "pk": "SDRv4", "tc": "FEAT"}, {"id": 197, "title": "Telegram Bot Core", "desc": "# FEAT-024: Telegram Bot Core\n\n**Typ:** feature\n**Priorität:** P1\n**Status:** done\n**Abhängigkeiten:** ~RES-001\n**Epic:*", "pk": "SDRv4", "tc": "FEAT"}, {"id": 367, "title": "\"Wunsch dir was\" — Feature-Request-System", "desc": "# FEAT-023: \"Wunsch dir was\" — Feature-Request-System\n\n**Typ:** feature\n**Priorität:** P3\n**Status:** backlog\n**Erstellt", "pk": "SDRv4", "tc": "FEAT"}, {"id": 366, "title": "Codex Unified CLI Migration", "desc": "# FEAT-022: Codex Unified CLI Migration\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** done\n**superseded_by:** FEAT-190", "pk": "SDRv4", "tc": "FEAT"}, {"id": 365, "title": "AI Management & Billing System", "desc": "# FEAT-021: AI Management & Billing System\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** done\n**superseded_by:** FEAT-", "pk": "SDRv4", "tc": "FEAT"}, {"id": 364, "title": "Agentic Workflow Docker + AI Runtime Isolation", "desc": "# FEAT-020: Agentic Workflow Docker + AI Runtime Isolation\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** done\n**supers", "pk": "SDRv4", "tc": "FEAT"}, {"id": 265, "title": "Datenmodell-Refactoring", "desc": "# FEAT-019: Datenmodell-Refactoring\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog\n**Erstellt:** 2026-04-03\n**A", "pk": "SDRv4", "tc": "FEAT"}, {"id": 360, "title": "Multi-Value Contact Data (E-Mail, Telefon, Adressen)", "desc": "# FEAT-018: Multi-Value Contact Data (E-Mail, Telefon, Adressen)\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog", "pk": "SDRv4", "tc": "FEAT"}, {"id": 354, "title": "DSGVO-Dokumenten-Verwaltung", "desc": "# FEAT-017: DSGVO-Dokumenten-Verwaltung\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog\n**Erstellt:** 2026-04-03", "pk": "SDRv4", "tc": "FEAT"}, {"id": 363, "title": "Company Groups (Unternehmensgruppen)", "desc": "# FEAT-016: Company Groups (Unternehmensgruppen)\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog\n**Erstellt:** 2", "pk": "SDRv4", "tc": "FEAT"}, {"id": 362, "title": "Navigation neu organisieren", "desc": "# FEAT-015: Navigation neu organisieren\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog\n**Erstellt:** 2026-04-03", "pk": "SDRv4", "tc": "FEAT"}, {"id": 355, "title": "Prompt Types einführen", "desc": "# FEAT-014: Prompt Types einführen\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog\n**Erstellt:** 2026-04-03\n**Ab", "pk": "SDRv4", "tc": "FEAT"}, {"id": 353, "title": "Lead Scraper — Flexiblere Konfiguration", "desc": "# FEAT-013: Lead Scraper — Flexiblere Konfiguration\n\n**Typ:** feature\n**Priorität:** P2\n**Status:** backlog\n**Erstellt:*", "pk": "SDRv4", "tc": "FEAT"}, {"id": 195, "title": "Lead Scraper — Automatische Vertriebslisten", "desc": "# FEAT-012: Lead Scraper — Automatische Vertriebslisten\n\n**Typ:** feature\n**Priorität:** P1\n**Status:** done\n**Erstellt:", "pk": "SDRv4", "tc": "FEAT"}, {"id": 196, "title": "Lead Scraper — LinkedIn-Schnittstelle", "desc": "# FEAT-011: Lead Scraper — LinkedIn-Schnittstelle\n\n**Typ:** feature\n**Priorität:** P1\n**Status:** backlog\n**Erstellt:** ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 160, "title": "Lead Scraper — Handelsregister-Schnittstelle", "desc": "# FEAT-010: Lead Scraper — Handelsregister-Schnittstelle\n\n**Typ:** feature\n**Priorität:** P0\n**Status:** done\n**Erstellt", "pk": "SDRv4", "tc": "FEAT"}, {"id": 293, "title": "Model-Debate-Mechanismus + /think Mode", "desc": "# FEAT-009: Model-Debate + /think Mode\n\n**Idee:** Zwei Modelle diskutieren miteinander — ähnlich wie Extended Thinking, ", "pk": "SDRv4", "tc": "FEAT"}, {"id": 112, "title": "Prompt-Review und Flagging-System", "desc": "# FEAT-008: Prompt-Review und Flagging-System\n\n**Ziel:** System stellt sicher, dass Prompts reviewd und kategorisiert we", "pk": "SDRv4", "tc": "FEAT"}, {"id": 136, "title": "CLI-Sandbox-Architektur (Codex/Claude/Ollama)", "desc": "# FEAT-007: CLI-Sandbox-Architektur\n\n**Ziel:** Chat-Komponente in FlexibleJSTools unterstützt CLI-Terminal-Type mit Sand", "pk": "SDRv4", "tc": "FEAT"}, {"id": 204, "title": "Newsletter-Automatisierung", "desc": "# FEAT-006: Newsletter-Automatisierung\n\n**Ziel:** Automatisierte Newsletter-Erstellung und -Versand.\n\n## Scope (zu detai", "pk": "SDRv4", "tc": "FEAT"}, {"id": 123, "title": "Social Media Marketing Automation", "desc": "# FEAT-005: Social Media Marketing Automation\n\n**Ziel:** Automatisiertes Social Media Marketing für Kundengewinnung.\n\n##", "pk": "SDRv4", "tc": "FEAT"}, {"id": 117, "title": "Cold-Email-Automation", "desc": "# FEAT-004: Cold-Email-Automation\n\n**Ziel:** System versendet selbstständig personalisierte Cold-Emails an Leads.\n\n## Sc", "pk": "SDRv4", "tc": "FEAT"}, {"id": 106, "title": "Autonome Opening Calls mit Skript-Engine", "desc": "# FEAT-003: Autonome Opening Calls\n\n**Ziel:** KI führt selbstständig Erstgespräche nach hinterlegtem Skript.\n\n## Scope\n\n", "pk": "SDRv4", "tc": "FEAT"}, {"id": 205, "title": "SIP-Provider-Integration (Multi-Provider)", "desc": "# FEAT-002: SIP-Provider-Integration\n\n**Ziel:** Mehrere SIP-Provider anbinden für Flexibilität und Redundanz.\n\n## Provid", "pk": "SDRv4", "tc": "FEAT"}, {"id": 125, "title": "LiveKit Voice-Chat MVP", "desc": "# FEAT-001: LiveKit Voice-Chat MVP\n\n**Plan v2:** `.tasks/archiv/plans/2026-04-03-livekit-voice-chat-mvp.md`\n\n## MVP-Defi", "pk": "SDRv4", "tc": "FEAT"}, {"id": 207, "title": "Gmail-Rechnungs-Extraktor via Google Apps Script (Phase 1)", "desc": "## Ziel\n\nStandalone Google Apps Script das historische + neue Rechnungen aus dem Gmail-Postfach des Users extrahiert, vi", "pk": "SDRv4", "tc": "CHO"}, {"id": 118, "title": "Migrationen 073-075 gegen Supabase ausführen (Lizenz + Memory Palace + API-Tickets)", "desc": "## Ziel\n\nDie drei SQL-Migrationen für FEAT-237 gegen die Supabase-Datenbank ausführen und als ausgeführt markieren.\n\n## ", "pk": "SDRv4", "tc": "CHO"}, {"id": 203, "title": "\"Terminal\" projektweite Umbenennung zu \"Senity CLI\"", "desc": "# CHO-015 — \"Terminal\" projektweite Umbenennung zu \"Senity CLI\"\n\n**Typ:** chore\n**Priorität:** P2\n**Status:** backlog\n**", "pk": "SDRv4", "tc": "CHO"}, {"id": 194, "title": "Telegram-Erinnerung Rick — Northdata.de beim ersten Chat ansprechen", "desc": "# CHO-014: Telegram-Erinnerung Rick — Northdata.de beim ersten Chat ansprechen\n\n**Typ:** chore\n**Priorität:** P1\n**Statu", "pk": "SDRv4", "tc": "CHO"}, {"id": 189, "title": "Ticket-System Cleanup — Duplikate, Prioritäten, Archivierung", "desc": "# CHO-013: Ticket-System Cleanup — Duplikate, Prioritäten, Archivierung\n\n**Typ:** chore\n**Priorität:** P1\n**Status:** re", "pk": "SDRv4", "tc": "CHO"}, {"id": 199, "title": "Kontaktdaten per WhatsApp an Burger Bulle senden", "desc": "# Kontaktdaten per WhatsApp an Burger Bulle senden\n\n## Kontext\nAus Gesprächsprotokoll vom 2026-04-05. Im Meeting-Chat ko", "pk": "SDRv4", "tc": "CHO"}, {"id": 200, "title": "[extern] IT-Team Kontakt von Burger Bulle herstellen", "desc": "# [extern] IT-Team Kontakt von Burger Bulle herstellen\n\n## Kontext\nAus Gesprächsprotokoll vom 2026-04-05. Burger Bulle n", "pk": "SDRv4", "tc": "CHO"}, {"id": 201, "title": "[extern] Speisekarten + Marketingmaterial von Burger Bulle anfordern", "desc": "# [extern] Speisekarten + Marketingmaterial von Burger Bulle anfordern\n\n## Kontext\nAus Gesprächsprotokoll vom 2026-04-05", "pk": "SDRv4", "tc": "CHO"}, {"id": 359, "title": "Rick Rechnung schreiben 20 EUR für Twilio", "desc": "# CHO-009: Rick Rechnung schreiben 20 EUR für Twilio\n\n**Typ:** chore\n**Priorität:** P2\n**Status:** moved → Senity Allgem", "pk": "SDRv4", "tc": "CHO"}, {"id": 356, "title": "Twilio Funds Rechnung an Rick oder Timo", "desc": "# CHO-008: Twilio Funds Rechnung an Rick oder Timo\n\n**Typ:** chore\n**Priorität:** P2\n**Status:** moved → Senity Allgemei", "pk": "SDRv4", "tc": "CHO"}, {"id": 193, "title": "Email an Marco — Erwartungen an Timo als Product Owner", "desc": "# CHO-007: Email an Marco — Erwartungen an Timo als Product Owner\n\n| Feld | Wert |\n|------|------|\n| Typ | chore |\n| Pri", "pk": "SDRv4", "tc": "CHO"}, {"id": 358, "title": "Ticket-Duplikate im Token-Economy-Epic bereinigen", "desc": "# CHO-006: Ticket-Duplikate im Token-Economy-Epic bereinigen\n\n**Typ:** chore\n**Priorität:** P3\n**Status:** backlog\n**Epi", "pk": "SDRv4", "tc": "CHO"}, {"id": 198, "title": "Unsloth GGUF-Modelle beschaffen + llama.cpp auf Senity-Infra", "desc": "# CHO-005 — Unsloth GGUF-Modelle beschaffen + llama.cpp auf Senity-Infra\n\n**Typ:** chore | **Prio:** P2 | **Status:** ba", "pk": "SDRv4", "tc": "CHO"}, {"id": 357, "title": "Twilio SMS Webhook-URL konfigurieren", "desc": "# CHO-004: Twilio SMS Webhook-URL konfigurieren\n\n**Typ:** chore\n**Prio:** P2\n**Status:** backlog\n**Abhängigkeiten:** FEA", "pk": "SDRv4", "tc": "CHO"}, {"id": 159, "title": "DB-Migration 054 (Bot-Plattform) ausführen", "desc": "# CHO-003: DB-Migration 054 (Bot-Plattform) ausführen\n\n**Typ:** chore\n**Prio:** P0\n**Status:** done\n**Abhängigkeiten:** ", "pk": "SDRv4", "tc": "CHO"}, {"id": 361, "title": "@murc134/channels publishen + SDRv4 Import-Migration", "desc": "# CHO-002: @murc134/channels publishen + SDRv4 Import-Migration\n\n**Typ:** chore\n**Prio:** P1\n**Status:** backlog\n**Abhän", "pk": "SDRv4", "tc": "CHO"}, {"id": 188, "title": "Server-Deployment — Telegram Bot aktivieren", "desc": "# CHO-001: Server-Deployment — Telegram Bot aktivieren\n\n**Typ:** chore\n**Priorität:** P1\n**Status:** backlog\n**Abhängigk", "pk": "SDRv4", "tc": "CHO"}, {"id": 163, "title": "Preise zeigen Euro (€) statt Senity Tokens im Fallback-Reihenfolge-Screen", "desc": "## Problem\n\nIm Model-Management unter \"Chat LLM — Fallback-Reihenfolge\" werden Kosten und Preise der Provider in Euro (€", "pk": "SDRv4", "tc": "BUG"}, {"id": 191, "title": "offeneregister.de API offline — DNS-Fehler + 502", "desc": "# BUG-034: offeneregister.de API offline — DNS-Fehler + 502\n\n**Typ:** bug\n**Priorität:** P1\n**Status:** backlog\n**Erstel", "pk": "SDRv4", "tc": "BUG"}, {"id": 190, "title": "Lead Scraper: fehlende i18n-Keys im Lösch-Dialog (Delete Search)", "desc": "# BUG-033 — Lead Scraper: fehlende i18n-Keys im Lösch-Dialog (Delete Search)\n\n**Typ:** bug\n**Status:** review\n**Prioritä", "pk": "SDRv4", "tc": "BUG"}, {"id": 100, "title": "Navigation zeigt \"Bots\" — muss auf neues Kanäle-Konzept umgestellt werden", "desc": "## Beschreibung\n\nIn der Sidebar-Navigation taucht noch der Menüpunkt \"Bots\" auf. Das widerspricht dem neuen Architektur-", "pk": "SDRv4", "tc": "BUG"}, {"id": 144, "title": "AI Workspace — Status-Anzeige falsch (online/offline) + Name nicht lesbar im Dropdown", "desc": "## Beschreibung\n\nMehrere Probleme mit der Status-Anzeige und dem Namen von AI Workspaces:\n\n1. **Falscher Status:** AI Wo", "pk": "SDRv4", "tc": "BUG"}, {"id": 187, "title": "Agent Registry Sync — API-Fehler beim Synchronisieren", "desc": "## Beschreibung\n\nWenn auf der `/agents/registry` Seite \"Synchronisieren\" gedrückt wird, wirft die App einen Error:\n\n```\n", "pk": "SDRv4", "tc": "BUG"}, {"id": 184, "title": "ASR-Chain: openai:whisper-1 fehlt in model_visibility, Q3ASR fehlt in asr_field-Chain", "desc": "# BUG-029: ASR-Chain: openai:whisper-1 fehlt in model_visibility, Q3ASR fehlt in asr_field-Chain\n\n**Typ:** Bug  \n**Prior", "pk": "SDRv4", "tc": "BUG"}, {"id": 269, "title": "Telegram → Claude Code CLI — Vollständiger Debugging-Report", "desc": "## Ziel\n\nTelegram-Nachricht → SDRv4 Container → Claude Code CLI → Antwort zurück.\nDer User sendet über Telegram, Claude ", "pk": "SDRv4", "tc": "BUG"}, {"id": 327, "title": "500-Fehler bei Trello-Verbindung in /boards/settings", "desc": "# BUG-026: 500-Fehler bei Trello-Verbindung in /boards/settings\n\n**Status:** review\n**Priorität:** P1\n**Erstellt:** 2026", "pk": "SDRv4", "tc": "BUG"}, {"id": 99, "title": "Trello-Boards nicht in Boards-Übersicht sichtbar (BoardDiscoveryDialog fehlt)", "desc": "## Problem\n\nTrello-Boards werden unter `/boards` nicht angezeigt. Der `BoardDiscoveryDialog` ist zwar implementiert, wir", "pk": "SDRv4", "tc": "BUG"}, {"id": 183, "title": "WorkspaceFileExplorer 502 Double-Invoke + Stale Server-Status", "desc": "# BUG-024: WorkspaceFileExplorer 502 Double-Invoke + Stale Server-Status\n\n**Typ:** bug  \n**Priorität:** P1  \n**Status:**", "pk": "SDRv4", "tc": "BUG"}, {"id": 186, "title": "CLI Session löschen schlägt fehl", "desc": "# BUG-023: CLI Session löschen schlägt fehl\n\n**Typ:** bug\n**Prio:** P1\n**Status:** review\n**Erstellt:** 2026-04-06\n\n## B", "pk": "SDRv4", "tc": "BUG"}, {"id": 182, "title": "Bot meldet sich mit falschem Namen", "desc": "# BUG-021: Bot meldet sich mit falschem Namen\n\n**Typ:** bug\n**Priorität:** P1\n**Status:** backlog\n**Abhängigkeiten:** —\n", "pk": "SDRv4", "tc": "BUG"}, {"id": 181, "title": "Zu krasse/unnatürliche Betonung", "desc": "# BUG-020: Zu krasse/unnatürliche Betonung\n\n**Typ:** bug\n**Priorität:** P1\n**Status:** backlog\n**Abhängigkeiten:** FEAT-", "pk": "SDRv4", "tc": "BUG"}, {"id": 180, "title": "Wiederholte Bestätigungsfragen \"Stimmt das?\"", "desc": "# BUG-019: Wiederholte Bestätigungsfragen \"Stimmt das?\"\n\n**Typ:** bug\n**Priorität:** P1\n**Status:** backlog\n**Abhängigke", "pk": "SDRv4", "tc": "BUG"}, {"id": 179, "title": "Bot legt unerwartet auf", "desc": "# BUG-018: Bot legt unerwartet auf\n\n**Typ:** bug\n**Priorität:** P1\n**Status:** backlog\n**Abhängigkeiten:** —\n**Epic:** V", "pk": "SDRv4", "tc": "BUG"}, {"id": 178, "title": "Bot spricht in 3. Person über den User", "desc": "# BUG-017: Bot spricht in 3. Person über den User\n\n**Typ:** bug\n**Priorität:** P1\n**Status:** backlog\n**Abhängigkeiten:*", "pk": "SDRv4", "tc": "BUG"}, {"id": 177, "title": "Kontext-Logik fehlt — Plausibilitätsprüfung", "desc": "# BUG-016: Kontext-Logik fehlt — Plausibilitätsprüfung\n\n**Typ:** bug\n**Priorität:** P1\n**Status:** backlog\n**Abhängigkei", "pk": "SDRv4", "tc": "BUG"}, {"id": 176, "title": "\"Nein\" wird falsch interpretiert", "desc": "# BUG-015: \"Nein\" wird falsch interpretiert\n\n**Typ:** bug\n**Priorität:** P1\n**Status:** backlog\n**Abhängigkeiten:** —\n**", "pk": "SDRv4", "tc": "BUG"}, {"id": 175, "title": "Template-Variablen werden wörtlich ausgesprochen", "desc": "# BUG-014: Template-Variablen werden wörtlich ausgesprochen\n\n**Typ:** bug\n**Priorität:** P1\n**Status:** backlog\n**Abhäng", "pk": "SDRv4", "tc": "BUG"}, {"id": 173, "title": "\"Goodbye\" statt \"Tschüss\" — englische Verabschiedung", "desc": "# BUG-013: \"Goodbye\" statt \"Tschüss\" — englische Verabschiedung\n\n**Typ:** bug\n**Priorität:** P1\n**Status:** backlog\n**Ab", "pk": "SDRv4", "tc": "BUG"}, {"id": 172, "title": "Verschluckte Wörter — Sätze unvollständig", "desc": "# BUG-012: Verschluckte Wörter — Sätze unvollständig\n\n**Typ:** bug\n**Priorität:** P1\n**Status:** backlog\n**Abhängigkeite", "pk": "SDRv4", "tc": "BUG"}, {"id": 171, "title": "Zu lange Pausen zwischen Antworten", "desc": "# BUG-011: Zu lange Pausen zwischen Antworten\n\n**Typ:** bug\n**Priorität:** P1\n**Status:** backlog\n**Abhängigkeiten:** FE", "pk": "SDRv4", "tc": "BUG"}, {"id": 168, "title": "Umlaut-Aussprache — ä/ö/ü/ß werden als ae/oe/ue/ss gesprochen", "desc": "# BUG-010: Umlaut-Aussprache — ä/ö/ü/ß werden als ae/oe/ue/ss gesprochen\n\n**Typ:** bug\n**Priorität:** P1\n**Status:** bac", "pk": "SDRv4", "tc": "BUG"}, {"id": 170, "title": "Nicht-Admin kann keine User erstellen oder bearbeiten", "desc": "# BUG-009: Nicht-Admin kann keine User erstellen oder bearbeiten\n\n**Typ:** bug\n**Priorität:** P1\n**Status:** backlog\n**A", "pk": "SDRv4", "tc": "BUG"}, {"id": 174, "title": "PATH-Hijacking in CLI-Spawns — Fake-Binary-Ausführung", "desc": "# BUG-008: PATH-Hijacking in CLI-Spawns — Fake-Binary-Ausführung\n\n**Typ:** bug\n**Priorität:** P1 (HIGH)\n**Status:** back", "pk": "SDRv4", "tc": "BUG"}, {"id": 352, "title": "HTTP_PROXY in CLI-Env-Allowlist — API-Key-Exfiltration möglich", "desc": "# BUG-007: HTTP_PROXY in CLI-Env-Allowlist — API-Key-Exfiltration möglich\n\n**Typ:** bug\n**Priorität:** P1 (HIGH)\n**Statu", "pk": "SDRv4", "tc": "BUG"}, {"id": 506, "title": "CLI Auth & Validation Bypasses (Export-Route, processId, Model-ID)", "desc": "# BUG-005: CLI Auth & Validation Bypasses (Export-Route, processId, Model-ID)\n\n**Typ:** bug\n**Priorität:** P0 (CRITICAL)", "pk": "SDRv4", "tc": "BUG"}, {"id": 164, "title": "CLI Environment Variable Leakage — Allowlist statt Blacklist", "desc": "# BUG-004: CLI Environment Variable Leakage — Allowlist statt Blacklist\n\n**Typ:** bug\n**Priorität:** P0 (CRITICAL)\n**Sta", "pk": "SDRv4", "tc": "BUG"}, {"id": 167, "title": "Lead-Scraper Bugfixes & Architektur-Überarbeitung", "desc": "# BUG-003: Lead-Scraper Bugfixes & Architektur-Überarbeitung\n\n**Typ:** bug\n**Priorität:** P1\n**Abstufung:** 2026-04-09 —", "pk": "SDRv4", "tc": "BUG"}, {"id": 166, "title": "Website Crawl für Wissensdatenbank kaputt", "desc": "# BUG-002: Website Crawl für Wissensdatenbank kaputt\n\n**Typ:** bug\n**Priorität:** P1\n**Status:** backlog\n**Erstellt:** 2", "pk": "SDRv4", "tc": "BUG"}, {"id": 165, "title": "Keine Adressen im Lead Scraper", "desc": "# BUG-001: Keine Adressen im Lead Scraper\n\n**Typ:** bug\n**Priorität:** P1\n**Status:** done\n**Erstellt:** 2026-04-03\n\n## ", "pk": "SDRv4", "tc": "BUG"}]