{"record":{"id":"f2f51b73d3ffdbca","repo":"deepset-ai/haystack","slug":"the-provided-break-point-targets-the-same-componen","errorCode":null,"errorMessage":"The provided break_point targets the same component and visit count as the break_point of the pipeline_snapshot. It would trigger again before the resumed component runs, so the pipeline could not make any progress. Provide a break_point with a different component or visit count.","messagePattern":"The provided break_point targets the same component and visit count as the break_point of the pipeline_snapshot\\. It would trigger again before the resumed component runs, so the pipeline could not make any progress\\. Provide a break_point with a different component or visit count\\.","errorType":"exception","errorClass":"PipelineInvalidPipelineSnapshotError","httpStatus":null,"severity":"error","filePath":"haystack/core/pipeline/pipeline.py","lineNumber":341,"sourceCode":"        :raises PipelineMaxComponentRuns:\n            If a Component reaches the maximum number of times it can be run in this Pipeline.\n        :raises PipelineBreakpointException:\n            When a pipeline_breakpoint is triggered. Contains the component name, state, and partial results.\n        \"\"\"\n        pipeline_running(self)  # telemetry\n\n        if (\n            break_point\n            and pipeline_snapshot\n            and break_point.component_name == pipeline_snapshot.break_point.component_name\n            and break_point.visit_count == pipeline_snapshot.break_point.visit_count\n        ):\n            msg = (\n                \"The provided break_point targets the same component and visit count as the break_point of the \"\n                \"pipeline_snapshot. It would trigger again before the resumed component runs, so the pipeline \"\n                \"could not make any progress. Provide a break_point with a different component or visit count.\"\n            )\n            raise PipelineInvalidPipelineSnapshotError(message=msg)\n\n        # make sure all breakpoints are valid, i.e. reference components in the pipeline\n        if break_point:\n            _validate_break_point_against_pipeline(break_point, self.graph)\n\n        # warm up the pipeline by running each component's warm_up method\n        self.warm_up()\n\n        if include_outputs_from is None:\n            include_outputs_from = set()\n\n        pipeline_outputs: dict[str, Any] = {}\n        # Set when resuming from a snapshot that predates `INTERNAL_INPUTS_FORMAT` and therefore lost the sender of\n        # each input. Cleared as soon as the paused component has run.\n        legacy_resume_component: str | None = None\n\n        if not pipeline_snapshot:\n            # normalize `data`","sourceCodeStart":323,"sourceCodeEnd":359,"githubUrl":"https://github.com/deepset-ai/haystack/blob/e318778c9bf60a1963e3b5f451359655dd696c30/haystack/core/pipeline/pipeline.py#L323-L359","documentation":"Haystack raises PipelineInvalidPipelineSnapshotError during Pipeline.run when resuming a pipeline from a snapshot with a break_point identical to the one that produced the snapshot. Since the breakpoint condition (same component and visit count) is still true at resume time, it would fire again immediately before the paused component executes, making progress impossible. This is a snapshot/interruption API guard in run (pipeline.py:341).","triggerScenarios":"Calling pipeline.run(data=..., pipeline_snapshot=snapshot, break_point=Breakpoint(component_name=X, visit_count=N)) where the snapshot's own break_point is also Breakpoint(component_name=X, visit_count=N).","commonSituations":"Re-running the same resume call twice (idempotent retry of run after a breakpoint); copying the snapshot's breakpoint into the resume call instead of advancing it; passing a breakpoint built from stale state after a failed resume attempt.","solutions":["Omit the break_point argument entirely when resuming with a pipeline_snapshot (the snapshot already carries its breakpoint).","Provide a Breakpoint with a different component_name, or an advanced visit_count (e.g. visit_count+1) so the resumed component runs first.","Check whether you accidentally replayed the original run call instead of the resume call; ensure you are not reusing the same arguments."],"exampleFix":"# before\nresult = pipe.run(data, pipeline_snapshot=snapshot,\n                  break_point=Breakpoint(component_name=\"llm\", visit_count=1))\n# after\nresult = pipe.run(data, pipeline_snapshot=snapshot)  # snapshot's break_point reused","handlingStrategy":"validation","validationCode":"if snapshot.break_point and break_point and \\\n        snapshot.break_point.component_name == break_point.component_name and \\\n        snapshot.break_point.visit_count == break_point.visit_count:\n    break_point = None  # let the snapshot's breakpoint govern the resume","typeGuard":"def is_same_breakpoint(a, b) -> bool:\n    return a is not None and b is not None and \\\n        a.component_name == b.component_name and a.visit_count == b.visit_count","tryCatchPattern":"try:\n    result = pipe.run(data, pipeline_snapshot=snapshot, break_point=bp)\nexcept PipelineInvalidPipelineSnapshotError:\n    result = pipe.run(data, pipeline_snapshot=snapshot)","preventionTips":["Don't pass break_point when resuming from a pipeline_snapshot unless you intend to change the interruption point.","Store resume intent separately from the breakpoint config to avoid replaying identical calls.","Advance visit_count deliberately when you want the next occurrence of the same component to trigger."],"tags":["pipeline","breakpoint","resume","snapshot"],"backgroundTag":"breakpoint-cannot-progress","analyzedSha":"e318778c9bf60a1963e3b5f451359655dd696c30","analyzedAt":"2026-08-30T11:45:20.711Z","schemaVersion":2},"datasetVersion":"2026-08-30T13:17:10.514Z"}