mirror of
https://github.com/langgenius/dify.git
synced 2026-10-04 13:47:55 +08:00
The runner's check_recovery/recovery_continue/recovery_restart short-circuit committed the transition and returned immediately, without entering the advance loop. recovery_restart in FIX/FIX_CHECKLIST mode (the forced path for structural_invalidating drift) lands on the *working* fix.diagnose / checklist.diagnose entry state, which the runner must drive by running its handler -- the early return stranded the session there with no UI actions. Fix: rest only when the landed state is waiting/terminal (covers stop/resume, check_recovery, recovery_continue, and BUILD/EDIT restarts unchanged); otherwise consume the action and fall through to the existing advance loop. Also: parity-test recovery.entry_state_for against the states service.create_*_session actually assigns; add classify()-through-runner coverage for the three remaining recovery classes and target_node_ids guard branches; pin recovery_ref_for's message for config_only/structural_compatible; and qualify dify_port.py's graph_ops delegations (module import) so structural_fingerprint/node_ids no longer read as unqualified self-recursion. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>