Feature: Actor YAML schema validation
  As a CleverAgents v3 user
  I want to define actors via YAML configuration files
  So that I can create validated, reusable actor workflows

  # ────────────────────────────────────────────────────────────
  # Valid LLM Actor scenarios
  # ────────────────────────────────────────────────────────────

  Scenario: Load a minimal valid LLM actor
    Given an actor YAML string with minimal LLM configuration
    When I validate the actor schema
    Then the actor schema validation should succeed
    And the actor config name should be "assistants/simple"
    And the actor config type should be "llm"
    And the actor config model should be "gpt-4"

  Scenario: Load LLM actor with system prompt
    Given an actor YAML string with LLM and system prompt
    When I validate the actor schema
    Then the actor schema validation should succeed
    And the actor config system_prompt should contain "expert"

  Scenario: Load LLM actor with tools
    Given an actor YAML string with LLM and tools
    When I validate the actor schema
    Then the actor schema validation should succeed
    And the actor config should have 2 tools

  Scenario: Load LLM actor with memory config
    Given an actor YAML string with memory configuration
    When I validate the actor schema
    Then the actor schema validation should succeed
    And the actor memory enabled should be true
    And the actor memory max_messages should be 50

  Scenario: Load LLM actor with context config
    Given an actor YAML string with context configuration
    When I validate the actor schema
    Then the actor schema validation should succeed
    And the actor context should include 2 files
    And the actor context should include 1 directory

  Scenario: Load simple_llm.yaml example
    Given the actor YAML file "examples/actors/simple_llm.yaml"
    When I validate the actor schema from file
    Then the actor schema validation should succeed
    And the actor config type should be "llm"

  Scenario: Load llm_with_tools.yaml example
    Given the actor YAML file "examples/actors/llm_with_tools.yaml"
    When I validate the actor schema from file
    Then the actor schema validation should succeed
    And the actor config should have at least 2 tools

  Scenario: Load estimator.yaml example
    Given the actor YAML file "examples/actors/estimator.yaml"
    When I validate the actor schema from file
    Then the actor schema validation should succeed
    And the actor config type should be "llm"
    And the actor context_view should be "strategist"
    And the actor role_hint should be "estimation"
    And the actor response_format title should be "EstimationReport"
    And the actor response_format should include key "required"
    And the actor response_format should include key "properties"
    And the actor config should have 2 tools
    And the actor config should have 1 skills

  Scenario: Reject actor with response_format missing type
    Given an actor YAML string with invalid response_format missing type
    When I validate the actor schema
    Then the actor schema validation should fail
    And the validation error should contain "response_format.type"

  Scenario: Reject actor with invalid role_hint value
    Given an actor YAML string with invalid role_hint
    When I validate the actor schema
    Then the actor schema validation should fail
    And the validation error should contain "role_hint"

  Scenario: Reject actor with non-dict response_format
    Given an actor YAML string with non-dict response_format
    When I validate the actor schema
    Then the actor schema validation should fail
    And the validation error should contain "response_format"

  Scenario: actor_role_warnings on ActorConfigSchema warns on context_view mismatch
    Given an ActorConfigSchema estimation actor with executor context_view
    When I evaluate actor_role_warnings for the actor model
    Then actor role warnings should include "context_view"

  Scenario: actor_role_warnings on ActorConfigSchema warns on missing response_format
    Given an ActorConfigSchema estimation actor without response_format
    When I evaluate actor_role_warnings for the actor model
    Then actor role warnings should include "response_format"

  Scenario: actor_role_warnings warns when estimation context_view is unrecognized
    Given an estimation actor payload with unrecognized context_view
    When I evaluate actor_role_warnings for the actor payload
    Then actor role warnings should include "context_view"

  Scenario: actor_role_warnings accepts uppercase role_hint for estimation
    Given an estimation actor payload with uppercase role_hint
    When I evaluate actor_role_warnings for the actor payload
    Then actor role warnings should include "response_format"

  # ────────────────────────────────────────────────────────────
  # Valid TOOL Actor scenarios
  # ────────────────────────────────────────────────────────────

  Scenario: Load a minimal valid TOOL actor
    Given an actor YAML string with TOOL type and tools
    When I validate the actor schema
    Then the actor schema validation should succeed
    And the actor config type should be "tool"
    And the actor config should have at least 1 tool

  Scenario: Load TOOL actor with inline tool definition
    Given an actor YAML string with inline tool definition
    When I validate the actor schema
    Then the actor schema validation should succeed
    And the actor config should have 1 inline tool

  Scenario: Load tool_collection.yaml example
    Given the actor YAML file "examples/actors/tool_collection.yaml"
    When I validate the actor schema from file
    Then the actor schema validation should succeed
    And the actor config type should be "tool"

  # ────────────────────────────────────────────────────────────
  # Valid GRAPH Actor scenarios
  # ────────────────────────────────────────────────────────────

  Scenario: Load a minimal valid GRAPH actor
    Given an actor YAML string with minimal GRAPH configuration
    When I validate the actor schema
    Then the actor schema validation should succeed
    And the actor config type should be "graph"
    And the actor route should have entry_node "start"

  Scenario: Load GRAPH with linear topology
    Given an actor YAML string with linear graph topology
    When I validate the actor schema
    Then the actor schema validation should succeed
    And the actor route should have 3 nodes
    And the actor route should have 2 edges

  Scenario: Load GRAPH with conditional routing
    Given an actor YAML string with conditional routing
    When I validate the actor schema
    Then the actor schema validation should succeed
    And the actor route should have 1 conditional node

  Scenario: Load GRAPH with subgraph node
    Given an actor YAML string with subgraph node
    When I validate the actor schema
    Then the actor schema validation should succeed
    And the actor route should have 1 subgraph node

  Scenario: Load simple_graph.yaml example
    Given the actor YAML file "examples/actors/simple_graph.yaml"
    When I validate the actor schema from file
    Then the actor schema validation should succeed
    And the actor config type should be "graph"

  Scenario: Load graph_workflow.yaml example
    Given the actor YAML file "examples/actors/graph_workflow.yaml"
    When I validate the actor schema from file
    Then the actor schema validation should succeed
    And the actor config type should be "graph"

  # ────────────────────────────────────────────────────────────
  # Invalid Actor Name scenarios
  # ────────────────────────────────────────────────────────────

  Scenario: Reject actor without namespace
    Given an actor YAML string with name "simple_actor"
    When I validate the actor schema
    Then the actor schema validation should fail
    And the validation error should contain "namespaced"

  Scenario: Reject actor with multiple slashes
    Given an actor YAML string with name "namespace/sub/actor"
    When I validate the actor schema
    Then the actor schema validation should fail
    And the validation error should contain "namespaced"

  Scenario: Reject actor with empty namespace
    Given an actor YAML string with name "/actor"
    When I validate the actor schema
    Then the actor schema validation should fail
    And the validation error should contain "namespaced"

  Scenario: Reject actor with empty name
    Given an actor YAML string with name "namespace/"
    When I validate the actor schema
    Then the actor schema validation should fail
    And the validation error should contain "namespaced"

  Scenario: Accept actor with server-qualified name
    Given an actor YAML string with name "dev:freemo/custom-analysis"
    When I validate the actor schema
    Then the actor schema validation should succeed

  Scenario: Accept actor with server-qualified name using cleverthis server
    Given an actor YAML string with name "cleverthis:local/my-actor"
    When I validate the actor schema
    Then the actor schema validation should succeed

  Scenario: Reject actor with server-qualified name but multiple slashes
    Given an actor YAML string with name "dev:namespace/sub/actor"
    When I validate the actor schema
    Then the actor schema validation should fail
    And the validation error should contain "namespaced"

  Scenario: Reject actor with empty server prefix
    Given an actor YAML string with name ":namespace/name"
    When I validate the actor schema
    Then the actor schema validation should fail
    And the validation error should contain "empty server prefix"

  Scenario: Reject actor with server prefix but no namespace slash
    Given an actor YAML string with name "dev/server:name"
    When I validate the actor schema
    Then the actor schema validation should fail
    And the validation error should contain "namespace/name after server prefix"

  # ────────────────────────────────────────────────────────────
  # Invalid LLM Actor scenarios
  # ────────────────────────────────────────────────────────────

  Scenario: Reject LLM actor without model
    Given an actor YAML string with LLM type but no model
    When I validate the actor schema
    Then the actor schema validation should fail
    And the validation error should contain "require 'model'"

  # ────────────────────────────────────────────────────────────
  # Invalid TOOL Actor scenarios
  # ────────────────────────────────────────────────────────────

  Scenario: Reject TOOL actor without tools
    Given an actor YAML string with TOOL type but no tools
    When I validate the actor schema
    Then the actor schema validation should fail
    And the validation error should contain "require at least one tool"

  Scenario: Reject TOOL actor with empty tools list
    Given an actor YAML string with TOOL type and empty tools
    When I validate the actor schema
    Then the actor schema validation should fail
    And the validation error should contain "require at least one tool"

  # ────────────────────────────────────────────────────────────
  # Invalid GRAPH Actor scenarios
  # ────────────────────────────────────────────────────────────

  Scenario: Reject GRAPH actor without model
    Given an actor YAML string with GRAPH type but no model
    When I validate the actor schema
    Then the actor schema validation should fail
    And the validation error should contain "require 'model'"

  Scenario: Reject GRAPH actor without route
    Given an actor YAML string with GRAPH type but no route
    When I validate the actor schema
    Then the actor schema validation should fail
    And the validation error should contain "require 'route'"

  # ────────────────────────────────────────────────────────────
  # Graph Topology Validation scenarios
  # ────────────────────────────────────────────────────────────

  Scenario: Reject graph with duplicate node IDs
    Given an actor YAML string with duplicate node IDs
    When I validate the actor schema
    Then the actor schema validation should fail
    And the validation error should contain "Duplicate node IDs"

  Scenario: Reject graph with invalid entry node
    Given an actor YAML string with non-existent entry node
    When I validate the actor schema
    Then the actor schema validation should fail
    And the validation error should contain "Entry node"
    And the validation error should contain "not found"

  Scenario: Reject graph with invalid exit node
    Given an actor YAML string with non-existent exit node
    When I validate the actor schema
    Then the actor schema validation should fail
    And the validation error should contain "Exit node"
    And the validation error should contain "not found"

  Scenario: Reject graph with invalid edge from_node
    Given an actor YAML string with invalid edge from_node
    When I validate the actor schema
    Then the actor schema validation should fail
    And the validation error should contain "from_node"
    And the validation error should contain "not found"

  Scenario: Reject graph with invalid edge to_node
    Given an actor YAML string with invalid edge to_node
    When I validate the actor schema
    Then the actor schema validation should fail
    And the validation error should contain "to_node"
    And the validation error should contain "not found"

  Scenario: Reject graph with cycles
    Given an actor YAML string with cyclic graph
    When I validate the actor schema
    Then the actor schema validation should fail
    And the validation error should contain "cycle"

  Scenario: Reject graph with unreachable nodes
    Given an actor YAML string with unreachable node
    When I validate the actor schema
    Then the actor schema validation should fail
    And the validation error should contain "unreachable"
    And the validation error should contain "entry node"

  # ────────────────────────────────────────────────────────────
  # Tool Definition Validation scenarios
  # ────────────────────────────────────────────────────────────

  Scenario: Reject inline tool without namespace
    Given an actor YAML string with inline tool name "count_lines"
    When I validate the actor schema
    Then the actor schema validation should fail
    And the validation error should contain "namespaced"

  Scenario: Reject inline tool with invalid parameter name
    Given an actor YAML string with invalid tool parameter name
    When I validate the actor schema
    Then the actor schema validation should fail
    And the validation error should contain "valid Python identifier"

  # ────────────────────────────────────────────────────────────
  # Node Definition Validation scenarios
  # ────────────────────────────────────────────────────────────

  Scenario: Reject node with invalid ID format
    Given an actor YAML string with node ID containing spaces
    When I validate the actor schema
    Then the actor schema validation should fail
    And the validation error should contain "alphanumeric"

  Scenario: Accept node with underscores and hyphens
    Given an actor YAML string with node ID "node_1-test"
    When I validate the actor schema
    Then the actor schema validation should succeed

  # ────────────────────────────────────────────────────────────
  # Context View scenarios
  # ────────────────────────────────────────────────────────────

  Scenario: Load actor with strategist context view
    Given an actor YAML string with context_view "strategist"
    When I validate the actor schema
    Then the actor schema validation should succeed
    And the actor context_view should be "strategist"

  Scenario: Load actor with executor context view
    Given an actor YAML string with context_view "executor"
    When I validate the actor schema
    Then the actor schema validation should succeed
    And the actor context_view should be "executor"

  Scenario: Load actor with reviewer context view
    Given an actor YAML string with context_view "reviewer"
    When I validate the actor schema
    Then the actor schema validation should succeed
    And the actor context_view should be "reviewer"

  Scenario: Load actor with full context view
    Given an actor YAML string with context_view "full"
    When I validate the actor schema
    Then the actor schema validation should succeed
    And the actor context_view should be "full"

  # ────────────────────────────────────────────────────────────
  # Environment Variables scenarios
  # ────────────────────────────────────────────────────────────

  Scenario: Load actor with environment variables
    Given an actor YAML string with env_vars
    When I validate the actor schema
    Then the actor schema validation should succeed
    And the actor should have 2 env_vars

  # ────────────────────────────────────────────────────────────
  # YAML I/O scenarios
  # ────────────────────────────────────────────────────────────

  Scenario: Save and reload actor configuration
    Given a valid actor configuration object
    When I save the actor to YAML file
    And I reload the actor from YAML file
    Then the reloaded actor should match the original

  Scenario: Handle missing YAML file
    Given a non-existent actor YAML file path
    When I attempt to load the actor from file
    Then a FileNotFoundError should be raised

  # ────────────────────────────────────────────────────────────
  # Edge Priority scenarios
  # ────────────────────────────────────────────────────────────

  Scenario: Load graph with edge priorities
    Given an actor YAML string with edges having different priorities
    When I validate the actor schema
    Then the actor schema validation should succeed
    And the highest priority edge should be 10

  # ────────────────────────────────────────────────────────────
  # Memory Configuration scenarios
  # ────────────────────────────────────────────────────────────

  Scenario: Load actor with memory disabled
    Given an actor YAML string with memory enabled false
    When I validate the actor schema
    Then the actor schema validation should succeed
    And the actor memory enabled should be false

  Scenario: Load actor with message limit
    Given an actor YAML string with max_messages 100
    When I validate the actor schema
    Then the actor schema validation should succeed
    And the actor memory max_messages should be 100

  Scenario: Load actor with token limit
    Given an actor YAML string with max_tokens 8000
    When I validate the actor schema
    Then the actor schema validation should succeed
    And the actor memory max_tokens should be 8000

  Scenario: Load actor with summarize_old enabled
    Given an actor YAML string with summarize_old true
    When I validate the actor schema
    Then the actor schema validation should succeed
    And the actor memory summarize_old should be true
