diff --git a/cosmos/dbt/selector.py b/cosmos/dbt/selector.py index 01189a4f0f..1c3b61b8a0 100644 --- a/cosmos/dbt/selector.py +++ b/cosmos/dbt/selector.py @@ -191,6 +191,9 @@ def select_node_precursors(self, nodes: dict[str, DbtNode], root_id: str, select new_generation: set[str] = set() for node_id in previous_generation: if node_id not in processed_nodes: + # When using dbt-loom for cross-project references, external nodes are filtered out + # during manifest loading but local nodes may still reference them in depends_on. + # Skip missing nodes to gracefully stop traversal at project boundaries. if node_id in nodes: new_generation.update(set(nodes[node_id].depends_on)) processed_nodes.add(node_id) @@ -588,6 +591,9 @@ def select_nodes_ids_by_intersection(self) -> set[str]: if self.config.graph_selectors: graph_selected_nodes = self.select_by_graph_operator() for node_id in graph_selected_nodes: + # When using dbt-loom for cross-project references, external nodes are filtered out + # during manifest loading but may be collected during graph traversal via depends_on. + # Skip these external node IDs that don't exist in the nodes dict. if node_id not in self.nodes: continue node = self.nodes[node_id]