Updated 1 path from e4a820d3
============================= test session starts ==============================
platform linux -- Python 3.13.14, pytest-9.1.1, pluggy-1.6.0 -- /usr/local/bin/python
cachedir: .pytest_cache
rootdir: /nanobot
configfile: pyproject.toml
plugins: cov-6.3.0, asyncio-1.4.0, anyio-4.14.1
asyncio: mode=Mode.AUTO, debug=False, asyncio_default_fixture_loop_scope=None, asyncio_default_test_loop_scope=function
collecting ... collected 49 items

tests/agent/test_runner_errors.py::test_runner_returns_structured_tool_error PASSED [  2%]
tests/agent/test_runner_errors.py::test_llm_error_not_appended_to_session_messages PASSED [  4%]
tests/agent/test_runner_errors.py::test_llm_arrearage_error_surfaces_clear_message PASSED [  6%]
tests/agent/test_runner_errors.py::test_llm_arrearage_status_only_402 PASSED [  8%]
tests/agent/test_runner_errors.py::test_llm_arrearage_error_type_insufficient_quota PASSED [ 10%]
tests/agent/test_runner_errors.py::test_llm_arrearage_error_code_payment_required PASSED [ 12%]
tests/agent/test_runner_errors.py::test_llm_arrearage_text_only_quota_exceeded PASSED [ 14%]
tests/agent/test_runner_errors.py::test_llm_arrearage_session_stores_placeholder PASSED [ 16%]
tests/agent/test_runner_errors.py::test_llm_arrearage_with_custom_error_message PASSED [ 18%]
tests/agent/test_runner_errors.py::test_llm_non_billing_error_honors_custom_error_message PASSED [ 20%]
tests/agent/test_runner_errors.py::test_llm_non_billing_error_uses_default_message PASSED [ 22%]
tests/agent/test_runner_errors.py::test_llm_plain_rate_limit_not_billing_warning PASSED [ 24%]
tests/agent/test_runner_errors.py::test_runner_tool_error_sets_final_content PASSED [ 26%]
tests/agent/test_runner_errors.py::test_runner_tool_error_preserves_tool_results_in_messages PASSED [ 28%]
tests/providers/test_provider_error_metadata.py::test_openai_handle_error_extracts_structured_metadata PASSED [ 30%]
tests/providers/test_provider_error_metadata.py::test_openai_handle_error_marks_timeout_kind PASSED [ 32%]
tests/providers/test_provider_error_metadata.py::test_anthropic_handle_error_extracts_structured_metadata PASSED [ 34%]
tests/providers/test_provider_error_metadata.py::test_anthropic_handle_error_marks_connection_kind PASSED [ 36%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_error_type_billing_token[insufficient_quota] PASSED [ 38%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_error_type_billing_token[quota_exceeded] PASSED [ 40%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_error_type_billing_token[quota_exhausted] PASSED [ 42%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_error_type_billing_token[billing_hard_limit_reached] PASSED [ 44%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_error_type_billing_token[insufficient_balance] FAILED [ 46%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_error_type_billing_token[credit_balance_too_low] FAILED [ 48%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_error_type_billing_token[billing_not_active] FAILED [ 51%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_error_type_billing_token[payment_required] PASSED [ 53%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_error_code_billing_token[insufficient_quota] PASSED [ 55%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_error_code_billing_token[quota_exceeded] PASSED [ 57%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_error_code_billing_token[quota_exhausted] PASSED [ 59%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_error_code_billing_token[billing_hard_limit_reached] PASSED [ 61%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_error_code_billing_token[insufficient_balance] FAILED [ 63%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_error_code_billing_token[credit_balance_too_low] FAILED [ 65%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_error_code_billing_token[billing_not_active] FAILED [ 67%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_error_code_billing_token[payment_required] PASSED [ 69%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_http_402 PASSED [ 71%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_http_402_with_content PASSED [ 73%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_text_marker_quota_exceeded PASSED [ 75%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_text_marker_insufficient_balance PASSED [ 77%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_text_marker_payment_required PASSED [ 79%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_token_normalization_uppercase PASSED [ 81%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_token_normalization_mixed_case PASSED [ 83%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_plain_rate_limit_not_arrearage PASSED [ 85%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_500_not_arrearage PASSED [ 87%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_502_not_arrearage PASSED [ 89%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_timeout_not_arrearage PASSED [ 91%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_connection_error_not_arrearage PASSED [ 93%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_generic_error_not_arrearage PASSED [ 95%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_successful_response_not_arrearage PASSED [ 97%]
tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_quota_word_in_normal_text_not_arrearage PASSED [100%]

=================================== FAILURES ===================================
_ TestArrearageClassification.test_error_type_billing_token[insufficient_balance] _

self = <test_provider_error_metadata.TestArrearageClassification object at 0x40067c4b90>
token = 'insufficient_balance'

    @pytest.mark.parametrize("token", _BILLING_TOKENS)
    def test_error_type_billing_token(self, token: str) -> None:
        """Each billing token in error_type is classified as arrearage."""
        response = LLMResponse(finish_reason="error", content="err", error_type=token)
>       assert LLMProvider.is_arrearage_response(response) is True
E       AssertionError: assert False is True
E        +  where False = is_arrearage_response(LLMResponse(content='err', tool_calls=[], finish_reason='error', usage={}, retry_after=None, reasoning_content=None, thinking_blocks=None, error_status_code=None, error_kind=None, error_type='insufficient_balance', error_code=None, error_retry_after_s=None, error_should_retry=None))
E        +    where is_arrearage_response = LLMProvider.is_arrearage_response

tests/providers/test_provider_error_metadata.py:116: AssertionError
_ TestArrearageClassification.test_error_type_billing_token[credit_balance_too_low] _

self = <test_provider_error_metadata.TestArrearageClassification object at 0x400663bbd0>
token = 'credit_balance_too_low'

    @pytest.mark.parametrize("token", _BILLING_TOKENS)
    def test_error_type_billing_token(self, token: str) -> None:
        """Each billing token in error_type is classified as arrearage."""
        response = LLMResponse(finish_reason="error", content="err", error_type=token)
>       assert LLMProvider.is_arrearage_response(response) is True
E       AssertionError: assert False is True
E        +  where False = is_arrearage_response(LLMResponse(content='err', tool_calls=[], finish_reason='error', usage={}, retry_after=None, reasoning_content=None, thinking_blocks=None, error_status_code=None, error_kind=None, error_type='credit_balance_too_low', error_code=None, error_retry_after_s=None, error_should_retry=None))
E        +    where is_arrearage_response = LLMProvider.is_arrearage_response

tests/providers/test_provider_error_metadata.py:116: AssertionError
_ TestArrearageClassification.test_error_type_billing_token[billing_not_active] _

self = <test_provider_error_metadata.TestArrearageClassification object at 0x4006714050>
token = 'billing_not_active'

    @pytest.mark.parametrize("token", _BILLING_TOKENS)
    def test_error_type_billing_token(self, token: str) -> None:
        """Each billing token in error_type is classified as arrearage."""
        response = LLMResponse(finish_reason="error", content="err", error_type=token)
>       assert LLMProvider.is_arrearage_response(response) is True
E       AssertionError: assert False is True
E        +  where False = is_arrearage_response(LLMResponse(content='err', tool_calls=[], finish_reason='error', usage={}, retry_after=None, reasoning_content=None, thinking_blocks=None, error_status_code=None, error_kind=None, error_type='billing_not_active', error_code=None, error_retry_after_s=None, error_should_retry=None))
E        +    where is_arrearage_response = LLMProvider.is_arrearage_response

tests/providers/test_provider_error_metadata.py:116: AssertionError
_ TestArrearageClassification.test_error_code_billing_token[insufficient_balance] _

self = <test_provider_error_metadata.TestArrearageClassification object at 0x4006805b70>
token = 'insufficient_balance'

    @pytest.mark.parametrize("token", _BILLING_TOKENS)
    def test_error_code_billing_token(self, token: str) -> None:
        """Each billing token in error_code is classified as arrearage."""
        response = LLMResponse(finish_reason="error", content="err", error_code=token)
>       assert LLMProvider.is_arrearage_response(response) is True
E       AssertionError: assert False is True
E        +  where False = is_arrearage_response(LLMResponse(content='err', tool_calls=[], finish_reason='error', usage={}, retry_after=None, reasoning_content=None, thinking_blocks=None, error_status_code=None, error_kind=None, error_type=None, error_code='insufficient_balance', error_retry_after_s=None, error_should_retry=None))
E        +    where is_arrearage_response = LLMProvider.is_arrearage_response

tests/providers/test_provider_error_metadata.py:122: AssertionError
_ TestArrearageClassification.test_error_code_billing_token[credit_balance_too_low] _

self = <test_provider_error_metadata.TestArrearageClassification object at 0x400670d4a0>
token = 'credit_balance_too_low'

    @pytest.mark.parametrize("token", _BILLING_TOKENS)
    def test_error_code_billing_token(self, token: str) -> None:
        """Each billing token in error_code is classified as arrearage."""
        response = LLMResponse(finish_reason="error", content="err", error_code=token)
>       assert LLMProvider.is_arrearage_response(response) is True
E       AssertionError: assert False is True
E        +  where False = is_arrearage_response(LLMResponse(content='err', tool_calls=[], finish_reason='error', usage={}, retry_after=None, reasoning_content=None, thinking_blocks=None, error_status_code=None, error_kind=None, error_type=None, error_code='credit_balance_too_low', error_retry_after_s=None, error_should_retry=None))
E        +    where is_arrearage_response = LLMProvider.is_arrearage_response

tests/providers/test_provider_error_metadata.py:122: AssertionError
_ TestArrearageClassification.test_error_code_billing_token[billing_not_active] _

self = <test_provider_error_metadata.TestArrearageClassification object at 0x4006577050>
token = 'billing_not_active'

    @pytest.mark.parametrize("token", _BILLING_TOKENS)
    def test_error_code_billing_token(self, token: str) -> None:
        """Each billing token in error_code is classified as arrearage."""
        response = LLMResponse(finish_reason="error", content="err", error_code=token)
>       assert LLMProvider.is_arrearage_response(response) is True
E       AssertionError: assert False is True
E        +  where False = is_arrearage_response(LLMResponse(content='err', tool_calls=[], finish_reason='error', usage={}, retry_after=None, reasoning_content=None, thinking_blocks=None, error_status_code=None, error_kind=None, error_type=None, error_code='billing_not_active', error_retry_after_s=None, error_should_retry=None))
E        +    where is_arrearage_response = LLMProvider.is_arrearage_response

tests/providers/test_provider_error_metadata.py:122: AssertionError
-------------- generated xml file: /tmp/rebench-test-results.xml ---------------
=========================== short test summary info ============================
FAILED tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_error_type_billing_token[insufficient_balance]
FAILED tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_error_type_billing_token[credit_balance_too_low]
FAILED tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_error_type_billing_token[billing_not_active]
FAILED tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_error_code_billing_token[insufficient_balance]
FAILED tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_error_code_billing_token[credit_balance_too_low]
FAILED tests/providers/test_provider_error_metadata.py::TestArrearageClassification::test_error_code_billing_token[billing_not_active]
========================= 6 failed, 43 passed in 1.32s =========================
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="6" skipped="0" tests="49" time="1.327" timestamp="2026-09-03T16:35:29.663623+00:00" hostname="91daffa7b70d"><testcase classname="tests.agent.test_runner_errors" name="test_runner_returns_structured_tool_error" time="0.026" /><testcase classname="tests.agent.test_runner_errors" name="test_llm_error_not_appended_to_session_messages" time="0.011" /><testcase classname="tests.agent.test_runner_errors" name="test_llm_arrearage_error_surfaces_clear_message" time="0.009" /><testcase classname="tests.agent.test_runner_errors" name="test_llm_arrearage_status_only_402" time="0.009" /><testcase classname="tests.agent.test_runner_errors" name="test_llm_arrearage_error_type_insufficient_quota" time="0.009" /><testcase classname="tests.agent.test_runner_errors" name="test_llm_arrearage_error_code_payment_required" time="0.010" /><testcase classname="tests.agent.test_runner_errors" name="test_llm_arrearage_text_only_quota_exceeded" time="0.009" /><testcase classname="tests.agent.test_runner_errors" name="test_llm_arrearage_session_stores_placeholder" time="0.009" /><testcase classname="tests.agent.test_runner_errors" name="test_llm_arrearage_with_custom_error_message" time="0.009" /><testcase classname="tests.agent.test_runner_errors" name="test_llm_non_billing_error_honors_custom_error_message" time="0.009" /><testcase classname="tests.agent.test_runner_errors" name="test_llm_non_billing_error_uses_default_message" time="0.009" /><testcase classname="tests.agent.test_runner_errors" name="test_llm_plain_rate_limit_not_billing_warning" time="0.010" /><testcase classname="tests.agent.test_runner_errors" name="test_runner_tool_error_sets_final_content" time="0.011" /><testcase classname="tests.agent.test_runner_errors" name="test_runner_tool_error_preserves_tool_results_in_messages" time="0.011" /><testcase classname="tests.providers.test_provider_error_metadata" name="test_openai_handle_error_extracts_structured_metadata" time="0.002" /><testcase classname="tests.providers.test_provider_error_metadata" name="test_openai_handle_error_marks_timeout_kind" time="0.005" /><testcase classname="tests.providers.test_provider_error_metadata" name="test_anthropic_handle_error_extracts_structured_metadata" time="0.002" /><testcase classname="tests.providers.test_provider_error_metadata" name="test_anthropic_handle_error_marks_connection_kind" time="0.002" /><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_error_type_billing_token[insufficient_quota]" time="0.002" /><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_error_type_billing_token[quota_exceeded]" time="0.002" /><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_error_type_billing_token[quota_exhausted]" time="0.002" /><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_error_type_billing_token[billing_hard_limit_reached]" time="0.002" /><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_error_type_billing_token[insufficient_balance]" time="0.003"><failure message="AssertionError: assert False is True&#10; +  where False = is_arrearage_response(LLMResponse(content='err', tool_calls=[], finish_reason='error', usage={}, retry_after=None, reasoning_content=None, thinking_blocks=None, error_status_code=None, error_kind=None, error_type='insufficient_balance', error_code=None, error_retry_after_s=None, error_should_retry=None))&#10; +    where is_arrearage_response = LLMProvider.is_arrearage_response">self = &lt;test_provider_error_metadata.TestArrearageClassification object at 0x40067c4b90&gt;
token = 'insufficient_balance'

    @pytest.mark.parametrize("token", _BILLING_TOKENS)
    def test_error_type_billing_token(self, token: str) -&gt; None:
        """Each billing token in error_type is classified as arrearage."""
        response = LLMResponse(finish_reason="error", content="err", error_type=token)
&gt;       assert LLMProvider.is_arrearage_response(response) is True
E       AssertionError: assert False is True
E        +  where False = is_arrearage_response(LLMResponse(content='err', tool_calls=[], finish_reason='error', usage={}, retry_after=None, reasoning_content=None, thinking_blocks=None, error_status_code=None, error_kind=None, error_type='insufficient_balance', error_code=None, error_retry_after_s=None, error_should_retry=None))
E        +    where is_arrearage_response = LLMProvider.is_arrearage_response

tests/providers/test_provider_error_metadata.py:116: AssertionError</failure></testcase><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_error_type_billing_token[credit_balance_too_low]" time="0.003"><failure message="AssertionError: assert False is True&#10; +  where False = is_arrearage_response(LLMResponse(content='err', tool_calls=[], finish_reason='error', usage={}, retry_after=None, reasoning_content=None, thinking_blocks=None, error_status_code=None, error_kind=None, error_type='credit_balance_too_low', error_code=None, error_retry_after_s=None, error_should_retry=None))&#10; +    where is_arrearage_response = LLMProvider.is_arrearage_response">self = &lt;test_provider_error_metadata.TestArrearageClassification object at 0x400663bbd0&gt;
token = 'credit_balance_too_low'

    @pytest.mark.parametrize("token", _BILLING_TOKENS)
    def test_error_type_billing_token(self, token: str) -&gt; None:
        """Each billing token in error_type is classified as arrearage."""
        response = LLMResponse(finish_reason="error", content="err", error_type=token)
&gt;       assert LLMProvider.is_arrearage_response(response) is True
E       AssertionError: assert False is True
E        +  where False = is_arrearage_response(LLMResponse(content='err', tool_calls=[], finish_reason='error', usage={}, retry_after=None, reasoning_content=None, thinking_blocks=None, error_status_code=None, error_kind=None, error_type='credit_balance_too_low', error_code=None, error_retry_after_s=None, error_should_retry=None))
E        +    where is_arrearage_response = LLMProvider.is_arrearage_response

tests/providers/test_provider_error_metadata.py:116: AssertionError</failure></testcase><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_error_type_billing_token[billing_not_active]" time="0.003"><failure message="AssertionError: assert False is True&#10; +  where False = is_arrearage_response(LLMResponse(content='err', tool_calls=[], finish_reason='error', usage={}, retry_after=None, reasoning_content=None, thinking_blocks=None, error_status_code=None, error_kind=None, error_type='billing_not_active', error_code=None, error_retry_after_s=None, error_should_retry=None))&#10; +    where is_arrearage_response = LLMProvider.is_arrearage_response">self = &lt;test_provider_error_metadata.TestArrearageClassification object at 0x4006714050&gt;
token = 'billing_not_active'

    @pytest.mark.parametrize("token", _BILLING_TOKENS)
    def test_error_type_billing_token(self, token: str) -&gt; None:
        """Each billing token in error_type is classified as arrearage."""
        response = LLMResponse(finish_reason="error", content="err", error_type=token)
&gt;       assert LLMProvider.is_arrearage_response(response) is True
E       AssertionError: assert False is True
E        +  where False = is_arrearage_response(LLMResponse(content='err', tool_calls=[], finish_reason='error', usage={}, retry_after=None, reasoning_content=None, thinking_blocks=None, error_status_code=None, error_kind=None, error_type='billing_not_active', error_code=None, error_retry_after_s=None, error_should_retry=None))
E        +    where is_arrearage_response = LLMProvider.is_arrearage_response

tests/providers/test_provider_error_metadata.py:116: AssertionError</failure></testcase><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_error_type_billing_token[payment_required]" time="0.002" /><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_error_code_billing_token[insufficient_quota]" time="0.002" /><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_error_code_billing_token[quota_exceeded]" time="0.002" /><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_error_code_billing_token[quota_exhausted]" time="0.002" /><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_error_code_billing_token[billing_hard_limit_reached]" time="0.002" /><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_error_code_billing_token[insufficient_balance]" time="0.003"><failure message="AssertionError: assert False is True&#10; +  where False = is_arrearage_response(LLMResponse(content='err', tool_calls=[], finish_reason='error', usage={}, retry_after=None, reasoning_content=None, thinking_blocks=None, error_status_code=None, error_kind=None, error_type=None, error_code='insufficient_balance', error_retry_after_s=None, error_should_retry=None))&#10; +    where is_arrearage_response = LLMProvider.is_arrearage_response">self = &lt;test_provider_error_metadata.TestArrearageClassification object at 0x4006805b70&gt;
token = 'insufficient_balance'

    @pytest.mark.parametrize("token", _BILLING_TOKENS)
    def test_error_code_billing_token(self, token: str) -&gt; None:
        """Each billing token in error_code is classified as arrearage."""
        response = LLMResponse(finish_reason="error", content="err", error_code=token)
&gt;       assert LLMProvider.is_arrearage_response(response) is True
E       AssertionError: assert False is True
E        +  where False = is_arrearage_response(LLMResponse(content='err', tool_calls=[], finish_reason='error', usage={}, retry_after=None, reasoning_content=None, thinking_blocks=None, error_status_code=None, error_kind=None, error_type=None, error_code='insufficient_balance', error_retry_after_s=None, error_should_retry=None))
E        +    where is_arrearage_response = LLMProvider.is_arrearage_response

tests/providers/test_provider_error_metadata.py:122: AssertionError</failure></testcase><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_error_code_billing_token[credit_balance_too_low]" time="0.003"><failure message="AssertionError: assert False is True&#10; +  where False = is_arrearage_response(LLMResponse(content='err', tool_calls=[], finish_reason='error', usage={}, retry_after=None, reasoning_content=None, thinking_blocks=None, error_status_code=None, error_kind=None, error_type=None, error_code='credit_balance_too_low', error_retry_after_s=None, error_should_retry=None))&#10; +    where is_arrearage_response = LLMProvider.is_arrearage_response">self = &lt;test_provider_error_metadata.TestArrearageClassification object at 0x400670d4a0&gt;
token = 'credit_balance_too_low'

    @pytest.mark.parametrize("token", _BILLING_TOKENS)
    def test_error_code_billing_token(self, token: str) -&gt; None:
        """Each billing token in error_code is classified as arrearage."""
        response = LLMResponse(finish_reason="error", content="err", error_code=token)
&gt;       assert LLMProvider.is_arrearage_response(response) is True
E       AssertionError: assert False is True
E        +  where False = is_arrearage_response(LLMResponse(content='err', tool_calls=[], finish_reason='error', usage={}, retry_after=None, reasoning_content=None, thinking_blocks=None, error_status_code=None, error_kind=None, error_type=None, error_code='credit_balance_too_low', error_retry_after_s=None, error_should_retry=None))
E        +    where is_arrearage_response = LLMProvider.is_arrearage_response

tests/providers/test_provider_error_metadata.py:122: AssertionError</failure></testcase><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_error_code_billing_token[billing_not_active]" time="0.003"><failure message="AssertionError: assert False is True&#10; +  where False = is_arrearage_response(LLMResponse(content='err', tool_calls=[], finish_reason='error', usage={}, retry_after=None, reasoning_content=None, thinking_blocks=None, error_status_code=None, error_kind=None, error_type=None, error_code='billing_not_active', error_retry_after_s=None, error_should_retry=None))&#10; +    where is_arrearage_response = LLMProvider.is_arrearage_response">self = &lt;test_provider_error_metadata.TestArrearageClassification object at 0x4006577050&gt;
token = 'billing_not_active'

    @pytest.mark.parametrize("token", _BILLING_TOKENS)
    def test_error_code_billing_token(self, token: str) -&gt; None:
        """Each billing token in error_code is classified as arrearage."""
        response = LLMResponse(finish_reason="error", content="err", error_code=token)
&gt;       assert LLMProvider.is_arrearage_response(response) is True
E       AssertionError: assert False is True
E        +  where False = is_arrearage_response(LLMResponse(content='err', tool_calls=[], finish_reason='error', usage={}, retry_after=None, reasoning_content=None, thinking_blocks=None, error_status_code=None, error_kind=None, error_type=None, error_code='billing_not_active', error_retry_after_s=None, error_should_retry=None))
E        +    where is_arrearage_response = LLMProvider.is_arrearage_response

tests/providers/test_provider_error_metadata.py:122: AssertionError</failure></testcase><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_error_code_billing_token[payment_required]" time="0.002" /><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_http_402" time="0.001" /><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_http_402_with_content" time="0.001" /><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_text_marker_quota_exceeded" time="0.002" /><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_text_marker_insufficient_balance" time="0.002" /><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_text_marker_payment_required" time="0.002" /><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_token_normalization_uppercase" time="0.001" /><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_token_normalization_mixed_case" time="0.001" /><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_plain_rate_limit_not_arrearage" time="0.002" /><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_500_not_arrearage" time="0.001" /><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_502_not_arrearage" time="0.001" /><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_timeout_not_arrearage" time="0.002" /><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_connection_error_not_arrearage" time="0.001" /><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_generic_error_not_arrearage" time="0.002" /><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_successful_response_not_arrearage" time="0.001" /><testcase classname="tests.providers.test_provider_error_metadata.TestArrearageClassification" name="test_quota_word_in_normal_text_not_arrearage" time="0.002" /></testsuite></testsuites>Updated 2 paths from e4a820d3
SWE-rebench parser: parse_log_pytest
SWE-rebench results:
PASSED
