You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
- Constraints: the created child is attached to exactly one parent project; ordering is maintained within the parent’s set.
5
-
- Failures: project invalid; project name conflicts with any existing Project (error text: `"team name must be unique"`).
5
+
- Failures: project invalid; project name conflicts with any existing Project (error text: `"project name must be unique"`).
6
6
- Success: returns Result.success with the created Project; persists the Project and parent-child relationship with order at the end of the parent’s set.
- Leaf projects store `current_state` directly; any state can transition to any other state.
17
+
-`SetProjectState` mutates state values; `SetInitiativeState` can also cascade state to related projects.
18
+
- Leaf projects store `current_state` directly; leaf projects can be set to any state except `:new`.
19
19
- Parent projects derive `current_state` from their leaf descendants via rollup; stored state is ignored.
20
20
- State rollup priority (highest to lowest): `:blocked, :in_progress, :on_hold, :todo, :new, :done`.
21
21
- If any leaf is `:blocked`, parent state is `:blocked`.
@@ -30,11 +30,11 @@ Health model
30
30
- Health enum: `:not_available, :on_track, :at_risk, :off_track`.
31
31
- Health updates (value objects) hold `project_id, date, health, description?`; loaded lazily.
32
32
- Weekly health updates are a lazily loaded subset for trends.
33
-
- Health scoring for rollups: `:on_track => 1`, `:at_risk => 0`, `:off_track => -1`; averages map back via thresholds (>0 `:on_track`, <0`:off_track`, else `:at_risk`). Subordinate health of `:not_available` is ignored.
33
+
- Health scoring for rollups: `:on_track => 1`, `:at_risk => 0`, `:off_track => -1`; averages map back via thresholds (>0.5`:on_track`, <=-0.5`:off_track`, else `:at_risk`). Subordinate health of `:not_available` is ignored; archived and non-working-state children are excluded.
34
34
- Current health calculation:
35
35
- If subordinate projects exist, health is the rollup average of subordinate current health. Subordinates with `:not_available` health are ignored. If all subordinates have `:not_available` health, health is `:not_available`.
36
36
- If no subordinate projects (leaf), use health updates: `:not_available` when none exist; otherwise the health of the latest update by date.
37
-
- Health trend: the last 6 weekly updates plus current health; empty when no updates exist.
37
+
- Health trend: the last 6 weekly updates plus current health; when no updates exist, returns a single current entry with `:not_available`.
0 commit comments