Feature: A2A local facade coverage boost — uncovered validation paths
  As a developer maintaining the A2A local facade
  I want all error-handling and validation paths exercised
  So that edge-case regressions are caught early

  # ---------------------------------------------------------------
  # Constructor validation (line 82)
  # ---------------------------------------------------------------

  Scenario: Constructing A2aLocalFacade with a non-dict raises TypeError
    When I try to create an A2aLocalFacade with a non-dict services argument
    Then a TypeError should be raised with message "services must be a dict or None"

  # ---------------------------------------------------------------
  # plan.execute — empty plan_id with service wired (line 256)
  # ---------------------------------------------------------------

  Scenario: plan.execute with empty plan_id and wired service returns error
    Given a coverage-boost facade with a mock PlanLifecycleService
    When I dispatch coverage-boost operation "plan.execute" with params {"plan_id": ""}
    Then the coverage-boost response status should be "error"
    And the coverage-boost response error code should be "INTERNAL_ERROR"
    And the coverage-boost response error message should contain "plan_id is required"

  Scenario: plan.execute with missing plan_id param and wired service returns error
    Given a coverage-boost facade with a mock PlanLifecycleService
    When I dispatch coverage-boost operation "plan.execute" with params {}
    Then the coverage-boost response status should be "error"
    And the coverage-boost response error code should be "INTERNAL_ERROR"
    And the coverage-boost response error message should contain "plan_id is required"

  # ---------------------------------------------------------------
  # plan.status — empty plan_id with service wired (line 266)
  # ---------------------------------------------------------------

  Scenario: plan.status with empty plan_id and wired service returns error
    Given a coverage-boost facade with a mock PlanLifecycleService
    When I dispatch coverage-boost operation "plan.status" with params {"plan_id": ""}
    Then the coverage-boost response status should be "error"
    And the coverage-boost response error code should be "INTERNAL_ERROR"
    And the coverage-boost response error message should contain "plan_id is required"

  Scenario: plan.status with missing plan_id param and wired service returns error
    Given a coverage-boost facade with a mock PlanLifecycleService
    When I dispatch coverage-boost operation "plan.status" with params {}
    Then the coverage-boost response status should be "error"
    And the coverage-boost response error code should be "INTERNAL_ERROR"
    And the coverage-boost response error message should contain "plan_id is required"

  # ---------------------------------------------------------------
  # plan.diff — empty plan_id with service wired (line 281)
  # ---------------------------------------------------------------

  Scenario: plan.diff with empty plan_id and wired service returns error
    Given a coverage-boost facade with a mock PlanLifecycleService
    When I dispatch coverage-boost operation "plan.diff" with params {"plan_id": ""}
    Then the coverage-boost response status should be "error"
    And the coverage-boost response error code should be "INTERNAL_ERROR"
    And the coverage-boost response error message should contain "plan_id is required"

  Scenario: plan.diff with missing plan_id param and wired service returns error
    Given a coverage-boost facade with a mock PlanLifecycleService
    When I dispatch coverage-boost operation "plan.diff" with params {}
    Then the coverage-boost response status should be "error"
    And the coverage-boost response error code should be "INTERNAL_ERROR"
    And the coverage-boost response error message should contain "plan_id is required"

  # ---------------------------------------------------------------
  # plan.apply — empty plan_id with service wired (line 295)
  # ---------------------------------------------------------------

  Scenario: plan.apply with empty plan_id and wired service returns error
    Given a coverage-boost facade with a mock PlanLifecycleService
    When I dispatch coverage-boost operation "plan.apply" with params {"plan_id": ""}
    Then the coverage-boost response status should be "error"
    And the coverage-boost response error code should be "INTERNAL_ERROR"
    And the coverage-boost response error message should contain "plan_id is required"

  Scenario: plan.apply with missing plan_id param and wired service returns error
    Given a coverage-boost facade with a mock PlanLifecycleService
    When I dispatch coverage-boost operation "plan.apply" with params {}
    Then the coverage-boost response status should be "error"
    And the coverage-boost response error code should be "INTERNAL_ERROR"
    And the coverage-boost response error message should contain "plan_id is required"
