Some checks failed
Deploy Development / deploy (push) Successful in 46s
Test Suite / pytest-backend (push) Failing after 1m30s
Test Suite / k6 /api/health Baseline (push) Has been skipped
Test Suite / playwright-smoke (push) Has been skipped
Test Suite / lint-backend (push) Successful in 2s
Test Suite / compose-smoke (push) Has been skipped
Entfernt operating_phase aus dem Snapshot zugunsten von Lifecycle + signals. Führt methodenneutrale RoadmapItems (Migration 010), Verify-Pfad und Plan-UI ein. Milestone-API bleibt als Compat-Wrapper; Version 0.13.0-ap1.4. Co-authored-by: Cursor <cursoragent@cursor.com>
48 lines
1.3 KiB
Python
48 lines
1.3 KiB
Python
"""Initiative snapshot signals — erklärbare Heuristiken ohne operating_phase (AP1.2)."""
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
def derive_initiative_signals(
|
|
*,
|
|
initiative_status: str,
|
|
open_actions: int,
|
|
blocked_actions: int,
|
|
review_required_actions: int,
|
|
open_blockers: int,
|
|
backlog_new: int,
|
|
planned_reviews_due: int,
|
|
) -> list[str]:
|
|
"""Regelbasierte Signale für Steuerungs-Snapshot — kein Lifecycle-Ersatz."""
|
|
if initiative_status in ("completed", "archived"):
|
|
return ["initiative_terminal"]
|
|
|
|
signals: list[str] = []
|
|
|
|
if open_actions == 0 and backlog_new > 0:
|
|
signals.append("backlog_awaiting_commit")
|
|
return signals
|
|
|
|
if open_actions == 0 and backlog_new == 0:
|
|
signals.append("no_open_work")
|
|
return signals
|
|
|
|
if blocked_actions > 0:
|
|
signals.append("actions_blocked")
|
|
if open_blockers > 0:
|
|
signals.append("open_blockers")
|
|
if blocked_actions > 0 or open_blockers > 0:
|
|
return signals
|
|
|
|
if review_required_actions > 0:
|
|
signals.append("actions_need_review")
|
|
if planned_reviews_due > 0:
|
|
signals.append("reviews_due")
|
|
if review_required_actions > 0 or planned_reviews_due > 0:
|
|
return signals
|
|
|
|
if open_actions > 0:
|
|
signals.append("work_in_progress")
|
|
|
|
return signals
|