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_onundinternal_onlybleiben 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}/clonemittarget_language-Body, Audit-Actiontemplate.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}mitis_always_on-Gate (403) undinternal_only-Maskierung (404). Audit-Actionstenant_module.activated/deactivatedmitactor_role='tenant'. Pattern-Lesson: Action-Naming nicht inflationieren — Differenzierung überactor_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 undtemplate_idsind unveränderlich (Audit-Konsistenz). Audit- Actionschatbot.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 .../feedbackmit Pagination und Rating-/Category-Filter,GET .../feedback/statsmit 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-TrennungTenantBrandingUpdateTenant(ohnecustom_css) vs.TenantBrandingUpdateOperator(mit). Pydantic strippt unbekannte Felder per Default.allowed_origins: Pattern-validiert (kein nackter*,https://*.domainals Single-Wildcard erlaubt,http://nur fürlocalhost, max 20 Origins, keine Duplikate).- Action-Naming-Differenzierung:
actor_roledifferenziert Operator-vs-Tenant-Mutationen ohne Action-Inflation (8.3-Lesson). Beispiel:tenant_branding.updatedmitactor_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 buildfür beide UIs neu, da Versions-Stamps aktualisiert wurden. - Bench-Daten: optional
bench-tenant-a/-bmit 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.