Feature: PlanExecutor edge-case coverage for checkpoint, rollback, and sandbox proxy paths
  As a developer
  I want tests that exercise the remaining uncovered lines and branches in plan_executor.py
  So that line 378, lines 410-411, and checkpoint-related branches reach full coverage

  # Targets:
  #   - Line 378 / branch 377→378:  _try_rollback_to_last_checkpoint with non-empty checkpoints
  #   - Lines 410-411:              _resolve_sandbox_for_checkpoint falling through to _SandboxRootProxy
  #   - Lines 161-163 / branches 160→161, 162→163/164: _parse_steps non-empty path via run_strategize
  #   - Lines 417-419:              run_strategize function definition exercised

  # ------------------------------------------------------------------
  # _resolve_sandbox_for_checkpoint → _SandboxRootProxy path
  # ------------------------------------------------------------------

  Scenario: Resolve sandbox returns SandboxRootProxy when only sandbox_root is set
    Given an edge3 PlanExecutor with checkpoint manager and sandbox root but no execution context
    When I edge3 resolve sandbox for checkpoint with plan id "EDGE3PLAN01"
    Then the edge3 resolved sandbox should not be None
    And the edge3 resolved sandbox should have a synthetic sandbox id
    And the edge3 resolved sandbox context should have the sandbox path

  Scenario: Resolve sandbox returns SandboxRootProxy when execution context has no sandbox manager
    Given an edge3 PlanExecutor with checkpoint manager and sandbox root and context without sandbox manager
    When I edge3 resolve sandbox for checkpoint with plan id "EDGE3PLAN02"
    Then the edge3 resolved sandbox should not be None
    And the edge3 resolved sandbox should have a synthetic sandbox id

  Scenario: Resolve sandbox returns SandboxRootProxy when sandbox manager returns empty list
    Given an edge3 PlanExecutor with checkpoint manager and sandbox root and context with empty sandboxes
    When I edge3 resolve sandbox for checkpoint with plan id "EDGE3PLAN03"
    Then the edge3 resolved sandbox should not be None
    And the edge3 resolved sandbox should have a synthetic sandbox id

  Scenario: Resolve sandbox returns None when no sandbox root and no execution context
    Given an edge3 PlanExecutor with checkpoint manager but no sandbox root and no execution context
    When I edge3 resolve sandbox for checkpoint with plan id "EDGE3PLAN04"
    Then the edge3 resolved sandbox should be None

  # ------------------------------------------------------------------
  # _try_rollback_to_last_checkpoint with non-empty checkpoints
  # ------------------------------------------------------------------

  Scenario: Rollback succeeds when checkpoint manager has checkpoints for sandbox root
    Given an edge3 PlanExecutor with checkpoint manager and sandbox root but no execution context
    And the edge3 checkpoint manager has existing checkpoints that rollback successfully
    When I edge3 try rollback to last checkpoint for plan "EDGE3PLANRB"
    Then the edge3 rollback result should be True

  Scenario: Rollback returns False when rollback_to raises an exception
    Given an edge3 PlanExecutor with checkpoint manager and sandbox root but no execution context
    And the edge3 checkpoint manager has checkpoints but rollback raises an exception
    When I edge3 try rollback to last checkpoint for plan "EDGE3PLANRF"
    Then the edge3 rollback result should be False

  Scenario: Rollback returns False when checkpoint manager lists no checkpoints
    Given an edge3 PlanExecutor with checkpoint manager and sandbox root but no execution context
    And the edge3 checkpoint manager returns no checkpoints
    When I edge3 try rollback to last checkpoint for plan "EDGE3PLANRE"
    Then the edge3 rollback result should be False

  # ------------------------------------------------------------------
  # _try_create_checkpoint via _SandboxRootProxy
  # ------------------------------------------------------------------

  Scenario: Create checkpoint succeeds through SandboxRootProxy path
    Given an edge3 PlanExecutor with checkpoint manager and sandbox root but no execution context
    And the edge3 checkpoint manager accepts checkpoint creation
    When I edge3 try create checkpoint for plan "EDGE3PLANCP" with phase "pre_execute"
    Then the edge3 checkpoint result should not be None
    And the edge3 checkpoint manager should have been called with sandbox path metadata

  Scenario: Create checkpoint returns None when creation raises exception through proxy
    Given an edge3 PlanExecutor with checkpoint manager and sandbox root but no execution context
    And the edge3 checkpoint manager raises on create_checkpoint
    When I edge3 try create checkpoint for plan "EDGE3PLANCF" with phase "pre_execute"
    Then the edge3 checkpoint result should be None

  # ------------------------------------------------------------------
  # Stub execute with checkpoint rollback on failure
  # ------------------------------------------------------------------

  Scenario: Stub execute failure triggers rollback with sandbox root proxy and existing checkpoints
    Given an edge3 mock lifecycle service for execute
    And an edge3 plan in Execute-Queued state with decision root
    And an edge3 PlanExecutor with checkpoint manager sandbox root and failing execute actor
    And the edge3 checkpoint manager has existing checkpoints that rollback successfully
    When I edge3 call run execute expecting failure
    Then an edge3 exception should have been raised
    And the edge3 checkpoint manager rollback_to should have been called
    And the edge3 lifecycle should have called fail_execute for edge3

  # ------------------------------------------------------------------
  # Runtime execute with checkpoint rollback on failure
  # ------------------------------------------------------------------

  Scenario: Runtime execute failure triggers rollback with sandbox root proxy
    Given an edge3 mock lifecycle service for execute
    And an edge3 mock execution context for runtime
    And an edge3 plan in Execute-Queued state with decision root
    And an edge3 PlanExecutor with runtime context checkpoint manager sandbox root and failing runtime actor
    And the edge3 checkpoint manager has existing checkpoints that rollback successfully
    When I edge3 call run execute expecting failure
    Then an edge3 exception should have been raised
    And the edge3 checkpoint manager rollback_to should have been called

  # ------------------------------------------------------------------
  # _parse_steps non-empty path exercised via run_strategize
  # ------------------------------------------------------------------

  Scenario: Run strategize exercises _parse_steps with multi-line definition
    Given an edge3 mock lifecycle service for strategize
    And an edge3 plan in Strategize phase with multi-line definition "- Build feature\n- Add tests\n- Deploy"
    And an edge3 PlanExecutor for strategize without execution context
    When I edge3 call run strategize successfully
    Then the edge3 strategize result should have 3 decisions
    And the edge3 lifecycle should have called complete_strategize for edge3

  Scenario: Run strategize exercises _parse_steps with numbered definition
    Given an edge3 mock lifecycle service for strategize
    And an edge3 plan in Strategize phase with multi-line definition "1. First task\n2. Second task"
    And an edge3 PlanExecutor for strategize without execution context
    When I edge3 call run strategize successfully
    Then the edge3 strategize result should have 2 decisions

  Scenario: Run strategize with empty definition falls back to default step
    Given an edge3 mock lifecycle service for strategize
    And an edge3 plan in Strategize phase with empty definition
    And an edge3 PlanExecutor for strategize without execution context
    When I edge3 call run strategize successfully
    Then the edge3 strategize result should have 1 decisions

  # ------------------------------------------------------------------
  # Stub execute with checkpoint creation and sandbox root proxy
  # ------------------------------------------------------------------

  Scenario: Successful stub execute creates pre and post checkpoints via sandbox root proxy
    Given an edge3 mock lifecycle service for execute
    And an edge3 plan in Execute-Queued state with decision root
    And an edge3 PlanExecutor with checkpoint manager and sandbox root for stub execute
    And the edge3 checkpoint manager accepts checkpoint creation
    When I edge3 call run execute successfully
    Then the edge3 execute result should be an ExecuteResult
    And the edge3 checkpoint manager create_checkpoint should have been called at least twice
