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

277 lines
8.3 KiB
Markdown
Raw Permalink Normal View History

# AP0.6 – Abschlussbericht Kairo Workspace UX mit minimaler Widget Registry
**Status:** abgeschlossen
**Stand:** 2026-07-05
**Branch:** `develop` · Frontend `0.6.0-ap0.6` · Backend Schema `006` (unverändert)
**Backend-Änderungen:** keine
---
## 1. Scope und Einordnung
AP0.6 macht Kairo erstmals als **Arbeitswerkzeug nutzbar** — ohne neue Foundation-Schicht, ohne Backend-Widget-Registry, ohne KI/MCP/Projects.
| Anforderung (AP0.6) | Status |
|---------------------|--------|
| Workspace mit Widget-Karten | ✓ |
| Vorhabenliste + Detail | ✓ |
| Maßnahmen CRUD in UI | ✓ |
| Status / Priorität ändern | ✓ |
| Actor-Zuweisung (minimal) | ✓ |
| Meine offenen Maßnahmen | ✓ |
| Blockierte Maßnahmen erkennbar | ✓ |
| Erledigte filterbar/ausblenden | ✓ |
| Frontend Widget Registry | ✓ |
| View Registry + Navigation | ✓ |
| Capability-bewusste UI | ✓ |
| Loading / Error / Empty States | ✓ |
| Vitest (Registry + Badges) | ✓ 7 Tests |
| README UI-Doku | ✓ |
**Produktfrage beantwortet:** Ja — mit AP0.5-APIs kann ein Nutzer Vorhaben und Maßnahmen praktisch verwalten.
---
## 2. Umgesetzte Dateien
| Bereich | Dateien |
|---------|---------|
| API-Client | `frontend/src/api/client.js`, `me.js`, `initiatives.js`, `actions.js`, `actors.js` |
| Session | `frontend/src/context/SessionContext.jsx`, `hooks/useCapabilities.js` |
| Registry | `frontend/src/registry/widgetRegistry.js`, `viewRegistry.js` |
| Widgets | `TenantContextWidget`, `MyOpenActionsWidget`, `BlockedActionsWidget`, `InitiativesWidget` |
| Pages | `WorkspacePage`, `InitiativesPage`, `InitiativeDetailPage`, `AuthPanel` |
| Components | Badges, Forms, Lists, Empty/Loading/Error |
| Layout | `frontend/src/layout/AppLayout.jsx` |
| Styles | `frontend/src/styles/workspace.css` |
| App | `App.jsx`, `main.jsx` (React Router) |
| Tests | `registry.test.js`, `badges.test.jsx` |
| Doku | `README.md`, dieser Bericht |
---
## 3. Frontend-Struktur
```text
frontend/src/
api/ # HTTP-Schicht
context/ # SessionProvider
hooks/ # useCapabilities
registry/ # Widget + View Registry
widgets/ # Workspace-Karten
pages/ # Routen
components/ # Wiederverwendbare UI-Bausteine
layout/ # App-Shell + Navigation
constants/ # Status/Priority Labels
styles/ # workspace.css
```
Keine monolithische God Page — `App.jsx` nur Routing + Session.
---
## 4. Widget Registry
**Datei:** `registry/widgetRegistry.js`
| key | title | capability | order |
|-----|-------|------------|-------|
| `kairo.tenant_context` | Kontext | — | 0 |
| `kairo.my_open_actions` | Meine offenen Maßnahmen | `kairo.action.read` | 10 |
| `kairo.blocked_actions` | Blockierte Maßnahmen | `kairo.action.read` | 20 |
| `kairo.active_initiatives` | Aktive Vorhaben | `kairo.initiative.read` | 30 |
`getWidgetsForArea('workspace', capabilities)` filtert und sortiert.
**Frontend-only** — keine DB, kein Drag & Drop, keine User-Layouts.
---
## 5. View Registry / Navigation
**Datei:** `registry/viewRegistry.js`
| key | path | Nav | capability |
|-----|------|-----|------------|
| `kairo.workspace` | `/workspace` | ✓ | `kairo.action.read` |
| `kairo.initiatives` | `/initiatives` | ✓ | `kairo.initiative.read` |
| `kairo.initiative_detail` | `/initiatives/:id` | — | `kairo.initiative.read` |
`AppLayout` rendert NavLinks aus `getNavViews(capabilities)`.
---
## 6. Workspace UX
Route `/workspace`:
- Tenant-/Actor-Kontext-Karte
- Offene Maßnahmen (ohne `blocked` — die haben eigene Karte)
- Blockierte Maßnahmen (gefiltert aus `/api/actions/me/open`)
- Aktive/pausierte Vorhaben (Top 5)
- Quick-Action „Vorhaben anlegen“ (mit `kairo.initiative.manage`)
---
## 7. Vorhaben-UX
**Liste** `/initiatives`: aktive + pausierte Vorhaben, Status/Priority-Badges, offene Maßnahmen-Zähler (parallele API-Calls pro Vorhaben).
**Detail** `/initiatives/:id`: Titel, Goal, Badges, Maßnahmenliste, Filter „Erledigte ausblenden“.
---
## 8. Maßnahmen-UX
- Anlegen via `ActionForm` im Detail
- Inline Status-Dropdown (Quick-Change)
- Vollständiges Bearbeiten (Titel, Beschreibung, Status, Priority, Assignment)
- Erledigte (`done`/`discarded`) standardmäßig ausgeblendet
- Offene Liste über Backend `/api/actions/me/open` — erledigte erscheinen dort nicht
---
## 9. Actor-Zuweisung
**Lücke:** Kein `GET /api/actors` im Backend.
**AP0.6-Lösung:** `api/actors.js` → `actorsFromContext()` liefert nur den aktuellen Human Actor aus `/api/me/context`.
`ActorSelect` zeigt Checkboxen für verfügbare Actors; Hinweistext auf AP0.7.
Assignments via `PUT /api/actions/{id}/assignments` — Actor-IDs, nicht User.
---
## 10. Capability-bewusste UI
Quelle: `/api/me/entitlements` + `/api/me/context` → `useCapabilities()`.
| Capability | UI-Effekt |
|------------|-----------|
| `kairo.initiative.manage` | Button „Vorhaben anlegen“ |
| `kairo.initiative.read` | Vorhaben-Widgets/Views |
| `kairo.action.manage` | Maßnahme anlegen/bearbeiten, Status, Assignment |
| `kairo.action.read` | Workspace, offene Maßnahmen |
Backend bleibt autoritativ — Frontend nur UX-Gates.
---
## 11. Loading / Error / Empty States
Jedes Widget und jede Page nutzt `LoadingState`, `ErrorState` (mit Retry), `EmptyState` mit kontextbezogenen Texten.
---
## 12. Responsive Verhalten
`workspace.css` — `@media (max-width: 640px)`:
- Header stapelt vertikal
- Widget-Grid einspaltig
- Buttons full-width (Form-Ausnahmen)
---
## 13. Tests und Smoke-Tests
### Automatisiert (Vitest)
```bash
cd frontend && npm run test
```
7 Tests: Registry-Inhalt, Capability-Filter, StatusBadge, PriorityBadge.
### Manueller Smoke-Test
1. Login (Dev: `lars@stommer.com`)
2. `/workspace` — Karten laden
3. Vorhaben anlegen
4. Detail → Maßnahme anlegen (Self-Assignment)
5. Status → In Arbeit → Erledigt
6. Workspace: Maßnahme nicht mehr unter „Offen“
7. Blockiert setzen → erscheint in „Blockierte Maßnahmen“
Kein Playwright im Repo — dokumentierter manueller Smoke-Test.
---
## 14. Übernommene Muster aus Mitai
| Muster | Umsetzung |
|--------|-----------|
| Kartenbasierte Oberfläche | `widget-card`, `widget-grid` |
| Widget-Registry-Idee | `widgetRegistry.js` (frontend-only, minimal) |
| Status-Badges | `StatusBadge`, `PriorityBadge` |
| Leere Zustände | `EmptyState` |
| Loading/Error | eigene Komponenten |
**Nicht übernommen:** volles Widget Dashboard, Layout-Persistenz, Drag & Drop, Backend-Registry.
---
## 15. Übernommene Muster aus Shinkan
| Muster | Umsetzung |
|--------|-----------|
| Schlankes KPI/Listen-Layout | kompakte Widget-Karten |
| Tenant-Kontext sichtbar | `TenantContextWidget`, App-Header |
| Capability-bewusste Nav | `getNavViews()` |
| Robuste Frontend-Struktur | api/ + pages/ + components/ |
---
## 16. Bewusst nicht übernommene Muster
- Mitai/Shinkan-Domänenlogik
- Backend-Widget-Registry
- Admin-Konsole, Prompt/Feature/Config UI
- Actor-Admin-API
- Playwright E2E (noch nicht im Stack)
- Designsystem / UI-Library
---
## 17. Backend-Änderungen
**Keine.** AP0.5-APIs reichen aus.
---
## 18. Abweichungen von der Spezifikation
| Thema | Abweichung | Begründung |
|-------|------------|------------|
| Actor-Liste | nur Context-Actor | kein GET /api/actors |
| Owner Actor wählen | nicht in UI | keine Actor-List-API |
| Open-Count Vorhaben | N+1 API-Calls | akzeptabel für MVP |
| Playwright Smoke | manuell dokumentiert | nicht im CI-Stack |
---
## 19. Offene UX-/Produktentscheidungen
1. **`GET /api/actors`** — read-only für Assignment-UI (AP0.7)?
2. **Initiative bearbeiten in UI** — PATCH existiert, Form fehlt noch
3. **Workspace-Refresh** — Widgets laden eigenständig; kein globales Event-Bus
4. **Foundation AP0.5 (Audit/Admin)** — weiterhin AP0.6/0.7 backlog
---
## 20. Empfehlung für AP0.7
**Kleinster Nutzwert:** `GET /api/actors` (tenant-scoped, read, `kairo.action.read`) + ActorSelect mit echten Tenant-Actors.
Alternativ: **Kommentare pro Maßnahme** (aus AP0.5-Empfehlung) — erhöht Kollaboration ohne Backend-Explosion.
---
## Referenzen
- AP0.5 Backend: `docs/sprints/Sprint0_AP0_5_Completion_Report_v0.2.md`
- ADP Scope: `docs/architecture/ADP_AP0_5_Sprint0_Scope_Shift_v0.1.md`
- Mitai: `docs/reference/design-principles/mitai/DASHBOARD_WIDGETS_DESIGN_PRINCIPLES.md`
- Shinkan: `docs/reference/design-principles/shinkan/NAVIGATION_IA_DESIGN_PRINCIPLES.md`