{"tickets":[{"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 \u00f6ffnet Settings nicht","desc":"## Problem\nLinksklick auf das Senity-Speech-Flow Tray-Icon \u00f6ffnet 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 (\"\u00dcbersetzung (Englisch)\") \u00fcbersetzt flaky: manchmal DE\u2192EN, oft DE\u2192DE, einmal EN\u2192DE.\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\u00f6schen k\u00f6nnen","desc":"Webhook erweitern um Tool delete_calendar_event. Aktuell kann Jarvis nur lesen und erstellen, nicht l\u00f6schen. 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\u00e4hig","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-\u00f6ffnen aus unknown_key-Dialog schliesst App ohne Relaunch","desc":"## Problem\n\nNach Eingabe eines API-Keys, den das Backend nicht kennt (HTTP 401 \u2192 `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\u00e4hrend \u00d6ffnungsanimation","desc":"## Problem\n\nRadial-Fan \u00f6ffnet sich, Nutzer klickt sofort auf einen Modus \u2013 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\u00e4gt beim ersten \u00d6ffnen fehl (cur < 0.95 Animation-Guard)","desc":"## Problem\n\nWenn der Nutzer auf den Radial-Kreis klickt, der Fan \u00f6ffnet sich, und er einen Modus w\u00e4hlt, 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\u00fc-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\u00e4rung f\u00fcr Kundengespr\u00e4che)","desc":"## Kontext\n\nMarco fragt im Namen von Timo: Timo geht gleich in ein Gespr\u00e4ch 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\u00fcber 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\u00e4ngende Features:\n\n1. **Dashboard Admin Capability** -- privilegierte User k\u00f6nnen 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\u2194markdown-code Toggle bricht, Formatierung wird nicht \u00fcbernommen (Chat-Composer)","desc":"## Symptom\n\nIm Chat-Composer (`TTSChatComposer`, /chat) l\u00e4sst sich im `TTSMarkdownTextArea` nicht zuverl\u00e4ssig 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\u00fcfen, 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\u00fcr 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\u00e4nge 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\u00e4nge 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\u00e4nge 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\u00e4nge 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\u00e4nge 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\u00e4nge 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\u00fcr senity-workspace-Submodules nachziehen","desc":"## Problem\n\nDer Workspace-Container hat aktuell nur zwei SSH-Host-Eintr\u00e4ge in `~/.ssh/config`:\n\n- `git.senity.ai` (Port ","pk":"CORE","tc":"BUG"},{"id":2115,"title":"Dateianh\u00e4nge an Tickets (Upload + \u00dcbergabe an Claude Code)","desc":"Anforderung von Christoph (Voice 2277, 2279 vom 2026-06-22):\n\nTickets sollen Dateianh\u00e4nge bekommen k\u00f6nnen. Use Case: bei","pk":"STS","tc":"FEAT"},{"id":2114,"title":"Datei-Anh\u00e4nge 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\u00dfer Hintergrund im AI Workspace (CLI-Mode)","desc":"## Problem\\n\\nIm AI Workspace (CLI-Mode, `chatMode === 'cli'`) erscheint das TTSActionPicker-Dropdown mit wei\u00dfem 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 \u2014 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 \u2014 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\u00e4sst sich bei schmalem Settings-Fenster nicht zuverl\u00e4ssig scrollen","desc":"Im Einstellungen-Tab \"Modi\" sind bei schmalerer Fensterbreite nicht alle Mode-Karten erreichbar. Der Bereich f\u00e4llt 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\u00fcr 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\u00fchren + 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\u00fcr 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) \u201eNach 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 \u00d6ffnen (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\u00fc: \u201eNach Updates suchen\"-Eintrag per Rechtsklick","desc":"## Feature\n\nRechtsklick auf das Tray-Icon soll neben den bestehenden Eintr\u00e4gen auch \u201eNach 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\u00fcltig 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\u00e4gen","desc":"## Problem\n\nWenn das History-Fenster ge\u00f6ffnet 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\u00fcr JEDEN auth","pk":"SDRv4","tc":"KNOWLEDGE"},{"id":2080,"title":"#2042 (Migration 183 Soft-Delete) nicht auf Live deployed \u2014 Code+Migration zusammen ausrollen","desc":"## Problem\n\nBei der Live-Login-Diagnose (#2078) festgestellt: Die in #2042 eingef\u00fchrte Migration **183** (DSGVO-Art-18 S","pk":"SDRv4","tc":"CHO"},{"id":2078,"title":"Live-SDR: GoTrue-SMTP kaputt \u2014 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 \u201eKI & 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\u00fcr 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 \u00fcber Senity Speedstop bei der Berliner Zeitung als Autoren posten","desc":"Wir wollen als Senity einen Artikel \u00fcber Senity Speedstop bei der Berliner Zeitung publizieren (Autoren-Posting). Aufgab","pk":"CORE","tc":"FEAT"},{"id":2067,"title":"Gastartikel bei Berliner Zeitung \u00fcber Senity Speedstop platzieren","desc":"Auftrag von Chris (Telegram msg 2240, 2026-06-19):\n\n> Machen wir bitte ein Ticket daf\u00fcr, dass wir bei der Berliner Zeitu","pk":"SWS","tc":"CHO"},{"id":2066,"title":"Gastartikel bei Berliner Zeitung \u00fcber Senity Speedstop platzieren","desc":"Auftrag von Chris (Telegram msg 2240, 2026-06-19):\n\n> Machen wir bitte ein Ticket daf\u00fcr, dass wir bei der Berliner Zeitu","pk":"SWS","tc":"CHO"},{"id":2065,"title":"Deploy-Keys / Read-Zugriff f\u00fcr 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\u00fcndeln, Struktur verbessern","desc":"## Problem\n\nDer Settings-Dialog hat strukturelle UX-M\u00e4ngel:\n\n1. **Allgemein-Tab**: ASR-Auswahl \u2192 LLM-Auswahl \u2192 dann pl\u00f6t","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\u00e4dt die native `llama-cpp-python`-Runtime aus dem signierten `runtime.json` \u00fcber 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\u00f6schung ohne Refund)","desc":"## Ziel\n\nEigene, admin-freischaltbare \u00dcbersichtsseite im SDR fuer Kunden, die zwar als Benutzer angelegt sind, den SDR a","pk":"SDRv4","tc":"FEAT"},{"id":2041,"title":"Settings: Schlie\u00dfen-Button entfernen, Speichern startet App neu + \u00f6ffnet Einstellungen wieder","desc":"## Anforderung (User, Christoph)\n\n> mir ist leider negativ aufgefallen, dass SpeechFlow sich schlie\u00dft, 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 \u201eEinstellungen 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 \u201eServer 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 \u2014 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\u00fcr Kunden \u00fcber 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\u00e4tzlich 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\u00fcfen (x64 / ARM64 / Min-OS), Universal-Frage kl\u00e4ren","desc":"## Kontext\n\nFolgeticket aus #1956 (Auto-Update). Analog zur Mac-Arch-Frage (#Mac-Split) muss gekl\u00e4rt 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\u00fcfen (#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\u00fcndeln, 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\u00e4uschung (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-\u00dcbertragung (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\u00fcnglich 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\u00e4ndig: 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\u00e4rten (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\u00e4uft \u00fcber /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\u00f6nlichkeit in /api/chat/personalities ausweisen (f\u00fcr SpeechFlow-Mode-Picker)","desc":"## Kontext\n\nSpeechFlow (SPEECH-1866) l\u00e4sst den User pro Mode eine SDR-Chatpers\u00f6nlichkeit ausw\u00e4hlen. 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\u00c3\u00bcndelt, 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\u00f6sungs-Kaskade bei Mehrfach-Diktat (macOS): App triggert sich \u00fcber simulierte Tastatur selbst","desc":"Beim Mehrfach-Diktat-Test (#1864) triggerte sich die App auf macOS bei schnellem Hotkey-Dr\u00fccken selbst: Emoji-Viewer (Ct","pk":"SPEECH","tc":"BUG"},{"id":1864,"title":"Aufnahme-Finalisierung erst im Worker-Thread: Folge-Diktate werden verl\u00e4ngert / paralleler Mic-Stream","desc":"Bei mehreren Diktaten in schneller Folge wurde die zweite Aufnahme verl\u00e4ngert (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\u00fcr Unified Channel Chat (Live-E2E)","desc":"Folgearbeit zu #1850 (Unified Channel Chat, Epic #1811). Der Code f\u00fcr 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\u00fcck: 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\u00fcr 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\u00fcr 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\u00fcr 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 \u2014 kein SSH-Tunnel n\u00f6tig","desc":"## Problem\n\nQ3TTS-Dienst war lokal nur \u00fcber 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(/[\u0300-\u036f]/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\u00e4gt 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\u00fcnscht 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\u00f6schen-But","pk":"SPEECH","tc":"IMP"},{"id":1827,"title":"Windows-Taste w\u00e4hrend Push-to-Talk unterdr\u00fccken (prevent default, Startmen\u00fc/Suche \u00f6ffnet sich)","desc":"## Problem\n\nUser-Report mit Screenshot (2026-06-10): W\u00e4hrend der Hotkey (Strg + Windows-Taste) f\u00fcr 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 \u00fcberall 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-\u00dcberarbeitung: Bestandsaufnahme + Redesign-Plan (Settings, Picker, Radial-Overlay, Toasts, History)","desc":"## Ziel\n\nVollst\u00e4ndige \u00dcberarbeitung 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) \u2014 Lehren aus der v70-v78-Debugging-Session","desc":"Erkenntnisse vom 2026-06-10 (Radial-Overlay-Portierung auf macOS, 3-Monitor-Setup). Drei unabh\u00e4ngige 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\u00e4ten, Chat-API, CLI-Workspace, Server-Provisioning, Lizenzen, Kan\u00e4le/Telegram, FlexibleNodeJSTools","desc":"Paralleles Read-Only-Review mit 9 spezialisierten Fable-Agenten (6 SDRv4-Dom\u00e4nen + 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\u00e4ndig implementieren (Phase 2+3)","desc":"Brainstorming f\u00fcr 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\u00e4hrend laufender Aufnahme (v58-Hang)","desc":"## Symptom\n\nBuild v58: Klick auf das Senity-Logo-Medaillon w\u00e4hrend einer laufenden Aufnahme friert das Radial-Overlay ko","pk":"SPEECH","tc":"BUG"},{"id":1762,"title":"Speech-Flow-Client: Lizenz-Pr\u00fcfung beim Start gegen /api/license/verify (Ed25519, Sliding-Window, Offline-Grace)","desc":"## Kontext (f\u00fcr die Speech-Flow-Session, eigenst\u00e4ndig lesbar)\n\nAuf SDRv4-Seite ist das produkt\u00fcbergreifende 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\u00e4nglich","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\u00fcr Claude/GPT-4o/Gemini, inferCapabilities(provider, model) nutzen","desc":"## Problem\n\n`detectCapabilities(providerId, modelId)` aus `@murc134/llm` (src/capabilities.ts) liefert f\u00fcr moderne Multi","pk":"FLEX","tc":"KNOWLEDGE"},{"id":1757,"title":"Native Vision im Chat: Bild-Anh\u00e4nge direkt an vision-f\u00e4higes Chat-Modell durchreichen","desc":"## Ziel\n\nBild-Anh\u00e4nge im SDR-Chat sollen, wenn das konfigurierte Chat-Modell selbst Vision-f\u00e4hig 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 \u00fcber 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\u00fccke: 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\u00e4hlbar 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\u00fcr Website-Impressum + Datenschutz (Stand 2025/2026)","desc":"## Problem\n\nBeim Erstellen von Impressum + Datenschutzerkl\u00e4rung f\u00fcr eine deutsche Website werden h\u00e4ufig veraltete Normen","pk":"WEB","tc":"KNOWLEDGE"},{"id":1735,"title":"Admin-UI: Lizenzen an Kunden ausstellen und sperren (license_type w\u00e4hlen, G\u00fcltigkeit, app_user-Bindung) (Phase 4 von #1712)","desc":"## Kontext\n\nPhase 4 des produkt\u00fcbergreifenden 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\u00e4ne nach license_type migrieren (Phase 2 von #1712)","desc":"## Kontext\n\nPhase 2 (Cleanup) des produkt\u00fcbergreifenden 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\u26a0 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\u26a0 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\u00e4t + Landing-Page Conversion","desc":"Handwerker-Kampagne Analyse (KW23):\n- 813 E-Mails versendet\n- 509 nicht zustellbar (62% Bounce) \u2014 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\u00fcck, 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\u00fcbergreifendes Lizenz-Datenmodell: license_type-Katalog + license als Pro-Kunde-Ausstellung","desc":"## Ziel\n\nSchlankes, produkt\u00fcbergreifendes 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\u00fcr 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 \u2014 Jarvis uebernimmt die ausgehende Telefon-Akquise automat","pk":"CLI","tc":"FEAT"},{"id":1708,"title":"Jarvis: Webseiten live analysieren und crawlen k\u00f6nnen","desc":"Jarvis soll URLs \u00f6ffnen und analysieren k\u00f6nnen \u2014 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\u00dfen","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\u00fcr 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\u00e4rfen","desc":"AUDIT (08.06.2026) \u2014 Gehirn / Stimme / Hand bei Jarvis (Telegram-Agent)\n\n## GEHIRN (Wissen + Kontext) \u2014 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\u00fcr 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\u00e4ngt der Telegram-Bot nur Text. Marco kann Dateien (PDF, Bilder, Word-Docs) im Chat anh\u00e4ngen \u2014 diese werden ","pk":"CLI","tc":"FEAT"},{"id":1700,"title":"WhatsApp Business API anbinden (DVAG/Kapitalanlage)","desc":"WhatsApp Business API anbinden f\u00fcr 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\u00e4t","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\u00e4tigung & Status-R\u00fcckgabe einbauen","desc":"Aktuell wei\u00df 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\u00fcr alle Tools & APIs","desc":"Ziel: Vollst\u00e4ndige Kostentransparenz \u00fcber 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\u00dfe Antwort nach E-Mail-Versand (kein Feedback sichtbar)","desc":"Nach dem Senden einer E-Mail \u00fcber den Telegram-Bot wird keine sichtbare Best\u00e4tigung angezeigt \u2014 der Bot gibt eine leere/","pk":"CLI","tc":"BUG"},{"id":1691,"title":"Telegram-Bot: Leere/wei\u00dfe R\u00fcckmeldung nach E-Mail-Versand","desc":"Nach dem Best\u00e4tigen einer E-Mail im Telegram-Bot wird keine sichtbare Erfolgsmeldung angezeigt \u2014 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\u00e4ufe, Dokumente oder Tagesfortschritte. Schni","pk":"CLI","tc":"IMP"},{"id":1689,"title":"JARVIS: Text-to-Speech Qualit\u00e4t 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\u00fcck 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\u00fcrzt 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\u00e4ch)\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\u00fcr alle Senity-Programme","desc":"Voice 1920 von Chris (2026-06-04):\n\n\u201eEs gibt einen Compliance Checker f\u00fcr den EU AI Act. Da m\u00fcssen wir unbedingt mal dr\u00fc","pk":"CORE","tc":"RESEARCH"},{"id":1678,"title":"Dashboard: Neue Farbver\u00e4nderungen implementieren","desc":"Farbschema des Dashboards \u00fcberarbeiten und modernisieren mit neuen Farbver\u00e4nderungen. Umsetzung mit hoher Priorit\u00e4t.","pk":"CLI","tc":"FEAT"},{"id":1677,"title":"Dashboard: Neue Farbver\u00e4nderungen implementieren","desc":"Neue Farbschema f\u00fcr 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, \u00e4hnlich dem in dem Video gezeigten Beispiel vom Jungen. Referenz-Design ","pk":"CLI","tc":"FEAT"},{"id":1675,"title":"JARVIS: Begr\u00fc\u00dfung nur beim Morning-Start, nicht bei jedem Aufruf","desc":"JARVIS soll \"Guten Morgen, ich bin Ihr pers\u00f6nlicher 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\u00fc\u00dfung beim Aktivieren anpassen","desc":"Bei jeder Aktivierung von JARVIS soll die Begr\u00fc\u00dfung lauten: \"Guten Morgen, ich bin Ihr pers\u00f6nlicher Assistent.\"","pk":"CLI","tc":"FEAT"},{"id":1672,"title":"Monitoring: ImmoScout24 Baufinanzierung E-Mails an 33@gmail.com","desc":"Marco m\u00f6chte 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\u00fcr klarere und schnellere Sprachausgabe","desc":"Optimierung der TTS-Engine f\u00fcr 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\u00f6chte 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\u00dfen","desc":"Marco hat best\u00e4tigt, dass das Problem behoben ist \u2014 JARVIS \u00f6ffnet keine weiteren Fenster mehr beim Aufruf. Ticket CLI-16","pk":"CLI","tc":"FEAT"},{"id":1668,"title":"JARVIS \u00f6ffnet bei jedem Aufruf ein neues Fenster statt bestehende Instanz zu nutzen","desc":"Bei jedem Gespr\u00e4ch mit JARVIS \u00f6ffnet 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":"\u00dcbergreifendes 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\u00fcr 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) \u2014 `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 \u2014 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\u00e4ndig aus SDRv4 entfernen","desc":"## Ziel\n\nDas Feature-Paket **IT-Inventar** (App `it-inventar`) geh\u00f6rt nicht in SDRv4 und wird vollst\u00e4ndig 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\ufffdsst sich nicht speichern, wenn die ID Umlaute enth\ufffdlt (Fehler unsichtbar)","desc":"## Problem\nIm v45-Build konnte ein neuer Modus im \"Neuer Modus\"-Dialog nicht gespeichert werden. Reproduktion: Name \"\ufffdbe","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 \u201eModi\":\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` \u2192 `audio/pcm` 24kHz \u2192 `StreamingAudioPla","pk":"SDRv4","tc":"KNOWLEDGE"},{"id":1631,"title":"Mode-Picker-Hotkey entfernen, shift+cmd auf Audioausgabe legen, PDR-H\u00e4kchen 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\u00fcr 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\u00e4higkeit: 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 \u2014 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 \u00fcber 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\u00fcssen 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\u00fcr 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\u00f6rt 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\u00fcr 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 \u00fcbernehmen","desc":"## Problem\n\nBeim Anlegen mehrerer verkn\u00fcpfter 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\u00fcr Senity-Chat-Proxy / CLI","desc":"## Zweck\n\nSammel-EPIC f\u00fcr 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\u00e4ndigung","desc":"## Ziel\n\nEin dedizierter SDRv4-Endpoint, \u00fcber 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 \u00f6ffnet Settings, Overlay-Schnell-Toggle, Picker-w\u00e4hrend-Aufnahme-Option, Switch\u2192Checkbox","desc":"## Kontext\n\nDer Press-Overlay-Toggle existiert bereits vollst\u00e4ndig (Settings \u2192 General \u2192 \"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\u00e4nkeverk\u00e4ufern (Tuttolotto-Laden)","desc":"Christoph: war in einem Tuttolotto-Laden, der Getr\u00e4nke (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\u00e4sst 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\u00f6sung des bestehenden Next.js-Frontends)","desc":"## Ausgangslage\n\nDer Senity-Workspace hat bereits ein vollst\u00e4ndiges 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\u00f6sung\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 \u2192 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\u00fcgbar machen (parallel zur lokalen Instanz)","desc":"Chris hat den Senity Workspace aktuell lokal auf seinem PC laufen (Container, voller Mount-Zugriff). Anforderung: zus\u00e4tz","pk":"CORE","tc":"FEAT"},{"id":1504,"title":"adminki@raumfabrik.de als hinterlegte E-Mail \u00fcberall 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 \u00fcberall 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 \u00fcberall 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 \u00fcberall 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 \u00fcberall 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 \u00fcberall 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 \u00fcberall 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 \u00fcberall 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 \u00fcberall 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 \u00fcberall 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 \u00fcberall 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 (\u2699 \ud83c\udfa7 \u2728) 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\u00fcr 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\u00fcngliche 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\u00f6pfte 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 \u00fcberschreiben sich (Sliding-Window-Partials), nur lange werden korrekt eingef\u00fcgt","desc":"## Symptom\n\nIm Live-ASR (Q3ASR-Stream-Bridge) \u00fcberschreibt 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\u00fcr Settings & History","desc":"## Anforderung\n\nUser w\u00fcnscht zwei \u00c4nderungen 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\u00fchr) + kianwalt-Prozess ansto\u00dfen","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\u00f6rige 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\u00e4dt 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\u00fcr Workspace-Agent einrichten (Mail/Drive/Calendar via MCP)","desc":"## Ziel\n\nEigener Google-Account f\u00fcr den Senity Workspace-Agent, damit ich (Claude) eigenst\u00e4ndig 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\u00e4nzen","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 \u2192 timo_review \u2192 marco_review \u2192 done)","desc":"## Ziel\n\nZwei neue Workflow-Schritte fuer mehrstufigen Final-Review.\n\n**Workflow:** `review` (technischer Review) \u2192 `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\u00e4gt 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\u00fchren) wurde ein Drift zwischen dem Schem","pk":"STS","tc":"KNOWLEDGE"},{"id":1363,"title":"Inventory + Rollout-Plan f\u00fcr 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\u00f6cke 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\u00fcr alle D:\\Devel\\NodeJS Projekte","desc":"## Ziel\n\nNeuen Ticket-Type `KNOWLEDGE` einf\u00fchren + 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\u00fcssen 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 \u2014 Docker/Deploy Audit: Token-Leak im Image + Image-Pinning","desc":"## G10 R7 \u2014 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)** \u2014 `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 \u2014 e2e/-Root-Liste vervollst\u00e4ndigen + voice/-Beschreibung erweitern","desc":"## Kontext\n\nG9 (tests/) R7 Audit-Findings f\u00fcr `tests/CLAUDE.md`:\n\n### Findings\n\n1. **e2e/ Root-Liste unvollst\u00e4ndig** (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) \u2014 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 (`\u2014`) 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 (`\u2014`) explizit auch in Dokumentation:\n\n> \"Niemals den Em-Dash (`\u2014`) 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\u00fccken\n\n### Begr\u00fcndung\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\u00fchrt`-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\u00f6schung gel\u00f6scht\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\u00e4glich ~1776\u00d7 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\u00e4umen","desc":"## Datums-Prefix-File ohne Nummer mutiert Schema\n\n### Befund (Batch C H5)\n`db/2026-03-27-voice-visibility.sql`: tr\u00e4gt KE","pk":"SDRv4","tc":"CHO"},{"id":1276,"title":"G6-6: OAuth/API-Tokens verschl\u00fcsseln + Key-Rotation-Pfad","desc":"## DSGVO Art-32: Credentials im Klartext / ohne Rotation\n\n### Befund A: trello_connection unverschl\u00fcsselt (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\u00e4ndig + 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\u00fcr 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\u00fccken)\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\u00e4higen 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 \u2192 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 \u2192 @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 \u2192 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 \u00d7 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\u00fcr 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 \u00a76.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 \u00a76.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 \u00a76.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 \u00a75.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 \u00a75.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 \u00a75.3 + \u00a75.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 \u00a75.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 \u00a74 + \u00a76.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\u00fcr 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\u00fcr 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\u00fcr Claude/Codex/Gemini via Mount-Verdopplung","desc":"## Idee\n\nStatt CLAUDE.md, AGENTS.md und GEMINI.md mit \u00fcberlappendem 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 \u2192 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\u00e4rten)","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\u00fcr Customer-Tauglichkeit","desc":"## Ziel\n\n`senity-workspace` Docker-Wrapper so umbauen, dass nicht-technische Customer (Marco, Timo, \u2026) 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: \u201eJedes 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: \u201easr stream im chat funktioniert nicht mehr\". Console-Hinweis `usePcmCapture.ts:91 [","pk":"SDRv4","tc":"BUG"},{"id":1026,"title":"User-spezifische Skills/Agents-Auslieferung \u00fcber SDRv4-API f\u00fcr 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\u00fcr 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\ufffdr 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\u00fcr Founder","desc":"Das Rate-Limit der YouTube-Summarizer-Route (bzw. der zugrundeliegenden Limiter-Middleware) soll f\u00fcr 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 \u00fcber `/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\u00fcfen und ggf. erg\u00e4nzen","desc":"Kontext\n\nChris fragt: ist es m\u00f6glich, \u00fcber 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\u00fcr 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\u00fcr YouTube-Summarizer (Upload + YouTube unified)","desc":"## Ziel\n\nMinimaler Proof of Concept: YouTube-Summarizer soll f\u00fcr **uploaded Videos** und **YouTube-Videos gleicherma\u00dfen*","pk":"SDRv4","tc":"FEAT"},{"id":987,"title":"Ern\u00e4hrungscoach: Initial-Anamnese mit Christoph durchf\u00fchren und Gesundheitsakte anlegen","desc":"## Kontext\n\nMit Ticket #986 wurde die Coach-Pers\u00f6nlichkeit, die Mission und die Multi-Reviewer-Pipeline in `projects/ern","pk":"CORE","tc":"CHO"},{"id":986,"title":"Ern\u00e4hrungscoach: Pers\u00f6nlichkeit + Multi-Reviewer-Pipeline in CLAUDE.md verankert","desc":"## Kontext\n\nDas Ern\u00e4hrungscoach-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\u00e4t: 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\u00fcr parallele Chat-Updates w\u00e4hrend l\u00e4ngerer Tool-Ketten (Variante A)","desc":"Hintergrund\n\nIn Telegram f\u00fchlt sich Stille w\u00e4hrend l\u00e4ngerer Tool-Ketten wie ein H\u00e4nger an (Voice 1036/1038/1042, Chris, ","pk":"CORE","tc":"FEAT"},{"id":978,"title":"Telegram-Download-Verzeichnis: Group-Write fehlt, ASR-Cleanup schl\u00e4gt 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\u00fcr 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\ufffduft: 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 \ufffd Marke Weltverbesserer","desc":"Gemeinsames Brainstorming f\ufffdr 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\u00fcr Migration-Deploy nach Welle 3+4**\n\nZwei Migrationen liegen committet aber nicht ausgef\u00fchrt:\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\u00e4chlich ausf\u00fchren (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\u00fcr 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\u00e4hrend 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\u00fcr /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\u00e4lt 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\u00fcr Q3ASR-Qualit\u00e4t.\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\u00fcr 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\u00e4hrend des #909-Refact","pk":"SDRv4","tc":"IMP"},{"id":937,"title":"Fail-closed Re-Eval f\u00fcr 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\u00e4lt `select_s","pk":"SDRv4","tc":"IMP"},{"id":935,"title":"revokeMarkerError l\u00f6st 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\u00fccken aus #908 Realtime-Watcher-Integration schlie\u00dfen","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\u00d7 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\u00fchrt:\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 `\u256d\u2500\u2500\u2500 Claude Code v1.0 \u2500\u2500\u2500...\u256e` 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\u00e9 Slide 7: Pricing-Cost-Story (Option A/B/C entscheiden)","desc":"**Kontext:** Slide 7 des Investor-Expos\u00e9 v4.1 zeigt nackt 199/449/749 \u20ac MRR mit 369 \u20ac Blended und 4.270 \u20ac ARR. Chris hat","pk":"CORE","tc":"FEAT"},{"id":920,"title":"Investor-Expos\u00e9 v4: Bio-CV prior stations","desc":"**Kontext:** Senity Voice-AI Investor-Expos\u00e9 v4 (`build/expose/senity-expose-v4.pdf`, Slide 10 \u201eTeam\").\n\n**TODO Rick:**\n","pk":"CORE","tc":"FEAT"},{"id":919,"title":"Investor-Expos\u00e9 v4: orderbird-Vorsprung schriftlich + Bio-CV","desc":"**Kontext:** Senity Voice-AI Investor-Expos\u00e9 v4 (`build/expose/senity-expose-v4.pdf`, Slide 5 \u201eProdukt\" + Slide 9 \u201eRoadm","pk":"CORE","tc":"FEAT"},{"id":918,"title":"Investor-Expos\u00e9 v4: Voice-Stack-Independence best\u00e4tigen + Bio-CV","desc":"**Kontext:** Senity Voice-AI Investor-Expos\u00e9 v4 (`build/expose/senity-expose-v4.pdf`, Slide 11 \u201eRisiken\").\n\n**TODO Chris","pk":"CORE","tc":"FEAT"},{"id":917,"title":"Investor-Expos\u00e9 v4: Review + Trattoria-Pilot-Zitat + Bio-CV","desc":"**Kontext:** Senity Voice-AI Investor-Expos\u00e9 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\u00fcr 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 \u00fcber murc134-Pattern in DE/EN.\n\n**Strings:**\n- \u201eAufnahme starten/stoppen\", \u201e","pk":"SDRv4","tc":"FEAT"},{"id":897,"title":"[Voice-Sub-16] User-Doku + Admin-Doku + Operator-Runbook","desc":"**R3-Bereich:** Documentation\n\nDrei Doku-Str\u00e4nge:\n1. **User-Doku** (DE/EN, in-App + Wissens-Datenbank): \u201eSo 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\u00fcr 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\u00fcr laute Umgebungen, User-Toggle in Se","pk":"SDRv4","tc":"FEAT"},{"id":889,"title":"[Voice-Sub-8] Opus-Encode Client\u2192Bridge (mobiles Release, 16\u00d7 Bandbreite)","desc":"**R3-Bereich:** Bandwidth\n\nPCM16-Frames sind ~32 KB/s. Opus@16kbps reduziert WS-Bandbreite um 16\u00d7. 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\u00fcr `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\u00f6rter+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\u219216k, 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\u00fcck 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\u00fcr 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 \u2192 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 \u00c4nderungen sind unabh\u00e4ngig, 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\u2026\" h\u00e4ngen 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** \u00f6ffentlich erreich","pk":"SDRv5","tc":"BUG"},{"id":853,"title":"Voice-UI: Phantom-Token bg-cbr-card \u2192 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** \u2014 Hintergrund-El","pk":"SDRv5","tc":"BUG"},{"id":852,"title":"parent_scope-Feld in cli_agent_skill \u2014 Workspace-Bezug f\u00fcr Sub-Projekte","desc":"## Kontext\n\n`source_root` enth\u00e4lt absolute Pfade. F\u00fcr 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\u00fcllen","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 \u2014 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\u00fcr 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 \u00dcberschre","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\u00e4uft 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\u00fcndel 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\u00fcr 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\u00fcr /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 \u2014 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 \u2014 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\ufffdr 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\ufffdhrend 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\ufffd\ufffde (>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 \ufffdberarbeitung 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 \ufffdberarbeitung 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 \ufffdberarbeitung 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 \u2014 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 \u00d7 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\u00fcr Max-Image-Ed","pk":"SDRv4","tc":"IMP"},{"id":819,"title":"CLI Call Tool \u2014 E2E Test (Qwen3.6 \u2192 cli_call \u2192 Orchestrator \u2192 Webhook \u2192 Status)","desc":"## Ziel\nE2E-Test der CLI-Call-Pipeline: Chat-Pers\u00f6nlichkeit \u2192 Tool-Call \u2192 Container-Job \u2192 Status-Polling \u2192 Result.\n\n## T","pk":"SDRv5","tc":"CHO"},{"id":818,"title":"CLI Call Tool \u2014 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 \u2014 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 \u2014 Ticketing Chat-Tool (Microservice-Wrapper)","desc":"## Ziel\nChat-Tool das qwen3.6 direkten Zugriff auf das Ticketing-System gibt. **NICHT** direkter DB-Zugriff \u2014 \u00fcber exist","pk":"SDRv5","tc":"FEAT"},{"id":815,"title":"CLI Call Tool \u2014 cli_call + cli_call_status + Webhook-Receiver","desc":"## Ziel\nCore-Tools f\u00fcr Chat \u2192 CLI-Workspace-Delegation. Async-Flow mit Job-Persistierung.\n\n## Deliverables\n1. `lib/chat/","pk":"SDRv5","tc":"FEAT"},{"id":814,"title":"CLI Call Tool \u2014 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 \u2014 DB-Migration (cli_server Metadaten + cli_job + chat_personality.tools)","desc":"## Ziel\nSchema-Grundlage f\u00fcr 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\u00fccken 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\u00e4ngende 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\u00e4tigungs-Modals laufen \u00fcber `window.confirm`, bricht Sen","pk":"SDRv4","tc":"BUG"},{"id":808,"title":"FEAT-794 Follow-up: Senity-Theme-Konformit\u00e4t (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 \u2192 ffmpeg-Audio-Extract \u2192 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\u00e4sentation f\u00fcr Abi-Termin (3-4 Slides)","desc":"H\u00e4ngt am Epic #778 (BBE/Abi Pilot).\n\n## Aufgabe\nKurze, entscheider-taugliche Pr\u00e4sentation f\u00fcr den Folgetermin mit Abi. B","pk":"SDRv4","tc":"FEAT"},{"id":804,"title":"BBE-Pilot: Folgetermin mit Abi koordinieren","desc":"H\u00e4ngt 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\u00e4ngt am Epic #778 (BBE/Abi Pilot) als strategische Grundsatz-Aufgabe.\n\n## Aufgabe\nSenity kann aktuell keine festen Geh\u00e4","pk":"CORE","tc":"FEAT"},{"id":802,"title":"Hardware f\u00fcr Timo besorgen (Leihe oder Grover-Miete)","desc":"H\u00e4ngt am Epic #778 (BBE/Abi Pilot).\n\n## Aufgabe\nTimo ben\u00f6tigt arbeitsf\u00e4hige Hardware, um produktiv am Pilot mitarbeiten ","pk":"CORE","tc":"CHO"},{"id":801,"title":"BBE-Pilot: Kassensystem-Anbindung Recherche + Fallback-Architektur","desc":"H\u00e4ngt 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 \u20ac abstimmen","desc":"Bezug: Epic #778 (BBE/Abi Pilot)\n\nMarco hat von Abi eine Investitionszusage \u00fcber 5.000 \u20ac f\u00fcr 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 \ufffd 3 Modelle \ufffd 3 Temps \ufffd 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 \u2192 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 \u00fcber 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). \u00c4nderungen gg\u00fc. 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\u00f6nlichkeitstyp 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\u00f6nlichkeitstest hat unvollst\u00e4ndige 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\u00e4ngt 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\u00e4ndige Kostenaufstellung Server + Cloud + Modell-Routing","desc":"H\u00e4ngt am Epic #778 (BBE/Abi Pilot).\n\n## Aufgabe\nVollst\u00e4ndige, transparente Kostenaufstellung f\u00fcr den BBE-Pilot und die l","pk":"SDRv4","tc":"FEAT"},{"id":779,"title":"BBE-Pilot: Marktanalyse Pricing + Wettbewerbsvergleich","desc":"H\u00e4ngt am Epic #778 (BBE/Abi Pilot).\n\n## Aufgabe\nMarktanalyse f\u00fcr Pricing und Wettbewerbsvergleich. Ergebnis flie\u00dft 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\u00fcr 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 \u00f6ffnet Best\u00e4tigungs-Banner. Klick auf \u201eJa\" / \u201eBest\u00e4tigen\", **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 \u2014 SDRv4-Integration, FlexibleJsTools-Regeln, Theme-Updates","desc":"## Ziel\nExtended Brainstorming (Codex \u2192 Gemini \u2192 Opus) f\u00fcr:\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\u00dfen nicht m\u00f6glich + Eingabefeld au\u00dferhalb sichtbarem Bereich","desc":"Auf iPad (iOS Safari) zwei Probleme:\n1. Chat-Eingabefeld rutscht beim \u00d6ffnen 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\u00e4tigen 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-\u00dcbersicht im Browser","desc":"## Ziel\n\nEine dedizierte Seite unter `/bots/[id]/conversations` implementieren, auf der alle Chat-Verl\u00e4ufe 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 \u00d6kosystem, Implementierungsplan","desc":"","pk":"SDRv4","tc":"RESEARCH"},{"id":759,"title":"Design: Git Workflow Agent \u00d6kosystem v2","desc":"","pk":"SDRv4","tc":"RESEARCH"},{"id":758,"title":"Lead-Scraper Bugfixes & Architektur-\u00dcberarbeitung","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 \u2014 konsolidierter Findings-Report Session 72","desc":"104 Findings (Finding 102 gestrichen \u2014 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\u00fcr 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 \u00dcber-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 (\u201a3 Tage nichts gegessen\u2018), w\u00fcrfe","pk":"SDRv4","tc":"None"},{"id":752,"title":"Bestellbot Allergen-Safety, sch\u00e4rfstes Sub von #750","desc":"Sub-Ticket zu #750 (Master). Sch\u00e4rfstes Sub-Ticket der Session.\n\n## Symptom\nBot oszilliert zwischen \u00dcber-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 \u2014 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\u00f6nlichkeit bei Route-Wechsel tats\u00e4chlich switchen + Blink-Animation","desc":"Nach [[ROUTE:N]] wurde die Pers\u00f6nlichkeit 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\u00f6nlichkeitswechsel 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\u00fcgen. 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\u00fcr Context-Management","desc":"Statt 80 rohe Nachrichten in den Context zu laden: \u00c4ltere Nachrichten werden thematisch gruppiert (BEGR\u00dcSSUNG, BESTELLUN","pk":"SDRv4","tc":"IMP"},{"id":735,"title":"Burger Bulle, Produkt-DB + User-Taste-Profile mit pgvector","desc":"Produktdatenbank f\u00fcr 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\u00fcr Chat-History (Relevanz-Scoring)","desc":"Intelligenter Mechanismus der Chat-History nach Relevanz filtert: Unwichtige Nachrichten (Begr\u00fc\u00dfungen, Smalltalk, Kurzbe","pk":"SDRv4","tc":"IMP"},{"id":732,"title":"Phase-2 Hardening: Path-Traversal, JSON-Safety, Array-Aliasing","desc":"## Kontext\n\nW\u00e4hrend des Reviews der 6 Phase-2-Tasks (Render Engine) f\u00fcr 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\u00f6ser\n\nW\u00e4hrend 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\u00fccke","desc":"## Problem\n\nBei Live-Tests kommt keine Antwort vom Telegram-Bot, obwohl die LLM-Pipeline durchl\u00e4uft (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\u00e4ngig","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\u00e4ngig von","pk":"SDRv4","tc":"FEAT"},{"id":723,"title":"Named-Volume Live-Distribution f\u00fcr 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\u00fcr Agent/Skill-Content","desc":"# FEAT-343: pgvector-Embedding-Pipeline\n\n**Epic:** EPIC-316\n**Typ:** feature | **Prio:** P1 | **Status:** draft\n**Abh\u00e4ng","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\u00e4t:** P1\n**Erstellt:** 2026-04-24\n**Bra","pk":"SDRv4","tc":"EPIC"},{"id":720,"title":"[Brainstorming] env-system Microservice \u2014 zentrale Secret-Verwaltung","desc":"## Kontext\n\nNeuer Microservice zur zentralen Verwaltung von API-Keys, DB-Passw\u00f6rtern und sonstigen Secrets. L\u00f6st 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 \u00b7 **Prioritaet:** P1 \u00b7 **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> \u201eWichtig 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\u00f6\u00dft, f\u00fcr 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\u00e4hrend 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\u00e4lt 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":"\u00dcberlegung: Abrechnung pro Character statt pro Token","desc":"Idee vom 23.04.2026 (Telegram): Abrechnung f\u00fcr KI-Nutzung k\u00f6nnte 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\u00e4ts-Threshold","desc":"## Kontext\n\nAls sichtbares Produkt-Feature des k\u00fcnftigen **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 \u2192 Chat-System \u2192 Frontend-Chat mit CLI-Delegation","desc":"## Ausgangslage\n\nDie Claude-Code-CLI im Workspace ist extrem m\u00e4chtig (Sub-Agents, Worktrees, Skills, Codebase-Zugriff), ","pk":"SDRv4","tc":"None"},{"id":695,"title":"Qwen3-ASR / Qwen3-TTS: Streaming-F\u00e4higkeit kl\u00e4ren","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\u00e4hlbare Agents/Skills mit Price-Tag","desc":"## Kontext\nWorkspace-\u00fcbergreifendes Thema, nicht Burger-Bulle-spezifisch, sondern grunds\u00e4tzliche Architektur-Frage f\u00fcr 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\u00f6tig","desc":"## Problem\n\nTest am 2026-04-23 \u00fcber 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\u00dfem Modell evaluieren","desc":"**Problem:** Aktuelle Verarbeitung (Voice-Input \u2192 ASR \u2192 LLM-Reasoning \u2192 Voice-Output) dauert im Testing 30\u201340 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 \u00fcbergeben think-Parameter nicht. claude-proxy proxyToOpenAICompat fehlt th","pk":"SDRv4","tc":"None"},{"id":679,"title":"Evaluierung: ASR/TTS Mehrsprachigkeit f\u00fcr Burger-Bulle-Bot (Arabisch, T\u00fcrkisch)","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 \ufffd 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\u00fcr Telegram-Kan\u00e4le: Neue Nutzer erhalten zun\u00e4chst 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\u00e4ge \u00fcberschrie","pk":"SDRv4","tc":"None"},{"id":674,"title":"[BB] Abi-Vertrieb l\u00e4uft ausschlie\u00dflich \u00fcber 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\u00fcr 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\u00fcr Telefon-Kanal","desc":"Abi nutzt 3CX f\u00fcr 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\u00dfe Plattformen haben Partner-APIs f\u00fcr Listings/Bestellungen. Ziel: Ein Pflegepunkt f\u00fcr 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\u00fcr Kampagnen. Abi will ad-hoc reagieren (Schalke-Sp","pk":"SDRv4","tc":"None"},{"id":669,"title":"[BB] Fahrer-App mit GPS-Tracking + Liefer-Best\u00e4tigung","desc":"Fahrer best\u00e4tigt 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\u00fcndelung","desc":"Fahrer-Routen optimieren:\n- Google Maps Directions API + Distance Matrix\n- Mehrere Bestellungen gleiche Stra\u00dfe \u2192 ein Fah","pk":"SDRv4","tc":"None"},{"id":667,"title":"[BB] Pizza-Hut-Modell, pr\u00e4diktive 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\u00e4chste\".\n\nMechanik:\n- Punkt","pk":"SDRv4","tc":"None"},{"id":665,"title":"[BB] AGB / Haftung f\u00fcr Voice-Bot-Bestellungen + Allergen-Disclaimer","desc":"Haftungsrisiken bei Bestellannahme per Bot:\n- Allergen-Auskunft falsch \u2192 Anaphylaxie\n- Falscher Preis kommuniziert\n- Bes","pk":"SDRv4","tc":"None"},{"id":664,"title":"[BB] DSGVO + Datenschutz f\u00fcr Kundendatenbank","desc":"Kundenprofile mit Pr\u00e4ferenzen, 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\u00f6glichst 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\u00fcrki","pk":"SDRv4","tc":"None"},{"id":661,"title":"[BB] Kundendatenbank mit Pr\u00e4ferenzen + personalisierte Empfehlungen","desc":"Pro Telefon-Nummer/Email ein Kundenprofil speichern:\n- Lieblingsgerichte, Allergien, Ern\u00e4hrungs-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\u00f6nerladen (Podolski-Franchise) + Fr\u00fchst\u00fcckscaf\u00e9 + Kaiserschmann + Belladen (Meeting 2026-04","pk":"SDRv4","tc":"None"},{"id":659,"title":"[BB] Drucker-Anbindung, Bestellungen als Papier-Bon in die K\u00fcche","desc":"Abis Drucker h\u00e4ngt 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\u20ac Verluste).\n\nL\u00f6sung (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\u00e4le: 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\u00fcr 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 \u2013 Produktstrategie, Demo-Vorbereitung, Pricing","desc":"Teilnehmer: Marco Escribano, Christoph Brucksch\n\nKernentscheidungen:\n- Strategiewechsel: VoiceBot \u2192 modularer AI Workspa","pk":"SDRv4","tc":"None"},{"id":651,"title":"[Brainstorming] Telegram-Registrierungsflow + verschl\u00fcsselte CLAUDE_*.md Personas","desc":"## Idee\n\nNutzer die \u00fcber Telegram schreiben, werden mit einem zeitlimitierten HMAC-Link auf eine \u00f6ffentliche Registrieru","pk":"SDRv4","tc":"None"},{"id":650,"title":"Message Persistence f\u00fcr 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\u00fcr 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\u00fcr 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\u00e4ndig","desc":"Fix A+B+C aus Multi-Modell-Review:\n\nA) channel_post / edited_channel_post als g\u00fcltige 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\u00e4ge noch. npm ci in CI w\u00fcrde 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\u00e4le 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\u00e4ge anlegen u","pk":"SDRv4","tc":"CHO"},{"id":620,"title":"claude-proxy/Gemini: Tool-Schema enth\u00e4lt $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\u00f6rt nicht","pk":"SDRv4","tc":"BUG"},{"id":617,"title":"CLI-Server Create: Auto-Start nach Container-Create + Git-Clone in start.sh \u00fcberspringen 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\u00fctzt","desc":"# Bug: db/101_2026-04-22-drop-asana.sql crasht wenn `ticket`-Tabelle fehlt\n\n## Symptom\n\nUser-Report beim Ausf\u00fchren 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\u00f6scht (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\u00e4ndiger Microservice + intelligentes Context-Ranking","desc":"# Chat-API als eigenst\u00e4ndiger 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 \u2014 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 \u2194 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\u00e4tsanalyse, 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\u00e4tsanalyse","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 \u00d6kosystem, 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 \u00d6kosystem 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\u00f6sen + 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-\u00dcberarbeitung","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\u00fcr 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\u00fchrlicher 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 \u2014 Implementation Plan","desc":"> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\archiv\\2026-03-22-image-generation-plan.md am 2026-04-22 \u2014 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 \u2014 Legacy","pk":"SDRv4","tc":"RESEARCH"},{"id":555,"title":"Chat \u2194 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 \u2194 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 \u2194 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 \u2194 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 \u2194 Lead Scraper Integration \u2014 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 \u2194 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 \u2194 Lead Scraper Integration \u2014 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 \u2014 ","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 \u2014 ","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 \u2014 Legacy-Archiv-Migration.\n\n# Dokume","pk":"SDRv4","tc":"CHO"},{"id":544,"title":"Server-Audit Hetzner GEX44 \u2014 2026-04-20","desc":"> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\SERVER-AUDIT-2026-04-20.md am 2026-04-22 \u2014 Legacy-Archiv-Migration.","pk":"SDRv4","tc":"CHO"},{"id":543,"title":"Offene R\u00fccksprache-Punkte","desc":"> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\archiv\\RUECKSPRACHE-OFFEN.md am 2026-04-22 \u2014 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 \u2014 Legacy-Archiv-Migration.\n\n# Backlog + Id","pk":"SDRv4","tc":"CHO"},{"id":541,"title":"Backlog \u2014 Aktive Tickets","desc":"> Importiert aus D:\\Devel\\NodeJS\\SDRv4\\.tasks\\BACKLOG.md am 2026-04-22 \u2014 Legacy-Archiv-Migration.\n\n# Backlog \u2014 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 \u2192 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\u00fcr Status-Updates (LLM-friendly)","desc":"Ziel: Die sts-api so gestalten, dass LLMs (Claude, Codex, Gemini) mit **minimalem Token-Verbrauch** Status-\u00c4nderungen un","pk":"SDRv4","tc":"FEAT"},{"id":528,"title":"sts-api: Endpoint f\u00fcr n\u00e4chste Ticket-Nummer (next-code)","desc":"Problem: Beim Anlegen neuer Tickets muss aktuell manuell die n\u00e4chste 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\u00e4lt 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\u00fcr Commit fb14ae0f (aktuell mit unsauberer Message 'ernie' \u2014 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\u00fcr Commit c2693c5b.\n\nNeuer self-hosted Provider lib/llm/providers/msh.ts (569 Zeilen) \u2014 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\u00e4gt fehl: lib/llm/providers/msh.ts:208 \u2014 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 \u2014 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\u00e4glich 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\u00e4hlen eines Target-Containers im CreateServerDialog sollen im Pfad-Dropdown nur Pfade erschein","pk":"SDRv4","tc":"IMP"},{"id":515,"title":"SSO-Handoff SDRv4 \u2192 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 \u2192 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\u00e4uft","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 \u2192 tickets (siehe db/094) m\u00fcssen 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\u00fctzen. Name und Modell sind bereits editierbar. Slug bleibt read-only (Rename w\u00e4","pk":"SDRv4","tc":"IMP"},{"id":91,"title":"App-Framework: Manifest mount+navEntry, dynamische Sidebar + SSO-Handoff f\u00fcr 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 \u2014 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\u00e4ngen","desc":"## Symptom\n\nDas KI-Modell eines CLI-Servers kann nach dem Anlegen nicht \u00fcber die UI ge\u00e4ndert 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** \u2014 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\u00fcr den Senity-Stack","desc":"## Ziel\n\nDer Container-Manager-Microservice wird Single Source of Truth f\u00fcr 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\u00fcllen.\n\nAusgangslage: /api/containers proxyt an CONTAINER_MA","pk":"SDRv4","tc":"FEAT"},{"id":71,"title":"System-Container in /servers f\u00fcr Admins sichtbar machen","desc":"Die GET-Route /api/cli/servers filtert aktuell via cli_server_member!inner \u2014 System-Container (source_type='system', is_","pk":"SDRv4","tc":"CHO"},{"id":70,"title":"Migration: api_ticket stilllegen \u2192 sts-api als Single Source of Truth","desc":"Komplette Abl\u00f6sung des internen api_ticket Systems (Migration 075) durch das sts-api Microservice (tickets Tabelle, Migr","pk":"SDRv4","tc":"FEAT"},{"id":68,"title":"Kan\u00e4le als eigenst\u00e4ndige Entit\u00e4t (Channel-Architektur)","desc":"Trennt Kan\u00e4le (Telegram, WhatsApp, Web, ...) vom cli_server. Container-L\u00f6schung darf den Kanal nicht mitnehmen \u2014 der Kan","pk":"SDRv4","tc":"FEAT"},{"id":69,"title":"Telegram-Webhook-Endpoint + setWebhook-Setup","desc":"Eigentliche Telegram-Integration \u2014 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\u00fcr senity-sdrv4-live und senity-sdrv4-test. Eingehende Nachrichten werden \u00fcber 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 \u2014 `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 \u2014 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 \u2014 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 \u2192 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:** \u2014  \n**Phase:** 4 (Automation & O","pk":"SDRv4","tc":"CHO"},{"id":44,"title":"Supabase.com: Migrations 088\u2013092 f\u00fcr Ticketing-System anwenden","desc":"# CHO-295 \u2014 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 \u2014 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 \u2014 Docker Deployment auf Hetzner Server\n\n> **Abh\u00e4ngigkeit:** CHO-295 (Supabase-Migrations \u2705)  \n> **Ziel:** Seni","pk":"SDRv4","tc":"CHO"},{"id":48,"title":"CLI-Workspace: Full-Stack Dev Container (Agenten + Skills)","desc":"# CHO-298 \u2014 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 \u2014 Docker + Supabase + Templates + API","desc":"# FEAT-286 \u2014 Container Management System \u2014 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 \u2014 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 \u2014 DB als Single Source of Truth, .tasks/ abschaffen","desc":"# FEAT-298 \u2014 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 \u2014 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 \u2014 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) \u2014 Sub-Route Integration","desc":"# IMP-293 \u2014 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 \u2014 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 \u2014 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 \u2014 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 \u2014 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 \u2014 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 \u2014 `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\u00e4umen","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\u00fcr 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 \u00fcberspringt 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\u00e4uft im ","pk":"SDRv4","tc":"BUG"},{"id":275,"title":"CLI-Chat UI zeigt hardcoded selected_model_id statt tats\u00e4chlich 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 \u2014 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 \u2014 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 \u2014 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\u00e4lt 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 \u2014 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\u00fcr Container-Tickets)","desc":"# BUG-276 \u2014 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 \u2014 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 \u2014 Container SDRv4-Clone + Ticketing-Gateway\n\n## Beschreibung\n\nContainer-MVP braucht vollst\u00e4ndiges SDRv4-Repo ","pk":"SDRv4","tc":"FEAT"},{"id":50,"title":"Globale Claude-Agents + Skills in SDR-Container provisionieren","desc":"# FEAT-268 \u2014 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 \u2014 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\u00fcr CLI-Container (Proxy + Tickets getrennt)","desc":"# FEAT-270 \u2014 Dual-API-Key f\u00fcr 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 \u2014 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\u00fcr MVP deaktivieren \u2014 services/cli-orchestrator/docker-manager.ts","desc":"F\u00fcr 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 \u2014 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\u00e4glich \u00e4nderbar (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\u00fcr 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\u00e4gen ohne Pricing-Daten","desc":"Im Fallback-Reihenfolge-Screen zeigen manche Eintr\u00e4ge (z.B. Local Ollama) keine Kosten an, w\u00e4hrend 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 \u2014 Verbrauchs\u00fcbersicht mit Modell-Aufschl\u00fcsselung 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 \u2014 Admin verteilt Tokens aus Firmen-Pool an User","desc":"\u00dcbergeordnete Lizenz-Ebene f\u00fcr Token-Verwaltung. Eine Firma/Lizenz kauft ein Token-Kontingent (Pool). Der Admin verteilt","pk":"SDRv4","tc":"FEAT"},{"id":223,"title":"BYOK \u2014 Bring Your Own Key mit 10% Plattform-Fee","desc":"User k\u00f6nnen eigene LLM-API-Keys hinterlegen (OpenAI, Anthropic, etc.). Senity berechnet 10% Plattform-Fee auf den tats\u00e4c","pk":"SDRv4","tc":"FEAT"},{"id":219,"title":"CLI Chat Header Redesign \u2014 Container-Dropdown & Mode-Toggle visuell \u00fcberarbeiten","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\u00fcr 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 \u2014 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 \u2014 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 \u2014 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 \u2014 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 \u2014 'building' Status zur api_ticket CHECK-Constraint hinzuf\u00fcgen","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\u00f6schen schl\u00e4gt fehl wenn Orchestrator nicht erreichbar","desc":"Auf der /servers-Seite konnten Container weder gestoppt noch gel\u00f6scht werden, wenn der Orchestrator-Service (Port 3200) ","pk":"SDRv4","tc":"BUG"},{"id":267,"title":"Tool-Use \u00dcbersetzung Anthropic\u2194OpenAI f\u00fcr Ollama-Pfad","desc":"# FEAT-245: Tool-Use \u00dcbersetzung Anthropic\u2194OpenAI f\u00fcr 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 \u2014 Fallback-Reihenfolge\" sind Kosten und Preise der Provider aktuell nur ","pk":"SDRv4","tc":"IMP"},{"id":260,"title":"CLI Workspace Container \u2014 Git Worktree pro Container unter container/NAME.EXT","desc":"# FEAT-249 \u2014 [Brainstorming] CLI Workspace Container \u2014 Git Worktree pro Container unter container/NAME.EXT\n\n**Typ:** fea","pk":"SDRv4","tc":"FEAT"},{"id":349,"title":"Northdata.de \u2014 Evaluation & Entscheidung (Rick)","desc":"# RES-027: Northdata.de \u2014 Evaluation & Entscheidung (Rick)\n\n**Typ:** research\n**Priorit\u00e4t:** P1\n**Status:** backlog\n**Er","pk":"SDRv4","tc":"RESEARCH"},{"id":343,"title":"DSGVO-Audit \u2014 Custom Fields (FEAT-221)","desc":"# RES-026: DSGVO-Audit \u2014 Custom Fields (FEAT-221)\n\n**Typ:** research\n**Priorit\u00e4t:** 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\u00fcr Voice-Kommunikation \u00fcber Kan\u00e4le. 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\u00e4ndiger 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\u00e4ndigen 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\u00fcr 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\u00f6rende 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\u00f6ri","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\u00e4ume werden hier konsolidiert:\n1","pk":"SDRv4","tc":"RESEARCH"},{"id":348,"title":"CLI-Chat-Override \u2014 Design-Fragen & L\u00f6sungsvorschl\u00e4ge","desc":"# RES-017: CLI-Chat-Override \u2014 Design-Fragen & L\u00f6sungsvorschl\u00e4ge\n\n**Typ:** Research\n**Prio:** P1\n**Status:** done\n**Erst","pk":"SDRv4","tc":"RESEARCH"},{"id":286,"title":"[Research] Lieferando-Schnittstelle f\u00fcr Gastro-Produkt","desc":"# Lieferando-Schnittstelle f\u00fcr Gastro-Produkt\n\n## Kontext\nAus Gespr\u00e4chsprotokoll vom 2026-04-05. Burger Bulle macht ~150","pk":"SDRv4","tc":"RESEARCH"},{"id":284,"title":"[Research] 3CX-Telefonanlage Integration f\u00fcr Gastro-Bots","desc":"# 3CX-Telefonanlage Integration f\u00fcr Gastro-Bots\n\n## Kontext\nAus Gespr\u00e4chsprotokoll 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\u00e4ulen, 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\u00dft Container aus der SDR-Zentrale. C","pk":"SDRv4","tc":"RESEARCH"},{"id":285,"title":"[ZUSAMMENGEF\u00dcHRT] Private-Key vs. Zero-Knowledge","desc":"# RES-011: [ZUSAMMENGEF\u00dcHRT] Private-Key vs. Zero-Knowledge\n\n**Status:** closed\n**Zusammengef\u00fchrt 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 \u2014 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 \u2014 Pricing-Staffelung, Rabatte & Vertragsbedingungen","desc":"# RES-008: Brainstorming \u2014 Pricing-Staffelung, Rabatte & Vertragsbedingungen\n\n**Typ:** research / brainstorming\n**Priori","pk":"SDRv4","tc":"RESEARCH"},{"id":502,"title":"Brainstorming \u2014 Self-Service Shop vs. Admin-Only Produktverwaltung","desc":"# RES-007: Brainstorming \u2014 Self-Service Shop vs. Admin-Only Produktverwaltung\n\n**Typ:** research / brainstorming\n**Prior","pk":"SDRv4","tc":"RESEARCH"},{"id":501,"title":"Brainstorming \u2014 Token-Pakete vs. Produkte \u2014 Architektur-Entscheidung","desc":"# RES-006: Brainstorming \u2014 Token-Pakete vs. Produkte \u2014 Architektur-Entscheidung\n\n**Typ:** research / brainstorming\n**Pri","pk":"SDRv4","tc":"RESEARCH"},{"id":279,"title":"Brainstorming \u2014 Produkttypen & Preismodelle f\u00fcr Senity","desc":"# RES-005: Brainstorming \u2014 Produkttypen & Preismodelle f\u00fcr Senity\n\n**Typ:** research / brainstorming\n**Priorit\u00e4t:** P1\n*","pk":"SDRv4","tc":"RESEARCH"},{"id":140,"title":"Claude Code als Codex-Alternative: Machbarkeit + Unsloth/llama.cpp Eval","desc":"# RES-004 \u2014 Claude Code als Codex-Alternative: Machbarkeit + Unsloth/llama.cpp Eval\n\n**Typ:** research | **Prio:** P1 | ","pk":"SDRv4","tc":"RESEARCH"},{"id":499,"title":"MSH \u2194 SDRv4 Feature-Crawl & Sync-Plan","desc":"# RES-003: MSH \u2194 SDRv4 Feature-Crawl & Sync-Plan\n\n**Typ:** research\n**Priorit\u00e4t:** P1\n**Status:** done\n**Abh\u00e4ngigkeiten:","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\u00e4t:** 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\u00fcfen \u2014 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 \u2014 Pre-Commit Hook + Sync-Script","desc":"## Beschreibung\n\nZuverl\u00e4ssiges Script-basiertes System, damit Worktree-Branches keine `.tasks/`-Konflikte verursachen.\n\n","pk":"SDRv4","tc":"IMP"},{"id":277,"title":"[Brainstorming] Extended Brainstorming Skill \u2014 Codex \u2192 Gemini \u2192 Opus Multi-Model Q&A","desc":"# IMP-040 \u2014 [Brainstorming] Extended Brainstorming Skill \u2014 Codex \u2192 Gemini \u2192 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 \u2014 Handelsregister als prim\u00e4re Quelle + Fehlerfix","desc":"# IMP-038: Lead Scraper \u2014 Handelsregister als prim\u00e4re Quelle + Fehlerfix\n\n**Typ:** improvement\n**Priorit\u00e4t:** P0\n**Statu","pk":"SDRv4","tc":"IMP"},{"id":496,"title":"Memory System Upgrade \u2014 Progressive Loading + Temporal/Domain Tags","desc":"# IMP-037: Memory System Upgrade \u2014 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\u00e4t:** P2\n- **St","pk":"SDRv4","tc":"IMP"},{"id":295,"title":"CLI Chat \u2014 stream-json Thinking-Tokens + typisierte Events","desc":"## Problem\n\n`cli-runner.ts` verwendet `claude --print -p \"prompt\"` \u2014 gibt nur finalen Textoutput.\nThinking-Tokens werden","pk":"SDRv4","tc":"IMP"},{"id":294,"title":"CLI Chat \u2014 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\u00fcr jede Nachricht einen neuen Claude Code Prozess:\n```bash\nclaude --print -p","pk":"SDRv4","tc":"IMP"},{"id":494,"title":"Rename cli_server \u2192 cli_workspace","desc":"# IMP-031: Rename cli_server \u2192 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 \u2014 Chart-\u00dcberarbeitung","desc":"# IMP-029: AI-Usage Dashboard \u2014 Chart-\u00dcberarbeitung\n\n**Status:** review\n**Priorit\u00e4t:** P1\n**Branch:** feat/imp-029-ai-us","pk":"SDRv4","tc":"IMP"},{"id":492,"title":"Workflow-Integration (Review \u2192 Audit, Ticket-Kommentare)","desc":"# IMP-028: Workflow-Integration (Review \u2192 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\u00fcr .tasks/ System","desc":"# IMP-025: Ticket-Filter-API f\u00fcr .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 \u2014 Live-Changelog f\u00fcr parallele Agenten [Brainstorming]","desc":"# IMP-024: Work-Log Skill \u2014 Live-Changelog f\u00fcr parallele Agenten [Brainstorming]\n\n**Typ:** Improvement\n**Prio:** P2\n**St","pk":"SDRv4","tc":"IMP"},{"id":490,"title":"Skill `/setup-local-db` \u2014 Lokales Supabase Setup","desc":"# IMP-023: Skill `/setup-local-db` \u2014 Lokales Supabase Setup\n\n**Typ:** improvement\n**Prio:** P1\n**Status:** backlog\n**Ers","pk":"SDRv4","tc":"IMP"},{"id":489,"title":"Performance Observer \u2014 Modell/Agent-Performance-Tracking","desc":"# IMP-022: Performance Observer \u2014 Modell/Agent-Performance-Tracking\n\n**Typ:** improvement\n**Priorit\u00e4t:** P1\n**Status:** ","pk":"SDRv4","tc":"IMP"},{"id":351,"title":"/ticket-audit Skill \u2014 Automatisches Ticket-Review","desc":"# IMP-021: /ticket-audit Skill \u2014 Automatisches Ticket-Review\n\n**Typ:** improvement\n**Priorit\u00e4t:** P1\n**Status:** done\n**","pk":"SDRv4","tc":"IMP"},{"id":158,"title":"Transcript Analyzer Agent \u2014 Gespr\u00e4chsprotokolle \u2192 Kontakte + Kommentare","desc":"# Transcript Analyzer Agent \u2014 Gespr\u00e4chsprotokolle \u2192 Kontakte + Kommentare\n\n## Kontext\n\nNeuer Feature-Agent der Gespr\u00e4chs","pk":"SDRv4","tc":"IMP"},{"id":470,"title":"Workflow \u2014 Ticket-Pflicht + Worktree-Isolation + Dev-Branch-Schutz","desc":"# IMP-017: Workflow \u2014 Ticket-Pflicht + Worktree-Isolation + Dev-Branch-Schutz\n\n**Typ:** improvement\n**Priorit\u00e4t:** P0\n**","pk":"SDRv4","tc":"IMP"},{"id":146,"title":"VoiceBot Feedback Cedric \u2014 Kritische Qualit\u00e4tsprobleme","desc":"# IMP-016: VoiceBot Feedback Cedric \u2014 Kritische Qualit\u00e4tsprobleme\n\n**Typ:** improvement\n**Priorit\u00e4t:** P0\n**Status:** cl","pk":"SDRv4","tc":"IMP"},{"id":336,"title":"VoiceBot Feedback Timo \u2014 Kritische Qualit\u00e4tsprobleme","desc":"# IMP-015: VoiceBot Feedback Timo \u2014 Kritische Qualit\u00e4tsprobleme\n\n**Typ:** improvement\n**Priorit\u00e4t:** P0\n**Status:** clos","pk":"SDRv4","tc":"IMP"},{"id":350,"title":"Git-Grep als Secret-Orakel \u2014 LLM kann nach Secrets suchen","desc":"# IMP-014: Git-Grep als Secret-Orakel \u2014 LLM kann nach Secrets suchen\n\n**Typ:** improvement\n**Priorit\u00e4t:** 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\u00e4t:** 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\u00e4t:** 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\u00e4t:** 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\u00e4t:** 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\u00e4t:** 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\u00e4t:** 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\u00e4t:** 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\u00e4t:** 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\u00e4t:** 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\u00e4t:** 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\u00e4t:** P1\n**Status:** backlog\n**Erstellt:** 2026-04-03\n\n## B","pk":"SDRv4","tc":"IMP"},{"id":264,"title":"Stream Voice \u00fcberpr\u00fcfen (User-Review)","desc":"# IMP-002: Stream Voice \u00fcberpr\u00fcfen (User-Review)\n\n**Typ:** improvement\n**Priorit\u00e4t:** 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 \u2014 Single Source of Truth","desc":"# FEAT-248 \u2014 [Brainstorming] DB-basiertes Ticket-System \u2014 Single Source of Truth\n\n## Beschreibung\n\nAbl\u00f6sung des `.tasks/","pk":"SDRv4","tc":"FEAT"},{"id":266,"title":"[Brainstorming] Claude Code Container \u2014 Modell-Auswahl + Public/Company/Personal Workspace + Chat-Integration","desc":"# FEAT-247 \u2014 [Brainstorming] Claude Code Container \u2014 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\u00e4t:** P1\n**Status:** done\n**Erste","pk":"SDRv4","tc":"FEAT"},{"id":155,"title":"Anthropic-kompatibler Proxy-Endpoint f\u00fcr Claude Code CLI","desc":"# FEAT-243: Anthropic-kompatibler Proxy-Endpoint f\u00fcr Claude Code CLI\n\n**Typ:** feature\n**Priorit\u00e4t:** P1\n**Status:** rev","pk":"SDRv4","tc":"FEAT"},{"id":261,"title":"Veranstaltungen-Umbau + Terminart-System","desc":"## Ziel\nEvents \u2192 Veranstaltungen umbenennen, Event-Sessions \u2192 Termine, event_type entfernen, terminart als konfigurierba","pk":"SDRv4","tc":"FEAT"},{"id":335,"title":"[ZUSAMMENGEF\u00dcHRT] Lizenz-gebundene Docker-Container-Verschl\u00fcsselung","desc":"# FEAT-240: [ZUSAMMENGEF\u00dcHRT] Lizenz-gebundene Docker-Container-Verschl\u00fcsselung\n\n**Status:** closed\n**Zusammengef\u00fchrt in","pk":"SDRv4","tc":"FEAT"},{"id":259,"title":"Kanal \u2014 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\u00e4le: Telegram/WhatsApp direkt am CLI-Container konfigurieren","desc":"# FEAT-238 \u2014 Server-Kan\u00e4le: Telegram/WhatsApp direkt am CLI-Container konfigurieren\n\n**Typ:** feature\n**Priorit\u00e4t:** P1\n","pk":"SDRv4","tc":"FEAT"},{"id":134,"title":"Lead Scraper \u2014 Import Pipeline Endpoint","desc":"# FEAT-237: Lead Scraper \u2014 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\" \u2014 Element-Picker & Full-Page Screenshot","desc":"# FEAT-236: CLI Chat: \"Add Context\" \u2014 Element-Picker & Full-Page Screenshot\n\n**Typ:** feature\n**Priorit\u00e4t:** P2\n**Status","pk":"SDRv4","tc":"FEAT"},{"id":484,"title":"[Brainstorming] Browser-Steuerung via browser-use CLI \u2014 Override-Modus","desc":"# FEAT-235: [Brainstorming] Browser-Steuerung via browser-use CLI \u2014 Override-Modus\n\n**Typ:** feature\n**Priorit\u00e4t:** P2\n*","pk":"SDRv4","tc":"FEAT"},{"id":483,"title":"[Brainstorming] Self-hosted Browser-Isolation \u2014 Browserless/Steel.dev auf Hetzner","desc":"# FEAT-234: [Brainstorming] Self-hosted Browser-Isolation \u2014 Browserless/Steel.dev auf Hetzner\n\n**Typ:** FEAT\n**Priorit\u00e4t","pk":"SDRv4","tc":"FEAT"},{"id":482,"title":"[Brainstorming] Control-Handover-Logik \u2014 Claude vs. User-Steuerung, Race Conditions vermeiden","desc":"# FEAT-233: [Brainstorming] Control-Handover-Logik \u2014 Claude vs. User-Steuerung, Race Conditions vermeiden\n\n**Typ:** FEAT","pk":"SDRv4","tc":"FEAT"},{"id":481,"title":"[Brainstorming] Interaktive Browser-Steuerung via WebSocket \u2014 User steuert Browser im Frontend","desc":"# FEAT-232: [Brainstorming] Interaktive Browser-Steuerung via WebSocket \u2014 User steuert Browser im Frontend\n\n**Typ:** FEA","pk":"SDRv4","tc":"FEAT"},{"id":480,"title":"[Brainstorming] Browser-Streaming via WebSocket + CDP \u2014 CLI-Browser auf Website streamen","desc":"# FEAT-231: [Brainstorming] Browser-Streaming via WebSocket + CDP \u2014 CLI-Browser auf Website streamen\n\n**Typ:** FEAT\n**Pr","pk":"SDRv4","tc":"FEAT"},{"id":142,"title":"Agent Analytics \u2014 Dashboard mit Recommendations + Offer Engine","desc":"# FEAT-230 \u2014 Agent Analytics \u2014 Dashboard mit Recommendations + Offer Engine\n\n**Typ:** feature\n**Priorit\u00e4t:** P1\n**Status","pk":"SDRv4","tc":"FEAT"},{"id":479,"title":"Gantt Chart / Timeline UI f\u00fcr Tickets","desc":"# FEAT-229: Gantt Chart / Timeline UI f\u00fcr Tickets\n\n- **Typ:** feature\n- **Priorit\u00e4t:** 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\u00e4t:** 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\u00e4t:** P1\n- **Status:** backlog\n- **E","pk":"SDRv4","tc":"FEAT"},{"id":149,"title":"Admin UI: Agent Usage Analytics","desc":"# FEAT-226 \u2014 Admin UI: Agent Usage Analytics\n\n**Typ:** feature\n**Priorit\u00e4t:** P1\n**Status:** replaced\n**Ersetzt durch:**","pk":"SDRv4","tc":"FEAT"},{"id":141,"title":"Admin UI: Agent Registry Modul","desc":"# FEAT-225 \u2014 Admin UI: Agent Registry Modul\n\n**Typ:** feature\n**Priorit\u00e4t:** P1\n**Status:** replaced\n**Ersetzt durch:** ","pk":"SDRv4","tc":"FEAT"},{"id":169,"title":"Agent/Skill Registry API","desc":"# FEAT-224 \u2014 Agent/Skill Registry API\n\n**Typ:** feature\n**Priorit\u00e4t:** P1\n**Status:** review\n**Epic:** Agent Registry (F","pk":"SDRv4","tc":"FEAT"},{"id":161,"title":"Agent/Skill Registry DB-Erweiterung","desc":"# FEAT-223 \u2014 Agent/Skill Registry DB-Erweiterung\n\n**Typ:** feature\n**Priorit\u00e4t:** P1\n**Status:** review\n**Epic:** Agent ","pk":"SDRv4","tc":"FEAT"},{"id":153,"title":"CLI Chat \u2014 Cronjob-gesteuerte Loop-Prompts (unabh\u00e4ngig von Claude Code)","desc":"## Idee\n\nIn der Weboberfl\u00e4che k\u00f6nnen Cronjobs konfiguriert werden, die:\n1. Einen vordefinierten Prompt feuern\n2. Eine **","pk":"SDRv4","tc":"FEAT"},{"id":339,"title":"Custom Fields \u2014 Contact, Company, Sales List","desc":"# FEAT-221: Custom Fields \u2014 Contact, Company, Sales List\n\n**Typ:** feature\n**Priorit\u00e4t:** P1\n**Status:** done\n**Erstellt","pk":"SDRv4","tc":"FEAT"},{"id":504,"title":"Telegram \u2192 CLI-Container MVP","desc":"# FEAT-220: Telegram \u2192 CLI-Container MVP\n\n**Status:** review\n**Priorit\u00e4t:** 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\u00e4t:** 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\u00e4t:** P1\n**Status:** don","pk":"SDRv4","tc":"FEAT"},{"id":156,"title":"Chat-Interaktionen: Reactions, Markierungen, Antworten & Weiterleiten","desc":"# FEAT-217: Chat-Interaktionen \u2014 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\u00fchrbare CLI-Sessions","desc":"# FEAT-215: .md Dateien als ausf\u00fchrbare CLI-Sessions\n\n## Beschreibung\n\n`.md`-Dateien im File Explorer sind \"ausf\u00fchrbar\" ","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** \u2014 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 \u2014 Zentrales Hosting in SDRv4","desc":"# FEAT-211: Telegram-Bot pro Projekt \u2014 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\u00fcr den AI Workspace","pk":"SDRv4","tc":"FEAT"},{"id":472,"title":"[Brainstorming] Chat\u2194CLI Hybrid-Modus (Skill-basierte Delegation)","desc":"# FEAT-209: [Brainstorming] Chat\u2194CLI Hybrid-Modus (Skill-basierte Delegation)\n\n**Typ:** feature\n**Priorit\u00e4t:** 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\u00e4t:** 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\u00e4t:** 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\u00e4t:** 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\u00e4t:** 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\u00e4t:** 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\u00e4t:** P3\n**Status:** backlog\n**Erst","pk":"SDRv4","tc":"FEAT"},{"id":464,"title":"[ZUSAMMENGEF\u00dcHRT] Admin-App Restrukturierung","desc":"# FEAT-202: [ZUSAMMENGEF\u00dcHRT] Admin-App Restrukturierung\n\n**Status:** closed\n**Zusammengef\u00fchrt 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\u00e4t:** P2\n**Status:** backlog\n","pk":"SDRv4","tc":"FEAT"},{"id":462,"title":"[Brainstorming] Voice-Kanal f\u00fcr Chat + CLI","desc":"# FEAT-200: [Brainstorming] Voice-Kanal f\u00fcr Chat + CLI\n\n**Typ:** feature\n**Priorit\u00e4t:** P2\n**2026-04-09 \u2014 P1\u2192P2 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\u00e4t:** P2\n**2026-04-09 \u2014 P1\u2192P2","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\u00e4t:** 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\u00e4t:** 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\u00e4t:** P2\n**2026-04-09 ","pk":"SDRv4","tc":"FEAT"},{"id":457,"title":"User-App-Publishing \u2014 Eigene Apps ver\u00f6ffentlichen/verkaufen","desc":"# FEAT-195: User-App-Publishing \u2014 Eigene Apps ver\u00f6ffentlichen/verkaufen\n\n**Typ:** feature\n**Priorit\u00e4t:** P3\n**Status:** ","pk":"SDRv4","tc":"FEAT"},{"id":456,"title":"Theme-Marketplace \u2014 Vorkonfigurierte Designs","desc":"# FEAT-194: Theme-Marketplace \u2014 Vorkonfigurierte Designs\n\n**Typ:** feature\n**Priorit\u00e4t:** P2\n**Status:** backlog\n**Erste","pk":"SDRv4","tc":"FEAT"},{"id":455,"title":"Container-Templates \u2014 Nackte Next.js/SDR-Instanz als Startpunkt","desc":"# FEAT-193: Container-Templates \u2014 Nackte Next.js/SDR-Instanz als Startpunkt\n\n**Typ:** feature\n**Priorit\u00e4t:** P2\n**2026-0","pk":"SDRv4","tc":"FEAT"},{"id":454,"title":"App Store Engine \u2014 Install/Uninstall/Manifest-System","desc":"# FEAT-192: App Store Engine \u2014 Install/Uninstall/Manifest-System\n\n**Typ:** feature\n**Priorit\u00e4t:** P2\n**2026-04-09 \u2014 P1\u2192P","pk":"SDRv4","tc":"FEAT"},{"id":453,"title":"Thinking-Stufen \u2014 Abgestufte Denktiefe pro Provider","desc":"# FEAT-191: Thinking-Stufen \u2014 Abgestufte Denktiefe pro Provider\n\n**Typ:** feature\n**Priorit\u00e4t:** P2\n**2026-04-09 \u2014 P1\u2192P2","pk":"SDRv4","tc":"FEAT"},{"id":451,"title":"AI Workspace UI-Shell \u2014 Chat-Modus + Pins + File Explorer + App Store UI","desc":"# FEAT-190: AI Workspace UI-Shell \u2014 Chat-Modus + Pins + File Explorer + App Store UI\n\n**Typ:** feature\n**Priorit\u00e4t:** 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\u00e4ndig auf dev implementiert, ","pk":"SDRv4","tc":"FEAT"},{"id":449,"title":"Agent/Skill-Registry \u2014 Dateisystem-Sync + App-Bundles","desc":"# FEAT-188: Agent/Skill-Registry \u2014 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 \u2014 Einbahnstra\u00dfe der Autorit\u00e4t","desc":"# FEAT-187: CLI User-Authority-Chain \u2014 Einbahnstra\u00dfe der Autorit\u00e4t\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 \u2192 Twin des Default-Chats (ChatInterface + CLI-Adapter)","desc":"# FEAT-177: CLI Chat \u2192 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 \u2014 Analytics Dashboard + Gesamtkosten","desc":"# FEAT-174: UI \u2014 Analytics Dashboard + Gesamtkosten\n\n**Typ:** feature\n**Prio:** P1\n**Status:** done\n**Commits:** aaeba07","pk":"SDRv4","tc":"FEAT"},{"id":440,"title":"UI \u2014 Audit History + Transkript-Viewer","desc":"# FEAT-173: UI \u2014 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 \u2014 Leaderboard + Agent-Detail (Radar-Chart)","desc":"# FEAT-172: UI \u2014 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 \u2014 Runs, Reviews, Analytics, Recommendations","desc":"# FEAT-169: API-Endpoints \u2014 Runs, Reviews, Analytics, Recommendations\n\n**Typ:** feature\n**Prio:** P1\n**Status:** done\n**","pk":"SDRv4","tc":"FEAT"},{"id":430,"title":"DB-Migration \u2014 Performance-Tabellen + pg_cron Aggregation","desc":"# FEAT-168: DB-Migration \u2014 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 \u2192 DB + Storage)","desc":"# FEAT-167: Seed-Import Script (manifest.json \u2192 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 \u2014 Kanal-Integration (Telegram, WhatsApp, Web)","desc":"# Chat als Hub \u2014 Kanal-Integration (Telegram, WhatsApp, Web)\n\n## Kontext\n\nTelegram/WhatsApp sind **Kan\u00e4le**, keine Bots.","pk":"SDRv4","tc":"FEAT"},{"id":236,"title":"Social Media Automation Gastro \u2014 Event-basierte Kampagnen","desc":"# Social Media Automation Gastro \u2014 Event-basierte Kampagnen\n\n## Kontext\nAus Gespr\u00e4chsprotokoll vom 2026-04-05. Burger Bu","pk":"SDRv4","tc":"FEAT"},{"id":235,"title":"Bestellpreview \u2014 Live-Anzeige laufender Bestellungen im Backend","desc":"# Bestellpreview \u2014 Live-Anzeige laufender Bestellungen im Backend\n\n## Kontext\nAus Gespr\u00e4chsprotokoll vom 2026-04-05. Ins","pk":"SDRv4","tc":"FEAT"},{"id":115,"title":"Voice-Kanal Gastro \u2014 KI-Telefonbestellungen","desc":"# Voice-Kanal Gastro \u2014 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\u00e4tigung","desc":"# Fahrer-Tracking & Lieferbest\u00e4tigung\n\n## Kontext\n\nBurger Bulle will wissen: Wie lange braucht eine Bestellung von Einga","pk":"SDRv4","tc":"FEAT"},{"id":135,"title":"Routenplanung & Bestellungsb\u00fcndelung \u2014 Google Maps API","desc":"# Routenplanung & Bestellungsb\u00fcndelung \u2014 Google Maps API\n\n## Kontext\n\nBurger Bulle hat 6 Filialen in Gelsenkirchen, alle","pk":"SDRv4","tc":"FEAT"},{"id":132,"title":"Multilingual Gastro \u2014 Arabisch, T\u00fcrkisch, europ\u00e4ische Sprachen","desc":"# Multilingual Gastro \u2014 Arabisch, T\u00fcrkisch, europ\u00e4ische Sprachen\n\n## Kontext\n\nBurger Bulle: \"Arabisch ist sehr sehr inte","pk":"SDRv4","tc":"FEAT"},{"id":124,"title":"Payment-Integration Gastro \u2014 Stripe/PayPal f\u00fcr Bestellungen","desc":"# Payment-Integration Gastro \u2014 Stripe/PayPal f\u00fcr Bestellungen\n\n## Kontext\n\nBurger Bulle will weg von Barzahlung (Fake-Be","pk":"SDRv4","tc":"FEAT"},{"id":245,"title":"Bestellsystem-Anbindung \u2014 Integration Burger Bulle Backend","desc":"# Bestellsystem-Anbindung \u2014 Integration Burger Bulle Backend\n\n## Kontext\n\nBestellungen m\u00fcssen im bestehenden System von ","pk":"SDRv4","tc":"FEAT"},{"id":246,"title":"Kundenprofil & Pr\u00e4ferenzen \u2014 Personalisierte Empfehlungen","desc":"# Kundenprofil & Pr\u00e4ferenzen \u2014 Personalisierte Empfehlungen\n\n## Kontext\n\nInspiriert vom Pizza Hut Modell: System kennt B","pk":"SDRv4","tc":"FEAT"},{"id":244,"title":"Bestellverifikation \u2014 Anti-Fake-Mechanismus","desc":"# Bestellverifikation \u2014 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 \u2014 Telegram + Website-Chat","desc":"# Burger Bulle Multi-Channel \u2014 Telegram + Website-Chat\n\n## Kontext\n\nDer Chatbot (FEAT-151) muss \u00fcber mehrere Kan\u00e4le erre","pk":"SDRv4","tc":"FEAT"},{"id":243,"title":"Burger Bulle Chatbot MVP \u2014 Speisekarten-Wissen + Upselling","desc":"# Burger Bulle Chatbot MVP \u2014 Speisekarten-Wissen + Upselling\n\n## Kontext\n\nErster Baustein des Gastro-MVPs f\u00fcr Burger Bul","pk":"SDRv4","tc":"FEAT"},{"id":433,"title":"Registry UI \u2014 Verwaltungsoberfl\u00e4che f\u00fcr Agents/Skills","desc":"# FEAT-150: Registry UI \u2014 Verwaltungsoberfl\u00e4che f\u00fcr Agents/Skills\n\n**Typ:** feature\n**Prio:** P2\n**Status:** review\n**Er","pk":"SDRv4","tc":"FEAT"},{"id":432,"title":"Registry-Sync \u2014 Agents/Skills aus Dateisystem katalogisieren","desc":"# FEAT-149: Registry-Sync \u2014 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 \u2014 ","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 \u2014 P1\u2192P2 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 \u2014 P1\u2192P2 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 \u2014 P1\u2192P2 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 \u2014 P1\u2192P2 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 \u2014 P1\u2192P2 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 \u2014 P1\u2192P2 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 \u2014 P1\u2192P2 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 \u2014 P1\u2192P2 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 \u2014 P1\u2192P2 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 \u2014 P1\u2192P2 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 \u2014 P1\u2192P2 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 \u2014 P1\u2192P2 herabgestuft (Ticket-Audit).*","pk":"SDRv4","tc":"FEAT"},{"id":412,"title":"DB-Modularisierung \u2014 \u00dcbergeordnetes Epic","desc":"# FEAT-132: DB-Modularisierung \u2014 \u00dcbergeordnetes Epic\n\n**Typ:** feature\n**Priorit\u00e4t:** P1\n**Status:** in_progress\n**Notiz","pk":"SDRv4","tc":"FEAT"},{"id":411,"title":"Container & Kan\u00e4le \u2014 \u00dcbergeordnetes Epic","desc":"# FEAT-131: Container & Kan\u00e4le \u2014 \u00dcbergeordnetes Epic\n\n**Typ:** feature\n**Priorit\u00e4t:** P0\n**Status:** in_progress\n**Notiz","pk":"SDRv4","tc":"FEAT"},{"id":298,"title":"W\u00e4hrungsanzeige-Infrastruktur","desc":"# FEAT-130: W\u00e4hrungsanzeige-Infrastruktur\n\n## Beschreibung\n\nBasisinfrastruktur f\u00fcr einheitliche W\u00e4hrungsanzeige im Front","pk":"SDRv4","tc":"FEAT"},{"id":379,"title":"Benutzerrollen \u2014 Konsolidierte Verwaltung mit Berechtigungs-Tabs","desc":"# FEAT-129: Benutzerrollen \u2014 Konsolidierte Verwaltung mit Berechtigungs-Tabs\n\n**Typ:** feature\n**Priorit\u00e4t:** 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\u00e4t:** P1\n**Status:** backlog\n**Abh\u00e4ngigkeiten:** FE","pk":"SDRv4","tc":"FEAT"},{"id":408,"title":"Project Templates / Blueprints","desc":"# FEAT-127: Project Templates / Blueprints\n\n**Typ:** feature\n**Priorit\u00e4t:** P1\n**Status:** backlog\n**Abh\u00e4ngigkeiten:** 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\u00e4t:** 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 \u2014 Autonomes Session-Management","desc":"# FEAT-120: CLI-Bot Self-Orchestration \u2014 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\u00fcr CLI-Container","desc":"# FEAT-119: Self-Managing Memory System f\u00fcr 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 \u2014 Firmenweit geteilter API-Key","desc":"# FEAT-117: BYOK per Company \u2014 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 \u2014 Eigene API-Keys hinterlegen","desc":"# FEAT-116: BYOK per User \u2014 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\u00f6nlichkeit im Senity Website-Chat","desc":"# FEAT-115: CLI-Pers\u00f6nlichkeit 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\u00fcsselung f\u00fcr CLI-Chats","desc":"# FEAT-114: Passwortschutz & E2E-Verschl\u00fcsselung f\u00fcr 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\u00fcr CLI-Projekte","desc":"# FEAT-112: SMS-Kanal f\u00fcr 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\u00fcr CLI-Projekte","desc":"# FEAT-111: WhatsApp-Kanal f\u00fcr 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 \u2014 Integrationen als Apps","desc":"# FEAT-107: App-Store Infrastruktur \u2014 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 \u2014 Eigene Modellnamen","desc":"# FEAT-104: White-Label Modelle \u2014 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 \u2014 Isolierte CLI-Container als Produkt","desc":"# FEAT-102: Agent Teams MVP \u2014 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 \u2014 McDonald's-Style Paket-Builder","desc":"# FEAT-101: Abo-Konfigurator UI \u2014 McDonald's-Style Paket-Builder\n\n**Typ:** feature\n**Priorit\u00e4t:** P2\n**Status:** backlog","pk":"SDRv4","tc":"FEAT"},{"id":316,"title":"Add-on & Upgrade System \u2014 Modulare Extras (McDonald's \"Dazu bestellen\")","desc":"# FEAT-100: Add-on & Upgrade System \u2014 Modulare Extras (McDonald's \"Dazu bestellen\")\n\n**Typ:** feature\n**Priorit\u00e4t:** P2\n","pk":"SDRv4","tc":"FEAT"},{"id":308,"title":"Feature-Module System \u2014 Freischaltbare Funktions-Bausteine","desc":"# FEAT-099: Feature-Module System \u2014 Freischaltbare Funktions-Bausteine\n\n**Typ:** feature\n**Priorit\u00e4t:** P1\n**Status:** b","pk":"SDRv4","tc":"FEAT"},{"id":301,"title":"Abo-System Core \u2014 Subscription Plans mit Feature-Gating & Vertragsbedingungen","desc":"# FEAT-098: Abo-System Core \u2014 Subscription Plans mit Feature-Gating & Vertragsbedingungen\n\n**Typ:** feature\n**Priorit\u00e4t:","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\u00e4t:** 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\u00e4t:** 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\u00e4t:** P1\n**Status:** backlog\n**Abh\u00e4ngigk","pk":"SDRv4","tc":"FEAT"},{"id":404,"title":"Round Robin Modell f\u00fcr API Keys (Puter)","desc":"# FEAT-094: Round Robin Modell f\u00fcr API Keys (Puter)\n\n**Typ:** feature\n**Priorit\u00e4t:** P2\n**Status:** backlog\n**Abh\u00e4ngigke","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\u00e4t:** 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\u00e4t:** P2\n**Status:** backlog\n**Abh\u00e4ngigkeiten:** ","pk":"SDRv4","tc":"FEAT"},{"id":402,"title":"Chat Tool-Calling f\u00fcr Lead Scraper und Rechtsberatung pr\u00fcfen","desc":"# FEAT-091: Chat Tool-Calling f\u00fcr Lead Scraper und Rechtsberatung pr\u00fcfen\n\n**Typ:** feature\n**Priorit\u00e4t:** 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\u00e4t:** P2\n**Status:** backlog\n**Abh","pk":"SDRv4","tc":"FEAT"},{"id":400,"title":"Lizenzmanagement","desc":"# FEAT-089: Lizenzmanagement\n\n**Typ:** feature\n**Priorit\u00e4t:** P2\n**Status:** backlog\n**Abh\u00e4ngigkeiten:** 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\u00e4t:** P3\n**Statu","pk":"SDRv4","tc":"FEAT"},{"id":397,"title":"Kunde per SMS oder Email \u00fcber Gespr\u00e4che informieren","desc":"# FEAT-087: Kunde per SMS oder Email \u00fcber Gespr\u00e4che informieren\n\n**Typ:** feature\n**Priorit\u00e4t:** P2\n**Status:** backlog\n","pk":"SDRv4","tc":"FEAT"},{"id":396,"title":"Kunde darf LLM-Auswahl nicht sehen + Einstellungen eingeschr\u00e4nkt","desc":"# FEAT-086: Kunde darf LLM-Auswahl nicht sehen + Einstellungen eingeschr\u00e4nkt\n\n**Typ:** feature\n**Priorit\u00e4t:** P1\n**Statu","pk":"SDRv4","tc":"FEAT"},{"id":395,"title":"Kostenaufschl\u00fcsselung nicht f\u00fcr Kunden sichtbar (nur eigene Kosten, EUR statt USD)","desc":"# FEAT-085: Kostenaufschl\u00fcsselung nicht f\u00fcr Kunden sichtbar (nur eigene Kosten, EUR statt USD)\n\n**Typ:** feature\n**Prior","pk":"SDRv4","tc":"FEAT"},{"id":394,"title":"Logging \u2014 Transkribieren von Telefongespr\u00e4chen und Auswertungen","desc":"# FEAT-084: Logging \u2014 Transkribieren von Telefongespr\u00e4chen und Auswertungen\n\n**Typ:** feature\n**Priorit\u00e4t:** P2\n**Status","pk":"SDRv4","tc":"FEAT"},{"id":393,"title":"Prompt Generator f\u00fcr Voicebots \u2014 Standardisierung","desc":"# FEAT-083: Prompt Generator f\u00fcr Voicebots \u2014 Standardisierung\n\n**Typ:** feature\n**Priorit\u00e4t:** P2\n**Status:** backlog\n**","pk":"SDRv4","tc":"FEAT"},{"id":392,"title":"Produkt-Token-Integration \u2014 Abrechnung beim Produktkauf","desc":"# FEAT-082: Produkt-Token-Integration \u2014 Abrechnung beim Produktkauf\n\n**Typ:** feature\n**Priorit\u00e4t:** P2\n**Status:** back","pk":"SDRv4","tc":"FEAT"},{"id":391,"title":"Produkt-Admin UI \u2014 CRUD f\u00fcr Produkte & Preise","desc":"# FEAT-081: Produkt-Admin UI \u2014 CRUD f\u00fcr Produkte & Preise\n\n**Typ:** feature\n**Priorit\u00e4t:** P1\n**Status:** backlog\n**Abh\u00e4","pk":"SDRv4","tc":"FEAT"},{"id":322,"title":"KI-Telefonagent f\u00fcr Bestellungen (Gastronomie)","desc":"# FEAT-080: KI-Telefonagent f\u00fcr Bestellungen (Gastronomie)\n\n| Feld | Wert |\n|------|------|\n| Typ | feature |\n| Prio | P","pk":"SDRv4","tc":"FEAT"},{"id":95,"title":"Codex-Reste entfernen \u2014 Cleanup","desc":"# FEAT-079 \u2014 Codex-Reste entfernen \u2014 Cleanup\n\n**Typ:** feature | **Prio:** P2 | **Status:** backlog\n**Erstellt:** 2026-0","pk":"SDRv4","tc":"FEAT"},{"id":229,"title":"CLI-Provider-Routing \u2014 Unified Spawner mit 4 Providern","desc":"# FEAT-078 \u2014 CLI-Provider-Routing \u2014 Unified Spawner mit 4 Providern\n\n**Typ:** feature | **Prio:** P2 | **Status:** backl","pk":"SDRv4","tc":"FEAT"},{"id":230,"title":"Claude-Delegator Skill \u2014 Claude Code als Cross-Check-Alternative","desc":"# FEAT-077 \u2014 Claude-Delegator Skill \u2014 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 \u2014 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 \u2014 Selbst-konfigurierende KI-Agenten mit Wissensdatenbank","desc":"# FEAT-074: Agent Creator \u2014 Selbst-konfigurierende KI-Agenten mit Wissensdatenbank\n\n**Typ:** feature\n**Prio:** P1\n**Stat","pk":"SDRv4","tc":"FEAT"},{"id":390,"title":"Implementation Bot \u2014 Telegram \u2192 Brainstorming + Code-Ausf\u00fchrung","desc":"# FEAT-073: Implementation Bot \u2014 Telegram \u2192 Brainstorming + Code-Ausf\u00fchrung\n\n**Typ:** feature\n**Prio:** P2\n**Status:** r","pk":"SDRv4","tc":"FEAT"},{"id":389,"title":"KI-Rechtsberatung via Telegram \u2014 mit Dokument-Upload","desc":"# FEAT-072: KI-Rechtsberatung via Telegram \u2014 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 \u2014 Telegram \u2192 Ticket-Erstellung + Auto-Fix","desc":"# FEAT-071: Bug-Report Bot \u2014 Telegram \u2192 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\u00e4t:** medium\n**Status:** replaced\n**Ersetzt durch:** ","pk":"SDRv4","tc":"FEAT"},{"id":307,"title":"Chat-Verschl\u00fcsselung & Kommunikationssicherheit","desc":"# FEAT-069: Chat-Verschl\u00fcsselung & Kommunikationssicherheit\n\n**Typ:** feature\n**Priorit\u00e4t:** 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\u00e4t:** medium\n**Status:** backlog\n**Abh\u00e4ngigkeiten","pk":"SDRv4","tc":"FEAT"},{"id":386,"title":"Bot-Analytics \u2014 Metriken pro Bot","desc":"# FEAT-067: Bot-Analytics \u2014 Metriken pro Bot\n\n**Typ:** feature\n**Priorit\u00e4t:** 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\u00e4t:** low\n**Status:** backlog\n**Abh\u00e4ngigkeiten","pk":"SDRv4","tc":"FEAT"},{"id":384,"title":"Slack-Adapter \u2014 Slack Bot Integration","desc":"# FEAT-064: Slack-Adapter \u2014 Slack Bot Integration\n\n**Typ:** feature\n**Priorit\u00e4t:** low\n**Status:** backlog\n**Abh\u00e4ngigkei","pk":"SDRv4","tc":"FEAT"},{"id":383,"title":"WhatsApp-Adapter \u2014 WhatsApp Business API Integration","desc":"# FEAT-063: WhatsApp-Adapter \u2014 WhatsApp Business API Integration\n\n**Typ:** feature\n**Priorit\u00e4t:** medium\n**Status:** bac","pk":"SDRv4","tc":"FEAT"},{"id":329,"title":"Bot-Plattform MVP \u2014 Multi-Owner Bot-System","desc":"# FEAT-062: Bot-Plattform MVP \u2014 Multi-Owner Bot-System\n\n**Typ:** feature\n**Priorit\u00e4t:** high\n**Status:** done\n**Abh\u00e4ngig","pk":"SDRv4","tc":"FEAT"},{"id":131,"title":"AI Pattern Generator \u2014 API-only Regel-Generierung + Validierung","desc":"# FEAT-061: AI Pattern Generator \u2014 API-only Regel-Generierung + Validierung\n\n**Typ:** feature\n**Priorit\u00e4t:** P1\n**Status","pk":"SDRv4","tc":"FEAT"},{"id":314,"title":"AI Pattern Custom Rules \u2014 Benutzerdefinierte KI-Muster","desc":"# FEAT-060: AI Pattern Custom Rules \u2014 Benutzerdefinierte KI-Muster\n\n**Typ:** feature\n**Priorit\u00e4t:** P2\n**Status:** backl","pk":"SDRv4","tc":"FEAT"},{"id":306,"title":"AI Pattern Built-in Types \u2014 Vorgefertigte Aussprachregeln","desc":"# FEAT-059: AI Pattern Built-in Types \u2014 Vorgefertigte Aussprachregeln\n\n**Typ:** feature\n**Priorit\u00e4t:** P2\n**Status:** ba","pk":"SDRv4","tc":"FEAT"},{"id":109,"title":"AI Pattern Replacement Engine \u2014 Kontextabh\u00e4ngige Aussprachkorrektur","desc":"# FEAT-058: AI Pattern Replacement Engine \u2014 Kontextabh\u00e4ngige Aussprachkorrektur\n\n**Typ:** feature\n**Priorit\u00e4t:** P1\n**St","pk":"SDRv4","tc":"FEAT"},{"id":382,"title":"Bot Token Billing \u2014 Budget & Owner/Requester","desc":"# FEAT-057: Bot Token Billing \u2014 Budget & Owner/Requester\n\n**Typ:** feature\n**Priorit\u00e4t:** P2\n**Status:** backlog\n**Abh\u00e4n","pk":"SDRv4","tc":"FEAT"},{"id":381,"title":"Multi-Currency Display \u2014 Exchange Rates","desc":"# FEAT-056: Multi-Currency Display \u2014 Exchange Rates\n\n**Typ:** feature\n**Priorit\u00e4t:** P2\n**Status:** backlog\n**Abh\u00e4ngigke","pk":"SDRv4","tc":"FEAT"},{"id":380,"title":"Token Dashboard \u2014 Admin & User UI","desc":"# FEAT-055: Token Dashboard \u2014 Admin & User UI\n\n**Typ:** feature\n**Priorit\u00e4t:** P2\n**Status:** backlog\n**Abh\u00e4ngigkeiten:*","pk":"SDRv4","tc":"FEAT"},{"id":375,"title":"Token Packages \u2014 Kauf & Gutschriften","desc":"# FEAT-054: Token Packages \u2014 Kauf & Gutschriften\n\n**Typ:** feature\n**Priorit\u00e4t:** P2\n**Status:** backlog\n**Abh\u00e4ngigkeite","pk":"SDRv4","tc":"FEAT"},{"id":377,"title":"Token Model Pricing \u2014 Tiers & Per-Model Preise","desc":"# FEAT-053: Token Model Pricing \u2014 Tiers & Per-Model Preise\n\n**Typ:** feature\n**Priorit\u00e4t:** P1\n**Status:** backlog\n**Abh","pk":"SDRv4","tc":"FEAT"},{"id":376,"title":"Token Economy Core \u2014 Accounts, Transactions, Debit Pipeline","desc":"# FEAT-052: Token Economy Core \u2014 Accounts, Transactions, Debit Pipeline\n\n**Typ:** feature\n**Priorit\u00e4t:** P1\n**Status:** ","pk":"SDRv4","tc":"FEAT"},{"id":218,"title":"Ticket \u2192 Asana + Trello Bidirektional Sync","desc":"# FEAT-051: Ticket \u2192 Asana + Trello Bidirektional Sync\n\n**Typ:** feature\n**Priorit\u00e4t:** P1\n**Status:** backlog\n**Abh\u00e4ngi","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\u00e4t:** P2\n**Status:** backlog","pk":"SDRv4","tc":"FEAT"},{"id":373,"title":"Lead-Scraper \u2014 \u00d6ffnungszeiten ermitteln","desc":"# FEAT-049: Lead-Scraper \u2014 \u00d6ffnungszeiten ermitteln\n\n**Typ:** feature\n**Priorit\u00e4t:** P2\n**Status:** backlog\n**Abh\u00e4ngigke","pk":"SDRv4","tc":"FEAT"},{"id":372,"title":"\u00d6ffnungszeiten f\u00fcr Unternehmen","desc":"# FEAT-048: \u00d6ffnungszeiten f\u00fcr Unternehmen\n\n**Typ:** feature\n**Priorit\u00e4t:** P2\n**Status:** backlog\n**Abh\u00e4ngigkeiten:** \u2014","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\u00e4t:** P1\n**Status:** done\n**","pk":"SDRv4","tc":"FEAT"},{"id":217,"title":"Stream Replace \u2014 LLM-Stream Aussprachkorrektur","desc":"# FEAT-046: Stream Replace \u2014 LLM-Stream Aussprachkorrektur\n\n**Typ:** feature\n**Priorit\u00e4t:** P1\n**Status:** done\n**Abh\u00e4ng","pk":"SDRv4","tc":"FEAT"},{"id":209,"title":"Universal Import/Export Engine","desc":"# FEAT-045: Universal Import/Export Engine\n\n**Typ:** feature\n**Priorit\u00e4t:** P1\n**Status:** backlog\n**Abh\u00e4ngigkeiten:** \u2014","pk":"SDRv4","tc":"FEAT"},{"id":216,"title":"i18n Language Installer \u2014 KI-gest\u00fctzte Sprachgenerierung","desc":"# FEAT-044: i18n Language Installer \u2014 KI-gest\u00fctzte Sprachgenerierung\n\n**Typ:** feature\n**Priorit\u00e4t:** P2\n**Status:** bac","pk":"SDRv4","tc":"FEAT"},{"id":108,"title":"Bot Entities \u2014 Multi-Bot Management","desc":"# FEAT-043: Bot Entities \u2014 Multi-Bot Management\n\n**Typ:** feature\n**Priorit\u00e4t:** 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\u00e4t:** P1\n**Status:** done\n**Abh\u00e4ngigkeiten:** FEAT-038,","pk":"SDRv4","tc":"FEAT"},{"id":107,"title":"Chat Channels \u2014 Abstraktion & Message Routing","desc":"# FEAT-038: Chat Channels \u2014 Abstraktion & Message Routing\n\n**Typ:** feature\n**Priorit\u00e4t:** P1\n**Status:** done\n**Abh\u00e4ngi","pk":"SDRv4","tc":"FEAT"},{"id":213,"title":"Claude Sprint Partner Bot","desc":"# FEAT-037: Claude Sprint Partner Bot\n\n**Typ:** feature\n**Priorit\u00e4t:** 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\u00e4t:** P2\n**Status:** backlog\n**Abh\u00e4ngigkeiten:** ","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\u00e4t:** P2\n**Status:** backlog\n**Abh","pk":"SDRv4","tc":"FEAT"},{"id":114,"title":"BYOK Pricing \u2014 Platform Fee Modell","desc":"# FEAT-034: BYOK Pricing \u2014 Platform Fee Modell\n\n**Typ:** feature\n**Priorit\u00e4t:** P2\n**Status:** backlog\n**Abh\u00e4ngigkeiten:","pk":"SDRv4","tc":"FEAT"},{"id":102,"title":"Custom Provider Endpoints","desc":"# FEAT-033: Custom Provider Endpoints\n\n**Typ:** feature\n**Priorit\u00e4t:** P2\n**Status:** backlog\n**Abh\u00e4ngigkeiten:** FEAT-0","pk":"SDRv4","tc":"FEAT"},{"id":328,"title":"BYOK \u2014 Bring Your Own API Keys","desc":"# FEAT-032: BYOK \u2014 Bring Your Own API Keys\n\n**Typ:** feature\n**Priorit\u00e4t:** P2\n**Status:** backlog\n**Abh\u00e4ngigkeiten:** 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\u00e4t:** 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\u00e4t:** P3\n**Status:** backlog\n**Abh\u00e4ngigke","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\u00e4t:** P2\n**Status:** backlog\n**Abh\u00e4ngigk","pk":"SDRv4","tc":"FEAT"},{"id":368,"title":"Unified AI Gateway","desc":"# FEAT-028: Unified AI Gateway\n\n**Typ:** feature\n**Priorit\u00e4t:** P2\n**Status:** backlog\n**Abh\u00e4ngigkeiten:** \u2014\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\u00e4t:** P2\n**Status:** backlog\n**Abh\u00e4ngigkeiten:** 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\u00e4t:** P1\n**Status:** backlog\n**Abh","pk":"SDRv4","tc":"FEAT"},{"id":202,"title":"Chat-Sync Bidirektional (Telegram \u2194 Senity Dashboard)","desc":"# FEAT-025: Chat-Sync Bidirektional (Telegram \u2194 Senity Dashboard)\n\n**Typ:** feature\n**Priorit\u00e4t:** 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\u00e4t:** P1\n**Status:** done\n**Abh\u00e4ngigkeiten:** ~RES-001\n**Epic:*","pk":"SDRv4","tc":"FEAT"},{"id":367,"title":"\"Wunsch dir was\" \u2014 Feature-Request-System","desc":"# FEAT-023: \"Wunsch dir was\" \u2014 Feature-Request-System\n\n**Typ:** feature\n**Priorit\u00e4t:** 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\u00e4t:** 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\u00e4t:** 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\u00e4t:** 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\u00e4t:** 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\u00e4t:** 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\u00e4t:** 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\u00e4t:** 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\u00e4t:** P2\n**Status:** backlog\n**Erstellt:** 2026-04-03","pk":"SDRv4","tc":"FEAT"},{"id":355,"title":"Prompt Types einf\u00fchren","desc":"# FEAT-014: Prompt Types einf\u00fchren\n\n**Typ:** feature\n**Priorit\u00e4t:** P2\n**Status:** backlog\n**Erstellt:** 2026-04-03\n**Ab","pk":"SDRv4","tc":"FEAT"},{"id":353,"title":"Lead Scraper \u2014 Flexiblere Konfiguration","desc":"# FEAT-013: Lead Scraper \u2014 Flexiblere Konfiguration\n\n**Typ:** feature\n**Priorit\u00e4t:** P2\n**Status:** backlog\n**Erstellt:*","pk":"SDRv4","tc":"FEAT"},{"id":195,"title":"Lead Scraper \u2014 Automatische Vertriebslisten","desc":"# FEAT-012: Lead Scraper \u2014 Automatische Vertriebslisten\n\n**Typ:** feature\n**Priorit\u00e4t:** P1\n**Status:** done\n**Erstellt:","pk":"SDRv4","tc":"FEAT"},{"id":196,"title":"Lead Scraper \u2014 LinkedIn-Schnittstelle","desc":"# FEAT-011: Lead Scraper \u2014 LinkedIn-Schnittstelle\n\n**Typ:** feature\n**Priorit\u00e4t:** P1\n**Status:** backlog\n**Erstellt:** ","pk":"SDRv4","tc":"FEAT"},{"id":160,"title":"Lead Scraper \u2014 Handelsregister-Schnittstelle","desc":"# FEAT-010: Lead Scraper \u2014 Handelsregister-Schnittstelle\n\n**Typ:** feature\n**Priorit\u00e4t:** 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 \u2014 \u00e4hnlich 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\u00fctzt 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\u00fcr 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\u00e4ndig 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\u00fchrt selbstst\u00e4ndig Erstgespr\u00e4che 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\u00fcr Flexibilit\u00e4t 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\u00fchren (Lizenz + Memory Palace + API-Tickets)","desc":"## Ziel\n\nDie drei SQL-Migrationen f\u00fcr FEAT-237 gegen die Supabase-Datenbank ausf\u00fchren und als ausgef\u00fchrt markieren.\n\n## ","pk":"SDRv4","tc":"CHO"},{"id":203,"title":"\"Terminal\" projektweite Umbenennung zu \"Senity CLI\"","desc":"# CHO-015 \u2014 \"Terminal\" projektweite Umbenennung zu \"Senity CLI\"\n\n**Typ:** chore\n**Priorit\u00e4t:** P2\n**Status:** backlog\n**","pk":"SDRv4","tc":"CHO"},{"id":194,"title":"Telegram-Erinnerung Rick \u2014 Northdata.de beim ersten Chat ansprechen","desc":"# CHO-014: Telegram-Erinnerung Rick \u2014 Northdata.de beim ersten Chat ansprechen\n\n**Typ:** chore\n**Priorit\u00e4t:** P1\n**Statu","pk":"SDRv4","tc":"CHO"},{"id":189,"title":"Ticket-System Cleanup \u2014 Duplikate, Priorit\u00e4ten, Archivierung","desc":"# CHO-013: Ticket-System Cleanup \u2014 Duplikate, Priorit\u00e4ten, Archivierung\n\n**Typ:** chore\n**Priorit\u00e4t:** 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\u00e4chsprotokoll 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\u00e4chsprotokoll 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\u00e4chsprotokoll vom 2026-04-05","pk":"SDRv4","tc":"CHO"},{"id":359,"title":"Rick Rechnung schreiben 20 EUR f\u00fcr Twilio","desc":"# CHO-009: Rick Rechnung schreiben 20 EUR f\u00fcr Twilio\n\n**Typ:** chore\n**Priorit\u00e4t:** P2\n**Status:** moved \u2192 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\u00e4t:** P2\n**Status:** moved \u2192 Senity Allgemei","pk":"SDRv4","tc":"CHO"},{"id":193,"title":"Email an Marco \u2014 Erwartungen an Timo als Product Owner","desc":"# CHO-007: Email an Marco \u2014 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\u00e4t:** 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 \u2014 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\u00e4ngigkeiten:** FEA","pk":"SDRv4","tc":"CHO"},{"id":159,"title":"DB-Migration 054 (Bot-Plattform) ausf\u00fchren","desc":"# CHO-003: DB-Migration 054 (Bot-Plattform) ausf\u00fchren\n\n**Typ:** chore\n**Prio:** P0\n**Status:** done\n**Abh\u00e4ngigkeiten:** ","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\u00e4n","pk":"SDRv4","tc":"CHO"},{"id":188,"title":"Server-Deployment \u2014 Telegram Bot aktivieren","desc":"# CHO-001: Server-Deployment \u2014 Telegram Bot aktivieren\n\n**Typ:** chore\n**Priorit\u00e4t:** P1\n**Status:** backlog\n**Abh\u00e4ngigk","pk":"SDRv4","tc":"CHO"},{"id":163,"title":"Preise zeigen Euro (\u20ac) statt Senity Tokens im Fallback-Reihenfolge-Screen","desc":"## Problem\n\nIm Model-Management unter \"Chat LLM \u2014 Fallback-Reihenfolge\" werden Kosten und Preise der Provider in Euro (\u20ac","pk":"SDRv4","tc":"BUG"},{"id":191,"title":"offeneregister.de API offline \u2014 DNS-Fehler + 502","desc":"# BUG-034: offeneregister.de API offline \u2014 DNS-Fehler + 502\n\n**Typ:** bug\n**Priorit\u00e4t:** P1\n**Status:** backlog\n**Erstel","pk":"SDRv4","tc":"BUG"},{"id":190,"title":"Lead Scraper: fehlende i18n-Keys im L\u00f6sch-Dialog (Delete Search)","desc":"# BUG-033 \u2014 Lead Scraper: fehlende i18n-Keys im L\u00f6sch-Dialog (Delete Search)\n\n**Typ:** bug\n**Status:** review\n**Priorit\u00e4","pk":"SDRv4","tc":"BUG"},{"id":100,"title":"Navigation zeigt \"Bots\" \u2014 muss auf neues Kan\u00e4le-Konzept umgestellt werden","desc":"## Beschreibung\n\nIn der Sidebar-Navigation taucht noch der Men\u00fcpunkt \"Bots\" auf. Das widerspricht dem neuen Architektur-","pk":"SDRv4","tc":"BUG"},{"id":144,"title":"AI Workspace \u2014 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 \u2014 API-Fehler beim Synchronisieren","desc":"## Beschreibung\n\nWenn auf der `/agents/registry` Seite \"Synchronisieren\" gedr\u00fcckt 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 \u2192 Claude Code CLI \u2014 Vollst\u00e4ndiger Debugging-Report","desc":"## Ziel\n\nTelegram-Nachricht \u2192 SDRv4 Container \u2192 Claude Code CLI \u2192 Antwort zur\u00fcck.\nDer User sendet \u00fcber 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\u00e4t:** P1\n**Erstellt:** 2026","pk":"SDRv4","tc":"BUG"},{"id":99,"title":"Trello-Boards nicht in Boards-\u00dcbersicht 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\u00e4t:** P1  \n**Status:**","pk":"SDRv4","tc":"BUG"},{"id":186,"title":"CLI Session l\u00f6schen schl\u00e4gt fehl","desc":"# BUG-023: CLI Session l\u00f6schen schl\u00e4gt 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\u00e4t:** P1\n**Status:** backlog\n**Abh\u00e4ngigkeiten:** \u2014\n","pk":"SDRv4","tc":"BUG"},{"id":181,"title":"Zu krasse/unnat\u00fcrliche Betonung","desc":"# BUG-020: Zu krasse/unnat\u00fcrliche Betonung\n\n**Typ:** bug\n**Priorit\u00e4t:** P1\n**Status:** backlog\n**Abh\u00e4ngigkeiten:** FEAT-","pk":"SDRv4","tc":"BUG"},{"id":180,"title":"Wiederholte Best\u00e4tigungsfragen \"Stimmt das?\"","desc":"# BUG-019: Wiederholte Best\u00e4tigungsfragen \"Stimmt das?\"\n\n**Typ:** bug\n**Priorit\u00e4t:** P1\n**Status:** backlog\n**Abh\u00e4ngigke","pk":"SDRv4","tc":"BUG"},{"id":179,"title":"Bot legt unerwartet auf","desc":"# BUG-018: Bot legt unerwartet auf\n\n**Typ:** bug\n**Priorit\u00e4t:** P1\n**Status:** backlog\n**Abh\u00e4ngigkeiten:** \u2014\n**Epic:** V","pk":"SDRv4","tc":"BUG"},{"id":178,"title":"Bot spricht in 3. Person \u00fcber den User","desc":"# BUG-017: Bot spricht in 3. Person \u00fcber den User\n\n**Typ:** bug\n**Priorit\u00e4t:** P1\n**Status:** backlog\n**Abh\u00e4ngigkeiten:*","pk":"SDRv4","tc":"BUG"},{"id":177,"title":"Kontext-Logik fehlt \u2014 Plausibilit\u00e4tspr\u00fcfung","desc":"# BUG-016: Kontext-Logik fehlt \u2014 Plausibilit\u00e4tspr\u00fcfung\n\n**Typ:** bug\n**Priorit\u00e4t:** P1\n**Status:** backlog\n**Abh\u00e4ngigkei","pk":"SDRv4","tc":"BUG"},{"id":176,"title":"\"Nein\" wird falsch interpretiert","desc":"# BUG-015: \"Nein\" wird falsch interpretiert\n\n**Typ:** bug\n**Priorit\u00e4t:** P1\n**Status:** backlog\n**Abh\u00e4ngigkeiten:** \u2014\n**","pk":"SDRv4","tc":"BUG"},{"id":175,"title":"Template-Variablen werden w\u00f6rtlich ausgesprochen","desc":"# BUG-014: Template-Variablen werden w\u00f6rtlich ausgesprochen\n\n**Typ:** bug\n**Priorit\u00e4t:** P1\n**Status:** backlog\n**Abh\u00e4ng","pk":"SDRv4","tc":"BUG"},{"id":173,"title":"\"Goodbye\" statt \"Tsch\u00fcss\" \u2014 englische Verabschiedung","desc":"# BUG-013: \"Goodbye\" statt \"Tsch\u00fcss\" \u2014 englische Verabschiedung\n\n**Typ:** bug\n**Priorit\u00e4t:** P1\n**Status:** backlog\n**Ab","pk":"SDRv4","tc":"BUG"},{"id":172,"title":"Verschluckte W\u00f6rter \u2014 S\u00e4tze unvollst\u00e4ndig","desc":"# BUG-012: Verschluckte W\u00f6rter \u2014 S\u00e4tze unvollst\u00e4ndig\n\n**Typ:** bug\n**Priorit\u00e4t:** P1\n**Status:** backlog\n**Abh\u00e4ngigkeite","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\u00e4t:** P1\n**Status:** backlog\n**Abh\u00e4ngigkeiten:** FE","pk":"SDRv4","tc":"BUG"},{"id":168,"title":"Umlaut-Aussprache \u2014 \u00e4/\u00f6/\u00fc/\u00df werden als ae/oe/ue/ss gesprochen","desc":"# BUG-010: Umlaut-Aussprache \u2014 \u00e4/\u00f6/\u00fc/\u00df werden als ae/oe/ue/ss gesprochen\n\n**Typ:** bug\n**Priorit\u00e4t:** 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\u00e4t:** P1\n**Status:** backlog\n**A","pk":"SDRv4","tc":"BUG"},{"id":174,"title":"PATH-Hijacking in CLI-Spawns \u2014 Fake-Binary-Ausf\u00fchrung","desc":"# BUG-008: PATH-Hijacking in CLI-Spawns \u2014 Fake-Binary-Ausf\u00fchrung\n\n**Typ:** bug\n**Priorit\u00e4t:** P1 (HIGH)\n**Status:** back","pk":"SDRv4","tc":"BUG"},{"id":352,"title":"HTTP_PROXY in CLI-Env-Allowlist \u2014 API-Key-Exfiltration m\u00f6glich","desc":"# BUG-007: HTTP_PROXY in CLI-Env-Allowlist \u2014 API-Key-Exfiltration m\u00f6glich\n\n**Typ:** bug\n**Priorit\u00e4t:** 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\u00e4t:** P0 (CRITICAL)","pk":"SDRv4","tc":"BUG"},{"id":164,"title":"CLI Environment Variable Leakage \u2014 Allowlist statt Blacklist","desc":"# BUG-004: CLI Environment Variable Leakage \u2014 Allowlist statt Blacklist\n\n**Typ:** bug\n**Priorit\u00e4t:** P0 (CRITICAL)\n**Sta","pk":"SDRv4","tc":"BUG"},{"id":167,"title":"Lead-Scraper Bugfixes & Architektur-\u00dcberarbeitung","desc":"# BUG-003: Lead-Scraper Bugfixes & Architektur-\u00dcberarbeitung\n\n**Typ:** bug\n**Priorit\u00e4t:** P1\n**Abstufung:** 2026-04-09 \u2014","pk":"SDRv4","tc":"BUG"},{"id":166,"title":"Website Crawl f\u00fcr Wissensdatenbank kaputt","desc":"# BUG-002: Website Crawl f\u00fcr Wissensdatenbank kaputt\n\n**Typ:** bug\n**Priorit\u00e4t:** 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\u00e4t:** P1\n**Status:** done\n**Erstellt:** 2026-04-03\n\n## ","pk":"SDRv4","tc":"BUG"}]}