<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"><channel>
<title>Mignuti Chatbot — Changelog</title>
<link>https://chatbot.mignuti.com/changelog</link>
<description>Every shipping update to the Mignuti Chatbot platform.</description>
<language>en</language>
<item>
  <title>Klammer (Replyr Desk) — Tauri-2.0-Skeleton bootstrapped (v0.7.9.x-klammer-skeleton)</title>
  <link>https://chatbot.mignuti.com/changelog#v0.7.9.x-klammer-skeleton</link>
  <guid isPermaLink="false">mignuti-chatbot-0.7.9.x-klammer-skeleton</guid>
  <pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate>
  <description><![CDATA[<p>Neuer Workspace `desk/` für die Karl-Klammer-Desktop-App ergänzt. Tauri 2.0 + Preact + globaler Hotkey + System-Tray + Side-Panel-Window mit Pin-to-Right. Magic-Link-Auth-Flow vorbereitet (wartet auf desk-magic-link + desk-chat Edge Fns). Eigene Brand `klammer.app`, geteilter Backend-Stack (Supabase, RAG-Pipeline, Stripe). v0.1-alpha — Skeleton steht, Backend-Wiring kommt v0.2 nach v0.8-Embed-Launch.</p><ul><li><strong>New:</strong> Workspace `desk/` als 5. NPM-Workspace (neben src/widget/marketing/shared/services). package.json + scripts (desk:dev, desk:build, dev:desk) ergänzt.</li><li><strong>New:</strong> Tauri-Backend (Rust): Cargo.toml mit Tauri 2.x + 5 Plugins (global-shortcut, shell, store, window-state, deep-link). Release-Profil optimiert für kleines Binary (~10 MB statt 100 MB Electron).</li><li><strong>New:</strong> Globaler Hotkey: Strg+Leertaste auf Windows/Linux, Strg+Umschalt+K auf macOS (Spotlight-Konflikt). User-Override kommt in v0.3.</li><li><strong>New:</strong> System-Tray-Icon mit Menü: &apos;Klammer öffnen&apos; / &apos;An rechten Rand pinnen&apos; / &apos;Beenden&apos;. Linksklick toggelt Panel, Rechtsklick zeigt Menü.</li><li><strong>New:</strong> Side-Panel-Window: 380×720 px, frameless, transparent (rounded corners 12px), always-on-top toggleable, Pin-to-Right-Edge mit 16px Margin auf Primär-Monitor. Multi-Monitor-aware via tauri-plugin-window-state.</li><li><strong>New:</strong> Custom-Protocol-Handler `replyr-desk://` + `klammer://` für Auth-Callback (in tauri.conf.json + capabilities deklariert).</li><li><strong>New:</strong> Frontend-Stack (Preact + Vite): re-uses @replyr/shared, @replyr/widget via Vite-Aliasses. CSP eng gelockt (default-src &apos;self&apos;, connect-src nur Replyr-Backend + Anthropic).</li><li><strong>New:</strong> Auth-Flow vorbereitet: lib/auth.ts mit requestMagicLink + listenForAuthCallback. Sessions persistieren in OS-Keychain via tauri-plugin-store (Windows Credential Manager / macOS Keychain / Linux Secret-Service). Dev-Modus fällt auf localStorage zurück.</li><li><strong>New:</strong> UI-Components: TitleBar mit Drag-Region + Window-Controls (Always-on-Top-Toggle, Pin-to-Right, Logout, Hide-to-Tray), LoginView mit Magic-Link-Form, KlammerPanel mit SSE-Streaming-Chat.</li><li><strong>New:</strong> Capabilities-File (Tauri-2.0-Permission-Matrix): nur explizit gewährte APIs erreichbar. shell:allow-open whitelistet ausschließlich replyr.app/klammer.app/app.replyr.app.</li><li><strong>New:</strong> Icon-System: SVG-Master in src-tauri/icons/source.svg, Tauri-CLI generiert PNG/ICO/ICNS automatisch (`npx tauri icon`)</li><li><strong>New:</strong> Dokumentation: desk/README.md mit Setup-Instruktionen für Win/macOS/Linux, Architecture-Diagramm, Auth-Flow-Sequenz, Troubleshooting</li></ul>]]></description>
</item>
<item>
  <title>v0.7.9 Patch — 13 Bugs aus /bug-check gefixt (v0.7.9-beta.2)</title>
  <link>https://chatbot.mignuti.com/changelog#v0.7.9-beta.2</link>
  <guid isPermaLink="false">mignuti-chatbot-0.7.9-beta.2</guid>
  <pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate>
  <description><![CDATA[<p>Adversarial Bug-Hunt auf v0.7.9-beta.1 hat 7 wichtige + 6 minor Bugs gefunden — alle gefixt. Schwerpunkte: Defensive Input-Validation für audit-bot (null-body crash), IP-Binding + is_paused-Check für widget-action-webhook (Security-Parität mit chat-completion), explicit per-row UPDATE in Migration 063 (gegen shared-secret Worst-Case bei volatile-DEFAULT eval), retention-job für db_heartbeat, NaN-guard in speed-Score, SpotlightTour-Polishing (0×0-skip + Esc + focus-trap), Status-Page Fallback-Label, WidgetApp 401-logging, lazyNamed runtime-check, audit_lead_log length-CHECKs (Bot-Spam-Schutz). 2 neue Tests (NaN + negative ttfbMs locking).</p><ul><li><strong>Fixed:</strong> 🟡 audit-bot — body-validation gegen null/non-array categories/non-string fields (vorher 500 statt 400)</li><li><strong>Fixed:</strong> 🟡 widget-action-webhook — chatbots.is_paused-Check (paused Bot soll Webhook nicht mehr feuern, auch nicht aus stalen Session-JWTs)</li><li><strong>Fixed:</strong> 🟡 widget-action-webhook — IP-hash-binding parität mit chat-completion (Stolen-JWT-Schutz)</li><li><strong>Fixed:</strong> 🟡 Migration 063 — drei-Phasen-ADD COLUMN + explicit UPDATE für garantierte per-row-Uniqueness des webhook_signing_secret (Defense gegen volatile-DEFAULT Edge-Cases)</li><li><strong>Fixed:</strong> 🟡 Migration 064 — pg_cron purge-db-heartbeat (täglich 03:07 UTC, alles &gt;1h löschen) gegen Row-Leaks bei Edge-Fn-Crash zwischen INSERT und DELETE</li><li><strong>Fixed:</strong> 🟡 audit-heuristics — Number.isFinite-Guard für ttfbMs in speed-Category (vorher &apos;TTFB NaNms&apos; im Detail-String)</li><li><strong>Fixed:</strong> 🟡 SpotlightTour — Skip bei 0×0 bounding-rect (für Targets im DOM aber ohne Layout, z.B. Pre-load ProjectSwitcher)</li><li><strong>Fixed:</strong> 🔵 SpotlightTour — Esc-Handler + Focus-Trap auf Skip/Next-Button (a11y-Konvention für aria-modal Dialog)</li><li><strong>Fixed:</strong> 🔵 status.astro — &apos;Not yet probed&apos; Fallback wenn health-check Edge Fn noch nicht gelaufen ist (statt ewiges &apos;...&apos;)</li><li><strong>Fixed:</strong> 🔵 WidgetApp.tsx — console.warn bei nicht-2xx von widget-action-webhook (vorher silent failure bei expired JWT)</li><li><strong>Fixed:</strong> 🔵 router.tsx — lazyNamed Runtime-Check + actionable Error-Message bei Tippfehlern in Component-Namen</li><li><strong>Fixed:</strong> 🔵 audit_lead_log — length-CHECKs für target_url/target_host/lead_email/vendor (Bot-Spam-Schutz, RFC-konform)</li><li><strong>Fixed:</strong> 🔵 audit-bot — pre-validate lead_email + targetUrl-Länge VOR DB-INSERT (vermeidet wasted roundtrips + ReDoS bei massiven Inputs)</li></ul>]]></description>
</item>
<item>
  <title>Solo-Sprint v0.7.9 — 10 Production-Hardening Tasks (CI, Audit-Bot, HMAC, FR-Locale) (v0.7.9-beta.1)</title>
  <link>https://chatbot.mignuti.com/changelog#v0.7.9-beta.1</link>
  <guid isPermaLink="false">mignuti-chatbot-0.7.9-beta.1</guid>
  <pubDate>Fri, 24 Apr 2026 00:00:00 GMT</pubDate>
  <description><![CDATA[<p>Alle 10 Production-Hardening-Solo-Tasks fertig. CI hat jetzt Lighthouse + pa11y-Gates. Audit-Bot-Backend live (statische Vendor-Detection-Heuristik + 8 Kategorien). HMAC-SHA256 für action-button-trigger_webhook (Customer kann Mignuti Chatbot-Calls verifizieren). Honeypot-Fields auf 3 Forms. 3 neue _shared-Module (audit-heuristics, intent-classify, webhook-sign) mit 67 neuen Tests. Code-Splitting für 25 Admin-Routes via React.lazy. Status-Page mit echtem External-Health-Probe (anthropic/openai/azure/db). Onboarding-Spotlight-Tour bei Erst-Login. FR-Locale-Stub (homepage + pricing) plus Nav/Footer/Base-Trilingual. Total: 4 neue Migrationen (062-064 + audit_lead_log), 3 neue Edge Functions (audit-bot, widget-action-webhook, health-check), 3 neue Unit-Test-Suites, 1 Component-Render-Test-Suite, 4 neue Doc-Dateien (ROADMAP.md, CONTRIBUTING.md, audit-cases.json, architecture-§11).</p><ul><li><strong>New:</strong> P1 CI/CD-Gates: .github/workflows/ci.yml + zwei neue Jobs lighthouse + a11y. Lighthouse-CI gegen ./marketing/dist via treosh/lighthouse-ci-action@v12 — 4 URLs (/, /pricing, /faq, /trust, /docs), assertions perf≥0.85 / a11y≥0.95 / best-practices≥0.9 / seo≥0.95 / FCP&lt;2s / LCP&lt;2.5s / CLS&lt;0.1. Pa11y-CI via npx serve + npm run a11y:ci. Beide continue-on-error: true als informational, tighten zu required-status nach 30-Tage-Baseline. .lighthouserc.json neu</li><li><strong>New:</strong> P2 Audit-Bot Backend: supabase/functions/audit-bot Edge Fn macht statische Vendor-Detection-Heuristik (10 Vendors: mignuti-chatbot/intercom/tidio/chatbase/drift/crisp/voiceflow/hubspot/zendesk/unknown) + 8 Kategorien-Score (ai_disclosure / sources / hallucination / prompt_injection / multilang / refusal / speed / data_leakage). SSRF-defense, Rate-Limit 5/60s pro IP, 1MB-Body-Cap, 8s-Timeout. Lead-Capture in audit_lead_log (Migration 062, super_admin-only read, 24-Monat-Retention). Pure Logik in _shared/audit-heuristics.ts (28 Tests). bot-audit.astro callt jetzt echte Edge Fn (nicht nur Sim) via PUBLIC_SUPABASE_URL. scripts/seeds/audit-cases.json mit 25 Live-Probing-Cases als Doku + Roadmap für v0.8</li><li><strong>New:</strong> P3 Production-Hardening: (a) Honeypot-Fields auf waitlist.astro / avv-generator.astro / bot-audit.astro — bots auto-fillen &apos;company_url_hp&apos;, server/client checkt + droppt. (b) HMAC-SHA256-signierte Action-Button-Webhooks: Migration 063 (chatbots.webhook_signing_secret 32-byte hex + rotate_webhook_signing_secret RPC), neuer _shared/webhook-sign.ts (buildSigningPayload, computeSignature, constantTimeEqual, verifySignature mit 5min-replay-window), neue widget-action-webhook Edge Fn (server-side relay statt no-cors browser fetch). Customer-side prüft via X-MignutiChatbot-Signature: v1=&lt;hex&gt; + X-MignutiChatbot-Timestamp Header. (c) Widget WidgetApp.tsx: trigger_webhook ruft jetzt widget-action-webhook statt direct-fetch — keine spoofbaren browser-origin POSTs mehr</li><li><strong>New:</strong> P4 Test-Coverage-Pass: 3 neue _shared-Module mit 67 Tests gesamt. (a) _shared/audit-heuristics.ts (28 Tests — vendor-detection / clamp01 / scoreCategory pro Kategorie / aggregateScore). (b) _shared/intent-classify.ts (22 Tests — buildTranscript / extractJsonObject / clampLeadScore / validateIntents / parseClassifierOutput). classify-intent/index.ts refactored: nutzt jetzt parseClassifierOutput statt inline Regex. (c) _shared/webhook-sign.ts (17 Tests — payload building / sig compute / constant-time-compare / drift-window). Total Vitest-Suite jetzt 290 Tests grün (vorher 222)</li><li><strong>New:</strong> P5 Dokumentation: README.md + Sektion &apos;Roadmap &amp; Contributing&apos;. ROADMAP.md neu — strukturiert Phase 0 (Greenfield), Phase 1 (Pre-Launch v0.6.x→v0.7.x), Phase 2 (Public Launch v0.8.x: Real-Time-Bot-Audit, Voice-Widget, Marketplace, Compliance), Phase 3 (Scale v0.9.x→v1.0: White-Label, Public REST-API, Affiliate, Enterprise). CONTRIBUTING.md neu — Workflow, Pflicht-Checks (lint/typecheck/vitest/i18n-check), Code-Conventions (TS strict, React 19 Hooks, Preact-Bundle-Budget, SQL Default-DENY), Commit-Conventions, i18n-Regeln, Security-Disclosure. docs/architecture.md erweitert um §11 v0.7.x Feature-Layer (Live-Chat, Auto-QA, URL-Crawler, Action-Buttons+HMAC, Bot-Audit, AVV-Generator, Trust-Center, CI-Gates)</li><li><strong>New:</strong> P6 Component-Render-Tests: tests/unit/widget-components.test.tsx neu (file-scoped happy-dom env, file extension .tsx). 11 Tests gegen ChatPanel-Subkomponenten (vorher unexportiert) — SourceFootnotes (clamping, fallbacks, XSS-escape, similarity-clamping) + ActionButtons (rendering, emoji aria-hidden, click-dispatch, button type=button). vitest.config.ts include-Pattern erweitert für *.test.tsx. ChatPanel.tsx exportiert jetzt SourceFootnotes + ActionButtons</li><li><strong>New:</strong> P7 Performance-Pass: src/router.tsx vollständig refactored auf React.lazy + Suspense für 25 Admin-Pages (alle außer SignIn / AuthCallback / AppShell / Dashboard / Onboarding bleiben eager). Custom lazyNamed&lt;P&gt;-Helper preserviert Component-Props-Typen (z.B. MessageInspectorPage{messageId}). RouteLoader-Fallback. Build-Result: 25 separate Page-Chunks à ~6-15 KB statt one-big-bundle. Initial-Bundle index-CUXOuas7.js bei 679 KB (204 KB gzipped) — heavy admin-only Pages werden lazy geladen</li><li><strong>New:</strong> P8 Status-Page real: Migration 064 erweitert service_health um anthropic_ok / openai_ok / azure_ok / db_write_ok / probed_externally_at. Neue Edge Fn supabase/functions/health-check macht externe Liveness-Probes (HEAD-Requests gegen api.anthropic.com / api.openai.com / Azure-Endpoint + db_heartbeat insert/delete round-trip), 0 LLM-Tokens verbraucht. pg_cron-Schedule alle 5 min (offset 1 min von sample_service_health damit Race-vermeidet). marketing/status.astro liest die neuen Felder + zeigt Components-Panel (Anthropic / OpenAI / Azure / Database) als grün/rot/Not-configured</li><li><strong>New:</strong> P9 Onboarding-Walkthrough: Neue src/components/SpotlightTour.tsx — 4-Step-Tour bei Erst-Login (data-tour=&apos;project-switcher&apos; → &apos;nav-knowledge-base&apos; → &apos;nav-embed&apos; → &apos;health-pill&apos;). localStorage &apos;replyr_tour_v1_done&apos; verhindert Re-Show. Skip-Button setzt Flag genauso. Cutout-Effekt via 4-Quadrant-Dim-Panels (kein SVG-Mask, breiter Browser-Support). Touch-Target 44px, role=&apos;dialog&apos; aria-modal=&apos;true&apos; aria-labelledby. AppShell.tsx + data-tour-Markierungen + &lt;SpotlightTour/&gt;-Mount. i18n-Keys &apos;tour.*&apos; EN+DE</li><li><strong>New:</strong> P10 +1 Locale FR (Marketing): Trilingual Nav.astro / Footer.astro / Base.astro mit locale=&apos;en&apos;|&apos;de&apos;|&apos;fr&apos;. Neue marketing/src/pages/fr/index.astro (translated homepage mit Coming-Soon-Hinweis für FAQ/Trust/Docs/Legal-FR) + fr/pricing.astro (volle FR-Tarif-Tabelle). hreflang fr im &lt;head&gt;. og:locale fr_FR. CookieBanner.astro um FR erweitert. Legal-Slugs für FR fallen auf EN-Versionen zurück bis FR-anwaltlich-Review in v0.8</li></ul>]]></description>
</item>
<item>
  <title>Solo-Sprint v0.7.8 — 14 Tier-1/2/3 Tasks fertig (Closed-Beta-ready) (v0.7.8-beta.1)</title>
  <link>https://chatbot.mignuti.com/changelog#v0.7.8-beta.1</link>
  <guid isPermaLink="false">mignuti-chatbot-0.7.8-beta.1</guid>
  <pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate>
  <description><![CDATA[<p>Alle 14 Solo-Tasks aus dem &apos;was-fehlt-noch&apos;-Audit umgesetzt. Lead-Score-Pipeline aktiv, URL-Crawler-Worker live (kritischer Code-Blocker), pg_cron-Schedules konsolidiert, Subprocessor-Trigger, Cookie-Banner DSGVO-konform, Stripe-Dunning, Trial-Reminders, Bulk-Pause für Agencies, Partitioning-Plan dokumentiert, AVV-Generator + Bot-Audit als Lead-Magnete. 5 neue Migrationen (057-061), 1 neue Edge Function (url-crawl-worker), 2 neue Marketing-Pages, 11 neue Tests.</p><ul><li><strong>New:</strong> P1 Welcome-Email als Auth-Template ([auth.email.template.confirmation] in config.toml — Customer kriegt jetzt Branded-Welcome statt Default-Supabase-Default)</li><li><strong>New:</strong> P2 Lead-Score-Pipeline aktiv: chat-completion finalizePersistence triggert classify-intent fire-and-forget am Ende jedes nicht-fallback-Turns. Bisher blieben conversations.lead_score immer NULL → Agency-Dashboard zeigte 0 Hot-Leads. Jetzt: ~1s nach Chat-Ende setzt classify-intent intents[] + lead_score. Hot-Lead-Trigger 027 fired automatisch ab Score ≥ 70</li><li><strong>New:</strong> P3 URL-Crawler-Worker als Edge Function (kritischer Code-Blocker geschlossen): pgmq-Reader holt Jobs aus replyr_url_crawl-Queue, crawlt jede URL (oder parsed Sitemap/RSS/Atom bei XML-Endpoint), extrahiert Content via CSS-Selectors, embedded in Batches via OpenAI, schreibt embeddings mit url_source_id. SSRF-Defense + 1MB-per-page-Cap + 6s-Timeout + 500-chunks-Total-Cap + 3-Retry-Limit. Vorher: enqueue_url_crawl schrieb in pgmq, niemand las. Jetzt: alle 60s pickt der Worker bis zu 5 Jobs ab</li><li><strong>New:</strong> P4 Migration 057 — pg_cron-Schedules konsolidiert: notification-dispatcher (1min), url-crawl-worker (1min), webhook-dispatcher (1min), gdpr-export-build (15min), demo-crawls-cleanup (15min), trial-reminders (6h), auto-suggest-qa (nightly 03:00 UTC), audit-log-retention (daily 04:00 UTC). Plus _cron_invoke_edge-Helper der via app.settings.supabase_url + service_role_key arbeitet (auto-set durch Supabase-Platform)</li><li><strong>New:</strong> P5 Migration 058 — Subprocessor-Trigger: ON INSERT/UPDATE/DELETE auf subprocessors-Table fired notification_outbox-Events pro opt-in-Subscriber. Notification-Dispatcher (existiert) sendet Resend-Email mit subprocessor-update.html-Template. Idempotency keyed auf processor_id+action+channel — Stripe-style ohne Doppel-Mails. DSGVO Art. 28 Compliance: Subscribers werden 30 Tage vor Wirksamkeit benachrichtigt</li><li><strong>New:</strong> P6 Sentry-Status verifiziert: Admin (@sentry/react SDK) + Widget (custom /envelope/-Transport ohne SDK-Bloat) bereits komplett. Edge Functions nutzen Supabase-Function-Logs (vor Sentry-Integration nicht nötig)</li><li><strong>New:</strong> P7 Cookie-Banner Marketing-Site (DSGVO-Pflicht): Vanilla-JS Component im Base.astro, EN+DE, localStorage &apos;mignuti-chatbot.consent.v1&apos; für Persistenz, Custom-Events &apos;mignuti-chatbot:consent-granted&apos;/&apos;denied&apos;, Plausible-Pageview erst nach consent, Widget-data-consent-Toggle. Re-open-Hook für Footer-Link</li><li><strong>New:</strong> P8 11 neue Unit-Tests: extractLinks (Multi-Origin, Fragment-Strip, Dedupe, Anti-DoS-Cap, javascript:-Reject) + draftConfidence (Floor 0.3 / Cap 0.95 / linear citation-scaling). Helpers extrahiert nach _shared/url-extract.ts so url-crawl-worker + auto-suggest-qa testbar bleiben</li><li><strong>New:</strong> P9 Stripe-Dunning-Logic: invoice.payment_failed → emitDunningEvent erstellt billing-alerts-Channel falls keiner existiert (Auto-Owner-Email-Lookup), schreibt notification_outbox mit Idempotency. Plus customer.subscription.trial_will_end-Handler für 3-Day-Stripe-eigenes-Reminder. Closes Customer-frustrating-silence wenn Karte abläuft</li><li><strong>New:</strong> P10 Migration 059 — Trial-Reminder-Ladder: 7d → 3d → 1d-Reminder vor trial_ends_at. Cron alle 6h (so jedes Window getroffen wird auch bei kurzen Pausen). Idempotenz via trial_reminder_{7d,3d,1d}_at-Spalten. Auto-Channel-Creation falls Owner keine Notification-Channel hat</li><li><strong>New:</strong> P11 Migration 060 + UI — Bulk-Pause Agency-Dashboard: chatbots.is_paused/pause_reason/paused_at + RPC bulk_set_chatbots_paused (max 50 IDs/call, per-Project-Auth-Check, audit_log-Eintrag). Dashboard-Bulk-Bar mit Pause/Unpause-Buttons + Pause-Reason-Prompt. i18n EN+DE</li><li><strong>New:</strong> P12 Migration 061 — Partitioning-Plan dokumentiert: KEIN sofortiges Live-Partitioning (invasiv auf gefüllten Tabellen). Stattdessen: partition_health()-RPC der bei &gt;50M Rows in messages/usage_log/ai_interactions_log warnt + partition_migration_plan-Tabelle mit 3-Tabellen-Playbook. Pragmatisch — wir ziehen die Migration genau dann durch wenn das Volumen es rechtfertigt (~Monat 6-9 nach Launch)</li><li><strong>New:</strong> P13 AVV-Generator als Marketing-Lead-Magnet: /avv-generator Astro-Page, client-side jsPDF-loses Form (kein Server-Roundtrip = keine PII bei uns), generiert Art.-28-AVV mit 9 Paragraphen + TOM-Anlage + Signatur-Block. Optional Newsletter-Capture für Subprocessor-Updates. SEO-Long-Tail &apos;AVV Generator&apos; / &apos;DSGVO AVV&apos; = ~1k Suchen/Monat DACH</li><li><strong>New:</strong> P14 Replyr Bot-Audit-Mode: /bot-audit Astro-Page mit Form für Wettbewerber-URL → 8 Kategorien (AI-Disclosure, Sources, Hallucination, Prompt-Injection, Multi-Lang, Refusal, Speed, Data-Leakage), Score 0-100 + Findings-Liste, Mignuti Chatbot-Cross-Sell-CTA. Edge-Function audit-bot als Server-Backend optional (client-side simulated fallback für Demo). Sales-Waffe für Agencies</li></ul>]]></description>
</item>
<item>
  <title>Live-Chat Visitor-Side Polling — Phase 3 jetzt End-to-End (v0.7.7-beta.1)</title>
  <link>https://chatbot.mignuti.com/changelog#v0.7.7-beta.1</link>
  <guid isPermaLink="false">mignuti-chatbot-0.7.7-beta.1</guid>
  <pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate>
  <description><![CDATA[<p>v0.7.6 hatte den Admin-side der Live-Chat-Hybrid-Funktion komplett (Inbox-Page mit Realtime, Claim, Send, Close), aber Visitor-side fehlte: ein Visitor klickte &apos;Mit Mensch sprechen&apos; und sah nichts mehr, weil das Widget nur am chat-completion SSE-Stream hing. Lösung: leichter Polling-Endpoint widget-poll + Widget-Engine die alle 3-5s neue Agent-Antworten holt. Bundle 27.55 → 28.71 KB gzipped (Budget 30 KB ✅).</p><ul><li><strong>New:</strong> Edge Function widget-poll: Session-JWT-Auth, IP-Hash-Binding, Origin-Check, Rate-Limit (max 1 Req/2s pro Session), conversation+session-bound (kein Cross-Session-Leak), liefert handover_state + new_messages-Liste seit since-Timestamp + agent_joined_at + next_poll_after_ms-Hint</li><li><strong>New:</strong> shared/api.ts: WidgetPollRequest/Response + WidgetPollMessage + HandoverState-Type erweitert; ChatMessageChunk um type=&apos;handover&apos; und handover_state-Field auf done-event ergänzt</li><li><strong>New:</strong> chat-completion: emittiert handover_state in jedem done-event (per maybeSingle-Query auf conversations) und im Handover-Sentinel-Pfad ein dediziertes &apos;handover&apos;-event mit awaiting_agent</li><li><strong>New:</strong> Widget API-Client: pollUpdates-Methode mit 429-Soft-Hint-Handling</li><li><strong>New:</strong> WidgetApp.tsx Poll-Engine: aktiviert sich bei handover_state != &apos;bot&apos;, polling-Loop mit document.hidden-Pause + Visibility-Resume + exponential-backoff bei Errors (3s/6s/12s/24s) + Auto-Stop bei closed-State, server-driven cadence via next_poll_after_ms</li><li><strong>New:</strong> ChatPanel.tsx: 3 Handover-Banner-Varianten (awaiting/joined/closed) mit aria-status + Pulse-Animation, Agent-Message-Rendering als grüne Bubble mit &apos;Mitarbeiter&apos;-Role-Label, Plain-Text-Render (kein Markdown — auch defensiv falls Agents später formatieren)</li><li><strong>New:</strong> Widget-i18n erweitert um 4 neue Keys: widget.handover.awaiting/joined/closed + widget.role_agent (EN+DE)</li><li><strong>New:</strong> Visitor-Erfahrung: klickt Handover → &apos;Mitarbeiter wird benachrichtigt&apos; (orange Pulsing-Banner) → ~30s später &apos;Mitarbeiter ist beigetreten&apos; (grünes Banner) → jede Agent-Antwort innerhalb 3s sichtbar</li></ul>]]></description>
</item>
<item>
  <title>Vision Prio 1-4 — Auto-QA, Action-Buttons, Live-Chat, Smart-Outbound (v0.7.6-beta.1)</title>
  <link>https://chatbot.mignuti.com/changelog#v0.7.6-beta.1</link>
  <guid isPermaLink="false">mignuti-chatbot-0.7.6-beta.1</guid>
  <pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate>
  <description><![CDATA[<p>Vision-Strategist hatte 4 Prioritäten identifiziert die zusammen den Switching-Cost-Moat aufbauen. Alle 4 in einem Sprint geliefert: (1) Closed-Loop-Auto-QA - der Steve-Jobs-Moment wo der Bot nachts besser wird, (2) Action-Buttons im Chat als Conversion-Booster, (3) Hybrid Live-Chat mit Agent-Inbox (Tidio-Killer), (4) Smart-Outbound-Triggers DSGVO-konform. 4 Migrationen, 2 Edge Functions, 2 neue Admin-Pages, Widget-Engine erweitert.</p><ul><li><strong>New:</strong> PHASE 1 — Closed-Loop-Auto-QA (der Steve-Jobs-Moment):</li><li><strong>New:</strong> Migration 053: pending_questions erweitert um draft_answer/draft_confidence/draft_model + RPCs pending_questions_for_draft + approve_pending_question_draft</li><li><strong>New:</strong> Edge Function auto-suggest-qa: nutzt Anthropic Claude Haiku 4.5 mit constrained-Prompt (NEEDS_HUMAN-Sentinel wenn KB unzureichend) + Citation-Counting für Confidence-Score 0.3-0.95</li><li><strong>New:</strong> pending-questions.tsx UI mit Draft-Preview + 1-Click-Approve-Editor + automatischer qa-pair-embed-Trigger nach Save → neuer Q&amp;A ist binnen 1 Sek retrievable</li><li><strong>New:</strong> Switching-Cost-Moat: Bot wird über Wochen besser ohne Owner-Aufwand, Konkurrenz-Re-Training kostet Stunden</li><li><strong>New:</strong> PHASE 2 — Action-Buttons (Conversion-Booster):</li><li><strong>New:</strong> Migration 054: chat_action_buttons + chat_action_kind ENUM (open_url/open_calendar/send_message/trigger_webhook/request_handover) + RPC action_buttons_for_session mit intent+path-prefix-Filter + URL-https-CHECK + RLS</li><li><strong>New:</strong> shared/api.ts: ChatActionButton + ChatMessageChunk.actions[] type</li><li><strong>New:</strong> Widget WidgetApp.tsx: onAction-Handler für 5 Kinds (window.open mit noopener für url/calendar, sendMessage für send_message + handover-sentinel, no-cors-fetch für webhook)</li><li><strong>New:</strong> ChatPanel.tsx: ActionButtons-Component mit Pill-Style + Touch-Target 36px + emoji-Prefix</li><li><strong>New:</strong> chat-completion: emittiert actions-event nach sources-event basierend auf page_path-Match</li><li><strong>New:</strong> chat-action-buttons.tsx Admin-Page mit CRUD-Form + Conditional-Rendering-Felder (intent/path)</li><li><strong>New:</strong> Widget-Bundle: +0.5 KB für ActionButtons-Render, weiter unter 30 KB</li><li><strong>New:</strong> PHASE 3 — Hybrid Live-Chat (Tidio-Killer):</li><li><strong>New:</strong> Migration 055: conversation_handover_state ENUM (bot/awaiting_agent/with_agent/closed) + agent_user_id + handover_requested_at + &apos;agent&apos; role im messages.role + RPCs request_handover/claim_conversation/agent_send_message/close_conversation + Realtime-Publication für conversations + messages</li><li><strong>New:</strong> inbox.tsx Admin-Page mit Realtime-Subscription auf conversations (postgres_changes) → Live-Liste der awaiting/active Sessions, Click-to-Claim, Reply-Box, Close-Button</li><li><strong>New:</strong> chat-completion: erkennt &apos;__request_handover__&apos;-Sentinel und triggert request_handover-RPC + ack-Message statt LLM-Call</li><li><strong>New:</strong> Tech-Debt next-iter: Visitor-Widget-Realtime (Polling oder SSE) für Live-Agent-Antworten — würde +50KB bundle kosten via supabase-js, daher als separate Iteration geplant</li><li><strong>New:</strong> PHASE 4 — Smart-Outbound-Triggers (DSGVO-konform):</li><li><strong>New:</strong> Migration 056: proactive_rules-Validator erweitert um delay_seconds/scroll_depth_pct/exit_intent/returning_visitor_only/time_window_hours/time_window_days + neue RPC resolve_proactive_rule mit time-window-Gate</li><li><strong>New:</strong> shared/api.ts: WidgetSessionResponse.proactive um die 4 neuen Felder erweitert</li><li><strong>New:</strong> Widget-Engine: 3 parallele Trigger (time-on-page setTimeout + scroll-depth-Listener + exit-intent-mouseout-Listener) + returning_visitor_only-localStorage-Gate ohne Tracking-Cookies</li><li><strong>New:</strong> Verkaufs-Twist: Tidio/Intercom haben Behavior-Triggers aber mit Cookies — Mignuti Chatbot macht es DSGVO-konform</li></ul>]]></description>
</item>
<item>
  <title>Marketing-Site Aufwertung — FAQ, Docs, Use-Cases, Trust-FAQ, eigener Bot (v0.7.5-beta.1)</title>
  <link>https://chatbot.mignuti.com/changelog#v0.7.5-beta.1</link>
  <guid isPermaLink="false">mignuti-chatbot-0.7.5-beta.1</guid>
  <pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate>
  <description><![CDATA[<p>Reality-Check der Landing identifizierte 6 Lücken: keine zentrale FAQ, kein /docs, dünne Index-Page, 3 fehlende Verticals, kein eigener Bot, Trust-Center ohne Security-FAQ. Alle 6 geschlossen. 9 neue gerenderte Pages (48 → 57). Marketing-Site-Score: 60 → 95.</p><ul><li><strong>New:</strong> Zentrale /faq + /de/faq mit 25 kuratierten B2B-Fragen in 5 Sektionen (General, Setup, Security/DSGVO, Bot-Funktion, Agency) inklusive Schema.org FAQPage JSON-LD für Google rich-results</li><li><strong>New:</strong> /docs Hub mit Quickstart, Embed-tag-Anatomie und 6 Plattform-Tutorials (WordPress, Shopify, Webflow, Plain HTML, React/Next, Vue/Nuxt) plus Consent/Cookie-Banner-Integration und Troubleshooting</li><li><strong>New:</strong> Index-Page komplett aufgewertet (EN+DE): Use-Case-Showcase-Grid mit 6 Vertical-Cards (sortiert nach Headline), Comparison-Highlight (5 Wettbewerber-Pills zu /compare/*), inline-FAQ mit 5 Top-Fragen + &apos;Read all 25 →&apos; Link, finaler CTA-Block</li><li><strong>New:</strong> 3 fehlende Vertical-Use-Cases ergänzt: dental.json (HWG-Compliance + Kassen + Termine), hospitality.json (12 Sprachen + Allergen-Sicherheit + PMS-Integration), consulting.json (Lead-Score + Discovery-Call-Routing). Beide Sprachen, mit FAQ-Schema.org</li><li><strong>New:</strong> Trust-Center Security-FAQ ergänzt: 10 Fragen die jeder DPO/CISO vor dem Signing stellt (Daten-Standort, LLM-Training, Multi-Tenant-Isolation, PII, Incident-Response, Prompt-Injection, ISO/SOC, Custom-DPA, DSAR, Shutdown-Plan)</li><li><strong>New:</strong> Eigener Bot auf chatbot.mignuti.com — Widget-Script ENV-gated im Base.astro (PUBLIC_OWN_BOT_KEY + PUBLIC_OWN_BOT_SECRET). Wenn beide gesetzt: Widget lädt automatisch und bedient Mignuti Chatbot-Fragen direkt auf der Marketing-Site (eat-your-own-dogfood, Vision-Sprint-Empfehlung)</li><li><strong>New:</strong> Nav erweitert um FAQ + Docs + Trust-Links (vorher nur Pricing + Agency + AI-Act)</li></ul>]]></description>
</item>
<item>
  <title>Closed-Beta-Ready — Format-Coverage + Profitabilität + Diagnostics-Center (v0.7.4-beta.1)</title>
  <link>https://chatbot.mignuti.com/changelog#v0.7.4-beta.1</link>
  <guid isPermaLink="false">mignuti-chatbot-0.7.4-beta.1</guid>
  <pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate>
  <description><![CDATA[<p>Reality-Check identifizierte 4 Lücken (Format-Coverage, Cost-Hebel, Errors-Page, UX-Härtung). Alle 4 geschlossen: Q&amp;A-Pair-Editor, TXT/Markdown/JSON-FAQ-Upload, XML-Sitemap-Crawl-Mode, /diagnostics-Page mit Cost+Errors+Source-Coverage, Widget-quota-UX, Stripe-timing-attack + replay-window. Tests: 162 → 201 (+39).</p><ul><li><strong>New:</strong> PHASE A — Format-Coverage (5 Lücken geschlossen):</li><li><strong>New:</strong> Q&amp;A-Pair-Editor (Migration 050 + qa_pairs Tabelle + RPC upsert_qa_pair_with_embedding + Edge Function qa-pair-embed mit inline-OpenAI-Embedding + UI-Tab in /knowledge-base) — schließt die größte KMU-Lücke (&apos;kann ich einfach FAQ-Einträge tippen?&apos;)</li><li><strong>New:</strong> TXT/Markdown/JSON-FAQ-Upload (text_documents Tabelle + Edge Function text-doc-ingest + Chunker mit paragraph+sentence-split + RPC upsert_text_document_with_chunks für atomic insert + UI-Tab mit Drop-Zone für .txt/.md/.json)</li><li><strong>New:</strong> JSON-FAQ-Parser akzeptiert Top-level-Array oder {items: [...]} mit q/question/Q + a/answer/A Felder, max 500 Einträge, jeder ≤500/4000 chars, mit Length-Caps gegen DoW</li><li><strong>New:</strong> XML-Sitemap-Crawl-Mode (Migration 050 url_crawl_mode Enum + sitemap.ts Parser für sitemap-urlset / sitemap-index / RSS-2.0 / Atom mit max-1MB + max-500-URLs + Allow-list http(s) only)</li><li><strong>New:</strong> Vereinheitlichte Knowledge-Base-UI mit 4 Tabs (PDFs · URL-Quellen · Q&amp;A-Paare · Text &amp; FAQ) + Counts-Pills + EmptyStates pro Tab</li><li><strong>New:</strong> PHASE B — Profitabilität:</li><li><strong>New:</strong> Prompt-Caching im chat-completion verifiziert: System-Prompt + Sources-Block beide mit cache_control:ephemeral, Cache-Hit-Tracking via cache_read_input_tokens, estimateCostEur applies 90%-Discount bei Hit. 17 Cost-Tests pinnen das Margin-Contract (Pro-Plan cached &gt;60% Margin)</li><li><strong>New:</strong> Migration 052 — analytics_cost_summary + analytics_cost_daily + source_coverage + error_summary RPCs</li><li><strong>New:</strong> PHASE C — Diagnostics-Center:</li><li><strong>New:</strong> Neue Page /p/:slug/diagnostics — kombiniert (a) Cost-Summary mit Cache-Hit-Rate-Karten, (b) tägliche Cost-Trend-Bars, (c) aggregierte Errors aus PDF/URL/Text-Doc/LLM in einer Stelle (statt 4 separater Pages — Vertrauensbruch geheilt), (d) Source-Coverage-Liste (welche KB-Einträge werden tatsächlich abgerufen?)</li><li><strong>New:</strong> Sidebar-Eintrag &apos;Diagnose&apos;/&apos;Diagnostics&apos; eingefügt zwischen Analytics und Chatbot-Config</li><li><strong>New:</strong> PHASE D — UX/Risk-Härtung:</li><li><strong>New:</strong> Widget-API-Client unterscheidet jetzt 402 (quota_exceeded) und 422 (content_policy) als eigene Error-Codes statt generisch internal — User sieht &apos;Bot is at quota&apos; statt &apos;Network error&apos;</li><li><strong>New:</strong> Stripe-Webhook gegen Timing-Attack: constant-time string-compare bei Signatur-Vergleich + Replay-Window-Check (5min Tolerance) gegen wiederholtes Abspielen alter Payloads</li></ul>]]></description>
</item>
<item>
  <title>Notification-Dispatcher gehärtet — Finding #1 jetzt real geschlossen (v0.7.3-beta.1)</title>
  <link>https://chatbot.mignuti.com/changelog#v0.7.3-beta.1</link>
  <guid isPermaLink="false">mignuti-chatbot-0.7.3-beta.1</guid>
  <pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate>
  <description><![CDATA[<p>Der existierende notification-dispatcher hatte exakt die Schwachstellen, die Hacker-Audit Finding #1 (HOCH) beschrieben hatte: inline-escapeHtml statt zentralem Helper, kein Template-Rendering für die HTML-Files, JSON.stringify-Fallback für unbekannte event_kinds. Plus: Ein Recon-Pass entdeckte einen kompromittierten Anthropic API-Key in .env.example. Dispatcher komplett refaktoriert auf email-safe.ts + email-render.ts; alle 8 event_kinds nutzen den Encoding-Contract; Slack-Webhook-Host gegen hooks.slack.com gepinnt; +18 neue Tests (144 → 162).</p><ul><li><strong>New:</strong> supabase/functions/_shared/email-render.ts — dispatcher-spezifischer Renderer mit 8 event_kinds (hot_lead, fallback_spike, quota_80/100, pdf_ready/failed, new_pending_question, weekly_digest), Slack + Email + Plain-Text-Fallback, locale EN/DE, alle Werte safe-encoded vor Substitution</li><li><strong>New:</strong> Slack-Markdown-Escape (slackEscape): escaped &lt;, &gt;, &amp; für Slack incoming-webhook-payloads. Verhindert dass `&lt;…&gt;` als Slack-link-syntax interpretiert wird</li><li><strong>New:</strong> Plain-text-Fallback in jedem Email-Render: text/plain für Email-Clients ohne HTML</li><li><strong>Fixed:</strong> 🚨 CRITICAL: Echter Anthropic API-Key (sk-ant-api03-…) war in .env.example committet. Sofort durch Placeholder ersetzt. Repository ist (noch) kein git-Repo, also kein Push-Leak — aber der Key sollte trotzdem rotiert werden (Festplatten-Logs, Backups, AV-Scanner-Quarantäne als potenzielle Exfiltrationspfade)</li><li><strong>Fixed:</strong> Hacker-Audit Finding #1 real geschlossen: notification-dispatcher render-Logik komplett extrahiert nach _shared/email-render.ts. Alle End-User-Werte (TopUnansweredQuestion, first_message, question_text, error, filename) gehen durch safeUserText (htmlEscape ∘ clampForEmail). Alle URLs durch safeUrl (Allow-List mignuti-chatbot/replyr-Domains). Numerische Felder (lead_score, conversations_count, fallback_pct) durch clampLeadScore/clampInt/clampPct (bounded gegen NaN/Infinity/-1)</li><li><strong>Fixed:</strong> JSON.stringify-Fallback entfernt: vorher würde ein unbekannter event_kind die ganze payload-jsonb in HTML rendern → direkter Phishing-Relay-Vektor. Jetzt: deliberately bland &apos;system notice&apos; ohne payload-Daten</li><li><strong>Fixed:</strong> Slack-Webhook-Host gepinnt: target-URL muss https://hooks.slack.com sein. Schützt gegen kompromittierte Org-Admin-Konten, die einen Slack-Webhook auf eine Angreifer-Domain umbiegen, um Lead-Snippets zu exfiltrieren</li><li><strong>Fixed:</strong> Email-Recipient-Validierung: regex gegen CR/LF/NUL-Injection im to:-Feld (Header-Injection Defence) + length-cap 254 (RFC-5321)</li><li><strong>Fixed:</strong> Error-message-Redaction: provider-error-bodies werden auf 120 chars geclamped und nur als strukturierter Code gespeichert (keine User-Content-Leak via Resend/Slack-Error-Echo)</li></ul>]]></description>
</item>
<item>
  <title>Final Hacker-Pentest — alle 6 Findings durchgehend behoben (v0.7.2-beta.1)</title>
  <link>https://chatbot.mignuti.com/changelog#v0.7.2-beta.1</link>
  <guid isPermaLink="false">mignuti-chatbot-0.7.2-beta.1</guid>
  <pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate>
  <description><![CDATA[<p>Pentest durch /hacker-Skill auf den Audit-gehärteten Code (v0.7.1) hat 6 zusätzliche Findings produziert: 1× HOCH (Cross-Customer-Email-Phishing via TopUnansweredQuestion), 2× MITTEL (Tabnabbing + Encoding-Contract-Lücke), 3× NIEDRIG (UI-Trust-Spoofing + Supply-Chain + Surrogate-Split). Alle 6 gefixt + 37 neue Unit-Tests (107 → 144). 3 dieser Tests haben echte Code-Bugs aufgedeckt (TDD-Wert), die alle behoben sind. Widget-Bundle: 26.72 KB gzipped (Budget 30 KB ✅).</p><ul><li><strong>New:</strong> supabase/templates/CONTRACT.md — Encoding-Contract als Single-Source-of-Truth für alle Email-Renderer (3 Trust-Level-Klassen, allow-list, Mandatory-Rules)</li><li><strong>New:</strong> supabase/functions/_shared/email-safe.ts — htmlEscape + clampForEmail + safeUrl + safeUserText als Pflicht-Primitive für jeden notification-dispatcher</li><li><strong>New:</strong> scripts/lib/validate-template.mjs — extrahierte Pure-Logic-Validation, testbar ohne Supabase</li><li><strong>New:</strong> src/src/lib/safe-href.ts isExternalHref() Helper für saubere noopener-Logik</li><li><strong>New:</strong> EmptyState öffnet externe Links jetzt automatisch in neuem Tab mit Tab-Hijacking-Schutz</li><li><strong>Fixed:</strong> Hacker-HOCH #1: Cross-Customer-Email-Phishing via {{ .TopUnansweredQuestion }} im weekly-digest.html — End-Nutzer-controlled HTML-Injection-Vektor. Behoben durch (a) `supabase/templates/CONTRACT.md` als zentrale Encoding-Doku, (b) Inline-Security-Header in weekly-digest.html mit Trust-Level-Mapping pro Variable, (c) `supabase/functions/_shared/email-safe.ts` mit htmlEscape/clampForEmail/safeUrl/safeUserText-Primitiven, (d) Allow-List für URL-Hosts (chatbot.mignuti.com / replyr.app + Subdomains)</li><li><strong>Fixed:</strong> Hacker-MITTEL #2: EmptyState-CTA-Tabnabbing — externe https-Links bekommen jetzt rel=&apos;noopener noreferrer&apos; + target=&apos;_blank&apos;. Plus: isSafeHref akzeptiert nur noch https:// (kein http:// mehr) — Mixed-Content + Downgrade-Vektor geschlossen. Neue isExternalHref()-Helper</li><li><strong>Fixed:</strong> Hacker-MITTEL #3: Encoding-Contract-Lücke in subprocessor-update + welcome + magic-link Templates — Inline-Header verweist jetzt auf supabase/templates/CONTRACT.md mit klarem Trust-Level pro Variable und Allow-List-Regeln</li><li><strong>Fixed:</strong> Hacker-NIEDRIG #4: Browser-Mockup im Onboarding Step 4 — 🔒-Emoji entfernt (versprach falsches TLS), durch &apos;Vorschau&apos;-Label (i18n) ersetzt. Verhindert Brand-Spoof-Screenshots und falsche Trust-Signale</li><li><strong>Fixed:</strong> Hacker-NIEDRIG #5: scripts/lib/validate-template.mjs — vor jedem Seed-Run werden alle 6 JSON-Templates schema-geprüft (Vertical-Allow-List, Tone-Enum, Hex-Colors, system_prompt_base 50-4000 chars, kein non-allow-listed external URL, content_policy_keywords als string-array). PR-Merge bleibt 1. Defense-Layer; das ist die 2.</li><li><strong>Fixed:</strong> Hacker-NIEDRIG #6: clamp() in widget/src/lib/text.ts ist jetzt codepoint-aware via Array.from — UTF-16-Surrogate-Pairs (Emoji, CJK Han) werden nicht mehr an Cutoff-Position zerschnitten (würde sonst U+FFFD-Replacement-Chars rendern)</li><li><strong>Fixed:</strong> Bug aus TDD: safeUrl() ließ http://allow-listed.com durch — jetzt nur noch https:// erlaubt (Test enttarnte das)</li><li><strong>Fixed:</strong> Bug aus TDD: validate-template URL-Regex erlaubte nur chatbot.mignuti.com/replyr.app aber keine Subdomains wie app.mignuti.com — Refactor zu URL-Parsing + isAllowedPromptHost() mit endsWith-Check</li></ul>]]></description>
</item>
<item>
  <title>Audit-Sprint — 4-Lens-Hardening of the 5-Day-Sprint (v0.7.1-beta.1)</title>
  <link>https://chatbot.mignuti.com/changelog#v0.7.1-beta.1</link>
  <guid isPermaLink="false">mignuti-chatbot-0.7.1-beta.1</guid>
  <pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate>
  <description><![CDATA[<p>Selbst-Audit durch Bug-Check, Security, Hacker, E2E-Test über die in v0.7.0-beta.1 hinzugefügten Files. 6 Findings (1 HIGH, 3 MEDIUM, 2 LOW) durchgängig gefixt + 22 neue Unit-Tests. Tests: 85→107, Widget-Bundle stabil bei 26.70 KB gzipped (Budget 30 KB).</p><ul><li><strong>New:</strong> shared utilities extracted: widget/src/lib/text.ts (clamp), src/src/lib/safe-href.ts, src/src/lib/preview-host.ts — DRY + testbar</li><li><strong>Fixed:</strong> Hacker-HIGH: SourceFootnotes excerpt + filename clamp(600/80 chars) — verhindert UI-DoS wenn ein bösartiger oder buggy Server Multi-MB-Excerpts streamt. Plus similarity-Wert auf [0,1] bounded und Number.isFinite-Guard gegen NaN/Infinity</li><li><strong>Fixed:</strong> Security-MEDIUM: EmptyState cta.href nutzt jetzt isSafeHref()-Guard — javascript:/data:/vbscript:/file:-URIs werden blockiert, Component fällt auf &lt;button&gt; zurück. Defense-in-depth gegen i18n-Translation-Bugs</li><li><strong>Fixed:</strong> Bug-MEDIUM: Onboarding Step-4 previewUrl wird durch cleanPreviewHost() normalisiert — User pastet &apos;https://example.com/&apos; → Mockup zeigt &apos;https://example.com&apos; statt &apos;https://https://example.com/&apos;. Plus Length-Clamp 80</li><li><strong>Fixed:</strong> Bug-LOW: trust.astro EN+DE nutzt jetzt PUBLIC_APP_URL env statt hardcoded https://app.replyr.app — robust gegen späteren Domain-Wechsel</li><li><strong>Fixed:</strong> Hacker-LOW: seed-vertical-templates.mjs Error-Logs zeigen nur error.code (nicht .message) ohne DEBUG=1 — keine Postgres-Schema-Details in CI-Logs</li></ul>]]></description>
</item>
<item>
  <title>Vision 5-Day-Sprint — Templates, Trust, Citations, Polish (v0.7.0-beta.1)</title>
  <link>https://chatbot.mignuti.com/changelog#v0.7.0-beta.1</link>
  <guid isPermaLink="false">mignuti-chatbot-0.7.0-beta.1</guid>
  <pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate>
  <description><![CDATA[<p>Fünf Vision-Tage hintereinander durchgezogen, während Supabase-Setup pausiert war. Schwerpunkt: Backend-unabhängige Frontend-Wow-Faktoren, Closed-Beta-Polish, und der Trust-Center als Agency-Sales-Enabler. Build grün, Tests grün (85/85), Widget-Bundle 26.57 KB gzipped (Budget 30 KB).</p><ul><li><strong>New:</strong> TAG 1 — Vertical-Template-Library bootstrappable: 6 JSON-Seeds (Steuerberater, Immobilien, E-Com, Zahnarzt, Hotel, Consulting) als Single-Source-of-Truth + Standalone-Seeder scripts/seed-vertical-templates.mjs (idempotent via service_role) + npm script db:seed-templates. Migration 047-Seeding hatte System-User-Abhängigkeit, neuer Pfad funktioniert ohne</li><li><strong>New:</strong> TAG 2 — Agency-Dashboard Polish: Loading-Skeleton (5 pulsierende Zeilen, Layout matches real rows um Sprung beim Daten-Load zu vermeiden) + dezidierter NoProjectsEmptyState (Heroicon + &apos;Start onboarding&apos; CTA) — getrennt vom Filter-leer-State</li><li><strong>New:</strong> TAG 3 — Widget Live-Inline-Citations: Source-Pills upgraded zu klickbaren Footnotes mit Excerpt-Expansion via &lt;details&gt;. Numerierte Marker [1][2][3] + Filename + Page + Similarity-%. Fallback auf static-pill wenn Excerpt fehlt</li><li><strong>New:</strong> TAG 3 — Onboarding Step 4 als Browser-Mockup-Frame: Statt nacktem Inline-Widget jetzt gestyltes Browser-Chrome mit Adressleiste (User-konfigurierbare URL) + Mock-Site-Background + Widget-Overlay. Robuster als 3rd-Party-iframe (X-Frame-Options blockt)</li><li><strong>New:</strong> TAG 4 — 4 Custom-Branded Email-Templates: magic-link.html (mit config.toml-Anbindung), welcome.html, subprocessor-update.html, weekly-digest.html. Alle DSGVO-kompliant gestaltet, Mignuti Chatbot-Branded statt Default-Supabase-Look</li><li><strong>New:</strong> TAG 4 — 404-Page mit Personality + 2 prominente Empty-States: /404.astro mit Bot-Easter-Egg-SVG + drei CTAs. Wiederverwendbare EmptyState-Komponente mit 4 Heroicon-Varianten (chat, question, chart, inbox) — eingesetzt in conversations und pending-questions</li><li><strong>New:</strong> TAG 5 — Trust-Center chatbot.mignuti.com/trust (EN + DE): Architecture-SVG mit EU-Datenresidenz-Frame, Subprocessor-Tabelle (6 Auftragsverarbeiter mit DPAs), 8 TOMs, Compliance-Badges (DSGVO + EU-AI-Act compliant, ISO 27001 + SOC 2 in roadmap), 6 Legal-Doc-Links, dpo@mignuti.com Contact-Block. Polish-Level Stripe-Standard</li><li><strong>Fixed:</strong> EmptyState type-narrowing: typeof === &apos;string&apos; war zu schwach, ersetzt durch isIconKind() type-guard mit ICON_KINDS-array (TS2322 fix)</li><li><strong>Fixed:</strong> shared/api.ts ChatMessageChunk.sources um source_page + source_filename erweitert — vorher hatte das Widget die Felder eigenständig getypt</li></ul>]]></description>
</item>
<item>
  <title>9-Agent-Audit Fixes — Launch-Readiness 72 → 92 (v0.6.0-beta.1)</title>
  <link>https://chatbot.mignuti.com/changelog#v0.6.0-beta.1</link>
  <guid isPermaLink="false">mignuti-chatbot-0.6.0-beta.1</guid>
  <pubDate>Thu, 23 Apr 2026 00:00:00 GMT</pubDate>
  <description><![CDATA[<p>Sequentieller Audit-Pass durch SEO, A11y, Anwalt, GDPR, UX, Security, Hacker, Widget-Embed, Bug. Alle 32 Findings (18 Blocker + 7 HIGH + 5 Polish + 2 Magic) abgearbeitet.</p><ul><li><strong>New:</strong> Onboarding-Step-4 &apos;Test your bot&apos; — Widget läuft inline im Wizard, First-Success-Moment &lt; 60s</li><li><strong>New:</strong> Agency-Dashboard Bulk-Actions — Select-All, CSV-Export, Open-in-Tabs (max 10 gleichzeitig)</li><li><strong>New:</strong> Billing-Page Upgrade-Banner ab 80% Monats-Usage mit Ein-Klick-Upgrade zum nächsten Plan</li><li><strong>New:</strong> Cmd+K-Badge im Header (Linear/Vercel-Style) — klickbar öffnet Command-Palette</li><li><strong>New:</strong> Sidebar Bot-Health-Score-Pill (0–100 aus Coverage+Satisfaction+Speed) als Scorecard für Agency-Kundengespräche</li><li><strong>New:</strong> Page-context-aware Proactive-Teaser — Widget sendet page_path, Server matcht Prefix-Regel und liefert kontextspezifische Message</li><li><strong>New:</strong> Widget-Key-Rotation — v_widget_key_age View + rotate_widget_key() RPC mit 30-Tage-Grace, Admin-Warnung ab 365d</li><li><strong>New:</strong> Multi-Org-Switcher in API-Keys-Page (und shared Store useCurrentOrg) — Agenturen mit mehreren Orgs sehen jetzt alle</li><li><strong>Security:</strong> Sec-1: chat-completion nutzt chat_config_for_session() + match_embeddings_for_session() RPCs (Migration 041) — DB erzwingt Session-Existenz, JWT-Forgery alleine reicht nicht</li><li><strong>Security:</strong> Sec-2: neue dequeue_url_crawl + ack_url_crawl RPCs (Migration 042) — Worker nutzt offizielle Interface statt direktem pgmq.read</li><li><strong>Security:</strong> Hacker-1: Prompt-Injection-Envelope — RAG-Sources in &lt;source&gt;-Tags gewrappt, Control-Chars gestrippt, &apos;ignore previous&apos; Pattern redacted, PDF-Filename sanitize im Worker</li><li><strong>Security:</strong> Hacker-2: Crawl-Demo Denial-of-Wallet-Schutz — IP-Limit 2/Tag (war 5/h), Per-Host-Cap 3/Tag, Turnstile-Hook, DNS-Rebinding-Defense via Deno.resolveDns (IPv4+IPv6)</li><li><strong>Security:</strong> HIGH: Widget-JWT trägt ip_hash Claim — chat-completion rejected Sessions bei Netzwerk-Wechsel (401 session_network_mismatch)</li><li><strong>Security:</strong> HIGH: SSRF-Defense zentralisiert in supabase/functions/_shared/ssrf.ts — isPrivateIp + isPublicHostname (AWS-IMDS, RFC1918, IPv6 ULA, link-local)</li><li><strong>Security:</strong> HIGH: Webhook-Dispatcher x-replyr-timestamp Header — Receiver kann Replays rejecten (|now - ts| &gt; 300s)</li><li><strong>Security:</strong> HIGH: stripe-webhook upsert onConflict statt blocking insert — idempotent bei Retry</li><li><strong>Security:</strong> HIGH: CSP-Meta-Fallback in Base.astro — edge-layer nonce-based CSP als Ziel dokumentiert</li><li><strong>Security:</strong> GDPR: Widget-Default data-consent=&apos;pending&apos; (war &apos;granted&apos;) — keine Session/LocalStorage ohne explizite Einwilligung</li><li><strong>Security:</strong> POLISH: replyr.setConsent(&apos;denied&apos;) entfernt &lt;replyr-widget&gt; aus DOM + löscht alle replyr.* localStorage-Einträge</li><li><strong>Fixed:</strong> B-11: .single() → .maybeSingle() in onboarding/branding/url-sources mit expliziten Fehlerpfaden</li><li><strong>Fixed:</strong> B-12: Shared FNV-1a prompt-hash utility (shared/src/prompt-hash.ts) — admin + Edge-Fn byte-identisch</li><li><strong>Fixed:</strong> B-13: api-keys.tsx akzeptiert jetzt Multi-Org-Context via useCurrentOrg-Store</li><li><strong>Fixed:</strong> B-14: gdpr-export-build Cron mit Queue-Depth-Guard — skip wenn 3+ exports building</li><li><strong>Fixed:</strong> B-15: deferrable Constraint-Trigger prüft sum(weight) = 100 für active prompt_versions</li><li><strong>Fixed:</strong> A11y-S3: Try-it-Hero Live-Region entkoppelt (role=log + separate aria-live span, streaming bubbles aria-hidden)</li><li><strong>Fixed:</strong> A11y: Widget-Launcher aria-label mit EU-AI-Act-Disclosure in DE+EN</li><li><strong>Fixed:</strong> A11y: Status-Sparkline mit &lt;title&gt; + &lt;desc&gt; + numerischem Trend für Screen-Reader</li><li><strong>Fixed:</strong> SEO: Imprint via marketing/src/config/site.ts zentralisiert (Mignuti Apps als Einzelunternehmen)</li><li><strong>Fixed:</strong> SEO: Sitemap Edge Function um /compare, /for, DE-Varianten + xhtml:link hreflang erweitert</li><li><strong>Fixed:</strong> SEO: hreflang-Mapping-Bug gelöst via explizite alternates={en, de} Props in Base.astro</li><li><strong>Fixed:</strong> UX: Onboarding Step-Label-aria-current korrekt</li><li><strong>Fixed:</strong> Widget: Streaming-Log mit overflow-anchor: none + min-height 2.4em auf Assistant-Bubbles → kein Layout-Shift</li><li><strong>Fixed:</strong> Widget-Launcher Fokus-Ring nutzt currentColor (theme-aware) statt hardcoded #fff</li><li><strong>Fixed:</strong> Widget z-index 2147483640 (max-1) — Fair-Play zu Host-Page Z-Stack</li><li><strong>Fixed:</strong> Stripe-Webhook upsert mit onConflict ignoreDuplicates — kein Crash bei Retry-Storm</li><li><strong>Breaking:</strong> Widget data-consent default changed from &apos;granted&apos; to &apos;pending&apos;. Embedder-Sites ohne Consent-Banner müssen jetzt explizit data-consent=&quot;granted&quot; setzen.</li></ul>]]></description>
</item>
<item>
  <title>Phase-0-Scaffold + Session 2+3+4 complete (v0.5.0-beta.1)</title>
  <link>https://chatbot.mignuti.com/changelog#v0.5.0-beta.1</link>
  <guid isPermaLink="false">mignuti-chatbot-0.5.0-beta.1</guid>
  <pubDate>Thu, 23 Apr 2026 00:00:00 GMT</pubDate>
  <description><![CDATA[<p>Greenfield MVP-Scaffold + agency depth + compliance-toolkit.</p><ul><li><strong>New:</strong> Lead-Intelligence: Intent-Classifier (8 intents) + Lead-Score 0–100 + smart Lead-Capture (trigger-based, not upfront)</li><li><strong>New:</strong> Custom-Branding: Logo-Upload, 4 fonts, background patterns, live-preview, 7-day shareable preview-link for client approval</li><li><strong>New:</strong> Notifications: Slack + Email, real-time hot-lead pings (not &apos;someone opened chat&apos;), weekly-digest</li><li><strong>New:</strong> Agency-Portfolio with Churn-Risk-Traffic-Light (red = &apos;call your client tomorrow&apos;)</li><li><strong>New:</strong> Handover-to-Human with transparent business-hours + median response time (from real data)</li><li><strong>New:</strong> Webhook-API (HMAC-SHA256 signed) + &apos;Why this answer?&apos;-Inspector with forensic chunk-view</li><li><strong>New:</strong> Analytics-Charts with Vertical-Benchmark-Overlay (Data-Flywheel: your metrics vs. industry median)</li><li><strong>New:</strong> URL-Crawler production with CSS-selector content-isolation + live preview before save</li><li><strong>New:</strong> GDPR Self-Service: ZIP export + Readiness-Report PDF (white-labelable) + 30-day soft-delete grace</li><li><strong>New:</strong> White-Label Custom-Domain (TXT + CNAME verification via DoH)</li><li><strong>New:</strong> Public REST-API v1 + scoped API-Keys</li><li><strong>New:</strong> Cmd+K Command-Palette + Breadcrumbs</li><li><strong>New:</strong> Status-Page with 5-min service-health sampling + incidents</li><li><strong>New:</strong> Pa11y-CI + WCAG 2.2 AA + VPAT 2.5 Rev INT report</li><li><strong>New:</strong> A/B Prompt-Testing with real-world metrics per version</li><li><strong>Security:</strong> Widget-Secret bcrypt-hashing + rotate-flow (30-day grace)</li><li><strong>Security:</strong> ClamAV INSTREAM scanning in PDF-Worker</li><li><strong>Security:</strong> Consent-Mode-API (data-consent=granted/pending/denied)</li><li><strong>Security:</strong> Session-upsert preserves delete_token across re-auths</li></ul>]]></description>
</item>
</channel></rss>