diff --git a/deltaforge_skeleton/coordination.py b/deltaforge_skeleton/coordination.py index 9a54913..ef9377b 100644 --- a/deltaforge_skeleton/coordination.py +++ b/deltaforge_skeleton/coordination.py @@ -17,9 +17,11 @@ class ADMMCoordinator: self.rho = rho def coordinate(self, plan: PlanDelta, venues: List[str]) -> PlanDelta: - if not plan or not plan.steps: + if plan is None: return plan - # Minimal ADMM-like annotation to indicate coordination happened + # Ensure the plan has a steps list; initialize if missing for robustness + if not hasattr(plan, "steps") or plan.steps is None: + plan.steps = [] # type: ignore[attr-defined] venues_str = ",".join(venues) if venues else "[]" plan.steps.append(f"ADMM_COORDINATE between [{venues_str}] with rho={self.rho}") return plan diff --git a/deltaforge_skeleton/dsl.py b/deltaforge_skeleton/dsl.py index 67764e8..ab021c2 100644 --- a/deltaforge_skeleton/dsl.py +++ b/deltaforge_skeleton/dsl.py @@ -46,5 +46,7 @@ class DualVariables: class PlanDelta: # A delta plan that can be applied to move a local problem toward feasibility actions: List[StrategyDelta] = field(default_factory=list) + # Optional sequence of high-level orchestration steps or annotations + steps: List[str] = field(default_factory=list) timestamp: float = 0.0 safety_tags: List[str] = field(default_factory=list)