{"record":{"id":"c5efcddcaa46d409","repo":"ScrapeGraphAI/Scrapegraph-ai","slug":"failed-to-set-false-node-name-for-conditionalnode","errorCode":null,"errorMessage":"Failed to set false_node_name for ConditionalNode '{node.node_name}'","messagePattern":"Failed to set false_node_name for ConditionalNode '(.+?)'","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"scrapegraphai/graphs/base_graph.py","lineNumber":122,"sourceCode":"        for node in self.nodes:\n            if node.node_type == \"conditional_node\":\n                outgoing_edges = [\n                    (from_node, to_node)\n                    for from_node, to_node in self.raw_edges\n                    if from_node.node_name == node.node_name\n                ]\n                if len(outgoing_edges) != 2:\n                    raise ValueError(\n                        f\"ConditionalNode '{node.node_name}' must have exactly two outgoing edges.\"\n                    )\n                node.true_node_name = outgoing_edges[0][1].node_name\n                try:\n                    node.false_node_name = outgoing_edges[1][1].node_name\n                except (IndexError, AttributeError) as e:\n                    # IndexError: If outgoing_edges[1] doesn't exist\n                    # AttributeError: If to_node is None or doesn't have node_name\n                    node.false_node_name = None\n                    raise ValueError(\n                        f\"Failed to set false_node_name for ConditionalNode '{node.node_name}'\"\n                    ) from e\n\n    def _get_node_by_name(self, node_name: str):\n        \"\"\"Returns a node instance by its name.\"\"\"\n        return next(node for node in self.nodes if node.node_name == node_name)\n\n    def _update_source_info(self, current_node, state):\n        \"\"\"Updates source type and source information from FetchNode.\"\"\"\n        source_type = None\n        source = []\n        prompt = None\n\n        if current_node.__class__.__name__ == \"FetchNode\":\n            source_type = list(state.keys())[1]\n            if state.get(\"user_prompt\", None):\n                prompt = (\n                    state[\"user_prompt\"]","sourceCodeStart":104,"sourceCodeEnd":140,"githubUrl":"https://github.com/ScrapeGraphAI/Scrapegraph-ai/blob/532dfffbf6ee823a6c9cf8cfedc24a93bf026780/scrapegraphai/graphs/base_graph.py#L104-L140","documentation":"Companion check in _set_conditional_node_edges: after confirming two outgoing edges exist, reading outgoing_edges[1][1].node_name failed with IndexError or AttributeError. In practice this fires when the second edge's to_node is None or an object without a node_name attribute (e.g. a malformed tuple in the edges list).","triggerScenarios":"Passing an edge tuple whose destination is None ([(cond, real_node), (cond, None)]) or a non-node object (string, dict) in the second position; a node whose node_name attribute was deleted or never set.","commonSituations":"Programmatically building edge lists where a lookup of a node by name returned None; typos when constructing tuples; partially initialized node objects in test fixtures.","solutions":["Inspect the raw_edges/edges list and make sure every tuple's second element is a fully constructed BaseNode with a node_name.","Fix the code that produced a None destination (usually a node-lookup miss) so it returns the real node instance.","Add an assertion when building edges: assert to_node is not None and hasattr(to_node, 'node_name')."],"exampleFix":"# before\nedges = [(cond, node_a), (cond, nodes_by_name.get('missing'))]\n\n# after\nedges = [(cond, node_a), (cond, nodes_by_name['fallback_node'])]","handlingStrategy":"validation","validationCode":"for f, t in edges:\n    assert t is not None and hasattr(t, 'node_name'), f'malformed edge destination: {t!r}'","typeGuard":"def edges_well_formed(edges) -> bool:\n    return all(t is not None and hasattr(t, 'node_name') for _, t in edges)","tryCatchPattern":"try:\n    g = BaseGraph(nodes=nodes, edges=edges, entry_point=entry)\nexcept ValueError as e:\n    if 'false_node_name' in str(e):\n        # inspect edges for None/malformed second destination, fix, retry\n        raise\n    raise","preventionTips":["Type edge tuples as Tuple[BaseNode, BaseNode] and construct them only from real instances.","Fail fast on None when looking up nodes by name.","Add a topology sanity check in tests for custom graphs."],"tags":["graph-topology","conditional-node","null-reference","edges"],"backgroundTag":"invalid-graph-topology","analyzedSha":"532dfffbf6ee823a6c9cf8cfedc24a93bf026780","analyzedAt":"2026-08-28T15:19:38.821Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}