@domain @repository @action_repository
Feature: Plan use with action arguments does not crash on UNIQUE constraint
  As a user running 'agents plan use' on an action with arguments
  I want the plan to be created successfully without a database error
  So that the full plan lifecycle works after action create + plan use

  Background:
    Given a persisted plan lifecycle service for action args integrity tests

  # ---------------------------------------------------------------------------
  # Core bug fix: plan use with arguments that already exist
  # ---------------------------------------------------------------------------

  @tdd_issue @tdd_issue_4174
  Scenario: plan use preserves arguments registered via action create
    Given an action "local/args-test" with arguments:
      | name       | type   | requirement | default |
      | my_arg     | string | optional    | hello   |
      | count      | integer| required    |         |
    When I use the action "local/args-test" to create a plan with arguments:
      | name  | value |
      | count | 42    |
    Then the plan should be created successfully in strategize phase
    And the plan should have a valid ULID identifier

  # ---------------------------------------------------------------------------
  # Regression: actions with zero arguments still work
  # ---------------------------------------------------------------------------

  @tdd_issue @tdd_issue_4174
  Scenario: plan use succeeds when the action has zero arguments
    Given an action "local/no-args" with no arguments
    When I use the action "local/no-args" to create a plan without arguments
    Then the plan should be created successfully in strategize phase
    And the plan should have a valid ULID identifier

  # ---------------------------------------------------------------------------
  # Regression: actions with multiple arguments work
  # ---------------------------------------------------------------------------

  @tdd_issue @tdd_issue_4174
  Scenario: plan use succeeds when the action has multiple arguments
    Given an action "local/multi-args" with arguments:
      | name        | type    | requirement | default |
      | target      | string  | required    |         |
      | verbose     | boolean | optional    | true    |
      | threshold   | float   | optional    | 0.8     |
    When I use the action "local/multi-args" to create a plan with arguments:
      | name   | value  |
      | target | src/   |
    Then the plan should be created successfully in strategize phase

  # ---------------------------------------------------------------------------
  # Regression: running plan use twice on the same action does not crash
  # ---------------------------------------------------------------------------

  @tdd_issue @tdd_issue_4174
  Scenario: plan use twice on the same reusable action does not crash
    Given an action "local/reuse-test" with arguments:
      | name    | type   | requirement | default |
      | my_arg  | string | optional    | world   |
    When I use the action "local/reuse-test" to create a plan without arguments
    And I use the action "local/reuse-test" to create a second plan without arguments
    Then both plans should be created successfully

  # ---------------------------------------------------------------------------
  # Core bug path: archive non-reusable action (triggers repository update)
  # ---------------------------------------------------------------------------

  @tdd_issue @tdd_issue_4174
  Scenario: plan use archives a non-reusable action with arguments and invariants
    Given invariants for the next action:
      | text                              |
      | Plans must log archival outcomes. |
    And a non-reusable action "local/non-reuse" with arguments:
      | name     | type   | requirement | default |
      | payload  | string | required    |         |
      | retries  | integer| optional    | 3       |
    When I use the action "local/non-reuse" to create a plan with arguments:
      | name    | value |
      | payload | data  |
    Then the plan should be created successfully in strategize phase
    And the action "local/non-reuse" should still have 2 argument(s)
    And the action "local/non-reuse" should still have 1 invariant(s)

  # ---------------------------------------------------------------------------
  # ActionRepository.update upserts arguments without IntegrityError
  # ---------------------------------------------------------------------------

  @tdd_issue @tdd_issue_4174
  Scenario: Updating an action with existing arguments does not raise IntegrityError
    Given invariants for the next action:
      | text                                |
      | Persisted actions must remain valid. |
    Given an action "local/update-args" with arguments:
      | name    | type   | requirement | default |
      | my_arg  | string | optional    | hello   |
    When the action "local/update-args" is updated through the repository
    Then the repository should not raise an integrity error
    And the action "local/update-args" should still have 1 argument(s)
    And the action "local/update-args" should still have 1 invariant(s)
