From d68d70c800bad6bdb002d6d538b273f9ef64b593 Mon Sep 17 00:00:00 2001 From: rudiheydra Date: Tue, 27 Jan 2026 09:08:25 +1100 Subject: [PATCH] fix: prevent infinite loop in compute_scheduling_scores with circular deps Add visited set to BFS algorithm to handle circular dependencies gracefully. Previously, cycles in the dependency graph caused the orchestrator to hang at 100% CPU indefinitely during startup. Co-Authored-By: Claude Opus 4.5 --- api/dependency_resolver.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/api/dependency_resolver.py b/api/dependency_resolver.py index 103cee7..6b09244 100644 --- a/api/dependency_resolver.py +++ b/api/dependency_resolver.py @@ -300,15 +300,20 @@ def compute_scheduling_scores(features: list[dict]) -> dict[int, float]: parents[f["id"]].append(dep_id) # Calculate depths via BFS from roots + # Use visited set to prevent infinite loops from circular dependencies depths: dict[int, int] = {} + visited: set[int] = set() roots = [f["id"] for f in features if not parents[f["id"]]] queue = [(root, 0) for root in roots] while queue: node_id, depth = queue.pop(0) - if node_id not in depths or depth > depths[node_id]: - depths[node_id] = depth + if node_id in visited: + continue # Skip already visited nodes (handles cycles) + visited.add(node_id) + depths[node_id] = depth for child_id in children[node_id]: - queue.append((child_id, depth + 1)) + if child_id not in visited: + queue.append((child_id, depth + 1)) # Handle orphaned nodes (shouldn't happen but be safe) for f in features: