Files
cleveragents-core/features/plan_lifecycle_service.feature
freemo 039ab87b52
CI / lint (pull_request) Successful in 15s
CI / typecheck (pull_request) Successful in 31s
CI / security (pull_request) Successful in 22s
CI / quality (pull_request) Successful in 15s
CI / integration_tests (pull_request) Successful in 4m37s
CI / build (pull_request) Successful in 15s
CI / lint (push) Successful in 12s
CI / typecheck (push) Successful in 27s
CI / security (push) Successful in 22s
CI / quality (push) Successful in 15s
CI / unit_tests (pull_request) Successful in 9m56s
CI / integration_tests (push) Successful in 4m41s
CI / build (push) Successful in 15s
CI / unit_tests (push) Successful in 9m58s
CI / coverage (pull_request) Successful in 7m1s
CI / docker (pull_request) Successful in 8s
CI / docker (push) Successful in 8s
CI / coverage (push) Successful in 6m54s
feat(domain): rebaseline plan phases and apply states
2026-02-15 00:12:07 -05:00

292 lines
12 KiB
Gherkin

Feature: Plan Lifecycle Service
As a developer
I want a service that manages the v3 plan lifecycle
So that plans can transition through Strategize -> Execute -> Apply phases
Background:
Given I have a plan lifecycle service
# Action Creation Tests
Scenario: Create a new action
When I create an action with name "local/test-coverage" and definition "Tests pass"
Then the action should be created successfully
And the lifecycle action state should be "available"
And the lifecycle action namespace should be "local"
Scenario: Create action with arguments
When I create an action with name "local/coverage" definition "Coverage >= target" and arguments
| name | type | requirement | description |
| target | int | required | Target percentage |
Then the action should be created successfully
And the action should have 1 argument
Scenario: Reject invalid action name
When I try to create an action with invalid name "local/invalid name"
Then a lifecycle validation error should be raised
Scenario: Action is available immediately after creation
Given I have an available action "local/my-action"
Then the lifecycle action state should be "available"
Scenario: Archive an action
Given I have an available action "local/my-action"
When I archive the action
Then the lifecycle action state should be "archived"
Scenario: Get action by ID
Given I have created an action "local/test-action"
When I get the action by ID
Then the action should be returned
Scenario: Get action by name
Given I have created an action "local/test-action"
When I get the action by name "local/test-action"
Then the action should be returned
Scenario: Get action by missing ID
Given I have created an action "local/test-action"
When I try to get the action by missing ID "missing-action-id"
Then a not found error should be raised
Scenario: Get action by missing name
Given I have created an action "local/test-action"
When I try to get the action by missing name "local/missing-action"
Then a not found error should be raised
Scenario: List actions
Given I have created actions "local/action-a" and "local/action-b"
When I list all actions
Then I should see 2 actions
Scenario: List actions by namespace
Given I have created actions "local/action-a" and "myorg/action-b"
When I list actions in namespace "local"
Then I should see 1 action
Scenario: List actions by state
Given I have an available action "local/available-action"
And I have an archived action "local/archived-action"
When I list actions in state "available"
Then I should see 1 action
Scenario: Make available on already available action is a no-op
Given I have an available action "local/available-action"
When I try to make the action available
Then the lifecycle action state should be "available"
Scenario: Get plan by missing ID
When I try to get the plan by missing ID "missing-plan-id"
Then a not found error should be raised
# Plan Creation (use_action) Tests
Scenario: Use action creates plan in Strategize phase
Given I have an available action "local/test-action"
When I use the action on project "project-123"
Then a plan should be created
And the lifecycle plan phase should be "strategize"
And the lifecycle plan processing state should be "queued"
And the plan should reference project "project-123"
Scenario: Use action validates required arguments
Given I have an available action with required argument "target:int:required:Target"
When I try to use the action without providing arguments
Then a validation error should be raised with message "Missing required argument"
Scenario: Cannot use archived action before available
Given I have an archived action "local/my-action"
When I try to use the action on project "project-123"
Then an action not available error should be raised
Scenario: Cannot use archived action (second)
Given I have an archived action "local/my-action"
When I try to use the action on project "project-123"
Then an action not available error should be raised
Scenario: Non-reusable action is archived after use
Given I have an available non-reusable action "local/one-time-action"
When I use the action on project "project-123"
Then the lifecycle action state should be "archived"
# Strategize Phase Tests
Scenario: Start strategize processing
Given I have a plan in strategize phase with queued state
When I start strategize
Then the lifecycle plan processing state should be "processing"
And the strategize started timestamp should be set
Scenario: Complete strategize
Given I have a plan in strategize phase with processing state
When I complete strategize
Then the lifecycle plan processing state should be "complete"
And the strategize completed timestamp should be set
Scenario: Fail strategize
Given I have a plan in strategize phase with processing state
When strategize fails with error "Strategy generation failed"
Then the lifecycle plan processing state should be "errored"
And the lifecycle plan error message should be "Strategy generation failed"
Scenario: Cannot start strategize outside strategize phase
Given I have a plan in execute phase with queued state
When I try to start strategize
Then a plan error should be raised
Scenario: Cannot start strategize when not queued
Given I have a plan in strategize phase with processing state
When I try to start strategize
Then a plan not ready error should be raised
Scenario: Cannot complete strategize outside strategize phase
Given I have a plan in execute phase with queued state
When I try to complete strategize
Then a plan error should be raised
Scenario: Cannot complete strategize when not processing
Given I have a plan in strategize phase with queued state
When I try to complete strategize
Then a plan error should be raised
# Execute Phase Transition Tests
Scenario: Execute plan transitions from Strategize to Execute
Given I have a plan in strategize phase with complete state
When I execute the plan
Then the lifecycle plan phase should be "execute"
And the lifecycle plan processing state should be "queued"
Scenario: Cannot execute plan that is not complete
Given I have a plan in strategize phase with processing state
When I try to execute the plan
Then a plan not ready error should be raised
Scenario: Start execute processing
Given I have a plan in execute phase with queued state
When I start execute
Then the lifecycle plan processing state should be "processing"
And the execute started timestamp should be set
Scenario: Complete execute
Given I have a plan in execute phase with processing state
When I complete execute
Then the lifecycle plan processing state should be "complete"
And the execute completed timestamp should be set
Scenario: Cannot start execute outside execute phase
Given I have a plan in strategize phase with complete state
When I try to start execute
Then a plan error should be raised
Scenario: Cannot start execute when not queued
Given I have a plan in execute phase with complete state
When I try to start execute
Then a plan not ready error should be raised
Scenario: Cannot complete execute outside execute phase
Given I have a plan in strategize phase with complete state
When I try to complete execute
Then a plan error should be raised
Scenario: Cannot complete execute when not processing
Given I have a plan in execute phase with queued state
When I try to complete execute
Then a plan error should be raised
Scenario: Fail execute
Given I have a plan in execute phase with processing state
When execute fails with error "Execution failed"
Then the lifecycle plan processing state should be "errored"
And the lifecycle plan error message should be "Execution failed"
# Apply Phase Transition Tests
Scenario: Apply plan transitions from Execute to Apply
Given I have a plan in execute phase with complete state
When I lifecycle apply the plan
Then the lifecycle plan phase should be "apply"
And the lifecycle plan processing state should be "queued"
Scenario: Cannot apply plan that is not complete
Given I have a plan in execute phase with processing state
When I try to lifecycle apply the plan
Then a plan not ready error should be raised
Scenario: Complete apply transitions to applied processing state (terminal)
Given I have a plan in apply phase with processing state
When I complete apply
Then the lifecycle plan phase should be "apply"
And the lifecycle plan processing state should be "applied"
And the applied timestamp should be set
And the plan should be terminal
Scenario: Cannot start apply outside apply phase
Given I have a plan in execute phase with complete state
When I try to start apply
Then a plan error should be raised
Scenario: Cannot start apply when not queued
Given I have a plan in apply phase with processing state
When I try to start apply
Then a plan not ready error should be raised
Scenario: Cannot complete apply outside apply phase
Given I have a plan in execute phase with complete state
When I try to complete apply
Then a plan error should be raised
Scenario: Cannot complete apply when not processing
Given I have a plan in apply phase with queued state
When I try to complete apply
Then a plan error should be raised
Scenario: Fail apply
Given I have a plan in apply phase with processing state
When apply fails with error "Apply failed"
Then the lifecycle plan processing state should be "errored"
And the lifecycle plan error message should be "Apply failed"
# Invalid Transition Tests
Scenario: Cannot apply plan in Strategize phase
Given I have a plan in strategize phase with complete state
When I try to lifecycle apply the plan
Then an invalid phase transition error should be raised
Scenario: Invalid phase transition error accepts custom message
When I create an invalid phase transition error from "strategize" to "execute" with message "Custom transition message"
Then the invalid phase transition error should include message "Custom transition message"
And the invalid transition error should reference from phase "strategize" and to phase "execute"
# Cancel Tests
Scenario: Cancel plan in Strategize phase
Given I have a plan in strategize phase with processing state
When I cancel the plan with reason "User requested cancellation"
Then the lifecycle plan processing state should be "cancelled"
And the lifecycle plan error message should be "User requested cancellation"
Scenario: Cannot cancel terminal plan
Given I have a plan in terminal applied state
When I try to cancel the plan
Then a plan error should be raised
# List Plans Tests
Scenario: List plans by phase
Given I have plans in different phases
When I list plans in execute phase
Then I should see only execute phase plans
Scenario: List plans by project
Given I have plans for different projects
When I list plans for project "project-123"
Then I should see only plans for that project
Scenario: List plans by namespace
Given I have plans in different namespaces
When I list plans in namespace "local"
Then I should see 1 plan