Feature: Cost Budget Model Coverage
  Additional scenarios that exercise previously uncovered code paths
  in the cost_budget domain model (SessionCostBudget, OrgCostAccumulator,
  ThreadSafeOrgCostAccumulator).

  Background:
    Given the cost budget module is imported

  # ── SessionCostBudget ──────────────────────────────────────────────

  Scenario: Session utilization returns None when max_cost_usd is zero
    Given a session budget with max cost USD 0.0
    When I query the session utilization
    Then the session utilization should be None

  Scenario: Session can_afford returns True when budget is unlimited
    Given a session budget with no spending cap
    When I check if the session can afford 999.99
    Then the session can_afford result should be True

  Scenario: Session can_afford returns True when cost fits within budget
    Given a session budget with max cost USD 10.0
    When I check if the session can afford 5.0
    Then the session can_afford result should be True

  Scenario: Session can_afford returns False when cost exceeds budget
    Given a session budget with max cost USD 10.0
    And I record a session cost of 8.0
    When I check if the session can afford 5.0
    Then the session can_afford result should be False

  Scenario: Session reset clears accumulated cost to zero
    Given a session budget with max cost USD 100.0
    And I record a session cost of 42.5
    When I reset the session budget
    Then the session total cost should be 0.0

  # ── OrgCostAccumulator ─────────────────────────────────────────────

  Scenario: Org utilization returns None when max_cost_usd is zero
    Given an org accumulator for "org-zero" with max cost USD 0.0
    When I query the org utilization
    Then the org utilization should be None

  Scenario: Org can_afford returns True when budget is unlimited
    Given an org accumulator for "org-unlimited" with no spending cap
    When I check if the org can afford 999.99
    Then the org can_afford result should be True

  Scenario: Org can_afford returns True when cost fits within budget
    Given an org accumulator for "org-fits" with max cost USD 50.0
    When I check if the org can afford 25.0
    Then the org can_afford result should be True

  Scenario: Org can_afford returns False when cost exceeds budget
    Given an org accumulator for "org-over" with max cost USD 50.0
    And I record an org cost of 45.0
    When I check if the org can afford 10.0
    Then the org can_afford result should be False

  Scenario: Org reset clears accumulated cost to zero
    Given an org accumulator for "org-reset" with max cost USD 100.0
    And I record an org cost of 73.0
    When I reset the org accumulator
    Then the org total cost should be 0.0

  # ── ThreadSafeOrgCostAccumulator ───────────────────────────────────

  Scenario: Thread-safe wrapper exposes org_id property
    Given a thread-safe org accumulator for "org-tsafe"
    When I read the thread-safe org_id
    Then the thread-safe org_id should be "org-tsafe"

  Scenario: Thread-safe wrapper allows setting max_cost_usd
    Given a thread-safe org accumulator for "org-setter"
    When I set the thread-safe max_cost_usd to 200.0
    Then the thread-safe max_cost_usd should be 200.0

  Scenario: Thread-safe can_afford delegates correctly
    Given a thread-safe org accumulator for "org-canafford" with max cost USD 30.0
    When I check if the thread-safe accumulator can afford 15.0
    Then the thread-safe can_afford result should be True

  Scenario: Thread-safe can_afford returns False when over budget
    Given a thread-safe org accumulator for "org-canafford2" with max cost USD 30.0
    And I record a thread-safe cost of 28.0
    When I check if the thread-safe accumulator can afford 5.0
    Then the thread-safe can_afford result should be False

  Scenario: Thread-safe reset delegates correctly
    Given a thread-safe org accumulator for "org-tsreset" with max cost USD 100.0
    And I record a thread-safe cost of 60.0
    When I reset the thread-safe accumulator
    Then the thread-safe total cost should be 0.0
