From c9ca55b45b246b181b00cfc0c82babd66422f2e3 Mon Sep 17 00:00:00 2001 From: ageerle Date: Tue, 8 Sep 2026 23:48:59 +0800 Subject: [PATCH] fix: preserve manual plan transitions during external verification --- .../coding/harness/loop/DurableHarnessRunProcessor.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/service/coding/harness/loop/DurableHarnessRunProcessor.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/service/coding/harness/loop/DurableHarnessRunProcessor.java index b83d7dd0..fa1df1ed 100644 --- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/service/coding/harness/loop/DurableHarnessRunProcessor.java +++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/service/coding/harness/loop/DurableHarnessRunProcessor.java @@ -2040,7 +2040,7 @@ public class DurableHarnessRunProcessor implements HarnessRunProcessor { .map(org.ruoyi.service.coding.harness.tool.ToolDescriptor::toolName) .filter(PLAN_GATED_MUTATION_TOOLS::contains) .collect(java.util.stream.Collectors.toCollection(HashSet::new)); - if (failedEvidenceSupportsActiveStep(plan)) { + if (externalVerification(session) || failedEvidenceSupportsActiveStep(plan)) { activeActionTools.add("plan_step"); } return registry.restrictedTo(Set.copyOf(activeActionTools)); @@ -2051,7 +2051,10 @@ public class DurableHarnessRunProcessor implements HarnessRunProcessor { .collect(java.util.stream.Collectors.toUnmodifiableSet()); return registry.restrictedTo(actionable); } - if (plan != null && plan.inProgressStep().isPresent() + // EXTERNAL deliberately disables automatic step completion: a successful write may be + // only part of the implementation. Keep the evidence-validated manual transition visible + // so the model can finish its step before entering VERIFY. + if (!externalVerification(session) && plan != null && plan.inProgressStep().isPresent() && !failedEvidenceSupportsActiveStep(plan)) { Set withoutNarrativeTransition = registry.descriptors().stream() .map(org.ruoyi.service.coding.harness.tool.ToolDescriptor::toolName)