403 lines
13 KiB
Markdown
403 lines
13 KiB
Markdown
|
|
# AP0.8 – Operating Model Extension I
|
|||
|
|
## Implementierungsauftrag v0.2 (freigegeben)
|
|||
|
|
|
|||
|
|
**Status:** freigegeben zur Umsetzung
|
|||
|
|
**Stand:** 2026-07-05
|
|||
|
|
**Vorgänger:** AP0.7 ✓ · AP0.R1 ✓ · KAIRO-ARCH-01 ✓
|
|||
|
|
**Zielversion:** `0.8.0-ap0.8` · Schema `007`
|
|||
|
|
**Ersetzt:** `Sprint0_AP0_8_Assignment_v0.1.md` (Entwurf)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Einordnung
|
|||
|
|
|
|||
|
|
AP0.8 ist der **erste fachliche Ausbau nach dem Product Reset** und der **erste Schritt der Operating-Model-Evolutionslinie** gemäß System Target State §24:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
1. Existing Foundation ✓ AP0.1–AP0.7
|
|||
|
|
2. Adaptive Steering Core — nicht AP0.8 (→ AP1.x)
|
|||
|
|
3. Method Registry / Hooks — nicht AP0.8
|
|||
|
|
4. Roadmap / Structure Builder — nicht AP0.8 (Milestone als MVP-Brücke)
|
|||
|
|
5. Signal / NextAction Engine ← AP0.8a startet hier (regelbasiert, Data Layer)
|
|||
|
|
6. Assignment / Waiting / … — teilweise vorhanden; Waiting → AP0.9+
|
|||
|
|
7. Evidence / Review / Decision — AP0.9
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Ziel: Kairo sichtbar über `Initiative → Action` hinausheben und die Leitfrage operationalisieren:
|
|||
|
|
|
|||
|
|
> Welcher nächste Schritt bringt ein Vorhaben aktuell am wirkungsvollsten voran?
|
|||
|
|
|
|||
|
|
AP0.8 baut auf AP0.7 auf (Tenant-Invarianten, Actor Directory, Data Layer) und bleibt **regelbasiert ohne KI, ohne Method Registry, ohne SteeringContext**.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Verbindliche Referenzen
|
|||
|
|
|
|||
|
|
Vor Umsetzung lesen:
|
|||
|
|
|
|||
|
|
1. `docs/product/Kairo_Product_Definition_and_MVP_Reset_v0.1.md`
|
|||
|
|
2. `docs/product/Kairo_Canonical_Operating_Model_v0.1.md` — §5 Objektmodell, §7 Attention Logic, §8 Data Layer
|
|||
|
|
3. `docs/product/Kairo_Corrected_MVP_Roadmap_v0.1.md` — AP0.8
|
|||
|
|
4. `docs/architecture/Kairo_System_Target_State_v0.1.md` — §13 Roadmap/Backlog/Action, §17 Signals
|
|||
|
|
5. `docs/architecture/Kairo_Target_Architecture_Method_Driven_Adaptive_Steering_Core_v0.1.md` — Phasen A/B, AD-TA-08
|
|||
|
|
6. `docs/architecture/Kairo_Tenant_Invariants_v0.1.md`
|
|||
|
|
7. `docs/sprints/Sprint0_AP0_7_Completion_Report_v0.2.md`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Abgleich System Target State
|
|||
|
|
|
|||
|
|
| Zielbild (System Target State) | AP0.8-Umsetzung |
|
|||
|
|
|-------------------------------|-----------------|
|
|||
|
|
| RoadmapItem = Entwicklungsziel; BacklogItem = möglicher Handlungsbedarf; Action = committete Maßnahme | Backlog und Action **getrennt**; Convert-Flow |
|
|||
|
|
| Milestone = RoadmapItem(type=milestone) langfristig | **MVP-Brücke:** eigene `milestones`-Tabelle; Konsolidierung → RoadmapItem in Phase C (AD-TA-08) |
|
|||
|
|
| Attention + NextActionCandidate als Signal-Typen | Read Models in `data_layer/attention.py` |
|
|||
|
|
| Signals erklärbar (reason, scope, data_source) | DTO-Felder `reason_code`, `scope_type`, `scope_id`, `data_source` |
|
|||
|
|
| Blocker als Steuerungsobjekt | eigene Tabelle, nicht nur Action-Status |
|
|||
|
|
| Kein SteeringContext / Method Registry yet | explizit Nicht-Scope |
|
|||
|
|
| Kein Workflow / KI | explizit Nicht-Scope |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Leitentscheidungen (freigegeben)
|
|||
|
|
|
|||
|
|
| Entscheidung | Entscheidung | Begründung |
|
|||
|
|
|--------------|--------------|------------|
|
|||
|
|
| Umsetzungsreihenfolge | 4 Slices (8a→8d) in **einem** AP0.8 | Attention zuerst für Produktwirkung |
|
|||
|
|
| Blocker | **Eigenes Objekt** | Canonical Model + System Target State §10 |
|
|||
|
|
| Backlog vs. Action | **Getrennte Tabellen** | §13 Unterscheidung Program Director vs. To-do |
|
|||
|
|
| Milestone | **Eigene Tabelle (MVP-Brücke)** | Schnell prüfbar; Roadmap-Konsolidierung später |
|
|||
|
|
| Project | **Nicht in AP0.8** | Milestone direkt an Initiative |
|
|||
|
|
| Action-Status `ready`/`review_required` | **Nicht in AP0.8** | AP0.9 |
|
|||
|
|
| Due Dates auf Actions | **Nicht in AP0.8** | Regel 7 stub; Milestone `target_date` optional |
|
|||
|
|
| Attention: open Blockers | **Ja, Regel 1b** | Ergänzung zu blocked Actions |
|
|||
|
|
| Capabilities | 7 neue (1 read + 3×2) | Registry-first |
|
|||
|
|
| `kairo.attention.read` | **Eigene Capability** | Explizit, Grants wie workspace.read |
|
|||
|
|
| Member manage Blocker/Backlog/Milestone | **Ja** | wie Actions |
|
|||
|
|
| Convert Backlog→Action | **Pflicht, minimal** | Commit-Flow |
|
|||
|
|
| Blocker ↔ action.status=blocked | **Optional bei Create** | nicht zwingend synchron |
|
|||
|
|
| UI | AP0.6b-Optik | kein Redesign |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Empfohlene Umsetzungsreihenfolge
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
AP0.8a Attention / NextActionCandidate (Read Model + Widget)
|
|||
|
|
AP0.8b Blocker (Domäne + API + UI)
|
|||
|
|
AP0.8c BacklogItem (Domäne + API + UI + convert)
|
|||
|
|
AP0.8d Milestone minimal (Domäne + API + UI + Attention Regel 6)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Reihenfolge ist verbindlich für die Implementierung.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# Teil A — AP0.8a: Attention / NextActionCandidate
|
|||
|
|
|
|||
|
|
## Ziel
|
|||
|
|
|
|||
|
|
Regelbasierte **Signal-Schicht** im Data Layer — erste Instanz der Signal/NextAction-Engine (System Target State §17). Später Refactor in `backend/steering/signals/` mit Method Rule Providers.
|
|||
|
|
|
|||
|
|
## Data Layer
|
|||
|
|
|
|||
|
|
Neue Datei: `backend/data_layer/attention.py`
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
get_attention_items(ctx) -> list[AttentionItemDTO]
|
|||
|
|
get_next_action_candidates(ctx, *, limit=10) -> list[NextActionCandidateDTO]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**AttentionItemDTO** (mit Erklärbarkeit):
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"kind": "blocked_action | open_blocker | high_priority_action | unassigned_action | initiative_without_next_action | stale_initiative | milestone_at_risk",
|
|||
|
|
"severity": "info | warning | critical",
|
|||
|
|
"title": "...",
|
|||
|
|
"summary": "...",
|
|||
|
|
"scope_type": "action | blocker | initiative | milestone",
|
|||
|
|
"scope_id": "...",
|
|||
|
|
"initiative_id": "...",
|
|||
|
|
"action_id": "...",
|
|||
|
|
"blocker_id": "...",
|
|||
|
|
"milestone_id": "...",
|
|||
|
|
"reason_code": "...",
|
|||
|
|
"data_source": "actions | blockers | initiatives | milestones | backlog_items"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**NextActionCandidateDTO:**
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"kind": "assign_action | resolve_blocker | create_action | convert_backlog | review_milestone",
|
|||
|
|
"title": "...",
|
|||
|
|
"summary": "...",
|
|||
|
|
"initiative_id": "...",
|
|||
|
|
"action_id": "...",
|
|||
|
|
"backlog_item_id": "...",
|
|||
|
|
"reason_code": "...",
|
|||
|
|
"recommended_action": "..."
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Regeln
|
|||
|
|
|
|||
|
|
| # | Regel | Datenquelle | Severity |
|
|||
|
|
|---|-------|-------------|----------|
|
|||
|
|
| 1 | Blockierte Maßnahmen | `actions.status = blocked` | critical |
|
|||
|
|
| 1b | Offene Blocker | `blockers.status IN (open, in_progress)` | warning |
|
|||
|
|
| 2 | High-Priority offen | `priority = high`, open/in_progress; **personal** wenn Actor zugewiesen | warning |
|
|||
|
|
| 3 | Maßnahmen ohne Assignment | keine `action_assignments` | warning |
|
|||
|
|
| 4 | Vorhaben ohne offene Maßnahme | active/paused, keine open/in_progress/blocked Action | info |
|
|||
|
|
| 5 | Lange unveränderte Vorhaben | `updated_at` > 14 Tage, status active | info |
|
|||
|
|
| 6 | Meilenstein at_risk | ab AP0.8d: `milestones.status = at_risk` | warning |
|
|||
|
|
| 7–9 | Due Dates, Reviews, Recurring | AP0.9+ — stub/leer | — |
|
|||
|
|
|
|||
|
|
**NextAction-Kandidaten (regelbasiert, limitiert):**
|
|||
|
|
|
|||
|
|
- unassigned Action → `assign_action`
|
|||
|
|
- blocked Action / open Blocker → `resolve_blocker`
|
|||
|
|
- Initiative ohne offene Maßnahme → `create_action`
|
|||
|
|
- accepted BacklogItem ohne Action → `convert_backlog`
|
|||
|
|
|
|||
|
|
Sortierung Attention: critical → warning → info. Keine Client-Priorisierung.
|
|||
|
|
|
|||
|
|
## API
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
GET /api/workspace/attention
|
|||
|
|
GET /api/workspace/next-actions?limit=10
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Capability: **`kairo.attention.read`**
|
|||
|
|
|
|||
|
|
## Frontend
|
|||
|
|
|
|||
|
|
- **`AttentionWidget`** (Registry-Key `kairo.attention`, order 8, unter Überblick)
|
|||
|
|
- Links zu Vorhaben/Maßnahmen/Blockern
|
|||
|
|
- Loading / Error / Empty States
|
|||
|
|
|
|||
|
|
## Tests
|
|||
|
|
|
|||
|
|
- Regeln 1, 1b, 2–5; Regel 6 nach 8d
|
|||
|
|
- NextAction: convert_backlog, create_action
|
|||
|
|
- Cross-Tenant isolation
|
|||
|
|
- Router delegiert an Data Layer
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# Teil B — AP0.8b: Blocker
|
|||
|
|
|
|||
|
|
## Migration `007_operating_model_extension_i.sql`
|
|||
|
|
|
|||
|
|
```sql
|
|||
|
|
blockers (
|
|||
|
|
id UUID PK,
|
|||
|
|
tenant_id UUID NOT NULL REFERENCES tenants(id),
|
|||
|
|
initiative_id UUID NOT NULL REFERENCES initiatives(id),
|
|||
|
|
action_id UUID NULL REFERENCES actions(id),
|
|||
|
|
title VARCHAR(255) NOT NULL,
|
|||
|
|
description TEXT DEFAULT '',
|
|||
|
|
status VARCHAR(32) NOT NULL, -- open, in_progress, resolved, accepted_risk, dismissed
|
|||
|
|
reported_by_actor_id UUID NULL REFERENCES actors(id),
|
|||
|
|
created_at, updated_at
|
|||
|
|
)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Index: `(tenant_id, initiative_id)`, `(tenant_id, status)`
|
|||
|
|
|
|||
|
|
## Service + API
|
|||
|
|
|
|||
|
|
`backend/services/blockers.py` — CRUD, Audit: `blocker.created/updated/status_changed/deleted`
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
GET/POST /api/initiatives/{id}/blockers
|
|||
|
|
GET/PATCH/DELETE /api/blockers/{id}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Capabilities: **`kairo.blocker.read`**, **`kairo.blocker.manage`**
|
|||
|
|
|
|||
|
|
## Frontend
|
|||
|
|
|
|||
|
|
Vorhaben-Detail: Sektion **Blocker**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# Teil C — AP0.8c: BacklogItem
|
|||
|
|
|
|||
|
|
## Migration (gleiche `007`)
|
|||
|
|
|
|||
|
|
```sql
|
|||
|
|
backlog_items (
|
|||
|
|
id UUID PK,
|
|||
|
|
tenant_id UUID NOT NULL,
|
|||
|
|
initiative_id UUID NOT NULL REFERENCES initiatives(id),
|
|||
|
|
title VARCHAR(255) NOT NULL,
|
|||
|
|
description TEXT DEFAULT '',
|
|||
|
|
status VARCHAR(32) NOT NULL, -- new, triaged, accepted, rejected, converted
|
|||
|
|
priority VARCHAR(16) DEFAULT 'normal',
|
|||
|
|
converted_action_id UUID NULL REFERENCES actions(id),
|
|||
|
|
created_at, updated_at
|
|||
|
|
)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Service + API
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
GET/POST /api/initiatives/{id}/backlog
|
|||
|
|
GET/PATCH/DELETE /api/backlog/{id}
|
|||
|
|
POST /api/backlog/{id}/convert-to-action
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Capabilities: **`kairo.backlog.read`**, **`kairo.backlog.manage`**
|
|||
|
|
|
|||
|
|
Convert: erzeugt Action, setzt `converted_action_id`, status=converted, Audit.
|
|||
|
|
|
|||
|
|
## Frontend
|
|||
|
|
|
|||
|
|
Vorhaben-Detail: Sektion **Backlog** + Button „In Maßnahme umwandeln“
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# Teil D — AP0.8d: Milestone minimal
|
|||
|
|
|
|||
|
|
## Migration (gleiche `007`)
|
|||
|
|
|
|||
|
|
```sql
|
|||
|
|
milestones (
|
|||
|
|
id UUID PK,
|
|||
|
|
tenant_id UUID NOT NULL,
|
|||
|
|
initiative_id UUID NOT NULL REFERENCES initiatives(id),
|
|||
|
|
title VARCHAR(255) NOT NULL,
|
|||
|
|
goal_description TEXT DEFAULT '',
|
|||
|
|
status VARCHAR(32) NOT NULL, -- planned, active, at_risk, reached, moved, discarded
|
|||
|
|
target_date DATE NULL,
|
|||
|
|
created_at, updated_at
|
|||
|
|
)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Hinweis Zielarchitektur:** Langfristig `RoadmapItem(item_type=milestone)`. Diese Tabelle ist bewusste MVP-Brücke (AD-TA-08).
|
|||
|
|
|
|||
|
|
## Service + API
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
GET/POST /api/initiatives/{id}/milestones
|
|||
|
|
GET/PATCH/DELETE /api/milestones/{id}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Capabilities: **`kairo.milestone.read`**, **`kairo.milestone.manage`**
|
|||
|
|
|
|||
|
|
Attention-Regel 6 nach Implementierung aktivieren.
|
|||
|
|
|
|||
|
|
## Frontend
|
|||
|
|
|
|||
|
|
Vorhaben-Detail: Sektion **Meilensteine** (kompakt, kein Gantt)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# Capabilities AP0.8
|
|||
|
|
|
|||
|
|
| Capability | Modul | Grants |
|
|||
|
|
|------------|-------|--------|
|
|||
|
|
| `kairo.attention.read` | attention | Member+ (wie workspace.read) |
|
|||
|
|
| `kairo.blocker.read` | blocker | Member+ |
|
|||
|
|
| `kairo.blocker.manage` | blocker | Member+ |
|
|||
|
|
| `kairo.backlog.read` | backlog | Member+ |
|
|||
|
|
| `kairo.backlog.manage` | backlog | Member+ |
|
|||
|
|
| `kairo.milestone.read` | milestone | Member+ |
|
|||
|
|
| `kairo.milestone.manage` | milestone | Member+ |
|
|||
|
|
|
|||
|
|
Registrierung: `backend/rights_registrations/operating_model_ops.py`
|
|||
|
|
Gesamt nach AP0.8: **25 Capabilities** (18 + 7)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# Architekturregeln (verbindlich)
|
|||
|
|
|
|||
|
|
1. **Tenant-first** — `tenant_id` aus TenantContext
|
|||
|
|
2. **Actor-first** — `reported_by_actor_id` optional; Assignments unverändert
|
|||
|
|
3. **Data Layer read / Services write** — Attention nur Data Layer
|
|||
|
|
4. **Router dünn** — keine Aggregations-SQL in Routern
|
|||
|
|
5. **Signals erklärbar** — reason_code, scope_type, data_source in DTOs
|
|||
|
|
6. **Cross-Tenant → 404**
|
|||
|
|
7. **Migration `007`** — kein ad-hoc DDL
|
|||
|
|
8. **Kein Prompt/KI/MCP/Workflow/SteeringContext/Method Registry**
|
|||
|
|
9. **Product Reset** — drei Ebenen RoadmapItem/BacklogItem/Action respektieren
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# Nicht-Scope AP0.8
|
|||
|
|
|
|||
|
|
- Project / Program / SteeringContext / Method Registry / Hook Runtime
|
|||
|
|
- Evidence, Decision, Review, RecurringElement (→ AP0.9)
|
|||
|
|
- Action-Status `ready`, `review_required`
|
|||
|
|
- Due Dates auf Actions / Überfälligkeits-Engine
|
|||
|
|
- KI, MCP, Workflow Engine
|
|||
|
|
- Roadmap/RoadmapLane/RoadmapItem-Modell (→ Phase C)
|
|||
|
|
- Workspace-weite Backlog-Navigation
|
|||
|
|
- AP0.10 Validation Testvorhaben
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# Tests (Mindestumfang)
|
|||
|
|
|
|||
|
|
## Backend — `backend/tests/test_ap08_operating_model.py`
|
|||
|
|
|
|||
|
|
| Bereich | Tests |
|
|||
|
|
|---------|-------|
|
|||
|
|
| Attention | Regeln 1, 1b, 2–6, Sortierung, Cross-Tenant |
|
|||
|
|
| NextAction | assign, convert_backlog, create_action, limit |
|
|||
|
|
| Blocker | CRUD, Tenant-Isolation, optional action_id |
|
|||
|
|
| Backlog | CRUD, convert-to-action |
|
|||
|
|
| Milestone | CRUD, at_risk in Attention |
|
|||
|
|
| Capabilities | Member grants, Gate 403, 25 sync |
|
|||
|
|
| Migration | `007` in test_migrations |
|
|||
|
|
|
|||
|
|
## Frontend
|
|||
|
|
|
|||
|
|
- Vitest: Registry enthält `kairo.attention`
|
|||
|
|
- Build grün
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# Abnahmekriterien AP0.8
|
|||
|
|
|
|||
|
|
1. Migration `007`; Schema `007`
|
|||
|
|
2. Attention/NextAction regelbasiert (Regeln 1–6)
|
|||
|
|
3. Blocker, Backlog, Milestone CRUD tenant-sicher
|
|||
|
|
4. `data_layer/attention.py`; Router delegieren
|
|||
|
|
5. AttentionWidget im Workspace
|
|||
|
|
6. Vorhaben-Detail: Blocker, Backlog, Meilensteine
|
|||
|
|
7. Convert Backlog → Action
|
|||
|
|
8. Cross-Tenant-Tests grün
|
|||
|
|
9. 25 Capabilities registriert
|
|||
|
|
10. AP0.6b UX erhalten
|
|||
|
|
11. Kein Prompt/KI/MCP/Steering-Scope
|
|||
|
|
12. Abschlussbericht + README
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# Abschlussbericht (nach Umsetzung)
|
|||
|
|
|
|||
|
|
Siehe Vorlage in v0.1 — Abschnitte 1–15.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# Freigegebene Punkte (ehemals offen)
|
|||
|
|
|
|||
|
|
| # | Entscheidung |
|
|||
|
|
|---|--------------|
|
|||
|
|
| 1 | Ein AP0.8, 4 interne Slices |
|
|||
|
|
| 2 | Eigene Capability `kairo.attention.read` |
|
|||
|
|
| 3 | Blocker/Action-Status optional synchron |
|
|||
|
|
| 4 | Convert Backlog→Action Pflicht |
|
|||
|
|
| 5 | Member manage wie Actions |
|
|||
|
|
| 6 | Initiative draft → AP0.8.1 |
|
|||
|
|
| 7 | Backlog nur Initiative-Detail |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
*Freigegeben — Umsetzung gemäß Slice-Reihenfolge 8a→8d.*
|