diff --git a/scripts/approved_plan_continuity_gate.mjs b/scripts/approved_plan_continuity_gate.mjs index 8e93082..bd58019 100755 --- a/scripts/approved_plan_continuity_gate.mjs +++ b/scripts/approved_plan_continuity_gate.mjs @@ -76,11 +76,39 @@ function evaluateContinuity(payload) { const taskComplete = payload?.taskState === 'complete'; const nextAction = payload?.nextDerivedAction ?? payload?.derivedAction ?? null; const nextActionKnown = nextAction != null; + const explicitNextTaskKnown = payload?.nextTaskKnown === true; + const sameApprovedPlan = payload?.sameApprovedPlan === true; + const taskBoundaryStop = payload?.taskBoundaryStop === true; + const highRiskStop = payload?.highRiskStop === true; const hasDispatchReceipt = hasValidDispatchReceipt(payload?.dispatchReceipt ?? null); const closureState = payload?.replyClosureState ?? null; const isLegalTerminalState = LEGAL_TERMINAL_STATES.has(closureState); + const autoNextObligatory = taskComplete + && explicitNextTaskKnown + && sameApprovedPlan + && taskBoundaryStop + && !isLegalTerminalState + && !highRiskStop; - if (taskComplete && nextActionKnown && !hasDispatchReceipt && !isLegalTerminalState) { + if (autoNextObligatory && !hasDispatchReceipt) { + return { + ok: false, + status: 'continuity_failure', + verdict: 'continuity_failure', + reason: 'missing_auto_next_dispatch', + }; + } + + if (taskComplete && nextActionKnown && !hasDispatchReceipt && !isLegalTerminalState && !highRiskStop && !('sameApprovedPlan' in (payload ?? {}))) { + return { + ok: false, + status: 'continuity_failure', + verdict: 'continuity_failure', + reason: 'missing_dispatch_receipt', + }; + } + + if (taskComplete && nextActionKnown && !hasDispatchReceipt && !isLegalTerminalState && !highRiskStop && sameApprovedPlan && !taskBoundaryStop && !explicitNextTaskKnown) { return { ok: false, status: 'continuity_failure',