From cf61c171a5c1b432b58d9a5a5a01ecdf3c1c14a8 Mon Sep 17 00:00:00 2001 From: slhafzjw Date: Mon, 27 Apr 2026 18:41:32 +0800 Subject: [PATCH] fix(action): stabilize staged action execution metadata Use a stage-local Phaser in ActionExecutor so each action-chain stage waits on its own execution phase. This avoids reusing a terminated Phaser after the first stage completes, which could cause later stages to advance without actually waiting for their MetaActions and trigger FINAL_CHECK prematurely. Add stage-level descriptions to evaluated action chains and pass them through execution/correction contexts. Stage descriptions are now aligned with normalized action-chain order, exposed to ParamsExtractor, persisted in action state, and included in CorrectorInput so repeated MetaActions can be parameterized and corrected according to their concrete stage objective. Also fix APPEND intervention semantics to append after the requested stage instead of overwriting or dropping stages, and include stage descriptions in correction prompts to distinguish stage intent from generic MetaAction capability descriptions. --- .../slhaf/partner/core/action/ActionCore.java | 15 ++++++++---- .../action/executor/ActionCorrector.java | 5 +++- .../action/executor/ActionExecutor.java | 6 ++--- .../executor/entity/CorrectorInput.java | 1 + .../module/action/planner/ActionPlanner.java | 23 ++++++++++++++++++- 5 files changed, 41 insertions(+), 9 deletions(-) diff --git a/Partner-Core/src/main/java/work/slhaf/partner/core/action/ActionCore.java b/Partner-Core/src/main/java/work/slhaf/partner/core/action/ActionCore.java index 8bbb678a..1bf025f7 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/core/action/ActionCore.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/core/action/ActionCore.java @@ -229,13 +229,20 @@ public class ActionCore implements StateSerializable { } /** - * 在未进入执行阶段的行动单元组新增新的行动 + * 在指定阶段之后追加新的行动单元组 */ private void handleAppend(ExecutableAction executableAction, int order, List actions) { - if (order <= executableAction.getExecutingStage()) - return; + Map> actionChain = executableAction.getActionChain(); + int targetOrder = nextAvailableOrder(actionChain, order + 1); + actionChain.put(targetOrder, actions); + } - executableAction.getActionChain().put(order, actions); + private int nextAvailableOrder(Map> actionChain, int startOrder) { + int order = startOrder; + while (actionChain.containsKey(order)) { + order++; + } + return order; } /** diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ActionCorrector.java b/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ActionCorrector.java index b8892c8f..11c1bd7d 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ActionCorrector.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ActionCorrector.java @@ -31,7 +31,7 @@ public class ActionCorrector extends AbstractAgentModule.Sub { appendTextElement(document, metaActionElement, "action_key", metaActionData.getActionKey()); appendTextElement(document, metaActionElement, "description", metaActionData.getDescription()); + if (metaActionData.getStageDescription() != null && !metaActionData.getStageDescription().isBlank()) { + appendTextElement(document, metaActionElement, "stage_description", metaActionData.getStageDescription()); + } appendTextElement(document, metaActionElement, "status", metaActionData.getStatus()); appendTextElement(document, metaActionElement, "result", metaActionData.getResult()); return Unit.INSTANCE; diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ActionExecutor.java b/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ActionExecutor.java index e9518fb8..63e738d0 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ActionExecutor.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ActionExecutor.java @@ -155,7 +155,6 @@ public class ActionExecutor extends AbstractAgentModule.Standalone { actionCapability.putAction(executableAction); val actionChain = executableAction.getActionChain(); - val phaser = new Phaser(); if (!prepareExecutableAction(executableAction, actionChain)) { return; } @@ -172,7 +171,7 @@ public class ActionExecutor extends AbstractAgentModule.Standalone { if (stageSelection.shouldStop()) { break; } - val stageExecution = runCurrentStage(executableAction, phaser, stageCursor, stageSelection.metaActions()); + val stageExecution = runCurrentStage(executableAction, stageCursor, stageSelection.metaActions()); if (stageExecution.closed()) { return; } @@ -225,10 +224,10 @@ public class ActionExecutor extends AbstractAgentModule.Standalone { private StageExecution runCurrentStage( ExecutableAction executableAction, - Phaser phaser, StageCursor stageCursor, List metaActions ) { + Phaser phaser = new Phaser(); val recognizerRecord = startRecognizerIfNeeded(executableAction, phaser); val listeningRecord = executeAndListening(metaActions, phaser, executableAction); phaser.awaitAdvance(listeningRecord.phase()); @@ -775,6 +774,7 @@ public class ActionExecutor extends AbstractAgentModule.Standalone { .map(metaAction -> new CorrectorInput.ActionChainItem( metaAction.getKey(), resolveHistoryDescription(metaAction.getKey()), + executableAction.getStageDescriptions().get(stage), metaAction.getResult().getStatus().name().toLowerCase(Locale.ROOT), metaAction.getResult().getData() )) diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/entity/CorrectorInput.java b/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/entity/CorrectorInput.java index 23b67c41..8eee3c00 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/entity/CorrectorInput.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/entity/CorrectorInput.java @@ -29,6 +29,7 @@ public class CorrectorInput { public static class ActionChainItem { private String actionKey; private String description; + private String stageDescription; private String status; private String result; } diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/action/planner/ActionPlanner.java b/Partner-Core/src/main/java/work/slhaf/partner/module/action/planner/ActionPlanner.java index 9687e166..9933181c 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/action/planner/ActionPlanner.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/action/planner/ActionPlanner.java @@ -279,7 +279,7 @@ public class ActionPlanner extends AbstractAgentModule.Running new SchedulableExecutableAction( evaluatorResult.getTendency(), actionChain, @@ -297,6 +297,27 @@ public class ActionPlanner extends AbstractAgentModule.Running getStageDescriptions(EvaluatorResult evaluatorResult) { + Map descriptions = new HashMap<>(); + List primaryActionChain = evaluatorResult.getPrimaryActionChain(); + if (primaryActionChain == null || primaryActionChain.isEmpty()) { + return descriptions; + } + List orderedChain = new ArrayList<>(primaryActionChain); + orderedChain.sort(Comparator.comparing(EvaluatorResult.ChainElement::getOrder, Comparator.nullsLast(Integer::compareTo))); + int fixedOrder = 1; + for (EvaluatorResult.ChainElement chainElement : orderedChain) { + String description = chainElement.getDescription(); + if (description != null && !description.isBlank()) { + descriptions.put(fixedOrder, description); + } + fixedOrder++; + } + return descriptions; } private Map> getActionChain(EvaluatorResult evaluatorResult) {