358 lines
12 KiB
Markdown
358 lines
12 KiB
Markdown
|
|
# 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.*
|