Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions cosmos/dbt/selector.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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]
Expand Down