Feature: Plan CLI supports only V3 commands (legacy commands removed)

    Background:
        Given CLI environment is ready for plan command tests

    Scenario: Help output shows only V3 commands
        When I invoke "--help" on plan app
        Then the help contains "use"
        And the help contains "execute"
        And the help contains "apply"
        And the help contains "status"
        And the help contains "list"
        And the help contains "errors"

    Scenario: V3 command group is clearly labeled
        When I invoke "--help" on plan app
        Then the help contains "V3"
        And the help contains "Plan Lifecycle"

    Scenario: Legacy command tell is not available
        When I invoke "tell --help" on plan app
        Then the command fails with exit code non-zero

    Scenario: Legacy command build is not available
        When I invoke "build --help" on plan app
        Then the command fails with exit code non-zero

    Scenario: Legacy command new is not available
        When I invoke "new --help" on plan app
        Then the command fails with exit code non-zero

    Scenario: Legacy command current is not available
        When I invoke "current --help" on plan app
        Then the command fails with exit code non-zero

    Scenario: Legacy command cd is not available
        When I invoke "cd --help" on plan app
        Then the command fails with exit code non-zero

    Scenario: Legacy command continue is not available
        When I invoke "continue --help" on plan app
        Then the command fails with exit code non-zero

    Scenario: CLI runner initialization preserves state across commands
        When I invoke "--help" on plan app
        And I invoke "--help" on plan app again
        Then both invocations should have consistent help output
        And the context should not leak state between invocations

    Scenario: CLI environment handles missing subcommand gracefully
        When I invoke "" on plan app
        Then the command fails with exit code non-zero
        And the output contains help information

    Scenario: V3 commands are correctly registered in app
        When I invoke "--help" on plan app
        Then the help output should contain complete command list
        And the help output should not contain deprecated command references

    Scenario: CLI resource cleanup after failed commands
        Given CLI environment is ready for plan command tests
        When I invoke "nonexistent-command" on plan app
        Then the command fails with exit code non-zero
        And the CLI runner should be in a valid state for next command
        When I invoke "--help" on plan app
        Then the help output should be available

    Scenario: Repeated command invocations maintain consistency
        Given CLI environment is ready for plan command tests
        When I invoke "--help" on plan app
        And I invoke "--help" on plan app again
        When I invoke "--help" on plan app again
        Then all invocations should have identical output
        And the context state should remain clean

     Scenario: Failed command does not corrupt context state
         Given CLI environment is ready for plan command tests
         When I invoke "--help" on plan app
         And I save the help output for comparison
         And I invoke "invalid-plan-id" on plan app
         Then the command fails with exit code non-zero
         When I invoke "--help" on plan app
         Then the help output should match the saved output

    Scenario: ULID validation rejects legacy plan names
         When I validate plan ID "my-legacy-plan" as ULID
         Then validation should fail with legacy workflow message

    Scenario: ULID validation accepts valid ULID identifiers
         When I validate plan ID "01HXM8C2ZK4Q7C2B3F2R4VYV6J" as ULID
         Then validation should succeed with original plan ID returned

    Scenario: Actor name validation requires namespace/name format
         When I validate actor name "invalid-actor" as namespaced
         Then validation should fail with actor format message

    Scenario: Actor name validation accepts openai/gpt-4 format
         When I validate actor name "openai/gpt-4" as namespaced
         Then validation should succeed with original actor name returned

    Scenario: Actor name validation accepts local/custom-actor format
         When I validate actor name "local/custom-actor" as namespaced
         Then validation should succeed with original actor name returned

    Scenario: Relative time formatting shows current timestamp as "just now"
         When I format current timestamp as relative time
         Then formatted time should be "just now"

    Scenario: Relative time formatting shows hours ago correctly
         When I format timestamp from 3 hours ago as relative time
         Then formatted time should contain "hour"
         And formatted time should contain "ago"

    Scenario: Relative time formatting shows days ago correctly
         When I format timestamp from 5 days ago as relative time
         Then formatted time should contain "day"
         And formatted time should contain "ago"

    Scenario: Multiple validation errors maintain CLI runner state
         When I invoke an invalid plan command "execute not-a-ulid"
         Then the command should fail
         And I invoke another invalid command "apply another-invalid"
         Then that command should also fail
         And the CLI runner should remain functional

    Scenario: Decision label generation for root decisions
         When I generate decision label for type "prompt_definition" with ordinal 0
         Then the label should be "Root"

    Scenario: Decision label generation for strategy choices
         When I generate decision label for type "strategy_choice" with ordinal 0
         Then the label should be "Strategy"

    Scenario: Decision label generation for invariant decisions
         When I generate decision label for type "invariant_enforced" with ordinal 1
         Then the label should be "Invariant 1"

    Scenario: Decision label generation for multiple invariants
         When I generate decision label for type "invariant_enforced" with ordinal 3
         Then the label should be "Invariant 3"

    Scenario: Decision label generation for subplan spawning
         When I generate decision label for type "subplan_spawn" with ordinal 1
         Then the label should be "Spawn 1"

    Scenario: Decision label generation for parallel subplan spawning
         When I generate decision label for type "subplan_parallel_spawn" with ordinal 2
         Then the label should be "Parallel 2"

    Scenario: Decision label generation for implementation choices
         When I generate decision label for type "implementation_choice" with ordinal 0
         Then the label should be "Implementation"

    Scenario: Decision label generation for unknown decision types
         When I generate decision label for type "unknown_type" with ordinal 0
         Then the label should be "unknown_type"

    Scenario: ULID validation rejects empty string
         When I validate plan ID "" as ULID
         Then validation should fail with legacy workflow message

    Scenario: ULID validation rejects whitespace-only string
         When I validate plan ID "   " as ULID
         Then validation should fail with legacy workflow message

    Scenario: ULID validation rejects too-short identifiers
         When I validate plan ID "01HXM8C" as ULID
         Then validation should fail with legacy workflow message

    Scenario: ULID validation rejects identifiers with invalid characters
         When I validate plan ID "01HXM8C2ZK4Q7C2B3F2R4VYV6@" as ULID
         Then validation should fail with legacy workflow message

    Scenario: Actor name validation rejects empty string
         When I validate actor name "" as namespaced
         Then validation should fail with actor format message

    Scenario: Actor name validation rejects name with only slash
         When I validate actor name "/" as namespaced
         Then validation should fail with actor format message

    Scenario: Actor name validation rejects uppercase in namespace
         When I validate actor name "OpenAI/gpt-4" as namespaced
         Then validation should fail with actor format message

    Scenario: Actor name validation rejects spaces in actor name
         When I validate actor name "openai/gpt 4" as namespaced
         Then validation should fail with actor format message

    Scenario: Relative time formatting handles 1 minute ago
         When I format timestamp from 1 minute ago as relative time
         Then formatted time should be "1 minute ago"

    Scenario: Relative time formatting handles 2 minutes ago
         When I format timestamp from 2 minutes ago as relative time
         Then formatted time should be "2 minutes ago"

    Scenario: Relative time formatting handles 1 hour ago
         When I format timestamp from 1 hour ago as relative time
         Then formatted time should be "1 hour ago"

    Scenario: Relative time formatting handles 2 hours ago
         When I format timestamp from 2 hours ago as relative time
         Then formatted time should be "2 hours ago"

    Scenario: Relative time formatting handles 1 day ago
         When I format timestamp from 1 day ago as relative time
         Then formatted time should be "1 day ago"

    Scenario: Relative time formatting handles 2 days ago
         When I format timestamp from 2 days ago as relative time
         Then formatted time should be "2 days ago"

    Scenario: Relative time formatting handles very old timestamps
         When I format timestamp from 365 days ago as relative time
         Then formatted time should contain "365"
         And formatted time should contain "day"

    Scenario: ULID validation provides helpful error message for human-readable names
         When I validate plan ID "my-plan" as ULID
         Then validation error should mention "v3 plan lifecycle"
         And validation error should mention "ULID"

    Scenario: Actor validation provides helpful error message format requirements
         When I validate actor name "missing-slash" as namespaced
         Then validation error should mention "namespace/name"

    Scenario: CLI runner state after consecutive failed validations
         When I attempt multiple actor validations
         Then all validations should fail appropriately
         And the validation context should remain clean
