Zum Inhalt

Kora Platform v1.2.0 — Release Notes

Released: 2026-05-01 Tag: v1.2.0 Predecessor: v1.1.0 — Block 8 abgeschlossen

Was ist v1.2.0?

Customer-Wert-Tag. v1.2.0 schließt Block 11 — Widget-Integration ab und löst damit den Customer-Wert-Pfad aus dem AVS-Feedback ein: „Layout/CI-Anpassung möglich? Codeschnipsel im MS-System?"

Mit v1.2.0:

  • Das Widget liest tenant-spezifisches Branding live aus der Platform und applied es auf den Chat-Container.
  • Operator-/Tenant-custom_css und allowed_origins aus v1.1.0 (Block 8.6) werden im Widget umgesetzt — ohne dass Customer den Widget-Code anfassen muss.
  • Embed-Code-Snippet als Copy-Paste-Snippet auf der Chatbot-Detail-Seite — ein Drei-Zeiler, der direkt im AVS-MS-System-CMS landet.
  • Anonymous-Feedback-Schreibungen aus dem Widget mit Audit-Trail (actor_role='anonymous', actor_user='widget').

Die Hybrid-Strategie zwischen AVS-Demo-Schema und Platform- Schema bleibt parallel: existing AVS-Demo-Widget-Instanzen funktionieren weiter, neue Instanzen schalten per data-chatbot-id-Attribut auf den Platform-Endpoint um.

Aufwand-Datapoint: Block 11 in ~5–6h real implementiert (Refined-Schätzung 14h — Pattern-Reife-Quote ~40 %, besser als Block-8-Schnitt 60 %). Branding-Foundation aus 8.6 plus Audit-Helper aus TODO-14 zahlten direkt ein.

Highlights

Widget-Config-Endpoint mit Branding-Resolve

GET /api/v1/widget/config/{chatbot_id} (public, Origin-checked) liefert das nach Field-by-Field Chatbot→Tenant resolved Branding (§4.5/§12.2). Die Resolve-Logic ist serverseitig in einer Funktion zentral — robust gegen künftige Branding-Feld- Erweiterungen.

custom_css bleibt operator-only-Boundary (8.6-Sicherheits- modell — XSS/UI-Redressing-Risiko); allowed_origins erscheint nicht in der Response (Server-Side-Origin-Check vor jedem Widget-Endpoint). Diskretion: dasselbe 403 für „Origin nicht erlaubt" und „Chatbot nicht gefunden" — kein Discovery-Oracle über existierende chatbot_ids via Status-Code-Probing.

Public-Feedback-Schreib-Pfad mit Anonymous-Audit

POST /api/v1/feedback (public, Origin-checked, anonymous-actor Audit). chatbot_id ist Pflicht; tenant_id wird nicht vom Client geliefert, sondern serverseitig aus dem Chatbot abgeleitet (Cross-Tenant-Schutz).

Der write_platform_audit-Helper aus TODO-14 (Block 8.2/8.4) wurde sauber um den Anonymous-Actor-Modus erweitert: ctx=None plus explizites actor_role/actor_user/tenant_id. Existing- Caller nutzen weiterhin ctx=ctx als Keyword-Argument — voll kompatibel, keine Migration nötig.

Hybrid-Schreib-Pfad-Strategie (kein Cut-off)

Discovery zeigte: AVS-Demo-Schema ({query_id, rating, ...}) und Platform-Schema ({chatbot_id, ...}) sind nicht 1:1 mappbar.

Statt forciertem Cut-off mit 410 Gone wurde Hybrid implementiert:

  • Existing AVS-Demo-Widget-Instanzen bleiben unverändert funktional.
  • Widget switcht automatisch auf Platform-Endpoint, sobald das data-chatbot-id-Attribut gesetzt ist.
  • Beide Pfade leben parallel — keine harte Migration für AVS.

Die Pragma-Entscheidung folgt Stop-Trigger #3 aus dem Block-11- Prompt: „Falls AVS-Demo-Endpoint nicht trivial deprecated werden kann, Hybrid statt Cut-off."

Schema-Migration 0009_feedback_widget_anonymous

feedback.session_id und feedback.message_id von NOT NULL auf nullable. Anonymous-Widget-Schreibungen ohne vorhandene Platform-Chat-Infrastruktur landen sauber. FKs bleiben aktiv und greifen, sobald Werte gesetzt sind. Forward-kompatibel zu künftigen Platform-eigenen /query-Endpoints — keine erneute Schema- Änderung nötig.

Embed-Code-Snippet in beiden UIs

EmbedCodeSnippet-Vue-Komponente in Tenant-UI und Operator-UI (eigenständige Bundle-Builds → zwei Dateien). Tenant-UI integriert die Komponente auf der ChatbotDetailPage. Operator-UI hält die Komponente standalone bereit für eine künftige Operator- Per-Chatbot-Page (Discovery-Datapoint, siehe unten).

Snippet ist Drei-Zeiler:

<script src=".../widget/avs-chat-widget.min.js"
        data-chatbot-id="<chatbot-uuid>"
        data-api-base=".../api/v1"></script>

Copy-Button mit Feedback-Toast (1.6 s). Kein JS-Build-Step beim Customer.

Audit-Action und KNOWN_ACTIONS

chatbot_feedback.created mit actor_role='anonymous' und actor_user='widget'. In frontend/operator-ui/src/types/audit.ts ergänzt — Audit-Filter-Dropdown im Operator-UI zeigt die neue Action ohne weitere Konfiguration. Restliche TODO-Block-7-4-04-Drift bleibt offen für Block 13/14 oder Cleanup-Welle.

Test-Erweiterung

Suite Anzahl
pytest-Integration (tests/integration/test_widget_api.py) 13 Tests
Vitest Tenant-UI (EmbedCodeSnippet.spec.ts) 3 Tests
Vitest Operator-UI (EmbedCodeSnippet.spec.ts) 2 Tests
Playwright Tenant-UI (chatbot-sub-routes, widget-public-api) 7 Tests
Playwright Operator-UI (tenant-branding-sub-route) 1 Test

Playwright-Specs nutzen das skip-if-env-not-set-Pattern (E2E_CHATBOT_ID/E2E_TENANT_ID) für CI-Resilienz.

Drift-Schließungen

TODO-Konzept-01 — Block-11-Aufwand-Reconciliation

Vorab-Run am 2026-05-01 (Merge 9bcf36e). §17.2 Tabellen-Zeile 12h → 14h Refined, §17.2a Reconciliation-Quelle Nr. 6, Konzept- Patch v5.3.2 → v5.3.3, Phasen-Total ~425h → ~427h (innerhalb Rundungstoleranz).

TODO-Platform-15 — Playwright-E2E-Coverage-Lücke

Erledigt mit Block 11 Phase 4. Drei Tenant-UI-Specs (Sub-Routes, Widget-API-Smoke) plus ein Operator-UI-Spec (TenantBranding-Sub-Route). Dokumentation-Folge-Datapoint: ein zentrales E2E-Seed-Skript (analog gen-test-tokens.sh, das Tenant + Chatbot + Branding + Feedback-Sample landet) würde die test.skip-Tags auflösen — bietet sich vor Block 14 (CI) an.

TODO-Block-7-4-04 — KNOWN_ACTIONS-Drift (Block-11-Anteil)

chatbot_feedback.created ergänzt. Restliche Block-Review- Familien-Drift bleibt offen — Trigger Cleanup-Welle vor Block 13 oder Block 14.

Bekannte Drifts

TODO-Auth-NEU (M2/40, von v1.0.0)

JWT-sub-Claim fehlt. Workarounds aktiv (Composite-Identifier (realm, preferred_username), NULL für actor_keycloak_id im Audit). Fix in v1.x — kein Block-11-Bezug.

TODO-Platform-11 — Backend-Pytest-Env-Bootstrap

docker cp tests/ + docker exec pytest-Workaround weiterhin aktiv für Block-11-Tests. Trigger vor Block 14 (CI-Pipeline).

TODO-Platform-12 — Pytest-Profil-Trennung Platform vs AVS-Demo

pytest tests/ collectet weiterhin AVS-Demo-Tests, die in der Platform-Test-Umgebung ohne Demo-Infrastruktur scheitern. Workaround: spezifische Test-Pfade angeben. Trigger vor Block 14.

TODO-Block-7-Review-Familien

Vier Familien à 6–7 TODOs aus Block-7-Code-Reviews (7-1b, 7-2, 7-3, 7-4-NN; plus Block-5e/5f/5g, 4b). Cleanup-Niveau, kein Funktional-Bug. Trigger Cleanup-Welle vor Block 13.

Discovery-Datapoints (kein TODO)

Operator-UI Per-Chatbot-Page fehlt

Operator-UI hat TenantsListPage, TenantsDetailPage, ModulesListPage etc. — aber kein Per-Chatbot-Detail-View. Operator sieht Tenants und deren Chatbots aggregiert (z. B. via TenantsDetailPage), kann aber kein Branding/Feedback pro Chatbot über Cross-Tenant-Sicht öffnen.

EmbedCodeSnippet-Komponente steht in frontend/operator-ui/src/ components/EmbedCodeSnippet.vue standalone bereit. Integration auf einer künftigen OperatorChatbotDetailPage ist eine Zeile (<EmbedCodeSnippet :chatbot-id="..."/>).

Backlog-Item für künftige Operator-UI-Erweiterung — siehe Strategie-Pause Pfad E.

Nicht im Scope von v1.2.0

Block 8.5 — Sources-Management

Blockiert von Block 13 Konnektor-Framework.

Block 13 — Konnektor-Framework (~57h Refined)

Größter Tech-Hub. BaseConnector + Modul-Registry + Credential-Store + Sync-Scheduler. Foundation für 8.5 plus Phase C (Confluence, MediaWiki, MS-System-Connector).

Cleanup-Welle (~?h)

Block-7-Review-Familien aufräumen vor Block 13 oder Block 14. Aufwand-Schätzung pending Discovery.

Operator-UI Per-Chatbot-Page (~6–8h Refined)

Aus Block-11-Discovery. Customer-Wert-Folge: Operator hätte zentralen Cross-Tenant-View auf Chatbots inkl. Embed-Snippet.

Migration von v1.1.0

  1. Alembic 0009 anwenden:
    make migrate-platform
    
  2. Existing AVS-Demo-Widget-Instanzen bleiben unverändert funktional — kein Code-Change beim Customer.
  3. Neue Widget-Instanzen brauchen data-chatbot-id="<chatbot_uuid>" als Attribut, plus data-api-base="https://<platform-url>/api/v1".
  4. Branding-Stubs werden weiterhin via UPSERT bei erstem Edit angelegt (8.6-Pattern unverändert).
  5. tenant_branding.allowed_origins muss konfiguriert sein, bevor das Widget eingebettet werden kann — sonst 403 vom Platform-Endpoint (sichere Default).

Was kommt als Nächstes?

Strategie-Pause aktiv. Lutz-Entscheidung pending zwischen vier Pfaden:

Pfad Inhalt Refined-Aufwand
B Block 13 Konnektor-Framework ~57h
C Block 8.5 Stub-Variante (vor Block 13) ~6h
D Cleanup-Welle Block-7-Review-Familien ?h
E Operator-UI Per-Chatbot-Page (Block-11-Datapoint) ~6–8h

Siehe Roadmap-Sektion „Strategie-Pause nach v1.2.0".