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
|