Zum Inhalt

Kora Platform v1.1.0 — Release Notes

Released: 2026-04-30 Tag: v1.1.0 Predecessor: v1.0.0 — Phase B Polish abgeschlossen

Was ist v1.1.0?

v1.1.0 markiert das Ende von Block 8 (Tenant-UI mit Chatbot- Management) bis auf Block 8.5 (Sources), der von Block 13 (Konnektor-Framework) blockiert ist. Tenant-Admins können jetzt:

  • Templates klonen in andere Sprachen
  • Module selbst aktivieren/deaktivieren (is_always_on und internal_only bleiben gesperrt)
  • Chatbots vollständig verwalten — List, Drei-Step-Wizard, Edit, Soft-Deactivate
  • Branding pro Tenant und pro Chatbot setzen, Operator hat zusätzlich custom_css
  • Feedback-Einträge pro Chatbot ansehen mit Stat-Aggregation und Filter

Der Audit-Trail ist konsolidiert: alle Mutationen schreiben Audit-Log mit Diff-Pattern (before/after-Map).

Highlights

Tenant-UI funktional komplett (außer Sources)

Foundation aus 8.0, ergänzt um:

  • Multi-Language-Templates-Clone (8.2): Operator-Endpoint POST /api/v1/operator/templates/{id}/clone mit target_language-Body, Audit-Action template.cloned. Löst den Sprach-Filter aus UX-04 (v1.0.0) endlich funktional ein.
  • Self-Service Module-Toggle (8.3): POST /api/v1/tenants/me/modules/{id}/{activate,deactivate} mit is_always_on-Gate (403) und internal_only-Maskierung (404). Audit-Actions tenant_module.activated/deactivated mit actor_role='tenant'. Pattern-Lesson: Action-Naming nicht inflationieren — Differenzierung über actor_role.
  • Chatbots-CRUD + Wizard (8.4): vollständiger Lifecycle via /api/v1/tenants/me/chatbots. Drei-Step-Wizard mit Template- Auswahl, Snapshot-Anlage, Qdrant-Collection-Provisioning. Slug und template_id sind unveränderlich (Audit-Konsistenz). Audit- Actions chatbot.created/updated/deactivated.
  • Branding (8.6): sechs Endpoints in zwei Routern. Tenant-Self unter /api/v1/tenants/me/branding{,…/chatbots/{id}/branding}, Operator unter /api/v1/operator/tenants/{id}/branding. UPSERT- Logic (kein Stub bei Tenant-/Chatbot-Create), No-Audit-Idempotenz bei Empty-Diff. Chatbot-Override fällt feldweise auf Tenant-Defaults zurück (Block 11 implementiert die Resolve-Logic Widget-seitig).
  • Feedback-View (8.7): Read-only-Übersicht pro Chatbot. GET .../feedback mit Pagination und Rating-/Category-Filter, GET .../feedback/stats mit GROUP BY-Aggregation und Top-Kategorie unter negativem Feedback. Sub-Route-Pattern aus 8.6 wiederverwendet (/chatbots/:id/feedback).

Audit-Trail-Konsolidierung (TODO-Platform-14)

Vor v1.1.0: Template-Mutationen schrieben keinen Audit-Log. Mit v1.1.0: template.created/updated/deactivated/cloned lückenlos. Pattern: write_platform_audit-Helper aus Block 5, Single-Transaction mit Mutation, No-Diff-Idempotenz für Empty-Updates. Audit-Foundation für 8.3 (tenant_module.*), 8.4 (chatbot.*), 8.6 (tenant_branding.updated, chatbot_branding.updated).

Sicherheitsmodell-Schärfung

  • tenant_branding.custom_css: operator-only — Tenant kann's nicht setzen, auch nicht über manipulierten Body. Pydantic- Schema-Trennung TenantBrandingUpdateTenant (ohne custom_css) vs. TenantBrandingUpdateOperator (mit). Pydantic strippt unbekannte Felder per Default.
  • allowed_origins: Pattern-validiert (kein nackter *, https://*.domain als Single-Wildcard erlaubt, http:// nur für localhost, max 20 Origins, keine Duplikate).
  • Action-Naming-Differenzierung: actor_role differenziert Operator-vs-Tenant-Mutationen ohne Action-Inflation (8.3-Lesson). Beispiel: tenant_branding.updated mit actor_role='tenant' vs. 'operator' statt zwei separaten Actions.

Block-8-Real-Aufwand

Sub-Block Aufwand real Refined-Schätzung Quote
8.0 Foundation 3.5h ~7h 50%
8.1 UX-03 (Re-Diagnose) 0.5h n/a n/a
8.2 Multi-Lang Clone 4h ~5h 80%
TODO-14 Audit-Foundation 1.5h ~2.5h 60%
8.3 Self-Service Toggle 4h ~7h 57%
8.4 Chatbots-CRUD 9h ~14h 64%
8.6 Branding 5h ~8h 63%
8.7 Feedback-View 3h ~7h 43%
Total ~30.5h 50–64h 60%

Pattern-Reife wird ab 8.4 sichtbar — 8.6 und 8.7 unter 5h dank Sub-Route-Pattern aus 8.6 + Audit-Helper aus TODO-14. Pattern-Reife heißt: Schätzungen aus dem Refinement sind eine Boden-Schätzung, keine Real-Schätzung.

Bekannte Drifts

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

JWT enthält keinen sub-Claim. Workarounds aktiv: platform_audit_log.actor_keycloak_id ist nullable, user_preferences nutzt Composite-PK (realm, username). Drift-Frühwarnung über verify-auth-stack.sh Check 58a/58b. Fix via Realm-Mapper-Erweiterung in v1.x.

TODO-Platform-11 (Pytest-Env-Bootstrap)

Backend-Pytest läuft via docker cp + docker exec pytest- Workaround. Saubere Lösung (make test-setup oder scripts/bootstrap-test-env.sh) vor Block 14 (CI-Pipeline).

TODO-Platform-12 (Pytest-Profil-Trennung)

Voller pytest tests/-Lauf produziert AVS-Demo-Test-Failures. v1.1.0-Akzeptanz nutzte --ignore-Flag-Cluster. Filter-Profil- Trennung (Pytest-Marker, separate Config oder Verzeichnis-Trennung) vor Block 14.

TODO-Platform-15 (Playwright-E2E-Coverage)

Sub-Routes in ChatbotDetailPage (/chatbots/:id/branding, /chatbots/:id/feedback) sowie Operator /tenants/:id/branding haben keine Playwright-E2E-Tests. Vitest- Coverage ist da. Vor Block 11 oder als Teil der Cleanup-Welle vor Block 13.

Nicht im Scope von v1.1.0

Block 8.5 — Sources-Management

Blockiert von Block 13 (Konnektor-Framework). Sources-Schema (chatbot_sources-Tabelle) existiert seit Block 1, aber Routes + UI hängen am BaseConnector-Interface, das Block 13 anlegt. Stub-Variante (~6h, fixer Upload-Konnektor) als Brücke vor Block 13 möglich — Lutz-Entscheidung pending.

Block 11 — Widget-Integration

Branding-Schreib-Pfade aus 8.6 sind Foundation. Block 11 baut:

  • Widget-Config-Endpoint mit Tenant→Chatbot-Branding-Fallback-Merge
  • CORS-Middleware mit allowed_origins-Check
  • Embed-Code-Generator (Snippet für Customer-CMS)
  • Widget-Schreib-Pfad-Refactor (Feedback aktuell nach AVS-Demo, soll nach Platform — Discovery aus Block 8.7)

Migration von v1.0.0

Falls du von v1.0.0 updates:

  • Alembic-Migrations: keine — alle Schemas (Branding, Feedback, Module-Toggle) waren bereits in Block 1 vorbereitet.
  • DB-State: existing Tenants haben kein automatisches Branding-Stub. Beim ersten Branding-Edit wird via UPSERT angelegt (siehe BrandingService.upsert_*).
  • Frontend-Build: npm run build für beide UIs neu, da Versions-Stamps aktualisiert wurden.
  • Bench-Daten: optional bench-tenant-a/-b mit Demo-Branding und Feedback-Mock-Rows befüllen — siehe v1.1.0-Akzeptanz-Matrix für SQL-Seed-Pattern.

Was kommt als Nächstes?

Strategie-Pause nach v1.1.0. Lutz-Entscheidung pending zwischen drei Pfaden:

Pfad A — Block 11 Widget-Integration (~12–14h)

Widget-Config-Endpoint mit Branding-Resolve, CORS-Origin-Check, Embed-Code-Generator, Widget-Schreib-Pfad-Refactor. Customer-Wert: hoch (AVS-MS-System-Embed-Story).

Pfad B — Block 13 Konnektor-Framework (~57h)

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

Pfad C — 8.5 Stub-Variante (~6h)

Fixer Upload-Konnektor ohne BaseConnector-Framework. Brücke vor Block 13. Risiko: Sunk-Cost wenn Block 13 dann anders strukturiert.

Akzeptanz-Lauf

Komplette Test-Matrix: v1.1.0-acceptance.md.