Kairo-Jinkendo/docs/sprints/Sprint0_AP0_4_Completion_Report_v0.1.md

358 lines
12 KiB
Markdown
Raw Normal View History

# AP0.4 – Abschlussbericht Workflow-ready Prompt, Feature & Config Registry
**Status:** abgeschlossen
**Stand:** 2026-07-04
**Branch:** `develop` · Schema `005` · Version `0.4.0-ap0.4`
---
## 1. Scope und Einordnung
AP0.4 liefert die **minimale, workflow-ready Grundlage** für Feature-, Prompt-, Placeholder- und Configuration-Registry in Kairo — ohne LLM-Aufrufe, ohne Workflow Engine, ohne Billing.
| Anforderung (AP0.4) | Status |
|---------------------|--------|
| Migration Feature/Prompt/Placeholder/Config/ExecutionLog | ✓ |
| Feature Registry + DB-Sync | ✓ |
| PromptDefinition / PromptVersion / PromptStep | ✓ |
| PlaceholderDefinition + Validation | ✓ |
| ConfigurationEntry + Config Service | ✓ |
| Single Prompt Rendering | ✓ |
| `features`-Block in Entitlements | ✓ |
| Capability-geschützte API | ✓ |
| Audit bei Sync/Config/Fehler-Render | ✓ |
| Tests | ✓ (lokal; CI nach Push) |
**Bewusst nicht in AP0.4:** Workflow/Pipeline-Ausführung, LLM, MCP, Tool Calling, Feature-Limits, Admin-UI, zentrale Jinkendo Prompt Engine.
---
## 2. Umgesetzte Dateien
| Datei | Zweck |
|-------|--------|
| `backend/migrations/005_prompt_feature_config_registry.sql` | Tabellen Feature/Prompt/Placeholder/Config/ExecutionLog |
| `backend/feature_registry.py` | Feature-Registry + DB-Sync |
| `backend/feature_registrations/` | Initiale Features |
| `backend/prompt_registry.py` | Prompt-Registry + Version/Step-Sync |
| `backend/prompt_registrations/` | Smoke-Prompts |
| `backend/placeholder_registry.py` | Placeholder-Registry + Sync |
| `backend/placeholder_registrations/` | Tenant-/Actor-/Debug-Placeholder |
| `backend/config_service.py` | Config lesen/schreiben, Secret-Schutz |
| `backend/prompt_validation.py` | Placeholder-Extraktion + Validierung |
| `backend/prompt_rendering.py` | Single-Mode Render + ExecutionLog |
| `backend/prompt_context.py` | TenantContext → Placeholder-Werte |
| `backend/sync_prompt_feature_config.py` | Startup-Sync + Default-Configs |
| `backend/rights_registrations/registry_ops.py` | 7 neue Capabilities |
| `backend/routers/features.py` | `GET /api/features` |
| `backend/routers/prompts.py` | Prompt-Liste, Detail, Render |
| `backend/routers/config.py` | Config GET/POST |
| `backend/entitlements.py` | `features`-Block aus DB |
| `backend/capabilities.py` | `require_capability_ctx` (ohne Tenant-Zwang) |
| `backend/entrypoint.sh` | Registry-Sync nach Rights-Sync |
| `backend/version.py` | `0.4.0-ap0.4`, Schema `005` |
| `backend/tests/test_feature_registry.py` | Feature-Tests |
| `backend/tests/test_prompt_registry.py` | Prompt/Validation/Render-Tests |
| `backend/tests/test_config_registry.py` | Config-Tests |
| `frontend/src/App.jsx` | Header AP0.4 |
| `README.md` | API-Doku AP0.4 |
---
## 3. Neue Migrationen
**`005_prompt_feature_config_registry.sql`**
| Tabelle | Zweck |
|---------|--------|
| `features` | Feature-Metadatenkatalog |
| `prompt_definitions` | PromptDefinition inkl. `execution_mode`, `active_version_id` |
| `prompt_versions` | Versionierter Body + JSON-Schemas + `model_policy_key` |
| `prompt_steps` | Workflow-/Pipeline-Schritte (AP0.4: nur `template` genutzt) |
| `placeholder_definitions` | Typisierte Placeholder pro `context_kind` |
| `configuration_entries` | Global/tenant Config (kein Secret-Klartext) |
| `prompt_execution_logs` | Render-/Test-Läufe |
---
## 4. Datenmodell
```
features
prompt_definitions ──< prompt_versions ──< prompt_steps
└── active_version_id → prompt_versions
placeholder_definitions (key + context_kind)
configuration_entries (global | tenant)
prompt_execution_logs → definition/version/user
```
**ExecutionMode:** `single` | `pipeline` | `workflow` (nur `single` ausführbar)
**ContextKind:** `kairo.tenant_context`, `kairo.actor_context`, `kairo.debug_context`
**StepType:** `template`, `resolver`, `llm_call`, `postprocess`, `validation` (nur `template` ausführbar)
---
## 5. Registry-Strukturen
Analog AP0.3 Rights Registry:
```
backend/
├── feature_registry.py + feature_registrations/
├── prompt_registry.py + prompt_registrations/
├── placeholder_registry.py + placeholder_registrations/
├── config_service.py
├── prompt_validation.py
├── prompt_rendering.py
└── sync_prompt_feature_config.py
```
Startup-Reihenfolge: Migrationen → Seeds → Rights-Sync → **Registry-Sync** → Uvicorn.
---
## 6. Feature Registry
Registrierte Features:
| Feature Key | Modul |
|-------------|-------|
| `kairo.feature.registry` | platform |
| `kairo.config.registry` | config |
| `kairo.prompt.registry` | prompt |
Keine Limits, Quotas oder Billing — reiner Metadatenkatalog im Entitlements-Snapshot (`enabled: true`).
---
## 7. Prompt-Modell
**Kernel-Konzepte (lokal in Kairo, extrahierbar):**
| Konzept | Umsetzung |
|---------|-----------|
| PromptDefinition | `prompt_definitions` + `PromptRegistration` |
| PromptVersion | `prompt_versions` |
| PromptStep | `prompt_steps` |
| PlaceholderDefinition | `placeholder_definitions` |
| ContextKind | Code-Konstanten + Spalte `context_kind` |
| ExecutionMode | Spalte `execution_mode` |
| InputSchema / OutputSchema | JSONB auf Version |
| ModelPolicyKey | Spalte (Vorbereitung, kein LLM) |
| PromptRenderService | `prompt_rendering.render_prompt_single` |
| PromptValidationService | `prompt_validation.validate_placeholder_input` |
| PromptExecutionLog | `prompt_execution_logs` |
**Smoke-Prompts:**
- `kairo.system.health_summary` — Debug-Context, Template via `PromptStep`
- `kairo.context.debug_summary` — TenantContext-Placeholder
- `kairo.actor.debug_summary` — Actor-Context
- `kairo.pipeline.placeholder` — `execution_mode=pipeline` (strukturell, nicht ausführbar)
---
## 8. Workflow-/Pipeline-Fähigkeit
| Vorbereitet | AP0.4 Verhalten |
|-------------|-----------------|
| `execution_mode=pipeline/workflow` | In DB/Registry akzeptiert; Render → HTTP 501 / `mode_not_implemented` |
| `prompt_steps` mit diversen `step_type` | Gespeichert; Single-Render nutzt ersten aktiven `template`-Step oder `version.body` |
| `input_mapping` / `output_mapping` | JSONB-Spalten, noch nicht ausgewertet |
**Spätere Pipeline:** Schritte der aktiven Version in `step_order` ausführen; pro `step_type` Handler registrieren (analog Rights-Registrations).
**Spätere Workflow:** `execution_mode=workflow` + Step-Graph/Orchestrator oberhalb des Render-Services — Tabellen müssen nicht migriert werden.
---
## 9. Placeholder Validation
- Mustache-Style: `{{placeholder_key}}`
- Required Placeholder aus Registry → kontrollierter `PlaceholderValidationError`
- Optionale Placeholder fehlen → kein Fehler
- Unbekannte Keys im Template → in `validation.unknown_placeholders` dokumentiert
- Typ-Prüfung basic (`string`, `number`, `boolean`, `object`, `array`, `json`)
- Template und Kontext getrennt (`use_context` + `prompt_context.py`)
Initial-Placeholder (Tenant): `tenant_name`, `tenant_id`, `actor_*`, `portal_role`, `tenant_role`, `capabilities`.
---
## 10. Configuration Registry
Default-Configs beim Sync:
| Key | Wert |
|-----|------|
| `prompt.default_execution_mode` | `single` |
| `prompt.render_logging_enabled` | `true` |
| `features.registry_sync_enabled` | `true` |
- Scopes: `global`, `tenant`
- `is_secret=true` → kein Klartext; nur `{"ref": "env"}` erlaubt
- Zugriff zentral über `config_service.py`
---
## 11. Entitlements-Erweiterung
`/api/me/entitlements` liefert nun `features` auf Root-, Account- und Tenant-Ebene:
```json
{
"features": {
"kairo.prompt.registry": {
"enabled": true,
"module": "prompt",
"name": "Prompt Registry"
}
}
}
```
Keine Usage-Zähler. Feature-Enforcement bleibt `probe`.
---
## 12. Neue/geänderte API-Endpunkte
| Endpoint | Auth | Capability |
|----------|------|------------|
| `GET /api/features` | Session | `kairo.feature.registry.read` |
| `GET /api/prompts` | Session | `kairo.prompt.registry.read` |
| `GET /api/prompts/{key}` | Session | `kairo.prompt.registry.read` |
| `POST /api/prompts/{key}/render` | Session | `kairo.prompt.render` |
| `GET /api/config` | Session | `kairo.config.registry.read` |
| `POST /api/config` | Session | `kairo.config.registry.manage` |
`require_capability_ctx` erlaubt Lese-Endpunkte ohne aktiven Tenant (Portal-Admin/User).
---
## 13. Audit
| Aktion | Event |
|--------|-------|
| Registry-Sync Startup | `registry.sync.completed` |
| Config geändert | `config.entry.changed` |
| Render fehlgeschlagen | `prompt.render.failed` |
| Capability verweigert | `capability.denied` (bestehend) |
Prompt-Definition-CRUD über API ist in AP0.4 nicht exponiert (nur Code-Registry + Sync) — Audit bei manuellem DB-Write wäre Lücke; AP0.5 Admin-Routen können CRUD + Audit ergänzen.
---
## 14. Tests und Verifikation
| Testdatei | Abdeckung |
|-----------|-----------|
| `test_feature_registry.py` | Registrierung, Sync, Entitlements, Auth |
| `test_prompt_registry.py` | Sync, Validation, Render, Pipeline-Ablehnung, API |
| `test_config_registry.py` | Global Config, Secret-Schutz, API |
| `test_entitlements.py` | Features im Snapshot |
| `test_migrations.py` | Migration 005 |
| `test_rights_registry.py` | 12 Capabilities |
```bash
docker compose -f docker-compose.dev-env.yml exec backend python -m pytest tests -ra -vv
```
---
## 15. Übernommene Muster aus Mitai
| Muster | Kairo |
|--------|-------|
| Prompt Template + Version | `PromptRegistration` / `prompt_versions` |
| Placeholder-Handling | Registry + Validation |
| Feature Registry Metadaten | `features` + Entitlements |
| Entitlements zentrale Schicht | `features`-Block ergänzt |
| Registry-Sync | Startup-Sync analog Rights |
| Preview/Testbarkeit | Render-Endpoint + ExecutionLog |
**Nicht übernommen:** Pipeline-Graphen, Gesundheits-Prompts, Tier/Billing, Usage-Zähler.
---
## 16. Übernommene Muster aus Shinkan
| Muster | Kairo |
|--------|-------|
| Mustache-Template-Prinzip | `{{key}}`-Rendering |
| Kontextarten | `context_kind` |
| Registry-first | Code → DB-Sync |
| Schlanke Runtime ohne Overengineering | nur Single-Render |
| Capability-Gates | `require_capability*` |
**Nicht übernommen:** Trainings-Prompts, Club-Logik, Übungsrechte.
---
## 17. Bewusst nicht übernommene Muster
- Vollständige Mitai Prompt Engine / Workflow-Graphen
- LLM Provider Routing, Tool Calling, MCP
- Shinkan-/Mitai-Domänenprompts
- Feature-Limits, Billing, Coupons
- Produktive Admin-UI
- Secrets in `configuration_entries`
---
## 18. Abweichungen von Designprinzipien
| Thema | Abweichung | Begründung |
|-------|------------|------------|
| Prompt-CRUD API | nur Code-Registry + Sync | Sprint-0-Minimal; Swagger-Read/Render reicht |
| Feature-Enforcement | immer `probe` | Limits erst später |
| Output-Validation | nicht implementiert | Spec: nicht erforderlich in AP0.4 |
| ContextKind | Code-Konstanten, keine eigene Tabelle | Ausreichend für 3 Kindes |
---
## 19. Offene Entscheidungen
1. **Wann Prompt/Feature-CRUD über Admin-API** (AP0.5)?
2. **Extraktion `jinkendo_prompt_kernel`** — Package-Grenze und Migrations-Ownership
3. **Pipeline-Executor** — Step-Handler-Registry vs. feste Kette
4. **Feature-Enforcement** — wann über reine Metadaten hinaus?
5. **Render-Logging in Prod** — `prompt.render_logging_enabled` Default?
---
## 20. Empfehlung für AP0.5
Laut Foundation **AP0.5 – Audit und minimale Admin-Prüfbarkeit**:
- AuditLog für Registry-/Prompt-Änderungen erweitern
- Minimale Admin-Routen oder Admin-Seite
- Optional: Entitlements-/Feature-Panel in GUI
- Prod-pytest-Cleanup (`*@example.com`)
---
## Extraktion `jinkendo_prompt_kernel` — Einschätzung
**Realistisch:** Die Module `prompt_registry`, `placeholder_registry`, `prompt_validation`, `prompt_rendering` und die Tabellen `prompt_*` / `placeholder_definitions` sind produktneutral genug (`kairo.*`-Keys nur in Registrations). Extraktion als Shared Python-Package mit injizierbarem DB-Layer und Audit-Hook ist ohne Schema-Bruch möglich.
**Risiken im aktuellen Zuschnitt:**
- Config und Feature Registry noch eng an Kairo-Entitlements gekoppelt
- Kein generischer Step-Executor — Pipeline-Integration erfordert noch Designarbeit
- `require_capability_ctx` vs. `require_capability` — zwei Patterns für Tenant-Pflicht
---
## Referenzen
- `docs/sprints/Jinkendo_Kairo_04_Sprint0_Foundation_v0.3.md` § AP0.4
- Vorgänger: `docs/sprints/Sprint0_AP0_3_Completion_Report_v0.3.md`
- Designprinzipien: Mitai Prompt/Registry/Feature, Shinkan AI Prompt Runtime
---
*Abgeschlossen im Rahmen Sprint 0 – AP0.4.*