feat(plan): add phase reversion state machine
This commit is contained in:
@@ -0,0 +1,110 @@
|
||||
Feature: Phase Reversion State Machine
|
||||
As a plan lifecycle manager
|
||||
I want to revert plans to earlier phases
|
||||
So that plans can be re-strategized when constraints prove unworkable
|
||||
|
||||
Background:
|
||||
Given a plan lifecycle service is initialized
|
||||
|
||||
Scenario: Auto-reversion from constrained Apply to Strategize
|
||||
Given an action "local/test-action" exists
|
||||
And a plan is created from action "local/test-action"
|
||||
And the plan is advanced to Apply phase with constrained state
|
||||
And the plan has automation profile "ci" allowing auto-reversion
|
||||
When auto-reversion from apply is attempted with reason "constraints too strict"
|
||||
Then the plan should be in Strategize phase
|
||||
And the plan processing state should be queued
|
||||
And the plan reversion count should be 1
|
||||
And a reversion decision should be recorded with source "apply" and target "strategize"
|
||||
|
||||
Scenario: Manual reversion via revert_plan method
|
||||
Given an action "local/manual-revert" exists
|
||||
And a plan is created from action "local/manual-revert"
|
||||
And the plan is advanced to Execute phase
|
||||
When the plan is manually reverted to Strategize with reason "need different strategy"
|
||||
Then the plan should be in Strategize phase
|
||||
And the plan processing state should be queued
|
||||
And the plan reversion count should be 1
|
||||
And a reversion decision should be recorded with reason "need different strategy"
|
||||
|
||||
Scenario: Loop guard prevents more than 3 reversions
|
||||
Given an action "local/loop-guard" exists
|
||||
And a plan is created from action "local/loop-guard"
|
||||
And the plan has been reverted 3 times
|
||||
When a reversion is attempted on the maxed-out plan
|
||||
Then a PlanError should be raised about max reversions
|
||||
|
||||
Scenario: Auto-reversion blocked by manual profile threshold
|
||||
Given an action "local/profile-gate" exists
|
||||
And a plan is created from action "local/profile-gate"
|
||||
And the plan is advanced to Apply phase with constrained state
|
||||
And the plan has automation profile "manual" blocking auto-reversion
|
||||
When auto-reversion from apply is attempted with reason "profile blocks it"
|
||||
Then the plan should remain in Apply phase
|
||||
And the plan processing state should be constrained
|
||||
|
||||
Scenario: Auto-reversion from Execute to Strategize
|
||||
Given an action "local/exec-revert" exists
|
||||
And a plan is created from action "local/exec-revert"
|
||||
And the plan is advanced to Execute phase
|
||||
And the plan has automation profile "ci" allowing auto-reversion
|
||||
When auto-reversion from execute is attempted with reason "validation failures"
|
||||
Then the plan should be in Strategize phase
|
||||
And the plan processing state should be queued
|
||||
And the plan reversion count should be 1
|
||||
|
||||
Scenario: Invalid reversion on terminal plan (applied)
|
||||
Given an action "local/terminal-plan" exists
|
||||
And a plan is created from action "local/terminal-plan"
|
||||
And the plan has reached applied terminal state
|
||||
When a reversion is attempted on the terminal plan
|
||||
Then a PlanError should be raised about terminal state
|
||||
|
||||
Scenario: Invalid reversion to wrong phase
|
||||
Given an action "local/wrong-phase" exists
|
||||
And a plan is created from action "local/wrong-phase"
|
||||
And the plan is in Strategize phase
|
||||
When a reversion to Apply phase is attempted
|
||||
Then an InvalidPhaseTransitionError should be raised
|
||||
|
||||
Scenario: Reversion preserves plan context
|
||||
Given an action "local/context-preserve" exists
|
||||
And a plan is created from action "local/context-preserve" with arguments
|
||||
And the plan is advanced to Execute phase
|
||||
When the plan is manually reverted to Strategize with reason "context check"
|
||||
Then the plan arguments should be preserved
|
||||
And the plan project links should be preserved
|
||||
And the plan invariants should be preserved
|
||||
|
||||
Scenario: Multiple reversions tracked in decisions list
|
||||
Given an action "local/multi-revert" exists
|
||||
And a plan is created from action "local/multi-revert"
|
||||
And the plan is advanced to Execute phase
|
||||
When the plan is manually reverted to Strategize with reason "first reversion"
|
||||
And the plan is re-advanced to Execute phase
|
||||
And the plan is manually reverted to Strategize with reason "second reversion"
|
||||
Then the plan reversion count should be 2
|
||||
And there should be 2 reversion decisions recorded
|
||||
|
||||
Scenario: can_revert_to validates reversion paths
|
||||
Given an action "local/revert-validation" exists
|
||||
And a plan is created from action "local/revert-validation"
|
||||
Then the plan in Strategize phase cannot revert to Apply
|
||||
And the plan in Strategize phase cannot revert to Action
|
||||
And the plan in Execute phase can revert to Strategize
|
||||
And the plan in Apply phase can revert to Strategize
|
||||
|
||||
Scenario: Auto-reversion from Execute blocked by profile threshold
|
||||
Given an action "local/exec-blocked" exists
|
||||
And a plan is created from action "local/exec-blocked"
|
||||
And the plan is advanced to Execute phase
|
||||
And the plan has automation profile "manual" blocking auto-reversion
|
||||
When auto-reversion from execute is attempted with reason "blocked by profile"
|
||||
Then the plan should remain in Execute phase
|
||||
|
||||
Scenario: Cancelled plan cannot be reverted
|
||||
Given an action "local/cancelled-plan" exists
|
||||
And a plan is created from action "local/cancelled-plan"
|
||||
And the plan has been cancelled
|
||||
When a reversion is attempted on the cancelled plan
|
||||
Then a PlanError should be raised about terminal state
|
||||
Reference in New Issue
Block a user