@tdd_issue @tdd_issue_4466
Feature: ActorRegistry.add() accepts spec-compliant actor YAML formats
  As a developer following the specification
  I want the actor registry to accept YAML using the actors: map format
  So that spec-compliant actor definitions can be registered without error

  Background:
    Given a spec-yaml actor registry with no providers

  # ── actors: map with combined actor field ──────────────────────────

  Scenario: registry.add() accepts spec-compliant actors: map with combined actor field
    When I add a spec-compliant YAML with actors map and combined actor field
    Then the actor should be registered with provider "openai" and model "gpt-4"
    And the registered actor name should be "local/my-assistant"
    And the registered actor should exist in the actor service

  @tdd_issue @tdd_issue_4300
  Scenario: registry.add() accepts spec-compliant actors: map with separate provider and model
    When I add a spec-compliant YAML with actors map and separate provider model
    Then the actor should be registered with provider "anthropic" and model "claude-3"
    And the registered actor should exist in the actor service

  @tdd_issue @tdd_issue_4321 @tdd_issue_4300
  Scenario: registry.add() with nested-only type extracts provider/model from nested config
    When I add a YAML with type only in nested actors map and provider/model in nested config
    Then the actor should be registered with provider "custom" and model "fpga-model"
    And the registered actor name should be "local/fpga-strategist"
    And the registered actor should exist in the actor service

  # ── actors: map with unsafe flag ───────────────────────────────────

  Scenario: registry.add() preserves unsafe flag from nested spec-compliant config
    When I add a spec-compliant YAML with actors map and unsafe flag
    Then the actor should be registered with provider "openai" and model "gpt-4"
    And the registered actor should be marked unsafe
    And the registered actor should exist in the actor service

  # ── agents: map (legacy) still works ───────────────────────────────

  Scenario: registry.add() continues to accept legacy agents: map format
    When I add a YAML with legacy agents map format
    Then the actor should be registered with provider "openai" and model "gpt-4o"

  # ── Top-level provider/model still works ───────────────────────────

  Scenario: registry.add() continues to accept top-level provider and model
    When I add a YAML with top-level provider and model fields
    Then the actor should be registered with provider "openai" and model "gpt-4"
    And the registered actor should not be marked unsafe

  # ── Partial top-level + nested fallback ────────────────────────────

  Scenario: registry.add() with top-level provider only extracts model from nested actors map
    When I add a YAML with top-level provider only and model in nested actors map
    Then the actor should be registered with provider "top-level-provider" and model "nested-model"
    And the registered actor should exist in the actor service

  Scenario: registry.add() with top-level model only extracts provider from nested actors map
    When I add a YAML with top-level model only and provider in nested actors map
    Then the actor should be registered with provider "nested-provider" and model "top-level-model"
    And the registered actor should exist in the actor service

  # ── Top-level provider+model still picks up nested unsafe ───────────

  Scenario: registry.add() with top-level provider and model detects nested unsafe flag
    When I add a YAML with top-level provider and model and nested actors map with unsafe flag
    Then the actor should be registered with provider "openai" and model "gpt-4"
    And the registered actor should be marked unsafe

  # ── Unsafe confirmation gate ───────────────────────────────────────

  Scenario: registry.add() rejects unsafe actor without confirmation
    When I attempt to add an unsafe YAML without the unsafe flag
    Then a spec-yaml ValidationError should be raised containing "unsafe"

  Scenario: registry.add() accepts unsafe actor with unsafe flag
    When I add an unsafe YAML with the unsafe flag set
    Then the actor should be registered with provider "openai" and model "gpt-4"
    And the registered actor should be marked unsafe
    And the registered actor should exist in the actor service

  Scenario: registry.add() accepts unsafe actor with allow_unsafe flag
    When I add an unsafe YAML with the allow_unsafe flag set
    Then the actor should be registered with provider "openai" and model "gpt-4"
    And the registered actor should be marked unsafe
    And the registered actor should exist in the actor service

  Scenario: registry.add() with allow_unsafe=True on non-unsafe YAML does not mark actor unsafe
    When I add a non-unsafe YAML with allow_unsafe flag set
    Then the actor should be registered with provider "openai" and model "gpt-4"
    And the registered actor should not be marked unsafe

  # ── update=True path ───────────────────────────────────────────────

  Scenario: registry.add() with update=True overwrites an existing actor using spec-compliant YAML
    When I add a spec-compliant YAML with actors map and combined actor field
    And I add the same actor again with update=True and provider "anthropic" and model "claude-3"
    Then the actor should be registered with provider "anthropic" and model "claude-3"
    And the registered actor should exist in the actor service

  Scenario: registry.add() without update=True raises when actor already exists
    When I add a spec-compliant YAML with actors map and combined actor field
    And I attempt to add the same actor again without update=True
    Then a spec-yaml ValidationError should be raised containing "already exists"

  # ── schema_version and compiled_metadata parameters ────────────────

  Scenario: registry.add() forwards schema_version and compiled_metadata to upsert_actor
    When I add a spec-compliant YAML with schema_version "2.0" and compiled_metadata
    Then the actor should be registered with provider "openai" and model "gpt-4"
    And the registered actor schema version should be "2.0"
    And the registered actor compiled metadata should contain key "key"

  # ── registry.add() rejects YAML without a name field ────────────────

  Scenario: registry.add() rejects YAML without a name field
    When I attempt to add a YAML without a name field
    Then a spec-yaml ValidationError should be raised containing "name"

  # ── Top-level unsafe: true in add() ─────────────────────────────────

  Scenario: registry.add() rejects top-level unsafe YAML without confirmation
    When I attempt to add a YAML with top-level unsafe true and no flag
    Then a spec-yaml ValidationError should be raised containing "unsafe"

  Scenario: registry.add() accepts top-level unsafe YAML with unsafe flag
    When I add a YAML with top-level unsafe true and the unsafe flag set
    Then the actor should be registered with provider "openai" and model "gpt-4"
    And the registered actor should be marked unsafe
    And the registered actor should exist in the actor service

  # ── M4: update=True creates actor when it doesn't exist ────────────

  Scenario: registry.add() with update=True creates actor when it doesn't exist
    When I add a spec-compliant YAML with actors map and combined actor field with update=True
    Then the actor should be registered with provider "openai" and model "gpt-4"
    And the registered actor should exist in the actor service

  # ── M5: v3 TOOL actor without provider/model propagates to upsert ──

  Scenario: registry.add() with v3 TOOL actor without provider or model raises an error from upsert_actor
    When I attempt to add a v3 TOOL YAML without provider or model
    Then an error should be raised from upsert_actor

  # ── M6: upsert_actor raises exception — error propagates ───────────

  Scenario: registry.add() propagates exception raised by upsert_actor
    When upsert_actor is configured to raise RuntimeError and I add a valid YAML
    Then a RuntimeError should have been propagated from add
