# 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.*