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_cssundallowed_originsaus 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¶
- Alembic 0009 anwenden:
- Existing AVS-Demo-Widget-Instanzen bleiben unverändert funktional — kein Code-Change beim Customer.
- Neue Widget-Instanzen brauchen
data-chatbot-id="<chatbot_uuid>"als Attribut, plusdata-api-base="https://<platform-url>/api/v1". - Branding-Stubs werden weiterhin via UPSERT bei erstem Edit angelegt (8.6-Pattern unverändert).
tenant_branding.allowed_originsmuss 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".