Schema 007, regelbasierte Attention/NextAction im Data Layer, CRUD fuer Blocker/Backlog/Meilensteine, Workspace-Widget und Initiative-Detail-Sektionen. 25 Capabilities. Tests fuer Remote-Pytest auf Pi angepasst (conftest Session-Guard). Co-authored-by: Cursor <cursoragent@cursor.com>
13 KiB
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:
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:
docs/product/Kairo_Product_Definition_and_MVP_Reset_v0.1.mddocs/product/Kairo_Canonical_Operating_Model_v0.1.md— §5 Objektmodell, §7 Attention Logic, §8 Data Layerdocs/product/Kairo_Corrected_MVP_Roadmap_v0.1.md— AP0.8docs/architecture/Kairo_System_Target_State_v0.1.md— §13 Roadmap/Backlog/Action, §17 Signalsdocs/architecture/Kairo_Target_Architecture_Method_Driven_Adaptive_Steering_Core_v0.1.md— Phasen A/B, AD-TA-08docs/architecture/Kairo_Tenant_Invariants_v0.1.mddocs/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
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
get_attention_items(ctx) -> list[AttentionItemDTO]
get_next_action_candidates(ctx, *, limit=10) -> list[NextActionCandidateDTO]
AttentionItemDTO (mit Erklärbarkeit):
{
"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:
{
"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
GET /api/workspace/attention
GET /api/workspace/next-actions?limit=10
Capability: kairo.attention.read
Frontend
AttentionWidget(Registry-Keykairo.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
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
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)
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
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)
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
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)
- Tenant-first —
tenant_idaus TenantContext - Actor-first —
reported_by_actor_idoptional; Assignments unverändert - Data Layer read / Services write — Attention nur Data Layer
- Router dünn — keine Aggregations-SQL in Routern
- Signals erklärbar — reason_code, scope_type, data_source in DTOs
- Cross-Tenant → 404
- Migration
007— kein ad-hoc DDL - Kein Prompt/KI/MCP/Workflow/SteeringContext/Method Registry
- 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
- Migration
007; Schema007 - Attention/NextAction regelbasiert (Regeln 1–6)
- Blocker, Backlog, Milestone CRUD tenant-sicher
data_layer/attention.py; Router delegieren- AttentionWidget im Workspace
- Vorhaben-Detail: Blocker, Backlog, Meilensteine
- Convert Backlog → Action
- Cross-Tenant-Tests grün
- 25 Capabilities registriert
- AP0.6b UX erhalten
- Kein Prompt/KI/MCP/Steering-Scope
- 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.