From 2b0d5dd3d90b7faf479877f700441dbb25fa2c4a Mon Sep 17 00:00:00 2001
From: Lars
Date: Sun, 12 Jul 2026 16:02:09 +0200
Subject: [PATCH] AP2.2a: Archetyp-Starter-Kits und MVP Execution Plan v0.2.
Referenz-Vorhaben A1/A2/B2b/B2a per UI anlegbar mit gefuehrter Starter-Struktur; Dogfooding-Seed deprecated. Plan-Korrektur: Execution Plan v0.2 statt Seed-Spiegel als Prioritaet.
Co-authored-by: Cursor
---
backend/routers/entity_archetypes.py | 20 +-
backend/routers/initiatives.py | 2 +
.../seed_004_dogfooding_kairo_jinkendo.py | 3 +-
backend/services/archetype_starter_kit.py | 370 ++++++++++++++++++
backend/services/initiatives.py | 12 +
backend/tests/test_ap22a_starter_kit.py | 112 ++++++
backend/version.py | 2 +-
.../Kairo_Corrected_MVP_Roadmap_v0.2.md | 28 +-
.../Kairo_Dogfooding_Mirror_Steering_v0.1.md | 41 +-
.../Kairo_Implementation_Truth_Table_v0.1.md | 42 +-
docs/product/Kairo_MVP_Execution_Plan_v0.2.md | 162 ++++++++
...Kairo_Status_Review_and_Next_Steps_v0.1.md | 74 ++--
...Kairo_Status_Review_and_Next_Steps_v0.2.md | 53 +++
...chetype_Guided_Creation_Assignment_v0.1.md | 152 +++++++
frontend/package.json | 2 +-
frontend/src/api/entityArchetypes.js | 7 +
frontend/src/components/InitiativeForm.jsx | 41 +-
.../src/components/SteeringSnapshotPanel.jsx | 14 +
18 files changed, 1050 insertions(+), 87 deletions(-)
create mode 100644 backend/services/archetype_starter_kit.py
create mode 100644 backend/tests/test_ap22a_starter_kit.py
create mode 100644 docs/product/Kairo_MVP_Execution_Plan_v0.2.md
create mode 100644 docs/product/Kairo_Status_Review_and_Next_Steps_v0.2.md
create mode 100644 docs/sprints/Sprint1_AP2_2a_Archetype_Guided_Creation_Assignment_v0.1.md
diff --git a/backend/routers/entity_archetypes.py b/backend/routers/entity_archetypes.py
index 2765604..1b714d5 100644
--- a/backend/routers/entity_archetypes.py
+++ b/backend/routers/entity_archetypes.py
@@ -5,7 +5,8 @@ from __future__ import annotations
from typing import Optional
from capabilities import require_capability
-from entity_archetypes import list_archetypes
+from entity_archetypes import list_archetypes, validate_archetype_key
+from services.archetype_starter_kit import get_starter_preview
from entity_fields.service import list_field_definitions
from fastapi import APIRouter, Depends, HTTPException, Query
from tenant_context import TenantContext
@@ -33,3 +34,20 @@ def get_archetype_field_definitions(
if not any(item["key"] == archetype_key for item in archetypes):
raise HTTPException(status_code=404, detail="Archetyp nicht gefunden")
return list_field_definitions(archetype_key=archetype_key)
+
+
+@router.get("/{archetype_key}/starter-preview")
+def get_archetype_starter_preview(
+ archetype_key: str,
+ method_profile_key: Optional[str] = Query(default=None),
+ ctx: TenantContext = Depends(require_capability("kairo.initiative.read")),
+):
+ _ = ctx
+ try:
+ validate_archetype_key(entity_type="initiative", archetype_key=archetype_key)
+ except ValueError as exc:
+ raise HTTPException(status_code=404, detail=str(exc)) from exc
+ return get_starter_preview(
+ archetype_key=archetype_key,
+ method_profile_key=method_profile_key,
+ )
diff --git a/backend/routers/initiatives.py b/backend/routers/initiatives.py
index 45aa0d9..86386da 100644
--- a/backend/routers/initiatives.py
+++ b/backend/routers/initiatives.py
@@ -39,6 +39,7 @@ class InitiativeCreateRequest(BaseModel):
priority: Literal["low", "normal", "high"] = "normal"
owner_actor_id: Optional[str] = None
method_profile_key: Optional[str] = Field(default=None, min_length=1)
+ apply_starter_kit: bool = True
class InitiativeUpdateRequest(BaseModel):
@@ -165,6 +166,7 @@ def create_initiative(
owner_actor_id=owner_actor_id,
user_id=ctx.user_id,
method_profile_key=body.method_profile_key,
+ apply_starter_kit=body.apply_starter_kit,
)
except ValueError as exc:
raise HTTPException(status_code=400, detail=str(exc)) from exc
diff --git a/backend/seeds/seed_004_dogfooding_kairo_jinkendo.py b/backend/seeds/seed_004_dogfooding_kairo_jinkendo.py
index 24321a5..81ea8bd 100644
--- a/backend/seeds/seed_004_dogfooding_kairo_jinkendo.py
+++ b/backend/seeds/seed_004_dogfooding_kairo_jinkendo.py
@@ -1,6 +1,7 @@
"""Dogfooding R1 — Referenz-Vorhaben „Jinkendo Kairo“ (idempotent, Nicht-Prod).
-Spiegelt Plan aus docs/product/ gemäß Kairo_Dogfooding_Mirror_Steering_v0.1.md.
+DEPRECATED (2026-07-12): Nur Dev-Visualisierung. Produkt-Anlage über AP2.2a Starter-Kits.
+Siehe Kairo_MVP_Execution_Plan_v0.2.md — nicht weiter ausbauen.
"""
from __future__ import annotations
diff --git a/backend/services/archetype_starter_kit.py b/backend/services/archetype_starter_kit.py
new file mode 100644
index 0000000..316caec
--- /dev/null
+++ b/backend/services/archetype_starter_kit.py
@@ -0,0 +1,370 @@
+"""Archetyp Starter-Kits — AP2.2a (guided creation without Structure Builder)."""
+
+from __future__ import annotations
+
+from typing import Any, Optional
+
+from entity_archetypes import resolve_default_method_key
+
+# Stufe-A Archetypen mit automatischem Starter-Kit bei Anlage
+STARTER_KIT_ARCHETYPES = frozenset(
+ {
+ "initiative.maturity_journey",
+ "initiative.linear_project",
+ "initiative.product",
+ "initiative.program",
+ }
+)
+
+_GUIDANCE: dict[str, str] = {
+ "initiative.maturity_journey": (
+ "Aktuelle Stufe und heutige Übung steuern deinen nächsten Schritt."
+ ),
+ "initiative.linear_project": (
+ "Nächster Schritt am kritischen Pfad — Abhängigkeiten im Plan-Graph."
+ ),
+ "initiative.product": (
+ "Eingang triagieren, dann committete Actions — optional Sprint-Zeitbox (B3)."
+ ),
+ "initiative.program": (
+ "Programm mit Abschluss — Gate-Horizont in Kontrolle."
+ ),
+}
+
+_PROFILE_HINTS: dict[str, list[str]] = {
+ "initiative.maturity_journey": ["maturity.karate_kumite"],
+ "initiative.linear_project": [],
+ "initiative.product": ["product.kairo_dev"],
+ "initiative.program": [],
+}
+
+
+def _find_by_title(items: list[dict[str, Any]], title: str) -> Optional[dict[str, Any]]:
+ for item in items:
+ if item.get("title") == title:
+ return item
+ return None
+
+
+def supports_starter_kit(archetype_key: str) -> bool:
+ return archetype_key in STARTER_KIT_ARCHETYPES
+
+
+def get_starter_preview(
+ *,
+ archetype_key: str,
+ method_profile_key: Optional[str] = None,
+) -> dict[str, Any]:
+ method_key = resolve_default_method_key(archetype_key)
+ items: list[dict[str, Any]] = []
+
+ if archetype_key == "initiative.maturity_journey":
+ items = [
+ {"kind": "maturity_stage", "title": "Stufe 1 — Basis", "status": "active"},
+ {"kind": "maturity_stage", "title": "Stufe 2 — Aufbau", "status": "planned"},
+ {"kind": "maturity_stage", "title": "Stufe 3 — Ziel", "status": "planned"},
+ {"kind": "project", "title": "Training"},
+ {"kind": "recurring", "title": "Tägliche Übung"},
+ ]
+ elif archetype_key == "initiative.linear_project":
+ items = [
+ {"kind": "milestone", "title": "G1 — Planung", "status": "active"},
+ {"kind": "milestone", "title": "G2 — Vorbereitung", "status": "planned"},
+ {"kind": "milestone", "title": "G3 — Umsetzung", "status": "planned"},
+ {"kind": "milestone", "title": "G4 — Abschluss", "status": "planned"},
+ {"kind": "project", "title": "Hauptpfad"},
+ {"kind": "project", "title": "Begleitung"},
+ ]
+ elif archetype_key == "initiative.product":
+ items = [
+ {"kind": "milestone", "title": "Orientierung", "status": "active"},
+ {"kind": "milestone", "title": "Nächster Release-Horizont", "status": "planned"},
+ {"kind": "project", "title": "Entwicklung"},
+ {"kind": "project", "title": "Betrieb"},
+ {"kind": "backlog_item", "title": "Idee / Issue"},
+ {"kind": "hint", "title": "Optional: Sprint-Zeitbox unter Plan anlegen (B3)"},
+ ]
+ elif archetype_key == "initiative.program":
+ items = [
+ {"kind": "milestone", "title": "Phase 1 — Start", "status": "active"},
+ {"kind": "milestone", "title": "Phase 2 — Lieferung", "status": "planned"},
+ {"kind": "milestone", "title": "Abschluss", "status": "planned"},
+ ]
+
+ return {
+ "archetype_key": archetype_key,
+ "method_key": method_key,
+ "method_profile_key": method_profile_key,
+ "supported": supports_starter_kit(archetype_key),
+ "guidance": _GUIDANCE.get(archetype_key, ""),
+ "method_profile_hints": _PROFILE_HINTS.get(archetype_key, []),
+ "items": items,
+ }
+
+
+def apply_starter_kit(
+ *,
+ tenant_id: str,
+ initiative_id: str,
+ archetype_key: str,
+ owner_actor_id: Optional[str] = None,
+ user_id: Optional[str] = None,
+) -> dict[str, Any]:
+ """Apply idempotent starter structure for supported Stufe-A archetypes."""
+ if not supports_starter_kit(archetype_key):
+ return {"applied": False, "reason": "unsupported_archetype"}
+
+ from services.roadmap import list_roadmap_items_for_initiative
+
+ existing = list_roadmap_items_for_initiative(
+ tenant_id=tenant_id, initiative_id=initiative_id
+ )
+ if existing:
+ return {"applied": False, "reason": "structure_exists"}
+
+ created: dict[str, list[str]] = {
+ "roadmap_items": [],
+ "projects": [],
+ "recurring": [],
+ "backlog_items": [],
+ }
+
+ if archetype_key == "initiative.maturity_journey":
+ created = _apply_a1(
+ tenant_id=tenant_id,
+ initiative_id=initiative_id,
+ user_id=user_id,
+ )
+ elif archetype_key == "initiative.linear_project":
+ created = _apply_a2(
+ tenant_id=tenant_id,
+ initiative_id=initiative_id,
+ user_id=user_id,
+ )
+ elif archetype_key == "initiative.product":
+ created = _apply_b2b(
+ tenant_id=tenant_id,
+ initiative_id=initiative_id,
+ user_id=user_id,
+ )
+ elif archetype_key == "initiative.program":
+ created = _apply_b2a(
+ tenant_id=tenant_id,
+ initiative_id=initiative_id,
+ user_id=user_id,
+ )
+
+ from services.audit import log_audit
+
+ log_audit(
+ "initiative.starter_kit_applied",
+ user_id=user_id,
+ tenant_id=tenant_id,
+ details={
+ "initiative_id": initiative_id,
+ "archetype_key": archetype_key,
+ "created": created,
+ },
+ )
+
+ return {
+ "applied": True,
+ "archetype_key": archetype_key,
+ "guidance": _GUIDANCE.get(archetype_key, ""),
+ "created": created,
+ }
+
+
+def _apply_a1(
+ *,
+ tenant_id: str,
+ initiative_id: str,
+ user_id: Optional[str],
+) -> dict[str, list[str]]:
+ from services.projects import create_project, list_projects_for_initiative
+ from services.recurring import create_recurring_element, list_recurring_for_initiative
+ from services.roadmap import create_roadmap_item
+
+ roadmap_ids: list[str] = []
+ stage_defs = [
+ ("Stufe 1 — Basis", "active"),
+ ("Stufe 2 — Aufbau", "planned"),
+ ("Stufe 3 — Ziel", "planned"),
+ ]
+ for index, (title, status) in enumerate(stage_defs):
+ item = create_roadmap_item(
+ tenant_id=tenant_id,
+ initiative_id=initiative_id,
+ title=title,
+ item_type="maturity_stage",
+ status=status, # type: ignore[arg-type]
+ sort_order=index * 10,
+ user_id=user_id,
+ )
+ roadmap_ids.append(item["id"])
+
+ projects = list_projects_for_initiative(tenant_id=tenant_id, initiative_id=initiative_id)
+ if not _find_by_title(projects, "Training"):
+ create_project(
+ tenant_id=tenant_id,
+ initiative_id=initiative_id,
+ title="Training",
+ description="Übungs- und Trainingsstruktur",
+ sort_order=0,
+ user_id=user_id,
+ )
+
+ recurring = list_recurring_for_initiative(tenant_id=tenant_id, initiative_id=initiative_id)
+ if not _find_by_title(recurring, "Tägliche Übung"):
+ create_recurring_element(
+ tenant_id=tenant_id,
+ initiative_id=initiative_id,
+ title="Tägliche Übung",
+ description="Regelmäßige Übung für die aktuelle Reifegrad-Stufe",
+ interval_days=1,
+ user_id=user_id,
+ )
+
+ return {"roadmap_items": roadmap_ids, "projects": ["Training"], "recurring": ["Tägliche Übung"]}
+
+
+def _apply_a2(
+ *,
+ tenant_id: str,
+ initiative_id: str,
+ user_id: Optional[str],
+) -> dict[str, list[str]]:
+ from services.projects import create_project, list_projects_for_initiative
+ from services.roadmap import add_dependency, create_roadmap_item
+
+ gate_titles = [
+ ("G1 — Planung", "active"),
+ ("G2 — Vorbereitung", "planned"),
+ ("G3 — Umsetzung", "planned"),
+ ("G4 — Abschluss", "planned"),
+ ]
+ gate_ids: list[str] = []
+ for index, (title, status) in enumerate(gate_titles):
+ item = create_roadmap_item(
+ tenant_id=tenant_id,
+ initiative_id=initiative_id,
+ title=title,
+ item_type="milestone",
+ status=status, # type: ignore[arg-type]
+ sort_order=index * 10,
+ user_id=user_id,
+ )
+ gate_ids.append(item["id"])
+
+ for index in range(1, len(gate_ids)):
+ try:
+ add_dependency(
+ tenant_id=tenant_id,
+ from_item_id=gate_ids[index],
+ to_item_id=gate_ids[index - 1],
+ dependency_type="requires",
+ )
+ except ValueError as exc:
+ if "existiert bereits" not in str(exc):
+ raise
+
+ projects = list_projects_for_initiative(tenant_id=tenant_id, initiative_id=initiative_id)
+ for index, title in enumerate(["Hauptpfad", "Begleitung"]):
+ if not _find_by_title(projects, title):
+ create_project(
+ tenant_id=tenant_id,
+ initiative_id=initiative_id,
+ title=title,
+ description=f"Ist-Struktur — {title}",
+ sort_order=index,
+ user_id=user_id,
+ )
+
+ return {
+ "roadmap_items": gate_ids,
+ "projects": ["Hauptpfad", "Begleitung"],
+ }
+
+
+def _apply_b2b(
+ *,
+ tenant_id: str,
+ initiative_id: str,
+ user_id: Optional[str],
+) -> dict[str, list[str]]:
+ from services.backlog import create_backlog_item, list_backlog_for_initiative
+ from services.projects import create_project, list_projects_for_initiative
+ from services.roadmap import create_roadmap_item
+
+ roadmap_ids: list[str] = []
+ for index, (title, status) in enumerate(
+ [("Orientierung", "active"), ("Nächster Release-Horizont", "planned")]
+ ):
+ item = create_roadmap_item(
+ tenant_id=tenant_id,
+ initiative_id=initiative_id,
+ title=title,
+ item_type="milestone",
+ status=status, # type: ignore[arg-type]
+ sort_order=index * 10,
+ user_id=user_id,
+ )
+ roadmap_ids.append(item["id"])
+
+ projects = list_projects_for_initiative(tenant_id=tenant_id, initiative_id=initiative_id)
+ for index, title in enumerate(["Entwicklung", "Betrieb"]):
+ if not _find_by_title(projects, title):
+ create_project(
+ tenant_id=tenant_id,
+ initiative_id=initiative_id,
+ title=title,
+ description=f"Ist-Struktur — {title}",
+ sort_order=index,
+ user_id=user_id,
+ )
+
+ backlog = list_backlog_for_initiative(tenant_id=tenant_id, initiative_id=initiative_id)
+ if not _find_by_title(backlog, "Idee / Issue"):
+ create_backlog_item(
+ tenant_id=tenant_id,
+ initiative_id=initiative_id,
+ title="Idee / Issue",
+ description="Product Backlog — noch nicht committet",
+ user_id=user_id,
+ )
+
+ return {
+ "roadmap_items": roadmap_ids,
+ "projects": ["Entwicklung", "Betrieb"],
+ "backlog_items": ["Idee / Issue"],
+ }
+
+
+def _apply_b2a(
+ *,
+ tenant_id: str,
+ initiative_id: str,
+ user_id: Optional[str],
+) -> dict[str, list[str]]:
+ from services.roadmap import create_roadmap_item
+
+ roadmap_ids: list[str] = []
+ for index, (title, status) in enumerate(
+ [
+ ("Phase 1 — Start", "active"),
+ ("Phase 2 — Lieferung", "planned"),
+ ("Abschluss", "planned"),
+ ]
+ ):
+ item = create_roadmap_item(
+ tenant_id=tenant_id,
+ initiative_id=initiative_id,
+ title=title,
+ item_type="milestone",
+ status=status, # type: ignore[arg-type]
+ sort_order=index * 10,
+ user_id=user_id,
+ )
+ roadmap_ids.append(item["id"])
+
+ return {"roadmap_items": roadmap_ids}
diff --git a/backend/services/initiatives.py b/backend/services/initiatives.py
index be3aa0f..6aff237 100644
--- a/backend/services/initiatives.py
+++ b/backend/services/initiatives.py
@@ -74,6 +74,7 @@ def create_initiative(
priority: Priority = "normal",
user_id: Optional[str] = None,
method_profile_key: Optional[str] = None,
+ apply_starter_kit: bool = True,
) -> dict[str, Any]:
title = title.strip()
if not title:
@@ -138,6 +139,17 @@ def create_initiative(
archetype_key=archetype_key,
method_profile_key=method_profile_key,
)
+ if apply_starter_kit:
+ from services.archetype_starter_kit import apply_starter_kit
+
+ starter = apply_starter_kit(
+ tenant_id=tenant_id,
+ initiative_id=row["id"],
+ archetype_key=archetype_key,
+ owner_actor_id=owner_actor_id,
+ user_id=user_id,
+ )
+ row["starter_kit"] = starter
return row
diff --git a/backend/tests/test_ap22a_starter_kit.py b/backend/tests/test_ap22a_starter_kit.py
new file mode 100644
index 0000000..8720eef
--- /dev/null
+++ b/backend/tests/test_ap22a_starter_kit.py
@@ -0,0 +1,112 @@
+"""AP2.2a — Archetyp Starter-Kits."""
+
+from __future__ import annotations
+
+from tests.factories import provision_user_in_tenant
+from tests.test_initiatives_actions import _auth, _login
+
+
+def test_starter_preview_a2(client):
+ user = provision_user_in_tenant(tenant_role="member")
+ token = _login(client, user)
+
+ resp = client.get(
+ "/api/entity-archetypes/initiative.linear_project/starter-preview",
+ headers=_auth(token),
+ )
+ assert resp.status_code == 200
+ body = resp.json()
+ assert body["supported"] is True
+ assert body["method_key"] == "sequential_dependency"
+ assert any(item["kind"] == "milestone" for item in body["items"])
+
+
+def test_create_initiative_a1_applies_starter_kit(client):
+ user = provision_user_in_tenant(tenant_role="admin")
+ token = _login(client, user)
+
+ created = client.post(
+ "/api/initiatives",
+ json={
+ "title": "Test Spagat",
+ "archetype_key": "initiative.maturity_journey",
+ "apply_starter_kit": True,
+ },
+ headers=_auth(token),
+ )
+ assert created.status_code == 201
+ initiative_id = created.json()["id"]
+ assert created.json()["starter_kit"]["applied"] is True
+
+ roadmap = client.get(
+ f"/api/initiatives/{initiative_id}/roadmap/items",
+ headers=_auth(token),
+ )
+ assert roadmap.status_code == 200
+ titles = {item["title"] for item in roadmap.json()}
+ assert "Stufe 1 — Basis" in titles
+
+ recurring = client.get(
+ f"/api/initiatives/{initiative_id}/recurring",
+ headers=_auth(token),
+ )
+ assert recurring.status_code == 200
+ assert any(r["title"] == "Tägliche Übung" for r in recurring.json())
+
+
+def test_create_initiative_b2b_starter_kit(client):
+ user = provision_user_in_tenant(tenant_role="admin")
+ token = _login(client, user)
+
+ created = client.post(
+ "/api/initiatives",
+ json={
+ "title": "Test Product",
+ "archetype_key": "initiative.product",
+ },
+ headers=_auth(token),
+ )
+ assert created.status_code == 201
+ initiative_id = created.json()["id"]
+
+ backlog = client.get(
+ f"/api/initiatives/{initiative_id}/backlog",
+ headers=_auth(token),
+ )
+ assert backlog.status_code == 200
+ assert any(b["title"] == "Idee / Issue" for b in backlog.json())
+
+ projects = client.get(
+ f"/api/initiatives/{initiative_id}/projects",
+ headers=_auth(token),
+ )
+ assert projects.status_code == 200
+ titles = {p["title"] for p in projects.json()}
+ assert "Entwicklung" in titles
+ assert "Betrieb" in titles
+
+
+def test_starter_kit_skipped_when_structure_exists(client):
+ user = provision_user_in_tenant(tenant_role="admin")
+ token = _login(client, user)
+
+ created = client.post(
+ "/api/initiatives",
+ json={
+ "title": "Kit Once",
+ "archetype_key": "initiative.linear_project",
+ },
+ headers=_auth(token),
+ )
+ initiative_id = created.json()["id"]
+ assert created.json()["starter_kit"]["applied"] is True
+
+ from services.archetype_starter_kit import apply_starter_kit
+
+ again = apply_starter_kit(
+ tenant_id=user["tenant_id"],
+ initiative_id=initiative_id,
+ archetype_key="initiative.linear_project",
+ )
+ assert again["applied"] is False
+ assert again["reason"] == "structure_exists"
diff --git a/backend/version.py b/backend/version.py
index 9cc4614..8698266 100644
--- a/backend/version.py
+++ b/backend/version.py
@@ -1,3 +1,3 @@
-APP_VERSION = "0.19.0-ap2.0f"
+APP_VERSION = "0.20.0-ap2.2a"
DB_SCHEMA_VERSION = "025"
APP_NAME = "jinkendo-kairo"
diff --git a/docs/product/Kairo_Corrected_MVP_Roadmap_v0.2.md b/docs/product/Kairo_Corrected_MVP_Roadmap_v0.2.md
index ca3823e..f00343f 100644
--- a/docs/product/Kairo_Corrected_MVP_Roadmap_v0.2.md
+++ b/docs/product/Kairo_Corrected_MVP_Roadmap_v0.2.md
@@ -7,8 +7,8 @@
**Vision:** `Kairo_Vision_and_Product_Direction_v0.2.md`
**MVP-Nordstern:** `Kairo_MVP_Definition_v0.3.md` (führend für Abnahfe)
**Ist-Stand:** `Kairo_Implementation_Truth_Table_v0.1.md`
-**Review & Nächste Schritte:** `Kairo_Status_Review_and_Next_Steps_v0.1.md`
-**Dogfooding:** `Kairo_Dogfooding_Mirror_Steering_v0.1.md`
+**Review & Nächste Schritte:** `Kairo_Status_Review_and_Next_Steps_v0.2.md`
+**Execution Plan:** `Kairo_MVP_Execution_Plan_v0.2.md` (führend ab 2026-07-12)
---
@@ -172,25 +172,21 @@ Phase N Integration Gitea/MCP nach AP1.7
## 4. Nächste Pakete (verbindliche Reihenfolge — PO 2026-07-06)
-### 4.0 Abnahme-Reihenfolge (Stand 2026-07-11 — Review)
+### 4.0 Nächste Schritte (Stand 2026-07-12 — Kurskorrektur)
-Siehe **`Kairo_Status_Review_and_Next_Steps_v0.1.md` §5** für vollständige Roadmap.
+**Führend:** `Kairo_MVP_Execution_Plan_v0.2.md` · `Kairo_Status_Review_and_Next_Steps_v0.2.md`
| Phase | Paket | Status | Begründung |
|-------|-------|--------|------------|
-| D0 | DOC-Sync (Truth Table, Gap, Review) | ✓ | eine Wahrheit |
-| D1 | Dogfooding R1 — Kairo-Jinkendo in Kairo | **◐ Seed R2** | B2b-Validation; Pi nach Deploy |
-| 1 | AP1.9c Cockpit-Signale | **◐ Code** | Portfolio-Kacheln via Attention |
-| 2 | AP1.16a–b Execution-Graph (Schema + Engine) | **◐ Code** | Remote-Verifikation nach Deploy |
-| 3 | AP2.0d Next-Action-Strategien | **◐ Code** | Remote-Verifikation nach Deploy |
-| 4 | AP1.16c–d Plan-Outline-Kanten + Planning Debt | **◐ Code** | Remote-Verifikation nach Deploy |
-| 5 | Dogfooding R2 — Ist + Gitea-Evidence | **→ nächstes** | Seed sync + manuelle Abnahfe |
-| 6 | AP1.7 Operational Actor API | **◐ Code** | `/api/operational/` + Service Tokens |
-| 7 | AP2.0f work_cycle (B3 minimal) | **◐ Code** | Sprint-Zeitbox; Remote-Verifikation nach Deploy |
-| 8 | AP1.7 Operational API | offen | MCP-Voraussetzung |
-| 9 | Gitea-Webhook + MCP | deferred | Schicht 4 |
+| — | Infrastruktur AP1.9c, AP1.16, AP2.0d, AP1.7, AP2.0f | ✓ Code | Steering-Motor |
+| **1** | **AP2.2a** Archetyp-Anlage + Starter-Kits | **→ Code** | Referenz-Vorhaben ohne Seed |
+| 2 | AP1.9d Methoden-Default-UI | offen | Anti-Todo-Wand |
+| 3 | AP2.2b–e End-to-End A1, A2, B2b, B3 | offen | MVP Stufe A produktiv |
+| 4 | AP1.7b Op-API Pflege-Parität | offen | Vibe-Coder |
+| 5 | AP2.1 Validation (A1+A2+B2b+D1) | offen | nach Phase 3 |
+| 6 | Gitea/MCP Schicht 4 | deferred | nach AP2.1 |
-**Erledigt (Review-Queue):** AP1.6b ✓
+**Deprecated:** Dogfooding-Seed als Implementierungs-Hebel (nur Dev-Visualisierung).
### AP1.5 — Hierarchie & Ist-Ebene ✓
diff --git a/docs/product/Kairo_Dogfooding_Mirror_Steering_v0.1.md b/docs/product/Kairo_Dogfooding_Mirror_Steering_v0.1.md
index 578e93d..f785703 100644
--- a/docs/product/Kairo_Dogfooding_Mirror_Steering_v0.1.md
+++ b/docs/product/Kairo_Dogfooding_Mirror_Steering_v0.1.md
@@ -1,8 +1,11 @@
# Jinkendo Kairo
## Dogfooding — Spiegel-Steuerung für Kairo-Jinkendo v0.1
-**Status:** Betriebskonzept (Phase 1 — manuell)
-**Stand:** 2026-07-11
+> **DEPRECATED als Implementierungs-Hebel (2026-07-12).** Nur optional Dev-Visualisierung (`seed_004`, Nicht-Prod).
+> **Produkt-Priorität:** `Kairo_MVP_Execution_Plan_v0.2.md` — Referenz-Vorhaben per UI/AP2.2a anlegen.
+
+**Status:** Betriebskonzept (historisch)
+**Stand:** 2026-07-11 (Seed deprecated 2026-07-12)
**Auslöser:** Kairo-Jinkendo als Referenz-Vorhaben B2b in Kairo führen; Plan bleibt in Git/Docs, Kairo spiegelt Ist + Fortschritt
**Bezug:** `Kairo_MVP_Definition_v0.3.md` §8 (B2b), `ADP_Archetype_and_Method_Catalog_v0.2.md` (`product.kairo_dev`), `Kairo_Status_Review_and_Next_Steps_v0.1.md`
@@ -75,16 +78,16 @@ Gates = **Zielzustände** entlang der **bereits erledigten und offenen Phasen**
Vorschlag **8 Gates** (sequenziell, `requires`-Kanten):
-| # | Gate-Titel | Status (2026-07-11) | Kriterien (Beispiele) |
+| # | Gate-Titel | Status (2026-07-12) | Kriterien (Beispiele) |
|---|------------|---------------------|------------------------|
| G1 | Foundation AP0 | **reached** | Tenant, Actor, Auth, OM-Tabellen |
| G2 | IA & Steering Skeleton | **reached** | AP1.2c, AP1.0, Snapshot |
| G3 | Gates & Checkliste Backend | **reached** | AP1.4/4b, Verify API |
| G4 | Ist-Hierarchie & Plan/Ist | **reached** | AP1.5/5c, AP1.6, AP1.14 |
-| G5 | PM Work Modes & Plan-Outline | **active** | AP1.9a/9c ✓, AP1.12 ◐, AP1.16 ◐ |
-| G6 | Archetyp-Steuerung MVP | **active** | AP2.0 ◐, AP2.0d ✓, Execution-Graph ✓ |
-| G7 | MVP-Abnahfe B2b | **planned** | Validation, Leitfrage, Cockpit-Signale |
-| G8 | Agent & Integration | **planned** | AP1.7, Gitea-Webhook optional |
+| G5 | PM Work Modes & Plan-Outline | **active** | AP1.9a/9c ✓, AP1.12 ◐, AP1.16 ✓ |
+| G6 | Archetyp-Steuerung MVP | **reached** | AP2.0 ✓, AP1.7 ✓, AP2.0d ✓, AP2.0f ✓ |
+| G7 | MVP-Abnahfe B2b | **active** | AP2.1 Validation, Leitfrage, Cockpit |
+| G8 | Agent & Integration | **planned** | Gitea-Webhook, MCP (AP1.7 ✓) |
**Verify-Regel:** Gate auf `reached` nur wenn Kriterien erfüllt (AP1.4b) — rückwirkend für G1–G4 mit Evidence „Completion Report / Commit-Spanne“.
@@ -104,17 +107,22 @@ Vorschlag **8 Gates** (sequenziell, `requires`-Kanten):
| AP1.8a Portfolio-Rang | G5 | Commit `a19c6ab` |
| AP1.15a–c Zielzustands-Designer | G4/G5 | Commits `0c2ca4a`…`d7aefed` |
| AP2.0 Archetyp-Slice | G6 | Commit `3bd9832` ff. |
+| AP1.9c Cockpit-Signale | G5 | Commit `b9bfa9e` |
+| AP1.16 Execution-Graph | G6 | Commits `1166a0c`…`b9bfa9e` |
+| AP2.0d Next-Action-Strategien | G6 | Commit `284b9d5` |
+| AP1.7 Operational Actor API | G6 | Commit `5dc372c` |
+| AP2.0f work_cycle / Sprint | G6 | Commit `d1bc725` |
+| Dogfooding R2 — Ist gespiegelt | G7 | Commit `a097a82` |
+| DOC-Sync (Status-Review) | G6 | erledigt |
### 4.2 Offen → Action `open` / `in_progress`
| Action-Titel | Gate | Priorität |
|--------------|------|-----------|
-| AP1.9c Cockpit-Signale | G5 | **done** (`b9bfa9e`) |
-| AP1.16 Execution-Graph | G6 | **done** (`1166a0c`…`b9bfa9e`) |
-| AP2.0d Next-Action-Strategien | G6 | **done** (`284b9d5`) |
-| Dogfooding R2 — Ist pflegen | G6 | **laufend** |
-| AP1.7 Operational API | G8 | nach Validation |
-| DOC-Sync (dieser Slice) | G6 | erledigt mit Commit |
+| AP2.1 B2b Validation (Leitfrage-Test) | G7 | **in_progress** — PO-Gate |
+| AP1.16c–d Plan-Outline AP-Kanten | G5 | open |
+
+**Zeitbox:** `Iteration — MVP B2b Slice` (active) — AP2.1 zugeordnet.
**Zuordnung:** `roadmap_item_id` = aktuelles Gate; `project_id` = Backend/Frontend/Docs.
@@ -222,9 +230,10 @@ Auf dem **Pi-Deploy** (nach Push auf `develop`):
**Manuell prüfen** in Kairo UI:
- [ ] Initiative „Jinkendo Kairo“ sichtbar (`initiative.product`, Profil `product.kairo_dev`)
-- [ ] 4 Projects, 8 Gates (G1–G4 `reached`, G5–G6 `active`)
-- [ ] Actions offen: Dogfooding R2, AP1.7, AP2.0f
-- [ ] Actions done: AP1.9c, AP1.16, AP2.0d (Evidence mit Gitea-Links)
+- [ ] 4 Projects, 8 Gates (G1–G6 `reached`, G7 `active`)
+- [ ] Aktive Zeitbox „Iteration — MVP B2b Slice“ in Kontrolle
+- [ ] Action in_progress: AP2.1 B2b Validation
+- [ ] Actions done: AP1.9c, AP1.16, AP2.0d, AP1.7, AP2.0f (Evidence mit Gitea-Links)
- [ ] Evidence mit Gitea-Commit-Links (z. B. `b85a6ec`, `a19c6ab`)
- [ ] Cockpit: Portfolio-Rang #1
- [ ] Kontrolle: Leitfrage-Test — „Was ist als Nächstes dran?“
diff --git a/docs/product/Kairo_Implementation_Truth_Table_v0.1.md b/docs/product/Kairo_Implementation_Truth_Table_v0.1.md
index 0d368a1..859eb76 100644
--- a/docs/product/Kairo_Implementation_Truth_Table_v0.1.md
+++ b/docs/product/Kairo_Implementation_Truth_Table_v0.1.md
@@ -65,8 +65,8 @@ Verhindert, dass Zielbild-Dokumente als Ist-Stand gelesen werden.
| Initiative Archetypes | ◐ | Migration 016, Registry AP2.0b |
| Method Profiles (Code-Seeds) | ◐ | `product.kairo_dev`, Kumite, Buch — AP2.0b |
| Execution Graph Engine | ◐ | AP1.16b; API `/execution/graph-state` |
-| Planning Debt (Attention) | ◐ | AP1.16d: Attention + Cockpit-Kacheln AP1.9c |
-| `work_cycle` / Sprint | ◐ | AP2.0f Code: RoadmapItem + actions.work_cycle_id; Remote-Verifikation |
+| Planning Debt (Attention) | ◐ | AP1.16d: Attention + Cockpit-Kacheln AP1.9c ✓ |
+| `work_cycle` / Sprint | ✓ | AP2.0f: RoadmapItem + actions.work_cycle_id; Kontrolle zeigt aktive Zeitbox |
---
@@ -76,7 +76,7 @@ Verhindert, dass Zielbild-Dokumente als Ist-Stand gelesen werden.
|---------|-------|-----------|
| steering_contexts (009) | ✓ | Lifecycle, method_key |
| backend/steering/ lifecycle | ✓ | |
-| Signal Engine | ◐ | Regeln begrenzt; Cockpit-Kacheln offen AP1.9c |
+| Signal Engine | ◐ | Regeln begrenzt; Cockpit-Kacheln AP1.9c ✓ |
| Method Registry | ◐ | AP2.0a: Stubs inkl. `continuous_product`, `program_delivery`, …; 2 Strategien aktiv |
| Archetyp-/Methoden-Katalog PO | ✓ | ADP v0.2 + MVP v0.3 |
| NextActionCandidate | ◐ | API + Widget; `reason_code` AP2.0c/d; Strategien nutzen `ready_actions` (AP2.0d) |
@@ -142,6 +142,18 @@ Verhindert, dass Zielbild-Dokumente als Ist-Stand gelesen werden.
---
+## Referenz-Archetypen End-to-End (MVP Stufe A)
+
+| Archetyp | Anlage+Kit | Struktur pflegen | Kontrolle | Op-API | Paket |
+|----------|------------|------------------|-----------|--------|-------|
+| A1 Reifegrad | ◐ AP2.2a | ◐ | ◐ | ◐ | AP2.2c + AP2.0e |
+| A2 Linear | ◐ AP2.2a | ◐ | ◐ | ◐ | AP2.2b |
+| B2b Product | ◐ AP2.2a | ◐ | ◐ | ◐ | AP2.2d |
+| B3 Sprint-Profil | ◐ | ◐ | ◐ | ◐ | AP2.2d |
+| B2a Programm | ◐ AP2.2a | ◐ | ◐ | ◐ | AP2.2e |
+
+---
+
## Archetyp / MVP v0.3
| Element | Stand | Anmerkung |
@@ -151,12 +163,13 @@ Verhindert, dass Zielbild-Dokumente als Ist-Stand gelesen werden.
| Default-Methode bei Anlage | ◐ | AP2.0b |
| Next-Action program_delivery | ◐ | Strategie registriert |
| Next-Action continuous_product | ◐ | Strategie registriert |
-| maturity / sequential / queue / recurring Strategien | ◐ | AP2.0d Code; Remote-Verifikation nach Deploy |
-| Referenz-Ausprägung product.kairo_dev | ◐ | Code-Seed; Dogfooding manuell |
-| MVP-Abnahfe Stufe A validiert | ✗ | AP0.10d / AP2.1 offen |
-| Operational Actor API | ◐ | AP1.7 Code: `/api/operational/` + Service Tokens; Remote-Verifikation |
-| Actor Service Token | ◐ | AP1.7c; Tenant-scoped, capability-gebunden |
-| MCP produktiv | ✗ | nach AP1.7 |
+| maturity / sequential / queue / recurring Strategien | ✓ | AP2.0d; pytest + Deploy |
+| Referenz-Ausprägungen (Kumite, Buch, Kairo) | ◐ | Code-Registry; Nutzer wählt bei Anlage |
+| Archetyp Starter-Kits | ◐ | AP2.2a |
+| MVP-Abnahfe Stufe A validiert | ✗ | AP2.1 nach AP2.2b–e |
+| Operational Actor API | ✓ | AP1.7: `/api/operational/` + Service Tokens |
+| Actor Service Token | ✓ | AP1.7c; Tenant-scoped, capability-gebunden |
+| MCP produktiv | ✗ | nach AP2.1 Go |
---
@@ -203,13 +216,10 @@ Details: `Kairo_Status_Review_and_Next_Steps_v0.1.md` §2.1
| AP | Erwartung |
|----|-----------|
-| AP1.16a–b | Action deps, Execution Engine ✗→◐ (Deploy) |
-| AP1.16c–d | Outline-Kanten, Planning Debt ✗→◐ |
-| AP1.9c | Cockpit-Signale ◐→✓ |
-| AP2.0d | Strategien ◐ Code |
-| Dogfooding R1 | Referenz-Vorhaben in Alltag ◐ | Seed R2 sync nach Deploy |
-| AP2.0f | work_cycle ◐ Code |
-| AP1.7 | Operational API ◐ Code |
+| AP2.2a | Starter-Kits ◐→✓ |
+| AP2.2b–e | Referenz-Archetypen End-to-End ◐→✓ |
+| AP2.1 | MVP-Abnahfe ✗→✓ |
+| AP1.7b | Op-API Parität |
---
diff --git a/docs/product/Kairo_MVP_Execution_Plan_v0.2.md b/docs/product/Kairo_MVP_Execution_Plan_v0.2.md
new file mode 100644
index 0000000..583b695
--- /dev/null
+++ b/docs/product/Kairo_MVP_Execution_Plan_v0.2.md
@@ -0,0 +1,162 @@
+# Jinkendo Kairo
+## MVP Execution Plan v0.2
+
+**Status:** PO-Kurskorrektur — **führend für Implementierung ab 2026-07-12**
+**Stand:** 2026-07-12
+**Ersetzt als Priorisierung:** Dogfooding-Seed als Implementierungs-Hebel; Status-Review §5 (Dogfooding-first)
+**Bezug:** `Kairo_MVP_Definition_v0.3.md` §5–9, `ADP_Archetype_and_Method_Catalog_v0.2.md` §3, `Kairo_Corrected_MVP_Roadmap_v0.2.md` (AP-Historie)
+
+---
+
+## 1. Nordstern (unverändert)
+
+Kairo ist MVP-nah, wenn ein Nutzer **mehrere typische Vorhabenarten** (Referenz-Portfolio) **erfassen, steuern und nachvollziehen** kann — archetyp- und methodengebunden, ohne Todo-Explosion.
+
+**Nicht MVP-Ziel:** Kairo-Entwicklungsstand in Kairo spiegeln (Dogfooding-Seed). Das war nur Dev-Visualisierung.
+
+---
+
+## 2. Referenz-Portfolio — Checkliste pro Archetyp
+
+Legende: **Anlage** · **Struktur** · **Ist** · **Kontrolle** · **UI-Default** · **Op-API**
+
+| ID | Archetyp | Beispiel | Methode | Stufe | Anlage | Struktur | Ist | Kontrolle | UI-Default | Op-API |
+|----|----------|----------|---------|-------|--------|----------|-----|-----------|------------|--------|
+| A1 | `initiative.maturity_journey` | Spagat / Kumite | `maturity_progression` | **A** | ◐ | ◐ | ◐ | ◐ | ✗ | ◐ |
+| A2 | `initiative.linear_project` | Neue Küche | `sequential_dependency` | **A** | ◐ | ◐ | ◐ | ◐ | ✗ | ◐ |
+| A3 | `initiative.recurring_program` | Haus in Ordnung | `recurring_control` | B | ◐ | ✗ | ◐ | ◐ | ✗ | ◐ |
+| B1 | `initiative.support_queue` | Tickets | `queue_pull` | B | ◐ | ✗ | ◐ | ◐ | ✗ | ◐ |
+| B2a | `initiative.program` | Release-Programm | `program_delivery` | A* | ◐ | ◐ | ◐ | ◐ | ✗ | ◐ |
+| B2b | `initiative.product` | Product-Betrieb | `continuous_product` | **A** | ◐ | ◐ | ◐ | ◐ | ✗ | ◐ |
+| B3 | *(Profil auf B2)* | Sprint-Zeitbox | `agile_iteration` | **A min** | ◐ | ◐ | ◐ | ◐ | ✗ | ◐ |
+| D1 | `initiative.content_project` | Buch schreiben | `chapter_based_progression` | B | ◐ | ✗ | ◐ | ◐ | ✗ | ◐ |
+| C1 | `initiative.dispute_case` | Miterstreit | `dispute_procedure` | C | Katalog | — | — | — | — | — |
+
+\* B2a in ADP Stufe A; MVP v0.3 §4 nennt explizit A1, A2, B2b + B3 — B2a im Validation-Slice mitdenken.
+
+**Ausprägungen (Code-Seeds):** `maturity.karate_kumite`, `content.book_writing`, `product.kairo_dev` — Vorlagen, **kein** Ersatz für Nutzer-Anlage.
+
+---
+
+## 3. Was technisch da ist vs. was fehlt
+
+### 3.1 Vorhanden (Infrastruktur — nicht wiederholen)
+
+- OM, Gates, Graph Engine, Plan-Outline, Journey, Plan/Ist-Diff
+- Archetyp-Registry, EFS, Profil-Modal (AP1.10c)
+- PM Work Modes Shell (AP1.9a), Cockpit-Signale (AP1.9c)
+- Next-Action-Strategien registriert (AP2.0d)
+- Execution-Graph / `ready_actions` (AP1.16)
+- `work_cycle` + `actions.work_cycle_id` (AP2.0f)
+- Operational Actor API + Service Tokens (AP1.7)
+
+### 3.2 Produkt-Lücken (MVP-kritisch)
+
+| Lücke | Bedeutung | Paket |
+|-------|-----------|-------|
+| Archetyp-geführte Anlage | Nutzer wählt Typ → sinnvolle Startstruktur + Guidance | **AP2.2a** |
+| Methoden-Default-UI | Ausführen/Kontrolle zeigt Next Action, nicht Gesamtliste | **AP1.9d** |
+| A1 Stufenwechsel + Recurring | AP2.0e: Routine wechselt bei `maturity_stage` reached | **AP2.0e** |
+| A2 kritischer Pfad | Kontrolle aus sequential + Graph Read Model | **AP2.2b** |
+| B2b Eingang → Commit | Product Backlog vs. Sprint-Backlog sichtbar getrennt | **AP2.2d** |
+| B3 Sprint-Default | Aktiver `work_cycle`; Ausführen = Sprint-Items | **AP2.2d** |
+| `chapter` RoadmapItem | D1 Plan-Schicht | **AP2.2f** (Stufe B) |
+| Structure Builder (voll) | Automatische Tiefenplanung | **deferred** — Starter-Kits stattdessen |
+| Op-API Parität | Agent pflegt dasselbe wie UI | **AP1.7b** |
+| Referenz-Validation | AP2.1 über A1, A2, B2b (+ B3), D1 | **AP2.1** |
+
+---
+
+## 4. Implementierungsfolge (korrigiert)
+
+```text
+Phase 0 DOC + Kurskorrektur (dieses Dokument) ← jetzt
+Phase 1 AP2.2a Archetyp-geführte Anlage + Starter-Kits ← NÄCHSTES CODE
+Phase 2 AP1.9d Methoden-Default-Ansichten (Anti-Todo-Wand) parallel möglich
+Phase 3 AP2.2b A2 Linear End-to-End
+ AP2.2c A1 Reifegrad + AP2.0e
+ AP2.2d B2b Product + B3 Sprint
+ AP2.2e B2a Programm (optional vor AP2.1)
+Phase 4 AP1.7b Operational API — Pflege-Parität
+Phase 5 AP2.1 Validation Report v0.3 (alle Stufe-A-Szenarien)
+Phase 6 AP2.2f Stufe B: A3, B1, D1
+Phase 7 Schicht 4: Gitea-Webhook, MCP (nach AP2.1 Go)
+```
+
+**Eingefroren / deprecated:**
+
+- `seed_004_dogfooding_*` — nur Dev-Visualisierung, **kein** Produkt-AP
+- Dogfooding als „nächster strategischer Hebel“ in Roadmaps
+
+---
+
+## 5. AP2.2 — Referenz-Vorhaben (Paketübersicht)
+
+| Paket | Ziel | DoD-Kern |
+|-------|------|----------|
+| **AP2.2a** | Geführte Anlage | Archetyp-Wahl → Starter-Kit + 1-Satz-Guidance; Ausprägung wählbar |
+| **AP2.2b** | A2 Küche | Gate-Kette/Graph anlegbar; Kontrolle: nächster ready Schritt + Begründung |
+| **AP2.2c** | A1 Spagat/Kumite | `maturity_stage` + Recurring; AP2.0e bei Stufenübergang |
+| **AP2.2d** | B2b + B3 | Eingang, Gates, optional aktive Zeitbox; Sprint-Backlog in Ausführen |
+| **AP2.2e** | B2a Programm | `program_delivery`, Abschluss-Lifecycle, Gate-Horizont |
+| **AP2.2f** | D1 Buch (B) | `chapter` item_type; nächstes Kapitel in Kontrolle |
+
+Assignment AP2.2a: `docs/sprints/Sprint1_AP2_2a_Archetype_Guided_Creation_Assignment_v0.1.md`
+
+---
+
+## 6. Operational API (Vibe-Coder) — Scope
+
+AP1.7 liefert Kern-Endpoints. **AP1.7b** ergänzt Parität:
+
+| Fähigkeit | UI | Op-API heute | AP1.7b |
+|-----------|-----|--------------|--------|
+| Context / Next Action | ✓ | ✓ | — |
+| Action Status | ✓ | ✓ | — |
+| Evidence anlegen | ✓ | ✓ | — |
+| Blocker melden | ✓ | ◐ | ✓ |
+| Backlog → Action committen | ✓ | ✗ | ✓ |
+| Recurring status | ✓ | ✗ | ✓ |
+| work_cycle zuweisen | ✓ | ◐ | ✓ |
+
+Auth: Actor Service Token (Tenant-scoped). Kein Gate-Verify, kein Lifecycle-Override über Op-API.
+
+---
+
+## 7. AP2.1 Validation (nach Stufe-A-Flows)
+
+**Nicht:** ein Dogfooding-Vorhaben auf Pi.
+**Sondern:** PO füllt Report mit **echten, in der UI angelegten** Referenz-Vorhaben:
+
+- A1 (Reifegrad)
+- A2 (Linear)
+- B2b (+ optional B3 Zeitbox)
+- D1 wenn Stufe B bis dahin fertig
+
+Vorlage: `docs/sprints/Sprint1_AP2_1_MVP_Validation_Report_v0.3.md` (neu bei AP2.1)
+
+Go-Kriterium: MVP v0.3 §5 — pro Stufe-A-Archetyp Leitfrage ≤2 Min + Next Action begründet.
+
+---
+
+## 8. Dokumentenpriorität
+
+Bei Konflikten:
+
+1. `Kairo_MVP_Definition_v0.3.md`
+2. **Dieses Dokument** (Execution Plan v0.2)
+3. `ADP_Archetype_and_Method_Catalog_v0.2.md`
+4. `Kairo_Corrected_MVP_Roadmap_v0.2.md` (AP-Historie)
+5. `Kairo_Dogfooding_Mirror_Steering_v0.1.md` (optional, Dev-only)
+
+---
+
+## 9. PO-Freigabe (offen)
+
+- [ ] Execution Plan v0.2 als führende Priorisierung
+- [ ] Dogfooding-Seed deprecated
+- [ ] AP2.2a als nächstes Code-Paket
+
+---
+
+*Siehe auch: `Kairo_Implementation_Truth_Table_v0.1.md` § Referenz-Archetypen, `Kairo_Status_Review_and_Next_Steps_v0.2.md`*
diff --git a/docs/product/Kairo_Status_Review_and_Next_Steps_v0.1.md b/docs/product/Kairo_Status_Review_and_Next_Steps_v0.1.md
index 1c8a40b..5e9ceef 100644
--- a/docs/product/Kairo_Status_Review_and_Next_Steps_v0.1.md
+++ b/docs/product/Kairo_Status_Review_and_Next_Steps_v0.1.md
@@ -1,9 +1,11 @@
# Jinkendo Kairo
## Status-Review & Nächste Schritte v0.1
+> **Superseded ab 2026-07-12:** Siehe **`Kairo_Status_Review_and_Next_Steps_v0.2.md`** und **`Kairo_MVP_Execution_Plan_v0.2.md`**.
+
**Status:** PO-Review-Auswertung (living document)
-**Stand:** 2026-07-11
-**Auslöser:** Vollständiger Plan/Ist/Soll-Abgleich, MVP-Review, Vorbereitung Dogfooding
+**Stand:** 2026-07-12
+**Auslöser:** Vollständiger Plan/Ist/Soll-Abgleich, MVP-Review, Dogfooding R2
**Bezug:** `Kairo_MVP_Definition_v0.3.md`, `Kairo_Implementation_Truth_Table_v0.1.md`, `Kairo_Corrected_MVP_Roadmap_v0.2.md`
**Dogfooding:** `Kairo_Dogfooding_Mirror_Steering_v0.1.md`
@@ -13,15 +15,15 @@
**Gesamtziel (unverändert):** Kairo ist der operative **Program Director** — Plan und Ist getrennt, Gates prüfbar, Steuerung archetyp- und methodengebunden, Agenten als Actors.
-**Ist (2026-07-11, `develop` @ `b85a6ec`):**
+**Ist (2026-07-12, `develop` @ `a097a82`):**
- **Foundation & OM:** tragfähig (~95 %)
-- **Plan/Gates/Infrastruktur:** weit (~70 %) — RoadmapItem, Checkliste, Graph Engine, Designer, Plan/Ist-Diff, Journey
-- **IA / PM Work Modes:** Shell da (~60 %) — Polish offen
-- **Archetyp-Steuerung (MVP v0.3):** erster Slice AP2.0 (~40 %)
-- **MVP-Abnahfe Stufe A:** noch nicht validiert (~25 %)
+- **Plan/Gates/Infrastruktur:** weit (~75 %) — RoadmapItem, Graph, Designer, Plan/Ist, Journey
+- **IA / PM Work Modes:** Shell da (~65 %) — AP1.9c ✓; Polish AP1.9b/d offen
+- **Archetyp-Steuerung (MVP v0.3):** Slice weit (~70 %) — AP2.0d ✓, AP1.7 ✓, AP2.0f ✓
+- **MVP-Abnahfe Stufe A:** Validation vorbereitet (~40 %) — **AP2.1 nächstes PO-Gate**
-**Urteil:** Technisch **weit über dem alten MVP-Slice** (`Initiative → Action`), produktlich **noch nicht MVP-nah** im Sinne von v0.3 — weil **Steuerung pro Archetyp**, **Cockpit-Signale** und **Referenz-Validierung** fehlen.
+**Urteil:** Technisch **B2b-Infrastruktur steht** (Operational API, Execution-Graph, Zeitbox). Produktlich **MVP-nah** erst nach **AP2.1 Validation** auf Pi.
**Nächster strategischer Hebel:** Kairo-Jinkendo als **Referenz-Vorhaben B2b** in Kairo spiegeln (Dogfooding) — Plan bleibt in Git/Docs, Kairo trackt Ist + Fortschritt + Ergebnisse.
@@ -38,16 +40,16 @@
| 3 | Ist committen | Actions, Tasks, Recurring | Actions ✓, Tasks ◐ AP1.5d, Recurring ✓ | Task-Roll-up ◐ |
| 4 | Kontrolle mit Begründung | Lifecycle, Methode, Next Action | AP2.0c Snapshot ◐ | Strategien unvollständig |
| 5 | Journey nachvollziehbar | ≥5 Events | AP1.6a/b ◐ | nicht validiert |
-| 6 | Leitfrage ≤2 Min | ohne CRUD-Wand | IA AP1.9a ✓, Inline-Forms ◐ | Polish AP1.9c/d |
-| 7 | Cockpit Portfolio-Attention | welches Vorhaben zuerst | AP1.8a Rang ✓, Signale ✗ | AP1.9c |
+| 6 | Leitfrage ≤2 Min | ohne CRUD-Wand | IA AP1.9a ✓, Kontrolle ◐ | Validation AP2.1 |
+| 7 | Cockpit Portfolio-Attention | welches Vorhaben zuerst | AP1.8a ✓, AP1.9c ✓ | AP2.1 bestätigen |
-**Score:** 0/7 voll ✓ · 7/7 ◐
+**Score:** 2/7 voll ✓ · 5/7 ◐
### 2.2 Abnahfe-Stufen (Archetypen)
| Stufe | Archetypen | Ist |
|-------|------------|-----|
-| **A** | A1, A2, B2b, B3 minimal | **B2b am nächsten** (Kairo selbst); A1/A2 → AP2.0d; B3 → AP2.0f (`work_cycle` fehlt) |
+| **A** | A1, A2, B2b, B3 minimal | **B2b bereit für Validation** — `work_cycle` ✓; AP2.1 PO-Gate |
| **B** | A3, B1, D1 | Katalog + Seeds, keine Strategien |
| **C** | C1 | nur Spezifikation |
@@ -59,9 +61,9 @@ OM-Persistenz ██████░░ ~75%
Plan/Gates ██████░░ ~70%
IA / Modi █████░░░ ~60%
Steering-Kern ████░░░░ ~50%
-Archetyp-Steuerung ███░░░░░ ~40%
-MVP-Abnahfe A ██░░░░░░ ~25%
-Agent/MCP ░░░░░░░░ ~5%
+Archetyp-Steuerung ██████░░ ~70%
+MVP-Abnahfe A ████░░░░ ~40%
+Agent/MCP ██░░░░░░ ~15% (AP1.7 ✓; MCP deferred)
Dokumentation █████░░░ ~55% (nach diesem DOC-Slice)
```
@@ -85,8 +87,18 @@ Commits auf `develop` bis `b85a6ec` (Auszug):
| AP2.0a–c | Method-Stubs, Archetyp-Seeds, Kontrolle-Lagebild | MVP-B2b-Basis |
| AP1.10c | Profil-Modal Archetyp/EFS | Anlage |
-**Frontend-Version:** `0.18.0-ap2.0`
-**Schema:** Migrationen 001–022
+**Frontend-Version:** `0.19.0-ap2.0f`
+**Schema:** Migrationen 001–025
+
+Zusätzlich seit 2026-07-11:
+
+| Paket | Inhalt | Produktwert |
+|-------|--------|-------------|
+| AP1.9c | Cockpit-Signale auf Portfolio-Kacheln | Portfolio-Attention |
+| AP1.16 | Execution-Graph, Plan-Outline-Kanten | Durchführungsplan |
+| AP2.0d | Next-Action-Strategien pro Archetyp | Begründete Next Actions |
+| AP1.7 | Operational Actor API + Service Tokens | Vibe-Coder ohne User-Login |
+| AP2.0f | `work_cycle` / Sprint-Zeitbox (B3 minimal) | Agile Iteration auf Product |
---
@@ -109,24 +121,18 @@ Priorität nach MVP v0.3 §9, Review 2026-07-11 und Dogfooding-Vorbereitung:
| Phase | Paket | Ziel | Abhängigkeit |
|-------|-------|------|--------------|
-| **D0** | **DOC-Sync** | Truth Table, Gap Analysis, Roadmap §2–3, dieses Dokument | — |
-| **D1** | **Dogfooding R1** | Vorhaben „Kairo-Jinkendo“ in Kairo anlegen (Spiegel, manuell) | D0 |
-| **1** | **AP1.9c** | Cockpit: Signale auf Portfolio-Kacheln | — |
-| **2** | **AP1.9b/d** | Scope-Breadcrumb, Kontrolle-Polish | 1 optional parallel |
-| **2b** | **AP1.16a–b** | Execution-Graph Schema + Engine (`ready_actions`) | **◐ Code** — Deploy |
-| **3** | **AP2.0d** | Next-Action-Strategien: maturity, sequential, recurring, queue | 2b |
-| **4** | **Dogfooding R2** | Ist pflegen, Evidence mit Gitea-Links, Gate-Fortschritt | D1 |
-| **4b** | **AP1.16c–d** | Plan-Outline AP-Kanten, Planning Debt | 2b |
-| **5** | **AP0.10d / AP2.1** | Validation B2b: Leitfrage-Test auf Pi | 3, 4 |
-| **6** | **AP2.0f** | `work_cycle` / Sprint auf Product (B3 minimal) | 5 optional |
-| **7** | **AP1.5d Rest** | Task-Detail, Roll-up-UI | parallel möglich |
-| **8** | **AP1.7** | Operational Actor Interface | nach 5 |
-| **9** | **Integration** | Gitea-Webhook → Journey/Evidence (Schicht 4) | AP1.7 |
-| **10** | **MCP-Adapter** | Cursor-Agent auf Operational API | 8 |
+| **D0** | **DOC-Sync** | Truth Table, Gap Analysis, Roadmap §2–3 | ✓ |
+| **D1** | **Dogfooding R1/R2** | Vorhaben + Ist-Spiegel (Seed) | ✓ |
+| **1–3** | AP1.9c, AP1.16, AP2.0d | Cockpit, Graph, Strategien | ✓ Code |
+| **4** | AP1.7, AP2.0f | Operational API, Zeitbox | ✓ Code |
+| **5** | **AP2.1 / AP0.10d B2b** | **Validation auf Pi — PO-Gate** | 1–4 |
+| **6** | AP1.9b/d | Scope-Breadcrumb, Kontrolle-Polish | 5 optional |
+| **7** | AP1.16c–d Rest | Planning Debt UI | parallel |
+| **8** | Integration | Gitea-Webhook → Journey/Evidence | AP2.1 Go |
+| **9** | MCP-Adapter | Cursor auf Operational API | 8 |
```text
-D0 DOC ──► D1 Dogfooding anlegen ──► 1 AP1.9c ──► 2b AP1.16 ──► 3 AP2.0d ──► 4 Ist spiegeln
- └──► 5 Validation ──► 8 AP1.7 ──► 10 MCP
+D0/D1 ✓ ──► AP1.9c/1.16/2.0d ✓ ──► AP1.7/2.0f ✓ ──► AP2.1 Validation (PO) ──► Integration/MCP
```
**Bewusst deferred:** AP1.15d OR-Pfade, AP1.8b situativer Kontext, AP1.3 Hook Orchestrator (parallel möglich, nicht MVP-kritisch).
@@ -135,7 +141,7 @@ D0 DOC ──► D1 Dogfooding anlegen ──► 1 AP1.9c ──► 2b AP1.16
## 6. MVP-Urteil
-**Ist Kairo MVP-nah (v0.3)?** — **Nein**, aber **B2b-Abnahfe (Kairo steuert Kairo)** ist mit D1 + AP1.9c + AP2.0d + Validation in **2–3 Iterationen** erreichbar.
+**Ist Kairo MVP-nah (v0.3)?** — **Bedingt** — B2b-Infrastruktur steht; **AP2.1 Validation** entscheidet Go für Stufe A.
Minimum für **Stufe-A-Abnahfe B2b**:
diff --git a/docs/product/Kairo_Status_Review_and_Next_Steps_v0.2.md b/docs/product/Kairo_Status_Review_and_Next_Steps_v0.2.md
new file mode 100644
index 0000000..43ae7f5
--- /dev/null
+++ b/docs/product/Kairo_Status_Review_and_Next_Steps_v0.2.md
@@ -0,0 +1,53 @@
+# Jinkendo Kairo
+## Status-Review & Nächste Schritte v0.2
+
+**Status:** PO-Kurskorrektur (living document)
+**Stand:** 2026-07-12
+**Ersetzt:** v0.1 §1/§5 (Dogfooding-first-Priorisierung)
+**Führend:** `Kairo_MVP_Execution_Plan_v0.2.md`, `Kairo_MVP_Definition_v0.3.md` §5–9
+
+---
+
+## 1. Executive Summary
+
+**Gesamtziel:** Mehrere **Referenz-Archetypen** (A1, A2, B2b, …) sind **vollständig anleg- und pflegbar** — archetyp-gesteuert, ohne Todo-Explosion. Vibe-Coder pflegen Ist über **Operational API**.
+
+**Ist (2026-07-12, `develop` + AP2.2a):**
+
+- **Infrastruktur:** OM, Gates, Graph, IA-Shell, Execution-Graph, Strategien, work_cycle, Op-API — weit ✓
+- **Produkt Stufe A:** ◐ — Starter-Kits (AP2.2a) beginnen; End-to-End-Flows pro Archetyp offen
+- **Dogfooding-Seed:** deprecated — war nur Dev-Visualisierung
+
+**Nächster Hebel:** **AP2.2a → AP2.2b–e** — Referenz-Vorhaben im **Produkt**, nicht in Seeds.
+
+---
+
+## 5. Roadmap — Nächste Schritte (korrigiert)
+
+Siehe **`Kairo_MVP_Execution_Plan_v0.2.md` §4** für Details.
+
+| Phase | Paket | Status |
+|-------|-------|--------|
+| 0 | Plan-Korrektur + Execution Plan v0.2 | ✓ |
+| 1 | **AP2.2a** Starter-Kits / geführte Anlage | **→ Code** |
+| 2 | AP1.9d Methoden-Default-UI | offen |
+| 3 | AP2.2b–e A2, A1, B2b+B3 End-to-End | offen |
+| 4 | AP1.7b Op-API Pflege-Parität | offen |
+| 5 | AP2.1 Validation A1+A2+B2b (+D1) | nach Phase 3 |
+| 6 | Stufe B (A3, B1, D1) + Schicht 4 | danach |
+
+```text
+Infrastruktur ✓ ──► AP2.2a Anlage ──► AP2.2b–e pro Archetyp ──► AP2.1 Validation
+```
+
+**Nicht prioritär:** seed_004, Dogfooding-R2-Sync, B2b-only-Validation
+
+---
+
+## 6. MVP-Urteil
+
+**MVP-nah?** — **Nein**, solange Referenz-Archetypen nicht **end-to-end im Produkt** nutzbar sind. Infrastruktur allein reicht nicht (MVP v0.3 §11 PO-Freigabe).
+
+---
+
+*Vorgänger: `Kairo_Status_Review_and_Next_Steps_v0.1.md` (historisch bis 2026-07-11)*
diff --git a/docs/sprints/Sprint1_AP2_2a_Archetype_Guided_Creation_Assignment_v0.1.md b/docs/sprints/Sprint1_AP2_2a_Archetype_Guided_Creation_Assignment_v0.1.md
new file mode 100644
index 0000000..e2614ed
--- /dev/null
+++ b/docs/sprints/Sprint1_AP2_2a_Archetype_Guided_Creation_Assignment_v0.1.md
@@ -0,0 +1,152 @@
+# AP2.2a — Archetyp-geführte Anlage & Starter-Kits
+## Implementierungsauftrag v0.1
+
+**Status:** freigegeben — **nächstes Code-Paket**
+**Stand:** 2026-07-12
+**PO-Basis:** `Kairo_MVP_Execution_Plan_v0.2.md` §5, `Kairo_MVP_Definition_v0.3.md` §5–7, `ADP_Archetype_and_Method_Catalog_v0.2.md` §3
+**Vorgänger:** AP2.0b (Registry), AP1.10c (Profil-Modal), AP2.0c (Kontrolle)
+**Nachfolger:** AP2.2b–e (End-to-End pro Archetyp), AP1.9d (Default-UI)
+
+---
+
+## 1. Ziel
+
+Ein Nutzer legt ein **Referenz-Vorhaben** an — **ohne Seed, ohne CRUD-Wand** — und erhält:
+
+1. **Archetyp** mit Default-Methode und verständlichem Label
+2. Optional **Ausprägung** (`method_profile_key`: Kumite, Buch, Kairo-Dev)
+3. **Starter-Kit**: minimale Plan-/Ist-Struktur passend zum Archetyp
+4. **Guidance**: ein Satz Steuerungshinweis + Link zum nächsten sinnvollen Schritt
+
+**Leitfrage-Test:** Nach Anlage in ≤3 Minuten in Kontrolle erkennbar: *Was ist der Typ dieses Vorhabens — und was ist als Nächstes dran?*
+
+**Nicht-Ziel:** Voller Structure Builder, KI, Tenant-Designer.
+
+---
+
+## 2. Scope
+
+### In Scope
+
+| # | Lieferung |
+|---|-----------|
+| 1 | **Anlage-Flow** erweitern: Archetyp zuerst (Pflicht), Ausprägung wenn vorhanden, EFS-Kernfelder |
+| 2 | **Starter-Kit-Service** (`backend/services/archetype_starter_kit.py`): idempotent nach `create_initiative` |
+| 3 | Kits für **Stufe A**: A1, A2, B2b (+ optional B2a); B3-Hinweis auf `work_cycle` |
+| 4 | **API** `GET /api/entity-archetypes/{key}/starter-preview` — was wird angelegt (read-only) |
+| 5 | **UI**: Vorhaben anlegen — Vorschau „Das legen wir an“ + Guidance nach Create |
+| 6 | pytest: pro Archetyp Kit-Struktur + Default-Methode |
+
+### Out of Scope
+
+- Dogfooding-Seed, Gitea-Webhook, MCP
+- `chapter` item_type (→ AP2.2f)
+- AP2.0e Recurring-Stufenwechsel (→ AP2.2c)
+- Methoden-Default-Ansichten Ausführen-Modus (→ AP1.9d)
+- Op-API Erweiterung (→ AP1.7b)
+
+---
+
+## 3. Starter-Kits (Spezifikation)
+
+### A1 — `initiative.maturity_journey` / `maturity_progression`
+
+| Element | Inhalt |
+|---------|--------|
+| RoadmapItems | 3× `maturity_stage` (planned → active → planned), sort_order 0,10,20 |
+| Projects | 1× `project.maturity_journey` „Training“ |
+| Recurring | 1× RecurringElement „Tägliche Übung“ (weekly, Platzhalter) |
+| Guidance | „Aktuelle Stufe und heutige Übung steuern deinen nächsten Schritt.“ |
+| Ausprägung | `maturity.karate_kumite` optional — mehr Stufen in Profil-JSON, Kit bleibt minimal |
+
+### A2 — `initiative.linear_project` / `sequential_dependency`
+
+| Element | Inhalt |
+|---------|--------|
+| RoadmapItems | 4× `milestone` als Gate-Kette (G1 active, G2–G4 planned), `requires`-Kanten |
+| Projects | 2×: „Hauptpfad“, „Begleitung“ |
+| Guidance | „Nächster Schritt am kritischen Pfad — Abhängigkeiten im Plan-Graph.“ |
+
+### B2b — `initiative.product` / `continuous_product`
+
+| Element | Inhalt |
+|---------|--------|
+| RoadmapItems | 2× `milestone` (Orientierung, nicht Micro-AP-Gates) |
+| Projects | 2×: „Entwicklung“, „Betrieb“ |
+| Backlog | 1× BacklogItem „Idee / Issue“ (open) |
+| Guidance | „Eingang triagieren, dann committete Actions — optional Sprint-Zeitbox (B3).“ |
+| Ausprägung | `product.kairo_dev` optional |
+
+### B2a — `initiative.program` / `program_delivery` (minimal)
+
+| Element | Inhalt |
+|---------|--------|
+| RoadmapItems | 3× `milestone` Phasen + Abschluss-Gate (planned/active) |
+| Guidance | „Programm mit Abschluss — Gate-Horizont in Kontrolle.“ |
+
+### B3 — Profil-Hinweis (kein eigener Archetyp)
+
+- Kein separates Kit — bei B2b/B2a: leerer Hinweis „Sprint anlegen unter Plan → Zeitbox“
+- Optional: 1× `work_cycle` planned „Iteration 1“ **nur wenn** Query-Param `include_work_cycle=true` bei Anlage
+
+---
+
+## 4. Technische Umsetzung
+
+### 4.1 Backend
+
+```text
+backend/services/archetype_starter_kit.py
+ get_starter_preview(archetype_key, method_profile_key?) -> StarterPreview
+ apply_starter_kit(tenant_id, initiative_id, archetype_key, ...) -> StarterResult
+
+backend/routers/entity_archetypes.py (oder initiatives)
+ GET .../starter-preview?archetype_key=&method_profile_key=
+
+services/initiatives.create_initiative(...)
+ optional: apply_starter_kit wenn apply_starter_kit=true (Default: true für Stufe A)
+```
+
+**Regeln:**
+
+- Idempotent: Re-Apply erzeugt keine Duplikate (Titel-Match wie Seeds)
+- Tenant-scoped, Audit `initiative.starter_kit_applied`
+- Keine hardcodierten Rechte — Capabilities wie bei `create_initiative`
+
+### 4.2 Frontend
+
+- `InitiativeForm` / Anlage-Modal: Archetyp-Auswahl prominent
+- Vorschau-Panel aus `starter-preview`
+- Nach Create: Toast + Link „Zur Kontrolle“ + Guidance-Text aus Snapshot
+
+### 4.3 Tests
+
+- `test_ap22a_starter_kit_a1.py` — Stufen + Recurring
+- `test_ap22a_starter_kit_a2.py` — Gate-Kette + deps
+- `test_ap22a_starter_kit_b2b.py` — Backlog + Projects
+- `test_starter_preview_api.py`
+
+---
+
+## 5. DoD
+
+- [ ] Nutzer kann A1, A2, B2b Vorhaben **nur über UI** anlegen mit Starter-Struktur
+- [ ] Default-Methode aus Archetyp — nicht `generic_operating` bei Stufe A
+- [ ] Kontrolle zeigt nach Anlage sinnvolle Next Action (bestehende Strategien)
+- [ ] Starter-Preview API dokumentiert in OpenAPI
+- [ ] pytest grün
+- [ ] Keine Abhängigkeit von `seed_004`
+- [ ] Truth Table + Execution Plan: AP2.2a ✓
+
+---
+
+## 6. Akzeptanz (manuell nach Deploy)
+
+1. Neues Vorhaben „Test Küche“ (A2) → 4 Gates, 2 Projects, Kontrolle mit Next Action
+2. Neues Vorhaben „Test Spagat“ (A1) → 3 Stufen, 1 Recurring
+3. Neues Vorhaben „Test Product“ (B2b) → Backlog + Projects
+4. ≤3 Min Leitfrage beantwortbar
+
+---
+
+*Siehe auch: `Kairo_MVP_Execution_Plan_v0.2.md`, `ADP_Archetype_and_Method_Catalog_v0.2.md` §3*
diff --git a/frontend/package.json b/frontend/package.json
index e8127f6..5055ae1 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -1,6 +1,6 @@
{
"name": "kairo-jinkendo-frontend",
- "version": "0.18.0-ap2.0",
+ "version": "0.20.0-ap2.2a",
"private": true,
"type": "module",
"scripts": {
diff --git a/frontend/src/api/entityArchetypes.js b/frontend/src/api/entityArchetypes.js
index a46979b..2a321e5 100644
--- a/frontend/src/api/entityArchetypes.js
+++ b/frontend/src/api/entityArchetypes.js
@@ -4,3 +4,10 @@ export function listEntityArchetypes(entityType) {
const qs = entityType ? `?entity_type=${encodeURIComponent(entityType)}` : ''
return apiFetch(`/api/entity-archetypes${qs}`)
}
+
+export function getArchetypeStarterPreview(archetypeKey, methodProfileKey) {
+ const params = new URLSearchParams()
+ if (methodProfileKey) params.set('method_profile_key', methodProfileKey)
+ const qs = params.toString() ? `?${params}` : ''
+ return apiFetch(`/api/entity-archetypes/${encodeURIComponent(archetypeKey)}/starter-preview${qs}`)
+}
diff --git a/frontend/src/components/InitiativeForm.jsx b/frontend/src/components/InitiativeForm.jsx
index b6ce2c8..910b967 100644
--- a/frontend/src/components/InitiativeForm.jsx
+++ b/frontend/src/components/InitiativeForm.jsx
@@ -2,7 +2,7 @@ import { useEffect, useState } from 'react'
import { INITIATIVE_STATUSES, PRIORITIES } from '../constants/status.js'
import { INITIATIVE_STATUS_LABELS, PRIORITY_LABELS } from '../constants/status.js'
import { INITIATIVE_ARCHETYPE_LABELS } from '../constants/initiativeArchetypes.js'
-import { listEntityArchetypes } from '../api/entityArchetypes.js'
+import { listEntityArchetypes, getArchetypeStarterPreview } from '../api/entityArchetypes.js'
import {
getInitiativeFields,
listArchetypeFieldDefinitions,
@@ -23,6 +23,9 @@ export function InitiativeForm({
const [fieldDefinitions, setFieldDefinitions] = useState([])
const [dynamicValues, setDynamicValues] = useState({})
const [fieldsLoading, setFieldsLoading] = useState(false)
+ const [starterPreview, setStarterPreview] = useState(null)
+ const [starterLoading, setStarterLoading] = useState(false)
+ const isCreate = !initiativeId
useEffect(() => {
let cancelled = false
@@ -81,6 +84,28 @@ export function InitiativeForm({
}
}, [initiativeId, archetypeKey])
+ useEffect(() => {
+ if (!isCreate || !archetypeKey) {
+ setStarterPreview(null)
+ return undefined
+ }
+ let cancelled = false
+ setStarterLoading(true)
+ getArchetypeStarterPreview(archetypeKey)
+ .then((preview) => {
+ if (!cancelled) setStarterPreview(preview)
+ })
+ .catch(() => {
+ if (!cancelled) setStarterPreview(null)
+ })
+ .finally(() => {
+ if (!cancelled) setStarterLoading(false)
+ })
+ return () => {
+ cancelled = true
+ }
+ }, [isCreate, archetypeKey])
+
async function handleSubmit(e) {
e.preventDefault()
const form = e.target
@@ -94,6 +119,7 @@ export function InitiativeForm({
priority: form.priority.value,
owner_actor_id: form.owner_actor_id?.value || undefined,
dynamicFields: dynamicValues,
+ apply_starter_kit: isCreate && starterPreview?.supported !== false,
})
}
@@ -130,6 +156,19 @@ export function InitiativeForm({
{selectedArchetype.description}
)}
+ {isCreate && starterPreview?.supported && (
+
+
+ Starter-Struktur:{' '}
+ {starterLoading
+ ? ' wird geladen …'
+ : starterPreview.items.map((item) => item.title).join(' · ')}
+
+ {starterPreview.guidance && (
+
{starterPreview.guidance}
+ )}
+
+ )}
{actors.length > 0 && (
)}
+ {active_work_cycle && (
+
+ Aktive Zeitbox:
+ {active_work_cycle.title}
+ {active_work_cycle.goal_description && (
+
+ {' '}
+ — {active_work_cycle.goal_description}
+
+ )}
+
+ )}
+
{statPills.map((pill) => (